@oxgeneral/orch 0.2.4 → 0.3.1
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.
- package/dist/App-5EVJSOEL.js +19 -0
- package/dist/agent-FRQKL7YI.js +9 -0
- package/dist/{orchestrator-OMU46RCE.js → chunk-2UC4SVJB.js} +190 -53
- package/dist/chunk-2UC4SVJB.js.map +1 -0
- package/dist/chunk-5AJ4LYO5.js +8 -0
- package/dist/{chunk-45K2XID7.js → chunk-6DWHQPTE.js} +2 -1
- package/dist/chunk-6DWHQPTE.js.map +1 -0
- package/dist/{chunk-POUC4CPC.js → chunk-6MJ7V6VY.js} +2 -2
- package/dist/{chunk-HNKJ4IF7.js → chunk-B4JQM4NU.js} +34 -10
- package/dist/chunk-B4JQM4NU.js.map +1 -0
- package/dist/{chunk-6HENRUYZ.js → chunk-CDFA4IIQ.js} +2 -2
- package/dist/chunk-CHRW4CLD.js +2 -0
- package/dist/{chunk-VAAOW526.js → chunk-GZ2Q56YZ.js} +2 -2
- package/dist/{doctor-service-QEJCE5FK.js → chunk-HMMPM7MF.js} +2 -2
- package/dist/{chunk-AELEEEV3.js → chunk-HSBYJ5C5.js} +27 -7
- package/dist/chunk-HXOMNULD.js +2 -0
- package/dist/{chunk-3TGCIXJA.js → chunk-IQXRQBUK.js} +2 -1
- package/dist/chunk-IQXRQBUK.js.map +1 -0
- package/dist/chunk-L26TK7Y5.js +2 -0
- package/dist/chunk-L3FYR45M.js +2 -0
- package/dist/chunk-LXNRCJ22.js +2 -0
- package/dist/{chunk-TX7WOFCW.js → chunk-MGFMVPRD.js} +4 -7
- package/dist/chunk-MGFMVPRD.js.map +1 -0
- package/dist/chunk-MNXU3KCD.js +2 -0
- package/dist/{chunk-CHIP7O6V.js → chunk-O2MSGW3V.js} +3 -1
- package/dist/chunk-O2MSGW3V.js.map +1 -0
- package/dist/chunk-PJ5DKXGR.js +2 -0
- package/dist/{chunk-2KSBOAW3.js → chunk-QEEM67OA.js} +11 -17
- package/dist/chunk-QEEM67OA.js.map +1 -0
- package/dist/chunk-UMZEA3JT.js +5 -0
- package/dist/{shell-OGTSH4RJ.js → chunk-UW6GUUE6.js} +3 -3
- package/dist/chunk-XDVMX2FO.js +8 -0
- package/dist/chunk-XDVMX2FO.js.map +1 -0
- package/dist/chunk-ZA5Z33GO.js +11 -0
- package/dist/claude-E36EGXUV.js +2 -0
- package/dist/{chunk-IRN2U2NE.js → claude-RIB3RQS5.js} +5 -2
- package/dist/claude-RIB3RQS5.js.map +1 -0
- package/dist/cli.js +1 -199
- package/dist/clipboard-service-PDTSZIR5.js +25 -0
- package/dist/codex-OTZKVESD.js +2 -0
- package/dist/{codex-U7LTJTX6.js → codex-VBUSA2GJ.js} +5 -3
- package/dist/codex-VBUSA2GJ.js.map +1 -0
- package/dist/config-CCSS2P7R.js +2 -0
- package/dist/container-OIXLFSX2.js +6 -0
- package/dist/context-GSMQHQES.js +7 -0
- package/dist/cursor-3DJA6LWS.js +2 -0
- package/dist/{cursor-3DI5GKRF.js → cursor-4QIOTDBW.js} +5 -3
- package/dist/cursor-4QIOTDBW.js.map +1 -0
- package/dist/doctor-KBK5JZBZ.js +2 -0
- package/dist/{chunk-K6DMQERQ.js → doctor-service-F2SXDWHS.js} +3 -1
- package/dist/doctor-service-F2SXDWHS.js.map +1 -0
- package/dist/doctor-service-PB7YBH3F.js +2 -0
- package/dist/goal-RFKFPR7M.js +8 -0
- package/dist/index.d.ts +105 -43
- package/dist/index.js +1817 -5
- package/dist/index.js.map +1 -1
- package/dist/init-WRDFAFS2.js +53 -0
- package/dist/logs-5QHJWMEG.js +12 -0
- package/dist/msg-4SCLBO4K.js +9 -0
- package/dist/orchestrator-FGGXK3N3.js +5 -0
- package/dist/{orchestrator-L6QX2LJ7.js.map → orchestrator-FGGXK3N3.js.map} +1 -1
- package/dist/orchestrator-R7IWZUT6.js +13 -0
- package/dist/process-manager-33H27MQF.js +2 -0
- package/dist/process-manager-A36Y7LHP.js +3 -0
- package/dist/{process-manager-TLZOTO4Y.js.map → process-manager-A36Y7LHP.js.map} +1 -1
- package/dist/registry-BO2PPRNG.js +2 -0
- package/dist/registry-JXXRLJ5J.js +3 -0
- package/dist/{registry-UQAHK77P.js.map → registry-JXXRLJ5J.js.map} +1 -1
- package/dist/run-HSHRELOP.js +3 -0
- package/dist/shell-EOJBDWTH.js +2 -0
- package/dist/{chunk-CIIE6LNG.js → shell-IH2MMTVP.js} +3 -2
- package/dist/shell-IH2MMTVP.js.map +1 -0
- package/dist/status-DLBNWSWM.js +2 -0
- package/dist/task-J6ZN7ALI.js +20 -0
- package/dist/team-MSIBKOQC.js +4 -0
- package/dist/template-engine-MFL5B677.js +3 -0
- package/dist/{template-engine-322SCRR6.js.map → template-engine-MFL5B677.js.map} +1 -1
- package/dist/template-engine-ONIDVD4F.js +2 -0
- package/dist/tui-DMGNSGBT.js +2 -0
- package/dist/update-PC2ENCKU.js +2 -0
- package/dist/update-check-HGMBDYHL.js +2 -0
- package/dist/workspace-manager-KOOYTO7E.js +3 -0
- package/dist/{workspace-manager-G5EQRS72.js → workspace-manager-T6AXG7XL.js} +4 -3
- package/dist/workspace-manager-T6AXG7XL.js.map +1 -0
- package/package.json +11 -2
- package/readme.md +8 -6
- package/scripts/benchmark.ts +304 -0
- package/dist/App-KHUT3IV7.js +0 -4962
- package/dist/agent-V5M2C3OC.js +0 -157
- package/dist/chunk-33QNTNR6.js +0 -46
- package/dist/chunk-6HENRUYZ.js.map +0 -1
- package/dist/chunk-AELEEEV3.js.map +0 -1
- package/dist/chunk-ED47GL3F.js +0 -29
- package/dist/chunk-FRTKB575.js +0 -87
- package/dist/chunk-HXYAZGLP.js +0 -15
- package/dist/chunk-I5WEMARW.js +0 -166
- package/dist/chunk-IZYSGYXG.js +0 -2
- package/dist/chunk-IZYSGYXG.js.map +0 -1
- package/dist/chunk-P6ATSXGL.js +0 -107
- package/dist/chunk-PBFE5V3G.js +0 -2
- package/dist/chunk-PBFE5V3G.js.map +0 -1
- package/dist/chunk-PNE6LQRF.js +0 -5
- package/dist/chunk-POUC4CPC.js.map +0 -1
- package/dist/chunk-QTDKQYZI.js +0 -11
- package/dist/chunk-QTDKQYZI.js.map +0 -1
- package/dist/chunk-VAAOW526.js.map +0 -1
- package/dist/chunk-ZTQ3KWXR.js +0 -13
- package/dist/chunk-ZTQ3KWXR.js.map +0 -1
- package/dist/claude-GH6P2DC5.js +0 -4
- package/dist/claude-S47YTIHU.js +0 -2
- package/dist/claude-S47YTIHU.js.map +0 -1
- package/dist/codex-2CH57B7G.js +0 -2
- package/dist/codex-2CH57B7G.js.map +0 -1
- package/dist/config-LJFM55LN.js +0 -75
- package/dist/container-KPH4HVAJ.js +0 -1532
- package/dist/context-EPSDCJTU.js +0 -83
- package/dist/cursor-QFUNKPCQ.js +0 -2
- package/dist/cursor-QFUNKPCQ.js.map +0 -1
- package/dist/doctor-GHRV5I2S.js +0 -67
- package/dist/doctor-service-QEJCE5FK.js.map +0 -1
- package/dist/doctor-service-TPOMFAIG.js +0 -2
- package/dist/goal-I56QP7HS.js +0 -110
- package/dist/init-EQTGQ4G2.js +0 -165
- package/dist/logs-AK255DEJ.js +0 -207
- package/dist/msg-SQWQLJP6.js +0 -95
- package/dist/orchestrator-L6QX2LJ7.js +0 -2
- package/dist/process-manager-HUVNAPQV.js +0 -2
- package/dist/process-manager-TLZOTO4Y.js +0 -2
- package/dist/registry-PQWRVNF2.js +0 -2
- package/dist/registry-UQAHK77P.js +0 -2
- package/dist/run-PSZURVVL.js +0 -95
- package/dist/shell-5ZNXFGXV.js +0 -3
- package/dist/shell-OGTSH4RJ.js.map +0 -1
- package/dist/status-DTF7D3DV.js +0 -56
- package/dist/task-35SDKXFC.js +0 -209
- package/dist/team-AISPLEJB.js +0 -97
- package/dist/template-engine-322SCRR6.js +0 -2
- package/dist/template-engine-3CDRZNMJ.js +0 -3
- package/dist/tui-AR6PVMBQ.js +0 -230
- package/dist/update-DCCWVISK.js +0 -64
- package/dist/update-check-4YKLGBFB.js +0 -2
- package/dist/workspace-manager-AS4TFA7R.js +0 -3
- package/dist/workspace-manager-AS4TFA7R.js.map +0 -1
|
@@ -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
|
-
|
|
2
|
-
import { readLines } from './chunk-
|
|
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
|
-
|
|
2
|
-
import { NotInitializedError } from './chunk-3TGCIXJA.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
|
|
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,
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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 @@
|
|
|
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};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
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 {
|
|
3
|
-
import { findProjectRoot } from './chunk-2KSBOAW3.js';
|
|
4
|
-
import { OrchestryError, NotInitializedError } from './chunk-3TGCIXJA.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-35SDKXFC.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-AK255DEJ.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-GHRV5I2S.js');
|
|
66
|
-
m.registerDoctorCommand(p, c);
|
|
67
|
-
},
|
|
68
|
-
tui: async (p, c) => {
|
|
69
|
-
const m = await import('./tui-AR6PVMBQ.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.4").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-EQTGQ4G2.js');
|
|
117
|
-
registerInitCommand(program);
|
|
118
|
-
} else if (sub === "update") {
|
|
119
|
-
const { registerUpdateCommand } = await import('./update-DCCWVISK.js');
|
|
120
|
-
registerUpdateCommand(program);
|
|
121
|
-
}
|
|
122
|
-
const needsFull = !sub || sub in FULL_COMMANDS;
|
|
123
|
-
const { buildFullContainer, buildLightContainer } = await import('./container-KPH4HVAJ.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-GHRV5I2S.js');
|
|
154
|
-
registerDoctorCommand(program);
|
|
155
|
-
}
|
|
156
|
-
if (process.argv.length <= 2) {
|
|
157
|
-
const { runInit } = await import('./init-EQTGQ4G2.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 skipUpdateCheck = sub === "tui" || sub === "update";
|
|
178
|
-
const updateCheck = skipUpdateCheck ? Promise.resolve(null) : import('./update-check-4YKLGBFB.js').then((m) => {
|
|
179
|
-
updateMod = m;
|
|
180
|
-
return m.checkForUpdateSWR(program.version() ?? "0.0.0");
|
|
181
|
-
});
|
|
182
|
-
await program.parseAsync(process.argv);
|
|
183
|
-
if (!skipUpdateCheck) {
|
|
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-DMGNSGBT.js')).registerTuiCommand(o,t);}},a=new Command;a.name("orchestry").description("Agents Organizations \u2014 CLI orchestrator for AI agents").version("0.3.1").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
|
-
|
|
2
|
-
import
|
|
3
|
-
import './chunk-
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/adapters/codex.ts"],"names":[],"mappings":";;;;;;AAcA,IAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAEjC,IAAM,eAAN,MAA4C;AAAA,EAGjD,YAA6B,cAAA,EAAiC;AAAjC,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EAAkC;AAAA,EAFtD,IAAA,GAAO,OAAA;AAAA,EAIhB,MAAM,IAAA,GAAmC;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAO,GAAI,MAAM,cAAc,OAAA,EAAS,CAAC,WAAW,CAAC,CAAA;AAC7D,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,MAAA,CAAO,MAAK,EAAE;AAAA,IAC5C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ,MAAA,EAAsC;AAC5C,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,MAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MAAa;AAAA;AAAA,KACf;AAEA,IAAA,IAAI,MAAA,CAAO,OAAO,KAAA,EAAO;AACvB,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,IAC1C;AAGA,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAEb,IAAA,MAAM,EAAE,SAAS,IAAA,EAAM,GAAA,KAAQ,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM;AAAA,MACtE,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,KAAK,EAAE,GAAG,QAAQ,GAAA,EAAK,GAAG,OAAO,GAAA,EAAI;AAAA,MACrC,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA;AAAA,KAC/B,CAAA;AAGD,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAC9B,MAAA,IAAA,CAAK,MAAM,GAAA,EAAI;AAAA,IACjB;AAEA,IAAA,MAAM,SAAS,qBAAA,CAAsB,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,OAAO,MAAM,CAAA;AAElF,IAAA,OAAO,EAAE,KAAK,MAAA,EAAO;AAAA,EACvB;AAAA,EAEA,MAAM,KAAK,GAAA,EAA4B;AACrC,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,aAAA,CAAc,GAAG,CAAA;AAAA,EAC7C;AACF;AAEA,SAAS,gBAAgB,IAAA,EAAiC;AACxD,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG,OAAO,IAAA;AAEzB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAkC,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACvD,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEzC,IAAA,MAAM,IAAA,GAAQ,OAAO,IAAA,IAAmB,EAAA;AAGxC,IAAA,QAAQ,IAAA;AAAM;AAAA,MAEZ,KAAK,gBAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAM,MAAA,EAAO;AAAA;AAAA,MAGnD,KAAK,cAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAM,MAAA,EAAO;AAAA,MAEnD,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,MAAA,GAAS,cAAc,MAAM,CAAA;AACnC,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,QAAQ,MAAA,EAAO;AAAA,MACzD;AAAA,MAEA,KAAK,aAAA,EAAe;AAClB,QAAA,MAAM,MAAA,GAAS,cAAc,MAAM,CAAA;AACnC,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,QAAQ,MAAA,EAAO;AAAA,MAC1D;AAAA;AAAA,MAGA,KAAK,cAAA;AAAA,MACL,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,IAAA,GAAQ,MAAA,CAAO,IAAA,IAAoC,EAAC;AAC1D,QAAA,MAAM,QAAA,GAAY,KAAK,IAAA,IAAmB,EAAA;AAE1C,QAAA,IAAI,aAAa,eAAA,EAAiB;AAChC,UAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,QACjD;AACA,QAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,UAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,QACjD;AACA,QAAA,IAAI,aAAa,mBAAA,EAAqB;AACpC,UAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,QAClD;AACA,QAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,UAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,UAAU,EAAC;AAC9D,UAAA,MAAM,KAAA,GAAS,OAAA,CACZ,GAAA,CAAI,CAAC,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,CAAA,CAAE,IAAA,GAAO,EAAE,CAAA,CACnD,OAAO,OAAO,CAAA;AACjB,UAAA,OAAO,EAAE,MAAM,aAAA,EAAe,SAAA,EAAW,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,EAAK,EAAE;AAAA,QACtE;AACA,QAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,UAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,QACpD;AACA,QAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,UAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,QACjD;AACA,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,QAChD;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,MACjD;AAAA,MAEA,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,WAAW,IAAA,EAAO,MAAA,CAAO,SAAqB,MAAA,EAAO;AAAA,MAE/E;AACE,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAM,MAAA,EAAO;AAAA;AACrD,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAA,iBAAW,IAAI,MAAK,EAAE,WAAA,EAAY,EAAG,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3E;AACF","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"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
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};
|