flavor-code 1.2.1
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/LICENSE +21 -0
- package/README.md +1081 -0
- package/dist/agent/loop.d.ts +31 -0
- package/dist/agent/message-queue.d.ts +19 -0
- package/dist/agent/planner.d.ts +28 -0
- package/dist/agent/subagents.d.ts +50 -0
- package/dist/agent/task-plan.d.ts +60 -0
- package/dist/agent/task-tools.d.ts +11 -0
- package/dist/agent/types.d.ts +117 -0
- package/dist/app-WC2XXGLM.js +3185 -0
- package/dist/app-WC2XXGLM.js.map +1 -0
- package/dist/auth/oauth-config.d.ts +4 -0
- package/dist/auth/oauth.d.ts +21 -0
- package/dist/auth/store.d.ts +15 -0
- package/dist/auth/types.d.ts +33 -0
- package/dist/chunk-BU64GNXE.js +15771 -0
- package/dist/chunk-BU64GNXE.js.map +1 -0
- package/dist/chunk-DM64TM4Z.js +124 -0
- package/dist/chunk-DM64TM4Z.js.map +1 -0
- package/dist/chunk-JZ322RCJ.js +40 -0
- package/dist/chunk-JZ322RCJ.js.map +1 -0
- package/dist/chunk-M744K7MK.js +246 -0
- package/dist/chunk-M744K7MK.js.map +1 -0
- package/dist/chunk-MVIMQEQT.js +692 -0
- package/dist/chunk-MVIMQEQT.js.map +1 -0
- package/dist/chunk-VOCZVFP7.js +153 -0
- package/dist/chunk-VOCZVFP7.js.map +1 -0
- package/dist/chunk-XS2JU6S3.js +35557 -0
- package/dist/chunk-XS2JU6S3.js.map +1 -0
- package/dist/claude-ink-ZL4UZMFY.js +27 -0
- package/dist/claude-ink-ZL4UZMFY.js.map +1 -0
- package/dist/cli.js +915 -0
- package/dist/cli.js.map +1 -0
- package/dist/codeisland/activate.mjs +74 -0
- package/dist/codeisland/bridge.mjs +97 -0
- package/dist/codeisland/flavor-plugin.json +27 -0
- package/dist/config/load.d.ts +19 -0
- package/dist/config/protected-file.d.ts +15 -0
- package/dist/config/schema.d.ts +176 -0
- package/dist/config/secret-envelope.d.ts +8 -0
- package/dist/context/compaction.d.ts +44 -0
- package/dist/context/manager.d.ts +65 -0
- package/dist/context/summarizer.d.ts +15 -0
- package/dist/desktop/main.js +17778 -0
- package/dist/desktop/main.js.map +1 -0
- package/dist/desktop/preload.cjs +90 -0
- package/dist/desktop/preload.cjs.map +1 -0
- package/dist/desktop-renderer/assets/index-C66pDvHs.js +144 -0
- package/dist/desktop-renderer/assets/index-C66pDvHs.js.map +1 -0
- package/dist/desktop-renderer/assets/index-Cm_ktmXm.css +1 -0
- package/dist/desktop-renderer/index.html +16 -0
- package/dist/devtools-SXJBSV2N.js +3 -0
- package/dist/devtools-SXJBSV2N.js.map +1 -0
- package/dist/execution/docker.d.ts +29 -0
- package/dist/execution/factory.d.ts +3 -0
- package/dist/execution/types.d.ts +18 -0
- package/dist/goal/classifier.d.ts +12 -0
- package/dist/goal/orchestrator.d.ts +34 -0
- package/dist/goal/planner.d.ts +9 -0
- package/dist/goal/store.d.ts +9 -0
- package/dist/goal/types.d.ts +190 -0
- package/dist/hallucination/confidence.d.ts +12 -0
- package/dist/hallucination/evidence-ledger.d.ts +29 -0
- package/dist/hallucination/guard.d.ts +27 -0
- package/dist/hallucination/messages.d.ts +10 -0
- package/dist/hallucination/retry-monitor.d.ts +19 -0
- package/dist/hallucination/sliding-window.d.ts +13 -0
- package/dist/hallucination/types.d.ts +49 -0
- package/dist/harness/local.d.ts +54 -0
- package/dist/hooks/bus.d.ts +9 -0
- package/dist/hooks/types.d.ts +105 -0
- package/dist/ide/client.d.ts +35 -0
- package/dist/incidents/reporter.d.ts +38 -0
- package/dist/init/project.d.ts +25 -0
- package/dist/load-WQGNTCHC.js +20 -0
- package/dist/load-WQGNTCHC.js.map +1 -0
- package/dist/loop/budget.d.ts +11 -0
- package/dist/loop/isolation.d.ts +21 -0
- package/dist/loop/orchestrator.d.ts +82 -0
- package/dist/loop/store.d.ts +13 -0
- package/dist/loop/types.d.ts +142 -0
- package/dist/loop/verifier.d.ts +13 -0
- package/dist/mcp/client.d.ts +66 -0
- package/dist/mcp/sdk.d.ts +27 -0
- package/dist/memory/coordinator.d.ts +32 -0
- package/dist/memory/extractor.d.ts +15 -0
- package/dist/memory/intent.d.ts +2 -0
- package/dist/memory/retrieval.d.ts +13 -0
- package/dist/memory/review.d.ts +36 -0
- package/dist/memory/similarity.d.ts +5 -0
- package/dist/memory/store.d.ts +58 -0
- package/dist/memory/types.d.ts +37 -0
- package/dist/models/anthropic.d.ts +24 -0
- package/dist/models/cache-profile.d.ts +23 -0
- package/dist/models/openai.d.ts +24 -0
- package/dist/models/registry.d.ts +16 -0
- package/dist/models/structured.d.ts +75 -0
- package/dist/models/types.d.ts +93 -0
- package/dist/permissions/classifier.d.ts +9 -0
- package/dist/permissions/engine.d.ts +28 -0
- package/dist/plugins/host.d.ts +15 -0
- package/dist/plugins/types.d.ts +136 -0
- package/dist/production.d.ts +59 -0
- package/dist/prompts/system.d.ts +28 -0
- package/dist/rpc/schema.d.ts +61 -0
- package/dist/rpc/server.d.ts +54 -0
- package/dist/sdk/index.d.ts +19 -0
- package/dist/sdk/index.js +53 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/session/checkpoint.d.ts +25 -0
- package/dist/session/store.d.ts +154 -0
- package/dist/session/tree.d.ts +31 -0
- package/dist/skills/builtin-loop.d.ts +12 -0
- package/dist/skills/registry.d.ts +47 -0
- package/dist/skills/tool.d.ts +9 -0
- package/dist/sleep/organizer.d.ts +37 -0
- package/dist/tools/ask-user-question.d.ts +49 -0
- package/dist/tools/file-diff.d.ts +9 -0
- package/dist/tools/files.d.ts +49 -0
- package/dist/tools/lsp.d.ts +77 -0
- package/dist/tools/managed.d.ts +59 -0
- package/dist/tools/runtime.d.ts +58 -0
- package/dist/tools/search.d.ts +76 -0
- package/dist/tools/shell.d.ts +37 -0
- package/dist/tools/task-output.d.ts +53 -0
- package/dist/tools/todo-write.d.ts +35 -0
- package/dist/tools/types.d.ts +56 -0
- package/dist/trace/recorder.d.ts +14 -0
- package/dist/trace/replay.d.ts +3 -0
- package/dist/trace/schema.d.ts +26 -0
- package/dist/ui/commands.d.ts +67 -0
- package/dist/ui/session.d.ts +126 -0
- package/dist/ui/transcript.d.ts +89 -0
- package/dist/utils/async.d.ts +5 -0
- package/dist/utils/envUtils.d.ts +1 -0
- package/dist/utils/error.d.ts +2 -0
- package/dist/utils/execFileNoThrow.d.ts +13 -0
- package/dist/utils/intl.d.ts +18 -0
- package/dist/utils/json.d.ts +44 -0
- package/dist/utils/log.d.ts +28 -0
- package/dist/utils/redact.d.ts +10 -0
- package/dist/utils/usage-summary.d.ts +34 -0
- package/dist/utils/version.d.ts +6 -0
- package/package.json +124 -0
- package//346/212/200/346/234/257/346/226/271/346/241/210/346/212/245/345/221/212.md +4797 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "node:module"; const require = createRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/ui/task-progress-model.ts
|
|
5
|
+
var FRAMES = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
|
|
6
|
+
function activityFrame(elapsedMs) {
|
|
7
|
+
return FRAMES[Math.floor(Math.max(0, elapsedMs) / 120) % FRAMES.length];
|
|
8
|
+
}
|
|
9
|
+
function formatElapsed(elapsedMs) {
|
|
10
|
+
return `${Math.floor(Math.max(0, elapsedMs) / 1e3)}s`;
|
|
11
|
+
}
|
|
12
|
+
function staticTaskLines(snapshot) {
|
|
13
|
+
const lines = (snapshot.plan?.tasks ?? []).map((task) => {
|
|
14
|
+
const glyph = task.status === "completed" ? "\u2713" : task.status === "failed" || task.status === "blocked" || task.status === "cancelled" ? "\xD7" : "\xB7";
|
|
15
|
+
const label = task.status === "in_progress" ? task.activeForm : task.subject;
|
|
16
|
+
const status = task.status === "in_progress" ? "running" : task.status === "completed" ? "done" : task.status.replace("_", " ");
|
|
17
|
+
return `${glyph} ${label} \xB7 ${status}`;
|
|
18
|
+
});
|
|
19
|
+
for (const node of snapshot.subagents.graph?.nodes ?? []) {
|
|
20
|
+
const status = snapshot.subagents.states[node.id] ?? "pending";
|
|
21
|
+
const glyph = status === "completed" ? "\u2713" : status === "failed" || status === "blocked" || status === "cancelled" ? "\xD7" : "\xB7";
|
|
22
|
+
const duration = ["completed", "failed", "blocked", "cancelled"].includes(status) && snapshot.subagents.elapsedMs?.[node.id] !== void 0 ? ` (${formatElapsed(snapshot.subagents.elapsedMs[node.id])})` : "";
|
|
23
|
+
lines.push(`${glyph} subagent: ${node.description} \xB7 ${status}${duration}`);
|
|
24
|
+
}
|
|
25
|
+
return lines;
|
|
26
|
+
}
|
|
27
|
+
function statusPresentation(block, elapsedMs, interactive) {
|
|
28
|
+
if (block.state === "running" && block.activity === "model") {
|
|
29
|
+
return interactive ? {
|
|
30
|
+
glyph: activityFrame(elapsedMs),
|
|
31
|
+
text: `Flavoring\u2026 (${formatElapsed(elapsedMs)} \xB7 thinking)`,
|
|
32
|
+
color: "#81c8f2",
|
|
33
|
+
statusLabel: "thinking",
|
|
34
|
+
statusColor: "ansi:blackBright"
|
|
35
|
+
} : {
|
|
36
|
+
glyph: "\xB7",
|
|
37
|
+
text: "Flavoring \xB7 thinking",
|
|
38
|
+
color: "#81c8f2",
|
|
39
|
+
statusLabel: "thinking",
|
|
40
|
+
statusColor: "ansi:blackBright"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (block.state === "running" && block.task !== void 0) {
|
|
44
|
+
const isSubagent2 = block.task.role === "subagent";
|
|
45
|
+
const activeForm = block.task.activeForm;
|
|
46
|
+
return interactive ? {
|
|
47
|
+
glyph: activityFrame(elapsedMs),
|
|
48
|
+
text: `${activeForm}\u2026 (${formatElapsed(elapsedMs)})`,
|
|
49
|
+
color: "#d77757",
|
|
50
|
+
...isSubagent2 ? { badge: "subagent:", badgeColor: "#81c8f2" } : {}
|
|
51
|
+
} : {
|
|
52
|
+
glyph: "\xB7",
|
|
53
|
+
text: isSubagent2 ? `${activeForm} \xB7 running` : activeForm,
|
|
54
|
+
...isSubagent2 ? {
|
|
55
|
+
badge: "subagent:",
|
|
56
|
+
badgeColor: "#81c8f2",
|
|
57
|
+
statusLabel: "running",
|
|
58
|
+
statusColor: "#d77757"
|
|
59
|
+
} : {}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const duration = block.elapsedMs === void 0 ? "" : ` (${formatElapsed(block.elapsedMs)})`;
|
|
63
|
+
const isSubagent = block.task?.role === "subagent";
|
|
64
|
+
const label = statusLabelForState(block.state);
|
|
65
|
+
const statusColor = label === void 0 ? void 0 : statusColorForLabel(label);
|
|
66
|
+
if (block.state === "completed") {
|
|
67
|
+
return {
|
|
68
|
+
glyph: "\u2713",
|
|
69
|
+
text: `${stripSubagentPrefix(withoutGlyph(block.text), isSubagent)}${duration}`,
|
|
70
|
+
color: "ansi:green",
|
|
71
|
+
...isSubagent ? { badge: "subagent:", badgeColor: "#81c8f2" } : {},
|
|
72
|
+
...label === void 0 ? {} : {
|
|
73
|
+
statusLabel: label,
|
|
74
|
+
...statusColor === void 0 ? {} : { statusColor }
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
if (block.state === "failed" || block.state === "cancelled") {
|
|
79
|
+
return {
|
|
80
|
+
glyph: "\xD7",
|
|
81
|
+
text: `${stripSubagentPrefix(withoutGlyph(block.text), isSubagent)}${duration}`,
|
|
82
|
+
color: "#e06c50",
|
|
83
|
+
...isSubagent ? { badge: "subagent:", badgeColor: "#81c8f2" } : {},
|
|
84
|
+
...label === void 0 ? {} : {
|
|
85
|
+
statusLabel: label,
|
|
86
|
+
...statusColor === void 0 ? {} : { statusColor }
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
glyph: "\xB7",
|
|
92
|
+
text: stripSubagentPrefix(withoutGlyph(block.text), isSubagent),
|
|
93
|
+
...isSubagent ? { badge: "subagent:", badgeColor: "#81c8f2" } : {},
|
|
94
|
+
...label === void 0 ? {} : {
|
|
95
|
+
statusLabel: label,
|
|
96
|
+
...statusColor === void 0 ? {} : { statusColor }
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function statusLabelForState(state) {
|
|
101
|
+
if (state === "running") return "running";
|
|
102
|
+
if (state === "completed") return "done";
|
|
103
|
+
if (state === "failed") return "failed";
|
|
104
|
+
if (state === "cancelled") return "cancelled";
|
|
105
|
+
if (state === "info") return "pending";
|
|
106
|
+
return void 0;
|
|
107
|
+
}
|
|
108
|
+
function statusColorForLabel(label) {
|
|
109
|
+
if (label === "running") return "#d77757";
|
|
110
|
+
if (label === "pending") return "ansi:blackBright";
|
|
111
|
+
return void 0;
|
|
112
|
+
}
|
|
113
|
+
function withoutGlyph(text) {
|
|
114
|
+
return text.replace(/^[✓×○·]\s*/u, "");
|
|
115
|
+
}
|
|
116
|
+
function stripSubagentPrefix(text, isSubagent) {
|
|
117
|
+
return isSubagent ? text.replace(/^subagent:\s*/u, "") : text;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export {
|
|
121
|
+
staticTaskLines,
|
|
122
|
+
statusPresentation
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=chunk-DM64TM4Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/task-progress-model.ts"],"sourcesContent":["import type { TranscriptBlock } from \"./transcript.js\";\r\nimport type { TaskSnapshot } from \"../agent/types.js\";\r\nimport type { Color } from \"../claude-ink/styles.js\";\r\n\r\nconst FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"] as const;\r\n\r\nexport interface StatusPresentation {\r\n glyph: string;\r\n text: string;\r\n color?: Color;\r\n badge?: string;\r\n badgeColor?: Color;\r\n /** The status word rendered after \" · \" (e.g. \"running\", \"pending\", \"done\"). */\r\n statusLabel?: string;\r\n /** Color override for statusLabel. When undefined, inherits from `color`. */\r\n statusColor?: Color;\r\n}\r\n\r\nexport function activityFrame(elapsedMs: number): string {\r\n return FRAMES[Math.floor(Math.max(0, elapsedMs) / 120) % FRAMES.length]!;\r\n}\r\n\r\nexport function formatElapsed(elapsedMs: number): string {\r\n return `${Math.floor(Math.max(0, elapsedMs) / 1_000)}s`;\r\n}\r\n\r\nexport function staticTaskLines(snapshot: TaskSnapshot): string[] {\r\n const lines = (snapshot.plan?.tasks ?? []).map((task) => {\r\n const glyph = task.status === \"completed\" ? \"✓\"\r\n : task.status === \"failed\" || task.status === \"blocked\" || task.status === \"cancelled\" ? \"×\" : \"·\";\r\n const label = task.status === \"in_progress\" ? task.activeForm : task.subject;\r\n const status = task.status === \"in_progress\" ? \"running\" : task.status === \"completed\" ? \"done\" : task.status.replace(\"_\", \" \");\r\n return `${glyph} ${label} · ${status}`;\r\n });\r\n for (const node of snapshot.subagents.graph?.nodes ?? []) {\r\n const status = snapshot.subagents.states[node.id] ?? \"pending\";\r\n const glyph = status === \"completed\" ? \"✓\" : status === \"failed\" || status === \"blocked\" || status === \"cancelled\" ? \"×\" : \"·\";\r\n const duration = [\"completed\", \"failed\", \"blocked\", \"cancelled\"].includes(status) && snapshot.subagents.elapsedMs?.[node.id] !== undefined\r\n ? ` (${formatElapsed(snapshot.subagents.elapsedMs[node.id]!)})` : \"\";\r\n lines.push(`${glyph} subagent: ${node.description} · ${status}${duration}`);\r\n }\r\n return lines;\r\n}\r\n\r\nexport function statusPresentation(\n block: Extract<TranscriptBlock, { kind: \"status\" }>,\n elapsedMs: number,\n interactive: boolean,\n): StatusPresentation {\n if (block.state === \"running\" && block.activity === \"model\") {\n return interactive ? {\n glyph: activityFrame(elapsedMs),\n text: `Flavoring… (${formatElapsed(elapsedMs)} · thinking)`,\n color: \"#81c8f2\",\n statusLabel: \"thinking\",\n statusColor: \"ansi:blackBright\",\n } : {\n glyph: \"·\",\n text: \"Flavoring · thinking\",\n color: \"#81c8f2\",\n statusLabel: \"thinking\",\n statusColor: \"ansi:blackBright\",\n };\n }\n if (block.state === \"running\" && block.task !== undefined) {\n const isSubagent = block.task.role === \"subagent\";\r\n const activeForm = block.task.activeForm;\r\n return interactive ? {\r\n glyph: activityFrame(elapsedMs),\r\n text: `${activeForm}… (${formatElapsed(elapsedMs)})`,\r\n color: \"#d77757\",\r\n ...(isSubagent ? { badge: \"subagent:\", badgeColor: \"#81c8f2\" as Color } : {}),\r\n } : {\r\n glyph: \"·\",\r\n text: isSubagent ? `${activeForm} · running` : activeForm,\r\n ...(isSubagent ? { badge: \"subagent:\", badgeColor: \"#81c8f2\" as Color,\r\n statusLabel: \"running\", statusColor: \"#d77757\" as Color } : {}),\r\n };\r\n }\r\n const duration = block.elapsedMs === undefined ? \"\" : ` (${formatElapsed(block.elapsedMs)})`;\r\n const isSubagent = block.task?.role === \"subagent\";\r\n const label = statusLabelForState(block.state);\r\n const statusColor = label === undefined ? undefined : statusColorForLabel(label);\r\n if (block.state === \"completed\") {\r\n return { glyph: \"✓\", text: `${stripSubagentPrefix(withoutGlyph(block.text), isSubagent)}${duration}`, color: \"ansi:green\",\r\n ...(isSubagent ? { badge: \"subagent:\", badgeColor: \"#81c8f2\" as Color } : {}),\r\n ...(label === undefined ? {} : {\n statusLabel: label,\n ...(statusColor === undefined ? {} : { statusColor }),\n }),\n };\r\n }\r\n if (block.state === \"failed\" || block.state === \"cancelled\") {\r\n return { glyph: \"×\", text: `${stripSubagentPrefix(withoutGlyph(block.text), isSubagent)}${duration}`, color: \"#e06c50\",\r\n ...(isSubagent ? { badge: \"subagent:\", badgeColor: \"#81c8f2\" as Color } : {}),\r\n ...(label === undefined ? {} : {\n statusLabel: label,\n ...(statusColor === undefined ? {} : { statusColor }),\n }),\n };\r\n }\r\n return { glyph: \"·\", text: stripSubagentPrefix(withoutGlyph(block.text), isSubagent),\r\n ...(isSubagent ? { badge: \"subagent:\", badgeColor: \"#81c8f2\" as Color } : {}),\r\n ...(label === undefined ? {} : {\n statusLabel: label,\n ...(statusColor === undefined ? {} : { statusColor }),\n }),\n };\r\n}\r\n\r\nfunction statusLabelForState(state: string): string | undefined {\r\n if (state === \"running\") return \"running\";\r\n if (state === \"completed\") return \"done\";\r\n if (state === \"failed\") return \"failed\";\r\n if (state === \"cancelled\") return \"cancelled\";\r\n if (state === \"info\") return \"pending\";\r\n return undefined;\r\n}\r\n\r\nfunction statusColorForLabel(label: string): Color | undefined {\r\n if (label === \"running\") return \"#d77757\";\r\n if (label === \"pending\") return \"ansi:blackBright\";\r\n // done / failed / cancelled — blend with surrounding text\r\n return undefined;\r\n}\r\n\r\nfunction withoutGlyph(text: string): string {\r\n return text.replace(/^[✓×○·]\\s*/u, \"\");\r\n}\r\n\r\nfunction stripSubagentPrefix(text: string, isSubagent: boolean): string {\r\n return isSubagent ? text.replace(/^subagent:\\s*/u, \"\") : text;\r\n}\r\n"],"mappings":"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","names":["isSubagent"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "node:module"; const require = createRequire(import.meta.url);
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
10
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
11
|
+
}) : x)(function(x) {
|
|
12
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
13
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
14
|
+
});
|
|
15
|
+
var __commonJS = (cb, mod) => function __require2() {
|
|
16
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
27
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
28
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
29
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
30
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
31
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
32
|
+
mod
|
|
33
|
+
));
|
|
34
|
+
|
|
35
|
+
export {
|
|
36
|
+
__require,
|
|
37
|
+
__commonJS,
|
|
38
|
+
__toESM
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=chunk-JZ322RCJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "node:module"; const require = createRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
message,
|
|
5
|
+
redactErrorText,
|
|
6
|
+
redactSecrets
|
|
7
|
+
} from "./chunk-BU64GNXE.js";
|
|
8
|
+
|
|
9
|
+
// src/rpc/server.ts
|
|
10
|
+
import { createInterface } from "readline";
|
|
11
|
+
|
|
12
|
+
// src/rpc/schema.ts
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
var base = { id: z.string().min(1).max(128).optional() };
|
|
15
|
+
var RpcCommandSchema = z.discriminatedUnion("type", [
|
|
16
|
+
z.object({ ...base, type: z.literal("prompt"), message: z.string().trim().min(1).max(1e6) }).strict(),
|
|
17
|
+
z.object({ ...base, type: z.literal("steer"), message: z.string().trim().min(1).max(1e6) }).strict(),
|
|
18
|
+
z.object({ ...base, type: z.literal("follow_up"), message: z.string().trim().min(1).max(1e6) }).strict(),
|
|
19
|
+
z.object({ ...base, type: z.literal("abort") }).strict(),
|
|
20
|
+
z.object({ ...base, type: z.literal("get_state") }).strict(),
|
|
21
|
+
z.object({ ...base, type: z.literal("get_queue") }).strict(),
|
|
22
|
+
z.object({ ...base, type: z.literal("clear_queue") }).strict(),
|
|
23
|
+
z.object({ ...base, type: z.literal("approval_decision"), approvalId: z.string().min(1).max(128), decision: z.enum(["once", "always", "deny"]) }).strict(),
|
|
24
|
+
z.object({ ...base, type: z.literal("write_commit"), writeId: z.string().uuid() }).strict(),
|
|
25
|
+
z.object({ ...base, type: z.literal("checkpoint"), label: z.string().trim().min(1).max(256).optional() }).strict(),
|
|
26
|
+
z.object({ ...base, type: z.literal("get_tree") }).strict(),
|
|
27
|
+
z.object({ ...base, type: z.literal("rewind"), nodeId: z.string().min(1).max(256) }).strict(),
|
|
28
|
+
z.object({ ...base, type: z.literal("unrevert") }).strict(),
|
|
29
|
+
z.object({ ...base, type: z.literal("fork"), nodeId: z.string().min(1).max(256) }).strict(),
|
|
30
|
+
z.object({ ...base, type: z.literal("shutdown") }).strict()
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
// src/rpc/server.ts
|
|
34
|
+
var FlavorRpcServer = class {
|
|
35
|
+
#options;
|
|
36
|
+
#runtime;
|
|
37
|
+
#writeTail = Promise.resolve();
|
|
38
|
+
#closing = false;
|
|
39
|
+
#lines;
|
|
40
|
+
constructor(options) {
|
|
41
|
+
this.#options = options;
|
|
42
|
+
}
|
|
43
|
+
async start() {
|
|
44
|
+
this.#runtime = await this.#options.createRuntime({
|
|
45
|
+
workspace: this.#options.workspace,
|
|
46
|
+
output: (event) => {
|
|
47
|
+
void this.#emit({ type: "event", sessionId: this.#runtime?.sessionId, event }, "output");
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
await this.#runtime.session.start();
|
|
51
|
+
const lines = createInterface({ input: this.#options.input, crlfDelay: Infinity });
|
|
52
|
+
this.#lines = lines;
|
|
53
|
+
try {
|
|
54
|
+
for await (const line of lines) {
|
|
55
|
+
if (this.#closing) break;
|
|
56
|
+
await this.#accept(line);
|
|
57
|
+
}
|
|
58
|
+
} finally {
|
|
59
|
+
this.#lines = void 0;
|
|
60
|
+
this.#runtime.rpcWrites?.dispose();
|
|
61
|
+
await this.#runtime.session.close();
|
|
62
|
+
await this.#runtime.dispose();
|
|
63
|
+
await this.#writeTail;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async #accept(line) {
|
|
67
|
+
let input;
|
|
68
|
+
try {
|
|
69
|
+
input = JSON.parse(line);
|
|
70
|
+
} catch {
|
|
71
|
+
await this.#emit({ type: "error", code: "invalid_json", message: "Input is not valid JSON" }, "response");
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const parsed = RpcCommandSchema.safeParse(input);
|
|
75
|
+
if (!parsed.success) {
|
|
76
|
+
await this.#emit({
|
|
77
|
+
type: "error",
|
|
78
|
+
code: "invalid_command",
|
|
79
|
+
message: parsed.error.issues[0]?.message ?? "Invalid command"
|
|
80
|
+
}, "response");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
await this.#options.onRecord?.("command", parsed.data);
|
|
84
|
+
try {
|
|
85
|
+
await this.#dispatch(parsed.data);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
await this.#emit({
|
|
88
|
+
...parsed.data.id === void 0 ? {} : { id: parsed.data.id },
|
|
89
|
+
type: "error",
|
|
90
|
+
code: "runtime_error",
|
|
91
|
+
message: message(error)
|
|
92
|
+
}, "response");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async #dispatch(command) {
|
|
96
|
+
const runtime = this.#runtime;
|
|
97
|
+
const respond = (data) => this.#emit({
|
|
98
|
+
...command.id === void 0 ? {} : { id: command.id },
|
|
99
|
+
type: "response",
|
|
100
|
+
command: command.type,
|
|
101
|
+
success: true,
|
|
102
|
+
...data === void 0 ? {} : { data }
|
|
103
|
+
}, "response");
|
|
104
|
+
if (command.type === "prompt") {
|
|
105
|
+
await respond();
|
|
106
|
+
void runtime.session.submit(command.message).catch((error) => this.#emit({
|
|
107
|
+
type: "error",
|
|
108
|
+
code: "runtime_error",
|
|
109
|
+
message: message(error)
|
|
110
|
+
}, "response"));
|
|
111
|
+
} else if (command.type === "steer") {
|
|
112
|
+
runtime.session.steer(command.message);
|
|
113
|
+
await respond(runtime.session.queueSnapshot());
|
|
114
|
+
} else if (command.type === "follow_up") {
|
|
115
|
+
runtime.session.followUp(command.message);
|
|
116
|
+
await respond(runtime.session.queueSnapshot());
|
|
117
|
+
} else if (command.type === "abort") {
|
|
118
|
+
await respond({ result: runtime.session.interrupt() });
|
|
119
|
+
} else if (command.type === "get_queue") {
|
|
120
|
+
await respond(runtime.session.queueSnapshot());
|
|
121
|
+
} else if (command.type === "clear_queue") {
|
|
122
|
+
await respond(runtime.session.clearQueue());
|
|
123
|
+
} else if (command.type === "approval_decision") {
|
|
124
|
+
const approvals = runtime.approvals;
|
|
125
|
+
const approval = approvals?.pending;
|
|
126
|
+
if (!runtime.rpcApprovals || approvals === void 0 || approval === void 0) throw new Error("No approval request is pending");
|
|
127
|
+
if (approval.id !== command.approvalId) throw new Error("Approval request is no longer active");
|
|
128
|
+
approvals.resolve(command.decision);
|
|
129
|
+
await respond();
|
|
130
|
+
} else if (command.type === "write_commit") {
|
|
131
|
+
const writes = runtime.rpcWrites;
|
|
132
|
+
if (writes === void 0) throw new Error("Streamed writes are unavailable");
|
|
133
|
+
if (writes.pendingId !== command.writeId) throw new Error("Streamed write is no longer awaiting commit");
|
|
134
|
+
writes.commit(command.writeId);
|
|
135
|
+
await respond();
|
|
136
|
+
} else if (command.type === "get_state") {
|
|
137
|
+
await respond({
|
|
138
|
+
sessionId: runtime.sessionId,
|
|
139
|
+
active: runtime.session.active,
|
|
140
|
+
queue: runtime.session.queueSnapshot(),
|
|
141
|
+
capabilities: { approvals: runtime.rpcApprovals === true, streamedWrites: runtime.rpcWrites !== void 0 },
|
|
142
|
+
...runtime.rpcApprovals && runtime.approvals?.pending !== void 0 ? { approval: runtime.approvals.pending } : {}
|
|
143
|
+
});
|
|
144
|
+
} else if (command.type === "checkpoint") {
|
|
145
|
+
await respond(await required(runtime.services?.checkpoint, "checkpoint")(command.label));
|
|
146
|
+
} else if (command.type === "get_tree") {
|
|
147
|
+
await respond(required(runtime.services?.tree, "get_tree")());
|
|
148
|
+
} else if (command.type === "rewind") {
|
|
149
|
+
await required(runtime.services?.rewind, "rewind")(command.nodeId);
|
|
150
|
+
await respond();
|
|
151
|
+
} else if (command.type === "unrevert") {
|
|
152
|
+
await required(runtime.services?.unrevert, "unrevert")();
|
|
153
|
+
await respond();
|
|
154
|
+
} else if (command.type === "fork") {
|
|
155
|
+
await required(runtime.services?.fork, "fork")(command.nodeId);
|
|
156
|
+
await respond();
|
|
157
|
+
} else {
|
|
158
|
+
this.#closing = true;
|
|
159
|
+
await respond();
|
|
160
|
+
this.#lines?.close();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
#emit(value, kind) {
|
|
164
|
+
this.#writeTail = this.#writeTail.then(async () => {
|
|
165
|
+
await this.#options.onRecord?.(kind, value);
|
|
166
|
+
await new Promise((resolvePromise, reject) => {
|
|
167
|
+
this.#options.output.write(`${JSON.stringify(value)}
|
|
168
|
+
`, (error) => error ? reject(error) : resolvePromise());
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
return this.#writeTail;
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
function required(service, name) {
|
|
175
|
+
if (service === void 0) throw new Error(`RPC command ${name} is unavailable`);
|
|
176
|
+
return service;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// src/trace/recorder.ts
|
|
180
|
+
import { mkdir, open } from "fs/promises";
|
|
181
|
+
import { dirname, resolve } from "path";
|
|
182
|
+
|
|
183
|
+
// src/trace/schema.ts
|
|
184
|
+
import { z as z2 } from "zod";
|
|
185
|
+
var TraceKindSchema = z2.enum(["command", "response", "output", "queue", "history", "verification"]);
|
|
186
|
+
var TraceRecordSchema = z2.object({
|
|
187
|
+
version: z2.literal(1),
|
|
188
|
+
sequence: z2.number().int().positive(),
|
|
189
|
+
timestamp: z2.string().datetime(),
|
|
190
|
+
sessionId: z2.string().min(1),
|
|
191
|
+
kind: TraceKindSchema,
|
|
192
|
+
payload: z2.unknown()
|
|
193
|
+
}).strict();
|
|
194
|
+
|
|
195
|
+
// src/trace/recorder.ts
|
|
196
|
+
var TraceRecorder = class {
|
|
197
|
+
path;
|
|
198
|
+
#sessionId;
|
|
199
|
+
#secrets;
|
|
200
|
+
#now;
|
|
201
|
+
#sequence = 0;
|
|
202
|
+
#handle;
|
|
203
|
+
#tail = Promise.resolve();
|
|
204
|
+
constructor(options) {
|
|
205
|
+
this.path = resolve(options.path);
|
|
206
|
+
this.#sessionId = options.sessionId;
|
|
207
|
+
this.#secrets = options.secrets ?? [];
|
|
208
|
+
this.#now = options.now ?? (() => /* @__PURE__ */ new Date());
|
|
209
|
+
}
|
|
210
|
+
record(kind, payload) {
|
|
211
|
+
const sequence = ++this.#sequence;
|
|
212
|
+
this.#tail = this.#tail.then(async () => {
|
|
213
|
+
const handle = await this.#file();
|
|
214
|
+
const serialized = redactErrorText(redactSecrets(JSON.stringify(payload) ?? "null", this.#secrets));
|
|
215
|
+
const record = TraceRecordSchema.parse({
|
|
216
|
+
version: 1,
|
|
217
|
+
sequence,
|
|
218
|
+
timestamp: this.#now().toISOString(),
|
|
219
|
+
sessionId: this.#sessionId,
|
|
220
|
+
kind,
|
|
221
|
+
payload: JSON.parse(serialized)
|
|
222
|
+
});
|
|
223
|
+
await handle.appendFile(`${JSON.stringify(record)}
|
|
224
|
+
`, "utf8");
|
|
225
|
+
});
|
|
226
|
+
return this.#tail;
|
|
227
|
+
}
|
|
228
|
+
async close() {
|
|
229
|
+
await this.#tail;
|
|
230
|
+
await this.#handle?.close();
|
|
231
|
+
this.#handle = void 0;
|
|
232
|
+
}
|
|
233
|
+
async #file() {
|
|
234
|
+
if (this.#handle !== void 0) return this.#handle;
|
|
235
|
+
await mkdir(dirname(this.path), { recursive: true });
|
|
236
|
+
this.#handle = await open(this.path, "a", 384);
|
|
237
|
+
return this.#handle;
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
export {
|
|
242
|
+
FlavorRpcServer,
|
|
243
|
+
TraceRecordSchema,
|
|
244
|
+
TraceRecorder
|
|
245
|
+
};
|
|
246
|
+
//# sourceMappingURL=chunk-M744K7MK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rpc/server.ts","../src/rpc/schema.ts","../src/trace/recorder.ts","../src/trace/schema.ts"],"sourcesContent":["import { createInterface } from \"node:readline\";\nimport type { Interface as ReadlineInterface } from \"node:readline\";\nimport type { Readable, Writable } from \"node:stream\";\n\nimport type { AgentQueueSnapshot } from \"../agent/message-queue.js\";\nimport type { SessionOutput } from \"../ui/session.js\";\nimport type { SessionApprovalRequest } from \"../ui/session.js\";\nimport type { ApprovalDecision } from \"../tools/runtime.js\";\nimport { message } from \"../utils/error.js\";\nimport { RpcCommandSchema, type RpcCommand } from \"./schema.js\";\n\nexport interface RpcSessionLike {\n readonly active: boolean;\n start(): Promise<void>;\n submit(prompt: string): Promise<void>;\n steer(prompt: string): void;\n followUp(prompt: string): void;\n interrupt(): \"cancelled\" | \"exit\";\n queueSnapshot(): AgentQueueSnapshot;\n clearQueue(): AgentQueueSnapshot;\n whenIdle(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface RpcRuntimeLike {\n readonly sessionId: string;\n readonly session: RpcSessionLike;\n readonly services?: {\n checkpoint?(label?: string): Promise<unknown>;\n tree?(): readonly unknown[];\n rewind?(nodeId: string): Promise<void>;\n unrevert?(): Promise<void>;\n fork?(nodeId: string): Promise<void>;\n };\n readonly approvals?: {\n readonly pending: SessionApprovalRequest | undefined;\n resolve(decision: ApprovalDecision): void;\n };\n readonly rpcApprovals?: boolean;\n readonly rpcWrites?: {\n readonly pendingId: string | undefined;\n commit(id: string): void;\n dispose(): void;\n };\n dispose(): Promise<void>;\n}\n\nexport interface FlavorRpcServerOptions {\n input: Readable;\n output: Writable;\n workspace: string;\n createRuntime(options: { workspace: string; output: (event: SessionOutput) => void }): Promise<RpcRuntimeLike>;\n onRecord?(kind: \"command\" | \"response\" | \"output\", payload: unknown): void | Promise<void>;\n}\n\nexport class FlavorRpcServer {\n readonly #options: FlavorRpcServerOptions;\n #runtime: RpcRuntimeLike | undefined;\n #writeTail: Promise<void> = Promise.resolve();\n #closing = false;\n #lines: ReadlineInterface | undefined;\n\n constructor(options: FlavorRpcServerOptions) { this.#options = options; }\n\n async start(): Promise<void> {\n this.#runtime = await this.#options.createRuntime({\n workspace: this.#options.workspace,\n output: (event) => { void this.#emit({ type: \"event\", sessionId: this.#runtime?.sessionId, event }, \"output\"); },\n });\n await this.#runtime.session.start();\n const lines = createInterface({ input: this.#options.input, crlfDelay: Infinity });\n this.#lines = lines;\n try {\n for await (const line of lines) {\n if (this.#closing) break;\n await this.#accept(line);\n }\n } finally {\n this.#lines = undefined;\n this.#runtime.rpcWrites?.dispose();\n await this.#runtime.session.close();\n await this.#runtime.dispose();\n await this.#writeTail;\n }\n }\n\n async #accept(line: string): Promise<void> {\n let input: unknown;\n try { input = JSON.parse(line); }\n catch {\n await this.#emit({ type: \"error\", code: \"invalid_json\", message: \"Input is not valid JSON\" }, \"response\");\n return;\n }\n const parsed = RpcCommandSchema.safeParse(input);\n if (!parsed.success) {\n await this.#emit({\n type: \"error\", code: \"invalid_command\", message: parsed.error.issues[0]?.message ?? \"Invalid command\",\n }, \"response\");\n return;\n }\n await this.#options.onRecord?.(\"command\", parsed.data);\n try {\n await this.#dispatch(parsed.data);\n } catch (error) {\n await this.#emit({\n ...(parsed.data.id === undefined ? {} : { id: parsed.data.id }),\n type: \"error\",\n code: \"runtime_error\",\n message: message(error),\n }, \"response\");\n }\n }\n\n async #dispatch(command: RpcCommand): Promise<void> {\n const runtime = this.#runtime!;\n const respond = (data?: unknown) => this.#emit({\n ...(command.id === undefined ? {} : { id: command.id }),\n type: \"response\",\n command: command.type,\n success: true,\n ...(data === undefined ? {} : { data }),\n }, \"response\");\n if (command.type === \"prompt\") {\n await respond();\n void runtime.session.submit(command.message).catch((error) => this.#emit({\n type: \"error\", code: \"runtime_error\", message: message(error),\n }, \"response\"));\n } else if (command.type === \"steer\") {\n runtime.session.steer(command.message);\n await respond(runtime.session.queueSnapshot());\n } else if (command.type === \"follow_up\") {\n runtime.session.followUp(command.message);\n await respond(runtime.session.queueSnapshot());\n } else if (command.type === \"abort\") {\n await respond({ result: runtime.session.interrupt() });\n } else if (command.type === \"get_queue\") {\n await respond(runtime.session.queueSnapshot());\n } else if (command.type === \"clear_queue\") {\n await respond(runtime.session.clearQueue());\n } else if (command.type === \"approval_decision\") {\n const approvals = runtime.approvals;\n const approval = approvals?.pending;\n if (!runtime.rpcApprovals || approvals === undefined || approval === undefined) throw new Error(\"No approval request is pending\");\n if (approval.id !== command.approvalId) throw new Error(\"Approval request is no longer active\");\n approvals.resolve(command.decision);\n await respond();\n } else if (command.type === \"write_commit\") {\n const writes = runtime.rpcWrites;\n if (writes === undefined) throw new Error(\"Streamed writes are unavailable\");\n if (writes.pendingId !== command.writeId) throw new Error(\"Streamed write is no longer awaiting commit\");\n writes.commit(command.writeId);\n await respond();\n } else if (command.type === \"get_state\") {\n await respond({\n sessionId: runtime.sessionId,\n active: runtime.session.active,\n queue: runtime.session.queueSnapshot(),\n capabilities: { approvals: runtime.rpcApprovals === true, streamedWrites: runtime.rpcWrites !== undefined },\n ...(runtime.rpcApprovals && runtime.approvals?.pending !== undefined ? { approval: runtime.approvals.pending } : {}),\n });\n } else if (command.type === \"checkpoint\") {\n await respond(await required(runtime.services?.checkpoint, \"checkpoint\")(command.label));\n } else if (command.type === \"get_tree\") {\n await respond(required(runtime.services?.tree, \"get_tree\")());\n } else if (command.type === \"rewind\") {\n await required(runtime.services?.rewind, \"rewind\")(command.nodeId);\n await respond();\n } else if (command.type === \"unrevert\") {\n await required(runtime.services?.unrevert, \"unrevert\")();\n await respond();\n } else if (command.type === \"fork\") {\n await required(runtime.services?.fork, \"fork\")(command.nodeId);\n await respond();\n } else {\n this.#closing = true;\n await respond();\n this.#lines?.close();\n }\n }\n\n #emit(value: unknown, kind: \"response\" | \"output\"): Promise<void> {\n this.#writeTail = this.#writeTail.then(async () => {\n await this.#options.onRecord?.(kind, value);\n await new Promise<void>((resolvePromise, reject) => {\n this.#options.output.write(`${JSON.stringify(value)}\\n`, (error) => error ? reject(error) : resolvePromise());\n });\n });\n return this.#writeTail;\n }\n}\n\nfunction required<T extends (...args: never[]) => unknown>(service: T | undefined, name: string): T {\n if (service === undefined) throw new Error(`RPC command ${name} is unavailable`);\n return service;\n}\n","import { z } from \"zod\";\n\nconst base = { id: z.string().min(1).max(128).optional() };\nexport const RpcCommandSchema = z.discriminatedUnion(\"type\", [\n z.object({ ...base, type: z.literal(\"prompt\"), message: z.string().trim().min(1).max(1_000_000) }).strict(),\n z.object({ ...base, type: z.literal(\"steer\"), message: z.string().trim().min(1).max(1_000_000) }).strict(),\n z.object({ ...base, type: z.literal(\"follow_up\"), message: z.string().trim().min(1).max(1_000_000) }).strict(),\n z.object({ ...base, type: z.literal(\"abort\") }).strict(),\n z.object({ ...base, type: z.literal(\"get_state\") }).strict(),\n z.object({ ...base, type: z.literal(\"get_queue\") }).strict(),\n z.object({ ...base, type: z.literal(\"clear_queue\") }).strict(),\n z.object({ ...base, type: z.literal(\"approval_decision\"), approvalId: z.string().min(1).max(128), decision: z.enum([\"once\", \"always\", \"deny\"]) }).strict(),\n z.object({ ...base, type: z.literal(\"write_commit\"), writeId: z.string().uuid() }).strict(),\n z.object({ ...base, type: z.literal(\"checkpoint\"), label: z.string().trim().min(1).max(256).optional() }).strict(),\n z.object({ ...base, type: z.literal(\"get_tree\") }).strict(),\n z.object({ ...base, type: z.literal(\"rewind\"), nodeId: z.string().min(1).max(256) }).strict(),\n z.object({ ...base, type: z.literal(\"unrevert\") }).strict(),\n z.object({ ...base, type: z.literal(\"fork\"), nodeId: z.string().min(1).max(256) }).strict(),\n z.object({ ...base, type: z.literal(\"shutdown\") }).strict(),\n]);\nexport type RpcCommand = z.infer<typeof RpcCommandSchema>;\n","import { mkdir, open, type FileHandle } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { redactErrorText, redactSecrets } from \"../utils/redact.js\";\nimport { TraceRecordSchema, type TraceKind, type TraceRecord } from \"./schema.js\";\n\nexport interface TraceRecorderOptions {\n path: string;\n sessionId: string;\n secrets?: readonly string[];\n now?: () => Date;\n}\n\nexport class TraceRecorder {\n readonly path: string;\n readonly #sessionId: string;\n readonly #secrets: readonly string[];\n readonly #now: () => Date;\n #sequence = 0;\n #handle: FileHandle | undefined;\n #tail: Promise<void> = Promise.resolve();\n\n constructor(options: TraceRecorderOptions) {\n this.path = resolve(options.path);\n this.#sessionId = options.sessionId;\n this.#secrets = options.secrets ?? [];\n this.#now = options.now ?? (() => new Date());\n }\n\n record(kind: TraceKind, payload: unknown): Promise<void> {\n const sequence = ++this.#sequence;\n this.#tail = this.#tail.then(async () => {\n const handle = await this.#file();\n const serialized = redactErrorText(redactSecrets(JSON.stringify(payload) ?? \"null\", this.#secrets));\n const record: TraceRecord = TraceRecordSchema.parse({\n version: 1,\n sequence,\n timestamp: this.#now().toISOString(),\n sessionId: this.#sessionId,\n kind,\n payload: JSON.parse(serialized) as unknown,\n });\n await handle.appendFile(`${JSON.stringify(record)}\\n`, \"utf8\");\n });\n return this.#tail;\n }\n\n async close(): Promise<void> {\n await this.#tail;\n await this.#handle?.close();\n this.#handle = undefined;\n }\n\n async #file(): Promise<FileHandle> {\n if (this.#handle !== undefined) return this.#handle;\n await mkdir(dirname(this.path), { recursive: true });\n this.#handle = await open(this.path, \"a\", 0o600);\n return this.#handle;\n }\n}\n","import { z } from \"zod\";\n\nexport const TraceKindSchema = z.enum([\"command\", \"response\", \"output\", \"queue\", \"history\", \"verification\"]);\nexport type TraceKind = z.infer<typeof TraceKindSchema>;\n\nexport const TraceRecordSchema = z.object({\n version: z.literal(1),\n sequence: z.number().int().positive(),\n timestamp: z.string().datetime(),\n sessionId: z.string().min(1),\n kind: TraceKindSchema,\n payload: z.unknown(),\n}).strict();\n\nexport type TraceRecord = z.infer<typeof TraceRecordSchema>;\n"],"mappings":"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","names":["z"]}
|