adhdev 0.8.37 → 0.8.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -4615,11 +4615,10 @@ function shouldIncludeRuntimeMetadata(profile) {
4615
4615
  }
4616
4616
  function findCdpManager(cdpManagers, key) {
4617
4617
  const exact = cdpManagers.get(key);
4618
- if (exact) return exact;
4618
+ if (exact) return exact.isConnected ? exact : null;
4619
4619
  const prefix = key + "_";
4620
- for (const [k, m] of cdpManagers.entries()) {
4621
- if (k.startsWith(prefix) && m.isConnected) return m;
4622
- }
4620
+ const matches = [...cdpManagers.entries()].filter(([k, m]) => m.isConnected && k.startsWith(prefix));
4621
+ if (matches.length === 1) return matches[0][1];
4623
4622
  return null;
4624
4623
  }
4625
4624
  function hasCdpManager(cdpManagers, key) {
@@ -4631,8 +4630,13 @@ function hasCdpManager(cdpManagers, key) {
4631
4630
  return false;
4632
4631
  }
4633
4632
  function isCdpConnected(cdpManagers, key) {
4634
- const m = findCdpManager(cdpManagers, key);
4635
- return m?.isConnected ?? false;
4633
+ const exact = cdpManagers.get(key);
4634
+ if (exact?.isConnected) return true;
4635
+ const prefix = key + "_";
4636
+ for (const [k, m] of cdpManagers.entries()) {
4637
+ if (m.isConnected && k.startsWith(prefix)) return true;
4638
+ }
4639
+ return false;
4636
4640
  }
4637
4641
  function buildFallbackControls(providerControls, serverModel, serverMode, acpConfigOptions, acpModes) {
4638
4642
  if (providerControls && providerControls.length > 0) return providerControls;
@@ -32606,6 +32610,56 @@ function parseMessageTime(value) {
32606
32610
  }
32607
32611
  return 0;
32608
32612
  }
32613
+ function stringifyPreviewContent(content) {
32614
+ if (typeof content === "string") return content;
32615
+ if (Array.isArray(content)) {
32616
+ return content.map((block) => {
32617
+ if (typeof block === "string") return block;
32618
+ if (block && typeof block === "object" && "text" in block) {
32619
+ return String(block.text || "");
32620
+ }
32621
+ return "";
32622
+ }).join(" ");
32623
+ }
32624
+ if (content && typeof content === "object" && "text" in content) {
32625
+ return String(content.text || "");
32626
+ }
32627
+ return String(content || "");
32628
+ }
32629
+ function normalizePreviewText(content) {
32630
+ return stringifyPreviewContent(content).replace(/\s+/g, " ").trim();
32631
+ }
32632
+ function clampPreviewText(value, maxChars = 120) {
32633
+ if (value.length <= maxChars) return value;
32634
+ if (maxChars <= 1) return value.slice(0, maxChars);
32635
+ return `${value.slice(0, maxChars - 1)}\u2026`;
32636
+ }
32637
+ function simplePreviewHash(value) {
32638
+ let h = 2166136261;
32639
+ for (let i = 0; i < value.length; i += 1) {
32640
+ h ^= value.charCodeAt(i);
32641
+ h = h * 16777619 >>> 0;
32642
+ }
32643
+ return h.toString(16);
32644
+ }
32645
+ function getLastDisplayMessage(session) {
32646
+ const messages = session.activeChat?.messages;
32647
+ if (!Array.isArray(messages) || messages.length === 0) return null;
32648
+ for (let i = messages.length - 1; i >= 0; i -= 1) {
32649
+ const candidate = messages[i];
32650
+ const role = typeof candidate?.role === "string" ? candidate.role : "";
32651
+ if (role === "system") continue;
32652
+ const preview = clampPreviewText(normalizePreviewText(candidate?.content));
32653
+ if (!preview) continue;
32654
+ return {
32655
+ role,
32656
+ preview,
32657
+ receivedAt: parseMessageTime(candidate?.receivedAt),
32658
+ hash: simplePreviewHash(`${role}:${preview}`)
32659
+ };
32660
+ }
32661
+ return null;
32662
+ }
32609
32663
  function getSessionMessageUpdatedAt(session) {
32610
32664
  const lastMessage = session.activeChat?.messages?.at?.(-1);
32611
32665
  if (!lastMessage) return 0;
@@ -32626,8 +32680,7 @@ function getSessionLastUsedAt(session) {
32626
32680
  return getSessionMessageUpdatedAt(session) || session.lastUpdated || Date.now();
32627
32681
  }
32628
32682
  function getLastMessageRole(session) {
32629
- const role = session.activeChat?.messages?.at?.(-1)?.role;
32630
- return typeof role === "string" ? role : "";
32683
+ return getLastDisplayMessage(session)?.role || "";
32631
32684
  }
32632
32685
  function getUnreadState(hasContentChange, status, lastUsedAt, lastSeenAt, lastRole, completionMarker, seenCompletionMarker) {
32633
32686
  if (status === "waiting_approval") {
@@ -32694,6 +32747,13 @@ function buildStatusSnapshot(options) {
32694
32747
  `snapshot session id=${session.id} provider=${session.providerType} status=${String(session.status || "")} bucket=${inboxBucket} unread=${String(unread)} lastSeenAt=${lastSeenAt} completionMarker=${completionMarker || "-"} seenMarker=${seenCompletionMarker || "-"} lastUpdated=${String(session.lastUpdated || 0)} lastUsedAt=${lastUsedAt} lastRole=${getLastMessageRole(sourceSession)} msgUpdatedAt=${getSessionMessageUpdatedAt(sourceSession)}`
32695
32748
  );
32696
32749
  }
32750
+ const lastDisplayMessage = getLastDisplayMessage(sourceSession);
32751
+ if (lastDisplayMessage) {
32752
+ session.lastMessagePreview = lastDisplayMessage.preview;
32753
+ session.lastMessageRole = lastDisplayMessage.role;
32754
+ if (lastDisplayMessage.receivedAt > 0) session.lastMessageAt = lastDisplayMessage.receivedAt;
32755
+ session.lastMessageHash = lastDisplayMessage.hash;
32756
+ }
32697
32757
  }
32698
32758
  const includeMachineMetadata = profile !== "live";
32699
32759
  const terminalBackend = includeMachineMetadata ? getTerminalBackendRuntimeStatus() : void 0;
@@ -35561,8 +35621,18 @@ async function handleScriptHints(ctx, type, _req, res) {
35561
35621
  }
35562
35622
  async function handleCdpTargets(ctx, _req, res) {
35563
35623
  const targets = [];
35564
- for (const [ide, cdp] of ctx.cdpManagers.entries()) {
35565
- targets.push({ ide, connected: cdp.isConnected, port: cdp.getPort() });
35624
+ for (const [managerKey, cdp] of ctx.cdpManagers.entries()) {
35625
+ const underscore = managerKey.indexOf("_");
35626
+ const ideBase = underscore === -1 ? managerKey : managerKey.slice(0, underscore);
35627
+ targets.push({
35628
+ managerKey,
35629
+ ide: managerKey,
35630
+ ideBase,
35631
+ pageTitle: cdp.pageTitle,
35632
+ targetId: cdp.targetId,
35633
+ connected: cdp.isConnected,
35634
+ port: cdp.getPort()
35635
+ });
35566
35636
  }
35567
35637
  ctx.json(res, 200, { targets });
35568
35638
  }
@@ -37293,6 +37363,16 @@ function getDefaultAutoImplReference(ctx, category, type) {
37293
37363
  if (category === "cli") {
37294
37364
  return type === "codex-cli" ? "claude-cli" : "codex-cli";
37295
37365
  }
37366
+ if (category === "extension") {
37367
+ const preferred = ["claude-code-vscode", "codex", "cline", "roo-code"];
37368
+ for (const ref of preferred) {
37369
+ if (ref === type) continue;
37370
+ if (ctx.providerLoader.resolve(ref) || ctx.providerLoader.getMeta(ref)) return ref;
37371
+ }
37372
+ const all = ctx.providerLoader.getAll();
37373
+ const fb = all.find((p) => p.category === "extension" && p.type !== type);
37374
+ if (fb?.type) return fb.type;
37375
+ }
37296
37376
  return "antigravity";
37297
37377
  }
37298
37378
  function resolveAutoImplReference(ctx, category, requestedReference, targetType) {
@@ -37874,12 +37954,26 @@ function buildAutoImplPrompt(ctx, type, provider, providerDir, functions, domCon
37874
37954
  return buildCliAutoImplPrompt(ctx, type, provider, providerDir, functions, referenceScripts, userComment, referenceType, verification);
37875
37955
  }
37876
37956
  const lines = [];
37957
+ const cdpIdeType = provider.category === "extension" ? "cursor" : type;
37877
37958
  lines.push("You are implementing browser automation scripts for an IDE provider.");
37878
37959
  lines.push("Be concise. Do NOT explain your reasoning. Just edit files directly.");
37879
37960
  lines.push("");
37880
37961
  lines.push(`# Target: ${provider.name || type} (${type})`);
37881
37962
  lines.push(`Provider directory: \`${providerDir}\``);
37882
37963
  lines.push("");
37964
+ if (provider.category === "extension") {
37965
+ lines.push("## CDP host (extension providers)");
37966
+ lines.push(
37967
+ `Extension **${type}** runs inside a host IDE. For \`/api/scripts/run\` and \`/api/cdp/evaluate\`, keep \`"type": "${type}"\` (which provider scripts run) but set \`"ideType"\` to the DevServer CDP **managerKey** for that window.`
37968
+ );
37969
+ lines.push(
37970
+ `Examples use \`"ideType": "${cdpIdeType}"\` (Cursor). If **multiple** IDE windows are connected, run \`GET /api/cdp/targets\` and use the correct \`managerKey\` / \`pageTitle\` \u2014 short \`cursor\` or \`vscode\` only works when it uniquely identifies one window.`
37971
+ );
37972
+ lines.push(
37973
+ "For VS Code hosts, use `vscode` or full `vscode_<targetId>` managerKey in every curl below."
37974
+ );
37975
+ lines.push("");
37976
+ }
37883
37977
  const funcToFile = {
37884
37978
  readChat: "read_chat.js",
37885
37979
  sendMessage: "send_message.js",
@@ -38060,14 +38154,14 @@ function buildAutoImplPrompt(ctx, type, provider, providerDir, functions, domCon
38060
38154
  lines.push("```bash");
38061
38155
  lines.push(`curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/cdp/evaluate \\`);
38062
38156
  lines.push(` -H "Content-Type: application/json" \\`);
38063
- lines.push(` -d '{"expression": "document.body.innerHTML.substring(0, 1000)", "ideType": "${type}"}'`);
38157
+ lines.push(` -d '{"expression": "document.body.innerHTML.substring(0, 1000)", "ideType": "${cdpIdeType}"}'`);
38064
38158
  lines.push("```");
38065
38159
  lines.push("");
38066
38160
  lines.push("### 2. Test your generated function");
38067
38161
  lines.push("Once you save the file, test it by running:");
38068
38162
  lines.push("```bash");
38069
38163
  lines.push(`curl -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/providers/reload`);
38070
- lines.push(`curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "readChat", "type": "${type}", "ideType": "${type}"}'`);
38164
+ lines.push(`curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "readChat", "type": "${type}", "ideType": "${cdpIdeType}"}'`);
38071
38165
  lines.push("```");
38072
38166
  lines.push("");
38073
38167
  lines.push("### Task Workflow");
@@ -38077,10 +38171,12 @@ function buildAutoImplPrompt(ctx, type, provider, providerDir, functions, domCon
38077
38171
  lines.push("4. Reload providers and TEST your script via the API.");
38078
38172
  lines.push("");
38079
38173
  lines.push("### \u{1F525} Advanced UI Parsing (CRUCIAL for `readChat`)");
38080
- lines.push("Your `readChat` must flawlessly parse complex UI elements (tables, code blocks, tool calls, and AI thoughts). The quality must match the `antigravity` reference.");
38174
+ lines.push(
38175
+ `Your \`readChat\` must flawlessly parse complex UI elements (tables, code blocks, tool calls, and AI thoughts). Match the depth of the **${referenceType || "reference"}** scripts above (patterns and structure, not necessarily the same DOM).`
38176
+ );
38081
38177
  lines.push("To achieve this, you MUST generate a live test scenario:");
38082
38178
  lines.push(`1. Early in your process, send a rich prompt to the IDE using the API:`);
38083
- lines.push(` \`curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "sendMessage", "type": "${type}", "ideType": "${type}", "args": {"message": "Write a python script, draw a markdown table, use a tool, and show your reasoning/thought process"}}'\``);
38179
+ lines.push(` \`curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "sendMessage", "type": "${type}", "ideType": "${cdpIdeType}", "args": {"message": "Write a python script, draw a markdown table, use a tool, and show your reasoning/thought process"}}'\``);
38084
38180
  lines.push("2. Wait a few seconds for the IDE AI to generate these elements in the UI.");
38085
38181
  lines.push("3. Use CDP evaluate to deeply inspect the DOM structure of the newly generated tables, code blocks, thought blocks, and tool calls.");
38086
38182
  lines.push("4. Ensure `readChat` extracts `content` with precise markdown formatting (especially for tables/code) and assigns correct `kind` tags (`thought`, `tool`, `terminal`).");
@@ -38091,27 +38187,27 @@ function buildAutoImplPrompt(ctx, type, provider, providerDir, functions, domCon
38091
38187
  lines.push("### Step 1: Baseline \u2014 confirm idle");
38092
38188
  lines.push("```bash");
38093
38189
  lines.push(`curl -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/providers/reload`);
38094
- lines.push(`RESULT=$(curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "readChat", "type": "${type}", "ideType": "${type}"}')`);
38190
+ lines.push(`RESULT=$(curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "readChat", "type": "${type}", "ideType": "${cdpIdeType}"}')`);
38095
38191
  lines.push(`echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); r=d.get('result',d); r=json.loads(r) if isinstance(r,str) else r; assert r.get('status')=='idle', f'Expected idle, got {r.get(chr(34)+chr(115)+chr(116)+chr(97)+chr(116)+chr(117)+chr(115)+chr(34))}'; print('Step 1 PASS: status=idle')"`);
38096
38192
  lines.push("```");
38097
38193
  lines.push("");
38098
38194
  lines.push("### Step 2: Send a LONG message that triggers extended generation (10+ seconds)");
38099
38195
  lines.push("```bash");
38100
- lines.push(`curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "sendMessage", "type": "${type}", "ideType": "${type}", "args": {"message": "Write an extremely detailed 5000-word essay about the history of artificial intelligence from Alan Turing to 2025. Be very thorough and verbose."}}'`);
38196
+ lines.push(`curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "sendMessage", "type": "${type}", "ideType": "${cdpIdeType}", "args": {"message": "Write an extremely detailed 5000-word essay about the history of artificial intelligence from Alan Turing to 2025. Be very thorough and verbose."}}'`);
38101
38197
  lines.push("sleep 3");
38102
38198
  lines.push("```");
38103
38199
  lines.push("");
38104
38200
  lines.push("### Step 3: Check generating OR completed");
38105
38201
  lines.push("The AI may still be generating OR may have finished already. Either generating or idle is acceptable:");
38106
38202
  lines.push("```bash");
38107
- lines.push(`RESULT=$(curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "readChat", "type": "${type}", "ideType": "${type}"}')`);
38203
+ lines.push(`RESULT=$(curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "readChat", "type": "${type}", "ideType": "${cdpIdeType}"}')`);
38108
38204
  lines.push(`echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); r=d.get('result',d); r=json.loads(r) if isinstance(r,str) else r; s=r.get('status'); assert s in ('generating','idle','waiting_approval'), f'Unexpected: {s}'; print(f'Step 3 PASS: status={s}')"`);
38109
38205
  lines.push("```");
38110
38206
  lines.push("");
38111
38207
  lines.push("### Step 4: Wait for completion and verify new message");
38112
38208
  lines.push("```bash");
38113
38209
  lines.push("sleep 10");
38114
- lines.push(`RESULT=$(curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "readChat", "type": "${type}", "ideType": "${type}"}')`);
38210
+ lines.push(`RESULT=$(curl -sS -X POST http://127.0.0.1:${DEV_SERVER_PORT}/api/scripts/run -H "Content-Type: application/json" -d '{"script": "readChat", "type": "${type}", "ideType": "${cdpIdeType}"}')`);
38115
38211
  lines.push(`echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); r=d.get('result',d); r=json.loads(r) if isinstance(r,str) else r; s=r.get('status'); msgs=r.get('messages',[]); assert s=='idle', f'Expected idle, got {s}'; assert len(msgs)>0, 'No messages'; print(f'Step 4 PASS: status={s}, messages={len(msgs)}')"`);
38116
38212
  lines.push("```");
38117
38213
  lines.push("");
@@ -38634,6 +38730,7 @@ var init_dev_server = __esm({
38634
38730
  init_scaffold_template();
38635
38731
  init_version_archive();
38636
38732
  init_logger();
38733
+ init_builders();
38637
38734
  init_dev_cdp_handlers();
38638
38735
  init_dev_cli_debug();
38639
38736
  init_dev_auto_implement();
@@ -40011,22 +40108,29 @@ data: ${JSON.stringify(msg.data)}
40011
40108
  }
40012
40109
  }
40013
40110
  }
40014
- /** Get CDP manager — matching IDE when ideType specified, first connected one otherwise.
40015
- * DevServer is a debugging tool so first-connected fallback is acceptable,
40016
- * but callers should pass ideType when possible. */
40111
+ /**
40112
+ * Resolve a CDP manager for DevServer APIs.
40113
+ * - Pass full **managerKey** from `GET /api/cdp/targets` when multiple Cursor/VS Code windows are open
40114
+ * (e.g. `cursor_0006DE34…`); short `cursor` only works when it maps to exactly one connected manager.
40115
+ * - With `ideType` omitted: only succeeds when exactly one connected manager exists.
40116
+ */
40017
40117
  getCdp(ideType) {
40018
40118
  if (ideType) {
40019
- const cdp = this.cdpManagers.get(ideType);
40020
- if (cdp?.isConnected) return cdp;
40021
- for (const [k, m] of this.cdpManagers.entries()) {
40022
- if (k.startsWith(ideType + "_") && m.isConnected) return m;
40023
- }
40024
- LOG.warn("DevServer", `getCdp: no manager found for ideType '${ideType}', available: [${[...this.cdpManagers.keys()].join(", ")}]`);
40119
+ const cdp = findCdpManager(this.cdpManagers, ideType);
40120
+ if (cdp) return cdp;
40121
+ LOG.warn(
40122
+ "DevServer",
40123
+ `getCdp: no unique match for '${ideType}', available: [${[...this.cdpManagers.keys()].join(", ")}] \u2014 use managerKey from GET /api/cdp/targets`
40124
+ );
40025
40125
  return null;
40026
40126
  }
40027
- for (const cdp of this.cdpManagers.values()) {
40028
- if (cdp.isConnected) return cdp;
40029
- }
40127
+ const connected = [...this.cdpManagers.entries()].filter(([, m]) => m.isConnected);
40128
+ if (connected.length === 1) return connected[0][1];
40129
+ if (connected.length === 0) return null;
40130
+ LOG.warn(
40131
+ "DevServer",
40132
+ `getCdp: ideType omitted but ${connected.length} CDP windows \u2014 pass managerKey from GET /api/cdp/targets`
40133
+ );
40030
40134
  return null;
40031
40135
  }
40032
40136
  json(res, status, data) {
@@ -40717,6 +40821,19 @@ var init_installer = __esm({
40717
40821
  requiresApiKey: true,
40718
40822
  apiKeyName: "Anthropic/OpenAI API key"
40719
40823
  },
40824
+ {
40825
+ id: "claude-code-vscode",
40826
+ name: "Claude Code",
40827
+ displayName: "Claude Code (Anthropic)",
40828
+ marketplaceId: "anthropic.claude-code",
40829
+ description: "Anthropic Claude Code agent in VS Code\u2013compatible editors",
40830
+ category: "ai-agent",
40831
+ icon: "\u{1F7E0}",
40832
+ recommended: true,
40833
+ requiresApiKey: true,
40834
+ apiKeyName: "Anthropic account",
40835
+ website: "https://www.anthropic.com/claude-code"
40836
+ },
40720
40837
  {
40721
40838
  id: "continue",
40722
40839
  name: "Continue",
@@ -49959,7 +50076,7 @@ var init_adhdev_daemon = __esm({
49959
50076
  import_ws3 = require("ws");
49960
50077
  import_chalk2 = __toESM(require("chalk"));
49961
50078
  init_version();
49962
- pkgVersion = resolvePackageVersion({ injectedVersion: "0.8.37" });
50079
+ pkgVersion = resolvePackageVersion({ injectedVersion: "0.8.38" });
49963
50080
  ACTIVE_CHAT_POLL_STATUSES = /* @__PURE__ */ new Set([
49964
50081
  "generating",
49965
50082
  "waiting_approval",
@@ -51391,6 +51508,11 @@ var init_supported = __esm({
51391
51508
  "id": "roo-code",
51392
51509
  "name": "Roo Code",
51393
51510
  "icon": "\u{1F998}"
51511
+ },
51512
+ {
51513
+ "id": "claude-code-vscode",
51514
+ "name": "Claude Code (VS Code)",
51515
+ "icon": "\u{1F7E0}"
51394
51516
  }
51395
51517
  ];
51396
51518
  BUILTIN_ACP_COUNT = 35;
@@ -51669,6 +51791,17 @@ var init_supported = __esm({
51669
51791
  "owner": "community",
51670
51792
  "source": "docs/site/data/provider-catalog.mjs"
51671
51793
  },
51794
+ "claude-code-vscode": {
51795
+ "status": "unverified",
51796
+ "testedOn": [],
51797
+ "testedVersions": [],
51798
+ "validatedFlows": [],
51799
+ "lastValidated": null,
51800
+ "notes": "",
51801
+ "evidence": "",
51802
+ "owner": "community",
51803
+ "source": "docs/site/data/provider-catalog.mjs"
51804
+ },
51672
51805
  "agentpool-acp": {
51673
51806
  "status": "unverified",
51674
51807
  "testedOn": [],
@@ -52089,6 +52222,7 @@ var init_supported = __esm({
52089
52222
  "cline": "unverified",
52090
52223
  "codex": "partial",
52091
52224
  "roo-code": "unverified",
52225
+ "claude-code-vscode": "unverified",
52092
52226
  "agentpool-acp": "unverified",
52093
52227
  "amp-acp": "unverified",
52094
52228
  "auggie-acp": "unverified",
@@ -52186,6 +52320,25 @@ var init_supported = __esm({
52186
52320
  "resolve_action"
52187
52321
  ],
52188
52322
  "notes": "Promotion should wait until the provider exposes session history and switching in a first-class way instead of relying on empty extension history responses."
52323
+ },
52324
+ {
52325
+ "id": "claude-code-vscode",
52326
+ "name": "Claude Code (VS Code)",
52327
+ "category": "extension",
52328
+ "targetStatus": "partial",
52329
+ "priority": 4,
52330
+ "rationale": "Official Anthropic VS Code extension; cloud dashboards should surface it alongside other extension agents once CDP webview flows are validated.",
52331
+ "requiredFlows": [
52332
+ "read_chat",
52333
+ "new_session",
52334
+ "send_chat",
52335
+ "list_sessions",
52336
+ "switch_session"
52337
+ ],
52338
+ "optionalFlows": [
52339
+ "resolve_action"
52340
+ ],
52341
+ "notes": "Validate with DevServer and explicit managerKey when multiple IDE windows are attached."
52189
52342
  }
52190
52343
  ];
52191
52344
  SUPPORTED_IDES = BUILTIN_IDES;
@@ -53447,6 +53600,15 @@ function getDefaultAutoFixReference(category, type, providers) {
53447
53600
  const fallback = providers.find((p) => p.category === "cli" && p.type !== type);
53448
53601
  return fallback?.type || "codex-cli";
53449
53602
  }
53603
+ if (category === "extension") {
53604
+ const preferred = ["claude-code-vscode", "codex", "cline", "roo-code"];
53605
+ const picked = preferred.find(
53606
+ (ref) => ref !== type && providers.some((p) => p.type === ref && p.category === "extension")
53607
+ );
53608
+ if (picked) return picked;
53609
+ const fallback = providers.find((p) => p.category === "extension" && p.type !== type);
53610
+ if (fallback?.type) return fallback.type;
53611
+ }
53450
53612
  return "antigravity";
53451
53613
  }
53452
53614
  function escapeRegex2(value) {