@r3b1s/pi-repair-layer 0.2.1 → 0.3.0
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/README.md +159 -293
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/{index.ts → dist/index.js} +2 -1
- package/dist/index.js.map +1 -0
- package/dist/src/core.d.ts +8 -0
- package/dist/src/core.d.ts.map +1 -0
- package/dist/src/core.js +7 -0
- package/dist/src/core.js.map +1 -0
- package/dist/src/envelope.d.ts +21 -0
- package/dist/src/envelope.d.ts.map +1 -0
- package/dist/src/envelope.js +158 -0
- package/dist/src/envelope.js.map +1 -0
- package/dist/src/grammar-recovery.d.ts +105 -0
- package/dist/src/grammar-recovery.d.ts.map +1 -0
- package/dist/src/grammar-recovery.js +1052 -0
- package/dist/src/grammar-recovery.js.map +1 -0
- package/dist/src/grammar.d.ts +2 -0
- package/dist/src/grammar.d.ts.map +1 -0
- package/dist/src/grammar.js +2 -0
- package/dist/src/grammar.js.map +1 -0
- package/dist/src/index.d.ts +36 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +558 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lifecycle.d.ts +34 -0
- package/dist/src/lifecycle.d.ts.map +1 -0
- package/dist/src/lifecycle.js +133 -0
- package/dist/src/lifecycle.js.map +1 -0
- package/dist/src/pi.d.ts +19 -0
- package/dist/src/pi.d.ts.map +1 -0
- package/dist/src/pi.js +38 -0
- package/dist/src/pi.js.map +1 -0
- package/dist/src/pipeline.d.ts +10 -0
- package/dist/src/pipeline.d.ts.map +1 -0
- package/dist/src/pipeline.js +166 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/src/policy.d.ts +16 -0
- package/dist/src/policy.d.ts.map +1 -0
- package/dist/src/policy.js +31 -0
- package/dist/src/policy.js.map +1 -0
- package/dist/src/preprocess.d.ts +37 -0
- package/dist/src/preprocess.d.ts.map +1 -0
- package/dist/src/preprocess.js +216 -0
- package/dist/src/preprocess.js.map +1 -0
- package/dist/src/repair-engine.d.ts +91 -0
- package/dist/src/repair-engine.d.ts.map +1 -0
- package/dist/src/repair-engine.js +457 -0
- package/dist/src/repair-engine.js.map +1 -0
- package/dist/src/settings.d.ts +38 -0
- package/dist/src/settings.d.ts.map +1 -0
- package/dist/src/settings.js +87 -0
- package/dist/src/settings.js.map +1 -0
- package/dist/src/tables.d.ts +16 -0
- package/dist/src/tables.d.ts.map +1 -0
- package/dist/src/tables.js +302 -0
- package/dist/src/tables.js.map +1 -0
- package/dist/src/types.d.ts +52 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/value-strips.d.ts +52 -0
- package/dist/src/value-strips.d.ts.map +1 -0
- package/dist/src/value-strips.js +191 -0
- package/dist/src/value-strips.js.map +1 -0
- package/docs/how-it-works.md +227 -0
- package/docs/operations.md +141 -0
- package/docs/research.md +247 -0
- package/docs/tool-owner-integration.md +327 -0
- package/package.json +31 -6
- package/src/grammar-recovery.ts +0 -1269
- package/src/index.ts +0 -621
- package/src/repair-engine.ts +0 -518
- package/src/settings.ts +0 -95
- package/src/tables.ts +0 -184
- package/src/value-strips.ts +0 -218
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-repair-layer — tool-input repair for pi's built-in tools.
|
|
3
|
+
*
|
|
4
|
+
* Why this hooks where it does: pi's agent loop runs
|
|
5
|
+
*
|
|
6
|
+
* tool.prepareArguments(raw) -> validateToolArguments(...) -> tool_call event -> execute
|
|
7
|
+
*
|
|
8
|
+
* A validation failure short-circuits to an error result before the
|
|
9
|
+
* `tool_call` extension event ever fires, so event handlers can never see
|
|
10
|
+
* (let alone repair) malformed input. The only pre-validation seam is
|
|
11
|
+
* `prepareArguments`, which extensions reach by overriding a built-in tool
|
|
12
|
+
* with `pi.registerTool({ same name })`. Each override spreads the original
|
|
13
|
+
* tool definition — renderers, prompt metadata, execution — and replaces only
|
|
14
|
+
* `prepareArguments` (chaining the tool's own shim first) plus thin wrappers
|
|
15
|
+
* around `execute` and `renderResult`.
|
|
16
|
+
*
|
|
17
|
+
* Feedback paths per repaired call:
|
|
18
|
+
* - Model: `<repair_note>` lines prepended to the tool result content, seen
|
|
19
|
+
* on the very next inference step of the same agent turn.
|
|
20
|
+
* - User: a `🔨 ✓ input repaired (...)` line appended to the tool row in the
|
|
21
|
+
* TUI (plus the note text if enabled) — toggle both via /repair-settings.
|
|
22
|
+
* - Telemetry: local-only JSONL, summarized by /repair-stats.
|
|
23
|
+
*
|
|
24
|
+
* Unrepairable input (still invalid after repairs) raises a model-readable
|
|
25
|
+
* retry message instead of passing through, because pi's Value.Convert would
|
|
26
|
+
* otherwise coerce it into garbage (null -> "null") and execute it anyway.
|
|
27
|
+
*
|
|
28
|
+
* Env:
|
|
29
|
+
* PI_TOOL_REPAIR_LOG=1 log repair decisions to stderr
|
|
30
|
+
* PI_TOOL_REPAIR_TELEMETRY=off disable telemetry (or =<path> to relocate it)
|
|
31
|
+
* PI_TOOL_REPAIR_PASSTHROUGH=1 on unrepairable input, defer to pi's native
|
|
32
|
+
* validation instead of raising the retry error
|
|
33
|
+
*/
|
|
34
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
35
|
+
import { dirname, join } from "node:path";
|
|
36
|
+
import { createBashToolDefinition, createEditToolDefinition, createFindToolDefinition, createGrepToolDefinition, createLsToolDefinition, createReadToolDefinition, createWriteToolDefinition, getAgentDir, } from "@earendil-works/pi-coding-agent";
|
|
37
|
+
import { wrapTextWithAnsi } from "@earendil-works/pi-tui";
|
|
38
|
+
import { modelLeaksGrammar, recoverGrammarLeaks, } from "./grammar-recovery.js";
|
|
39
|
+
import { attachRepairNotes, RepairLifecycle, } from "./lifecycle.js";
|
|
40
|
+
import { runRepairPipeline } from "./pipeline.js";
|
|
41
|
+
import { loadDisplaySettings, saveDisplaySettings, } from "./settings.js";
|
|
42
|
+
import { PIPELINE_PREPROCESSORS, REPAIR_CONFIGS } from "./tables.js";
|
|
43
|
+
const BUILTIN_FACTORIES = {
|
|
44
|
+
read: createReadToolDefinition,
|
|
45
|
+
bash: createBashToolDefinition,
|
|
46
|
+
edit: createEditToolDefinition,
|
|
47
|
+
write: createWriteToolDefinition,
|
|
48
|
+
grep: createGrepToolDefinition,
|
|
49
|
+
find: createFindToolDefinition,
|
|
50
|
+
ls: createLsToolDefinition,
|
|
51
|
+
};
|
|
52
|
+
const REPAIR_ENTRY_TYPE = "tool-repair";
|
|
53
|
+
function telemetryPath() {
|
|
54
|
+
const override = process.env.PI_TOOL_REPAIR_TELEMETRY;
|
|
55
|
+
if (override === "off" || override === "0" || override === "false")
|
|
56
|
+
return undefined;
|
|
57
|
+
if (override)
|
|
58
|
+
return override;
|
|
59
|
+
return join(getAgentDir(), "tool-repair", "telemetry.jsonl");
|
|
60
|
+
}
|
|
61
|
+
function diagnosticsEnabled() {
|
|
62
|
+
const value = process.env.PI_TOOL_REPAIR_LOG;
|
|
63
|
+
return (value !== undefined && value !== "" && value !== "0" && value !== "false");
|
|
64
|
+
}
|
|
65
|
+
function passthroughEnabled() {
|
|
66
|
+
const value = process.env.PI_TOOL_REPAIR_PASSTHROUGH;
|
|
67
|
+
return (value !== undefined && value !== "" && value !== "0" && value !== "false");
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Wraps the built-in result component and appends the repair indicator lines.
|
|
71
|
+
* The inner component is threaded back through `context.lastComponent` on
|
|
72
|
+
* re-renders because built-in renderers reuse it (`lastComponent ?? new Text`)
|
|
73
|
+
* without instanceof checks.
|
|
74
|
+
*/
|
|
75
|
+
class RepairIndicatorComponent {
|
|
76
|
+
inner;
|
|
77
|
+
info;
|
|
78
|
+
theme;
|
|
79
|
+
settings;
|
|
80
|
+
render(width) {
|
|
81
|
+
const lines = this.inner?.render(width) ?? [];
|
|
82
|
+
if (!this.info || !this.settings?.showIndicator)
|
|
83
|
+
return lines;
|
|
84
|
+
const muted = (text) => {
|
|
85
|
+
try {
|
|
86
|
+
return this.theme?.fg ? this.theme.fg("muted", text) : text;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return text;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const added = wrapTextWithAnsi(muted(`🔨 ✓ input repaired (${this.info.rules.join(", ")})`), width);
|
|
93
|
+
if (this.settings.showNotes) {
|
|
94
|
+
for (const note of this.info.notes) {
|
|
95
|
+
added.push(...wrapTextWithAnsi(muted(` ↳ ${note}`), width));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return [...lines, ...added];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export default function toolRepairExtension(pi) {
|
|
102
|
+
let currentModelId;
|
|
103
|
+
let registeredCwd;
|
|
104
|
+
const displaySettings = loadDisplaySettings();
|
|
105
|
+
const lifecycle = new RepairLifecycle();
|
|
106
|
+
const repairInfoByCallId = new Map();
|
|
107
|
+
const stashRepair = (tool, args, rules, notes, stages, fingerprint) => {
|
|
108
|
+
lifecycle.enqueue(tool, args, {
|
|
109
|
+
rules,
|
|
110
|
+
notes,
|
|
111
|
+
stages,
|
|
112
|
+
profile: displaySettings.policyProfile,
|
|
113
|
+
model: currentModelId,
|
|
114
|
+
outcome: "repaired",
|
|
115
|
+
fingerprint,
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
const logTelemetry = (record) => {
|
|
119
|
+
const path = telemetryPath();
|
|
120
|
+
if (!path)
|
|
121
|
+
return;
|
|
122
|
+
try {
|
|
123
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
124
|
+
appendFileSync(path, `${JSON.stringify(record)}\n`);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Telemetry must never break tool execution.
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
const diag = (tool, result) => {
|
|
131
|
+
if (!diagnosticsEnabled())
|
|
132
|
+
return;
|
|
133
|
+
const rules = result.changes.length > 0
|
|
134
|
+
? [...new Set(result.changes.map((change) => change.ruleId))].join(",")
|
|
135
|
+
: "none";
|
|
136
|
+
process.stderr.write(`[pi-repair] tool=${tool} outcome=${result.outcome} rules=${rules}${result.issueSummary ? ` issues=${result.issueSummary}` : ""}\n`);
|
|
137
|
+
};
|
|
138
|
+
const registerOverrides = (cwd) => {
|
|
139
|
+
if (registeredCwd === cwd)
|
|
140
|
+
return;
|
|
141
|
+
registeredCwd = cwd;
|
|
142
|
+
for (const [name, factory] of Object.entries(BUILTIN_FACTORIES)) {
|
|
143
|
+
const original = factory(cwd);
|
|
144
|
+
const config = REPAIR_CONFIGS[name];
|
|
145
|
+
const originalPrepare = original.prepareArguments;
|
|
146
|
+
const originalRenderResult = original.renderResult?.bind(original);
|
|
147
|
+
pi.registerTool({
|
|
148
|
+
...original,
|
|
149
|
+
prepareArguments(raw) {
|
|
150
|
+
const result = runRepairPipeline({
|
|
151
|
+
input: raw,
|
|
152
|
+
config: {
|
|
153
|
+
toolName: name,
|
|
154
|
+
schema: original.parameters,
|
|
155
|
+
policy: displaySettings.policyProfile,
|
|
156
|
+
modelId: currentModelId,
|
|
157
|
+
ownerPrepareArguments: originalPrepare,
|
|
158
|
+
preprocessors: PIPELINE_PREPROCESSORS[name],
|
|
159
|
+
legacyConfig: config,
|
|
160
|
+
onObservation(observation) {
|
|
161
|
+
logTelemetry({
|
|
162
|
+
ts: new Date().toISOString(),
|
|
163
|
+
tool: name,
|
|
164
|
+
model: currentModelId,
|
|
165
|
+
outcome: "observed",
|
|
166
|
+
rules: [observation.ruleId],
|
|
167
|
+
channel: "tool",
|
|
168
|
+
profile: displaySettings.policyProfile,
|
|
169
|
+
stages: [observation.stage],
|
|
170
|
+
observation: true,
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
if (result.outcome === "valid")
|
|
176
|
+
return result.args;
|
|
177
|
+
diag(name, result);
|
|
178
|
+
const rules = [
|
|
179
|
+
...new Set(result.changes.map((change) => change.ruleId)),
|
|
180
|
+
];
|
|
181
|
+
const notes = result.changes.map((change) => change.note);
|
|
182
|
+
const stages = [
|
|
183
|
+
...new Set(result.changes.map((change) => change.stage)),
|
|
184
|
+
];
|
|
185
|
+
logTelemetry({
|
|
186
|
+
ts: new Date().toISOString(),
|
|
187
|
+
tool: name,
|
|
188
|
+
model: currentModelId,
|
|
189
|
+
outcome: result.outcome,
|
|
190
|
+
rules,
|
|
191
|
+
issues: result.issueSummary,
|
|
192
|
+
fingerprint: result.fingerprint,
|
|
193
|
+
profile: result.policy,
|
|
194
|
+
stages,
|
|
195
|
+
});
|
|
196
|
+
if (result.outcome === "repaired") {
|
|
197
|
+
stashRepair(name, result.args, rules, notes, stages, result.fingerprint);
|
|
198
|
+
return result.args;
|
|
199
|
+
}
|
|
200
|
+
// Unrepairable. Raise a model-readable retry error: pi's loop turns
|
|
201
|
+
// it into an error tool result. Passing the input through instead
|
|
202
|
+
// would let Value.Convert coerce it (null -> "null") and execute.
|
|
203
|
+
if (result.retryMessage && !passthroughEnabled()) {
|
|
204
|
+
throw new Error(result.retryMessage);
|
|
205
|
+
}
|
|
206
|
+
return raw;
|
|
207
|
+
},
|
|
208
|
+
...(originalRenderResult
|
|
209
|
+
? {
|
|
210
|
+
renderResult(result, options, theme, context) {
|
|
211
|
+
const info = repairInfoByCallId.get(context.toolCallId);
|
|
212
|
+
const last = context.lastComponent;
|
|
213
|
+
const wrapper = last instanceof RepairIndicatorComponent
|
|
214
|
+
? last
|
|
215
|
+
: info
|
|
216
|
+
? new RepairIndicatorComponent()
|
|
217
|
+
: undefined;
|
|
218
|
+
if (!wrapper)
|
|
219
|
+
return originalRenderResult(result, options, theme, context);
|
|
220
|
+
wrapper.inner = originalRenderResult(result, options, theme, {
|
|
221
|
+
...context,
|
|
222
|
+
lastComponent: wrapper.inner,
|
|
223
|
+
});
|
|
224
|
+
wrapper.info = info;
|
|
225
|
+
wrapper.theme = theme;
|
|
226
|
+
wrapper.settings = displaySettings;
|
|
227
|
+
return wrapper;
|
|
228
|
+
},
|
|
229
|
+
}
|
|
230
|
+
: {}),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
235
|
+
currentModelId = ctx.model?.id;
|
|
236
|
+
registerOverrides(ctx.cwd);
|
|
237
|
+
// Restore indicators for repairs recorded earlier in this session
|
|
238
|
+
// (survives /reload and session resume).
|
|
239
|
+
try {
|
|
240
|
+
for (const entry of ctx.sessionManager.getEntries()) {
|
|
241
|
+
const e = entry;
|
|
242
|
+
if (e.type === "custom" &&
|
|
243
|
+
e.customType === REPAIR_ENTRY_TYPE &&
|
|
244
|
+
typeof e.data?.toolCallId === "string") {
|
|
245
|
+
repairInfoByCallId.set(e.data.toolCallId, {
|
|
246
|
+
rules: Array.isArray(e.data.rules) ? e.data.rules : [],
|
|
247
|
+
notes: [],
|
|
248
|
+
stages: Array.isArray(e.data.stages) ? e.data.stages : [],
|
|
249
|
+
profile: typeof e.data.profile === "string" ? e.data.profile : undefined,
|
|
250
|
+
model: typeof e.data.model === "string" ? e.data.model : undefined,
|
|
251
|
+
outcome: e.data.outcome === "repaired" || e.data.outcome === "recovered"
|
|
252
|
+
? e.data.outcome
|
|
253
|
+
: undefined,
|
|
254
|
+
fingerprint: typeof e.data.fingerprint === "string"
|
|
255
|
+
? e.data.fingerprint
|
|
256
|
+
: undefined,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
// Older pi versions may not expose entries here; indicators just start fresh.
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
pi.on("model_select", async (event, ctx) => {
|
|
266
|
+
currentModelId =
|
|
267
|
+
event.model?.id ??
|
|
268
|
+
ctx.model?.id ??
|
|
269
|
+
currentModelId;
|
|
270
|
+
});
|
|
271
|
+
pi.on("tool_call", async (event) => {
|
|
272
|
+
const repair = lifecycle.correlate(event.toolName, event.input, event.toolCallId);
|
|
273
|
+
if (!repair)
|
|
274
|
+
return undefined;
|
|
275
|
+
repairInfoByCallId.set(event.toolCallId, repair);
|
|
276
|
+
try {
|
|
277
|
+
pi.appendEntry(REPAIR_ENTRY_TYPE, {
|
|
278
|
+
toolCallId: event.toolCallId,
|
|
279
|
+
tool: event.toolName,
|
|
280
|
+
rules: repair.rules,
|
|
281
|
+
stages: repair.stages,
|
|
282
|
+
profile: repair.profile,
|
|
283
|
+
model: repair.model,
|
|
284
|
+
outcome: repair.outcome,
|
|
285
|
+
fingerprint: repair.fingerprint,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// Persistence is best-effort and intentionally excludes values/notes.
|
|
290
|
+
}
|
|
291
|
+
return undefined;
|
|
292
|
+
});
|
|
293
|
+
pi.on("tool_result", async (event) => {
|
|
294
|
+
const repair = lifecycle.take(event.toolCallId);
|
|
295
|
+
if (!repair || repair.notes.length === 0)
|
|
296
|
+
return undefined;
|
|
297
|
+
return {
|
|
298
|
+
content: attachRepairNotes(event.content, repair.notes),
|
|
299
|
+
};
|
|
300
|
+
});
|
|
301
|
+
pi.on("session_shutdown", async () => {
|
|
302
|
+
lifecycle.clear();
|
|
303
|
+
repairInfoByCallId.clear();
|
|
304
|
+
});
|
|
305
|
+
const safeGetActiveTools = () => {
|
|
306
|
+
try {
|
|
307
|
+
return (pi.getActiveTools?.() ?? []);
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return [];
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
// Grammar-leak recovery: on message_end, strip tool-call grammar the model
|
|
314
|
+
// printed as text and — in recover mode — promote it to real toolCalls that
|
|
315
|
+
// execute the same turn (docs/research.md Claim 4). Promotion is gated on
|
|
316
|
+
// stopReason "stop" (Claim 7); stripping is allowed on any stopReason.
|
|
317
|
+
pi.on("message_end", async (event, _ctx) => {
|
|
318
|
+
const mode = displaySettings.grammarRecovery;
|
|
319
|
+
if (mode === "off")
|
|
320
|
+
return undefined;
|
|
321
|
+
const message = event
|
|
322
|
+
.message;
|
|
323
|
+
if (message?.role !== "assistant")
|
|
324
|
+
return undefined;
|
|
325
|
+
if (!modelLeaksGrammar(currentModelId))
|
|
326
|
+
return undefined;
|
|
327
|
+
const allowed = displaySettings.grammarAllowedTools;
|
|
328
|
+
const knownTools = new Set(allowed.length > 0 ? allowed : safeGetActiveTools());
|
|
329
|
+
const result = recoverGrammarLeaks(message, {
|
|
330
|
+
mode,
|
|
331
|
+
knownTools,
|
|
332
|
+
requireKnownTool: true,
|
|
333
|
+
unknownToolText: displaySettings.unknownGrammarText,
|
|
334
|
+
});
|
|
335
|
+
if (!result.changed) {
|
|
336
|
+
if (result.observed) {
|
|
337
|
+
logTelemetry({
|
|
338
|
+
ts: new Date().toISOString(),
|
|
339
|
+
model: currentModelId,
|
|
340
|
+
outcome: "observed",
|
|
341
|
+
rules: ["grammarObserve"],
|
|
342
|
+
channel: "message",
|
|
343
|
+
grammar: result.detectedGrammars.join(",") || undefined,
|
|
344
|
+
profile: displaySettings.policyProfile,
|
|
345
|
+
stages: ["grammar"],
|
|
346
|
+
observation: true,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
351
|
+
if (result.promoted) {
|
|
352
|
+
// Tool-keyed telemetry plus direct call-ID association lets the global
|
|
353
|
+
// result hook annotate built-in and cooperating custom-tool calls.
|
|
354
|
+
for (const [index, call] of result.recoveredCalls.entries()) {
|
|
355
|
+
const note = `Recovered a leaked ${call.grammar} tool call for "${call.name}" that the model printed as text instead of emitting a real tool call. Emit a proper tool call next time.`;
|
|
356
|
+
const callId = result.promotedCallIds[index];
|
|
357
|
+
if (callId) {
|
|
358
|
+
const feedback = {
|
|
359
|
+
rules: [`grammarRecovery:${call.grammar}`],
|
|
360
|
+
notes: [note],
|
|
361
|
+
stages: ["grammar"],
|
|
362
|
+
profile: displaySettings.policyProfile,
|
|
363
|
+
model: currentModelId,
|
|
364
|
+
outcome: "recovered",
|
|
365
|
+
};
|
|
366
|
+
lifecycle.associate(callId, feedback);
|
|
367
|
+
repairInfoByCallId.set(callId, feedback);
|
|
368
|
+
try {
|
|
369
|
+
pi.appendEntry(REPAIR_ENTRY_TYPE, {
|
|
370
|
+
toolCallId: callId,
|
|
371
|
+
tool: call.name,
|
|
372
|
+
rules: feedback.rules,
|
|
373
|
+
stages: feedback.stages,
|
|
374
|
+
profile: feedback.profile,
|
|
375
|
+
model: feedback.model,
|
|
376
|
+
outcome: feedback.outcome,
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
// Persistence is best-effort and intentionally excludes values/notes.
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
logTelemetry({
|
|
384
|
+
ts: new Date().toISOString(),
|
|
385
|
+
tool: call.name,
|
|
386
|
+
model: currentModelId,
|
|
387
|
+
outcome: "recovered",
|
|
388
|
+
rules: [`grammarRecovery:${call.grammar}`],
|
|
389
|
+
grammar: call.grammar,
|
|
390
|
+
profile: displaySettings.policyProfile,
|
|
391
|
+
stages: ["grammar"],
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
// Strip-only: no tool to key on. One message-channel event naming the
|
|
397
|
+
// grammar families that were stripped.
|
|
398
|
+
logTelemetry({
|
|
399
|
+
ts: new Date().toISOString(),
|
|
400
|
+
model: currentModelId,
|
|
401
|
+
outcome: "stripped",
|
|
402
|
+
rules: ["grammarStrip"],
|
|
403
|
+
channel: "message",
|
|
404
|
+
grammar: result.strippedGrammars.length > 0
|
|
405
|
+
? result.strippedGrammars.join(",")
|
|
406
|
+
: undefined,
|
|
407
|
+
profile: displaySettings.policyProfile,
|
|
408
|
+
stages: ["grammar"],
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
// The replacement keeps the original assistant role; pi types the message
|
|
412
|
+
// as its own AgentMessage union, so hand it back through `any`.
|
|
413
|
+
return { message: result.message };
|
|
414
|
+
});
|
|
415
|
+
const nextGrammarMode = (mode) => mode === "off"
|
|
416
|
+
? "observe"
|
|
417
|
+
: mode === "observe"
|
|
418
|
+
? "strip"
|
|
419
|
+
: mode === "strip"
|
|
420
|
+
? "recover"
|
|
421
|
+
: "off";
|
|
422
|
+
const nextProfile = (profile) => profile === "conservative"
|
|
423
|
+
? "adaptive"
|
|
424
|
+
: profile === "adaptive"
|
|
425
|
+
? "recover"
|
|
426
|
+
: "conservative";
|
|
427
|
+
pi.registerCommand("repair-settings", {
|
|
428
|
+
description: "Toggle the tool-repair indicator (🔨), repair-note display, and grammar recovery",
|
|
429
|
+
handler: async (_args, ctx) => {
|
|
430
|
+
for (;;) {
|
|
431
|
+
const profileLabel = `Policy profile: ${displaySettings.policyProfile} — conservative (observe) | adaptive (strip) | recover (promote)`;
|
|
432
|
+
const indicatorLabel = `Repair indicator (🔨 ✓): ${displaySettings.showIndicator ? "on" : "off"} — toggle`;
|
|
433
|
+
const notesLabel = `Repair note text beneath indicator: ${displaySettings.showNotes ? "on" : "off"} — toggle`;
|
|
434
|
+
const grammarLabel = `Grammar override: ${displaySettings.grammarRecovery} — cycle (off → observe → strip → recover)`;
|
|
435
|
+
const unknownLabel = `Unknown-tool grammar text: ${displaySettings.unknownGrammarText} — never executable`;
|
|
436
|
+
const choice = await ctx.ui.select("Tool repair display settings", [
|
|
437
|
+
profileLabel,
|
|
438
|
+
indicatorLabel,
|
|
439
|
+
notesLabel,
|
|
440
|
+
grammarLabel,
|
|
441
|
+
unknownLabel,
|
|
442
|
+
"Close",
|
|
443
|
+
]);
|
|
444
|
+
if (choice === undefined || choice === "Close")
|
|
445
|
+
break;
|
|
446
|
+
if (choice === profileLabel) {
|
|
447
|
+
displaySettings.policyProfile = nextProfile(displaySettings.policyProfile);
|
|
448
|
+
displaySettings.grammarRecovery =
|
|
449
|
+
displaySettings.policyProfile === "conservative"
|
|
450
|
+
? "observe"
|
|
451
|
+
: displaySettings.policyProfile === "recover"
|
|
452
|
+
? "recover"
|
|
453
|
+
: "strip";
|
|
454
|
+
}
|
|
455
|
+
if (choice === indicatorLabel)
|
|
456
|
+
displaySettings.showIndicator = !displaySettings.showIndicator;
|
|
457
|
+
if (choice === notesLabel)
|
|
458
|
+
displaySettings.showNotes = !displaySettings.showNotes;
|
|
459
|
+
if (choice === grammarLabel)
|
|
460
|
+
displaySettings.grammarRecovery = nextGrammarMode(displaySettings.grammarRecovery);
|
|
461
|
+
if (choice === unknownLabel)
|
|
462
|
+
displaySettings.unknownGrammarText =
|
|
463
|
+
displaySettings.unknownGrammarText === "preserve"
|
|
464
|
+
? "strip"
|
|
465
|
+
: "preserve";
|
|
466
|
+
saveDisplaySettings(displaySettings);
|
|
467
|
+
}
|
|
468
|
+
ctx.ui.notify(`Repair display: indicator ${displaySettings.showIndicator ? "on" : "off"}, notes ${displaySettings.showNotes ? "on" : "off"}, policy ${displaySettings.policyProfile}, grammar ${displaySettings.grammarRecovery}, unknown text ${displaySettings.unknownGrammarText} (applies from now on)`, "info");
|
|
469
|
+
},
|
|
470
|
+
});
|
|
471
|
+
pi.registerCommand("repair-stats", {
|
|
472
|
+
description: "Summarize tool-input repair telemetry",
|
|
473
|
+
handler: async (_args, ctx) => {
|
|
474
|
+
const path = telemetryPath();
|
|
475
|
+
if (!path || !existsSync(path)) {
|
|
476
|
+
ctx.ui.notify("No repair telemetry recorded yet.", "info");
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
const records = [];
|
|
480
|
+
for (const line of readFileSync(path, "utf-8").split("\n")) {
|
|
481
|
+
if (!line.trim())
|
|
482
|
+
continue;
|
|
483
|
+
try {
|
|
484
|
+
records.push(JSON.parse(line));
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
// skip malformed lines
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
if (records.length === 0) {
|
|
491
|
+
ctx.ui.notify("No repair telemetry recorded yet.", "info");
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
const emptyCounts = () => ({
|
|
495
|
+
repaired: 0,
|
|
496
|
+
unrepairable: 0,
|
|
497
|
+
recovered: 0,
|
|
498
|
+
});
|
|
499
|
+
const byTool = new Map();
|
|
500
|
+
const byRule = new Map();
|
|
501
|
+
const byModel = new Map();
|
|
502
|
+
const byGrammar = new Map();
|
|
503
|
+
let stripOnlyEvents = 0;
|
|
504
|
+
let toolEvents = 0;
|
|
505
|
+
const bump = (counts, outcome) => {
|
|
506
|
+
if (outcome === "repaired" ||
|
|
507
|
+
outcome === "unrepairable" ||
|
|
508
|
+
outcome === "recovered")
|
|
509
|
+
counts[outcome] += 1;
|
|
510
|
+
};
|
|
511
|
+
for (const record of records) {
|
|
512
|
+
// Records without an explicit channel are legacy tool-channel repairs.
|
|
513
|
+
if (record.channel === "message") {
|
|
514
|
+
stripOnlyEvents += 1;
|
|
515
|
+
for (const family of (record.grammar ?? "unknown").split(","))
|
|
516
|
+
byGrammar.set(family, (byGrammar.get(family) ?? 0) + 1);
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
toolEvents += 1;
|
|
520
|
+
const key = record.tool ?? "unknown";
|
|
521
|
+
const tool = byTool.get(key) ?? emptyCounts();
|
|
522
|
+
bump(tool, record.outcome);
|
|
523
|
+
byTool.set(key, tool);
|
|
524
|
+
const model = byModel.get(record.model ?? "unknown") ?? emptyCounts();
|
|
525
|
+
bump(model, record.outcome);
|
|
526
|
+
byModel.set(record.model ?? "unknown", model);
|
|
527
|
+
}
|
|
528
|
+
for (const rule of record.rules)
|
|
529
|
+
byRule.set(rule, (byRule.get(rule) ?? 0) + 1);
|
|
530
|
+
}
|
|
531
|
+
const fmt = (c) => `${c.repaired} repaired, ${c.recovered} recovered, ${c.unrepairable} unrepairable`;
|
|
532
|
+
const lines = [
|
|
533
|
+
`Tool repair telemetry (${records.length} events: ${toolEvents} tool, ${stripOnlyEvents} grammar strip-only)`,
|
|
534
|
+
"",
|
|
535
|
+
"By tool:",
|
|
536
|
+
];
|
|
537
|
+
for (const [tool, counts] of [...byTool].sort((a, b) => b[1].repaired + b[1].recovered - (a[1].repaired + a[1].recovered))) {
|
|
538
|
+
lines.push(` ${tool}: ${fmt(counts)}`);
|
|
539
|
+
}
|
|
540
|
+
lines.push("", "By model:");
|
|
541
|
+
for (const [model, counts] of [...byModel].sort((a, b) => b[1].repaired + b[1].recovered - (a[1].repaired + a[1].recovered))) {
|
|
542
|
+
lines.push(` ${model}: ${fmt(counts)}`);
|
|
543
|
+
}
|
|
544
|
+
if (byGrammar.size > 0) {
|
|
545
|
+
lines.push("", "Grammar strip-only events (message channel):");
|
|
546
|
+
for (const [family, count] of [...byGrammar].sort((a, b) => b[1] - a[1])) {
|
|
547
|
+
lines.push(` ${family}: ${count}`);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
lines.push("", "Rules fired:");
|
|
551
|
+
for (const [rule, count] of [...byRule].sort((a, b) => b[1] - a[1])) {
|
|
552
|
+
lines.push(` ${rule}: ${count}`);
|
|
553
|
+
}
|
|
554
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
555
|
+
},
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface RepairFeedback {
|
|
2
|
+
rules: string[];
|
|
3
|
+
notes: string[];
|
|
4
|
+
stages?: string[];
|
|
5
|
+
profile?: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
outcome?: "repaired" | "recovered";
|
|
8
|
+
fingerprint?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RepairLifecycleOptions {
|
|
11
|
+
ttlMs?: number;
|
|
12
|
+
maxPending?: number;
|
|
13
|
+
maxAssociated?: number;
|
|
14
|
+
now?: () => number;
|
|
15
|
+
}
|
|
16
|
+
export declare function stableSerialize(value: unknown): string;
|
|
17
|
+
export declare class RepairLifecycle {
|
|
18
|
+
#private;
|
|
19
|
+
constructor(options?: RepairLifecycleOptions);
|
|
20
|
+
enqueue(toolName: string, args: unknown, feedback: RepairFeedback): void;
|
|
21
|
+
correlate(toolName: string, args: unknown, toolCallId: string): RepairFeedback | undefined;
|
|
22
|
+
associate(toolCallId: string, feedback: RepairFeedback): void;
|
|
23
|
+
peek(toolCallId: string): RepairFeedback | undefined;
|
|
24
|
+
take(toolCallId: string): RepairFeedback | undefined;
|
|
25
|
+
cleanup(): void;
|
|
26
|
+
clear(): void;
|
|
27
|
+
get pendingCount(): number;
|
|
28
|
+
}
|
|
29
|
+
export declare function formatRepairNotes(notes: readonly string[]): string;
|
|
30
|
+
export declare function attachRepairNotes<T extends {
|
|
31
|
+
type: string;
|
|
32
|
+
text?: string;
|
|
33
|
+
}>(content: readonly T[], notes: readonly string[]): T[];
|
|
34
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAOD,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAcD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMtD;AAED,qBAAa,eAAe;;gBAWd,OAAO,GAAE,sBAA2B;IAOhD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAYxE,SAAS,CACP,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,MAAM,GACjB,cAAc,GAAG,SAAS;IAoB7B,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAQ7D,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAKpD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAiBpD,OAAO,IAAI,IAAI;IAUf,KAAK,IAAI,IAAI;IAKb,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAElE;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACzE,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,CAAC,EAAE,CAiBL"}
|