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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/hooks.json +50 -0
- package/.codex-plugin/mcp.json +14 -0
- package/.codex-plugin/plugin.json +12 -0
- package/SHA256SUMS +22 -16
- package/cli.mjs +196 -24
- package/codex/skills/ctx-doctor/SKILL.md +6 -0
- package/codex/skills/ctx-stats/SKILL.md +6 -0
- package/codex/skills/ctx-upgrade/SKILL.md +6 -0
- package/copilot/plugin.json +1 -1
- package/gemini-extension.json +1 -1
- package/hook.mjs +81 -81
- package/opencode/plugin.js +122 -30
- package/package.json +4 -1
- package/pi/index.js +122 -30
- package/qwen-extension.json +1 -1
- package/run.mjs +79 -16
- package/search.mjs +79 -16
- package/server.mjs +99 -26
- package/skills/ctx-doctor/SKILL.md +1 -1
- package/skills/ctx-stats/SKILL.md +1 -1
- package/skills/ctx-upgrade/SKILL.md +1 -1
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
|
-
|
|
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 ? "
|
|
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 =
|
|
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
|
-
|
|
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
|
|
12337
|
-
var NATIVE_TO_CANONICAL6 =
|
|
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
|
|
12421
|
-
var NATIVE_TO_CANONICAL7 = { webfetch: "WebFetch", [
|
|
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: "
|
|
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: ".
|
|
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: [
|
|
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
|
|
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: [
|
|
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 &&
|
|
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
|
-
|
|
17210
|
-
if (
|
|
17284
|
+
stems.forEach((stem, i) => {
|
|
17285
|
+
if (!miss[i]) {
|
|
17211
17286
|
out.push(stem);
|
|
17212
|
-
|
|
17287
|
+
return;
|
|
17213
17288
|
}
|
|
17214
17289
|
let best = null;
|
|
17215
|
-
for (const r of
|
|
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
|
-
|
|
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(
|
|
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:
|
|
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 {
|
package/qwen-extension.json
CHANGED
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 =
|
|
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
|
-
|
|
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
|
|
783
|
-
var NATIVE_TO_CANONICAL5 =
|
|
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
|
|
925
|
-
var NATIVE_TO_CANONICAL7 = { webfetch: "WebFetch", [
|
|
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: "
|
|
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: ".
|
|
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: [
|
|
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
|
|
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: [
|
|
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 &&
|
|
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;
|