@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,102 @@
1
+ import { createTokenUsage } from './chunk-RHFRHCN5.js';
2
+ import { classifyAdapterError } from './chunk-IESAV453.js';
3
+ import { readLines } from './chunk-O2MSGW3V.js';
4
+
5
+ // src/infrastructure/adapters/utils.ts
6
+ var STDERR_TAIL_BYTES = 4096;
7
+ function readUsageNumber(usage, primaryKey, fallbackKey) {
8
+ const primary = usage[primaryKey];
9
+ if (typeof primary === "number") return primary;
10
+ const fallback = usage[fallbackKey];
11
+ return typeof fallback === "number" ? fallback : void 0;
12
+ }
13
+ function buildFullPrompt(systemPrompt, userPrompt) {
14
+ return systemPrompt ? systemPrompt + "\n\n" + userPrompt : userPrompt;
15
+ }
16
+ function extractTokens(parsed, opts) {
17
+ let usage = parsed.usage;
18
+ if (!usage && opts?.statsFallback) {
19
+ const stats = parsed.stats;
20
+ usage = stats?.usage;
21
+ }
22
+ if (!usage) return void 0;
23
+ const input = readUsageNumber(usage, "input_tokens", "inputTokens");
24
+ if (input === void 0) return void 0;
25
+ const output = readUsageNumber(usage, "output_tokens", "outputTokens") ?? 0;
26
+ const reasoning = readUsageNumber(usage, "reasoning_tokens", "reasoningTokens") ?? 0;
27
+ const cache_read = readUsageNumber(usage, "cache_read_input_tokens", "cacheReadTokens") ?? 0;
28
+ const cache_write = readUsageNumber(usage, "cache_creation_input_tokens", "cacheWriteTokens") ?? 0;
29
+ return createTokenUsage(input, output, { reasoning, cache_read, cache_write });
30
+ }
31
+ function createStderrTailCapture(stderr) {
32
+ if (!stderr) return () => "";
33
+ let buf = Buffer.alloc(0);
34
+ stderr.on("data", (chunk) => {
35
+ const next = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf-8");
36
+ buf = buf.length === 0 ? next : Buffer.concat([buf, next], buf.length + next.length);
37
+ if (buf.length > STDERR_TAIL_BYTES) {
38
+ buf = Buffer.from(buf.subarray(buf.length - STDERR_TAIL_BYTES));
39
+ }
40
+ });
41
+ stderr.on("error", () => {
42
+ });
43
+ return () => buf.toString("utf-8").trimEnd();
44
+ }
45
+ function appendStderrTail(message, adapterName, tail) {
46
+ return tail ? `${message}
47
+ --- ${adapterName} stderr (tail) ---
48
+ ${tail}` : message;
49
+ }
50
+ function createStreamingEvents(proc, parseEvent, adapterName, signal) {
51
+ let exitCode = null;
52
+ let exitError = null;
53
+ const stderrTail = createStderrTailCapture(proc.stderr);
54
+ const exitPromise = new Promise((resolve) => {
55
+ proc.once("close", (code) => {
56
+ exitCode = code;
57
+ resolve();
58
+ });
59
+ proc.once("error", (err) => {
60
+ exitError = err;
61
+ resolve();
62
+ });
63
+ });
64
+ async function* generate() {
65
+ let gotDoneEvent = false;
66
+ if (proc.stdout) {
67
+ try {
68
+ for await (const line of readLines(proc.stdout)) {
69
+ if (signal?.aborted) break;
70
+ const event = parseEvent(line);
71
+ if (event) {
72
+ if (event.type === "done") gotDoneEvent = true;
73
+ yield event;
74
+ }
75
+ }
76
+ } finally {
77
+ proc.stdout.destroy();
78
+ }
79
+ }
80
+ await exitPromise;
81
+ if (exitError && !signal?.aborted && !gotDoneEvent) {
82
+ const spawnErr = exitError;
83
+ const message = appendStderrTail(spawnErr.message, adapterName, stderrTail());
84
+ const classified = classifyAdapterError(message, exitCode ?? void 0);
85
+ throw Object.assign(new Error(message), { errorKind: classified });
86
+ }
87
+ if (exitCode !== 0 && exitCode !== null && !signal?.aborted && !gotDoneEvent) {
88
+ const msg = appendStderrTail(
89
+ `${adapterName} process exited with code ${exitCode}`,
90
+ adapterName,
91
+ stderrTail()
92
+ );
93
+ const classified = classifyAdapterError(msg, exitCode);
94
+ throw Object.assign(new Error(msg), { errorKind: classified });
95
+ }
96
+ }
97
+ return generate();
98
+ }
99
+
100
+ export { appendStderrTail, buildFullPrompt, createStderrTailCapture, createStreamingEvents, extractTokens };
101
+ //# sourceMappingURL=chunk-CY5VX7G5.js.map
102
+ //# sourceMappingURL=chunk-CY5VX7G5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/adapters/utils.ts"],"names":[],"mappings":"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","file":"chunk-CY5VX7G5.js","sourcesContent":["/**\n * Shared utilities for agent adapters.\n *\n * Deduplicates extractTokens and streaming event generation logic\n * common to claude, codex, and cursor adapters.\n */\n\nimport type { ChildProcess } from 'node:child_process';\nimport type { Readable } from 'node:stream';\nimport type { AgentEvent } from './interface.js';\nimport { readLines } from '../process/process-manager.js';\nimport { type TokenUsage, createTokenUsage } from '../../domain/run.js';\nimport { classifyAdapterError } from '../../domain/errors.js';\n\nconst STDERR_TAIL_BYTES = 4096;\n\nfunction readUsageNumber(\n usage: Record<string, unknown>,\n primaryKey: string,\n fallbackKey: string,\n): number | undefined {\n const primary = usage[primaryKey];\n if (typeof primary === 'number') return primary;\n\n const fallback = usage[fallbackKey];\n return typeof fallback === 'number' ? fallback : undefined;\n}\n\n/** Combine system and user prompts. Adapters without native system prompt support use this. */\nexport function buildFullPrompt(systemPrompt: string | undefined, userPrompt: string): string {\n return systemPrompt ? systemPrompt + '\\n\\n' + userPrompt : userPrompt;\n}\n\n/**\n * Extract token usage from a parsed JSON event.\n *\n * @param parsed - The parsed JSON object from an adapter event line.\n * @param opts.statsFallback - If true, also checks `parsed.stats?.usage` (Claude-specific).\n */\nexport function extractTokens(\n parsed: Record<string, unknown>,\n opts?: { statsFallback?: boolean },\n): TokenUsage | undefined {\n let usage = parsed.usage as Record<string, unknown> | undefined;\n\n if (!usage && opts?.statsFallback) {\n const stats = parsed.stats as Record<string, unknown> | undefined;\n usage = stats?.usage as Record<string, unknown> | undefined;\n }\n\n if (!usage) return undefined;\n\n const input = readUsageNumber(usage, 'input_tokens', 'inputTokens');\n if (input === undefined) return undefined;\n\n const output = readUsageNumber(usage, 'output_tokens', 'outputTokens') ?? 0;\n const reasoning = readUsageNumber(usage, 'reasoning_tokens', 'reasoningTokens') ?? 0;\n const cache_read = readUsageNumber(usage, 'cache_read_input_tokens', 'cacheReadTokens') ?? 0;\n const cache_write = readUsageNumber(usage, 'cache_creation_input_tokens', 'cacheWriteTokens') ?? 0;\n return createTokenUsage(input, output, { reasoning, cache_read, cache_write });\n}\n\n/**\n * Drain stderr while retaining a bounded tail for diagnostics.\n *\n * Attaching the data listener immediately prevents a chatty child process from\n * blocking on a full stderr pipe. The returned closure exposes only the tail so\n * adapter failures stay useful without retaining unbounded output in memory.\n */\nexport function createStderrTailCapture(\n stderr: Readable | null | undefined,\n): () => string {\n if (!stderr) return () => '';\n\n let buf: Buffer = Buffer.alloc(0);\n stderr.on('data', (chunk: Buffer | string) => {\n const next = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, 'utf-8');\n buf = buf.length === 0 ? next : Buffer.concat([buf, next], buf.length + next.length);\n if (buf.length > STDERR_TAIL_BYTES) {\n // Materialize an exactly-sized copy rather than retaining a view into a\n // potentially much larger chunk's backing ArrayBuffer.\n buf = Buffer.from(buf.subarray(buf.length - STDERR_TAIL_BYTES));\n }\n });\n stderr.on('error', () => {});\n\n return () => buf.toString('utf-8').trimEnd();\n}\n\n/** Append a captured stderr tail to an adapter process error. */\nexport function appendStderrTail(message: string, adapterName: string, tail: string): string {\n return tail ? `${message}\\n--- ${adapterName} stderr (tail) ---\\n${tail}` : message;\n}\n\n/**\n * Create an async generator that streams AgentEvents from a child process.\n *\n * Handles: exit promise setup, line-by-line reading, abort signal, exit code checking.\n *\n * @param proc - The spawned child process.\n * @param parseEvent - Adapter-specific function to parse a line into an AgentEvent.\n * @param adapterName - Name used in error messages (e.g. \"Claude\", \"Codex\").\n * @param signal - Optional abort signal.\n */\nexport function createStreamingEvents(\n proc: ChildProcess,\n parseEvent: (line: string) => AgentEvent | null,\n adapterName: string,\n signal?: AbortSignal,\n): AsyncGenerator<AgentEvent> {\n // Set up lifecycle and stderr listeners eagerly. Async generator bodies do\n // not run until their first next(), and fast process failures can otherwise\n // happen before ORCH starts consuming the event stream.\n let exitCode: number | null = null;\n let exitError: Error | null = null;\n const stderrTail = createStderrTailCapture(proc.stderr);\n const exitPromise = new Promise<void>((resolve) => {\n proc.once('close', (code) => { exitCode = code; resolve(); });\n proc.once('error', (err) => { exitError = err; resolve(); });\n });\n\n async function* generate(): AsyncGenerator<AgentEvent> {\n let gotDoneEvent = false;\n\n if (proc.stdout) {\n try {\n for await (const line of readLines(proc.stdout)) {\n if (signal?.aborted) break;\n const event = parseEvent(line);\n if (event) {\n if (event.type === 'done') gotDoneEvent = true;\n yield event;\n }\n }\n } finally {\n // Destroy the stream to release the FD immediately rather than waiting\n // for the process to die — critical for rapid abort/restart cycles.\n // destroy() is idempotent: safe on an already-ended stream.\n proc.stdout.destroy();\n }\n }\n\n await exitPromise;\n\n if (exitError && !signal?.aborted && !gotDoneEvent) {\n const spawnErr = exitError as Error;\n const message = appendStderrTail(spawnErr.message, adapterName, 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 msg = appendStderrTail(\n `${adapterName} process exited with code ${exitCode}`,\n adapterName,\n stderrTail(),\n );\n const classified = classifyAdapterError(msg, exitCode);\n throw Object.assign(new Error(msg), { errorKind: classified });\n }\n }\n\n return generate();\n}\n"]}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import {a}from'./chunk-P4JTJBWO.js';import {o}from'./chunk-LRYVT4D4.js';import {b as b$1}from'./chunk-6MJ7V6VY.js';var b=4096;function f(n,t,e){let r=n[t];if(typeof r=="number")return r;let o=n[e];return typeof o=="number"?o:void 0}function _(n,t){return n?n+`
3
+
4
+ `+t:t}function x(n,t){let e=n.usage;if(!e&&t?.statsFallback&&(e=n.stats?.usage),!e)return;let r=f(e,"input_tokens","inputTokens");if(r===void 0)return;let o=f(e,"output_tokens","outputTokens")??0,u=f(e,"reasoning_tokens","reasoningTokens")??0,c=f(e,"cache_read_input_tokens","cacheReadTokens")??0,d=f(e,"cache_creation_input_tokens","cacheWriteTokens")??0;return a(r,o,{reasoning:u,cache_read:c,cache_write:d})}function w(n){if(!n)return ()=>"";let t=Buffer.alloc(0);return n.on("data",e=>{let r=Buffer.isBuffer(e)?e:Buffer.from(e,"utf-8");t=t.length===0?r:Buffer.concat([t,r],t.length+r.length),t.length>b&&(t=Buffer.from(t.subarray(t.length-b)));}),n.on("error",()=>{}),()=>t.toString("utf-8").trimEnd()}function k(n,t,e){return e?`${n}
5
+ --- ${t} stderr (tail) ---
6
+ ${e}`:n}function R(n,t,e,r){let o$1=null,u=null,c=w(n.stderr),d=new Promise(a=>{n.once("close",s=>{o$1=s,a();}),n.once("error",s=>{u=s,a();});});async function*g(){let a=false;if(n.stdout)try{for await(let s of b$1(n.stdout)){if(r?.aborted)break;let i=t(s);i&&(i.type==="done"&&(a=!0),yield i);}}finally{n.stdout.destroy();}if(await d,u&&!r?.aborted&&!a){let i=k(u.message,e,c()),E=o(i,o$1??void 0);throw Object.assign(new Error(i),{errorKind:E})}if(o$1!==0&&o$1!==null&&!r?.aborted&&!a){let s=k(`${e} process exited with code ${o$1}`,e,c()),i=o(s,o$1);throw Object.assign(new Error(s),{errorKind:i})}}return g()}export{_ as a,x as b,w as c,k as d,R as e};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import {e,b}from'./chunk-JEMJFAMY.js';import {o}from'./chunk-LRYVT4D4.js';import {execFile}from'child_process';import {promisify}from'util';var m=promisify(execFile),i=class{constructor(e){this.processManager=e;}kind="claude";async test(){try{let{stdout:e}=await m("claude",["--version"]);return {ok:!0,version:e.trim()}}catch(e){let t=e instanceof Error?e.message:String(e);return {ok:false,error:"Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code",errorKind:o(t)}}}execute(e$1){let t=["--print","--output-format","stream-json","--max-turns",String(e$1.config.max_turns??50),"--verbose","--dangerously-skip-permissions"];e$1.config.model&&t.push("--model",e$1.config.model),e$1.config.effort&&t.push("--effort",e$1.config.effort);let r=e$1.systemPrompt??e$1.config.system_prompt;r&&t.push("--system-prompt",r),t.push(e$1.prompt);let{process:o,pid:u}=this.processManager.spawn("claude",t,{cwd:e$1.workspace,env:{...process.env,...e$1.env},signal:e$1.signal}),p=e(o,f,"Claude",e$1.signal);return {pid:u,events:p}}async stop(e){await this.processManager.killWithGrace(e);}};function f(s){if(!s.trim())return null;try{let e=JSON.parse(s),t=new Date().toISOString();switch(e.type){case "assistant":return {type:"output",timestamp:t,data:e.message??e};case "tool_use":return {type:"tool_call",timestamp:t,data:e};case "tool_result":return {type:"output",timestamp:t,data:e};case "error":{let r=e.error??e,o$1=typeof r=="string"?r:JSON.stringify(r);return {type:"error",timestamp:t,data:r,errorKind:o(o$1)}}case "result":{let r=b(e,{statsFallback:!0});return {type:"done",timestamp:t,data:e,tokens:r}}default:return {type:"output",timestamp:t,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:s}}}export{i as a};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{a as ClaudeAdapter}from'./chunk-LWYSQ32X.js';import'./chunk-JEMJFAMY.js';import'./chunk-P4JTJBWO.js';import'./chunk-LRYVT4D4.js';import'./chunk-6MJ7V6VY.js';
@@ -1,4 +1,4 @@
1
- import { createStreamingEvents, extractTokens } from './chunk-RFN447MA.js';
1
+ import { createStreamingEvents, extractTokens } from './chunk-CY5VX7G5.js';
2
2
  import './chunk-RHFRHCN5.js';
3
3
  import { classifyAdapterError } from './chunk-IESAV453.js';
4
4
  import './chunk-O2MSGW3V.js';
@@ -88,5 +88,5 @@ function parseClaudeEvent(line) {
88
88
  }
89
89
 
90
90
  export { ClaudeAdapter };
91
- //# sourceMappingURL=claude-KZMCTMDP.js.map
92
- //# sourceMappingURL=claude-KZMCTMDP.js.map
91
+ //# sourceMappingURL=claude-TCPV5VGL.js.map
92
+ //# sourceMappingURL=claude-TCPV5VGL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/infrastructure/adapters/claude.ts"],"names":[],"mappings":"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","file":"claude-KZMCTMDP.js","sourcesContent":["/**\n * Claude Code adapter.\n *\n * Spawns `claude --print --output-format stream-json` in headless mode.\n * Parses JSON-lines 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 { extractTokens, createStreamingEvents } from './utils.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 ClaudeAdapter implements IAgentAdapter {\n readonly kind = 'claude';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('claude', ['--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: 'Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n '--print',\n '--output-format', 'stream-json',\n '--max-turns', String(params.config.max_turns ?? 50),\n '--verbose',\n '--dangerously-skip-permissions', // Agents run autonomously; stdin is 'ignore' so prompts would hang\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n if (params.config.effort) {\n args.push('--effort', params.config.effort);\n }\n\n // System prompt: orchestrator-generated (cacheable) takes priority, then per-agent config\n const effectiveSystemPrompt = params.systemPrompt ?? params.config.system_prompt;\n if (effectiveSystemPrompt) {\n args.push('--system-prompt', effectiveSystemPrompt);\n }\n\n args.push(params.prompt);\n\n const { process: proc, pid } = this.processManager.spawn('claude', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n });\n\n const events = createStreamingEvents(proc, parseClaudeEvent, 'Claude', 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 parseClaudeEvent(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\n switch (parsed.type) {\n case 'assistant':\n return { type: 'output', timestamp, data: (parsed.message as unknown) ?? parsed };\n case 'tool_use':\n return { type: 'tool_call', timestamp, data: parsed };\n case 'tool_result':\n return { type: 'output', timestamp, data: parsed };\n case 'error': {\n const errData = (parsed.error as unknown) ?? parsed;\n const errMsg = typeof errData === 'string' ? errData : JSON.stringify(errData);\n return { type: 'error', timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };\n }\n case 'result': {\n const tokens = extractTokens(parsed, { statsFallback: true });\n return { type: 'done', timestamp, data: parsed, tokens };\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"]}
1
+ {"version":3,"sources":["../src/infrastructure/adapters/claude.ts"],"names":[],"mappings":"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","file":"claude-TCPV5VGL.js","sourcesContent":["/**\n * Claude Code adapter.\n *\n * Spawns `claude --print --output-format stream-json` in headless mode.\n * Parses JSON-lines 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 { extractTokens, createStreamingEvents } from './utils.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 ClaudeAdapter implements IAgentAdapter {\n readonly kind = 'claude';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('claude', ['--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: 'Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n '--print',\n '--output-format', 'stream-json',\n '--max-turns', String(params.config.max_turns ?? 50),\n '--verbose',\n '--dangerously-skip-permissions', // Agents run autonomously; stdin is 'ignore' so prompts would hang\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n if (params.config.effort) {\n args.push('--effort', params.config.effort);\n }\n\n // System prompt: orchestrator-generated (cacheable) takes priority, then per-agent config\n const effectiveSystemPrompt = params.systemPrompt ?? params.config.system_prompt;\n if (effectiveSystemPrompt) {\n args.push('--system-prompt', effectiveSystemPrompt);\n }\n\n args.push(params.prompt);\n\n const { process: proc, pid } = this.processManager.spawn('claude', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n });\n\n const events = createStreamingEvents(proc, parseClaudeEvent, 'Claude', 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 parseClaudeEvent(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\n switch (parsed.type) {\n case 'assistant':\n return { type: 'output', timestamp, data: (parsed.message as unknown) ?? parsed };\n case 'tool_use':\n return { type: 'tool_call', timestamp, data: parsed };\n case 'tool_result':\n return { type: 'output', timestamp, data: parsed };\n case 'error': {\n const errData = (parsed.error as unknown) ?? parsed;\n const errMsg = typeof errData === 'string' ? errData : JSON.stringify(errData);\n return { type: 'error', timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };\n }\n case 'result': {\n const tokens = extractTokens(parsed, { statsFallback: true });\n return { type: 'done', timestamp, data: parsed, tokens };\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"]}
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$1,b,i}from'./chunk-64WUDYEM.js';import {a as a$3,e}from'./chunk-6E6DC7OE.js';import {k as k$1}from'./chunk-ZMLF5HI5.js';import {a as a$2,b as b$1}from'./chunk-LRYVT4D4.js';import R from'path';import {Command}from'commander';function l(o){let t=o.noColor||"NO_COLOR"in process.env||false,i=o.ascii||process.env.TERM==="dumb"||false;return {projectRoot:e(),json:o.json??false,quiet:o.quiet??false,noColor:t,ascii:i}}var d={task:async(o,t)=>{(await import('./task-V72DFC6L.js')).registerTaskCommand(o,t);},agent:async(o,t)=>{(await import('./agent-6ADS3VE2.js')).registerAgentCommand(o,t);},status:async(o,t)=>{(await import('./status-NYHZ7Q5G.js')).registerStatusCommand(o,t);},logs:async(o,t)=>{(await import('./logs-EUOQ2UZL.js')).registerLogsCommand(o,t);},config:async(o,t)=>{(await import('./config-OOB7QEKM.js')).registerConfigCommand(o,t);},context:async(o,t)=>{(await import('./context-FXRERFSP.js')).registerContextCommand(o,t);},msg:async(o,t)=>{(await import('./msg-4ELI7Q52.js')).registerMsgCommand(o,t);},goal:async(o,t)=>{(await import('./goal-KQ4XOSRH.js')).registerGoalCommand(o,t);},team:async(o,t)=>{(await import('./team-VCJSUDWX.js')).registerTeamCommand(o,t);},org:async(o,t)=>{(await import('./org-T5DCYQI6.js')).registerOrgCommand(o,t);}},m={run:async(o,t)=>{(await import('./run-PX7O3ILN.js')).registerRunCommand(o,t);},doctor:async(o,t)=>{(await import('./doctor-X2D67Q6Q.js')).registerDoctorCommand(o,t);},tui:async(o,t)=>{(await import('./tui-GFT7LF67.js')).registerTuiCommand(o,t);},serve:async(o,t)=>{(await import('./serve-DE7ES7Q5.js')).registerServeCommand(o,t);}},a=new Command;a.name("orchestry").description("Agents Organizations \u2014 CLI orchestrator for AI agents").version("1.0.26").option("--json","Output as JSON").option("--quiet","Minimal output (IDs only)").option("--no-color","Disable colors").option("--ascii","ASCII-only output (no Unicode)").hook("preAction",async o=>{let t=o.opts();t.ascii&&a$1(true),t.color===false&&b(true);});var x=[["task","Manage tasks"],["agent","Manage agents"],["status","Show orchestrator status"],["logs","View run logs"],["config","Manage configuration"],["context","Shared context store for inter-agent data exchange"],["msg","Inter-agent messaging"],["goal","Manage goals"],["team","Manage teams"],["org","Pre-built AI companies"],["run","Run tasks"],["doctor","Check adapters and dependencies"],["tui","Launch TUI dashboard"],["serve","Headless daemon mode with structured logs"],["init","Initialize project"],["update","Check for updates"]],L=new Set(x.map(([o])=>o));async function k(){a.parseOptions(process.argv);let o=a.opts(),t=process.argv.slice(2).find(e=>!e.startsWith("-")),i$1=t!==void 0&&L.has(t);if((process.argv.includes("--help")||process.argv.includes("-h")||process.argv.includes("--version")||process.argv.includes("-V"))&&!i$1){for(let[e,n]of x)a.command(e).description(n);await a.parseAsync(process.argv);return}if(t==="init"){let{registerInitCommand:e}=await import('./init-CPL6DJ7W.js');e(a);}else if(t==="update"){let{registerUpdateCommand:e}=await import('./update-W54LAATS.js');e(a);}let g=process.argv.length<=2;if(g&&!await k$1(R.join(process.cwd(),a$3))){let{runInit:e}=await import('./init-CPL6DJ7W.js');await e();let n=l({json:o.json,quiet:o.quiet,noColor:o.color===false,ascii:o.ascii}),{buildFullContainer:s}=await import('./container-WJJQSUHB.js'),p=await s(n);await m.tui(a,p),await a.parseAsync([...process.argv,"tui"]);return}let u=l({json:o.json,quiet:o.quiet,noColor:o.color===false,ascii:o.ascii}),j=!t||t in m,{buildFullContainer:A,buildLightContainer:M}=await import('./container-WJJQSUHB.js');try{if(j){let e=await A(u),n=t?m[t]:void 0;n?await n(a,e):await Promise.all(Object.values(m).map(p=>p(a,e)));let s=t?d[t]:void 0;s&&await s(a,e);}else {let e=await M(u),n=d[t];n?await n(a,e):await Promise.all(Object.values(d).map(s=>s(a,e)));}}catch(e){if(e instanceof b$1){if(t==="doctor"){let{registerDoctorCommand:n}=await import('./doctor-X2D67Q6Q.js');n(a);}if(t==="init"||t==="doctor"||t==="update"){await a.parseAsync(process.argv);return}i(e.message,e.hint),process.exit(e.exitCode);}throw e}g&&process.argv.push("tui");let r,f=t==="tui"||t==="update"||t==="serve",S=f?Promise.resolve(null):import('./update-check-R5ABF6HE.js').then(e=>(r=e,e.checkForUpdateSWR(a.version()??"0.0.0")));if(await a.parseAsync(process.argv),!f){let e=await S;e&&r&&(r.printUpdateNotification(e),e.updateAvailable&&r.backgroundInstall(e.latest).catch(()=>{}));}}k().catch(o=>{o instanceof a$2&&(i(o.message,o.hint),process.exit(o.exitCode)),i(o instanceof Error?o.message:String(o)),process.env.ORCHESTRY_DEBUG&&console.error(o),process.exit(1);});
2
+ import {a as a$1,b,i}from'./chunk-64WUDYEM.js';import {a as a$3,e}from'./chunk-6E6DC7OE.js';import {k as k$1}from'./chunk-ZMLF5HI5.js';import {a as a$2,b as b$1}from'./chunk-LRYVT4D4.js';import R from'path';import {Command}from'commander';function l(o){let t=o.noColor||"NO_COLOR"in process.env||false,i=o.ascii||process.env.TERM==="dumb"||false;return {projectRoot:e(),json:o.json??false,quiet:o.quiet??false,noColor:t,ascii:i}}var d={task:async(o,t)=>{(await import('./task-SZDRAD7V.js')).registerTaskCommand(o,t);},agent:async(o,t)=>{(await import('./agent-6ADS3VE2.js')).registerAgentCommand(o,t);},status:async(o,t)=>{(await import('./status-NYHZ7Q5G.js')).registerStatusCommand(o,t);},logs:async(o,t)=>{(await import('./logs-EUOQ2UZL.js')).registerLogsCommand(o,t);},config:async(o,t)=>{(await import('./config-OOB7QEKM.js')).registerConfigCommand(o,t);},context:async(o,t)=>{(await import('./context-FXRERFSP.js')).registerContextCommand(o,t);},msg:async(o,t)=>{(await import('./msg-4ELI7Q52.js')).registerMsgCommand(o,t);},goal:async(o,t)=>{(await import('./goal-KQ4XOSRH.js')).registerGoalCommand(o,t);},team:async(o,t)=>{(await import('./team-VCJSUDWX.js')).registerTeamCommand(o,t);},org:async(o,t)=>{(await import('./org-T5DCYQI6.js')).registerOrgCommand(o,t);}},m={run:async(o,t)=>{(await import('./run-PX7O3ILN.js')).registerRunCommand(o,t);},doctor:async(o,t)=>{(await import('./doctor-ITKGSHFU.js')).registerDoctorCommand(o,t);},tui:async(o,t)=>{(await import('./tui-25JIN7MP.js')).registerTuiCommand(o,t);},serve:async(o,t)=>{(await import('./serve-DE7ES7Q5.js')).registerServeCommand(o,t);}},a=new Command;a.name("orchestry").description("Agents Organizations \u2014 CLI orchestrator for AI agents").version("1.0.28").option("--json","Output as JSON").option("--quiet","Minimal output (IDs only)").option("--no-color","Disable colors").option("--ascii","ASCII-only output (no Unicode)").hook("preAction",async o=>{let t=o.opts();t.ascii&&a$1(true),t.color===false&&b(true);});var x=[["task","Manage tasks"],["agent","Manage agents"],["status","Show orchestrator status"],["logs","View run logs"],["config","Manage configuration"],["context","Shared context store for inter-agent data exchange"],["msg","Inter-agent messaging"],["goal","Manage goals"],["team","Manage teams"],["org","Pre-built AI companies"],["run","Run tasks"],["doctor","Check adapters and dependencies"],["tui","Launch TUI dashboard"],["serve","Headless daemon mode with structured logs"],["init","Initialize project"],["update","Check for updates"]],L=new Set(x.map(([o])=>o));async function k(){a.parseOptions(process.argv);let o=a.opts(),t=process.argv.slice(2).find(e=>!e.startsWith("-")),i$1=t!==void 0&&L.has(t);if((process.argv.includes("--help")||process.argv.includes("-h")||process.argv.includes("--version")||process.argv.includes("-V"))&&!i$1){for(let[e,n]of x)a.command(e).description(n);await a.parseAsync(process.argv);return}if(t==="init"){let{registerInitCommand:e}=await import('./init-CPL6DJ7W.js');e(a);}else if(t==="update"){let{registerUpdateCommand:e}=await import('./update-W54LAATS.js');e(a);}let g=process.argv.length<=2;if(g&&!await k$1(R.join(process.cwd(),a$3))){let{runInit:e}=await import('./init-CPL6DJ7W.js');await e();let n=l({json:o.json,quiet:o.quiet,noColor:o.color===false,ascii:o.ascii}),{buildFullContainer:s}=await import('./container-CH5HKCZU.js'),p=await s(n);await m.tui(a,p),await a.parseAsync([...process.argv,"tui"]);return}let u=l({json:o.json,quiet:o.quiet,noColor:o.color===false,ascii:o.ascii}),j=!t||t in m,{buildFullContainer:A,buildLightContainer:M}=await import('./container-CH5HKCZU.js');try{if(j){let e=await A(u),n=t?m[t]:void 0;n?await n(a,e):await Promise.all(Object.values(m).map(p=>p(a,e)));let s=t?d[t]:void 0;s&&await s(a,e);}else {let e=await M(u),n=d[t];n?await n(a,e):await Promise.all(Object.values(d).map(s=>s(a,e)));}}catch(e){if(e instanceof b$1){if(t==="doctor"){let{registerDoctorCommand:n}=await import('./doctor-ITKGSHFU.js');n(a);}if(t==="init"||t==="doctor"||t==="update"){await a.parseAsync(process.argv);return}i(e.message,e.hint),process.exit(e.exitCode);}throw e}g&&process.argv.push("tui");let r,f=t==="tui"||t==="update"||t==="serve",S=f?Promise.resolve(null):import('./update-check-R5ABF6HE.js').then(e=>(r=e,e.checkForUpdateSWR(a.version()??"0.0.0")));if(await a.parseAsync(process.argv),!f){let e=await S;e&&r&&(r.printUpdateNotification(e),e.updateAvailable&&r.backgroundInstall(e.latest).catch(()=>{}));}}k().catch(o=>{o instanceof a$2&&(i(o.message,o.hint),process.exit(o.exitCode)),i(o instanceof Error?o.message:String(o)),process.env.ORCHESTRY_DEBUG&&console.error(o),process.exit(1);});
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import {a,e,b}from'./chunk-JEMJFAMY.js';import'./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),g=class{constructor(e){this.processManager=e;}kind="codex";async test(){try{let{stdout:e}=await f("codex",["--version"]);return {ok:!0,version:e.trim()}}catch(e){let r=e instanceof Error?e.message:String(e);return {ok:false,error:"Codex CLI not found. Install: npm i -g @openai/codex",errorKind:o(r)}}}execute(e$1){let r=["exec","--json","--sandbox","danger-full-access"];e$1.config.model&&r.push("--model",e$1.config.model),r.push("-");let{process:s,pid:t}=this.processManager.spawn("codex",r,{cwd:e$1.workspace,env:{...process.env,...e$1.env},signal:e$1.signal,stdio:["pipe","pipe","pipe"]});s.stdin&&(s.stdin.write(a(e$1.systemPrompt,e$1.prompt)),s.stdin.end());let n=e(s,h,"Codex",e$1.signal);return {pid:t,events:n}}async stop(e){await this.processManager.killWithGrace(e);}};function h(a){if(!a.trim())return null;try{let e=JSON.parse(a),r=new Date().toISOString();switch(e.type??""){case "thread.started":return {type:"output",timestamp:r,data:e};case "turn.started":return {type:"output",timestamp:r,data:e};case "turn.completed":{let t=b(e);return {type:"done",timestamp:r,data:e,tokens:t}}case "turn.failed":{let t=b(e),n=typeof e.error=="string"?e.error:JSON.stringify(e);return {type:"error",timestamp:r,data:e,tokens:t,errorKind:o(n)}}case "item.started":case "item.completed":{let t=e.item??{},n=t.type??"";if(n==="agent_message")return {type:"output",timestamp:r,data:t};if(n==="reasoning")return {type:"output",timestamp:r,data:t};if(n==="command_execution")return {type:"command",timestamp:r,data:t};if(n==="file_change"){let m=(Array.isArray(t.changes)?t.changes:[]).map(p=>typeof p.path=="string"?p.path:"").filter(Boolean);return {type:"file_change",timestamp:r,data:{paths:m,raw:t}}}if(n==="tool_use")return {type:"tool_call",timestamp:r,data:t};if(n==="tool_result")return {type:"output",timestamp:r,data:t};if(n==="error"){let c=typeof t.message=="string"?t.message:JSON.stringify(t);return {type:"error",timestamp:r,data:t,errorKind:o(c)}}return {type:"output",timestamp:r,data:t}}case "error":{let t=e.error??e,n=typeof t=="string"?t:JSON.stringify(t);return {type:"error",timestamp:r,data:t,errorKind:o(n)}}default:return {type:"output",timestamp:r,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:a}}}export{g as CodexAdapter};
@@ -1,4 +1,4 @@
1
- import { buildFullPrompt, createStreamingEvents, extractTokens } from './chunk-RFN447MA.js';
1
+ import { buildFullPrompt, createStreamingEvents, extractTokens } from './chunk-CY5VX7G5.js';
2
2
  import './chunk-RHFRHCN5.js';
3
3
  import { classifyAdapterError } from './chunk-IESAV453.js';
4
4
  import './chunk-O2MSGW3V.js';
@@ -121,5 +121,5 @@ function parseCodexEvent(line) {
121
121
  }
122
122
 
123
123
  export { CodexAdapter };
124
- //# sourceMappingURL=codex-UR7Q22OV.js.map
125
- //# sourceMappingURL=codex-UR7Q22OV.js.map
124
+ //# sourceMappingURL=codex-ZWDFBGE4.js.map
125
+ //# sourceMappingURL=codex-ZWDFBGE4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/infrastructure/adapters/codex.ts"],"names":[],"mappings":"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","file":"codex-UR7Q22OV.js","sourcesContent":["/**\n * Codex CLI adapter.\n *\n * Spawns `codex exec --json -` in headless mode.\n * Prompt is piped via stdin (avoids CLI arg length limits).\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 { extractTokens, createStreamingEvents, buildFullPrompt } from './utils.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 CodexAdapter implements IAgentAdapter {\n readonly kind = 'codex';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('codex', ['--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: 'Codex CLI not found. Install: npm i -g @openai/codex',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n 'exec',\n '--json',\n '--sandbox', 'danger-full-access', // autonomous agents can't respond to approval prompts\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n // Read prompt from stdin (avoids ARG_MAX limits on long prompts)\n args.push('-');\n\n const { process: proc, pid } = this.processManager.spawn('codex', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n stdio: ['pipe', 'pipe', 'pipe'], // stdin must be 'pipe' to send prompt\n });\n\n // Pipe prompt via stdin — prepend system prompt if present (Codex has no native --system-prompt)\n if (proc.stdin) {\n proc.stdin.write(buildFullPrompt(params.systemPrompt, params.prompt));\n proc.stdin.end();\n }\n\n const events = createStreamingEvents(proc, parseCodexEvent, 'Codex', 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 parseCodexEvent(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\n const type = (parsed.type as string) ?? '';\n\n // Codex JSONL event types\n switch (type) {\n // Thread/session started\n case 'thread.started':\n return { type: 'output', timestamp, data: parsed };\n\n // Turn lifecycle\n case 'turn.started':\n return { type: 'output', timestamp, data: parsed };\n\n case 'turn.completed': {\n const tokens = extractTokens(parsed);\n return { type: 'done', timestamp, data: parsed, tokens };\n }\n\n case 'turn.failed': {\n const tokens = extractTokens(parsed);\n const failMsg = typeof parsed.error === 'string' ? parsed.error : JSON.stringify(parsed);\n return { type: 'error', timestamp, data: parsed, tokens, errorKind: classifyAdapterError(failMsg) };\n }\n\n // Item events\n case 'item.started':\n case 'item.completed': {\n const item = (parsed.item as Record<string, unknown>) ?? {};\n const itemType = (item.type as string) ?? '';\n\n if (itemType === 'agent_message') {\n return { type: 'output', timestamp, data: item };\n }\n if (itemType === 'reasoning') {\n return { type: 'output', timestamp, data: item };\n }\n if (itemType === 'command_execution') {\n return { type: 'command', timestamp, data: item };\n }\n if (itemType === 'file_change') {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n const paths = (changes as Record<string, unknown>[])\n .map((c) => typeof c.path === 'string' ? c.path : '')\n .filter(Boolean);\n return { type: 'file_change', timestamp, data: { paths, raw: item } };\n }\n if (itemType === 'tool_use') {\n return { type: 'tool_call', timestamp, data: item };\n }\n if (itemType === 'tool_result') {\n return { type: 'output', timestamp, data: item };\n }\n if (itemType === 'error') {\n const itemErrMsg = typeof item.message === 'string' ? item.message : JSON.stringify(item);\n return { type: 'error', timestamp, data: item, errorKind: classifyAdapterError(itemErrMsg) };\n }\n return { type: 'output', timestamp, data: item };\n }\n\n case 'error': {\n const errData = (parsed.error as unknown) ?? parsed;\n const errMsg = typeof errData === 'string' ? errData : JSON.stringify(errData);\n return { type: 'error', timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };\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"]}
1
+ {"version":3,"sources":["../src/infrastructure/adapters/codex.ts"],"names":[],"mappings":"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","file":"codex-ZWDFBGE4.js","sourcesContent":["/**\n * Codex CLI adapter.\n *\n * Spawns `codex exec --json -` in headless mode.\n * Prompt is piped via stdin (avoids CLI arg length limits).\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 { extractTokens, createStreamingEvents, buildFullPrompt } from './utils.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 CodexAdapter implements IAgentAdapter {\n readonly kind = 'codex';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('codex', ['--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: 'Codex CLI not found. Install: npm i -g @openai/codex',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n 'exec',\n '--json',\n '--sandbox', 'danger-full-access', // autonomous agents can't respond to approval prompts\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n // Read prompt from stdin (avoids ARG_MAX limits on long prompts)\n args.push('-');\n\n const { process: proc, pid } = this.processManager.spawn('codex', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n stdio: ['pipe', 'pipe', 'pipe'], // stdin must be 'pipe' to send prompt\n });\n\n // Pipe prompt via stdin — prepend system prompt if present (Codex has no native --system-prompt)\n if (proc.stdin) {\n proc.stdin.write(buildFullPrompt(params.systemPrompt, params.prompt));\n proc.stdin.end();\n }\n\n const events = createStreamingEvents(proc, parseCodexEvent, 'Codex', 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 parseCodexEvent(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\n const type = (parsed.type as string) ?? '';\n\n // Codex JSONL event types\n switch (type) {\n // Thread/session started\n case 'thread.started':\n return { type: 'output', timestamp, data: parsed };\n\n // Turn lifecycle\n case 'turn.started':\n return { type: 'output', timestamp, data: parsed };\n\n case 'turn.completed': {\n const tokens = extractTokens(parsed);\n return { type: 'done', timestamp, data: parsed, tokens };\n }\n\n case 'turn.failed': {\n const tokens = extractTokens(parsed);\n const failMsg = typeof parsed.error === 'string' ? parsed.error : JSON.stringify(parsed);\n return { type: 'error', timestamp, data: parsed, tokens, errorKind: classifyAdapterError(failMsg) };\n }\n\n // Item events\n case 'item.started':\n case 'item.completed': {\n const item = (parsed.item as Record<string, unknown>) ?? {};\n const itemType = (item.type as string) ?? '';\n\n if (itemType === 'agent_message') {\n return { type: 'output', timestamp, data: item };\n }\n if (itemType === 'reasoning') {\n return { type: 'output', timestamp, data: item };\n }\n if (itemType === 'command_execution') {\n return { type: 'command', timestamp, data: item };\n }\n if (itemType === 'file_change') {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n const paths = (changes as Record<string, unknown>[])\n .map((c) => typeof c.path === 'string' ? c.path : '')\n .filter(Boolean);\n return { type: 'file_change', timestamp, data: { paths, raw: item } };\n }\n if (itemType === 'tool_use') {\n return { type: 'tool_call', timestamp, data: item };\n }\n if (itemType === 'tool_result') {\n return { type: 'output', timestamp, data: item };\n }\n if (itemType === 'error') {\n const itemErrMsg = typeof item.message === 'string' ? item.message : JSON.stringify(item);\n return { type: 'error', timestamp, data: item, errorKind: classifyAdapterError(itemErrMsg) };\n }\n return { type: 'output', timestamp, data: item };\n }\n\n case 'error': {\n const errData = (parsed.error as unknown) ?? parsed;\n const errMsg = typeof errData === 'string' ? errData : JSON.stringify(errData);\n return { type: 'error', timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };\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"]}
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  import {a as a$2}from'./chunk-N4OXN2HW.js';import {c as c$1,b as b$3}from'./chunk-HXOMNULD.js';import {b as b$2,a as a$1}from'./chunk-KR7VDF23.js';import {a}from'./chunk-CHRW4CLD.js';import {b}from'./chunk-6E6DC7OE.js';import {b as b$1,c,j as j$1,d,e,l as l$1,f as f$1,h,i as i$1,g as g$1,k as k$1}from'./chunk-ZMLF5HI5.js';import {c as c$2,l,j as j$2,k,g,f,i}from'./chunk-LRYVT4D4.js';import tt from'path';import Z,{mkdir}from'fs/promises';import {createReadStream}from'fs';import {homedir}from'os';import {nanoid}from'nanoid';var P={tui:{activity_filter:"all",notifications:{toast:true,bell:false}}};var w=class{indexPath;dir;ext;itemPath;fileFilter;readItemFn;mutex=Promise.resolve();insideMutex=false;constructor(t){this.dir=t.dir,this.ext=t.ext,this.itemPath=t.itemPath,this.indexPath=tt.join(t.dir,"_index.json"),this.fileFilter=t.fileFilter??(()=>true),t.readItem?this.readItemFn=t.readItem:t.ext===".yml"?this.readItemFn=e=>b$1(e):this.readItemFn=e=>d(e);}async readIndex(){try{let t=await d(this.indexPath);if(Array.isArray(t))return t}catch{}return this.rebuildIndex()}async rebuildIndex(){await j$1(this.dir);let t=await l$1(this.dir,this.ext),e=await Promise.all(t.filter(this.fileFilter).map(s=>{let a=s.replace(this.ext,"");return this.readItemFn(this.itemPath(a))})),r=[];for(let s of e)s!=null&&r.push(s);return this.insideMutex?await this.writeIndexUnsafe(r):await this.withMutex(()=>this.writeIndexUnsafe(r)),r}async writeIndex(t){return this.withMutex(()=>this.writeIndexUnsafe(t))}async updateIndex(t){return this.withMutex(async()=>{let e=await this.readIndex(),r=t(e);await this.writeIndexUnsafe(r);})}async writeIndexUnsafe(t){await j$1(this.dir),await e(this.indexPath,t);}withMutex(t){let e,r=new Promise(a=>{e=a;}),s=this.mutex;return this.mutex=r,s.then(async()=>{this.insideMutex=true;try{return await t()}finally{this.insideMutex=false,e();}})}};var C=class{constructor(t){this.paths=t;this.index=new w({dir:t.tasksDir,ext:".yml",itemPath:e=>t.taskPath(e)});}index;async list(t){return (await this.index.readIndex()).filter(s=>s!==null&&(!t?.status||s.status===t.status)&&(!t?.goalId||s.goalId===t.goalId)).sort((s,a)=>{let n=wt(s.status)-wt(a.status);if(n!==0)return n;let i=a.updated_at??"",o=s.updated_at??"";return i<o?-1:i>o?1:0})}async get(t){return b$1(this.paths.taskPath(t))}async save(t){await j$1(this.paths.tasksDir),await c(this.paths.taskPath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async delete(t){try{await Z.unlink(this.paths.taskPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}};function wt(m){return {in_progress:0,retrying:1,review:2,todo:3,done:4,failed:5,cancelled:6}[m]}var j=class{constructor(t){this.paths=t;this.index=new w({dir:t.agentsDir,ext:".yml",itemPath:e=>t.agentPath(e)});}index;async list(){return this.index.readIndex()}async get(t){return b$1(this.paths.agentPath(t))}async getByName(t){return (await this.list()).find(r=>r.name===t)??null}async save(t){await j$1(this.paths.agentsDir),await c(this.paths.agentPath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async delete(t){try{await Z.unlink(this.paths.agentPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}};var M=class{constructor(t){this.paths=t;}async save(t){await j$1(this.paths.runsDir),await e(this.paths.runPath(t.id),t);}async get(t){return d(this.paths.runPath(t))}async listAll(){return this.listFiltered(()=>true)}async listForTask(t){return this.listFiltered(e=>e.task_id===t)}async listForAgent(t){return this.listFiltered(e=>e.agent_id===t)}async appendEvent(t,e){await j$1(this.paths.runsDir),await f$1(this.paths.runEventsPath(t),e);}async readEvents(t){return h(this.paths.runEventsPath(t))}async readEventsTail(t,e){return i$1(this.paths.runEventsPath(t),e)}closeRunEvents(t){g$1(this.paths.runEventsPath(t));}async*streamEvents(t,e){let r=this.paths.runEventsPath(t),s=Date.now()+3e4;for(;!e?.aborted&&Date.now()<s&&!await k$1(r);)await new Promise(i=>setTimeout(i,100));if(e?.aborted||Date.now()>=s)return;let a=createReadStream(r),{readLines:n}=await import('./process-manager-33H27MQF.js');try{for await(let i of n(a)){if(e?.aborted)break;if(i.trim())try{yield JSON.parse(i);}catch{process.stderr.write(`[RunStore] skipping corrupt JSONL line: ${i.slice(0,200)}
3
- `);}}}finally{a.destroy();}}async listFiltered(t){await j$1(this.paths.runsDir);let e=await l$1(this.paths.runsDir,".json"),r=64,s=[];for(let a=0;a<e.length;a+=r){let n=e.slice(a,a+r),i=await Promise.all(n.map(o=>{let c=o.endsWith(".json")?o.slice(0,-5):o;return d(this.paths.runPath(c))}));for(let o of i)o!==null&&t(o)&&s.push(o);}return s.sort((a,n)=>new Date(n.started_at).getTime()-new Date(a.started_at).getTime())}};var Q={version:1,onboardingCompleted:false,running:{},claimed:new Set,retry_queue:[],stats:{total_runs:0,total_tasks_completed:0,total_tasks_failed:0,total_tokens:{input:0,output:0,reasoning:0,total:0,cache_read:0,cache_write:0},total_runtime_ms:0}};var D=class{constructor(t){this.paths=t;}async read(){let t=await d(this.paths.statePath);if(!t)return structuredClone(Q);let e=structuredClone(Q);return {version:t.version??e.version,pid:t.pid,started_at:t.started_at,onboardingCompleted:typeof t.onboardingCompleted=="boolean"?t.onboardingCompleted:false,running:t.running&&typeof t.running=="object"?t.running:e.running,claimed:Array.isArray(t.claimed)?new Set(t.claimed):new Set(e.claimed),retry_queue:Array.isArray(t.retry_queue)?t.retry_queue:e.retry_queue,stats:{total_runs:t.stats?.total_runs??e.stats.total_runs,total_tasks_completed:t.stats?.total_tasks_completed??e.stats.total_tasks_completed,total_tasks_failed:t.stats?.total_tasks_failed??e.stats.total_tasks_failed,total_tokens:{...e.stats.total_tokens,...t.stats?.total_tokens??{}},total_runtime_ms:t.stats?.total_runtime_ms??e.stats.total_runtime_ms}}}async write(t){let e$1={...t,claimed:Array.from(t.claimed)};await e(this.paths.statePath,e$1);}};var R=class{constructor(t){this.paths=t;}async read(){let t=await b$1(this.paths.configPath);return yt(a$2,t??{})}async write(t){await c(this.paths.configPath,t);}async get(t){let e=await this.read();return Dt(e,t)}async set(t,e){let r=await this.read();Rt(r,t,e),await this.write(r);}};function Dt(m,t){let e=t.split("."),r=m;for(let s of e){if(r==null||typeof r!="object")return;r=r[s];}return r}function Rt(m,t,e){let r=t.split("."),s=m;for(let n=0;n<r.length-1;n++){let i=r[n];(typeof s[i]!="object"||s[i]===null)&&(s[i]={}),s=s[i];}let a=r[r.length-1];s[a]=e;}function yt(m,t){let e={...m};for(let r of Object.keys(t)){let s=t[r],a=e[r];s!=null&&typeof s=="object"&&!Array.isArray(s)&&typeof a=="object"&&a!==null&&!Array.isArray(a)?e[r]=yt(a,s):e[r]=s;}return e}var _t=tt.join(homedir(),".orchestry"),St=tt.join(_t,"global.yml"),O=class{async read(){let t=await b$1(St);if(!t)return {...P,tui:{...P.tui,notifications:{...P.tui.notifications}}};let e=t.tui,r=e?.notifications;return {tui:{activity_filter:e?.activity_filter??P.tui.activity_filter,notifications:{toast:typeof r?.toast=="boolean"?r.toast:P.tui.notifications.toast,bell:typeof r?.bell=="boolean"?r.bell:P.tui.notifications.bell}}}}async write(t){await mkdir(_t,{recursive:true}),await c(St,t);}async set(t,e){let r=await this.read();r.tui[t]=e,await this.write(r);}};var G=class m{constructor(t){this.paths=t;this.index=new w({dir:t.contextDir,ext:".json",itemPath:e=>t.contextPath(e),fileFilter:e=>e!=="_index.json"});}index;async get(t){let e=await d(this.paths.contextPath(t));return e?kt(e)?(await this.delete(t),null):e:null}static MAX_TTL_MS=720*60*60*1e3;async set(t,e$1,r){if(r!==void 0&&(!Number.isFinite(r)||r<=0||r>m.MAX_TTL_MS))throw new Error(`TTL must be a positive number up to ${m.MAX_TTL_MS}ms (30 days)`);await j$1(this.paths.contextDir);let s=new Date().toISOString(),a=await d(this.paths.contextPath(t)),n={key:t,value:e$1,created_at:a?.created_at??s,updated_at:s,ttl_ms:r,expires_at:r?new Date(Date.now()+r).toISOString():void 0};await e(this.paths.contextPath(t),n),await this.index.updateIndex(i=>{let o=i.filter(c=>c.key!==t);return o.push(n),o});}async delete(t){try{await Z.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.key!==t));}async list(){let t=await this.index.readIndex(),e=[],r=[];for(let s of t)kt(s)?e.push(s):r.push(s);return e.length>0&&(await Promise.all(e.map(s=>this.deleteFile(s.key))),await this.index.writeIndex(r)),r.sort((s,a)=>s.key.localeCompare(a.key))}async getAll(){let t=await this.list(),e={};for(let r of t)e[r.key]=r.value;return e}async deleteFile(t){try{await Z.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};function kt(m){return m.expires_at?new Date(m.expires_at).getTime()<Date.now():false}var L=class{constructor(t){this.paths=t;this.index=new w({dir:t.messagesDir,ext:".json",itemPath:e=>t.messagePath(e),fileFilter:e=>e!=="_index.json"});}index;async save(t){await j$1(this.paths.messagesDir),await e(this.paths.messagePath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async get(t){return d(this.paths.messagePath(t))}async list(){return (await this.index.readIndex()).filter(e=>e!==null).sort((e,r)=>e.created_at.localeCompare(r.created_at))}async listPending(t){let e=await this.list(),r=Date.now();return e.filter(s=>s.status!=="pending"||s.expires_at&&new Date(s.expires_at).getTime()<r?false:s.to_agent_id===t)}async markDelivered(t){let e$1=await this.get(t);e$1&&(e$1.status="delivered",e$1.delivered_at=new Date().toISOString(),await e(this.paths.messagePath(t),e$1),await this.index.updateIndex(r=>{let s=r.filter(a=>a.id!==t);return s.push(e$1),s}));}async delete(t){try{await Z.unlink(this.paths.messagePath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}async purgeExpired(){let t=await this.list(),e=Date.now(),r=t.filter(a=>{let n=a.expires_at&&new Date(a.expires_at).getTime()<e,i=a.delivered_at&&e-new Date(a.delivered_at).getTime()>36e5;return n||i}),s=new Set(r.map(a=>a.id));return await Promise.all(r.map(async a=>{try{await Z.unlink(this.paths.messagePath(a.id));}catch(n){if(n.code!=="ENOENT")throw n}})),await this.index.updateIndex(a=>a.filter(n=>!s.has(n.id))),r.length}};var B=class{constructor(t){this.paths=t;this.index=new w({dir:t.goalsDir,ext:".yml",itemPath:e=>t.goalPath(e)});}index;async list(t){return (await this.index.readIndex()).filter(s=>s!==null&&(!t?.status||s.status===t.status)).sort((s,a)=>{let n=c$1[s.status]-c$1[a.status];if(n!==0)return n;let i=a.updated_at??"",o=s.updated_at??"";return i<o?-1:i>o?1:0})}async get(t){return b$1(this.paths.goalPath(t))}async save(t){await j$1(this.paths.goalsDir),await c(this.paths.goalPath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async delete(t){try{await Z.unlink(this.paths.goalPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}};var F=class{constructor(t){this.paths=t;}async save(t){await j$1(this.paths.teamsDir),await c(this.paths.teamPath(t.id),t);}async get(t){return b$1(this.paths.teamPath(t))}async getByName(t){return (await this.list()).find(r=>r.name===t)??null}async list(){await j$1(this.paths.teamsDir);let t=await l$1(this.paths.teamsDir,".yml");return (await Promise.all(t.map(r=>b$1(this.paths.teamPath(r.replace(".yml","")))))).filter(r=>r!==null)}async delete(t){try{await Z.unlink(this.paths.teamPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var N=class{handlers=new Map;wildcardHandlers=new Set;maxListeners=10;warnedTypes=new Set;setMaxListeners(t){this.maxListeners=t;}getMaxListeners(){return this.maxListeners}listenerCount(t){return this.handlers.get(t)?.size??0}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set);let r=this.handlers.get(t);return r.add(e),this.maxListeners>0&&r.size>this.maxListeners&&!this.warnedTypes.has(t)&&(this.warnedTypes.add(t),console.warn(`EventBus: possible memory leak detected. ${r.size} listeners added for "${t}". Use setMaxListeners() to increase limit if this is intentional.`)),()=>this.off(t,e)}once(t,e){let r=s=>{this.off(t,r),e(s);};return this.on(t,r)}off(t,e){this.handlers.get(t)?.delete(e);}emit(t){let e=this.handlers.get(t.type);e&&this.dispatchToSet(e,t,"handler"),this.dispatchToSet(this.wildcardHandlers,t,"wildcard handler");}dispatchToSet(t,e,r){for(let s of t)try{s(e);}catch(a){console.error(`EventBus ${r} error for "${e.type}":`,a);}}onAny(t){return this.wildcardHandlers.add(t),this.maxListeners>0&&this.wildcardHandlers.size>this.maxListeners&&!this.warnedTypes.has("*")&&(this.warnedTypes.add("*"),console.warn(`EventBus: possible memory leak detected. ${this.wildcardHandlers.size} wildcard listeners added. Use setMaxListeners() to increase limit if this is intentional.`)),()=>{this.wildcardHandlers.delete(t);}}clear(){this.handlers.clear(),this.wildcardHandlers.clear(),this.warnedTypes.clear();}};var $=class{constructor(t,e,r,s,a){this.taskStore=t;this.eventBus=e;this.config=r;this.paths=s;this.agentStore=a;}async create(t){if(!t.title.trim())throw new c$2("Task title is required");let e=t.priority??this.config.defaults.task.priority;if(!Number.isInteger(e)||e<1||e>4)throw new c$2("Priority must be an integer between 1 and 4");if(t.depends_on?.length){let i=(await Promise.all(t.depends_on.map(async o=>({depId:o,exists:!!await this.taskStore.get(o)})))).filter(o=>!o.exists).map(o=>o.depId);if(i.length>0)throw new c$2(`Unknown depends_on task ID(s): ${i.join(", ")}`)}let r=await this.resolveAssignee(t.assignee),s=new Date().toISOString(),a={id:`tsk_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"todo",priority:e,assignee:r,labels:t.labels??[],depends_on:t.depends_on??[],created_at:s,updated_at:s,attempts:0,max_attempts:t.max_attempts??this.config.defaults.task.max_attempts,workspace_mode:t.workspace_mode,review_criteria:t.review_criteria,scope:t.scope,goalId:t.goalId};if(t.attachments?.length&&this.paths){let n=await this.copyAttachments(a.id,t.attachments);a.attachments=n;}return await this.taskStore.save(a),this.eventBus.emit({type:"task:created",task:a}),a}async list(t){return this.taskStore.list(t)}async get(t){let e=await this.taskStore.get(t);if(!e)throw new f(t);return e}async updateStatus(t,e){let r=await this.get(t),s=r.status;if(!a$1(s,e))throw new i(t,s,e);return r.status=e,r.updated_at=new Date().toISOString(),await this.taskStore.save(r),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:e}),r}async assign(t,e){let r=await this.get(t);return r.assignee=await this.resolveAssignee(e),r.updated_at=new Date().toISOString(),await this.taskStore.save(r),this.eventBus.emit({type:"task:assigned",taskId:t,agentId:e}),r}async cancel(t){let e=await this.get(t);if(b$2(e.status))throw new i(t,e.status,"cancelled");return this.updateStatus(t,"cancelled")}async retry(t){let e=await this.get(t);if(e.status!=="failed"&&e.status!=="cancelled")throw new i(t,e.status,"todo");let r=e.status;return e.status="todo",e.attempts=0,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),this.eventBus.emit({type:"task:status_changed",taskId:t,from:r,to:"todo"}),e}async reject(t,e){let r=await this.get(t);if(r.status!=="review")throw new i(t,r.status,"todo");let s=r.status;return r.status="todo",r.attempts=0,r.feedback=e,r.updated_at=new Date().toISOString(),await this.taskStore.save(r),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:"todo"}),r}async update(t,e){let r=await this.get(t);if(e.title!==void 0){if(!e.title.trim())throw new c$2("Task title cannot be empty");r.title=e.title.trim();}if(e.description!==void 0&&(r.description=e.description.trim()),e.priority!==void 0){if(!Number.isInteger(e.priority)||e.priority<1||e.priority>4)throw new c$2("Priority must be an integer between 1 and 4");r.priority=e.priority;}if(e.labels!==void 0&&(r.labels=e.labels),e.attachments?.length&&this.paths){let s=await this.copyAttachments(t,e.attachments);r.attachments=[...r.attachments??[],...s];}return r.updated_at=new Date().toISOString(),await this.taskStore.save(r),r}async delete(t){if((await this.get(t)).status==="in_progress")throw new c$2("Cannot delete a running task. Cancel it first.");if(await this.taskStore.delete(t),this.paths){let r=this.paths.taskAttachmentsDir(t);await Z.rm(r,{recursive:true,force:true});}}getAttachmentPath(t,e){if(!this.paths)throw new c$2("Paths not configured");return tt.join(this.paths.taskAttachmentsDir(t),e)}async copyAttachments(t,e){if(!this.paths)return [];let r=this.paths.taskAttachmentsDir(t);return await j$1(r),await Promise.all(e.map(async a=>{try{await Z.access(a);}catch{throw new c$2(`Attachment file not found: ${a}`)}})),await Promise.all(e.map(async a=>{let n=tt.basename(a);return await Z.copyFile(a,tt.join(r,n)),n}))}async incrementAttempts(t){let e=await this.get(t);return e.attempts+=1,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),e}async resolveAssignee(t){if(!t)return;if(!this.agentStore)return t;if(t.startsWith("agt_")){let r=await this.agentStore.get(t);if(r)return r.id;throw new c$2(`Unknown agent ID: "${t}". No agent with this ID exists.`)}let e=await this.agentStore.getByName(t);if(e)return e.id;throw new c$2(`Unknown agent: "${t}". Use an agent ID (agt_xxx) or an exact agent name.`)}};var U=class{constructor(t,e,r,s){this.agentStore=t;this.stateStore=e;this.eventBus=r;this.config=s;}async create(t){if(!t.name.trim())throw new c$2("Agent name is required");if(await this.agentStore.getByName(t.name))throw new c$2(`Agent "${t.name}" already exists`);let r={id:`agt_${nanoid(7)}`,name:t.name.trim(),adapter:t.adapter||this.config.defaults.agent.adapter,role:t.role,config:{command:t.command,model:t.model,effort:t.effort,approval_policy:t.approval_policy??this.config.defaults.agent.approval_policy,max_turns:t.max_turns??this.config.defaults.agent.max_turns,timeout_ms:t.timeout_ms??this.config.defaults.agent.timeout_ms,stall_timeout_ms:t.stall_timeout_ms??this.config.defaults.agent.stall_timeout_ms,env:t.env,system_prompt:t.system_prompt,workspace_mode:t.workspace_mode,skills:t.skills},status:"idle",stats:{tasks_completed:0,tasks_failed:0,total_runs:0,total_runtime_ms:0}};return await this.agentStore.save(r),r}async list(){return this.agentStore.list()}async get(t){let e=await this.agentStore.get(t);if(!e)throw new g(t);return e}async remove(t){let e=await this.get(t);if(e.status==="running"){let r=await this.stateStore.read();if(Object.values(r.running).some(a=>a.agent_id===t))throw new c$2("Cannot remove a running agent. Stop it first.");e.status="idle",await this.agentStore.save(e);}await this.agentStore.delete(t);}async update(t,e){let r=await this.get(t);if(e.name!==void 0){if(!e.name.trim())throw new c$2("Agent name cannot be empty");let s=await this.agentStore.getByName(e.name.trim());if(s&&s.id!==t)throw new c$2(`Agent "${e.name}" already exists`);r.name=e.name.trim();}return e.role!==void 0&&(r.role=e.role||void 0),e.model!==void 0&&(r.config.model=e.model||void 0),e.effort!==void 0&&(r.config.effort=e.effort||void 0),e.approval_policy!==void 0&&(r.config.approval_policy=e.approval_policy),await this.agentStore.save(r),r}async disable(t){return this.setStatus(t,"disabled")}async enable(t){return this.setStatus(t,"idle")}async setAutonomous(t,e){let r=await this.get(t);return r.autonomous=e,await this.agentStore.save(r),this.eventBus.emit({type:"agent:autonomous_toggled",agentId:t,autonomous:e}),r}async setStatus(t,e){let r=await this.get(t);return r.status=e,await this.agentStore.save(r),r}async updateStats(t,e){let r=await this.get(t);return Object.assign(r.stats,e),await this.agentStore.save(r),r}async findBestAgent(t){let e=await this.agentStore.list(),r=e.filter(n=>n.status==="idle");if(r.length===0)return null;if(t.assignee){let n=e.find(i=>i.id===t.assignee||i.name===t.assignee);return n&&n.status==="idle"?n:null}let s=t.labels?.length?t.labels.map(n=>n.toLowerCase()):void 0,a=r.map(n=>{let i=0;if(s&&n.config.skills?.length){let c=new Set(n.config.skills.map(d=>d.toLowerCase()));for(let d of s)c.has(d)&&(i+=50);}if(s&&n.role){let c=n.role.toLowerCase();s.some(d=>c.includes(d))&&(i+=30);}n.status==="idle"&&(i+=20);let o=n.stats.tasks_completed+n.stats.tasks_failed;return o>0&&(i+=Math.round(n.stats.tasks_completed/o*10)),{agent:n,score:i}});return a.sort((n,i)=>i.score-n.score),a[0]?.agent??null}};var J=class{constructor(t,e){this.runStore=t;this.eventBus=e;}async create(t){let e={id:`run_${nanoid(7)}`,task_id:t.taskId,agent_id:t.agentId,attempt:t.attempt,status:"preparing",started_at:new Date().toISOString(),workspace_path:t.workspacePath,prompt:t.prompt};return await this.runStore.save(e),e}async get(t){return this.runStore.get(t)}async start(t,e){let r=await this.runStore.get(t);if(!r)throw new Error(`Run not found: ${t}`);return r.status="running",r.pid=e,await this.runStore.save(r),this.eventBus.emit({type:"agent:started",agentId:r.agent_id,taskId:r.task_id,runId:t}),r}async finish(t,e,r,s){let a=await this.runStore.get(t);if(!a)throw new Error(`Run not found: ${t}`);return a.status=e,a.finished_at=new Date().toISOString(),a.tokens=r,a.error=s,await this.runStore.save(a),this.eventBus.emit({type:"agent:completed",runId:t,agentId:a.agent_id,success:e==="succeeded"}),a}async appendEvent(t,e){await this.runStore.appendEvent(t,e);}async listAll(){return this.runStore.listAll()}async listForTask(t){return this.runStore.listForTask(t)}async listForAgent(t){return this.runStore.listForAgent(t)}async readEvents(t){return this.runStore.readEvents(t)}async readEventsTail(t,e){return this.runStore.readEventsTail(t,e)}async getLastFailedRunContext(t){let r=(await this.runStore.listForTask(t)).filter(n=>n.status==="failed").sort((n,i)=>(i.finished_at??"").localeCompare(n.finished_at??""))[0];if(!r)return null;let s=r.error??"Unknown error",a="";try{a=(await this.runStore.readEventsTail(r.id,50)).filter(i=>i.type==="agent_output"||i.type==="error").map(i=>typeof i.data=="string"?i.data:JSON.stringify(i.data)).join(`
4
- `);}catch{}return {error:s,output:a}}};var H=class{constructor(t,e,r,s){this.messageStore=t;this.agentStore=e;this.teamStore=r;this.eventBus=s;}async send(t){if(!t.body.trim())throw new c$2("Message body is required");let e=t.ttl_ms??864e5;if(e<=0||e>6048e5)throw new c$2(`TTL must be between 1ms and ${6048e5}ms`);if(!await this.agentStore.get(t.from_agent_id)&&t.from_agent_id!=="cli")throw new c$2(`Sender agent not found: ${t.from_agent_id}`);let s=new Date,a={channel:t.channel,from_agent_id:t.from_agent_id,subject:(t.subject||"(no subject)").slice(0,200),body:t.body.slice(0,4e3),created_at:s.toISOString(),expires_at:new Date(s.getTime()+e).toISOString(),status:"pending",team_id:t.team_id,reply_to:t.reply_to},n=[];if(t.channel==="broadcast"){let i=await this.agentStore.list();if(t.team_id){let d=await this.teamStore.get(t.team_id);if(d){let k=new Set(d.members.map(v=>v.agent_id));i=i.filter(v=>k.has(v.id));}}let c=i.filter(d=>d.id!==t.from_agent_id&&d.status!=="disabled").map(d=>({...a,id:`msg_${nanoid(7)}`,to_agent_id:d.id}));await Promise.all(c.map(d=>this.messageStore.save(d)));for(let d of c)n.push(d),this.emitSent(d);}else if(t.channel==="lead"){if(!t.team_id)throw new c$2("team_id is required for lead channel");let i=await this.teamStore.get(t.team_id);if(!i)throw new c$2(`Team not found: ${t.team_id}`);let o={...a,id:`msg_${nanoid(7)}`,to_agent_id:i.lead_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}else {if(!t.to_agent_id)throw new c$2("to_agent_id is required for direct messages");if(!await this.agentStore.get(t.to_agent_id))throw new c$2(`Recipient agent not found: ${t.to_agent_id}`);let o={...a,id:`msg_${nanoid(7)}`,to_agent_id:t.to_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}return n}async drainMailbox(t,e){let r=await this.messageStore.listPending(t);await Promise.all(r.map(s=>this.messageStore.markDelivered(s.id)));for(let s of r)this.eventBus.emit({type:"message:delivered",messageId:s.id,toAgentId:t,taskId:e});return r}async listAll(){return this.messageStore.list()}async listPendingForAgent(t){return this.messageStore.listPending(t)}async listForAgent(t){return (await this.messageStore.list()).filter(r=>r.to_agent_id===t||r.from_agent_id===t)}async purgeExpired(){return this.messageStore.purgeExpired()}emitSent(t){this.eventBus.emit({type:"message:sent",messageId:t.id,fromAgentId:t.from_agent_id,toAgentId:t.to_agent_id,channel:t.channel});}};var Ht={active:["paused","achieved","abandoned"],paused:["active","achieved","abandoned"],achieved:[],abandoned:[]},q=class{constructor(t,e,r,s,a){this.goalStore=t;this.eventBus=e;this.agentService=r;this.taskService=s;this.contextStore=a;}async create(t){if(!t.title.trim())throw new c$2("Goal title is required");let e=new Date().toISOString(),r={id:`goal_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"active",assignee:t.assignee,created_at:e,updated_at:e};return await this.goalStore.save(r),this.eventBus.emit({type:"goal:created",goalId:r.id,title:r.title}),r.assignee&&await this.enableAutonomous(r.assignee),r}async list(t){return this.goalStore.list(t)}async get(t){let e=await this.goalStore.get(t);if(!e)throw new j$2(t);return e}async updateStatus(t,e,r){let s=await this.get(t),a$1=s.status;if(!Ht[a$1].includes(e))throw new c$2(`Cannot transition goal from '${a$1}' to '${e}'`);if(e==="achieved"&&this.taskService){let i=(await this.taskService.list({goalId:t})).filter(o=>!b$2(o.status)&&!o.labels?.includes(a));if(i.length>0)if(r?.force){let o=i.filter(d=>d.status!=="in_progress"),c=i.filter(d=>d.status==="in_progress");if(await Promise.all(o.map(d=>this.taskService.cancel(d.id).catch(()=>{}))),c.length>0){let d=c.map(k=>`${k.id} (in_progress)`).join(", ");throw new k(t,c.length,d)}}else {let o=i.map(c=>`${c.id} (${c.status})`).join(", ");throw new k(t,i.length,o)}}return s.status=e,s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:status_changed",goalId:t,from:a$1,to:e}),s.assignee&&(e==="paused"?(await this.maybeDisableAutonomous(s.assignee),await this.cancelPendingAutonomousTasks(s.assignee)):e==="active"&&a$1==="paused"?await this.enableAutonomous(s.assignee):b$3(e)&&await this.maybeDisableAutonomous(s.assignee)),s}async update(t,e){let r=await this.get(t),s=r.assignee;if(e.title!==void 0){if(!e.title.trim())throw new c$2("Goal title cannot be empty");r.title=e.title.trim();}e.description!==void 0&&(r.description=e.description.trim()),e.assignee!==void 0&&(r.assignee=e.assignee||void 0),r.updated_at=new Date().toISOString(),await this.goalStore.save(r),this.eventBus.emit({type:"goal:updated",goalId:t});let a=r.assignee;if(a!==s){let n=[];a&&n.push(this.enableAutonomous(a)),s&&n.push(this.maybeDisableAutonomous(s)),await Promise.all(n);}return r}async delete(t){let e=await this.get(t),{assignee:r}=e;await this.goalStore.delete(t),this.eventBus.emit({type:"goal:deleted",goalId:t}),r&&await this.maybeDisableAutonomous(r);}async listTasksForGoal(t){return this.taskService?.list({goalId:t})??[]}async getProgressReport(t){return this.contextStore?(await this.contextStore.get(`${t}-progress`))?.value:void 0}async enableAutonomous(t){if(this.agentService)try{await this.agentService.setAutonomous(t,!0);}catch{}}async hasActiveGoalsForAgent(t){return (await this.goalStore.list({status:"active"})).some(r=>r.assignee===t)}async cancelPendingAutonomousTasks(t){if(this.taskService)try{let[e,r]=await Promise.all([this.taskService.list({status:"todo"}),this.taskService.list({status:"retrying"})]),s=[...e,...r].filter(a$1=>a$1.assignee===t&&a$1.labels?.includes(a));await Promise.all(s.map(a=>this.taskService.cancel(a.id).catch(()=>{})));}catch{}}async maybeDisableAutonomous(t){if(this.agentService)try{await this.hasActiveGoalsForAgent(t)||await this.agentService.setAutonomous(t,!1);}catch{}}};var bt={auto_claim:true,message_ttl_ms:864e5};var Y=class{constructor(t,e,r,s){this.teamStore=t;this.agentStore=e;this.taskStore=r;this.eventBus=s;}async create(t){if(!t.name.trim())throw new c$2("Team name is required");if(!await this.agentStore.get(t.lead_agent_id))throw new c$2(`Lead agent not found: ${t.lead_agent_id}`);if(await this.teamStore.getByName(t.name.trim()))throw new c$2(`Team "${t.name}" already exists`);let s=new Date().toISOString(),a={agent_id:t.lead_agent_id,role:"lead",joined_at:s},n=[];for(let o of t.member_agent_ids??[]){if(o===t.lead_agent_id)continue;if(!await this.agentStore.get(o))throw new c$2(`Member agent not found: ${o}`);n.push({agent_id:o,role:"member",joined_at:s});}let i={id:`team_${nanoid(7)}`,name:t.name.trim(),description:t.description,status:"active",members:[a,...n],task_pool:[],lead_agent_id:t.lead_agent_id,created_at:s,updated_at:s,config:{...bt,...t.config??{}}};await this.teamStore.save(i),this.eventBus.emit({type:"team:created",teamId:i.id,name:i.name,leadAgentId:i.lead_agent_id});for(let o of n)this.eventBus.emit({type:"team:member_joined",teamId:i.id,agentId:o.agent_id});return i}async get(t){let e=await this.teamStore.get(t);if(!e)throw new l(t);return e}async list(){return this.teamStore.list()}async join(t,e){let r=await this.get(t);if(r.members.some(a=>a.agent_id===e))throw new c$2(`Agent ${e} is already a member of team ${t}`);if(!await this.agentStore.get(e))throw new c$2(`Agent not found: ${e}`);return r.members.push({agent_id:e,role:"member",joined_at:new Date().toISOString()}),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),this.eventBus.emit({type:"team:member_joined",teamId:t,agentId:e}),r}async leave(t,e){let r=await this.get(t);if(e===r.lead_agent_id)throw new c$2("Lead cannot leave team. Disband the team or transfer lead first.");return r.members=r.members.filter(s=>s.agent_id!==e),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),this.eventBus.emit({type:"team:member_left",teamId:t,agentId:e}),r}async addTask(t,e){let r=await this.get(t);if(!await this.taskStore.get(e))throw new c$2(`Task not found: ${e}`);return r.task_pool.includes(e)||(r.task_pool.push(e),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),this.eventBus.emit({type:"team:task_added",teamId:t,taskId:e})),r}async removeTask(t,e){let r=await this.get(t);return r.task_pool=r.task_pool.filter(s=>s!==e),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),r}async setLead(t,e){let r=await this.get(t),s=r.members.find(n=>n.agent_id===e);if(!s)throw new c$2(`Agent ${e} is not a member of team ${t}`);let a=r.members.find(n=>n.agent_id===r.lead_agent_id);return a&&(a.role="member"),s.role="lead",r.lead_agent_id=e,r.updated_at=new Date().toISOString(),await this.teamStore.save(r),r}async disband(t){let e=await this.get(t);e.status="disbanded",e.updated_at=new Date().toISOString(),await this.teamStore.save(e),this.eventBus.emit({type:"team:disbanded",teamId:t});}async findTeamForAgent(t){return (await this.teamStore.list()).find(r=>r.status==="active"&&r.members.some(s=>s.agent_id===t))??null}};async function Yt(m){let t=new b(m.projectRoot),e=new R(t),r=new O,[,s]=await Promise.all([t.requireInit(),e.read()]),a=new C(t),n=new j(t),i=new M(t),o=new D(t),c=new G(t),d=new L(t),k=new B(t),v=new F(t),_=new N,b$1=new $(a,_,s,t,n),I=new U(n,o,_,s),z=new J(i,_),W=new H(d,n,v,_),p=new q(k,_,I,b$1,c),A=new Y(v,n,a,_);return {context:m,paths:t,config:s,taskStore:a,agentStore:n,runStore:i,stateStore:o,configStore:e,globalConfigStore:r,globalConfig:P,contextStore:c,messageStore:d,goalStore:k,teamStore:v,eventBus:_,taskService:b$1,agentService:I,runService:z,messageService:W,goalService:p,teamService:A}}async function zt(m){let t=await Yt(m),e=await t.globalConfigStore.read();t.globalConfig=e;let[{ProcessManager:r},{AdapterRegistry:s},{ClaudeAdapter:a},{CodexAdapter:n},{CursorAdapter:i},{ShellAdapter:o},{OpenCodeAdapter:c},{PiAdapter:d},{GrokAdapter:k},{AntigravityAdapter:v},{WorkspaceManager:_},{LiquidTemplateEngine:b},{SkillLoader:I},{Orchestrator:z},{DoctorService:W}]=await Promise.all([import('./process-manager-33H27MQF.js'),import('./registry-BO2PPRNG.js'),import('./claude-PH7LT3OH.js'),import('./codex-URQN4JLZ.js'),import('./cursor-EMX3ECDY.js'),import('./shell-NPNTWDMU.js'),import('./opencode-K22RCQ5C.js'),import('./pi-XEINSHUN.js'),import('./grok-YX757Y3M.js'),import('./antigravity-LGKZHZL7.js'),import('./workspace-manager-ZI5SVXJU.js'),import('./template-engine-VLIOJ3WX.js'),import('./skill-loader-IGRIELEM.js'),import('./orchestrator-TY5HYXUH.js'),import('./doctor-service-PB7YBH3F.js')]),p=new r,A=new b,rt=new I,st=new _(m.projectRoot,t.paths.root,p),y=new s;y.register(new a(p)),y.register(new n(p)),y.register(new i(p)),y.register(new o(p)),y.register(new c(p)),y.register(new d(p)),y.register(new k(p)),y.register(new v(p));let It=new W(y,p,m.projectRoot),At=new z({taskStore:t.taskStore,agentStore:t.agentStore,runStore:t.runStore,stateStore:t.stateStore,adapterRegistry:y,workspaceManager:st,templateEngine:A,processManager:p,eventBus:t.eventBus,taskService:t.taskService,agentService:t.agentService,runService:t.runService,contextStore:t.contextStore,messageService:t.messageService,goalStore:t.goalStore,skillLoader:rt,config:t.config,projectRoot:m.projectRoot,lockPath:t.paths.lockPath});return {...t,processManager:p,adapterRegistry:y,workspaceManager:st,templateEngine:A,skillLoader:rt,doctorService:It,orchestrator:At}}async function Mr(m){return zt(m)}export{Mr as buildContainer,zt as buildFullContainer,Yt as buildLightContainer};
3
+ `);}}}finally{a.destroy();}}async listFiltered(t){await j$1(this.paths.runsDir);let e=await l$1(this.paths.runsDir,".json"),r=64,s=[];for(let a=0;a<e.length;a+=r){let n=e.slice(a,a+r),i=await Promise.all(n.map(o=>{let c=o.endsWith(".json")?o.slice(0,-5):o;return d(this.paths.runPath(c))}));for(let o of i)o!==null&&t(o)&&s.push(o);}return s.sort((a,n)=>new Date(n.started_at).getTime()-new Date(a.started_at).getTime())}};var Q={version:1,onboardingCompleted:false,running:{},claimed:new Set,retry_queue:[],stats:{total_runs:0,total_tasks_completed:0,total_tasks_failed:0,total_tokens:{input:0,output:0,reasoning:0,total:0,cache_read:0,cache_write:0},total_runtime_ms:0}};var D=class{constructor(t){this.paths=t;}async read(){let t=await d(this.paths.statePath);if(!t)return structuredClone(Q);let e=structuredClone(Q);return {version:t.version??e.version,pid:t.pid,started_at:t.started_at,onboardingCompleted:typeof t.onboardingCompleted=="boolean"?t.onboardingCompleted:false,running:t.running&&typeof t.running=="object"?t.running:e.running,claimed:Array.isArray(t.claimed)?new Set(t.claimed):new Set(e.claimed),retry_queue:Array.isArray(t.retry_queue)?t.retry_queue:e.retry_queue,stats:{total_runs:t.stats?.total_runs??e.stats.total_runs,total_tasks_completed:t.stats?.total_tasks_completed??e.stats.total_tasks_completed,total_tasks_failed:t.stats?.total_tasks_failed??e.stats.total_tasks_failed,total_tokens:{...e.stats.total_tokens,...t.stats?.total_tokens??{}},total_runtime_ms:t.stats?.total_runtime_ms??e.stats.total_runtime_ms}}}async write(t){let e$1={...t,claimed:Array.from(t.claimed)};await e(this.paths.statePath,e$1);}};var R=class{constructor(t){this.paths=t;}async read(){let t=await b$1(this.paths.configPath);return yt(a$2,t??{})}async write(t){await c(this.paths.configPath,t);}async get(t){let e=await this.read();return Dt(e,t)}async set(t,e){let r=await this.read();Rt(r,t,e),await this.write(r);}};function Dt(m,t){let e=t.split("."),r=m;for(let s of e){if(r==null||typeof r!="object")return;r=r[s];}return r}function Rt(m,t,e){let r=t.split("."),s=m;for(let n=0;n<r.length-1;n++){let i=r[n];(typeof s[i]!="object"||s[i]===null)&&(s[i]={}),s=s[i];}let a=r[r.length-1];s[a]=e;}function yt(m,t){let e={...m};for(let r of Object.keys(t)){let s=t[r],a=e[r];s!=null&&typeof s=="object"&&!Array.isArray(s)&&typeof a=="object"&&a!==null&&!Array.isArray(a)?e[r]=yt(a,s):e[r]=s;}return e}var _t=tt.join(homedir(),".orchestry"),St=tt.join(_t,"global.yml"),O=class{async read(){let t=await b$1(St);if(!t)return {...P,tui:{...P.tui,notifications:{...P.tui.notifications}}};let e=t.tui,r=e?.notifications;return {tui:{activity_filter:e?.activity_filter??P.tui.activity_filter,notifications:{toast:typeof r?.toast=="boolean"?r.toast:P.tui.notifications.toast,bell:typeof r?.bell=="boolean"?r.bell:P.tui.notifications.bell}}}}async write(t){await mkdir(_t,{recursive:true}),await c(St,t);}async set(t,e){let r=await this.read();r.tui[t]=e,await this.write(r);}};var G=class m{constructor(t){this.paths=t;this.index=new w({dir:t.contextDir,ext:".json",itemPath:e=>t.contextPath(e),fileFilter:e=>e!=="_index.json"});}index;async get(t){let e=await d(this.paths.contextPath(t));return e?kt(e)?(await this.delete(t),null):e:null}static MAX_TTL_MS=720*60*60*1e3;async set(t,e$1,r){if(r!==void 0&&(!Number.isFinite(r)||r<=0||r>m.MAX_TTL_MS))throw new Error(`TTL must be a positive number up to ${m.MAX_TTL_MS}ms (30 days)`);await j$1(this.paths.contextDir);let s=new Date().toISOString(),a=await d(this.paths.contextPath(t)),n={key:t,value:e$1,created_at:a?.created_at??s,updated_at:s,ttl_ms:r,expires_at:r?new Date(Date.now()+r).toISOString():void 0};await e(this.paths.contextPath(t),n),await this.index.updateIndex(i=>{let o=i.filter(c=>c.key!==t);return o.push(n),o});}async delete(t){try{await Z.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.key!==t));}async list(){let t=await this.index.readIndex(),e=[],r=[];for(let s of t)kt(s)?e.push(s):r.push(s);return e.length>0&&(await Promise.all(e.map(s=>this.deleteFile(s.key))),await this.index.writeIndex(r)),r.sort((s,a)=>s.key.localeCompare(a.key))}async getAll(){let t=await this.list(),e={};for(let r of t)e[r.key]=r.value;return e}async deleteFile(t){try{await Z.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};function kt(m){return m.expires_at?new Date(m.expires_at).getTime()<Date.now():false}var L=class{constructor(t){this.paths=t;this.index=new w({dir:t.messagesDir,ext:".json",itemPath:e=>t.messagePath(e),fileFilter:e=>e!=="_index.json"});}index;async save(t){await j$1(this.paths.messagesDir),await e(this.paths.messagePath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async get(t){return d(this.paths.messagePath(t))}async list(){return (await this.index.readIndex()).filter(e=>e!==null).sort((e,r)=>e.created_at.localeCompare(r.created_at))}async listPending(t){let e=await this.list(),r=Date.now();return e.filter(s=>s.status!=="pending"||s.expires_at&&new Date(s.expires_at).getTime()<r?false:s.to_agent_id===t)}async markDelivered(t){let e$1=await this.get(t);e$1&&(e$1.status="delivered",e$1.delivered_at=new Date().toISOString(),await e(this.paths.messagePath(t),e$1),await this.index.updateIndex(r=>{let s=r.filter(a=>a.id!==t);return s.push(e$1),s}));}async delete(t){try{await Z.unlink(this.paths.messagePath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}async purgeExpired(){let t=await this.list(),e=Date.now(),r=t.filter(a=>{let n=a.expires_at&&new Date(a.expires_at).getTime()<e,i=a.delivered_at&&e-new Date(a.delivered_at).getTime()>36e5;return n||i}),s=new Set(r.map(a=>a.id));return await Promise.all(r.map(async a=>{try{await Z.unlink(this.paths.messagePath(a.id));}catch(n){if(n.code!=="ENOENT")throw n}})),await this.index.updateIndex(a=>a.filter(n=>!s.has(n.id))),r.length}};var B=class{constructor(t){this.paths=t;this.index=new w({dir:t.goalsDir,ext:".yml",itemPath:e=>t.goalPath(e)});}index;async list(t){return (await this.index.readIndex()).filter(s=>s!==null&&(!t?.status||s.status===t.status)).sort((s,a)=>{let n=c$1[s.status]-c$1[a.status];if(n!==0)return n;let i=a.updated_at??"",o=s.updated_at??"";return i<o?-1:i>o?1:0})}async get(t){return b$1(this.paths.goalPath(t))}async save(t){await j$1(this.paths.goalsDir),await c(this.paths.goalPath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async delete(t){try{await Z.unlink(this.paths.goalPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}};var F=class{constructor(t){this.paths=t;}async save(t){await j$1(this.paths.teamsDir),await c(this.paths.teamPath(t.id),t);}async get(t){return b$1(this.paths.teamPath(t))}async getByName(t){return (await this.list()).find(r=>r.name===t)??null}async list(){await j$1(this.paths.teamsDir);let t=await l$1(this.paths.teamsDir,".yml");return (await Promise.all(t.map(r=>b$1(this.paths.teamPath(r.replace(".yml","")))))).filter(r=>r!==null)}async delete(t){try{await Z.unlink(this.paths.teamPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var N=class{handlers=new Map;wildcardHandlers=new Set;maxListeners=10;warnedTypes=new Set;setMaxListeners(t){this.maxListeners=t;}getMaxListeners(){return this.maxListeners}listenerCount(t){return this.handlers.get(t)?.size??0}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set);let r=this.handlers.get(t);return r.add(e),this.maxListeners>0&&r.size>this.maxListeners&&!this.warnedTypes.has(t)&&(this.warnedTypes.add(t),console.warn(`EventBus: possible memory leak detected. ${r.size} listeners added for "${t}". Use setMaxListeners() to increase limit if this is intentional.`)),()=>this.off(t,e)}once(t,e){let r=s=>{this.off(t,r),e(s);};return this.on(t,r)}off(t,e){this.handlers.get(t)?.delete(e);}emit(t){let e=this.handlers.get(t.type);e&&this.dispatchToSet(e,t,"handler"),this.dispatchToSet(this.wildcardHandlers,t,"wildcard handler");}dispatchToSet(t,e,r){for(let s of t)try{s(e);}catch(a){console.error(`EventBus ${r} error for "${e.type}":`,a);}}onAny(t){return this.wildcardHandlers.add(t),this.maxListeners>0&&this.wildcardHandlers.size>this.maxListeners&&!this.warnedTypes.has("*")&&(this.warnedTypes.add("*"),console.warn(`EventBus: possible memory leak detected. ${this.wildcardHandlers.size} wildcard listeners added. Use setMaxListeners() to increase limit if this is intentional.`)),()=>{this.wildcardHandlers.delete(t);}}clear(){this.handlers.clear(),this.wildcardHandlers.clear(),this.warnedTypes.clear();}};var $=class{constructor(t,e,r,s,a){this.taskStore=t;this.eventBus=e;this.config=r;this.paths=s;this.agentStore=a;}async create(t){if(!t.title.trim())throw new c$2("Task title is required");let e=t.priority??this.config.defaults.task.priority;if(!Number.isInteger(e)||e<1||e>4)throw new c$2("Priority must be an integer between 1 and 4");if(t.depends_on?.length){let i=(await Promise.all(t.depends_on.map(async o=>({depId:o,exists:!!await this.taskStore.get(o)})))).filter(o=>!o.exists).map(o=>o.depId);if(i.length>0)throw new c$2(`Unknown depends_on task ID(s): ${i.join(", ")}`)}let r=await this.resolveAssignee(t.assignee),s=new Date().toISOString(),a={id:`tsk_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"todo",priority:e,assignee:r,labels:t.labels??[],depends_on:t.depends_on??[],created_at:s,updated_at:s,attempts:0,max_attempts:t.max_attempts??this.config.defaults.task.max_attempts,workspace_mode:t.workspace_mode,review_criteria:t.review_criteria,scope:t.scope,goalId:t.goalId};if(t.attachments?.length&&this.paths){let n=await this.copyAttachments(a.id,t.attachments);a.attachments=n;}return await this.taskStore.save(a),this.eventBus.emit({type:"task:created",task:a}),a}async list(t){return this.taskStore.list(t)}async get(t){let e=await this.taskStore.get(t);if(!e)throw new f(t);return e}async updateStatus(t,e){let r=await this.get(t),s=r.status;if(!a$1(s,e))throw new i(t,s,e);return r.status=e,r.updated_at=new Date().toISOString(),await this.taskStore.save(r),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:e}),r}async assign(t,e){let r=await this.get(t);return r.assignee=await this.resolveAssignee(e),r.updated_at=new Date().toISOString(),await this.taskStore.save(r),this.eventBus.emit({type:"task:assigned",taskId:t,agentId:e}),r}async cancel(t){let e=await this.get(t);if(b$2(e.status))throw new i(t,e.status,"cancelled");return this.updateStatus(t,"cancelled")}async retry(t){let e=await this.get(t);if(e.status!=="failed"&&e.status!=="cancelled")throw new i(t,e.status,"todo");let r=e.status;return e.status="todo",e.attempts=0,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),this.eventBus.emit({type:"task:status_changed",taskId:t,from:r,to:"todo"}),e}async reject(t,e){let r=await this.get(t);if(r.status!=="review")throw new i(t,r.status,"todo");let s=r.status;return r.status="todo",r.attempts=0,r.feedback=e,r.updated_at=new Date().toISOString(),await this.taskStore.save(r),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:"todo"}),r}async update(t,e){let r=await this.get(t);if(e.title!==void 0){if(!e.title.trim())throw new c$2("Task title cannot be empty");r.title=e.title.trim();}if(e.description!==void 0&&(r.description=e.description.trim()),e.priority!==void 0){if(!Number.isInteger(e.priority)||e.priority<1||e.priority>4)throw new c$2("Priority must be an integer between 1 and 4");r.priority=e.priority;}if(e.labels!==void 0&&(r.labels=e.labels),e.attachments?.length&&this.paths){let s=await this.copyAttachments(t,e.attachments);r.attachments=[...r.attachments??[],...s];}return r.updated_at=new Date().toISOString(),await this.taskStore.save(r),r}async delete(t){if((await this.get(t)).status==="in_progress")throw new c$2("Cannot delete a running task. Cancel it first.");if(await this.taskStore.delete(t),this.paths){let r=this.paths.taskAttachmentsDir(t);await Z.rm(r,{recursive:true,force:true});}}getAttachmentPath(t,e){if(!this.paths)throw new c$2("Paths not configured");return tt.join(this.paths.taskAttachmentsDir(t),e)}async copyAttachments(t,e){if(!this.paths)return [];let r=this.paths.taskAttachmentsDir(t);return await j$1(r),await Promise.all(e.map(async a=>{try{await Z.access(a);}catch{throw new c$2(`Attachment file not found: ${a}`)}})),await Promise.all(e.map(async a=>{let n=tt.basename(a);return await Z.copyFile(a,tt.join(r,n)),n}))}async incrementAttempts(t){let e=await this.get(t);return e.attempts+=1,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),e}async resolveAssignee(t){if(!t)return;if(!this.agentStore)return t;if(t.startsWith("agt_")){let r=await this.agentStore.get(t);if(r)return r.id;throw new c$2(`Unknown agent ID: "${t}". No agent with this ID exists.`)}let e=await this.agentStore.getByName(t);if(e)return e.id;throw new c$2(`Unknown agent: "${t}". Use an agent ID (agt_xxx) or an exact agent name.`)}};var U=class{constructor(t,e,r,s){this.agentStore=t;this.stateStore=e;this.eventBus=r;this.config=s;}async create(t){if(!t.name.trim())throw new c$2("Agent name is required");if(await this.agentStore.getByName(t.name))throw new c$2(`Agent "${t.name}" already exists`);let r={id:`agt_${nanoid(7)}`,name:t.name.trim(),adapter:t.adapter||this.config.defaults.agent.adapter,role:t.role,config:{command:t.command,model:t.model,effort:t.effort,approval_policy:t.approval_policy??this.config.defaults.agent.approval_policy,max_turns:t.max_turns??this.config.defaults.agent.max_turns,timeout_ms:t.timeout_ms??this.config.defaults.agent.timeout_ms,stall_timeout_ms:t.stall_timeout_ms??this.config.defaults.agent.stall_timeout_ms,env:t.env,system_prompt:t.system_prompt,workspace_mode:t.workspace_mode,skills:t.skills},status:"idle",stats:{tasks_completed:0,tasks_failed:0,total_runs:0,total_runtime_ms:0}};return await this.agentStore.save(r),r}async list(){return this.agentStore.list()}async get(t){let e=await this.agentStore.get(t);if(!e)throw new g(t);return e}async remove(t){let e=await this.get(t);if(e.status==="running"){let r=await this.stateStore.read();if(Object.values(r.running).some(a=>a.agent_id===t))throw new c$2("Cannot remove a running agent. Stop it first.");e.status="idle",await this.agentStore.save(e);}await this.agentStore.delete(t);}async update(t,e){let r=await this.get(t);if(e.name!==void 0){if(!e.name.trim())throw new c$2("Agent name cannot be empty");let s=await this.agentStore.getByName(e.name.trim());if(s&&s.id!==t)throw new c$2(`Agent "${e.name}" already exists`);r.name=e.name.trim();}if(e.adapter!==void 0){let s=e.adapter.trim();if(!s)throw new c$2("Agent adapter cannot be empty");r.adapter=s;}return e.role!==void 0&&(r.role=e.role||void 0),e.model!==void 0&&(r.config.model=e.model||void 0),e.effort!==void 0&&(r.config.effort=e.effort||void 0),e.approval_policy!==void 0&&(r.config.approval_policy=e.approval_policy),await this.agentStore.save(r),r}async disable(t){return this.setStatus(t,"disabled")}async enable(t){return this.setStatus(t,"idle")}async setAutonomous(t,e){let r=await this.get(t);return r.autonomous=e,await this.agentStore.save(r),this.eventBus.emit({type:"agent:autonomous_toggled",agentId:t,autonomous:e}),r}async setStatus(t,e){let r=await this.get(t);return r.status=e,await this.agentStore.save(r),r}async updateStats(t,e){let r=await this.get(t);return Object.assign(r.stats,e),await this.agentStore.save(r),r}async findBestAgent(t){let e=await this.agentStore.list(),r=e.filter(n=>n.status==="idle");if(r.length===0)return null;if(t.assignee){let n=e.find(i=>i.id===t.assignee||i.name===t.assignee);return n&&n.status==="idle"?n:null}let s=t.labels?.length?t.labels.map(n=>n.toLowerCase()):void 0,a=r.map(n=>{let i=0;if(s&&n.config.skills?.length){let c=new Set(n.config.skills.map(d=>d.toLowerCase()));for(let d of s)c.has(d)&&(i+=50);}if(s&&n.role){let c=n.role.toLowerCase();s.some(d=>c.includes(d))&&(i+=30);}n.status==="idle"&&(i+=20);let o=n.stats.tasks_completed+n.stats.tasks_failed;return o>0&&(i+=Math.round(n.stats.tasks_completed/o*10)),{agent:n,score:i}});return a.sort((n,i)=>i.score-n.score),a[0]?.agent??null}};var J=class{constructor(t,e){this.runStore=t;this.eventBus=e;}async create(t){let e={id:`run_${nanoid(7)}`,task_id:t.taskId,agent_id:t.agentId,attempt:t.attempt,status:"preparing",started_at:new Date().toISOString(),workspace_path:t.workspacePath,prompt:t.prompt};return await this.runStore.save(e),e}async get(t){return this.runStore.get(t)}async start(t,e){let r=await this.runStore.get(t);if(!r)throw new Error(`Run not found: ${t}`);return r.status="running",r.pid=e,await this.runStore.save(r),this.eventBus.emit({type:"agent:started",agentId:r.agent_id,taskId:r.task_id,runId:t}),r}async finish(t,e,r,s){let a=await this.runStore.get(t);if(!a)throw new Error(`Run not found: ${t}`);return a.status=e,a.finished_at=new Date().toISOString(),a.tokens=r,a.error=s,await this.runStore.save(a),this.eventBus.emit({type:"agent:completed",runId:t,agentId:a.agent_id,success:e==="succeeded"}),a}async appendEvent(t,e){await this.runStore.appendEvent(t,e);}async listAll(){return this.runStore.listAll()}async listForTask(t){return this.runStore.listForTask(t)}async listForAgent(t){return this.runStore.listForAgent(t)}async readEvents(t){return this.runStore.readEvents(t)}async readEventsTail(t,e){return this.runStore.readEventsTail(t,e)}async getLastFailedRunContext(t){let r=(await this.runStore.listForTask(t)).filter(n=>n.status==="failed").sort((n,i)=>(i.finished_at??"").localeCompare(n.finished_at??""))[0];if(!r)return null;let s=r.error??"Unknown error",a="";try{a=(await this.runStore.readEventsTail(r.id,50)).filter(i=>i.type==="agent_output"||i.type==="error").map(i=>typeof i.data=="string"?i.data:JSON.stringify(i.data)).join(`
4
+ `);}catch{}return {error:s,output:a}}};var H=class{constructor(t,e,r,s){this.messageStore=t;this.agentStore=e;this.teamStore=r;this.eventBus=s;}async send(t){if(!t.body.trim())throw new c$2("Message body is required");let e=t.ttl_ms??864e5;if(e<=0||e>6048e5)throw new c$2(`TTL must be between 1ms and ${6048e5}ms`);if(!await this.agentStore.get(t.from_agent_id)&&t.from_agent_id!=="cli")throw new c$2(`Sender agent not found: ${t.from_agent_id}`);let s=new Date,a={channel:t.channel,from_agent_id:t.from_agent_id,subject:(t.subject||"(no subject)").slice(0,200),body:t.body.slice(0,4e3),created_at:s.toISOString(),expires_at:new Date(s.getTime()+e).toISOString(),status:"pending",team_id:t.team_id,reply_to:t.reply_to},n=[];if(t.channel==="broadcast"){let i=await this.agentStore.list();if(t.team_id){let d=await this.teamStore.get(t.team_id);if(d){let k=new Set(d.members.map(v=>v.agent_id));i=i.filter(v=>k.has(v.id));}}let c=i.filter(d=>d.id!==t.from_agent_id&&d.status!=="disabled").map(d=>({...a,id:`msg_${nanoid(7)}`,to_agent_id:d.id}));await Promise.all(c.map(d=>this.messageStore.save(d)));for(let d of c)n.push(d),this.emitSent(d);}else if(t.channel==="lead"){if(!t.team_id)throw new c$2("team_id is required for lead channel");let i=await this.teamStore.get(t.team_id);if(!i)throw new c$2(`Team not found: ${t.team_id}`);let o={...a,id:`msg_${nanoid(7)}`,to_agent_id:i.lead_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}else {if(!t.to_agent_id)throw new c$2("to_agent_id is required for direct messages");if(!await this.agentStore.get(t.to_agent_id))throw new c$2(`Recipient agent not found: ${t.to_agent_id}`);let o={...a,id:`msg_${nanoid(7)}`,to_agent_id:t.to_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}return n}async drainMailbox(t,e){let r=await this.messageStore.listPending(t);await Promise.all(r.map(s=>this.messageStore.markDelivered(s.id)));for(let s of r)this.eventBus.emit({type:"message:delivered",messageId:s.id,toAgentId:t,taskId:e});return r}async listAll(){return this.messageStore.list()}async listPendingForAgent(t){return this.messageStore.listPending(t)}async listForAgent(t){return (await this.messageStore.list()).filter(r=>r.to_agent_id===t||r.from_agent_id===t)}async purgeExpired(){return this.messageStore.purgeExpired()}emitSent(t){this.eventBus.emit({type:"message:sent",messageId:t.id,fromAgentId:t.from_agent_id,toAgentId:t.to_agent_id,channel:t.channel});}};var Ht={active:["paused","achieved","abandoned"],paused:["active","achieved","abandoned"],achieved:[],abandoned:[]},q=class{constructor(t,e,r,s,a){this.goalStore=t;this.eventBus=e;this.agentService=r;this.taskService=s;this.contextStore=a;}async create(t){if(!t.title.trim())throw new c$2("Goal title is required");let e=new Date().toISOString(),r={id:`goal_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"active",assignee:t.assignee,created_at:e,updated_at:e};return await this.goalStore.save(r),this.eventBus.emit({type:"goal:created",goalId:r.id,title:r.title}),r.assignee&&await this.enableAutonomous(r.assignee),r}async list(t){return this.goalStore.list(t)}async get(t){let e=await this.goalStore.get(t);if(!e)throw new j$2(t);return e}async updateStatus(t,e,r){let s=await this.get(t),a$1=s.status;if(!Ht[a$1].includes(e))throw new c$2(`Cannot transition goal from '${a$1}' to '${e}'`);if(e==="achieved"&&this.taskService){let i=(await this.taskService.list({goalId:t})).filter(o=>!b$2(o.status)&&!o.labels?.includes(a));if(i.length>0)if(r?.force){let o=i.filter(d=>d.status!=="in_progress"),c=i.filter(d=>d.status==="in_progress");if(await Promise.all(o.map(d=>this.taskService.cancel(d.id).catch(()=>{}))),c.length>0){let d=c.map(k=>`${k.id} (in_progress)`).join(", ");throw new k(t,c.length,d)}}else {let o=i.map(c=>`${c.id} (${c.status})`).join(", ");throw new k(t,i.length,o)}}return s.status=e,s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:status_changed",goalId:t,from:a$1,to:e}),s.assignee&&(e==="paused"?(await this.maybeDisableAutonomous(s.assignee),await this.cancelPendingAutonomousTasks(s.assignee)):e==="active"&&a$1==="paused"?await this.enableAutonomous(s.assignee):b$3(e)&&await this.maybeDisableAutonomous(s.assignee)),s}async update(t,e){let r=await this.get(t),s=r.assignee;if(e.title!==void 0){if(!e.title.trim())throw new c$2("Goal title cannot be empty");r.title=e.title.trim();}e.description!==void 0&&(r.description=e.description.trim()),e.assignee!==void 0&&(r.assignee=e.assignee||void 0),r.updated_at=new Date().toISOString(),await this.goalStore.save(r),this.eventBus.emit({type:"goal:updated",goalId:t});let a=r.assignee;if(a!==s){let n=[];a&&n.push(this.enableAutonomous(a)),s&&n.push(this.maybeDisableAutonomous(s)),await Promise.all(n);}return r}async delete(t){let e=await this.get(t),{assignee:r}=e;await this.goalStore.delete(t),this.eventBus.emit({type:"goal:deleted",goalId:t}),r&&await this.maybeDisableAutonomous(r);}async listTasksForGoal(t){return this.taskService?.list({goalId:t})??[]}async getProgressReport(t){return this.contextStore?(await this.contextStore.get(`${t}-progress`))?.value:void 0}async enableAutonomous(t){if(this.agentService)try{await this.agentService.setAutonomous(t,!0);}catch{}}async hasActiveGoalsForAgent(t){return (await this.goalStore.list({status:"active"})).some(r=>r.assignee===t)}async cancelPendingAutonomousTasks(t){if(this.taskService)try{let[e,r]=await Promise.all([this.taskService.list({status:"todo"}),this.taskService.list({status:"retrying"})]),s=[...e,...r].filter(a$1=>a$1.assignee===t&&a$1.labels?.includes(a));await Promise.all(s.map(a=>this.taskService.cancel(a.id).catch(()=>{})));}catch{}}async maybeDisableAutonomous(t){if(this.agentService)try{await this.hasActiveGoalsForAgent(t)||await this.agentService.setAutonomous(t,!1);}catch{}}};var bt={auto_claim:true,message_ttl_ms:864e5};var Y=class{constructor(t,e,r,s){this.teamStore=t;this.agentStore=e;this.taskStore=r;this.eventBus=s;}async create(t){if(!t.name.trim())throw new c$2("Team name is required");if(!await this.agentStore.get(t.lead_agent_id))throw new c$2(`Lead agent not found: ${t.lead_agent_id}`);if(await this.teamStore.getByName(t.name.trim()))throw new c$2(`Team "${t.name}" already exists`);let s=new Date().toISOString(),a={agent_id:t.lead_agent_id,role:"lead",joined_at:s},n=[];for(let o of t.member_agent_ids??[]){if(o===t.lead_agent_id)continue;if(!await this.agentStore.get(o))throw new c$2(`Member agent not found: ${o}`);n.push({agent_id:o,role:"member",joined_at:s});}let i={id:`team_${nanoid(7)}`,name:t.name.trim(),description:t.description,status:"active",members:[a,...n],task_pool:[],lead_agent_id:t.lead_agent_id,created_at:s,updated_at:s,config:{...bt,...t.config??{}}};await this.teamStore.save(i),this.eventBus.emit({type:"team:created",teamId:i.id,name:i.name,leadAgentId:i.lead_agent_id});for(let o of n)this.eventBus.emit({type:"team:member_joined",teamId:i.id,agentId:o.agent_id});return i}async get(t){let e=await this.teamStore.get(t);if(!e)throw new l(t);return e}async list(){return this.teamStore.list()}async join(t,e){let r=await this.get(t);if(r.members.some(a=>a.agent_id===e))throw new c$2(`Agent ${e} is already a member of team ${t}`);if(!await this.agentStore.get(e))throw new c$2(`Agent not found: ${e}`);return r.members.push({agent_id:e,role:"member",joined_at:new Date().toISOString()}),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),this.eventBus.emit({type:"team:member_joined",teamId:t,agentId:e}),r}async leave(t,e){let r=await this.get(t);if(e===r.lead_agent_id)throw new c$2("Lead cannot leave team. Disband the team or transfer lead first.");return r.members=r.members.filter(s=>s.agent_id!==e),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),this.eventBus.emit({type:"team:member_left",teamId:t,agentId:e}),r}async addTask(t,e){let r=await this.get(t);if(!await this.taskStore.get(e))throw new c$2(`Task not found: ${e}`);return r.task_pool.includes(e)||(r.task_pool.push(e),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),this.eventBus.emit({type:"team:task_added",teamId:t,taskId:e})),r}async removeTask(t,e){let r=await this.get(t);return r.task_pool=r.task_pool.filter(s=>s!==e),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),r}async setLead(t,e){let r=await this.get(t),s=r.members.find(n=>n.agent_id===e);if(!s)throw new c$2(`Agent ${e} is not a member of team ${t}`);let a=r.members.find(n=>n.agent_id===r.lead_agent_id);return a&&(a.role="member"),s.role="lead",r.lead_agent_id=e,r.updated_at=new Date().toISOString(),await this.teamStore.save(r),r}async disband(t){let e=await this.get(t);e.status="disbanded",e.updated_at=new Date().toISOString(),await this.teamStore.save(e),this.eventBus.emit({type:"team:disbanded",teamId:t});}async findTeamForAgent(t){return (await this.teamStore.list()).find(r=>r.status==="active"&&r.members.some(s=>s.agent_id===t))??null}};async function Yt(m){let t=new b(m.projectRoot),e=new R(t),r=new O,[,s]=await Promise.all([t.requireInit(),e.read()]),a=new C(t),n=new j(t),i=new M(t),o=new D(t),c=new G(t),d=new L(t),k=new B(t),v=new F(t),_=new N,b$1=new $(a,_,s,t,n),I=new U(n,o,_,s),z=new J(i,_),W=new H(d,n,v,_),p=new q(k,_,I,b$1,c),A=new Y(v,n,a,_);return {context:m,paths:t,config:s,taskStore:a,agentStore:n,runStore:i,stateStore:o,configStore:e,globalConfigStore:r,globalConfig:P,contextStore:c,messageStore:d,goalStore:k,teamStore:v,eventBus:_,taskService:b$1,agentService:I,runService:z,messageService:W,goalService:p,teamService:A}}async function zt(m){let t=await Yt(m),e=await t.globalConfigStore.read();t.globalConfig=e;let[{ProcessManager:r},{AdapterRegistry:s},{ClaudeAdapter:a},{CodexAdapter:n},{CursorAdapter:i},{ShellAdapter:o},{OpenCodeAdapter:c},{PiAdapter:d},{GrokAdapter:k},{AntigravityAdapter:v},{WorkspaceManager:_},{LiquidTemplateEngine:b},{SkillLoader:I},{Orchestrator:z},{DoctorService:W}]=await Promise.all([import('./process-manager-33H27MQF.js'),import('./registry-BO2PPRNG.js'),import('./claude-MK3KXPCV.js'),import('./codex-6TTUEMXU.js'),import('./cursor-RCZXGZ3O.js'),import('./shell-YEHU4QG6.js'),import('./opencode-3Q4KA3CM.js'),import('./pi-IDZOXOPE.js'),import('./grok-YX757Y3M.js'),import('./antigravity-O4HXTW5G.js'),import('./workspace-manager-ZI5SVXJU.js'),import('./template-engine-VLIOJ3WX.js'),import('./skill-loader-IGRIELEM.js'),import('./orchestrator-TY5HYXUH.js'),import('./doctor-service-PB7YBH3F.js')]),p=new r,A=new b,rt=new I,st=new _(m.projectRoot,t.paths.root,p),y=new s;y.register(new a(p)),y.register(new n(p)),y.register(new i(p)),y.register(new o(p)),y.register(new c(p)),y.register(new d(p)),y.register(new k(p)),y.register(new v(p));let It=new W(y,p,m.projectRoot),At=new z({taskStore:t.taskStore,agentStore:t.agentStore,runStore:t.runStore,stateStore:t.stateStore,adapterRegistry:y,workspaceManager:st,templateEngine:A,processManager:p,eventBus:t.eventBus,taskService:t.taskService,agentService:t.agentService,runService:t.runService,contextStore:t.contextStore,messageService:t.messageService,goalStore:t.goalStore,skillLoader:rt,config:t.config,projectRoot:m.projectRoot,lockPath:t.paths.lockPath});return {...t,processManager:p,adapterRegistry:y,workspaceManager:st,templateEngine:A,skillLoader:rt,doctorService:It,orchestrator:At}}async function Mr(m){return zt(m)}export{Mr as buildContainer,zt as buildFullContainer,Yt as buildLightContainer};
@@ -1,4 +1,4 @@
1
- import { buildFullPrompt, createStreamingEvents, extractTokens } from './chunk-RFN447MA.js';
1
+ import { buildFullPrompt, createStreamingEvents, extractTokens } from './chunk-CY5VX7G5.js';
2
2
  import './chunk-RHFRHCN5.js';
3
3
  import { classifyAdapterError } from './chunk-IESAV453.js';
4
4
  import './chunk-O2MSGW3V.js';
@@ -35,29 +35,28 @@ var CursorAdapter = class {
35
35
  };
36
36
  }
37
37
  execute(params) {
38
+ const fullPrompt = buildFullPrompt(params.systemPrompt, params.prompt);
38
39
  const args = [
39
40
  "-p",
40
41
  "--output-format",
41
42
  "stream-json",
42
43
  "--workspace",
43
44
  params.workspace,
44
- "--yolo"
45
+ "--yolo",
45
46
  // bypass interactive prompts for autonomous agents
47
+ "--trust"
48
+ // ORCH creates fresh worktrees that have not been trusted interactively
46
49
  ];
47
50
  if (params.config.model) {
48
51
  args.push("--model", params.config.model);
49
52
  }
53
+ args.push(fullPrompt);
50
54
  const { process: proc, pid } = this.processManager.spawn(this.resolvedCommand, args, {
51
55
  cwd: params.workspace,
52
56
  env: { ...process.env, ...params.env },
53
57
  signal: params.signal,
54
- stdio: ["pipe", "pipe", "pipe"]
55
- // stdin must be 'pipe' to send prompt
58
+ stdio: ["ignore", "pipe", "pipe"]
56
59
  });
57
- if (proc.stdin) {
58
- proc.stdin.write(buildFullPrompt(params.systemPrompt, params.prompt));
59
- proc.stdin.end();
60
- }
61
60
  const events = createStreamingEvents(proc, parseCursorEvent, "Cursor agent", params.signal);
62
61
  return { pid, events };
63
62
  }
@@ -95,5 +94,5 @@ function parseCursorEvent(line) {
95
94
  }
96
95
 
97
96
  export { CursorAdapter };
98
- //# sourceMappingURL=cursor-O6M6XOMT.js.map
99
- //# sourceMappingURL=cursor-O6M6XOMT.js.map
97
+ //# sourceMappingURL=cursor-E7X5BWGB.js.map
98
+ //# sourceMappingURL=cursor-E7X5BWGB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/adapters/cursor.ts"],"names":[],"mappings":"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","file":"cursor-E7X5BWGB.js","sourcesContent":["/**\n * Cursor Agent adapter.\n *\n * Spawns `cursor-agent` (Cursor's headless agent CLI) with `--output-format stream-json`.\n * Falls back to `agent` command if `cursor-agent` is not found.\n * Parses JSON-lines from stdout into AgentEvent stream.\n *\n * Note: This requires Cursor Agent CLI, not the regular `cursor` IDE command.\n * Install via: npm i -g @anthropic-ai/cursor-agent (when available)\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { extractTokens, createStreamingEvents, buildFullPrompt } from './utils.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\n/** Try multiple command names and return the first that works */\nasync function findCommand(): Promise<{ command: string; version: string } | null> {\n for (const cmd of ['cursor-agent', 'agent']) {\n try {\n const { stdout } = await execFileAsync(cmd, ['--version']);\n return { command: cmd, version: stdout.trim() };\n } catch {\n // try next\n }\n }\n return null;\n}\n\nexport class CursorAdapter implements IAgentAdapter {\n readonly kind = 'cursor';\n\n private resolvedCommand: string = 'cursor-agent';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n const found = await findCommand();\n if (found) {\n this.resolvedCommand = found.command;\n return { ok: true, version: found.version };\n }\n return {\n ok: false,\n error: 'Cursor Agent CLI not found. The headless agent CLI is required (cursor-agent or agent).',\n errorKind: AdapterErrorKind.ADAPTER_NOT_FOUND,\n };\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n // Cursor print mode requires the prompt as a positional argument. Unlike\n // Codex, it does not support reading the prompt from stdin.\n const fullPrompt = buildFullPrompt(params.systemPrompt, params.prompt);\n const args = [\n '-p',\n '--output-format', 'stream-json',\n '--workspace', params.workspace,\n '--yolo', // bypass interactive prompts for autonomous agents\n '--trust', // ORCH creates fresh worktrees that have not been trusted interactively\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n args.push(fullPrompt);\n\n const { process: proc, pid } = this.processManager.spawn(this.resolvedCommand, args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n const events = createStreamingEvents(proc, parseCursorEvent, 'Cursor agent', 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 parseCursorEvent(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\n // Cursor stream-json uses the same format as Claude stream-json\n switch (parsed.type) {\n case 'assistant':\n return { type: 'output', timestamp, data: (parsed.message as unknown) ?? parsed };\n case 'tool_use':\n return { type: 'tool_call', timestamp, data: parsed };\n case 'tool_result':\n return { type: 'output', timestamp, data: parsed };\n case 'error': {\n const errData = (parsed.error as unknown) ?? parsed;\n const errMsg = typeof errData === 'string' ? errData : JSON.stringify(errData);\n return { type: 'error', timestamp, data: errData, errorKind: classifyAdapterError(errMsg) };\n }\n case 'result': {\n const tokens = extractTokens(parsed);\n return { type: 'done', timestamp, data: parsed, tokens };\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"]}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import {a,e,b}from'./chunk-JEMJFAMY.js';import'./chunk-P4JTJBWO.js';import {o}from'./chunk-LRYVT4D4.js';import'./chunk-6MJ7V6VY.js';import {execFile}from'child_process';import {promisify}from'util';var g=promisify(execFile);async function f(){for(let o of ["cursor-agent","agent"])try{let{stdout:e}=await g(o,["--version"]);return {command:o,version:e.trim()}}catch{}return null}var u=class{constructor(e){this.processManager=e;}kind="cursor";resolvedCommand="cursor-agent";async test(){let e=await f();return e?(this.resolvedCommand=e.command,{ok:true,version:e.version}):{ok:false,error:"Cursor Agent CLI not found. The headless agent CLI is required (cursor-agent or agent).",errorKind:"adapter_not_found"}}execute(e$1){let r=a(e$1.systemPrompt,e$1.prompt),t=["-p","--output-format","stream-json","--workspace",e$1.workspace,"--yolo","--trust"];e$1.config.model&&t.push("--model",e$1.config.model),t.push(r);let{process:n,pid:p}=this.processManager.spawn(this.resolvedCommand,t,{cwd:e$1.workspace,env:{...process.env,...e$1.env},signal:e$1.signal,stdio:["ignore","pipe","pipe"]}),d=e(n,y,"Cursor agent",e$1.signal);return {pid:p,events:d}}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();switch(e.type){case "assistant":return {type:"output",timestamp:r,data:e.message??e};case "tool_use":return {type:"tool_call",timestamp:r,data:e};case "tool_result":return {type:"output",timestamp:r,data:e};case "error":{let t=e.error??e,n=typeof t=="string"?t:JSON.stringify(t);return {type:"error",timestamp:r,data:t,errorKind:o(n)}}case "result":{let t=b(e);return {type:"done",timestamp:r,data:e,tokens:t}}default:return {type:"output",timestamp:r,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:o$1}}}export{u as CursorAdapter};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$7}from'./chunk-HMMPM7MF.js';import {a as a$4}from'./chunk-SJG3HXO5.js';import {a as a$5}from'./chunk-AOJZCMUE.js';import {a as a$6}from'./chunk-YKUO5PD4.js';import {p,c,q}from'./chunk-64WUDYEM.js';import {b}from'./chunk-6E6DC7OE.js';import'./chunk-ZMLF5HI5.js';import {a as a$1}from'./chunk-CDFA4IIQ.js';import {a as a$2}from'./chunk-DEHFYICU.js';import {a as a$3}from'./chunk-ITMAWW3J.js';import'./chunk-C7C7Q7XO.js';import'./chunk-P4JTJBWO.js';import'./chunk-LRYVT4D4.js';import {a}from'./chunk-6MJ7V6VY.js';import a$8 from'chalk';function E(v,t){v.command("doctor").description("Check adapters and dependencies").action(async()=>{let c$1,n,d=false;if(t)c$1=t.doctorService,n=t.paths,d=true;else {let e=new a,o=new a$1;o.register(new a$2(e)),o.register(new a$3(e)),o.register(new a$4(e)),o.register(new a$5(e)),o.register(new a$6(e)),c$1=new a$7(o,e,process.cwd()),n=new b(process.cwd());}console.log(),console.log(` ${p("orch doctor")} \xB7 checking adapters and dependencies`),console.log();let i=await c$1.runAll();if(t?.context.json){console.log(JSON.stringify(i,null,2));return}for(let e of i.checks){let o=e.status==="ok"?a$8.ansi256(72)(c("done")):e.status==="fail"?a$8.ansi256(167)(c("failed")):q("\u2014"),l=e.detail?q(` ${e.detail}`):"";console.log(` ${o} ${e.name.padEnd(12)}${l}`);}if(n){let e=await n.isInitialized();if(e&&d){let o=await t.agentService.list(),l=await t.taskService.list();console.log(),console.log(` ${a$8.ansi256(72)(c("done"))} .orchestry/ ${q(`exists \xB7 ${o.length} agents \xB7 ${l.length} tasks`)}`);}else e||(console.log(),console.log(` ${a$8.ansi256(167)(c("failed"))} .orchestry/ ${q("not found \u2014 run: orch init")}`));}console.log(),console.log(` ${i.adaptersReady} of ${i.adaptersTotal} adapters ready`),console.log();});}export{E as registerDoctorCommand};
2
+ import {a as a$7}from'./chunk-HMMPM7MF.js';import {a as a$4}from'./chunk-COJCLTPD.js';import {a as a$5}from'./chunk-AOJZCMUE.js';import {a as a$6}from'./chunk-6ZRSU2RC.js';import {p,c,q}from'./chunk-64WUDYEM.js';import {b}from'./chunk-6E6DC7OE.js';import'./chunk-ZMLF5HI5.js';import {a as a$1}from'./chunk-CDFA4IIQ.js';import {a as a$2}from'./chunk-LWYSQ32X.js';import {a as a$3}from'./chunk-5KNZ2OEV.js';import'./chunk-JEMJFAMY.js';import'./chunk-P4JTJBWO.js';import'./chunk-LRYVT4D4.js';import {a}from'./chunk-6MJ7V6VY.js';import a$8 from'chalk';function E(v,t){v.command("doctor").description("Check adapters and dependencies").action(async()=>{let c$1,n,d=false;if(t)c$1=t.doctorService,n=t.paths,d=true;else {let e=new a,o=new a$1;o.register(new a$2(e)),o.register(new a$3(e)),o.register(new a$4(e)),o.register(new a$5(e)),o.register(new a$6(e)),c$1=new a$7(o,e,process.cwd()),n=new b(process.cwd());}console.log(),console.log(` ${p("orch doctor")} \xB7 checking adapters and dependencies`),console.log();let i=await c$1.runAll();if(t?.context.json){console.log(JSON.stringify(i,null,2));return}for(let e of i.checks){let o=e.status==="ok"?a$8.ansi256(72)(c("done")):e.status==="fail"?a$8.ansi256(167)(c("failed")):q("\u2014"),l=e.detail?q(` ${e.detail}`):"";console.log(` ${o} ${e.name.padEnd(12)}${l}`);}if(n){let e=await n.isInitialized();if(e&&d){let o=await t.agentService.list(),l=await t.taskService.list();console.log(),console.log(` ${a$8.ansi256(72)(c("done"))} .orchestry/ ${q(`exists \xB7 ${o.length} agents \xB7 ${l.length} tasks`)}`);}else e||(console.log(),console.log(` ${a$8.ansi256(167)(c("failed"))} .orchestry/ ${q("not found \u2014 run: orch init")}`));}console.log(),console.log(` ${i.adaptersReady} of ${i.adaptersTotal} adapters ready`),console.log();});}export{E as registerDoctorCommand};
package/dist/index.d.ts CHANGED
@@ -904,9 +904,10 @@ declare class AgentService {
904
904
  remove(id: string): Promise<void>;
905
905
  update(id: string, fields: {
906
906
  name?: string;
907
+ adapter?: string;
907
908
  role?: string;
908
909
  model?: string;
909
- effort?: Agent['config']['effort'];
910
+ effort?: Agent['config']['effort'] | '';
910
911
  approval_policy?: Agent['config']['approval_policy'];
911
912
  }): Promise<Agent>;
912
913
  disable(id: string): Promise<Agent>;