@lucascouts/claude-agent-tui 0.5.2 → 0.7.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 (108) hide show
  1. package/NOTICE +1 -1
  2. package/README.md +1 -1
  3. package/dist/acp-agent.d.ts +249 -21
  4. package/dist/acp-agent.js +573 -73
  5. package/dist/agent-catalog.d.ts +95 -0
  6. package/dist/agent-catalog.js +287 -0
  7. package/dist/ansi-mirror.d.ts +0 -1
  8. package/dist/besteffort.d.ts +0 -1
  9. package/dist/billing/entrypoint-guard.d.ts +0 -1
  10. package/dist/claude-path.d.ts +0 -1
  11. package/dist/claude-path.js +6 -0
  12. package/dist/command-catalog.d.ts +84 -0
  13. package/dist/command-catalog.js +339 -0
  14. package/dist/diff-enriched-reader.d.ts +0 -1
  15. package/dist/diff-source.d.ts +0 -1
  16. package/dist/drift-checks.d.ts +0 -1
  17. package/dist/end-of-turn.d.ts +6 -1
  18. package/dist/end-of-turn.js +8 -1
  19. package/dist/engine-lifecycle.d.ts +66 -2
  20. package/dist/engine-lifecycle.js +43 -4
  21. package/dist/engine-pty.d.ts +70 -3
  22. package/dist/engine-pty.js +80 -6
  23. package/dist/engine-watcher.d.ts +0 -1
  24. package/dist/engine.d.ts +0 -1
  25. package/dist/event-switch.d.ts +0 -1
  26. package/dist/gate/port.d.ts +0 -1
  27. package/dist/gate/settings-writer.d.ts +14 -1
  28. package/dist/gate/settings-writer.js +49 -0
  29. package/dist/image-input.d.ts +30 -0
  30. package/dist/image-input.js +79 -0
  31. package/dist/image-vision-smoke.d.ts +51 -0
  32. package/dist/image-vision-smoke.js +111 -0
  33. package/dist/index.d.ts +0 -1
  34. package/dist/index.js +6 -0
  35. package/dist/jsonl.d.ts +0 -1
  36. package/dist/lib.d.ts +0 -1
  37. package/dist/linearize.d.ts +1 -2
  38. package/dist/linearize.js +1 -1
  39. package/dist/live-diff-env.d.ts +0 -1
  40. package/dist/live-subagent-env.d.ts +0 -1
  41. package/dist/mcp-config-writer.d.ts +60 -0
  42. package/dist/mcp-config-writer.js +172 -0
  43. package/dist/model-catalog.d.ts +68 -3
  44. package/dist/model-catalog.js +123 -13
  45. package/dist/permissions/allow-inject.d.ts +0 -1
  46. package/dist/permissions/deny.d.ts +12 -1
  47. package/dist/permissions/deny.js +18 -0
  48. package/dist/permissions/elicitation-bridge.d.ts +71 -0
  49. package/dist/permissions/elicitation-bridge.js +146 -0
  50. package/dist/permissions/gate-wiring.d.ts +23 -3
  51. package/dist/permissions/gate-wiring.js +123 -1
  52. package/dist/permissions/hook-server.d.ts +11 -3
  53. package/dist/permissions/hook-server.js +10 -1
  54. package/dist/permissions/permission-mode.d.ts +0 -1
  55. package/dist/permissions/request-permission.d.ts +0 -1
  56. package/dist/settings.d.ts +0 -1
  57. package/dist/settings.js +9 -0
  58. package/dist/stop-reason-map.d.ts +0 -1
  59. package/dist/subagent-gate.d.ts +0 -1
  60. package/dist/subagent-source.d.ts +0 -1
  61. package/dist/subagent-watcher.d.ts +0 -1
  62. package/dist/tools.d.ts +0 -1
  63. package/dist/tools.js +5 -1
  64. package/dist/usage-env.d.ts +0 -1
  65. package/dist/usage.d.ts +3 -1
  66. package/dist/usage.js +3 -0
  67. package/dist/utils.d.ts +0 -1
  68. package/dist/zed-register.d.ts +0 -1
  69. package/package.json +12 -9
  70. package/dist/acp-agent.d.ts.map +0 -1
  71. package/dist/ansi-mirror.d.ts.map +0 -1
  72. package/dist/besteffort.d.ts.map +0 -1
  73. package/dist/billing/entrypoint-guard.d.ts.map +0 -1
  74. package/dist/claude-path.d.ts.map +0 -1
  75. package/dist/diff-enriched-reader.d.ts.map +0 -1
  76. package/dist/diff-source.d.ts.map +0 -1
  77. package/dist/drift-checks.d.ts.map +0 -1
  78. package/dist/end-of-turn.d.ts.map +0 -1
  79. package/dist/engine-lifecycle.d.ts.map +0 -1
  80. package/dist/engine-pty.d.ts.map +0 -1
  81. package/dist/engine-watcher.d.ts.map +0 -1
  82. package/dist/engine.d.ts.map +0 -1
  83. package/dist/event-switch.d.ts.map +0 -1
  84. package/dist/gate/port.d.ts.map +0 -1
  85. package/dist/gate/settings-writer.d.ts.map +0 -1
  86. package/dist/index.d.ts.map +0 -1
  87. package/dist/jsonl.d.ts.map +0 -1
  88. package/dist/lib.d.ts.map +0 -1
  89. package/dist/linearize.d.ts.map +0 -1
  90. package/dist/live-diff-env.d.ts.map +0 -1
  91. package/dist/live-subagent-env.d.ts.map +0 -1
  92. package/dist/model-catalog.d.ts.map +0 -1
  93. package/dist/permissions/allow-inject.d.ts.map +0 -1
  94. package/dist/permissions/deny.d.ts.map +0 -1
  95. package/dist/permissions/gate-wiring.d.ts.map +0 -1
  96. package/dist/permissions/hook-server.d.ts.map +0 -1
  97. package/dist/permissions/permission-mode.d.ts.map +0 -1
  98. package/dist/permissions/request-permission.d.ts.map +0 -1
  99. package/dist/settings.d.ts.map +0 -1
  100. package/dist/stop-reason-map.d.ts.map +0 -1
  101. package/dist/subagent-gate.d.ts.map +0 -1
  102. package/dist/subagent-source.d.ts.map +0 -1
  103. package/dist/subagent-watcher.d.ts.map +0 -1
  104. package/dist/tools.d.ts.map +0 -1
  105. package/dist/usage-env.d.ts.map +0 -1
  106. package/dist/usage.d.ts.map +0 -1
  107. package/dist/utils.d.ts.map +0 -1
  108. package/dist/zed-register.d.ts.map +0 -1
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Project an `AskUserQuestion` tool_input into an ACP form `CreateElicitationRequest`, scoped to the
3
+ * session and tied to the originating tool call by `tool_use.id` (R1.1, R1.2).
4
+ *
5
+ * Each question becomes one string-enum property keyed by its `header`: `{ type: "string", title:
6
+ * <question>, enum: <option labels, in order> }`, and every header is marked `required` (one entry per
7
+ * question, in order). The returned literal is shaped to satisfy the pinned SDK `zCreateElicitationRequest`.
8
+ */
9
+ export function buildElicitationRequest(toolUseId, sessionId, toolInput) {
10
+ const properties = {};
11
+ const required = [];
12
+ for (const q of toolInput.questions) {
13
+ properties[q.header] = {
14
+ type: "string",
15
+ title: q.question,
16
+ enum: q.options.map((o) => o.label),
17
+ };
18
+ required.push(q.header);
19
+ }
20
+ const message = toolInput.questions.length === 1
21
+ ? `Please answer: ${toolInput.questions[0]?.question ?? "the question below"}`
22
+ : `Please answer the following ${toolInput.questions.length} question(s).`;
23
+ // The SDK `CreateElicitationRequest` is an awkward mode/scope intersection; this well-formed form
24
+ // literal parses against `zCreateElicitationRequest` (verified by the C1 test), so a single localized
25
+ // cast is used rather than scattering `any` across the object.
26
+ return {
27
+ mode: "form",
28
+ message,
29
+ sessionId,
30
+ toolCallId: toolUseId,
31
+ requestedSchema: {
32
+ type: "object",
33
+ properties,
34
+ required,
35
+ },
36
+ };
37
+ }
38
+ /** The wire actions the bridge recognizes as a well-formed elicitation response. */
39
+ const KNOWN_ACTIONS = new Set(["accept", "decline", "cancel"]);
40
+ /**
41
+ * True iff `resp` is a structurally well-formed `CreateElicitationResponse` — i.e. an object whose
42
+ * `action` is one of accept|decline|cancel. Used to fail closed on a malformed wire response WITHOUT
43
+ * importing the zod validators (blocked by the package `exports` map).
44
+ */
45
+ function hasKnownAction(resp) {
46
+ return (typeof resp === "object" &&
47
+ resp !== null &&
48
+ "action" in resp &&
49
+ typeof resp.action === "string" &&
50
+ KNOWN_ACTIONS.has(resp.action));
51
+ }
52
+ /**
53
+ * Map an elicitation outcome back to a gate decision (R2). EVERY branch returns a `deny`: the gate
54
+ * always denies AskUserQuestion at the wire and surfaces the result through `reason` (the R2.1 seam — a
55
+ * PreToolUse hook cannot synthesize a native tool_result).
56
+ *
57
+ * - `accept`: the reason embeds EVERY selected answer (e.g. `Env=prod, Cache=yes`) so the model can
58
+ * read the choice from the deny reason. `content` null/undefined is handled defensively (still deny).
59
+ * - `decline`/`cancel`/any unrecognized-or-missing action: the reason reads as a user DISMISSAL, not
60
+ * an answer (default-deny defensively for unknown actions).
61
+ */
62
+ export function mapOutcomeToDecision(resp) {
63
+ // `resp` is a typed union, but we read `action`/`content` defensively (a synthetic fail-closed
64
+ // cancel or a malformed upstream value may reach here) via a single localized view.
65
+ const view = resp;
66
+ if (view?.action === "accept") {
67
+ const content = view.content;
68
+ const answers = content !== undefined && content !== null
69
+ ? Object.entries(content)
70
+ .map(([key, value]) => `${key}=${String(value)}`)
71
+ .join(", ")
72
+ : "";
73
+ const reason = answers.length > 0
74
+ ? `AskUserQuestion answered by the user: ${answers}. (The tool is always denied at the ` +
75
+ `gate; this selection is returned to you via this reason.)`
76
+ : `AskUserQuestion was accepted but returned no selection. (The tool is always denied at ` +
77
+ `the gate; treat this as no usable answer.)`;
78
+ return { decision: "deny", reason };
79
+ }
80
+ // decline, cancel, or any unrecognized/missing action → a dismissal, never an answer.
81
+ return {
82
+ decision: "deny",
83
+ reason: `The user dismissed the AskUserQuestion prompt without providing an answer (no answer was ` +
84
+ `selected). (The tool is always denied at the gate.)`,
85
+ };
86
+ }
87
+ /** A synthetic fail-closed outcome — a cancel is a dismissal, mapped to a deny at the gate. */
88
+ function failClosedCancel() {
89
+ // `{ action: "cancel" }` satisfies the SDK response union; a localized cast avoids widening the API.
90
+ return { action: "cancel" };
91
+ }
92
+ /**
93
+ * Perform the bounded, fail-closed elicitation round-trip (R4). NEVER throws and NEVER hangs past
94
+ * ~`timeoutMs`.
95
+ *
96
+ * - Happy path (a well-formed response, action ∈ {accept,decline,cancel}) → returned UNCHANGED.
97
+ * - Timeout → `onWarn` (naming the timeout) and resolve `{ action: "cancel" }`.
98
+ * - Client throws → `onWarn` (including the underlying error text) and resolve `{ action: "cancel" }`.
99
+ * - Malformed response (action not accept|decline|cancel) → normalized to `{ action: "cancel" }`.
100
+ *
101
+ * The timer is always cleared on settle so no live handle keeps the event loop open.
102
+ */
103
+ export async function requestElicitation(client, req, opts) {
104
+ const { timeoutMs, onWarn } = opts;
105
+ let timer;
106
+ const timeout = new Promise((resolve) => {
107
+ timer = setTimeout(() => resolve({ __timedOut: true }), timeoutMs);
108
+ });
109
+ try {
110
+ const settled = await Promise.race([
111
+ // DEFER the client call through a resolved microtask so a SYNCHRONOUS throw (the method is
112
+ // `undefined` — capability advertised but absent — or it throws before returning a promise)
113
+ // becomes a REJECTION the inline handler below catches, instead of escaping at argument-
114
+ // evaluation time (this `try` has only a `finally`, so an eager throw would re-throw out of
115
+ // requestElicitation, violating "never throws"). Async rejections still take the same path.
116
+ Promise.resolve()
117
+ .then(() => client.unstable_createElicitation(req))
118
+ .then((resp) => ({ ok: true, resp }), (err) => ({ ok: false, err })),
119
+ timeout,
120
+ ]);
121
+ // Timeout won the race — fail closed to a cancel.
122
+ if ("__timedOut" in settled) {
123
+ onWarn?.(`[gate elicitation] FAIL CLOSED: AskUserQuestion elicitation timed out after ${timeoutMs}ms ` +
124
+ `— resolving as a cancel (dismissal), never an accept.`);
125
+ return failClosedCancel();
126
+ }
127
+ // The client threw — fail closed to a cancel, surfacing the underlying error text.
128
+ if (!settled.ok) {
129
+ const err = settled.err;
130
+ onWarn?.(`[gate elicitation] FAIL CLOSED: AskUserQuestion elicitation transport error ` +
131
+ `(${err instanceof Error ? err.message : String(err)}) — resolving as a cancel.`);
132
+ return failClosedCancel();
133
+ }
134
+ // A well-formed response is returned unchanged; a malformed one is normalized to a cancel.
135
+ if (hasKnownAction(settled.resp)) {
136
+ return settled.resp;
137
+ }
138
+ onWarn?.(`[gate elicitation] FAIL CLOSED: malformed elicitation response (action not accept|decline|` +
139
+ `cancel) — resolving as a cancel.`);
140
+ return failClosedCancel();
141
+ }
142
+ finally {
143
+ if (timer !== undefined)
144
+ clearTimeout(timer);
145
+ }
146
+ }
@@ -1,4 +1,5 @@
1
1
  import { ToolUseCorrelator, type PermissionClient } from "./request-permission.js";
2
+ import { type ElicitationClient } from "./elicitation-bridge.js";
2
3
  import { type PtyWriter, type Schedule } from "./allow-inject.js";
3
4
  /**
4
5
  * Substrings that evidence the native TUI permission prompt (the bordered "Do you want to
@@ -62,12 +63,32 @@ export interface GatePty extends PtyWriter {
62
63
  dispose(): void;
63
64
  };
64
65
  }
66
+ /**
67
+ * Story 065 — the default hard upper bound (ms) on the AskUserQuestion elicitation round-trip. Generous
68
+ * (a human may take minutes to answer) but DELIBERATELY BELOW the hook-server
69
+ * {@link import("./hook-server.js").DEFAULT_DECIDER_TIMEOUT_MS} (600_000), so the bridge times out FIRST
70
+ * with a legible fail-closed reason rather than the decider being killed out from under it. Injectable
71
+ * via {@link SessionGateOptions.elicitationTimeoutMs} so offline tests use a small value.
72
+ */
73
+ export declare const DEFAULT_ELICITATION_TIMEOUT_MS = 300000;
65
74
  /** Options for {@link setupSessionGate}. Timing knobs are injectable for offline tests. */
66
75
  export interface SessionGateOptions {
67
- /** The ACP client surface (`AgentSideConnection` satisfies it: `requestPermission(params)`). */
68
- client: PermissionClient;
76
+ /** The ACP client surface. `AgentSideConnection` satisfies BOTH `requestPermission(params)`
77
+ * (the story-033 relay) AND `unstable_createElicitation(params)` (the story-065 elicitation
78
+ * bridge), so the field carries both capabilities. */
79
+ client: PermissionClient & ElicitationClient;
69
80
  /** Diagnostics sink for every fail-closed / stuck-prompt warning (production: logger.error). */
70
81
  onWarn?: (message: string) => void;
82
+ /**
83
+ * Story 065 (R1/R3) — whether the connected ACP client negotiated the elicitation `form` capability
84
+ * (`clientCapabilities.elicitation.form`). When true, AskUserQuestion is driven through a real ACP
85
+ * form elicitation ({@link SessionGateImpl.decideElicitation}); when false/omitted it DEGRADES to the
86
+ * story-064 fail-closed deny-guard. Defaults to false when read, so an existing gate/064 test that
87
+ * omits it keeps the degrade behavior (load-bearing — do NOT make required). */
88
+ clientSupportsElicitationForm?: boolean;
89
+ /** Story 065 — hard upper bound (ms) on the AskUserQuestion elicitation round-trip; default
90
+ * {@link DEFAULT_ELICITATION_TIMEOUT_MS}. Injectable so offline tests use a small value. */
91
+ elicitationTimeoutMs?: number;
71
92
  /** Injectable timer seam (same discipline as allow-inject/end-of-turn). Default: setTimeout. */
72
93
  schedule?: Schedule;
73
94
  /** Directory for the per-session scratch settings file. Default: `os.tmpdir()`. */
@@ -155,4 +176,3 @@ export interface SessionGate {
155
176
  * an ungated claude that LOOKS gated (the blocker-b hazard). `FORK_GATE=off` is the escape hatch.
156
177
  */
157
178
  export declare function setupSessionGate(opts: SessionGateOptions): Promise<SessionGate>;
158
- //# sourceMappingURL=gate-wiring.d.ts.map
@@ -33,8 +33,10 @@ import * as path from "node:path";
33
33
  import { randomBytes, randomUUID } from "node:crypto";
34
34
  import { findFreePort } from "../gate/port.js";
35
35
  import { injectHook, restore } from "../gate/settings-writer.js";
36
- import { startHookServer } from "./hook-server.js";
36
+ import { startHookServer, } from "./hook-server.js";
37
+ import { askUserQuestionDenyReason, isAskUserQuestionTool } from "./deny.js";
37
38
  import { requestPermission, ToolUseCorrelator, } from "./request-permission.js";
39
+ import { buildElicitationRequest, mapOutcomeToDecision, requestElicitation, } from "./elicitation-bridge.js";
38
40
  import { clearNativePrompt } from "./allow-inject.js";
39
41
  /**
40
42
  * Substrings that evidence the native TUI permission prompt (the bordered "Do you want to
@@ -111,9 +113,53 @@ export const SCRATCH_SETTINGS_PREFIX = "fork-acp-gate-settings-";
111
113
  /** Story 046 (R3) — the file-edit tools that `acceptEdits` auto-allows, mirroring claude's native
112
114
  * acceptEdits semantics (edits proceed without prompting; every other tool still asks). */
113
115
  const EDIT_TOOLS = new Set(["Write", "Edit", "MultiEdit", "NotebookEdit"]);
116
+ /**
117
+ * Story 065 — the default hard upper bound (ms) on the AskUserQuestion elicitation round-trip. Generous
118
+ * (a human may take minutes to answer) but DELIBERATELY BELOW the hook-server
119
+ * {@link import("./hook-server.js").DEFAULT_DECIDER_TIMEOUT_MS} (600_000), so the bridge times out FIRST
120
+ * with a legible fail-closed reason rather than the decider being killed out from under it. Injectable
121
+ * via {@link SessionGateOptions.elicitationTimeoutMs} so offline tests use a small value.
122
+ */
123
+ export const DEFAULT_ELICITATION_TIMEOUT_MS = 300_000;
114
124
  const defaultSchedule = (fn, ms) => {
115
125
  setTimeout(fn, ms);
116
126
  };
127
+ /**
128
+ * Story 065 — STRUCTURAL guard that a hook payload's `tool_input` is a usable {@link AskUserQuestionInput}:
129
+ * an object carrying a NON-EMPTY `questions` array, EACH question being an object with a `header` string
130
+ * and a NON-EMPTY `options` array of `{ label: string }`. The runtime zod validators are not importable
131
+ * across the SDK package `exports` map, and the hook payload's `tool_input` is `unknown`, so this narrows
132
+ * before the bridge builder projects it into a form (an empty/garbage form would otherwise reach the
133
+ * client, and a per-question shape the builder walks — `q.options.map(...)`, `q.header` — would otherwise
134
+ * throw).
135
+ *
136
+ * Story 065 / task 4.1 (R4) — the per-question `options`/`header` validation is a BELT-AND-SUSPENDERS
137
+ * addition: {@link SessionGateImpl.decideElicitation} now also wraps the build in a try/catch (the
138
+ * mandatory total-function guarantee), so this guard's job is only to fail closed to the story-064 deny
139
+ * EARLY (with a "malformed tool_input" reason) rather than relying on the catch. Both together mean a
140
+ * malformed per-question input is a legible dismissal, never a crash and never an approve.
141
+ */
142
+ function isAskUserQuestionInput(input) {
143
+ if (typeof input !== "object" ||
144
+ input === null ||
145
+ !("questions" in input) ||
146
+ !Array.isArray(input.questions)) {
147
+ return false;
148
+ }
149
+ const questions = input.questions;
150
+ if (questions.length === 0)
151
+ return false;
152
+ return questions.every((q) => {
153
+ if (typeof q !== "object" || q === null)
154
+ return false;
155
+ const question = q;
156
+ if (typeof question.header !== "string")
157
+ return false;
158
+ if (!Array.isArray(question.options) || question.options.length === 0)
159
+ return false;
160
+ return question.options.every((o) => typeof o === "object" && o !== null && typeof o.label === "string");
161
+ });
162
+ }
117
163
  /** Internal mutable state of one session's gate. */
118
164
  class SessionGateImpl {
119
165
  constructor(opts) {
@@ -239,6 +285,22 @@ class SessionGateImpl {
239
285
  async decide(call) {
240
286
  if (this.torndown)
241
287
  return "deny"; // a hook racing teardown is never approved
288
+ // === Story 064/065 — AskUserQuestion handling, BEFORE any mode auto-allow or ACP relay. =========
289
+ // AskUserQuestion renders an interactive multiple-choice picker bound to the hidden PTY's stdin.
290
+ // Over the bridge the Zed user can't see or answer it, so an allow (including the bypass/acceptEdits
291
+ // auto-allow below) would stall the turn until the watchdog fires. This branch stays FIRST (after the
292
+ // torndown check) so AskUserQuestion is always intercepted regardless of permission mode.
293
+ //
294
+ // Story 065 (R1): when the client negotiated the elicitation `form` capability, drive a REAL ACP form
295
+ // elicitation and carry the answer back in a deny reason (a PreToolUse hook cannot synthesize a native
296
+ // tool_result — the tool is ALWAYS denied at the wire). Story 065 (R3): otherwise DEGRADE to the
297
+ // story-064 fail-closed deny-guard so the model proceeds without stalling.
298
+ if (isAskUserQuestionTool(call.toolName)) {
299
+ if (this.opts.clientSupportsElicitationForm) {
300
+ return await this.decideElicitation(call);
301
+ }
302
+ return { decision: "deny", reason: askUserQuestionDenyReason() }; // R3 degrade
303
+ }
242
304
  // === Story 046 (R3) — honor the live permission mode BEFORE relaying to Zed. =================
243
305
  // The hook payload carries the current mode (probe-d confirmed `permission_mode` matches the
244
306
  // selected mode in acceptEdits/bypassPermissions). Without this branch the gate raises
@@ -339,6 +401,66 @@ class SessionGateImpl {
339
401
  }
340
402
  });
341
403
  }
404
+ /**
405
+ * Story 065 (R1, R2.1, R2.2) — drive an AskUserQuestion via a REAL ACP form elicitation and map the
406
+ * user's outcome back to a gate decision. ALWAYS returns a `deny`+reason (a PreToolUse hook cannot
407
+ * synthesize a native tool_result): on accept the reason CARRIES the answer (R2.1); on
408
+ * decline/cancel/timeout/transport-error the reason reads as a dismissal (R2.2). Reached ONLY when the
409
+ * client negotiated the elicitation `form` capability (guarded in {@link decide}).
410
+ *
411
+ * FAIL CLOSED (mirrors the whole gate's posture): an elicitation is SESSION-SCOPED, so with no bound
412
+ * ACP session id (nor a payload fallback) we CANNOT raise one → fall back to the story-064 deny. A
413
+ * structurally malformed `tool_input` (not an object with a non-empty `questions` array) likewise falls
414
+ * back — the bridge builder would otherwise project an empty/garbage form. Both are dismissals, never
415
+ * an accept.
416
+ *
417
+ * The turn is BLOCKED awaiting the user exactly like the requestPermission relay, so the end-of-turn
418
+ * watchdog is re-armed via {@link startPermissionHeartbeat} for as long as the elicitation is open
419
+ * (always cleared in `finally`). The round-trip itself is bounded + fail-closed inside
420
+ * {@link requestElicitation} (it never throws and never hangs past the timeout).
421
+ */
422
+ async decideElicitation(call) {
423
+ const sessionId = this.sessionId ?? call.sessionId;
424
+ if (!sessionId) {
425
+ this.warn(`[gate elicitation] FAIL CLOSED: AskUserQuestion for tool_use ${call.toolUseId} arrived before ` +
426
+ `the gate was bound to an ACP session — cannot raise a session-scoped elicitation; denying ` +
427
+ `(story-064 fallback).`);
428
+ return { decision: "deny", reason: askUserQuestionDenyReason() };
429
+ }
430
+ if (!isAskUserQuestionInput(call.toolInput)) {
431
+ this.warn(`[gate elicitation] FAIL CLOSED: AskUserQuestion tool_use ${call.toolUseId} carried a malformed ` +
432
+ `tool_input (expected an object with a non-empty "questions" array) — cannot build a form ` +
433
+ `elicitation; denying (story-064 fallback).`);
434
+ return { decision: "deny", reason: askUserQuestionDenyReason() };
435
+ }
436
+ // The claude is blocked on this response with the JSONL silent, so re-arm the end-of-turn watchdog
437
+ // for as long as the elicitation is open (a slow human decision is NOT a dead turn). Mirror the
438
+ // requestPermission relay's heartbeat; always cleared in `finally`, on success or throw.
439
+ const stopHeartbeat = this.startPermissionHeartbeat();
440
+ try {
441
+ // TOTAL by construction (R4): build + round-trip are wrapped so ANY throw degrades to the
442
+ // story-064 deny with a legible diagnostic, never escaping decideElicitation. buildElicitationRequest
443
+ // itself can throw on a per-question input the structural guard did not catch (e.g. a question with
444
+ // no `options` array → `q.options.map(...)` throws); requestElicitation is fail-closed internally,
445
+ // but this catch is the mandatory total-function guarantee (the hook-server's decideWithTimeout is
446
+ // only the generic defense-in-depth net). A throw here is a dismissal, never an accept.
447
+ const req = buildElicitationRequest(call.toolUseId, sessionId, call.toolInput);
448
+ const resp = await requestElicitation(this.opts.client, req, {
449
+ timeoutMs: this.opts.elicitationTimeoutMs ?? DEFAULT_ELICITATION_TIMEOUT_MS,
450
+ onWarn: (m) => this.warn(m),
451
+ });
452
+ return mapOutcomeToDecision(resp);
453
+ }
454
+ catch (err) {
455
+ this.warn(`[gate elicitation] FAIL CLOSED: AskUserQuestion tool_use ${call.toolUseId} could not be ` +
456
+ `elicited (${err instanceof Error ? err.message : String(err)}) — denying (story-064 ` +
457
+ `fallback); the tool is intercepted, never approved.`);
458
+ return { decision: "deny", reason: askUserQuestionDenyReason() };
459
+ }
460
+ finally {
461
+ stopHeartbeat();
462
+ }
463
+ }
342
464
  /** Bounded poll until the pump has registered `toolUseId` as a clean single JSONL match. On
343
465
  * expiry, resolve anyway — `requestPermission` then fails closed on the missing correlation.
344
466
  *
@@ -27,8 +27,17 @@ export interface ForwardedToolCall {
27
27
  * for a main-chain tool. There is NO parent tool_use.id in the payload (grouping is best-effort). */
28
28
  agentType?: string;
29
29
  }
30
- /** The decider the server forwards each tool call to; returns the enforced `'allow'`/`'deny'`. */
31
- export type ToolCallDecider = (call: ForwardedToolCall) => Promise<"allow" | "deny"> | "allow" | "deny";
30
+ /** Story 064 a deny that carries a custom `permissionDecisionReason` (e.g. the AskUserQuestion
31
+ * anti-stall reason) instead of the {@link defaultDenyReason}. */
32
+ export interface DenyWithReason {
33
+ decision: "deny";
34
+ reason: string;
35
+ }
36
+ /** The enforced outcome a decider returns: a plain allow/deny, or a deny carrying a custom reason.
37
+ * Plain `"deny"` and {@link DenyWithReason} both intercept the tool; the latter just names a reason. */
38
+ export type ToolDecision = "allow" | "deny" | DenyWithReason;
39
+ /** The decider the server forwards each tool call to; returns the enforced {@link ToolDecision}. */
40
+ export type ToolCallDecider = (call: ForwardedToolCall) => Promise<ToolDecision> | ToolDecision;
32
41
  /** The running hook server handle. */
33
42
  export interface HookServer {
34
43
  /** The loopback port the server bound (feeds the story-032 hook URL). */
@@ -84,4 +93,3 @@ export declare function parsePayload(raw: string): ForwardedToolCall | null;
84
93
  * fails fast rather than spawning claude with an ungated hook URL).
85
94
  */
86
95
  export declare function startHookServer(opts: StartHookServerOptions): Promise<HookServer>;
87
- //# sourceMappingURL=hook-server.d.ts.map
@@ -42,6 +42,15 @@ function writeDecision(res, decision) {
42
42
  res.writeHead(200, { "content-type": "application/json" });
43
43
  res.end(json);
44
44
  }
45
+ /** Map a decider's {@link ToolDecision} to the §9 hook body, honoring a {@link DenyWithReason}'s custom
46
+ * reason (story 064). A plain allow/deny uses the default allow/deny body. */
47
+ function toHookResponse(decision, call) {
48
+ if (decision === "allow")
49
+ return allowDecision(call);
50
+ if (decision === "deny")
51
+ return denyDecision(call);
52
+ return denyDecision(call, decision.reason);
53
+ }
45
54
  /**
46
55
  * Parse a PreToolUse payload from raw JSON, normalizing to {@link ForwardedToolCall}. Returns null when
47
56
  * the body is unparseable OR lacks a `tool_use_id`/`tool_name` — the caller fails closed on null (a
@@ -161,7 +170,7 @@ export function startHookServer(opts) {
161
170
  return;
162
171
  }
163
172
  const decision = await decideWithTimeout(decider, call, deciderTimeoutMs, onWarn);
164
- writeDecision(res, decision === "allow" ? allowDecision(call) : denyDecision(call));
173
+ writeDecision(res, toHookResponse(decision, call));
165
174
  }
166
175
  catch (err) {
167
176
  // Any unexpected handler error (body read failure, write failure) → fail closed.
@@ -64,4 +64,3 @@ export type EntrypointAssertion = {
64
64
  * @returns `{ ok:true, entrypoint }` for `cli`; `{ ok:false, entrypoint, reason }` otherwise.
65
65
  */
66
66
  export declare function assertEntrypointCli(event: WatchedMessage): EntrypointAssertion;
67
- //# sourceMappingURL=permission-mode.d.ts.map
@@ -113,4 +113,3 @@ export interface RequestPermissionOptions {
113
113
  * `'deny'` otherwise.
114
114
  */
115
115
  export declare function requestPermission(opts: RequestPermissionOptions): Promise<"allow" | "deny">;
116
- //# sourceMappingURL=request-permission.d.ts.map
@@ -65,4 +65,3 @@ export declare class SettingsManager {
65
65
  */
66
66
  dispose(): void;
67
67
  }
68
- //# sourceMappingURL=settings.d.ts.map
package/dist/settings.js CHANGED
@@ -106,6 +106,13 @@ export class SettingsManager {
106
106
  this.handleSettingsChange();
107
107
  }
108
108
  });
109
+ // Story 059: a best-effort settings watcher must NOT keep the Node event loop alive on its
110
+ // own. A settingsManager that escapes dispose() (an initialize/re-spawn race — see the
111
+ // pre-existing-leak note in acp-agent.ts createSession) otherwise leaves a live fs.watch
112
+ // handle that hangs `node:test` on process exit (the live ACP process is held open by its
113
+ // stdio, never by this watcher). unref() detaches it from the loop's keep-alive set while
114
+ // leaving the subscription fully functional.
115
+ watcher.unref?.();
109
116
  watcher.on("error", (error) => {
110
117
  this.logger.error(`Settings watcher error for ${filePath}:`, error);
111
118
  });
@@ -139,6 +146,8 @@ export class SettingsManager {
139
146
  this.logger.error("Failed to reload settings:", error);
140
147
  }
141
148
  }, 100);
149
+ // Story 059: same rationale as the watcher unref — a pending debounce timer must not block exit.
150
+ this.debounceTimer?.unref?.();
142
151
  }
143
152
  /**
144
153
  * Returns the current merged settings
@@ -14,4 +14,3 @@ export interface StopReasonLogger {
14
14
  * Total: never throws. `null`/`undefined` (absence, not drift) return the fallback without logging.
15
15
  */
16
16
  export declare function mapStopReason(raw: unknown, logger?: StopReasonLogger): StopReason;
17
- //# sourceMappingURL=stop-reason-map.d.ts.map
@@ -55,4 +55,3 @@ export declare function collectSidechainToolUses(rows: SessionMessage[]): Sidech
55
55
  * Mutates `correlator`, `registered`, and `parentMap` in place; returns nothing.
56
56
  */
57
57
  export declare function registerSidechainGateToolUses(uses: SidechainToolUse[], correlator: ToolUseCorrelator, registered: Set<string>, parentMap: Map<string, SidechainToolUse>): void;
58
- //# sourceMappingURL=subagent-gate.d.ts.map
@@ -60,4 +60,3 @@ export declare function sourceSubagentRows(sessionId: string, mainChain: Session
60
60
  listSubagents: ListSubagents;
61
61
  getSubagentMessages: GetSubagentMessages;
62
62
  }): Promise<SessionMessage[]>;
63
- //# sourceMappingURL=subagent-source.d.ts.map
@@ -37,4 +37,3 @@ export interface SubagentWatcher {
37
37
  * interval (setInterval would overlap).
38
38
  */
39
39
  export declare function createSubagentWatcher(opts: SubagentWatcherOptions): SubagentWatcher;
40
- //# sourceMappingURL=subagent-watcher.d.ts.map
package/dist/tools.d.ts CHANGED
@@ -124,4 +124,3 @@ export declare const createTaskHook: (options: {
124
124
  onChange?: () => Promise<void>;
125
125
  }) => HookCallback;
126
126
  export {};
127
- //# sourceMappingURL=tools.d.ts.map
package/dist/tools.js CHANGED
@@ -325,7 +325,11 @@ export function toolUpdateFromToolResult(toolResult, toolUse, supportsTerminalOu
325
325
  if ("is_error" in toolResult &&
326
326
  toolResult.is_error &&
327
327
  toolResult.content &&
328
- toolResult.content.length > 0) {
328
+ toolResult.content.length > 0 &&
329
+ // Story 056 (#776): a FAILED Bash with a negotiated terminal must still render as terminal
330
+ // output (terminal_output + terminal_exit exit_code 1 via `case "Bash"`), not markdown — so it
331
+ // is excluded from this error-only early-return. Every other errored result is unchanged.
332
+ !(toolUse?.name === "Bash" && supportsTerminalOutput)) {
329
333
  // Only return errors
330
334
  return toAcpContentUpdate(toolResult.content, true);
331
335
  }
@@ -4,4 +4,3 @@
4
4
  * index.ts calls this so the truth table is unit-checkable without running the entrypoint.
5
5
  */
6
6
  export declare function usageUpdateEnabled(env?: Record<string, string | undefined>): boolean;
7
- //# sourceMappingURL=usage-env.d.ts.map
package/dist/usage.d.ts CHANGED
@@ -32,6 +32,9 @@ export interface UsageOptions {
32
32
  * • R3.1 — the optional `cost` field is INTENTIONALLY OMITTED and must NEVER be fabricated:
33
33
  * the JSONL usage block carries only token counts, and `cost` is optional in the Zed v1 struct,
34
34
  * so omitting it is contract-correct (an invented cost would violate §1 "never fabricate").
35
+ * Story 059 EVIDENCE (2026-06-28): an audit of 5169 local transcripts found 0 carrying
36
+ * `total_cost_usd` as a JSON key — it lives only in the SDK `result` envelope (`claude -p`), never
37
+ * in the interactive PTY+tail JSONL mapped here (the 68 substring hits were all conversation text).
35
38
  */
36
39
  export declare function toUsageUpdate(message: UsageCarrier, options?: UsageOptions): UsageUpdateNotification | undefined;
37
40
  export interface UsageFlagOptions extends UsageOptions {
@@ -51,4 +54,3 @@ export interface UsageFlagOptions extends UsageOptions {
51
54
  * shape (see {@link toUsageUpdate}): no `cost`, and `size` is the inferred window on the live path.
52
55
  */
53
56
  export declare function usageUpdatesFor(message: UsageCarrier, options?: UsageFlagOptions): UsageUpdateNotification[];
54
- //# sourceMappingURL=usage.d.ts.map
package/dist/usage.js CHANGED
@@ -22,6 +22,9 @@
22
22
  * • R3.1 — the optional `cost` field is INTENTIONALLY OMITTED and must NEVER be fabricated:
23
23
  * the JSONL usage block carries only token counts, and `cost` is optional in the Zed v1 struct,
24
24
  * so omitting it is contract-correct (an invented cost would violate §1 "never fabricate").
25
+ * Story 059 EVIDENCE (2026-06-28): an audit of 5169 local transcripts found 0 carrying
26
+ * `total_cost_usd` as a JSON key — it lives only in the SDK `result` envelope (`claude -p`), never
27
+ * in the interactive PTY+tail JSONL mapped here (the 68 substring hits were all conversation text).
25
28
  */
26
29
  export function toUsageUpdate(message, options = {}) {
27
30
  const input = message.usage?.input_tokens;
package/dist/utils.d.ts CHANGED
@@ -13,4 +13,3 @@ export declare function nodeToWebWritable(nodeStream: Writable): WritableStream<
13
13
  export declare function nodeToWebReadable(nodeStream: Readable): ReadableStream<Uint8Array>;
14
14
  export declare function unreachable(value: never, logger?: Logger): void;
15
15
  export declare function sleep(time: number): Promise<void>;
16
- //# sourceMappingURL=utils.d.ts.map
@@ -23,4 +23,3 @@ export declare function parseJsonc(text: string): any;
23
23
  * this is the programmatic merge used in tests and tooling.)
24
24
  */
25
25
  export declare function mergeAgentServer(settingsText: string, name: string, entry: ZedAgentEntry): string;
26
- //# sourceMappingURL=zed-register.d.ts.map
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.5.2",
6
+ "version": "0.7.0",
7
7
  "description": "Run the official Claude Code TUI in Zed's agent panel on your Claude Pro/Max subscription — an ACP-over-PTY bridge created for Anthropic's billing split (paused June 15; see README).",
8
8
  "main": "dist/lib.js",
9
9
  "types": "dist/lib.d.ts",
@@ -16,7 +16,7 @@
16
16
  "types": "./dist/lib.d.ts",
17
17
  "import": "./dist/lib.js"
18
18
  },
19
- "./*": "./*"
19
+ "./package.json": "./package.json"
20
20
  },
21
21
  "files": [
22
22
  "dist/",
@@ -59,21 +59,24 @@
59
59
  },
60
60
  "author": "lucascouts",
61
61
  "license": "Apache-2.0",
62
+ "engines": {
63
+ "node": ">=20"
64
+ },
62
65
  "dependencies": {
63
- "@agentclientprotocol/sdk": "0.28.1",
64
- "@anthropic-ai/claude-agent-sdk": "0.3.183",
66
+ "@agentclientprotocol/sdk": "1.0.0",
67
+ "@anthropic-ai/claude-agent-sdk": "0.3.195",
65
68
  "node-pty": "1.1.0",
66
69
  "zod": "^3.25.0 || ^4.0.0"
67
70
  },
68
71
  "devDependencies": {
69
- "@anthropic-ai/sdk": "0.105.0",
72
+ "@anthropic-ai/sdk": "0.106.0",
70
73
  "@eslint/js": "10.0.1",
71
- "@types/node": "26.0.0",
72
- "@typescript-eslint/eslint-plugin": "8.61.1",
73
- "@typescript-eslint/parser": "8.61.1",
74
+ "@types/node": "26.0.1",
75
+ "@typescript-eslint/eslint-plugin": "8.62.0",
76
+ "@typescript-eslint/parser": "8.62.0",
74
77
  "eslint": "10.5.0",
75
78
  "eslint-config-prettier": "10.1.8",
76
- "globals": "17.6.0",
79
+ "globals": "17.7.0",
77
80
  "prettier": "3.8.4",
78
81
  "ts-node": "10.9.2",
79
82
  "typescript": "6.0.3"
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-agent.d.ts","sourceRoot":"","sources":["../src/acp-agent.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ansi-mirror.d.ts","sourceRoot":"","sources":["../src/ansi-mirror.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAEpD,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EACvB,IAAI,GAAE,iBAAsB,GAC3B,WAAW,GAAG,SAAS,CAgBzB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"besteffort.d.ts","sourceRoot":"","sources":["../src/besteffort.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAClG,OAAO,EAAE,kBAAkB,EAAE,KAAK,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEpF;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,IAAI,EAAE,OAAO,CAAC;IACd,0EAA0E;IAC1E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEtD;AAED,KAAK,YAAY,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,wBAAwB,CAAC;AACpF,KAAK,WAAW,GAAG,OAAO,kBAAkB,CAAC;AA+C7C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,EAChC,IAAI,EAAE,WAAW,GAAG,MAAM,EAC1B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,EACvB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,WAAW,CAAA;CAAE,GACjC,mBAAmB,EAAE,CA0CvB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"entrypoint-guard.d.ts","sourceRoot":"","sources":["../../src/billing/entrypoint-guard.ts"],"names":[],"mappings":"AAsCA;;;GAGG;AACH,eAAO,MAAM,wBAAwB,uFAO3B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,kBAAkB,mDAAoD,CAAC;AAEpF,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpE;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAQtE;AAeD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,cAAc,CAAA;CAAE,GACxE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAC;AAEnF;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,CAUjE;AAkBD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,0GAA0G;IAC1G,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kGAAkG;IAClG,WAAW,CAAC,IAAI,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,QAAQ,GAAG,SAAS,CAAC;KACvC,GAAG,IAAI,CAAC;CACV;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa,CAkBlF;AAuBD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,CAenF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-path.d.ts","sourceRoot":"","sources":["../src/claude-path.ts"],"names":[],"mappings":"AA6BA;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,YAAY,CAAC;AAenD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhE;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC;AAc/E;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,WAAgC,GACrC,MAAM,GAAG,IAAI,CAMf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAChC,IAAI,CAON;AAED,4FAA4F;AAC5F,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACnD,qEAAqE;IACrE,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,cAAmB,GAAG,MAAM,CA6BnE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"diff-enriched-reader.d.ts","sourceRoot":"","sources":["../src/diff-enriched-reader.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,qBAAqB,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzE;AAED,mGAAmG;AACnG,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACjD;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,WAAW,EACjB,IAAI,GAAE,yBAA8B,GACnC,WAAW,CAoCb"}