@oxgeneral/orch 1.0.7 → 1.0.9
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-Q6LOPAZT.js +22 -0
- package/dist/{agent-Q34L27AY.js → agent-SI4JF5MV.js} +1 -1
- package/dist/{agent-shop-D2RS4BZK.js → agent-shop-JHDTCWCD.js} +1 -1
- package/dist/chunk-3AXNSYCM.js +2 -0
- package/dist/{chunk-4TDXD3LA.js → chunk-5YSW77VI.js} +104 -21
- package/dist/chunk-5YSW77VI.js.map +1 -0
- package/dist/{chunk-BCPUTULS.js → chunk-HWEMBO36.js} +83 -54
- package/dist/chunk-J7ITYXE6.js +116 -0
- package/dist/chunk-J7ITYXE6.js.map +1 -0
- package/dist/chunk-U2JVMD2G.js +66 -0
- package/dist/chunk-U2JVMD2G.js.map +1 -0
- package/dist/{chunk-EH3HRQP4.js → chunk-W3J7CURM.js} +8 -116
- package/dist/chunk-W3J7CURM.js.map +1 -0
- package/dist/{chunk-UMZEA3JT.js → chunk-XLBV2PFL.js} +1 -1
- package/dist/chunk-ZMLF5HI5.js +11 -0
- package/dist/cli.js +1 -1
- package/dist/container-LV3WOPMS.js +4 -0
- package/dist/doctor-Q3GHJNZL.js +2 -0
- package/dist/index.d.ts +44 -1
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/dist/init-D4356W7G.js +73 -0
- package/dist/orchestrator-PSXVHP2L.js +17 -0
- package/dist/orchestrator-WLWIAFXH.js +6 -0
- package/dist/{orchestrator-XPEMMBOO.js.map → orchestrator-WLWIAFXH.js.map} +1 -1
- package/dist/{org-WAK3CDPG.js → org-KLYK6MMJ.js} +1 -1
- package/dist/serve-4RT4HERL.js +3 -0
- package/dist/skill-loader-IGRIELEM.js +9 -0
- package/dist/skill-loader-RHCFIK74.js +4 -0
- package/dist/skill-loader-RHCFIK74.js.map +1 -0
- package/dist/{task-QFLIIRKZ.js → task-6Z5P7ODZ.js} +1 -1
- package/dist/tui-GH3Z5CO4.js +2 -0
- package/dist/{update-FFKCOV63.js → update-XGJZFV4H.js} +1 -1
- package/dist/{update-check-HGMBDYHL.js → update-check-CZJC7VW6.js} +1 -1
- package/dist/{workspace-manager-5EYCMAEO.js → workspace-manager-RH24FSNT.js} +4 -3
- package/dist/workspace-manager-RH24FSNT.js.map +1 -0
- package/dist/workspace-manager-VJ4FN5PJ.js +3 -0
- package/package.json +1 -1
- package/readme.md +2 -2
- package/skills/library/autoplan.md +315 -0
- package/skills/library/benchmark.md +242 -0
- package/skills/library/browse.md +266 -0
- package/skills/library/canary.md +248 -0
- package/skills/library/careful.md +42 -0
- package/skills/library/codex.md +431 -0
- package/skills/library/design-consultation.md +367 -0
- package/skills/library/design-review.md +744 -0
- package/skills/library/document-release.md +365 -0
- package/skills/library/freeze.md +60 -0
- package/skills/library/guard.md +55 -0
- package/skills/library/investigate.md +171 -0
- package/skills/library/land-and-deploy.md +636 -0
- package/skills/library/office-hours.md +746 -0
- package/skills/library/plan-ceo-review.md +1029 -0
- package/skills/library/plan-design-review.md +428 -0
- package/skills/library/plan-eng-review.md +420 -0
- package/skills/library/qa-only.md +388 -0
- package/skills/library/qa.md +766 -0
- package/skills/library/retro.md +532 -0
- package/skills/library/review.md +421 -0
- package/skills/library/setup-browser-cookies.md +86 -0
- package/skills/library/setup-deploy.md +211 -0
- package/skills/library/ship.md +1018 -0
- package/skills/library/unfreeze.md +31 -0
- package/skills/library/upgrade.md +220 -0
- package/skills/orch/SKILL.md +138 -0
- package/dist/App-LEVUTWQN.js +0 -22
- package/dist/chunk-4TDXD3LA.js.map +0 -1
- package/dist/chunk-EH3HRQP4.js.map +0 -1
- package/dist/chunk-WVJTXBPL.js +0 -11
- package/dist/container-FXUUV6PP.js +0 -4
- package/dist/doctor-P2J6VAUX.js +0 -2
- package/dist/init-PTAYCSMO.js +0 -53
- package/dist/orchestrator-JOTMB5XT.js +0 -13
- package/dist/orchestrator-XPEMMBOO.js +0 -6
- package/dist/serve-5OAANN6J.js +0 -3
- package/dist/tui-BJHZBCIR.js +0 -2
- package/dist/workspace-manager-5EYCMAEO.js.map +0 -1
- package/dist/workspace-manager-XKOZ5WM6.js +0 -3
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { NotInitializedError } from './chunk-NLQAJ7TW.js';
|
|
2
1
|
import { randomBytes } from 'crypto';
|
|
3
2
|
import fs from 'fs/promises';
|
|
4
|
-
import
|
|
3
|
+
import path from 'path';
|
|
5
4
|
import yaml from 'js-yaml';
|
|
6
|
-
import 'fs';
|
|
7
5
|
|
|
6
|
+
// src/infrastructure/storage/fs-utils.ts
|
|
8
7
|
async function atomicWrite(filePath, content) {
|
|
9
|
-
const dir =
|
|
8
|
+
const dir = path.dirname(filePath);
|
|
10
9
|
await ensureDir(dir);
|
|
11
|
-
const tmpPath =
|
|
10
|
+
const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(4).toString("hex")}.tmp`);
|
|
12
11
|
try {
|
|
13
12
|
await fs.writeFile(tmpPath, content, "utf-8");
|
|
14
13
|
await fs.rename(tmpPath, filePath);
|
|
@@ -51,7 +50,7 @@ async function writeJson(filePath, data) {
|
|
|
51
50
|
}
|
|
52
51
|
var PIPE_BUF = 4096;
|
|
53
52
|
async function appendJsonl(filePath, record) {
|
|
54
|
-
const dir =
|
|
53
|
+
const dir = path.dirname(filePath);
|
|
55
54
|
await ensureDir(dir);
|
|
56
55
|
let line = JSON.stringify(record) + "\n";
|
|
57
56
|
const byteLen = Buffer.byteLength(line, "utf-8");
|
|
@@ -226,114 +225,7 @@ async function listFiles(dirPath, ext) {
|
|
|
226
225
|
function isENOENT(err) {
|
|
227
226
|
return err instanceof Error && "code" in err && err.code === "ENOENT";
|
|
228
227
|
}
|
|
229
|
-
var ORCHESTRY_DIR = ".orchestry";
|
|
230
|
-
var ID_PATTERN = /^[A-Za-z0-9._-]+$/;
|
|
231
|
-
var Paths = class {
|
|
232
|
-
constructor(projectRoot) {
|
|
233
|
-
this.projectRoot = projectRoot;
|
|
234
|
-
}
|
|
235
|
-
/** Root .orchestry/ directory */
|
|
236
|
-
get root() {
|
|
237
|
-
return path2.join(this.projectRoot, ORCHESTRY_DIR);
|
|
238
|
-
}
|
|
239
|
-
get configPath() {
|
|
240
|
-
return path2.join(this.root, "config.yml");
|
|
241
|
-
}
|
|
242
|
-
get statePath() {
|
|
243
|
-
return path2.join(this.root, "state.json");
|
|
244
|
-
}
|
|
245
|
-
get lockPath() {
|
|
246
|
-
return path2.join(this.root, "orchestry.lock");
|
|
247
|
-
}
|
|
248
|
-
get tasksDir() {
|
|
249
|
-
return path2.join(this.root, "tasks");
|
|
250
|
-
}
|
|
251
|
-
get agentsDir() {
|
|
252
|
-
return path2.join(this.root, "agents");
|
|
253
|
-
}
|
|
254
|
-
get runsDir() {
|
|
255
|
-
return path2.join(this.root, "runs");
|
|
256
|
-
}
|
|
257
|
-
get templatesDir() {
|
|
258
|
-
return path2.join(this.root, "templates");
|
|
259
|
-
}
|
|
260
|
-
get logsDir() {
|
|
261
|
-
return path2.join(this.root, "logs");
|
|
262
|
-
}
|
|
263
|
-
get contextDir() {
|
|
264
|
-
return path2.join(this.root, "context");
|
|
265
|
-
}
|
|
266
|
-
contextPath(key) {
|
|
267
|
-
return path2.join(this.contextDir, `${sanitizeId(key)}.json`);
|
|
268
|
-
}
|
|
269
|
-
get messagesDir() {
|
|
270
|
-
return path2.join(this.root, "messages");
|
|
271
|
-
}
|
|
272
|
-
messagePath(id) {
|
|
273
|
-
return path2.join(this.messagesDir, `${sanitizeId(id)}.json`);
|
|
274
|
-
}
|
|
275
|
-
get goalsDir() {
|
|
276
|
-
return path2.join(this.root, "goals");
|
|
277
|
-
}
|
|
278
|
-
goalPath(id) {
|
|
279
|
-
return path2.join(this.goalsDir, `${sanitizeId(id)}.yml`);
|
|
280
|
-
}
|
|
281
|
-
get teamsDir() {
|
|
282
|
-
return path2.join(this.root, "teams");
|
|
283
|
-
}
|
|
284
|
-
get attachmentsDir() {
|
|
285
|
-
return path2.join(this.root, "attachments");
|
|
286
|
-
}
|
|
287
|
-
taskAttachmentsDir(taskId) {
|
|
288
|
-
return path2.join(this.attachmentsDir, sanitizeId(taskId));
|
|
289
|
-
}
|
|
290
|
-
teamPath(id) {
|
|
291
|
-
return path2.join(this.teamsDir, `${sanitizeId(id)}.yml`);
|
|
292
|
-
}
|
|
293
|
-
get gitignorePath() {
|
|
294
|
-
return path2.join(this.root, ".gitignore");
|
|
295
|
-
}
|
|
296
|
-
get workspaceExcludePath() {
|
|
297
|
-
return path2.join(this.root, "workspace-exclude");
|
|
298
|
-
}
|
|
299
|
-
taskPath(id) {
|
|
300
|
-
return path2.join(this.tasksDir, `${sanitizeId(id)}.yml`);
|
|
301
|
-
}
|
|
302
|
-
agentPath(id) {
|
|
303
|
-
return path2.join(this.agentsDir, `${sanitizeId(id)}.yml`);
|
|
304
|
-
}
|
|
305
|
-
runPath(id) {
|
|
306
|
-
return path2.join(this.runsDir, `${sanitizeId(id)}.json`);
|
|
307
|
-
}
|
|
308
|
-
runEventsPath(id) {
|
|
309
|
-
return path2.join(this.runsDir, `${sanitizeId(id)}.jsonl`);
|
|
310
|
-
}
|
|
311
|
-
defaultTemplatePath() {
|
|
312
|
-
return path2.join(this.templatesDir, "default.md");
|
|
313
|
-
}
|
|
314
|
-
async isInitialized() {
|
|
315
|
-
return pathExists(this.root);
|
|
316
|
-
}
|
|
317
|
-
async requireInit() {
|
|
318
|
-
if (!await this.isInitialized()) {
|
|
319
|
-
throw new NotInitializedError();
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
};
|
|
323
|
-
function sanitizeId(id) {
|
|
324
|
-
if (!ID_PATTERN.test(id)) {
|
|
325
|
-
throw new Error(`Invalid identifier: "${id}"`);
|
|
326
|
-
}
|
|
327
|
-
return id;
|
|
328
|
-
}
|
|
329
|
-
function validateWorkspacePath(workspacePath, projectRoot) {
|
|
330
|
-
const resolved = path2.resolve(workspacePath);
|
|
331
|
-
const root = path2.resolve(projectRoot);
|
|
332
|
-
if (!resolved.startsWith(root + path2.sep) && resolved !== root) {
|
|
333
|
-
throw new Error(`Workspace path "${workspacePath}" is outside project root`);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
228
|
|
|
337
|
-
export {
|
|
338
|
-
//# sourceMappingURL=chunk-
|
|
339
|
-
//# sourceMappingURL=chunk-
|
|
229
|
+
export { appendJsonl, closeAppendHandle, ensureDir, listFiles, pathExists, readJson, readJsonl, readJsonlTail, readYaml, writeJson, writeYaml };
|
|
230
|
+
//# sourceMappingURL=chunk-W3J7CURM.js.map
|
|
231
|
+
//# sourceMappingURL=chunk-W3J7CURM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/storage/fs-utils.ts"],"names":["lines"],"mappings":";;;;;;AAiBA,eAAsB,WAAA,CAAY,UAAkB,OAAA,EAAgC;AAClF,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACjC,EAAA,MAAM,UAAU,GAAG,CAAA;AAEnB,EAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,KAAK,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA,EAAI,YAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,IAAA,CAAM,CAAA;AAElG,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,SAAA,CAAU,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAC5C,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,OAAA,EAAS,QAAQ,CAAA;AAAA,EACnC,SAAS,GAAA,EAAK;AAEZ,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,OAAO,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACvC,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAKA,eAAsB,SAAY,QAAA,EAAqC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EAC1B,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAC1B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAKA,eAAsB,SAAA,CAAa,UAAkB,IAAA,EAAwB;AAC3E,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM;AAAA,IAC9B,MAAA,EAAQ,CAAA;AAAA,IACR,SAAA,EAAW,GAAA;AAAA,IACX,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,MAAM,WAAA,CAAY,UAAU,OAAO,CAAA;AACrC;AAKA,eAAsB,SAAY,QAAA,EAAqC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAC1B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAKA,eAAsB,SAAA,CAAa,UAAkB,IAAA,EAAwB;AAC3E,EAAA,MAAM,UAAU,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;AAChD,EAAA,MAAM,WAAA,CAAY,UAAU,OAAO,CAAA;AACrC;AAMA,IAAM,QAAA,GAAW,IAAA;AAcjB,eAAsB,WAAA,CAAY,UAAkB,MAAA,EAAgC;AAClF,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACjC,EAAA,MAAM,UAAU,GAAG,CAAA;AACnB,EAAA,IAAI,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GAAI,IAAA;AAGpC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AAC/C,EAAA,IAAI,UAAU,QAAA,IAAY,MAAA,KAAW,IAAA,IAAQ,OAAO,WAAW,QAAA,EAAU;AACvE,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,YAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AAEvD,MAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,CAAU,EAAE,GAAG,GAAA,EAAK,IAAA,EAAM,EAAA,EAAI,CAAA,GAAI,IAAA;AACrD,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA;AACjD,MAAA,MAAM,MAAA,GAAS,WAAW,QAAA,GAAW,CAAA;AACrC,MAAA,IAAI,SAAS,CAAA,EAAG;AAId,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,GAAG,MAAM,CAAA;AAC1C,QAAA,IAAA,GAAO,IAAA,CAAK,UAAU,EAAE,GAAG,KAAK,IAAA,EAAM,SAAA,GAAY,QAAA,EAAK,CAAA,GAAI,IAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,QAAQ,CAAA;AAC/C,EAAA,MAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AACxC;AAcA,IAAM,cAAA,GAAiB,GAAA;AAGvB,IAAM,aAAA,uBAAoB,GAAA,EAAyB;AAEnD,IAAM,aAAA,uBAAoB,GAAA,EAAiC;AAE3D,eAAe,kBAAkB,QAAA,EAAuC;AACtE,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC3C,EAAA,IAAI,QAAA,EAAU;AAGZ,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,QAAA,CAAS,UAAA,GAAa,cAAA,GAAiB,CAAA,EAAG;AAClD,MAAA,YAAA,CAAa,SAAS,SAAS,CAAA;AAC/B,MAAA,QAAA,CAAS,YAAY,UAAA,CAAW,MAAM,WAAA,CAAY,QAAQ,GAAG,cAAc,CAAA;AAC3E,MAAA,QAAA,CAAS,UAAA,GAAa,GAAA;AAAA,IACxB;AACA,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAA,GAAU,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAChD,MAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAE7B,MAAA,IAAI,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAC7B,QAAA,OAAO,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,CAAG,MAAA;AAAA,MACtC;AACA,MAAA,MAAM,KAAA,GAAqB;AAAA,QACzB,MAAA;AAAA,QACA,WAAW,UAAA,CAAW,MAAM,WAAA,CAAY,QAAQ,GAAG,cAAc,CAAA;AAAA,QACjE,UAAA,EAAY,KAAK,GAAA;AAAI,OACvB;AACA,MAAA,aAAA,CAAc,GAAA,CAAI,UAAU,KAAK,CAAA;AACjC,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAChB,MAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAC7B,MAAA,MAAM,GAAA;AAAA,IACR,CAAC,CAAA;AACD,IAAA,aAAA,CAAc,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,YAAY,QAAA,EAAwB;AAC3C,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAC7B,EAAA,YAAA,CAAa,MAAM,SAAS,CAAA;AAC5B,EAAA,KAAA,CAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AACrC;AAMO,SAAS,kBAAkB,QAAA,EAAwB;AACxD,EAAA,WAAA,CAAY,QAAQ,CAAA;AACtB;AAMO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,KAAA,MAAW,YAAY,CAAC,GAAG,aAAA,CAAc,IAAA,EAAM,CAAA,EAAG;AAChD,IAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,EACtB;AACF;AAGA,OAAA,CAAQ,IAAA,CAAK,QAAQ,qBAAqB,CAAA;AAG1C,IAAM,mBAAA,GAAsB,KAAK,IAAA,GAAO,IAAA;AAMxC,eAAsB,UAAa,QAAA,EAAgC;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,IAAI,IAAA,CAAK,OAAO,mBAAA,EAAqB;AACnC,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,4BAAA,EAAA,CAAgC,KAAK,IAAA,GAAO,IAAA,GAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,yBAAA,EAA4B,QAAQ;AAAA;AAAA,OACzG;AACA,MAAA,OAAO,aAAA,CAAiB,UAAU,GAAG,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,kBAAqB,QAAQ,CAAA;AAAA,EACtC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAC;AAC3B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAQA,eAAsB,aAAA,CAAiB,UAAkB,KAAA,EAA6B;AACpF,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAEnC,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,MAAM,iBAAA,CAAqB,QAAQ,CAAA,EAAG,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,IAC5D;AAIA,IAAA,MAAM,EAAA,GAAK,MAAM,EAAA,CAAG,IAAA,CAAK,UAAU,GAAG,CAAA;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,GAAO,OAAA,GAAY,MAAA,GAAS,KAAK,CAAA;AAC5E,MAAA,IAAI,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAS,CAAA;AAChD,MAAA,IAAI,oBAAA,GAAuB,QAAA;AAC3B,MAAA,IAAI,IAAA,GAAO,EAAA;AAGX,MAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,GAAU,CAAA,IAAK,QAAA,IAAY,GAAG,OAAA,EAAA,EAAW;AAC7D,QAAA,oBAAA,GAAuB,QAAA;AACvB,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,OAAO,QAAQ,CAAA;AACzD,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AACjC,QAAA,MAAM,EAAA,CAAG,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,UAAU,QAAQ,CAAA;AACxC,QAAA,IAAA,GAAO,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,GAAI,IAAA;AAE/B,QAAA,MAAMA,MAAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAChE,QAAA,IAAIA,MAAAA,CAAM,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AAE7B,UAAA,OAAO,eAAA,CAAmBA,MAAAA,CAAM,KAAA,CAAM,CAAC,KAAK,CAAC,CAAA;AAAA,QAC/C;AACA,QAAA,IAAI,aAAa,CAAA,EAAG;AACpB,QAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,SAAS,CAAA;AAAA,MAC7C;AAGA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAEhE,MAAA,MAAM,YAAY,oBAAA,GAAuB,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AAC9D,MAAA,OAAO,eAAA,CAAmB,SAAA,CAAU,KAAA,CAAM,CAAC,KAAK,CAAC,CAAA;AAAA,IACnD,CAAA,SAAE;AACA,MAAA,MAAM,GAAG,KAAA,EAAM;AAAA,IACjB;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAC;AAC3B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAGA,eAAe,kBAAqB,QAAA,EAAgC;AAClE,EAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AACnE,EAAA,OAAO,gBAAmB,KAAK,CAAA;AACjC;AAKA,SAAS,gBAAmB,KAAA,EAAsB;AAChD,EAAA,MAAM,UAAe,EAAC;AACtB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAM,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,mCAAA,EAAsC,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC;AAAA,CAAI,CAAA;AAAA,IACnF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAMA,IAAM,WAAA,uBAAkB,GAAA,EAAY;AAMpC,eAAsB,UAAU,OAAA,EAAgC;AAC9D,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9B,EAAA,MAAM,GAAG,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3C,EAAA,WAAA,CAAY,IAAI,OAAO,CAAA;AACzB;AAYA,eAAsB,WAAW,QAAA,EAAoC;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAsB,SAAA,CAAU,SAAiB,GAAA,EAAiC;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA;AACxC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAC;AAC3B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,SAAS,SAAS,GAAA,EAAuB;AACvC,EAAA,OAAO,GAAA,YAAe,KAAA,IAAS,MAAA,IAAU,GAAA,IAAQ,IAA8B,IAAA,KAAS,QAAA;AAC1F","file":"chunk-W3J7CURM.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 type { FileHandle } 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 handle = await getOrCreateHandle(filePath);\n await handle.write(line, null, 'utf-8');\n}\n\n// ── Append file handle cache ─────────────────────────────────────────\n// Keeps one FileHandle (O_APPEND) per file path to avoid open/close per event.\n// Idle handles are auto-closed after HANDLE_IDLE_MS.\n\ninterface HandleEntry {\n handle: FileHandle;\n idleTimer: ReturnType<typeof setTimeout>;\n /** Timestamp when the idle timer was last set — avoids redundant timer resets on hot paths. */\n timerSetAt: number;\n}\n\n/** Idle time before a cached file handle is auto-closed (milliseconds). */\nconst HANDLE_IDLE_MS = 10_000;\n\n/** Module-level cache of open append handles, keyed by absolute file path. */\nconst appendHandles = new Map<string, HandleEntry>();\n/** In-flight open() promises — prevents duplicate FDs for the same path under concurrent calls. */\nconst inFlightOpens = new Map<string, Promise<FileHandle>>();\n\nasync function getOrCreateHandle(filePath: string): Promise<FileHandle> {\n const existing = appendHandles.get(filePath);\n if (existing) {\n // Only reset the idle timer when past the midpoint — avoids timer churn on hot paths\n // (hundreds of writes/sec during Claude streaming, each would otherwise clearTimeout/setTimeout)\n const now = Date.now();\n if (now - existing.timerSetAt > HANDLE_IDLE_MS / 2) {\n clearTimeout(existing.idleTimer);\n existing.idleTimer = setTimeout(() => evictHandle(filePath), HANDLE_IDLE_MS);\n existing.timerSetAt = now;\n }\n return existing.handle;\n }\n // Deduplicate concurrent opens for the same path\n let opening = inFlightOpens.get(filePath);\n if (!opening) {\n opening = fs.open(filePath, 'a').then((handle) => {\n inFlightOpens.delete(filePath);\n // If another call already populated the cache (race lost), close the duplicate\n if (appendHandles.has(filePath)) {\n handle.close().catch(() => {});\n return appendHandles.get(filePath)!.handle;\n }\n const entry: HandleEntry = {\n handle,\n idleTimer: setTimeout(() => evictHandle(filePath), HANDLE_IDLE_MS),\n timerSetAt: Date.now(),\n };\n appendHandles.set(filePath, entry);\n return handle;\n }).catch((err) => {\n inFlightOpens.delete(filePath);\n throw err;\n });\n inFlightOpens.set(filePath, opening);\n }\n return opening;\n}\n\nfunction evictHandle(filePath: string): void {\n const entry = appendHandles.get(filePath);\n if (!entry) return;\n appendHandles.delete(filePath);\n clearTimeout(entry.idleTimer);\n entry.handle.close().catch(() => {});\n}\n\n/**\n * Explicitly close the append handle for a file path.\n * Call this when a run completes to reclaim the FD immediately.\n */\nexport function closeAppendHandle(filePath: string): void {\n evictHandle(filePath);\n}\n\n/**\n * Close all cached append handles.\n * Call on process exit and in test teardown.\n */\nexport function closeAllAppendHandles(): void {\n for (const filePath of [...appendHandles.keys()]) {\n evictHandle(filePath);\n }\n}\n\n// Auto-cleanup on process exit\nprocess.once('exit', closeAllAppendHandles);\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 * Module-level cache of directories already ensured during this process lifetime.\n * Eliminates redundant fs.mkdir syscalls (~50 per tick loop).\n */\nconst ensuredDirs = new Set<string>();\n\n/**\n * Ensure a directory exists, creating it recursively if needed.\n * Uses an in-memory cache to skip redundant mkdir syscalls.\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n if (ensuredDirs.has(dirPath)) return;\n await fs.mkdir(dirPath, { recursive: true });\n ensuredDirs.add(dirPath);\n}\n\n/**\n * Clear the ensureDir cache. Intended for tests only.\n */\nexport function clearEnsuredDirs(): void {\n ensuredDirs.clear();\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"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
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)):
|
|
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
3
|
Update available: ${t.current} \u2192 ${t.latest}
|
|
4
4
|
Run: npm install -g ${p}
|
|
5
5
|
`;process.stderr.write(e);}export{s as a,y as b,N as c};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {randomBytes}from'crypto';import i from'fs/promises';import g from'path';import b from'js-yaml';async function H(t,n){let e=g.dirname(t);await v(e);let r=g.join(e,`.${g.basename(t)}.${randomBytes(4).toString("hex")}.tmp`);try{await i.writeFile(r,n,"utf-8"),await i.rename(r,t);}catch(o){throw await i.unlink(r).catch(()=>{}),o}}async function R(t){try{let n=await i.readFile(t,"utf-8");return b.load(n)}catch(n){if(d(n))return null;throw n}}async function $(t,n){let e=b.dump(n,{indent:2,lineWidth:120,noRefs:true,sortKeys:false});await H(t,e);}async function j(t){try{let n=await i.readFile(t,"utf-8");return JSON.parse(n)}catch(n){if(d(n))return null;throw n}}async function I(t,n){let e=JSON.stringify(n,null,2)+`
|
|
3
|
+
`;await H(t,e);}var E=4096;async function W(t,n){let e=g.dirname(t);await v(e);let r=JSON.stringify(n)+`
|
|
4
|
+
`;if(Buffer.byteLength(r,"utf-8")>E&&n!==null&&typeof n=="object"){let a=n;if(typeof a.data=="string"&&a.data.length>0){let l=JSON.stringify({...a,data:""})+`
|
|
5
|
+
`,f=Buffer.byteLength(l,"utf-8"),m=E-f-3;if(m>0){let u=a.data.slice(0,m);r=JSON.stringify({...a,data:u+"\u2026"})+`
|
|
6
|
+
`;}}}await(await O(t)).write(r,null,"utf-8");}var w=1e4,c=new Map,p=new Map;async function O(t){let n=c.get(t);if(n){let r=Date.now();return r-n.timerSetAt>w/2&&(clearTimeout(n.idleTimer),n.idleTimer=setTimeout(()=>y(t),w),n.timerSetAt=r),n.handle}let e=p.get(t);return e||(e=i.open(t,"a").then(r=>{if(p.delete(t),c.has(t))return r.close().catch(()=>{}),c.get(t).handle;let o={handle:r,idleTimer:setTimeout(()=>y(t),w),timerSetAt:Date.now()};return c.set(t,o),r}).catch(r=>{throw p.delete(t),r}),p.set(t,e)),e}function y(t){let n=c.get(t);n&&(c.delete(t),clearTimeout(n.idleTimer),n.handle.close().catch(()=>{}));}function Y(t){y(t);}function k(){for(let t of [...c.keys()])y(t);}process.once("exit",k);var z=50*1024*1024;async function C(t){try{let n=await i.stat(t);return n.size>z?(process.stderr.write(`[readJsonl] file too large (${(n.size/1024/1024).toFixed(1)} MB), reading tail only: ${t}
|
|
7
|
+
`),L(t,200)):N(t)}catch(n){if(d(n))return [];throw n}}async function L(t,n){try{let e=await i.stat(t);if(e.size<32768)return (await N(t)).slice(-n);let r=await i.open(t,"r");try{let o=Math.min(e.size,e.size>1048576?131072:65536),s=Math.max(0,e.size-o),a=s,l="";for(let u=0;u<4&&s>=0;u++){a=s;let h=Math.min(o,e.size-s),x=Buffer.alloc(h);await r.read(x,0,h,s),l=x.toString("utf-8")+l;let S=l.split(`
|
|
8
|
+
`).filter(F=>F.trim().length>0);if(S.length>=n+1)return T(S.slice(-n));if(s===0)break;s=Math.max(0,s-o);}let f=l.split(`
|
|
9
|
+
`).filter(u=>u.trim().length>0),m=a>0?f.slice(1):f;return T(m.slice(-n))}finally{await r.close();}}catch(e){if(d(e))return [];throw e}}async function N(t){let e=(await i.readFile(t,"utf-8")).split(`
|
|
10
|
+
`).filter(r=>r.trim().length>0);return T(e)}function T(t){let n=[];for(let e of t){let r=e.trim();if(r)try{n.push(JSON.parse(r));}catch{process.stderr.write(`[readJsonl] skipping corrupt line: ${r.slice(0,200)}
|
|
11
|
+
`);}}return n}var J=new Set;async function v(t){J.has(t)||(await i.mkdir(t,{recursive:true}),J.add(t));}async function K(t){try{return await i.access(t),!0}catch{return false}}async function U(t,n){try{let e=await i.readdir(t);return n?e.filter(r=>r.endsWith(n)):e}catch(e){if(d(e))return [];throw e}}function d(t){return t instanceof Error&&"code"in t&&t.code==="ENOENT"}export{H as a,R as b,$ as c,j as d,I as e,W as f,Y as g,C as h,L as i,v as j,K as k,U as l};
|
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {k as k$1
|
|
2
|
+
import {a as a$3,e}from'./chunk-3AXNSYCM.js';import {k as k$1}from'./chunk-ZMLF5HI5.js';import {a as a$1,b,i}from'./chunk-64WUDYEM.js';import {a as a$2,b as b$1}from'./chunk-IKNBPOQL.js';import R from'path';import {Command}from'commander';function d(o){let t=o.noColor||"NO_COLOR"in process.env||false,i=o.ascii||process.env.TERM==="dumb"||false;return {projectRoot:e(),json:o.json??false,quiet:o.quiet??false,noColor:t,ascii:i}}var l={task:async(o,t)=>{(await import('./task-6Z5P7ODZ.js')).registerTaskCommand(o,t);},agent:async(o,t)=>{(await import('./agent-SI4JF5MV.js')).registerAgentCommand(o,t);},status:async(o,t)=>{(await import('./status-NYHZ7Q5G.js')).registerStatusCommand(o,t);},logs:async(o,t)=>{(await import('./logs-4ISTWUWV.js')).registerLogsCommand(o,t);},config:async(o,t)=>{(await import('./config-OOB7QEKM.js')).registerConfigCommand(o,t);},context:async(o,t)=>{(await import('./context-FXRERFSP.js')).registerContextCommand(o,t);},msg:async(o,t)=>{(await import('./msg-4ELI7Q52.js')).registerMsgCommand(o,t);},goal:async(o,t)=>{(await import('./goal-RNNZYMNR.js')).registerGoalCommand(o,t);},team:async(o,t)=>{(await import('./team-VCJSUDWX.js')).registerTeamCommand(o,t);},org:async(o,t)=>{(await import('./org-KLYK6MMJ.js')).registerOrgCommand(o,t);}},c={run:async(o,t)=>{(await import('./run-NE5E4JPW.js')).registerRunCommand(o,t);},doctor:async(o,t)=>{(await import('./doctor-Q3GHJNZL.js')).registerDoctorCommand(o,t);},tui:async(o,t)=>{(await import('./tui-GH3Z5CO4.js')).registerTuiCommand(o,t);},serve:async(o,t)=>{(await import('./serve-4RT4HERL.js')).registerServeCommand(o,t);}},a=new Command;a.name("orchestry").description("Agents Organizations \u2014 CLI orchestrator for AI agents").version("1.0.9").option("--json","Output as JSON").option("--quiet","Minimal output (IDs only)").option("--no-color","Disable colors").option("--ascii","ASCII-only output (no Unicode)").hook("preAction",async o=>{let t=o.opts();t.ascii&&a$1(true),t.color===false&&b(true);});var x=[["task","Manage tasks"],["agent","Manage agents"],["status","Show orchestrator status"],["logs","View run logs"],["config","Manage configuration"],["context","Shared context store for inter-agent data exchange"],["msg","Inter-agent messaging"],["goal","Manage goals"],["team","Manage teams"],["org","Pre-built AI companies"],["run","Run tasks"],["doctor","Check adapters and dependencies"],["tui","Launch TUI dashboard"],["serve","Headless daemon mode with structured logs"],["init","Initialize project"],["update","Check for updates"]],I=new Set(x.map(([o])=>o));async function k(){a.parseOptions(process.argv);let o=a.opts(),t=process.argv.slice(2).find(e=>!e.startsWith("-")),i$1=t!==void 0&&I.has(t);if((process.argv.includes("--help")||process.argv.includes("-h")||process.argv.includes("--version")||process.argv.includes("-V"))&&!i$1){for(let[e,n]of x)a.command(e).description(n);await a.parseAsync(process.argv);return}if(t==="init"){let{registerInitCommand:e}=await import('./init-D4356W7G.js');e(a);}else if(t==="update"){let{registerUpdateCommand:e}=await import('./update-XGJZFV4H.js');e(a);}let g=process.argv.length<=2;if(g&&!await k$1(R.join(process.cwd(),a$3))){let{runInit:e}=await import('./init-D4356W7G.js');await e();let n=d({json:o.json,quiet:o.quiet,noColor:o.color===false,ascii:o.ascii}),{buildFullContainer:s}=await import('./container-LV3WOPMS.js'),p=await s(n);await c.tui(a,p),await a.parseAsync([...process.argv,"tui"]);return}let u=d({json:o.json,quiet:o.quiet,noColor:o.color===false,ascii:o.ascii}),j=!t||t in c,{buildFullContainer:M,buildLightContainer:A}=await import('./container-LV3WOPMS.js');try{if(j){let e=await M(u),n=t?c[t]:void 0;n?await n(a,e):await Promise.all(Object.values(c).map(p=>p(a,e)));let s=t?l[t]:void 0;s&&await s(a,e);}else {let e=await A(u),n=l[t];n?await n(a,e):await Promise.all(Object.values(l).map(s=>s(a,e)));}}catch(e){if(e instanceof b$1){if(t==="doctor"){let{registerDoctorCommand:n}=await import('./doctor-Q3GHJNZL.js');n(a);}if(t==="init"||t==="doctor"||t==="update"){await a.parseAsync(process.argv);return}i(e.message,e.hint),process.exit(e.exitCode);}throw e}g&&process.argv.push("tui");let m,f=t==="tui"||t==="update"||t==="serve",S=f?Promise.resolve(null):import('./update-check-CZJC7VW6.js').then(e=>(m=e,e.checkForUpdateSWR(a.version()??"0.0.0")));if(await a.parseAsync(process.argv),!f){let e=await S;e&&m&&m.printUpdateNotification(e);}}k().catch(o=>{o instanceof a$2&&(i(o.message,o.hint),process.exit(o.exitCode)),i(o instanceof Error?o.message:String(o)),process.env.ORCHESTRY_DEBUG&&console.error(o),process.exit(1);});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a as a$2}from'./chunk-N4OXN2HW.js';import {c as c$1,b as b$2}from'./chunk-HXOMNULD.js';import {a as a$1,b as b$3}from'./chunk-KR7VDF23.js';import {a}from'./chunk-CHRW4CLD.js';import {b}from'./chunk-3AXNSYCM.js';import {b as b$1,c,j as j$1,d,e,l,f as f$1,h,i as i$1,g as g$1,k as k$1}from'./chunk-ZMLF5HI5.js';import {c as c$2,k,j as j$2,g,f,i}from'./chunk-IKNBPOQL.js';import W from'path';import K,{mkdir}from'fs/promises';import {createReadStream}from'fs';import {homedir}from'os';import {nanoid}from'nanoid';var P={tui:{activity_filter:"all",notifications:{toast:true,bell:false}}};var w=class{indexPath;dir;ext;itemPath;fileFilter;readItemFn;mutex=Promise.resolve();insideMutex=false;constructor(t){this.dir=t.dir,this.ext=t.ext,this.itemPath=t.itemPath,this.indexPath=W.join(t.dir,"_index.json"),this.fileFilter=t.fileFilter??(()=>true),t.readItem?this.readItemFn=t.readItem:t.ext===".yml"?this.readItemFn=e=>b$1(e):this.readItemFn=e=>d(e);}async readIndex(){try{let t=await d(this.indexPath);if(Array.isArray(t))return t}catch{}return this.rebuildIndex()}async rebuildIndex(){await j$1(this.dir);let t=await l(this.dir,this.ext),e=await Promise.all(t.filter(this.fileFilter).map(r=>{let a=r.replace(this.ext,"");return this.readItemFn(this.itemPath(a))})),s=[];for(let r of e)r!=null&&s.push(r);return this.insideMutex?await this.writeIndexUnsafe(s):await this.withMutex(()=>this.writeIndexUnsafe(s)),s}async writeIndex(t){return this.withMutex(()=>this.writeIndexUnsafe(t))}async updateIndex(t){return this.withMutex(async()=>{let e=await this.readIndex(),s=t(e);await this.writeIndexUnsafe(s);})}async writeIndexUnsafe(t){await j$1(this.dir),await e(this.indexPath,t);}withMutex(t){let e,s=new Promise(a=>{e=a;}),r=this.mutex;return this.mutex=s,r.then(async()=>{this.insideMutex=true;try{return await t()}finally{this.insideMutex=false,e();}})}};var C=class{constructor(t){this.paths=t;this.index=new w({dir:t.tasksDir,ext:".yml",itemPath:e=>t.taskPath(e)});}index;async list(t){return (await this.index.readIndex()).filter(r=>r!==null&&(!t?.status||r.status===t.status)&&(!t?.goalId||r.goalId===t.goalId)).sort((r,a)=>{let n=ut(r.status)-ut(a.status);if(n!==0)return n;let i=a.updated_at??"",m=r.updated_at??"";return i<m?-1:i>m?1:0})}async get(t){return b$1(this.paths.taskPath(t))}async save(t){await j$1(this.paths.tasksDir),await c(this.paths.taskPath(t.id),t),await this.index.updateIndex(e=>{let s=e.filter(r=>r.id!==t.id);return s.push(t),s});}async delete(t){try{await K.unlink(this.paths.taskPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(s=>s.id!==t));}};function ut(o){return {in_progress:0,retrying:1,review:2,todo:3,done:4,failed:5,cancelled:6}[o]}var j=class{constructor(t){this.paths=t;this.index=new w({dir:t.agentsDir,ext:".yml",itemPath:e=>t.agentPath(e)});}index;async list(){return this.index.readIndex()}async get(t){return b$1(this.paths.agentPath(t))}async getByName(t){return (await this.list()).find(s=>s.name===t)??null}async save(t){await j$1(this.paths.agentsDir),await c(this.paths.agentPath(t.id),t),await this.index.updateIndex(e=>{let s=e.filter(r=>r.id!==t.id);return s.push(t),s});}async delete(t){try{await K.unlink(this.paths.agentPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(s=>s.id!==t));}};var M=class{constructor(t){this.paths=t;}async save(t){await j$1(this.paths.runsDir),await e(this.paths.runPath(t.id),t);}async get(t){return d(this.paths.runPath(t))}async listAll(){return this.listFiltered(()=>true)}async listForTask(t){return this.listFiltered(e=>e.task_id===t)}async listForAgent(t){return this.listFiltered(e=>e.agent_id===t)}async appendEvent(t,e){await j$1(this.paths.runsDir),await f$1(this.paths.runEventsPath(t),e);}async readEvents(t){return h(this.paths.runEventsPath(t))}async readEventsTail(t,e){return i$1(this.paths.runEventsPath(t),e)}closeRunEvents(t){g$1(this.paths.runEventsPath(t));}async*streamEvents(t,e){let s=this.paths.runEventsPath(t),r=Date.now()+3e4;for(;!e?.aborted&&Date.now()<r&&!await k$1(s);)await new Promise(i=>setTimeout(i,100));if(e?.aborted||Date.now()>=r)return;let a=createReadStream(s),{readLines:n}=await import('./process-manager-33H27MQF.js');try{for await(let i of n(a)){if(e?.aborted)break;if(i.trim())try{yield JSON.parse(i);}catch{process.stderr.write(`[RunStore] skipping corrupt JSONL line: ${i.slice(0,200)}
|
|
3
|
+
`);}}}finally{a.destroy();}}async listFiltered(t){await j$1(this.paths.runsDir);let e=await l(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 g=m.endsWith(".json")?m.slice(0,-5):m;return d(this.paths.runPath(g))}));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 X={version:1,onboardingCompleted:false,running:{},claimed:new Set,retry_queue:[],stats:{total_runs:0,total_tasks_completed:0,total_tasks_failed:0,total_tokens:{input:0,output:0,reasoning:0,total:0,cache_read:0,cache_write:0},total_runtime_ms:0}};var R=class{constructor(t){this.paths=t;}async read(){let t=await d(this.paths.statePath);if(!t)return structuredClone(X);let e=structuredClone(X);return {version:t.version??e.version,pid:t.pid,started_at:t.started_at,onboardingCompleted:typeof t.onboardingCompleted=="boolean"?t.onboardingCompleted:false,running:t.running&&typeof t.running=="object"?t.running:e.running,claimed:Array.isArray(t.claimed)?new Set(t.claimed):new Set(e.claimed),retry_queue:Array.isArray(t.retry_queue)?t.retry_queue:e.retry_queue,stats:{total_runs:t.stats?.total_runs??e.stats.total_runs,total_tasks_completed:t.stats?.total_tasks_completed??e.stats.total_tasks_completed,total_tasks_failed:t.stats?.total_tasks_failed??e.stats.total_tasks_failed,total_tokens:{...e.stats.total_tokens,...t.stats?.total_tokens??{}},total_runtime_ms:t.stats?.total_runtime_ms??e.stats.total_runtime_ms}}}async write(t){let e$1={...t,claimed:Array.from(t.claimed)};await e(this.paths.statePath,e$1);}};var D=class{constructor(t){this.paths=t;}async read(){let t=await b$1(this.paths.configPath);return pt(a$2,t??{})}async write(t){await c(this.paths.configPath,t);}async get(t){let e=await this.read();return Et(e,t)}async set(t,e){let s=await this.read();Ct(s,t,e),await this.write(s);}};function Et(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 Ct(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 pt(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]=pt(a,r):e[s]=r;}return e}var wt=W.join(homedir(),".orchestry"),ht=W.join(wt,"global.yml"),O=class{async read(){let t=await b$1(ht);if(!t)return {...P,tui:{...P.tui,notifications:{...P.tui.notifications}}};let e=t.tui,s=e?.notifications;return {tui:{activity_filter:e?.activity_filter??P.tui.activity_filter,notifications:{toast:typeof s?.toast=="boolean"?s.toast:P.tui.notifications.toast,bell:typeof s?.bell=="boolean"?s.bell:P.tui.notifications.bell}}}}async write(t){await mkdir(wt,{recursive:true}),await c(ht,t);}async set(t,e){let s=await this.read();s.tui[t]=e,await this.write(s);}};var G=class o{constructor(t){this.paths=t;this.index=new w({dir:t.contextDir,ext:".json",itemPath:e=>t.contextPath(e),fileFilter:e=>e!=="_index.json"});}index;async get(t){let e=await d(this.paths.contextPath(t));return e?St(e)?(await this.delete(t),null):e:null}static MAX_TTL_MS=720*60*60*1e3;async set(t,e$1,s){if(s!==void 0&&(!Number.isFinite(s)||s<=0||s>o.MAX_TTL_MS))throw new Error(`TTL must be a positive number up to ${o.MAX_TTL_MS}ms (30 days)`);await j$1(this.paths.contextDir);let r=new Date().toISOString(),a=await d(this.paths.contextPath(t)),n={key:t,value:e$1,created_at:a?.created_at??r,updated_at:r,ttl_ms:s,expires_at:s?new Date(Date.now()+s).toISOString():void 0};await e(this.paths.contextPath(t),n),await this.index.updateIndex(i=>{let m=i.filter(g=>g.key!==t);return m.push(n),m});}async delete(t){try{await K.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(s=>s.key!==t));}async list(){let t=await this.index.readIndex(),e=[],s=[];for(let r of t)St(r)?e.push(r):s.push(r);return e.length>0&&(await Promise.all(e.map(r=>this.deleteFile(r.key))),await this.index.writeIndex(s)),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}async deleteFile(t){try{await K.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};function St(o){return o.expires_at?new Date(o.expires_at).getTime()<Date.now():false}var L=class{constructor(t){this.paths=t;this.index=new w({dir:t.messagesDir,ext:".json",itemPath:e=>t.messagePath(e),fileFilter:e=>e!=="_index.json"});}index;async save(t){await j$1(this.paths.messagesDir),await e(this.paths.messagePath(t.id),t),await this.index.updateIndex(e=>{let s=e.filter(r=>r.id!==t.id);return s.push(t),s});}async get(t){return d(this.paths.messagePath(t))}async list(){return (await this.index.readIndex()).filter(e=>e!==null).sort((e,s)=>e.created_at.localeCompare(s.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$1=await this.get(t);e$1&&(e$1.status="delivered",e$1.delivered_at=new Date().toISOString(),await e(this.paths.messagePath(t),e$1),await this.index.updateIndex(s=>{let r=s.filter(a=>a.id!==t);return r.push(e$1),r}));}async delete(t){try{await K.unlink(this.paths.messagePath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(s=>s.id!==t));}async purgeExpired(){let t=await this.list(),e=Date.now(),s=t.filter(a=>{let n=a.expires_at&&new Date(a.expires_at).getTime()<e,i=a.delivered_at&&e-new Date(a.delivered_at).getTime()>36e5;return n||i}),r=new Set(s.map(a=>a.id));return await Promise.all(s.map(async a=>{try{await K.unlink(this.paths.messagePath(a.id));}catch(n){if(n.code!=="ENOENT")throw n}})),await this.index.updateIndex(a=>a.filter(n=>!r.has(n.id))),s.length}};var B=class{constructor(t){this.paths=t;this.index=new w({dir:t.goalsDir,ext:".yml",itemPath:e=>t.goalPath(e)});}index;async list(t){return (await this.index.readIndex()).filter(r=>r!==null&&(!t?.status||r.status===t.status)).sort((r,a)=>{let n=c$1[r.status]-c$1[a.status];if(n!==0)return n;let i=a.updated_at??"",m=r.updated_at??"";return i<m?-1:i>m?1:0})}async get(t){return b$1(this.paths.goalPath(t))}async save(t){await j$1(this.paths.goalsDir),await c(this.paths.goalPath(t.id),t),await this.index.updateIndex(e=>{let s=e.filter(r=>r.id!==t.id);return s.push(t),s});}async delete(t){try{await K.unlink(this.paths.goalPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(s=>s.id!==t));}};var F=class{constructor(t){this.paths=t;}async save(t){await j$1(this.paths.teamsDir),await c(this.paths.teamPath(t.id),t);}async get(t){return b$1(this.paths.teamPath(t))}async getByName(t){return (await this.list()).find(s=>s.name===t)??null}async list(){await j$1(this.paths.teamsDir);let t=await l(this.paths.teamsDir,".yml");return (await Promise.all(t.map(s=>b$1(this.paths.teamPath(s.replace(".yml","")))))).filter(s=>s!==null)}async delete(t){try{await K.unlink(this.paths.teamPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var N=class{handlers=new Map;wildcardHandlers=new Set;maxListeners=10;warnedTypes=new Set;setMaxListeners(t){this.maxListeners=t;}getMaxListeners(){return this.maxListeners}listenerCount(t){return this.handlers.get(t)?.size??0}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set);let 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 $=class{constructor(t,e,s,r){this.taskStore=t;this.eventBus=e;this.config=s;this.paths=r;}async create(t){if(!t.title.trim())throw new c$2("Task title is required");let e=t.priority??this.config.defaults.task.priority;if(!Number.isInteger(e)||e<1||e>4)throw new c$2("Priority must be an integer between 1 and 4");if(t.depends_on?.length){let 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$2(`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,goalId:t.goalId};if(t.attachments?.length&&this.paths){let a=await this.copyAttachments(r.id,t.attachments);r.attachments=a;}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$1(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$3(e.status))throw new i(t,e.status,"cancelled");return this.updateStatus(t,"cancelled")}async retry(t){let e=await this.get(t);if(e.status!=="failed"&&e.status!=="cancelled")throw new i(t,e.status,"todo");let s=e.status;return e.status="todo",e.attempts=0,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:"todo"}),e}async reject(t,e){let s=await this.get(t);if(s.status!=="review")throw new i(t,s.status,"todo");let 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$2("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$2("Priority must be an integer between 1 and 4");s.priority=e.priority;}if(e.labels!==void 0&&(s.labels=e.labels),e.attachments?.length&&this.paths){let r=await this.copyAttachments(t,e.attachments);s.attachments=[...s.attachments??[],...r];}return s.updated_at=new Date().toISOString(),await this.taskStore.save(s),s}async delete(t){if((await this.get(t)).status==="in_progress")throw new c$2("Cannot delete a running task. Cancel it first.");if(await this.taskStore.delete(t),this.paths){let s=this.paths.taskAttachmentsDir(t);await K.rm(s,{recursive:true,force:true});}}getAttachmentPath(t,e){if(!this.paths)throw new c$2("Paths not configured");return W.join(this.paths.taskAttachmentsDir(t),e)}async copyAttachments(t,e){if(!this.paths)return [];let s=this.paths.taskAttachmentsDir(t);return await j$1(s),await Promise.all(e.map(async a=>{try{await K.access(a);}catch{throw new c$2(`Attachment file not found: ${a}`)}})),await Promise.all(e.map(async a=>{let n=W.basename(a);return await K.copyFile(a,W.join(s,n)),n}))}async incrementAttempts(t){let e=await this.get(t);return e.attempts+=1,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),e}};var U=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$2("Agent name is required");if(await this.agentStore.getByName(t.name))throw new c$2(`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$2("Cannot remove a running agent. Stop it first.");e.status="idle",await this.agentStore.save(e);}await this.agentStore.delete(t);}async update(t,e){let s=await this.get(t);if(e.name!==void 0){if(!e.name.trim())throw new c$2("Agent name cannot be empty");let r=await this.agentStore.getByName(e.name.trim());if(r&&r.id!==t)throw new c$2(`Agent "${e.name}" already exists`);s.name=e.name.trim();}return e.role!==void 0&&(s.role=e.role||void 0),e.model!==void 0&&(s.config.model=e.model||void 0),e.approval_policy!==void 0&&(s.config.approval_policy=e.approval_policy),await this.agentStore.save(s),s}async disable(t){return this.setStatus(t,"disabled")}async enable(t){return this.setStatus(t,"idle")}async setAutonomous(t,e){let s=await this.get(t);return s.autonomous=e,await this.agentStore.save(s),this.eventBus.emit({type:"agent:autonomous_toggled",agentId:t,autonomous:e}),s}async setStatus(t,e){let s=await this.get(t);return s.status=e,await this.agentStore.save(s),s}async updateStats(t,e){let s=await this.get(t);return Object.assign(s.stats,e),await this.agentStore.save(s),s}async findBestAgent(t){let e=await this.agentStore.list(),s=e.filter(n=>n.status==="idle");if(s.length===0)return null;if(t.assignee){let n=e.find(i=>i.id===t.assignee);return n&&n.status==="idle"?n:null}let r=t.labels?.length?t.labels.map(n=>n.toLowerCase()):void 0,a=s.map(n=>{let i=0;if(r&&n.config.skills?.length){let g=new Set(n.config.skills.map(d=>d.toLowerCase()));for(let d of r)g.has(d)&&(i+=50);}if(r&&n.role){let g=n.role.toLowerCase();r.some(d=>g.includes(d))&&(i+=30);}n.status==="idle"&&(i+=20);let m=n.stats.tasks_completed+n.stats.tasks_failed;return m>0&&(i+=Math.round(n.stats.tasks_completed/m*10)),{agent:n,score:i}});return a.sort((n,i)=>i.score-n.score),a[0]?.agent??null}};var J=class{constructor(t,e){this.runStore=t;this.eventBus=e;}async create(t){let e={id:`run_${nanoid(7)}`,task_id:t.taskId,agent_id:t.agentId,attempt:t.attempt,status:"preparing",started_at:new Date().toISOString(),workspace_path:t.workspacePath,prompt:t.prompt};return await this.runStore.save(e),e}async get(t){return this.runStore.get(t)}async start(t,e){let 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){let s=(await this.runStore.listForTask(t)).filter(n=>n.status==="failed").sort((n,i)=>(i.finished_at??"").localeCompare(n.finished_at??""))[0];if(!s)return null;let r=s.error??"Unknown error",a="";try{a=(await this.runStore.readEventsTail(s.id,50)).filter(i=>i.type==="agent_output"||i.type==="error").map(i=>typeof i.data=="string"?i.data:JSON.stringify(i.data)).join(`
|
|
4
|
+
`);}catch{}return {error:r,output:a}}};var H=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$2("Message body is required");let e=t.ttl_ms??864e5;if(e<=0||e>6048e5)throw new c$2(`TTL must be between 1ms and ${6048e5}ms`);if(!await this.agentStore.get(t.from_agent_id)&&t.from_agent_id!=="cli")throw new c$2(`Sender agent not found: ${t.from_agent_id}`);let 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 x=new Set(d.members.map(v=>v.agent_id));i=i.filter(v=>x.has(v.id));}}let g=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(g.map(d=>this.messageStore.save(d)));for(let d of g)n.push(d),this.emitSent(d);}else if(t.channel==="lead"){if(!t.team_id)throw new c$2("team_id is required for lead channel");let i=await this.teamStore.get(t.team_id);if(!i)throw new c$2(`Team not found: ${t.team_id}`);let 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$2("to_agent_id is required for direct messages");if(!await this.agentStore.get(t.to_agent_id))throw new c$2(`Recipient agent not found: ${t.to_agent_id}`);let 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 Nt={active:["paused","achieved","abandoned"],paused:["active","abandoned"],achieved:[],abandoned:[]},q=class{constructor(t,e,s,r,a){this.goalStore=t;this.eventBus=e;this.agentService=s;this.taskService=r;this.contextStore=a;}async create(t){if(!t.title.trim())throw new c$2("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$2(t);return e}async updateStatus(t,e){let s=await this.get(t),r=s.status;if(!Nt[r].includes(e))throw new c$2(`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):b$2(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$2("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 listTasksForGoal(t){return this.taskService?.list({goalId:t})??[]}async getProgressReport(t){return this.contextStore?(await this.contextStore.get(`${t}-progress`))?.value:void 0}async enableAutonomous(t){if(this.agentService)try{await this.agentService.setAutonomous(t,!0);}catch{}}async hasActiveGoalsForAgent(t){return (await this.goalStore.list({status:"active"})).some(s=>s.assignee===t)}async cancelPendingAutonomousTasks(t){if(this.taskService)try{let[e,s]=await Promise.all([this.taskService.list({status:"todo"}),this.taskService.list({status:"retrying"})]),r=[...e,...s].filter(a$1=>a$1.assignee===t&&a$1.labels?.includes(a));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 Pt={auto_claim:true,message_ttl_ms:864e5};var Y=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$2("Team name is required");if(!await this.agentStore.get(t.lead_agent_id))throw new c$2(`Lead agent not found: ${t.lead_agent_id}`);if(await this.teamStore.getByName(t.name.trim()))throw new c$2(`Team "${t.name}" already exists`);let 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$2(`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:{...Pt,...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(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$2(`Agent ${e} is already a member of team ${t}`);if(!await this.agentStore.get(e))throw new c$2(`Agent not found: ${e}`);return 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$2("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$2(`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$2(`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 Ut(o){let t=new b(o.projectRoot),e=new D(t),s=new O,[,r]=await Promise.all([t.requireInit(),e.read()]),a=new C(t),n=new j(t),i=new M(t),m=new R(t),g=new G(t),d=new L(t),x=new B(t),v=new F(t),_=new N,b$1=new $(a,_,r,t),h=new U(n,m,_,r),I=new J(i,_),A=new H(d,n,v,_),E=new q(x,_,h,b$1,g),S=new Y(v,n,a,_);return {context:o,paths:t,config:r,taskStore:a,agentStore:n,runStore:i,stateStore:m,configStore:e,globalConfigStore:s,globalConfig:P,contextStore:g,messageStore:d,goalStore:x,teamStore:v,eventBus:_,taskService:b$1,agentService:h,runService:I,messageService:A,goalService:E,teamService:S}}async function Jt(o){let t=await Ut(o),e=await t.globalConfigStore.read();t.globalConfig=e;let[{ProcessManager:s},{AdapterRegistry:r},{ClaudeAdapter:a},{CodexAdapter:n},{CursorAdapter:i},{ShellAdapter:m},{OpenCodeAdapter:g},{WorkspaceManager:d},{LiquidTemplateEngine:x},{SkillLoader:v},{Orchestrator:_},{DoctorService:b}]=await Promise.all([import('./process-manager-33H27MQF.js'),import('./registry-BO2PPRNG.js'),import('./claude-ADMRIWTR.js'),import('./codex-AZD52UPS.js'),import('./cursor-M3EJ432K.js'),import('./shell-JC2WDWBR.js'),import('./opencode-4G7VAZGY.js'),import('./workspace-manager-VJ4FN5PJ.js'),import('./template-engine-42PKL5KD.js'),import('./skill-loader-IGRIELEM.js'),import('./orchestrator-PSXVHP2L.js'),import('./doctor-service-PB7YBH3F.js')]),h=new s,I=new x,A=new v,E=new d(o.projectRoot,t.paths.root,h),S=new r;S.register(new a(h)),S.register(new n(h)),S.register(new i(h)),S.register(new m(h)),S.register(new g(h));let xt=new b(S,h,o.projectRoot),kt=new _({taskStore:t.taskStore,agentStore:t.agentStore,runStore:t.runStore,stateStore:t.stateStore,adapterRegistry:S,workspaceManager:E,templateEngine:I,processManager:h,eventBus:t.eventBus,taskService:t.taskService,agentService:t.agentService,runService:t.runService,contextStore:t.contextStore,messageService:t.messageService,goalStore:t.goalStore,skillLoader:A,config:t.config,projectRoot:o.projectRoot,lockPath:t.paths.lockPath});return {...t,processManager:h,adapterRegistry:S,workspaceManager:E,templateEngine:I,skillLoader:A,doctorService:xt,orchestrator:kt}}async function Is(o){return Jt(o)}export{Is as buildContainer,Jt as buildFullContainer,Ut as buildLightContainer};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a as a$4}from'./chunk-HMMPM7MF.js';import {b}from'./chunk-3AXNSYCM.js';import'./chunk-ZMLF5HI5.js';import {p,c,q}from'./chunk-64WUDYEM.js';import {a as a$1}from'./chunk-CDFA4IIQ.js';import {a as a$2}from'./chunk-HYPSQAQX.js';import {a as a$3}from'./chunk-LOJ26OVK.js';import'./chunk-FQ5YUP4J.js';import'./chunk-P4JTJBWO.js';import'./chunk-IKNBPOQL.js';import {a}from'./chunk-6MJ7V6VY.js';import i from'chalk';function P(u,t){u.command("doctor").description("Check adapters and dependencies").action(async()=>{let c$1,n,d=false;if(t)c$1=t.doctorService,n=t.paths,d=true;else {let o=new a,e=new a$1;e.register(new a$2(o)),e.register(new a$3(o)),c$1=new a$4(e,o,process.cwd()),n=new b(process.cwd());}console.log(),console.log(` ${p("orch doctor")} \xB7 checking adapters and dependencies`),console.log();let a$5=await c$1.runAll();if(t?.context.json){console.log(JSON.stringify(a$5,null,2));return}for(let o of a$5.checks){let e=o.status==="ok"?i.ansi256(72)(c("done")):o.status==="fail"?i.ansi256(167)(c("failed")):q("\u2014"),l=o.detail?q(` ${o.detail}`):"";console.log(` ${e} ${o.name.padEnd(12)}${l}`);}if(n){let o=await n.isInitialized();if(o&&d){let e=await t.agentService.list(),l=await t.taskService.list();console.log(),console.log(` ${i.ansi256(72)(c("done"))} .orchestry/ ${q(`exists \xB7 ${e.length} agents \xB7 ${l.length} tasks`)}`);}else o||(console.log(),console.log(` ${i.ansi256(167)(c("failed"))} .orchestry/ ${q("not found \u2014 run: orch init")}`));}console.log(),console.log(` ${a$5.adaptersReady} of ${a$5.adaptersTotal} adapters ready`),console.log();});}export{P as registerDoctorCommand};
|
package/dist/index.d.ts
CHANGED
|
@@ -410,6 +410,11 @@ type OrchestratorEvent = {
|
|
|
410
410
|
taskId: string;
|
|
411
411
|
overlappingTaskId: string;
|
|
412
412
|
patterns: string[];
|
|
413
|
+
} | {
|
|
414
|
+
type: 'task:cascade_failed';
|
|
415
|
+
taskId: string;
|
|
416
|
+
failedDependencyId: string;
|
|
417
|
+
reason: string;
|
|
413
418
|
} | {
|
|
414
419
|
type: 'workspace:merge_succeeded';
|
|
415
420
|
taskId: string;
|
|
@@ -1057,6 +1062,35 @@ interface PromptContext {
|
|
|
1057
1062
|
goal?: GoalContext;
|
|
1058
1063
|
}
|
|
1059
1064
|
|
|
1065
|
+
/**
|
|
1066
|
+
* Skill Library loader.
|
|
1067
|
+
*
|
|
1068
|
+
* Resolves agent skill names to Markdown content from the bundled
|
|
1069
|
+
* `skills/library/` directory. Skills containing ':' are Claude Code
|
|
1070
|
+
* MCP skills — handled natively by Claude CLI, skipped here.
|
|
1071
|
+
*
|
|
1072
|
+
* Content is cached in-process for the lifetime of the SkillLoader instance.
|
|
1073
|
+
*/
|
|
1074
|
+
interface ISkillLoader {
|
|
1075
|
+
/**
|
|
1076
|
+
* Load and format library skill content for the given skill names.
|
|
1077
|
+
* MCP skills (containing ':') are silently skipped.
|
|
1078
|
+
* Returns formatted Markdown block or empty string if no library skills resolved.
|
|
1079
|
+
*/
|
|
1080
|
+
loadSkills(skillNames: string[]): Promise<string>;
|
|
1081
|
+
/** List all available library skill names. */
|
|
1082
|
+
listAvailable(): Promise<string[]>;
|
|
1083
|
+
}
|
|
1084
|
+
declare class SkillLoader implements ISkillLoader {
|
|
1085
|
+
private readonly cache;
|
|
1086
|
+
private readonly libraryDirPromise;
|
|
1087
|
+
private availableCache;
|
|
1088
|
+
constructor(libraryDir?: string);
|
|
1089
|
+
loadSkills(skillNames: string[]): Promise<string>;
|
|
1090
|
+
listAvailable(): Promise<string[]>;
|
|
1091
|
+
private loadOne;
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1060
1094
|
interface OrchestratorDeps {
|
|
1061
1095
|
taskStore: ITaskStore;
|
|
1062
1096
|
agentStore: IAgentStore;
|
|
@@ -1073,6 +1107,7 @@ interface OrchestratorDeps {
|
|
|
1073
1107
|
contextStore?: IContextStore;
|
|
1074
1108
|
messageService?: MessageService;
|
|
1075
1109
|
goalStore?: IGoalStore;
|
|
1110
|
+
skillLoader?: ISkillLoader;
|
|
1076
1111
|
config: OrchestratorConfig;
|
|
1077
1112
|
projectRoot: string;
|
|
1078
1113
|
lockPath: string;
|
|
@@ -1198,6 +1233,13 @@ declare class Orchestrator {
|
|
|
1198
1233
|
* Dispatch all dispatchable tasks up to max_concurrent_agents.
|
|
1199
1234
|
*/
|
|
1200
1235
|
private dispatchAll;
|
|
1236
|
+
/** Dedup + bounded push onto the retry queue. */
|
|
1237
|
+
private enqueueRetry;
|
|
1238
|
+
/**
|
|
1239
|
+
* When a task permanently fails, cascade-fail all tasks that depend on it
|
|
1240
|
+
* (directly or transitively). Prevents dependent tasks from hanging as TODO forever.
|
|
1241
|
+
*/
|
|
1242
|
+
private cascadeFailDependents;
|
|
1201
1243
|
/**
|
|
1202
1244
|
* Dispatch a single task: claim → assign → execute.
|
|
1203
1245
|
*/
|
|
@@ -1465,6 +1507,7 @@ interface Container extends LightContainer {
|
|
|
1465
1507
|
adapterRegistry: AdapterRegistry;
|
|
1466
1508
|
workspaceManager: IWorkspaceManager;
|
|
1467
1509
|
templateEngine: ITemplateEngine;
|
|
1510
|
+
skillLoader: ISkillLoader;
|
|
1468
1511
|
doctorService: DoctorService;
|
|
1469
1512
|
orchestrator: Orchestrator;
|
|
1470
1513
|
}
|
|
@@ -1485,4 +1528,4 @@ declare function buildFullContainer(context: CliContext): Promise<Container>;
|
|
|
1485
1528
|
*/
|
|
1486
1529
|
declare function buildContainer(context: CliContext): Promise<Container>;
|
|
1487
1530
|
|
|
1488
|
-
export { type AdapterErrorHint, AdapterErrorKind, AdapterRegistry, type AdapterTestResult, type Agent, type AgentConfig, type AgentEvent, type AgentLastError, AgentNotFoundError, AgentService, type AgentStats, type AgentStatus, type ApprovalPolicy, type ClipboardContentType, type ClipboardImage, type Container, type CreateAgentInput, type CreateTaskInput, ERROR_HINTS, 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, classifyAdapterError, createTokenUsage, detectClipboardType, getClipboardImage, isBlocked, isClipboardToolAvailable, isDispatchable, isTerminal, resolveFailureStatus };
|
|
1531
|
+
export { type AdapterErrorHint, AdapterErrorKind, AdapterRegistry, type AdapterTestResult, type Agent, type AgentConfig, type AgentEvent, type AgentLastError, AgentNotFoundError, AgentService, type AgentStats, type AgentStatus, type ApprovalPolicy, type ClipboardContentType, type ClipboardImage, type Container, type CreateAgentInput, type CreateTaskInput, ERROR_HINTS, EventBus, type EventPayload, type ExecuteParams, type IAgentAdapter, type ISkillLoader, 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, SkillLoader, type Task, TaskNotFoundError, type TaskProof, TaskService, type TaskStatus, type TokenUsage, WorkspaceError, type WorkspaceMode, buildContainer, buildFullContainer, buildLightContainer, canTransition, classifyAdapterError, createTokenUsage, detectClipboardType, getClipboardImage, isBlocked, isClipboardToolAvailable, isDispatchable, isTerminal, resolveFailureStatus };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { canTransition, isTerminal } from './chunk-
|
|
3
|
-
export { Orchestrator, canTransition, isBlocked, isDispatchable, isTerminal, resolveFailureStatus } from './chunk-
|
|
1
|
+
import { Paths } from './chunk-J7ITYXE6.js';
|
|
2
|
+
import { canTransition, isTerminal } from './chunk-5YSW77VI.js';
|
|
3
|
+
export { Orchestrator, canTransition, isBlocked, isDispatchable, isTerminal, resolveFailureStatus } from './chunk-5YSW77VI.js';
|
|
4
4
|
import { AUTONOMOUS_LABEL } from './chunk-VG4465AG.js';
|
|
5
5
|
export { AdapterRegistry } from './chunk-6DWHQPTE.js';
|
|
6
|
+
export { SkillLoader } from './chunk-U2JVMD2G.js';
|
|
7
|
+
import { ensureDir, readYaml, writeYaml, readJson, writeJson, listFiles, appendJsonl, readJsonl, readJsonlTail, closeAppendHandle, pathExists } from './chunk-W3J7CURM.js';
|
|
6
8
|
export { createTokenUsage } from './chunk-RHFRHCN5.js';
|
|
7
9
|
import { InvalidArgumentsError, TaskNotFoundError, InvalidTransitionError, AgentNotFoundError, OrchestryError, TeamNotFoundError, GoalNotFoundError } from './chunk-NLQAJ7TW.js';
|
|
8
10
|
export { AdapterErrorKind, AgentNotFoundError, ERROR_HINTS, NotInitializedError, OrchestryError, TaskNotFoundError, WorkspaceError, classifyAdapterError } from './chunk-NLQAJ7TW.js';
|
|
@@ -1936,6 +1938,7 @@ async function buildFullContainer(context) {
|
|
|
1936
1938
|
{ OpenCodeAdapter },
|
|
1937
1939
|
{ WorkspaceManager },
|
|
1938
1940
|
{ LiquidTemplateEngine },
|
|
1941
|
+
{ SkillLoader: SkillLoader2 },
|
|
1939
1942
|
{ Orchestrator: Orchestrator2 },
|
|
1940
1943
|
{ DoctorService }
|
|
1941
1944
|
] = await Promise.all([
|
|
@@ -1946,13 +1949,15 @@ async function buildFullContainer(context) {
|
|
|
1946
1949
|
import('./cursor-TKV5FFCN.js'),
|
|
1947
1950
|
import('./shell-PMLIRG3N.js'),
|
|
1948
1951
|
import('./opencode-YWT3M4NX.js'),
|
|
1949
|
-
import('./workspace-manager-
|
|
1952
|
+
import('./workspace-manager-RH24FSNT.js'),
|
|
1950
1953
|
import('./template-engine-5ZKVJMYA.js'),
|
|
1951
|
-
import('./
|
|
1954
|
+
import('./skill-loader-RHCFIK74.js'),
|
|
1955
|
+
import('./orchestrator-WLWIAFXH.js'),
|
|
1952
1956
|
import('./doctor-service-F2SXDWHS.js')
|
|
1953
1957
|
]);
|
|
1954
1958
|
const processManager = new ProcessManager();
|
|
1955
1959
|
const templateEngine = new LiquidTemplateEngine();
|
|
1960
|
+
const skillLoader = new SkillLoader2();
|
|
1956
1961
|
const workspaceManager = new WorkspaceManager(
|
|
1957
1962
|
context.projectRoot,
|
|
1958
1963
|
light.paths.root,
|
|
@@ -1981,6 +1986,7 @@ async function buildFullContainer(context) {
|
|
|
1981
1986
|
contextStore: light.contextStore,
|
|
1982
1987
|
messageService: light.messageService,
|
|
1983
1988
|
goalStore: light.goalStore,
|
|
1989
|
+
skillLoader,
|
|
1984
1990
|
config: light.config,
|
|
1985
1991
|
projectRoot: context.projectRoot,
|
|
1986
1992
|
lockPath: light.paths.lockPath
|
|
@@ -1991,6 +1997,7 @@ async function buildFullContainer(context) {
|
|
|
1991
1997
|
adapterRegistry,
|
|
1992
1998
|
workspaceManager,
|
|
1993
1999
|
templateEngine,
|
|
2000
|
+
skillLoader,
|
|
1994
2001
|
doctorService,
|
|
1995
2002
|
orchestrator
|
|
1996
2003
|
};
|