agent-cli-runtime 0.1.0-alpha.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 (151) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/CONTRIBUTING.md +60 -0
  3. package/LICENSE +202 -0
  4. package/README.md +573 -0
  5. package/README.zh-CN.md +571 -0
  6. package/SECURITY.md +35 -0
  7. package/dist/adapters/adapter-types.d.ts +138 -0
  8. package/dist/adapters/adapter-types.js +2 -0
  9. package/dist/adapters/adapter-types.js.map +1 -0
  10. package/dist/adapters/claude.d.ts +2 -0
  11. package/dist/adapters/claude.js +97 -0
  12. package/dist/adapters/claude.js.map +1 -0
  13. package/dist/adapters/codex.d.ts +3 -0
  14. package/dist/adapters/codex.js +120 -0
  15. package/dist/adapters/codex.js.map +1 -0
  16. package/dist/adapters/opencode.d.ts +4 -0
  17. package/dist/adapters/opencode.js +111 -0
  18. package/dist/adapters/opencode.js.map +1 -0
  19. package/dist/adapters/registry.d.ts +9 -0
  20. package/dist/adapters/registry.js +23 -0
  21. package/dist/adapters/registry.js.map +1 -0
  22. package/dist/cli/main.d.ts +2 -0
  23. package/dist/cli/main.js +978 -0
  24. package/dist/cli/main.js.map +1 -0
  25. package/dist/core/async-queue.d.ts +10 -0
  26. package/dist/core/async-queue.js +49 -0
  27. package/dist/core/async-queue.js.map +1 -0
  28. package/dist/core/diagnostics.d.ts +20 -0
  29. package/dist/core/diagnostics.js +4 -0
  30. package/dist/core/diagnostics.js.map +1 -0
  31. package/dist/core/event-contract.d.ts +32 -0
  32. package/dist/core/event-contract.js +128 -0
  33. package/dist/core/event-contract.js.map +1 -0
  34. package/dist/core/events.d.ts +147 -0
  35. package/dist/core/events.js +4 -0
  36. package/dist/core/events.js.map +1 -0
  37. package/dist/core/ids.d.ts +1 -0
  38. package/dist/core/ids.js +5 -0
  39. package/dist/core/ids.js.map +1 -0
  40. package/dist/core/redaction.d.ts +4 -0
  41. package/dist/core/redaction.js +51 -0
  42. package/dist/core/redaction.js.map +1 -0
  43. package/dist/core/runtime.d.ts +41 -0
  44. package/dist/core/runtime.js +83 -0
  45. package/dist/core/runtime.js.map +1 -0
  46. package/dist/core/schema-contract.d.ts +55 -0
  47. package/dist/core/schema-contract.js +143 -0
  48. package/dist/core/schema-contract.js.map +1 -0
  49. package/dist/detection/detect.d.ts +14 -0
  50. package/dist/detection/detect.js +293 -0
  51. package/dist/detection/detect.js.map +1 -0
  52. package/dist/detection/env.d.ts +2 -0
  53. package/dist/detection/env.js +15 -0
  54. package/dist/detection/env.js.map +1 -0
  55. package/dist/detection/executable-resolution.d.ts +12 -0
  56. package/dist/detection/executable-resolution.js +50 -0
  57. package/dist/detection/executable-resolution.js.map +1 -0
  58. package/dist/detection/invocation.d.ts +9 -0
  59. package/dist/detection/invocation.js +22 -0
  60. package/dist/detection/invocation.js.map +1 -0
  61. package/dist/goals/goal-scheduler.d.ts +31 -0
  62. package/dist/goals/goal-scheduler.js +518 -0
  63. package/dist/goals/goal-scheduler.js.map +1 -0
  64. package/dist/goals/goal-store.d.ts +37 -0
  65. package/dist/goals/goal-store.js +300 -0
  66. package/dist/goals/goal-store.js.map +1 -0
  67. package/dist/goals/goal-types.d.ts +103 -0
  68. package/dist/goals/goal-types.js +2 -0
  69. package/dist/goals/goal-types.js.map +1 -0
  70. package/dist/goals/planner-prompts.d.ts +3 -0
  71. package/dist/goals/planner-prompts.js +26 -0
  72. package/dist/goals/planner-prompts.js.map +1 -0
  73. package/dist/goals/task-graph.d.ts +9 -0
  74. package/dist/goals/task-graph.js +229 -0
  75. package/dist/goals/task-graph.js.map +1 -0
  76. package/dist/goals/validation-runner.d.ts +7 -0
  77. package/dist/goals/validation-runner.js +63 -0
  78. package/dist/goals/validation-runner.js.map +1 -0
  79. package/dist/index.d.ts +11 -0
  80. package/dist/index.js +2 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/parsers/claude-stream-json.d.ts +11 -0
  83. package/dist/parsers/claude-stream-json.js +102 -0
  84. package/dist/parsers/claude-stream-json.js.map +1 -0
  85. package/dist/parsers/codex-json.d.ts +8 -0
  86. package/dist/parsers/codex-json.js +107 -0
  87. package/dist/parsers/codex-json.js.map +1 -0
  88. package/dist/parsers/line-buffer.d.ts +7 -0
  89. package/dist/parsers/line-buffer.js +28 -0
  90. package/dist/parsers/line-buffer.js.map +1 -0
  91. package/dist/parsers/opencode-json.d.ts +8 -0
  92. package/dist/parsers/opencode-json.js +72 -0
  93. package/dist/parsers/opencode-json.js.map +1 -0
  94. package/dist/parsers/plain-lines.d.ts +6 -0
  95. package/dist/parsers/plain-lines.js +9 -0
  96. package/dist/parsers/plain-lines.js.map +1 -0
  97. package/dist/public-types.d.ts +143 -0
  98. package/dist/public-types.js +2 -0
  99. package/dist/public-types.js.map +1 -0
  100. package/dist/runs/process-runner.d.ts +35 -0
  101. package/dist/runs/process-runner.js +97 -0
  102. package/dist/runs/process-runner.js.map +1 -0
  103. package/dist/runs/prompt-transport.d.ts +10 -0
  104. package/dist/runs/prompt-transport.js +43 -0
  105. package/dist/runs/prompt-transport.js.map +1 -0
  106. package/dist/runs/run-result.d.ts +9 -0
  107. package/dist/runs/run-result.js +22 -0
  108. package/dist/runs/run-result.js.map +1 -0
  109. package/dist/runs/run-scheduler.d.ts +25 -0
  110. package/dist/runs/run-scheduler.js +552 -0
  111. package/dist/runs/run-scheduler.js.map +1 -0
  112. package/dist/runs/run-store.d.ts +42 -0
  113. package/dist/runs/run-store.js +297 -0
  114. package/dist/runs/run-store.js.map +1 -0
  115. package/dist/runs/run-types.d.ts +59 -0
  116. package/dist/runs/run-types.js +2 -0
  117. package/dist/runs/run-types.js.map +1 -0
  118. package/dist/smoke/parser-samples.d.ts +17 -0
  119. package/dist/smoke/parser-samples.js +186 -0
  120. package/dist/smoke/parser-samples.js.map +1 -0
  121. package/dist/storage/file-storage.d.ts +35 -0
  122. package/dist/storage/file-storage.js +271 -0
  123. package/dist/storage/file-storage.js.map +1 -0
  124. package/dist/storage/jsonl-store.d.ts +9 -0
  125. package/dist/storage/jsonl-store.js +138 -0
  126. package/dist/storage/jsonl-store.js.map +1 -0
  127. package/dist/storage/manifest-validation.d.ts +11 -0
  128. package/dist/storage/manifest-validation.js +102 -0
  129. package/dist/storage/manifest-validation.js.map +1 -0
  130. package/dist/storage/storage-lease.d.ts +40 -0
  131. package/dist/storage/storage-lease.js +223 -0
  132. package/dist/storage/storage-lease.js.map +1 -0
  133. package/dist/storage/storage-types.d.ts +55 -0
  134. package/dist/storage/storage-types.js +2 -0
  135. package/dist/storage/storage-types.js.map +1 -0
  136. package/dist/storage/store-inspection.d.ts +28 -0
  137. package/dist/storage/store-inspection.js +941 -0
  138. package/dist/storage/store-inspection.js.map +1 -0
  139. package/docs/api-schema-contract.md +92 -0
  140. package/docs/compatibility.md +832 -0
  141. package/docs/daemon-ready-contract.md +283 -0
  142. package/docs/production-readiness.md +281 -0
  143. package/docs/release-checklist.md +257 -0
  144. package/docs/release-publish-runbook.md +201 -0
  145. package/docs/release-report.md +517 -0
  146. package/docs/ssot.md +1257 -0
  147. package/examples/cli-dogfood.md +113 -0
  148. package/examples/library-goal.js +94 -0
  149. package/examples/library-run.js +84 -0
  150. package/package.json +79 -0
  151. package/scripts/dogfood.mjs +243 -0
@@ -0,0 +1,229 @@
1
+ const MAX_PLANNER_DIAGNOSTIC_BYTES = 32_000;
2
+ export class TaskGraphError extends Error {
3
+ code = "AGENT_TASK_GRAPH_INVALID";
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "TaskGraphError";
7
+ }
8
+ }
9
+ export function parsePlannerOutput(text) {
10
+ const json = extractJson(text);
11
+ let parsed;
12
+ try {
13
+ parsed = JSON.parse(json);
14
+ }
15
+ catch (error) {
16
+ throw new TaskGraphError(`Planner output is not valid JSON: ${jsonErrorMessage(error)}`);
17
+ }
18
+ if (!parsed || typeof parsed !== "object" || !Array.isArray(parsed.tasks)) {
19
+ throw new TaskGraphError("Planner output field tasks must be an array");
20
+ }
21
+ return { tasks: parsed.tasks };
22
+ }
23
+ export function validateTaskGraph(output, request) {
24
+ const ids = new Set();
25
+ const tasks = [];
26
+ for (const [index, task] of output.tasks.entries()) {
27
+ if (!isRecord(task))
28
+ throw new TaskGraphError(`Task <task:${index}> must be an object`);
29
+ const label = taskLabel(task, index);
30
+ const id = requireString(task, "id", label);
31
+ const title = requireString(task, "title", label);
32
+ const objective = requireString(task, "objective", label);
33
+ const dependencies = requireStringArray(task, "dependencies", label);
34
+ if (!id)
35
+ throw new TaskGraphError(`Task ${label} field id must be a non-empty string`);
36
+ if (ids.has(id))
37
+ throw new TaskGraphError(`Task ${id} field id must be unique`);
38
+ if (!title)
39
+ throw new TaskGraphError(`Task ${id} field title must be a non-empty string`);
40
+ if (!objective)
41
+ throw new TaskGraphError(`Task ${id} field objective must be a non-empty string`);
42
+ const allowedFiles = optionalStringArray(task, "allowedFiles", id);
43
+ const validationCommands = optionalStringArray(task, "validationCommands", id);
44
+ const agentId = optionalString(task, "agentId", id);
45
+ const retryPolicy = validateRetryPolicy(task.retryPolicy, id);
46
+ ids.add(id);
47
+ tasks.push({
48
+ id,
49
+ title,
50
+ objective,
51
+ status: "pending",
52
+ dependencies,
53
+ agentId,
54
+ cwd: request.cwd,
55
+ permissionPolicy: request.permissionPolicy ?? "agent-default",
56
+ allowedFiles,
57
+ validationCommands,
58
+ retryPolicy,
59
+ });
60
+ }
61
+ for (const task of tasks) {
62
+ for (const dep of task.dependencies) {
63
+ if (!ids.has(dep))
64
+ throw new TaskGraphError(`Task ${task.id} field dependencies contains unknown task ${dep}`);
65
+ }
66
+ }
67
+ assertAcyclic(tasks);
68
+ return tasks;
69
+ }
70
+ export function dependencyOrder(tasks) {
71
+ const byId = new Map(tasks.map((task) => [task.id, task]));
72
+ const done = new Set();
73
+ const ordered = [];
74
+ while (ordered.length < tasks.length) {
75
+ const ready = tasks.find((task) => !done.has(task.id) && task.dependencies.every((dep) => done.has(dep)));
76
+ if (!ready)
77
+ throw new Error("Task graph has no ready task");
78
+ ordered.push(ready);
79
+ done.add(ready.id);
80
+ }
81
+ return ordered.map((task) => byId.get(task.id));
82
+ }
83
+ function assertAcyclic(tasks) {
84
+ try {
85
+ dependencyOrder(tasks);
86
+ }
87
+ catch {
88
+ throw new TaskGraphError("Task graph field dependencies must be acyclic");
89
+ }
90
+ }
91
+ function extractJson(text) {
92
+ const trimmed = text.trim();
93
+ if (!trimmed)
94
+ throw new TaskGraphError("Planner output did not contain JSON");
95
+ if (trimmed.length > MAX_PLANNER_DIAGNOSTIC_BYTES && !trimmed.includes("{")) {
96
+ throw new TaskGraphError(`Planner output is too large (${trimmed.length} bytes) and did not contain JSON`);
97
+ }
98
+ if (trimmed.startsWith("{") && isCompleteJsonObject(trimmed))
99
+ return trimmed;
100
+ const fenced = [...trimmed.matchAll(/```(?:json|JSON)?\s*([\s\S]*?)```/gu)]
101
+ .map((match) => match[1]?.trim() ?? "")
102
+ .filter((body) => body.startsWith("{") || body.includes("{"));
103
+ if (fenced.length > 1)
104
+ throw new TaskGraphError("Planner output contained multiple fenced JSON blocks; expected exactly one task graph");
105
+ if (fenced.length === 1)
106
+ return fenced[0];
107
+ const candidates = findJsonObjectCandidates(trimmed);
108
+ if (candidates.length > 1)
109
+ throw new TaskGraphError("Planner output contained multiple JSON objects; expected exactly one task graph");
110
+ if (candidates.length === 1)
111
+ return candidates[0];
112
+ if (trimmed.includes("{") || trimmed.includes("}"))
113
+ throw new TaskGraphError("Planner output JSON is malformed; expected one complete JSON object");
114
+ throw new TaskGraphError("Planner output did not contain JSON");
115
+ }
116
+ function isCompleteJsonObject(text) {
117
+ try {
118
+ const parsed = JSON.parse(text);
119
+ return isRecord(parsed);
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ }
125
+ function findJsonObjectCandidates(text) {
126
+ const candidates = [];
127
+ let depth = 0;
128
+ let start = -1;
129
+ let inString = false;
130
+ let escaping = false;
131
+ for (let index = 0; index < text.length; index += 1) {
132
+ const char = text[index];
133
+ if (inString) {
134
+ if (escaping) {
135
+ escaping = false;
136
+ }
137
+ else if (char === "\\") {
138
+ escaping = true;
139
+ }
140
+ else if (char === "\"") {
141
+ inString = false;
142
+ }
143
+ continue;
144
+ }
145
+ if (char === "\"") {
146
+ inString = true;
147
+ continue;
148
+ }
149
+ if (char === "{") {
150
+ if (depth === 0)
151
+ start = index;
152
+ depth += 1;
153
+ }
154
+ else if (char === "}") {
155
+ if (depth === 0)
156
+ continue;
157
+ depth -= 1;
158
+ if (depth === 0 && start >= 0) {
159
+ candidates.push(text.slice(start, index + 1));
160
+ start = -1;
161
+ }
162
+ }
163
+ }
164
+ return candidates;
165
+ }
166
+ function requireString(task, field, taskId) {
167
+ const value = task[field];
168
+ if (typeof value !== "string")
169
+ throw new TaskGraphError(`Task ${taskId} field ${field} must be a string`);
170
+ return value;
171
+ }
172
+ function optionalString(task, field, taskId) {
173
+ const value = task[field];
174
+ if (value === undefined)
175
+ return undefined;
176
+ if (typeof value !== "string")
177
+ throw new TaskGraphError(`Task ${taskId} field ${field} must be a string`);
178
+ return value;
179
+ }
180
+ function requireStringArray(task, field, taskId) {
181
+ const value = task[field];
182
+ if (!Array.isArray(value))
183
+ throw new TaskGraphError(`Task ${taskId} field ${field} must be a string[]`);
184
+ const invalidIndex = value.findIndex((item) => typeof item !== "string");
185
+ if (invalidIndex >= 0)
186
+ throw new TaskGraphError(`Task ${taskId} field ${field}[${invalidIndex}] must be a string`);
187
+ return [...value];
188
+ }
189
+ function optionalStringArray(task, field, taskId) {
190
+ const value = task[field];
191
+ if (value === undefined)
192
+ return undefined;
193
+ return requireStringArray(task, field, taskId);
194
+ }
195
+ function validateRetryPolicy(value, taskId) {
196
+ if (value === undefined)
197
+ return undefined;
198
+ if (!isRecord(value))
199
+ throw new TaskGraphError(`Task ${taskId} field retryPolicy must be an object`);
200
+ const maxAttempts = value.maxAttempts;
201
+ if (!Number.isInteger(maxAttempts) || typeof maxAttempts !== "number" || maxAttempts <= 0) {
202
+ throw new TaskGraphError(`Task ${taskId} field retryPolicy.maxAttempts must be a positive integer`);
203
+ }
204
+ const retryableErrorCodes = requireStringArray(value, "retryableErrorCodes", taskIdForNested(taskId, "retryPolicy"));
205
+ const backoffMs = value.backoffMs;
206
+ if (typeof backoffMs !== "number" || !Number.isFinite(backoffMs) || backoffMs < 0) {
207
+ throw new TaskGraphError(`Task ${taskId} field retryPolicy.backoffMs must be a non-negative number`);
208
+ }
209
+ return {
210
+ maxAttempts,
211
+ retryableErrorCodes,
212
+ backoffMs,
213
+ };
214
+ }
215
+ function taskIdForNested(taskId, field) {
216
+ return `${taskId} field ${field}`;
217
+ }
218
+ function taskLabel(task, index) {
219
+ return typeof task.id === "string" && task.id ? task.id : `<task:${index}>`;
220
+ }
221
+ function isRecord(value) {
222
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
223
+ }
224
+ function jsonErrorMessage(error) {
225
+ if (!(error instanceof Error))
226
+ return String(error);
227
+ return error.message.replace(/\s+at position \d+.*/u, "");
228
+ }
229
+ //# sourceMappingURL=task-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-graph.js","sourceRoot":"","sources":["../../src/goals/task-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ValidationCommandResult } from "./goal-types.js";
2
+ export declare function runValidationCommands(input: {
3
+ commands: string[];
4
+ cwd: string;
5
+ env?: NodeJS.ProcessEnv | Record<string, string | undefined>;
6
+ timeoutMs?: number;
7
+ }): Promise<ValidationCommandResult[]>;
@@ -0,0 +1,63 @@
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { redactEnv, redactText } from "../core/redaction.js";
4
+ const execP = promisify(exec);
5
+ export async function runValidationCommands(input) {
6
+ const results = [];
7
+ const timeoutMs = input.timeoutMs ?? 60_000;
8
+ const redactedEnv = input.env ? redactEnv(input.env) : undefined;
9
+ for (const command of input.commands) {
10
+ const startedAt = Date.now();
11
+ try {
12
+ const { stdout, stderr } = await execP(command, {
13
+ cwd: input.cwd,
14
+ env: { ...process.env, ...input.env },
15
+ timeout: timeoutMs,
16
+ maxBuffer: 1024 * 1024,
17
+ });
18
+ results.push({
19
+ command: redactText(command),
20
+ cwd: "<cwd>",
21
+ timeoutMs,
22
+ env: redactedEnv,
23
+ exitCode: 0,
24
+ signal: null,
25
+ stdout: tail(redactText(String(stdout))),
26
+ stderr: tail(redactText(String(stderr))),
27
+ durationMs: Date.now() - startedAt,
28
+ passed: true,
29
+ classification: "success",
30
+ });
31
+ }
32
+ catch (error) {
33
+ const err = error;
34
+ const durationMs = Date.now() - startedAt;
35
+ const classification = classifyValidationFailure(err, durationMs, timeoutMs);
36
+ results.push({
37
+ command: redactText(command),
38
+ cwd: "<cwd>",
39
+ timeoutMs,
40
+ env: redactedEnv,
41
+ exitCode: typeof err.code === "number" ? err.code : null,
42
+ signal: err.signal ?? null,
43
+ stdout: tail(redactText(String(err.stdout ?? ""))),
44
+ stderr: tail(redactText(String(err.stderr ?? ""))),
45
+ durationMs,
46
+ passed: false,
47
+ classification,
48
+ });
49
+ }
50
+ }
51
+ return results;
52
+ }
53
+ function classifyValidationFailure(error, durationMs, timeoutMs) {
54
+ if (error.killed === true || error.signal === "SIGTERM" || (timeoutMs > 0 && durationMs >= timeoutMs))
55
+ return "timeout";
56
+ if (typeof error.code === "number")
57
+ return "failed";
58
+ return "spawn_error";
59
+ }
60
+ function tail(value, max = 4_000) {
61
+ return value.length > max ? value.slice(value.length - max) : value;
62
+ }
63
+ //# sourceMappingURL=validation-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-runner.js","sourceRoot":"","sources":["../../src/goals/validation-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { createAgentRuntime } from "./core/runtime.js";
2
+ export type { AgentRuntime } from "./core/runtime.js";
3
+ export type { DetectOptions } from "./detection/detect.js";
4
+ export type { AgentAdapterDef, AgentCapabilities, AdapterCompatibilityProfile, AgentId, BuildArgsInput, DetectedAgent, PermissionPolicy, PromptTransport, RuntimeModelOption, StreamParser, } from "./adapters/adapter-types.js";
5
+ export type { AgentEvent, ReplayEvent, RuntimeUsage, SchedulerEvent } from "./core/events.js";
6
+ export type { EventScope, EventTerminalContract, EventTerminalReason, VersionedEventEnvelope } from "./core/event-contract.js";
7
+ export type { RuntimeDiagnostic, RuntimeErrorCode } from "./core/diagnostics.js";
8
+ export type { CreateGoalRequest, GoalHandle, GoalRecord, GoalStatus, PlannerOutput, PlannerTask, ScheduledTask, TaskAttemptEvidence, TaskEvidence, TaskRetryPolicy, TaskStatus, ValidationCommandResult, } from "./goals/goal-types.js";
9
+ export type { RunHandle, RunRecord, RunRequest, RuntimeContextBlock, RuntimeOptions, RuntimeSessionRef } from "./runs/run-types.js";
10
+ export type { RunResult, RunStatus } from "./runs/run-result.js";
11
+ export type { DiagnosticsBundle, ExportDiagnosticsRequest, InspectStoreOptions, OwnerStatus, RuntimeEnvironment, RuntimeOwner, StorageLockInspection, StoreHealth, StoreActiveRecord, StoreHealthIssue, StoreRepairAction, StoreRepairReport, StoreHealthSummary, StoreHealthWarning, } from "./public-types.js";
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { createAgentRuntime } from "./core/runtime.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { AgentEventInput } from "../core/events.js";
2
+ import type { StreamParser } from "../adapters/adapter-types.js";
3
+ export declare class ClaudeStreamJsonParser implements StreamParser {
4
+ private readonly lines;
5
+ private lastStatusKey;
6
+ parse(chunk: string): AgentEventInput[];
7
+ flush(): AgentEventInput[];
8
+ private parseLine;
9
+ private streamEvent;
10
+ private status;
11
+ }
@@ -0,0 +1,102 @@
1
+ import { isRecord, LineBuffer, safeJsonParse } from "./line-buffer.js";
2
+ export class ClaudeStreamJsonParser {
3
+ lines = new LineBuffer();
4
+ lastStatusKey = null;
5
+ parse(chunk) {
6
+ return this.lines.push(chunk).flatMap((line) => this.parseLine(line));
7
+ }
8
+ flush() {
9
+ return this.lines.flush().flatMap((line) => this.parseLine(line));
10
+ }
11
+ parseLine(line) {
12
+ const value = safeJsonParse(line);
13
+ if (!isRecord(value))
14
+ return [];
15
+ if (value.type === "system")
16
+ return this.status("initializing");
17
+ if (value.type === "result") {
18
+ const usage = usageFrom(value.usage);
19
+ return usage ? [{ type: "usage", usage }] : [];
20
+ }
21
+ if (value.type === "error") {
22
+ return [{ type: "error", code: "AGENT_EXECUTION_FAILED", message: errorMessage(value, "Claude error") }];
23
+ }
24
+ if (value.type === "assistant" && isRecord(value.message)) {
25
+ return contentEvents(value.message.content);
26
+ }
27
+ if (value.type === "stream_event" && isRecord(value.event)) {
28
+ return this.streamEvent(value.event);
29
+ }
30
+ return [];
31
+ }
32
+ streamEvent(event) {
33
+ if (event.type === "message_start")
34
+ return this.status("running");
35
+ if (event.type === "content_block_delta" && isRecord(event.delta)) {
36
+ if (event.delta.type === "text_delta" && typeof event.delta.text === "string") {
37
+ return [{ type: "text_delta", text: event.delta.text }];
38
+ }
39
+ if (event.delta.type === "thinking_delta" && typeof event.delta.thinking === "string") {
40
+ return [{ type: "thinking_delta", text: event.delta.thinking }];
41
+ }
42
+ }
43
+ return [];
44
+ }
45
+ status(label, detail) {
46
+ const key = `${label}\u0000${detail ?? ""}`;
47
+ if (this.lastStatusKey === key)
48
+ return [];
49
+ this.lastStatusKey = key;
50
+ return detail ? [{ type: "status", label, detail }] : [{ type: "status", label }];
51
+ }
52
+ }
53
+ function contentEvents(content) {
54
+ if (!Array.isArray(content))
55
+ return [];
56
+ const events = [];
57
+ for (const part of content) {
58
+ if (!isRecord(part))
59
+ continue;
60
+ if (part.type === "text" && typeof part.text === "string") {
61
+ events.push({ type: "text_delta", text: part.text });
62
+ }
63
+ else if (part.type === "thinking" && typeof part.thinking === "string") {
64
+ events.push({ type: "thinking_delta", text: part.thinking });
65
+ }
66
+ else if (part.type === "tool_use" && typeof part.id === "string" && typeof part.name === "string") {
67
+ events.push({ type: "tool_call", id: part.id, name: part.name, input: part.input });
68
+ }
69
+ else if (part.type === "tool_result" && typeof part.tool_use_id === "string") {
70
+ events.push({ type: "tool_result", id: part.tool_use_id, output: part.content, isError: Boolean(part.is_error) });
71
+ }
72
+ else if (part.type === "file_event" && typeof part.path === "string") {
73
+ events.push({ type: "file_event", path: part.path, action: fileAction(part.action) });
74
+ }
75
+ }
76
+ return events;
77
+ }
78
+ function usageFrom(value) {
79
+ if (!isRecord(value))
80
+ return null;
81
+ const usage = {};
82
+ if (typeof value.input_tokens === "number")
83
+ usage.inputTokens = value.input_tokens;
84
+ if (typeof value.output_tokens === "number")
85
+ usage.outputTokens = value.output_tokens;
86
+ if (typeof value.cache_read_input_tokens === "number")
87
+ usage.cachedReadTokens = value.cache_read_input_tokens;
88
+ if (typeof value.cache_creation_input_tokens === "number")
89
+ usage.cachedWriteTokens = value.cache_creation_input_tokens;
90
+ return Object.keys(usage).length > 0 ? usage : null;
91
+ }
92
+ function errorMessage(value, fallback) {
93
+ if (typeof value.message === "string" && value.message)
94
+ return value.message;
95
+ if (isRecord(value.error) && typeof value.error.message === "string")
96
+ return value.error.message;
97
+ return fallback;
98
+ }
99
+ function fileAction(value) {
100
+ return value === "created" || value === "updated" || value === "deleted" ? value : "unknown";
101
+ }
102
+ //# sourceMappingURL=claude-stream-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-stream-json.js","sourceRoot":"","sources":["../../src/parsers/claude-stream-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AgentEventInput } from "../core/events.js";
2
+ import type { StreamParser } from "../adapters/adapter-types.js";
3
+ export declare class CodexJsonParser implements StreamParser {
4
+ private readonly lines;
5
+ parse(chunk: string): AgentEventInput[];
6
+ flush(): AgentEventInput[];
7
+ private parseLine;
8
+ }
@@ -0,0 +1,107 @@
1
+ import { isRecord, LineBuffer, safeJsonParse } from "./line-buffer.js";
2
+ export class CodexJsonParser {
3
+ lines = new LineBuffer();
4
+ parse(chunk) {
5
+ return this.lines.push(chunk).flatMap((line) => this.parseLine(line));
6
+ }
7
+ flush() {
8
+ return this.lines.flush().flatMap((line) => this.parseLine(line));
9
+ }
10
+ parseLine(line) {
11
+ const value = safeJsonParse(line);
12
+ if (!isRecord(value))
13
+ return [];
14
+ const type = stringAt(value, "type");
15
+ if (type === "thread.started")
16
+ return [{ type: "status", label: "initializing" }];
17
+ if (type === "turn.started")
18
+ return [{ type: "status", label: "running" }];
19
+ if (type === "turn.completed") {
20
+ const usage = usageFrom(value.usage);
21
+ return usage ? [{ type: "usage", usage }] : [{ type: "status", label: "completed" }];
22
+ }
23
+ if (type === "error") {
24
+ const message = errorMessage(value, "Codex error");
25
+ if (/^Reconnecting\.\.\./i.test(message))
26
+ return [{ type: "status", label: "reconnecting", detail: message }];
27
+ return [{ type: "error", code: "AGENT_EXECUTION_FAILED", message }];
28
+ }
29
+ if (type === "item.completed" && isRecord(value.item)) {
30
+ return itemCompleted(value.item);
31
+ }
32
+ if (type === "exec_command.begin" || type === "exec_command.started") {
33
+ const id = stringAt(value, "call_id") ?? stringAt(value, "id") ?? "command";
34
+ const command = stringAt(value, "command") ?? "shell";
35
+ return [{ type: "tool_call", id, name: "shell", input: { command } }];
36
+ }
37
+ if (type === "exec_command.end" || type === "exec_command.completed") {
38
+ const id = stringAt(value, "call_id") ?? stringAt(value, "id") ?? "command";
39
+ return [{ type: "tool_result", id, output: value.output ?? value.stdout ?? "", isError: value.exit_code !== 0 }];
40
+ }
41
+ return [];
42
+ }
43
+ }
44
+ function itemCompleted(item) {
45
+ const itemType = stringAt(item, "type");
46
+ if (itemType === "agent_message" || itemType === "message") {
47
+ const text = extractText(item);
48
+ return text ? [{ type: "text_delta", text }] : [];
49
+ }
50
+ if (itemType === "tool_call") {
51
+ const id = stringAt(item, "id") ?? "tool";
52
+ const name = stringAt(item, "name") ?? "tool";
53
+ return [{ type: "tool_call", id, name, input: item.input }];
54
+ }
55
+ if (itemType === "tool_result") {
56
+ const id = stringAt(item, "id") ?? stringAt(item, "tool_call_id") ?? "tool";
57
+ return [{ type: "tool_result", id, output: item.output, isError: Boolean(item.is_error) }];
58
+ }
59
+ if (itemType === "file_event" || itemType === "file_change") {
60
+ const path = stringAt(item, "path");
61
+ if (!path)
62
+ return [];
63
+ return [{ type: "file_event", path, action: fileAction(item.action) }];
64
+ }
65
+ return [];
66
+ }
67
+ function extractText(value) {
68
+ if (typeof value.text === "string")
69
+ return value.text;
70
+ if (typeof value.content === "string")
71
+ return value.content;
72
+ if (Array.isArray(value.content)) {
73
+ return value.content
74
+ .map((part) => (isRecord(part) && typeof part.text === "string" ? part.text : ""))
75
+ .join("");
76
+ }
77
+ if (isRecord(value.message))
78
+ return extractText(value.message);
79
+ return "";
80
+ }
81
+ function usageFrom(value) {
82
+ if (!isRecord(value))
83
+ return null;
84
+ const usage = {};
85
+ if (typeof value.input_tokens === "number")
86
+ usage.inputTokens = value.input_tokens;
87
+ if (typeof value.output_tokens === "number")
88
+ usage.outputTokens = value.output_tokens;
89
+ if (typeof value.reasoning_tokens === "number")
90
+ usage.thinkingTokens = value.reasoning_tokens;
91
+ return Object.keys(usage).length > 0 ? usage : null;
92
+ }
93
+ function stringAt(value, key) {
94
+ const raw = value[key];
95
+ return typeof raw === "string" && raw ? raw : undefined;
96
+ }
97
+ function fileAction(value) {
98
+ return value === "created" || value === "updated" || value === "deleted" ? value : "unknown";
99
+ }
100
+ function errorMessage(value, fallback) {
101
+ if (typeof value.message === "string" && value.message)
102
+ return value.message;
103
+ if (isRecord(value.error) && typeof value.error.message === "string")
104
+ return value.error.message;
105
+ return fallback;
106
+ }
107
+ //# sourceMappingURL=codex-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-json.js","sourceRoot":"","sources":["../../src/parsers/codex-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class LineBuffer {
2
+ private buffer;
3
+ push(chunk: string): string[];
4
+ flush(): string[];
5
+ }
6
+ export declare function safeJsonParse(value: string): unknown;
7
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
@@ -0,0 +1,28 @@
1
+ export class LineBuffer {
2
+ buffer = "";
3
+ push(chunk) {
4
+ this.buffer += chunk;
5
+ const lines = this.buffer.split(/\r?\n/u);
6
+ this.buffer = lines.pop() ?? "";
7
+ return lines.filter((line) => line.length > 0);
8
+ }
9
+ flush() {
10
+ if (!this.buffer)
11
+ return [];
12
+ const line = this.buffer;
13
+ this.buffer = "";
14
+ return [line];
15
+ }
16
+ }
17
+ export function safeJsonParse(value) {
18
+ try {
19
+ return JSON.parse(value);
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ export function isRecord(value) {
26
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
27
+ }
28
+ //# sourceMappingURL=line-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-buffer.js","sourceRoot":"","sources":["../../src/parsers/line-buffer.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAU;IACb,MAAM,GAAG,EAAE,CAAC;IAEpB,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AgentEventInput } from "../core/events.js";
2
+ import type { StreamParser } from "../adapters/adapter-types.js";
3
+ export declare class OpenCodeJsonParser implements StreamParser {
4
+ private readonly lines;
5
+ parse(chunk: string): AgentEventInput[];
6
+ flush(): AgentEventInput[];
7
+ private parseLine;
8
+ }