@oxgeneral/orch 0.3.2 → 0.3.4

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 (128) hide show
  1. package/dist/App-RKAPZNZO.js +6682 -0
  2. package/dist/agent-KBTLGGCT.js +183 -0
  3. package/dist/agent-shop-YN2BSLHM.js +2 -0
  4. package/dist/chunk-2C2TFQ7K.js +136 -0
  5. package/dist/chunk-45K2XID7.js +29 -0
  6. package/dist/{shell-IH2MMTVP.js → chunk-52BFUGDD.js} +8 -6
  7. package/dist/chunk-7X2GI5OV.js +181 -0
  8. package/dist/{chunk-HSBYJ5C5.js → chunk-A36WAF2S.js} +89 -2
  9. package/dist/chunk-CHIP7O6V.js +83 -0
  10. package/dist/{claude-RIB3RQS5.js → chunk-D6RFF3KN.js} +12 -9
  11. package/dist/{chunk-BCPUTULS.js → chunk-DAVHOWGD.js} +188 -16
  12. package/dist/chunk-FRTKB575.js +87 -0
  13. package/dist/chunk-HXYAZGLP.js +15 -0
  14. package/dist/chunk-I3SMISEF.js +29 -0
  15. package/dist/chunk-K6DMQERQ.js +89 -0
  16. package/dist/chunk-LV6GDBBI.js +297 -0
  17. package/dist/chunk-NLQAJ7TW.js +147 -0
  18. package/dist/chunk-NLQAJ7TW.js.map +1 -0
  19. package/dist/chunk-P6ATSXGL.js +107 -0
  20. package/dist/chunk-PNE6LQRF.js +5 -0
  21. package/dist/{chunk-MGFMVPRD.js → chunk-S3QYSBW4.js} +11 -4
  22. package/dist/chunk-S3QYSBW4.js.map +1 -0
  23. package/dist/chunk-U2VDNUZL.js +52 -0
  24. package/dist/{chunk-QEEM67OA.js → chunk-UIJYU3J7.js} +3 -3
  25. package/dist/{chunk-QEEM67OA.js.map → chunk-UIJYU3J7.js.map} +1 -1
  26. package/dist/{chunk-2UC4SVJB.js → chunk-VMDQVRBR.js} +22 -8
  27. package/dist/chunk-VMDQVRBR.js.map +1 -0
  28. package/dist/chunk-W6RSVMXR.js +66 -0
  29. package/dist/claude-INM52PTH.js +88 -0
  30. package/dist/claude-INM52PTH.js.map +1 -0
  31. package/dist/claude-NHUNA5RZ.js +5 -0
  32. package/dist/cli.js +199 -1
  33. package/dist/clipboard-service-RTDUUQQU.js +200 -0
  34. package/dist/{codex-VBUSA2GJ.js → codex-DIXT44JR.js} +17 -11
  35. package/dist/codex-QGH2GRV6.js +125 -0
  36. package/dist/codex-QGH2GRV6.js.map +1 -0
  37. package/dist/config-OTAVSMOD.js +75 -0
  38. package/dist/container-LJU4QNDH.js +1594 -0
  39. package/dist/context-OL4BVUV5.js +83 -0
  40. package/dist/{cursor-4QIOTDBW.js → cursor-C3TR2IJC.js} +11 -8
  41. package/dist/cursor-KQJTQ73D.js +99 -0
  42. package/dist/cursor-KQJTQ73D.js.map +1 -0
  43. package/dist/doctor-V2FPS236.js +67 -0
  44. package/dist/doctor-service-TPOMFAIG.js +2 -0
  45. package/dist/goal-FMYYN2FR.js +138 -0
  46. package/dist/index.d.ts +64 -41
  47. package/dist/index.js +23 -14
  48. package/dist/index.js.map +1 -1
  49. package/dist/init-U7MCIOB2.js +165 -0
  50. package/dist/logs-PHPYWQ6I.js +207 -0
  51. package/dist/msg-FUWWLEKM.js +95 -0
  52. package/dist/orchestrator-ADO66XZ3.js +5 -0
  53. package/dist/{orchestrator-FGGXK3N3.js.map → orchestrator-ADO66XZ3.js.map} +1 -1
  54. package/dist/orchestrator-E3FQ4SOE.js +1424 -0
  55. package/dist/process-manager-HUVNAPQV.js +2 -0
  56. package/dist/registry-PQWRVNF2.js +2 -0
  57. package/dist/run-N72G5V2H.js +95 -0
  58. package/dist/shell-3S4VLYEG.js +4 -0
  59. package/dist/shell-JXOPKDXH.js +221 -0
  60. package/dist/shell-JXOPKDXH.js.map +1 -0
  61. package/dist/shop-picker-2HY67UWP.js +79 -0
  62. package/dist/status-RZWN2C6C.js +56 -0
  63. package/dist/task-2TJW6Z7O.js +221 -0
  64. package/dist/team-PFLP4PPL.js +97 -0
  65. package/dist/template-engine-4IZKRRHG.js +3 -0
  66. package/dist/tui-IM3YUUVD.js +245 -0
  67. package/dist/update-YLP7FPNY.js +64 -0
  68. package/dist/update-check-4YKLGBFB.js +2 -0
  69. package/dist/{workspace-manager-T6AXG7XL.js → workspace-manager-EVD67GCG.js} +4 -4
  70. package/dist/{workspace-manager-T6AXG7XL.js.map → workspace-manager-EVD67GCG.js.map} +1 -1
  71. package/dist/workspace-manager-JM6U7JOH.js +215 -0
  72. package/package.json +1 -1
  73. package/readme.md +9 -2
  74. package/scripts/postinstall.js +44 -2
  75. package/dist/App-YJM5QGP7.js +0 -19
  76. package/dist/agent-S4DKSX63.js +0 -9
  77. package/dist/agent-shop-D2RS4BZK.js +0 -2
  78. package/dist/chunk-2UC4SVJB.js.map +0 -1
  79. package/dist/chunk-5AJ4LYO5.js +0 -8
  80. package/dist/chunk-6MJ7V6VY.js +0 -2
  81. package/dist/chunk-CDFA4IIQ.js +0 -2
  82. package/dist/chunk-CHRW4CLD.js +0 -2
  83. package/dist/chunk-GZ2Q56YZ.js +0 -2
  84. package/dist/chunk-HMMPM7MF.js +0 -3
  85. package/dist/chunk-HXOMNULD.js +0 -2
  86. package/dist/chunk-IQXRQBUK.js +0 -83
  87. package/dist/chunk-IQXRQBUK.js.map +0 -1
  88. package/dist/chunk-L26TK7Y5.js +0 -2
  89. package/dist/chunk-L3FYR45M.js +0 -2
  90. package/dist/chunk-LXNRCJ22.js +0 -2
  91. package/dist/chunk-MGFMVPRD.js.map +0 -1
  92. package/dist/chunk-MNXU3KCD.js +0 -2
  93. package/dist/chunk-PJ5DKXGR.js +0 -2
  94. package/dist/chunk-UMZEA3JT.js +0 -5
  95. package/dist/chunk-UW6GUUE6.js +0 -3
  96. package/dist/chunk-ZA5Z33GO.js +0 -11
  97. package/dist/claude-E36EGXUV.js +0 -2
  98. package/dist/claude-RIB3RQS5.js.map +0 -1
  99. package/dist/clipboard-service-PDTSZIR5.js +0 -25
  100. package/dist/codex-OTZKVESD.js +0 -2
  101. package/dist/codex-VBUSA2GJ.js.map +0 -1
  102. package/dist/config-CCSS2P7R.js +0 -2
  103. package/dist/container-OIXLFSX2.js +0 -6
  104. package/dist/context-GSMQHQES.js +0 -7
  105. package/dist/cursor-3DJA6LWS.js +0 -2
  106. package/dist/cursor-4QIOTDBW.js.map +0 -1
  107. package/dist/doctor-KBK5JZBZ.js +0 -2
  108. package/dist/doctor-service-PB7YBH3F.js +0 -2
  109. package/dist/goal-RFKFPR7M.js +0 -8
  110. package/dist/init-WRDFAFS2.js +0 -53
  111. package/dist/logs-5QHJWMEG.js +0 -12
  112. package/dist/msg-4SCLBO4K.js +0 -9
  113. package/dist/orchestrator-FGGXK3N3.js +0 -5
  114. package/dist/orchestrator-R7IWZUT6.js +0 -13
  115. package/dist/process-manager-33H27MQF.js +0 -2
  116. package/dist/registry-BO2PPRNG.js +0 -2
  117. package/dist/run-HSHRELOP.js +0 -3
  118. package/dist/shell-EOJBDWTH.js +0 -2
  119. package/dist/shell-IH2MMTVP.js.map +0 -1
  120. package/dist/shop-picker-LE3SKFOX.js +0 -5
  121. package/dist/status-DLBNWSWM.js +0 -2
  122. package/dist/task-J6ZN7ALI.js +0 -20
  123. package/dist/team-MSIBKOQC.js +0 -4
  124. package/dist/template-engine-ONIDVD4F.js +0 -2
  125. package/dist/tui-LW7WIDE3.js +0 -2
  126. package/dist/update-PC2ENCKU.js +0 -2
  127. package/dist/update-check-HGMBDYHL.js +0 -2
  128. package/dist/workspace-manager-KOOYTO7E.js +0 -3
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {b,a}from'./chunk-L3FYR45M.js';import'./chunk-6MJ7V6VY.js';import {execFile}from'child_process';import {promisify}from'util';var m=promisify(execFile),p=class{constructor(e){this.processManager=e;}kind="codex";async test(){try{let{stdout:e}=await m("codex",["--version"]);return {ok:!0,version:e.trim()}}catch{return {ok:false,error:"Codex CLI not found. Install: npm i -g @openai/codex"}}}execute(e){let t=["exec","--json","--sandbox","danger-full-access"];e.config.model&&t.push("--model",e.config.model),t.push("-");let{process:a,pid:r}=this.processManager.spawn("codex",t,{cwd:e.workspace,env:{...process.env,...e.env},signal:e.signal,stdio:["pipe","pipe","pipe"]});a.stdin&&(a.stdin.write(e.prompt),a.stdin.end());let n=b(a,g,"Codex",e.signal);return {pid:r,events:n}}async stop(e){await this.processManager.killWithGrace(e);}};function g(s){if(!s.trim())return null;try{let e=JSON.parse(s),t=new Date().toISOString();switch(e.type??""){case "thread.started":return {type:"output",timestamp:t,data:e};case "turn.started":return {type:"output",timestamp:t,data:e};case "turn.completed":{let r=a(e);return {type:"done",timestamp:t,data:e,tokens:r}}case "turn.failed":{let r=a(e);return {type:"error",timestamp:t,data:e,tokens:r}}case "item.started":case "item.completed":{let r=e.item??{},n=r.type??"";if(n==="agent_message")return {type:"output",timestamp:t,data:r};if(n==="reasoning")return {type:"output",timestamp:t,data:r};if(n==="command_execution")return {type:"command",timestamp:t,data:r};if(n==="file_change"){let u=(Array.isArray(r.changes)?r.changes:[]).map(c=>typeof c.path=="string"?c.path:"").filter(Boolean);return {type:"file_change",timestamp:t,data:{paths:u,raw:r}}}return n==="tool_use"?{type:"tool_call",timestamp:t,data:r}:n==="tool_result"?{type:"output",timestamp:t,data:r}:n==="error"?{type:"error",timestamp:t,data:r}:{type:"output",timestamp:t,data:r}}case "error":return {type:"error",timestamp:t,data:e.error??e};default:return {type:"output",timestamp:t,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:s}}}export{p as CodexAdapter};
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/infrastructure/adapters/codex.ts"],"names":[],"mappings":"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","file":"codex-VBUSA2GJ.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 } from './utils.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 {\n return {\n ok: false,\n error: 'Codex CLI not found. Install: npm i -g @openai/codex',\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\n if (proc.stdin) {\n proc.stdin.write(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 return { type: 'error', timestamp, data: parsed, tokens };\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 return { type: 'error', timestamp, data: item };\n }\n return { type: 'output', timestamp, data: item };\n }\n\n case 'error':\n return { type: 'error', timestamp, data: (parsed.error as unknown) ?? parsed };\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,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {q,j,i}from'./chunk-L26TK7Y5.js';import {spawn}from'child_process';var d=["all","text","tools","errors","events"];function S(f,o){let e=f.command("config").description("Manage configuration");e.command("get <key>").description("Get a config value (dot notation)").action(async t=>{await o.paths.requireInit();let i=await o.configStore.get(t);o.context.json?console.log(JSON.stringify({key:t,value:i})):console.log(` ${q(t)} = ${JSON.stringify(i)}`);}),e.command("set <key> <value>").description("Set a config value (dot notation)").action(async(t,i)=>{await o.paths.requireInit();let n;try{n=JSON.parse(i);}catch{n=i;}await o.configStore.set(t,n),j(`${t} = ${JSON.stringify(n)}`);}),e.command("edit").description("Open config.yml in $EDITOR").action(async()=>{await o.paths.requireInit();let i=(process.env.EDITOR||process.env.VISUAL||"vi").split(/\s+/),n=spawn(i[0],[...i.slice(1),o.paths.configPath],{stdio:"inherit"});await new Promise((m,l)=>{n.on("close",g=>{g===0?m():l(new Error(`Editor exited with code ${g}`));}),n.on("error",l);});});let a=e.command("global").description("Manage global settings (~/.orchestry/global.yml)");a.command("get <key>").description("Get a global config value").action(async t=>{let i=await o.globalConfigStore.read(),n=t==="activity_filter"?i.tui.activity_filter:void 0;o.context.json?console.log(JSON.stringify({key:t,value:n})):console.log(` ${q(t)} = ${JSON.stringify(n)}`);}),a.command("set <key> <value>").description("Set a global config value").action(async(t,i$1)=>{if(t==="activity_filter"){if(!d.includes(i$1)){i(`Invalid value "${i$1}". Valid: ${d.join(", ")}`);return}await o.globalConfigStore.set("activity_filter",i$1),j(`${t} = ${i$1}`);}else i(`Unknown global config key: ${t}`);}),a.command("show").description("Show all global settings").action(async()=>{let t=await o.globalConfigStore.read();o.context.json?console.log(JSON.stringify(t)):console.log(` ${q("tui.activity_filter")} = ${t.tui.activity_filter}`);});}export{S as registerConfigCommand};
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env node
2
- import {a as a$2}from'./chunk-PJ5DKXGR.js';import {b as b$2,c as c$2}from'./chunk-HXOMNULD.js';import {a as a$1,b as b$3}from'./chunk-LXNRCJ22.js';import {a}from'./chunk-CHRW4CLD.js';import {l,b as b$1,c,i as i$1,k as k$1,e,d,f as f$1,g as g$1,h,j as j$2}from'./chunk-ZA5Z33GO.js';import {c as c$1,k,j as j$1,g,f,i}from'./chunk-GZ2Q56YZ.js';import Y,{mkdir}from'fs/promises';import {createReadStream}from'fs';import z from'path';import {homedir}from'os';import {nanoid}from'nanoid';var b=class{constructor(t){this.paths=t;}async list(t){await i$1(this.paths.tasksDir);let e=await k$1(this.paths.tasksDir,".yml");return (await Promise.all(e.map(r=>{let n=r.replace(".yml","");return b$1(this.paths.taskPath(n))}))).filter(r=>r!==null&&(!t?.status||r.status===t.status)&&(!t?.goalId||r.goalId===t.goalId)).sort((r,n)=>{let i=ct(r.status)-ct(n.status);if(i!==0)return i;let o=n.updated_at??"",l=r.updated_at??"";return o<l?-1:o>l?1:0})}async get(t){return b$1(this.paths.taskPath(t))}async save(t){await i$1(this.paths.tasksDir),await c(this.paths.taskPath(t.id),t);}async delete(t){try{await Y.unlink(this.paths.taskPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};function ct(m){return {in_progress:0,retrying:1,review:2,todo:3,done:4,failed:5,cancelled:6}[m]}var A=class{constructor(t){this.paths=t;}async list(){await i$1(this.paths.agentsDir);let t=await k$1(this.paths.agentsDir,".yml");return (await Promise.all(t.map(s=>{let a=s.replace(".yml","");return b$1(this.paths.agentPath(a))}))).filter(s=>s!==null)}async get(t){return b$1(this.paths.agentPath(t))}async getByName(t){return (await this.list()).find(s=>s.name===t)??null}async save(t){await i$1(this.paths.agentsDir),await c(this.paths.agentPath(t.id),t);}async delete(t){try{await Y.unlink(this.paths.agentPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var E=class{constructor(t){this.paths=t;}async save(t){await i$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 i$1(this.paths.runsDir),await f$1(this.paths.runEventsPath(t),e);}async readEvents(t){return g$1(this.paths.runEventsPath(t))}async readEventsTail(t,e){return h(this.paths.runEventsPath(t),e)}async*streamEvents(t,e){let s=this.paths.runEventsPath(t),a=Date.now()+3e4;for(;!e?.aborted&&Date.now()<a&&!await j$2(s);)await new Promise(i=>setTimeout(i,100));if(e?.aborted||Date.now()>=a)return;let r=createReadStream(s),{readLines:n}=await import('./process-manager-33H27MQF.js');try{for await(let i of n(r)){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{r.destroy();}}async listFiltered(t){await i$1(this.paths.runsDir);let e=await k$1(this.paths.runsDir,".json"),s=64,a=[];for(let r=0;r<e.length;r+=s){let n=e.slice(r,r+s),i=await Promise.all(n.map(o=>{let l=o.endsWith(".json")?o.slice(0,-5):o;return d(this.paths.runPath(l))}));for(let o of i)o!==null&&t(o)&&a.push(o);}return a.sort((r,n)=>new Date(n.started_at).getTime()-new Date(r.started_at).getTime())}};var U={version:1,running:{},claimed:new Set,retry_queue:[],stats:{total_runs:0,total_tasks_completed:0,total_tasks_failed:0,total_tokens:{input:0,output:0,total:0},total_runtime_ms:0}};var I=class{constructor(t){this.paths=t;}async read(){let t=await d(this.paths.statePath);if(!t)return structuredClone(U);let e=structuredClone(U);return {version:t.version??e.version,pid:t.pid,started_at:t.started_at,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:t.stats?.total_tokens??e.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 x=class{constructor(t){this.paths=t;}async read(){let t=await b$1(this.paths.configPath);return lt(a$2,t??{})}async write(t){await c(this.paths.configPath,t);}async get(t){let e=await this.read();return Pt(e,t)}async set(t,e){let s=await this.read();Tt(s,t,e),await this.write(s);}};function Pt(m,t){let e=t.split("."),s=m;for(let a of e){if(s==null||typeof s!="object")return;s=s[a];}return s}function Tt(m,t,e){let s=t.split("."),a=m;for(let n=0;n<s.length-1;n++){let i=s[n];(typeof a[i]!="object"||a[i]===null)&&(a[i]={}),a=a[i];}let r=s[s.length-1];a[r]=e;}function lt(m,t){let e={...m};for(let s of Object.keys(t)){let a=t[s],r=e[s];a!=null&&typeof a=="object"&&!Array.isArray(a)&&typeof r=="object"&&r!==null&&!Array.isArray(r)?e[s]=lt(r,a):e[s]=a;}return e}var q={tui:{activity_filter:"all"}};var ut=z.join(homedir(),".orchestry"),gt=z.join(ut,"global.yml"),C=class{async read(){let t=await b$1(gt);return t?{tui:{activity_filter:t.tui?.activity_filter??q.tui.activity_filter}}:{...q}}async write(t){await mkdir(ut,{recursive:true}),await c(gt,t);}async set(t,e){let s=await this.read();s.tui[t]=e,await this.write(s);}};var j=class m{constructor(t){this.paths=t;}async get(t){let e=await d(this.paths.contextPath(t));return e?pt(e)?(await this.delete(t),null):e:null}static MAX_TTL_MS=720*60*60*1e3;async set(t,e$1,s){if(s!==void 0&&(!Number.isFinite(s)||s<=0||s>m.MAX_TTL_MS))throw new Error(`TTL must be a positive number up to ${m.MAX_TTL_MS}ms (30 days)`);await i$1(this.paths.contextDir);let a=new Date().toISOString(),r=await d(this.paths.contextPath(t)),n={key:t,value:e$1,created_at:r?.created_at??a,updated_at:a,ttl_ms:s,expires_at:s?new Date(Date.now()+s).toISOString():void 0};await e(this.paths.contextPath(t),n);}async delete(t){try{await Y.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}async list(){await i$1(this.paths.contextDir);let t=await k$1(this.paths.contextDir,".json"),e=await Promise.all(t.map(a=>{let r=a.replace(".json","");return d(this.paths.contextPath(r))})),s=[];for(let a of e)if(a){if(pt(a)){await this.delete(a.key);continue}s.push(a);}return s.sort((a,r)=>a.key.localeCompare(r.key))}async getAll(){let t=await this.list(),e={};for(let s of t)e[s.key]=s.value;return e}};function pt(m){return m.expires_at?new Date(m.expires_at).getTime()<Date.now():false}var R=class{constructor(t){this.paths=t;}async save(t){await i$1(this.paths.messagesDir),await e(this.paths.messagePath(t.id),t);}async get(t){return d(this.paths.messagePath(t))}async list(){let t=await k$1(this.paths.messagesDir,".json");return (await Promise.all(t.map(s=>d(this.paths.messagePath(s.replace(".json","")))))).filter(s=>s!==null).sort((s,a)=>s.created_at.localeCompare(a.created_at))}async listPending(t){let e=await this.list(),s=Date.now();return e.filter(a=>a.status!=="pending"||a.expires_at&&new Date(a.expires_at).getTime()<s?false:a.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));}async delete(t){try{await Y.unlink(this.paths.messagePath(t));}catch(e){if(e.code!=="ENOENT")throw e}}async purgeExpired(){let t=await this.list(),e=Date.now(),s=t.filter(a=>{let r=a.expires_at&&new Date(a.expires_at).getTime()<e,n=a.delivered_at&&e-new Date(a.delivered_at).getTime()>36e5;return r||n});return await Promise.all(s.map(a=>this.delete(a.id))),s.length}};var D=class{constructor(t){this.paths=t;}async list(t){let e=await k$1(this.paths.goalsDir,".yml");return (await Promise.all(e.map(r=>{let n=r.replace(".yml","");return b$1(this.paths.goalPath(n))}))).filter(r=>r!==null&&(!t?.status||r.status===t.status)).sort((r,n)=>{let i=c$2[r.status]-c$2[n.status];if(i!==0)return i;let o=n.updated_at??"",l=r.updated_at??"";return o<l?-1:o>l?1:0})}async get(t){return b$1(this.paths.goalPath(t))}async save(t){await c(this.paths.goalPath(t.id),t);}async delete(t){try{await Y.unlink(this.paths.goalPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var O=class{constructor(t){this.paths=t;}async save(t){await i$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(s=>s.name===t)??null}async list(){await i$1(this.paths.teamsDir);let t=await k$1(this.paths.teamsDir,".yml");return (await Promise.all(t.map(s=>b$1(this.paths.teamPath(s.replace(".yml","")))))).filter(s=>s!==null)}async delete(t){try{await Y.unlink(this.paths.teamPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var M=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 s=this.handlers.get(t);return s.add(e),this.maxListeners>0&&s.size>this.maxListeners&&!this.warnedTypes.has(t)&&(this.warnedTypes.add(t),console.warn(`EventBus: possible memory leak detected. ${s.size} listeners added for "${t}". Use setMaxListeners() to increase limit if this is intentional.`)),()=>this.off(t,e)}once(t,e){let s=a=>{this.off(t,s),e(a);};return this.on(t,s)}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,s){for(let a of t)try{a(e);}catch(r){console.error(`EventBus ${s} error for "${e.type}":`,r);}}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 G=class{constructor(t,e,s,a){this.taskStore=t;this.eventBus=e;this.config=s;this.paths=a;}async create(t){if(!t.title.trim())throw new c$1("Task title is required");let e=t.priority??this.config.defaults.task.priority;if(!Number.isInteger(e)||e<1||e>4)throw new c$1("Priority must be an integer between 1 and 4");if(t.depends_on?.length){let n=(await Promise.all(t.depends_on.map(async i=>({depId:i,exists:!!await this.taskStore.get(i)})))).filter(i=>!i.exists).map(i=>i.depId);if(n.length>0)throw new c$1(`Unknown depends_on task ID(s): ${n.join(", ")}`)}let s=new Date().toISOString(),a={id:`tsk_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"todo",priority:e,assignee:t.assignee,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 r=await this.copyAttachments(a.id,t.attachments);a.attachments=r;}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 s=await this.get(t),a=s.status;if(!a$1(a,e))throw new i(t,a,e);return s.status=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:status_changed",taskId:t,from:a,to:e}),s}async assign(t,e){let s=await this.get(t);return s.assignee=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:assigned",taskId:t,agentId:e}),s}async cancel(t){let e=await this.get(t);if(b$3(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 s=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:s,to:"todo"}),e}async reject(t,e){let s=await this.get(t);if(s.status!=="review")throw new i(t,s.status,"todo");let a=s.status;return s.status="todo",s.attempts=0,s.feedback=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:status_changed",taskId:t,from:a,to:"todo"}),s}async update(t,e){let s=await this.get(t);if(e.title!==void 0){if(!e.title.trim())throw new c$1("Task title cannot be empty");s.title=e.title.trim();}if(e.description!==void 0&&(s.description=e.description.trim()),e.priority!==void 0){if(!Number.isInteger(e.priority)||e.priority<1||e.priority>4)throw new c$1("Priority must be an integer between 1 and 4");s.priority=e.priority;}if(e.labels!==void 0&&(s.labels=e.labels),e.attachments?.length&&this.paths){let a=await this.copyAttachments(t,e.attachments);s.attachments=[...s.attachments??[],...a];}return s.updated_at=new Date().toISOString(),await this.taskStore.save(s),s}async delete(t){if((await this.get(t)).status==="in_progress")throw new c$1("Cannot delete a running task. Cancel it first.");if(await this.taskStore.delete(t),this.paths){let s=this.paths.taskAttachmentsDir(t);await Y.rm(s,{recursive:true,force:true});}}getAttachmentPath(t,e){if(!this.paths)throw new c$1("Paths not configured");return z.join(this.paths.taskAttachmentsDir(t),e)}async copyAttachments(t,e){if(!this.paths)return [];let s=this.paths.taskAttachmentsDir(t);return await i$1(s),await Promise.all(e.map(async r=>{try{await Y.access(r);}catch{throw new c$1(`Attachment file not found: ${r}`)}})),await Promise.all(e.map(async r=>{let n=z.basename(r);return await Y.copyFile(r,z.join(s,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}};var B=class{constructor(t,e,s,a){this.agentStore=t;this.stateStore=e;this.eventBus=s;this.config=a;}async create(t){if(!t.name.trim())throw new c$1("Agent name is required");if(await this.agentStore.getByName(t.name))throw new c$1(`Agent "${t.name}" already exists`);let s={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,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(s),s}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 s=await this.stateStore.read();if(Object.values(s.running).some(r=>r.agent_id===t))throw new c$1("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 s=await this.get(t);if(e.name!==void 0){if(!e.name.trim())throw new c$1("Agent name cannot be empty");let a=await this.agentStore.getByName(e.name.trim());if(a&&a.id!==t)throw new c$1(`Agent "${e.name}" already exists`);s.name=e.name.trim();}return e.role!==void 0&&(s.role=e.role||void 0),e.model!==void 0&&(s.config.model=e.model||void 0),e.approval_policy!==void 0&&(s.config.approval_policy=e.approval_policy),await this.agentStore.save(s),s}async disable(t){return this.setStatus(t,"disabled")}async enable(t){return this.setStatus(t,"idle")}async setAutonomous(t,e){let s=await this.get(t);return s.autonomous=e,await this.agentStore.save(s),this.eventBus.emit({type:"agent:autonomous_toggled",agentId:t,autonomous:e}),s}async setStatus(t,e){let s=await this.get(t);return s.status=e,await this.agentStore.save(s),s}async updateStats(t,e){let s=await this.get(t);return Object.assign(s.stats,e),await this.agentStore.save(s),s}async findBestAgent(t){let e=await this.agentStore.list(),s=e.filter(n=>n.status==="idle");if(s.length===0)return null;if(t.assignee){let n=e.find(i=>i.id===t.assignee);return n&&n.status==="idle"?n:null}let a=t.labels?.length?t.labels.map(n=>n.toLowerCase()):void 0,r=s.map(n=>{let i=0;if(a&&n.config.skills?.length){let l=new Set(n.config.skills.map(g=>g.toLowerCase()));for(let g of a)l.has(g)&&(i+=50);}if(a&&n.role){let l=n.role.toLowerCase();a.some(g=>l.includes(g))&&(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 r.sort((n,i)=>i.score-n.score),r[0]?.agent??null}};var L=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 s=await this.runStore.get(t);if(!s)throw new Error(`Run not found: ${t}`);return s.status="running",s.pid=e,await this.runStore.save(s),this.eventBus.emit({type:"agent:started",agentId:s.agent_id,taskId:s.task_id,runId:t}),s}async finish(t,e,s,a){let r=await this.runStore.get(t);if(!r)throw new Error(`Run not found: ${t}`);return r.status=e,r.finished_at=new Date().toISOString(),r.tokens=s,r.error=a,await this.runStore.save(r),this.eventBus.emit({type:"agent:completed",runId:t,agentId:r.agent_id,success:e==="succeeded"}),r}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,e=50){let a=(await this.runStore.listForTask(t)).filter(i=>i.status==="failed").sort((i,o)=>(o.finished_at??"").localeCompare(i.finished_at??""))[0];if(!a)return null;let r=a.error??"Unknown error",n="";try{n=(await this.runStore.readEventsTail(a.id,e*2)).filter(l=>l.type==="agent_output"||l.type==="error").map(l=>typeof l.data=="string"?l.data:JSON.stringify(l.data)).join(`
4
- `).split(`
5
- `).slice(-e).join(`
6
- `);}catch{}return {error:r,output:n}}};var F=class{constructor(t,e,s,a){this.messageStore=t;this.agentStore=e;this.teamStore=s;this.eventBus=a;}async send(t){if(!t.body.trim())throw new c$1("Message body is required");let e=t.ttl_ms??864e5;if(e<=0||e>6048e5)throw new c$1(`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$1(`Sender agent not found: ${t.from_agent_id}`);let a=new Date,r={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:a.toISOString(),expires_at:new Date(a.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 g=await this.teamStore.get(t.team_id);if(g){let v=new Set(g.members.map(p=>p.agent_id));i=i.filter(p=>v.has(p.id));}}let l=i.filter(g=>g.id!==t.from_agent_id&&g.status!=="disabled").map(g=>({...r,id:`msg_${nanoid(7)}`,to_agent_id:g.id}));await Promise.all(l.map(g=>this.messageStore.save(g)));for(let g of l)n.push(g),this.emitSent(g);}else if(t.channel==="lead"){if(!t.team_id)throw new c$1("team_id is required for lead channel");let i=await this.teamStore.get(t.team_id);if(!i)throw new c$1(`Team not found: ${t.team_id}`);let o={...r,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$1("to_agent_id is required for direct messages");if(!await this.agentStore.get(t.to_agent_id))throw new c$1(`Recipient agent not found: ${t.to_agent_id}`);let o={...r,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 s=await this.messageStore.listPending(t);await Promise.all(s.map(a=>this.messageStore.markDelivered(a.id)));for(let a of s)this.eventBus.emit({type:"message:delivered",messageId:a.id,toAgentId:t,taskId:e});return s}async listAll(){return this.messageStore.list()}async listPendingForAgent(t){return this.messageStore.listPending(t)}async listForAgent(t){return (await this.messageStore.list()).filter(s=>s.to_agent_id===t||s.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 Gt={active:["paused","achieved","abandoned"],paused:["active","abandoned"],achieved:[],abandoned:[]},N=class{constructor(t,e,s,a,r){this.goalStore=t;this.eventBus=e;this.agentService=s;this.taskService=a;this.contextStore=r;}async create(t){if(!t.title.trim())throw new c$1("Goal title is required");let e=new Date().toISOString(),s={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(s),this.eventBus.emit({type:"goal:created",goalId:s.id,title:s.title}),s.assignee&&await this.enableAutonomous(s.assignee),s}async list(t){return this.goalStore.list(t)}async get(t){let e=await this.goalStore.get(t);if(!e)throw new j$1(t);return e}async updateStatus(t,e){let s=await this.get(t),a=s.status;if(!Gt[a].includes(e))throw new c$1(`Cannot transition goal from '${a}' to '${e}'`);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,to:e}),s.assignee&&(e==="paused"?(await this.maybeDisableAutonomous(s.assignee),await this.cancelPendingAutonomousTasks(s.assignee)):e==="active"&&a==="paused"?await this.enableAutonomous(s.assignee):b$2(e)&&await this.maybeDisableAutonomous(s.assignee)),s}async update(t,e){let s=await this.get(t),a=s.assignee;if(e.title!==void 0){if(!e.title.trim())throw new c$1("Goal title cannot be empty");s.title=e.title.trim();}e.description!==void 0&&(s.description=e.description.trim()),e.assignee!==void 0&&(s.assignee=e.assignee||void 0),s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:updated",goalId:t});let r=s.assignee;if(r!==a){let n=[];r&&n.push(this.enableAutonomous(r)),a&&n.push(this.maybeDisableAutonomous(a)),await Promise.all(n);}return s}async delete(t){let e=await this.get(t),{assignee:s}=e;await this.goalStore.delete(t),this.eventBus.emit({type:"goal:deleted",goalId:t}),s&&await this.maybeDisableAutonomous(s);}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(s=>s.assignee===t)}async cancelPendingAutonomousTasks(t){if(this.taskService)try{let[e,s]=await Promise.all([this.taskService.list({status:"todo"}),this.taskService.list({status:"retrying"})]),a$1=[...e,...s].filter(r=>r.assignee===t&&r.labels?.includes(a));await Promise.all(a$1.map(r=>this.taskService.cancel(r.id).catch(()=>{})));}catch{}}async maybeDisableAutonomous(t){if(this.agentService)try{await this.hasActiveGoalsForAgent(t)||await this.agentService.setAutonomous(t,!1);}catch{}}};var ft={auto_claim:true,message_ttl_ms:864e5};var $=class{constructor(t,e,s,a){this.teamStore=t;this.agentStore=e;this.taskStore=s;this.eventBus=a;}async create(t){if(!t.name.trim())throw new c$1("Team name is required");if(!await this.agentStore.get(t.lead_agent_id))throw new c$1(`Lead agent not found: ${t.lead_agent_id}`);if(await this.teamStore.getByName(t.name.trim()))throw new c$1(`Team "${t.name}" already exists`);let a=new Date().toISOString(),r={agent_id:t.lead_agent_id,role:"lead",joined_at:a},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$1(`Member agent not found: ${o}`);n.push({agent_id:o,role:"member",joined_at:a});}let i={id:`team_${nanoid(7)}`,name:t.name.trim(),description:t.description,status:"active",members:[r,...n],task_pool:[],lead_agent_id:t.lead_agent_id,created_at:a,updated_at:a,config:{...ft,...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 k(t);return e}async list(){return this.teamStore.list()}async join(t,e){let s=await this.get(t);if(s.members.some(r=>r.agent_id===e))throw new c$1(`Agent ${e} is already a member of team ${t}`);if(!await this.agentStore.get(e))throw new c$1(`Agent not found: ${e}`);return s.members.push({agent_id:e,role:"member",joined_at:new Date().toISOString()}),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:member_joined",teamId:t,agentId:e}),s}async leave(t,e){let s=await this.get(t);if(e===s.lead_agent_id)throw new c$1("Lead cannot leave team. Disband the team or transfer lead first.");return s.members=s.members.filter(a=>a.agent_id!==e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:member_left",teamId:t,agentId:e}),s}async addTask(t,e){let s=await this.get(t);if(!await this.taskStore.get(e))throw new c$1(`Task not found: ${e}`);return s.task_pool.includes(e)||(s.task_pool.push(e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:task_added",teamId:t,taskId:e})),s}async removeTask(t,e){let s=await this.get(t);return s.task_pool=s.task_pool.filter(a=>a!==e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),s}async setLead(t,e){let s=await this.get(t),a=s.members.find(n=>n.agent_id===e);if(!a)throw new c$1(`Agent ${e} is not a member of team ${t}`);let r=s.members.find(n=>n.agent_id===s.lead_agent_id);return r&&(r.role="member"),a.role="lead",s.lead_agent_id=e,s.updated_at=new Date().toISOString(),await this.teamStore.save(s),s}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(s=>s.status==="active"&&s.members.some(a=>a.agent_id===t))??null}};async function Lt(m){let t=new l(m.projectRoot);await t.requireInit();let e=new x(t),s=new C,[a,r]=await Promise.all([e.read(),s.read()]),n=new b(t),i=new A(t),o=new E(t),l$1=new I(t),g=new j(t),v=new R(t),p=new D(t),k=new O(t),y=new M,S=new G(n,y,a,t),T=new B(i,l$1,y,a),J=new L(o,y),wt=new F(v,i,k,y),yt=new N(p,y,T,S,g),St=new $(k,i,n,y);return {context:m,paths:t,config:a,taskStore:n,agentStore:i,runStore:o,stateStore:l$1,configStore:e,globalConfigStore:s,globalConfig:r,contextStore:g,messageStore:v,goalStore:p,teamStore:k,eventBus:y,taskService:S,agentService:T,runService:J,messageService:wt,goalService:yt,teamService:St}}async function Ft(m){let t=await Lt(m),[{ProcessManager:e},{AdapterRegistry:s},{ClaudeAdapter:a},{CodexAdapter:r},{CursorAdapter:n},{ShellAdapter:i},{WorkspaceManager:o},{LiquidTemplateEngine:l},{Orchestrator:g},{DoctorService:v}]=await Promise.all([import('./process-manager-33H27MQF.js'),import('./registry-BO2PPRNG.js'),import('./claude-E36EGXUV.js'),import('./codex-OTZKVESD.js'),import('./cursor-3DJA6LWS.js'),import('./shell-EOJBDWTH.js'),import('./workspace-manager-KOOYTO7E.js'),import('./template-engine-ONIDVD4F.js'),import('./orchestrator-R7IWZUT6.js'),import('./doctor-service-PB7YBH3F.js')]),p=new e,k=new l,y=new o(m.projectRoot,t.paths.root,p),S=new s;S.register(new a(p)),S.register(new r(p)),S.register(new n(p)),S.register(new i(p));let T=new v(S,p,m.projectRoot),J=new g({taskStore:t.taskStore,agentStore:t.agentStore,runStore:t.runStore,stateStore:t.stateStore,adapterRegistry:S,workspaceManager:y,templateEngine:k,processManager:p,eventBus:t.eventBus,taskService:t.taskService,agentService:t.agentService,runService:t.runService,contextStore:t.contextStore,messageService:t.messageService,goalStore:t.goalStore,config:t.config,projectRoot:m.projectRoot,lockPath:t.paths.lockPath});return {...t,processManager:p,adapterRegistry:S,workspaceManager:y,templateEngine:k,doctorService:T,orchestrator:J}}async function ps(m){return Ft(m)}export{ps as buildContainer,Ft as buildFullContainer,Lt as buildLightContainer};
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env node
2
- import {j,i,q,g,l}from'./chunk-L26TK7Y5.js';function u(d,t){let s=d.command("context").description("Shared context store for inter-agent data exchange");s.command("set <key> <value>").description("Set a shared context entry").option("--ttl <ms>","Time-to-live in milliseconds").action(async(e,n,i)=>{await t.paths.requireInit();let o=i.ttl?parseInt(i.ttl,10):void 0;if(await t.contextStore.set(e,n,o),t.context.json){let g=await t.contextStore.get(e);console.log(JSON.stringify(g,null,2));}else t.context.quiet?console.log(e):j(`Set context "${e}"`);}),s.command("get <key>").description("Get a shared context entry").action(async e=>{await t.paths.requireInit();let n=await t.contextStore.get(e);if(!n){t.context.json?console.log("null"):i(`Context key "${e}" not found`);return}t.context.json?console.log(JSON.stringify(n,null,2)):t.context.quiet?console.log(n.value):(console.log(`
3
- ${e} = ${n.value}`),n.expires_at&&console.log(` ${q(`expires: ${n.expires_at}`)}`),console.log());}),s.command("list").description("List all shared context entries").action(async()=>{await t.paths.requireInit();let e=await t.contextStore.list();if(t.context.json){console.log(JSON.stringify(e,null,2));return}if(t.context.quiet){e.forEach(o=>console.log(`${o.key}=${o.value}`));return}if(e.length===0){console.log(`
4
- No shared context entries. Set one: ${q("orch context set key value")}
5
- `);return}let n=["KEY","VALUE","UPDATED","TTL"],i=e.map(o=>[o.key,o.value.length>50?o.value.slice(0,47)+"...":o.value,g(o.updated_at),o.expires_at?g(o.expires_at):q("\u2014")]);console.log(),l(n,i),console.log(`
6
- ${e.length} entries
7
- `);}),s.command("delete <key>").description("Delete a shared context entry").action(async e=>{await t.paths.requireInit(),await t.contextStore.delete(e),!t.context.quiet&&!t.context.json&&j(`Deleted context "${e}"`);});}export{u as registerContextCommand};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {b,a as a$1}from'./chunk-L3FYR45M.js';import'./chunk-6MJ7V6VY.js';import {execFile}from'child_process';import {promisify}from'util';var d=promisify(execFile);async function m(){for(let r of ["cursor-agent","agent"])try{let{stdout:e}=await d(r,["--version"]);return {command:r,version:e.trim()}}catch{}return null}var a=class{constructor(e){this.processManager=e;}kind="cursor";resolvedCommand="cursor-agent";async test(){let e=await m();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)."}}execute(e){let t=["-p","--output-format","stream-json","--workspace",e.workspace,"--yolo"];e.config.model&&t.push("--model",e.config.model);let{process:n,pid:i}=this.processManager.spawn(this.resolvedCommand,t,{cwd:e.workspace,env:{...process.env,...e.env},signal:e.signal,stdio:["pipe","pipe","pipe"]});n.stdin&&(n.stdin.write(e.prompt),n.stdin.end());let c=b(n,l,"Cursor agent",e.signal);return {pid:i,events:c}}async stop(e){await this.processManager.killWithGrace(e);}};function l(r){if(!r.trim())return null;try{let e=JSON.parse(r),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":return {type:"error",timestamp:t,data:e.error??e};case "result":{let n=a$1(e);return {type:"done",timestamp:t,data:e,tokens:n}}default:return {type:"output",timestamp:t,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:r}}}export{a as CursorAdapter};
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/infrastructure/adapters/cursor.ts"],"names":[],"mappings":"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","file":"cursor-4QIOTDBW.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 } from './utils.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 };\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n '-p',\n '--output-format', 'stream-json',\n '--workspace', params.workspace,\n '--yolo', // bypass interactive prompts for autonomous agents\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\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: ['pipe', 'pipe', 'pipe'], // stdin must be 'pipe' to send prompt\n });\n\n // Pipe prompt via stdin\n if (proc.stdin) {\n proc.stdin.write(params.prompt);\n proc.stdin.end();\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 return { type: 'error', timestamp, data: (parsed.error as unknown) ?? parsed };\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"]}
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {a as a$4}from'./chunk-HMMPM7MF.js';import {p,c,q}from'./chunk-L26TK7Y5.js';import {a as a$1}from'./chunk-CDFA4IIQ.js';import {a as a$2}from'./chunk-MNXU3KCD.js';import'./chunk-L3FYR45M.js';import {a as a$3}from'./chunk-UW6GUUE6.js';import {a}from'./chunk-6MJ7V6VY.js';import {l}from'./chunk-ZA5Z33GO.js';import'./chunk-GZ2Q56YZ.js';import i from'chalk';function P(u,t){u.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 o=new a,e=new a$1;e.register(new a$2(o)),e.register(new a$3(o)),c$1=new a$4(e,o,process.cwd()),n=new l(process.cwd());}console.log(),console.log(` ${p("orch doctor")} \xB7 checking adapters and dependencies`),console.log();let a$5=await c$1.runAll();if(t?.context.json){console.log(JSON.stringify(a$5,null,2));return}for(let o of a$5.checks){let e=o.status==="ok"?i.ansi256(72)(c("done")):o.status==="fail"?i.ansi256(167)(c("failed")):q("\u2014"),l=o.detail?q(` ${o.detail}`):"";console.log(` ${e} ${o.name.padEnd(12)}${l}`);}if(n){let o=await n.isInitialized();if(o&&d){let e=await t.agentService.list(),l=await t.taskService.list();console.log(),console.log(` ${i.ansi256(72)(c("done"))} .orchestry/ ${q(`exists \xB7 ${e.length} agents \xB7 ${l.length} tasks`)}`);}else o||(console.log(),console.log(` ${i.ansi256(167)(c("failed"))} .orchestry/ ${q("not found \u2014 run: orch init")}`));}console.log(),console.log(` ${a$5.adaptersReady} of ${a$5.adaptersTotal} adapters ready`),console.log();});}export{P as registerDoctorCommand};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{a as DoctorService}from'./chunk-HMMPM7MF.js';
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
- import {a}from'./chunk-HXOMNULD.js';import {j,q,l,m,d,o,i}from'./chunk-L26TK7Y5.js';var y={active:"\u25CF",paused:"\u2016",achieved:"\u2713",abandoned:"\u2715"};function v(S,t){let n=S.command("goal").description("Manage goals");n.command("add <title>").description("Create a new goal").option("--description <desc>","Goal description").option("--assignee <agentId>","Assign to a specific agent").action(async(i,e)=>{await t.paths.requireInit();let s=await t.goalService.create({title:i,description:e.description,assignee:e.assignee});t.context.json?console.log(JSON.stringify(s,null,2)):t.context.quiet?console.log(s.id):j(`Created goal "${s.title}" (${s.id})`);}),n.command("list").alias("ls").description("List all goals").option("--status <status>","Filter by status").action(async i=>{await t.paths.requireInit();let e=await t.goalService.list(i.status?{status:i.status}:void 0);if(t.context.json){console.log(JSON.stringify(e,null,2));return}if(e.length===0){console.log(q("No goals found."));return}let s=e.map(o=>[y[o.status]??"?",o.id,o.title,o.status,o.assignee??q("any")]);l(["","ID","Title","Status","Assignee"],s);}),n.command("show <id>").description("Show goal details").action(async i=>{await t.paths.requireInit();let[e,s,o$1]=await Promise.all([t.goalService.get(i),t.goalService.listTasksForGoal(i),t.goalService.getProgressReport(i)]);if(t.context.json){console.log(JSON.stringify({...e,tasks:s,progress:o$1},null,2));return}if(m([["ID",e.id],["Title",e.title],["Status",e.status],["Assignee",e.assignee??q("any")],["Description",e.description||q("none")],["Created",e.created_at],["Updated",e.updated_at??q("never")]]),s.length>0){console.log(`
3
- Tasks (${s.length})
4
- ${"\u2500".repeat(42)}`);let r=s.map(l=>[`${d(l.status)} ${l.status}`,l.id,l.title.slice(0,40),l.assignee?o(l.assignee):q("\u2014")]);l(["STATUS","ID","TITLE","AGENT"],r);}else console.log(`
5
- ${q("No tasks linked to this goal yet.")}`);if(o$1){console.log(`
6
- Progress Report
7
- ${"\u2500".repeat(42)}`);for(let r of o$1.split(`
8
- `))console.log(` ${r}`);}console.log();}),n.command("status <id> <status>").description("Change goal status (active, paused, achieved, abandoned)").action(async(i$1,e)=>{if(await t.paths.requireInit(),!a.includes(e)){i(`Invalid status "${e}". Valid: ${a.join(", ")}`),process.exitCode=1;return}let s=await t.goalService.updateStatus(i$1,e);t.context.json?console.log(JSON.stringify(s,null,2)):t.context.quiet?console.log(s.id):j(`Goal "${s.title}" \u2192 ${s.status}`);}),n.command("update <id>").description("Update goal fields").option("--title <title>","New title").option("--description <desc>","New description").option("--assignee <agentId>","New assignee (empty string to unassign)").action(async(i,e)=>{await t.paths.requireInit();let s=await t.goalService.update(i,e);t.context.json?console.log(JSON.stringify(s,null,2)):t.context.quiet?console.log(s.id):j(`Updated goal "${s.title}"`);}),n.command("delete <id>").alias("rm").description("Delete a goal").action(async i=>{await t.paths.requireInit(),await t.goalService.delete(i),t.context.json?console.log(JSON.stringify({deleted:i})):t.context.quiet||j(`Deleted goal ${i}`);});}export{v as registerGoalCommand};
@@ -1,53 +0,0 @@
1
- #!/usr/bin/env node
2
- import {c as c$1}from'./chunk-HSBYJ5C5.js';import {a}from'./chunk-PJ5DKXGR.js';import'./chunk-CHRW4CLD.js';import {k,j as j$1,q}from'./chunk-L26TK7Y5.js';import {l,j,i,c,a as a$1}from'./chunk-ZA5Z33GO.js';import'./chunk-GZ2Q56YZ.js';import A from'path';import k$1 from'fs/promises';var _=`Agent architect \u2014 designs and creates AI agents for the orchestrator via \`orch agent add\`.
3
-
4
- ## CREATION PROCESS
5
-
6
- 1) ANALYZE \u2014 determine: agent function, required skills, adapter, team interactions.
7
-
8
- 2) WRITE THE ROLE \u2014 this is the most important part. A good role includes:
9
- - Identity and specialization (who you are)
10
- - Concrete workflow (numbered steps)
11
- - Which skills to invoke (\`/skill-name\`)
12
- - Rules and constraints
13
- Do NOT include CLI documentation or goal-mode instructions \u2014 these are already injected by the system prompt template.
14
-
15
- 3) CHOOSE CONFIGURATION:
16
- - adapter: \`claude\` (AI tasks), \`shell\` (bash scripts), \`codex\` (OpenAI Codex), \`cursor\` (Cursor IDE)
17
- - model: \`claude-opus-4-6\` (complex/architectural), \`claude-sonnet-4-6\` (fast/routine), \`claude-haiku-4-5-20251001\` (simple/templated)
18
- - approval_policy: \`auto\` (no confirmation) / \`suggest\` (proposes actions) / \`manual\` (human approval)
19
- - max_turns: 50 (default), up to 100 for complex tasks
20
-
21
- 4) CREATE:
22
- \`orch agent add "<name>" --adapter claude --model <model> --skills "<skills>" --role "<role>" --approval-policy auto\`
23
-
24
- ## AVAILABLE SKILLS
25
-
26
- Development: feature-dev:feature-dev, feature-dev:code-explorer, feature-dev:code-architect, feature-dev:code-reviewer, simplify, claude-api
27
- Testing: testing-suite:generate-tests, testing-suite:test-coverage, testing-suite:e2e-setup, testing-suite:test-quality-analyzer
28
- Frontend: frontend-design, document-skills:frontend-design
29
- Documents: pdf, xlsx, docx, pptx
30
- Marketing: marketing-psychology, product-manager-toolkit
31
-
32
- ## ANTI-PATTERNS
33
-
34
- - Never create agents without skills \u2014 they cannot be auto-matched to tasks.
35
- - Never write generic roles like "helper" \u2014 be specific about actions and tools.
36
- - Never use opus for simple tasks \u2014 it is expensive; use sonnet or haiku.
37
- - Never assign more than 3-4 skills per agent \u2014 create specialized agents instead.
38
- - Never use the -e/--edit flag in automated mode \u2014 it opens an interactive editor.
39
- - Always specify --role when calling \`orch agent add\`.
40
-
41
- After creation \u2014 \`orch context set agent-<name> "<capabilities>"\`.`;function y(){return [{id:"agt_creator",name:"Agent Creator",adapter:"claude",role:_,config:{model:"claude-sonnet-4-6",approval_policy:"suggest",max_turns:50,timeout_ms:36e5,stall_timeout_ms:3e5,skills:["document-skills:skill-creator"]},status:"idle",stats:{tasks_completed:0,tasks_failed:0,total_runs:0,total_runtime_ms:0}}]}async function w(a$2={}){let o=process.cwd(),e=new l(o);if(await j(e.root)){k("Already initialized");return}await Promise.all([i(e.tasksDir),i(e.agentsDir),i(e.goalsDir),i(e.runsDir),i(e.templatesDir),i(e.logsDir)]);let i$1={...a};i$1.project.name=a$2.name??A.basename(o);let l$1=["# Runtime state","state.json","*.lock","","# Logs and runs","runs/","logs/","","# Agent workspaces","workspaces/"].join(`
42
- `)+`
43
- `,v=[".orchestry","node_modules",".env",".env.*","dist","build",".next","__pycache__","*.pyc",".venv"].join(`
44
- `)+`
45
- `,d=y();await Promise.all([c(e.configPath,i$1),a$1(e.gitignorePath,l$1),a$1(e.workspaceExcludePath,v),a$1(e.defaultTemplatePath(),c$1),...d.map(s=>c(e.agentPath(s.id),s))]),await x(o),console.log(),j$1("initialized"),console.log(),console.log(` Created ${q(".orchestry/")}`),console.log(` ${q("\u251C\u2500\u2500")} config.yml`),console.log(` ${q("\u251C\u2500\u2500")} tasks/`),console.log(` ${q("\u251C\u2500\u2500")} agents/`);for(let s of d)console.log(` ${q("\u2502 \u2514\u2500\u2500")} ${s.id}.yml ${q(`(${s.name})`)}`);console.log(` ${q("\u251C\u2500\u2500")} templates/default.md`),console.log(` ${q("\u2514\u2500\u2500")} .gitignore`),console.log();}async function x(a){let o=A.join(a,".gitignore");try{let e=await k$1.readFile(o,"utf-8");if(e.split(`
46
- `).some(l=>l.trim()===".orchestry"))return;let i=e.endsWith(`
47
- `)?"":`
48
- `;await k$1.appendFile(o,`${i}
49
- # Orchestry state
50
- .orchestry
51
- `);}catch{await a$1(o,`# Orchestry state
52
- .orchestry
53
- `);}}function $(a){a.command("init").description("Initialize .orchestry/ in the current directory").option("--name <name>","Project name").action(async o=>{await w(o),console.log(` Next: ${q('orch task add "Create backend agent" --assignee agt_creator')}`),console.log();});}export{$ as registerInitCommand,w as runInit};
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env node
2
- import {i,q,c}from'./chunk-L26TK7Y5.js';import {c as c$1}from'./chunk-GZ2Q56YZ.js';function k(o,e){o.command("logs [run-id]").description("View run logs").option("--agent <agent-id>","Filter by agent").option("--task <task-id>","Filter by task").option("--follow","Live stream").option("--since <duration>","Filter by time (e.g. 5m, 1h)").action(async(s,n)=>{await e.paths.requireInit();let i$1=n.since?I(n.since):void 0;n.follow?await v(e,{runId:s,taskId:n.task,agentId:n.agent}):s?await h(e,s,i$1):n.task?await w(e,n.task,i$1):n.agent?await p(e,n.agent,i$1):(i("Specify a run ID, --task, or --agent"),process.exit(2));});}function u(o){let e=new Date(o.timestamp).toLocaleTimeString("en-US",{hour12:false,hour:"2-digit",minute:"2-digit",second:"2-digit"}),s=o.type==="error"?c("failed"):c("agentAction"),n=typeof o.data=="string"?o.data:JSON.stringify(o.data);return ` ${q(e)} ${s} ${n.slice(0,80)}`}function f(o,e){if(!e)return o;let s=Date.now()-e;return o.filter(n=>new Date(n.timestamp).getTime()>=s)}async function h(o,e,s){let n=s?f(await o.runService.readEventsTail(e,500),s):await o.runService.readEventsTail(e,50);if(o.context.json){console.log(JSON.stringify(n,null,2));return}if(n.length===0){console.log(`
3
- No events for run ${e}
4
- `);return}console.log();for(let i of n)console.log(u(i));console.log();}async function w(o,e,s){let n=await o.runService.listForTask(e);if(o.context.json){console.log(JSON.stringify(n,null,2));return}if(n.length===0){console.log(`
5
- No runs for task ${e}
6
- `);return}let i=s?n.slice(-20):n,g=await Promise.all(i.map(t=>s?o.runService.readEventsTail(t.id,500).then(r=>f(r,s)):o.runService.readEventsTail(t.id,10)));for(let t=0;t<i.length;t++){let r=i[t],l=g[t];console.log(`
7
- Run ${r.id} \xB7 attempt ${r.attempt} \xB7 ${r.status}`);for(let d of l.slice(-10))console.log(u(d));}console.log();}async function p(o,e,s){let n=await o.runService.listForAgent(e);if(o.context.json){console.log(JSON.stringify(n,null,2));return}if(n.length===0){console.log(`
8
- No runs for agent ${e}
9
- `);return}let i=n.slice(-5),g=await Promise.all(i.map(t=>s?o.runService.readEventsTail(t.id,500).then(r=>f(r,s)):o.runService.readEventsTail(t.id,5)));for(let t=0;t<i.length;t++){let r=i[t],l=g[t];console.log(`
10
- Run ${r.id} \xB7 task ${r.task_id} \xB7 ${r.status}`);for(let d of l.slice(-5))console.log(u(d));}console.log();}async function v(o,e){let s=new Set,n=new Set;if(e.runId&&s.add(e.runId),e.taskId){let t=await o.runService.listForTask(e.taskId);for(let r of t)s.add(r.id);}e.agentId&&n.add(e.agentId);let i=s.size>0||n.size>0;console.log(`
11
- ${q("Following live events...")} ${q("(Ctrl+C to stop)")}
12
- `);let g=o.eventBus.onAny(t=>{let r=new Date().toLocaleTimeString("en-US",{hour12:false,hour:"2-digit",minute:"2-digit",second:"2-digit"});if(i){if("runId"in t&&s.size>0&&!s.has(t.runId))return;if("agentId"in t&&n.size>0){let l=t;if(!n.has(l.agentId))return}}switch(t.type){case "agent:output":{let l=typeof t.data=="string"?t.data.slice(0,80):"";console.log(` ${q(r)} ${c("agentAction")} ${l}`);break}case "agent:file_changed":console.log(` ${q(r)} ${c("agentAction")} Modified ${t.path}`);break;case "agent:error":console.log(` ${q(r)} ${c("failed")} ${t.error}`);break;case "agent:started":console.log(` ${q(r)} ${c("orchestratorEvent")} Started ${t.runId} (agent: ${t.agentId})`);break;case "agent:completed":t.success?console.log(` ${q(r)} ${c("done")} DONE ${t.runId}`):console.log(` ${q(r)} ${c("failed")} FAIL ${t.runId}`);break;case "run:retry":console.log(` ${q(r)} ${c("retrying")} RETRY attempt ${t.attempt} \xB7 next in ${Math.round(t.delay_ms/1e3)}s`);break;case "orchestrator:stall_detected":console.log(` ${q(r)} ${c("warning")} STALL ${t.runId}`);break}});await new Promise(t=>{let r=()=>{g(),t();};process.once("SIGINT",r),process.once("SIGTERM",r);});}function I(o){let e=o.match(/^(\d+)(s|m|h|d)$/);if(!e)throw new c$1(`Invalid duration: "${o}". Use format: 5m, 1h, 30s, 1d`);let s=parseInt(e[1],10);switch(e[2]){case "s":return s*1e3;case "m":return s*6e4;case "h":return s*36e5;case "d":return s*864e5;default:return s*6e4}}export{k as registerLogsCommand};
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env node
2
- import {j,q,g,l}from'./chunk-L26TK7Y5.js';function f(m,s){let a=m.command("msg").description("Inter-agent messaging");a.command("send <to-agent-id> <body>").description("Send a direct message to an agent").option("-s, --subject <subject>","Message subject").option("--from <agent-id>","Sender agent ID (default: cli)").option("--ttl <ms>","TTL in milliseconds").option("--reply-to <msg-id>","Reply to a message").action(async(n,e,t)=>{await s.paths.requireInit();let o=await s.messageService.send({channel:"direct",from_agent_id:t.from??"cli",to_agent_id:n,subject:t.subject??"",body:e,ttl_ms:t.ttl?parseInt(t.ttl,10):void 0,reply_to:t.replyTo});s.context.json?console.log(JSON.stringify(o,null,2)):s.context.quiet?console.log(o[0]?.id):j(`Message sent: ${o[0]?.id} \u2192 ${n}`);}),a.command("broadcast <body>").description("Broadcast a message to all agents (or team members)").option("-s, --subject <subject>","Message subject").option("--from <agent-id>","Sender agent ID (default: cli)").option("--team <team-id>","Limit broadcast to team members").option("--ttl <ms>","TTL in milliseconds").action(async(n,e)=>{await s.paths.requireInit();let t=await s.messageService.send({channel:"broadcast",from_agent_id:e.from??"cli",subject:e.subject??"",body:n,ttl_ms:e.ttl?parseInt(e.ttl,10):void 0,team_id:e.team});s.context.json?console.log(JSON.stringify(t,null,2)):s.context.quiet?console.log(t.map(o=>o.id).join(`
3
- `)):j(`Broadcast sent to ${t.length} agent(s)`);}),a.command("inbox <agent-id>").description("Show pending messages for an agent").action(async n=>{await s.paths.requireInit();let e=await s.messageService.listPendingForAgent(n);if(s.context.json){console.log(JSON.stringify(e,null,2));return}if(e.length===0){console.log(q(`
4
- No pending messages.
5
- `));return}console.log();for(let t of e)console.log(` ${q(t.id)} from ${t.from_agent_id}${t.subject?` \u2014 ${t.subject}`:""}`),console.log(` ${t.body}`),console.log();}),a.command("list").description("List all messages").option("--agent <agent-id>","Filter by agent (sent or received)").action(async n=>{await s.paths.requireInit();let e;if(n.agent?e=await s.messageService.listForAgent(n.agent):e=await s.messageService.listAll(),s.context.json){console.log(JSON.stringify(e,null,2));return}if(e.length===0){console.log(q(`
6
- No messages.
7
- `));return}let t=["ID","FROM","TO","CHANNEL","STATUS","SENT"],o=e.map(i=>[i.id,i.from_agent_id,i.to_agent_id??"*",i.channel,i.status,g(i.created_at)]);console.log(),l(t,o),console.log(`
8
- ${e.length} message(s)
9
- `);});}export{f as registerMsgCommand};
@@ -1,5 +0,0 @@
1
- export { Orchestrator } from './chunk-2UC4SVJB.js';
2
- import './chunk-IQXRQBUK.js';
3
- import './chunk-B4JQM4NU.js';
4
- //# sourceMappingURL=orchestrator-FGGXK3N3.js.map
5
- //# sourceMappingURL=orchestrator-FGGXK3N3.js.map
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env node
2
- import {c as c$1,b as b$2}from'./chunk-HSBYJ5C5.js';import {e,c,b as b$1,d as d$1,f,g}from'./chunk-LXNRCJ22.js';import {a}from'./chunk-CHRW4CLD.js';import {d,l,h,e as e$1}from'./chunk-GZ2Q56YZ.js';import {dirname}from'path';import x from'fs/promises';import {execFile}from'child_process';function V(u,t){if(!u?.length||!t?.length)return false;for(let e of u)for(let s of t)if(nt(e,s))return true;return false}function O(u){let t=u.split("*")[0],e=!t.endsWith("/"),s=e?dirname(t):"";return {raw:u,base:t,isFile:e,dir:s}}var P=class{entries;constructor(t){this.entries=[];for(let e of t)if(e?.length)for(let s of e)this.entries.push(O(s));}overlapsAny(t){if(!t?.length||this.entries.length===0)return false;for(let e of t){let s=O(e);for(let i of this.entries)if(rt(s,i))return true}return false}add(t){if(t?.length)for(let e of t)this.entries.push(O(e));}get size(){return this.entries.length}};function rt(u,t){return u.raw===t.raw||u.base.startsWith(t.base)||t.base.startsWith(u.base)?true:u.isFile&&t.isFile?u.dir===t.dir&&u.dir!==".":false}function nt(u,t){if(u===t)return true;let e=u.split("*")[0],s=t.split("*")[0];if(e.startsWith(s)||s.startsWith(e))return true;if(!e.endsWith("/")&&!s.endsWith("/")){let i=dirname(e),o=dirname(s);return i===o&&i!=="."}return false}var Y=Promise.resolve();async function j(u){let t,e=new Promise(i=>{t=i;}),s=Y;Y=e,await s;try{return await ot(u)}finally{t();}}async function ot(u){let t=await Z(u);if(t!==null){if(ct(t))return {acquired:false,pid:t};await x.unlink(u).catch(()=>{});}try{let e=await x.open(u,"wx");return await e.writeFile(String(process.pid),"utf-8"),await e.close(),{acquired:!0,pid:process.pid}}catch(e){if(e.code==="EEXIST")return {acquired:false,pid:await Z(u)??void 0};throw e}}async function G(u){await x.unlink(u).catch(()=>{});}async function Z(u){try{let t=await x.readFile(u,"utf-8"),e=parseInt(t.trim(),10);return isNaN(e)?null:e}catch{return null}}function ct(u){try{return process.kill(u,0),!0}catch(t){return t.code==="EPERM"}}var E=class{constructor(t){this.inner=t;}cache=new Map;async list(t){let e=t?`${t.status??""}:${t.goalId??""}`:"__all__";if(this.cache.has(e))return this.cache.get(e);let s=await this.inner.list(t);return this.cache.set(e,s),s}async get(t){return this.inner.get(t)}async save(t){await this.inner.save(t),this.cache.clear();}async delete(t){await this.inner.delete(t),this.cache.clear();}invalidate(){this.cache.clear();}},b=class{constructor(t){this.inner=t;}listCache=null;nameCache=new Map;async list(){if(this.listCache)return this.listCache;let t=await this.inner.list();return this.listCache=t,t}async get(t){return this.inner.get(t)}async getByName(t){if(this.nameCache.has(t))return this.nameCache.get(t)??null;let e=await this.inner.getByName(t);return this.nameCache.set(t,e),e}async save(t){await this.inner.save(t),this.listCache=null,this.nameCache.clear();}async delete(t){await this.inner.delete(t),this.listCache=null,this.nameCache.clear();}invalidate(){this.listCache=null,this.nameCache.clear();}},D=class{constructor(t){this.inner=t;}cache=new Map;async list(t){let e=t?.status??"__all__";if(this.cache.has(e))return this.cache.get(e);let s=await this.inner.list(t);return this.cache.set(e,s),s}async get(t){return this.inner.get(t)}async save(t){await this.inner.save(t),this.cache.clear();}async delete(t){await this.inner.delete(t),this.cache.clear();}invalidate(){this.cache.clear();}};var ut={test_pass:{cmd:"npm",args:["test"]},typecheck:{cmd:"npx",args:["tsc","--noEmit"]},lint:{cmd:"npm",args:["run","lint"]}},k=class{cwd;timeoutMs;constructor(t){this.cwd=t.cwd,this.timeoutMs=t.timeout_ms??12e4;}async runAll(t){let e=[];for(let s of t){let i=await this.runCriterion(s);e.push(i);}return e}static allPassed(t){return t.length>0&&t.every(e=>e.passed)}static formatReport(t){return t.map(s=>{let i=s.passed?"\u2713":"\u2717",o=s.output.slice(0,500);return `${i} ${s.criterion}: ${s.passed?"PASSED":"FAILED"}
3
- ${o}`}).join(`
4
-
5
- `)}runCriterion(t){let{cmd:e,args:s}=ut[t];return new Promise(i=>{execFile(e,s,{cwd:this.cwd,timeout:this.timeoutMs,maxBuffer:1024*1024},(o,p,c)=>{let l=(p+`
6
- `+c).trim();i({criterion:t,passed:!o,output:l.slice(0,2e3)});});})}};var dt=8192,ht=4096,tt=class{constructor(t){this.deps=t;this.cachedTaskStore=new E(t.taskStore),this.cachedAgentStore=new b(t.agentStore),this.cachedGoalStore=t.goalStore?new D(t.goalStore):null;}intervalId=null;shuttingDown=false;state=null;abortControllers=new Map;cachedTaskStore;cachedAgentStore;cachedGoalStore;saveStateTimer=null;saveStateDirty=false;lockAcquired=false;consecutiveTickFailures=0;maxConsecutiveTickFailures=5;maxRetryQueueSize=100;signalHandlers=[];immediateDispatchTimer=null;taskCreatedUnsub=null;tickInProgress=false;stateMutex=Promise.resolve();get isOwner(){return this.lockAcquired}withStateLock(t){let e,s=new Promise(o=>{e=o;}),i=this.stateMutex;return this.stateMutex=s,i.then(async()=>{try{return await t()}finally{e();}})}async runTask(t){if(this.lockAcquired){await this.freshDispatch(()=>this.dispatchTask(t));return}await this.withTemporaryLock(()=>this.freshDispatch(()=>this.dispatchTask(t)));}async runAll(){if(this.lockAcquired){await this.freshDispatch(()=>this.dispatchAll());return}await this.withTemporaryLock(()=>this.freshDispatch(()=>this.dispatchAll()));}async freshDispatch(t){await this.withStateLock(async()=>{this.cachedTaskStore.invalidate(),this.cachedAgentStore.invalidate(),await this.loadState(),await t(),await this.saveState();});}async withTemporaryLock(t){let e=await j(this.deps.lockPath);if(!e.acquired)throw new d(e.pid);this.lockAcquired=true;try{await t();}finally{this.lockAcquired=false,await G(this.deps.lockPath);}}async startWatch(){let t=await j(this.deps.lockPath);if(!t.acquired)throw new d(t.pid);this.lockAcquired=true,await this.loadState(),this.state.pid=process.pid,this.state.started_at=new Date().toISOString(),await this.saveState(),this.registerSignalHandlers(),this.taskCreatedUnsub=this.deps.eventBus.on("task:created",()=>{this.scheduleImmediateDispatch();}),await this.tick(),this.intervalId=setInterval(()=>this.tick().then(()=>{this.consecutiveTickFailures=0;},e=>{this.consecutiveTickFailures++;let s=e instanceof Error?e.message:String(e);this.deps.eventBus.emit({type:"orchestrator:error",error:s,context:"tick",fatal:this.consecutiveTickFailures>=this.maxConsecutiveTickFailures}),this.consecutiveTickFailures>=this.maxConsecutiveTickFailures&&(this.deps.eventBus.emit({type:"orchestrator:shutdown",reason:`${this.consecutiveTickFailures} consecutive tick failures`}),this.stop().catch(i=>{this.deps.eventBus.emit({type:"orchestrator:error",error:i instanceof Error?i.message:String(i),context:"stop after consecutive tick failures",fatal:false});}));}),this.deps.config.scheduling.poll_interval_ms);}registerSignalHandlers(){let t=e=>{this.deps.eventBus.emit({type:"orchestrator:shutdown",reason:`Received ${e}`}),this.stop().catch(s=>{this.deps.eventBus.emit({type:"orchestrator:error",error:s instanceof Error?s.message:String(s),context:`stop after ${e} signal`,fatal:false});});};for(let e of ["SIGINT","SIGTERM"]){let s=()=>t(e);this.signalHandlers.push([e,s]),process.on(e,s);}}removeSignalHandlers(){for(let[t,e]of this.signalHandlers)process.removeListener(t,e);this.signalHandlers=[];}async stop(){this.shuttingDown||(this.shuttingDown=true,this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null),this.taskCreatedUnsub&&(this.taskCreatedUnsub(),this.taskCreatedUnsub=null),this.immediateDispatchTimer&&(clearTimeout(this.immediateDispatchTimer),this.immediateDispatchTimer=null),await this.flushStateLazy(),await this.withStateLock(async()=>{if(this.state){for(let[t,e$1]of Object.entries(this.state.running)){this.abortControllers.get(t)?.abort(),this.abortControllers.delete(t),await this.deps.processManager.killWithGrace(e$1.pid),await this.deps.runService.finish(e$1.run_id,"cancelled");let s=await this.deps.taskStore.get(t);s&&await this.deps.taskService.updateStatus(t,e(s)),await this.deps.agentService.setStatus(e$1.agent_id,"idle");}this.state.running={},this.state.claimed=new Set,this.state.pid=void 0,this.state.started_at=void 0,await this.saveState();}}),this.lockAcquired&&(await G(this.deps.lockPath),this.lockAcquired=false),this.removeSignalHandlers());}async cancelTask(t){if(!this.lockAcquired)return this.withTemporaryLock(()=>this.cancelTask(t));await this.withStateLock(async()=>{await this.loadState();let e=this.state,s=e.running[t];s&&(this.abortControllers.get(t)?.abort(),this.abortControllers.delete(t),await this.deps.processManager.killWithGrace(s.pid,3e3).catch(i=>{this.deps.eventBus.emit({type:"orchestrator:error",error:i instanceof Error?i.message:String(i),context:`cancelTask kill process ${s.pid} for task ${t}`,fatal:false});}),await this.deps.runService.finish(s.run_id,"cancelled").catch(i=>{this.deps.eventBus.emit({type:"orchestrator:error",error:i instanceof Error?i.message:String(i),context:`cancelTask finish run ${s.run_id}`,fatal:false});}),await this.deps.agentService.setStatus(s.agent_id,"idle").catch(i=>{this.deps.eventBus.emit({type:"orchestrator:error",error:i instanceof Error?i.message:String(i),context:`cancelTask setStatus idle for agent ${s.agent_id}`,fatal:false});}),delete e.running[t],await this.saveState()),e.retry_queue=e.retry_queue.filter(i=>i.task_id!==t);try{await this.deps.taskService.cancel(t);}catch{try{await this.deps.taskService.updateStatus(t,"cancelled");}catch{}}await this.saveState();});}async forceStopAgent(t){if(!this.lockAcquired)return this.withTemporaryLock(()=>this.forceStopAgent(t));await this.withStateLock(async()=>{await this.loadState();let e=this.state;for(let[s,i]of Object.entries(e.running))if(i.agent_id===t){this.abortControllers.get(s)?.abort(),this.abortControllers.delete(s),await this.deps.processManager.killWithGrace(i.pid,3e3),await this.deps.runService.finish(i.run_id,"cancelled");try{await this.deps.taskService.updateStatus(s,"failed");}catch{}delete e.running[s];}await this.deps.agentService.setStatus(t,"idle"),await this.saveState();});}async tick(){if(!this.shuttingDown){this.tickInProgress=true;try{await this.withStateLock(async()=>{if(this.shuttingDown)return;this.cachedTaskStore.invalidate(),this.cachedAgentStore.invalidate(),this.cachedGoalStore?.invalidate(),await this.loadState(),await this.reconcile(),await this.seedAutonomousTasks(),await this.dispatchAll();let t=await this.cachedTaskStore.list(),e=Object.keys(this.state.running).length,s=t.filter(i=>c(i.status)).length;this.deps.eventBus.emit({type:"orchestrator:tick",running:e,queued:s});});}finally{this.tickInProgress=false;}}}scheduleImmediateDispatch(t=0){this.shuttingDown||this.immediateDispatchTimer||(this.immediateDispatchTimer=setTimeout(()=>{if(this.immediateDispatchTimer=null,!this.shuttingDown){if(this.tickInProgress){t<10&&this.scheduleImmediateDispatch(t+1);return}this.immediateDispatch().catch(e=>{this.deps.eventBus.emit({type:"orchestrator:error",error:e instanceof Error?e.message:String(e),context:"immediate dispatch on task:created",fatal:false});});}},500));}async immediateDispatch(){this.shuttingDown||await this.freshDispatch(()=>this.shuttingDown?Promise.resolve():this.dispatchAll());}async reconcile(){let t=this.state,e=Date.now(),s=Object.entries(t.running),i=await Promise.all(s.map(([r])=>this.deps.taskStore.get(r)));for(let r=0;r<s.length;r++){let[a,n]=s[r],f=i[r];if(!f||b$1(f.status)){this.abortControllers.delete(a),delete t.running[a],await this.deps.agentService.setStatus(n.agent_id,"idle").catch(h=>{this.deps.eventBus.emit({type:"orchestrator:error",error:h instanceof Error?h.message:String(h),context:`reconcile setStatus idle for stale agent ${n.agent_id} (task ${a})`,fatal:false});});continue}if(!this.deps.processManager.isAlive(n.pid)){try{await this._handleRunFailure(a,n,"Process crashed unexpectedly");}catch{delete t.running[a],await this.deps.agentService.setStatus(n.agent_id,"idle").catch(h=>{this.deps.eventBus.emit({type:"orchestrator:error",error:h instanceof Error?h.message:String(h),context:`reconcile crash fallback setStatus idle for agent ${n.agent_id} (task ${a})`,fatal:false});});}continue}let d=new Date(n.last_event_at).getTime(),m=this.deps.config.defaults.agent.stall_timeout_ms;if(e-d>m){this.deps.eventBus.emit({type:"orchestrator:stall_detected",runId:n.run_id}),this.abortControllers.get(a)?.abort(),await this.deps.processManager.killWithGrace(n.pid,5e3);try{await this._handleRunFailure(a,n,"Agent stalled (no events)");}catch{delete t.running[a],await this.deps.agentService.setStatus(n.agent_id,"idle").catch(h=>{this.deps.eventBus.emit({type:"orchestrator:error",error:h instanceof Error?h.message:String(h),context:`reconcile stall fallback setStatus idle for agent ${n.agent_id} (task ${a})`,fatal:false});});}}}let o=new Set(Object.values(t.running).map(r=>r.agent_id)),p=await this.cachedAgentStore.list();for(let r of p)r.status==="running"&&!o.has(r.id)&&await this.deps.agentService.setStatus(r.id,"idle");let c=await this.cachedTaskStore.list();for(let r of c)if(r.status==="in_progress"&&!t.running[r.id]){try{await this.deps.taskService.updateStatus(r.id,"failed");}catch{r.status="failed",r.updated_at=new Date().toISOString(),await this.deps.taskStore.save(r).catch(a=>{this.deps.eventBus.emit({type:"orchestrator:error",error:a instanceof Error?a.message:String(a),context:`force-write orphaned task ${r.id}`,fatal:false});});}this.deps.eventBus.emit({type:"task:orphaned",taskId:r.id});}let l=[];t.retry_queue=t.retry_queue.filter(r=>e>=new Date(r.due_at).getTime()?(l.push(r.task_id),false):true);for(let r of l)await this.dispatchTask(r);await this.saveState();}async seedAutonomousTasks(){let e=(await this.cachedAgentStore.list()).filter(c=>c.autonomous&&c.status==="idle");if(e.length===0)return;let s=await this.cachedTaskStore.list(),i=this.cachedGoalStore?await this.cachedGoalStore.list({status:"active"}):[],o=false,p=new Set;for(let c of e){if(s.some(d=>d.assignee===c.id&&!b$1(d.status)))continue;let r=i.find(d=>d.assignee===c.id&&!p.has(d.id))??i.find(d=>!d.assignee&&!p.has(d.id));r&&p.add(r.id);let a$1=c.role??"general assistant",n=r?`[auto] ${c.name}: ${r.title.slice(0,60)}`:`[auto] ${c.name}: ${a$1.slice(0,60)}`,f=r?`## GOAL (highest priority)
7
-
8
- ${r.description||r.title}
9
-
10
- ---
11
- Agent role: ${a$1}`:`Autonomous work cycle. Agent role: ${a$1}`;try{await this.deps.taskService.create({title:n,description:f,assignee:c.id,labels:[a],priority:3,goalId:r?.id}),o=!0;}catch(d){this.deps.eventBus.emit({type:"orchestrator:error",error:d instanceof Error?d.message:String(d),context:`autonomous task for agent ${c.id}`,fatal:false});}}o&&this.cachedTaskStore.invalidate();}async dispatchAll(){let t=this.state,e=this.deps.config.scheduling.max_concurrent_agents,s=Object.keys(t.running).length,i=e-s;if(i<=0)return;let o=await this.cachedTaskStore.list(),p=new Map(o.map(n=>[n.id,n])),c$1=o.filter(n=>c(n.status)&&!d$1(n,p)&&!t.running[n.id]&&!t.claimed.has(n.id)).sort((n,f)=>{let d=f.updated_at??"",m=n.updated_at??"";return d<m?-1:d>m?1:0}).slice(0,i),l$1=new Set,r=o.filter(n=>n.status==="in_progress"&&n.scope?.length),a=new P(r.map(n=>n.scope));for(let n of c$1)if(n.scope?.length)if(a.overlapsAny(n.scope)){let f=r.find(d=>V(n.scope,d.scope));this.deps.eventBus.emit({type:"task:scope_overlap",taskId:n.id,overlappingTaskId:f?.id??n.id,patterns:n.scope}),l$1.add(n.id);}else a.add(n.scope);for(let n of c$1)if(!l$1.has(n.id))try{await this.dispatchTask(n.id);}catch(f){if(f instanceof l)try{let d=await this.deps.taskStore.get(n.id);d&&!b$1(d.status)&&(d.status="failed",d.updated_at=new Date().toISOString(),await this.deps.taskStore.save(d));}catch{}this.deps.eventBus.emit({type:"orchestrator:error",error:f instanceof Error?f.message:String(f),context:`dispatch task ${n.id}`,fatal:false});}}async dispatchTask(t){let e=this.state;if(e.running[t]){let i=e.running[t];throw new h(t,i.run_id,i.agent_id)}let s=await this.deps.taskService.get(t);e.claimed.add(t),await this.saveState();try{let i=await this.cachedAgentStore.list(),o=await this.deps.agentService.findBestAgent(s);if(!o){if(i.length===0)throw new e$1;this.unclaim(t),await this.saveState();return}let{path:p,branch:c}=await this.deps.workspaceManager.prepare(s,o,this.deps.config),l=this.deps.config.prompt?.template??c$1,r=s.attempts+1,a;if(r>1){let w=await this.deps.runService.getLastFailedRunContext(s.id);w&&(a={previous_error:w.error,previous_output:w.output});}let n=s.goalId,[f,d,m]=await Promise.all([this.deps.contextStore?.getAll(),this.deps.messageService?this.deps.messageService.drainMailbox(o.id,s.id):[],n&&this.cachedGoalStore?this.cachedGoalStore.get(n).catch(()=>null):null]),h;if(m){let it=(await this.cachedTaskStore.list()).filter(A=>A.goalId===n),at=await this.deps.contextStore?.get(`${n}-progress`),C=30,T=it.map(A=>`[${A.status}] ${A.title}`);h={id:m.id,title:m.title,description:m.description,status:m.status,task_names:T.length>C?[...T.slice(0,C),`... and ${T.length-C} more`]:T,progress:at?.value};}let v=b$2(s,o,r,p,this.deps.config,{allAgents:i,retryContext:a,sharedContext:f,feedback:s.feedback,messages:d.length?d:void 0,goal:h}),g=await this.deps.templateEngine.render(l,v),S=await this.deps.runService.create({taskId:s.id,agentId:o.id,attempt:r,prompt:g,workspacePath:p});(s.status==="failed"||s.status==="cancelled")&&(await this.deps.taskService.retry(t),s.status="todo",s.attempts=0),await this.deps.taskService.updateStatus(t,"in_progress"),await this.deps.taskService.assign(t,o.id),await this.deps.taskService.incrementAttempts(t),c&&(s.proof={...s.proof??{files_changed:[]},branch:c},s.workspace=p,await this.deps.taskStore.save(s)),await this.deps.agentService.setStatus(o.id,"running");let y=await this.deps.agentService.get(o.id);y.current_task=t,await this.deps.agentStore.save(y);let st=this.deps.adapterRegistry.require(o.adapter),q=new AbortController;this.abortControllers.set(t,q);let I=st.execute({prompt:g,workspace:p,env:{...o.config.env,ORCH_AGENT_ID:o.id,ORCH_AGENT_NAME:o.name,ORCH_TASK_ID:s.id},config:y.config,signal:q.signal}),F=I.pid,N=new Date().toISOString();await this.deps.runService.start(S.id,F),this.unclaim(t),e.running[t]={run_id:S.id,agent_id:o.id,task_id:t,pid:F,started_at:N,last_event_at:N},await this.saveState(),this.collectEvents(I.events,S.id,t,o.id).catch(w=>{this.deps.eventBus.emit({type:"orchestrator:error",error:w instanceof Error?w.message:String(w),context:`adapter execution for ${t}`,fatal:!1});});}catch(i){throw this.unclaim(t),await this.saveState(),i}}async collectEvents(t,e,s,i){let o,p,c,l=new Set;try{for await(let a of t){if(this.shuttingDown)break;if(a.type==="done"){a.tokens&&(o=a.tokens);let h=a.data;h&&typeof h.result=="string"&&(p=h.result);}if(a.type==="output"){let h=a.data;if(h){let v=typeof h.text=="string"?h.text:typeof h.message=="string"?h.message:void 0;v?.trim()&&(c=v);}}if(a.type==="file_change"){let h=a.data;if(h&&Array.isArray(h.paths))for(let v of h.paths)typeof v=="string"&&l.add(v);else {let v=h&&typeof h.path=="string"?h.path:typeof a.data=="string"?a.data:String(a.data);l.add(v);}}let n=pt(a.timestamp)?a.timestamp:new Date().toISOString(),f=et(a.data,dt);a.data=void 0;let d={timestamp:n,type:a.type==="output"?"agent_output":a.type==="file_change"?"file_changed":a.type==="command"?"command_run":a.type==="tool_call"?"tool_call":a.type==="error"?"error":"done",data:f};await this.deps.runService.appendEvent(e,d),this.state?.running[s]&&(this.state.running[s].last_event_at=n,this.saveStateLazy());let m=et(f,ht);a.type==="output"||a.type==="tool_call"?this.deps.eventBus.emit({type:"agent:output",runId:e,agentId:i,data:m}):a.type==="file_change"?this.deps.eventBus.emit({type:"agent:file_changed",runId:e,agentId:i,path:typeof a.data=="string"?a.data:String(a.data)}):a.type==="error"&&this.deps.eventBus.emit({type:"agent:error",runId:e,agentId:i,error:m});}let r=p??c;await this.handleRunSuccess(s,e,i,o,r,[...l]);}catch(r){let a=r instanceof Error?r.message:String(r),n=this.state?.running[s];n&&await this.handleRunFailure(s,n,a);}}async handleRunSuccess(t,e,s,i,o,p){return this.withStateLock(()=>this._handleRunSuccess(t,e,s,i,o,p))}async _handleRunSuccess(t,e,s,i,o,p){await this.flushStateLazy(),this.abortControllers.delete(t);let c=this.state;if(!c.running[t])return;let l=await this.deps.taskStore.get(t);if(!l)return;l.proof={...l.proof,agent_summary:o?.slice(0,2e3)??l.proof?.agent_summary,files_changed:p?.length?p:l.proof?.files_changed??[]},delete l.feedback,await this.deps.taskStore.save(l);let r=await this.deps.agentStore.get(s),n=l.labels?.includes(a)||r?.config.approval_policy==="auto",f$1=f(l,true,n);await this.deps.runService.finish(e,"succeeded",i);let d=c.running[t],m=d?Date.now()-new Date(d.started_at).getTime():0;d&&(c.stats.total_runtime_ms+=m),delete c.running[t];let h={tasks_completed:(r?.stats.tasks_completed??0)+1,total_runs:(r?.stats.total_runs??0)+1,total_runtime_ms:(r?.stats.total_runtime_ms??0)+m};if(i&&(h.tokens_used=(r?.stats.tokens_used??0)+i.total),await this.deps.agentService.updateStats(s,h).catch(g=>{this.deps.eventBus.emit({type:"orchestrator:error",error:g instanceof Error?g.message:String(g),context:`agent stats update for ${s}`,fatal:false});}),c.stats.total_tasks_completed++,c.stats.total_runs++,i&&(c.stats.total_tokens.input+=i.input,c.stats.total_tokens.output+=i.output,c.stats.total_tokens.total=c.stats.total_tokens.input+c.stats.total_tokens.output),l.proof?.branch)try{let g=await this.deps.workspaceManager.mergeBack(l.proof.branch);if(g.success)this.deps.eventBus.emit({type:"workspace:merge_succeeded",taskId:t,branch:l.proof.branch}),await this.deps.workspaceManager.cleanup(t).catch(S=>{this.deps.eventBus.emit({type:"orchestrator:error",error:S instanceof Error?S.message:String(S),context:`workspace cleanup for ${t}`,fatal:!1});});else {this.deps.eventBus.emit({type:"workspace:merge_conflict",taskId:t,branch:l.proof.branch,conflictInfo:g.conflictInfo}),await this.forceTaskToReview(l,s,`MERGE CONFLICT: ${g.conflictInfo}`);return}}catch(g){let S=g instanceof Error?g.message:String(g);await this.forceTaskToReview(l,s,`MERGE ERROR: ${S}`);return}try{await this.deps.taskService.updateStatus(t,f$1);}catch(g){let S=g instanceof Error?g.message:String(g);this.deps.eventBus.emit({type:"orchestrator:error",error:S,context:`state machine validation failed for task ${t} -> ${f$1}, force-writing`,fatal:false}),l.status=f$1,l.updated_at=new Date().toISOString(),await this.deps.taskStore.save(l).catch(y=>{this.deps.eventBus.emit({type:"orchestrator:error",error:y instanceof Error?y.message:String(y),context:`force-write task ${t} to store failed`,fatal:false});});}await this.deps.agentService.setStatus(s,"idle").catch(g=>{this.deps.eventBus.emit({type:"orchestrator:error",error:g instanceof Error?g.message:String(g),context:`_handleRunSuccess setStatus idle for agent ${s}`,fatal:false});});let v=await this.deps.agentStore.get(s);v&&(v.current_task=void 0,await this.deps.agentStore.save(v)),f$1==="review"&&l.review_criteria?.length?await this.runAutoReview(t,l.review_criteria,l.workspace??this.deps.projectRoot):f$1==="review"&&n&&await this.deps.taskService.updateStatus(t,"done"),await this.saveState(),this.scheduleImmediateDispatch();}async handleRunFailure(t,e,s){return this.withStateLock(()=>this._handleRunFailure(t,e,s))}async _handleRunFailure(t,e$1,s){await this.flushStateLazy(),this.abortControllers.delete(t);let i=this.state,o=await this.deps.taskStore.get(t);if(!o)return;await this.deps.runService.finish(e$1.run_id,"failed",void 0,s),await this.deps.agentService.setStatus(e$1.agent_id,"idle");let p=await this.deps.agentStore.get(e$1.agent_id);p&&(p.current_task=void 0,await this.deps.agentStore.save(p));let c=await this.deps.agentStore.get(e$1.agent_id),l=Date.now()-new Date(e$1.started_at).getTime();await this.deps.agentService.updateStats(e$1.agent_id,{tasks_failed:(c?.stats.tasks_failed??0)+1,total_runs:(c?.stats.total_runs??0)+1,total_runtime_ms:(c?.stats.total_runtime_ms??0)+l});let r=e(o);if(await this.deps.taskService.updateStatus(t,r),r==="retrying"){let a=g(o.attempts-1,this.deps.config.scheduling.retry_base_delay_ms,this.deps.config.scheduling.retry_max_delay_ms);i.retry_queue.some(f=>f.task_id===t)||(i.retry_queue.length>=this.maxRetryQueueSize&&i.retry_queue.shift(),i.retry_queue.push({task_id:t,attempt:o.attempts+1,due_at:new Date(Date.now()+a).toISOString(),error:s})),this.deps.eventBus.emit({type:"run:retry",runId:e$1.run_id,attempt:o.attempts+1,delay_ms:a});}else i.stats.total_tasks_failed++;i.stats.total_runtime_ms+=l,delete i.running[t],i.stats.total_runs++,await this.saveState(),this.scheduleImmediateDispatch();}async runAutoReview(t,e,s){let o=await new k({cwd:s}).runAll(e),p=k.allPassed(o),c=await this.deps.taskStore.get(t);if(c&&(c.review_results=o,c.proof={...c.proof,test_results:k.formatReport(o),files_changed:c.proof?.files_changed??[]},await this.deps.taskStore.save(c),this.deps.eventBus.emit({type:"task:auto_reviewed",taskId:t,passed:p,results:o}),p))try{await this.deps.taskService.updateStatus(t,"done");}catch(l){let r=l instanceof Error?l.message:String(l);this.deps.eventBus.emit({type:"orchestrator:error",error:r,context:`auto-review transition failed for task ${t} -> done, force-writing`,fatal:false}),c.status="done",c.updated_at=new Date().toISOString(),await this.deps.taskStore.save(c).catch(a=>{this.deps.eventBus.emit({type:"orchestrator:error",error:a instanceof Error?a.message:String(a),context:`force-write task ${t} to store failed (auto-review)`,fatal:false});});}}async forceTaskToReview(t,e,s){t.proof={...t.proof,agent_summary:`${s}
12
-
13
- ${t.proof?.agent_summary??""}`.slice(0,2e3),files_changed:t.proof?.files_changed??[]},t.status="review",t.updated_at=new Date().toISOString(),await this.deps.taskStore.save(t),await this.deps.agentService.setStatus(e,"idle").catch(o=>{this.deps.eventBus.emit({type:"orchestrator:error",error:o instanceof Error?o.message:String(o),context:`forceTaskToReview setStatus idle for agent ${e}`,fatal:false});});let i=await this.deps.agentStore.get(e);i&&(i.current_task=void 0,await this.deps.agentStore.save(i)),await this.saveState();}unclaim(t){this.state.claimed.delete(t);}requireOwnership(){if(!this.lockAcquired)throw new d(0)}async loadState(){this.state=await this.deps.stateStore.read();}async saveState(){this.state&&await this.deps.stateStore.write(this.state);}saveStateLazy(){this.saveStateDirty=true,!this.saveStateTimer&&(this.saveStateTimer=setTimeout(()=>{this.saveStateTimer=null,this.saveStateDirty&&(this.saveStateDirty=false,this.saveState().catch(t=>{this.deps.eventBus.emit({type:"orchestrator:error",error:t instanceof Error?t.message:String(t),context:"debounced state save",fatal:false});}));},500));}async flushStateLazy(){this.saveStateTimer&&(clearTimeout(this.saveStateTimer),this.saveStateTimer=null),this.saveStateDirty&&(this.saveStateDirty=false,await this.saveState());}};function pt(u){if(typeof u!="string")return false;let t=new Date(u);return !isNaN(t.getTime())&&t.toISOString()===u}function et(u,t){let e=typeof u=="string"?u:JSON.stringify(u);return e.length>t?e.slice(0,t)+"\u2026":e}export{tt as Orchestrator};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{a as ProcessManager,b as readLines}from'./chunk-6MJ7V6VY.js';
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{a as AdapterRegistry}from'./chunk-CDFA4IIQ.js';
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import {i,p as p$1,j,q,c}from'./chunk-L26TK7Y5.js';function p(t,o){t.command("run [task-id]").description("Run tasks").option("--all","Run all todo tasks").option("--watch","Watch mode: continuous orchestration").action(async(e,r)=>{await o.paths.requireInit(),r.watch?await m(o):r.all?await d(o):e?await u(o,e):(i("Specify a task ID, --all, or --watch"),process.exit(2));});}async function u(t,o){let e=await t.taskService.get(o);console.log(),console.log(` ${p$1("orch")} \xB7 running ${o} "${e.title}"`);let r=t.eventBus.onAny(s=>{let c$1=new Date().toLocaleTimeString("en-US",{hour12:false,hour:"2-digit",minute:"2-digit",second:"2-digit"});switch(s.type){case "agent:output":console.log(` ${q(c$1)} ${c("agentAction")} ${typeof s.data=="string"?s.data.slice(0,80):""}`);break;case "agent:file_changed":console.log(` ${q(c$1)} ${c("agentAction")} Modified ${s.path}`);break;case "agent:error":console.log(` ${q(c$1)} ${c("failed")} ${s.error}`);break;case "agent:completed":s.success?j("Done"):i("Failed");break}});try{await t.orchestrator.runTask(o);}finally{r();}console.log();}async function d(t){console.log(),console.log(` ${p$1("orch")} \xB7 running all todo tasks`),console.log(),await t.orchestrator.runAll();}async function m(t){console.log(`${p$1("orch")} \xB7 watching \xB7 poll interval ${t.config.scheduling.poll_interval_ms/1e3}s`),console.log("\u2501".repeat(43)),console.log(),t.eventBus.onAny(o=>{let e=new Date().toLocaleTimeString("en-US",{hour12:false,hour:"2-digit",minute:"2-digit"});switch(o.type){case "agent:output":{let r=typeof o.data=="string"?o.data.slice(0,60):"";console.log(`${q(e)} ${c("agentAction")} ${r}`);break}case "agent:completed":o.success?console.log(`${q(e)} ${c("done")} DONE ${o.runId}`):console.log(`${q(e)} ${c("failed")} FAIL ${o.runId}`);break;case "run:retry":console.log(`${q(e)} ${c("retrying")} RETRY attempt ${o.attempt} \xB7 next in ${Math.round(o.delay_ms/1e3)}s`);break;case "orchestrator:tick":process.stdout.write(`\r${p$1("orch")} \xB7 watching \xB7 ${o.running} running \xB7 ${o.queued} queued `);break;case "orchestrator:stall_detected":console.log(`${q(e)} ${c("warning")} STALL ${o.runId}`);break;case "orchestrator:shutdown":console.log(`
3
- ${q("Shutting down...")}`);break}}),await t.orchestrator.startWatch();}export{p as registerRunCommand};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{a as ShellAdapter}from'./chunk-UW6GUUE6.js';import'./chunk-6MJ7V6VY.js';
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/infrastructure/adapters/event-buffer.ts","../src/infrastructure/adapters/shell.ts"],"names":[],"mappings":"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","file":"shell-IH2MMTVP.js","sourcesContent":["/**\n * Lock-free ring buffer for AgentEvent streaming.\n *\n * Replaces Array.shift() O(n) polling with O(1) dequeue\n * and event-driven notification instead of 50ms busy-wait.\n * Includes backpressure: when buffer is full, push() returns\n * a promise that resolves when space is available.\n */\n\nimport type { AgentEvent } from './interface.js';\n\nconst DEFAULT_CAPACITY = 1024;\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n}\n\nfunction deferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n const promise = new Promise<T>((r) => { resolve = r; });\n return { promise, resolve };\n}\n\nexport class EventBuffer {\n private buf: (AgentEvent | undefined)[];\n private head = 0; // read index\n private tail = 0; // write index\n private count = 0;\n private readonly capacity: number;\n\n // Consumer notification: resolved when new data is available\n private dataReady: Deferred<void> | null = null;\n // Producer notification: resolved when space is available\n private spaceReady: Deferred<void> | null = null;\n\n private closed = false;\n\n constructor(capacity = DEFAULT_CAPACITY) {\n this.capacity = capacity;\n this.buf = new Array(capacity);\n }\n\n /** Number of buffered events. */\n get size(): number {\n return this.count;\n }\n\n get isFull(): boolean {\n return this.count >= this.capacity;\n }\n\n /**\n * Push an event into the buffer.\n * If the buffer is full, waits until space is available (backpressure).\n */\n async push(event: AgentEvent): Promise<void> {\n while (this.isFull && !this.closed) {\n if (!this.spaceReady) {\n this.spaceReady = deferred<void>();\n }\n await this.spaceReady.promise;\n }\n if (this.closed) return;\n\n this.buf[this.tail] = event;\n this.tail = (this.tail + 1) % this.capacity;\n this.count++;\n\n // Wake up consumer if waiting\n if (this.dataReady) {\n const dr = this.dataReady;\n this.dataReady = null;\n dr.resolve();\n }\n }\n\n /**\n * Dequeue the next event. O(1).\n * Returns undefined only when buffer is empty AND closed.\n */\n async take(): Promise<AgentEvent | undefined> {\n while (this.count === 0) {\n if (this.closed) return undefined;\n if (!this.dataReady) {\n this.dataReady = deferred<void>();\n }\n await this.dataReady.promise;\n }\n\n const event = this.buf[this.head];\n this.buf[this.head] = undefined; // allow GC\n this.head = (this.head + 1) % this.capacity;\n this.count--;\n\n // Wake up producer if waiting for space\n if (this.spaceReady) {\n const sr = this.spaceReady;\n this.spaceReady = null;\n sr.resolve();\n }\n\n return event;\n }\n\n /**\n * Signal that no more events will be pushed.\n * Wakes up any waiting consumer/producer.\n */\n close(): void {\n this.closed = true;\n if (this.dataReady) {\n const dr = this.dataReady;\n this.dataReady = null;\n dr.resolve();\n }\n if (this.spaceReady) {\n const sr = this.spaceReady;\n this.spaceReady = null;\n sr.resolve();\n }\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n /**\n * Async iterator that drains the buffer until closed and empty.\n */\n async *[Symbol.asyncIterator](): AsyncGenerator<AgentEvent> {\n while (true) {\n const event = await this.take();\n if (event === undefined) return;\n yield event;\n }\n }\n}\n","/**\n * Shell adapter.\n *\n * Spawns an arbitrary command via `bash -lc`.\n * Task prompt is passed via ORCHESTRY_TASK_PROMPT env variable.\n * Consumes stdout and stderr concurrently to avoid deadlocks.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { readLines } from '../process/process-manager.js';\nimport { EventBuffer } from './event-buffer.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class ShellAdapter implements IAgentAdapter {\n readonly kind = 'shell';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('bash', ['--version']);\n const version = stdout.split('\\n')[0]?.trim() ?? 'unknown';\n return { ok: true, version };\n } catch {\n return { ok: false, error: 'bash not found' };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const command = params.config.command;\n if (!command) {\n // Return a handle that immediately yields an error\n async function* errorGen(): AsyncGenerator<AgentEvent> {\n yield {\n type: 'error',\n timestamp: new Date().toISOString(),\n data: 'Shell adapter requires a command in agent config',\n };\n }\n return { pid: 0, events: errorGen() };\n }\n\n const { process: proc, pid } = this.processManager.spawn('bash', ['-lc', command], {\n cwd: params.workspace,\n env: {\n ...process.env,\n ...params.env,\n ORCHESTRY_TASK_PROMPT: params.prompt,\n },\n signal: params.signal,\n });\n\n const signal = params.signal;\n const processManager = this.processManager;\n\n async function* generateEvents(): AsyncGenerator<AgentEvent> {\n // Ring buffer with backpressure replaces Array.shift() polling\n const buffer = new EventBuffer();\n\n // Ensure process is reaped on abort — SIGTERM + grace period + SIGKILL\n const onAbort = () => {\n processManager.killWithGrace(pid, 5_000).catch(() => {});\n };\n if (signal) {\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n const stdoutPromise = (async () => {\n if (!proc.stdout) return;\n for await (const line of readLines(proc.stdout)) {\n if (signal?.aborted) break;\n await buffer.push({\n type: 'output',\n timestamp: new Date().toISOString(),\n data: line,\n });\n }\n })();\n\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n for await (const line of readLines(proc.stderr)) {\n if (signal?.aborted) break;\n await buffer.push({\n type: 'error',\n timestamp: new Date().toISOString(),\n data: line,\n });\n }\n })();\n\n // Close the buffer once both streams are drained (or on error)\n void Promise.all([stdoutPromise, stderrPromise]).then(\n () => buffer.close(),\n () => buffer.close(),\n );\n\n // Yield events as they arrive — no polling, no busy-wait\n yield* buffer;\n\n // Clean up abort listener\n if (signal && !signal.aborted) {\n signal.removeEventListener('abort', onAbort);\n }\n\n // Wait for process to exit\n await new Promise<void>((resolve, reject) => {\n // If process already exited, resolve immediately\n if (proc.exitCode !== null || proc.killed) {\n resolve();\n return;\n }\n proc.on('close', (code) => {\n if (code === 0 || signal?.aborted) {\n resolve();\n } else {\n reject(new Error(`Shell command exited with code ${code}`));\n }\n });\n proc.on('error', reject);\n });\n }\n\n return { pid, events: generateEvents() };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n"]}
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
- import*as a from'readline';import r from'chalk';async function w(o){if(!process.stdin.isTTY)return null;let s=0;function u(){let n=process.stdout.rows??24;return Math.max(1,Math.min(o.length,n-4))}function d(){let n=u();process.stdout.write("\x1B[2J\x1B[H"),console.log(r.bold.yellow(`
3
- AGENT SHOP`)+r.gray(` \u2014 arrow keys to navigate, enter to select, q to cancel
4
- `));let c=Math.max(0,Math.min(s-Math.floor(n/2),o.length-n)),t=Math.min(c+n,o.length);for(let l=c;l<t;l++){let i=o[l],e=l===s,p=e?r.yellow(" \u25B8 "):" ",m=e?r.bold.white(i.name):r.gray(i.name),g=r.gray(` \u2014 ${i.description}`),h=r.gray.dim(` [${i.model.replace("claude-","")}]`);console.log(`${p}${m}${g}${h}`);}o.length>n&&console.log(r.gray(`
5
- ${c+1}-${t} of ${o.length}`));}return new Promise(n=>{let c=a.createInterface({input:process.stdin});process.stdin.setRawMode(true),a.emitKeypressEvents(process.stdin);function t(){process.stdin.removeListener("keypress",l);try{process.stdin.setRawMode(!1);}catch{}c.close(),process.stdout.write("\x1B[2J\x1B[H");}let l=(i,e)=>{e.name==="up"||e.ctrl&&e.name==="p"?(s=(s-1+o.length)%o.length,d()):e.name==="down"||e.ctrl&&e.name==="n"?(s=(s+1)%o.length,d()):e.name==="return"?(t(),n(o[s])):(e.name==="q"||e.name==="escape"||e.ctrl&&e.name==="c")&&(t(),n(null));};c.on("error",()=>{t(),n(null);}),c.on("close",()=>{t(),n(null);});try{d();}catch{t(),n(null);return}process.stdin.on("keypress",l);})}export{w as pickFromShop};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {g,p,q,d,o,e,h}from'./chunk-L26TK7Y5.js';function j(S,o$1){S.command("status").description("Show orchestrator status").action(async()=>{await o$1.paths.requireInit();let s=await o$1.taskService.list(),c=await o$1.agentService.list(),n=await o$1.stateStore.read();if(o$1.context.json){console.log(JSON.stringify({tasks:s,agents:c,state:n},null,2));return}let l=Object.keys(n.running).length,y=n.pid?"watching":"idle",g$1=n.started_at?g(n.started_at):"";console.log(),console.log(`${p("orch")} \xB7 ${o$1.config.project.name} \xB7 ${y}`),console.log();let e$1={};for(let t of s)e$1[t.status]=(e$1[t.status]??0)+1;l>0&&console.log(` ${"RUNNING".padEnd(12)}${l}${"".padEnd(20)}AGENTS ${c.length}`);for(let[t,a]of Object.entries(e$1))t!=="in_progress"&&console.log(` ${q(t.padEnd(12))}${a}`);let m=s.filter(t=>t.status==="in_progress");if(m.length>0){console.log();for(let t of m){let a=g(t.updated_at);console.log(` ${d("in_progress")} ${t.assignee?o(t.assignee):""} ${t.title.slice(0,35).padEnd(37)}${a} ${e(t.priority)}`);}}let d$1=n.stats.total_tokens.total,u=[g$1?`up ${g$1}`:null,d$1>0?`${h(d$1)} tokens`:null].filter(Boolean).join(" \xB7 ");u&&(console.log(),console.log(` ${q(u)}`)),console.log();});}export{j as registerStatusCommand};
@@ -1,20 +0,0 @@
1
- #!/usr/bin/env node
2
- import {a,b,c}from'./chunk-5AJ4LYO5.js';import {j,q,g,d,e,o,l,n,m}from'./chunk-L26TK7Y5.js';function A(_,e$1){let c$1=_.command("task").description("Manage tasks");c$1.command("add <title>").description("Create a new task").option("-d, --description <desc>","Task description").option("-p, --priority <n>","Priority (1-4)","3").option("-l, --labels <labels>","Comma-separated labels").option("--depends-on <ids>","Comma-separated dependency task IDs").option("--max-attempts <n>","Max retry attempts").option("--workspace-mode <mode>","Workspace mode: shared|worktree|isolated").option("--assignee <agent-id>","Assign to agent").option("--review-criteria <criteria>","Comma-separated auto-review criteria: test_pass,typecheck,lint").option("--scope <patterns>","Comma-separated glob patterns for file scope (e.g. src/auth/**,src/session/**)").option("--goal-id <goalId>","Associate task with a goal").option("--attach <paths>","Comma-separated file paths to attach (screenshots, docs)").option("-e, --edit","Open $EDITOR to write the description").action(async(s,t)=>{await e$1.paths.requireInit();let o=t.description;if(t.edit){let n=await a(b({title:s,priority:parseInt(t.priority,10),description:o}));o=c(n).description;}let i=await e$1.taskService.create({title:s,description:o,priority:parseInt(t.priority,10),labels:t.labels?.split(",").map(n=>n.trim()),depends_on:t.dependsOn?.split(",").map(n=>n.trim()),max_attempts:t.maxAttempts?parseInt(t.maxAttempts,10):void 0,workspace_mode:t.workspaceMode,assignee:t.assignee,review_criteria:t.reviewCriteria?.split(",").map(n=>n.trim()),scope:t.scope?.split(",").map(n=>n.trim()),goalId:t.goalId,attachments:t.attach?.split(",").map(n=>n.trim())});e$1.context.json?console.log(JSON.stringify(i,null,2)):e$1.context.quiet?console.log(i.id):j(`Created ${i.id} "${i.title}"`);}),c$1.command("list").description("List all tasks").option("--status <status>","Filter by status").action(async s=>{await e$1.paths.requireInit();let t=await e$1.taskService.list(s.status?{status:s.status}:void 0);if(e$1.context.json){console.log(JSON.stringify(t,null,2));return}if(e$1.context.quiet){t.forEach(a=>console.log(a.id));return}if(t.length===0){console.log(`
3
- No tasks. Create one: ${q('orch task add "Title"')}
4
- `);return}let o$1=["STATUS","PRI","TASK","AGENT","TIME"],i=t.map(a=>{let S=(a.status==="in_progress"||a.status==="done")&&a.updated_at?g(a.updated_at):q("\u2014");return [`${d(a.status)} ${a.status}`,e(a.priority),a.title.slice(0,35),a.assignee?o(a.assignee):q("\u2014"),S]});console.log(),l(o$1,i);let n=t.filter(a=>a.status==="in_progress").length,r=t.filter(a=>a.status==="review").length,l$1=t.filter(a=>a.status==="done").length;console.log(`
5
- ${t.length} tasks${n?` \xB7 ${n} running`:""}${r?` \xB7 ${r} review`:""}${l$1?` \xB7 ${l$1} done`:""}
6
- `);}),c$1.command("show <id>").description("Show task details").action(async s=>{await e$1.paths.requireInit();let t=await e$1.taskService.get(s);if(e$1.context.json){console.log(JSON.stringify(t,null,2));return}console.log(`
7
- ${t.title}`),console.log(` ${"\u2550".repeat(42)}`),console.log();let o$1=[["Status",`${d(t.status)} ${t.status} \xB7 attempt ${t.attempts}/${t.max_attempts}`],["Priority",e(t.priority)]];if(t.assignee&&o$1.push(["Agent",o(t.assignee)]),t.labels.length&&o$1.push(["Labels",t.labels.join(", ")]),t.scope?.length&&o$1.push(["Scope",t.scope.join(", ")]),t.workspace_mode&&o$1.push(["Workspace",t.workspace_mode]),t.workspace&&o$1.push(["Path",n(t.workspace)]),t.review_criteria?.length&&o$1.push(["Review",t.review_criteria.join(", ")]),t.feedback&&o$1.push(["Feedback",t.feedback]),o$1.push(["Created",t.created_at]),m(o$1),t.attachments?.length){console.log(`
8
- Attachments (${t.attachments.length})
9
- ${"\u2500".repeat(42)}`);for(let i of t.attachments)console.log(` ${n(i)}`);}if(t.description){console.log(`
10
- Description
11
- ${"\u2500".repeat(42)}`);for(let i of t.description.split(`
12
- `))console.log(` ${i}`);}if(t.proof){if(console.log(`
13
- Result
14
- ${"\u2500".repeat(42)}`),t.proof.branch&&console.log(` Branch: ${t.proof.branch}`),t.proof.pr_url&&console.log(` PR: ${t.proof.pr_url}`),t.proof.files_changed.length){console.log(" Files changed:");for(let i of t.proof.files_changed)console.log(` \u2022 ${i}`);}if(t.proof.test_results){console.log(" Test results:");for(let i of t.proof.test_results.split(`
15
- `))console.log(` ${i}`);}if(t.proof.agent_summary){console.log(" Agent summary:");for(let i of t.proof.agent_summary.split(`
16
- `))console.log(` ${i}`);}}if(t.review_results?.length){console.log(`
17
- Review Results
18
- ${"\u2500".repeat(42)}`);for(let i of t.review_results){let n=i.passed?"\u2713":"\u2717";if(console.log(` ${n} ${i.criterion}: ${i.passed?"passed":"failed"}`),i.output)for(let r of i.output.split(`
19
- `))console.log(` ${r}`);}}console.log();}),c$1.command("edit <id>").description("Open task in $EDITOR to modify title, priority and description").action(async s=>{await e$1.paths.requireInit();let t=await e$1.taskService.get(s),o=t.attachments?.length?`
20
- # Attachments: ${t.attachments.join(", ")}`:"",i=b({title:t.title,priority:t.priority,description:t.description})+o,n=await a(i),r=c(n),l={};if(r.title&&r.title!==t.title&&(l.title=r.title),r.priority&&r.priority!==t.priority&&(l.priority=r.priority),r.description!==void 0&&r.description!==t.description&&(l.description=r.description??""),Object.keys(l).length===0){console.log(" No changes.");return}let a$1=await e$1.taskService.update(s,l);j(`Updated ${a$1.id} "${a$1.title}"`);}),c$1.command("assign <task-id> <agent-id>").description("Assign task to agent").action(async(s,t)=>{await e$1.paths.requireInit();let o=await e$1.taskService.assign(s,t);j(`Assigned ${o.id} \u2192 ${t}`);}),c$1.command("cancel <id>").description("Cancel a task").action(async s=>{if(await e$1.paths.requireInit(),(await e$1.taskService.get(s)).status==="in_progress"){let{buildFullContainer:o}=await import('./container-OIXLFSX2.js');await(await o(e$1.context)).orchestrator.cancelTask(s);}else await e$1.taskService.cancel(s);j(`Cancelled ${s}`);}),c$1.command("approve <id>").description("Approve a task in review").action(async s=>{await e$1.paths.requireInit(),await e$1.taskService.updateStatus(s,"done"),j(`Approved ${s}`);}),c$1.command("reject <id>").description("Reject a task and send it back for rework").option("-r, --reason <reason>","Feedback for the agent explaining what to fix").action(async(s,t)=>{await e$1.paths.requireInit(),await e$1.taskService.reject(s,t.reason),j(`Rejected ${s} \u2192 todo${t.reason?` (reason: ${t.reason})`:""}`);}),c$1.command("retry <id>").description("Retry a failed task").action(async s=>{await e$1.paths.requireInit(),await e$1.taskService.retry(s),j(`Reset ${s} to todo`);});}export{A as registerTaskCommand};
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import {j,q,l,m}from'./chunk-L26TK7Y5.js';function g(l$1,t){let n=l$1.command("team").description("Manage agent teams");n.command("create <name>").description("Create a new team").requiredOption("--lead <agent-id>","Lead agent ID").option("--members <ids>","Comma-separated member agent IDs").option("-d, --description <desc>","Team description").option("--no-auto-claim","Disable auto-claiming").action(async(a,e)=>{await t.paths.requireInit();let i=await t.teamService.create({name:a,description:e.description,lead_agent_id:e.lead,member_agent_ids:e.members?.split(",").map(o=>o.trim()),config:{auto_claim:e.autoClaim!==false}});t.context.json?console.log(JSON.stringify(i,null,2)):t.context.quiet?console.log(i.id):j(`Created team "${i.name}" \u2192 ${i.id}`);}),n.command("list").description("List all teams").action(async()=>{await t.paths.requireInit();let a=await t.teamService.list();if(t.context.json){console.log(JSON.stringify(a,null,2));return}if(a.length===0){console.log(q(`
3
- No teams. Create one: orch team create <name> --lead <agent-id>
4
- `));return}let e=["ID","NAME","STATUS","LEAD","MEMBERS","POOL"],i=a.map(o=>[o.id,o.name,o.status,o.lead_agent_id,String(o.members.length),String(o.task_pool.length)]);console.log(),l(e,i),console.log();}),n.command("show <id>").description("Show team details").action(async a=>{await t.paths.requireInit();let e=await t.teamService.get(a);if(t.context.json){console.log(JSON.stringify(e,null,2));return}console.log(),m([["ID",e.id],["Name",e.name],["Status",e.status],["Lead",e.lead_agent_id],["Members",e.members.map(i=>`${i.agent_id} (${i.role})`).join(", ")],["Pool",e.task_pool.length>0?e.task_pool.join(", "):q("empty")],["Auto-claim",String(e.config.auto_claim)],["Created",e.created_at]]),console.log();}),n.command("join <team-id> <agent-id>").description("Add an agent to a team").action(async(a,e)=>{await t.paths.requireInit(),await t.teamService.join(a,e),j(`Agent ${e} joined team ${a}`);}),n.command("leave <team-id> <agent-id>").description("Remove an agent from a team").action(async(a,e)=>{await t.paths.requireInit(),await t.teamService.leave(a,e),j(`Agent ${e} left team ${a}`);}),n.command("add-task <team-id> <task-id>").description("Add a task to the team pool").action(async(a,e)=>{await t.paths.requireInit(),await t.teamService.addTask(a,e),j(`Task ${e} added to team ${a} pool`);}),n.command("set-lead <team-id> <agent-id>").description("Transfer team lead to another member").action(async(a,e)=>{await t.paths.requireInit(),await t.teamService.setLead(a,e),j(`${e} is now lead of team ${a}`);}),n.command("disband <id>").description("Disband a team").action(async a=>{await t.paths.requireInit(),await t.teamService.disband(a),j(`Team ${a} disbanded`);});}export{g as registerTeamCommand};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{c as DEFAULT_PROMPT_TEMPLATE,a as LiquidTemplateEngine,b as buildPromptContext}from'./chunk-HSBYJ5C5.js';import'./chunk-CHRW4CLD.js';
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- function it(c,e){c.command("tui").description("Launch interactive TUI dashboard").action(async()=>{await e.paths.requireInit();let y=await e.taskService.list(),v=await e.agentService.list(),S=await e.stateStore.read(),{render:w}=await import('ink'),{createElement:h}=await import('react'),{App:f}=await import('./App-YJM5QGP7.js'),T=async t=>{await e.orchestrator.runTask(t);},k=async(t,s)=>e.taskService.create({title:t,priority:s?.priority,description:s?.description,attachments:s?.attachments}),A=async t=>{await e.orchestrator.cancelTask(t);},R=async t=>{await e.taskService.retry(t);},_=async(t,s)=>{await e.taskService.assign(t,s);},b=async()=>{await e.orchestrator.runAll();},C=async t=>{await e.agentService.disable(t);},E=async t=>{await e.agentService.enable(t);},j=t=>e.eventBus.onAny(t),D=async()=>e.taskService.list(),P=async()=>e.agentService.list(),G=async()=>e.stateStore.read(),U=async(t,s,n)=>e.agentService.create({name:t,adapter:s??"claude",model:n?.model||void 0,role:n?.role||void 0,approval_policy:n?.approval_policy||void 0,skills:n?.skills||void 0}),x=async t=>{await e.agentService.remove(t);},I=async t=>{await e.taskService.delete(t);},L=async t=>{await e.taskService.updateStatus(t,"done");},H=async(t,s)=>{await e.taskService.reject(t,s);},W=async(t,s)=>e.taskService.update(t,s),F=async(t,s)=>e.agentService.update(t,{...s,approval_policy:s.approval_policy}),M=async t=>{await e.orchestrator.forceStopAgent(t);},N=async(t,s)=>e.agentService.setAutonomous(t,s),O=async t=>{let s=await e.runService.listAll(),n=3,rt=10,p=s.slice(0,n),d=s.slice(n,rt),u=async a=>(await e.runService.readEventsTail(a.id,30)).map(r=>({timestamp:r.timestamp,agentId:a.agent_id,taskId:a.task_id,type:r.type,data:r.data}));if(p.length>0){let a=(await Promise.all(p.map(u))).flat();a.sort((i,r)=>new Date(i.timestamp).getTime()-new Date(r.timestamp).getTime()),t(a.slice(-200));}if(d.length>0){let a=(await Promise.all(d.map(u))).flat();a.sort((i,r)=>new Date(i.timestamp).getTime()-new Date(r.timestamp).getTime()),t(a.slice(-200));}},V=async t=>e.teamService.create(t),q=async()=>e.teamService.list(),B=async(t,s)=>e.teamService.join(t,s),J=async(t,s)=>e.teamService.leave(t,s),K=async t=>{await e.teamService.disband(t);},z=async(t,s)=>e.teamService.setLead(t,s),Q=async()=>e.goalService.list(),X=async t=>e.goalService.create(t),Y=async(t,s)=>e.goalService.update(t,s),Z=async(t,s)=>e.goalService.updateStatus(t,s),$=async t=>{await e.goalService.delete(t);},tt=async t=>e.goalService.getProgressReport(t),et=async()=>{await e.orchestrator.startWatch();},st=async()=>{await e.orchestrator.stop();},l=c.version()??"0.0.0",at=import('./update-check-HGMBDYHL.js').then(t=>t.checkForUpdateSWR(l)).catch(()=>null),o=false,g;try{await e.orchestrator.startWatch(),o=!0;}catch(t){g=t instanceof Error?t.message:String(t);}let m=await at,{waitUntilExit:nt}=w(h(f,{projectName:e.config.project.name,tasks:y,agents:v,state:S,onRunTask:T,onCreateTask:k,onCancelTask:A,onRetryTask:R,onAssignTask:_,onRunAll:b,onDisableAgent:C,onEnableAgent:E,onSubscribeEvents:j,onRefreshTasks:D,onRefreshAgents:P,onRefreshState:G,onLoadHistory:O,onAddAgent:U,onDeleteAgent:x,onApproveTask:L,onRejectTask:H,onDeleteTask:I,onUpdateTask:W,onUpdateAgent:F,onForceStopAgent:M,onToggleAutonomous:N,onRefreshGoals:Q,onCreateGoal:X,onUpdateGoal:Y,onUpdateGoalStatus:Z,onDeleteGoal:$,onGetGoalProgress:tt,onCreateTeam:V,onListTeams:q,onJoinTeam:B,onLeaveTeam:J,onDisbandTeam:K,onSetTeamLead:z,onStartWatch:et,onStopWatch:st,initialWatchActive:o,watchError:g,version:l,latestVersion:m?.updateAvailable?m.latest:void 0,initialActivityFilter:e.globalConfig.tui.activity_filter,onSaveActivityFilter:async t=>{await e.globalConfigStore.set("activity_filter",t);},initialMaxConcurrent:e.config.scheduling.max_concurrent_agents,onSaveMaxConcurrent:async t=>{await e.configStore.set("scheduling.max_concurrent_agents",t),e.config.scheduling.max_concurrent_agents=t;}}),{kittyKeyboard:{mode:"auto",flags:["disambiguateEscapeCodes"]}});await nt(),o&&await e.orchestrator.stop().catch(()=>{});});}export{it as registerTuiCommand};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {a}from'./chunk-UMZEA3JT.js';import {p,q}from'./chunk-L26TK7Y5.js';import {execFile}from'child_process';import e from'chalk';var c="@oxgeneral/orch";function u(){return new Promise(n=>{let t=execFile("npm",["install","-g",`${c}@latest`],{timeout:6e4},(s,o,a)=>{let d=(o??"")+(a??"");n({code:s?1:0,output:d});});t.stdout?.pipe(process.stdout),t.stderr?.pipe(process.stderr);})}function h(n){n.command("update").description("Check for updates and install the latest version").option("--check","Only check, do not install").action(async t=>{console.log(),console.log(` ${p("orch update")} \xB7 checking for updates\u2026`),console.log();let s=n.version()??"0.0.0",o=await a(s);if(o||(console.log(` ${e.ansi256(167)("\u2715")} Could not reach npm registry`),console.log(" Check your network connection and try again."),console.log(),process.exit(1)),!o.updateAvailable){console.log(` ${e.ansi256(72)("\u2713")} Already up to date ${q(`(${o.current})`)}`),console.log();return}if(console.log(` ${e.ansi256(214)("\u25CF")} Update available: ${q(o.current)} \u2192 ${e.ansi256(72)(o.latest)}`),console.log(),t.check){console.log(` Run ${q("orch update")} to install.`),console.log();return}console.log(` Installing ${c}@${o.latest}\u2026`),console.log(),(await u()).code!==0&&(console.log(),console.log(` ${e.ansi256(167)("\u2715")} Update failed. Try manually:`),console.log(` npm install -g ${c}@latest`),console.log(),process.exit(1)),console.log(),console.log(` ${e.ansi256(72)("\u2713")} Updated to ${o.latest}`),console.log();});}export{h as registerUpdateCommand};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{a as checkForUpdateNow,b as checkForUpdateSWR,c as printUpdateNotification}from'./chunk-UMZEA3JT.js';
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import {m,n as n$1,i}from'./chunk-ZA5Z33GO.js';import {l}from'./chunk-GZ2Q56YZ.js';import n from'path';import h from'fs/promises';var g=class{constructor(r,e){this.projectRoot=r;this.processManager=e;}async mergeBack(r){return new Promise(e=>{let{process:o}=this.processManager.spawn("git",["merge","--no-ff",r,"-m",`Merge ${r}`],{cwd:this.projectRoot}),t="",a=2e3,c=i=>{t.length<a&&(t+=i.toString());};o.stdout?.on("data",c),o.stderr?.on("data",c),o.on("close",i=>{if(i===0){e({success:true});return}let s=t.slice(0,1e3);if(!(s.includes("CONFLICT")||s.includes("Merge conflict"))){e({success:false,conflictInfo:s});return}try{let{process:f}=this.processManager.spawn("git",["merge","--abort"],{cwd:this.projectRoot});f.on("close",()=>{e({success:!1,conflictInfo:s});}),f.on("error",()=>{e({success:!1,conflictInfo:s});});}catch{e({success:false,conflictInfo:s});}}),o.on("error",i=>{e({success:false,conflictInfo:i.message});});})}};var y=class{constructor(r,e,o){this.projectRoot=r;this.orchestryDir=e;this.processManager=o;this.mergeStrategy=new g(r,o);}mergeStrategy;gitRepoChecked=false;isGitRepo=false;async prepare(r,e,o){let t=this.resolveMode(r,e,o);switch(t!=="shared"&&await this.requireGitRepo(t),t){case "shared":return {path:this.projectRoot};case "worktree":return this.prepareWorktree(r);case "isolated":return {path:await this.prepareIsolated(r)};default:return {path:this.projectRoot}}}async requireGitRepo(r){if(!this.gitRepoChecked){try{let{process:e}=this.processManager.spawn("git",["rev-parse","--is-inside-work-tree"],{cwd:this.projectRoot}),o=await new Promise(t=>{e.on("close",t),e.on("error",()=>t(1));});this.isGitRepo=o===0;}catch{this.isGitRepo=false;}this.isGitRepo&&(this.gitRepoChecked=true);}if(!this.isGitRepo)throw new l(`workspace_mode "${r}" requires a git repository`,`Run: git init && git add -A && git commit -m "Initial commit"
3
- Or set workspace_mode: shared in .orchestry/config.yml`)}async mergeBack(r){return this.mergeStrategy.mergeBack(r)}async cleanup(r){let e=n.join(this.orchestryDir,"workspaces",m(r));try{let{process:o}=this.processManager.spawn("git",["worktree","remove","--force",e],{cwd:this.projectRoot});await new Promise(t=>{o.on("close",()=>t()),o.on("error",()=>t());});}catch{}try{await h.rm(e,{recursive:!0,force:!0});}catch{}}validate(r,e){n$1(r,e);}resolveMode(r,e,o){return r.workspace_mode??e.config.workspace_mode??o.defaults.agent.workspace_mode??"worktree"}async prepareWorktree(r){let e=n.join(this.orchestryDir,"workspaces",m(r.id));await i(n.dirname(e));let o=k(r.title)||m(r.id),t=`orchestry/${m(r.id)}/${o}`,{process:a}=this.processManager.spawn("git",["worktree","add",e,"-b",t],{cwd:this.projectRoot});await new Promise((i,s)=>{a.on("close",p=>{p===0?i():s(new Error(`git worktree add failed with code ${p}`));}),a.on("error",s);});let c=n.join(e,".orchestry");return await h.rm(c,{recursive:true,force:true}).catch(()=>{}),{path:e,branch:t}}async prepareIsolated(r){let e=n.join(this.orchestryDir,"workspaces",m(r.id));await i(n.dirname(e));try{let{process:t}=this.processManager.spawn("git",["clone","--local","--no-hardlinks",".",e],{cwd:this.projectRoot});await new Promise((a,c)=>{t.on("close",i=>{i===0?a():c(new Error("git clone failed"));}),t.on("error",c);});}catch{let a=["-a",`--exclude-from=${n.join(this.orchestryDir,"workspace-exclude")}`,"./",`${e}/`],{process:c}=this.processManager.spawn("rsync",a,{cwd:this.projectRoot});await new Promise((i,s)=>{c.on("close",p=>{p===0?i():s(new Error(`rsync failed with code ${p}`));}),c.on("error",s);});}let o=n.join(e,".orchestry");return await h.rm(o,{recursive:true,force:true}).catch(()=>{}),e}};function k(l){return l.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}export{y as WorkspaceManager};