@kawacode/mcp 6.9.1 → 6.9.3
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/build/index.js +18 -1
- package/build/index.js.map +1 -1
- package/build/kawacode-on-pre-edit.d.ts +6 -1
- package/build/kawacode-on-pre-edit.js +27 -17
- package/build/kawacode-on-pre-edit.js.map +1 -1
- package/build/pre-edit/acked-decisions.d.ts +30 -0
- package/build/pre-edit/acked-decisions.js +65 -0
- package/build/pre-edit/acked-decisions.js.map +1 -0
- package/build/pre-edit/acked-decisions.test.d.ts +1 -0
- package/build/pre-edit/acked-decisions.test.js +59 -0
- package/build/pre-edit/acked-decisions.test.js.map +1 -0
- package/build/tools/_salvage-mangled-args.d.ts +38 -0
- package/build/tools/_salvage-mangled-args.js +87 -0
- package/build/tools/_salvage-mangled-args.js.map +1 -0
- package/build/tools/_salvage-mangled-args.test.d.ts +1 -0
- package/build/tools/_salvage-mangled-args.test.js +73 -0
- package/build/tools/_salvage-mangled-args.test.js.map +1 -0
- package/build/tools/complete-intent.d.ts +4 -4
- package/build/tools/complete-intent.js +14 -4
- package/build/tools/complete-intent.js.map +1 -1
- package/build/tools/edit-session-decision.d.ts +1 -0
- package/build/tools/edit-session-decision.js +14 -1
- package/build/tools/edit-session-decision.js.map +1 -1
- package/build/tools/index.d.ts +4 -7
- package/build/tools/list-team-intents.d.ts +4 -4
- package/build/tools/log-work.js +13 -2
- package/build/tools/log-work.js.map +1 -1
- package/build/tools/pre-edit-acknowledge.d.ts +11 -12
- package/build/tools/pre-edit-acknowledge.js +18 -25
- package/build/tools/pre-edit-acknowledge.js.map +1 -1
- package/package.json +2 -2
package/build/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
5
5
|
import { connectToMuninn, ensureRepo } from './services/muninn-ipc.js';
|
|
6
|
+
import { salvageMangledArgs } from './tools/_salvage-mangled-args.js';
|
|
6
7
|
import { allTools, getRelevantContext, checkActiveIntent, createAndActivateIntent, activateIntent, getIntentsForFile, getIntentsForLines, listTeamIntents, getIntentChanges, completeIntent, updateIntent, logWork, recordDecision, getSessionDecisions, getProjectDecisions, getDecisionDetail, editSessionDecision, detectIntentConflicts, inferHistory, evolveDecisions, updateFeatures, preEditDecisionCheck, preEditAcknowledge, getResolutionContext, arbiterResolve, arbiterApply } from './tools/index.js';
|
|
7
8
|
import { prompts } from './prompts/intent-first-workflow.js';
|
|
8
9
|
import { resources, readActiveIntentResource } from './resources/active-intent.js';
|
|
@@ -41,7 +42,23 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
41
42
|
});
|
|
42
43
|
// Handle tool calls
|
|
43
44
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
44
|
-
const { name, arguments:
|
|
45
|
+
const { name, arguments: rawArgs } = request.params;
|
|
46
|
+
// A malformed tool-call block (a parameter closed with `</fieldName>` instead
|
|
47
|
+
// of the required closing tag, followed by one opened without the required
|
|
48
|
+
// prefix) makes the harness fold the next field's name AND value into the
|
|
49
|
+
// preceding string. Recover them before dispatch — one seam covers every
|
|
50
|
+
// tool. Guarded and logged, never silent: see _salvage-mangled-args.ts.
|
|
51
|
+
let args = rawArgs;
|
|
52
|
+
const schema = allTools.find(t => t.name === name)?.inputSchema;
|
|
53
|
+
if (args && typeof args === 'object' && schema) {
|
|
54
|
+
const { args: repaired, salvaged } = salvageMangledArgs(args, Object.keys(schema.shape));
|
|
55
|
+
if (salvaged.length > 0) {
|
|
56
|
+
args = repaired;
|
|
57
|
+
// stderr only — stdout is the MCP transport.
|
|
58
|
+
console.error(`[MuninnIPC] Recovered ${salvaged.length} malformed argument(s) for ${name}: ` +
|
|
59
|
+
salvaged.map(s => `${s.field} (absorbed by ${s.fromField})`).join(', '));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
45
62
|
try {
|
|
46
63
|
const repoPath = args?.repoPath;
|
|
47
64
|
if (repoPath) {
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,SAAS,EACT,QAAQ,EACT,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,10 +14,15 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Maps recommendation to Claude Code's hook protocol:
|
|
16
16
|
* - "investigate-upstream" → exit 2 + stderr message (block)
|
|
17
|
-
* UNLESS tool_input.force === true →
|
|
17
|
+
* UNLESS tool_input.force === true → exit 0 (one-shot proceed)
|
|
18
18
|
* - "review" → exit 0 + JSON on stdout (advisory)
|
|
19
19
|
* - "proceed" / silent → exit 0, no output
|
|
20
20
|
*
|
|
21
|
+
* Decisions the agent has acknowledged via pre_edit_acknowledge are read from
|
|
22
|
+
* this session's transcript and passed as `forceOverrides`, so Muninn filters
|
|
23
|
+
* them before computing the recommendation (replaces the token-keyed
|
|
24
|
+
* pre-edit-cache; kawa.mcp decision 59ad77ed).
|
|
25
|
+
*
|
|
21
26
|
* This hook carries only the SEMANTIC (decision-tier) signal. The live-HAI
|
|
22
27
|
* code-collision signal was relocated off this per-edit path to a once-per-turn
|
|
23
28
|
* check in kawacode-on-stop (COLLISION_SURFACE_RELOCATION.md) — pre-edit no
|
|
@@ -14,10 +14,15 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Maps recommendation to Claude Code's hook protocol:
|
|
16
16
|
* - "investigate-upstream" → exit 2 + stderr message (block)
|
|
17
|
-
* UNLESS tool_input.force === true →
|
|
17
|
+
* UNLESS tool_input.force === true → exit 0 (one-shot proceed)
|
|
18
18
|
* - "review" → exit 0 + JSON on stdout (advisory)
|
|
19
19
|
* - "proceed" / silent → exit 0, no output
|
|
20
20
|
*
|
|
21
|
+
* Decisions the agent has acknowledged via pre_edit_acknowledge are read from
|
|
22
|
+
* this session's transcript and passed as `forceOverrides`, so Muninn filters
|
|
23
|
+
* them before computing the recommendation (replaces the token-keyed
|
|
24
|
+
* pre-edit-cache; kawa.mcp decision 59ad77ed).
|
|
25
|
+
*
|
|
21
26
|
* This hook carries only the SEMANTIC (decision-tier) signal. The live-HAI
|
|
22
27
|
* code-collision signal was relocated off this per-edit path to a once-per-turn
|
|
23
28
|
* check in kawacode-on-stop (COLLISION_SURFACE_RELOCATION.md) — pre-edit no
|
|
@@ -33,6 +38,7 @@ import { readFileSync } from 'node:fs';
|
|
|
33
38
|
import { connectToMuninn, request, disconnect, setQuiet } from './services/muninn-ipc.js';
|
|
34
39
|
import { resolveOrigin } from './tools/resolve-origin.js';
|
|
35
40
|
import { resolvePaths } from './pre-edit/path-resolve.js';
|
|
41
|
+
import { ackedDecisionIds } from './pre-edit/acked-decisions.js';
|
|
36
42
|
import { emitInjection, emitActedOn, estimateTokens } from './telemetry.js';
|
|
37
43
|
// Hook stderr is surfaced to the agent/user on exit-2 blocks — suppress the
|
|
38
44
|
// IPC lifecycle chatter so only the decision-check message comes through.
|
|
@@ -171,7 +177,21 @@ async function main() {
|
|
|
171
177
|
const target = resolveTarget(payload);
|
|
172
178
|
if (!target)
|
|
173
179
|
process.exit(0);
|
|
174
|
-
|
|
180
|
+
// Transcript-based acknowledgment (replaces the token-keyed pre-edit cache):
|
|
181
|
+
// the decision ids the agent already acknowledged via pre_edit_acknowledge,
|
|
182
|
+
// read from THIS session's own transcript. Same namespace as the hook
|
|
183
|
+
// (payload.transcript_path is in payload.session_id's space), so no
|
|
184
|
+
// cross-process session-id rendezvous — see kawa.mcp decision 59ad77ed.
|
|
185
|
+
// Fail-soft: an unreadable transcript just means no overrides (surface all).
|
|
186
|
+
let forceOverrides = [];
|
|
187
|
+
if (payload.transcript_path) {
|
|
188
|
+
try {
|
|
189
|
+
forceOverrides = [...ackedDecisionIds(readFileSync(payload.transcript_path, 'utf8'))];
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
/* no transcript → behave as before (nothing suppressed) */
|
|
193
|
+
}
|
|
194
|
+
}
|
|
175
195
|
// Resolve origin from the repo path. Falls back silently to exit 0
|
|
176
196
|
// when git isn't available or the path isn't a repo.
|
|
177
197
|
let repoOrigin;
|
|
@@ -195,7 +215,7 @@ async function main() {
|
|
|
195
215
|
filePath: target.filePath,
|
|
196
216
|
startLine: target.startLine,
|
|
197
217
|
endLine: target.endLine,
|
|
198
|
-
|
|
218
|
+
forceOverrides,
|
|
199
219
|
});
|
|
200
220
|
}
|
|
201
221
|
catch {
|
|
@@ -206,21 +226,11 @@ async function main() {
|
|
|
206
226
|
const force = payload.tool_input?.force === true;
|
|
207
227
|
const ids = (res.decisions ?? []).map(d => d.decisionId).filter(Boolean);
|
|
208
228
|
if (force) {
|
|
209
|
-
//
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
await request('pre-edit-cache', 'add', {
|
|
213
|
-
sessionToken,
|
|
214
|
-
decisionIds: ids,
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
catch {
|
|
218
|
-
/* best-effort */
|
|
219
|
-
}
|
|
220
|
-
}
|
|
229
|
+
// force:true is a one-shot "proceed now". The DURABLE acknowledgment is a
|
|
230
|
+
// pre_edit_acknowledge call, whose presence in the transcript suppresses
|
|
231
|
+
// future blocks (ackedDecisionIds above) — so there's no cache to write.
|
|
221
232
|
// Track-B acted-on (VALUE_METRICS Phase 2): the agent consciously
|
|
222
|
-
// overrode the surfaced reasoning —
|
|
223
|
-
// One signal per surfaced decision id (refId), origin in hand here.
|
|
233
|
+
// overrode the surfaced reasoning — one signal per surfaced decision id.
|
|
224
234
|
try {
|
|
225
235
|
await Promise.allSettled(ids.map(id => emitActedOn({ type: 'pre_edit', refId: id, repoOrigin })));
|
|
226
236
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kawacode-on-pre-edit.js","sourceRoot":"","sources":["../src/kawacode-on-pre-edit.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"kawacode-on-pre-edit.js","sourceRoot":"","sources":["../src/kawacode-on-pre-edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure transcript detection for the pre-edit acknowledgment gate.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the token-keyed Muninn `pre-edit-cache`. That cache was a
|
|
5
|
+
* cross-process rendezvous: the hook read it under `payload.session_id` while
|
|
6
|
+
* the acknowledge wrote it under the MCP process's `CLAUDE_CODE_SESSION_ID` —
|
|
7
|
+
* two id sources that diverge after a session restart (the MCP env is a frozen
|
|
8
|
+
* spawn-time snapshot), so the override silently landed in a bucket the check
|
|
9
|
+
* never read. See kawa.mcp decision 59ad77ed.
|
|
10
|
+
*
|
|
11
|
+
* The transcript sidesteps that entirely: the hook reads its OWN transcript
|
|
12
|
+
* (via `payload.transcript_path`, which lives in `payload.session_id`'s
|
|
13
|
+
* namespace), so no cross-process id has to agree. A `pre_edit_acknowledge`
|
|
14
|
+
* tool call's presence in the transcript IS the acknowledgment record.
|
|
15
|
+
*
|
|
16
|
+
* Kept separate from the bin entry so it's unit-testable without triggering the
|
|
17
|
+
* hook's main() — mirrors src/stop/uncompleted-commit.ts.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Every decision id the agent has acknowledged this session, read from
|
|
21
|
+
* `pre_edit_acknowledge` tool_use entries in the Claude Code transcript.
|
|
22
|
+
*
|
|
23
|
+
* Position-independent: an acknowledgment anywhere in the session counts (the
|
|
24
|
+
* override is "for the rest of THIS session"). Robust by construction — a
|
|
25
|
+
* malformed line, a missing/!array `decisionIds`, or a non-array `content` is
|
|
26
|
+
* skipped, never thrown. An empty set is the safe default (nothing suppressed).
|
|
27
|
+
*
|
|
28
|
+
* @param transcriptText raw JSONL contents of the transcript file
|
|
29
|
+
*/
|
|
30
|
+
export declare function ackedDecisionIds(transcriptText: string): Set<string>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure transcript detection for the pre-edit acknowledgment gate.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the token-keyed Muninn `pre-edit-cache`. That cache was a
|
|
5
|
+
* cross-process rendezvous: the hook read it under `payload.session_id` while
|
|
6
|
+
* the acknowledge wrote it under the MCP process's `CLAUDE_CODE_SESSION_ID` —
|
|
7
|
+
* two id sources that diverge after a session restart (the MCP env is a frozen
|
|
8
|
+
* spawn-time snapshot), so the override silently landed in a bucket the check
|
|
9
|
+
* never read. See kawa.mcp decision 59ad77ed.
|
|
10
|
+
*
|
|
11
|
+
* The transcript sidesteps that entirely: the hook reads its OWN transcript
|
|
12
|
+
* (via `payload.transcript_path`, which lives in `payload.session_id`'s
|
|
13
|
+
* namespace), so no cross-process id has to agree. A `pre_edit_acknowledge`
|
|
14
|
+
* tool call's presence in the transcript IS the acknowledgment record.
|
|
15
|
+
*
|
|
16
|
+
* Kept separate from the bin entry so it's unit-testable without triggering the
|
|
17
|
+
* hook's main() — mirrors src/stop/uncompleted-commit.ts.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Every decision id the agent has acknowledged this session, read from
|
|
21
|
+
* `pre_edit_acknowledge` tool_use entries in the Claude Code transcript.
|
|
22
|
+
*
|
|
23
|
+
* Position-independent: an acknowledgment anywhere in the session counts (the
|
|
24
|
+
* override is "for the rest of THIS session"). Robust by construction — a
|
|
25
|
+
* malformed line, a missing/!array `decisionIds`, or a non-array `content` is
|
|
26
|
+
* skipped, never thrown. An empty set is the safe default (nothing suppressed).
|
|
27
|
+
*
|
|
28
|
+
* @param transcriptText raw JSONL contents of the transcript file
|
|
29
|
+
*/
|
|
30
|
+
export function ackedDecisionIds(transcriptText) {
|
|
31
|
+
const acked = new Set();
|
|
32
|
+
if (!transcriptText)
|
|
33
|
+
return acked;
|
|
34
|
+
for (const line of transcriptText.split('\n')) {
|
|
35
|
+
const ln = line.trim();
|
|
36
|
+
if (!ln)
|
|
37
|
+
continue;
|
|
38
|
+
let obj;
|
|
39
|
+
try {
|
|
40
|
+
obj = JSON.parse(ln);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const content = obj?.message?.content;
|
|
46
|
+
if (!Array.isArray(content))
|
|
47
|
+
continue;
|
|
48
|
+
for (const item of content) {
|
|
49
|
+
if (item?.type !== 'tool_use')
|
|
50
|
+
continue;
|
|
51
|
+
// Tolerate the MCP prefix (e.g. `mcp__kawa-intents__pre_edit_acknowledge`).
|
|
52
|
+
if (!/pre_edit_acknowledge/.test(item.name || ''))
|
|
53
|
+
continue;
|
|
54
|
+
const ids = item?.input?.decisionIds;
|
|
55
|
+
if (!Array.isArray(ids))
|
|
56
|
+
continue;
|
|
57
|
+
for (const id of ids) {
|
|
58
|
+
if (typeof id === 'string' && id)
|
|
59
|
+
acked.add(id);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return acked;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=acked-decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acked-decisions.js","sourceRoot":"","sources":["../../src/pre-edit/acked-decisions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAsB;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAA;IAEjC,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACtB,IAAI,CAAC,EAAE;YAAE,SAAQ;QAEjB,IAAI,GAAQ,CAAA;QACZ,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,CAAA;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,SAAQ;QAErC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,IAAI,EAAE,IAAI,KAAK,UAAU;gBAAE,SAAQ;YACvC,4EAA4E;YAC5E,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBAAE,SAAQ;YAE3D,MAAM,GAAG,GAAG,IAAI,EAAE,KAAK,EAAE,WAAW,CAAA;YACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,SAAQ;YACjC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE;oBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { ackedDecisionIds } from './acked-decisions.js';
|
|
4
|
+
// Build one JSONL transcript line carrying an assistant message with the given
|
|
5
|
+
// content items — mirrors the shape scanTranscript consumes in the stop-gate.
|
|
6
|
+
function msgLine(content) {
|
|
7
|
+
return JSON.stringify({ type: 'assistant', message: { role: 'assistant', content } });
|
|
8
|
+
}
|
|
9
|
+
function ackToolUse(name, decisionIds) {
|
|
10
|
+
return { type: 'tool_use', id: 'toolu_x', name, input: { decisionIds } };
|
|
11
|
+
}
|
|
12
|
+
test('collects decisionIds from a pre_edit_acknowledge tool_use', () => {
|
|
13
|
+
const t = msgLine([ackToolUse('pre_edit_acknowledge', ['d1', 'd2'])]);
|
|
14
|
+
assert.deepEqual([...ackedDecisionIds(t)].sort(), ['d1', 'd2']);
|
|
15
|
+
});
|
|
16
|
+
test('tolerates the mcp__ tool-name prefix', () => {
|
|
17
|
+
const t = msgLine([ackToolUse('mcp__kawa-intents__pre_edit_acknowledge', ['d9'])]);
|
|
18
|
+
assert.deepEqual([...ackedDecisionIds(t)], ['d9']);
|
|
19
|
+
});
|
|
20
|
+
test('unions ids across multiple acknowledge calls, deduped', () => {
|
|
21
|
+
const t = [
|
|
22
|
+
msgLine([ackToolUse('pre_edit_acknowledge', ['a', 'b'])]),
|
|
23
|
+
msgLine([{ type: 'text', text: 'some prose' }]),
|
|
24
|
+
msgLine([ackToolUse('pre_edit_acknowledge', ['b', 'c'])]),
|
|
25
|
+
].join('\n');
|
|
26
|
+
assert.deepEqual([...ackedDecisionIds(t)].sort(), ['a', 'b', 'c']);
|
|
27
|
+
});
|
|
28
|
+
test('ignores other tool calls', () => {
|
|
29
|
+
const t = msgLine([
|
|
30
|
+
{ type: 'tool_use', id: 't1', name: 'record_decision', input: { decisionIds: ['nope'] } },
|
|
31
|
+
{ type: 'tool_use', id: 't2', name: 'Edit', input: { file_path: 'x' } },
|
|
32
|
+
]);
|
|
33
|
+
assert.equal(ackedDecisionIds(t).size, 0);
|
|
34
|
+
});
|
|
35
|
+
test('skips malformed JSON lines without throwing', () => {
|
|
36
|
+
const t = ['{ not valid json', msgLine([ackToolUse('pre_edit_acknowledge', ['ok'])]), 'also broken'].join('\n');
|
|
37
|
+
assert.deepEqual([...ackedDecisionIds(t)], ['ok']);
|
|
38
|
+
});
|
|
39
|
+
test('skips a tool_use with missing or non-array decisionIds', () => {
|
|
40
|
+
const t = [
|
|
41
|
+
msgLine([ackToolUse('pre_edit_acknowledge', undefined)]),
|
|
42
|
+
msgLine([ackToolUse('pre_edit_acknowledge', 'd1')]),
|
|
43
|
+
msgLine([ackToolUse('pre_edit_acknowledge', ['real'])]),
|
|
44
|
+
].join('\n');
|
|
45
|
+
assert.deepEqual([...ackedDecisionIds(t)], ['real']);
|
|
46
|
+
});
|
|
47
|
+
test('drops non-string / empty ids inside the array', () => {
|
|
48
|
+
const t = msgLine([ackToolUse('pre_edit_acknowledge', ['keep', '', 42, null, { x: 1 }])]);
|
|
49
|
+
assert.deepEqual([...ackedDecisionIds(t)], ['keep']);
|
|
50
|
+
});
|
|
51
|
+
test('non-array message content is skipped', () => {
|
|
52
|
+
const t = JSON.stringify({ message: { content: 'a string, not an array' } });
|
|
53
|
+
assert.equal(ackedDecisionIds(t).size, 0);
|
|
54
|
+
});
|
|
55
|
+
test('empty / whitespace transcript yields an empty set', () => {
|
|
56
|
+
assert.equal(ackedDecisionIds('').size, 0);
|
|
57
|
+
assert.equal(ackedDecisionIds('\n \n').size, 0);
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=acked-decisions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acked-decisions.test.js","sourceRoot":"","sources":["../../src/pre-edit/acked-decisions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery for tool-call args mangled by a mis-closed parameter tag.
|
|
3
|
+
*
|
|
4
|
+
* When an LLM emits a parameter block that is opened correctly but closed with
|
|
5
|
+
* `</fieldName>` instead of the required closing tag — and the NEXT parameter is
|
|
6
|
+
* opened without the required prefix — the harness's tool-call parser never sees
|
|
7
|
+
* a parameter boundary. Everything up to the next well-formed close is folded
|
|
8
|
+
* into the preceding field's string value. What reaches this process is
|
|
9
|
+
* perfectly valid JSON in which one field carries a self-describing tail:
|
|
10
|
+
*
|
|
11
|
+
* { consequences: 'real text</consequences>\n<parameter name="symptom">real symptom' }
|
|
12
|
+
*
|
|
13
|
+
* There is no second wire format to parse — the tail is simply data. But it is
|
|
14
|
+
* losslessly recoverable, because it names the field it was meant for and
|
|
15
|
+
* carries that field's value verbatim.
|
|
16
|
+
*
|
|
17
|
+
* This is deliberately a compensating path (the project otherwise forbids
|
|
18
|
+
* fallbacks): left alone, the corruption reaches the store, syncs, and becomes
|
|
19
|
+
* immutable, which has already cost several supersede cycles. Recovery is
|
|
20
|
+
* strictly guarded and always logged, never silent.
|
|
21
|
+
*/
|
|
22
|
+
export interface SalvageEntry {
|
|
23
|
+
/** The field whose value was recovered. */
|
|
24
|
+
field: string;
|
|
25
|
+
/** The field that had absorbed it. */
|
|
26
|
+
fromField: string;
|
|
27
|
+
}
|
|
28
|
+
export interface SalvageResult {
|
|
29
|
+
args: Record<string, unknown>;
|
|
30
|
+
salvaged: SalvageEntry[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Peel absorbed fields out of `args`. Returns a new object; `args` is untouched.
|
|
34
|
+
*
|
|
35
|
+
* `knownFields` are the schema field names of the tool being called — recovery
|
|
36
|
+
* is refused for anything not in that set.
|
|
37
|
+
*/
|
|
38
|
+
export declare function salvageMangledArgs(args: Record<string, unknown>, knownFields: readonly string[]): SalvageResult;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery for tool-call args mangled by a mis-closed parameter tag.
|
|
3
|
+
*
|
|
4
|
+
* When an LLM emits a parameter block that is opened correctly but closed with
|
|
5
|
+
* `</fieldName>` instead of the required closing tag — and the NEXT parameter is
|
|
6
|
+
* opened without the required prefix — the harness's tool-call parser never sees
|
|
7
|
+
* a parameter boundary. Everything up to the next well-formed close is folded
|
|
8
|
+
* into the preceding field's string value. What reaches this process is
|
|
9
|
+
* perfectly valid JSON in which one field carries a self-describing tail:
|
|
10
|
+
*
|
|
11
|
+
* { consequences: 'real text</consequences>\n<parameter name="symptom">real symptom' }
|
|
12
|
+
*
|
|
13
|
+
* There is no second wire format to parse — the tail is simply data. But it is
|
|
14
|
+
* losslessly recoverable, because it names the field it was meant for and
|
|
15
|
+
* carries that field's value verbatim.
|
|
16
|
+
*
|
|
17
|
+
* This is deliberately a compensating path (the project otherwise forbids
|
|
18
|
+
* fallbacks): left alone, the corruption reaches the store, syncs, and becomes
|
|
19
|
+
* immutable, which has already cost several supersede cycles. Recovery is
|
|
20
|
+
* strictly guarded and always logged, never silent.
|
|
21
|
+
*/
|
|
22
|
+
/** `</host>` + optional whitespace + a parameter opening + everything after it. */
|
|
23
|
+
const MANGLED_TAIL = /<\/([A-Za-z_][\w-]*)>\s*<parameter name="([A-Za-z_]\w*)">([\s\S]*)$/;
|
|
24
|
+
/**
|
|
25
|
+
* Arrays and objects arrive as JSON text; anything else is a plain string.
|
|
26
|
+
* Only attempt a parse when the value actually looks structured, so a string
|
|
27
|
+
* like "123" or "true" is never silently coerced to another type.
|
|
28
|
+
*/
|
|
29
|
+
function parseSalvagedValue(raw) {
|
|
30
|
+
const trimmed = raw.trim();
|
|
31
|
+
if (trimmed.startsWith('[') || trimmed.startsWith('{')) {
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(trimmed);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Not valid JSON after all — keep the text rather than dropping it.
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return trimmed;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Peel absorbed fields out of `args`. Returns a new object; `args` is untouched.
|
|
43
|
+
*
|
|
44
|
+
* `knownFields` are the schema field names of the tool being called — recovery
|
|
45
|
+
* is refused for anything not in that set.
|
|
46
|
+
*/
|
|
47
|
+
export function salvageMangledArgs(args, knownFields) {
|
|
48
|
+
const known = new Set(knownFields);
|
|
49
|
+
const out = { ...args };
|
|
50
|
+
const salvaged = [];
|
|
51
|
+
// A single malformed emission can chain: field A absorbs B, whose value in
|
|
52
|
+
// turn absorbs C. Keep peeling until a pass finds nothing new.
|
|
53
|
+
let progressed = true;
|
|
54
|
+
while (progressed) {
|
|
55
|
+
progressed = false;
|
|
56
|
+
for (const [hostField, hostValue] of Object.entries(out)) {
|
|
57
|
+
if (typeof hostValue !== 'string')
|
|
58
|
+
continue;
|
|
59
|
+
const match = hostValue.match(MANGLED_TAIL);
|
|
60
|
+
if (!match || match.index === undefined)
|
|
61
|
+
continue;
|
|
62
|
+
const [, closingTag, targetField, rawValue] = match;
|
|
63
|
+
// Three guards, all required. Any miss means this is probably genuine
|
|
64
|
+
// prose (a decision *documenting* this very bug legitimately contains
|
|
65
|
+
// these markers), so leave it alone and let normal validation decide.
|
|
66
|
+
//
|
|
67
|
+
// 1. the bogus closing tag names the host field — evidence of a
|
|
68
|
+
// mis-closed host parameter rather than incidental mention
|
|
69
|
+
if (closingTag !== hostField)
|
|
70
|
+
continue;
|
|
71
|
+
// 2. the absorbed field is real for this tool
|
|
72
|
+
if (!known.has(targetField))
|
|
73
|
+
continue;
|
|
74
|
+
// 3. it was not otherwise supplied — never overwrite genuine input
|
|
75
|
+
const existing = out[targetField];
|
|
76
|
+
if (existing !== undefined && existing !== null && existing !== '')
|
|
77
|
+
continue;
|
|
78
|
+
out[hostField] = hostValue.slice(0, match.index).trimEnd();
|
|
79
|
+
out[targetField] = parseSalvagedValue(rawValue);
|
|
80
|
+
salvaged.push({ field: targetField, fromField: hostField });
|
|
81
|
+
progressed = true;
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { args: out, salvaged };
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=_salvage-mangled-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_salvage-mangled-args.js","sourceRoot":"","sources":["../../src/tools/_salvage-mangled-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,mFAAmF;AACnF,MAAM,YAAY,GAAG,qEAAqE,CAAA;AAc1F;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAA6B,EAC7B,WAA8B;IAE9B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;IAClC,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAA;IAChD,MAAM,QAAQ,GAAmB,EAAE,CAAA;IAEnC,2EAA2E;IAC3E,+DAA+D;IAC/D,IAAI,UAAU,GAAG,IAAI,CAAA;IACrB,OAAO,UAAU,EAAE,CAAC;QAClB,UAAU,GAAG,KAAK,CAAA;QAElB,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,SAAQ;YAE3C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YAC3C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,SAAQ;YAEjD,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAA;YAEnD,sEAAsE;YACtE,sEAAsE;YACtE,sEAAsE;YACtE,EAAE;YACF,iEAAiE;YACjE,+DAA+D;YAC/D,IAAI,UAAU,KAAK,SAAS;gBAAE,SAAQ;YACtC,+CAA+C;YAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;gBAAE,SAAQ;YACrC,oEAAoE;YACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;YACjC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE;gBAAE,SAAQ;YAE5E,GAAG,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;YAC1D,GAAG,CAAC,WAAW,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;YAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAA;YAC3D,UAAU,GAAG,IAAI,CAAA;YACjB,MAAK;QACP,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { salvageMangledArgs } from './_salvage-mangled-args.js';
|
|
4
|
+
const FIELDS = ['summary', 'rationale', 'consequences', 'symptom', 'appliesWhen', 'alternatives', 'relatedFiles'];
|
|
5
|
+
test('recovers a string field absorbed by a mis-closed host parameter', () => {
|
|
6
|
+
const { args, salvaged } = salvageMangledArgs({
|
|
7
|
+
consequences: 'Real consequences text.</consequences>\n<parameter name="symptom">Real symptom text.',
|
|
8
|
+
}, FIELDS);
|
|
9
|
+
assert.equal(args.consequences, 'Real consequences text.');
|
|
10
|
+
assert.equal(args.symptom, 'Real symptom text.');
|
|
11
|
+
assert.deepEqual(salvaged, [{ field: 'symptom', fromField: 'consequences' }]);
|
|
12
|
+
});
|
|
13
|
+
test('JSON-parses an absorbed array value', () => {
|
|
14
|
+
const { args } = salvageMangledArgs({
|
|
15
|
+
consequences: 'Text.</consequences>\n<parameter name="alternatives">["option A", "option B"]',
|
|
16
|
+
}, FIELDS);
|
|
17
|
+
assert.equal(args.consequences, 'Text.');
|
|
18
|
+
assert.deepEqual(args.alternatives, ['option A', 'option B']);
|
|
19
|
+
});
|
|
20
|
+
test('unwinds a chain of consecutive mangled parameters', () => {
|
|
21
|
+
const { args, salvaged } = salvageMangledArgs({
|
|
22
|
+
consequences: 'C text.</consequences>\n<parameter name="symptom">S text.</symptom>\n<parameter name="appliesWhen">A text.',
|
|
23
|
+
}, FIELDS);
|
|
24
|
+
assert.equal(args.consequences, 'C text.');
|
|
25
|
+
assert.equal(args.symptom, 'S text.');
|
|
26
|
+
assert.equal(args.appliesWhen, 'A text.');
|
|
27
|
+
assert.equal(salvaged.length, 2);
|
|
28
|
+
});
|
|
29
|
+
test('does NOT salvage when the closing tag does not name the host field', () => {
|
|
30
|
+
// Genuine prose that merely mentions the markers — e.g. a decision recorded
|
|
31
|
+
// *about* this bug. Left untouched.
|
|
32
|
+
const original = 'Docs: a value may end with </consequences>\n<parameter name="symptom">like so.';
|
|
33
|
+
const { args, salvaged } = salvageMangledArgs({ rationale: original }, FIELDS);
|
|
34
|
+
assert.equal(args.rationale, original);
|
|
35
|
+
assert.equal(args.symptom, undefined);
|
|
36
|
+
assert.deepEqual(salvaged, []);
|
|
37
|
+
});
|
|
38
|
+
test('does NOT salvage an unknown target field', () => {
|
|
39
|
+
const original = 'Text.</consequences>\n<parameter name="notARealField">value';
|
|
40
|
+
const { args, salvaged } = salvageMangledArgs({ consequences: original }, FIELDS);
|
|
41
|
+
assert.equal(args.consequences, original);
|
|
42
|
+
assert.deepEqual(salvaged, []);
|
|
43
|
+
});
|
|
44
|
+
test('never overwrites a target the caller actually supplied', () => {
|
|
45
|
+
const original = 'Text.</consequences>\n<parameter name="symptom">absorbed symptom';
|
|
46
|
+
const { args, salvaged } = salvageMangledArgs({ consequences: original, symptom: 'genuine symptom' }, FIELDS);
|
|
47
|
+
assert.equal(args.symptom, 'genuine symptom');
|
|
48
|
+
assert.equal(args.consequences, original);
|
|
49
|
+
assert.deepEqual(salvaged, []);
|
|
50
|
+
});
|
|
51
|
+
test('leaves clean args untouched and reports no salvage', () => {
|
|
52
|
+
const input = { summary: 'A summary', alternatives: ['x'], relatedFiles: ['a.ts'] };
|
|
53
|
+
const { args, salvaged } = salvageMangledArgs(input, FIELDS);
|
|
54
|
+
assert.deepEqual(args, input);
|
|
55
|
+
assert.deepEqual(salvaged, []);
|
|
56
|
+
});
|
|
57
|
+
test('does not mutate the caller-supplied args object', () => {
|
|
58
|
+
const input = {
|
|
59
|
+
consequences: 'Text.</consequences>\n<parameter name="symptom">S.',
|
|
60
|
+
};
|
|
61
|
+
salvageMangledArgs(input, FIELDS);
|
|
62
|
+
assert.equal(input.consequences, 'Text.</consequences>\n<parameter name="symptom">S.');
|
|
63
|
+
});
|
|
64
|
+
test('keeps the raw text when an absorbed structured value is not valid JSON', () => {
|
|
65
|
+
const { args } = salvageMangledArgs({ consequences: 'Text.</consequences>\n<parameter name="alternatives">[not, valid, json' }, FIELDS);
|
|
66
|
+
assert.equal(args.alternatives, '[not, valid, json');
|
|
67
|
+
});
|
|
68
|
+
test('ignores non-string fields', () => {
|
|
69
|
+
const { args, salvaged } = salvageMangledArgs({ relatedFiles: ['a.ts', 'b.ts'], summary: 'clean' }, FIELDS);
|
|
70
|
+
assert.deepEqual(args.relatedFiles, ['a.ts', 'b.ts']);
|
|
71
|
+
assert.deepEqual(salvaged, []);
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=_salvage-mangled-args.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_salvage-mangled-args.test.js","sourceRoot":"","sources":["../../src/tools/_salvage-mangled-args.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ export declare const completeIntentSchema: z.ZodObject<{
|
|
|
22
22
|
supersededBy: z.ZodOptional<z.ZodString>;
|
|
23
23
|
humanApproved: z.ZodOptional<z.ZodBoolean>;
|
|
24
24
|
}, "strip", z.ZodTypeAny, {
|
|
25
|
-
status: "
|
|
25
|
+
status: "done" | "committed" | "pushed" | "abandoned" | "superseded";
|
|
26
26
|
repoPath: string;
|
|
27
27
|
repoOrigin?: string | undefined;
|
|
28
28
|
forkAuthor?: {
|
|
@@ -37,7 +37,7 @@ export declare const completeIntentSchema: z.ZodObject<{
|
|
|
37
37
|
humanApproved?: boolean | undefined;
|
|
38
38
|
}, {
|
|
39
39
|
repoPath: string;
|
|
40
|
-
status?: "
|
|
40
|
+
status?: "done" | "committed" | "pushed" | "abandoned" | "superseded" | undefined;
|
|
41
41
|
repoOrigin?: string | undefined;
|
|
42
42
|
forkAuthor?: {
|
|
43
43
|
platform: "github" | "gitlab";
|
|
@@ -172,7 +172,7 @@ export declare const completeIntentTool: {
|
|
|
172
172
|
supersededBy: z.ZodOptional<z.ZodString>;
|
|
173
173
|
humanApproved: z.ZodOptional<z.ZodBoolean>;
|
|
174
174
|
}, "strip", z.ZodTypeAny, {
|
|
175
|
-
status: "
|
|
175
|
+
status: "done" | "committed" | "pushed" | "abandoned" | "superseded";
|
|
176
176
|
repoPath: string;
|
|
177
177
|
repoOrigin?: string | undefined;
|
|
178
178
|
forkAuthor?: {
|
|
@@ -187,7 +187,7 @@ export declare const completeIntentTool: {
|
|
|
187
187
|
humanApproved?: boolean | undefined;
|
|
188
188
|
}, {
|
|
189
189
|
repoPath: string;
|
|
190
|
-
status?: "
|
|
190
|
+
status?: "done" | "committed" | "pushed" | "abandoned" | "superseded" | undefined;
|
|
191
191
|
repoOrigin?: string | undefined;
|
|
192
192
|
forkAuthor?: {
|
|
193
193
|
platform: "github" | "gitlab";
|
|
@@ -41,7 +41,13 @@ export async function completeIntent(input) {
|
|
|
41
41
|
const intentId = res.intentId || '';
|
|
42
42
|
const intentTitle = res.intentTitle || 'Intent';
|
|
43
43
|
const previousStatus = res.previousStatus || 'active';
|
|
44
|
-
|
|
44
|
+
// A completed intent ALWAYS comes back with its id — the base success payload
|
|
45
|
+
// carries both `success: true` and `intentId`, with deferredConflicts /
|
|
46
|
+
// apiSyncDeferred merged onto it, so those keep succeeding. A response that
|
|
47
|
+
// neither declares failure nor carries an id completed nothing; reporting it
|
|
48
|
+
// as success would claim a status flip, block auto-capture and distillation
|
|
49
|
+
// that never happened (constraint cdb76224).
|
|
50
|
+
const success = res.success !== false && !!intentId;
|
|
45
51
|
const deferredConflicts = Array.isArray(res.deferredConflicts) ? res.deferredConflicts : [];
|
|
46
52
|
const committedDecisionCount = typeof res.committedDecisionCount === 'number' ? res.committedDecisionCount : undefined;
|
|
47
53
|
const reason = res.reason === 'transient-failure' ? res.reason : undefined;
|
|
@@ -63,9 +69,13 @@ export async function completeIntent(input) {
|
|
|
63
69
|
`If retrying repeatedly fails, the user can abandon the intent (complete_intent(status="abandoned")).`;
|
|
64
70
|
}
|
|
65
71
|
else if (!success) {
|
|
66
|
-
// Catch-all for legacy / unexpected error shapes
|
|
67
|
-
|
|
68
|
-
|
|
72
|
+
// Catch-all for legacy / unexpected error shapes, plus the anomalous
|
|
73
|
+
// "no failure declared AND no intentId" case. In the latter nothing ran,
|
|
74
|
+
// so do NOT echo the requested status as though it had landed.
|
|
75
|
+
newStatus = res.newStatus || res.status || (intentId ? input.status : 'active');
|
|
76
|
+
message = intentId
|
|
77
|
+
? `Failed to complete intent "${intentTitle}".`
|
|
78
|
+
: `Could not complete intent "${intentTitle}" — Kawa Code returned no intent id, so NOTHING was completed: the status was not changed, no code blocks were captured, and no decisions were distilled. Do NOT report this as committed. Retry complete_intent; if it fails again, surface the failure to the user rather than assuming the intent closed.`;
|
|
69
79
|
}
|
|
70
80
|
else {
|
|
71
81
|
// Clean completion. Note: Phase 3.5 may have queued writes for later
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete-intent.js","sourceRoot":"","sources":["../../src/tools/complete-intent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6EAA6E,CAAC;IACzH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2VAA2V,CAAC;IACrY,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yEAAyE,CAAC;IACpH,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;SAC5F,QAAQ,CAAC,4KAA4K,CAAC;IACzL,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;IACzH,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qRAAqR,CAAC;IACrU,GAAG,oBAAoB;CACxB,CAAC,CAAA;AAkGF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAA0B;IAC7D,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;IAEpE,kFAAkF;IAClF,iFAAiF;IACjF,4EAA4E;IAC5E,+EAA+E;IAC/E,iFAAiF;IACjF,4EAA4E;IAC5E,gDAAgD;IAEhD,8EAA8E;IAC9E,0EAA0E;IAC1E,wEAAwE;IACxE,2EAA2E;IAC3E,4EAA4E;IAC5E,mFAAmF;IACnF,MAAM,mBAAmB,GAAG,OAAO,CAAA;IACnC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE;QAC9C,UAAU,EAAE,YAAY;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,GAAG,iBAAiB,CAAC,KAAK,CAAC;KAC5B,EAAE,mBAAmB,CAAC,CAAA;IAEvB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAA;IACnC,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,QAAQ,CAAA;IAC/C,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,QAAQ,CAAA;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,KAAK,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"complete-intent.js","sourceRoot":"","sources":["../../src/tools/complete-intent.ts"],"names":[],"mappings":"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"}
|
|
@@ -134,6 +134,7 @@ export declare const editSessionDecisionSchema: z.ZodObject<{
|
|
|
134
134
|
export type EditSessionDecisionInput = z.infer<typeof editSessionDecisionSchema>;
|
|
135
135
|
export interface EditSessionDecisionResponse {
|
|
136
136
|
success: boolean;
|
|
137
|
+
error?: string;
|
|
137
138
|
}
|
|
138
139
|
export declare function editSessionDecision(input: EditSessionDecisionInput): Promise<EditSessionDecisionResponse>;
|
|
139
140
|
export declare const editSessionDecisionTool: {
|
|
@@ -40,7 +40,20 @@ export async function editSessionDecision(input) {
|
|
|
40
40
|
updates: input.updates,
|
|
41
41
|
...extractForkFields(input),
|
|
42
42
|
});
|
|
43
|
-
|
|
43
|
+
// No id receipt exists for an update/delete, so require an EXPLICIT
|
|
44
|
+
// success instead of inferring it from the absence of a failure
|
|
45
|
+
// (constraint cdb76224). Safe here: Kawa Code sets `success` on every
|
|
46
|
+
// branch of this action, so a missing flag means an unexpected shape, not
|
|
47
|
+
// a silent success. Surface `error` so the caller learns WHY — e.g. the
|
|
48
|
+
// synced-decision case, which must be refined via record_decision(supersedes).
|
|
49
|
+
if (res.success === true)
|
|
50
|
+
return { success: true };
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: typeof res.error === 'string' && res.error.length > 0
|
|
54
|
+
? res.error
|
|
55
|
+
: 'The decision was NOT modified (Kawa Code did not confirm the edit). Nothing changed — re-check the decision id and intent id.',
|
|
56
|
+
};
|
|
44
57
|
}
|
|
45
58
|
export const editSessionDecisionTool = {
|
|
46
59
|
name: 'edit_session_decision',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-session-decision.js","sourceRoot":"","sources":["../../src/tools/edit-session-decision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE3E,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAA;AAEF,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5C,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5C,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAClD,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,QAAQ,EAAE;IACnE,+EAA+E;IAC/E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SACjF,QAAQ,CAAC,8GAA8G,CAAC;CAC5H,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6EAA6E,CAAC;IACzH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACpE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,oEAAoE,CAAC;IACnH,OAAO,EAAE,qBAAqB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IACvG,GAAG,oBAAoB;CACxB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"edit-session-decision.js","sourceRoot":"","sources":["../../src/tools/edit-session-decision.ts"],"names":[],"mappings":"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"}
|
package/build/tools/index.d.ts
CHANGED
|
@@ -339,7 +339,7 @@ export declare const allTools: ({
|
|
|
339
339
|
repoPath: string;
|
|
340
340
|
limit: number;
|
|
341
341
|
offset: number;
|
|
342
|
-
status?: "
|
|
342
|
+
status?: "done" | "active" | "committed" | "pushed" | "abandoned" | undefined;
|
|
343
343
|
repoOrigin?: string | undefined;
|
|
344
344
|
forkAuthor?: {
|
|
345
345
|
platform: "github" | "gitlab";
|
|
@@ -352,7 +352,7 @@ export declare const allTools: ({
|
|
|
352
352
|
until?: string | undefined;
|
|
353
353
|
}, {
|
|
354
354
|
repoPath: string;
|
|
355
|
-
status?: "
|
|
355
|
+
status?: "done" | "active" | "committed" | "pushed" | "abandoned" | undefined;
|
|
356
356
|
repoOrigin?: string | undefined;
|
|
357
357
|
forkAuthor?: {
|
|
358
358
|
platform: "github" | "gitlab";
|
|
@@ -433,7 +433,7 @@ export declare const allTools: ({
|
|
|
433
433
|
supersededBy: import("zod").ZodOptional<import("zod").ZodString>;
|
|
434
434
|
humanApproved: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
435
435
|
}, "strip", import("zod").ZodTypeAny, {
|
|
436
|
-
status: "
|
|
436
|
+
status: "done" | "committed" | "pushed" | "abandoned" | "superseded";
|
|
437
437
|
repoPath: string;
|
|
438
438
|
repoOrigin?: string | undefined;
|
|
439
439
|
forkAuthor?: {
|
|
@@ -448,7 +448,7 @@ export declare const allTools: ({
|
|
|
448
448
|
humanApproved?: boolean | undefined;
|
|
449
449
|
}, {
|
|
450
450
|
repoPath: string;
|
|
451
|
-
status?: "
|
|
451
|
+
status?: "done" | "committed" | "pushed" | "abandoned" | "superseded" | undefined;
|
|
452
452
|
repoOrigin?: string | undefined;
|
|
453
453
|
forkAuthor?: {
|
|
454
454
|
platform: "github" | "gitlab";
|
|
@@ -1200,7 +1200,6 @@ export declare const allTools: ({
|
|
|
1200
1200
|
}>>;
|
|
1201
1201
|
workspaceId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
1202
1202
|
decisionIds: import("zod").ZodArray<import("zod").ZodString, "many">;
|
|
1203
|
-
sessionToken: import("zod").ZodOptional<import("zod").ZodString>;
|
|
1204
1203
|
repoOrigin: import("zod").ZodOptional<import("zod").ZodString>;
|
|
1205
1204
|
repoPath: import("zod").ZodOptional<import("zod").ZodString>;
|
|
1206
1205
|
}, "strip", import("zod").ZodTypeAny, {
|
|
@@ -1213,7 +1212,6 @@ export declare const allTools: ({
|
|
|
1213
1212
|
forkOrigin: string;
|
|
1214
1213
|
} | undefined;
|
|
1215
1214
|
workspaceId?: string | undefined;
|
|
1216
|
-
sessionToken?: string | undefined;
|
|
1217
1215
|
}, {
|
|
1218
1216
|
decisionIds: string[];
|
|
1219
1217
|
repoOrigin?: string | undefined;
|
|
@@ -1224,7 +1222,6 @@ export declare const allTools: ({
|
|
|
1224
1222
|
forkOrigin: string;
|
|
1225
1223
|
} | undefined;
|
|
1226
1224
|
workspaceId?: string | undefined;
|
|
1227
|
-
sessionToken?: string | undefined;
|
|
1228
1225
|
}>;
|
|
1229
1226
|
handler: typeof preEditAcknowledge;
|
|
1230
1227
|
} | {
|
|
@@ -26,7 +26,7 @@ export declare const listTeamIntentsSchema: z.ZodObject<{
|
|
|
26
26
|
repoPath: string;
|
|
27
27
|
limit: number;
|
|
28
28
|
offset: number;
|
|
29
|
-
status?: "
|
|
29
|
+
status?: "done" | "active" | "committed" | "pushed" | "abandoned" | undefined;
|
|
30
30
|
repoOrigin?: string | undefined;
|
|
31
31
|
forkAuthor?: {
|
|
32
32
|
platform: "github" | "gitlab";
|
|
@@ -39,7 +39,7 @@ export declare const listTeamIntentsSchema: z.ZodObject<{
|
|
|
39
39
|
until?: string | undefined;
|
|
40
40
|
}, {
|
|
41
41
|
repoPath: string;
|
|
42
|
-
status?: "
|
|
42
|
+
status?: "done" | "active" | "committed" | "pushed" | "abandoned" | undefined;
|
|
43
43
|
repoOrigin?: string | undefined;
|
|
44
44
|
forkAuthor?: {
|
|
45
45
|
platform: "github" | "gitlab";
|
|
@@ -102,7 +102,7 @@ export declare const listTeamIntentsTool: {
|
|
|
102
102
|
repoPath: string;
|
|
103
103
|
limit: number;
|
|
104
104
|
offset: number;
|
|
105
|
-
status?: "
|
|
105
|
+
status?: "done" | "active" | "committed" | "pushed" | "abandoned" | undefined;
|
|
106
106
|
repoOrigin?: string | undefined;
|
|
107
107
|
forkAuthor?: {
|
|
108
108
|
platform: "github" | "gitlab";
|
|
@@ -115,7 +115,7 @@ export declare const listTeamIntentsTool: {
|
|
|
115
115
|
until?: string | undefined;
|
|
116
116
|
}, {
|
|
117
117
|
repoPath: string;
|
|
118
|
-
status?: "
|
|
118
|
+
status?: "done" | "active" | "committed" | "pushed" | "abandoned" | undefined;
|
|
119
119
|
repoOrigin?: string | undefined;
|
|
120
120
|
forkAuthor?: {
|
|
121
121
|
platform: "github" | "gitlab";
|
package/build/tools/log-work.js
CHANGED
|
@@ -17,9 +17,20 @@ export async function logWork(input) {
|
|
|
17
17
|
files: input.files || [],
|
|
18
18
|
...extractForkFields(input),
|
|
19
19
|
});
|
|
20
|
-
|
|
20
|
+
// Positive receipt required: a logged work item always comes back with an id.
|
|
21
|
+
// `res.success !== false` alone would report success for any response that
|
|
22
|
+
// merely omits `success` (see constraint cdb76224), and the message below
|
|
23
|
+
// asserted success unconditionally.
|
|
24
|
+
const intentId = typeof res.intentId === 'string' ? res.intentId : '';
|
|
25
|
+
if (res.success === false || !intentId) {
|
|
26
|
+
return {
|
|
27
|
+
success: false,
|
|
28
|
+
intentId: '',
|
|
29
|
+
message: res.error || 'Nothing was logged (Kawa Code returned no intent id). Re-send, and report the failure rather than assuming it was captured.',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
21
32
|
return {
|
|
22
|
-
success:
|
|
33
|
+
success: true,
|
|
23
34
|
intentId,
|
|
24
35
|
message: `Logged: "${input.title}"`
|
|
25
36
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-work.js","sourceRoot":"","sources":["../../src/tools/log-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE3E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6EAA6E,CAAC;IACzH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACzE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IAC7F,GAAG,oBAAoB;CACxB,CAAC,CAAA;AAUF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAmB;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;IAE9D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE;QAC9C,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;QACxB,GAAG,iBAAiB,CAAC,KAAK,CAAC;KAC5B,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"log-work.js","sourceRoot":"","sources":["../../src/tools/log-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE3E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6EAA6E,CAAC;IACzH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACzE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IAC7F,GAAG,oBAAoB;CACxB,CAAC,CAAA;AAUF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAmB;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;IAE9D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE;QAC9C,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;QACxB,GAAG,iBAAiB,CAAC,KAAK,CAAC;KAC5B,CAAC,CAAA;IAEF,8EAA8E;IAC9E,2EAA2E;IAC3E,0EAA0E;IAC1E,oCAAoC;IACpC,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;IACrE,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,6HAA6H;SACpJ,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,QAAQ;QACR,OAAO,EAAE,YAAY,KAAK,CAAC,KAAK,GAAG;KACpC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,8SAA8S;IAC3T,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,OAAO;CACjB,CAAA"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Marker tool: acknowledging a pre-edit decision.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* This tool no longer writes any override state. The pre-edit hook reads THIS
|
|
6
|
+
* call's presence in the session transcript (a `pre_edit_acknowledge` tool_use
|
|
7
|
+
* naming `decisionIds`) and suppresses those decisions from future blocks — see
|
|
8
|
+
* `src/pre-edit/acked-decisions.ts` and kawa.mcp decision 59ad77ed. That
|
|
9
|
+
* transcript read lives entirely in the hook's own session namespace, so it
|
|
10
|
+
* replaces the old token-keyed `pre-edit-cache`, which silently mis-routed the
|
|
11
|
+
* override across the hook/MCP process boundary after a session restart.
|
|
12
|
+
*
|
|
13
|
+
* The only side effect here is the acted-on value-metric; the acknowledgment
|
|
14
|
+
* itself is carried by the tool_use record, not by anything this handler does.
|
|
9
15
|
*/
|
|
10
16
|
export declare const preEditAcknowledgeSchema: z.ZodObject<{
|
|
11
17
|
forkAuthor: z.ZodOptional<z.ZodObject<{
|
|
@@ -23,7 +29,6 @@ export declare const preEditAcknowledgeSchema: z.ZodObject<{
|
|
|
23
29
|
}>>;
|
|
24
30
|
workspaceId: z.ZodOptional<z.ZodString>;
|
|
25
31
|
decisionIds: z.ZodArray<z.ZodString, "many">;
|
|
26
|
-
sessionToken: z.ZodOptional<z.ZodString>;
|
|
27
32
|
repoOrigin: z.ZodOptional<z.ZodString>;
|
|
28
33
|
repoPath: z.ZodOptional<z.ZodString>;
|
|
29
34
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -36,7 +41,6 @@ export declare const preEditAcknowledgeSchema: z.ZodObject<{
|
|
|
36
41
|
forkOrigin: string;
|
|
37
42
|
} | undefined;
|
|
38
43
|
workspaceId?: string | undefined;
|
|
39
|
-
sessionToken?: string | undefined;
|
|
40
44
|
}, {
|
|
41
45
|
decisionIds: string[];
|
|
42
46
|
repoOrigin?: string | undefined;
|
|
@@ -47,12 +51,10 @@ export declare const preEditAcknowledgeSchema: z.ZodObject<{
|
|
|
47
51
|
forkOrigin: string;
|
|
48
52
|
} | undefined;
|
|
49
53
|
workspaceId?: string | undefined;
|
|
50
|
-
sessionToken?: string | undefined;
|
|
51
54
|
}>;
|
|
52
55
|
export type PreEditAcknowledgeInput = z.infer<typeof preEditAcknowledgeSchema>;
|
|
53
56
|
export interface PreEditAcknowledgeResponse {
|
|
54
57
|
acknowledged: number;
|
|
55
|
-
cacheSize: number;
|
|
56
58
|
}
|
|
57
59
|
export declare function preEditAcknowledge(input: PreEditAcknowledgeInput): Promise<PreEditAcknowledgeResponse>;
|
|
58
60
|
export declare const preEditAcknowledgeTool: {
|
|
@@ -74,7 +76,6 @@ export declare const preEditAcknowledgeTool: {
|
|
|
74
76
|
}>>;
|
|
75
77
|
workspaceId: z.ZodOptional<z.ZodString>;
|
|
76
78
|
decisionIds: z.ZodArray<z.ZodString, "many">;
|
|
77
|
-
sessionToken: z.ZodOptional<z.ZodString>;
|
|
78
79
|
repoOrigin: z.ZodOptional<z.ZodString>;
|
|
79
80
|
repoPath: z.ZodOptional<z.ZodString>;
|
|
80
81
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -87,7 +88,6 @@ export declare const preEditAcknowledgeTool: {
|
|
|
87
88
|
forkOrigin: string;
|
|
88
89
|
} | undefined;
|
|
89
90
|
workspaceId?: string | undefined;
|
|
90
|
-
sessionToken?: string | undefined;
|
|
91
91
|
}, {
|
|
92
92
|
decisionIds: string[];
|
|
93
93
|
repoOrigin?: string | undefined;
|
|
@@ -98,7 +98,6 @@ export declare const preEditAcknowledgeTool: {
|
|
|
98
98
|
forkOrigin: string;
|
|
99
99
|
} | undefined;
|
|
100
100
|
workspaceId?: string | undefined;
|
|
101
|
-
sessionToken?: string | undefined;
|
|
102
101
|
}>;
|
|
103
102
|
handler: typeof preEditAcknowledge;
|
|
104
103
|
};
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { request, SESSION_ID } from '../services/muninn-ipc.js';
|
|
3
2
|
import { forkFieldsExtensions } from './_fork-fields.js';
|
|
4
3
|
import { resolveOrigin } from './resolve-origin.js';
|
|
5
4
|
import { emitActedOn } from '../telemetry.js';
|
|
6
5
|
/**
|
|
7
|
-
*
|
|
6
|
+
* Marker tool: acknowledging a pre-edit decision.
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* This tool no longer writes any override state. The pre-edit hook reads THIS
|
|
9
|
+
* call's presence in the session transcript (a `pre_edit_acknowledge` tool_use
|
|
10
|
+
* naming `decisionIds`) and suppresses those decisions from future blocks — see
|
|
11
|
+
* `src/pre-edit/acked-decisions.ts` and kawa.mcp decision 59ad77ed. That
|
|
12
|
+
* transcript read lives entirely in the hook's own session namespace, so it
|
|
13
|
+
* replaces the old token-keyed `pre-edit-cache`, which silently mis-routed the
|
|
14
|
+
* override across the hook/MCP process boundary after a session restart.
|
|
15
|
+
*
|
|
16
|
+
* The only side effect here is the acted-on value-metric; the acknowledgment
|
|
17
|
+
* itself is carried by the tool_use record, not by anything this handler does.
|
|
13
18
|
*/
|
|
14
19
|
export const preEditAcknowledgeSchema = z.object({
|
|
15
20
|
decisionIds: z
|
|
16
21
|
.array(z.string().min(1))
|
|
17
22
|
.min(1)
|
|
18
|
-
.describe('Decision IDs to acknowledge (
|
|
19
|
-
sessionToken: z
|
|
20
|
-
.string()
|
|
21
|
-
.optional()
|
|
22
|
-
.describe('Session scope for the force-override cache. Should match the sessionToken passed to pre_edit_decision_check. Defaults to the MCP server\'s SESSION_ID.'),
|
|
23
|
+
.describe('Decision IDs to acknowledge (suppress from pre-edit blocks for the rest of this session)'),
|
|
23
24
|
repoOrigin: z
|
|
24
25
|
.string()
|
|
25
26
|
.optional()
|
|
@@ -31,11 +32,6 @@ export const preEditAcknowledgeSchema = z.object({
|
|
|
31
32
|
...forkFieldsExtensions,
|
|
32
33
|
});
|
|
33
34
|
export async function preEditAcknowledge(input) {
|
|
34
|
-
const sessionToken = input.sessionToken ?? SESSION_ID;
|
|
35
|
-
const res = await request('pre-edit-cache', 'add', {
|
|
36
|
-
sessionToken,
|
|
37
|
-
decisionIds: input.decisionIds,
|
|
38
|
-
});
|
|
39
35
|
// Track-B acted-on (VALUE_METRICS Phase 2): an explicit acknowledge IS the
|
|
40
36
|
// agent acting on the surfaced pre_edit reasoning — one signal per decision
|
|
41
37
|
// id. Only attributable to a repo when an origin can be resolved (this tool
|
|
@@ -47,22 +43,19 @@ export async function preEditAcknowledge(input) {
|
|
|
47
43
|
}
|
|
48
44
|
catch { /* origin unresolvable — skip attribution */ }
|
|
49
45
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
cacheSize: typeof res?.total === 'number' ? res.total : 0,
|
|
53
|
-
};
|
|
46
|
+
// No IPC: the transcript record of this call is the acknowledgment.
|
|
47
|
+
return { acknowledged: input.decisionIds.length };
|
|
54
48
|
}
|
|
55
49
|
export const preEditAcknowledgeTool = {
|
|
56
50
|
name: 'pre_edit_acknowledge',
|
|
57
|
-
description: `
|
|
51
|
+
description: `Acknowledge pre-edit decisions so they stop blocking your edits for the rest of this session.
|
|
58
52
|
|
|
59
|
-
|
|
53
|
+
When a pre_edit_decision_check block fires and you judge the surfaced reasoning does NOT apply to your edit, call this with the surfaced decision IDs, then retry the edit — those decisions won't re-block this session. The acknowledgment is recorded by this call itself appearing in the session transcript, which the pre-edit hook reads; it needs no session token and is not affected by restarts.
|
|
60
54
|
|
|
61
|
-
|
|
55
|
+
For a PERSISTENT override across sessions (the reasoning is actually wrong or replaced), record a fork instead: \`record_decision(type: "fork", supersedes: [<id>])\`.
|
|
62
56
|
|
|
63
57
|
Returns:
|
|
64
|
-
- acknowledged: number of
|
|
65
|
-
- cacheSize: total IDs currently in the session override cache`,
|
|
58
|
+
- acknowledged: number of decision IDs acknowledged`,
|
|
66
59
|
inputSchema: preEditAcknowledgeSchema,
|
|
67
60
|
handler: preEditAcknowledge,
|
|
68
61
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-edit-acknowledge.js","sourceRoot":"","sources":["../../src/tools/pre-edit-acknowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pre-edit-acknowledge.js","sourceRoot":"","sources":["../../src/tools/pre-edit-acknowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,WAAW,EAAE,CAAC;SACX,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,0FAA0F,CAAC;IACvG,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yIAAyI,CAAC;IACtJ,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,2FAA2F,CAAC;IACxG,GAAG,oBAAoB;CACxB,CAAC,CAAA;AAQF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAA8B;IAE9B,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,0EAA0E;IAC1E,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAS,CAAC,CAAA;YAC/D,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QACxH,CAAC;QAAC,MAAM,CAAC,CAAC,4CAA4C,CAAC,CAAC;IAC1D,CAAC;IAED,oEAAoE;IACpE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAA;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE;;;;;;;oDAOqC;IAClD,WAAW,EAAE,wBAAwB;IACrC,OAAO,EAAE,kBAAkB;CAC5B,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kawacode/mcp",
|
|
3
|
-
"version": "6.9.
|
|
3
|
+
"version": "6.9.3",
|
|
4
4
|
"description": "Team-aware memory for Claude Code, Cursor, and other AI coding assistants — intent tracking, decision history, real-time team conflict detection.",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"dev": "tsc --watch",
|
|
24
24
|
"start": "node build/index.js",
|
|
25
25
|
"clean": "rm -rf build",
|
|
26
|
-
"test": "yarn build && node --test 'build/pre-edit/*.test.js' 'build/stop/*.test.js'",
|
|
26
|
+
"test": "yarn build && node --test 'build/pre-edit/*.test.js' 'build/stop/*.test.js' 'build/tools/*.test.js'",
|
|
27
27
|
"prepublishOnly": "npm run build"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|