context-mode 2.0.0-next.5 → 2.0.0-next.7

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/pi/index.js CHANGED
@@ -11164,9 +11164,11 @@ var REPLACE_TRIGGER_BYTES = 4096;
11164
11164
  var REPLACE_RETURN_BYTES = 96;
11165
11165
  var SHAPE_RETURN_BYTES = 256;
11166
11166
  var REPLACE_CHUNK_BYTES = 48;
11167
- function REPLACE_HANDLE_LINE(intent, handle, bytes4, prefix = "") {
11168
- return prefix + "ctx_search({queries:[" + JSON.stringify(intent) + "], source:" + JSON.stringify(handle) + "}) searches the whole output (" + bytes4 + " B).";
11167
+ function REPLACE_HANDLE_LINE(intent, handle, bytes4, prefix = "", asked = "") {
11168
+ const queries = asked === "" ? [intent] : [intent, asked];
11169
+ return prefix + "ctx_search({queries:[" + queries.map((q) => JSON.stringify(q)).join(",") + "], source:" + JSON.stringify(handle) + "}) searches the whole output (" + bytes4 + " B).";
11169
11170
  }
11171
+ var HANDLE_PROMPT_WORDS = 3;
11170
11172
  var MAX_CHUNK_BYTES = 4096;
11171
11173
  var SEARCH_PAGE_SIZE = 20;
11172
11174
  var SNIPPET_MAX_BYTES = 800;
@@ -11474,7 +11476,7 @@ var DECISION_OPTION_KEY = "option";
11474
11476
  var DECISION_LABEL_JOIN = " | ";
11475
11477
  var RELEASE_REPO_URL = "https://github.com/mksglu/context-mode.git";
11476
11478
  var RELEASE_BRANCH = "release";
11477
- var BUNDLE_SHA = true ? "0bf5734278463ea178b282436a39ba81347dadab" : void 0;
11479
+ var BUNDLE_SHA = true ? "f61b6973877b47851ac5938c46fee1399946289e" : void 0;
11478
11480
  var DOCTOR_CHECK_ORDER = Object.freeze(["D1", "D2", "D3", "D4", "D5", "D5b", "D6", "D7", "D8", "D9", "D10"]);
11479
11481
  var DOCTOR_LABEL = Object.freeze({
11480
11482
  D1: "version",
@@ -11713,6 +11715,7 @@ var V1_HOOKS_DIR_NAME = "hooks";
11713
11715
  var SETTINGS_FILE = "settings.json";
11714
11716
  var CLAUDE_USER_CONFIG_FILE = ".claude.json";
11715
11717
  var HOOKS_JSON_FILE = "hooks.json";
11718
+ var CODEX_HOME_ENV = "CODEX_HOME";
11716
11719
  var CONFIG_TOML_FILE = "config.toml";
11717
11720
  var CONFIG_JSON_FILE = "config.json";
11718
11721
  var ZCODE_CLI_DIR = "cli";
@@ -11778,8 +11781,12 @@ var JSON_INDENT_UNIT = " ";
11778
11781
  var MCP_COMMAND_FIELD = "command";
11779
11782
  var MCP_ARGS_FIELD = "args";
11780
11783
  var ZCODE_MCP_FEATURE_KEY = Object.freeze(["features", "mcp"]);
11784
+ var CODEX_OMIT_TOOLS_FROM_FIELD = "omit_tools_from";
11785
+ var CODEX_OMIT_DEFERRED = Object.freeze(["deferred"]);
11786
+ var CODEX_APPROVAL_MODE_FIELD = "default_tools_approval_mode";
11787
+ var CODEX_APPROVAL_APPROVE = "approve";
11781
11788
  var OWN_MCP_ENTRY = Object.freeze({
11782
- codex: { file: [".codex", "config.toml"], key: ["mcp_servers", SERVER_KEY] },
11789
+ codex: { file: [".codex", "config.toml"], key: ["mcp_servers", SERVER_KEY], fields: { [CODEX_OMIT_TOOLS_FROM_FIELD]: CODEX_OMIT_DEFERRED, [CODEX_APPROVAL_MODE_FIELD]: CODEX_APPROVAL_APPROVE } },
11783
11790
  vscode: { file: [".vscode", "mcp.json"], key: ["servers", SERVER_KEY] },
11784
11791
  kiro: { file: [".kiro", "settings", "mcp.json"], key: ["mcpServers", SERVER_KEY] },
11785
11792
  zcode: {
@@ -12300,9 +12307,62 @@ function readResult5(resp) {
12300
12307
  const isError = typeof resp === "object" && resp !== null && resp.is_error === true;
12301
12308
  return { isError, bytes: Buffer.byteLength(text), text };
12302
12309
  }
12310
+ var CAMEL_EVENTS = {
12311
+ sessionStart: "SessionStart",
12312
+ userPromptSubmitted: "UserPromptSubmit",
12313
+ preToolUse: "PreToolUse",
12314
+ postToolUse: "PostToolUse",
12315
+ preCompact: "PreCompact"
12316
+ };
12317
+ var EVENT_BY_KEY2 = [
12318
+ ["toolResult", "postToolUse"],
12319
+ ["toolName", "preToolUse"],
12320
+ ["prompt", "userPromptSubmitted"],
12321
+ ["source", "sessionStart"],
12322
+ ["trigger", "preCompact"]
12323
+ ];
12324
+ var SESSION_SOURCES = { new: "startup", startup: "startup", resume: "resume" };
12325
+ var RESULT_SUCCESS2 = "success";
12326
+ function isRecord2(v) {
12327
+ return typeof v === "object" && v !== null && !Array.isArray(v);
12328
+ }
12329
+ function readArgs2(v) {
12330
+ if (isRecord2(v)) return v;
12331
+ if (typeof v !== "string") return {};
12332
+ try {
12333
+ const parsed = JSON.parse(v);
12334
+ return isRecord2(parsed) ? parsed : {};
12335
+ } catch {
12336
+ return {};
12337
+ }
12338
+ }
12339
+ function readCamelResult(v) {
12340
+ const r = isRecord2(v) ? v : {};
12341
+ const text = typeof r.textResultForLlm === "string" ? r.textResultForLlm : "";
12342
+ return { isError: typeof r.resultType === "string" && r.resultType !== RESULT_SUCCESS2, bytes: Buffer.byteLength(text), text };
12343
+ }
12344
+ function decodeCamel(p, name) {
12345
+ const event = typeof name === "string" ? CAMEL_EVENTS[name] ?? VSCODE_EVENTS.find((e) => e === name) : void 0;
12346
+ if (event === void 0) throw new Error("vscode: unknown hook event " + String(name));
12347
+ const ev = { event, agent: "vscode", sessionId: String(p.sessionId ?? ""), cwd: String(p.cwd ?? "") };
12348
+ if (event === "SessionStart" && typeof p.source === "string" && SESSION_SOURCES[p.source] !== void 0) ev.source = SESSION_SOURCES[p.source];
12349
+ if (event === "UserPromptSubmit" && typeof p.prompt === "string") ev.prompt = p.prompt;
12350
+ if (event === "PreToolUse" || event === "PostToolUse") {
12351
+ const toolName = String(p.toolName ?? "");
12352
+ ev.tool = { name: toolName, canonicalName: canonicalName4(toolName), input: readArgs2(p.toolArgs) };
12353
+ }
12354
+ if (event === "PostToolUse") ev.result = readCamelResult(p.toolResult);
12355
+ return ev;
12356
+ }
12303
12357
  function decode7(raw) {
12304
12358
  if (typeof raw !== "object" || raw === null || Array.isArray(raw)) throw new Error("vscode: hook payload is not a JSON object");
12305
12359
  const p = raw;
12360
+ if (p.hookEventName !== void 0) return decodeCamel(p, p.hookEventName);
12361
+ if (p.hook_event_name === void 0) {
12362
+ const byKey = EVENT_BY_KEY2.find(([key]) => Object.hasOwn(p, key))?.[1];
12363
+ if (byKey === void 0) throw new Error("vscode: missing required field hook_event_name");
12364
+ return decodeCamel(p, byKey);
12365
+ }
12306
12366
  const event = VSCODE_EVENTS.find((e) => e === p.hook_event_name);
12307
12367
  if (event === void 0) throw new Error("vscode: unknown hook event " + String(p.hook_event_name));
12308
12368
  const ev = { event, agent: "vscode", sessionId: String(p.session_id ?? ""), cwd: String(p.cwd ?? "") };
@@ -12310,7 +12370,7 @@ function decode7(raw) {
12310
12370
  if (event === "UserPromptSubmit" && typeof p.prompt === "string") ev.prompt = p.prompt;
12311
12371
  if (event === "PreToolUse" || event === "PostToolUse") {
12312
12372
  const name = String(p.tool_name ?? "");
12313
- const input = typeof p.tool_input === "object" && p.tool_input !== null && !Array.isArray(p.tool_input) ? p.tool_input : {};
12373
+ const input = isRecord2(p.tool_input) ? p.tool_input : {};
12314
12374
  ev.tool = { name, canonicalName: canonicalName4(name), input };
12315
12375
  }
12316
12376
  if (event === "PostToolUse") ev.result = readResult5(p.tool_response);
@@ -12329,12 +12389,14 @@ var KIRO_EVENTS = {
12329
12389
  PromptSubmit: "UserPromptSubmit",
12330
12390
  userPromptSubmit: "UserPromptSubmit",
12331
12391
  PreToolUse: "PreToolUse",
12332
- PostToolUse: "PostToolUse"
12392
+ preToolUse: "PreToolUse",
12393
+ PostToolUse: "PostToolUse",
12394
+ postToolUse: "PostToolUse"
12333
12395
  };
12334
12396
  var PROMPT_ENV = "USER_PROMPT";
12335
12397
  var MCP_PREFIX3 = "mcp_";
12336
- var SHELL_TOOL_NAME2 = "execute_bash";
12337
- var NATIVE_TO_CANONICAL6 = { [SHELL_TOOL_NAME2]: "Bash" };
12398
+ var SHELL_TOOL_NAMES = Object.freeze(["execute_bash", "execute_pwsh", "shell"]);
12399
+ var NATIVE_TO_CANONICAL6 = Object.fromEntries(SHELL_TOOL_NAMES.map((n) => [n, "Bash"]));
12338
12400
  var MCP_SEP3 = "_";
12339
12401
  var KIRO_SOURCES = { startup: "startup", resume: "resume", clear: "clear", compact: "compact" };
12340
12402
  function canonicalName5(name) {
@@ -12417,8 +12479,8 @@ var OPENCODE_EVENTS = {
12417
12479
  compaction: "PreCompact",
12418
12480
  "step-finish": "Usage"
12419
12481
  };
12420
- var SHELL_TOOL_NAME3 = "bash";
12421
- var NATIVE_TO_CANONICAL7 = { webfetch: "WebFetch", [SHELL_TOOL_NAME3]: "Bash" };
12482
+ var SHELL_TOOL_NAME2 = "bash";
12483
+ var NATIVE_TO_CANONICAL7 = { webfetch: "WebFetch", [SHELL_TOOL_NAME2]: "Bash" };
12422
12484
  function toCanonicalTool(name) {
12423
12485
  if (name.startsWith(OWN_WIRE_PREFIX)) return name.slice(OWN_WIRE_PREFIX.length);
12424
12486
  return Object.prototype.hasOwnProperty.call(NATIVE_TO_CANONICAL7, name) ? NATIVE_TO_CANONICAL7[name] : name;
@@ -12538,8 +12600,8 @@ var ADAPTERS = Object.freeze([
12538
12600
  hookTimeoutMs: HOOK_TIMEOUT_MS,
12539
12601
  denyChannel: "deny-reason",
12540
12602
  hookChannel: { kind: "package", path: "hooks/qwen.json" },
12541
- skillChannel: { kind: "home-dir", path: ".qwen/skills" },
12542
- // ADR-0020
12603
+ skillChannel: { kind: "package", path: "skills" },
12604
+ // ADR-0020, D-HQ-SKILLS-3: qwen loads <extension>/skills, shared with gemini
12543
12605
  decode: decode5,
12544
12606
  encode: encode5
12545
12607
  },
@@ -12575,8 +12637,8 @@ var ADAPTERS = Object.freeze([
12575
12637
  hookTimeoutMs: HOOK_TIMEOUT_MS,
12576
12638
  denyChannel: "deny-reason",
12577
12639
  hookChannel: { kind: "home-file", path: ".copilot/hooks/context-mode-vscode.json" },
12578
- skillChannel: { kind: "home-dir", path: ".copilot/skills" },
12579
- // ADR-0020
12640
+ skillChannel: { kind: "home-dir", path: ".agents/skills" },
12641
+ // ADR-0020, D-HQ-COPILOT-NAMES-3: Copilot CLI owns ~/.copilot/skills
12580
12642
  decode: decode7,
12581
12643
  encode: encode7
12582
12644
  },
@@ -12585,9 +12647,9 @@ var ADAPTERS = Object.freeze([
12585
12647
  installMode: "mcp-entry",
12586
12648
  projectSource: "arg:--agent+cwd",
12587
12649
  toolNamePrefix: TOOL_NAME_PREFIX8,
12588
- nativeTools: { shell: [SHELL_TOOL_NAME2] },
12650
+ nativeTools: { shell: [...SHELL_TOOL_NAMES] },
12589
12651
  execReadOnlyHint: false,
12590
- // D-HF-KIRO-SHELL-1
12652
+ // D-HF-KIRO-SHELL-1, D-N7-KIRO-1
12591
12653
  eventMap: { SessionStart: "SessionStart", UserPromptSubmit: "UserPromptSubmit", PreToolUse: "PreToolUse", PostToolUse: "PostToolUse" },
12592
12654
  compactDelivery: "none",
12593
12655
  compactSummary: "none",
@@ -12600,7 +12662,7 @@ var ADAPTERS = Object.freeze([
12600
12662
  encode: encode8
12601
12663
  },
12602
12664
  {
12603
- // toolNamePrefix and nativeTools unverified until T-ZC (DECISIONS-r9 R3, R4: Claude names).
12665
+ // toolNamePrefix is the documented ZCode name mcp__<server>__<tool> (D-N7-ZCODE-NAMES-1); nativeTools are Claude names.
12604
12666
  id: "zcode",
12605
12667
  installMode: "hooks+mcp",
12606
12668
  projectSource: "spawn-cwd",
@@ -12642,7 +12704,7 @@ var ADAPTERS = Object.freeze([
12642
12704
  installMode: "in-process",
12643
12705
  projectSource: "spawn-cwd",
12644
12706
  toolNamePrefix: TOOL_NAME_PREFIX10,
12645
- nativeTools: { shell: [SHELL_TOOL_NAME3] },
12707
+ nativeTools: { shell: [SHELL_TOOL_NAME2] },
12646
12708
  execReadOnlyHint: false,
12647
12709
  // D-HF-OPENCODE-SHELL-1
12648
12710
  // Usage: step-finish cost row (DEVIATIONS D-M5-arch-2).
@@ -12664,6 +12726,10 @@ var REPLACE_ROWS = /* @__PURE__ */ new Set(["claude-code", "gemini", "copilot-cl
12664
12726
  function hasReplace(row5) {
12665
12727
  return REPLACE_ROWS.has(row5.id);
12666
12728
  }
12729
+ var DUMP_REPLACE_ROWS = /* @__PURE__ */ new Set(["claude-code", "copilot-cli", "pi"]);
12730
+ function dumpRunsThenReplaces(row5) {
12731
+ return DUMP_REPLACE_ROWS.has(row5.id) && hasReplace(row5);
12732
+ }
12667
12733
  var RECALL_ROWS = /* @__PURE__ */ new Set(["claude-code", "codex", "gemini", "qwen", "copilot-cli", "vscode", "zcode"]);
12668
12734
  function hasRecall(row5) {
12669
12735
  return RECALL_ROWS.has(row5.id);
@@ -13626,6 +13692,10 @@ function homeDirOf(env) {
13626
13692
  if (profile !== void 0 && profile !== "") return profile;
13627
13693
  return null;
13628
13694
  }
13695
+ function codexDirOf(env, home) {
13696
+ const dir = env[CODEX_HOME_ENV];
13697
+ return dir !== void 0 && dir !== "" ? dir : join(home, ...AGENT_HOME_DIR.codex);
13698
+ }
13629
13699
  function homeOf(env) {
13630
13700
  const home = homeDirOf(env);
13631
13701
  if (home !== null) return home;
@@ -14282,7 +14352,7 @@ function read(ev, row5, input) {
14282
14352
  return ALLOW;
14283
14353
  }
14284
14354
  function shellDump(cmds, cwd, row5) {
14285
- if (row5.nativeTools.read !== void 0 && row5.nativeTools.read.length > 0 && hasReplace(row5)) return null;
14355
+ if (row5.nativeTools.read !== void 0 && row5.nativeTools.read.length > 0 && dumpRunsThenReplaces(row5)) return null;
14286
14356
  if (cmds.length !== 1) return null;
14287
14357
  const c = cmds[0];
14288
14358
  if (c.redirectsToFile || c.endsInBoundedSink) return null;
@@ -17203,16 +17273,23 @@ var TYPO_MIN_LEN = 5;
17203
17273
  var TYPO_MAX_DIST = 2;
17204
17274
  function typoTerms(db, words) {
17205
17275
  const has2 = stmt(db.raw, "SELECT 1 AS x FROM chunks_vocab WHERE term = ?");
17206
- const near = stmt(db.raw, "SELECT term, doc FROM chunks_vocab WHERE length(term) BETWEEN ? AND ?");
17276
+ const near = stmt(db.raw, "SELECT term, doc, length(term) AS n FROM chunks_vocab WHERE length(term) BETWEEN ? AND ?");
17277
+ const stems = queryStems(words.join(" "));
17278
+ const miss = stems.map((stem) => has2.get(stem) === void 0 && [...stem].length >= TYPO_MIN_LEN);
17279
+ if (!miss.includes(true)) return null;
17280
+ const lens = stems.filter((_, i) => miss[i]).map((stem) => stem.length);
17281
+ const rows = near.all(Math.min(...lens) - TYPO_MAX_DIST, Math.max(...lens) + TYPO_MAX_DIST);
17207
17282
  let changed = false;
17208
17283
  const out = [];
17209
- for (const stem of queryStems(words.join(" "))) {
17210
- if (has2.get(stem) !== void 0 || [...stem].length < TYPO_MIN_LEN) {
17284
+ stems.forEach((stem, i) => {
17285
+ if (!miss[i]) {
17211
17286
  out.push(stem);
17212
- continue;
17287
+ return;
17213
17288
  }
17214
17289
  let best = null;
17215
- for (const r of near.all(stem.length - TYPO_MAX_DIST, stem.length + TYPO_MAX_DIST)) {
17290
+ for (const r of rows) {
17291
+ const n = Number(r.n);
17292
+ if (n < stem.length - TYPO_MAX_DIST || n > stem.length + TYPO_MAX_DIST) continue;
17216
17293
  const d = editDistance(stem, r.term, TYPO_MAX_DIST);
17217
17294
  if (d > TYPO_MAX_DIST) continue;
17218
17295
  if (best === null || d < best.d || d === best.d && (r.doc > best.doc || r.doc === best.doc && r.term < best.term)) {
@@ -17223,7 +17300,7 @@ function typoTerms(db, words) {
17223
17300
  out.push(best.term);
17224
17301
  changed = true;
17225
17302
  }
17226
- }
17303
+ });
17227
17304
  return changed ? out.map((t) => `"${t.replaceAll('"', '""')}"*`) : null;
17228
17305
  }
17229
17306
  function ftsQuery(db, q, scope, ctx, sessionId, limit, offset, source) {
@@ -18404,6 +18481,19 @@ function appendDetached(project, sessionId, row5) {
18404
18481
  void write(project, row5);
18405
18482
  }
18406
18483
 
18484
+ // src/core/hooks/handle-query.ts
18485
+ function askedWords(intent, prompt, text) {
18486
+ const want = new Set(wordTokens(prompt.toLowerCase()));
18487
+ for (const w of wordTokens(intent.toLowerCase())) want.delete(w);
18488
+ if (want.size === 0) return "";
18489
+ const counts = /* @__PURE__ */ new Map();
18490
+ for (const w of wordTokens(text.toLowerCase())) {
18491
+ if (want.has(w)) counts.set(w, (counts.get(w) ?? 0) + 1);
18492
+ }
18493
+ const picked = [...counts.entries()].sort((a, b) => a[1] - b[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)).slice(0, HANDLE_PROMPT_WORDS).map((e) => e[0]);
18494
+ return picked.join(" ");
18495
+ }
18496
+
18407
18497
  // src/core/hooks/decision.ts
18408
18498
  function isObject3(v) {
18409
18499
  return typeof v === "object" && v !== null && !Array.isArray(v);
@@ -18814,7 +18904,7 @@ async function postToolUse(ev, row5, project, env) {
18814
18904
  const handle = sourceHandle(sourceId);
18815
18905
  const prompt = await lastPrompt(project, ev.sessionId);
18816
18906
  const rankQuery = prompt.trim() === "" ? void 0 : intent + " " + prompt;
18817
- const handleLine = REPLACE_HANDLE_LINE(intent, handle, result.bytes, row5.toolNamePrefix);
18907
+ const handleLine = REPLACE_HANDLE_LINE(intent, handle, result.bytes, row5.toolNamePrefix, askedWords(intent, prompt, text));
18818
18908
  const budget = replaceBudget(handleLine, moreLine2(intent, label));
18819
18909
  const digest = shapeDigest(text, rankQuery ?? intent, SHAPE_RETURN_BYTES);
18820
18910
  if (digest !== null) return { kind: "replace", output: replaceOutput(digest, handleLine) };
@@ -20427,6 +20517,7 @@ function ownHooks(block, shape, timeoutKey, native, agent) {
20427
20517
  var validTimeout = (v) => typeof v === "number" && Number.isFinite(v) && v > 0;
20428
20518
  function mcpFile(row5, home, env) {
20429
20519
  const spec = OWN_MCP_ENTRY[row5.id];
20520
+ if (row5.id === "codex") return join10(codexDirOf(env, home), CONFIG_TOML_FILE);
20430
20521
  if (spec !== void 0) return join10(home, ...spec.file);
20431
20522
  if (row5.id === "opencode") return join10(home, ...AGENT_HOME_DIR.opencode, OPENCODE_BASE_CONFIG_FILE);
20432
20523
  if (row5.id === "pi") {
@@ -20454,9 +20545,10 @@ function hookParts(row5, home, env, worktree) {
20454
20545
  let block;
20455
20546
  try {
20456
20547
  const root = spec.root === "plugin" ? resolvePluginRoot(row5, env) : spec.root === "home" ? home : worktree;
20457
- block = hostConfigValueAt(readParsed(row5.id, join10(root, ...spec.file)).value, spec.key);
20548
+ const file2 = row5.id === "codex" ? join10(codexDirOf(env, home), HOOKS_JSON_FILE) : join10(root, ...spec.file);
20549
+ block = hostConfigValueAt(readParsed(row5.id, file2).value, spec.key);
20458
20550
  if (row5.id === "codex") {
20459
- const config4 = readParsed(row5.id, join10(home, ...AGENT_HOME_DIR.codex, CONFIG_TOML_FILE)).value;
20551
+ const config4 = readParsed(row5.id, join10(codexDirOf(env, home), CONFIG_TOML_FILE)).value;
20460
20552
  if (hostConfigValueAt(config4, CODEX_FEATURES_HOOKS_KEY) === false) return [PART_HOOKS];
20461
20553
  }
20462
20554
  } catch {
@@ -20911,8 +21003,8 @@ async function hookRow(ctx, adapter, host) {
20911
21003
  bundleDir: host.bundleDir,
20912
21004
  env: buildChildEnv(host.env),
20913
21005
  signal: ctx.signal,
20914
- codexConfigDir: join12(needHome(host.env), ...AGENT_HOME_DIR.codex),
20915
- // same Codex dir D3 reads
21006
+ codexConfigDir: codexDirOf(host.env, needHome(host.env)),
21007
+ // same Codex dir D3 reads (D-N6-CODEX-HOME-2)
20916
21008
  db
20917
21009
  });
20918
21010
  } finally {
@@ -11,5 +11,5 @@
11
11
  }
12
12
  },
13
13
  "name": "context-mode",
14
- "version": "2.0.0-next.5"
14
+ "version": "2.0.0-next.7"
15
15
  }
package/run.mjs CHANGED
@@ -354,8 +354,12 @@ var V1_REASON = Object.freeze({
354
354
  var UPGRADE_REPORT_ONLY_REASONS = Object.freeze([V1_REASON.statusLine, V1_REASON.vscodeMcp, V1_REASON.dataDirShared, V1_REASON.tmpFile, V1_REASON.kiroSteering]);
355
355
  var OPENCODE_TOOL_PREFIX = SERVER_KEY + "_";
356
356
  var ZCODE_MCP_FEATURE_KEY = Object.freeze(["features", "mcp"]);
357
+ var CODEX_OMIT_TOOLS_FROM_FIELD = "omit_tools_from";
358
+ var CODEX_OMIT_DEFERRED = Object.freeze(["deferred"]);
359
+ var CODEX_APPROVAL_MODE_FIELD = "default_tools_approval_mode";
360
+ var CODEX_APPROVAL_APPROVE = "approve";
357
361
  var OWN_MCP_ENTRY = Object.freeze({
358
- codex: { file: [".codex", "config.toml"], key: ["mcp_servers", SERVER_KEY] },
362
+ codex: { file: [".codex", "config.toml"], key: ["mcp_servers", SERVER_KEY], fields: { [CODEX_OMIT_TOOLS_FROM_FIELD]: CODEX_OMIT_DEFERRED, [CODEX_APPROVAL_MODE_FIELD]: CODEX_APPROVAL_APPROVE } },
359
363
  vscode: { file: [".vscode", "mcp.json"], key: ["servers", SERVER_KEY] },
360
364
  kiro: { file: [".kiro", "settings", "mcp.json"], key: ["mcpServers", SERVER_KEY] },
361
365
  zcode: {
@@ -746,9 +750,62 @@ function readResult4(resp) {
746
750
  const isError = typeof resp === "object" && resp !== null && resp.is_error === true;
747
751
  return { isError, bytes: Buffer.byteLength(text), text };
748
752
  }
753
+ var CAMEL_EVENTS = {
754
+ sessionStart: "SessionStart",
755
+ userPromptSubmitted: "UserPromptSubmit",
756
+ preToolUse: "PreToolUse",
757
+ postToolUse: "PostToolUse",
758
+ preCompact: "PreCompact"
759
+ };
760
+ var EVENT_BY_KEY2 = [
761
+ ["toolResult", "postToolUse"],
762
+ ["toolName", "preToolUse"],
763
+ ["prompt", "userPromptSubmitted"],
764
+ ["source", "sessionStart"],
765
+ ["trigger", "preCompact"]
766
+ ];
767
+ var SESSION_SOURCES = { new: "startup", startup: "startup", resume: "resume" };
768
+ var RESULT_SUCCESS2 = "success";
769
+ function isRecord2(v) {
770
+ return typeof v === "object" && v !== null && !Array.isArray(v);
771
+ }
772
+ function readArgs2(v) {
773
+ if (isRecord2(v)) return v;
774
+ if (typeof v !== "string") return {};
775
+ try {
776
+ const parsed = JSON.parse(v);
777
+ return isRecord2(parsed) ? parsed : {};
778
+ } catch {
779
+ return {};
780
+ }
781
+ }
782
+ function readCamelResult(v) {
783
+ const r = isRecord2(v) ? v : {};
784
+ const text = typeof r.textResultForLlm === "string" ? r.textResultForLlm : "";
785
+ return { isError: typeof r.resultType === "string" && r.resultType !== RESULT_SUCCESS2, bytes: Buffer.byteLength(text), text };
786
+ }
787
+ function decodeCamel(p, name) {
788
+ const event = typeof name === "string" ? CAMEL_EVENTS[name] ?? VSCODE_EVENTS.find((e) => e === name) : void 0;
789
+ if (event === void 0) throw new Error("vscode: unknown hook event " + String(name));
790
+ const ev = { event, agent: "vscode", sessionId: String(p.sessionId ?? ""), cwd: String(p.cwd ?? "") };
791
+ if (event === "SessionStart" && typeof p.source === "string" && SESSION_SOURCES[p.source] !== void 0) ev.source = SESSION_SOURCES[p.source];
792
+ if (event === "UserPromptSubmit" && typeof p.prompt === "string") ev.prompt = p.prompt;
793
+ if (event === "PreToolUse" || event === "PostToolUse") {
794
+ const toolName = String(p.toolName ?? "");
795
+ ev.tool = { name: toolName, canonicalName: canonicalName4(toolName), input: readArgs2(p.toolArgs) };
796
+ }
797
+ if (event === "PostToolUse") ev.result = readCamelResult(p.toolResult);
798
+ return ev;
799
+ }
749
800
  function decode6(raw) {
750
801
  if (typeof raw !== "object" || raw === null || Array.isArray(raw)) throw new Error("vscode: hook payload is not a JSON object");
751
802
  const p = raw;
803
+ if (p.hookEventName !== void 0) return decodeCamel(p, p.hookEventName);
804
+ if (p.hook_event_name === void 0) {
805
+ const byKey = EVENT_BY_KEY2.find(([key]) => Object.hasOwn(p, key))?.[1];
806
+ if (byKey === void 0) throw new Error("vscode: missing required field hook_event_name");
807
+ return decodeCamel(p, byKey);
808
+ }
752
809
  const event = VSCODE_EVENTS.find((e) => e === p.hook_event_name);
753
810
  if (event === void 0) throw new Error("vscode: unknown hook event " + String(p.hook_event_name));
754
811
  const ev = { event, agent: "vscode", sessionId: String(p.session_id ?? ""), cwd: String(p.cwd ?? "") };
@@ -756,7 +813,7 @@ function decode6(raw) {
756
813
  if (event === "UserPromptSubmit" && typeof p.prompt === "string") ev.prompt = p.prompt;
757
814
  if (event === "PreToolUse" || event === "PostToolUse") {
758
815
  const name = String(p.tool_name ?? "");
759
- const input = typeof p.tool_input === "object" && p.tool_input !== null && !Array.isArray(p.tool_input) ? p.tool_input : {};
816
+ const input = isRecord2(p.tool_input) ? p.tool_input : {};
760
817
  ev.tool = { name, canonicalName: canonicalName4(name), input };
761
818
  }
762
819
  if (event === "PostToolUse") ev.result = readResult4(p.tool_response);
@@ -775,12 +832,14 @@ var KIRO_EVENTS = {
775
832
  PromptSubmit: "UserPromptSubmit",
776
833
  userPromptSubmit: "UserPromptSubmit",
777
834
  PreToolUse: "PreToolUse",
778
- PostToolUse: "PostToolUse"
835
+ preToolUse: "PreToolUse",
836
+ PostToolUse: "PostToolUse",
837
+ postToolUse: "PostToolUse"
779
838
  };
780
839
  var PROMPT_ENV = "USER_PROMPT";
781
840
  var MCP_PREFIX3 = "mcp_";
782
- var SHELL_TOOL_NAME2 = "execute_bash";
783
- var NATIVE_TO_CANONICAL5 = { [SHELL_TOOL_NAME2]: "Bash" };
841
+ var SHELL_TOOL_NAMES = Object.freeze(["execute_bash", "execute_pwsh", "shell"]);
842
+ var NATIVE_TO_CANONICAL5 = Object.fromEntries(SHELL_TOOL_NAMES.map((n) => [n, "Bash"]));
784
843
  var MCP_SEP3 = "_";
785
844
  var KIRO_SOURCES = { startup: "startup", resume: "resume", clear: "clear", compact: "compact" };
786
845
  function canonicalName5(name) {
@@ -921,8 +980,8 @@ var OPENCODE_EVENTS = {
921
980
  compaction: "PreCompact",
922
981
  "step-finish": "Usage"
923
982
  };
924
- var SHELL_TOOL_NAME3 = "bash";
925
- var NATIVE_TO_CANONICAL7 = { webfetch: "WebFetch", [SHELL_TOOL_NAME3]: "Bash" };
983
+ var SHELL_TOOL_NAME2 = "bash";
984
+ var NATIVE_TO_CANONICAL7 = { webfetch: "WebFetch", [SHELL_TOOL_NAME2]: "Bash" };
926
985
  function toCanonicalTool(name) {
927
986
  if (name.startsWith(OWN_WIRE_PREFIX)) return name.slice(OWN_WIRE_PREFIX.length);
928
987
  return Object.prototype.hasOwnProperty.call(NATIVE_TO_CANONICAL7, name) ? NATIVE_TO_CANONICAL7[name] : name;
@@ -1042,8 +1101,8 @@ var ADAPTERS = Object.freeze([
1042
1101
  hookTimeoutMs: HOOK_TIMEOUT_MS,
1043
1102
  denyChannel: "deny-reason",
1044
1103
  hookChannel: { kind: "package", path: "hooks/qwen.json" },
1045
- skillChannel: { kind: "home-dir", path: ".qwen/skills" },
1046
- // ADR-0020
1104
+ skillChannel: { kind: "package", path: "skills" },
1105
+ // ADR-0020, D-HQ-SKILLS-3: qwen loads <extension>/skills, shared with gemini
1047
1106
  decode: decode4,
1048
1107
  encode: encode4
1049
1108
  },
@@ -1079,8 +1138,8 @@ var ADAPTERS = Object.freeze([
1079
1138
  hookTimeoutMs: HOOK_TIMEOUT_MS,
1080
1139
  denyChannel: "deny-reason",
1081
1140
  hookChannel: { kind: "home-file", path: ".copilot/hooks/context-mode-vscode.json" },
1082
- skillChannel: { kind: "home-dir", path: ".copilot/skills" },
1083
- // ADR-0020
1141
+ skillChannel: { kind: "home-dir", path: ".agents/skills" },
1142
+ // ADR-0020, D-HQ-COPILOT-NAMES-3: Copilot CLI owns ~/.copilot/skills
1084
1143
  decode: decode6,
1085
1144
  encode: encode6
1086
1145
  },
@@ -1089,9 +1148,9 @@ var ADAPTERS = Object.freeze([
1089
1148
  installMode: "mcp-entry",
1090
1149
  projectSource: "arg:--agent+cwd",
1091
1150
  toolNamePrefix: TOOL_NAME_PREFIX7,
1092
- nativeTools: { shell: [SHELL_TOOL_NAME2] },
1151
+ nativeTools: { shell: [...SHELL_TOOL_NAMES] },
1093
1152
  execReadOnlyHint: false,
1094
- // D-HF-KIRO-SHELL-1
1153
+ // D-HF-KIRO-SHELL-1, D-N7-KIRO-1
1095
1154
  eventMap: { SessionStart: "SessionStart", UserPromptSubmit: "UserPromptSubmit", PreToolUse: "PreToolUse", PostToolUse: "PostToolUse" },
1096
1155
  compactDelivery: "none",
1097
1156
  compactSummary: "none",
@@ -1104,7 +1163,7 @@ var ADAPTERS = Object.freeze([
1104
1163
  encode: encode7
1105
1164
  },
1106
1165
  {
1107
- // toolNamePrefix and nativeTools unverified until T-ZC (DECISIONS-r9 R3, R4: Claude names).
1166
+ // toolNamePrefix is the documented ZCode name mcp__<server>__<tool> (D-N7-ZCODE-NAMES-1); nativeTools are Claude names.
1108
1167
  id: "zcode",
1109
1168
  installMode: "hooks+mcp",
1110
1169
  projectSource: "spawn-cwd",
@@ -1146,7 +1205,7 @@ var ADAPTERS = Object.freeze([
1146
1205
  installMode: "in-process",
1147
1206
  projectSource: "spawn-cwd",
1148
1207
  toolNamePrefix: TOOL_NAME_PREFIX10,
1149
- nativeTools: { shell: [SHELL_TOOL_NAME3] },
1208
+ nativeTools: { shell: [SHELL_TOOL_NAME2] },
1150
1209
  execReadOnlyHint: false,
1151
1210
  // D-HF-OPENCODE-SHELL-1
1152
1211
  // Usage: step-finish cost row (DEVIATIONS D-M5-arch-2).
@@ -1168,6 +1227,10 @@ var REPLACE_ROWS = /* @__PURE__ */ new Set(["claude-code", "gemini", "copilot-cl
1168
1227
  function hasReplace(row) {
1169
1228
  return REPLACE_ROWS.has(row.id);
1170
1229
  }
1230
+ var DUMP_REPLACE_ROWS = /* @__PURE__ */ new Set(["claude-code", "copilot-cli", "pi"]);
1231
+ function dumpRunsThenReplaces(row) {
1232
+ return DUMP_REPLACE_ROWS.has(row.id) && hasReplace(row);
1233
+ }
1171
1234
  function getAdapter(id) {
1172
1235
  return BY_ID.get(id);
1173
1236
  }
@@ -4642,7 +4705,7 @@ function read(ev, row, input) {
4642
4705
  return ALLOW;
4643
4706
  }
4644
4707
  function shellDump(cmds, cwd, row) {
4645
- if (row.nativeTools.read !== void 0 && row.nativeTools.read.length > 0 && hasReplace(row)) return null;
4708
+ if (row.nativeTools.read !== void 0 && row.nativeTools.read.length > 0 && dumpRunsThenReplaces(row)) return null;
4646
4709
  if (cmds.length !== 1) return null;
4647
4710
  const c = cmds[0];
4648
4711
  if (c.redirectsToFile || c.endsInBoundedSink) return null;