@oxgeneral/orch 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{App-KDZSTAMR.js → App-KHUT3IV7.js} +169 -71
- package/dist/{chunk-VTA74YWX.js → chunk-2KSBOAW3.js} +1 -1
- package/dist/{chunk-O5AO5QIR.js → chunk-3TGCIXJA.js} +7 -1
- package/dist/{chunk-6GFVB6EK.js → chunk-FRTKB575.js} +24 -38
- package/dist/chunk-K6DMQERQ.js +89 -0
- package/dist/{chunk-2B32FPEB.js → chunk-QTDKQYZI.js} +3 -3
- package/dist/{chunk-2B32FPEB.js.map → chunk-QTDKQYZI.js.map} +1 -1
- package/dist/{chunk-ZU6AY2VU.js → chunk-VAAOW526.js} +2 -2
- package/dist/chunk-VAAOW526.js.map +1 -0
- package/dist/chunk-ZTQ3KWXR.js +13 -0
- package/dist/chunk-ZTQ3KWXR.js.map +1 -0
- package/dist/cli.js +16 -16
- package/dist/{container-JV7TAUP5.js → container-KPH4HVAJ.js} +6 -6
- package/dist/{doctor-IO4PV4D6.js → doctor-GHRV5I2S.js} +4 -4
- package/dist/doctor-service-QEJCE5FK.js +3 -0
- package/dist/doctor-service-QEJCE5FK.js.map +1 -0
- package/dist/doctor-service-TPOMFAIG.js +2 -0
- package/dist/index.d.ts +20 -4
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/{init-BE5VKWOM.js → init-EQTGQ4G2.js} +18 -2
- package/dist/{logs-IAUAS5TX.js → logs-AK255DEJ.js} +1 -1
- package/dist/orchestrator-L6QX2LJ7.js +2 -0
- package/dist/{orchestrator-TAFBYQQ5.js.map → orchestrator-L6QX2LJ7.js.map} +1 -1
- package/dist/{orchestrator-VGYKSOZJ.js → orchestrator-OMU46RCE.js} +47 -19
- package/dist/{task-5OJTXW27.js → task-35SDKXFC.js} +1 -1
- package/dist/{tui-XDJE3IUA.js → tui-AR6PVMBQ.js} +6 -1
- package/dist/{update-72GZMF65.js → update-DCCWVISK.js} +1 -1
- package/dist/update-check-4YKLGBFB.js +2 -0
- package/dist/workspace-manager-AS4TFA7R.js +3 -0
- package/dist/workspace-manager-AS4TFA7R.js.map +1 -0
- package/dist/{workspace-manager-47KI7B27.js → workspace-manager-G5EQRS72.js} +38 -2
- package/package.json +1 -1
- package/dist/chunk-E3TCKHU6.js +0 -13
- package/dist/chunk-E3TCKHU6.js.map +0 -1
- package/dist/chunk-XI4TU6VU.js +0 -50
- package/dist/chunk-ZU6AY2VU.js.map +0 -1
- package/dist/doctor-service-A34DHPKI.js +0 -2
- package/dist/doctor-service-NTWBWOM2.js +0 -2
- package/dist/doctor-service-NTWBWOM2.js.map +0 -1
- package/dist/orchestrator-TAFBYQQ5.js +0 -2
- package/dist/update-check-4RV7Z6WT.js +0 -2
- package/dist/workspace-manager-7M46ESUL.js +0 -2
- package/dist/workspace-manager-7M46ESUL.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { setAsciiMode, setNoColor, printError } from './chunk-I5WEMARW.js';
|
|
3
|
-
import { findProjectRoot } from './chunk-
|
|
4
|
-
import { OrchestryError, NotInitializedError } from './chunk-
|
|
3
|
+
import { findProjectRoot } from './chunk-2KSBOAW3.js';
|
|
4
|
+
import { OrchestryError, NotInitializedError } from './chunk-3TGCIXJA.js';
|
|
5
5
|
import { Command } from 'commander';
|
|
6
6
|
|
|
7
7
|
// src/cli/context.ts
|
|
@@ -20,7 +20,7 @@ function createContext(opts) {
|
|
|
20
20
|
// src/bin/cli.ts
|
|
21
21
|
var LIGHT_COMMANDS = {
|
|
22
22
|
task: async (p, c) => {
|
|
23
|
-
const m = await import('./task-
|
|
23
|
+
const m = await import('./task-35SDKXFC.js');
|
|
24
24
|
m.registerTaskCommand(p, c);
|
|
25
25
|
},
|
|
26
26
|
agent: async (p, c) => {
|
|
@@ -32,7 +32,7 @@ var LIGHT_COMMANDS = {
|
|
|
32
32
|
m.registerStatusCommand(p, c);
|
|
33
33
|
},
|
|
34
34
|
logs: async (p, c) => {
|
|
35
|
-
const m = await import('./logs-
|
|
35
|
+
const m = await import('./logs-AK255DEJ.js');
|
|
36
36
|
m.registerLogsCommand(p, c);
|
|
37
37
|
},
|
|
38
38
|
config: async (p, c) => {
|
|
@@ -62,16 +62,16 @@ var FULL_COMMANDS = {
|
|
|
62
62
|
m.registerRunCommand(p, c);
|
|
63
63
|
},
|
|
64
64
|
doctor: async (p, c) => {
|
|
65
|
-
const m = await import('./doctor-
|
|
65
|
+
const m = await import('./doctor-GHRV5I2S.js');
|
|
66
66
|
m.registerDoctorCommand(p, c);
|
|
67
67
|
},
|
|
68
68
|
tui: async (p, c) => {
|
|
69
|
-
const m = await import('./tui-
|
|
69
|
+
const m = await import('./tui-AR6PVMBQ.js');
|
|
70
70
|
m.registerTuiCommand(p, c);
|
|
71
71
|
}
|
|
72
72
|
};
|
|
73
73
|
var program = new Command();
|
|
74
|
-
program.name("orchestry").description("Agents Organizations \u2014 CLI orchestrator for AI agents").version("0.2.
|
|
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
75
|
const opts = thisCommand.opts();
|
|
76
76
|
if (opts.ascii) setAsciiMode(true);
|
|
77
77
|
if (opts.color === false) setNoColor(true);
|
|
@@ -113,14 +113,14 @@ async function main() {
|
|
|
113
113
|
return;
|
|
114
114
|
}
|
|
115
115
|
if (sub === "init") {
|
|
116
|
-
const { registerInitCommand } = await import('./init-
|
|
116
|
+
const { registerInitCommand } = await import('./init-EQTGQ4G2.js');
|
|
117
117
|
registerInitCommand(program);
|
|
118
118
|
} else if (sub === "update") {
|
|
119
|
-
const { registerUpdateCommand } = await import('./update-
|
|
119
|
+
const { registerUpdateCommand } = await import('./update-DCCWVISK.js');
|
|
120
120
|
registerUpdateCommand(program);
|
|
121
121
|
}
|
|
122
122
|
const needsFull = !sub || sub in FULL_COMMANDS;
|
|
123
|
-
const { buildFullContainer, buildLightContainer } = await import('./container-
|
|
123
|
+
const { buildFullContainer, buildLightContainer } = await import('./container-KPH4HVAJ.js');
|
|
124
124
|
try {
|
|
125
125
|
if (needsFull) {
|
|
126
126
|
const container = await buildFullContainer(context);
|
|
@@ -150,11 +150,11 @@ async function main() {
|
|
|
150
150
|
} catch (err) {
|
|
151
151
|
if (err instanceof NotInitializedError) {
|
|
152
152
|
if (sub === "doctor") {
|
|
153
|
-
const { registerDoctorCommand } = await import('./doctor-
|
|
153
|
+
const { registerDoctorCommand } = await import('./doctor-GHRV5I2S.js');
|
|
154
154
|
registerDoctorCommand(program);
|
|
155
155
|
}
|
|
156
156
|
if (process.argv.length <= 2) {
|
|
157
|
-
const { runInit } = await import('./init-
|
|
157
|
+
const { runInit } = await import('./init-EQTGQ4G2.js');
|
|
158
158
|
await runInit();
|
|
159
159
|
const freshContainer = await buildFullContainer(context);
|
|
160
160
|
await FULL_COMMANDS["tui"](program, freshContainer);
|
|
@@ -174,13 +174,13 @@ async function main() {
|
|
|
174
174
|
process.argv.push("tui");
|
|
175
175
|
}
|
|
176
176
|
let updateMod;
|
|
177
|
-
const
|
|
177
|
+
const skipUpdateCheck = sub === "tui" || sub === "update";
|
|
178
|
+
const updateCheck = skipUpdateCheck ? Promise.resolve(null) : import('./update-check-4YKLGBFB.js').then((m) => {
|
|
178
179
|
updateMod = m;
|
|
179
|
-
return m.
|
|
180
|
+
return m.checkForUpdateSWR(program.version() ?? "0.0.0");
|
|
180
181
|
});
|
|
181
182
|
await program.parseAsync(process.argv);
|
|
182
|
-
|
|
183
|
-
if (actualSub !== "tui" && actualSub !== "update") {
|
|
183
|
+
if (!skipUpdateCheck) {
|
|
184
184
|
const info = await updateCheck;
|
|
185
185
|
if (info && updateMod) updateMod.printUpdateNotification(info);
|
|
186
186
|
}
|
|
@@ -4,8 +4,8 @@ import { isGoalTerminal, GOAL_STATUS_ORDER } from './chunk-HXYAZGLP.js';
|
|
|
4
4
|
import { canTransition, isTerminal } from './chunk-33QNTNR6.js';
|
|
5
5
|
import { AUTONOMOUS_LABEL } from './chunk-PNE6LQRF.js';
|
|
6
6
|
import { readLines } from './chunk-CHIP7O6V.js';
|
|
7
|
-
import { Paths, readYaml, writeYaml, ensureDir, listFiles, writeJson, readJson, appendJsonl, readJsonl, readJsonlTail, pathExists } from './chunk-
|
|
8
|
-
import { InvalidArgumentsError, TeamNotFoundError, GoalNotFoundError, AgentNotFoundError, TaskNotFoundError, InvalidTransitionError } from './chunk-
|
|
7
|
+
import { Paths, readYaml, writeYaml, ensureDir, listFiles, writeJson, readJson, appendJsonl, readJsonl, readJsonlTail, pathExists } from './chunk-2KSBOAW3.js';
|
|
8
|
+
import { InvalidArgumentsError, TeamNotFoundError, GoalNotFoundError, AgentNotFoundError, TaskNotFoundError, InvalidTransitionError } from './chunk-3TGCIXJA.js';
|
|
9
9
|
import fs, { mkdir } from 'fs/promises';
|
|
10
10
|
import { createReadStream } from 'fs';
|
|
11
11
|
import path from 'path';
|
|
@@ -1477,10 +1477,10 @@ async function buildFullContainer(context) {
|
|
|
1477
1477
|
import('./codex-U7LTJTX6.js'),
|
|
1478
1478
|
import('./cursor-3DI5GKRF.js'),
|
|
1479
1479
|
import('./shell-5ZNXFGXV.js'),
|
|
1480
|
-
import('./workspace-manager-
|
|
1480
|
+
import('./workspace-manager-G5EQRS72.js'),
|
|
1481
1481
|
import('./template-engine-3CDRZNMJ.js'),
|
|
1482
|
-
import('./orchestrator-
|
|
1483
|
-
import('./doctor-service-
|
|
1482
|
+
import('./orchestrator-OMU46RCE.js'),
|
|
1483
|
+
import('./doctor-service-TPOMFAIG.js')
|
|
1484
1484
|
]);
|
|
1485
1485
|
const processManager = new ProcessManager();
|
|
1486
1486
|
const templateEngine = new LiquidTemplateEngine();
|
|
@@ -1494,7 +1494,7 @@ async function buildFullContainer(context) {
|
|
|
1494
1494
|
adapterRegistry.register(new CodexAdapter(processManager));
|
|
1495
1495
|
adapterRegistry.register(new CursorAdapter(processManager));
|
|
1496
1496
|
adapterRegistry.register(new ShellAdapter(processManager));
|
|
1497
|
-
const doctorService = new DoctorService(adapterRegistry, processManager);
|
|
1497
|
+
const doctorService = new DoctorService(adapterRegistry, processManager, context.projectRoot);
|
|
1498
1498
|
const orchestrator = new Orchestrator({
|
|
1499
1499
|
taskStore: light.taskStore,
|
|
1500
1500
|
agentStore: light.agentStore,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { DoctorService } from './chunk-
|
|
2
|
+
import { DoctorService } from './chunk-K6DMQERQ.js';
|
|
3
3
|
import { amber, getIcon, dim } from './chunk-I5WEMARW.js';
|
|
4
4
|
import { AdapterRegistry } from './chunk-45K2XID7.js';
|
|
5
5
|
import { ClaudeAdapter } from './chunk-IRN2U2NE.js';
|
|
6
6
|
import './chunk-TX7WOFCW.js';
|
|
7
7
|
import { ShellAdapter } from './chunk-CIIE6LNG.js';
|
|
8
8
|
import { ProcessManager } from './chunk-CHIP7O6V.js';
|
|
9
|
-
import { Paths } from './chunk-
|
|
10
|
-
import './chunk-
|
|
9
|
+
import { Paths } from './chunk-2KSBOAW3.js';
|
|
10
|
+
import './chunk-3TGCIXJA.js';
|
|
11
11
|
import chalk from 'chalk';
|
|
12
12
|
|
|
13
13
|
function registerDoctorCommand(program, container) {
|
|
@@ -24,7 +24,7 @@ function registerDoctorCommand(program, container) {
|
|
|
24
24
|
const registry = new AdapterRegistry();
|
|
25
25
|
registry.register(new ClaudeAdapter(pm));
|
|
26
26
|
registry.register(new ShellAdapter(pm));
|
|
27
|
-
doctorService = new DoctorService(registry, pm);
|
|
27
|
+
doctorService = new DoctorService(registry, pm, process.cwd());
|
|
28
28
|
paths = new Paths(process.cwd());
|
|
29
29
|
}
|
|
30
30
|
console.log();
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import {execFile}from'child_process';import {promisify}from'util';import p from'fs/promises';import d from'path';var o=promisify(execFile),a=class{constructor(t,i,e){this.adapterRegistry=t;this.processManager=i;this.cwd=e??process.cwd();}cwd;async runAll(){let t=[],i=this.adapterRegistry.list(),e=0;for(let r of i){let s=await r.test();s.ok?(e++,t.push({name:r.kind,status:"ok",detail:s.version})):t.push({name:r.kind,status:"fail",detail:s.error});}return t.push(await this.checkCommand("git",["--version"],"git")),t.push(await this.checkGitRepo()),t.push(await this.checkGitignore()),t.push(await this.checkCommand("node",["--version"],"node")),{checks:t,adaptersReady:e,adaptersTotal:i.length}}async checkCommand(t,i,e){try{let{stdout:r}=await o(t,i);return {name:e,status:"ok",detail:r.trim()}}catch{return {name:e,status:"fail",detail:`${t}: command not found`}}}async checkGitignore(){let t=d.join(this.cwd,".gitignore");try{return (await p.readFile(t,"utf-8")).split(`
|
|
2
|
+
`).some(r=>r.trim()===".orchestry")?{name:".gitignore",status:"ok",detail:".orchestry is excluded"}:{name:".gitignore",status:"fail",detail:".orchestry not in .gitignore \u2014 worktrees will copy state recursively. Run: orch init"}}catch{return {name:".gitignore",status:"fail",detail:"no .gitignore found \u2014 .orchestry may be committed to git. Run: orch init"}}}async checkGitRepo(){try{return await o("git",["rev-parse","--is-inside-work-tree"],{cwd:this.cwd}),{name:"git repo",status:"ok",detail:"git repository detected"}}catch{return {name:"git repo",status:"fail",detail:"not a git repository \u2014 worktree/isolated modes will fail. Run: git init"}}}};export{a as DoctorService};//# sourceMappingURL=doctor-service-QEJCE5FK.js.map
|
|
3
|
+
//# sourceMappingURL=doctor-service-QEJCE5FK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/application/doctor-service.ts"],"names":["execFileAsync","promisify","execFile","DoctorService","adapterRegistry","processManager","projectRoot","checks","adapters","adaptersReady","adapter","result","command","args","name","stdout","gitignorePath","path","fs","line"],"mappings":"iHAaA,IAAMA,EAAgBC,SAAAA,CAAUC,QAAQ,EAc3BC,CAAAA,CAAN,KAAoB,CAGzB,WAAA,CACmBC,CAAAA,CACAC,CAAAA,CACjBC,EACA,CAHiB,IAAA,CAAA,eAAA,CAAAF,EACA,IAAA,CAAA,cAAA,CAAAC,CAAAA,CAGjB,KAAK,GAAA,CAAMC,CAAAA,EAAe,OAAA,CAAQ,GAAA,GACpC,CARiB,IAUjB,MAAM,MAAA,EAAgC,CACpC,IAAMC,CAAAA,CAAwB,EAAC,CAGzBC,CAAAA,CAAW,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAK,CACvCC,EAAgB,CAAA,CAEpB,IAAA,IAAWC,KAAWF,CAAAA,CAAU,CAC9B,IAAMG,CAAAA,CAAS,MAAMD,CAAAA,CAAQ,IAAA,EAAK,CAC9BC,CAAAA,CAAO,IACTF,CAAAA,EAAAA,CACAF,CAAAA,CAAO,KAAK,CACV,IAAA,CAAMG,EAAQ,IAAA,CACd,MAAA,CAAQ,IAAA,CACR,MAAA,CAAQC,CAAAA,CAAO,OACjB,CAAC,CAAA,EAEDJ,CAAAA,CAAO,KAAK,CACV,IAAA,CAAMG,EAAQ,IAAA,CACd,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQC,CAAAA,CAAO,KACjB,CAAC,EAEL,CAGA,OAAAJ,CAAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,YAAA,CAAa,KAAA,CAAO,CAAC,WAAW,CAAA,CAAG,KAAK,CAAC,CAAA,CAGhEA,EAAO,IAAA,CAAK,MAAM,KAAK,YAAA,EAAc,CAAA,CAGrCA,CAAAA,CAAO,IAAA,CAAK,MAAM,KAAK,cAAA,EAAgB,EAGvCA,CAAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,YAAA,CAAa,MAAA,CAAQ,CAAC,WAAW,CAAA,CAAG,MAAM,CAAC,CAAA,CAE3D,CACL,MAAA,CAAAA,CAAAA,CACA,cAAAE,CAAAA,CACA,aAAA,CAAeD,CAAAA,CAAS,MAC1B,CACF,CAEA,MAAc,YAAA,CACZI,CAAAA,CACAC,EACAC,CAAAA,CACsB,CACtB,GAAI,CACF,GAAM,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAI,MAAMf,CAAAA,CAAcY,CAAAA,CAASC,CAAI,CAAA,CACpD,OAAO,CAAE,IAAA,CAAAC,CAAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,MAAA,CAAQC,CAAAA,CAAO,MAAO,CACrD,MAAQ,CACN,OAAO,CAAE,IAAA,CAAAD,CAAAA,CAAM,MAAA,CAAQ,MAAA,CAAQ,MAAA,CAAQ,CAAA,EAAGF,CAAO,CAAA,mBAAA,CAAsB,CACzE,CACF,CAEA,MAAc,gBAAuC,CACnD,IAAMI,CAAAA,CAAgBC,CAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAK,YAAY,CAAA,CACtD,GAAI,CAGF,OAAA,CAFgB,MAAMC,EAAG,QAAA,CAASF,CAAAA,CAAe,OAAO,CAAA,EAC/B,KAAA,CAAM;AAAA,CAAI,CAAA,CAAE,IAAA,CAAMG,CAAAA,EAASA,CAAAA,CAAK,MAAK,GAAM,YAAY,CAAA,CAEvE,CAAE,KAAM,YAAA,CAAc,MAAA,CAAQ,IAAA,CAAM,MAAA,CAAQ,wBAAyB,CAAA,CAEvE,CACL,IAAA,CAAM,YAAA,CACN,OAAQ,MAAA,CACR,MAAA,CAAQ,2FACV,CACF,MAAQ,CACN,OAAO,CACL,IAAA,CAAM,aACN,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQ,+EACV,CACF,CACF,CAEA,MAAc,YAAA,EAAqC,CACjD,GAAI,CACF,OAAA,MAAMnB,CAAAA,CAAc,MAAO,CAAC,WAAA,CAAa,uBAAuB,CAAA,CAAG,CAAE,GAAA,CAAK,IAAA,CAAK,GAAI,CAAC,EAC7E,CAAE,IAAA,CAAM,UAAA,CAAY,MAAA,CAAQ,KAAM,MAAA,CAAQ,yBAA0B,CAC7E,CAAA,KAAQ,CACN,OAAO,CACL,IAAA,CAAM,UAAA,CACN,OAAQ,MAAA,CACR,MAAA,CAAQ,8EACV,CACF,CACF,CACF","file":"doctor-service-QEJCE5FK.js","sourcesContent":["/**\n * Doctor service — diagnostics and health checks.\n *\n * Checks adapter availability, system dependencies, project state.\n */\n\nimport type { AdapterRegistry } from '../infrastructure/adapters/registry.js';\nimport type { IProcessManager } from '../infrastructure/process/process-manager.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface DoctorCheck {\n name: string;\n status: 'ok' | 'fail' | 'skip';\n detail?: string;\n}\n\nexport interface DoctorReport {\n checks: DoctorCheck[];\n adaptersReady: number;\n adaptersTotal: number;\n}\n\nexport class DoctorService {\n private readonly cwd: string;\n\n constructor(\n private readonly adapterRegistry: AdapterRegistry,\n private readonly processManager: IProcessManager,\n projectRoot?: string,\n ) {\n this.cwd = projectRoot ?? process.cwd();\n }\n\n async runAll(): Promise<DoctorReport> {\n const checks: DoctorCheck[] = [];\n\n // Check adapters\n const adapters = this.adapterRegistry.list();\n let adaptersReady = 0;\n\n for (const adapter of adapters) {\n const result = await adapter.test();\n if (result.ok) {\n adaptersReady++;\n checks.push({\n name: adapter.kind,\n status: 'ok',\n detail: result.version,\n });\n } else {\n checks.push({\n name: adapter.kind,\n status: 'fail',\n detail: result.error,\n });\n }\n }\n\n // Check git\n checks.push(await this.checkCommand('git', ['--version'], 'git'));\n\n // Check git repository (required for worktree/isolated workspace modes)\n checks.push(await this.checkGitRepo());\n\n // Check .orchestry in root .gitignore (prevents recursive worktrees)\n checks.push(await this.checkGitignore());\n\n // Check node\n checks.push(await this.checkCommand('node', ['--version'], 'node'));\n\n return {\n checks,\n adaptersReady,\n adaptersTotal: adapters.length,\n };\n }\n\n private async checkCommand(\n command: string,\n args: string[],\n name: string,\n ): Promise<DoctorCheck> {\n try {\n const { stdout } = await execFileAsync(command, args);\n return { name, status: 'ok', detail: stdout.trim() };\n } catch {\n return { name, status: 'fail', detail: `${command}: command not found` };\n }\n }\n\n private async checkGitignore(): Promise<DoctorCheck> {\n const gitignorePath = path.join(this.cwd, '.gitignore');\n try {\n const content = await fs.readFile(gitignorePath, 'utf-8');\n const hasEntry = content.split('\\n').some((line) => line.trim() === '.orchestry');\n if (hasEntry) {\n return { name: '.gitignore', status: 'ok', detail: '.orchestry is excluded' };\n }\n return {\n name: '.gitignore',\n status: 'fail',\n detail: '.orchestry not in .gitignore — worktrees will copy state recursively. Run: orch init',\n };\n } catch {\n return {\n name: '.gitignore',\n status: 'fail',\n detail: 'no .gitignore found — .orchestry may be committed to git. Run: orch init',\n };\n }\n }\n\n private async checkGitRepo(): Promise<DoctorCheck> {\n try {\n await execFileAsync('git', ['rev-parse', '--is-inside-work-tree'], { cwd: this.cwd });\n return { name: 'git repo', status: 'ok', detail: 'git repository detected' };\n } catch {\n return {\n name: 'git repo',\n status: 'fail',\n detail: 'not a git repository — worktree/isolated modes will fail. Run: git init',\n };\n }\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -463,6 +463,9 @@ declare class TaskNotFoundError extends OrchestryError {
|
|
|
463
463
|
declare class AgentNotFoundError extends OrchestryError {
|
|
464
464
|
constructor(agentId: string);
|
|
465
465
|
}
|
|
466
|
+
declare class WorkspaceError extends OrchestryError {
|
|
467
|
+
constructor(message: string, hint?: string);
|
|
468
|
+
}
|
|
466
469
|
|
|
467
470
|
/**
|
|
468
471
|
* Task state machine — pure functions, no side effects.
|
|
@@ -1016,13 +1019,22 @@ declare class Orchestrator {
|
|
|
1016
1019
|
*/
|
|
1017
1020
|
private withStateLock;
|
|
1018
1021
|
/**
|
|
1019
|
-
* Run a single task by ID.
|
|
1022
|
+
* Run a single task by ID.
|
|
1023
|
+
* If watch mode is active (lock already held), dispatches inline via stateMutex.
|
|
1024
|
+
* Otherwise acquires a temporary lock for the duration of the run.
|
|
1020
1025
|
*/
|
|
1021
1026
|
runTask(taskId: string): Promise<void>;
|
|
1022
1027
|
/**
|
|
1023
|
-
* Run all dispatchable tasks.
|
|
1028
|
+
* Run all dispatchable tasks.
|
|
1029
|
+
* If watch mode is active (lock already held), dispatches inline via stateMutex.
|
|
1030
|
+
* Otherwise acquires a temporary lock for the duration of the run.
|
|
1024
1031
|
*/
|
|
1025
1032
|
runAll(): Promise<void>;
|
|
1033
|
+
/**
|
|
1034
|
+
* Invalidate caches → loadState → run dispatch fn → saveState.
|
|
1035
|
+
* Shared by runTask, runAll, and immediateDispatch.
|
|
1036
|
+
*/
|
|
1037
|
+
private freshDispatch;
|
|
1026
1038
|
/**
|
|
1027
1039
|
* Acquire lock, run fn, then release lock.
|
|
1028
1040
|
* Used by single-shot commands (runTask, runAll) that don't go through startWatch.
|
|
@@ -1063,6 +1075,7 @@ declare class Orchestrator {
|
|
|
1063
1075
|
/**
|
|
1064
1076
|
* Schedule an immediate dispatch with 500ms debounce.
|
|
1065
1077
|
* Called on task:created to avoid waiting for the next 30s tick.
|
|
1078
|
+
* Retries up to 10 times (5s) if a tick is in progress.
|
|
1066
1079
|
*/
|
|
1067
1080
|
private scheduleImmediateDispatch;
|
|
1068
1081
|
/**
|
|
@@ -1289,9 +1302,12 @@ interface DoctorReport {
|
|
|
1289
1302
|
declare class DoctorService {
|
|
1290
1303
|
private readonly adapterRegistry;
|
|
1291
1304
|
private readonly processManager;
|
|
1292
|
-
|
|
1305
|
+
private readonly cwd;
|
|
1306
|
+
constructor(adapterRegistry: AdapterRegistry, processManager: IProcessManager, projectRoot?: string);
|
|
1293
1307
|
runAll(): Promise<DoctorReport>;
|
|
1294
1308
|
private checkCommand;
|
|
1309
|
+
private checkGitignore;
|
|
1310
|
+
private checkGitRepo;
|
|
1295
1311
|
}
|
|
1296
1312
|
|
|
1297
1313
|
/**
|
|
@@ -1353,4 +1369,4 @@ declare function buildFullContainer(context: CliContext): Promise<Container>;
|
|
|
1353
1369
|
*/
|
|
1354
1370
|
declare function buildContainer(context: CliContext): Promise<Container>;
|
|
1355
1371
|
|
|
1356
|
-
export { AdapterRegistry, type AdapterTestResult, type Agent, type AgentConfig, type AgentEvent, AgentNotFoundError, AgentService, type AgentStats, type AgentStatus, type ApprovalPolicy, type Container, type CreateAgentInput, type CreateTaskInput, EventBus, type EventPayload, type ExecuteParams, type IAgentAdapter, type LightContainer, NotInitializedError, Orchestrator, type OrchestratorConfig, type OrchestratorEvent, type OrchestratorEventType, type OrchestratorState, OrchestryError, type ProjectConfig, type RetryEntry, type Run, type RunEvent, type RunEventType, RunService, type RunStatus, type RunningEntry, type SchedulingConfig, type Task, TaskNotFoundError, type TaskProof, TaskService, type TaskStatus, type TokenUsage, type WorkspaceMode, buildContainer, buildFullContainer, buildLightContainer, canTransition, createTokenUsage, isBlocked, isDispatchable, isTerminal, resolveFailureStatus };
|
|
1372
|
+
export { AdapterRegistry, type AdapterTestResult, type Agent, type AgentConfig, type AgentEvent, AgentNotFoundError, AgentService, type AgentStats, type AgentStatus, type ApprovalPolicy, type Container, type CreateAgentInput, type CreateTaskInput, EventBus, type EventPayload, type ExecuteParams, type IAgentAdapter, type LightContainer, NotInitializedError, Orchestrator, type OrchestratorConfig, type OrchestratorEvent, type OrchestratorEventType, type OrchestratorState, OrchestryError, type ProjectConfig, type RetryEntry, type Run, type RunEvent, type RunEventType, RunService, type RunStatus, type RunningEntry, type SchedulingConfig, type Task, TaskNotFoundError, type TaskProof, TaskService, type TaskStatus, type TokenUsage, WorkspaceError, type WorkspaceMode, buildContainer, buildFullContainer, buildLightContainer, canTransition, createTokenUsage, isBlocked, isDispatchable, isTerminal, resolveFailureStatus };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {k,a as a$1,b as b$2,h,j as j$2,d,c as c$1,e,f as f$1,g as g$1,i as i$1}from'./chunk-2B32FPEB.js';import {a,b as b$1}from'./chunk-E3TCKHU6.js';export{f as Orchestrator,a as canTransition,d as isBlocked,c as isDispatchable,b as isTerminal,e as resolveFailureStatus}from'./chunk-E3TCKHU6.js';import {c,f,i,g,k as k$1,j as j$1}from'./chunk-ZU6AY2VU.js';export{g as AgentNotFoundError,b as NotInitializedError,a as OrchestryError,f as TaskNotFoundError}from'./chunk-ZU6AY2VU.js';import {a as a$2}from'./chunk-AELEEEV3.js';export{a as AdapterRegistry}from'./chunk-6HENRUYZ.js';export{a as createTokenUsage}from'./chunk-PBFE5V3G.js';import {b as b$3}from'./chunk-POUC4CPC.js';import {nanoid}from'nanoid';import Rt,{mkdir}from'fs/promises';import {createReadStream}from'fs';import ct from'path';import {homedir}from'os';var P=class{handlers=new Map;wildcardHandlers=new Set;maxListeners=10;warnedTypes=new Set;setMaxListeners(t){this.maxListeners=t;}getMaxListeners(){return this.maxListeners}listenerCount(t){return this.handlers.get(t)?.size??0}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set);let s=this.handlers.get(t);return s.add(e),this.maxListeners>0&&s.size>this.maxListeners&&!this.warnedTypes.has(t)&&(this.warnedTypes.add(t),console.warn(`EventBus: possible memory leak detected. ${s.size} listeners added for "${t}". Use setMaxListeners() to increase limit if this is intentional.`)),()=>this.off(t,e)}once(t,e){let s=r=>{this.off(t,s),e(r);};return this.on(t,s)}off(t,e){this.handlers.get(t)?.delete(e);}emit(t){let e=this.handlers.get(t.type);e&&this.dispatchToSet(e,t,"handler"),this.dispatchToSet(this.wildcardHandlers,t,"wildcard handler");}dispatchToSet(t,e,s){for(let r of t)try{r(e);}catch(a){console.error(`EventBus ${s} error for "${e.type}":`,a);}}onAny(t){return this.wildcardHandlers.add(t),this.maxListeners>0&&this.wildcardHandlers.size>this.maxListeners&&!this.warnedTypes.has("*")&&(this.warnedTypes.add("*"),console.warn(`EventBus: possible memory leak detected. ${this.wildcardHandlers.size} wildcard listeners added. Use setMaxListeners() to increase limit if this is intentional.`)),()=>{this.wildcardHandlers.delete(t);}}clear(){this.handlers.clear(),this.wildcardHandlers.clear(),this.warnedTypes.clear();}};var b=class{constructor(t,e,s){this.taskStore=t;this.eventBus=e;this.config=s;}async create(t){if(!t.title.trim())throw new c("Task title is required");let e=t.priority??this.config.defaults.task.priority;if(!Number.isInteger(e)||e<1||e>4)throw new c("Priority must be an integer between 1 and 4");if(t.depends_on?.length){let n=(await Promise.all(t.depends_on.map(async i=>({depId:i,exists:!!await this.taskStore.get(i)})))).filter(i=>!i.exists).map(i=>i.depId);if(n.length>0)throw new c(`Unknown depends_on task ID(s): ${n.join(", ")}`)}let s=new Date().toISOString(),r={id:`tsk_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"todo",priority:e,assignee:t.assignee,labels:t.labels??[],depends_on:t.depends_on??[],created_at:s,updated_at:s,attempts:0,max_attempts:t.max_attempts??this.config.defaults.task.max_attempts,workspace_mode:t.workspace_mode,review_criteria:t.review_criteria,scope:t.scope};return await this.taskStore.save(r),this.eventBus.emit({type:"task:created",task:r}),r}async list(t){return this.taskStore.list(t)}async get(t){let e=await this.taskStore.get(t);if(!e)throw new f(t);return e}async updateStatus(t,e){let s=await this.get(t),r=s.status;if(!a(r,e))throw new i(t,r,e);return s.status=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:status_changed",taskId:t,from:r,to:e}),s}async assign(t,e){let s=await this.get(t);return s.assignee=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:assigned",taskId:t,agentId:e}),s}async cancel(t){let e=await this.get(t);if(b$1(e.status))throw new i(t,e.status,"cancelled");return this.updateStatus(t,"cancelled")}async retry(t){let e=await this.get(t);if(e.status!=="failed"&&e.status!=="cancelled")throw new i(t,e.status,"todo");let s=e.status;return e.status="todo",e.attempts=0,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:"todo"}),e}async reject(t,e){let s=await this.get(t);if(s.status!=="review")throw new i(t,s.status,"todo");let r=s.status;return s.status="todo",s.attempts=0,s.feedback=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:status_changed",taskId:t,from:r,to:"todo"}),s}async update(t,e){let s=await this.get(t);if(e.title!==void 0){if(!e.title.trim())throw new c("Task title cannot be empty");s.title=e.title.trim();}if(e.description!==void 0&&(s.description=e.description.trim()),e.priority!==void 0){if(!Number.isInteger(e.priority)||e.priority<1||e.priority>4)throw new c("Priority must be an integer between 1 and 4");s.priority=e.priority;}return e.labels!==void 0&&(s.labels=e.labels),s.updated_at=new Date().toISOString(),await this.taskStore.save(s),s}async delete(t){if((await this.get(t)).status==="in_progress")throw new c("Cannot delete a running task. Cancel it first.");await this.taskStore.delete(t);}async incrementAttempts(t){let e=await this.get(t);return e.attempts+=1,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),e}};var A=class{constructor(t,e,s,r){this.agentStore=t;this.stateStore=e;this.eventBus=s;this.config=r;}async create(t){if(!t.name.trim())throw new c("Agent name is required");if(await this.agentStore.getByName(t.name))throw new c(`Agent "${t.name}" already exists`);let s={id:`agt_${nanoid(7)}`,name:t.name.trim(),adapter:t.adapter||this.config.defaults.agent.adapter,role:t.role,config:{command:t.command,model:t.model,approval_policy:t.approval_policy??this.config.defaults.agent.approval_policy,max_turns:t.max_turns??this.config.defaults.agent.max_turns,timeout_ms:t.timeout_ms??this.config.defaults.agent.timeout_ms,stall_timeout_ms:t.stall_timeout_ms??this.config.defaults.agent.stall_timeout_ms,env:t.env,system_prompt:t.system_prompt,workspace_mode:t.workspace_mode,skills:t.skills},status:"idle",stats:{tasks_completed:0,tasks_failed:0,total_runs:0,total_runtime_ms:0}};return await this.agentStore.save(s),s}async list(){return this.agentStore.list()}async get(t){let e=await this.agentStore.get(t);if(!e)throw new g(t);return e}async remove(t){let e=await this.get(t);if(e.status==="running"){let s=await this.stateStore.read();if(Object.values(s.running).some(a=>a.agent_id===t))throw new c("Cannot remove a running agent. Stop it first.");e.status="idle",await this.agentStore.save(e);}await this.agentStore.delete(t);}async update(t,e){let s=await this.get(t);if(e.name!==void 0){if(!e.name.trim())throw new c("Agent name cannot be empty");let r=await this.agentStore.getByName(e.name.trim());if(r&&r.id!==t)throw new c(`Agent "${e.name}" already exists`);s.name=e.name.trim();}return e.role!==void 0&&(s.role=e.role||void 0),e.model!==void 0&&(s.config.model=e.model||void 0),e.approval_policy!==void 0&&(s.config.approval_policy=e.approval_policy),await this.agentStore.save(s),s}async disable(t){return this.setStatus(t,"disabled")}async enable(t){return this.setStatus(t,"idle")}async setAutonomous(t,e){let s=await this.get(t);return s.autonomous=e,await this.agentStore.save(s),this.eventBus.emit({type:"agent:autonomous_toggled",agentId:t,autonomous:e}),s}async setStatus(t,e){let s=await this.get(t);return s.status=e,await this.agentStore.save(s),s}async updateStats(t,e){let s=await this.get(t);return Object.assign(s.stats,e),await this.agentStore.save(s),s}async findBestAgent(t){let e=await this.agentStore.list(),s=e.filter(a=>a.status==="idle");if(s.length===0)return null;if(t.assignee){let a=e.find(n=>n.id===t.assignee);return a&&a.status==="idle"?a:null}let r=s.map(a=>{let n=0;if(t.labels?.length>0&&a.config.skills?.length)for(let o of t.labels){let c=o.toLowerCase();a.config.skills.some(d=>d.toLowerCase()===c)&&(n+=50);}if(t.labels?.length>0&&a.role){let o=a.role.toLowerCase();t.labels.some(c=>o.includes(c.toLowerCase()))&&(n+=30);}a.status==="idle"&&(n+=20);let i=a.stats.tasks_completed+a.stats.tasks_failed;return i>0&&(n+=Math.round(a.stats.tasks_completed/i*10)),{agent:a,score:n}});return r.sort((a,n)=>n.score-a.score),r[0]?.agent??null}};var x=class{constructor(t,e){this.runStore=t;this.eventBus=e;}async create(t){let e={id:`run_${nanoid(7)}`,task_id:t.taskId,agent_id:t.agentId,attempt:t.attempt,status:"preparing",started_at:new Date().toISOString(),workspace_path:t.workspacePath,prompt:t.prompt};return await this.runStore.save(e),e}async get(t){return this.runStore.get(t)}async start(t,e){let s=await this.runStore.get(t);if(!s)throw new Error(`Run not found: ${t}`);return s.status="running",s.pid=e,await this.runStore.save(s),this.eventBus.emit({type:"agent:started",agentId:s.agent_id,taskId:s.task_id,runId:t}),s}async finish(t,e,s,r){let a=await this.runStore.get(t);if(!a)throw new Error(`Run not found: ${t}`);return a.status=e,a.finished_at=new Date().toISOString(),a.tokens=s,a.error=r,await this.runStore.save(a),this.eventBus.emit({type:"agent:completed",runId:t,agentId:a.agent_id,success:e==="succeeded"}),a}async appendEvent(t,e){await this.runStore.appendEvent(t,e);}async listAll(){return this.runStore.listAll()}async listForTask(t){return this.runStore.listForTask(t)}async listForAgent(t){return this.runStore.listForAgent(t)}async readEvents(t){return this.runStore.readEvents(t)}async readEventsTail(t,e){return this.runStore.readEventsTail(t,e)}async getLastFailedRunContext(t,e=50){let r=(await this.runStore.listForTask(t)).filter(i=>i.status==="failed").sort((i,o)=>(o.finished_at??"").localeCompare(i.finished_at??""))[0];if(!r)return null;let a=r.error??"Unknown error",n="";try{n=(await this.runStore.readEventsTail(r.id,e*2)).filter(c=>c.type==="agent_output"||c.type==="error").map(c=>typeof c.data=="string"?c.data:JSON.stringify(c.data)).join(`
|
|
1
|
+
import {k,a as a$1,b as b$2,h,j as j$2,d,c as c$1,e,f as f$1,g as g$1,i as i$1}from'./chunk-QTDKQYZI.js';import {a,b as b$1}from'./chunk-ZTQ3KWXR.js';export{f as Orchestrator,a as canTransition,d as isBlocked,c as isDispatchable,b as isTerminal,e as resolveFailureStatus}from'./chunk-ZTQ3KWXR.js';import {c,f,i,g,k as k$1,j as j$1}from'./chunk-VAAOW526.js';export{g as AgentNotFoundError,b as NotInitializedError,a as OrchestryError,f as TaskNotFoundError,l as WorkspaceError}from'./chunk-VAAOW526.js';import {a as a$2}from'./chunk-AELEEEV3.js';export{a as AdapterRegistry}from'./chunk-6HENRUYZ.js';export{a as createTokenUsage}from'./chunk-PBFE5V3G.js';import {b as b$3}from'./chunk-POUC4CPC.js';import {nanoid}from'nanoid';import Ot,{mkdir}from'fs/promises';import {createReadStream}from'fs';import ct from'path';import {homedir}from'os';var P=class{handlers=new Map;wildcardHandlers=new Set;maxListeners=10;warnedTypes=new Set;setMaxListeners(t){this.maxListeners=t;}getMaxListeners(){return this.maxListeners}listenerCount(t){return this.handlers.get(t)?.size??0}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set);let s=this.handlers.get(t);return s.add(e),this.maxListeners>0&&s.size>this.maxListeners&&!this.warnedTypes.has(t)&&(this.warnedTypes.add(t),console.warn(`EventBus: possible memory leak detected. ${s.size} listeners added for "${t}". Use setMaxListeners() to increase limit if this is intentional.`)),()=>this.off(t,e)}once(t,e){let s=r=>{this.off(t,s),e(r);};return this.on(t,s)}off(t,e){this.handlers.get(t)?.delete(e);}emit(t){let e=this.handlers.get(t.type);e&&this.dispatchToSet(e,t,"handler"),this.dispatchToSet(this.wildcardHandlers,t,"wildcard handler");}dispatchToSet(t,e,s){for(let r of t)try{r(e);}catch(a){console.error(`EventBus ${s} error for "${e.type}":`,a);}}onAny(t){return this.wildcardHandlers.add(t),this.maxListeners>0&&this.wildcardHandlers.size>this.maxListeners&&!this.warnedTypes.has("*")&&(this.warnedTypes.add("*"),console.warn(`EventBus: possible memory leak detected. ${this.wildcardHandlers.size} wildcard listeners added. Use setMaxListeners() to increase limit if this is intentional.`)),()=>{this.wildcardHandlers.delete(t);}}clear(){this.handlers.clear(),this.wildcardHandlers.clear(),this.warnedTypes.clear();}};var b=class{constructor(t,e,s){this.taskStore=t;this.eventBus=e;this.config=s;}async create(t){if(!t.title.trim())throw new c("Task title is required");let e=t.priority??this.config.defaults.task.priority;if(!Number.isInteger(e)||e<1||e>4)throw new c("Priority must be an integer between 1 and 4");if(t.depends_on?.length){let n=(await Promise.all(t.depends_on.map(async i=>({depId:i,exists:!!await this.taskStore.get(i)})))).filter(i=>!i.exists).map(i=>i.depId);if(n.length>0)throw new c(`Unknown depends_on task ID(s): ${n.join(", ")}`)}let s=new Date().toISOString(),r={id:`tsk_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"todo",priority:e,assignee:t.assignee,labels:t.labels??[],depends_on:t.depends_on??[],created_at:s,updated_at:s,attempts:0,max_attempts:t.max_attempts??this.config.defaults.task.max_attempts,workspace_mode:t.workspace_mode,review_criteria:t.review_criteria,scope:t.scope};return await this.taskStore.save(r),this.eventBus.emit({type:"task:created",task:r}),r}async list(t){return this.taskStore.list(t)}async get(t){let e=await this.taskStore.get(t);if(!e)throw new f(t);return e}async updateStatus(t,e){let s=await this.get(t),r=s.status;if(!a(r,e))throw new i(t,r,e);return s.status=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:status_changed",taskId:t,from:r,to:e}),s}async assign(t,e){let s=await this.get(t);return s.assignee=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:assigned",taskId:t,agentId:e}),s}async cancel(t){let e=await this.get(t);if(b$1(e.status))throw new i(t,e.status,"cancelled");return this.updateStatus(t,"cancelled")}async retry(t){let e=await this.get(t);if(e.status!=="failed"&&e.status!=="cancelled")throw new i(t,e.status,"todo");let s=e.status;return e.status="todo",e.attempts=0,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:"todo"}),e}async reject(t,e){let s=await this.get(t);if(s.status!=="review")throw new i(t,s.status,"todo");let r=s.status;return s.status="todo",s.attempts=0,s.feedback=e,s.updated_at=new Date().toISOString(),await this.taskStore.save(s),this.eventBus.emit({type:"task:status_changed",taskId:t,from:r,to:"todo"}),s}async update(t,e){let s=await this.get(t);if(e.title!==void 0){if(!e.title.trim())throw new c("Task title cannot be empty");s.title=e.title.trim();}if(e.description!==void 0&&(s.description=e.description.trim()),e.priority!==void 0){if(!Number.isInteger(e.priority)||e.priority<1||e.priority>4)throw new c("Priority must be an integer between 1 and 4");s.priority=e.priority;}return e.labels!==void 0&&(s.labels=e.labels),s.updated_at=new Date().toISOString(),await this.taskStore.save(s),s}async delete(t){if((await this.get(t)).status==="in_progress")throw new c("Cannot delete a running task. Cancel it first.");await this.taskStore.delete(t);}async incrementAttempts(t){let e=await this.get(t);return e.attempts+=1,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),e}};var A=class{constructor(t,e,s,r){this.agentStore=t;this.stateStore=e;this.eventBus=s;this.config=r;}async create(t){if(!t.name.trim())throw new c("Agent name is required");if(await this.agentStore.getByName(t.name))throw new c(`Agent "${t.name}" already exists`);let s={id:`agt_${nanoid(7)}`,name:t.name.trim(),adapter:t.adapter||this.config.defaults.agent.adapter,role:t.role,config:{command:t.command,model:t.model,approval_policy:t.approval_policy??this.config.defaults.agent.approval_policy,max_turns:t.max_turns??this.config.defaults.agent.max_turns,timeout_ms:t.timeout_ms??this.config.defaults.agent.timeout_ms,stall_timeout_ms:t.stall_timeout_ms??this.config.defaults.agent.stall_timeout_ms,env:t.env,system_prompt:t.system_prompt,workspace_mode:t.workspace_mode,skills:t.skills},status:"idle",stats:{tasks_completed:0,tasks_failed:0,total_runs:0,total_runtime_ms:0}};return await this.agentStore.save(s),s}async list(){return this.agentStore.list()}async get(t){let e=await this.agentStore.get(t);if(!e)throw new g(t);return e}async remove(t){let e=await this.get(t);if(e.status==="running"){let s=await this.stateStore.read();if(Object.values(s.running).some(a=>a.agent_id===t))throw new c("Cannot remove a running agent. Stop it first.");e.status="idle",await this.agentStore.save(e);}await this.agentStore.delete(t);}async update(t,e){let s=await this.get(t);if(e.name!==void 0){if(!e.name.trim())throw new c("Agent name cannot be empty");let r=await this.agentStore.getByName(e.name.trim());if(r&&r.id!==t)throw new c(`Agent "${e.name}" already exists`);s.name=e.name.trim();}return e.role!==void 0&&(s.role=e.role||void 0),e.model!==void 0&&(s.config.model=e.model||void 0),e.approval_policy!==void 0&&(s.config.approval_policy=e.approval_policy),await this.agentStore.save(s),s}async disable(t){return this.setStatus(t,"disabled")}async enable(t){return this.setStatus(t,"idle")}async setAutonomous(t,e){let s=await this.get(t);return s.autonomous=e,await this.agentStore.save(s),this.eventBus.emit({type:"agent:autonomous_toggled",agentId:t,autonomous:e}),s}async setStatus(t,e){let s=await this.get(t);return s.status=e,await this.agentStore.save(s),s}async updateStats(t,e){let s=await this.get(t);return Object.assign(s.stats,e),await this.agentStore.save(s),s}async findBestAgent(t){let e=await this.agentStore.list(),s=e.filter(a=>a.status==="idle");if(s.length===0)return null;if(t.assignee){let a=e.find(n=>n.id===t.assignee);return a&&a.status==="idle"?a:null}let r=s.map(a=>{let n=0;if(t.labels?.length>0&&a.config.skills?.length)for(let m of t.labels){let c=m.toLowerCase();a.config.skills.some(d=>d.toLowerCase()===c)&&(n+=50);}if(t.labels?.length>0&&a.role){let m=a.role.toLowerCase();t.labels.some(c=>m.includes(c.toLowerCase()))&&(n+=30);}a.status==="idle"&&(n+=20);let i=a.stats.tasks_completed+a.stats.tasks_failed;return i>0&&(n+=Math.round(a.stats.tasks_completed/i*10)),{agent:a,score:n}});return r.sort((a,n)=>n.score-a.score),r[0]?.agent??null}};var x=class{constructor(t,e){this.runStore=t;this.eventBus=e;}async create(t){let e={id:`run_${nanoid(7)}`,task_id:t.taskId,agent_id:t.agentId,attempt:t.attempt,status:"preparing",started_at:new Date().toISOString(),workspace_path:t.workspacePath,prompt:t.prompt};return await this.runStore.save(e),e}async get(t){return this.runStore.get(t)}async start(t,e){let s=await this.runStore.get(t);if(!s)throw new Error(`Run not found: ${t}`);return s.status="running",s.pid=e,await this.runStore.save(s),this.eventBus.emit({type:"agent:started",agentId:s.agent_id,taskId:s.task_id,runId:t}),s}async finish(t,e,s,r){let a=await this.runStore.get(t);if(!a)throw new Error(`Run not found: ${t}`);return a.status=e,a.finished_at=new Date().toISOString(),a.tokens=s,a.error=r,await this.runStore.save(a),this.eventBus.emit({type:"agent:completed",runId:t,agentId:a.agent_id,success:e==="succeeded"}),a}async appendEvent(t,e){await this.runStore.appendEvent(t,e);}async listAll(){return this.runStore.listAll()}async listForTask(t){return this.runStore.listForTask(t)}async listForAgent(t){return this.runStore.listForAgent(t)}async readEvents(t){return this.runStore.readEvents(t)}async readEventsTail(t,e){return this.runStore.readEventsTail(t,e)}async getLastFailedRunContext(t,e=50){let r=(await this.runStore.listForTask(t)).filter(i=>i.status==="failed").sort((i,m)=>(m.finished_at??"").localeCompare(i.finished_at??""))[0];if(!r)return null;let a=r.error??"Unknown error",n="";try{n=(await this.runStore.readEventsTail(r.id,e*2)).filter(c=>c.type==="agent_output"||c.type==="error").map(c=>typeof c.data=="string"?c.data:JSON.stringify(c.data)).join(`
|
|
2
2
|
`).split(`
|
|
3
3
|
`).slice(-e).join(`
|
|
4
|
-
`);}catch{}return {error:a,output:n}}};var I=class{constructor(t){this.paths=t;}async list(t){await h(this.paths.tasksDir);let e=await j$2(this.paths.tasksDir,".yml");return (await Promise.all(e.map(a=>{let n=a.replace(".yml","");return a$1(this.paths.taskPath(n))}))).filter(a=>a!==null&&(!t?.status||a.status===t.status)).sort((a,n)=>{let i=it(a.status)-it(n.status);if(i!==0)return i;let
|
|
5
|
-
`);}}}finally{a.destroy();}}async listFiltered(t){await h(this.paths.runsDir);let e=await j$2(this.paths.runsDir,".json"),s=64,r=[];for(let a=0;a<e.length;a+=s){let n=e.slice(a,a+s),i=await Promise.all(n.map(o=>{let c=o.endsWith(".json")?o.slice(0,-5):o;return c$1(this.paths.runPath(c))}));for(let o of i)o!==null&&t(o)&&r.push(o);}return r.sort((a,n)=>new Date(n.started_at).getTime()-new Date(a.started_at).getTime())}};var W={version:1,running:{},claimed:[],retry_queue:[],stats:{total_runs:0,total_tasks_completed:0,total_tasks_failed:0,total_tokens:{input:0,output:0,total:0},total_runtime_ms:0}};var R=class{constructor(t){this.paths=t;}async read(){let t=await c$1(this.paths.statePath);if(!t)return structuredClone(W);let e=structuredClone(W);return {version:t.version??e.version,pid:t.pid,started_at:t.started_at,running:t.running&&typeof t.running=="object"?t.running:e.running,claimed:Array.isArray(t.claimed)?t.claimed:e.claimed,retry_queue:Array.isArray(t.retry_queue)?t.retry_queue:e.retry_queue,stats:{total_runs:t.stats?.total_runs??e.stats.total_runs,total_tasks_completed:t.stats?.total_tasks_completed??e.stats.total_tasks_completed,total_tasks_failed:t.stats?.total_tasks_failed??e.stats.total_tasks_failed,total_tokens:t.stats?.total_tokens??e.stats.total_tokens,total_runtime_ms:t.stats?.total_runtime_ms??e.stats.total_runtime_ms}}}async write(t){await d(this.paths.statePath,t);}};var ot={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:3e4,max_concurrent_agents:6,retry_base_delay_ms:1e4,retry_max_delay_ms:3e5}};var O=class{constructor(t){this.paths=t;}async read(){let t=await a$1(this.paths.configPath);return mt(ot,t??{})}async write(t){await b$2(this.paths.configPath,t);}async get(t){let e=await this.read();return Mt(e,t)}async set(t,e){let s=await this.read();Gt(s,t,e),await this.write(s);}};function Mt(m,t){let e=t.split("."),s=m;for(let r of e){if(s==null||typeof s!="object")return;s=s[r];}return s}function Gt(m,t,e){let s=t.split("."),r=m;for(let n=0;n<s.length-1;n++){let i=s[n];(typeof r[i]!="object"||r[i]===null)&&(r[i]={}),r=r[i];}let a=s[s.length-1];r[a]=e;}function mt(m,t){let e={...m};for(let s of Object.keys(t)){let r=t[s],a=e[s];r!=null&&typeof r=="object"&&!Array.isArray(r)&&typeof a=="object"&&a!==null&&!Array.isArray(a)?e[s]=mt(a,r):e[s]=r;}return e}var z={tui:{activity_filter:"all"}};var dt=ct.join(homedir(),".orchestry"),lt=ct.join(dt,"global.yml"),D=class{async read(){let t=await a$1(lt);return t?{tui:{activity_filter:t.tui?.activity_filter??z.tui.activity_filter}}:{...z}}async write(t){await mkdir(dt,{recursive:true}),await b$2(lt,t);}async set(t,e){let s=await this.read();s.tui[t]=e,await this.write(s);}};var M=class m{constructor(t){this.paths=t;}async get(t){let e=await c$1(this.paths.contextPath(t));return e?gt(e)?(await this.delete(t),null):e:null}static MAX_TTL_MS=720*60*60*1e3;async set(t,e,s){if(s!==void 0&&(!Number.isFinite(s)||s<=0||s>m.MAX_TTL_MS))throw new Error(`TTL must be a positive number up to ${m.MAX_TTL_MS}ms (30 days)`);await h(this.paths.contextDir);let r=new Date().toISOString(),a=await c$1(this.paths.contextPath(t)),n={key:t,value:e,created_at:a?.created_at??r,updated_at:r,ttl_ms:s,expires_at:s?new Date(Date.now()+s).toISOString():void 0};await d(this.paths.contextPath(t),n);}async delete(t){try{await Rt.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}async list(){await h(this.paths.contextDir);let t=await j$2(this.paths.contextDir,".json"),e=await Promise.all(t.map(r=>{let a=r.replace(".json","");return c$1(this.paths.contextPath(a))})),s=[];for(let r of e)if(r){if(gt(r)){await this.delete(r.key);continue}s.push(r);}return s.sort((r,a)=>r.key.localeCompare(a.key))}async getAll(){let t=await this.list(),e={};for(let s of t)e[s.key]=s.value;return e}};function gt(m){return m.expires_at?new Date(m.expires_at).getTime()<Date.now():false}var G=class{constructor(t){this.paths=t;}async save(t){await h(this.paths.messagesDir),await d(this.paths.messagePath(t.id),t);}async get(t){return c$1(this.paths.messagePath(t))}async list(){let t=await j$2(this.paths.messagesDir,".json");return (await Promise.all(t.map(s=>c$1(this.paths.messagePath(s.replace(".json","")))))).filter(s=>s!==null).sort((s,r)=>s.created_at.localeCompare(r.created_at))}async listPending(t){let e=await this.list(),s=Date.now();return e.filter(r=>r.status!=="pending"||r.expires_at&&new Date(r.expires_at).getTime()<s?false:r.to_agent_id===t)}async markDelivered(t){let e=await this.get(t);e&&(e.status="delivered",e.delivered_at=new Date().toISOString(),await d(this.paths.messagePath(t),e));}async delete(t){try{await Rt.unlink(this.paths.messagePath(t));}catch(e){if(e.code!=="ENOENT")throw e}}async purgeExpired(){let t=await this.list(),e=Date.now(),s=t.filter(r=>{let a=r.expires_at&&new Date(r.expires_at).getTime()<e,n=r.delivered_at&&e-new Date(r.delivered_at).getTime()>36e5;return a||n});return await Promise.all(s.map(r=>this.delete(r.id))),s.length}};var $t=new Set(["achieved","abandoned"]);function ut(m){return $t.has(m)}var X={active:0,paused:1,achieved:2,abandoned:3};var L=class{constructor(t){this.paths=t;}async list(t){let e=await j$2(this.paths.goalsDir,".yml");return (await Promise.all(e.map(a=>{let n=a.replace(".yml","");return a$1(this.paths.goalPath(n))}))).filter(a=>a!==null&&(!t?.status||a.status===t.status)).sort((a,n)=>{let i=X[a.status]-X[n.status];if(i!==0)return i;let o=n.updated_at??"",c=a.updated_at??"";return o<c?-1:o>c?1:0})}async get(t){return a$1(this.paths.goalPath(t))}async save(t){await b$2(this.paths.goalPath(t.id),t);}async delete(t){try{await Rt.unlink(this.paths.goalPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var B=class{constructor(t){this.paths=t;}async save(t){await h(this.paths.teamsDir),await b$2(this.paths.teamPath(t.id),t);}async get(t){return a$1(this.paths.teamPath(t))}async getByName(t){return (await this.list()).find(s=>s.name===t)??null}async list(){await h(this.paths.teamsDir);let t=await j$2(this.paths.teamsDir,".yml");return (await Promise.all(t.map(s=>a$1(this.paths.teamPath(s.replace(".yml","")))))).filter(s=>s!==null)}async delete(t){try{await Rt.unlink(this.paths.teamPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var F=class{constructor(t,e,s,r){this.messageStore=t;this.agentStore=e;this.teamStore=s;this.eventBus=r;}async send(t){if(!t.body.trim())throw new c("Message body is required");let e=t.ttl_ms??864e5;if(e<=0||e>6048e5)throw new c(`TTL must be between 1ms and ${6048e5}ms`);if(!await this.agentStore.get(t.from_agent_id)&&t.from_agent_id!=="cli")throw new c(`Sender agent not found: ${t.from_agent_id}`);let r=new Date,a={channel:t.channel,from_agent_id:t.from_agent_id,subject:(t.subject||"(no subject)").slice(0,200),body:t.body.slice(0,4e3),created_at:r.toISOString(),expires_at:new Date(r.getTime()+e).toISOString(),status:"pending",team_id:t.team_id,reply_to:t.reply_to},n=[];if(t.channel==="broadcast"){let i=await this.agentStore.list();if(t.team_id){let d=await this.teamStore.get(t.team_id);if(d){let v=new Set(d.members.map(p=>p.agent_id));i=i.filter(p=>v.has(p.id));}}let c=i.filter(d=>d.id!==t.from_agent_id&&d.status!=="disabled").map(d=>({...a,id:`msg_${nanoid(7)}`,to_agent_id:d.id}));await Promise.all(c.map(d=>this.messageStore.save(d)));for(let d of c)n.push(d),this.emitSent(d);}else if(t.channel==="lead"){if(!t.team_id)throw new c("team_id is required for lead channel");let i=await this.teamStore.get(t.team_id);if(!i)throw new c(`Team not found: ${t.team_id}`);let o={...a,id:`msg_${nanoid(7)}`,to_agent_id:i.lead_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}else {if(!t.to_agent_id)throw new c("to_agent_id is required for direct messages");if(!await this.agentStore.get(t.to_agent_id))throw new c(`Recipient agent not found: ${t.to_agent_id}`);let o={...a,id:`msg_${nanoid(7)}`,to_agent_id:t.to_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}return n}async drainMailbox(t,e){let s=await this.messageStore.listPending(t);await Promise.all(s.map(r=>this.messageStore.markDelivered(r.id)));for(let r of s)this.eventBus.emit({type:"message:delivered",messageId:r.id,toAgentId:t,taskId:e});return s}async listAll(){return this.messageStore.list()}async listPendingForAgent(t){return this.messageStore.listPending(t)}async listForAgent(t){return (await this.messageStore.list()).filter(s=>s.to_agent_id===t||s.from_agent_id===t)}async purgeExpired(){return this.messageStore.purgeExpired()}emitSent(t){this.eventBus.emit({type:"message:sent",messageId:t.id,fromAgentId:t.from_agent_id,toAgentId:t.to_agent_id,channel:t.channel});}};var Yt={active:["paused","achieved","abandoned"],paused:["active","abandoned"],achieved:[],abandoned:[]},N=class{constructor(t,e,s,r){this.goalStore=t;this.eventBus=e;this.agentService=s;this.taskService=r;}async create(t){if(!t.title.trim())throw new c("Goal title is required");let e=new Date().toISOString(),s={id:`goal_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"active",assignee:t.assignee,created_at:e,updated_at:e};return await this.goalStore.save(s),this.eventBus.emit({type:"goal:created",goalId:s.id,title:s.title}),s.assignee&&await this.enableAutonomous(s.assignee),s}async list(t){return this.goalStore.list(t)}async get(t){let e=await this.goalStore.get(t);if(!e)throw new j$1(t);return e}async updateStatus(t,e){let s=await this.get(t),r=s.status;if(!Yt[r].includes(e))throw new c(`Cannot transition goal from '${r}' to '${e}'`);return s.status=e,s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:status_changed",goalId:t,from:r,to:e}),s.assignee&&(e==="paused"?(await this.maybeDisableAutonomous(s.assignee),await this.cancelPendingAutonomousTasks(s.assignee)):e==="active"&&r==="paused"?await this.enableAutonomous(s.assignee):ut(e)&&await this.maybeDisableAutonomous(s.assignee)),s}async update(t,e){let s=await this.get(t),r=s.assignee;if(e.title!==void 0){if(!e.title.trim())throw new c("Goal title cannot be empty");s.title=e.title.trim();}e.description!==void 0&&(s.description=e.description.trim()),e.assignee!==void 0&&(s.assignee=e.assignee||void 0),s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:updated",goalId:t});let a=s.assignee;if(a!==r){let n=[];a&&n.push(this.enableAutonomous(a)),r&&n.push(this.maybeDisableAutonomous(r)),await Promise.all(n);}return s}async delete(t){let e=await this.get(t),{assignee:s}=e;await this.goalStore.delete(t),this.eventBus.emit({type:"goal:deleted",goalId:t}),s&&await this.maybeDisableAutonomous(s);}async enableAutonomous(t){if(this.agentService)try{await this.agentService.setAutonomous(t,!0);}catch{}}async hasActiveGoalsForAgent(t){return (await this.goalStore.list({status:"active"})).some(s=>s.assignee===t)}async cancelPendingAutonomousTasks(t){if(this.taskService)try{let[e,s]=await Promise.all([this.taskService.list({status:"todo"}),this.taskService.list({status:"retrying"})]),r=[...e,...s].filter(a=>a.assignee===t&&a.labels?.includes(a$2));await Promise.all(r.map(a=>this.taskService.cancel(a.id).catch(()=>{})));}catch{}}async maybeDisableAutonomous(t){if(this.agentService)try{await this.hasActiveGoalsForAgent(t)||await this.agentService.setAutonomous(t,!1);}catch{}}};var ht={auto_claim:true,message_ttl_ms:864e5};var $=class{constructor(t,e,s,r){this.teamStore=t;this.agentStore=e;this.taskStore=s;this.eventBus=r;}async create(t){if(!t.name.trim())throw new c("Team name is required");if(!await this.agentStore.get(t.lead_agent_id))throw new c(`Lead agent not found: ${t.lead_agent_id}`);if(await this.teamStore.getByName(t.name.trim()))throw new c(`Team "${t.name}" already exists`);let r=new Date().toISOString(),a={agent_id:t.lead_agent_id,role:"lead",joined_at:r},n=[];for(let o of t.member_agent_ids??[]){if(o===t.lead_agent_id)continue;if(!await this.agentStore.get(o))throw new c(`Member agent not found: ${o}`);n.push({agent_id:o,role:"member",joined_at:r});}let i={id:`team_${nanoid(7)}`,name:t.name.trim(),description:t.description,status:"active",members:[a,...n],task_pool:[],lead_agent_id:t.lead_agent_id,created_at:r,updated_at:r,config:{...ht,...t.config??{}}};await this.teamStore.save(i),this.eventBus.emit({type:"team:created",teamId:i.id,name:i.name,leadAgentId:i.lead_agent_id});for(let o of n)this.eventBus.emit({type:"team:member_joined",teamId:i.id,agentId:o.agent_id});return i}async get(t){let e=await this.teamStore.get(t);if(!e)throw new k$1(t);return e}async list(){return this.teamStore.list()}async join(t,e){let s=await this.get(t);if(s.members.some(a=>a.agent_id===e))throw new c(`Agent ${e} is already a member of team ${t}`);if(!await this.agentStore.get(e))throw new c(`Agent not found: ${e}`);return s.members.push({agent_id:e,role:"member",joined_at:new Date().toISOString()}),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:member_joined",teamId:t,agentId:e}),s}async leave(t,e){let s=await this.get(t);if(e===s.lead_agent_id)throw new c("Lead cannot leave team. Disband the team or transfer lead first.");return s.members=s.members.filter(r=>r.agent_id!==e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:member_left",teamId:t,agentId:e}),s}async addTask(t,e){let s=await this.get(t);if(!await this.taskStore.get(e))throw new c(`Task not found: ${e}`);return s.task_pool.includes(e)||(s.task_pool.push(e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:task_added",teamId:t,taskId:e})),s}async removeTask(t,e){let s=await this.get(t);return s.task_pool=s.task_pool.filter(r=>r!==e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),s}async setLead(t,e){let s=await this.get(t),r=s.members.find(n=>n.agent_id===e);if(!r)throw new c(`Agent ${e} is not a member of team ${t}`);let a=s.members.find(n=>n.agent_id===s.lead_agent_id);return a&&(a.role="member"),r.role="lead",s.lead_agent_id=e,s.updated_at=new Date().toISOString(),await this.teamStore.save(s),s}async disband(t){let e=await this.get(t);e.status="disbanded",e.updated_at=new Date().toISOString(),await this.teamStore.save(e),this.eventBus.emit({type:"team:disbanded",teamId:t});}async findTeamForAgent(t){return (await this.teamStore.list()).find(s=>s.status==="active"&&s.members.some(r=>r.agent_id===t))??null}};async function ft(m){let t=new k(m.projectRoot);await t.requireInit();let e=new O(t),s=new D,[r,a]=await Promise.all([e.read(),s.read()]),n=new I(t),i=new C(t),o=new j(t),c=new R(t),d=new M(t),v=new G(t),p=new L(t),k$1=new B(t),w=new P,_=new b(n,w,r),E=new A(i,c,w,r),U=new x(o,w),wt=new F(v,i,k$1,w),_t=new N(p,w,E,_),St=new $(k$1,i,n,w);return {context:m,paths:t,config:r,taskStore:n,agentStore:i,runStore:o,stateStore:c,configStore:e,globalConfigStore:s,globalConfig:a,contextStore:d,messageStore:v,goalStore:p,teamStore:k$1,eventBus:w,taskService:_,agentService:E,runService:U,messageService:wt,goalService:_t,teamService:St}}async function yt(m){let t=await ft(m),[{ProcessManager:e},{AdapterRegistry:s},{ClaudeAdapter:r},{CodexAdapter:a},{CursorAdapter:n},{ShellAdapter:i},{WorkspaceManager:o},{LiquidTemplateEngine:c},{Orchestrator:d},{DoctorService:v}]=await Promise.all([import('./process-manager-TLZOTO4Y.js'),import('./registry-UQAHK77P.js'),import('./claude-S47YTIHU.js'),import('./codex-2CH57B7G.js'),import('./cursor-QFUNKPCQ.js'),import('./shell-OGTSH4RJ.js'),import('./workspace-manager-7M46ESUL.js'),import('./template-engine-322SCRR6.js'),import('./orchestrator-TAFBYQQ5.js'),import('./doctor-service-NTWBWOM2.js')]),p=new e,k=new c,w=new o(m.projectRoot,t.paths.root,p),_=new s;_.register(new r(p)),_.register(new a(p)),_.register(new n(p)),_.register(new i(p));let E=new v(_,p),U=new d({taskStore:t.taskStore,agentStore:t.agentStore,runStore:t.runStore,stateStore:t.stateStore,adapterRegistry:_,workspaceManager:w,templateEngine:k,processManager:p,eventBus:t.eventBus,taskService:t.taskService,agentService:t.agentService,runService:t.runService,contextStore:t.contextStore,messageService:t.messageService,goalStore:t.goalStore,config:t.config,projectRoot:m.projectRoot,lockPath:t.paths.lockPath});return {...t,processManager:p,adapterRegistry:_,workspaceManager:w,templateEngine:k,doctorService:E,orchestrator:U}}async function zt(m){return yt(m)}export{A as AgentService,P as EventBus,x as RunService,b as TaskService,zt as buildContainer,yt as buildFullContainer,ft as buildLightContainer};//# sourceMappingURL=index.js.map
|
|
4
|
+
`);}catch{}return {error:a,output:n}}};var I=class{constructor(t){this.paths=t;}async list(t){await h(this.paths.tasksDir);let e=await j$2(this.paths.tasksDir,".yml");return (await Promise.all(e.map(a=>{let n=a.replace(".yml","");return a$1(this.paths.taskPath(n))}))).filter(a=>a!==null&&(!t?.status||a.status===t.status)).sort((a,n)=>{let i=it(a.status)-it(n.status);if(i!==0)return i;let m=n.updated_at??"",c=a.updated_at??"";return m<c?-1:m>c?1:0})}async get(t){return a$1(this.paths.taskPath(t))}async save(t){await h(this.paths.tasksDir),await b$2(this.paths.taskPath(t.id),t);}async delete(t){try{await Ot.unlink(this.paths.taskPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};function it(o){return {in_progress:0,retrying:1,review:2,todo:3,done:4,failed:5,cancelled:6}[o]}var C=class{constructor(t){this.paths=t;}async list(){await h(this.paths.agentsDir);let t=await j$2(this.paths.agentsDir,".yml");return (await Promise.all(t.map(s=>{let r=s.replace(".yml","");return a$1(this.paths.agentPath(r))}))).filter(s=>s!==null)}async get(t){return a$1(this.paths.agentPath(t))}async getByName(t){return (await this.list()).find(s=>s.name===t)??null}async save(t){await h(this.paths.agentsDir),await b$2(this.paths.agentPath(t.id),t);}async delete(t){try{await Ot.unlink(this.paths.agentPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var j=class{constructor(t){this.paths=t;}async save(t){await h(this.paths.runsDir),await d(this.paths.runPath(t.id),t);}async get(t){return c$1(this.paths.runPath(t))}async listAll(){return this.listFiltered(()=>true)}async listForTask(t){return this.listFiltered(e=>e.task_id===t)}async listForAgent(t){return this.listFiltered(e=>e.agent_id===t)}async appendEvent(t,e$1){await h(this.paths.runsDir),await e(this.paths.runEventsPath(t),e$1);}async readEvents(t){return f$1(this.paths.runEventsPath(t))}async readEventsTail(t,e){return g$1(this.paths.runEventsPath(t),e)}async*streamEvents(t,e){let s=this.paths.runEventsPath(t),r=Date.now()+3e4;for(;!e?.aborted&&Date.now()<r&&!await i$1(s);)await new Promise(n=>setTimeout(n,100));if(e?.aborted||Date.now()>=r)return;let a=createReadStream(s);try{for await(let n of b$3(a)){if(e?.aborted)break;if(n.trim())try{yield JSON.parse(n);}catch{process.stderr.write(`[RunStore] skipping corrupt JSONL line: ${n.slice(0,200)}
|
|
5
|
+
`);}}}finally{a.destroy();}}async listFiltered(t){await h(this.paths.runsDir);let e=await j$2(this.paths.runsDir,".json"),s=64,r=[];for(let a=0;a<e.length;a+=s){let n=e.slice(a,a+s),i=await Promise.all(n.map(m=>{let c=m.endsWith(".json")?m.slice(0,-5):m;return c$1(this.paths.runPath(c))}));for(let m of i)m!==null&&t(m)&&r.push(m);}return r.sort((a,n)=>new Date(n.started_at).getTime()-new Date(a.started_at).getTime())}};var W={version:1,running:{},claimed:[],retry_queue:[],stats:{total_runs:0,total_tasks_completed:0,total_tasks_failed:0,total_tokens:{input:0,output:0,total:0},total_runtime_ms:0}};var R=class{constructor(t){this.paths=t;}async read(){let t=await c$1(this.paths.statePath);if(!t)return structuredClone(W);let e=structuredClone(W);return {version:t.version??e.version,pid:t.pid,started_at:t.started_at,running:t.running&&typeof t.running=="object"?t.running:e.running,claimed:Array.isArray(t.claimed)?t.claimed:e.claimed,retry_queue:Array.isArray(t.retry_queue)?t.retry_queue:e.retry_queue,stats:{total_runs:t.stats?.total_runs??e.stats.total_runs,total_tasks_completed:t.stats?.total_tasks_completed??e.stats.total_tasks_completed,total_tasks_failed:t.stats?.total_tasks_failed??e.stats.total_tasks_failed,total_tokens:t.stats?.total_tokens??e.stats.total_tokens,total_runtime_ms:t.stats?.total_runtime_ms??e.stats.total_runtime_ms}}}async write(t){await d(this.paths.statePath,t);}};var ot={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:3e4,max_concurrent_agents:6,retry_base_delay_ms:1e4,retry_max_delay_ms:3e5}};var O=class{constructor(t){this.paths=t;}async read(){let t=await a$1(this.paths.configPath);return mt(ot,t??{})}async write(t){await b$2(this.paths.configPath,t);}async get(t){let e=await this.read();return Gt(e,t)}async set(t,e){let s=await this.read();Lt(s,t,e),await this.write(s);}};function Gt(o,t){let e=t.split("."),s=o;for(let r of e){if(s==null||typeof s!="object")return;s=s[r];}return s}function Lt(o,t,e){let s=t.split("."),r=o;for(let n=0;n<s.length-1;n++){let i=s[n];(typeof r[i]!="object"||r[i]===null)&&(r[i]={}),r=r[i];}let a=s[s.length-1];r[a]=e;}function mt(o,t){let e={...o};for(let s of Object.keys(t)){let r=t[s],a=e[s];r!=null&&typeof r=="object"&&!Array.isArray(r)&&typeof a=="object"&&a!==null&&!Array.isArray(a)?e[s]=mt(a,r):e[s]=r;}return e}var z={tui:{activity_filter:"all"}};var dt=ct.join(homedir(),".orchestry"),lt=ct.join(dt,"global.yml"),D=class{async read(){let t=await a$1(lt);return t?{tui:{activity_filter:t.tui?.activity_filter??z.tui.activity_filter}}:{...z}}async write(t){await mkdir(dt,{recursive:true}),await b$2(lt,t);}async set(t,e){let s=await this.read();s.tui[t]=e,await this.write(s);}};var M=class o{constructor(t){this.paths=t;}async get(t){let e=await c$1(this.paths.contextPath(t));return e?gt(e)?(await this.delete(t),null):e:null}static MAX_TTL_MS=720*60*60*1e3;async set(t,e,s){if(s!==void 0&&(!Number.isFinite(s)||s<=0||s>o.MAX_TTL_MS))throw new Error(`TTL must be a positive number up to ${o.MAX_TTL_MS}ms (30 days)`);await h(this.paths.contextDir);let r=new Date().toISOString(),a=await c$1(this.paths.contextPath(t)),n={key:t,value:e,created_at:a?.created_at??r,updated_at:r,ttl_ms:s,expires_at:s?new Date(Date.now()+s).toISOString():void 0};await d(this.paths.contextPath(t),n);}async delete(t){try{await Ot.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}async list(){await h(this.paths.contextDir);let t=await j$2(this.paths.contextDir,".json"),e=await Promise.all(t.map(r=>{let a=r.replace(".json","");return c$1(this.paths.contextPath(a))})),s=[];for(let r of e)if(r){if(gt(r)){await this.delete(r.key);continue}s.push(r);}return s.sort((r,a)=>r.key.localeCompare(a.key))}async getAll(){let t=await this.list(),e={};for(let s of t)e[s.key]=s.value;return e}};function gt(o){return o.expires_at?new Date(o.expires_at).getTime()<Date.now():false}var G=class{constructor(t){this.paths=t;}async save(t){await h(this.paths.messagesDir),await d(this.paths.messagePath(t.id),t);}async get(t){return c$1(this.paths.messagePath(t))}async list(){let t=await j$2(this.paths.messagesDir,".json");return (await Promise.all(t.map(s=>c$1(this.paths.messagePath(s.replace(".json","")))))).filter(s=>s!==null).sort((s,r)=>s.created_at.localeCompare(r.created_at))}async listPending(t){let e=await this.list(),s=Date.now();return e.filter(r=>r.status!=="pending"||r.expires_at&&new Date(r.expires_at).getTime()<s?false:r.to_agent_id===t)}async markDelivered(t){let e=await this.get(t);e&&(e.status="delivered",e.delivered_at=new Date().toISOString(),await d(this.paths.messagePath(t),e));}async delete(t){try{await Ot.unlink(this.paths.messagePath(t));}catch(e){if(e.code!=="ENOENT")throw e}}async purgeExpired(){let t=await this.list(),e=Date.now(),s=t.filter(r=>{let a=r.expires_at&&new Date(r.expires_at).getTime()<e,n=r.delivered_at&&e-new Date(r.delivered_at).getTime()>36e5;return a||n});return await Promise.all(s.map(r=>this.delete(r.id))),s.length}};var Ut=new Set(["achieved","abandoned"]);function ut(o){return Ut.has(o)}var X={active:0,paused:1,achieved:2,abandoned:3};var L=class{constructor(t){this.paths=t;}async list(t){let e=await j$2(this.paths.goalsDir,".yml");return (await Promise.all(e.map(a=>{let n=a.replace(".yml","");return a$1(this.paths.goalPath(n))}))).filter(a=>a!==null&&(!t?.status||a.status===t.status)).sort((a,n)=>{let i=X[a.status]-X[n.status];if(i!==0)return i;let m=n.updated_at??"",c=a.updated_at??"";return m<c?-1:m>c?1:0})}async get(t){return a$1(this.paths.goalPath(t))}async save(t){await b$2(this.paths.goalPath(t.id),t);}async delete(t){try{await Ot.unlink(this.paths.goalPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var B=class{constructor(t){this.paths=t;}async save(t){await h(this.paths.teamsDir),await b$2(this.paths.teamPath(t.id),t);}async get(t){return a$1(this.paths.teamPath(t))}async getByName(t){return (await this.list()).find(s=>s.name===t)??null}async list(){await h(this.paths.teamsDir);let t=await j$2(this.paths.teamsDir,".yml");return (await Promise.all(t.map(s=>a$1(this.paths.teamPath(s.replace(".yml","")))))).filter(s=>s!==null)}async delete(t){try{await Ot.unlink(this.paths.teamPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var F=class{constructor(t,e,s,r){this.messageStore=t;this.agentStore=e;this.teamStore=s;this.eventBus=r;}async send(t){if(!t.body.trim())throw new c("Message body is required");let e=t.ttl_ms??864e5;if(e<=0||e>6048e5)throw new c(`TTL must be between 1ms and ${6048e5}ms`);if(!await this.agentStore.get(t.from_agent_id)&&t.from_agent_id!=="cli")throw new c(`Sender agent not found: ${t.from_agent_id}`);let r=new Date,a={channel:t.channel,from_agent_id:t.from_agent_id,subject:(t.subject||"(no subject)").slice(0,200),body:t.body.slice(0,4e3),created_at:r.toISOString(),expires_at:new Date(r.getTime()+e).toISOString(),status:"pending",team_id:t.team_id,reply_to:t.reply_to},n=[];if(t.channel==="broadcast"){let i=await this.agentStore.list();if(t.team_id){let d=await this.teamStore.get(t.team_id);if(d){let v=new Set(d.members.map(p=>p.agent_id));i=i.filter(p=>v.has(p.id));}}let c=i.filter(d=>d.id!==t.from_agent_id&&d.status!=="disabled").map(d=>({...a,id:`msg_${nanoid(7)}`,to_agent_id:d.id}));await Promise.all(c.map(d=>this.messageStore.save(d)));for(let d of c)n.push(d),this.emitSent(d);}else if(t.channel==="lead"){if(!t.team_id)throw new c("team_id is required for lead channel");let i=await this.teamStore.get(t.team_id);if(!i)throw new c(`Team not found: ${t.team_id}`);let m={...a,id:`msg_${nanoid(7)}`,to_agent_id:i.lead_agent_id};await this.messageStore.save(m),n.push(m),this.emitSent(m);}else {if(!t.to_agent_id)throw new c("to_agent_id is required for direct messages");if(!await this.agentStore.get(t.to_agent_id))throw new c(`Recipient agent not found: ${t.to_agent_id}`);let m={...a,id:`msg_${nanoid(7)}`,to_agent_id:t.to_agent_id};await this.messageStore.save(m),n.push(m),this.emitSent(m);}return n}async drainMailbox(t,e){let s=await this.messageStore.listPending(t);await Promise.all(s.map(r=>this.messageStore.markDelivered(r.id)));for(let r of s)this.eventBus.emit({type:"message:delivered",messageId:r.id,toAgentId:t,taskId:e});return s}async listAll(){return this.messageStore.list()}async listPendingForAgent(t){return this.messageStore.listPending(t)}async listForAgent(t){return (await this.messageStore.list()).filter(s=>s.to_agent_id===t||s.from_agent_id===t)}async purgeExpired(){return this.messageStore.purgeExpired()}emitSent(t){this.eventBus.emit({type:"message:sent",messageId:t.id,fromAgentId:t.from_agent_id,toAgentId:t.to_agent_id,channel:t.channel});}};var Wt={active:["paused","achieved","abandoned"],paused:["active","abandoned"],achieved:[],abandoned:[]},N=class{constructor(t,e,s,r){this.goalStore=t;this.eventBus=e;this.agentService=s;this.taskService=r;}async create(t){if(!t.title.trim())throw new c("Goal title is required");let e=new Date().toISOString(),s={id:`goal_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"active",assignee:t.assignee,created_at:e,updated_at:e};return await this.goalStore.save(s),this.eventBus.emit({type:"goal:created",goalId:s.id,title:s.title}),s.assignee&&await this.enableAutonomous(s.assignee),s}async list(t){return this.goalStore.list(t)}async get(t){let e=await this.goalStore.get(t);if(!e)throw new j$1(t);return e}async updateStatus(t,e){let s=await this.get(t),r=s.status;if(!Wt[r].includes(e))throw new c(`Cannot transition goal from '${r}' to '${e}'`);return s.status=e,s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:status_changed",goalId:t,from:r,to:e}),s.assignee&&(e==="paused"?(await this.maybeDisableAutonomous(s.assignee),await this.cancelPendingAutonomousTasks(s.assignee)):e==="active"&&r==="paused"?await this.enableAutonomous(s.assignee):ut(e)&&await this.maybeDisableAutonomous(s.assignee)),s}async update(t,e){let s=await this.get(t),r=s.assignee;if(e.title!==void 0){if(!e.title.trim())throw new c("Goal title cannot be empty");s.title=e.title.trim();}e.description!==void 0&&(s.description=e.description.trim()),e.assignee!==void 0&&(s.assignee=e.assignee||void 0),s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:updated",goalId:t});let a=s.assignee;if(a!==r){let n=[];a&&n.push(this.enableAutonomous(a)),r&&n.push(this.maybeDisableAutonomous(r)),await Promise.all(n);}return s}async delete(t){let e=await this.get(t),{assignee:s}=e;await this.goalStore.delete(t),this.eventBus.emit({type:"goal:deleted",goalId:t}),s&&await this.maybeDisableAutonomous(s);}async enableAutonomous(t){if(this.agentService)try{await this.agentService.setAutonomous(t,!0);}catch{}}async hasActiveGoalsForAgent(t){return (await this.goalStore.list({status:"active"})).some(s=>s.assignee===t)}async cancelPendingAutonomousTasks(t){if(this.taskService)try{let[e,s]=await Promise.all([this.taskService.list({status:"todo"}),this.taskService.list({status:"retrying"})]),r=[...e,...s].filter(a=>a.assignee===t&&a.labels?.includes(a$2));await Promise.all(r.map(a=>this.taskService.cancel(a.id).catch(()=>{})));}catch{}}async maybeDisableAutonomous(t){if(this.agentService)try{await this.hasActiveGoalsForAgent(t)||await this.agentService.setAutonomous(t,!1);}catch{}}};var ht={auto_claim:true,message_ttl_ms:864e5};var $=class{constructor(t,e,s,r){this.teamStore=t;this.agentStore=e;this.taskStore=s;this.eventBus=r;}async create(t){if(!t.name.trim())throw new c("Team name is required");if(!await this.agentStore.get(t.lead_agent_id))throw new c(`Lead agent not found: ${t.lead_agent_id}`);if(await this.teamStore.getByName(t.name.trim()))throw new c(`Team "${t.name}" already exists`);let r=new Date().toISOString(),a={agent_id:t.lead_agent_id,role:"lead",joined_at:r},n=[];for(let m of t.member_agent_ids??[]){if(m===t.lead_agent_id)continue;if(!await this.agentStore.get(m))throw new c(`Member agent not found: ${m}`);n.push({agent_id:m,role:"member",joined_at:r});}let i={id:`team_${nanoid(7)}`,name:t.name.trim(),description:t.description,status:"active",members:[a,...n],task_pool:[],lead_agent_id:t.lead_agent_id,created_at:r,updated_at:r,config:{...ht,...t.config??{}}};await this.teamStore.save(i),this.eventBus.emit({type:"team:created",teamId:i.id,name:i.name,leadAgentId:i.lead_agent_id});for(let m of n)this.eventBus.emit({type:"team:member_joined",teamId:i.id,agentId:m.agent_id});return i}async get(t){let e=await this.teamStore.get(t);if(!e)throw new k$1(t);return e}async list(){return this.teamStore.list()}async join(t,e){let s=await this.get(t);if(s.members.some(a=>a.agent_id===e))throw new c(`Agent ${e} is already a member of team ${t}`);if(!await this.agentStore.get(e))throw new c(`Agent not found: ${e}`);return s.members.push({agent_id:e,role:"member",joined_at:new Date().toISOString()}),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:member_joined",teamId:t,agentId:e}),s}async leave(t,e){let s=await this.get(t);if(e===s.lead_agent_id)throw new c("Lead cannot leave team. Disband the team or transfer lead first.");return s.members=s.members.filter(r=>r.agent_id!==e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:member_left",teamId:t,agentId:e}),s}async addTask(t,e){let s=await this.get(t);if(!await this.taskStore.get(e))throw new c(`Task not found: ${e}`);return s.task_pool.includes(e)||(s.task_pool.push(e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),this.eventBus.emit({type:"team:task_added",teamId:t,taskId:e})),s}async removeTask(t,e){let s=await this.get(t);return s.task_pool=s.task_pool.filter(r=>r!==e),s.updated_at=new Date().toISOString(),await this.teamStore.save(s),s}async setLead(t,e){let s=await this.get(t),r=s.members.find(n=>n.agent_id===e);if(!r)throw new c(`Agent ${e} is not a member of team ${t}`);let a=s.members.find(n=>n.agent_id===s.lead_agent_id);return a&&(a.role="member"),r.role="lead",s.lead_agent_id=e,s.updated_at=new Date().toISOString(),await this.teamStore.save(s),s}async disband(t){let e=await this.get(t);e.status="disbanded",e.updated_at=new Date().toISOString(),await this.teamStore.save(e),this.eventBus.emit({type:"team:disbanded",teamId:t});}async findTeamForAgent(t){return (await this.teamStore.list()).find(s=>s.status==="active"&&s.members.some(r=>r.agent_id===t))??null}};async function ft(o){let t=new k(o.projectRoot);await t.requireInit();let e=new O(t),s=new D,[r,a]=await Promise.all([e.read(),s.read()]),n=new I(t),i=new C(t),m=new j(t),c=new R(t),d=new M(t),v=new G(t),p=new L(t),k$1=new B(t),w=new P,_=new b(n,w,r),E=new A(i,c,w,r),U=new x(m,w),wt=new F(v,i,k$1,w),_t=new N(p,w,E,_),St=new $(k$1,i,n,w);return {context:o,paths:t,config:r,taskStore:n,agentStore:i,runStore:m,stateStore:c,configStore:e,globalConfigStore:s,globalConfig:a,contextStore:d,messageStore:v,goalStore:p,teamStore:k$1,eventBus:w,taskService:_,agentService:E,runService:U,messageService:wt,goalService:_t,teamService:St}}async function yt(o){let t=await ft(o),[{ProcessManager:e},{AdapterRegistry:s},{ClaudeAdapter:r},{CodexAdapter:a},{CursorAdapter:n},{ShellAdapter:i},{WorkspaceManager:m},{LiquidTemplateEngine:c},{Orchestrator:d},{DoctorService:v}]=await Promise.all([import('./process-manager-TLZOTO4Y.js'),import('./registry-UQAHK77P.js'),import('./claude-S47YTIHU.js'),import('./codex-2CH57B7G.js'),import('./cursor-QFUNKPCQ.js'),import('./shell-OGTSH4RJ.js'),import('./workspace-manager-AS4TFA7R.js'),import('./template-engine-322SCRR6.js'),import('./orchestrator-L6QX2LJ7.js'),import('./doctor-service-QEJCE5FK.js')]),p=new e,k=new c,w=new m(o.projectRoot,t.paths.root,p),_=new s;_.register(new r(p)),_.register(new a(p)),_.register(new n(p)),_.register(new i(p));let E=new v(_,p,o.projectRoot),U=new d({taskStore:t.taskStore,agentStore:t.agentStore,runStore:t.runStore,stateStore:t.stateStore,adapterRegistry:_,workspaceManager:w,templateEngine:k,processManager:p,eventBus:t.eventBus,taskService:t.taskService,agentService:t.agentService,runService:t.runService,contextStore:t.contextStore,messageService:t.messageService,goalStore:t.goalStore,config:t.config,projectRoot:o.projectRoot,lockPath:t.paths.lockPath});return {...t,processManager:p,adapterRegistry:_,workspaceManager:w,templateEngine:k,doctorService:E,orchestrator:U}}async function Xt(o){return yt(o)}export{A as AgentService,P as EventBus,x as RunService,b as TaskService,Xt as buildContainer,yt as buildFullContainer,ft as buildLightContainer};//# sourceMappingURL=index.js.map
|
|
6
6
|
//# sourceMappingURL=index.js.map
|