@r3b1s/pi-repair-layer 0.2.1 → 0.4.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.
Files changed (76) hide show
  1. package/README.md +173 -293
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/{index.ts → dist/index.js} +2 -1
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/core.d.ts +8 -0
  7. package/dist/src/core.d.ts.map +1 -0
  8. package/dist/src/core.js +7 -0
  9. package/dist/src/core.js.map +1 -0
  10. package/dist/src/envelope.d.ts +21 -0
  11. package/dist/src/envelope.d.ts.map +1 -0
  12. package/dist/src/envelope.js +158 -0
  13. package/dist/src/envelope.js.map +1 -0
  14. package/dist/src/grammar-recovery.d.ts +105 -0
  15. package/dist/src/grammar-recovery.d.ts.map +1 -0
  16. package/dist/src/grammar-recovery.js +1052 -0
  17. package/dist/src/grammar-recovery.js.map +1 -0
  18. package/dist/src/grammar.d.ts +2 -0
  19. package/dist/src/grammar.d.ts.map +1 -0
  20. package/dist/src/grammar.js +2 -0
  21. package/dist/src/grammar.js.map +1 -0
  22. package/dist/src/index.d.ts +36 -0
  23. package/dist/src/index.d.ts.map +1 -0
  24. package/dist/src/index.js +558 -0
  25. package/dist/src/index.js.map +1 -0
  26. package/dist/src/lifecycle.d.ts +34 -0
  27. package/dist/src/lifecycle.d.ts.map +1 -0
  28. package/dist/src/lifecycle.js +133 -0
  29. package/dist/src/lifecycle.js.map +1 -0
  30. package/dist/src/pi.d.ts +19 -0
  31. package/dist/src/pi.d.ts.map +1 -0
  32. package/dist/src/pi.js +38 -0
  33. package/dist/src/pi.js.map +1 -0
  34. package/dist/src/pipeline.d.ts +10 -0
  35. package/dist/src/pipeline.d.ts.map +1 -0
  36. package/dist/src/pipeline.js +166 -0
  37. package/dist/src/pipeline.js.map +1 -0
  38. package/dist/src/policy.d.ts +16 -0
  39. package/dist/src/policy.d.ts.map +1 -0
  40. package/dist/src/policy.js +31 -0
  41. package/dist/src/policy.js.map +1 -0
  42. package/dist/src/preprocess.d.ts +37 -0
  43. package/dist/src/preprocess.d.ts.map +1 -0
  44. package/dist/src/preprocess.js +216 -0
  45. package/dist/src/preprocess.js.map +1 -0
  46. package/dist/src/repair-engine.d.ts +91 -0
  47. package/dist/src/repair-engine.d.ts.map +1 -0
  48. package/dist/src/repair-engine.js +457 -0
  49. package/dist/src/repair-engine.js.map +1 -0
  50. package/dist/src/settings.d.ts +38 -0
  51. package/dist/src/settings.d.ts.map +1 -0
  52. package/dist/src/settings.js +87 -0
  53. package/dist/src/settings.js.map +1 -0
  54. package/dist/src/tables.d.ts +16 -0
  55. package/dist/src/tables.d.ts.map +1 -0
  56. package/dist/src/tables.js +302 -0
  57. package/dist/src/tables.js.map +1 -0
  58. package/dist/src/types.d.ts +52 -0
  59. package/dist/src/types.d.ts.map +1 -0
  60. package/dist/src/types.js +2 -0
  61. package/dist/src/types.js.map +1 -0
  62. package/dist/src/value-strips.d.ts +52 -0
  63. package/dist/src/value-strips.d.ts.map +1 -0
  64. package/dist/src/value-strips.js +191 -0
  65. package/dist/src/value-strips.js.map +1 -0
  66. package/docs/how-it-works.md +227 -0
  67. package/docs/operations.md +141 -0
  68. package/docs/research.md +390 -0
  69. package/docs/tool-owner-integration.md +557 -0
  70. package/package.json +31 -6
  71. package/src/grammar-recovery.ts +0 -1269
  72. package/src/index.ts +0 -621
  73. package/src/repair-engine.ts +0 -518
  74. package/src/settings.ts +0 -95
  75. package/src/tables.ts +0 -184
  76. package/src/value-strips.ts +0 -218
@@ -0,0 +1,457 @@
1
+ /**
2
+ * Validate-then-repair engine for LLM tool-call inputs.
3
+ *
4
+ * Design (matching the publicly described behavior of commandcode's repair layer):
5
+ *
6
+ * - Strictly valid inputs are never touched: the fast path is a plain
7
+ * `Value.Check` and returns the original input by reference.
8
+ * - On failure, the validator's own issue list localizes the damage. Repairs are
9
+ * attempted only at the exact paths the schema disagreed with, in a fixed
10
+ * order (JSON-array parsing must run before bare-string wrapping, or
11
+ * `'["a","b"]'` becomes `['["a","b"]']`).
12
+ * - Every mutation produces a model-facing note so the model can learn the real
13
+ * contract on the next turn. Transparency over silent magic.
14
+ *
15
+ * The strict check deliberately runs BEFORE TypeBox's `Value.Convert` (which pi
16
+ * applies during validation), because Convert silently corrupts exactly the
17
+ * inputs this layer exists to fix: `'["a","b"]'` for an array field becomes
18
+ * `['["a","b"]']`, `null` for an optional string becomes the string `"null"`,
19
+ * and `null` for an optional number becomes `0` — all of which then pass
20
+ * validation and execute with garbage. Repairing at the strict-error sites
21
+ * first means those inputs are fixed properly (with a note) instead. Benign
22
+ * coercions ("5" -> 5) are left to Convert: if no repair rule fires and Convert
23
+ * alone makes the input valid, the input is reported as valid and returned
24
+ * untouched, so pi's native behavior is preserved.
25
+ *
26
+ * The one deliberate exception to validate-then-repair is markdown auto-link
27
+ * unwrapping on path fields: `[notes.md](http://notes.md)` is a perfectly valid
28
+ * string, so validation can never flag it. It is unwrapped unconditionally, but
29
+ * only in the degenerate case where the link text equals the url without its
30
+ * protocol — real markdown links pass through untouched.
31
+ */
32
+ import { Value } from "typebox/value";
33
+ import { runRepairPipeline } from "./pipeline.js";
34
+ const MAX_ISSUES = 32;
35
+ // ---------------------------------------------------------------------------
36
+ // Markdown auto-link unwrapping
37
+ // ---------------------------------------------------------------------------
38
+ const MARKDOWN_LINK = /\[([^\]\n]+)\]\((https?:\/\/[^)\s]+)\)/g;
39
+ const PROTOCOL = /^https?:\/\//;
40
+ export function unwrapMarkdownAutoLinks(value) {
41
+ return value.replace(MARKDOWN_LINK, (match, text, url) => url.replace(PROTOCOL, "") === text ? text : match);
42
+ }
43
+ function collectErrors(schema, value) {
44
+ const out = [];
45
+ for (const error of Value.Errors(schema, value)) {
46
+ out.push({
47
+ keyword: String(error.keyword ?? ""),
48
+ instancePath: String(error.instancePath ?? ""),
49
+ params: error.params,
50
+ message: error.message,
51
+ });
52
+ if (out.length >= MAX_ISSUES)
53
+ break;
54
+ }
55
+ return out;
56
+ }
57
+ function parsePointer(pointer) {
58
+ if (pointer === "" || pointer === "/")
59
+ return [];
60
+ return pointer
61
+ .split("/")
62
+ .slice(1)
63
+ .map((segment) => {
64
+ const decoded = segment.replace(/~1/g, "/").replace(/~0/g, "~");
65
+ return /^\d+$/.test(decoded) ? Number(decoded) : decoded;
66
+ });
67
+ }
68
+ function resolveAt(root, segments) {
69
+ let current = root;
70
+ for (const segment of segments) {
71
+ if (current === null || typeof current !== "object")
72
+ return undefined;
73
+ current = current[segment];
74
+ }
75
+ return current;
76
+ }
77
+ function isPlainObject(value) {
78
+ return value !== null && typeof value === "object" && !Array.isArray(value);
79
+ }
80
+ function isContainer(value) {
81
+ return value !== null && typeof value === "object";
82
+ }
83
+ /** Value.Check without its type predicate — the predicate narrows `unknown` to `never` on the false branch. */
84
+ function schemaAccepts(schema, value) {
85
+ return Value.Check(schema, value);
86
+ }
87
+ function collectIssueSites(schema, value) {
88
+ const sites = [];
89
+ const seen = new Set();
90
+ const push = (site, pointerKey) => {
91
+ if (seen.has(pointerKey))
92
+ return;
93
+ seen.add(pointerKey);
94
+ sites.push(site);
95
+ };
96
+ for (const issue of collectErrors(schema, value)) {
97
+ if (issue.keyword === "required") {
98
+ const container = resolveAt(value, parsePointer(issue.instancePath));
99
+ if (!isPlainObject(container))
100
+ continue;
101
+ const missing = issue.params?.requiredProperties;
102
+ if (!Array.isArray(missing))
103
+ continue;
104
+ for (const key of missing) {
105
+ if (typeof key !== "string")
106
+ continue;
107
+ push({
108
+ parent: container,
109
+ key,
110
+ keyword: issue.keyword,
111
+ expected: undefined,
112
+ }, `${issue.instancePath}::${key}`);
113
+ }
114
+ continue;
115
+ }
116
+ const segments = parsePointer(issue.instancePath);
117
+ if (segments.length === 0)
118
+ continue; // root-level issues are handled by root repairs
119
+ const parent = resolveAt(value, segments.slice(0, -1));
120
+ if (!isContainer(parent))
121
+ continue;
122
+ const key = segments[segments.length - 1];
123
+ const expected = typeof issue.params?.type === "string" ? issue.params.type : undefined;
124
+ push({ parent, key, keyword: issue.keyword, expected }, `${issue.instancePath}`);
125
+ }
126
+ return sites;
127
+ }
128
+ const renameAliasedField = (site, toolName, config) => {
129
+ const { parent, key } = site;
130
+ if (typeof key !== "string" || !isPlainObject(parent))
131
+ return false;
132
+ // A null target does not block the rename: `{path: null, file_path: "/x"}`
133
+ // should recover from the alias, and dropNullOrUndefinedField runs later.
134
+ if (key in parent && parent[key] !== undefined && parent[key] !== null)
135
+ return false;
136
+ const aliases = config.fieldAliases?.[key];
137
+ if (!aliases)
138
+ return false;
139
+ for (const alias of aliases) {
140
+ if (!(alias in parent))
141
+ continue;
142
+ const value = parent[alias];
143
+ if (value == null)
144
+ continue;
145
+ if (value === "")
146
+ continue;
147
+ parent[key] = value;
148
+ delete parent[alias];
149
+ return `Renamed \`${alias}\` to \`${key}\` for tool "${toolName}". Use \`${key}\` next time — \`${alias}\` is not a valid field for this tool.`;
150
+ }
151
+ return false;
152
+ };
153
+ const dropNullOrUndefinedField = (site, toolName) => {
154
+ const { parent, key } = site;
155
+ if (typeof key !== "string" || !isPlainObject(parent))
156
+ return false;
157
+ if (!(key in parent))
158
+ return false;
159
+ const value = parent[key];
160
+ if (value !== null && value !== undefined)
161
+ return false;
162
+ delete parent[key];
163
+ const kind = value === null ? "null" : "undefined";
164
+ return `Dropped ${kind} \`${key}\` from tool "${toolName}". Optional fields can be omitted entirely rather than sent as ${kind}.`;
165
+ };
166
+ const dropEmptyObjectPlaceholder = (site, toolName) => {
167
+ const { parent, key, expected } = site;
168
+ if (expected !== "array" || !isPlainObject(parent) || typeof key !== "string")
169
+ return false;
170
+ const value = parent[key];
171
+ if (!isPlainObject(value) || Object.keys(value).length > 0)
172
+ return false;
173
+ delete parent[key];
174
+ return `Dropped empty \`{}\` placeholder from \`${key}\` for tool "${toolName}". Send an actual array (or omit the field) next time.`;
175
+ };
176
+ function tryParseJson(text) {
177
+ try {
178
+ return JSON.parse(text);
179
+ }
180
+ catch {
181
+ return undefined;
182
+ }
183
+ }
184
+ const parseJsonStringifiedArray = (site, toolName) => {
185
+ const { parent, key, expected } = site;
186
+ if (expected !== "array")
187
+ return false;
188
+ const value = parent[key];
189
+ if (typeof value !== "string")
190
+ return false;
191
+ const trimmed = value.trim();
192
+ if (!trimmed.startsWith("[") || !trimmed.endsWith("]"))
193
+ return false;
194
+ const parsed = tryParseJson(trimmed);
195
+ if (!Array.isArray(parsed))
196
+ return false;
197
+ parent[key] = parsed;
198
+ return `Parsed JSON-stringified array for \`${String(key)}\` in tool "${toolName}". Send the array literal directly (e.g. \`["a","b"]\`) next time, not a string.`;
199
+ };
200
+ const parseJsonStringifiedObject = (site, toolName) => {
201
+ const { parent, key, expected } = site;
202
+ if (expected !== "object")
203
+ return false;
204
+ const value = parent[key];
205
+ if (typeof value !== "string")
206
+ return false;
207
+ const trimmed = value.trim();
208
+ if (!trimmed.startsWith("{") || !trimmed.endsWith("}"))
209
+ return false;
210
+ const parsed = tryParseJson(trimmed);
211
+ if (!isPlainObject(parsed))
212
+ return false;
213
+ parent[key] = parsed;
214
+ return `Parsed JSON-stringified object for \`${String(key)}\` in tool "${toolName}". Send the object literal directly next time, not a string.`;
215
+ };
216
+ const wrapBareStringAsArray = (site, toolName) => {
217
+ const { parent, key, expected } = site;
218
+ if (expected !== "array")
219
+ return false;
220
+ const value = parent[key];
221
+ if (typeof value !== "string")
222
+ return false;
223
+ parent[key] = [value];
224
+ return `Wrapped your bare string in a single-element array for \`${String(key)}\` in tool "${toolName}". Send an array (e.g. \`["foo"]\`) next time, not a single string.`;
225
+ };
226
+ /**
227
+ * Stage 5 re-collects issue sites after each pass that fired a rule, so
228
+ * repairs that reveal nested problems (parse a stringified array, then rename
229
+ * aliased fields inside it) converge instead of failing. Three passes cover
230
+ * every known two-step combination with one pass of headroom.
231
+ */
232
+ const MAX_ISSUE_PASSES = 3;
233
+ // Order matters: parse before wrap, rename before drop.
234
+ const ISSUE_RULES = [
235
+ ["renameAliasedField", renameAliasedField],
236
+ ["dropNullOrUndefinedField", dropNullOrUndefinedField],
237
+ ["dropEmptyObjectPlaceholder", dropEmptyObjectPlaceholder],
238
+ ["parseJsonStringifiedArray", parseJsonStringifiedArray],
239
+ ["parseJsonStringifiedObject", parseJsonStringifiedObject],
240
+ ["wrapBareStringAsArray", wrapBareStringAsArray],
241
+ ];
242
+ // ---------------------------------------------------------------------------
243
+ // Fingerprinting (FNV-1a) for local telemetry
244
+ // ---------------------------------------------------------------------------
245
+ function fnv1a(text) {
246
+ let hash = 0x811c9dc5;
247
+ for (let i = 0; i < text.length; i++) {
248
+ hash = Math.imul(hash ^ text.charCodeAt(i), 0x01000193);
249
+ }
250
+ return (hash >>> 0).toString(16).padStart(8, "0");
251
+ }
252
+ function describeIssue(issue) {
253
+ const path = issue.instancePath === "" ? "(root)" : issue.instancePath;
254
+ const detail = typeof issue.params?.type === "string"
255
+ ? issue.params.type
256
+ : Array.isArray(issue.params?.requiredProperties)
257
+ ? issue.params.requiredProperties.join(",")
258
+ : "";
259
+ return `${path}|${issue.keyword}|${detail}`;
260
+ }
261
+ function formatRetryMessage(toolName, issues, input) {
262
+ const lines = issues
263
+ .slice(0, 8)
264
+ .map((issue) => ` • ${issue.instancePath === "" ? "(root)" : issue.instancePath}: ${issue.message ?? issue.keyword}`);
265
+ let received;
266
+ try {
267
+ received = JSON.stringify(input) ?? String(input);
268
+ }
269
+ catch {
270
+ received = String(input);
271
+ }
272
+ if (received.length > 300)
273
+ received = `${received.slice(0, 300)}…`;
274
+ return `Invalid input for tool "${toolName}". Fix these issues and retry:\n${lines.join("\n")}\nReceived: ${received}`;
275
+ }
276
+ // ---------------------------------------------------------------------------
277
+ // Driver
278
+ // ---------------------------------------------------------------------------
279
+ export function repairSchemaInput(options) {
280
+ const { toolName, schema, input } = options;
281
+ const config = options.config ?? {};
282
+ const rulesFired = [];
283
+ const notes = [];
284
+ const changes = [];
285
+ const fire = (rule, note) => {
286
+ if (!rulesFired.includes(rule))
287
+ rulesFired.push(rule);
288
+ notes.push(note);
289
+ changes.push({ ruleId: rule, note });
290
+ };
291
+ const unwrapPathFields = (target) => {
292
+ for (const field of config.pathFields ?? []) {
293
+ const value = target[field];
294
+ if (typeof value !== "string")
295
+ continue;
296
+ const unwrapped = unwrapMarkdownAutoLinks(value);
297
+ if (unwrapped === value)
298
+ continue;
299
+ target[field] = unwrapped;
300
+ fire("unwrapMarkdownAutoLink", `Unwrapped a markdown auto-link in \`${field}\` for tool "${toolName}" (\`${value}\` -> \`${unwrapped}\`). Send plain paths, not markdown links.`);
301
+ }
302
+ };
303
+ // Stage 1: unconditional path-field cleanup on a clone. Auto-linked paths are
304
+ // valid strings, so validation alone can never catch them.
305
+ let current = structuredClone(input);
306
+ if (isPlainObject(current))
307
+ unwrapPathFields(current);
308
+ // Stage 2: strict fast path. No Convert here — see the header comment.
309
+ if (schemaAccepts(schema, current)) {
310
+ if (rulesFired.length === 0) {
311
+ return {
312
+ outcome: "valid",
313
+ args: input,
314
+ rulesFired,
315
+ notes,
316
+ changes,
317
+ issueSummary: undefined,
318
+ fingerprint: undefined,
319
+ retryMessage: undefined,
320
+ };
321
+ }
322
+ return {
323
+ outcome: "repaired",
324
+ args: current,
325
+ rulesFired,
326
+ notes,
327
+ changes,
328
+ issueSummary: undefined,
329
+ fingerprint: undefined,
330
+ retryMessage: undefined,
331
+ };
332
+ }
333
+ // Record the original failure shape before repairs mutate it.
334
+ const originalIssues = collectErrors(schema, current);
335
+ const issueSummary = originalIssues.map(describeIssue).join("; ");
336
+ const fingerprint = fnv1a(`${toolName}::${originalIssues.map(describeIssue).sort().join(";")}`);
337
+ const unrepairable = () => ({
338
+ outcome: "unrepairable",
339
+ args: input,
340
+ rulesFired: [],
341
+ notes: [],
342
+ changes: [],
343
+ issueSummary,
344
+ fingerprint,
345
+ retryMessage: formatRetryMessage(toolName, originalIssues, input),
346
+ });
347
+ // Stage 3: root repairs — the model sent something other than an object.
348
+ if (typeof current === "string") {
349
+ const trimmed = current.trim();
350
+ const parsed = trimmed.startsWith("{") && trimmed.endsWith("}")
351
+ ? tryParseJson(trimmed)
352
+ : undefined;
353
+ if (isPlainObject(parsed)) {
354
+ current = parsed;
355
+ fire("parseJsonStringifiedRootObject", `Parsed your JSON-stringified arguments for tool "${toolName}". Send the arguments as a JSON object next time, not a string.`);
356
+ }
357
+ else if (config.rootString) {
358
+ const { field, wrapInArray } = config.rootString;
359
+ current = { [field]: wrapInArray ? [current] : current };
360
+ fire("wrapRootStringAsObject", `Wrapped your bare string as \`{${field}: ${wrapInArray ? '["..."]' : '"..."'}}\` for tool "${toolName}". Call this tool with an object, not a bare string, next time.`);
361
+ }
362
+ if (isPlainObject(current))
363
+ unwrapPathFields(current);
364
+ }
365
+ if (!isPlainObject(current))
366
+ return unrepairable();
367
+ // Stage 4: tool-specific structural repairs.
368
+ for (const structural of config.structural ?? []) {
369
+ const note = structural.apply(current, toolName);
370
+ if (note !== false)
371
+ fire(structural.name, note);
372
+ }
373
+ // Stage 5: per-issue repairs at the strict validator's failure sites.
374
+ // Iterates because one repair can expose sites the first collection couldn't
375
+ // see — e.g. parsing a stringified `edits` array surfaces aliased fields
376
+ // inside the parsed elements. Stops when the value validates or a full pass
377
+ // fires nothing (each firing rule mutates `current`, so a firing pass always
378
+ // makes progress); the cap only bounds pathological rule interactions.
379
+ for (let pass = 0; pass < MAX_ISSUE_PASSES && !schemaAccepts(schema, current); pass++) {
380
+ let repairedThisPass = false;
381
+ for (const site of collectIssueSites(schema, current)) {
382
+ for (const [name, rule] of ISSUE_RULES) {
383
+ const note = rule(site, toolName, config);
384
+ if (note !== false) {
385
+ fire(name, note);
386
+ repairedThisPass = true;
387
+ break;
388
+ }
389
+ }
390
+ }
391
+ if (!repairedThisPass)
392
+ break;
393
+ }
394
+ // Stage 6: final verdict, now through pi's own pipeline (Convert, then
395
+ // Check) so benign coercions like "5" -> 5 are accounted for.
396
+ const probe = Value.Convert(schema, structuredClone(current));
397
+ if (schemaAccepts(schema, probe)) {
398
+ if (rulesFired.length === 0) {
399
+ // Convert alone fixes it — defer to pi's native coercion, untouched.
400
+ return {
401
+ outcome: "valid",
402
+ args: input,
403
+ rulesFired,
404
+ notes,
405
+ changes,
406
+ issueSummary: undefined,
407
+ fingerprint: undefined,
408
+ retryMessage: undefined,
409
+ };
410
+ }
411
+ return {
412
+ outcome: "repaired",
413
+ args: probe,
414
+ rulesFired,
415
+ notes,
416
+ changes,
417
+ issueSummary,
418
+ fingerprint,
419
+ retryMessage: undefined,
420
+ };
421
+ }
422
+ return unrepairable();
423
+ }
424
+ /**
425
+ * Current-major compatibility facade. New consumers should prefer
426
+ * `runRepairPipeline`, but this shape and its legacy rule names remain stable.
427
+ */
428
+ export function repairToolInput(options) {
429
+ const result = runRepairPipeline({
430
+ input: options.input,
431
+ config: {
432
+ toolName: options.toolName,
433
+ schema: options.schema,
434
+ legacyConfig: options.config,
435
+ },
436
+ });
437
+ const legacyRule = (ruleId) => ruleId === "envelope.decode-json"
438
+ ? "parseJsonStringifiedRootObject"
439
+ : ruleId;
440
+ const rulesFired = [
441
+ ...new Set(result.changes.map((change) => legacyRule(change.ruleId))),
442
+ ];
443
+ return {
444
+ outcome: result.outcome,
445
+ args: result.args,
446
+ rulesFired,
447
+ notes: result.changes.map((change) => change.note),
448
+ changes: result.changes.map((change) => ({
449
+ ruleId: legacyRule(change.ruleId),
450
+ note: change.note,
451
+ })),
452
+ issueSummary: result.issueSummary,
453
+ fingerprint: result.fingerprint,
454
+ retryMessage: result.retryMessage,
455
+ };
456
+ }
457
+ //# sourceMappingURL=repair-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-engine.js","sourceRoot":"","sources":["../../src/repair-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Display settings for the repair layer, persisted at
3
+ * ~/.pi/agent/tool-repair/settings.json and edited via /repair-settings.
4
+ */
5
+ /**
6
+ * Grammar-leak recovery mode:
7
+ * - "off": never touch assistant text.
8
+ * - "strip": remove leaked tool-call grammar from text (model-gated), but never
9
+ * promote it to an executable call. This is the default.
10
+ * - "recover": additionally promote leaked calls to real toolCalls that execute
11
+ * in the same turn. Opt-in, because it promotes model text into execution.
12
+ */
13
+ export type GrammarRecoveryMode = "off" | "observe" | "strip" | "recover";
14
+ export type RepairPolicyProfile = "conservative" | "adaptive" | "recover";
15
+ export type UnknownGrammarTextPolicy = "preserve" | "strip";
16
+ export interface RepairDisplaySettings {
17
+ /** Append a `🔨 ✓ input repaired (...)` line to repaired tool calls in the TUI. */
18
+ showIndicator: boolean;
19
+ /** Also show the repair note text beneath the indicator. */
20
+ showNotes: boolean;
21
+ /** Grammar-leak recovery mode. Default "strip" (still subject to the model gate). */
22
+ grammarRecovery: GrammarRecoveryMode;
23
+ /**
24
+ * Optional allowlist of tool names a leaked call may be promoted to. When
25
+ * empty, the active tool set is used (a leaked call is only promoted when its
26
+ * name is a currently-registered tool).
27
+ */
28
+ grammarAllowedTools: string[];
29
+ /** Named pipeline safety profile. */
30
+ policyProfile: RepairPolicyProfile;
31
+ /** Unknown grammar is never executable; this controls text preservation only. */
32
+ unknownGrammarText: UnknownGrammarTextPolicy;
33
+ }
34
+ export declare const DEFAULT_DISPLAY_SETTINGS: RepairDisplaySettings;
35
+ export declare function displaySettingsPath(): string;
36
+ export declare function loadDisplaySettings(path?: string): RepairDisplaySettings;
37
+ export declare function saveDisplaySettings(settings: RepairDisplaySettings, path?: string): void;
38
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAC1E,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;AAC1E,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,aAAa,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IACnB,qFAAqF;IACrF,eAAe,EAAE,mBAAmB,CAAC;IACrC;;;;OAIG;IACH,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,qCAAqC;IACrC,aAAa,EAAE,mBAAmB,CAAC;IACnC,iFAAiF;IACjF,kBAAkB,EAAE,wBAAwB,CAAC;CAC9C;AAED,eAAO,MAAM,wBAAwB,EAAE,qBAOtC,CAAC;AAgCF,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAED,wBAAgB,mBAAmB,CACjC,IAAI,SAAwB,GAC3B,qBAAqB,CAwCvB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,SAAwB,GAC3B,IAAI,CAON"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Display settings for the repair layer, persisted at
3
+ * ~/.pi/agent/tool-repair/settings.json and edited via /repair-settings.
4
+ */
5
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
+ import { dirname, join } from "node:path";
7
+ import { getAgentDir } from "@earendil-works/pi-coding-agent";
8
+ export const DEFAULT_DISPLAY_SETTINGS = {
9
+ showIndicator: true,
10
+ showNotes: false,
11
+ grammarRecovery: "strip",
12
+ grammarAllowedTools: [],
13
+ policyProfile: "adaptive",
14
+ unknownGrammarText: "preserve",
15
+ };
16
+ const GRAMMAR_MODES = [
17
+ "off",
18
+ "observe",
19
+ "strip",
20
+ "recover",
21
+ ];
22
+ const POLICY_PROFILES = [
23
+ "conservative",
24
+ "adaptive",
25
+ "recover",
26
+ ];
27
+ function isGrammarMode(value) {
28
+ return (typeof value === "string" && GRAMMAR_MODES.includes(value));
29
+ }
30
+ function isPolicyProfile(value) {
31
+ return (typeof value === "string" && POLICY_PROFILES.includes(value));
32
+ }
33
+ function isUnknownGrammarTextPolicy(value) {
34
+ return value === "preserve" || value === "strip";
35
+ }
36
+ export function displaySettingsPath() {
37
+ return (process.env.PI_TOOL_REPAIR_SETTINGS ??
38
+ join(getAgentDir(), "tool-repair", "settings.json"));
39
+ }
40
+ export function loadDisplaySettings(path = displaySettingsPath()) {
41
+ try {
42
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
43
+ const legacyGrammar = isGrammarMode(parsed.grammarRecovery)
44
+ ? parsed.grammarRecovery
45
+ : undefined;
46
+ const policyProfile = isPolicyProfile(parsed.policyProfile)
47
+ ? parsed.policyProfile
48
+ : legacyGrammar === "recover"
49
+ ? "recover"
50
+ : "adaptive";
51
+ return {
52
+ showIndicator: typeof parsed.showIndicator === "boolean"
53
+ ? parsed.showIndicator
54
+ : DEFAULT_DISPLAY_SETTINGS.showIndicator,
55
+ showNotes: typeof parsed.showNotes === "boolean"
56
+ ? parsed.showNotes
57
+ : DEFAULT_DISPLAY_SETTINGS.showNotes,
58
+ grammarRecovery: legacyGrammar ??
59
+ (policyProfile === "conservative"
60
+ ? "observe"
61
+ : policyProfile === "recover"
62
+ ? "recover"
63
+ : "strip"),
64
+ grammarAllowedTools: Array.isArray(parsed.grammarAllowedTools) &&
65
+ parsed.grammarAllowedTools.every((t) => typeof t === "string")
66
+ ? parsed.grammarAllowedTools
67
+ : [...DEFAULT_DISPLAY_SETTINGS.grammarAllowedTools],
68
+ policyProfile,
69
+ unknownGrammarText: isUnknownGrammarTextPolicy(parsed.unknownGrammarText)
70
+ ? parsed.unknownGrammarText
71
+ : "preserve",
72
+ };
73
+ }
74
+ catch {
75
+ return { ...DEFAULT_DISPLAY_SETTINGS };
76
+ }
77
+ }
78
+ export function saveDisplaySettings(settings, path = displaySettingsPath()) {
79
+ try {
80
+ mkdirSync(dirname(path), { recursive: true });
81
+ writeFileSync(path, `${JSON.stringify(settings, null, "\t")}\n`);
82
+ }
83
+ catch {
84
+ // Settings persistence must never break the session.
85
+ }
86
+ }
87
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Repair configuration for pi's seven built-in tools.
3
+ *
4
+ * The alias lists encode the field names open models actually emit — mostly
5
+ * leakage from the tool contracts they were RL-trained on (Claude Code's
6
+ * `file_path`/`old_string`/`new_string`, aider's `search`/`replace`, generic
7
+ * `cmd`/`query`). Aliases only ever apply when the canonical field is missing
8
+ * or undefined at a path the validator flagged, so valid calls never pay for
9
+ * this table.
10
+ */
11
+ import type { Preprocessor } from "./preprocess.ts";
12
+ import type { ToolRepairConfig } from "./repair-engine.ts";
13
+ export declare const REPAIR_CONFIGS: Record<string, ToolRepairConfig>;
14
+ /** Selector-based configuration used by the public pipeline and extension. */
15
+ export declare const PIPELINE_PREPROCESSORS: Record<string, readonly Preprocessor[]>;
16
+ //# sourceMappingURL=tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/tables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAoB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA+E7E,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA6F3D,CAAC;AAgDF,8EAA8E;AAC9E,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAoG1E,CAAC"}