@oxgeneral/orch 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/App-TW35IULR.js +18 -0
  2. package/dist/agent-FRQKL7YI.js +9 -0
  3. package/dist/{orchestrator-VGYKSOZJ.js → chunk-2UC4SVJB.js} +236 -71
  4. package/dist/chunk-2UC4SVJB.js.map +1 -0
  5. package/dist/chunk-5AJ4LYO5.js +8 -0
  6. package/dist/{chunk-45K2XID7.js → chunk-6DWHQPTE.js} +2 -1
  7. package/dist/chunk-6DWHQPTE.js.map +1 -0
  8. package/dist/{chunk-POUC4CPC.js → chunk-6MJ7V6VY.js} +2 -2
  9. package/dist/{chunk-HNKJ4IF7.js → chunk-B4JQM4NU.js} +34 -10
  10. package/dist/chunk-B4JQM4NU.js.map +1 -0
  11. package/dist/{chunk-6HENRUYZ.js → chunk-CDFA4IIQ.js} +2 -2
  12. package/dist/chunk-CHRW4CLD.js +2 -0
  13. package/dist/{chunk-ZU6AY2VU.js → chunk-GZ2Q56YZ.js} +2 -2
  14. package/dist/chunk-HMMPM7MF.js +3 -0
  15. package/dist/{chunk-AELEEEV3.js → chunk-HSBYJ5C5.js} +27 -7
  16. package/dist/chunk-HXOMNULD.js +2 -0
  17. package/dist/{chunk-O5AO5QIR.js → chunk-IQXRQBUK.js} +9 -2
  18. package/dist/chunk-IQXRQBUK.js.map +1 -0
  19. package/dist/chunk-L26TK7Y5.js +2 -0
  20. package/dist/chunk-L3FYR45M.js +2 -0
  21. package/dist/chunk-LXNRCJ22.js +2 -0
  22. package/dist/{chunk-TX7WOFCW.js → chunk-MGFMVPRD.js} +4 -7
  23. package/dist/chunk-MGFMVPRD.js.map +1 -0
  24. package/dist/chunk-MNXU3KCD.js +2 -0
  25. package/dist/{chunk-CHIP7O6V.js → chunk-O2MSGW3V.js} +3 -1
  26. package/dist/chunk-O2MSGW3V.js.map +1 -0
  27. package/dist/chunk-PJ5DKXGR.js +2 -0
  28. package/dist/{chunk-VTA74YWX.js → chunk-QEEM67OA.js} +11 -17
  29. package/dist/chunk-QEEM67OA.js.map +1 -0
  30. package/dist/chunk-UMZEA3JT.js +5 -0
  31. package/dist/{shell-OGTSH4RJ.js → chunk-UW6GUUE6.js} +3 -3
  32. package/dist/chunk-XDVMX2FO.js +8 -0
  33. package/dist/chunk-XDVMX2FO.js.map +1 -0
  34. package/dist/chunk-ZA5Z33GO.js +11 -0
  35. package/dist/claude-E36EGXUV.js +2 -0
  36. package/dist/{chunk-IRN2U2NE.js → claude-RIB3RQS5.js} +5 -2
  37. package/dist/claude-RIB3RQS5.js.map +1 -0
  38. package/dist/cli.js +1 -199
  39. package/dist/clipboard-service-PDTSZIR5.js +25 -0
  40. package/dist/codex-OTZKVESD.js +2 -0
  41. package/dist/{codex-U7LTJTX6.js → codex-VBUSA2GJ.js} +5 -3
  42. package/dist/codex-VBUSA2GJ.js.map +1 -0
  43. package/dist/config-CCSS2P7R.js +2 -0
  44. package/dist/container-OIXLFSX2.js +6 -0
  45. package/dist/context-GSMQHQES.js +7 -0
  46. package/dist/cursor-3DJA6LWS.js +2 -0
  47. package/dist/{cursor-3DI5GKRF.js → cursor-4QIOTDBW.js} +5 -3
  48. package/dist/cursor-4QIOTDBW.js.map +1 -0
  49. package/dist/doctor-KBK5JZBZ.js +2 -0
  50. package/dist/doctor-service-F2SXDWHS.js +91 -0
  51. package/dist/doctor-service-F2SXDWHS.js.map +1 -0
  52. package/dist/doctor-service-PB7YBH3F.js +2 -0
  53. package/dist/goal-RFKFPR7M.js +8 -0
  54. package/dist/index.d.ts +124 -46
  55. package/dist/index.js +1817 -5
  56. package/dist/index.js.map +1 -1
  57. package/dist/init-WRDFAFS2.js +53 -0
  58. package/dist/logs-5QHJWMEG.js +12 -0
  59. package/dist/msg-4SCLBO4K.js +9 -0
  60. package/dist/orchestrator-FGGXK3N3.js +5 -0
  61. package/dist/{orchestrator-TAFBYQQ5.js.map → orchestrator-FGGXK3N3.js.map} +1 -1
  62. package/dist/orchestrator-R7IWZUT6.js +13 -0
  63. package/dist/process-manager-33H27MQF.js +2 -0
  64. package/dist/process-manager-A36Y7LHP.js +3 -0
  65. package/dist/{process-manager-TLZOTO4Y.js.map → process-manager-A36Y7LHP.js.map} +1 -1
  66. package/dist/registry-BO2PPRNG.js +2 -0
  67. package/dist/registry-JXXRLJ5J.js +3 -0
  68. package/dist/{registry-UQAHK77P.js.map → registry-JXXRLJ5J.js.map} +1 -1
  69. package/dist/run-HSHRELOP.js +3 -0
  70. package/dist/shell-EOJBDWTH.js +2 -0
  71. package/dist/{chunk-CIIE6LNG.js → shell-IH2MMTVP.js} +3 -2
  72. package/dist/shell-IH2MMTVP.js.map +1 -0
  73. package/dist/status-DLBNWSWM.js +2 -0
  74. package/dist/task-J6ZN7ALI.js +20 -0
  75. package/dist/team-MSIBKOQC.js +4 -0
  76. package/dist/template-engine-MFL5B677.js +3 -0
  77. package/dist/{template-engine-322SCRR6.js.map → template-engine-MFL5B677.js.map} +1 -1
  78. package/dist/template-engine-ONIDVD4F.js +2 -0
  79. package/dist/tui-G4XUFAIP.js +2 -0
  80. package/dist/update-PC2ENCKU.js +2 -0
  81. package/dist/update-check-HGMBDYHL.js +2 -0
  82. package/dist/workspace-manager-KOOYTO7E.js +3 -0
  83. package/dist/{workspace-manager-47KI7B27.js → workspace-manager-T6AXG7XL.js} +40 -3
  84. package/dist/workspace-manager-T6AXG7XL.js.map +1 -0
  85. package/package.json +2 -1
  86. package/readme.md +5 -4
  87. package/scripts/benchmark.ts +304 -0
  88. package/dist/App-KDZSTAMR.js +0 -4864
  89. package/dist/agent-V5M2C3OC.js +0 -157
  90. package/dist/chunk-2B32FPEB.js +0 -11
  91. package/dist/chunk-2B32FPEB.js.map +0 -1
  92. package/dist/chunk-33QNTNR6.js +0 -46
  93. package/dist/chunk-6GFVB6EK.js +0 -101
  94. package/dist/chunk-6HENRUYZ.js.map +0 -1
  95. package/dist/chunk-AELEEEV3.js.map +0 -1
  96. package/dist/chunk-E3TCKHU6.js +0 -13
  97. package/dist/chunk-E3TCKHU6.js.map +0 -1
  98. package/dist/chunk-ED47GL3F.js +0 -29
  99. package/dist/chunk-HXYAZGLP.js +0 -15
  100. package/dist/chunk-I5WEMARW.js +0 -166
  101. package/dist/chunk-IZYSGYXG.js +0 -2
  102. package/dist/chunk-IZYSGYXG.js.map +0 -1
  103. package/dist/chunk-P6ATSXGL.js +0 -107
  104. package/dist/chunk-PBFE5V3G.js +0 -2
  105. package/dist/chunk-PBFE5V3G.js.map +0 -1
  106. package/dist/chunk-PNE6LQRF.js +0 -5
  107. package/dist/chunk-POUC4CPC.js.map +0 -1
  108. package/dist/chunk-XI4TU6VU.js +0 -50
  109. package/dist/chunk-ZU6AY2VU.js.map +0 -1
  110. package/dist/claude-GH6P2DC5.js +0 -4
  111. package/dist/claude-S47YTIHU.js +0 -2
  112. package/dist/claude-S47YTIHU.js.map +0 -1
  113. package/dist/codex-2CH57B7G.js +0 -2
  114. package/dist/codex-2CH57B7G.js.map +0 -1
  115. package/dist/config-LJFM55LN.js +0 -75
  116. package/dist/container-JV7TAUP5.js +0 -1532
  117. package/dist/context-EPSDCJTU.js +0 -83
  118. package/dist/cursor-QFUNKPCQ.js +0 -2
  119. package/dist/cursor-QFUNKPCQ.js.map +0 -1
  120. package/dist/doctor-IO4PV4D6.js +0 -67
  121. package/dist/doctor-service-A34DHPKI.js +0 -2
  122. package/dist/doctor-service-NTWBWOM2.js +0 -2
  123. package/dist/doctor-service-NTWBWOM2.js.map +0 -1
  124. package/dist/goal-I56QP7HS.js +0 -110
  125. package/dist/init-BE5VKWOM.js +0 -149
  126. package/dist/logs-IAUAS5TX.js +0 -207
  127. package/dist/msg-SQWQLJP6.js +0 -95
  128. package/dist/orchestrator-TAFBYQQ5.js +0 -2
  129. package/dist/process-manager-HUVNAPQV.js +0 -2
  130. package/dist/process-manager-TLZOTO4Y.js +0 -2
  131. package/dist/registry-PQWRVNF2.js +0 -2
  132. package/dist/registry-UQAHK77P.js +0 -2
  133. package/dist/run-PSZURVVL.js +0 -95
  134. package/dist/shell-5ZNXFGXV.js +0 -3
  135. package/dist/shell-OGTSH4RJ.js.map +0 -1
  136. package/dist/status-DTF7D3DV.js +0 -56
  137. package/dist/task-5OJTXW27.js +0 -209
  138. package/dist/team-AISPLEJB.js +0 -97
  139. package/dist/template-engine-322SCRR6.js +0 -2
  140. package/dist/template-engine-3CDRZNMJ.js +0 -3
  141. package/dist/tui-XDJE3IUA.js +0 -225
  142. package/dist/update-72GZMF65.js +0 -64
  143. package/dist/update-check-4RV7Z6WT.js +0 -2
  144. package/dist/workspace-manager-7M46ESUL.js +0 -2
  145. package/dist/workspace-manager-7M46ESUL.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/domain/errors.ts"],"names":[],"mappings":"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","file":"chunk-IQXRQBUK.js","sourcesContent":["/**\n * Typed error hierarchy for the orchestrator.\n *\n * Every error carries an exit code (matching CLI_UI_DESIGN.md §11)\n * and an optional hint for the user.\n *\n * Exit codes:\n * 0 - Success\n * 1 - General error\n * 2 - Invalid arguments\n * 3 - Not initialized (.orchestry/ not found)\n * 4 - Lock conflict (orchestrator already running)\n * 5 - Agent error (adapter test failed)\n */\n\nexport class OrchestryError extends Error {\n constructor(\n message: string,\n public readonly exitCode: number,\n public readonly hint?: string,\n ) {\n super(message);\n this.name = 'OrchestryError';\n }\n}\n\nexport class NotInitializedError extends OrchestryError {\n constructor() {\n super('Not initialized', 3, 'Run: orch init');\n this.name = 'NotInitializedError';\n }\n}\n\nexport class InvalidArgumentsError extends OrchestryError {\n constructor(message: string) {\n super(message, 2);\n this.name = 'InvalidArgumentsError';\n }\n}\n\nexport class LockConflictError extends OrchestryError {\n constructor(pid: number) {\n super(`Orchestrator already running (PID: ${pid})`, 4, 'Use: orch status');\n this.name = 'LockConflictError';\n }\n}\n\nexport class AgentAdapterError extends OrchestryError {\n constructor(adapter: string, detail: string) {\n super(`Agent adapter \"${adapter}\" not available`, 5, detail);\n this.name = 'AgentAdapterError';\n }\n}\n\nexport class NoAgentsError extends OrchestryError {\n constructor() {\n super('No agents configured', 1, 'Run: orch agent add <name> --adapter claude');\n this.name = 'NoAgentsError';\n }\n}\n\nexport class TaskNotFoundError extends OrchestryError {\n constructor(taskId: string) {\n super(`Task not found: ${taskId}`, 1);\n this.name = 'TaskNotFoundError';\n }\n}\n\nexport class AgentNotFoundError extends OrchestryError {\n constructor(agentId: string) {\n super(`Agent not found: ${agentId}`, 1);\n this.name = 'AgentNotFoundError';\n }\n}\n\nexport class TaskAlreadyRunningError extends OrchestryError {\n constructor(taskId: string, runId: string, agentName: string) {\n super(\n `Task ${taskId} is already running (run: ${runId}, agent: ${agentName})`,\n 1,\n `Use: orch logs --task ${taskId} --follow`,\n );\n this.name = 'TaskAlreadyRunningError';\n }\n}\n\nexport class InvalidTransitionError extends OrchestryError {\n constructor(taskId: string, from: string, to: string) {\n super(`Invalid transition for ${taskId}: ${from} → ${to}`, 1);\n this.name = 'InvalidTransitionError';\n }\n}\n\nexport class GoalNotFoundError extends OrchestryError {\n constructor(goalId: string) {\n super(`Goal not found: ${goalId}`, 1);\n this.name = 'GoalNotFoundError';\n }\n}\n\nexport class TeamNotFoundError extends OrchestryError {\n constructor(teamId: string) {\n super(`Team not found: ${teamId}`, 1);\n this.name = 'TeamNotFoundError';\n }\n}\n\nexport class MessageNotFoundError extends OrchestryError {\n constructor(messageId: string) {\n super(`Message not found: ${messageId}`, 1);\n this.name = 'MessageNotFoundError';\n }\n}\n\nexport class WorkspaceError extends OrchestryError {\n constructor(message: string, hint?: string) {\n super(message, 6, hint);\n this.name = 'WorkspaceError';\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import g from'chalk';var x={running:"\u25CF",todo:"\u25CB",review:"\u25C8",done:"\u2713",failed:"\u2715",retrying:"\u21BB",cancelled:"\u25CB",idle:"\u25CB",error:"\u2715",disabled:"\u2500",agentAction:"\u25B8",orchestratorEvent:"\u2192",warning:"\u26A0"},y={running:"*",todo:"o",review:"#",done:"+",failed:"x",retrying:"~",cancelled:"o",idle:"o",error:"x",disabled:"-",agentAction:">",orchestratorEvent:"->",warning:"!!"},b={amber:214,green:72,red:167,blue:74,yellow:178,dim:240,ghost:236,white:255,purple:141},l;function C(){if(!l){l={};for(let[e,n]of Object.entries(b))l[e]=g.ansi256(n);}return l}var r=new Proxy({},{get(e,n){return C()[n]}}),f=false;function w(e){f=e;}function v(e){e&&(g.level=0);}function t(e){return f?y[e]:x[e]}function S(e){let n=t(e);switch(e){case "running":case "in_progress":return r.green(t("running"));case "todo":return r.dim(t("todo"));case "review":return r.blue(t("review"));case "done":return r.green(t("done"));case "failed":return r.red(t("failed"));case "retrying":return r.yellow(t("retrying"));case "cancelled":return r.dim(t("cancelled"));case "idle":return r.dim(t("idle"));case "error":return r.red(t("error"));case "disabled":return r.ghost(t("disabled"));default:return n}}function N(e){switch(e){case 1:return r.red("P1");case 2:return r.yellow("P2");case 3:return "P3";case 4:return r.dim("P4");default:return `P${e}`}}function $(e){let n=Math.floor(e/1e3);if(n<60)return `${n}s`;let o=Math.floor(n/60),s=n%60;if(o<60)return `${o}:${String(s).padStart(2,"0")}`;let u=Math.floor(o/60),i=o%60;return `${u}h${String(i).padStart(2,"0")}m`}function A(e){let n=Date.now()-new Date(e).getTime();return $(n)}function R(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function E(e,n){console.error(` ${r.red(t("failed"))} ${e}`),n&&console.error(` ${n}`);}function M(e){console.log(` ${r.green(t("done"))} ${e}`);}function O(e){console.log(` ${r.yellow(t("warning"))} ${e}`);}function P(e,n,o=2){let s=e.map((i,a)=>Math.max(i.length,...n.map(c=>d(c[a]??"").length))),u=e.map((i,a)=>i.padEnd(s[a]+o)).join("");console.log(` ${r.dim(u)}`);for(let i of n){let a=i.map((c,p)=>{let m=d(c),h=(s[p]??0)+o-m.length;return c+" ".repeat(Math.max(0,h))}).join("");console.log(` ${a}`);}}function D(e){let n=Math.max(...e.map(([o])=>o.length));for(let[o,s]of e)console.log(` ${r.dim(o.padEnd(n+2))}${s}`);}function F(e){return r.purple(e)}function T(e){return r.green(e)}function j(e){return r.amber(e)}function _(e){return r.dim(e)}function d(e){return e.replace(/\x1b\[[0-9;]*m/g,"")}export{w as a,v as b,t as c,S as d,N as e,$ as f,A as g,R as h,E as i,M as j,O as k,P as l,D as m,F as n,T as o,j as p,_ as q};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import {b as b$1}from'./chunk-6MJ7V6VY.js';function c(e,r){return {input:e,output:r,total:e+r}}function k(e,r){let t=e.usage;if(!t&&r?.statsFallback&&(t=e.stats?.usage),t&&typeof t.input_tokens=="number"){let o=t.input_tokens,u=typeof t.output_tokens=="number"?t.output_tokens:0;return c(o,u)}}function b(e,r,t,o){async function*u(){let a=false,s=null,d=null,l=new Promise(i=>{e.on("close",n=>{s=n,i();}),e.on("error",n=>{d=n,i();});});if(e.stdout)for await(let i of b$1(e.stdout)){if(o?.aborted)break;let n=r(i);n&&(n.type==="done"&&(a=true),yield n);}if(await l,d&&!o?.aborted&&!a)throw d;if(s!==0&&s!==null&&!o?.aborted&&!a)throw new Error(`${t} process exited with code ${s}`)}return u()}export{k as a,b};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ var a={todo:["in_progress","cancelled"],in_progress:["review","retrying","failed","cancelled"],retrying:["in_progress","failed","cancelled"],review:["done","todo","cancelled"],done:[],failed:["todo","retrying"],cancelled:["todo"]},s=new Set(["done","failed","cancelled"]);function u(e,t){return a[e].includes(t)}function d(e){return s.has(e)}function l(e){return e==="todo"||e==="retrying"}function c(e,t){return e.depends_on.length===0?false:t instanceof Map?e.depends_on.some(o=>{let n=t.get(o);return !n||n.status!=="done"}):e.depends_on.some(o=>{let n=t.find(r=>r.id===o);return !n||n.status!=="done"})}function i(e){return e.attempts<e.max_attempts?"retrying":"failed"}function p(e,t,o){return t?"review":i(e)}function T(e,t,o){let n=t*Math.pow(2,e);return Math.min(n,o)}export{u as a,d as b,l as c,c as d,i as e,p as f,T as g};
@@ -1,10 +1,5 @@
1
- #!/usr/bin/env node
2
- import { readLines } from './chunk-CHIP7O6V.js';
3
-
4
- // src/domain/run.ts
5
- function createTokenUsage(input, output) {
6
- return { input, output, total: input + output };
7
- }
1
+ import { createTokenUsage } from './chunk-XDVMX2FO.js';
2
+ import { readLines } from './chunk-O2MSGW3V.js';
8
3
 
9
4
  // src/infrastructure/adapters/utils.ts
10
5
  function extractTokens(parsed, opts) {
@@ -57,3 +52,5 @@ function createStreamingEvents(proc, parseEvent, adapterName, signal) {
57
52
  }
58
53
 
59
54
  export { createStreamingEvents, extractTokens };
55
+ //# sourceMappingURL=chunk-MGFMVPRD.js.map
56
+ //# sourceMappingURL=chunk-MGFMVPRD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/adapters/utils.ts"],"names":[],"mappings":";;;;AAoBO,SAAS,aAAA,CACd,QACA,IAAA,EACuB;AACvB,EAAA,IAAI,QAAQ,MAAA,CAAO,KAAA;AAEnB,EAAA,IAAI,CAAC,KAAA,IAAS,IAAA,EAAM,aAAA,EAAe;AACjC,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,KAAA,GAAQ,KAAA,EAAO,KAAA;AAAA,EACjB;AAEA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,CAAM,YAAA,KAAiB,QAAA,EAAU;AACnD,IAAA,MAAM,QAAQ,KAAA,CAAM,YAAA;AACpB,IAAA,MAAM,SAAS,OAAO,KAAA,CAAM,aAAA,KAAkB,QAAA,GAAW,MAAM,aAAA,GAAgB,CAAA;AAC/E,IAAA,OAAO,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAYO,SAAS,qBAAA,CACd,IAAA,EACA,UAAA,EACA,WAAA,EACA,MAAA,EAC4B;AAC5B,EAAA,gBAAgB,QAAA,GAAuC;AACrD,IAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,IAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI,SAAA,GAA0B,IAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACjD,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAAE,QAAA,QAAA,GAAW,IAAA;AAAM,QAAA,OAAA,EAAQ;AAAA,MAAG,CAAC,CAAA;AAC1D,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAAE,QAAA,SAAA,GAAY,GAAA;AAAK,QAAA,OAAA,EAAQ;AAAA,MAAG,CAAC,CAAA;AAAA,IAC3D,CAAC,CAAA;AAED,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,WAAA,MAAiB,IAAA,IAAQ,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA,EAAG;AAC/C,QAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,QAAA,MAAM,KAAA,GAAQ,WAAW,IAAI,CAAA;AAC7B,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ,YAAA,GAAe,IAAA;AAC1C,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,WAAA;AAEN,IAAA,IAAI,SAAA,IAAa,CAAC,MAAA,EAAQ,OAAA,IAAW,CAAC,YAAA,EAAc;AAClD,MAAA,MAAM,SAAA;AAAA,IACR;AACA,IAAA,IAAI,QAAA,KAAa,KAAK,QAAA,KAAa,IAAA,IAAQ,CAAC,MAAA,EAAQ,OAAA,IAAW,CAAC,YAAA,EAAc;AAC5E,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AAAA,IACvE;AAAA,EACF;AAEA,EAAA,OAAO,QAAA,EAAS;AAClB","file":"chunk-MGFMVPRD.js","sourcesContent":["/**\n * Shared utilities for agent adapters.\n *\n * Deduplicates extractTokens and streaming event generation logic\n * common to claude, codex, and cursor adapters.\n */\n\nimport type { ChildProcess } from 'node:child_process';\nimport type { AgentEvent } from './interface.js';\nimport { readLines } from '../process/process-manager.js';\nimport { createTokenUsage } from '../../domain/run.js';\n\nexport type TokenInfo = { input: number; output: number; total: number };\n\n/**\n * Extract token usage from a parsed JSON event.\n *\n * @param parsed - The parsed JSON object from an adapter event line.\n * @param opts.statsFallback - If true, also checks `parsed.stats?.usage` (Claude-specific).\n */\nexport function extractTokens(\n parsed: Record<string, unknown>,\n opts?: { statsFallback?: boolean },\n): TokenInfo | undefined {\n let usage = parsed.usage as Record<string, unknown> | undefined;\n\n if (!usage && opts?.statsFallback) {\n const stats = parsed.stats as Record<string, unknown> | undefined;\n usage = stats?.usage as Record<string, unknown> | undefined;\n }\n\n if (usage && typeof usage.input_tokens === 'number') {\n const input = usage.input_tokens;\n const output = typeof usage.output_tokens === 'number' ? usage.output_tokens : 0;\n return createTokenUsage(input, output);\n }\n return undefined;\n}\n\n/**\n * Create an async generator that streams AgentEvents from a child process.\n *\n * Handles: exit promise setup, line-by-line reading, abort signal, exit code checking.\n *\n * @param proc - The spawned child process.\n * @param parseEvent - Adapter-specific function to parse a line into an AgentEvent.\n * @param adapterName - Name used in error messages (e.g. \"Claude\", \"Codex\").\n * @param signal - Optional abort signal.\n */\nexport function createStreamingEvents(\n proc: ChildProcess,\n parseEvent: (line: string) => AgentEvent | null,\n adapterName: string,\n signal?: AbortSignal,\n): AsyncGenerator<AgentEvent> {\n async function* generate(): AsyncGenerator<AgentEvent> {\n let gotDoneEvent = false;\n\n let exitCode: number | null = null;\n let exitError: Error | null = null;\n const exitPromise = new Promise<void>((resolve) => {\n proc.on('close', (code) => { exitCode = code; resolve(); });\n proc.on('error', (err) => { exitError = err; resolve(); });\n });\n\n if (proc.stdout) {\n for await (const line of readLines(proc.stdout)) {\n if (signal?.aborted) break;\n const event = parseEvent(line);\n if (event) {\n if (event.type === 'done') gotDoneEvent = true;\n yield event;\n }\n }\n }\n\n await exitPromise;\n\n if (exitError && !signal?.aborted && !gotDoneEvent) {\n throw exitError;\n }\n if (exitCode !== 0 && exitCode !== null && !signal?.aborted && !gotDoneEvent) {\n throw new Error(`${adapterName} process exited with code ${exitCode}`);\n }\n }\n\n return generate();\n}\n"]}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import {b,a as a$1}from'./chunk-L3FYR45M.js';import {execFile}from'child_process';import {promisify}from'util';var l=promisify(execFile),a=class{constructor(e){this.processManager=e;}kind="claude";async test(){try{let{stdout:e}=await l("claude",["--version"]);return {ok:!0,version:e.trim()}}catch{return {ok:false,error:"Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code"}}}execute(e){let t=["--print","--output-format","stream-json","--max-turns",String(e.config.max_turns??50),"--verbose","--dangerously-skip-permissions"];e.config.model&&t.push("--model",e.config.model),e.config.system_prompt&&t.push("--system-prompt",e.config.system_prompt),t.push(e.prompt);let{process:s,pid:c}=this.processManager.spawn("claude",t,{cwd:e.workspace,env:{...process.env,...e.env},signal:e.signal}),u=b(s,d,"Claude",e.signal);return {pid:c,events:u}}async stop(e){await this.processManager.killWithGrace(e);}};function d(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 s=a$1(e,{statsFallback:!0});return {type:"done",timestamp:t,data:e,tokens:s}}default:return {type:"output",timestamp:t,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:r}}}export{a};
@@ -1,6 +1,6 @@
1
- #!/usr/bin/env node
2
1
  import { spawn } from 'child_process';
3
2
 
3
+ // src/infrastructure/process/process-manager.ts
4
4
  var ProcessManager = class {
5
5
  isAlive(pid) {
6
6
  try {
@@ -81,3 +81,5 @@ async function* readLines(stream) {
81
81
  }
82
82
 
83
83
  export { ProcessManager, readLines };
84
+ //# sourceMappingURL=chunk-O2MSGW3V.js.map
85
+ //# sourceMappingURL=chunk-O2MSGW3V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/process/process-manager.ts"],"names":[],"mappings":"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","file":"chunk-O2MSGW3V.js","sourcesContent":["/**\n * Process management utilities.\n *\n * Handles spawning subprocesses, PID checks, graceful kill.\n */\n\nimport { spawn, type ChildProcess, type SpawnOptions } from 'node:child_process';\nimport type { Readable } from 'node:stream';\n\nexport interface SpawnResult {\n process: ChildProcess;\n pid: number;\n}\n\nexport interface IProcessManager {\n isAlive(pid: number): boolean;\n kill(pid: number, signal?: NodeJS.Signals): void;\n killWithGrace(pid: number, graceMs?: number): Promise<void>;\n spawn(command: string, args: string[], options?: SpawnOptions): SpawnResult;\n}\n\nexport class ProcessManager implements IProcessManager {\n isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n // EPERM means process exists but we lack permission to signal it\n if ((err as NodeJS.ErrnoException).code === 'EPERM') return true;\n return false;\n }\n }\n\n kill(pid: number, signal: NodeJS.Signals = 'SIGTERM'): void {\n // Kill entire process group (-pid) to clean up child processes (vitest, playwright, etc.)\n try {\n process.kill(-pid, signal);\n } catch {\n // Group kill failed — fall back to direct PID kill\n try {\n process.kill(pid, signal);\n } catch {\n // Process already dead\n }\n }\n }\n\n async killWithGrace(pid: number, graceMs: number = 10_000): Promise<void> {\n if (!this.isAlive(pid)) return;\n\n this.kill(pid, 'SIGTERM');\n\n const deadline = Date.now() + graceMs;\n\n while (Date.now() < deadline) {\n if (!this.isAlive(pid)) return;\n await new Promise((r) => setTimeout(r, 200));\n }\n\n // Force kill if still alive\n this.kill(pid, 'SIGKILL');\n }\n\n spawn(command: string, args: string[], options?: SpawnOptions): SpawnResult {\n const proc = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: true, // Create new process group so killWithGrace(-pid) kills all children\n ...options,\n });\n\n if (!proc.pid) {\n throw new Error(`Failed to spawn process: ${command}`);\n }\n\n // Allow parent to exit without waiting for this child.\n // Pipes (stdout/stderr) still hold refs while being read — that's intentional.\n proc.unref();\n\n return { process: proc, pid: proc.pid };\n }\n}\n\n/**\n * Max stdout line length before truncation (16 KB).\n * First layer of a three-layer cap: readLines (16 KB) → serializeEventData (8 KB) → bus emit (4 KB).\n * Truncated lines produce invalid JSON → adapters' catch block handles gracefully.\n */\nconst MAX_LINE_LEN = 16384;\n\n/** Cap a string to MAX_LINE_LEN. */\nfunction capLine(s: string): string {\n return s.length > MAX_LINE_LEN ? s.slice(0, MAX_LINE_LEN) : s;\n}\n\n/**\n * Read lines from a readable stream as an async generator.\n *\n * Uses `for await` on the raw Readable (proper backpressure) instead of\n * readline.createInterface, which buffers all 'line' events in an unbounded\n * queue even when the consumer is paused — causing OOM under high throughput.\n *\n * Uses Buffer.concat + offset tracking to avoid O(n²) string copies.\n */\nexport async function* readLines(stream: Readable): AsyncGenerator<string> {\n const chunks: Buffer[] = [];\n let totalLen = 0;\n\n for await (const chunk of stream) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as string, 'utf-8');\n if (buf.length === 0) continue;\n chunks.push(buf);\n totalLen += buf.length;\n\n // Concat once per chunk arrival, then scan for newlines with offset tracking\n const buffer = chunks.length === 1 ? chunks[0]! : Buffer.concat(chunks, totalLen);\n chunks.length = 0;\n totalLen = 0;\n\n let offset = 0;\n let newlineIdx: number;\n while ((newlineIdx = buffer.indexOf(0x0a, offset)) !== -1) {\n if (newlineIdx > offset) {\n yield capLine(buffer.toString('utf-8', offset, newlineIdx));\n }\n offset = newlineIdx + 1;\n }\n\n // Keep unconsumed remainder for next chunk\n if (offset < buffer.length) {\n const remainder = buffer.subarray(offset);\n chunks.push(remainder);\n totalLen = remainder.length;\n }\n }\n\n // Flush remaining data (last line without trailing newline)\n if (totalLen > 0) {\n const final = chunks.length === 1 ? chunks[0]! : Buffer.concat(chunks, totalLen);\n yield capLine(final.toString('utf-8'));\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ var e={project:{name:"my-project"},defaults:{agent:{adapter:"claude",approval_policy:"auto",max_turns:50,timeout_ms:36e5,stall_timeout_ms:3e5,workspace_mode:"worktree"},task:{max_attempts:3,priority:3}},scheduling:{poll_interval_ms:1e4,max_concurrent_agents:6,retry_base_delay_ms:1e4,retry_max_delay_ms:3e5}};export{e as a};
@@ -1,10 +1,9 @@
1
- #!/usr/bin/env node
2
- import { NotInitializedError } from './chunk-O5AO5QIR.js';
1
+ import { NotInitializedError } from './chunk-IQXRQBUK.js';
3
2
  import { randomBytes } from 'crypto';
4
3
  import fs from 'fs/promises';
5
4
  import path2 from 'path';
6
5
  import yaml from 'js-yaml';
7
- import { accessSync } from 'fs';
6
+ import 'fs';
8
7
 
9
8
  async function atomicWrite(filePath, content) {
10
9
  const dir = path2.dirname(filePath);
@@ -228,6 +227,12 @@ var Paths = class {
228
227
  get teamsDir() {
229
228
  return path2.join(this.root, "teams");
230
229
  }
230
+ get attachmentsDir() {
231
+ return path2.join(this.root, "attachments");
232
+ }
233
+ taskAttachmentsDir(taskId) {
234
+ return path2.join(this.attachmentsDir, sanitizeId(taskId));
235
+ }
231
236
  teamPath(id) {
232
237
  return path2.join(this.teamsDir, `${sanitizeId(id)}.yml`);
233
238
  }
@@ -274,18 +279,7 @@ function validateWorkspacePath(workspacePath, projectRoot) {
274
279
  throw new Error(`Workspace path "${workspacePath}" is outside project root`);
275
280
  }
276
281
  }
277
- function findProjectRoot(startDir = process.cwd()) {
278
- let dir = path2.resolve(startDir);
279
- const root = path2.parse(dir).root;
280
- while (dir !== root) {
281
- try {
282
- accessSync(path2.join(dir, ".orchestry"));
283
- return dir;
284
- } catch {
285
- }
286
- dir = path2.dirname(dir);
287
- }
288
- return startDir;
289
- }
290
282
 
291
- export { Paths, appendJsonl, atomicWrite, ensureDir, findProjectRoot, listFiles, pathExists, readJson, readJsonl, readJsonlTail, readYaml, sanitizeId, validateWorkspacePath, writeJson, writeYaml };
283
+ export { Paths, appendJsonl, ensureDir, listFiles, pathExists, readJson, readJsonl, readJsonlTail, readYaml, sanitizeId, validateWorkspacePath, writeJson, writeYaml };
284
+ //# sourceMappingURL=chunk-QEEM67OA.js.map
285
+ //# sourceMappingURL=chunk-QEEM67OA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/storage/fs-utils.ts","../src/infrastructure/storage/paths.ts"],"names":["path","lines"],"mappings":"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","file":"chunk-QEEM67OA.js","sourcesContent":["/**\n * Low-level filesystem utilities.\n *\n * All file persistence goes through these functions.\n * atomicWrite guarantees no partial reads via temp → rename.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport yaml from 'js-yaml';\n\n/**\n * Write file atomically: write to temp file, then rename.\n * Prevents corrupted reads on concurrent access.\n */\nexport async function atomicWrite(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n\n const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(4).toString('hex')}.tmp`);\n\n try {\n await fs.writeFile(tmpPath, content, 'utf-8');\n await fs.rename(tmpPath, filePath);\n } catch (err) {\n // Clean up temp file on failure\n await fs.unlink(tmpPath).catch(() => {});\n throw err;\n }\n}\n\n/**\n * Read and parse a YAML file. Returns null if file does not exist.\n */\nexport async function readYaml<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return yaml.load(content) as T;\n } catch (err) {\n if (isENOENT(err)) return null;\n throw err;\n }\n}\n\n/**\n * Write data as YAML atomically.\n */\nexport async function writeYaml<T>(filePath: string, data: T): Promise<void> {\n const content = yaml.dump(data, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n sortKeys: false,\n });\n await atomicWrite(filePath, content);\n}\n\n/**\n * Read and parse a JSON file. Returns null if file does not exist.\n */\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (err) {\n if (isENOENT(err)) return null;\n throw err;\n }\n}\n\n/**\n * Write data as JSON atomically.\n */\nexport async function writeJson<T>(filePath: string, data: T): Promise<void> {\n const content = JSON.stringify(data, null, 2) + '\\n';\n await atomicWrite(filePath, content);\n}\n\n/**\n * POSIX PIPE_BUF — writes up to this size are guaranteed atomic with O_APPEND.\n * 4096 on Linux/macOS. We leave some room for encoding overhead.\n */\nconst PIPE_BUF = 4096;\n\n/**\n * Append a JSON record to a .jsonl file (newline-delimited JSON).\n *\n * Uses a file handle opened with 'a' (O_APPEND) to ensure atomic writes.\n * On POSIX, O_APPEND guarantees that each write() call appends atomically\n * when the data fits within PIPE_BUF (typically 4096 bytes), preventing\n * interleaving from concurrent writers.\n *\n * If the serialized line exceeds PIPE_BUF, the record's `data` field is\n * truncated so the entire line fits within the atomic-write limit.\n * This prevents interleaving corruption from concurrent writers.\n */\nexport async function appendJsonl(filePath: string, record: unknown): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n let line = JSON.stringify(record) + '\\n';\n\n // If the line exceeds PIPE_BUF, truncate the `data` field to fit\n const byteLen = Buffer.byteLength(line, 'utf-8');\n if (byteLen > PIPE_BUF && record !== null && typeof record === 'object') {\n const obj = record as Record<string, unknown>;\n if (typeof obj.data === 'string' && obj.data.length > 0) {\n // Measure overhead without data to know how much room data gets\n const shell = JSON.stringify({ ...obj, data: '' }) + '\\n';\n const overhead = Buffer.byteLength(shell, 'utf-8');\n const budget = PIPE_BUF - overhead - 3; // 3 bytes for the '…' suffix (UTF-8 ellipsis)\n if (budget > 0) {\n // Slice to budget chars — for ASCII (most event data) this equals bytes.\n // For multi-byte chars the result may be slightly over PIPE_BUF,\n // which is acceptable on local filesystems (ext4/APFS hold inode lock).\n const truncated = obj.data.slice(0, budget);\n line = JSON.stringify({ ...obj, data: truncated + '…' }) + '\\n';\n }\n }\n }\n\n const fd = await fs.open(filePath, 'a');\n try {\n await fd.write(line, null, 'utf-8');\n } finally {\n await fd.close();\n }\n}\n\n/** Max file size for full readJsonl (50 MB). Larger files use tail read. */\nconst MAX_JSONL_READ_SIZE = 50 * 1024 * 1024;\n\n/**\n * Read all records from a .jsonl file.\n * Falls back to reading only the last 200 records if the file exceeds MAX_JSONL_READ_SIZE.\n */\nexport async function readJsonl<T>(filePath: string): Promise<T[]> {\n try {\n const stat = await fs.stat(filePath);\n if (stat.size > MAX_JSONL_READ_SIZE) {\n process.stderr.write(\n `[readJsonl] file too large (${(stat.size / 1024 / 1024).toFixed(1)} MB), reading tail only: ${filePath}\\n`,\n );\n return readJsonlTail<T>(filePath, 200);\n }\n return readAndParseJsonl<T>(filePath);\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\n/**\n * Read the last N records from a .jsonl file.\n *\n * Reads the file in reverse chunks to avoid loading multi-MB files into memory.\n * Falls back to full read for small files (< 32KB).\n */\nexport async function readJsonlTail<T>(filePath: string, count: number): Promise<T[]> {\n try {\n const stat = await fs.stat(filePath);\n // For small files, read directly and slice (avoid mutual recursion with readJsonl)\n if (stat.size < 32768) {\n return (await readAndParseJsonl<T>(filePath)).slice(-count);\n }\n\n // Read from end in chunks to find enough lines\n // Use larger chunks for bigger files (tool_result events can be 8KB+ per line)\n const fd = await fs.open(filePath, 'r');\n try {\n const chunkSize = Math.min(stat.size, stat.size > 1_048_576 ? 131072 : 65536);\n let position = Math.max(0, stat.size - chunkSize);\n let earliestReadPosition = position;\n let tail = '';\n\n // Read up to 4 chunks from the end\n for (let attempt = 0; attempt < 4 && position >= 0; attempt++) {\n earliestReadPosition = position;\n const readSize = Math.min(chunkSize, stat.size - position);\n const buf = Buffer.alloc(readSize);\n await fd.read(buf, 0, readSize, position);\n tail = buf.toString('utf-8') + tail;\n\n const lines = tail.split('\\n').filter((l) => l.trim().length > 0);\n if (lines.length >= count + 1) {\n // +1 because first line might be partial\n return parseJsonlLines<T>(lines.slice(-count));\n }\n if (position === 0) break;\n position = Math.max(0, position - chunkSize);\n }\n\n // Parse whatever we got\n const lines = tail.split('\\n').filter((l) => l.trim().length > 0);\n // Skip first line if we didn't read from start (could be partial)\n const safeLines = earliestReadPosition > 0 ? lines.slice(1) : lines;\n return parseJsonlLines<T>(safeLines.slice(-count));\n } finally {\n await fd.close();\n }\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\n/** Read a file and parse all JSONL records. */\nasync function readAndParseJsonl<T>(filePath: string): Promise<T[]> {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim().length > 0);\n return parseJsonlLines<T>(lines);\n}\n\n/**\n * Parse JSONL lines with error tolerance — corrupt lines are logged and skipped.\n */\nfunction parseJsonlLines<T>(lines: string[]): T[] {\n const results: T[] = [];\n for (const raw of lines) {\n const line = raw.trim();\n if (!line) continue;\n try {\n results.push(JSON.parse(line) as T);\n } catch {\n process.stderr.write(`[readJsonl] skipping corrupt line: ${line.slice(0, 200)}\\n`);\n }\n }\n return results;\n}\n\n/**\n * Ensure a directory exists, creating it recursively if needed.\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\n/**\n * Check if a path exists.\n */\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * List files in a directory matching an optional extension filter.\n */\nexport async function listFiles(dirPath: string, ext?: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dirPath);\n if (ext) {\n return entries.filter((e) => e.endsWith(ext));\n }\n return entries;\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\nfunction isENOENT(err: unknown): boolean {\n return err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT';\n}\n","/**\n * Path resolution for .orchestry/ directory.\n *\n * All path construction goes through this module.\n * Validates initialization state and sanitizes identifiers.\n */\n\nimport path from 'node:path';\nimport { accessSync } from 'node:fs';\nimport { NotInitializedError } from '../../domain/errors.js';\nimport { pathExists } from './fs-utils.js';\n\nconst ORCHESTRY_DIR = '.orchestry';\nconst ID_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport class Paths {\n constructor(private readonly projectRoot: string) {}\n\n /** Root .orchestry/ directory */\n get root(): string {\n return path.join(this.projectRoot, ORCHESTRY_DIR);\n }\n\n get configPath(): string {\n return path.join(this.root, 'config.yml');\n }\n\n get statePath(): string {\n return path.join(this.root, 'state.json');\n }\n\n get lockPath(): string {\n return path.join(this.root, 'orchestry.lock');\n }\n\n get tasksDir(): string {\n return path.join(this.root, 'tasks');\n }\n\n get agentsDir(): string {\n return path.join(this.root, 'agents');\n }\n\n get runsDir(): string {\n return path.join(this.root, 'runs');\n }\n\n get templatesDir(): string {\n return path.join(this.root, 'templates');\n }\n\n get logsDir(): string {\n return path.join(this.root, 'logs');\n }\n\n get contextDir(): string {\n return path.join(this.root, 'context');\n }\n\n contextPath(key: string): string {\n return path.join(this.contextDir, `${sanitizeId(key)}.json`);\n }\n\n get messagesDir(): string {\n return path.join(this.root, 'messages');\n }\n\n messagePath(id: string): string {\n return path.join(this.messagesDir, `${sanitizeId(id)}.json`);\n }\n\n get goalsDir(): string {\n return path.join(this.root, 'goals');\n }\n\n goalPath(id: string): string {\n return path.join(this.goalsDir, `${sanitizeId(id)}.yml`);\n }\n\n get teamsDir(): string {\n return path.join(this.root, 'teams');\n }\n\n get attachmentsDir(): string {\n return path.join(this.root, 'attachments');\n }\n\n taskAttachmentsDir(taskId: string): string {\n return path.join(this.attachmentsDir, sanitizeId(taskId));\n }\n\n teamPath(id: string): string {\n return path.join(this.teamsDir, `${sanitizeId(id)}.yml`);\n }\n\n get gitignorePath(): string {\n return path.join(this.root, '.gitignore');\n }\n\n get workspaceExcludePath(): string {\n return path.join(this.root, 'workspace-exclude');\n }\n\n taskPath(id: string): string {\n return path.join(this.tasksDir, `${sanitizeId(id)}.yml`);\n }\n\n agentPath(id: string): string {\n return path.join(this.agentsDir, `${sanitizeId(id)}.yml`);\n }\n\n runPath(id: string): string {\n return path.join(this.runsDir, `${sanitizeId(id)}.json`);\n }\n\n runEventsPath(id: string): string {\n return path.join(this.runsDir, `${sanitizeId(id)}.jsonl`);\n }\n\n defaultTemplatePath(): string {\n return path.join(this.templatesDir, 'default.md');\n }\n\n async isInitialized(): Promise<boolean> {\n return pathExists(this.root);\n }\n\n async requireInit(): Promise<void> {\n if (!(await this.isInitialized())) {\n throw new NotInitializedError();\n }\n }\n}\n\n/**\n * Validate an identifier for use in file paths.\n * Only allows [A-Za-z0-9._-] characters.\n * Rejects identifiers containing forbidden characters (path separators, etc.)\n * to prevent path traversal attacks.\n */\nexport function sanitizeId(id: string): string {\n if (!ID_PATTERN.test(id)) {\n throw new Error(`Invalid identifier: \"${id}\"`);\n }\n return id;\n}\n\n/**\n * Validate that a workspace path is within the project root.\n * Prevents path traversal attacks.\n */\nexport function validateWorkspacePath(workspacePath: string, projectRoot: string): void {\n const resolved = path.resolve(workspacePath);\n const root = path.resolve(projectRoot);\n\n if (!resolved.startsWith(root + path.sep) && resolved !== root) {\n throw new Error(`Workspace path \"${workspacePath}\" is outside project root`);\n }\n}\n\n/**\n * Resolve project root by walking up from cwd looking for .orchestry/.\n * Returns cwd if not found (for init command).\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n try {\n accessSync(path.join(dir, '.orchestry'));\n return dir;\n } catch {\n // Not found, go up\n }\n dir = path.dirname(dir);\n }\n\n // Not found — return original dir (for init command)\n return startDir;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import r from'fs/promises';import u from'path';import m from'os';import {execFile}from'child_process';var p="@oxgeneral/orch",l=u.join(m.homedir(),".orchestry"),c=u.join(l,"update-check.json"),d=14400*1e3,g=d*.75;function w(t,e){let n=t.split(".").map(Number),i=e.split(".").map(Number);for(let a=0;a<3;a++){let o=(n[a]??0)-(i[a]??0);if(o!==0)return o>0?1:-1}return 0}async function U(){try{let t=await r.readFile(c,"utf-8"),e=JSON.parse(t);if(Date.now()-e.checked_at<d)return e}catch{}return null}async function C(t){await r.mkdir(l,{recursive:true});let e={latest:t,checked_at:Date.now()},n=`${c}.tmp.${process.pid}`;await r.writeFile(n,JSON.stringify(e),"utf-8"),await r.rename(n,c);}function A(){return new Promise(t=>{execFile("npm",["view",p,"version","--json"],{timeout:5e3},(n,i)=>{if(n)return t(null);try{t(JSON.parse(i.trim()));}catch{t(null);}}).unref();})}function f(t,e){return {current:t,latest:e,updateAvailable:w(e,t)>0}}async function s(t){let e=await A();return e?(await C(e).catch(()=>{}),f(t,e)):null}async function y(t){try{let e=await U();return e?(Date.now()-e.checked_at>=g&&s(t).catch(()=>{}),f(t,e.latest)):(s(t).catch(()=>{}),null)}catch{return null}}function N(t){if(!t.updateAvailable)return;let e=`
3
+ Update available: ${t.current} \u2192 ${t.latest}
4
+ Run: npm install -g ${p}
5
+ `;process.stderr.write(e);}export{s as a,y as b,N as c};
@@ -1,3 +1,3 @@
1
- import {b as b$1}from'./chunk-POUC4CPC.js';import {execFile}from'child_process';import {promisify}from'util';function p(){let n;return {promise:new Promise(t=>{n=t;}),resolve:n}}var o=class{buf;head=0;tail=0;count=0;capacity;dataReady=null;spaceReady=null;closed=false;constructor(e=1024){this.capacity=e,this.buf=new Array(e);}get size(){return this.count}get isFull(){return this.count>=this.capacity}async push(e){for(;this.isFull&&!this.closed;)this.spaceReady||(this.spaceReady=p()),await this.spaceReady.promise;if(!this.closed&&(this.buf[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.count++,this.dataReady)){let t=this.dataReady;this.dataReady=null,t.resolve();}}async take(){for(;this.count===0;){if(this.closed)return;this.dataReady||(this.dataReady=p()),await this.dataReady.promise;}let e=this.buf[this.head];if(this.buf[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.count--,this.spaceReady){let t=this.spaceReady;this.spaceReady=null,t.resolve();}return e}close(){if(this.closed=true,this.dataReady){let e=this.dataReady;this.dataReady=null,e.resolve();}if(this.spaceReady){let e=this.spaceReady;this.spaceReady=null,e.resolve();}}get isClosed(){return this.closed}async*[Symbol.asyncIterator](){for(;;){let e=await this.take();if(e===void 0)return;yield e;}}};var b=promisify(execFile),f=class{constructor(e){this.processManager=e;}kind="shell";async test(){try{let{stdout:e}=await b("bash",["--version"]);return {ok:!0,version:e.split(`
2
- `)[0]?.trim()??"unknown"}}catch{return {ok:false,error:"bash not found"}}}execute(e){let t=e.config.command;if(!t){async function*a(){yield {type:"error",timestamp:new Date().toISOString(),data:"Shell adapter requires a command in agent config"};}return {pid:0,events:a()}}let{process:r,pid:l}=this.processManager.spawn("bash",["-lc",t],{cwd:e.workspace,env:{...process.env,...e.env,ORCHESTRY_TASK_PROMPT:e.prompt},signal:e.signal}),s=e.signal,y=this.processManager;async function*m(){let a=new o,c=()=>{y.killWithGrace(l,5e3).catch(()=>{});};s&&(s.aborted?c():s.addEventListener("abort",c,{once:true}));let v=(async()=>{if(r.stdout)for await(let i of b$1(r.stdout)){if(s?.aborted)break;await a.push({type:"output",timestamp:new Date().toISOString(),data:i});}})(),g=(async()=>{if(r.stderr)for await(let i of b$1(r.stderr)){if(s?.aborted)break;await a.push({type:"error",timestamp:new Date().toISOString(),data:i});}})();Promise.all([v,g]).then(()=>a.close(),()=>a.close()),yield*a,s&&!s.aborted&&s.removeEventListener("abort",c),await new Promise((i,u)=>{if(r.exitCode!==null||r.killed){i();return}r.on("close",h=>{h===0||s?.aborted?i():u(new Error(`Shell command exited with code ${h}`));}),r.on("error",u);});}return {pid:l,events:m()}}async stop(e){await this.processManager.killWithGrace(e);}};export{f as ShellAdapter};//# sourceMappingURL=shell-OGTSH4RJ.js.map
3
- //# sourceMappingURL=shell-OGTSH4RJ.js.map
1
+ #!/usr/bin/env node
2
+ import {b as b$1}from'./chunk-6MJ7V6VY.js';import {execFile}from'child_process';import {promisify}from'util';function p(){let n;return {promise:new Promise(t=>{n=t;}),resolve:n}}var o=class{buf;head=0;tail=0;count=0;capacity;dataReady=null;spaceReady=null;closed=false;constructor(e=1024){this.capacity=e,this.buf=new Array(e);}get size(){return this.count}get isFull(){return this.count>=this.capacity}async push(e){for(;this.isFull&&!this.closed;)this.spaceReady||(this.spaceReady=p()),await this.spaceReady.promise;if(!this.closed&&(this.buf[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.count++,this.dataReady)){let t=this.dataReady;this.dataReady=null,t.resolve();}}async take(){for(;this.count===0;){if(this.closed)return;this.dataReady||(this.dataReady=p()),await this.dataReady.promise;}let e=this.buf[this.head];if(this.buf[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.count--,this.spaceReady){let t=this.spaceReady;this.spaceReady=null,t.resolve();}return e}close(){if(this.closed=true,this.dataReady){let e=this.dataReady;this.dataReady=null,e.resolve();}if(this.spaceReady){let e=this.spaceReady;this.spaceReady=null,e.resolve();}}get isClosed(){return this.closed}async*[Symbol.asyncIterator](){for(;;){let e=await this.take();if(e===void 0)return;yield e;}}};var b=promisify(execFile),f=class{constructor(e){this.processManager=e;}kind="shell";async test(){try{let{stdout:e}=await b("bash",["--version"]);return {ok:!0,version:e.split(`
3
+ `)[0]?.trim()??"unknown"}}catch{return {ok:false,error:"bash not found"}}}execute(e){let t=e.config.command;if(!t){async function*a(){yield {type:"error",timestamp:new Date().toISOString(),data:"Shell adapter requires a command in agent config"};}return {pid:0,events:a()}}let{process:r,pid:l}=this.processManager.spawn("bash",["-lc",t],{cwd:e.workspace,env:{...process.env,...e.env,ORCHESTRY_TASK_PROMPT:e.prompt},signal:e.signal}),s=e.signal,y=this.processManager;async function*m(){let a=new o,c=()=>{y.killWithGrace(l,5e3).catch(()=>{});};s&&(s.aborted?c():s.addEventListener("abort",c,{once:true}));let v=(async()=>{if(r.stdout)for await(let i of b$1(r.stdout)){if(s?.aborted)break;await a.push({type:"output",timestamp:new Date().toISOString(),data:i});}})(),g=(async()=>{if(r.stderr)for await(let i of b$1(r.stderr)){if(s?.aborted)break;await a.push({type:"error",timestamp:new Date().toISOString(),data:i});}})();Promise.all([v,g]).then(()=>a.close(),()=>a.close()),yield*a,s&&!s.aborted&&s.removeEventListener("abort",c),await new Promise((i,u)=>{if(r.exitCode!==null||r.killed){i();return}r.on("close",h=>{h===0||s?.aborted?i():u(new Error(`Shell command exited with code ${h}`));}),r.on("error",u);});}return {pid:l,events:m()}}async stop(e){await this.processManager.killWithGrace(e);}};export{f as a};
@@ -0,0 +1,8 @@
1
+ // src/domain/run.ts
2
+ function createTokenUsage(input, output) {
3
+ return { input, output, total: input + output };
4
+ }
5
+
6
+ export { createTokenUsage };
7
+ //# sourceMappingURL=chunk-XDVMX2FO.js.map
8
+ //# sourceMappingURL=chunk-XDVMX2FO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/domain/run.ts"],"names":[],"mappings":";AAqCO,SAAS,gBAAA,CAAiB,OAAe,MAAA,EAA4B;AAC1E,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAO;AAChD","file":"chunk-XDVMX2FO.js","sourcesContent":["/**\n * Run domain model.\n *\n * A Run represents a single execution attempt of a Task by an Agent.\n * Events are stored in separate .jsonl files (append-only), not in memory.\n */\n\nexport type RunStatus =\n | 'preparing'\n | 'running'\n | 'succeeded'\n | 'failed'\n | 'timed_out'\n | 'cancelled';\n\nexport interface Run {\n id: string;\n task_id: string;\n agent_id: string;\n attempt: number;\n status: RunStatus;\n started_at: string;\n finished_at?: string;\n workspace_path: string;\n prompt: string;\n pid?: number;\n error?: string;\n tokens?: TokenUsage;\n}\n\nexport interface TokenUsage {\n input: number;\n output: number;\n total: number;\n}\n\n/** Create TokenUsage with total always computed as input + output. */\nexport function createTokenUsage(input: number, output: number): TokenUsage {\n return { input, output, total: input + output };\n}\n\nexport interface RunEvent {\n timestamp: string;\n type: RunEventType;\n data: unknown;\n}\n\nexport type RunEventType =\n | 'agent_output'\n | 'file_changed'\n | 'command_run'\n | 'tool_call'\n | 'error'\n | 'done';\n"]}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import {b as b$1}from'./chunk-GZ2Q56YZ.js';import {randomBytes}from'crypto';import s from'fs/promises';import n from'path';import P from'js-yaml';import {accessSync}from'fs';async function D(r,t){let i=n.dirname(r);await k(i);let e=n.join(i,`.${n.basename(r)}.${randomBytes(4).toString("hex")}.tmp`);try{await s.writeFile(e,t,"utf-8"),await s.rename(e,r);}catch(g){throw await s.unlink(e).catch(()=>{}),g}}async function A(r){try{let t=await s.readFile(r,"utf-8");return P.load(t)}catch(t){if(h(t))return null;throw t}}async function B(r,t){let i=P.dump(t,{indent:2,lineWidth:120,noRefs:true,sortKeys:false});await D(r,i);}async function M(r){try{let t=await s.readFile(r,"utf-8");return JSON.parse(t)}catch(t){if(h(t))return null;throw t}}async function W(r,t){let i=JSON.stringify(t,null,2)+`
3
+ `;await D(r,i);}var x=4096;async function Y(r,t){let i=n.dirname(r);await k(i);let e=JSON.stringify(t)+`
4
+ `;if(Buffer.byteLength(e,"utf-8")>x&&t!==null&&typeof t=="object"){let c=t;if(typeof c.data=="string"&&c.data.length>0){let u=JSON.stringify({...c,data:""})+`
5
+ `,f=Buffer.byteLength(u,"utf-8"),m=x-f-3;if(m>0){let l=c.data.slice(0,m);e=JSON.stringify({...c,data:l+"\u2026"})+`
6
+ `;}}}let o=await s.open(r,"a");try{await o.write(e,null,"utf-8");}finally{await o.close();}}var b=50*1024*1024;async function Z(r){try{let t=await s.stat(r);return t.size>b?(process.stderr.write(`[readJsonl] file too large (${(t.size/1024/1024).toFixed(1)} MB), reading tail only: ${r}
7
+ `),z(r,200)):E(r)}catch(t){if(h(t))return [];throw t}}async function z(r,t){try{let i=await s.stat(r);if(i.size<32768)return (await E(r)).slice(-t);let e=await s.open(r,"r");try{let g=Math.min(i.size,i.size>1048576?131072:65536),o=Math.max(0,i.size-g),c=o,u="";for(let l=0;l<4&&o>=0;l++){c=o;let y=Math.min(g,i.size-o),w=Buffer.alloc(y);await e.read(w,0,y,o),u=w.toString("utf-8")+u;let j=u.split(`
8
+ `).filter($=>$.trim().length>0);if(j.length>=t+1)return p(j.slice(-t));if(o===0)break;o=Math.max(0,o-g);}let f=u.split(`
9
+ `).filter(l=>l.trim().length>0),m=c>0?f.slice(1):f;return p(m.slice(-t))}finally{await e.close();}}catch(i){if(h(i))return [];throw i}}async function E(r){let i=(await s.readFile(r,"utf-8")).split(`
10
+ `).filter(e=>e.trim().length>0);return p(i)}function p(r){let t=[];for(let i of r){let e=i.trim();if(e)try{t.push(JSON.parse(e));}catch{process.stderr.write(`[readJsonl] skipping corrupt line: ${e.slice(0,200)}
11
+ `);}}return t}async function k(r){await s.mkdir(r,{recursive:true});}async function v(r){try{return await s.access(r),!0}catch{return false}}async function q(r,t){try{let i=await s.readdir(r);return t?i.filter(e=>e.endsWith(t)):i}catch(i){if(h(i))return [];throw i}}function h(r){return r instanceof Error&&"code"in r&&r.code==="ENOENT"}var R=".orchestry",I=/^[A-Za-z0-9._-]+$/,J=class{constructor(t){this.projectRoot=t;}get root(){return n.join(this.projectRoot,R)}get configPath(){return n.join(this.root,"config.yml")}get statePath(){return n.join(this.root,"state.json")}get lockPath(){return n.join(this.root,"orchestry.lock")}get tasksDir(){return n.join(this.root,"tasks")}get agentsDir(){return n.join(this.root,"agents")}get runsDir(){return n.join(this.root,"runs")}get templatesDir(){return n.join(this.root,"templates")}get logsDir(){return n.join(this.root,"logs")}get contextDir(){return n.join(this.root,"context")}contextPath(t){return n.join(this.contextDir,`${a(t)}.json`)}get messagesDir(){return n.join(this.root,"messages")}messagePath(t){return n.join(this.messagesDir,`${a(t)}.json`)}get goalsDir(){return n.join(this.root,"goals")}goalPath(t){return n.join(this.goalsDir,`${a(t)}.yml`)}get teamsDir(){return n.join(this.root,"teams")}get attachmentsDir(){return n.join(this.root,"attachments")}taskAttachmentsDir(t){return n.join(this.attachmentsDir,a(t))}teamPath(t){return n.join(this.teamsDir,`${a(t)}.yml`)}get gitignorePath(){return n.join(this.root,".gitignore")}get workspaceExcludePath(){return n.join(this.root,"workspace-exclude")}taskPath(t){return n.join(this.tasksDir,`${a(t)}.yml`)}agentPath(t){return n.join(this.agentsDir,`${a(t)}.yml`)}runPath(t){return n.join(this.runsDir,`${a(t)}.json`)}runEventsPath(t){return n.join(this.runsDir,`${a(t)}.jsonl`)}defaultTemplatePath(){return n.join(this.templatesDir,"default.md")}async isInitialized(){return v(this.root)}async requireInit(){if(!await this.isInitialized())throw new b$1}};function a(r){if(!I.test(r))throw new Error(`Invalid identifier: "${r}"`);return r}function G(r,t){let i=n.resolve(r),e=n.resolve(t);if(!i.startsWith(e+n.sep)&&i!==e)throw new Error(`Workspace path "${r}" is outside project root`)}function Q(r=process.cwd()){let t=n.resolve(r),i=n.parse(t).root;for(;t!==i;){try{return accessSync(n.join(t,".orchestry")),t}catch{}t=n.dirname(t);}return r}export{D as a,A as b,B as c,M as d,W as e,Y as f,Z as g,z as h,k as i,v as j,q as k,J as l,a as m,G as n,Q as o};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{a as ClaudeAdapter}from'./chunk-MNXU3KCD.js';import'./chunk-L3FYR45M.js';import'./chunk-6MJ7V6VY.js';
@@ -1,5 +1,6 @@
1
- #!/usr/bin/env node
2
- import { createStreamingEvents, extractTokens } from './chunk-TX7WOFCW.js';
1
+ import { createStreamingEvents, extractTokens } from './chunk-MGFMVPRD.js';
2
+ import './chunk-XDVMX2FO.js';
3
+ import './chunk-O2MSGW3V.js';
3
4
  import { execFile } from 'child_process';
4
5
  import { promisify } from 'util';
5
6
 
@@ -77,3 +78,5 @@ function parseClaudeEvent(line) {
77
78
  }
78
79
 
79
80
  export { ClaudeAdapter };
81
+ //# sourceMappingURL=claude-RIB3RQS5.js.map
82
+ //# sourceMappingURL=claude-RIB3RQS5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/adapters/claude.ts"],"names":[],"mappings":"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","file":"claude-RIB3RQS5.js","sourcesContent":["/**\n * Claude Code adapter.\n *\n * Spawns `claude --print --output-format stream-json` in headless mode.\n * Parses JSON-lines from stdout into AgentEvent stream.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { extractTokens, createStreamingEvents } from './utils.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class ClaudeAdapter implements IAgentAdapter {\n readonly kind = 'claude';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('claude', ['--version']);\n return { ok: true, version: stdout.trim() };\n } catch {\n return {\n ok: false,\n error: 'Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code',\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n '--print',\n '--output-format', 'stream-json',\n '--max-turns', String(params.config.max_turns ?? 50),\n '--verbose',\n '--dangerously-skip-permissions', // Agents run autonomously; stdin is 'ignore' so prompts would hang\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n if (params.config.system_prompt) {\n args.push('--system-prompt', params.config.system_prompt);\n }\n\n args.push(params.prompt);\n\n const { process: proc, pid } = this.processManager.spawn('claude', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n });\n\n const events = createStreamingEvents(proc, parseClaudeEvent, 'Claude', params.signal);\n\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction parseClaudeEvent(line: string): AgentEvent | null {\n if (!line.trim()) return null;\n\n try {\n const parsed: Record<string, unknown> = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n switch (parsed.type) {\n case 'assistant':\n return { type: 'output', timestamp, data: (parsed.message as unknown) ?? parsed };\n case 'tool_use':\n return { type: 'tool_call', timestamp, data: parsed };\n case 'tool_result':\n return { type: 'output', timestamp, data: parsed };\n case 'error':\n return { type: 'error', timestamp, data: (parsed.error as unknown) ?? parsed };\n case 'result': {\n const tokens = extractTokens(parsed, { statsFallback: true });\n return { type: 'done', timestamp, data: parsed, tokens };\n }\n default:\n return { type: 'output', timestamp, data: parsed };\n }\n } catch {\n return { type: 'output', timestamp: new Date().toISOString(), data: line };\n }\n}\n"]}
package/dist/cli.js CHANGED
@@ -1,200 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import { setAsciiMode, setNoColor, printError } from './chunk-I5WEMARW.js';
3
- import { findProjectRoot } from './chunk-VTA74YWX.js';
4
- import { OrchestryError, NotInitializedError } from './chunk-O5AO5QIR.js';
5
- import { Command } from 'commander';
6
-
7
- // src/cli/context.ts
8
- function createContext(opts) {
9
- const noColor = opts.noColor || "NO_COLOR" in process.env || false;
10
- const ascii = opts.ascii || process.env["TERM"] === "dumb" || false;
11
- return {
12
- projectRoot: findProjectRoot(),
13
- json: opts.json ?? false,
14
- quiet: opts.quiet ?? false,
15
- noColor,
16
- ascii
17
- };
18
- }
19
-
20
- // src/bin/cli.ts
21
- var LIGHT_COMMANDS = {
22
- task: async (p, c) => {
23
- const m = await import('./task-5OJTXW27.js');
24
- m.registerTaskCommand(p, c);
25
- },
26
- agent: async (p, c) => {
27
- const m = await import('./agent-V5M2C3OC.js');
28
- m.registerAgentCommand(p, c);
29
- },
30
- status: async (p, c) => {
31
- const m = await import('./status-DTF7D3DV.js');
32
- m.registerStatusCommand(p, c);
33
- },
34
- logs: async (p, c) => {
35
- const m = await import('./logs-IAUAS5TX.js');
36
- m.registerLogsCommand(p, c);
37
- },
38
- config: async (p, c) => {
39
- const m = await import('./config-LJFM55LN.js');
40
- m.registerConfigCommand(p, c);
41
- },
42
- context: async (p, c) => {
43
- const m = await import('./context-EPSDCJTU.js');
44
- m.registerContextCommand(p, c);
45
- },
46
- msg: async (p, c) => {
47
- const m = await import('./msg-SQWQLJP6.js');
48
- m.registerMsgCommand(p, c);
49
- },
50
- goal: async (p, c) => {
51
- const m = await import('./goal-I56QP7HS.js');
52
- m.registerGoalCommand(p, c);
53
- },
54
- team: async (p, c) => {
55
- const m = await import('./team-AISPLEJB.js');
56
- m.registerTeamCommand(p, c);
57
- }
58
- };
59
- var FULL_COMMANDS = {
60
- run: async (p, c) => {
61
- const m = await import('./run-PSZURVVL.js');
62
- m.registerRunCommand(p, c);
63
- },
64
- doctor: async (p, c) => {
65
- const m = await import('./doctor-IO4PV4D6.js');
66
- m.registerDoctorCommand(p, c);
67
- },
68
- tui: async (p, c) => {
69
- const m = await import('./tui-XDJE3IUA.js');
70
- m.registerTuiCommand(p, c);
71
- }
72
- };
73
- var program = new Command();
74
- program.name("orchestry").description("Agents Organizations \u2014 CLI orchestrator for AI agents").version("0.2.3").option("--json", "Output as JSON").option("--quiet", "Minimal output (IDs only)").option("--no-color", "Disable colors").option("--ascii", "ASCII-only output (no Unicode)").hook("preAction", async (thisCommand) => {
75
- const opts = thisCommand.opts();
76
- if (opts.ascii) setAsciiMode(true);
77
- if (opts.color === false) setNoColor(true);
78
- });
79
- var COMMAND_STUBS = [
80
- ["task", "Manage tasks"],
81
- ["agent", "Manage agents"],
82
- ["status", "Show orchestrator status"],
83
- ["logs", "View run logs"],
84
- ["config", "Manage configuration"],
85
- ["context", "Shared context store for inter-agent data exchange"],
86
- ["msg", "Inter-agent messaging"],
87
- ["goal", "Manage goals"],
88
- ["team", "Manage teams"],
89
- ["run", "Run tasks"],
90
- ["doctor", "Check adapters and dependencies"],
91
- ["tui", "Launch TUI dashboard"],
92
- ["init", "Initialize project"],
93
- ["update", "Check for updates"]
94
- ];
95
- var ALL_KNOWN_COMMANDS = new Set(COMMAND_STUBS.map(([name]) => name));
96
- async function main() {
97
- program.parseOptions(process.argv);
98
- const globalOpts = program.opts();
99
- const context = createContext({
100
- json: globalOpts.json,
101
- quiet: globalOpts.quiet,
102
- noColor: globalOpts.color === false,
103
- ascii: globalOpts.ascii
104
- });
105
- const sub = process.argv.slice(2).find((arg) => !arg.startsWith("-"));
106
- const hasRealSub = sub !== void 0 && ALL_KNOWN_COMMANDS.has(sub);
107
- const isHelpOrVersion = process.argv.includes("--help") || process.argv.includes("-h") || process.argv.includes("--version") || process.argv.includes("-V");
108
- if (isHelpOrVersion && !hasRealSub) {
109
- for (const [name, desc] of COMMAND_STUBS) {
110
- program.command(name).description(desc);
111
- }
112
- await program.parseAsync(process.argv);
113
- return;
114
- }
115
- if (sub === "init") {
116
- const { registerInitCommand } = await import('./init-BE5VKWOM.js');
117
- registerInitCommand(program);
118
- } else if (sub === "update") {
119
- const { registerUpdateCommand } = await import('./update-72GZMF65.js');
120
- registerUpdateCommand(program);
121
- }
122
- const needsFull = !sub || sub in FULL_COMMANDS;
123
- const { buildFullContainer, buildLightContainer } = await import('./container-JV7TAUP5.js');
124
- try {
125
- if (needsFull) {
126
- const container = await buildFullContainer(context);
127
- const fullLoader = sub ? FULL_COMMANDS[sub] : void 0;
128
- if (fullLoader) {
129
- await fullLoader(program, container);
130
- } else {
131
- await Promise.all(
132
- Object.values(FULL_COMMANDS).map((fn) => fn(program, container))
133
- );
134
- }
135
- const lightLoader = sub ? LIGHT_COMMANDS[sub] : void 0;
136
- if (lightLoader) {
137
- await lightLoader(program, container);
138
- }
139
- } else {
140
- const container = await buildLightContainer(context);
141
- const lightLoader = LIGHT_COMMANDS[sub];
142
- if (lightLoader) {
143
- await lightLoader(program, container);
144
- } else {
145
- await Promise.all(
146
- Object.values(LIGHT_COMMANDS).map((fn) => fn(program, container))
147
- );
148
- }
149
- }
150
- } catch (err) {
151
- if (err instanceof NotInitializedError) {
152
- if (sub === "doctor") {
153
- const { registerDoctorCommand } = await import('./doctor-IO4PV4D6.js');
154
- registerDoctorCommand(program);
155
- }
156
- if (process.argv.length <= 2) {
157
- const { runInit } = await import('./init-BE5VKWOM.js');
158
- await runInit();
159
- const freshContainer = await buildFullContainer(context);
160
- await FULL_COMMANDS["tui"](program, freshContainer);
161
- await program.parseAsync([...process.argv, "tui"]);
162
- return;
163
- }
164
- if (sub === "init" || sub === "doctor" || sub === "update") {
165
- await program.parseAsync(process.argv);
166
- return;
167
- }
168
- printError(err.message, err.hint);
169
- process.exit(err.exitCode);
170
- }
171
- throw err;
172
- }
173
- if (process.argv.length <= 2) {
174
- process.argv.push("tui");
175
- }
176
- let updateMod;
177
- const updateCheck = import('./update-check-4RV7Z6WT.js').then((m) => {
178
- updateMod = m;
179
- return m.checkForUpdate(program.version() ?? "0.0.0");
180
- });
181
- await program.parseAsync(process.argv);
182
- const actualSub = process.argv[2];
183
- if (actualSub !== "tui" && actualSub !== "update") {
184
- const info = await updateCheck;
185
- if (info && updateMod) updateMod.printUpdateNotification(info);
186
- }
187
- }
188
- main().catch((err) => {
189
- if (err instanceof OrchestryError) {
190
- printError(err.message, err.hint);
191
- process.exit(err.exitCode);
192
- }
193
- printError(
194
- err instanceof Error ? err.message : String(err)
195
- );
196
- if (process.env["ORCHESTRY_DEBUG"]) {
197
- console.error(err);
198
- }
199
- process.exit(1);
200
- });
2
+ import {a as a$1,b,i}from'./chunk-L26TK7Y5.js';import {o}from'./chunk-ZA5Z33GO.js';import {a as a$2,b as b$1}from'./chunk-GZ2Q56YZ.js';import {Command}from'commander';function h(o$1){let t=o$1.noColor||"NO_COLOR"in process.env||false,e=o$1.ascii||process.env.TERM==="dumb"||false;return {projectRoot:o(),json:o$1.json??false,quiet:o$1.quiet??false,noColor:t,ascii:e}}var p={task:async(o,t)=>{(await import('./task-J6ZN7ALI.js')).registerTaskCommand(o,t);},agent:async(o,t)=>{(await import('./agent-FRQKL7YI.js')).registerAgentCommand(o,t);},status:async(o,t)=>{(await import('./status-DLBNWSWM.js')).registerStatusCommand(o,t);},logs:async(o,t)=>{(await import('./logs-5QHJWMEG.js')).registerLogsCommand(o,t);},config:async(o,t)=>{(await import('./config-CCSS2P7R.js')).registerConfigCommand(o,t);},context:async(o,t)=>{(await import('./context-GSMQHQES.js')).registerContextCommand(o,t);},msg:async(o,t)=>{(await import('./msg-4SCLBO4K.js')).registerMsgCommand(o,t);},goal:async(o,t)=>{(await import('./goal-RFKFPR7M.js')).registerGoalCommand(o,t);},team:async(o,t)=>{(await import('./team-MSIBKOQC.js')).registerTeamCommand(o,t);}},c={run:async(o,t)=>{(await import('./run-HSHRELOP.js')).registerRunCommand(o,t);},doctor:async(o,t)=>{(await import('./doctor-KBK5JZBZ.js')).registerDoctorCommand(o,t);},tui:async(o,t)=>{(await import('./tui-G4XUFAIP.js')).registerTuiCommand(o,t);}},a=new Command;a.name("orchestry").description("Agents Organizations \u2014 CLI orchestrator for AI agents").version("0.3.0").option("--json","Output as JSON").option("--quiet","Minimal output (IDs only)").option("--no-color","Disable colors").option("--ascii","ASCII-only output (no Unicode)").hook("preAction",async o=>{let t=o.opts();t.ascii&&a$1(true),t.color===false&&b(true);});var y=[["task","Manage tasks"],["agent","Manage agents"],["status","Show orchestrator status"],["logs","View run logs"],["config","Manage configuration"],["context","Shared context store for inter-agent data exchange"],["msg","Inter-agent messaging"],["goal","Manage goals"],["team","Manage teams"],["run","Run tasks"],["doctor","Check adapters and dependencies"],["tui","Launch TUI dashboard"],["init","Initialize project"],["update","Check for updates"]],j=new Set(y.map(([o])=>o));async function L(){a.parseOptions(process.argv);let o=a.opts(),t=h({json:o.json,quiet:o.quiet,noColor:o.color===false,ascii:o.ascii}),e=process.argv.slice(2).find(n=>!n.startsWith("-")),v=e!==void 0&&j.has(e);if((process.argv.includes("--help")||process.argv.includes("-h")||process.argv.includes("--version")||process.argv.includes("-V"))&&!v){for(let[n,i]of y)a.command(n).description(i);await a.parseAsync(process.argv);return}if(e==="init"){let{registerInitCommand:n}=await import('./init-WRDFAFS2.js');n(a);}else if(e==="update"){let{registerUpdateCommand:n}=await import('./update-PC2ENCKU.js');n(a);}let O=!e||e in c,{buildFullContainer:d,buildLightContainer:b}=await import('./container-OIXLFSX2.js');try{if(O){let n=await d(t),i=e?c[e]:void 0;i?await i(a,n):await Promise.all(Object.values(c).map(x=>x(a,n)));let s=e?p[e]:void 0;s&&await s(a,n);}else {let n=await b(t),i=p[e];i?await i(a,n):await Promise.all(Object.values(p).map(s=>s(a,n)));}}catch(n){if(n instanceof b$1){if(e==="doctor"){let{registerDoctorCommand:i}=await import('./doctor-KBK5JZBZ.js');i(a);}if(process.argv.length<=2){let{runInit:i}=await import('./init-WRDFAFS2.js');await i();let s=await d(t);await c.tui(a,s),await a.parseAsync([...process.argv,"tui"]);return}if(e==="init"||e==="doctor"||e==="update"){await a.parseAsync(process.argv);return}i(n.message,n.hint),process.exit(n.exitCode);}throw n}process.argv.length<=2&&process.argv.push("tui");let m,g=e==="tui"||e==="update",M=g?Promise.resolve(null):import('./update-check-HGMBDYHL.js').then(n=>(m=n,n.checkForUpdateSWR(a.version()??"0.0.0")));if(await a.parseAsync(process.argv),!g){let n=await M;n&&m&&m.printUpdateNotification(n);}}L().catch(o=>{o instanceof a$2&&(i(o.message,o.hint),process.exit(o.exitCode)),i(o instanceof Error?o.message:String(o)),process.env.ORCHESTRY_DEBUG&&console.error(o),process.exit(1);});
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import {a}from'./chunk-GZ2Q56YZ.js';import {execFile,execFileSync}from'child_process';import {promisify}from'util';import {mkdtemp,readFile,unlink,rm}from'fs/promises';import {tmpdir}from'os';import {join}from'path';var i=promisify(execFile),r=3e3;function E(){let t=process.platform;if(t==="darwin")return true;if(t==="linux")try{return execFileSync("which",["xclip"],{timeout:r,stdio:"ignore"}),!0}catch{return false}return t==="win32"}async function w(){let t=process.platform;if(t==="darwin")return x();if(t==="linux")return b();if(t==="win32")return P();throw new a(`Unsupported platform for clipboard: ${t}`,1,"Supported: macOS, Linux, Windows")}async function G(){if(await w()!=="image")return null;let e=process.platform;return e==="darwin"?h():e==="linux"?C():e==="win32"?I():null}async function x(){try{let{stdout:t}=await i("osascript",["-e","clipboard info"],{timeout:r});return t.includes("\xABclass PNGf\xBB")||t.includes("\xABclass TIFF\xBB")?"image":t.includes("\xABclass ut16\xBB")||t.includes("\xABclass utf8\xBB")||t.trim().length>0?"text":"empty"}catch{return "empty"}}async function h(){let t=await mkdtemp(join(tmpdir(),"orch-clip-")),e=join(t,"clipboard.png");try{let o=`
3
+ set theFile to POSIX file "${e}"
4
+ try
5
+ set imgData to the clipboard as \xABclass PNGf\xBB
6
+ set fRef to open for access theFile with write permission
7
+ write imgData to fRef
8
+ close access fRef
9
+ return "ok"
10
+ on error
11
+ try
12
+ close access theFile
13
+ end try
14
+ return "error"
15
+ end try
16
+ `,{stdout:a}=await i("osascript",["-e",o],{timeout:r});return a.trim()!=="ok"?null:{data:await readFile(e),ext:"png"}}catch{return null}finally{try{await unlink(e);}catch{}try{await rm(t,{recursive:!0});}catch{}}}async function b(){try{let{stdout:t}=await i("xclip",["-selection","clipboard","-t","TARGETS","-o"],{timeout:r}),e=t.toLowerCase();return e.includes("image/png")||e.includes("image/tiff")||e.includes("image/jpeg")?"image":e.includes("text/plain")||e.includes("utf8_string")||e.includes("string")||e.trim().length>0?"text":"empty"}catch{return "empty"}}async function C(){try{let{stdout:t}=await i("xclip",["-selection","clipboard","-t","image/png","-o"],{timeout:r,encoding:"buffer",maxBuffer:52428800}),e=Buffer.isBuffer(t)?t:Buffer.from(t,"binary");return e.length===0?null:{data:e,ext:"png"}}catch{return null}}async function P(){try{let{stdout:t}=await i("powershell",["-NoProfile","-Command",'if (Get-Clipboard -Format Image) { "image" } else { "none" }'],{timeout:r});if(t.trim()==="image")return "image";let{stdout:e}=await i("powershell",["-NoProfile","-Command",'if (Get-Clipboard) { "text" } else { "empty" }'],{timeout:r});return e.trim()==="text"?"text":"empty"}catch{return "empty"}}async function I(){let t=await mkdtemp(join(tmpdir(),"orch-clip-")),e=join(t,"clipboard.png");try{let o=`
17
+ Add-Type -AssemblyName System.Windows.Forms
18
+ $img = [System.Windows.Forms.Clipboard]::GetImage()
19
+ if ($img) {
20
+ $img.Save('${e.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png)
21
+ Write-Output 'ok'
22
+ } else {
23
+ Write-Output 'error'
24
+ }
25
+ `,{stdout:a}=await i("powershell",["-NoProfile","-Command",o],{timeout:r});return a.trim()!=="ok"?null:{data:await readFile(e),ext:"png"}}catch{return null}finally{try{await unlink(e);}catch{}try{await rm(t,{recursive:!0});}catch{}}}export{w as detectClipboardType,G as getClipboardImage,E as isClipboardToolAvailable};
@@ -0,0 +1,2 @@
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,6 +1,6 @@
1
- #!/usr/bin/env node
2
- import { createStreamingEvents, extractTokens } from './chunk-TX7WOFCW.js';
3
- import './chunk-CHIP7O6V.js';
1
+ import { createStreamingEvents, extractTokens } from './chunk-MGFMVPRD.js';
2
+ import './chunk-XDVMX2FO.js';
3
+ import './chunk-O2MSGW3V.js';
4
4
  import { execFile } from 'child_process';
5
5
  import { promisify } from 'util';
6
6
 
@@ -113,3 +113,5 @@ function parseCodexEvent(line) {
113
113
  }
114
114
 
115
115
  export { CodexAdapter };
116
+ //# sourceMappingURL=codex-VBUSA2GJ.js.map
117
+ //# sourceMappingURL=codex-VBUSA2GJ.js.map