diff --git a/doc/architecture/runner-copilot-capabilities.md b/doc/architecture/runner-copilot-capabilities.md index 4b8375131ca..8294856b486 100644 --- a/doc/architecture/runner-copilot-capabilities.md +++ b/doc/architecture/runner-copilot-capabilities.md @@ -1,9 +1,9 @@ # Copilot 1.0.88 rich ACP capability audit Audited 2026-09-28 against repository base `c65fc9e3c81c41aafe421aa90a00514b84343285`. -Status: **candidate, not qualified**. No GitHub credential, entitlement, real model, -or Daytona execution has been verified. Real executable offline probes cost $0; -no billable request was made. The allocated live budget remains $25, subject to +Status: **candidate, not qualified**. Authenticated model discovery and exact model +selection now pass; real inference and Daytona execution remain unverified. +Real executable offline probes cost $0; no model prompt has been sent. The allocated live budget remains $25, subject to the shared $100 hard stop and verifiable spend. Do not expose this profile as supported until the required local and Daytona qualification passes. @@ -81,10 +81,10 @@ HTTP/SSE MCP; image and embedded-context input; no audio input; and session list and close. It does not advertise steering, forking, goals, or a question/plan extension responder. The source adapter supports model/reasoning/config changes, but the offline session only returns `mode` and `allow_all` options. There is no -verified GitHub model ID from this probe. Require an explicitly selected model +verified GitHub model ID from the historical offline probe. Require an explicitly selected model and exact effective-model verification; never silently use the fixture's -`gpt-4.1` or substitute another model. A possible candidate such as -`gpt-5.6-luna` is unverified until authenticated negotiation succeeds. +`gpt-4.1` or substitute another model. Authenticated discovery on 2026-09-28 subsequently advertised and accepted +`gpt-5.6-luna`; inference entitlement remains unverified. The native event extension is real and is negotiated with: @@ -322,3 +322,28 @@ Both Copilot builder scripts are explicit Daytona image hash inputs. The selecte `copilot` candidate also changes image identity, while manifest qualification stays `pending`. Linux x64 binaries are pinned and buildable; live Linux/Daytona behavior still requires the qualification cases above. + + +## Authenticated qualification preparation (2026-09-28) + +The [sanitized authenticated discovery](../../packages/paperclip-runner/test/fixtures/copilot-authenticated-discovery-1.0.88.json) +uses the previously verified native pack and a dedicated, short-lived personal +Copilot Requests token, explicitly bound as `COPILOT_GITHUB_TOKEN`. The token has +no repository write authority. No credential, account identifier, provider +session ID, or private path is retained in that fixture. + +Three metadata-only sessions were created and closed: catalog discovery, +`session/set_model`, then `session/set_model` plus `session/set_config_option` +with exact `gpt-5.6-luna` echo. The native catalog advertises 21 model IDs and +marks Luna enabled. No `session/prompt` request was sent. This verifies auth and +model selection only. The reproducible metadata probe is +`scripts/discover-copilot-acp.mjs`; it refuses any outbound method outside its +closed initialize/new/select/close list and denies unexpected inbound requests. + +The initial paid qualification reservation is $2 within the provider's $25 +allocation and shared $100 budget. The account dashboard baseline is 0 of 1,500 +included AI credits; additional paid usage is disabled with a $0 cash budget. +Included credit consumption must still be reconciled and reported separately +from cash charges. One canonical `get-task-context` case with a 60-second turn, +zero retries, and a $0.50 declared envelope is next. Neither that envelope nor +Copilot's optional soft credit limit is a guaranteed per-response hard cap. diff --git a/packages/paperclip-runner/scripts/discover-copilot-acp.mjs b/packages/paperclip-runner/scripts/discover-copilot-acp.mjs new file mode 100644 index 00000000000..b45b2d5f8df --- /dev/null +++ b/packages/paperclip-runner/scripts/discover-copilot-acp.mjs @@ -0,0 +1,41 @@ +// Metadata only: initialize, create a disposable session, select an advertised model, then close. +// Usage: node discover-copilot-acp.mjs [exact-model-id] +// Supply only an explicitly bound COPILOT_GITHUB_TOKEN. This script never sends a prompt. +import assert from 'node:assert/strict'; +import { createHash } from 'node:crypto'; +import { mkdir, mkdtemp, readFile, realpath, rm, writeFile } from 'node:fs/promises'; +import { join } from 'node:path'; +import { pathToFileURL } from 'node:url'; +const pack=await realpath(process.argv[2]); +const output=process.argv[3]; +const model=process.argv[4]; +const token=process.env.COPILOT_GITHUB_TOKEN; +assert.equal(typeof token,'string');assert.ok(token.trim()); +const manifest=JSON.parse(await readFile(join(pack,'provider-pack.json'),'utf8')); +process.env.PAPERCLIP_ACPX_PROVIDER_PACKAGE_ROOT=pack; +process.env.PAPERCLIP_ACPX_PROVIDER_PACKAGE_MANIFEST=join(pack,'package.json'); +const {verifyAcpxProfileInstallation,assertAcpxProfileEnvironment}=await import(pathToFileURL(join(pack,'dist/drivers/acpx/profile-installation.js'))); +const {resolveQualifiedAcpxProfile}=await import(pathToFileURL(join(pack,'dist/drivers/acpx/qualified-profiles.js'))); +const {COPILOT_ACP_CLIENT_CAPABILITIES}=await import(pathToFileURL(join(pack,'dist/drivers/acpx/copilot-events.js'))); +assertAcpxProfileEnvironment('copilot',{COPILOT_GITHUB_TOKEN:token}); +// The verified profile resolves the fixed binary only. session/new discovers the +// native catalog; no prompt or model inference is permitted in this script. +const install=await verifyAcpxProfileInstallation(resolveQualifiedAcpxProfile('copilot',model??'discovery-unselected')); +const lease=await install.openCommand(); +const root=await mkdtemp('/tmp/paperclip-copilot-auth-discovery-'); +const env={PATH:'/usr/bin:/bin',COPILOT_GITHUB_TOKEN:token,COPILOT_AUTO_UPDATE:'false',COPILOT_ALLOW_ALL:'false',NO_COLOR:'1'}; +for(const key of ['HOME','XDG_CONFIG_HOME','XDG_DATA_HOME','XDG_CACHE_HOME','COPILOT_HOME','COPILOT_CACHE_HOME']){env[key]=join(root,key.toLowerCase());await mkdir(env[key],{mode:0o700});} +await writeFile(join(env.COPILOT_HOME,'config.json'),JSON.stringify({autoUpdate:false,trustedFolders:[],disableAllHooks:true,memory:false,ide:{autoConnect:false}}),{mode:0o600}); +let child,exitPromise;const pending=new Map();let nextId=0,buffer='',bytes=0;const observedMethods={}; +function request(method,params){assert.ok(['initialize','session/new','session/set_model','session/set_config_option','session/close'].includes(method));const id=nextId++;return new Promise((resolve,reject)=>{const timer=setTimeout(()=>{pending.delete(id);reject(new Error('request_deadline:'+method));},25000);pending.set(id,{resolve,reject,timer});child.stdin.write(JSON.stringify({jsonrpc:'2.0',id,method,params})+'\n');});} +try{ + child=lease.spawn([],{cwd:root,env,stdio:'pipe'});exitPromise=new Promise(resolve=>child.once('exit',(code,signal)=>resolve({code,signal}))); + child.stdout.on('data',chunk=>{bytes+=chunk.length;if(bytes>2097152){child.kill('SIGTERM');return;}buffer+=chunk.toString();while(buffer.includes('\n')){const end=buffer.indexOf('\n');const line=buffer.slice(0,end);buffer=buffer.slice(end+1);if(!line.trim())continue;let msg;try{msg=JSON.parse(line);}catch{child.kill('SIGTERM');return;}if(msg.method){observedMethods[msg.method]=(observedMethods[msg.method]??0)+1;if(msg.id!==undefined)child.stdin.write(JSON.stringify({jsonrpc:'2.0',id:msg.id,error:{code:-32601,message:'Discovery does not support inbound methods'}})+'\n');continue;}const item=pending.get(msg.id);if(item){clearTimeout(item.timer);pending.delete(msg.id);msg.error?item.reject(new Error('provider_rpc_error:'+String(msg.error.code))):item.resolve(msg.result);}}}); + child.stderr.on('data',()=>{});child.once('error',()=>{for(const item of pending.values())item.reject(new Error('provider_spawn_failure'));}); + const initialized=await request('initialize',{protocolVersion:1,clientInfo:{name:'paperclip-authenticated-model-discovery',version:'1'},clientCapabilities:COPILOT_ACP_CLIENT_CAPABILITIES}); + const opened=await request('session/new',{cwd:root,mcpServers:[]}); + const safe={schema:'paperclip.copilot-authenticated-discovery/v1',observedAt:new Date().toISOString(),harnessVersion:initialized.agentInfo?.version,sourceRevision:manifest.payload.runnerSourceRevision,providerPackDigest:manifest.digest,profileDigest:install.commandDigest,agentCapabilities:initialized.agentCapabilities,models:opened.models??null,configOptions:opened.configOptions??[],promptSent:false,promptRequestsSent:0,inferenceVerified:false,qualification:'pending; metadata discovery only',observedMethods}; + if(model){const advertised=opened.models?.availableModels??[];assert.ok(advertised.some(value=>value.modelId===model),'requested model must be advertised');const selected=await request('session/set_model',{sessionId:opened.sessionId,modelId:model});const configured=await request('session/set_config_option',{sessionId:opened.sessionId,configId:'model',value:model});assert.equal(configured.configOptions?.find(option=>option.id==='model')?.currentValue,model);safe.modelSelection={requestedModel:model,succeeded:true,response:selected,configEcho:configured};} + try{await request('session/close',{sessionId:opened.sessionId});safe.sessionClosed=true;}catch{safe.sessionClosed=false;} + const text=JSON.stringify(safe,null,2)+'\n';assert.ok(!text.includes(token));assert.ok(!text.includes(opened.sessionId));assert.ok(!text.includes(root));await writeFile(output,text,{mode:0o600});console.log(JSON.stringify({output,sha256:createHash('sha256').update(text).digest('hex'),harnessVersion:safe.harnessVersion,modelCount:safe.models?.availableModels?.length??0,configOptionIds:safe.configOptions.map(value=>value.id),modelIds:safe.models?.availableModels?.map(value=>value.modelId)??[],promptSent:false})); +}finally{for(const item of pending.values())clearTimeout(item.timer);pending.clear();if(child&&child.exitCode===null&&child.signalCode===null){child.stdin.end();const timer=setTimeout(()=>child.kill('SIGTERM'),1000);const kill=setTimeout(()=>child.kill('SIGKILL'),5000);await exitPromise;clearTimeout(timer);clearTimeout(kill);}await lease.close();await rm(root,{recursive:true,force:true});} diff --git a/packages/paperclip-runner/src/drivers/acpx/copilot-evidence.test.ts b/packages/paperclip-runner/src/drivers/acpx/copilot-evidence.test.ts index 555de79838f..df7d936988b 100644 --- a/packages/paperclip-runner/src/drivers/acpx/copilot-evidence.test.ts +++ b/packages/paperclip-runner/src/drivers/acpx/copilot-evidence.test.ts @@ -7,6 +7,15 @@ function fixture(name: string) { } describe("Copilot pinned executable evidence", () => { + it("retains authenticated exact model selection without promoting metadata to inference", () => { + const evidence = fixture("copilot-authenticated-discovery-1.0.88.json"); + expect(evidence).toMatchObject({ harnessVersion: "1.0.88", promptSent: false, promptRequestsSent: 0, inferenceVerified: false, sessionClosed: true }); + expect(evidence.models.availableModels).toHaveLength(21); + expect(evidence.models.availableModels.find((model: { modelId: string }) => model.modelId === "gpt-5.6-luna")._meta.copilotEnablement).toBe("enabled"); + expect(evidence.modelSelection.requestedModel).toBe("gpt-5.6-luna"); + expect(evidence.modelSelection.configEcho.configOptions.find((option: { id: string }) => option.id === "model").currentValue).toBe("gpt-5.6-luna"); + expect(JSON.stringify(evidence)).not.toMatch(/\/Users\/|\/tmp\/|github_pat_|gho_|sessionId|accessToken/); + }); it("retains a complete packaged native launch without promoting offline proof to qualification", () => { const evidence = fixture("copilot-provider-pack-darwin-arm64-1.0.88.json"); expect(evidence.sourceRevision).toMatch(/^[a-f0-9]{40}$/); diff --git a/packages/paperclip-runner/test/fixtures/copilot-authenticated-discovery-1.0.88.json b/packages/paperclip-runner/test/fixtures/copilot-authenticated-discovery-1.0.88.json new file mode 100644 index 00000000000..435eb1be99d --- /dev/null +++ b/packages/paperclip-runner/test/fixtures/copilot-authenticated-discovery-1.0.88.json @@ -0,0 +1,855 @@ +{ + "schema": "paperclip.copilot-authenticated-discovery/v1", + "observedAt": "2026-09-28T19:15:41.413Z", + "harnessVersion": "1.0.88", + "sourceRevision": "5272fc6398d42344d1888a3f97ca6909684eefbf", + "providerPackDigest": "sha256:4ba17b2455b0ab92cfe6ee223f77708379fe219792ccb66dbdef70060e6e22e1", + "profileDigest": "sha256:b18c01603dd0169d233140709cfaa8bf5304a03cf5de78ca4f625f30013e8457", + "agentCapabilities": { + "loadSession": true, + "mcpCapabilities": { + "http": true, + "sse": true + }, + "promptCapabilities": { + "image": true, + "audio": false, + "embeddedContext": true + }, + "sessionCapabilities": { + "close": {}, + "list": {} + } + }, + "models": { + "availableModels": [ + { + "modelId": "auto", + "name": "Auto", + "description": "Let Copilot pick the best model" + }, + { + "modelId": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "description": "GPT-5.6 Terra", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "modelId": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "description": "GPT-5.6 Luna", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "gpt-5.4", + "name": "GPT-5.4", + "description": "GPT-5.4", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "modelId": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "description": "GPT-5.4 mini", + "_meta": { + "copilotUsage": "0.33x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "gpt-5.3-codex", + "name": "GPT-5.3-Codex", + "description": "GPT-5.3-Codex", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "modelId": "gpt-5-mini", + "name": "GPT-5 mini", + "description": "GPT-5 mini", + "_meta": { + "copilotUsage": "0x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "description": "Claude Sonnet 5", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "modelId": "claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "description": "Claude Haiku 4.5", + "_meta": { + "copilotUsage": "0.33x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "mai-code-1.1-flash", + "name": "MAI-Code-1.1-Flash", + "description": "MAI-Code-1.1-Flash", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "description": "Gemini 3.8 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "description": "Gemini 3.7 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "description": "Gemini 3.6 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "description": "Gemini 3.5 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "modelId": "grok-4.5", + "name": "Grok 4.5", + "description": "Grok 4.5", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "modelId": "kimi-k3", + "name": "Kimi K3", + "description": "Kimi K3", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "modelId": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "description": "Kimi K2.7 Code", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "description": "Claude Sonnet 5.5", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "modelId": "gpt-6-luna", + "name": "GPT-6 Luna", + "description": "GPT-6 Luna", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "modelId": "grok-4.6", + "name": "Grok 4.6", + "description": "Grok 4.6", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "modelId": "grok-4.7", + "name": "Grok 4.7", + "description": "Grok 4.7", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + } + ], + "currentModelId": "gpt-5.6-terra" + }, + "configOptions": [ + { + "type": "select", + "id": "mode", + "name": "Mode", + "currentValue": "https://agentclientprotocol.com/protocol/session-modes#agent", + "options": [ + { + "value": "https://agentclientprotocol.com/protocol/session-modes#agent", + "name": "Agent", + "description": "Default agent mode for conversational interactions" + }, + { + "value": "https://agentclientprotocol.com/protocol/session-modes#plan", + "name": "Plan", + "description": "Plan mode for creating and executing multi-step plans" + }, + { + "value": "https://agentclientprotocol.com/protocol/session-modes#autopilot", + "name": "Autopilot", + "description": "Autonomous mode that enables allow-all and runs until task completion without user interaction (experimental)" + } + ], + "category": "mode", + "description": "Controls how Copilot responds: a conversational agent, planning multi-step work, or autonomous autopilot." + }, + { + "type": "select", + "id": "model", + "name": "Model", + "category": "model", + "description": "The AI model Copilot uses to generate responses.", + "currentValue": "gpt-5.6-terra", + "options": [ + { + "value": "auto", + "name": "Auto", + "description": "Let Copilot pick the best model", + "_meta": null + }, + { + "value": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "description": "GPT-5.6 Terra", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "description": "GPT-5.6 Luna", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gpt-5.4", + "name": "GPT-5.4", + "description": "GPT-5.4", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "description": "GPT-5.4 mini", + "_meta": { + "copilotUsage": "0.33x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gpt-5.3-codex", + "name": "GPT-5.3-Codex", + "description": "GPT-5.3-Codex", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "gpt-5-mini", + "name": "GPT-5 mini", + "description": "GPT-5 mini", + "_meta": { + "copilotUsage": "0x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "description": "Claude Sonnet 5", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "description": "Claude Haiku 4.5", + "_meta": { + "copilotUsage": "0.33x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "mai-code-1.1-flash", + "name": "MAI-Code-1.1-Flash", + "description": "MAI-Code-1.1-Flash", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "description": "Gemini 3.8 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "description": "Gemini 3.7 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "description": "Gemini 3.6 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "description": "Gemini 3.5 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "grok-4.5", + "name": "Grok 4.5", + "description": "Grok 4.5", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "kimi-k3", + "name": "Kimi K3", + "description": "Kimi K3", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "description": "Kimi K2.7 Code", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "description": "Claude Sonnet 5.5", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "gpt-6-luna", + "name": "GPT-6 Luna", + "description": "GPT-6 Luna", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "grok-4.6", + "name": "Grok 4.6", + "description": "Grok 4.6", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "grok-4.7", + "name": "Grok 4.7", + "description": "Grok 4.7", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + } + ] + }, + { + "type": "select", + "id": "reasoning_effort", + "name": "Reasoning Effort", + "category": "thought_level", + "description": "How much reasoning the model performs before responding. Higher effort can improve quality at the cost of speed.", + "currentValue": "medium", + "options": [ + { + "value": "none", + "name": "none", + "description": "No additional reasoning; fastest responses." + }, + { + "value": "low", + "name": "low", + "description": "Minimal reasoning before responding." + }, + { + "value": "medium", + "name": "medium", + "description": "Balanced reasoning and speed." + }, + { + "value": "high", + "name": "high", + "description": "More thorough reasoning; slower responses." + }, + { + "value": "xhigh", + "name": "xhigh", + "description": "Extensive reasoning for the hardest problems." + }, + { + "value": "max", + "name": "max", + "description": "Maximum reasoning; slowest but most thorough." + } + ] + }, + { + "type": "select", + "id": "allow_all", + "name": "Allow All", + "currentValue": "off", + "options": [ + { + "value": "on", + "name": "On", + "description": "Automatically approve all tool, path, and URL requests" + }, + { + "value": "off", + "name": "Off", + "description": "Require approval for tool, path, and URL requests" + } + ], + "category": "permissions", + "description": "Controls whether Copilot prompts for approval before using tools, accessing paths, or fetching URLs." + } + ], + "promptSent": false, + "qualification": "pending; metadata discovery only", + "observedMethods": { + "session/update": 3 + }, + "modelSelection": { + "requestedModel": "gpt-5.6-luna", + "succeeded": true, + "response": {}, + "configEcho": { + "configOptions": [ + { + "type": "select", + "id": "mode", + "name": "Mode", + "currentValue": "https://agentclientprotocol.com/protocol/session-modes#agent", + "options": [ + { + "value": "https://agentclientprotocol.com/protocol/session-modes#agent", + "name": "Agent", + "description": "Default agent mode for conversational interactions" + }, + { + "value": "https://agentclientprotocol.com/protocol/session-modes#plan", + "name": "Plan", + "description": "Plan mode for creating and executing multi-step plans" + }, + { + "value": "https://agentclientprotocol.com/protocol/session-modes#autopilot", + "name": "Autopilot", + "description": "Autonomous mode that enables allow-all and runs until task completion without user interaction (experimental)" + } + ], + "category": "mode", + "description": "Controls how Copilot responds: a conversational agent, planning multi-step work, or autonomous autopilot." + }, + { + "type": "select", + "id": "model", + "name": "Model", + "category": "model", + "description": "The AI model Copilot uses to generate responses.", + "currentValue": "gpt-5.6-luna", + "options": [ + { + "value": "auto", + "name": "Auto", + "description": "Let Copilot pick the best model", + "_meta": null + }, + { + "value": "gpt-5.6-terra", + "name": "GPT-5.6 Terra", + "description": "GPT-5.6 Terra", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "gpt-5.6-luna", + "name": "GPT-5.6 Luna", + "description": "GPT-5.6 Luna", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gpt-5.4", + "name": "GPT-5.4", + "description": "GPT-5.4", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "gpt-5.4-mini", + "name": "GPT-5.4 mini", + "description": "GPT-5.4 mini", + "_meta": { + "copilotUsage": "0.33x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gpt-5.3-codex", + "name": "GPT-5.3-Codex", + "description": "GPT-5.3-Codex", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "gpt-5-mini", + "name": "GPT-5 mini", + "description": "GPT-5 mini", + "_meta": { + "copilotUsage": "0x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "description": "Claude Sonnet 5", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "claude-haiku-4.5", + "name": "Claude Haiku 4.5", + "description": "Claude Haiku 4.5", + "_meta": { + "copilotUsage": "0.33x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "mai-code-1.1-flash", + "name": "MAI-Code-1.1-Flash", + "description": "MAI-Code-1.1-Flash", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gemini-3.8-flash", + "name": "Gemini 3.8 Flash", + "description": "Gemini 3.8 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gemini-3.7-flash", + "name": "Gemini 3.7 Flash", + "description": "Gemini 3.7 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gemini-3.6-flash", + "name": "Gemini 3.6 Flash", + "description": "Gemini 3.6 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "gemini-3.5-flash", + "name": "Gemini 3.5 Flash", + "description": "Gemini 3.5 Flash", + "_meta": { + "copilotUsage": "14x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "grok-4.5", + "name": "Grok 4.5", + "description": "Grok 4.5", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "kimi-k3", + "name": "Kimi K3", + "description": "Kimi K3", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "kimi-k2.7-code", + "name": "Kimi K2.7 Code", + "description": "Kimi K2.7 Code", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "claude-sonnet-5.5", + "name": "Claude Sonnet 5.5", + "description": "Claude Sonnet 5.5", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "gpt-6-luna", + "name": "GPT-6 Luna", + "description": "GPT-6 Luna", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "low" + } + }, + { + "value": "grok-4.6", + "name": "Grok 4.6", + "description": "Grok 4.6", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + }, + { + "value": "grok-4.7", + "name": "Grok 4.7", + "description": "Grok 4.7", + "_meta": { + "copilotUsage": "1x", + "copilotEnablement": "enabled", + "copilotPriceCategory": "medium" + } + } + ] + }, + { + "type": "select", + "id": "reasoning_effort", + "name": "Reasoning Effort", + "category": "thought_level", + "description": "How much reasoning the model performs before responding. Higher effort can improve quality at the cost of speed.", + "currentValue": "medium", + "options": [ + { + "value": "none", + "name": "none", + "description": "No additional reasoning; fastest responses." + }, + { + "value": "low", + "name": "low", + "description": "Minimal reasoning before responding." + }, + { + "value": "medium", + "name": "medium", + "description": "Balanced reasoning and speed." + }, + { + "value": "high", + "name": "high", + "description": "More thorough reasoning; slower responses." + }, + { + "value": "xhigh", + "name": "xhigh", + "description": "Extensive reasoning for the hardest problems." + }, + { + "value": "max", + "name": "max", + "description": "Maximum reasoning; slowest but most thorough." + } + ] + }, + { + "type": "select", + "id": "allow_all", + "name": "Allow All", + "currentValue": "off", + "options": [ + { + "value": "on", + "name": "On", + "description": "Automatically approve all tool, path, and URL requests" + }, + { + "value": "off", + "name": "Off", + "description": "Require approval for tool, path, and URL requests" + } + ], + "category": "permissions", + "description": "Controls whether Copilot prompts for approval before using tools, accessing paths, or fetching URLs." + } + ] + } + }, + "sessionClosed": true, + "promptRequestsSent": 0, + "inferenceVerified": false +}