@puzzmo/cli 1.0.32 → 1.0.34

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 (58) hide show
  1. package/lib/agents/claude.d.ts +5 -0
  2. package/lib/agents/claude.js +69 -0
  3. package/lib/agents/claude.js.map +1 -0
  4. package/lib/agents/codex.d.ts +4 -0
  5. package/lib/agents/codex.js +90 -0
  6. package/lib/agents/codex.js.map +1 -0
  7. package/lib/agents/copilot.d.ts +4 -0
  8. package/lib/agents/copilot.js +123 -0
  9. package/lib/agents/copilot.js.map +1 -0
  10. package/lib/agents/gemini.d.ts +5 -0
  11. package/lib/agents/gemini.js +69 -0
  12. package/lib/agents/gemini.js.map +1 -0
  13. package/lib/agents/index.d.ts +5 -0
  14. package/lib/agents/index.js +15 -0
  15. package/lib/agents/index.js.map +1 -0
  16. package/lib/agents/opencode.d.ts +5 -0
  17. package/lib/agents/opencode.js +159 -0
  18. package/lib/agents/opencode.js.map +1 -0
  19. package/lib/agents/stream-json-cli.d.ts +12 -0
  20. package/lib/agents/stream-json-cli.js +75 -0
  21. package/lib/agents/stream-json-cli.js.map +1 -0
  22. package/lib/agents/types.d.ts +37 -0
  23. package/lib/agents/types.js +2 -0
  24. package/lib/agents/types.js.map +1 -0
  25. package/lib/commands/agent-test.d.ts +3 -0
  26. package/lib/commands/agent-test.js +79 -0
  27. package/lib/commands/agent-test.js.map +1 -0
  28. package/lib/commands/game/create.js +6 -4
  29. package/lib/commands/game/create.js.map +1 -1
  30. package/lib/commands/upload.d.ts +5 -1
  31. package/lib/commands/upload.js +41 -40
  32. package/lib/commands/upload.js.map +1 -1
  33. package/lib/index.js +10 -4
  34. package/lib/index.js.map +1 -1
  35. package/lib/tui/pipeline.d.ts +1 -2
  36. package/lib/tui/pipeline.js +160 -267
  37. package/lib/tui/pipeline.js.map +1 -1
  38. package/lib/util/api.d.ts +5 -1
  39. package/lib/util/api.js +29 -16
  40. package/lib/util/api.js.map +1 -1
  41. package/lib/util/validatePuzzmoFile.js +31 -6
  42. package/lib/util/validatePuzzmoFile.js.map +1 -1
  43. package/package.json +4 -1
  44. package/src/agents/claude.ts +72 -0
  45. package/src/agents/codex.ts +82 -0
  46. package/src/agents/copilot.ts +118 -0
  47. package/src/agents/gemini.ts +74 -0
  48. package/src/agents/index.ts +20 -0
  49. package/src/agents/opencode.ts +154 -0
  50. package/src/agents/stream-json-cli.ts +86 -0
  51. package/src/agents/types.ts +22 -0
  52. package/src/commands/agent-test.ts +81 -0
  53. package/src/commands/game/create.ts +6 -4
  54. package/src/commands/upload.ts +53 -39
  55. package/src/index.ts +10 -4
  56. package/src/tui/pipeline.ts +151 -268
  57. package/src/util/api.ts +29 -13
  58. package/src/util/validatePuzzmoFile.ts +30 -7
@@ -0,0 +1,5 @@
1
+ import type { Agent } from "./types.js";
2
+ /** Claude adapter — wraps the local `claude` CLI in subprocess + stream-json mode
3
+ * so the user's existing subscription auth keeps working. The Claude Agent SDK
4
+ * requires an API key, which we explicitly want to avoid here. */
5
+ export declare const claudeAgent: Agent;
@@ -0,0 +1,69 @@
1
+ import { runStreamJsonCli } from "./stream-json-cli.js";
2
+ /** Claude adapter — wraps the local `claude` CLI in subprocess + stream-json mode
3
+ * so the user's existing subscription auth keeps working. The Claude Agent SDK
4
+ * requires an API key, which we explicitly want to avoid here. */
5
+ export const claudeAgent = {
6
+ name: "claude",
7
+ run: (input) => runStreamJsonCli({
8
+ cmd: "claude",
9
+ buildArgs: (prompt) => ["-p", "--output-format", "stream-json", "--include-partial-messages", "--verbose", prompt],
10
+ parseLine: parseClaudeLine,
11
+ env: (base) => {
12
+ delete base.CLAUDECODE; // claude refuses to start nested otherwise
13
+ return base;
14
+ },
15
+ }, input),
16
+ };
17
+ /** Map one stream-json line from claude to an AgentEvent (or null to skip). */
18
+ const parseClaudeLine = (line) => {
19
+ let obj;
20
+ try {
21
+ obj = JSON.parse(line);
22
+ }
23
+ catch {
24
+ return { type: "system", text: line };
25
+ }
26
+ // Token-level deltas via --include-partial-messages
27
+ if (obj.type === "stream_event" && obj.event) {
28
+ const ev = obj.event;
29
+ if (ev.type === "content_block_delta" && ev.delta?.type === "text_delta")
30
+ return { type: "text", text: ev.delta.text };
31
+ if (ev.type === "content_block_delta" && ev.delta?.type === "thinking_delta")
32
+ return { type: "thinking", text: ev.delta.thinking ?? "" };
33
+ if (ev.type === "content_block_start" && ev.content_block?.type === "tool_use")
34
+ return {
35
+ type: "tool_use",
36
+ name: ev.content_block.name,
37
+ summary: summarizeToolInput(ev.content_block.name, ev.content_block.input ?? {}),
38
+ };
39
+ return null;
40
+ }
41
+ // Per-turn full messages — suppress to avoid duplicating the deltas
42
+ if (obj.type === "assistant" && obj.message?.content)
43
+ return null;
44
+ if (obj.type === "user") {
45
+ const r = obj.tool_use_result;
46
+ if (r?.type === "create")
47
+ return { type: "tool_result", ok: true, summary: `Created ${r.filePath}` };
48
+ if (r?.type === "update")
49
+ return { type: "tool_result", ok: true, summary: `Updated ${r.filePath}` };
50
+ return null;
51
+ }
52
+ if (obj.type === "result") {
53
+ const cost = typeof obj.total_cost_usd === "number" ? obj.total_cost_usd : obj.cost_usd;
54
+ return { type: "result", ok: obj.is_error !== true, costUSD: cost };
55
+ }
56
+ if (obj.type === "system" && obj.subtype === "init")
57
+ return { type: "system", text: "Session started" };
58
+ return null;
59
+ };
60
+ const summarizeToolInput = (name, input) => {
61
+ if (name === "Edit" || name === "Write" || name === "Read")
62
+ return input.file_path ?? "";
63
+ if (name === "Bash")
64
+ return String(input.command ?? "").slice(0, 200);
65
+ if (name === "Glob" || name === "Grep")
66
+ return String(input.pattern ?? "");
67
+ return "";
68
+ };
69
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Agent } from "./types.js";
2
+ /** Codex adapter — wraps `@openai/codex-sdk`, which itself shells out to the
3
+ * user's installed `codex` CLI and reuses its ChatGPT subscription auth. */
4
+ export declare const codexAgent: Agent;
@@ -0,0 +1,90 @@
1
+ import { Codex } from "@openai/codex-sdk";
2
+ /** Codex adapter — wraps `@openai/codex-sdk`, which itself shells out to the
3
+ * user's installed `codex` CLI and reuses its ChatGPT subscription auth. */
4
+ export const codexAgent = {
5
+ name: "codex",
6
+ run(input) {
7
+ return runCodex(input);
8
+ },
9
+ };
10
+ const runCodex = async function* (input) {
11
+ const codex = new Codex();
12
+ let thread;
13
+ try {
14
+ thread = codex.startThread({
15
+ workingDirectory: input.cwd ?? process.cwd(),
16
+ skipGitRepoCheck: true,
17
+ });
18
+ }
19
+ catch (e) {
20
+ yield { type: "error", message: `Failed to start codex thread: ${e.message}` };
21
+ return;
22
+ }
23
+ let streamed;
24
+ try {
25
+ streamed = await thread.runStreamed(input.prompt, { signal: input.signal });
26
+ }
27
+ catch (e) {
28
+ yield { type: "error", message: `Codex run failed: ${e.message}` };
29
+ return;
30
+ }
31
+ try {
32
+ for await (const event of streamed.events) {
33
+ const mapped = mapCodexEvent(event);
34
+ for (const m of mapped)
35
+ yield m;
36
+ }
37
+ }
38
+ catch (e) {
39
+ yield { type: "error", message: e.message ?? String(e) };
40
+ return;
41
+ }
42
+ };
43
+ const mapCodexEvent = (event) => {
44
+ if (event.type === "item.completed" || event.type === "item.updated") {
45
+ const item = event.item;
46
+ if (!item)
47
+ return [];
48
+ if (item.type === "agent_message" && event.type === "item.completed")
49
+ return [{ type: "text", text: appendNL(item.text ?? "") }];
50
+ if (item.type === "reasoning" && event.type === "item.completed")
51
+ return [{ type: "thinking", text: appendNL(item.text ?? "") }];
52
+ if (item.type === "command_execution") {
53
+ if (item.status === "in_progress" && event.type === "item.updated")
54
+ return [];
55
+ if (item.status === "completed" || item.status === "failed")
56
+ return [{ type: "tool_result", ok: item.status === "completed", summary: item.command ?? "" }];
57
+ return [{ type: "tool_use", name: "Bash", summary: item.command ?? "" }];
58
+ }
59
+ if (item.type === "file_change") {
60
+ const summary = (item.changes ?? []).map((c) => `${c.kind} ${c.path}`).join(", ");
61
+ return [{ type: "tool_result", ok: item.status === "completed", summary }];
62
+ }
63
+ if (item.type === "mcp_tool_call") {
64
+ if (item.status === "in_progress")
65
+ return [{ type: "tool_use", name: `${item.server}/${item.tool}`, summary: "" }];
66
+ return [{ type: "tool_result", ok: item.status === "completed", summary: item.error?.message ?? "" }];
67
+ }
68
+ if (item.type === "web_search")
69
+ return [{ type: "tool_use", name: "WebSearch", summary: item.query ?? "" }];
70
+ if (item.type === "todo_list")
71
+ return [];
72
+ if (item.type === "error")
73
+ return [{ type: "error", message: item.message ?? "" }];
74
+ return [];
75
+ }
76
+ if (event.type === "turn.completed")
77
+ return [{ type: "result", ok: true }];
78
+ if (event.type === "turn.failed")
79
+ return [
80
+ { type: "error", message: event.error?.message ?? "turn failed" },
81
+ { type: "result", ok: false },
82
+ ];
83
+ if (event.type === "thread.started")
84
+ return [{ type: "system", text: "Thread started" }];
85
+ if (event.type === "error")
86
+ return [{ type: "error", message: event.message ?? "" }];
87
+ return [];
88
+ };
89
+ const appendNL = (s) => (s.endsWith("\n") ? s : s + "\n");
90
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Agent } from "./types.js";
2
+ /** Copilot adapter — wraps `@github/copilot-sdk`, which spawns the bundled
3
+ * `@github/copilot` CLI and reuses its OAuth/Copilot Pro subscription auth. */
4
+ export declare const copilotAgent: Agent;
@@ -0,0 +1,123 @@
1
+ import { CopilotClient, approveAll } from "@github/copilot-sdk";
2
+ /** Copilot adapter — wraps `@github/copilot-sdk`, which spawns the bundled
3
+ * `@github/copilot` CLI and reuses its OAuth/Copilot Pro subscription auth. */
4
+ export const copilotAgent = {
5
+ name: "copilot",
6
+ run(input) {
7
+ return runCopilot(input);
8
+ },
9
+ };
10
+ const runCopilot = async function* (input) {
11
+ const client = new CopilotClient({ cwd: input.cwd ?? process.cwd() });
12
+ try {
13
+ await client.start();
14
+ }
15
+ catch (e) {
16
+ yield { type: "error", message: `Copilot client failed to start: ${e.message}` };
17
+ return;
18
+ }
19
+ const events = [];
20
+ let waiting = null;
21
+ const push = (e) => {
22
+ events.push(e);
23
+ waiting?.();
24
+ waiting = null;
25
+ };
26
+ let session;
27
+ try {
28
+ session = await client.createSession({
29
+ streaming: true,
30
+ workingDirectory: input.cwd ?? process.cwd(),
31
+ onPermissionRequest: approveAll,
32
+ onEvent: (event) => {
33
+ const mapped = mapCopilotEvent(event);
34
+ for (const m of mapped)
35
+ push(m);
36
+ },
37
+ });
38
+ }
39
+ catch (e) {
40
+ yield { type: "error", message: `Copilot session creation failed: ${e.message}` };
41
+ await safeStop(client);
42
+ return;
43
+ }
44
+ const cancel = () => {
45
+ session.disconnect().catch(() => { });
46
+ };
47
+ if (input.signal)
48
+ input.signal.addEventListener("abort", cancel);
49
+ let runError = null;
50
+ let runDone = false;
51
+ session
52
+ .sendAndWait({ prompt: input.prompt }, 600_000)
53
+ .catch((e) => {
54
+ runError = e;
55
+ })
56
+ .finally(() => {
57
+ runDone = true;
58
+ waiting?.();
59
+ waiting = null;
60
+ });
61
+ try {
62
+ while (true) {
63
+ if (events.length > 0) {
64
+ yield events.shift();
65
+ continue;
66
+ }
67
+ if (runDone) {
68
+ if (runError)
69
+ yield { type: "error", message: runError.message };
70
+ yield { type: "result", ok: !runError };
71
+ return;
72
+ }
73
+ await new Promise((r) => (waiting = r));
74
+ }
75
+ }
76
+ finally {
77
+ await session.disconnect().catch(() => { });
78
+ await safeStop(client);
79
+ }
80
+ };
81
+ const safeStop = async (client) => {
82
+ try {
83
+ await client.stop();
84
+ }
85
+ catch {
86
+ /* ignore */
87
+ }
88
+ };
89
+ const mapCopilotEvent = (event) => {
90
+ if (event.type === "assistant.message_delta")
91
+ return [{ type: "text", text: event.data?.deltaContent ?? "" }];
92
+ if (event.type === "assistant.reasoning_delta")
93
+ return [{ type: "thinking", text: event.data?.deltaContent ?? event.data?.delta ?? "" }];
94
+ if (event.type === "tool.execution_start") {
95
+ const name = event.data?.toolName ?? "tool";
96
+ const args = event.data?.arguments;
97
+ return [{ type: "tool_use", name, summary: summarizeToolArgs(name, args) }];
98
+ }
99
+ if (event.type === "tool.execution_complete") {
100
+ const ok = event.data?.success === true;
101
+ const summary = event.data?.result?.content?.slice(0, 200) ?? event.data?.error?.message ?? "";
102
+ return [{ type: "tool_result", ok, summary }];
103
+ }
104
+ if (event.type === "session.error")
105
+ return [{ type: "error", message: event.data?.message ?? "session error" }];
106
+ if (event.type === "session.start")
107
+ return [{ type: "system", text: "Session started" }];
108
+ return [];
109
+ };
110
+ const summarizeToolArgs = (name, args) => {
111
+ if (!args || typeof args !== "object")
112
+ return "";
113
+ if (typeof args.command === "string")
114
+ return args.command.slice(0, 200);
115
+ if (typeof args.file_path === "string")
116
+ return args.file_path;
117
+ if (typeof args.path === "string")
118
+ return args.path;
119
+ if (typeof args.pattern === "string")
120
+ return args.pattern;
121
+ return "";
122
+ };
123
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/agents/copilot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Agent } from "./types.js";
2
+ /** Gemini adapter — wraps the local `gemini` CLI in subprocess + stream-json
3
+ * mode. Auth delegates to the user's `gemini` CLI login (Google account /
4
+ * Code Assist) or falls back to GEMINI_API_KEY. */
5
+ export declare const geminiAgent: Agent;
@@ -0,0 +1,69 @@
1
+ import { runStreamJsonCli } from "./stream-json-cli.js";
2
+ /** Gemini adapter — wraps the local `gemini` CLI in subprocess + stream-json
3
+ * mode. Auth delegates to the user's `gemini` CLI login (Google account /
4
+ * Code Assist) or falls back to GEMINI_API_KEY. */
5
+ export const geminiAgent = {
6
+ name: "gemini",
7
+ run: (input) => runStreamJsonCli({
8
+ cmd: "gemini",
9
+ buildArgs: (prompt) => ["-p", prompt, "--output-format", "stream-json"],
10
+ parseLine: parseGeminiLine,
11
+ }, input),
12
+ };
13
+ /** Map one stream-json line from gemini to an AgentEvent (or null to skip).
14
+ * Event union per `@google/gemini-cli-core`'s `JsonStreamEvent`:
15
+ * init / message / tool_use / tool_result / error / result. */
16
+ const parseGeminiLine = (line) => {
17
+ let obj;
18
+ try {
19
+ obj = JSON.parse(line);
20
+ }
21
+ catch {
22
+ return { type: "system", text: line };
23
+ }
24
+ if (obj.type === "init")
25
+ return { type: "system", text: "Session started" };
26
+ if (obj.type === "message") {
27
+ // Streaming deltas flow inline; complete `content` chunks get a trailing newline
28
+ // so consecutive messages don't glue together in the rendered output.
29
+ if (typeof obj.delta === "string") {
30
+ return obj.role === "thinking" ? { type: "thinking", text: obj.delta } : { type: "text", text: obj.delta };
31
+ }
32
+ const text = obj.content ?? "";
33
+ if (!text)
34
+ return null;
35
+ const withNL = text.endsWith("\n") ? text : text + "\n";
36
+ return obj.role === "thinking" ? { type: "thinking", text: withNL } : { type: "text", text: withNL };
37
+ }
38
+ if (obj.type === "tool_use") {
39
+ const name = obj.tool_name ?? "tool";
40
+ return { type: "tool_use", name, summary: summarizeToolInput(name, obj.parameters ?? {}) };
41
+ }
42
+ if (obj.type === "tool_result") {
43
+ const ok = obj.status === "success" || obj.status === "ok";
44
+ const summary = String(obj.output ?? obj.error ?? "").slice(0, 200);
45
+ return { type: "tool_result", ok, summary };
46
+ }
47
+ if (obj.type === "error")
48
+ return { type: "error", message: obj.message ?? "" };
49
+ if (obj.type === "result") {
50
+ const ok = obj.status === "success" || obj.status === "ok";
51
+ const cost = typeof obj.stats?.cost_usd === "number" ? obj.stats.cost_usd : undefined;
52
+ return { type: "result", ok, costUSD: cost };
53
+ }
54
+ return null;
55
+ };
56
+ const summarizeToolInput = (name, input) => {
57
+ if (!input || typeof input !== "object")
58
+ return "";
59
+ if (typeof input.command === "string")
60
+ return input.command.slice(0, 200);
61
+ if (typeof input.file_path === "string")
62
+ return input.file_path;
63
+ if (typeof input.path === "string")
64
+ return input.path;
65
+ if (typeof input.pattern === "string")
66
+ return input.pattern;
67
+ return name;
68
+ };
69
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/agents/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Agent } from "./types.js";
2
+ export type { Agent, AgentEvent, RunInput } from "./types.js";
3
+ export declare const AGENTS: Record<string, Agent>;
4
+ export declare const getAgent: (name: string) => Agent | undefined;
5
+ export declare const agentNames: () => string[];
@@ -0,0 +1,15 @@
1
+ import { claudeAgent } from "./claude.js";
2
+ import { codexAgent } from "./codex.js";
3
+ import { copilotAgent } from "./copilot.js";
4
+ import { geminiAgent } from "./gemini.js";
5
+ import { opencodeAgent } from "./opencode.js";
6
+ export const AGENTS = {
7
+ claude: claudeAgent,
8
+ codex: codexAgent,
9
+ copilot: copilotAgent,
10
+ gemini: geminiAgent,
11
+ opencode: opencodeAgent,
12
+ };
13
+ export const getAgent = (name) => AGENTS[name];
14
+ export const agentNames = () => Object.keys(AGENTS);
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAK7C,MAAM,CAAC,MAAM,MAAM,GAA0B;IAC3C,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,aAAa;CACxB,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAqB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAG,GAAa,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { Agent } from "./types.js";
2
+ /** OpenCode adapter — spawns a local opencode server, opens an SSE stream
3
+ * against it, creates a session, and sends a prompt. Auth lives in the
4
+ * user's `opencode` CLI config / `client.auth.set()`. */
5
+ export declare const opencodeAgent: Agent;
@@ -0,0 +1,159 @@
1
+ import { createOpencodeClient, createOpencodeServer } from "@opencode-ai/sdk";
2
+ /** OpenCode adapter — spawns a local opencode server, opens an SSE stream
3
+ * against it, creates a session, and sends a prompt. Auth lives in the
4
+ * user's `opencode` CLI config / `client.auth.set()`. */
5
+ export const opencodeAgent = {
6
+ name: "opencode",
7
+ run(input) {
8
+ return runOpencode(input);
9
+ },
10
+ };
11
+ const runOpencode = async function* (input) {
12
+ const cwd = input.cwd ?? process.cwd();
13
+ let server;
14
+ try {
15
+ server = await createOpencodeServer({ signal: input.signal, config: { project: cwd } });
16
+ }
17
+ catch (e) {
18
+ yield { type: "error", message: `Opencode server failed to start: ${e.message}` };
19
+ return;
20
+ }
21
+ const client = createOpencodeClient({ baseUrl: server.url });
22
+ // Buffered event queue + waiter, so the SSE consumer pushes and the generator yields.
23
+ const events = [];
24
+ let waiting = null;
25
+ const wake = () => {
26
+ waiting?.();
27
+ waiting = null;
28
+ };
29
+ const push = (e) => {
30
+ events.push(e);
31
+ wake();
32
+ };
33
+ let done = false;
34
+ let sessionID = null;
35
+ // Start SSE before sending a prompt so we don't lose early events.
36
+ const sseTask = (async () => {
37
+ try {
38
+ const sub = await client.event.subscribe();
39
+ for await (const event of sub.stream) {
40
+ if (event.type === "session.idle" && event.properties?.sessionID && event.properties.sessionID === sessionID) {
41
+ push({ type: "result", ok: true });
42
+ done = true;
43
+ wake();
44
+ return;
45
+ }
46
+ const mapped = mapOpencodeEvent(event, sessionID);
47
+ for (const m of mapped)
48
+ push(m);
49
+ }
50
+ }
51
+ catch (e) {
52
+ push({ type: "error", message: `SSE stream error: ${e.message}` });
53
+ done = true;
54
+ wake();
55
+ }
56
+ })();
57
+ // Create the session, then fire the prompt. We use promptAsync so we don't block
58
+ // on completion — the SSE stream's session.idle event is our signal to stop.
59
+ let session;
60
+ try {
61
+ const created = await client.session.create({ body: { title: "puzzmo-cli" }, query: { directory: cwd } });
62
+ session = created.data;
63
+ if (!session?.id)
64
+ throw new Error("session.create returned no id");
65
+ sessionID = session.id;
66
+ }
67
+ catch (e) {
68
+ push({ type: "error", message: `Session creation failed: ${e.message}` });
69
+ done = true;
70
+ wake();
71
+ }
72
+ if (sessionID) {
73
+ client.session
74
+ .promptAsync({
75
+ path: { id: sessionID },
76
+ body: { parts: [{ type: "text", text: input.prompt }] },
77
+ query: { directory: cwd },
78
+ })
79
+ .catch((e) => {
80
+ push({ type: "error", message: `Prompt failed: ${e.message}` });
81
+ done = true;
82
+ wake();
83
+ });
84
+ }
85
+ if (input.signal)
86
+ input.signal.addEventListener("abort", () => {
87
+ done = true;
88
+ wake();
89
+ });
90
+ try {
91
+ while (true) {
92
+ if (events.length > 0) {
93
+ yield events.shift();
94
+ continue;
95
+ }
96
+ if (done)
97
+ return;
98
+ await new Promise((r) => (waiting = r));
99
+ }
100
+ }
101
+ finally {
102
+ server.close();
103
+ await sseTask.catch(() => { });
104
+ }
105
+ };
106
+ const mapOpencodeEvent = (event, sessionID) => {
107
+ if (event.type === "message.part.updated") {
108
+ const part = event.properties?.part;
109
+ const delta = event.properties?.delta;
110
+ if (!part)
111
+ return [];
112
+ // Deltas flow inline; complete-snapshot text gets a trailing newline so consecutive messages don't run together.
113
+ if (part.type === "text") {
114
+ if (delta != null)
115
+ return [{ type: "text", text: delta }];
116
+ const text = part.text ?? "";
117
+ if (!text)
118
+ return [];
119
+ return [{ type: "text", text: text.endsWith("\n") ? text : text + "\n" }];
120
+ }
121
+ if (part.type === "reasoning") {
122
+ if (delta != null)
123
+ return [{ type: "thinking", text: delta }];
124
+ const text = part.text ?? "";
125
+ if (!text)
126
+ return [];
127
+ return [{ type: "thinking", text: text.endsWith("\n") ? text : text + "\n" }];
128
+ }
129
+ if (part.type === "tool") {
130
+ const state = part.state?.status ?? part.state;
131
+ if (state === "completed" || state === "error")
132
+ return [{ type: "tool_result", ok: state === "completed", summary: summarizeToolPart(part) }];
133
+ return [{ type: "tool_use", name: part.tool ?? "tool", summary: summarizeToolPart(part) }];
134
+ }
135
+ return [];
136
+ }
137
+ if (event.type === "file.edited")
138
+ return [{ type: "tool_result", ok: true, summary: `Edited ${event.properties?.file ?? ""}` }];
139
+ if (event.type === "command.executed")
140
+ return [{ type: "tool_use", name: "Bash", summary: event.properties?.arguments ?? "" }];
141
+ if (event.type === "session.error" && (!sessionID || event.properties?.sessionID === sessionID))
142
+ return [{ type: "error", message: event.properties?.error?.message ?? "session error" }];
143
+ return [];
144
+ };
145
+ const summarizeToolPart = (part) => {
146
+ const input = part.state?.input ?? part.input;
147
+ if (!input || typeof input !== "object")
148
+ return part.tool ?? "";
149
+ if (typeof input.command === "string")
150
+ return input.command.slice(0, 200);
151
+ if (typeof input.file_path === "string")
152
+ return input.file_path;
153
+ if (typeof input.path === "string")
154
+ return input.path;
155
+ if (typeof input.pattern === "string")
156
+ return input.pattern;
157
+ return part.tool ?? "";
158
+ };
159
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AgentEvent, RunInput } from "./types.js";
2
+ /** Shared driver for any CLI that emits NDJSON over stdout when given a prompt
3
+ * in print/headless mode. Used by both the claude and gemini adapters. */
4
+ export type StreamJsonCliConfig = {
5
+ cmd: string;
6
+ buildArgs: (prompt: string) => string[];
7
+ /** Map one parsed JSON line to an AgentEvent (or null to drop). */
8
+ parseLine: (line: string) => AgentEvent | null;
9
+ /** Optional env mutator. Receives a copy of process.env. */
10
+ env?: (base: NodeJS.ProcessEnv) => NodeJS.ProcessEnv;
11
+ };
12
+ export declare const runStreamJsonCli: (config: StreamJsonCliConfig, input: RunInput) => AsyncIterable<AgentEvent>;