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/opencode/plugin.js
CHANGED
|
@@ -25,9 +25,11 @@ var REPLACE_TRIGGER_BYTES = 4096;
|
|
|
25
25
|
var REPLACE_RETURN_BYTES = 96;
|
|
26
26
|
var SHAPE_RETURN_BYTES = 256;
|
|
27
27
|
var REPLACE_CHUNK_BYTES = 48;
|
|
28
|
-
function REPLACE_HANDLE_LINE(intent, handle, bytes4, prefix = "") {
|
|
29
|
-
|
|
28
|
+
function REPLACE_HANDLE_LINE(intent, handle, bytes4, prefix = "", asked = "") {
|
|
29
|
+
const queries = asked === "" ? [intent] : [intent, asked];
|
|
30
|
+
return prefix + "ctx_search({queries:[" + queries.map((q) => JSON.stringify(q)).join(",") + "], source:" + JSON.stringify(handle) + "}) searches the whole output (" + bytes4 + " B).";
|
|
30
31
|
}
|
|
32
|
+
var HANDLE_PROMPT_WORDS = 3;
|
|
31
33
|
var MAX_CHUNK_BYTES = 4096;
|
|
32
34
|
var SEARCH_PAGE_SIZE = 20;
|
|
33
35
|
var SNIPPET_MAX_BYTES = 800;
|
|
@@ -328,7 +330,7 @@ var DECISION_OPTION_KEY = "option";
|
|
|
328
330
|
var DECISION_LABEL_JOIN = " | ";
|
|
329
331
|
var RELEASE_REPO_URL = "https://github.com/mksglu/context-mode.git";
|
|
330
332
|
var RELEASE_BRANCH = "release";
|
|
331
|
-
var BUNDLE_SHA = true ? "
|
|
333
|
+
var BUNDLE_SHA = true ? "f61b6973877b47851ac5938c46fee1399946289e" : void 0;
|
|
332
334
|
var DOCTOR_CHECK_ORDER = Object.freeze(["D1", "D2", "D3", "D4", "D5", "D5b", "D6", "D7", "D8", "D9", "D10"]);
|
|
333
335
|
var DOCTOR_LABEL = Object.freeze({
|
|
334
336
|
D1: "version",
|
|
@@ -566,6 +568,7 @@ var V1_HOOKS_DIR_NAME = "hooks";
|
|
|
566
568
|
var SETTINGS_FILE = "settings.json";
|
|
567
569
|
var CLAUDE_USER_CONFIG_FILE = ".claude.json";
|
|
568
570
|
var HOOKS_JSON_FILE = "hooks.json";
|
|
571
|
+
var CODEX_HOME_ENV = "CODEX_HOME";
|
|
569
572
|
var CONFIG_TOML_FILE = "config.toml";
|
|
570
573
|
var CONFIG_JSON_FILE = "config.json";
|
|
571
574
|
var ZCODE_CLI_DIR = "cli";
|
|
@@ -632,8 +635,12 @@ var JSON_INDENT_UNIT = " ";
|
|
|
632
635
|
var MCP_COMMAND_FIELD = "command";
|
|
633
636
|
var MCP_ARGS_FIELD = "args";
|
|
634
637
|
var ZCODE_MCP_FEATURE_KEY = Object.freeze(["features", "mcp"]);
|
|
638
|
+
var CODEX_OMIT_TOOLS_FROM_FIELD = "omit_tools_from";
|
|
639
|
+
var CODEX_OMIT_DEFERRED = Object.freeze(["deferred"]);
|
|
640
|
+
var CODEX_APPROVAL_MODE_FIELD = "default_tools_approval_mode";
|
|
641
|
+
var CODEX_APPROVAL_APPROVE = "approve";
|
|
635
642
|
var OWN_MCP_ENTRY = Object.freeze({
|
|
636
|
-
codex: { file: [".codex", "config.toml"], key: ["mcp_servers", SERVER_KEY] },
|
|
643
|
+
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 } },
|
|
637
644
|
vscode: { file: [".vscode", "mcp.json"], key: ["servers", SERVER_KEY] },
|
|
638
645
|
kiro: { file: [".kiro", "settings", "mcp.json"], key: ["mcpServers", SERVER_KEY] },
|
|
639
646
|
zcode: {
|
|
@@ -1096,9 +1103,62 @@ function readResult4(resp) {
|
|
|
1096
1103
|
const isError = typeof resp === "object" && resp !== null && resp.is_error === true;
|
|
1097
1104
|
return { isError, bytes: Buffer.byteLength(text), text };
|
|
1098
1105
|
}
|
|
1106
|
+
var CAMEL_EVENTS = {
|
|
1107
|
+
sessionStart: "SessionStart",
|
|
1108
|
+
userPromptSubmitted: "UserPromptSubmit",
|
|
1109
|
+
preToolUse: "PreToolUse",
|
|
1110
|
+
postToolUse: "PostToolUse",
|
|
1111
|
+
preCompact: "PreCompact"
|
|
1112
|
+
};
|
|
1113
|
+
var EVENT_BY_KEY2 = [
|
|
1114
|
+
["toolResult", "postToolUse"],
|
|
1115
|
+
["toolName", "preToolUse"],
|
|
1116
|
+
["prompt", "userPromptSubmitted"],
|
|
1117
|
+
["source", "sessionStart"],
|
|
1118
|
+
["trigger", "preCompact"]
|
|
1119
|
+
];
|
|
1120
|
+
var SESSION_SOURCES = { new: "startup", startup: "startup", resume: "resume" };
|
|
1121
|
+
var RESULT_SUCCESS2 = "success";
|
|
1122
|
+
function isRecord2(v) {
|
|
1123
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
1124
|
+
}
|
|
1125
|
+
function readArgs2(v) {
|
|
1126
|
+
if (isRecord2(v)) return v;
|
|
1127
|
+
if (typeof v !== "string") return {};
|
|
1128
|
+
try {
|
|
1129
|
+
const parsed = JSON.parse(v);
|
|
1130
|
+
return isRecord2(parsed) ? parsed : {};
|
|
1131
|
+
} catch {
|
|
1132
|
+
return {};
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
function readCamelResult(v) {
|
|
1136
|
+
const r = isRecord2(v) ? v : {};
|
|
1137
|
+
const text = typeof r.textResultForLlm === "string" ? r.textResultForLlm : "";
|
|
1138
|
+
return { isError: typeof r.resultType === "string" && r.resultType !== RESULT_SUCCESS2, bytes: Buffer.byteLength(text), text };
|
|
1139
|
+
}
|
|
1140
|
+
function decodeCamel(p, name) {
|
|
1141
|
+
const event = typeof name === "string" ? CAMEL_EVENTS[name] ?? VSCODE_EVENTS.find((e) => e === name) : void 0;
|
|
1142
|
+
if (event === void 0) throw new Error("vscode: unknown hook event " + String(name));
|
|
1143
|
+
const ev = { event, agent: "vscode", sessionId: String(p.sessionId ?? ""), cwd: String(p.cwd ?? "") };
|
|
1144
|
+
if (event === "SessionStart" && typeof p.source === "string" && SESSION_SOURCES[p.source] !== void 0) ev.source = SESSION_SOURCES[p.source];
|
|
1145
|
+
if (event === "UserPromptSubmit" && typeof p.prompt === "string") ev.prompt = p.prompt;
|
|
1146
|
+
if (event === "PreToolUse" || event === "PostToolUse") {
|
|
1147
|
+
const toolName = String(p.toolName ?? "");
|
|
1148
|
+
ev.tool = { name: toolName, canonicalName: canonicalName4(toolName), input: readArgs2(p.toolArgs) };
|
|
1149
|
+
}
|
|
1150
|
+
if (event === "PostToolUse") ev.result = readCamelResult(p.toolResult);
|
|
1151
|
+
return ev;
|
|
1152
|
+
}
|
|
1099
1153
|
function decode6(raw) {
|
|
1100
1154
|
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) throw new Error("vscode: hook payload is not a JSON object");
|
|
1101
1155
|
const p = raw;
|
|
1156
|
+
if (p.hookEventName !== void 0) return decodeCamel(p, p.hookEventName);
|
|
1157
|
+
if (p.hook_event_name === void 0) {
|
|
1158
|
+
const byKey = EVENT_BY_KEY2.find(([key]) => Object.hasOwn(p, key))?.[1];
|
|
1159
|
+
if (byKey === void 0) throw new Error("vscode: missing required field hook_event_name");
|
|
1160
|
+
return decodeCamel(p, byKey);
|
|
1161
|
+
}
|
|
1102
1162
|
const event = VSCODE_EVENTS.find((e) => e === p.hook_event_name);
|
|
1103
1163
|
if (event === void 0) throw new Error("vscode: unknown hook event " + String(p.hook_event_name));
|
|
1104
1164
|
const ev = { event, agent: "vscode", sessionId: String(p.session_id ?? ""), cwd: String(p.cwd ?? "") };
|
|
@@ -1106,7 +1166,7 @@ function decode6(raw) {
|
|
|
1106
1166
|
if (event === "UserPromptSubmit" && typeof p.prompt === "string") ev.prompt = p.prompt;
|
|
1107
1167
|
if (event === "PreToolUse" || event === "PostToolUse") {
|
|
1108
1168
|
const name = String(p.tool_name ?? "");
|
|
1109
|
-
const input =
|
|
1169
|
+
const input = isRecord2(p.tool_input) ? p.tool_input : {};
|
|
1110
1170
|
ev.tool = { name, canonicalName: canonicalName4(name), input };
|
|
1111
1171
|
}
|
|
1112
1172
|
if (event === "PostToolUse") ev.result = readResult4(p.tool_response);
|
|
@@ -1125,12 +1185,14 @@ var KIRO_EVENTS = {
|
|
|
1125
1185
|
PromptSubmit: "UserPromptSubmit",
|
|
1126
1186
|
userPromptSubmit: "UserPromptSubmit",
|
|
1127
1187
|
PreToolUse: "PreToolUse",
|
|
1128
|
-
|
|
1188
|
+
preToolUse: "PreToolUse",
|
|
1189
|
+
PostToolUse: "PostToolUse",
|
|
1190
|
+
postToolUse: "PostToolUse"
|
|
1129
1191
|
};
|
|
1130
1192
|
var PROMPT_ENV = "USER_PROMPT";
|
|
1131
1193
|
var MCP_PREFIX3 = "mcp_";
|
|
1132
|
-
var
|
|
1133
|
-
var NATIVE_TO_CANONICAL5 =
|
|
1194
|
+
var SHELL_TOOL_NAMES = Object.freeze(["execute_bash", "execute_pwsh", "shell"]);
|
|
1195
|
+
var NATIVE_TO_CANONICAL5 = Object.fromEntries(SHELL_TOOL_NAMES.map((n) => [n, "Bash"]));
|
|
1134
1196
|
var MCP_SEP3 = "_";
|
|
1135
1197
|
var KIRO_SOURCES = { startup: "startup", resume: "resume", clear: "clear", compact: "compact" };
|
|
1136
1198
|
function canonicalName5(name) {
|
|
@@ -1271,8 +1333,8 @@ var OPENCODE_EVENTS = {
|
|
|
1271
1333
|
compaction: "PreCompact",
|
|
1272
1334
|
"step-finish": "Usage"
|
|
1273
1335
|
};
|
|
1274
|
-
var
|
|
1275
|
-
var NATIVE_TO_CANONICAL7 = { webfetch: "WebFetch", [
|
|
1336
|
+
var SHELL_TOOL_NAME2 = "bash";
|
|
1337
|
+
var NATIVE_TO_CANONICAL7 = { webfetch: "WebFetch", [SHELL_TOOL_NAME2]: "Bash" };
|
|
1276
1338
|
function toCanonicalTool(name) {
|
|
1277
1339
|
if (name.startsWith(OWN_WIRE_PREFIX)) return name.slice(OWN_WIRE_PREFIX.length);
|
|
1278
1340
|
return Object.prototype.hasOwnProperty.call(NATIVE_TO_CANONICAL7, name) ? NATIVE_TO_CANONICAL7[name] : name;
|
|
@@ -1392,8 +1454,8 @@ var ADAPTERS = Object.freeze([
|
|
|
1392
1454
|
hookTimeoutMs: HOOK_TIMEOUT_MS,
|
|
1393
1455
|
denyChannel: "deny-reason",
|
|
1394
1456
|
hookChannel: { kind: "package", path: "hooks/qwen.json" },
|
|
1395
|
-
skillChannel: { kind: "
|
|
1396
|
-
// ADR-0020
|
|
1457
|
+
skillChannel: { kind: "package", path: "skills" },
|
|
1458
|
+
// ADR-0020, D-HQ-SKILLS-3: qwen loads <extension>/skills, shared with gemini
|
|
1397
1459
|
decode: decode4,
|
|
1398
1460
|
encode: encode4
|
|
1399
1461
|
},
|
|
@@ -1429,8 +1491,8 @@ var ADAPTERS = Object.freeze([
|
|
|
1429
1491
|
hookTimeoutMs: HOOK_TIMEOUT_MS,
|
|
1430
1492
|
denyChannel: "deny-reason",
|
|
1431
1493
|
hookChannel: { kind: "home-file", path: ".copilot/hooks/context-mode-vscode.json" },
|
|
1432
|
-
skillChannel: { kind: "home-dir", path: ".
|
|
1433
|
-
// ADR-0020
|
|
1494
|
+
skillChannel: { kind: "home-dir", path: ".agents/skills" },
|
|
1495
|
+
// ADR-0020, D-HQ-COPILOT-NAMES-3: Copilot CLI owns ~/.copilot/skills
|
|
1434
1496
|
decode: decode6,
|
|
1435
1497
|
encode: encode6
|
|
1436
1498
|
},
|
|
@@ -1439,9 +1501,9 @@ var ADAPTERS = Object.freeze([
|
|
|
1439
1501
|
installMode: "mcp-entry",
|
|
1440
1502
|
projectSource: "arg:--agent+cwd",
|
|
1441
1503
|
toolNamePrefix: TOOL_NAME_PREFIX7,
|
|
1442
|
-
nativeTools: { shell: [
|
|
1504
|
+
nativeTools: { shell: [...SHELL_TOOL_NAMES] },
|
|
1443
1505
|
execReadOnlyHint: false,
|
|
1444
|
-
// D-HF-KIRO-SHELL-1
|
|
1506
|
+
// D-HF-KIRO-SHELL-1, D-N7-KIRO-1
|
|
1445
1507
|
eventMap: { SessionStart: "SessionStart", UserPromptSubmit: "UserPromptSubmit", PreToolUse: "PreToolUse", PostToolUse: "PostToolUse" },
|
|
1446
1508
|
compactDelivery: "none",
|
|
1447
1509
|
compactSummary: "none",
|
|
@@ -1454,7 +1516,7 @@ var ADAPTERS = Object.freeze([
|
|
|
1454
1516
|
encode: encode7
|
|
1455
1517
|
},
|
|
1456
1518
|
{
|
|
1457
|
-
// toolNamePrefix
|
|
1519
|
+
// toolNamePrefix is the documented ZCode name mcp__<server>__<tool> (D-N7-ZCODE-NAMES-1); nativeTools are Claude names.
|
|
1458
1520
|
id: "zcode",
|
|
1459
1521
|
installMode: "hooks+mcp",
|
|
1460
1522
|
projectSource: "spawn-cwd",
|
|
@@ -1496,7 +1558,7 @@ var ADAPTERS = Object.freeze([
|
|
|
1496
1558
|
installMode: "in-process",
|
|
1497
1559
|
projectSource: "spawn-cwd",
|
|
1498
1560
|
toolNamePrefix: TOOL_NAME_PREFIX10,
|
|
1499
|
-
nativeTools: { shell: [
|
|
1561
|
+
nativeTools: { shell: [SHELL_TOOL_NAME2] },
|
|
1500
1562
|
execReadOnlyHint: false,
|
|
1501
1563
|
// D-HF-OPENCODE-SHELL-1
|
|
1502
1564
|
// Usage: step-finish cost row (DEVIATIONS D-M5-arch-2).
|
|
@@ -1518,6 +1580,10 @@ var REPLACE_ROWS = /* @__PURE__ */ new Set(["claude-code", "gemini", "copilot-cl
|
|
|
1518
1580
|
function hasReplace(row5) {
|
|
1519
1581
|
return REPLACE_ROWS.has(row5.id);
|
|
1520
1582
|
}
|
|
1583
|
+
var DUMP_REPLACE_ROWS = /* @__PURE__ */ new Set(["claude-code", "copilot-cli", "pi"]);
|
|
1584
|
+
function dumpRunsThenReplaces(row5) {
|
|
1585
|
+
return DUMP_REPLACE_ROWS.has(row5.id) && hasReplace(row5);
|
|
1586
|
+
}
|
|
1521
1587
|
var RECALL_ROWS = /* @__PURE__ */ new Set(["claude-code", "codex", "gemini", "qwen", "copilot-cli", "vscode", "zcode"]);
|
|
1522
1588
|
function hasRecall(row5) {
|
|
1523
1589
|
return RECALL_ROWS.has(row5.id);
|
|
@@ -2480,6 +2546,10 @@ function homeDirOf(env) {
|
|
|
2480
2546
|
if (profile !== void 0 && profile !== "") return profile;
|
|
2481
2547
|
return null;
|
|
2482
2548
|
}
|
|
2549
|
+
function codexDirOf(env, home) {
|
|
2550
|
+
const dir = env[CODEX_HOME_ENV];
|
|
2551
|
+
return dir !== void 0 && dir !== "" ? dir : join(home, ...AGENT_HOME_DIR.codex);
|
|
2552
|
+
}
|
|
2483
2553
|
function homeOf(env) {
|
|
2484
2554
|
const home = homeDirOf(env);
|
|
2485
2555
|
if (home !== null) return home;
|
|
@@ -3136,7 +3206,7 @@ function read(ev, row5, input) {
|
|
|
3136
3206
|
return ALLOW;
|
|
3137
3207
|
}
|
|
3138
3208
|
function shellDump(cmds, cwd, row5) {
|
|
3139
|
-
if (row5.nativeTools.read !== void 0 && row5.nativeTools.read.length > 0 &&
|
|
3209
|
+
if (row5.nativeTools.read !== void 0 && row5.nativeTools.read.length > 0 && dumpRunsThenReplaces(row5)) return null;
|
|
3140
3210
|
if (cmds.length !== 1) return null;
|
|
3141
3211
|
const c = cmds[0];
|
|
3142
3212
|
if (c.redirectsToFile || c.endsInBoundedSink) return null;
|
|
@@ -6057,16 +6127,23 @@ var TYPO_MIN_LEN = 5;
|
|
|
6057
6127
|
var TYPO_MAX_DIST = 2;
|
|
6058
6128
|
function typoTerms(db, words) {
|
|
6059
6129
|
const has2 = stmt(db.raw, "SELECT 1 AS x FROM chunks_vocab WHERE term = ?");
|
|
6060
|
-
const near = stmt(db.raw, "SELECT term, doc FROM chunks_vocab WHERE length(term) BETWEEN ? AND ?");
|
|
6130
|
+
const near = stmt(db.raw, "SELECT term, doc, length(term) AS n FROM chunks_vocab WHERE length(term) BETWEEN ? AND ?");
|
|
6131
|
+
const stems = queryStems(words.join(" "));
|
|
6132
|
+
const miss = stems.map((stem) => has2.get(stem) === void 0 && [...stem].length >= TYPO_MIN_LEN);
|
|
6133
|
+
if (!miss.includes(true)) return null;
|
|
6134
|
+
const lens = stems.filter((_, i) => miss[i]).map((stem) => stem.length);
|
|
6135
|
+
const rows = near.all(Math.min(...lens) - TYPO_MAX_DIST, Math.max(...lens) + TYPO_MAX_DIST);
|
|
6061
6136
|
let changed = false;
|
|
6062
6137
|
const out = [];
|
|
6063
|
-
|
|
6064
|
-
if (
|
|
6138
|
+
stems.forEach((stem, i) => {
|
|
6139
|
+
if (!miss[i]) {
|
|
6065
6140
|
out.push(stem);
|
|
6066
|
-
|
|
6141
|
+
return;
|
|
6067
6142
|
}
|
|
6068
6143
|
let best = null;
|
|
6069
|
-
for (const r of
|
|
6144
|
+
for (const r of rows) {
|
|
6145
|
+
const n = Number(r.n);
|
|
6146
|
+
if (n < stem.length - TYPO_MAX_DIST || n > stem.length + TYPO_MAX_DIST) continue;
|
|
6070
6147
|
const d = editDistance(stem, r.term, TYPO_MAX_DIST);
|
|
6071
6148
|
if (d > TYPO_MAX_DIST) continue;
|
|
6072
6149
|
if (best === null || d < best.d || d === best.d && (r.doc > best.doc || r.doc === best.doc && r.term < best.term)) {
|
|
@@ -6077,7 +6154,7 @@ function typoTerms(db, words) {
|
|
|
6077
6154
|
out.push(best.term);
|
|
6078
6155
|
changed = true;
|
|
6079
6156
|
}
|
|
6080
|
-
}
|
|
6157
|
+
});
|
|
6081
6158
|
return changed ? out.map((t) => `"${t.replaceAll('"', '""')}"*`) : null;
|
|
6082
6159
|
}
|
|
6083
6160
|
function ftsQuery(db, q, scope, ctx, sessionId, limit, offset, source) {
|
|
@@ -7258,6 +7335,19 @@ function appendDetached(project, sessionId, row5) {
|
|
|
7258
7335
|
void write(project, row5);
|
|
7259
7336
|
}
|
|
7260
7337
|
|
|
7338
|
+
// src/core/hooks/handle-query.ts
|
|
7339
|
+
function askedWords(intent, prompt, text) {
|
|
7340
|
+
const want = new Set(wordTokens(prompt.toLowerCase()));
|
|
7341
|
+
for (const w of wordTokens(intent.toLowerCase())) want.delete(w);
|
|
7342
|
+
if (want.size === 0) return "";
|
|
7343
|
+
const counts = /* @__PURE__ */ new Map();
|
|
7344
|
+
for (const w of wordTokens(text.toLowerCase())) {
|
|
7345
|
+
if (want.has(w)) counts.set(w, (counts.get(w) ?? 0) + 1);
|
|
7346
|
+
}
|
|
7347
|
+
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]);
|
|
7348
|
+
return picked.join(" ");
|
|
7349
|
+
}
|
|
7350
|
+
|
|
7261
7351
|
// src/core/hooks/decision.ts
|
|
7262
7352
|
function isObject2(v) {
|
|
7263
7353
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
@@ -7668,7 +7758,7 @@ async function postToolUse(ev, row5, project, env) {
|
|
|
7668
7758
|
const handle = sourceHandle(sourceId);
|
|
7669
7759
|
const prompt = await lastPrompt(project, ev.sessionId);
|
|
7670
7760
|
const rankQuery = prompt.trim() === "" ? void 0 : intent + " " + prompt;
|
|
7671
|
-
const handleLine = REPLACE_HANDLE_LINE(intent, handle, result.bytes, row5.toolNamePrefix);
|
|
7761
|
+
const handleLine = REPLACE_HANDLE_LINE(intent, handle, result.bytes, row5.toolNamePrefix, askedWords(intent, prompt, text));
|
|
7672
7762
|
const budget = replaceBudget(handleLine, moreLine2(intent, label));
|
|
7673
7763
|
const digest = shapeDigest(text, rankQuery ?? intent, SHAPE_RETURN_BYTES);
|
|
7674
7764
|
if (digest !== null) return { kind: "replace", output: replaceOutput(digest, handleLine) };
|
|
@@ -20420,6 +20510,7 @@ function ownHooks(block, shape, timeoutKey, native, agent) {
|
|
|
20420
20510
|
var validTimeout = (v) => typeof v === "number" && Number.isFinite(v) && v > 0;
|
|
20421
20511
|
function mcpFile(row5, home, env) {
|
|
20422
20512
|
const spec = OWN_MCP_ENTRY[row5.id];
|
|
20513
|
+
if (row5.id === "codex") return join10(codexDirOf(env, home), CONFIG_TOML_FILE);
|
|
20423
20514
|
if (spec !== void 0) return join10(home, ...spec.file);
|
|
20424
20515
|
if (row5.id === "opencode") return join10(home, ...AGENT_HOME_DIR.opencode, OPENCODE_BASE_CONFIG_FILE);
|
|
20425
20516
|
if (row5.id === "pi") {
|
|
@@ -20447,9 +20538,10 @@ function hookParts(row5, home, env, worktree) {
|
|
|
20447
20538
|
let block;
|
|
20448
20539
|
try {
|
|
20449
20540
|
const root = spec.root === "plugin" ? resolvePluginRoot(row5, env) : spec.root === "home" ? home : worktree;
|
|
20450
|
-
|
|
20541
|
+
const file2 = row5.id === "codex" ? join10(codexDirOf(env, home), HOOKS_JSON_FILE) : join10(root, ...spec.file);
|
|
20542
|
+
block = hostConfigValueAt(readParsed(row5.id, file2).value, spec.key);
|
|
20451
20543
|
if (row5.id === "codex") {
|
|
20452
|
-
const config2 = readParsed(row5.id, join10(
|
|
20544
|
+
const config2 = readParsed(row5.id, join10(codexDirOf(env, home), CONFIG_TOML_FILE)).value;
|
|
20453
20545
|
if (hostConfigValueAt(config2, CODEX_FEATURES_HOOKS_KEY) === false) return [PART_HOOKS];
|
|
20454
20546
|
}
|
|
20455
20547
|
} catch {
|
|
@@ -20894,8 +20986,8 @@ async function hookRow(ctx, adapter, host) {
|
|
|
20894
20986
|
bundleDir: host.bundleDir,
|
|
20895
20987
|
env: buildChildEnv(host.env),
|
|
20896
20988
|
signal: ctx.signal,
|
|
20897
|
-
codexConfigDir:
|
|
20898
|
-
// same Codex dir D3 reads
|
|
20989
|
+
codexConfigDir: codexDirOf(host.env, needHome(host.env)),
|
|
20990
|
+
// same Codex dir D3 reads (D-N6-CODEX-HOME-2)
|
|
20899
20991
|
db
|
|
20900
20992
|
});
|
|
20901
20993
|
} finally {
|
package/package.json
CHANGED
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
},
|
|
8
8
|
"files": [
|
|
9
9
|
".claude-plugin",
|
|
10
|
+
".codex-plugin",
|
|
10
11
|
"SHA256SUMS",
|
|
11
12
|
"claude-code",
|
|
12
13
|
"cli.mjs",
|
|
14
|
+
"codex",
|
|
13
15
|
"copilot",
|
|
14
16
|
"fixtures",
|
|
15
17
|
"gemini-extension.json",
|
|
@@ -23,6 +25,7 @@
|
|
|
23
25
|
"server.mjs",
|
|
24
26
|
"skills"
|
|
25
27
|
],
|
|
28
|
+
"main": "./opencode/plugin.js",
|
|
26
29
|
"name": "context-mode",
|
|
27
30
|
"pi": {
|
|
28
31
|
"extensions": [
|
|
@@ -37,5 +40,5 @@
|
|
|
37
40
|
"url": "git+https://github.com/mksglu/context-mode.git"
|
|
38
41
|
},
|
|
39
42
|
"type": "module",
|
|
40
|
-
"version": "2.0.0-next.
|
|
43
|
+
"version": "2.0.0-next.7"
|
|
41
44
|
}
|