@oxgeneral/orch 1.0.26 → 1.0.28

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 (53) hide show
  1. package/dist/App-YVHDT4VD.js +23 -0
  2. package/dist/antigravity-O4HXTW5G.js +2 -0
  3. package/dist/{antigravity-W43JJLR2.js → antigravity-Q5KU76IE.js} +3 -3
  4. package/dist/{antigravity-W43JJLR2.js.map → antigravity-Q5KU76IE.js.map} +1 -1
  5. package/dist/{chunk-ITMAWW3J.js → chunk-5KNZ2OEV.js} +1 -1
  6. package/dist/{chunk-YKUO5PD4.js → chunk-6ZRSU2RC.js} +1 -1
  7. package/dist/chunk-COJCLTPD.js +3 -0
  8. package/dist/chunk-CY5VX7G5.js +102 -0
  9. package/dist/chunk-CY5VX7G5.js.map +1 -0
  10. package/dist/chunk-JEMJFAMY.js +6 -0
  11. package/dist/chunk-LWYSQ32X.js +2 -0
  12. package/dist/claude-MK3KXPCV.js +2 -0
  13. package/dist/{claude-KZMCTMDP.js → claude-TCPV5VGL.js} +3 -3
  14. package/dist/{claude-KZMCTMDP.js.map → claude-TCPV5VGL.js.map} +1 -1
  15. package/dist/cli.js +1 -1
  16. package/dist/codex-6TTUEMXU.js +2 -0
  17. package/dist/{codex-UR7Q22OV.js → codex-ZWDFBGE4.js} +3 -3
  18. package/dist/{codex-UR7Q22OV.js.map → codex-ZWDFBGE4.js.map} +1 -1
  19. package/dist/{container-WJJQSUHB.js → container-CH5HKCZU.js} +2 -2
  20. package/dist/{cursor-O6M6XOMT.js → cursor-E7X5BWGB.js} +9 -10
  21. package/dist/cursor-E7X5BWGB.js.map +1 -0
  22. package/dist/cursor-RCZXGZ3O.js +2 -0
  23. package/dist/{doctor-X2D67Q6Q.js → doctor-ITKGSHFU.js} +1 -1
  24. package/dist/index.d.ts +2 -1
  25. package/dist/index.js +12 -7
  26. package/dist/index.js.map +1 -1
  27. package/dist/opencode-3Q4KA3CM.js +2 -0
  28. package/dist/{opencode-HOX5TCMD.js → opencode-DA6U3KYP.js} +3 -3
  29. package/dist/{opencode-HOX5TCMD.js.map → opencode-DA6U3KYP.js.map} +1 -1
  30. package/dist/{pi-GFJCLRZJ.js → pi-AZBWGTUL.js} +6 -24
  31. package/dist/pi-AZBWGTUL.js.map +1 -0
  32. package/dist/pi-IDZOXOPE.js +2 -0
  33. package/dist/shell-YEHU4QG6.js +2 -0
  34. package/dist/{shell-C2J4AIAV.js → shell-ZQZBBNLC.js} +3 -3
  35. package/dist/{shell-C2J4AIAV.js.map → shell-ZQZBBNLC.js.map} +1 -1
  36. package/dist/{task-V72DFC6L.js → task-SZDRAD7V.js} +1 -1
  37. package/dist/{tui-GFT7LF67.js → tui-25JIN7MP.js} +1 -1
  38. package/package.json +1 -1
  39. package/dist/App-B4VWJWWG.js +0 -23
  40. package/dist/antigravity-LGKZHZL7.js +0 -2
  41. package/dist/chunk-C7C7Q7XO.js +0 -4
  42. package/dist/chunk-DEHFYICU.js +0 -2
  43. package/dist/chunk-RFN447MA.js +0 -73
  44. package/dist/chunk-RFN447MA.js.map +0 -1
  45. package/dist/chunk-SJG3HXO5.js +0 -5
  46. package/dist/claude-PH7LT3OH.js +0 -2
  47. package/dist/codex-URQN4JLZ.js +0 -2
  48. package/dist/cursor-EMX3ECDY.js +0 -2
  49. package/dist/cursor-O6M6XOMT.js.map +0 -1
  50. package/dist/opencode-K22RCQ5C.js +0 -2
  51. package/dist/pi-GFJCLRZJ.js.map +0 -1
  52. package/dist/pi-XEINSHUN.js +0 -2
  53. package/dist/shell-NPNTWDMU.js +0 -2
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import {a,e}from'./chunk-JEMJFAMY.js';import {a as a$1}from'./chunk-P4JTJBWO.js';import {o}from'./chunk-LRYVT4D4.js';import'./chunk-6MJ7V6VY.js';import {execFile}from'child_process';import {promisify}from'util';var f=promisify(execFile),d=class{constructor(e){this.processManager=e;}kind="opencode";async test(){try{let{stdout:e}=await f("opencode",["--version"]);return {ok:!0,version:e.trim()}}catch(e){let r=e instanceof Error?e.message:String(e);return {ok:false,error:"OpenCode CLI not found. Install: npm i -g opencode",errorKind:o(r)}}}execute(e$1){let r=["run","--format","json"];e$1.config.model&&r.push("--model",e$1.config.model);let a$1=a(e$1.systemPrompt,e$1.prompt);r.push(a$1);let{process:t,pid:n}=this.processManager.spawn("opencode",r,{cwd:e$1.workspace,env:{...process.env,...e$1.env},signal:e$1.signal}),s=e(t,y,"OpenCode",e$1.signal);return {pid:n,events:s}}async stop(e){await this.processManager.killWithGrace(e);}};function y(o$1){if(!o$1.trim())return null;try{let e=JSON.parse(o$1),r=new Date().toISOString(),a=e.type??"",t=e.part??{};switch(a){case "step_start":return null;case "text":return {type:"output",timestamp:r,data:t.text??t};case "tool_use":{let n=t.state??{};if(n.status==="error"){let s=typeof n.error=="string"?n.error:JSON.stringify(n);return {type:"error",timestamp:r,data:n,errorKind:o(s)}}return {type:"tool_call",timestamp:r,data:{name:t.tool,input:n.input}}}case "step_finish":{let n=t.reason,s=k(t);if(n==="error"){let g=typeof t.error=="string"?t.error:JSON.stringify(t);return {type:"error",timestamp:r,data:t,tokens:s,errorKind:o(g)}}return n==="tool-calls"?null:{type:"done",timestamp:r,data:t,tokens:s}}default:return {type:"output",timestamp:r,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:o$1}}}function k(o){let e=o.tokens;if(!e||typeof e.input!="number")return;let r=e.input,a=typeof e.output=="number"?e.output:0,t=typeof e.reasoning=="number"?e.reasoning:0;return a$1(r,a,{reasoning:t})}export{d as OpenCodeAdapter};
@@ -1,4 +1,4 @@
1
- import { buildFullPrompt, createStreamingEvents } from './chunk-RFN447MA.js';
1
+ import { buildFullPrompt, createStreamingEvents } from './chunk-CY5VX7G5.js';
2
2
  import { createTokenUsage } from './chunk-RHFRHCN5.js';
3
3
  import { classifyAdapterError } from './chunk-IESAV453.js';
4
4
  import './chunk-O2MSGW3V.js';
@@ -97,5 +97,5 @@ function extractOpenCodeTokens(part) {
97
97
  }
98
98
 
99
99
  export { OpenCodeAdapter };
100
- //# sourceMappingURL=opencode-HOX5TCMD.js.map
101
- //# sourceMappingURL=opencode-HOX5TCMD.js.map
100
+ //# sourceMappingURL=opencode-DA6U3KYP.js.map
101
+ //# sourceMappingURL=opencode-DA6U3KYP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/infrastructure/adapters/opencode.ts"],"names":[],"mappings":"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","file":"opencode-HOX5TCMD.js","sourcesContent":["/**\n * OpenCode adapter.\n *\n * Spawns `opencode run --format json` in headless mode.\n * Parses JSONL events from stdout into AgentEvent stream.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { createStreamingEvents, buildFullPrompt } from './utils.js';\nimport { classifyAdapterError } from '../../domain/errors.js';\nimport { createTokenUsage } from '../../domain/run.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class OpenCodeAdapter implements IAgentAdapter {\n readonly kind = 'opencode';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('opencode', ['--version']);\n return { ok: true, version: stdout.trim() };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n ok: false,\n error: 'OpenCode CLI not found. Install: npm i -g opencode',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n 'run',\n '--format', 'json',\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n // OpenCode has no native --system-prompt; prepend to user prompt\n const fullPrompt = buildFullPrompt(params.systemPrompt, params.prompt);\n args.push(fullPrompt);\n\n const { process: proc, pid } = this.processManager.spawn('opencode', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n });\n\n const events = createStreamingEvents(proc, parseOpenCodeEvent, 'OpenCode', params.signal);\n\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction parseOpenCodeEvent(line: string): AgentEvent | null {\n if (!line.trim()) return null;\n\n try {\n const parsed: Record<string, unknown> = JSON.parse(line);\n const timestamp = new Date().toISOString();\n const type = (parsed.type as string) ?? '';\n const part = (parsed.part as Record<string, unknown>) ?? {};\n\n switch (type) {\n case 'step_start':\n return null; // lifecycle event — no user-visible content\n\n case 'text':\n return { type: 'output', timestamp, data: part.text ?? part };\n\n case 'tool_use': {\n const state = (part.state as Record<string, unknown>) ?? {};\n if (state.status === 'error') {\n const errMsg = typeof state.error === 'string' ? state.error : JSON.stringify(state);\n return { type: 'error', timestamp, data: state, errorKind: classifyAdapterError(errMsg) };\n }\n // Map to { name, input } shape expected by TUI formatToolInput\n return { type: 'tool_call', timestamp, data: { name: part.tool, input: state.input } };\n }\n\n case 'step_finish': {\n const reason = part.reason as string | undefined;\n const tokens = extractOpenCodeTokens(part);\n\n if (reason === 'error') {\n const errMsg = typeof part.error === 'string' ? part.error : JSON.stringify(part);\n return { type: 'error', timestamp, data: part, tokens, errorKind: classifyAdapterError(errMsg) };\n }\n if (reason === 'tool-calls') {\n return null; // intermediate lifecycle — tool_use events carry the actual content\n }\n // reason === 'stop', 'max_tokens', or any other terminal reason → done\n return { type: 'done', timestamp, data: part, tokens };\n }\n\n default:\n return { type: 'output', timestamp, data: parsed };\n }\n } catch {\n return { type: 'output', timestamp: new Date().toISOString(), data: line };\n }\n}\n\n/** Extract token usage from opencode step_finish part. */\nfunction extractOpenCodeTokens(part: Record<string, unknown>): import('../../domain/run.js').TokenUsage | undefined {\n const tokens = part.tokens as Record<string, unknown> | undefined;\n if (!tokens || typeof tokens.input !== 'number') return undefined;\n\n const input = tokens.input;\n const output = typeof tokens.output === 'number' ? tokens.output : 0;\n const reasoning = typeof tokens.reasoning === 'number' ? tokens.reasoning : 0;\n return createTokenUsage(input, output, { reasoning });\n}\n"]}
1
+ {"version":3,"sources":["../src/infrastructure/adapters/opencode.ts"],"names":[],"mappings":"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","file":"opencode-DA6U3KYP.js","sourcesContent":["/**\n * OpenCode adapter.\n *\n * Spawns `opencode run --format json` in headless mode.\n * Parses JSONL events from stdout into AgentEvent stream.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { createStreamingEvents, buildFullPrompt } from './utils.js';\nimport { classifyAdapterError } from '../../domain/errors.js';\nimport { createTokenUsage } from '../../domain/run.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class OpenCodeAdapter implements IAgentAdapter {\n readonly kind = 'opencode';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('opencode', ['--version']);\n return { ok: true, version: stdout.trim() };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n ok: false,\n error: 'OpenCode CLI not found. Install: npm i -g opencode',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n 'run',\n '--format', 'json',\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n // OpenCode has no native --system-prompt; prepend to user prompt\n const fullPrompt = buildFullPrompt(params.systemPrompt, params.prompt);\n args.push(fullPrompt);\n\n const { process: proc, pid } = this.processManager.spawn('opencode', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n });\n\n const events = createStreamingEvents(proc, parseOpenCodeEvent, 'OpenCode', params.signal);\n\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction parseOpenCodeEvent(line: string): AgentEvent | null {\n if (!line.trim()) return null;\n\n try {\n const parsed: Record<string, unknown> = JSON.parse(line);\n const timestamp = new Date().toISOString();\n const type = (parsed.type as string) ?? '';\n const part = (parsed.part as Record<string, unknown>) ?? {};\n\n switch (type) {\n case 'step_start':\n return null; // lifecycle event — no user-visible content\n\n case 'text':\n return { type: 'output', timestamp, data: part.text ?? part };\n\n case 'tool_use': {\n const state = (part.state as Record<string, unknown>) ?? {};\n if (state.status === 'error') {\n const errMsg = typeof state.error === 'string' ? state.error : JSON.stringify(state);\n return { type: 'error', timestamp, data: state, errorKind: classifyAdapterError(errMsg) };\n }\n // Map to { name, input } shape expected by TUI formatToolInput\n return { type: 'tool_call', timestamp, data: { name: part.tool, input: state.input } };\n }\n\n case 'step_finish': {\n const reason = part.reason as string | undefined;\n const tokens = extractOpenCodeTokens(part);\n\n if (reason === 'error') {\n const errMsg = typeof part.error === 'string' ? part.error : JSON.stringify(part);\n return { type: 'error', timestamp, data: part, tokens, errorKind: classifyAdapterError(errMsg) };\n }\n if (reason === 'tool-calls') {\n return null; // intermediate lifecycle — tool_use events carry the actual content\n }\n // reason === 'stop', 'max_tokens', or any other terminal reason → done\n return { type: 'done', timestamp, data: part, tokens };\n }\n\n default:\n return { type: 'output', timestamp, data: parsed };\n }\n } catch {\n return { type: 'output', timestamp: new Date().toISOString(), data: line };\n }\n}\n\n/** Extract token usage from opencode step_finish part. */\nfunction extractOpenCodeTokens(part: Record<string, unknown>): import('../../domain/run.js').TokenUsage | undefined {\n const tokens = part.tokens as Record<string, unknown> | undefined;\n if (!tokens || typeof tokens.input !== 'number') return undefined;\n\n const input = tokens.input;\n const output = typeof tokens.output === 'number' ? tokens.output : 0;\n const reasoning = typeof tokens.reasoning === 'number' ? tokens.reasoning : 0;\n return createTokenUsage(input, output, { reasoning });\n}\n"]}
@@ -1,5 +1,7 @@
1
+ import { createStderrTailCapture, appendStderrTail } from './chunk-CY5VX7G5.js';
1
2
  import { createTokenUsage } from './chunk-RHFRHCN5.js';
2
3
  import { classifyAdapterError } from './chunk-IESAV453.js';
4
+ import './chunk-O2MSGW3V.js';
3
5
  import { execFile } from 'child_process';
4
6
 
5
7
  var PiAdapter = class {
@@ -123,24 +125,19 @@ function createPiRpcEvents(proc, pid, processManager, stderrTail, signal) {
123
125
  if (streamErrorYielded) return;
124
126
  const spawnError = exitError;
125
127
  if (spawnError && !signal?.aborted && !gotDoneEvent) {
126
- const message = appendStderrTail(spawnError.message, stderrTail());
128
+ const message = appendStderrTail(spawnError.message, "pi", stderrTail());
127
129
  const classified = classifyAdapterError(message, exitCode ?? void 0);
128
130
  throw Object.assign(new Error(message), { errorKind: classified });
129
131
  }
130
132
  if (exitCode !== 0 && exitCode !== null && !signal?.aborted && !gotDoneEvent) {
131
133
  const baseMsg = `Pi process exited with code ${exitCode}`;
132
- const message = appendStderrTail(baseMsg, stderrTail());
134
+ const message = appendStderrTail(baseMsg, "pi", stderrTail());
133
135
  const classified = classifyAdapterError(message, exitCode);
134
136
  throw Object.assign(new Error(message), { errorKind: classified });
135
137
  }
136
138
  }
137
139
  return generate();
138
140
  }
139
- function appendStderrTail(message, tail) {
140
- return tail ? `${message}
141
- --- pi stderr (tail) ---
142
- ${tail}` : message;
143
- }
144
141
  function parsePiRpcEvent(line, state) {
145
142
  if (!line.trim()) return null;
146
143
  let parsed;
@@ -340,21 +337,6 @@ function extractPiTokensFromMessage(parsed) {
340
337
  if (input === 0 && output === 0 && reasoning === 0 && cache_read === 0 && cache_write === 0) return void 0;
341
338
  return createTokenUsage(input, output, { reasoning, cache_read, cache_write });
342
339
  }
343
- var STDERR_TAIL_BYTES = 4096;
344
- function createStderrTailCapture(stderr) {
345
- if (!stderr) return () => "";
346
- let buf = Buffer.alloc(0);
347
- stderr.on("data", (chunk) => {
348
- const next = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf-8");
349
- buf = buf.length === 0 ? next : Buffer.concat([buf, next], buf.length + next.length);
350
- if (buf.length > STDERR_TAIL_BYTES) {
351
- buf = Buffer.from(buf.subarray(buf.length - STDERR_TAIL_BYTES));
352
- }
353
- });
354
- stderr.on("error", () => {
355
- });
356
- return () => buf.toString("utf-8").trimEnd();
357
- }
358
340
  async function* readPiRpcLines(stream) {
359
341
  const chunks = [];
360
342
  let totalLen = 0;
@@ -389,5 +371,5 @@ async function* readPiRpcLines(stream) {
389
371
  }
390
372
 
391
373
  export { PiAdapter };
392
- //# sourceMappingURL=pi-GFJCLRZJ.js.map
393
- //# sourceMappingURL=pi-GFJCLRZJ.js.map
374
+ //# sourceMappingURL=pi-AZBWGTUL.js.map
375
+ //# sourceMappingURL=pi-AZBWGTUL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/adapters/pi.ts"],"names":[],"mappings":"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","file":"pi-AZBWGTUL.js","sourcesContent":["/**\n * Pi coding agent adapter.\n *\n * Spawns `pi --mode rpc` in headless RPC mode.\n * Sends the ORCH prompt as a JSONL `prompt` command over stdin and maps Pi\n * RPC events from stdout into ORCH AgentEvents. Pi extensions/skills/context\n * remain enabled by default; UI-only extension events are ignored.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport type { Readable } from 'node:stream';\nimport { createTokenUsage, type TokenUsage } from '../../domain/run.js';\nimport { classifyAdapterError } from '../../domain/errors.js';\nimport { appendStderrTail, createStderrTailCapture } from './utils.js';\nimport { execFile } from 'node:child_process';\n\nexport class PiAdapter implements IAgentAdapter {\n readonly kind = 'pi';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const stdout = await new Promise<string>((resolve, reject) => {\n execFile('pi', ['--version'], (err, out) => {\n if (err) reject(err);\n else resolve(out);\n });\n });\n return { ok: true, version: stdout.trim() };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n ok: false,\n error: 'Pi CLI not found. Install: npm i -g @mariozechner/pi-coding-agent',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n '--mode', 'rpc',\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n if (params.config.effort) {\n args.push('--thinking', params.config.effort);\n }\n\n // Preserve Pi's own coding-agent harness prompt. ORCH's system prompt is\n // appended as additional project/task governance rather than replacing it.\n const effectiveSystemPrompt = params.systemPrompt ?? params.config.system_prompt;\n if (effectiveSystemPrompt) {\n args.push('--append-system-prompt', effectiveSystemPrompt);\n }\n\n const { process: proc, pid } = this.processManager.spawn('pi', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Capture stderr tail so auth/extension-load errors surface in non-zero exits\n // rather than being silently drained. Drains backpressure at the same time.\n const stderrTail = createStderrTailCapture(proc.stderr);\n\n if (proc.stdin) {\n proc.stdin.write(JSON.stringify({\n id: `orch-${Date.now()}`,\n type: 'prompt',\n message: params.prompt,\n }) + '\\n');\n // DO NOT call proc.stdin.end() here. Pi --mode rpc is a long-lived\n // persistent session: it sends a prompt preflight response, then drives\n // the LLM call asynchronously, streaming message_update / turn_end /\n // agent_end as the model responds. Closing stdin after the write breaks\n // that pipeline — verified on pi-coding-agent 0.73.1: pi stalls right\n // after the user-message_end event and never produces an assistant turn.\n // We terminate the long-lived process via processManager.killWithGrace\n // immediately after the terminal `done` event (see createPiRpcEvents).\n }\n\n const events = createPiRpcEvents(proc, pid, this.processManager, stderrTail, params.signal);\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction createPiRpcEvents(\n proc: import('node:child_process').ChildProcess,\n pid: number,\n processManager: IProcessManager,\n stderrTail: () => string,\n signal?: AbortSignal,\n): AsyncGenerator<AgentEvent> {\n async function* generate(): AsyncGenerator<AgentEvent> {\n let gotDoneEvent = false;\n let streamErrorYielded = false;\n let finalText = '';\n let lastTokens: TokenUsage | undefined;\n let exitCode: number | null = null;\n let exitError: Error | null = null;\n\n const exitPromise = new Promise<void>((resolve) => {\n proc.on('close', (code) => { exitCode = code; resolve(); });\n proc.on('error', (err) => { exitError = err; resolve(); });\n });\n\n let streamError: Error | null = null;\n try {\n if (proc.stdout) {\n try {\n for await (const line of readPiRpcLines(proc.stdout)) {\n if (signal?.aborted) break;\n const event = parsePiRpcEvent(line, { finalText, lastTokens });\n if (!event) continue;\n\n if (event.finalText !== undefined) finalText = event.finalText;\n if (event.tokens) lastTokens = event.tokens;\n\n if (event.agentEvent) {\n if (event.agentEvent.type === 'done') gotDoneEvent = true;\n yield event.agentEvent;\n if (event.agentEvent.type === 'done') {\n // Pi RPC is a long-lived process. ORCH tasks are one-shot runs, so\n // stop Pi after the terminal event instead of waiting forever.\n await processManager.killWithGrace(pid, 1_000).catch(() => {});\n return;\n }\n }\n }\n } catch (err) {\n // stdout emitted 'error' (ECONNRESET, EPIPE, etc) before a terminal event.\n // Without this catch the rejection propagates out of the async generator\n // as an unhandled error and the orchestrator only sees the run hang.\n streamError = err instanceof Error ? err : new Error(String(err));\n if (!signal?.aborted && !gotDoneEvent) {\n streamErrorYielded = true;\n yield {\n type: 'error',\n timestamp: new Date().toISOString(),\n data: { message: streamError.message },\n errorKind: classifyAdapterError(streamError.message),\n };\n }\n }\n }\n } finally {\n proc.stdout?.destroy();\n // Pi RPC is long-lived. If we leave via abort/break without a 'done' event,\n // the process is still alive — kill it so exitPromise resolves and the\n // generator doesn't pin the ChildProcess via dangling 'close' / 'error' listeners.\n if (!gotDoneEvent && (signal?.aborted || streamError)) {\n processManager.killWithGrace(pid, 1_000).catch(() => {});\n }\n }\n\n await exitPromise;\n\n // streamError was already surfaced as an error event — don't double-report.\n if (streamErrorYielded) return;\n\n const spawnError = exitError as Error | null;\n if (spawnError && !signal?.aborted && !gotDoneEvent) {\n const message = appendStderrTail(spawnError.message, 'pi', stderrTail());\n const classified = classifyAdapterError(message, exitCode ?? undefined);\n throw Object.assign(new Error(message), { errorKind: classified });\n }\n if (exitCode !== 0 && exitCode !== null && !signal?.aborted && !gotDoneEvent) {\n const baseMsg = `Pi process exited with code ${exitCode}`;\n const message = appendStderrTail(baseMsg, 'pi', stderrTail());\n const classified = classifyAdapterError(message, exitCode);\n throw Object.assign(new Error(message), { errorKind: classified });\n }\n }\n\n return generate();\n}\n\ninterface ParseState {\n finalText: string;\n lastTokens?: TokenUsage;\n}\n\ninterface ParsedPiEvent {\n agentEvent?: AgentEvent;\n finalText?: string;\n tokens?: TokenUsage;\n}\n\nfunction parsePiRpcEvent(line: string, state: ParseState): ParsedPiEvent | null {\n if (!line.trim()) return null;\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(line) as Record<string, unknown>;\n } catch {\n return { agentEvent: { type: 'output', timestamp: new Date().toISOString(), data: { text: line } } };\n }\n\n const timestamp = new Date().toISOString();\n const type = typeof parsed.type === 'string' ? parsed.type : '';\n\n switch (type) {\n case 'extension_ui_request':\n case 'agent_start':\n case 'turn_start':\n case 'message_start':\n case 'message_end':\n case 'turn_end':\n case 'queue_update':\n case 'compaction_start':\n case 'compaction_end':\n case 'auto_retry_start':\n case 'auto_retry_end':\n return extractPassiveUpdate(parsed);\n\n case 'response': {\n if (parsed.success === false) {\n const message = typeof parsed.error === 'string' ? parsed.error : JSON.stringify(parsed);\n return {\n agentEvent: { type: 'error', timestamp, data: { message, raw: parsed }, errorKind: classifyAdapterError(message) },\n };\n }\n return null;\n }\n\n case 'message_update':\n return parseMessageUpdate(parsed, timestamp, state);\n\n case 'tool_execution_start':\n return {\n agentEvent: {\n type: 'tool_call',\n timestamp,\n data: { name: parsed.toolName, input: parsed.args, raw: parsed },\n },\n };\n\n case 'tool_execution_update':\n // Intermediate progress: pi emits one of these per chunk of tool output\n // (e.g. streaming bash stdout). Other adapters don't surface this in\n // their event streams — drop it so the canonical contract holds.\n return null;\n\n case 'tool_execution_end':\n return parseToolExecutionEnd(parsed, timestamp);\n\n case 'agent_end': {\n const final = extractFinalText(parsed) ?? state.finalText;\n const tokens = extractPiTokensFromAgentEnd(parsed) ?? state.lastTokens;\n return {\n finalText: final,\n tokens,\n agentEvent: {\n type: 'done',\n timestamp,\n data: { result: final, raw: parsed },\n tokens,\n },\n };\n }\n\n case 'extension_error': {\n const message = typeof parsed.message === 'string' ? parsed.message : JSON.stringify(parsed);\n return {\n agentEvent: { type: 'error', timestamp, data: { message, raw: parsed }, errorKind: classifyAdapterError(message) },\n };\n }\n\n default:\n // Unknown pi event types are silently dropped: they would otherwise\n // pollute logs with raw RPC envelopes the renderer can't summarize.\n // Adding a known type above is the right way to surface a new event.\n return null;\n }\n}\n\nfunction parseMessageUpdate(parsed: Record<string, unknown>, timestamp: string, state: ParseState): ParsedPiEvent | null {\n const assistantMessageEvent = parsed.assistantMessageEvent as Record<string, unknown> | undefined;\n const updateType = typeof assistantMessageEvent?.type === 'string' ? assistantMessageEvent.type : '';\n\n if (updateType === 'text_delta') {\n // Aggregate deltas into state.finalText; emit nothing here. A long LLM\n // response is hundreds of deltas — flushing one event per delta floods\n // the activity feed with character-level fragments. text_end emits the\n // full message in one canonical `output` event below.\n const delta = typeof assistantMessageEvent?.delta === 'string' ? assistantMessageEvent.delta : '';\n return { finalText: state.finalText + delta };\n }\n\n if (updateType === 'text_end') {\n const content = typeof assistantMessageEvent?.content === 'string' ? assistantMessageEvent.content : state.finalText;\n // Reset the delta buffer so a follow-up assistant message in the same pi\n // session doesn't get concatenated onto this one (agent_end uses its own\n // messages[] extraction, not state.finalText, so this is safe to drop).\n if (!content) return { finalText: '' };\n return {\n finalText: '',\n agentEvent: { type: 'output', timestamp, data: { text: content } },\n };\n }\n\n if (updateType === 'error') {\n const reason = typeof assistantMessageEvent?.reason === 'string' ? assistantMessageEvent.reason : JSON.stringify(parsed);\n return {\n agentEvent: { type: 'error', timestamp, data: { message: reason, raw: parsed }, errorKind: classifyAdapterError(reason) },\n };\n }\n\n return null;\n}\n\nfunction parseToolExecutionEnd(parsed: Record<string, unknown>, timestamp: string): ParsedPiEvent {\n const toolName = typeof parsed.toolName === 'string' ? parsed.toolName : '';\n const args = parsed.args as Record<string, unknown> | undefined;\n const resultText = extractToolResultText(parsed.result);\n\n if (parsed.isError === true) {\n const message = resultText || JSON.stringify(parsed.result ?? parsed);\n return {\n agentEvent: { type: 'error', timestamp, data: { message, raw: parsed }, errorKind: classifyAdapterError(message) },\n };\n }\n\n if (toolName === 'bash') {\n const command = typeof args?.command === 'string' ? args.command : JSON.stringify(args ?? {});\n return {\n agentEvent: {\n type: 'command',\n timestamp,\n data: { command, result: resultText, raw: parsed },\n },\n };\n }\n\n if (/^(write|edit)$/i.test(toolName)) {\n const path = extractPath(args);\n if (path) {\n return {\n agentEvent: {\n type: 'file_change',\n timestamp,\n data: { paths: [path], raw: parsed },\n },\n };\n }\n }\n\n // Generic tool result (read, grep, ls, …) — surface the result text so logs\n // show what came back, not the raw RPC envelope.\n const summary = resultText || `${toolName || 'tool'} completed`;\n return { agentEvent: { type: 'output', timestamp, data: { text: summary, raw: parsed } } };\n}\n\n/** Pi tool results wrap content arrays in `{ content: [...] }`; messages don't. */\nfunction extractToolResultText(result: unknown): string {\n if (typeof result === 'string') return result;\n if (!result || typeof result !== 'object') return '';\n return extractTextFromContent((result as { content?: unknown }).content) ?? '';\n}\n\nfunction extractPassiveUpdate(parsed: Record<string, unknown>): ParsedPiEvent | null {\n const tokens = extractPiTokensFromMessage(parsed);\n return tokens ? { tokens } : null;\n}\n\nfunction extractFinalText(parsed: Record<string, unknown>): string | undefined {\n const messages = parsed.messages;\n if (!Array.isArray(messages)) return undefined;\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i] as Record<string, unknown>;\n if (message.role !== 'assistant') continue;\n const text = extractTextFromContent(message.content);\n if (text) return text;\n }\n return undefined;\n}\n\nfunction extractTextFromContent(content: unknown): string | undefined {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return undefined;\n const parts = content\n .map((part) => {\n const p = part as Record<string, unknown>;\n return typeof p.text === 'string' ? p.text : '';\n })\n .filter(Boolean);\n return parts.length ? parts.join('') : undefined;\n}\n\nfunction extractPath(args: Record<string, unknown> | undefined): string | undefined {\n if (!args) return undefined;\n if (typeof args.path === 'string') return args.path;\n if (typeof args.file_path === 'string') return args.file_path;\n return undefined;\n}\n\nfunction extractPiTokensFromAgentEnd(parsed: Record<string, unknown>): TokenUsage | undefined {\n const messages = parsed.messages;\n if (!Array.isArray(messages)) return undefined;\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i] as Record<string, unknown>;\n if (message.role !== 'assistant') continue;\n const tokens = extractPiTokensFromMessage(message);\n if (tokens) return tokens;\n }\n return undefined;\n}\n\n// Pi exposes usage under multiple key shapes across versions and across the\n// `message_*` vs `agent_end` paths — Pi-native names, snake_case shims, and\n// Anthropic-style names when Pi forwards Claude usage records unchanged.\n// First match per field wins, in this order.\nconst PI_TOKEN_ALIASES: Record<'input' | 'output' | 'reasoning' | 'cache_read' | 'cache_write', readonly string[]> = {\n input: ['input', 'input_tokens'],\n output: ['output', 'output_tokens'],\n reasoning: ['reasoning', 'reasoning_tokens'],\n cache_read: ['cacheRead', 'cache_read', 'cache_read_input_tokens'],\n cache_write: ['cacheWrite', 'cache_write', 'cache_creation_input_tokens'],\n};\n\nfunction extractPiTokensFromMessage(parsed: Record<string, unknown>): TokenUsage | undefined {\n const usage = parsed.usage as Record<string, unknown> | undefined;\n if (!usage) return undefined;\n\n const pick = (keys: readonly string[]): number => {\n for (const k of keys) {\n const v = usage[k];\n if (typeof v === 'number') return v;\n }\n return 0;\n };\n\n const input = pick(PI_TOKEN_ALIASES.input);\n const output = pick(PI_TOKEN_ALIASES.output);\n const reasoning = pick(PI_TOKEN_ALIASES.reasoning);\n const cache_read = pick(PI_TOKEN_ALIASES.cache_read);\n const cache_write = pick(PI_TOKEN_ALIASES.cache_write);\n\n if (input === 0 && output === 0 && reasoning === 0 && cache_read === 0 && cache_write === 0) return undefined;\n return createTokenUsage(input, output, { reasoning, cache_read, cache_write });\n}\n\n/**\n * Pi RPC can emit very large JSONL records (notably agent_end with the full\n * message transcript). Do not use the generic process `readLines` helper: it\n * caps lines at 16 KB, which corrupts large JSON records before the adapter\n * can parse the terminal event. Same algorithm otherwise — see readLines() in\n * src/infrastructure/process/process-manager.ts for the cap-applied variant.\n *\n * Concats once per chunk arrival and scans with an offset to avoid the\n * O(n²) \"concat([pending, buf]) per chunk\" anti-pattern.\n */\nasync function* readPiRpcLines(stream: Readable): AsyncGenerator<string> {\n const chunks: Buffer[] = [];\n let totalLen = 0;\n\n for await (const chunk of stream) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as string, 'utf-8');\n if (buf.length === 0) continue;\n chunks.push(buf);\n totalLen += buf.length;\n\n const buffer = chunks.length === 1 ? chunks[0]! : Buffer.concat(chunks, totalLen);\n chunks.length = 0;\n totalLen = 0;\n\n let offset = 0;\n let newlineIdx: number;\n while ((newlineIdx = buffer.indexOf(0x0a, offset)) !== -1) {\n if (newlineIdx > offset) {\n const line = buffer.toString('utf-8', offset, newlineIdx);\n yield line.endsWith('\\r') ? line.slice(0, -1) : line;\n }\n offset = newlineIdx + 1;\n }\n\n if (offset < buffer.length) {\n const remainder = buffer.subarray(offset);\n chunks.push(remainder);\n totalLen = remainder.length;\n }\n }\n\n if (totalLen > 0) {\n const final = chunks.length === 1 ? chunks[0]! : Buffer.concat(chunks, totalLen);\n const line = final.toString('utf-8');\n if (line) yield line.endsWith('\\r') ? line.slice(0, -1) : line;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{a as PiAdapter}from'./chunk-COJCLTPD.js';import'./chunk-JEMJFAMY.js';import'./chunk-P4JTJBWO.js';import'./chunk-LRYVT4D4.js';import'./chunk-6MJ7V6VY.js';
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{a as ShellAdapter}from'./chunk-5KNZ2OEV.js';import'./chunk-JEMJFAMY.js';import'./chunk-P4JTJBWO.js';import'./chunk-LRYVT4D4.js';import'./chunk-6MJ7V6VY.js';
@@ -1,4 +1,4 @@
1
- import { buildFullPrompt } from './chunk-RFN447MA.js';
1
+ import { buildFullPrompt } from './chunk-CY5VX7G5.js';
2
2
  import './chunk-RHFRHCN5.js';
3
3
  import { classifyAdapterError } from './chunk-IESAV453.js';
4
4
  import { readLines } from './chunk-O2MSGW3V.js';
@@ -219,5 +219,5 @@ var ShellAdapter = class {
219
219
  };
220
220
 
221
221
  export { ShellAdapter };
222
- //# sourceMappingURL=shell-C2J4AIAV.js.map
223
- //# sourceMappingURL=shell-C2J4AIAV.js.map
222
+ //# sourceMappingURL=shell-ZQZBBNLC.js.map
223
+ //# sourceMappingURL=shell-ZQZBBNLC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/infrastructure/adapters/event-buffer.ts","../src/infrastructure/adapters/shell.ts"],"names":[],"mappings":"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","file":"shell-C2J4AIAV.js","sourcesContent":["/**\n * Lock-free ring buffer for AgentEvent streaming.\n *\n * Replaces Array.shift() O(n) polling with O(1) dequeue\n * and event-driven notification instead of 50ms busy-wait.\n * Includes backpressure: when buffer is full, push() returns\n * a promise that resolves when space is available.\n */\n\nimport type { AgentEvent } from './interface.js';\n\nconst DEFAULT_CAPACITY = 1024;\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n}\n\nfunction deferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n const promise = new Promise<T>((r) => { resolve = r; });\n return { promise, resolve };\n}\n\nexport class EventBuffer {\n private buf: (AgentEvent | undefined)[];\n private head = 0; // read index\n private tail = 0; // write index\n private count = 0;\n private readonly capacity: number;\n\n // Consumer notification: resolved when new data is available\n private dataReady: Deferred<void> | null = null;\n // Producer notification: resolved when space is available\n private spaceReady: Deferred<void> | null = null;\n\n private closed = false;\n\n constructor(capacity = DEFAULT_CAPACITY) {\n this.capacity = capacity;\n this.buf = new Array(capacity);\n }\n\n /** Number of buffered events. */\n get size(): number {\n return this.count;\n }\n\n get isFull(): boolean {\n return this.count >= this.capacity;\n }\n\n /**\n * Push an event into the buffer.\n * If the buffer is full, waits until space is available (backpressure).\n */\n async push(event: AgentEvent): Promise<void> {\n while (this.isFull && !this.closed) {\n if (!this.spaceReady) {\n this.spaceReady = deferred<void>();\n }\n await this.spaceReady.promise;\n }\n if (this.closed) return;\n\n this.buf[this.tail] = event;\n this.tail = (this.tail + 1) % this.capacity;\n this.count++;\n\n // Wake up consumer if waiting\n if (this.dataReady) {\n const dr = this.dataReady;\n this.dataReady = null;\n dr.resolve();\n }\n }\n\n /**\n * Dequeue the next event. O(1).\n * Returns undefined only when buffer is empty AND closed.\n */\n async take(): Promise<AgentEvent | undefined> {\n while (this.count === 0) {\n if (this.closed) return undefined;\n if (!this.dataReady) {\n this.dataReady = deferred<void>();\n }\n await this.dataReady.promise;\n }\n\n const event = this.buf[this.head];\n this.buf[this.head] = undefined; // allow GC\n this.head = (this.head + 1) % this.capacity;\n this.count--;\n\n // Wake up producer if waiting for space\n if (this.spaceReady) {\n const sr = this.spaceReady;\n this.spaceReady = null;\n sr.resolve();\n }\n\n return event;\n }\n\n /**\n * Signal that no more events will be pushed.\n * Wakes up any waiting consumer/producer.\n */\n close(): void {\n this.closed = true;\n if (this.dataReady) {\n const dr = this.dataReady;\n this.dataReady = null;\n dr.resolve();\n }\n if (this.spaceReady) {\n const sr = this.spaceReady;\n this.spaceReady = null;\n sr.resolve();\n }\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n /**\n * Async iterator that drains the buffer until closed and empty.\n */\n async *[Symbol.asyncIterator](): AsyncGenerator<AgentEvent> {\n while (true) {\n const event = await this.take();\n if (event === undefined) return;\n yield event;\n }\n }\n}\n","/**\n * Shell adapter.\n *\n * Spawns an arbitrary command via `bash -lc`.\n * Task prompt is passed via ORCHESTRY_TASK_PROMPT env variable.\n * Consumes stdout and stderr concurrently to avoid deadlocks.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { buildFullPrompt } from './utils.js';\nimport { readLines } from '../process/process-manager.js';\nimport { EventBuffer } from './event-buffer.js';\nimport { classifyAdapterError, AdapterErrorKind } from '../../domain/errors.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class ShellAdapter implements IAgentAdapter {\n readonly kind = 'shell';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('bash', ['--version']);\n const version = stdout.split('\\n')[0]?.trim() ?? 'unknown';\n return { ok: true, version };\n } catch {\n return { ok: false, error: 'bash not found', errorKind: classifyAdapterError('bash not found') };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const command = params.config.command;\n if (!command) {\n // Return a handle that immediately yields an error\n async function* errorGen(): AsyncGenerator<AgentEvent> {\n yield {\n type: 'error',\n timestamp: new Date().toISOString(),\n data: 'Shell adapter requires a command in agent config',\n errorKind: AdapterErrorKind.SPAWN_FAILED,\n };\n }\n return { pid: 0, events: errorGen() };\n }\n\n const { process: proc, pid } = this.processManager.spawn('bash', ['-lc', command], {\n cwd: params.workspace,\n env: {\n ...process.env,\n ...params.env,\n ORCHESTRY_TASK_PROMPT: buildFullPrompt(params.systemPrompt, params.prompt),\n },\n signal: params.signal,\n });\n\n const signal = params.signal;\n const processManager = this.processManager;\n\n async function* generateEvents(): AsyncGenerator<AgentEvent> {\n // Ring buffer with backpressure replaces Array.shift() polling\n const buffer = new EventBuffer();\n\n // Ensure process is reaped on abort — SIGTERM + grace period + SIGKILL\n const onAbort = () => {\n processManager.killWithGrace(pid, 5_000).catch(() => {});\n };\n if (signal) {\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n const stdoutPromise = (async () => {\n if (!proc.stdout) return;\n for await (const line of readLines(proc.stdout)) {\n if (signal?.aborted) break;\n await buffer.push({\n type: 'output',\n timestamp: new Date().toISOString(),\n data: line,\n });\n }\n })();\n\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n for await (const line of readLines(proc.stderr)) {\n if (signal?.aborted) break;\n await buffer.push({\n type: 'error',\n timestamp: new Date().toISOString(),\n data: line,\n errorKind: classifyAdapterError(line),\n });\n }\n })();\n\n // Close the buffer once both streams are drained (or on error)\n void Promise.all([stdoutPromise, stderrPromise]).then(\n () => buffer.close(),\n () => buffer.close(),\n );\n\n // Yield events as they arrive — no polling, no busy-wait\n yield* buffer;\n\n // Clean up abort listener\n if (signal && !signal.aborted) {\n signal.removeEventListener('abort', onAbort);\n }\n\n // Wait for process to exit\n await new Promise<void>((resolve, reject) => {\n // If process already exited, resolve immediately\n if (proc.exitCode !== null || proc.killed) {\n resolve();\n return;\n }\n proc.on('close', (code) => {\n if (code === 0 || signal?.aborted) {\n resolve();\n } else {\n reject(new Error(`Shell command exited with code ${code}`));\n }\n });\n proc.on('error', reject);\n });\n }\n\n return { pid, events: generateEvents() };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/infrastructure/adapters/event-buffer.ts","../src/infrastructure/adapters/shell.ts"],"names":[],"mappings":"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","file":"shell-ZQZBBNLC.js","sourcesContent":["/**\n * Lock-free ring buffer for AgentEvent streaming.\n *\n * Replaces Array.shift() O(n) polling with O(1) dequeue\n * and event-driven notification instead of 50ms busy-wait.\n * Includes backpressure: when buffer is full, push() returns\n * a promise that resolves when space is available.\n */\n\nimport type { AgentEvent } from './interface.js';\n\nconst DEFAULT_CAPACITY = 1024;\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n}\n\nfunction deferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n const promise = new Promise<T>((r) => { resolve = r; });\n return { promise, resolve };\n}\n\nexport class EventBuffer {\n private buf: (AgentEvent | undefined)[];\n private head = 0; // read index\n private tail = 0; // write index\n private count = 0;\n private readonly capacity: number;\n\n // Consumer notification: resolved when new data is available\n private dataReady: Deferred<void> | null = null;\n // Producer notification: resolved when space is available\n private spaceReady: Deferred<void> | null = null;\n\n private closed = false;\n\n constructor(capacity = DEFAULT_CAPACITY) {\n this.capacity = capacity;\n this.buf = new Array(capacity);\n }\n\n /** Number of buffered events. */\n get size(): number {\n return this.count;\n }\n\n get isFull(): boolean {\n return this.count >= this.capacity;\n }\n\n /**\n * Push an event into the buffer.\n * If the buffer is full, waits until space is available (backpressure).\n */\n async push(event: AgentEvent): Promise<void> {\n while (this.isFull && !this.closed) {\n if (!this.spaceReady) {\n this.spaceReady = deferred<void>();\n }\n await this.spaceReady.promise;\n }\n if (this.closed) return;\n\n this.buf[this.tail] = event;\n this.tail = (this.tail + 1) % this.capacity;\n this.count++;\n\n // Wake up consumer if waiting\n if (this.dataReady) {\n const dr = this.dataReady;\n this.dataReady = null;\n dr.resolve();\n }\n }\n\n /**\n * Dequeue the next event. O(1).\n * Returns undefined only when buffer is empty AND closed.\n */\n async take(): Promise<AgentEvent | undefined> {\n while (this.count === 0) {\n if (this.closed) return undefined;\n if (!this.dataReady) {\n this.dataReady = deferred<void>();\n }\n await this.dataReady.promise;\n }\n\n const event = this.buf[this.head];\n this.buf[this.head] = undefined; // allow GC\n this.head = (this.head + 1) % this.capacity;\n this.count--;\n\n // Wake up producer if waiting for space\n if (this.spaceReady) {\n const sr = this.spaceReady;\n this.spaceReady = null;\n sr.resolve();\n }\n\n return event;\n }\n\n /**\n * Signal that no more events will be pushed.\n * Wakes up any waiting consumer/producer.\n */\n close(): void {\n this.closed = true;\n if (this.dataReady) {\n const dr = this.dataReady;\n this.dataReady = null;\n dr.resolve();\n }\n if (this.spaceReady) {\n const sr = this.spaceReady;\n this.spaceReady = null;\n sr.resolve();\n }\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n /**\n * Async iterator that drains the buffer until closed and empty.\n */\n async *[Symbol.asyncIterator](): AsyncGenerator<AgentEvent> {\n while (true) {\n const event = await this.take();\n if (event === undefined) return;\n yield event;\n }\n }\n}\n","/**\n * Shell adapter.\n *\n * Spawns an arbitrary command via `bash -lc`.\n * Task prompt is passed via ORCHESTRY_TASK_PROMPT env variable.\n * Consumes stdout and stderr concurrently to avoid deadlocks.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { buildFullPrompt } from './utils.js';\nimport { readLines } from '../process/process-manager.js';\nimport { EventBuffer } from './event-buffer.js';\nimport { classifyAdapterError, AdapterErrorKind } from '../../domain/errors.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class ShellAdapter implements IAgentAdapter {\n readonly kind = 'shell';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('bash', ['--version']);\n const version = stdout.split('\\n')[0]?.trim() ?? 'unknown';\n return { ok: true, version };\n } catch {\n return { ok: false, error: 'bash not found', errorKind: classifyAdapterError('bash not found') };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const command = params.config.command;\n if (!command) {\n // Return a handle that immediately yields an error\n async function* errorGen(): AsyncGenerator<AgentEvent> {\n yield {\n type: 'error',\n timestamp: new Date().toISOString(),\n data: 'Shell adapter requires a command in agent config',\n errorKind: AdapterErrorKind.SPAWN_FAILED,\n };\n }\n return { pid: 0, events: errorGen() };\n }\n\n const { process: proc, pid } = this.processManager.spawn('bash', ['-lc', command], {\n cwd: params.workspace,\n env: {\n ...process.env,\n ...params.env,\n ORCHESTRY_TASK_PROMPT: buildFullPrompt(params.systemPrompt, params.prompt),\n },\n signal: params.signal,\n });\n\n const signal = params.signal;\n const processManager = this.processManager;\n\n async function* generateEvents(): AsyncGenerator<AgentEvent> {\n // Ring buffer with backpressure replaces Array.shift() polling\n const buffer = new EventBuffer();\n\n // Ensure process is reaped on abort — SIGTERM + grace period + SIGKILL\n const onAbort = () => {\n processManager.killWithGrace(pid, 5_000).catch(() => {});\n };\n if (signal) {\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n const stdoutPromise = (async () => {\n if (!proc.stdout) return;\n for await (const line of readLines(proc.stdout)) {\n if (signal?.aborted) break;\n await buffer.push({\n type: 'output',\n timestamp: new Date().toISOString(),\n data: line,\n });\n }\n })();\n\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n for await (const line of readLines(proc.stderr)) {\n if (signal?.aborted) break;\n await buffer.push({\n type: 'error',\n timestamp: new Date().toISOString(),\n data: line,\n errorKind: classifyAdapterError(line),\n });\n }\n })();\n\n // Close the buffer once both streams are drained (or on error)\n void Promise.all([stdoutPromise, stderrPromise]).then(\n () => buffer.close(),\n () => buffer.close(),\n );\n\n // Yield events as they arrive — no polling, no busy-wait\n yield* buffer;\n\n // Clean up abort listener\n if (signal && !signal.aborted) {\n signal.removeEventListener('abort', onAbort);\n }\n\n // Wait for process to exit\n await new Promise<void>((resolve, reject) => {\n // If process already exited, resolve immediately\n if (proc.exitCode !== null || proc.killed) {\n resolve();\n return;\n }\n proc.on('close', (code) => {\n if (code === 0 || signal?.aborted) {\n resolve();\n } else {\n reject(new Error(`Shell command exited with code ${code}`));\n }\n });\n proc.on('error', reject);\n });\n }\n\n return { pid, events: generateEvents() };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n"]}
@@ -17,4 +17,4 @@ import {j,q,g,d,e,o,l,n,m}from'./chunk-64WUDYEM.js';function x(_,a){let c=_.comm
17
17
  Review Results
18
18
  ${"\u2500".repeat(42)}`);for(let o of t.review_results){let n=o.passed?"\u2713":"\u2717";if(console.log(` ${n} ${o.criterion}: ${o.passed?"passed":"failed"}`),o.output)for(let l of o.output.split(`
19
19
  `))console.log(` ${l}`);}}console.log();}),c.command("edit <id>").description("Open task in $EDITOR to modify title, priority and description").action(async e=>{let t=await a.taskService.get(e),{openInEditor:s,toEditorContent:o,fromEditorContent:n}=await import('./editor-7IFRWVTL.js'),l=t.attachments?.length?`
20
- # Attachments: ${t.attachments.join(", ")}`:"",d=o({title:t.title,priority:t.priority,description:t.description})+l,i=await s(d),r=n(i),g={};if(r.title&&r.title!==t.title&&(g.title=r.title),r.priority&&r.priority!==t.priority&&(g.priority=r.priority),r.description!==void 0&&r.description!==t.description&&(g.description=r.description??""),Object.keys(g).length===0){console.log(" No changes.");return}let w=await a.taskService.update(e,g);j(`Updated ${w.id} "${w.title}"`);}),c.command("assign <task-id> <agent-id>").description("Assign task to agent").action(async(e,t)=>{let s=await a.taskService.assign(e,t);j(`Assigned ${s.id} \u2192 ${s.assignee??t}`);}),c.command("cancel <id>").description("Cancel a task").action(async e=>{if((await a.taskService.get(e)).status==="in_progress"){let{buildFullContainer:s}=await import('./container-WJJQSUHB.js');await(await s(a.context)).orchestrator.cancelTask(e);}else await a.taskService.cancel(e);j(`Cancelled ${e}`);}),c.command("approve <id>").description("Approve a task in review").action(async e=>{await a.taskService.updateStatus(e,"done"),j(`Approved ${e}`);}),c.command("reject <id>").description("Reject a task and send it back for rework").option("-r, --reason <reason>","Feedback for the agent explaining what to fix").action(async(e,t)=>{await a.taskService.reject(e,t.reason),j(`Rejected ${e} \u2192 todo${t.reason?` (reason: ${t.reason})`:""}`);}),c.command("retry <id>").description("Retry a failed task").action(async e=>{await a.taskService.retry(e),j(`Reset ${e} to todo`);});}export{x as registerTaskCommand};
20
+ # Attachments: ${t.attachments.join(", ")}`:"",d=o({title:t.title,priority:t.priority,description:t.description})+l,i=await s(d),r=n(i),g={};if(r.title&&r.title!==t.title&&(g.title=r.title),r.priority&&r.priority!==t.priority&&(g.priority=r.priority),r.description!==void 0&&r.description!==t.description&&(g.description=r.description??""),Object.keys(g).length===0){console.log(" No changes.");return}let w=await a.taskService.update(e,g);j(`Updated ${w.id} "${w.title}"`);}),c.command("assign <task-id> <agent-id>").description("Assign task to agent").action(async(e,t)=>{let s=await a.taskService.assign(e,t);j(`Assigned ${s.id} \u2192 ${s.assignee??t}`);}),c.command("cancel <id>").description("Cancel a task").action(async e=>{if((await a.taskService.get(e)).status==="in_progress"){let{buildFullContainer:s}=await import('./container-CH5HKCZU.js');await(await s(a.context)).orchestrator.cancelTask(e);}else await a.taskService.cancel(e);j(`Cancelled ${e}`);}),c.command("approve <id>").description("Approve a task in review").action(async e=>{await a.taskService.updateStatus(e,"done"),j(`Approved ${e}`);}),c.command("reject <id>").description("Reject a task and send it back for rework").option("-r, --reason <reason>","Feedback for the agent explaining what to fix").action(async(e,t)=>{await a.taskService.reject(e,t.reason),j(`Rejected ${e} \u2192 todo${t.reason?` (reason: ${t.reason})`:""}`);}),c.command("retry <id>").description("Retry a failed task").action(async e=>{await a.taskService.retry(e),j(`Reset ${e} to todo`);});}export{x as registerTaskCommand};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import {b}from'./chunk-HYQXUJYV.js';import {c}from'./chunk-DZK72HOZ.js';function pt(d,e){d.command("tui").description("Launch interactive TUI dashboard").action(async()=>{let h=await e.taskService.list(),k=await e.agentService.list(),T=await e.stateStore.read(),{render:A}=await import('ink'),{createElement:b$1}=await import('react'),{App:R}=await import('./App-B4VWJWWG.js'),C=async t=>{await e.orchestrator.runTask(t);},E=async(t,s)=>e.taskService.create({title:t,priority:s?.priority,description:s?.description,attachments:s?.attachments}),_=async t=>{await e.orchestrator.cancelTask(t);},j=async t=>{await e.taskService.retry(t);},D=async(t,s)=>{await e.taskService.assign(t,s);},P=async()=>{await e.orchestrator.runAll();},U=async t=>{await e.agentService.disable(t);},G=async t=>{await e.agentService.enable(t);},m=t=>e.eventBus.onAny(t),L=async()=>e.taskService.list(),x=async()=>e.agentService.list(),I=async()=>e.stateStore.read(),O=async(t,s,a)=>e.agentService.create({name:t,adapter:s??e.config.defaults.agent.adapter,model:a?.model||void 0,effort:a?.effort||void 0,role:a?.role||void 0,approval_policy:a?.approval_policy||void 0,skills:a?.skills||void 0}),F=async t=>{await e.agentService.remove(t);},H=async t=>{await e.taskService.delete(t);},W=async t=>{await e.taskService.updateStatus(t,"done");},M=async(t,s)=>{await e.taskService.reject(t,s);},N=async(t,s)=>e.taskService.update(t,s),B=async(t,s)=>e.agentService.update(t,{...s,effort:s.effort,approval_policy:s.approval_policy}),V=async t=>{await e.orchestrator.forceStopAgent(t);},J=async(t,s)=>e.agentService.setAutonomous(t,s),K=async t=>{let s=await e.runService.listAll();s.sort((n,i)=>new Date(i.started_at).getTime()-new Date(n.started_at).getTime());let a=s.filter(n=>n.status==="succeeded"||n.status==="failed"),u=3,gt=10,y=a.slice(0,u),v=a.slice(u,gt),f=async n=>(await e.runService.readEventsTail(n.id,30)).map(r=>({timestamp:r.timestamp,agentId:n.agent_id,taskId:n.task_id,type:r.type,data:r.data}));if(y.length>0){let n=(await Promise.all(y.map(f))).flat();n.sort((i,r)=>new Date(i.timestamp).getTime()-new Date(r.timestamp).getTime()),t(n.slice(-200));}if(v.length>0){let n=(await Promise.all(v.map(f))).flat();n.sort((i,r)=>new Date(i.timestamp).getTime()-new Date(r.timestamp).getTime()),t(n.slice(-200));}},q=async t=>e.teamService.create(t),z=async()=>e.teamService.list(),Q=async(t,s)=>e.teamService.join(t,s),X=async(t,s)=>e.teamService.leave(t,s),Y=async t=>{await e.teamService.disband(t);},Z=async(t,s)=>e.teamService.setLead(t,s),$=async()=>e.goalService.list(),tt=async t=>e.goalService.create(t),et=async(t,s)=>e.goalService.update(t,s),st=async(t,s,a)=>e.goalService.updateStatus(t,s,a),at=async t=>{await e.goalService.delete(t);},nt=async t=>e.goalService.getProgressReport(t),rt=async()=>b(c),it=async()=>{await e.orchestrator.startWatch();},ot=async()=>{await e.orchestrator.stop();},c$1=d.version()??"0.0.0",ct=import('./update-check-R5ABF6HE.js').then(t=>t.checkForUpdateSWR(c$1)).catch(()=>null),l=false,p,g=false,o;try{await e.orchestrator.startWatch(),l=!0;}catch(t){p=t instanceof Error?t.message:String(t);let{DiskObserver:s}=await import('./disk-observer-B3NOZ2QA.js');o=new s({paths:e.paths,stateStore:e.stateStore}),g=true,m=a=>o.subscribe(a);}let{waitUntilExit:lt}=A(b$1(R,{projectName:e.config.project.name,tasks:h,agents:k,state:T,onRunTask:C,onCreateTask:E,onCancelTask:_,onRetryTask:j,onAssignTask:D,onRunAll:P,onDisableAgent:U,onEnableAgent:G,onSubscribeEvents:m,onRefreshTasks:L,onRefreshAgents:x,onRefreshState:I,onLoadHistory:K,onAddAgent:O,onDeleteAgent:F,onApproveTask:W,onRejectTask:M,onDeleteTask:H,onUpdateTask:N,onUpdateAgent:B,onForceStopAgent:V,onToggleAutonomous:J,onRefreshGoals:$,onCreateGoal:tt,onUpdateGoal:et,onUpdateGoalStatus:st,onDeleteGoal:at,onGetGoalProgress:nt,onCreateTeam:q,onListTeams:z,onJoinTeam:Q,onLeaveTeam:X,onDisbandTeam:Y,onSetTeamLead:Z,onStartWatch:it,onStopWatch:ot,initialWatchActive:l,observerMode:g,watchError:g?void 0:p,version:c$1,latestVersion:void 0,onCheckUpdate:async()=>{let t=await ct;if(t?.updateAvailable)return t.latest;let a=await(await import('./update-check-R5ABF6HE.js')).checkForUpdateNow(c$1);return a?.updateAvailable?a.latest:void 0},onBackgroundInstall:async t=>(await import('./update-check-R5ABF6HE.js')).backgroundInstall(t),onLoadModelCatalog:rt,initialActivityFilter:e.globalConfig.tui.activity_filter,onSaveActivityFilter:async t=>{await e.globalConfigStore.set("activity_filter",t);},initialNotifications:e.globalConfig.tui.notifications,onSaveNotifications:async t=>{await e.globalConfigStore.set("notifications",t);},initialMaxConcurrent:e.config.scheduling.max_concurrent_agents,onSaveMaxConcurrent:async t=>{await e.configStore.set("scheduling.max_concurrent_agents",t),e.config.scheduling.max_concurrent_agents=t;},onCompleteOnboarding:async()=>{let t=await e.stateStore.read();t.onboardingCompleted=true,await e.stateStore.write(t);},defaultAdapter:e.config.defaults.agent.adapter}),{incrementalRendering:true,kittyKeyboard:{mode:"auto",flags:["disambiguateEscapeCodes"]}});await lt(),l&&await e.orchestrator.stop().catch(()=>{}),o&&o.stop(),e.eventBus.clear();});}export{pt as registerTuiCommand};
2
+ import {b}from'./chunk-HYQXUJYV.js';import {c}from'./chunk-DZK72HOZ.js';function pt(d,e){d.command("tui").description("Launch interactive TUI dashboard").action(async()=>{let h=await e.taskService.list(),k=await e.agentService.list(),T=await e.stateStore.read(),{render:A}=await import('ink'),{createElement:b$1}=await import('react'),{App:R}=await import('./App-YVHDT4VD.js'),C=async t=>{await e.orchestrator.runTask(t);},E=async(t,s)=>e.taskService.create({title:t,priority:s?.priority,description:s?.description,attachments:s?.attachments}),_=async t=>{await e.orchestrator.cancelTask(t);},j=async t=>{await e.taskService.retry(t);},D=async(t,s)=>{await e.taskService.assign(t,s);},P=async()=>{await e.orchestrator.runAll();},U=async t=>{await e.agentService.disable(t);},G=async t=>{await e.agentService.enable(t);},m=t=>e.eventBus.onAny(t),L=async()=>e.taskService.list(),x=async()=>e.agentService.list(),I=async()=>e.stateStore.read(),O=async(t,s,a)=>e.agentService.create({name:t,adapter:s??e.config.defaults.agent.adapter,model:a?.model||void 0,effort:a?.effort||void 0,role:a?.role||void 0,approval_policy:a?.approval_policy||void 0,skills:a?.skills||void 0}),F=async t=>{await e.agentService.remove(t);},H=async t=>{await e.taskService.delete(t);},W=async t=>{await e.taskService.updateStatus(t,"done");},M=async(t,s)=>{await e.taskService.reject(t,s);},N=async(t,s)=>e.taskService.update(t,s),B=async(t,s)=>e.agentService.update(t,{...s,effort:s.effort,approval_policy:s.approval_policy}),V=async t=>{await e.orchestrator.forceStopAgent(t);},J=async(t,s)=>e.agentService.setAutonomous(t,s),K=async t=>{let s=await e.runService.listAll();s.sort((n,i)=>new Date(i.started_at).getTime()-new Date(n.started_at).getTime());let a=s.filter(n=>n.status==="succeeded"||n.status==="failed"),u=3,gt=10,y=a.slice(0,u),v=a.slice(u,gt),f=async n=>(await e.runService.readEventsTail(n.id,30)).map(r=>({timestamp:r.timestamp,agentId:n.agent_id,taskId:n.task_id,type:r.type,data:r.data}));if(y.length>0){let n=(await Promise.all(y.map(f))).flat();n.sort((i,r)=>new Date(i.timestamp).getTime()-new Date(r.timestamp).getTime()),t(n.slice(-200));}if(v.length>0){let n=(await Promise.all(v.map(f))).flat();n.sort((i,r)=>new Date(i.timestamp).getTime()-new Date(r.timestamp).getTime()),t(n.slice(-200));}},q=async t=>e.teamService.create(t),z=async()=>e.teamService.list(),Q=async(t,s)=>e.teamService.join(t,s),X=async(t,s)=>e.teamService.leave(t,s),Y=async t=>{await e.teamService.disband(t);},Z=async(t,s)=>e.teamService.setLead(t,s),$=async()=>e.goalService.list(),tt=async t=>e.goalService.create(t),et=async(t,s)=>e.goalService.update(t,s),st=async(t,s,a)=>e.goalService.updateStatus(t,s,a),at=async t=>{await e.goalService.delete(t);},nt=async t=>e.goalService.getProgressReport(t),rt=async()=>b(c),it=async()=>{await e.orchestrator.startWatch();},ot=async()=>{await e.orchestrator.stop();},c$1=d.version()??"0.0.0",ct=import('./update-check-R5ABF6HE.js').then(t=>t.checkForUpdateSWR(c$1)).catch(()=>null),l=false,p,g=false,o;try{await e.orchestrator.startWatch(),l=!0;}catch(t){p=t instanceof Error?t.message:String(t);let{DiskObserver:s}=await import('./disk-observer-B3NOZ2QA.js');o=new s({paths:e.paths,stateStore:e.stateStore}),g=true,m=a=>o.subscribe(a);}let{waitUntilExit:lt}=A(b$1(R,{projectName:e.config.project.name,tasks:h,agents:k,state:T,onRunTask:C,onCreateTask:E,onCancelTask:_,onRetryTask:j,onAssignTask:D,onRunAll:P,onDisableAgent:U,onEnableAgent:G,onSubscribeEvents:m,onRefreshTasks:L,onRefreshAgents:x,onRefreshState:I,onLoadHistory:K,onAddAgent:O,onDeleteAgent:F,onApproveTask:W,onRejectTask:M,onDeleteTask:H,onUpdateTask:N,onUpdateAgent:B,onForceStopAgent:V,onToggleAutonomous:J,onRefreshGoals:$,onCreateGoal:tt,onUpdateGoal:et,onUpdateGoalStatus:st,onDeleteGoal:at,onGetGoalProgress:nt,onCreateTeam:q,onListTeams:z,onJoinTeam:Q,onLeaveTeam:X,onDisbandTeam:Y,onSetTeamLead:Z,onStartWatch:it,onStopWatch:ot,initialWatchActive:l,observerMode:g,watchError:g?void 0:p,version:c$1,latestVersion:void 0,onCheckUpdate:async()=>{let t=await ct;if(t?.updateAvailable)return t.latest;let a=await(await import('./update-check-R5ABF6HE.js')).checkForUpdateNow(c$1);return a?.updateAvailable?a.latest:void 0},onBackgroundInstall:async t=>(await import('./update-check-R5ABF6HE.js')).backgroundInstall(t),onLoadModelCatalog:rt,initialActivityFilter:e.globalConfig.tui.activity_filter,onSaveActivityFilter:async t=>{await e.globalConfigStore.set("activity_filter",t);},initialNotifications:e.globalConfig.tui.notifications,onSaveNotifications:async t=>{await e.globalConfigStore.set("notifications",t);},initialMaxConcurrent:e.config.scheduling.max_concurrent_agents,onSaveMaxConcurrent:async t=>{await e.configStore.set("scheduling.max_concurrent_agents",t),e.config.scheduling.max_concurrent_agents=t;},onCompleteOnboarding:async()=>{let t=await e.stateStore.read();t.onboardingCompleted=true,await e.stateStore.write(t);},defaultAdapter:e.config.defaults.agent.adapter}),{incrementalRendering:true,kittyKeyboard:{mode:"auto",flags:["disambiguateEscapeCodes"]}});await lt(),l&&await e.orchestrator.stop().catch(()=>{}),o&&o.stop(),e.eventBus.clear();});}export{pt as registerTuiCommand};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxgeneral/orch",
3
- "version": "1.0.26",
3
+ "version": "1.0.28",
4
4
  "description": "AI agent runtime — orchestrate Claude, Cursor, Codex & OpenCode as one team. Multi-agent task automation with state machine, auto-retry, inter-agent messaging, goals and teams. Zero-config CLI + programmatic API.",
5
5
  "type": "module",
6
6
  "engines": {