test(runner): retain authenticated Copilot model discovery

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-09-28 15:17:09 -05:00
1 parent a989354a5e
commit 08cabb1f2e
4 files changed
+936 -6

No files matched your search

@@ -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.
@@ -0,0 +1,41 @@
// Metadata only: initialize, create a disposable session, select an advertised model, then close.
// Usage: node discover-copilot-acp.mjs <verified-provider-pack> <safe-output.json> [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});}
@@ -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}$/);
@@ -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
}