@oxgeneral/orch 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/App-TW35IULR.js +18 -0
  2. package/dist/agent-FRQKL7YI.js +9 -0
  3. package/dist/{orchestrator-VGYKSOZJ.js → chunk-2UC4SVJB.js} +236 -71
  4. package/dist/chunk-2UC4SVJB.js.map +1 -0
  5. package/dist/chunk-5AJ4LYO5.js +8 -0
  6. package/dist/{chunk-45K2XID7.js → chunk-6DWHQPTE.js} +2 -1
  7. package/dist/chunk-6DWHQPTE.js.map +1 -0
  8. package/dist/{chunk-POUC4CPC.js → chunk-6MJ7V6VY.js} +2 -2
  9. package/dist/{chunk-HNKJ4IF7.js → chunk-B4JQM4NU.js} +34 -10
  10. package/dist/chunk-B4JQM4NU.js.map +1 -0
  11. package/dist/{chunk-6HENRUYZ.js → chunk-CDFA4IIQ.js} +2 -2
  12. package/dist/chunk-CHRW4CLD.js +2 -0
  13. package/dist/{chunk-ZU6AY2VU.js → chunk-GZ2Q56YZ.js} +2 -2
  14. package/dist/chunk-HMMPM7MF.js +3 -0
  15. package/dist/{chunk-AELEEEV3.js → chunk-HSBYJ5C5.js} +27 -7
  16. package/dist/chunk-HXOMNULD.js +2 -0
  17. package/dist/{chunk-O5AO5QIR.js → chunk-IQXRQBUK.js} +9 -2
  18. package/dist/chunk-IQXRQBUK.js.map +1 -0
  19. package/dist/chunk-L26TK7Y5.js +2 -0
  20. package/dist/chunk-L3FYR45M.js +2 -0
  21. package/dist/chunk-LXNRCJ22.js +2 -0
  22. package/dist/{chunk-TX7WOFCW.js → chunk-MGFMVPRD.js} +4 -7
  23. package/dist/chunk-MGFMVPRD.js.map +1 -0
  24. package/dist/chunk-MNXU3KCD.js +2 -0
  25. package/dist/{chunk-CHIP7O6V.js → chunk-O2MSGW3V.js} +3 -1
  26. package/dist/chunk-O2MSGW3V.js.map +1 -0
  27. package/dist/chunk-PJ5DKXGR.js +2 -0
  28. package/dist/{chunk-VTA74YWX.js → chunk-QEEM67OA.js} +11 -17
  29. package/dist/chunk-QEEM67OA.js.map +1 -0
  30. package/dist/chunk-UMZEA3JT.js +5 -0
  31. package/dist/{shell-OGTSH4RJ.js → chunk-UW6GUUE6.js} +3 -3
  32. package/dist/chunk-XDVMX2FO.js +8 -0
  33. package/dist/chunk-XDVMX2FO.js.map +1 -0
  34. package/dist/chunk-ZA5Z33GO.js +11 -0
  35. package/dist/claude-E36EGXUV.js +2 -0
  36. package/dist/{chunk-IRN2U2NE.js → claude-RIB3RQS5.js} +5 -2
  37. package/dist/claude-RIB3RQS5.js.map +1 -0
  38. package/dist/cli.js +1 -199
  39. package/dist/clipboard-service-PDTSZIR5.js +25 -0
  40. package/dist/codex-OTZKVESD.js +2 -0
  41. package/dist/{codex-U7LTJTX6.js → codex-VBUSA2GJ.js} +5 -3
  42. package/dist/codex-VBUSA2GJ.js.map +1 -0
  43. package/dist/config-CCSS2P7R.js +2 -0
  44. package/dist/container-OIXLFSX2.js +6 -0
  45. package/dist/context-GSMQHQES.js +7 -0
  46. package/dist/cursor-3DJA6LWS.js +2 -0
  47. package/dist/{cursor-3DI5GKRF.js → cursor-4QIOTDBW.js} +5 -3
  48. package/dist/cursor-4QIOTDBW.js.map +1 -0
  49. package/dist/doctor-KBK5JZBZ.js +2 -0
  50. package/dist/doctor-service-F2SXDWHS.js +91 -0
  51. package/dist/doctor-service-F2SXDWHS.js.map +1 -0
  52. package/dist/doctor-service-PB7YBH3F.js +2 -0
  53. package/dist/goal-RFKFPR7M.js +8 -0
  54. package/dist/index.d.ts +124 -46
  55. package/dist/index.js +1817 -5
  56. package/dist/index.js.map +1 -1
  57. package/dist/init-WRDFAFS2.js +53 -0
  58. package/dist/logs-5QHJWMEG.js +12 -0
  59. package/dist/msg-4SCLBO4K.js +9 -0
  60. package/dist/orchestrator-FGGXK3N3.js +5 -0
  61. package/dist/{orchestrator-TAFBYQQ5.js.map → orchestrator-FGGXK3N3.js.map} +1 -1
  62. package/dist/orchestrator-R7IWZUT6.js +13 -0
  63. package/dist/process-manager-33H27MQF.js +2 -0
  64. package/dist/process-manager-A36Y7LHP.js +3 -0
  65. package/dist/{process-manager-TLZOTO4Y.js.map → process-manager-A36Y7LHP.js.map} +1 -1
  66. package/dist/registry-BO2PPRNG.js +2 -0
  67. package/dist/registry-JXXRLJ5J.js +3 -0
  68. package/dist/{registry-UQAHK77P.js.map → registry-JXXRLJ5J.js.map} +1 -1
  69. package/dist/run-HSHRELOP.js +3 -0
  70. package/dist/shell-EOJBDWTH.js +2 -0
  71. package/dist/{chunk-CIIE6LNG.js → shell-IH2MMTVP.js} +3 -2
  72. package/dist/shell-IH2MMTVP.js.map +1 -0
  73. package/dist/status-DLBNWSWM.js +2 -0
  74. package/dist/task-J6ZN7ALI.js +20 -0
  75. package/dist/team-MSIBKOQC.js +4 -0
  76. package/dist/template-engine-MFL5B677.js +3 -0
  77. package/dist/{template-engine-322SCRR6.js.map → template-engine-MFL5B677.js.map} +1 -1
  78. package/dist/template-engine-ONIDVD4F.js +2 -0
  79. package/dist/tui-G4XUFAIP.js +2 -0
  80. package/dist/update-PC2ENCKU.js +2 -0
  81. package/dist/update-check-HGMBDYHL.js +2 -0
  82. package/dist/workspace-manager-KOOYTO7E.js +3 -0
  83. package/dist/{workspace-manager-47KI7B27.js → workspace-manager-T6AXG7XL.js} +40 -3
  84. package/dist/workspace-manager-T6AXG7XL.js.map +1 -0
  85. package/package.json +2 -1
  86. package/readme.md +5 -4
  87. package/scripts/benchmark.ts +304 -0
  88. package/dist/App-KDZSTAMR.js +0 -4864
  89. package/dist/agent-V5M2C3OC.js +0 -157
  90. package/dist/chunk-2B32FPEB.js +0 -11
  91. package/dist/chunk-2B32FPEB.js.map +0 -1
  92. package/dist/chunk-33QNTNR6.js +0 -46
  93. package/dist/chunk-6GFVB6EK.js +0 -101
  94. package/dist/chunk-6HENRUYZ.js.map +0 -1
  95. package/dist/chunk-AELEEEV3.js.map +0 -1
  96. package/dist/chunk-E3TCKHU6.js +0 -13
  97. package/dist/chunk-E3TCKHU6.js.map +0 -1
  98. package/dist/chunk-ED47GL3F.js +0 -29
  99. package/dist/chunk-HXYAZGLP.js +0 -15
  100. package/dist/chunk-I5WEMARW.js +0 -166
  101. package/dist/chunk-IZYSGYXG.js +0 -2
  102. package/dist/chunk-IZYSGYXG.js.map +0 -1
  103. package/dist/chunk-P6ATSXGL.js +0 -107
  104. package/dist/chunk-PBFE5V3G.js +0 -2
  105. package/dist/chunk-PBFE5V3G.js.map +0 -1
  106. package/dist/chunk-PNE6LQRF.js +0 -5
  107. package/dist/chunk-POUC4CPC.js.map +0 -1
  108. package/dist/chunk-XI4TU6VU.js +0 -50
  109. package/dist/chunk-ZU6AY2VU.js.map +0 -1
  110. package/dist/claude-GH6P2DC5.js +0 -4
  111. package/dist/claude-S47YTIHU.js +0 -2
  112. package/dist/claude-S47YTIHU.js.map +0 -1
  113. package/dist/codex-2CH57B7G.js +0 -2
  114. package/dist/codex-2CH57B7G.js.map +0 -1
  115. package/dist/config-LJFM55LN.js +0 -75
  116. package/dist/container-JV7TAUP5.js +0 -1532
  117. package/dist/context-EPSDCJTU.js +0 -83
  118. package/dist/cursor-QFUNKPCQ.js +0 -2
  119. package/dist/cursor-QFUNKPCQ.js.map +0 -1
  120. package/dist/doctor-IO4PV4D6.js +0 -67
  121. package/dist/doctor-service-A34DHPKI.js +0 -2
  122. package/dist/doctor-service-NTWBWOM2.js +0 -2
  123. package/dist/doctor-service-NTWBWOM2.js.map +0 -1
  124. package/dist/goal-I56QP7HS.js +0 -110
  125. package/dist/init-BE5VKWOM.js +0 -149
  126. package/dist/logs-IAUAS5TX.js +0 -207
  127. package/dist/msg-SQWQLJP6.js +0 -95
  128. package/dist/orchestrator-TAFBYQQ5.js +0 -2
  129. package/dist/process-manager-HUVNAPQV.js +0 -2
  130. package/dist/process-manager-TLZOTO4Y.js +0 -2
  131. package/dist/registry-PQWRVNF2.js +0 -2
  132. package/dist/registry-UQAHK77P.js +0 -2
  133. package/dist/run-PSZURVVL.js +0 -95
  134. package/dist/shell-5ZNXFGXV.js +0 -3
  135. package/dist/shell-OGTSH4RJ.js.map +0 -1
  136. package/dist/status-DTF7D3DV.js +0 -56
  137. package/dist/task-5OJTXW27.js +0 -209
  138. package/dist/team-AISPLEJB.js +0 -97
  139. package/dist/template-engine-322SCRR6.js +0 -2
  140. package/dist/template-engine-3CDRZNMJ.js +0 -3
  141. package/dist/tui-XDJE3IUA.js +0 -225
  142. package/dist/update-72GZMF65.js +0 -64
  143. package/dist/update-check-4RV7Z6WT.js +0 -2
  144. package/dist/workspace-manager-7M46ESUL.js +0 -2
  145. package/dist/workspace-manager-7M46ESUL.js.map +0 -1
@@ -1,95 +0,0 @@
1
- #!/usr/bin/env node
2
- import { printSuccess, dim, formatDurationSince, printTable } from './chunk-I5WEMARW.js';
3
-
4
- // src/cli/commands/msg.ts
5
- function registerMsgCommand(program, container) {
6
- const msg = program.command("msg").description("Inter-agent messaging");
7
- msg.command("send <to-agent-id> <body>").description("Send a direct message to an agent").option("-s, --subject <subject>", "Message subject").option("--from <agent-id>", "Sender agent ID (default: cli)").option("--ttl <ms>", "TTL in milliseconds").option("--reply-to <msg-id>", "Reply to a message").action(async (toAgentId, body, opts) => {
8
- await container.paths.requireInit();
9
- const messages = await container.messageService.send({
10
- channel: "direct",
11
- from_agent_id: opts.from ?? "cli",
12
- to_agent_id: toAgentId,
13
- subject: opts.subject ?? "",
14
- body,
15
- ttl_ms: opts.ttl ? parseInt(opts.ttl, 10) : void 0,
16
- reply_to: opts.replyTo
17
- });
18
- if (container.context.json) {
19
- console.log(JSON.stringify(messages, null, 2));
20
- } else if (container.context.quiet) {
21
- console.log(messages[0]?.id);
22
- } else {
23
- printSuccess(`Message sent: ${messages[0]?.id} \u2192 ${toAgentId}`);
24
- }
25
- });
26
- msg.command("broadcast <body>").description("Broadcast a message to all agents (or team members)").option("-s, --subject <subject>", "Message subject").option("--from <agent-id>", "Sender agent ID (default: cli)").option("--team <team-id>", "Limit broadcast to team members").option("--ttl <ms>", "TTL in milliseconds").action(async (body, opts) => {
27
- await container.paths.requireInit();
28
- const messages = await container.messageService.send({
29
- channel: "broadcast",
30
- from_agent_id: opts.from ?? "cli",
31
- subject: opts.subject ?? "",
32
- body,
33
- ttl_ms: opts.ttl ? parseInt(opts.ttl, 10) : void 0,
34
- team_id: opts.team
35
- });
36
- if (container.context.json) {
37
- console.log(JSON.stringify(messages, null, 2));
38
- } else if (container.context.quiet) {
39
- console.log(messages.map((m) => m.id).join("\n"));
40
- } else {
41
- printSuccess(`Broadcast sent to ${messages.length} agent(s)`);
42
- }
43
- });
44
- msg.command("inbox <agent-id>").description("Show pending messages for an agent").action(async (agentId) => {
45
- await container.paths.requireInit();
46
- const pending = await container.messageService.listPendingForAgent(agentId);
47
- if (container.context.json) {
48
- console.log(JSON.stringify(pending, null, 2));
49
- return;
50
- }
51
- if (pending.length === 0) {
52
- console.log(dim("\n No pending messages.\n"));
53
- return;
54
- }
55
- console.log();
56
- for (const m of pending) {
57
- console.log(` ${dim(m.id)} from ${m.from_agent_id}${m.subject ? ` \u2014 ${m.subject}` : ""}`);
58
- console.log(` ${m.body}`);
59
- console.log();
60
- }
61
- });
62
- msg.command("list").description("List all messages").option("--agent <agent-id>", "Filter by agent (sent or received)").action(async (opts) => {
63
- await container.paths.requireInit();
64
- let messages;
65
- if (opts.agent) {
66
- messages = await container.messageService.listForAgent(opts.agent);
67
- } else {
68
- messages = await container.messageService.listAll();
69
- }
70
- if (container.context.json) {
71
- console.log(JSON.stringify(messages, null, 2));
72
- return;
73
- }
74
- if (messages.length === 0) {
75
- console.log(dim("\n No messages.\n"));
76
- return;
77
- }
78
- const headers = ["ID", "FROM", "TO", "CHANNEL", "STATUS", "SENT"];
79
- const rows = messages.map((m) => [
80
- m.id,
81
- m.from_agent_id,
82
- m.to_agent_id ?? "*",
83
- m.channel,
84
- m.status,
85
- formatDurationSince(m.created_at)
86
- ]);
87
- console.log();
88
- printTable(headers, rows);
89
- console.log(`
90
- ${messages.length} message(s)
91
- `);
92
- });
93
- }
94
-
95
- export { registerMsgCommand };
@@ -1,2 +0,0 @@
1
- export{f as Orchestrator}from'./chunk-E3TCKHU6.js';import'./chunk-ZU6AY2VU.js';import'./chunk-AELEEEV3.js';//# sourceMappingURL=orchestrator-TAFBYQQ5.js.map
2
- //# sourceMappingURL=orchestrator-TAFBYQQ5.js.map
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export { ProcessManager, readLines } from './chunk-CHIP7O6V.js';
@@ -1,2 +0,0 @@
1
- export{a as ProcessManager,b as readLines}from'./chunk-POUC4CPC.js';//# sourceMappingURL=process-manager-TLZOTO4Y.js.map
2
- //# sourceMappingURL=process-manager-TLZOTO4Y.js.map
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export { AdapterRegistry } from './chunk-45K2XID7.js';
@@ -1,2 +0,0 @@
1
- export{a as AdapterRegistry}from'./chunk-6HENRUYZ.js';//# sourceMappingURL=registry-UQAHK77P.js.map
2
- //# sourceMappingURL=registry-UQAHK77P.js.map
@@ -1,95 +0,0 @@
1
- #!/usr/bin/env node
2
- import { printError, amber, printSuccess, dim, getIcon } from './chunk-I5WEMARW.js';
3
-
4
- // src/cli/commands/run.ts
5
- function registerRunCommand(program, container) {
6
- program.command("run [task-id]").description("Run tasks").option("--all", "Run all todo tasks").option("--watch", "Watch mode: continuous orchestration").action(async (taskId, opts) => {
7
- await container.paths.requireInit();
8
- if (opts.watch) {
9
- await runWatch(container);
10
- } else if (opts.all) {
11
- await runAll(container);
12
- } else if (taskId) {
13
- await runSingle(container, taskId);
14
- } else {
15
- printError("Specify a task ID, --all, or --watch");
16
- process.exit(2);
17
- }
18
- });
19
- }
20
- async function runSingle(container, taskId) {
21
- const task = await container.taskService.get(taskId);
22
- console.log();
23
- console.log(` ${amber("orch")} \xB7 running ${taskId} "${task.title}"`);
24
- const unsub = container.eventBus.onAny((event) => {
25
- const time = (/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", { hour12: false, hour: "2-digit", minute: "2-digit", second: "2-digit" });
26
- switch (event.type) {
27
- case "agent:output":
28
- console.log(` ${dim(time)} ${getIcon("agentAction")} ${typeof event.data === "string" ? event.data.slice(0, 80) : ""}`);
29
- break;
30
- case "agent:file_changed":
31
- console.log(` ${dim(time)} ${getIcon("agentAction")} Modified ${event.path}`);
32
- break;
33
- case "agent:error":
34
- console.log(` ${dim(time)} ${getIcon("failed")} ${event.error}`);
35
- break;
36
- case "agent:completed":
37
- if (event.success) {
38
- printSuccess("Done");
39
- } else {
40
- printError("Failed");
41
- }
42
- break;
43
- }
44
- });
45
- try {
46
- await container.orchestrator.runTask(taskId);
47
- } finally {
48
- unsub();
49
- }
50
- console.log();
51
- }
52
- async function runAll(container) {
53
- console.log();
54
- console.log(` ${amber("orch")} \xB7 running all todo tasks`);
55
- console.log();
56
- await container.orchestrator.runAll();
57
- }
58
- async function runWatch(container) {
59
- console.log(`${amber("orch")} \xB7 watching \xB7 poll interval ${container.config.scheduling.poll_interval_ms / 1e3}s`);
60
- console.log("\u2501".repeat(43));
61
- console.log();
62
- container.eventBus.onAny((event) => {
63
- const time = (/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", { hour12: false, hour: "2-digit", minute: "2-digit" });
64
- switch (event.type) {
65
- case "agent:output": {
66
- const data = typeof event.data === "string" ? event.data.slice(0, 60) : "";
67
- console.log(`${dim(time)} ${getIcon("agentAction")} ${data}`);
68
- break;
69
- }
70
- case "agent:completed":
71
- if (event.success) {
72
- console.log(`${dim(time)} ${getIcon("done")} DONE ${event.runId}`);
73
- } else {
74
- console.log(`${dim(time)} ${getIcon("failed")} FAIL ${event.runId}`);
75
- }
76
- break;
77
- case "run:retry":
78
- console.log(`${dim(time)} ${getIcon("retrying")} RETRY attempt ${event.attempt} \xB7 next in ${Math.round(event.delay_ms / 1e3)}s`);
79
- break;
80
- case "orchestrator:tick":
81
- process.stdout.write(`\r${amber("orch")} \xB7 watching \xB7 ${event.running} running \xB7 ${event.queued} queued `);
82
- break;
83
- case "orchestrator:stall_detected":
84
- console.log(`${dim(time)} ${getIcon("warning")} STALL ${event.runId}`);
85
- break;
86
- case "orchestrator:shutdown":
87
- console.log(`
88
- ${dim("Shutting down...")}`);
89
- break;
90
- }
91
- });
92
- await container.orchestrator.startWatch();
93
- }
94
-
95
- export { registerRunCommand };
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export { ShellAdapter } from './chunk-CIIE6LNG.js';
3
- import './chunk-CHIP7O6V.js';
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/infrastructure/adapters/event-buffer.ts","../src/infrastructure/adapters/shell.ts"],"names":["deferred","resolve","r","EventBuffer","capacity","event","dr","sr","execFileAsync","promisify","execFile","ShellAdapter","processManager","stdout","params","command","errorGen","proc","pid","signal","generateEvents","buffer","onAbort","stdoutPromise","line","readLines","stderrPromise","reject","code"],"mappings":"6GAkBA,SAASA,CAAAA,EAA2B,CAClC,IAAIC,CAAAA,CAEJ,OAAO,CAAE,OAAA,CADO,IAAI,OAAA,CAAYC,CAAAA,EAAM,CAAED,CAAAA,CAAUC,EAAG,CAAC,CAAA,CACpC,OAAA,CAAAD,CAAQ,CAC5B,CAEO,IAAME,CAAAA,CAAN,KAAkB,CACf,GAAA,CACA,IAAA,CAAO,CAAA,CACP,IAAA,CAAO,EACP,KAAA,CAAQ,CAAA,CACC,QAAA,CAGT,SAAA,CAAmC,KAEnC,UAAA,CAAoC,IAAA,CAEpC,MAAA,CAAS,KAAA,CAEjB,WAAA,CAAYC,CAAAA,CAAW,IAAA,CAAkB,CACvC,KAAK,QAAA,CAAWA,CAAAA,CAChB,IAAA,CAAK,GAAA,CAAM,IAAI,KAAA,CAAMA,CAAQ,EAC/B,CAGA,IAAI,IAAA,EAAe,CACjB,OAAO,IAAA,CAAK,KACd,CAEA,IAAI,QAAkB,CACpB,OAAO,IAAA,CAAK,KAAA,EAAS,KAAK,QAC5B,CAMA,MAAM,IAAA,CAAKC,EAAkC,CAC3C,KAAO,IAAA,CAAK,MAAA,EAAU,CAAC,IAAA,CAAK,MAAA,EACrB,IAAA,CAAK,aACR,IAAA,CAAK,UAAA,CAAaL,CAAAA,EAAe,CAAA,CAEnC,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAExB,GAAI,CAAA,IAAA,CAAK,MAAA,GAET,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAAIK,CAAAA,CACtB,KAAK,IAAA,CAAA,CAAQ,IAAA,CAAK,IAAA,CAAO,CAAA,EAAK,KAAK,QAAA,CACnC,IAAA,CAAK,KAAA,EAAA,CAGD,IAAA,CAAK,WAAW,CAClB,IAAMC,CAAAA,CAAK,IAAA,CAAK,SAAA,CAChB,IAAA,CAAK,SAAA,CAAY,IAAA,CACjBA,EAAG,OAAA,GACL,CACF,CAMA,MAAM,IAAA,EAAwC,CAC5C,KAAO,IAAA,CAAK,QAAU,CAAA,EAAG,CACvB,GAAI,IAAA,CAAK,MAAA,CAAQ,OACZ,IAAA,CAAK,SAAA,GACR,KAAK,SAAA,CAAYN,CAAAA,EAAe,CAAA,CAElC,MAAM,KAAK,SAAA,CAAU,QACvB,CAEA,IAAMK,EAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,CAMhC,GALA,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,CAAI,MAAA,CACtB,IAAA,CAAK,IAAA,CAAA,CAAQ,IAAA,CAAK,IAAA,CAAO,CAAA,EAAK,KAAK,QAAA,CACnC,IAAA,CAAK,KAAA,EAAA,CAGD,IAAA,CAAK,UAAA,CAAY,CACnB,IAAME,CAAAA,CAAK,KAAK,UAAA,CAChB,IAAA,CAAK,UAAA,CAAa,IAAA,CAClBA,EAAG,OAAA,GACL,CAEA,OAAOF,CACT,CAMA,KAAA,EAAc,CAEZ,GADA,IAAA,CAAK,MAAA,CAAS,IAAA,CACV,IAAA,CAAK,UAAW,CAClB,IAAMC,CAAAA,CAAK,IAAA,CAAK,UAChB,IAAA,CAAK,SAAA,CAAY,IAAA,CACjBA,CAAAA,CAAG,UACL,CACA,GAAI,IAAA,CAAK,UAAA,CAAY,CACnB,IAAMC,CAAAA,CAAK,KAAK,UAAA,CAChB,IAAA,CAAK,UAAA,CAAa,IAAA,CAClBA,EAAG,OAAA,GACL,CACF,CAEA,IAAI,QAAA,EAAoB,CACtB,OAAO,IAAA,CAAK,MACd,CAKA,OAAQ,MAAA,CAAO,aAAa,CAAA,EAAgC,CAC1D,OAAa,CACX,IAAMF,CAAAA,CAAQ,MAAM,IAAA,CAAK,MAAK,CAC9B,GAAIA,CAAAA,GAAU,MAAA,CAAW,OACzB,MAAMA,EACR,CACF,CACF,CAAA,KC1HMG,CAAAA,CAAgBC,SAAAA,CAAUC,QAAQ,CAAA,CAE3BC,CAAAA,CAAN,KAA4C,CAGjD,WAAA,CAA6BC,EAAiC,CAAjC,IAAA,CAAA,cAAA,CAAAA,EAAkC,CAFtD,KAAO,OAAA,CAIhB,MAAM,IAAA,EAAmC,CACvC,GAAI,CACF,GAAM,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAI,MAAML,CAAAA,CAAc,OAAQ,CAAC,WAAW,CAAC,CAAA,CAE5D,OAAO,CAAE,EAAA,CAAI,CAAA,CAAA,CAAM,OAAA,CADHK,EAAO,KAAA,CAAM;AAAA,CAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,IAAU,SACtB,CAC7B,CAAA,KAAQ,CACN,OAAO,CAAE,EAAA,CAAI,KAAA,CAAO,KAAA,CAAO,gBAAiB,CAC9C,CACF,CAEA,OAAA,CAAQC,CAAAA,CAAsC,CAC5C,IAAMC,CAAAA,CAAUD,EAAO,MAAA,CAAO,OAAA,CAC9B,GAAI,CAACC,EAAS,CAEZ,eAAgBC,CAAAA,EAAuC,CACrD,MAAM,CACJ,IAAA,CAAM,OAAA,CACN,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,WAAA,GACtB,IAAA,CAAM,kDACR,EACF,CACA,OAAO,CAAE,GAAA,CAAK,CAAA,CAAG,MAAA,CAAQA,GAAW,CACtC,CAEA,GAAM,CAAE,OAAA,CAASC,CAAAA,CAAM,GAAA,CAAAC,CAAI,CAAA,CAAI,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,OAAQ,CAAC,KAAA,CAAOH,CAAO,CAAA,CAAG,CACjF,GAAA,CAAKD,CAAAA,CAAO,SAAA,CACZ,GAAA,CAAK,CACH,GAAG,OAAA,CAAQ,GAAA,CACX,GAAGA,CAAAA,CAAO,GAAA,CACV,qBAAA,CAAuBA,CAAAA,CAAO,MAChC,CAAA,CACA,MAAA,CAAQA,CAAAA,CAAO,MACjB,CAAC,CAAA,CAEKK,CAAAA,CAASL,CAAAA,CAAO,MAAA,CAChBF,CAAAA,CAAiB,IAAA,CAAK,cAAA,CAE5B,eAAgBQ,GAA6C,CAE3D,IAAMC,CAAAA,CAAS,IAAIlB,EAGbmB,CAAAA,CAAU,IAAM,CACpBV,CAAAA,CAAe,cAAcM,CAAAA,CAAK,GAAK,CAAA,CAAE,KAAA,CAAM,IAAM,CAAC,CAAC,EACzD,EACIC,CAAAA,GACEA,CAAAA,CAAO,OAAA,CACTG,CAAAA,GAEAH,CAAAA,CAAO,gBAAA,CAAiB,OAAA,CAASG,CAAAA,CAAS,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAAA,CAI5D,IAAMC,CAAAA,CAAAA,CAAiB,SAAY,CACjC,GAAKN,CAAAA,CAAK,MAAA,CACV,UAAA,IAAiBO,CAAAA,IAAQC,IAAUR,CAAAA,CAAK,MAAM,CAAA,CAAG,CAC/C,GAAIE,CAAAA,EAAQ,OAAA,CAAS,MACrB,MAAME,CAAAA,CAAO,IAAA,CAAK,CAChB,IAAA,CAAM,SACN,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,aAAY,CAClC,IAAA,CAAMG,CACR,CAAC,EACH,CACF,CAAA,GAAG,CAEGE,CAAAA,CAAAA,CAAiB,SAAY,CACjC,GAAKT,CAAAA,CAAK,OACV,UAAA,IAAiBO,CAAAA,IAAQC,GAAAA,CAAUR,CAAAA,CAAK,MAAM,CAAA,CAAG,CAC/C,GAAIE,CAAAA,EAAQ,QAAS,MACrB,MAAME,CAAAA,CAAO,IAAA,CAAK,CAChB,IAAA,CAAM,OAAA,CACN,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAClC,KAAMG,CACR,CAAC,EACH,CACF,IAAG,CAGE,OAAA,CAAQ,GAAA,CAAI,CAACD,CAAAA,CAAeG,CAAa,CAAC,CAAA,CAAE,KAC/C,IAAML,CAAAA,CAAO,KAAA,EAAM,CACnB,IAAMA,CAAAA,CAAO,KAAA,EACf,CAAA,CAGA,MAAOA,CAAAA,CAGHF,CAAAA,EAAU,CAACA,CAAAA,CAAO,OAAA,EACpBA,CAAAA,CAAO,mBAAA,CAAoB,OAAA,CAASG,CAAO,CAAA,CAI7C,MAAM,IAAI,OAAA,CAAc,CAACrB,CAAAA,CAAS0B,CAAAA,GAAW,CAE3C,GAAIV,EAAK,QAAA,GAAa,IAAA,EAAQA,CAAAA,CAAK,MAAA,CAAQ,CACzChB,CAAAA,EAAQ,CACR,MACF,CACAgB,CAAAA,CAAK,EAAA,CAAG,OAAA,CAAUW,CAAAA,EAAS,CACrBA,CAAAA,GAAS,CAAA,EAAKT,CAAAA,EAAQ,OAAA,CACxBlB,GAAQ,CAER0B,CAAAA,CAAO,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkCC,CAAI,CAAA,CAAE,CAAC,EAE9D,CAAC,CAAA,CACDX,CAAAA,CAAK,EAAA,CAAG,QAASU,CAAM,EACzB,CAAC,EACH,CAEA,OAAO,CAAE,GAAA,CAAAT,CAAAA,CAAK,MAAA,CAAQE,CAAAA,EAAiB,CACzC,CAEA,MAAM,IAAA,CAAKF,CAAAA,CAA4B,CACrC,MAAM,IAAA,CAAK,cAAA,CAAe,aAAA,CAAcA,CAAG,EAC7C,CACF","file":"shell-OGTSH4RJ.js","sourcesContent":["/**\n * Lock-free ring buffer for AgentEvent streaming.\n *\n * Replaces Array.shift() O(n) polling with O(1) dequeue\n * and event-driven notification instead of 50ms busy-wait.\n * Includes backpressure: when buffer is full, push() returns\n * a promise that resolves when space is available.\n */\n\nimport type { AgentEvent } from './interface.js';\n\nconst DEFAULT_CAPACITY = 1024;\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T) => void;\n}\n\nfunction deferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void;\n const promise = new Promise<T>((r) => { resolve = r; });\n return { promise, resolve };\n}\n\nexport class EventBuffer {\n private buf: (AgentEvent | undefined)[];\n private head = 0; // read index\n private tail = 0; // write index\n private count = 0;\n private readonly capacity: number;\n\n // Consumer notification: resolved when new data is available\n private dataReady: Deferred<void> | null = null;\n // Producer notification: resolved when space is available\n private spaceReady: Deferred<void> | null = null;\n\n private closed = false;\n\n constructor(capacity = DEFAULT_CAPACITY) {\n this.capacity = capacity;\n this.buf = new Array(capacity);\n }\n\n /** Number of buffered events. */\n get size(): number {\n return this.count;\n }\n\n get isFull(): boolean {\n return this.count >= this.capacity;\n }\n\n /**\n * Push an event into the buffer.\n * If the buffer is full, waits until space is available (backpressure).\n */\n async push(event: AgentEvent): Promise<void> {\n while (this.isFull && !this.closed) {\n if (!this.spaceReady) {\n this.spaceReady = deferred<void>();\n }\n await this.spaceReady.promise;\n }\n if (this.closed) return;\n\n this.buf[this.tail] = event;\n this.tail = (this.tail + 1) % this.capacity;\n this.count++;\n\n // Wake up consumer if waiting\n if (this.dataReady) {\n const dr = this.dataReady;\n this.dataReady = null;\n dr.resolve();\n }\n }\n\n /**\n * Dequeue the next event. O(1).\n * Returns undefined only when buffer is empty AND closed.\n */\n async take(): Promise<AgentEvent | undefined> {\n while (this.count === 0) {\n if (this.closed) return undefined;\n if (!this.dataReady) {\n this.dataReady = deferred<void>();\n }\n await this.dataReady.promise;\n }\n\n const event = this.buf[this.head];\n this.buf[this.head] = undefined; // allow GC\n this.head = (this.head + 1) % this.capacity;\n this.count--;\n\n // Wake up producer if waiting for space\n if (this.spaceReady) {\n const sr = this.spaceReady;\n this.spaceReady = null;\n sr.resolve();\n }\n\n return event;\n }\n\n /**\n * Signal that no more events will be pushed.\n * Wakes up any waiting consumer/producer.\n */\n close(): void {\n this.closed = true;\n if (this.dataReady) {\n const dr = this.dataReady;\n this.dataReady = null;\n dr.resolve();\n }\n if (this.spaceReady) {\n const sr = this.spaceReady;\n this.spaceReady = null;\n sr.resolve();\n }\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n /**\n * Async iterator that drains the buffer until closed and empty.\n */\n async *[Symbol.asyncIterator](): AsyncGenerator<AgentEvent> {\n while (true) {\n const event = await this.take();\n if (event === undefined) return;\n yield event;\n }\n }\n}\n","/**\n * Shell adapter.\n *\n * Spawns an arbitrary command via `bash -lc`.\n * Task prompt is passed via ORCHESTRY_TASK_PROMPT env variable.\n * Consumes stdout and stderr concurrently to avoid deadlocks.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { readLines } from '../process/process-manager.js';\nimport { EventBuffer } from './event-buffer.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class ShellAdapter implements IAgentAdapter {\n readonly kind = 'shell';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('bash', ['--version']);\n const version = stdout.split('\\n')[0]?.trim() ?? 'unknown';\n return { ok: true, version };\n } catch {\n return { ok: false, error: 'bash not found' };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const command = params.config.command;\n if (!command) {\n // Return a handle that immediately yields an error\n async function* errorGen(): AsyncGenerator<AgentEvent> {\n yield {\n type: 'error',\n timestamp: new Date().toISOString(),\n data: 'Shell adapter requires a command in agent config',\n };\n }\n return { pid: 0, events: errorGen() };\n }\n\n const { process: proc, pid } = this.processManager.spawn('bash', ['-lc', command], {\n cwd: params.workspace,\n env: {\n ...process.env,\n ...params.env,\n ORCHESTRY_TASK_PROMPT: params.prompt,\n },\n signal: params.signal,\n });\n\n const signal = params.signal;\n const processManager = this.processManager;\n\n async function* generateEvents(): AsyncGenerator<AgentEvent> {\n // Ring buffer with backpressure replaces Array.shift() polling\n const buffer = new EventBuffer();\n\n // Ensure process is reaped on abort — SIGTERM + grace period + SIGKILL\n const onAbort = () => {\n processManager.killWithGrace(pid, 5_000).catch(() => {});\n };\n if (signal) {\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n const stdoutPromise = (async () => {\n if (!proc.stdout) return;\n for await (const line of readLines(proc.stdout)) {\n if (signal?.aborted) break;\n await buffer.push({\n type: 'output',\n timestamp: new Date().toISOString(),\n data: line,\n });\n }\n })();\n\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n for await (const line of readLines(proc.stderr)) {\n if (signal?.aborted) break;\n await buffer.push({\n type: 'error',\n timestamp: new Date().toISOString(),\n data: line,\n });\n }\n })();\n\n // Close the buffer once both streams are drained (or on error)\n void Promise.all([stdoutPromise, stderrPromise]).then(\n () => buffer.close(),\n () => buffer.close(),\n );\n\n // Yield events as they arrive — no polling, no busy-wait\n yield* buffer;\n\n // Clean up abort listener\n if (signal && !signal.aborted) {\n signal.removeEventListener('abort', onAbort);\n }\n\n // Wait for process to exit\n await new Promise<void>((resolve, reject) => {\n // If process already exited, resolve immediately\n if (proc.exitCode !== null || proc.killed) {\n resolve();\n return;\n }\n proc.on('close', (code) => {\n if (code === 0 || signal?.aborted) {\n resolve();\n } else {\n reject(new Error(`Shell command exited with code ${code}`));\n }\n });\n proc.on('error', reject);\n });\n }\n\n return { pid, events: generateEvents() };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n"]}
@@ -1,56 +0,0 @@
1
- #!/usr/bin/env node
2
- import { formatDurationSince, amber, dim, statusIcon, agentName, priorityLabel, formatTokens } from './chunk-I5WEMARW.js';
3
-
4
- // src/cli/commands/status.ts
5
- function registerStatusCommand(program, container) {
6
- program.command("status").description("Show orchestrator status").action(async () => {
7
- await container.paths.requireInit();
8
- const tasks = await container.taskService.list();
9
- const agents = await container.agentService.list();
10
- const state = await container.stateStore.read();
11
- if (container.context.json) {
12
- console.log(JSON.stringify({ tasks, agents, state }, null, 2));
13
- return;
14
- }
15
- const runningCount = Object.keys(state.running).length;
16
- const mode = state.pid ? "watching" : "idle";
17
- const uptime = state.started_at ? formatDurationSince(state.started_at) : "";
18
- console.log();
19
- console.log(`${amber("orch")} \xB7 ${container.config.project.name} \xB7 ${mode}`);
20
- console.log();
21
- const counts = {};
22
- for (const t of tasks) {
23
- counts[t.status] = (counts[t.status] ?? 0) + 1;
24
- }
25
- if (runningCount > 0) {
26
- console.log(` ${"RUNNING".padEnd(12)}${runningCount}${"".padEnd(20)}AGENTS ${agents.length}`);
27
- }
28
- for (const [status, count] of Object.entries(counts)) {
29
- if (status !== "in_progress") {
30
- console.log(` ${dim(status.padEnd(12))}${count}`);
31
- }
32
- }
33
- const runningTasks = tasks.filter((t) => t.status === "in_progress");
34
- if (runningTasks.length > 0) {
35
- console.log();
36
- for (const t of runningTasks) {
37
- const time = formatDurationSince(t.updated_at);
38
- console.log(
39
- ` ${statusIcon("in_progress")} ${t.assignee ? agentName(t.assignee) : ""} ${t.title.slice(0, 35).padEnd(37)}${time} ${priorityLabel(t.priority)}`
40
- );
41
- }
42
- }
43
- const totalTokens = state.stats.total_tokens.total;
44
- const footer = [
45
- uptime ? `up ${uptime}` : null,
46
- totalTokens > 0 ? `${formatTokens(totalTokens)} tokens` : null
47
- ].filter(Boolean).join(" \xB7 ");
48
- if (footer) {
49
- console.log();
50
- console.log(` ${dim(footer)}`);
51
- }
52
- console.log();
53
- });
54
- }
55
-
56
- export { registerStatusCommand };
@@ -1,209 +0,0 @@
1
- #!/usr/bin/env node
2
- import { openInEditor, toEditorContent, fromEditorContent } from './chunk-P6ATSXGL.js';
3
- import { printSuccess, dim, formatDurationSince, statusIcon, priorityLabel, agentName, printTable, filePath, printKeyValue } from './chunk-I5WEMARW.js';
4
-
5
- // src/cli/commands/task.ts
6
- function registerTaskCommand(program, container) {
7
- const task = program.command("task").description("Manage tasks");
8
- task.command("add <title>").description("Create a new task").option("-d, --description <desc>", "Task description").option("-p, --priority <n>", "Priority (1-4)", "3").option("-l, --labels <labels>", "Comma-separated labels").option("--depends-on <ids>", "Comma-separated dependency task IDs").option("--max-attempts <n>", "Max retry attempts").option("--workspace-mode <mode>", "Workspace mode: shared|worktree|isolated").option("--assignee <agent-id>", "Assign to agent").option("--review-criteria <criteria>", "Comma-separated auto-review criteria: test_pass,typecheck,lint").option("--scope <patterns>", "Comma-separated glob patterns for file scope (e.g. src/auth/**,src/session/**)").option("-e, --edit", "Open $EDITOR to write the description").action(async (title, opts) => {
9
- await container.paths.requireInit();
10
- let description = opts.description;
11
- if (opts.edit) {
12
- const content = await openInEditor(
13
- toEditorContent({ title, priority: parseInt(opts.priority, 10), description })
14
- );
15
- const parsed = fromEditorContent(content);
16
- description = parsed.description;
17
- }
18
- const task2 = await container.taskService.create({
19
- title,
20
- description,
21
- priority: parseInt(opts.priority, 10),
22
- labels: opts.labels?.split(",").map((s) => s.trim()),
23
- depends_on: opts.dependsOn?.split(",").map((s) => s.trim()),
24
- max_attempts: opts.maxAttempts ? parseInt(opts.maxAttempts, 10) : void 0,
25
- workspace_mode: opts.workspaceMode,
26
- assignee: opts.assignee,
27
- review_criteria: opts.reviewCriteria?.split(",").map((s) => s.trim()),
28
- scope: opts.scope?.split(",").map((s) => s.trim())
29
- });
30
- if (container.context.json) {
31
- console.log(JSON.stringify(task2, null, 2));
32
- } else if (container.context.quiet) {
33
- console.log(task2.id);
34
- } else {
35
- printSuccess(`Created ${task2.id} "${task2.title}"`);
36
- }
37
- });
38
- task.command("list").description("List all tasks").option("--status <status>", "Filter by status").action(async (opts) => {
39
- await container.paths.requireInit();
40
- const tasks = await container.taskService.list(
41
- opts.status ? { status: opts.status } : void 0
42
- );
43
- if (container.context.json) {
44
- console.log(JSON.stringify(tasks, null, 2));
45
- return;
46
- }
47
- if (container.context.quiet) {
48
- tasks.forEach((t) => console.log(t.id));
49
- return;
50
- }
51
- if (tasks.length === 0) {
52
- console.log(`
53
- No tasks. Create one: ${dim('orch task add "Title"')}
54
- `);
55
- return;
56
- }
57
- const headers = ["STATUS", "PRI", "TASK", "AGENT", "TIME"];
58
- const rows = tasks.map((t) => {
59
- const time = (t.status === "in_progress" || t.status === "done") && t.updated_at ? formatDurationSince(t.updated_at) : dim("\u2014");
60
- return [
61
- `${statusIcon(t.status)} ${t.status}`,
62
- priorityLabel(t.priority),
63
- t.title.slice(0, 35),
64
- t.assignee ? agentName(t.assignee) : dim("\u2014"),
65
- time
66
- ];
67
- });
68
- console.log();
69
- printTable(headers, rows);
70
- const running = tasks.filter((t) => t.status === "in_progress").length;
71
- const review = tasks.filter((t) => t.status === "review").length;
72
- const done = tasks.filter((t) => t.status === "done").length;
73
- console.log(
74
- `
75
- ${tasks.length} tasks${running ? ` \xB7 ${running} running` : ""}${review ? ` \xB7 ${review} review` : ""}${done ? ` \xB7 ${done} done` : ""}
76
- `
77
- );
78
- });
79
- task.command("show <id>").description("Show task details").action(async (id) => {
80
- await container.paths.requireInit();
81
- const t = await container.taskService.get(id);
82
- if (container.context.json) {
83
- console.log(JSON.stringify(t, null, 2));
84
- return;
85
- }
86
- console.log(`
87
- ${t.title}`);
88
- console.log(` ${"\u2550".repeat(42)}`);
89
- console.log();
90
- const pairs = [
91
- ["Status", `${statusIcon(t.status)} ${t.status} \xB7 attempt ${t.attempts}/${t.max_attempts}`],
92
- ["Priority", priorityLabel(t.priority)]
93
- ];
94
- if (t.assignee) pairs.push(["Agent", agentName(t.assignee)]);
95
- if (t.labels.length) pairs.push(["Labels", t.labels.join(", ")]);
96
- if (t.scope?.length) pairs.push(["Scope", t.scope.join(", ")]);
97
- if (t.workspace_mode) pairs.push(["Workspace", t.workspace_mode]);
98
- if (t.workspace) pairs.push(["Path", filePath(t.workspace)]);
99
- if (t.review_criteria?.length) pairs.push(["Review", t.review_criteria.join(", ")]);
100
- if (t.feedback) pairs.push(["Feedback", t.feedback]);
101
- pairs.push(["Created", t.created_at]);
102
- printKeyValue(pairs);
103
- if (t.description) {
104
- console.log(`
105
- Description
106
- ${"\u2500".repeat(42)}`);
107
- for (const line of t.description.split("\n")) {
108
- console.log(` ${line}`);
109
- }
110
- }
111
- if (t.proof) {
112
- console.log(`
113
- Result
114
- ${"\u2500".repeat(42)}`);
115
- if (t.proof.branch) console.log(` Branch: ${t.proof.branch}`);
116
- if (t.proof.pr_url) console.log(` PR: ${t.proof.pr_url}`);
117
- if (t.proof.files_changed.length) {
118
- console.log(` Files changed:`);
119
- for (const f of t.proof.files_changed) {
120
- console.log(` \u2022 ${f}`);
121
- }
122
- }
123
- if (t.proof.test_results) {
124
- console.log(` Test results:`);
125
- for (const line of t.proof.test_results.split("\n")) {
126
- console.log(` ${line}`);
127
- }
128
- }
129
- if (t.proof.agent_summary) {
130
- console.log(` Agent summary:`);
131
- for (const line of t.proof.agent_summary.split("\n")) {
132
- console.log(` ${line}`);
133
- }
134
- }
135
- }
136
- if (t.review_results?.length) {
137
- console.log(`
138
- Review Results
139
- ${"\u2500".repeat(42)}`);
140
- for (const r of t.review_results) {
141
- const icon = r.passed ? "\u2713" : "\u2717";
142
- console.log(` ${icon} ${r.criterion}: ${r.passed ? "passed" : "failed"}`);
143
- if (r.output) {
144
- for (const line of r.output.split("\n")) {
145
- console.log(` ${line}`);
146
- }
147
- }
148
- }
149
- }
150
- console.log();
151
- });
152
- task.command("edit <id>").description("Open task in $EDITOR to modify title, priority and description").action(async (id) => {
153
- await container.paths.requireInit();
154
- const existing = await container.taskService.get(id);
155
- const initial = toEditorContent({
156
- title: existing.title,
157
- priority: existing.priority,
158
- description: existing.description
159
- });
160
- const content = await openInEditor(initial);
161
- const parsed = fromEditorContent(content);
162
- const fields = {};
163
- if (parsed.title && parsed.title !== existing.title) fields.title = parsed.title;
164
- if (parsed.priority && parsed.priority !== existing.priority) fields.priority = parsed.priority;
165
- if (parsed.description !== void 0 && parsed.description !== existing.description) {
166
- fields.description = parsed.description ?? "";
167
- }
168
- if (Object.keys(fields).length === 0) {
169
- console.log(" No changes.");
170
- return;
171
- }
172
- const updated = await container.taskService.update(id, fields);
173
- printSuccess(`Updated ${updated.id} "${updated.title}"`);
174
- });
175
- task.command("assign <task-id> <agent-id>").description("Assign task to agent").action(async (taskId, agentId) => {
176
- await container.paths.requireInit();
177
- const t = await container.taskService.assign(taskId, agentId);
178
- printSuccess(`Assigned ${t.id} \u2192 ${agentId}`);
179
- });
180
- task.command("cancel <id>").description("Cancel a task").action(async (id) => {
181
- await container.paths.requireInit();
182
- const task2 = await container.taskService.get(id);
183
- if (task2.status === "in_progress") {
184
- const { buildFullContainer } = await import('./container-JV7TAUP5.js');
185
- const full = await buildFullContainer(container.context);
186
- await full.orchestrator.cancelTask(id);
187
- } else {
188
- await container.taskService.cancel(id);
189
- }
190
- printSuccess(`Cancelled ${id}`);
191
- });
192
- task.command("approve <id>").description("Approve a task in review").action(async (id) => {
193
- await container.paths.requireInit();
194
- await container.taskService.updateStatus(id, "done");
195
- printSuccess(`Approved ${id}`);
196
- });
197
- task.command("reject <id>").description("Reject a task and send it back for rework").option("-r, --reason <reason>", "Feedback for the agent explaining what to fix").action(async (id, opts) => {
198
- await container.paths.requireInit();
199
- await container.taskService.reject(id, opts.reason);
200
- printSuccess(`Rejected ${id} \u2192 todo${opts.reason ? ` (reason: ${opts.reason})` : ""}`);
201
- });
202
- task.command("retry <id>").description("Retry a failed task").action(async (id) => {
203
- await container.paths.requireInit();
204
- await container.taskService.retry(id);
205
- printSuccess(`Reset ${id} to todo`);
206
- });
207
- }
208
-
209
- export { registerTaskCommand };
@@ -1,97 +0,0 @@
1
- #!/usr/bin/env node
2
- import { printSuccess, dim, printTable, printKeyValue } from './chunk-I5WEMARW.js';
3
-
4
- // src/cli/commands/team.ts
5
- function registerTeamCommand(program, container) {
6
- const team = program.command("team").description("Manage agent teams");
7
- team.command("create <name>").description("Create a new team").requiredOption("--lead <agent-id>", "Lead agent ID").option("--members <ids>", "Comma-separated member agent IDs").option("-d, --description <desc>", "Team description").option("--no-auto-claim", "Disable auto-claiming").action(async (name, opts) => {
8
- await container.paths.requireInit();
9
- const t = await container.teamService.create({
10
- name,
11
- description: opts.description,
12
- lead_agent_id: opts.lead,
13
- member_agent_ids: opts.members?.split(",").map((s) => s.trim()),
14
- config: { auto_claim: opts.autoClaim !== false }
15
- });
16
- if (container.context.json) {
17
- console.log(JSON.stringify(t, null, 2));
18
- } else if (container.context.quiet) {
19
- console.log(t.id);
20
- } else {
21
- printSuccess(`Created team "${t.name}" \u2192 ${t.id}`);
22
- }
23
- });
24
- team.command("list").description("List all teams").action(async () => {
25
- await container.paths.requireInit();
26
- const teams = await container.teamService.list();
27
- if (container.context.json) {
28
- console.log(JSON.stringify(teams, null, 2));
29
- return;
30
- }
31
- if (teams.length === 0) {
32
- console.log(dim(`
33
- No teams. Create one: orch team create <name> --lead <agent-id>
34
- `));
35
- return;
36
- }
37
- const headers = ["ID", "NAME", "STATUS", "LEAD", "MEMBERS", "POOL"];
38
- const rows = teams.map((t) => [
39
- t.id,
40
- t.name,
41
- t.status,
42
- t.lead_agent_id,
43
- String(t.members.length),
44
- String(t.task_pool.length)
45
- ]);
46
- console.log();
47
- printTable(headers, rows);
48
- console.log();
49
- });
50
- team.command("show <id>").description("Show team details").action(async (id) => {
51
- await container.paths.requireInit();
52
- const t = await container.teamService.get(id);
53
- if (container.context.json) {
54
- console.log(JSON.stringify(t, null, 2));
55
- return;
56
- }
57
- console.log();
58
- printKeyValue([
59
- ["ID", t.id],
60
- ["Name", t.name],
61
- ["Status", t.status],
62
- ["Lead", t.lead_agent_id],
63
- ["Members", t.members.map((m) => `${m.agent_id} (${m.role})`).join(", ")],
64
- ["Pool", t.task_pool.length > 0 ? t.task_pool.join(", ") : dim("empty")],
65
- ["Auto-claim", String(t.config.auto_claim)],
66
- ["Created", t.created_at]
67
- ]);
68
- console.log();
69
- });
70
- team.command("join <team-id> <agent-id>").description("Add an agent to a team").action(async (teamId, agentId) => {
71
- await container.paths.requireInit();
72
- await container.teamService.join(teamId, agentId);
73
- printSuccess(`Agent ${agentId} joined team ${teamId}`);
74
- });
75
- team.command("leave <team-id> <agent-id>").description("Remove an agent from a team").action(async (teamId, agentId) => {
76
- await container.paths.requireInit();
77
- await container.teamService.leave(teamId, agentId);
78
- printSuccess(`Agent ${agentId} left team ${teamId}`);
79
- });
80
- team.command("add-task <team-id> <task-id>").description("Add a task to the team pool").action(async (teamId, taskId) => {
81
- await container.paths.requireInit();
82
- await container.teamService.addTask(teamId, taskId);
83
- printSuccess(`Task ${taskId} added to team ${teamId} pool`);
84
- });
85
- team.command("set-lead <team-id> <agent-id>").description("Transfer team lead to another member").action(async (teamId, agentId) => {
86
- await container.paths.requireInit();
87
- await container.teamService.setLead(teamId, agentId);
88
- printSuccess(`${agentId} is now lead of team ${teamId}`);
89
- });
90
- team.command("disband <id>").description("Disband a team").action(async (id) => {
91
- await container.paths.requireInit();
92
- await container.teamService.disband(id);
93
- printSuccess(`Team ${id} disbanded`);
94
- });
95
- }
96
-
97
- export { registerTeamCommand };
@@ -1,2 +0,0 @@
1
- export{d as DEFAULT_PROMPT_TEMPLATE,b as LiquidTemplateEngine,c as buildPromptContext}from'./chunk-AELEEEV3.js';//# sourceMappingURL=template-engine-322SCRR6.js.map
2
- //# sourceMappingURL=template-engine-322SCRR6.js.map
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export { DEFAULT_PROMPT_TEMPLATE, LiquidTemplateEngine, buildPromptContext } from './chunk-HNKJ4IF7.js';
3
- import './chunk-PNE6LQRF.js';