@oxgeneral/orch 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/App-SSYYVFGW.js +22 -0
  2. package/dist/agent-Q34L27AY.js +9 -0
  3. package/dist/agent-shop-D2RS4BZK.js +2 -0
  4. package/dist/chunk-4MMHVHA6.js +112 -0
  5. package/dist/chunk-64WUDYEM.js +6 -0
  6. package/dist/chunk-6MJ7V6VY.js +2 -0
  7. package/dist/{chunk-DAVHOWGD.js → chunk-BCPUTULS.js} +16 -188
  8. package/dist/{chunk-INZ4O2RI.js → chunk-BSJVYRI3.js} +5 -2
  9. package/dist/chunk-BSJVYRI3.js.map +1 -0
  10. package/dist/chunk-CDFA4IIQ.js +2 -0
  11. package/dist/chunk-CHRW4CLD.js +2 -0
  12. package/dist/chunk-HMMPM7MF.js +3 -0
  13. package/dist/chunk-HXOMNULD.js +2 -0
  14. package/dist/chunk-IKNBPOQL.js +2 -0
  15. package/dist/chunk-KFQTWMZI.js +3 -0
  16. package/dist/chunk-LXNRCJ22.js +2 -0
  17. package/dist/{chunk-C6XZ3FJT.js → chunk-MOWC2CHX.js} +7 -4
  18. package/dist/chunk-MOWC2CHX.js.map +1 -0
  19. package/dist/chunk-P4JTJBWO.js +2 -0
  20. package/dist/chunk-PJ5DKXGR.js +2 -0
  21. package/dist/chunk-QNZ6D63E.js +4 -0
  22. package/dist/chunk-RHFRHCN5.js +16 -0
  23. package/dist/chunk-RHFRHCN5.js.map +1 -0
  24. package/dist/chunk-TPTHLFOB.js +2 -0
  25. package/dist/chunk-UMZEA3JT.js +5 -0
  26. package/dist/chunk-X54D5JZG.js +11 -0
  27. package/dist/{chunk-O2OQCSBL.js → chunk-YHIYJ5OL.js} +105 -29
  28. package/dist/chunk-YHIYJ5OL.js.map +1 -0
  29. package/dist/{claude-WUJU5KIE.js → claude-4R6L6BWY.js} +4 -4
  30. package/dist/{claude-WUJU5KIE.js.map → claude-4R6L6BWY.js.map} +1 -1
  31. package/dist/claude-ZLVOLRUG.js +2 -0
  32. package/dist/cli.js +1 -213
  33. package/dist/clipboard-service-WVON5ZN4.js +25 -0
  34. package/dist/{codex-NYJWEPRQ.js → codex-IMOW5ZUZ.js} +4 -4
  35. package/dist/{codex-NYJWEPRQ.js.map → codex-IMOW5ZUZ.js.map} +1 -1
  36. package/dist/codex-YRSODLH4.js +2 -0
  37. package/dist/config-OOB7QEKM.js +2 -0
  38. package/dist/container-FJI7RN2L.js +4 -0
  39. package/dist/context-FXRERFSP.js +7 -0
  40. package/dist/cursor-2HILMNM3.js +2 -0
  41. package/dist/{cursor-3YHVD4NP.js → cursor-NHV7X3WG.js} +4 -4
  42. package/dist/{cursor-3YHVD4NP.js.map → cursor-NHV7X3WG.js.map} +1 -1
  43. package/dist/doctor-GKTV4YYD.js +2 -0
  44. package/dist/doctor-service-PB7YBH3F.js +2 -0
  45. package/dist/editor-7IFRWVTL.js +8 -0
  46. package/dist/goal-RNNZYMNR.js +8 -0
  47. package/dist/index.d.ts +26 -8
  48. package/dist/index.js +247 -75
  49. package/dist/index.js.map +1 -1
  50. package/dist/init-56QC5QVX.js +53 -0
  51. package/dist/logs-4ISTWUWV.js +12 -0
  52. package/dist/msg-4ELI7Q52.js +9 -0
  53. package/dist/opencode-3S4VDXRG.js +2 -0
  54. package/dist/{opencode-FAMPSA6X.js → opencode-ULT6DYCT.js} +6 -5
  55. package/dist/opencode-ULT6DYCT.js.map +1 -0
  56. package/dist/orchestrator-PM4BW7W5.js +13 -0
  57. package/dist/orchestrator-QFNYZ6AH.js +6 -0
  58. package/dist/{orchestrator-X2CWGFCL.js.map → orchestrator-QFNYZ6AH.js.map} +1 -1
  59. package/dist/org-WAK3CDPG.js +3 -0
  60. package/dist/process-manager-33H27MQF.js +2 -0
  61. package/dist/registry-BO2PPRNG.js +2 -0
  62. package/dist/run-NE5E4JPW.js +3 -0
  63. package/dist/shell-OBHIVC2H.js +2 -0
  64. package/dist/{shell-NJNW3O6K.js → shell-UXEJRK3D.js} +4 -4
  65. package/dist/{shell-NJNW3O6K.js.map → shell-UXEJRK3D.js.map} +1 -1
  66. package/dist/shop-picker-LE3SKFOX.js +5 -0
  67. package/dist/status-NYHZ7Q5G.js +2 -0
  68. package/dist/task-SZBYNAZP.js +20 -0
  69. package/dist/team-VCJSUDWX.js +4 -0
  70. package/dist/template-engine-42PKL5KD.js +2 -0
  71. package/dist/tui-4VRDSRVB.js +2 -0
  72. package/dist/update-FFKCOV63.js +2 -0
  73. package/dist/update-check-HGMBDYHL.js +2 -0
  74. package/dist/{workspace-manager-2SFPKPLZ.js → workspace-manager-ABXFBL2A.js} +3 -3
  75. package/dist/{workspace-manager-2SFPKPLZ.js.map → workspace-manager-ABXFBL2A.js.map} +1 -1
  76. package/dist/workspace-manager-Q6WWXSTR.js +3 -0
  77. package/package.json +1 -1
  78. package/dist/App-YQOT4LBE.js +0 -6727
  79. package/dist/agent-7ZJ3ZDJ7.js +0 -183
  80. package/dist/agent-shop-YN2BSLHM.js +0 -2
  81. package/dist/chunk-2C2TFQ7K.js +0 -136
  82. package/dist/chunk-45K2XID7.js +0 -29
  83. package/dist/chunk-4IFIOMCW.js +0 -86
  84. package/dist/chunk-7X2GI5OV.js +0 -181
  85. package/dist/chunk-C6XZ3FJT.js.map +0 -1
  86. package/dist/chunk-CHIP7O6V.js +0 -83
  87. package/dist/chunk-FRTKB575.js +0 -87
  88. package/dist/chunk-HXYAZGLP.js +0 -15
  89. package/dist/chunk-I3SMISEF.js +0 -29
  90. package/dist/chunk-INZ4O2RI.js.map +0 -1
  91. package/dist/chunk-ITLJKMTP.js +0 -297
  92. package/dist/chunk-K6DMQERQ.js +0 -89
  93. package/dist/chunk-MGGSRXWJ.js +0 -69
  94. package/dist/chunk-O2OQCSBL.js.map +0 -1
  95. package/dist/chunk-P6ATSXGL.js +0 -107
  96. package/dist/chunk-PNE6LQRF.js +0 -5
  97. package/dist/chunk-U2VDNUZL.js +0 -52
  98. package/dist/chunk-VXS2CJFH.js +0 -273
  99. package/dist/chunk-XDVMX2FO.js +0 -8
  100. package/dist/chunk-XDVMX2FO.js.map +0 -1
  101. package/dist/chunk-XJTJ2TJV.js +0 -221
  102. package/dist/claude-ZUEKJJ4X.js +0 -5
  103. package/dist/clipboard-service-RTDUUQQU.js +0 -200
  104. package/dist/codex-7IXXXG5U.js +0 -123
  105. package/dist/config-OTAVSMOD.js +0 -75
  106. package/dist/container-IZZVO4AH.js +0 -1596
  107. package/dist/context-OL4BVUV5.js +0 -83
  108. package/dist/cursor-622RBRHH.js +0 -97
  109. package/dist/doctor-SETNAS4S.js +0 -67
  110. package/dist/doctor-service-TPOMFAIG.js +0 -2
  111. package/dist/goal-C6YGSX5D.js +0 -143
  112. package/dist/init-SWAAXP5H.js +0 -199
  113. package/dist/logs-PHPYWQ6I.js +0 -207
  114. package/dist/msg-FUWWLEKM.js +0 -95
  115. package/dist/opencode-FAMPSA6X.js.map +0 -1
  116. package/dist/opencode-WOR53TSC.js +0 -98
  117. package/dist/orchestrator-O6MFMATT.js +0 -1448
  118. package/dist/orchestrator-X2CWGFCL.js +0 -5
  119. package/dist/org-JSMMBZHI.js +0 -249
  120. package/dist/process-manager-HUVNAPQV.js +0 -2
  121. package/dist/registry-PQWRVNF2.js +0 -2
  122. package/dist/run-N72G5V2H.js +0 -95
  123. package/dist/shell-DVFHHYAZ.js +0 -5
  124. package/dist/shop-picker-2HY67UWP.js +0 -79
  125. package/dist/status-RZWN2C6C.js +0 -56
  126. package/dist/task-XNYZHPCS.js +0 -221
  127. package/dist/team-PFLP4PPL.js +0 -97
  128. package/dist/template-engine-AWIS56BL.js +0 -3
  129. package/dist/tui-JW3DOOKH.js +0 -245
  130. package/dist/update-YLP7FPNY.js +0 -64
  131. package/dist/update-check-4YKLGBFB.js +0 -2
  132. package/dist/workspace-manager-ESPU7WOH.js +0 -215
@@ -1,5 +0,0 @@
1
- export { Orchestrator } from './chunk-O2OQCSBL.js';
2
- import './chunk-VG4465AG.js';
3
- import './chunk-NLQAJ7TW.js';
4
- //# sourceMappingURL=orchestrator-X2CWGFCL.js.map
5
- //# sourceMappingURL=orchestrator-X2CWGFCL.js.map
@@ -1,249 +0,0 @@
1
- #!/usr/bin/env node
2
- import { getShopTemplateByKey } from './chunk-DAVHOWGD.js';
3
- import { printTable, dim, printError, printSuccess } from './chunk-7X2GI5OV.js';
4
-
5
- // src/domain/org-shop.ts
6
- var ORG_TEMPLATES = [
7
- // ── Engineering ──
8
- {
9
- key: "startup-mvp",
10
- name: "Startup MVP",
11
- description: "Ship an MVP in 48 hours",
12
- lead_index: 0,
13
- agents: [
14
- { shop_key: "architect", name: "CTO" },
15
- { shop_key: "backend-dev", name: "Backend" },
16
- { shop_key: "backend-dev", name: "Backend 2" },
17
- { shop_key: "frontend-dev", name: "Frontend" },
18
- { shop_key: "qa-engineer", name: "QA" },
19
- { shop_key: "code-reviewer", name: "Reviewer" }
20
- ]
21
- },
22
- {
23
- key: "pr-review-corp",
24
- name: "PR Review Corp",
25
- description: "Automated review for every PR",
26
- lead_index: 0,
27
- agents: [
28
- { shop_key: "architect", name: "CTO" },
29
- { shop_key: "security-auditor", name: "Security" },
30
- { shop_key: "performance-engineer", name: "Performance" },
31
- { shop_key: "code-reviewer", name: "Style" },
32
- { shop_key: "qa-engineer", name: "QA" }
33
- ]
34
- },
35
- {
36
- key: "migration-squad",
37
- name: "Migration Squad",
38
- description: "JS-to-TS migration over a weekend",
39
- lead_index: 0,
40
- agents: [
41
- { shop_key: "architect", name: "CTO" },
42
- { shop_key: "fullstack-dev", name: "Migrator" },
43
- { shop_key: "fullstack-dev", name: "Migrator 2" },
44
- { shop_key: "fullstack-dev", name: "Migrator 3" },
45
- { shop_key: "qa-engineer", name: "QA" },
46
- { shop_key: "code-reviewer", name: "Reviewer" }
47
- ]
48
- },
49
- {
50
- key: "security-dept",
51
- name: "Security Department",
52
- description: "Multi-layer security audit",
53
- lead_index: 0,
54
- agents: [
55
- { shop_key: "security-auditor", name: "Lead Auditor" },
56
- { shop_key: "security-auditor", name: "Scanner" },
57
- { shop_key: "security-auditor", name: "Secrets Auditor" },
58
- { shop_key: "bug-hunter", name: "Hunter" },
59
- { shop_key: "code-reviewer", name: "Reviewer" }
60
- ]
61
- },
62
- {
63
- key: "test-factory",
64
- name: "Test Factory",
65
- description: "Coverage from 40% to 80% overnight",
66
- lead_index: 0,
67
- agents: [
68
- { shop_key: "qa-engineer", name: "Coverage Lead" },
69
- { shop_key: "backend-dev", name: "Backend" },
70
- { shop_key: "backend-dev", name: "Backend 2" },
71
- { shop_key: "qa-engineer", name: "QA" },
72
- { shop_key: "qa-engineer", name: "QA 2" },
73
- { shop_key: "code-reviewer", name: "Reviewer" }
74
- ]
75
- },
76
- // ── Beyond Engineering ──
77
- {
78
- key: "content-agency",
79
- name: "Content Agency",
80
- description: "Content factory: plan, write, edit, optimize",
81
- lead_index: 0,
82
- agents: [
83
- { shop_key: "marketer", name: "Strategist" },
84
- { shop_key: "content-creator", name: "Writer" },
85
- { shop_key: "content-creator", name: "Writer 2" },
86
- { shop_key: "tech-writer", name: "Editor" },
87
- { shop_key: "growth-hacker", name: "SEO" }
88
- ]
89
- },
90
- {
91
- key: "data-lab",
92
- name: "Data Lab",
93
- description: "3 CSVs to executive report by morning",
94
- lead_index: 0,
95
- agents: [
96
- { shop_key: "data-engineer", name: "Lead Analyst" },
97
- { shop_key: "data-engineer", name: "Data Engineer" }
98
- ]
99
- },
100
- {
101
- key: "sales-machine",
102
- name: "Sales Machine",
103
- description: "Outbound pipeline: research, outreach, follow-up, close",
104
- lead_index: 0,
105
- agents: [
106
- { shop_key: "marketer", name: "Sales Director" },
107
- { shop_key: "content-creator", name: "SDR" },
108
- { shop_key: "content-creator", name: "SDR 2" },
109
- { shop_key: "content-creator", name: "Copywriter" },
110
- { shop_key: "growth-hacker", name: "Growth Analyst" }
111
- ]
112
- },
113
- {
114
- key: "bugfix-dept",
115
- name: "Bugfix Department",
116
- description: "100 issues to 0 in a week",
117
- lead_index: 0,
118
- agents: [
119
- { shop_key: "architect", name: "Triager" },
120
- { shop_key: "bug-hunter", name: "Fixer" },
121
- { shop_key: "bug-hunter", name: "Fixer 2" },
122
- { shop_key: "bug-hunter", name: "Fixer 3" },
123
- { shop_key: "qa-engineer", name: "QA" },
124
- { shop_key: "code-reviewer", name: "Reviewer" }
125
- ]
126
- },
127
- {
128
- key: "docs-team",
129
- name: "Docs Team",
130
- description: "Technical docs from codebase analysis",
131
- lead_index: 0,
132
- agents: [
133
- { shop_key: "architect", name: "Docs Lead" },
134
- { shop_key: "tech-writer", name: "Writer" },
135
- { shop_key: "tech-writer", name: "Writer 2" },
136
- { shop_key: "tech-writer", name: "Editor" },
137
- { shop_key: "code-reviewer", name: "Reviewer" }
138
- ]
139
- }
140
- ];
141
- function getOrgTemplateByKey(key) {
142
- return ORG_TEMPLATES.find((t) => t.key === key);
143
- }
144
-
145
- // src/cli/commands/org.ts
146
- function registerOrgCommand(program, container) {
147
- const org = program.command("org").description("Pre-built AI companies \u2014 deploy a full department with one command");
148
- org.command("list").alias("ls").description("List available company templates").action(async () => {
149
- if (container.context.json) {
150
- console.log(JSON.stringify(ORG_TEMPLATES, null, 2));
151
- return;
152
- }
153
- console.log();
154
- const headers = ["KEY", "NAME", "AGENTS", "DESCRIPTION"];
155
- const rows = ORG_TEMPLATES.map((t) => [
156
- t.key,
157
- t.name,
158
- String(t.agents.length),
159
- t.description
160
- ]);
161
- printTable(headers, rows);
162
- console.log();
163
- console.log(` ${dim("Deploy:")} orch org deploy <key> --goal "Your objective"`);
164
- console.log();
165
- });
166
- org.command("deploy <template>").description("Deploy a pre-built AI company").option("--goal <goal>", "Set a goal for the team").action(async (templateKey, opts) => {
167
- await container.paths.requireInit();
168
- const template = getOrgTemplateByKey(templateKey);
169
- if (!template) {
170
- printError(
171
- `Unknown template "${templateKey}"`,
172
- `Run: orch org list \u2014 to see available templates`
173
- );
174
- process.exitCode = 1;
175
- return;
176
- }
177
- const agentIds = [];
178
- for (const entry of template.agents) {
179
- const shopTemplate = getShopTemplateByKey(entry.shop_key);
180
- if (!shopTemplate) {
181
- printError(`Agent shop template not found: ${entry.shop_key}`);
182
- process.exitCode = 1;
183
- return;
184
- }
185
- try {
186
- const agent = await container.agentService.create({
187
- name: entry.name,
188
- adapter: shopTemplate.adapter,
189
- role: shopTemplate.role,
190
- model: shopTemplate.model,
191
- approval_policy: shopTemplate.approval_policy,
192
- skills: shopTemplate.skills
193
- });
194
- agentIds.push(agent.id);
195
- } catch (err) {
196
- printError(
197
- `Failed to create agent "${entry.name}": ${err instanceof Error ? err.message : String(err)}`,
198
- agentIds.length > 0 ? `${agentIds.length} agent(s) were already created. Clean up with: orch agent list` : void 0
199
- );
200
- process.exitCode = 1;
201
- return;
202
- }
203
- }
204
- const leadId = agentIds[template.lead_index];
205
- const memberIds = agentIds.filter((id) => id !== leadId);
206
- const team = await container.teamService.create({
207
- name: template.name,
208
- description: template.description,
209
- lead_agent_id: leadId,
210
- member_agent_ids: memberIds
211
- });
212
- let goalId;
213
- if (opts.goal) {
214
- const goal = await container.goalService.create({
215
- title: opts.goal,
216
- assignee: leadId
217
- });
218
- goalId = goal.id;
219
- }
220
- if (container.context.json) {
221
- console.log(JSON.stringify({ team, agentIds, goalId }, null, 2));
222
- return;
223
- }
224
- if (container.context.quiet) {
225
- console.log(team.id);
226
- return;
227
- }
228
- console.log();
229
- printSuccess(`Deployed team "${template.name}" \u2014 ${template.agents.length} agents`);
230
- console.log();
231
- for (let i = 0; i < template.agents.length; i++) {
232
- const entry = template.agents[i];
233
- const id = agentIds[i];
234
- const isLead = i === template.lead_index;
235
- const role = isLead ? "lead" : "member";
236
- console.log(` ${isLead ? "\u2605" : "\u2022"} ${entry.name} ${dim(`(${id}, ${role})`)}`);
237
- }
238
- console.log(`
239
- Team: ${dim(team.id)}`);
240
- if (goalId) {
241
- console.log(` Goal: ${dim(goalId)} \u2014 "${opts.goal}"`);
242
- }
243
- console.log();
244
- console.log(` ${dim("Next:")} orch run --all --watch`);
245
- console.log();
246
- });
247
- }
248
-
249
- export { registerOrgCommand };
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export { ProcessManager, readLines } from './chunk-CHIP7O6V.js';
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export { AdapterRegistry } from './chunk-45K2XID7.js';
@@ -1,95 +0,0 @@
1
- #!/usr/bin/env node
2
- import { printError, amber, printSuccess, dim, getIcon } from './chunk-7X2GI5OV.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,5 +0,0 @@
1
- #!/usr/bin/env node
2
- export { ShellAdapter } from './chunk-XJTJ2TJV.js';
3
- import './chunk-MGGSRXWJ.js';
4
- import './chunk-2C2TFQ7K.js';
5
- import './chunk-CHIP7O6V.js';
@@ -1,79 +0,0 @@
1
- #!/usr/bin/env node
2
- import * as readline from 'readline';
3
- import chalk from 'chalk';
4
-
5
- async function pickFromShop(templates) {
6
- if (!process.stdin.isTTY) return null;
7
- let selected = 0;
8
- function getPageSize() {
9
- const rows = process.stdout.rows ?? 24;
10
- return Math.max(1, Math.min(templates.length, rows - 4));
11
- }
12
- function render() {
13
- const pageSize = getPageSize();
14
- process.stdout.write("\x1B[2J\x1B[H");
15
- console.log(chalk.bold.yellow("\n AGENT SHOP") + chalk.gray(" \u2014 arrow keys to navigate, enter to select, q to cancel\n"));
16
- const start = Math.max(0, Math.min(selected - Math.floor(pageSize / 2), templates.length - pageSize));
17
- const end = Math.min(start + pageSize, templates.length);
18
- for (let i = start; i < end; i++) {
19
- const t = templates[i];
20
- const isSelected = i === selected;
21
- const cursor = isSelected ? chalk.yellow(" \u25B8 ") : " ";
22
- const name = isSelected ? chalk.bold.white(t.name) : chalk.gray(t.name);
23
- const desc = chalk.gray(` \u2014 ${t.description}`);
24
- const model = chalk.gray.dim(` [${t.model.replace("claude-", "")}]`);
25
- console.log(`${cursor}${name}${desc}${model}`);
26
- }
27
- if (templates.length > pageSize) {
28
- console.log(chalk.gray(`
29
- ${start + 1}-${end} of ${templates.length}`));
30
- }
31
- }
32
- return new Promise((resolve) => {
33
- const rl = readline.createInterface({ input: process.stdin });
34
- process.stdin.setRawMode(true);
35
- readline.emitKeypressEvents(process.stdin);
36
- function cleanup() {
37
- process.stdin.removeListener("keypress", onKeypress);
38
- try {
39
- process.stdin.setRawMode(false);
40
- } catch {
41
- }
42
- rl.close();
43
- process.stdout.write("\x1B[2J\x1B[H");
44
- }
45
- const onKeypress = (_ch, key) => {
46
- if (key.name === "up" || key.ctrl && key.name === "p") {
47
- selected = (selected - 1 + templates.length) % templates.length;
48
- render();
49
- } else if (key.name === "down" || key.ctrl && key.name === "n") {
50
- selected = (selected + 1) % templates.length;
51
- render();
52
- } else if (key.name === "return") {
53
- cleanup();
54
- resolve(templates[selected]);
55
- } else if (key.name === "q" || key.name === "escape" || key.ctrl && key.name === "c") {
56
- cleanup();
57
- resolve(null);
58
- }
59
- };
60
- rl.on("error", () => {
61
- cleanup();
62
- resolve(null);
63
- });
64
- rl.on("close", () => {
65
- cleanup();
66
- resolve(null);
67
- });
68
- try {
69
- render();
70
- } catch {
71
- cleanup();
72
- resolve(null);
73
- return;
74
- }
75
- process.stdin.on("keypress", onKeypress);
76
- });
77
- }
78
-
79
- export { pickFromShop };
@@ -1,56 +0,0 @@
1
- #!/usr/bin/env node
2
- import { formatDurationSince, amber, dim, statusIcon, agentName, priorityLabel, formatTokens } from './chunk-7X2GI5OV.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 };