@zmice/zc 0.1.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 (90) hide show
  1. package/README.md +87 -0
  2. package/dist/adapters/codex.d.ts +13 -0
  3. package/dist/adapters/codex.d.ts.map +1 -0
  4. package/dist/adapters/codex.js +61 -0
  5. package/dist/adapters/codex.js.map +1 -0
  6. package/dist/adapters/index.d.ts +4 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +8 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/qwen-code.d.ts +13 -0
  11. package/dist/adapters/qwen-code.d.ts.map +1 -0
  12. package/dist/adapters/qwen-code.js +60 -0
  13. package/dist/adapters/qwen-code.js.map +1 -0
  14. package/dist/adapters/types.d.ts +29 -0
  15. package/dist/adapters/types.d.ts.map +1 -0
  16. package/dist/adapters/types.js +11 -0
  17. package/dist/adapters/types.js.map +1 -0
  18. package/dist/cli/doctor.d.ts +3 -0
  19. package/dist/cli/doctor.d.ts.map +1 -0
  20. package/dist/cli/doctor.js +98 -0
  21. package/dist/cli/doctor.js.map +1 -0
  22. package/dist/cli/index.d.ts +3 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +22 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/cli/msg.d.ts +3 -0
  27. package/dist/cli/msg.d.ts.map +1 -0
  28. package/dist/cli/msg.js +20 -0
  29. package/dist/cli/msg.js.map +1 -0
  30. package/dist/cli/run.d.ts +17 -0
  31. package/dist/cli/run.d.ts.map +1 -0
  32. package/dist/cli/run.js +70 -0
  33. package/dist/cli/run.js.map +1 -0
  34. package/dist/cli/setup.d.ts +3 -0
  35. package/dist/cli/setup.d.ts.map +1 -0
  36. package/dist/cli/setup.js +41 -0
  37. package/dist/cli/setup.js.map +1 -0
  38. package/dist/cli/task.d.ts +3 -0
  39. package/dist/cli/task.d.ts.map +1 -0
  40. package/dist/cli/task.js +20 -0
  41. package/dist/cli/task.js.map +1 -0
  42. package/dist/cli/team.d.ts +3 -0
  43. package/dist/cli/team.d.ts.map +1 -0
  44. package/dist/cli/team.js +169 -0
  45. package/dist/cli/team.js.map +1 -0
  46. package/dist/runtime/logger.d.ts +2 -0
  47. package/dist/runtime/logger.d.ts.map +1 -0
  48. package/dist/runtime/logger.js +2 -0
  49. package/dist/runtime/logger.js.map +1 -0
  50. package/dist/runtime/session-manager.d.ts +39 -0
  51. package/dist/runtime/session-manager.d.ts.map +1 -0
  52. package/dist/runtime/session-manager.js +107 -0
  53. package/dist/runtime/session-manager.js.map +1 -0
  54. package/dist/runtime/state.d.ts +9 -0
  55. package/dist/runtime/state.d.ts.map +1 -0
  56. package/dist/runtime/state.js +22 -0
  57. package/dist/runtime/state.js.map +1 -0
  58. package/dist/runtime/worktree-manager.d.ts +39 -0
  59. package/dist/runtime/worktree-manager.d.ts.map +1 -0
  60. package/dist/runtime/worktree-manager.js +123 -0
  61. package/dist/runtime/worktree-manager.js.map +1 -0
  62. package/dist/team/mailbox.d.ts +22 -0
  63. package/dist/team/mailbox.d.ts.map +1 -0
  64. package/dist/team/mailbox.js +52 -0
  65. package/dist/team/mailbox.js.map +1 -0
  66. package/dist/team/orchestrator.d.ts +68 -0
  67. package/dist/team/orchestrator.d.ts.map +1 -0
  68. package/dist/team/orchestrator.js +248 -0
  69. package/dist/team/orchestrator.js.map +1 -0
  70. package/dist/team/task-queue.d.ts +34 -0
  71. package/dist/team/task-queue.d.ts.map +1 -0
  72. package/dist/team/task-queue.js +97 -0
  73. package/dist/team/task-queue.js.map +1 -0
  74. package/dist/team/worker-manager.d.ts +54 -0
  75. package/dist/team/worker-manager.d.ts.map +1 -0
  76. package/dist/team/worker-manager.js +159 -0
  77. package/dist/team/worker-manager.js.map +1 -0
  78. package/dist/utils/config.d.ts +2 -0
  79. package/dist/utils/config.d.ts.map +1 -0
  80. package/dist/utils/config.js +2 -0
  81. package/dist/utils/config.js.map +1 -0
  82. package/dist/utils/platform.d.ts +17 -0
  83. package/dist/utils/platform.d.ts.map +1 -0
  84. package/dist/utils/platform.js +46 -0
  85. package/dist/utils/platform.js.map +1 -0
  86. package/dist/utils/skill-loader.d.ts +46 -0
  87. package/dist/utils/skill-loader.d.ts.map +1 -0
  88. package/dist/utils/skill-loader.js +210 -0
  89. package/dist/utils/skill-loader.js.map +1 -0
  90. package/package.json +36 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-manager.js","sourceRoot":"","sources":["../../src/runtime/worktree-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface Message {
2
+ id: string;
3
+ from: string;
4
+ to: string;
5
+ body: string;
6
+ timestamp: string;
7
+ status: "pending" | "delivered" | "read";
8
+ }
9
+ export declare class Mailbox {
10
+ private messages;
11
+ private filePath;
12
+ constructor(teamDir: string);
13
+ load(): Promise<void>;
14
+ private save;
15
+ send(from: string, to: string, body: string): Promise<Message>;
16
+ broadcast(from: string, body: string): Promise<Message>;
17
+ list(workerId: string): Message[];
18
+ markDelivered(msgId: string): Promise<void>;
19
+ markRead(msgId: string): Promise<void>;
20
+ allMessages(): Message[];
21
+ }
22
+ //# sourceMappingURL=mailbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../src/team/mailbox.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;CAC1C;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM;IAIrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,IAAI;IAIZ,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc9D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7D,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE;IAM3B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,WAAW,IAAI,OAAO,EAAE;CAGzB"}
@@ -0,0 +1,52 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readJson, writeJson } from "../runtime/state.js";
3
+ export class Mailbox {
4
+ messages = [];
5
+ filePath;
6
+ constructor(teamDir) {
7
+ this.filePath = `${teamDir}/mailbox.json`;
8
+ }
9
+ async load() {
10
+ this.messages = await readJson(this.filePath, []);
11
+ }
12
+ async save() {
13
+ await writeJson(this.filePath, this.messages);
14
+ }
15
+ async send(from, to, body) {
16
+ const msg = {
17
+ id: randomUUID().slice(0, 8),
18
+ from,
19
+ to,
20
+ body,
21
+ timestamp: new Date().toISOString(),
22
+ status: "pending",
23
+ };
24
+ this.messages.push(msg);
25
+ await this.save();
26
+ return msg;
27
+ }
28
+ async broadcast(from, body) {
29
+ return this.send(from, "all", body);
30
+ }
31
+ list(workerId) {
32
+ return this.messages.filter((m) => m.to === workerId || m.to === "all");
33
+ }
34
+ async markDelivered(msgId) {
35
+ const msg = this.messages.find((m) => m.id === msgId);
36
+ if (msg) {
37
+ msg.status = "delivered";
38
+ await this.save();
39
+ }
40
+ }
41
+ async markRead(msgId) {
42
+ const msg = this.messages.find((m) => m.id === msgId);
43
+ if (msg) {
44
+ msg.status = "read";
45
+ await this.save();
46
+ }
47
+ }
48
+ allMessages() {
49
+ return [...this.messages];
50
+ }
51
+ }
52
+ //# sourceMappingURL=mailbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../src/team/mailbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAW1D,MAAM,OAAO,OAAO;IACV,QAAQ,GAAc,EAAE,CAAC;IACzB,QAAQ,CAAS;IAEzB,YAAY,OAAe;QACzB,IAAI,CAAC,QAAQ,GAAG,GAAG,OAAO,eAAe,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAY,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,EAAU,EAAE,IAAY;QAC/C,MAAM,GAAG,GAAY;YACnB,EAAE,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI;YACJ,EAAE;YACF,IAAI;YACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,SAAS;SAClB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,IAAY;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,QAAgB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CACzB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAC3C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;QACtD,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;YACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;QACtD,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;YACpB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,68 @@
1
+ import { TaskQueue } from "./task-queue.js";
2
+ import { Mailbox } from "./mailbox.js";
3
+ import { WorkerManager, type WorkerInfo } from "./worker-manager.js";
4
+ import type { SessionManager } from "../runtime/session-manager.js";
5
+ import type { WorktreeManager } from "../runtime/worktree-manager.js";
6
+ export interface TeamSpec {
7
+ name: string;
8
+ workers: Array<{
9
+ id: string;
10
+ cli: string;
11
+ }>;
12
+ tasks: string[];
13
+ model?: string;
14
+ skills?: string[];
15
+ skillMatchMode?: "keyword" | "ai";
16
+ }
17
+ export interface TeamStatus {
18
+ name: string;
19
+ workers: WorkerInfo[];
20
+ tasks: {
21
+ pending: number;
22
+ running: number;
23
+ done: number;
24
+ failed: number;
25
+ };
26
+ messages: number;
27
+ }
28
+ export declare class Orchestrator {
29
+ private readonly stateDir;
30
+ private readonly sessionManager;
31
+ private readonly worktreeManager;
32
+ private taskQueue;
33
+ private mailbox;
34
+ private workerManager;
35
+ private teamName;
36
+ private model?;
37
+ private running;
38
+ private dispatchTimer;
39
+ /** Cached skills discovered at team startup */
40
+ private availableSkills;
41
+ private skillMatcher;
42
+ /** Map workerId → { taskId, claimToken } for running tasks */
43
+ private activeAssignments;
44
+ constructor(stateDir: string, sessionManager: SessionManager, worktreeManager: WorktreeManager);
45
+ startTeam(spec: TeamSpec): Promise<void>;
46
+ /**
47
+ * Run one iteration of the dispatch loop (exposed for testing).
48
+ */
49
+ dispatchOnce(): Promise<void>;
50
+ /**
51
+ * Continuous dispatch loop – runs until `shutdown()` is called.
52
+ */
53
+ runDispatchLoop(): Promise<void>;
54
+ getStatus(): Promise<TeamStatus>;
55
+ shutdown(): Promise<void>;
56
+ getWorkerManager(): WorkerManager;
57
+ getMailbox(): Mailbox;
58
+ getTaskQueue(): TaskQueue;
59
+ private scheduleDispatch;
60
+ private checkWorkerHealth;
61
+ private persistState;
62
+ /**
63
+ * Enrich a task prompt with matched skill context summaries.
64
+ */
65
+ private enrichWithSkills;
66
+ private sleep;
67
+ }
68
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/team/orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAa,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAWtE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,qBAAa,YAAY;IAkBrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAnBlC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAA8C;IAEnE,+CAA+C;IAC/C,OAAO,CAAC,eAAe,CAAmB;IAE1C,OAAO,CAAC,YAAY,CAA2C;IAE/D,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB,CAAwD;gBAG9D,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,eAAe;IAK7C,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgE9C;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA6CnC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAOhC,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAkBhC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB/B,gBAAgB,IAAI,aAAa;IAIjC,UAAU,IAAI,OAAO;IAIrB,YAAY,IAAI,SAAS;IAMzB,OAAO,CAAC,gBAAgB;YAYV,iBAAiB;YA0BjB,YAAY;IAK1B;;OAEG;YACW,gBAAgB;IAgC9B,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,248 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import { TaskQueue } from "./task-queue.js";
3
+ import { Mailbox } from "./mailbox.js";
4
+ import { WorkerManager } from "./worker-manager.js";
5
+ import { writeJson } from "../runtime/state.js";
6
+ import { discoverSkills, matchSkills, KeywordSkillMatcher, AISkillMatcher, } from "../utils/skill-loader.js";
7
+ import { getAdapter } from "../adapters/types.js";
8
+ const DISPATCH_INTERVAL_MS = 3000;
9
+ export class Orchestrator {
10
+ stateDir;
11
+ sessionManager;
12
+ worktreeManager;
13
+ taskQueue;
14
+ mailbox;
15
+ workerManager;
16
+ teamName = "";
17
+ model;
18
+ running = false;
19
+ dispatchTimer = null;
20
+ /** Cached skills discovered at team startup */
21
+ availableSkills = [];
22
+ skillMatcher = new KeywordSkillMatcher();
23
+ /** Map workerId → { taskId, claimToken } for running tasks */
24
+ activeAssignments = new Map();
25
+ constructor(stateDir, sessionManager, worktreeManager) {
26
+ this.stateDir = stateDir;
27
+ this.sessionManager = sessionManager;
28
+ this.worktreeManager = worktreeManager;
29
+ }
30
+ // --- public API ---
31
+ async startTeam(spec) {
32
+ this.teamName = spec.name;
33
+ this.model = spec.model;
34
+ const teamDir = `${this.stateDir}/${spec.name}`;
35
+ // 1. Create state directory
36
+ await mkdir(teamDir, { recursive: true });
37
+ // 2. Initialise sub-systems
38
+ this.taskQueue = new TaskQueue(teamDir);
39
+ await this.taskQueue.load();
40
+ this.mailbox = new Mailbox(teamDir);
41
+ await this.mailbox.load();
42
+ this.workerManager = new WorkerManager(spec.name, this.sessionManager, this.worktreeManager);
43
+ // 3. Create tmux session for team
44
+ await this.sessionManager.createSession(`zc-${spec.name}`);
45
+ // 4. Create tasks
46
+ for (const desc of spec.tasks) {
47
+ await this.taskQueue.create({
48
+ title: desc,
49
+ description: desc,
50
+ dependencies: [],
51
+ files: [],
52
+ skills: spec.skills,
53
+ });
54
+ }
55
+ // 5. Discover available skills for context injection
56
+ try {
57
+ this.availableSkills = await discoverSkills();
58
+ }
59
+ catch {
60
+ this.availableSkills = [];
61
+ }
62
+ // 6. Initialize skill matcher
63
+ if (spec.skillMatchMode === "ai") {
64
+ const adapterName = spec.workers[0]?.cli;
65
+ const adapter = adapterName ? getAdapter(adapterName) : undefined;
66
+ if (adapter?.query) {
67
+ this.skillMatcher = new AISkillMatcher(adapter);
68
+ }
69
+ }
70
+ // 7. Spawn workers
71
+ for (const w of spec.workers) {
72
+ await this.workerManager.spawnWorker(w.id, w.cli);
73
+ }
74
+ // 7. Persist initial state
75
+ await this.persistState();
76
+ // 8. Start dispatch loop
77
+ this.running = true;
78
+ this.scheduleDispatch();
79
+ }
80
+ /**
81
+ * Run one iteration of the dispatch loop (exposed for testing).
82
+ */
83
+ async dispatchOnce() {
84
+ // 1. Check health of busy workers and handle finished/dead ones
85
+ await this.checkWorkerHealth();
86
+ // 2. Dispatch ready tasks to idle workers
87
+ const readyTasks = this.taskQueue.getReady();
88
+ const idleWorkers = this.workerManager.getIdleWorkers();
89
+ const pairs = Math.min(readyTasks.length, idleWorkers.length);
90
+ for (let i = 0; i < pairs; i++) {
91
+ const task = readyTasks[i];
92
+ const worker = idleWorkers[i];
93
+ let token;
94
+ try {
95
+ const claimResult = await this.taskQueue.claim(task.id, worker.id);
96
+ token = claimResult.token;
97
+ await this.taskQueue.transition(task.id, token, "in_progress");
98
+ // Enrich prompt with matched skill context
99
+ const enrichedPrompt = await this.enrichWithSkills(task);
100
+ await this.workerManager.assignTask(worker.id, task.id, enrichedPrompt, this.model);
101
+ this.activeAssignments.set(worker.id, { taskId: task.id, token });
102
+ }
103
+ catch {
104
+ // Rollback: if we already claimed the task, release it back to pending
105
+ if (token) {
106
+ try {
107
+ await this.taskQueue.release(task.id, token);
108
+ }
109
+ catch {
110
+ // rollback failure is non-fatal
111
+ }
112
+ }
113
+ }
114
+ }
115
+ // 3. Persist state
116
+ await this.persistState();
117
+ }
118
+ /**
119
+ * Continuous dispatch loop – runs until `shutdown()` is called.
120
+ */
121
+ async runDispatchLoop() {
122
+ while (this.running) {
123
+ await this.dispatchOnce();
124
+ await this.sleep(DISPATCH_INTERVAL_MS);
125
+ }
126
+ }
127
+ async getStatus() {
128
+ const workers = this.workerManager.listWorkers();
129
+ const allTasks = this.taskQueue.list();
130
+ const messages = this.mailbox.allMessages();
131
+ return {
132
+ name: this.teamName,
133
+ workers,
134
+ tasks: {
135
+ pending: allTasks.filter((t) => t.status === "pending" || t.status === "claimed").length,
136
+ running: allTasks.filter((t) => t.status === "in_progress").length,
137
+ done: allTasks.filter((t) => t.status === "completed").length,
138
+ failed: allTasks.filter((t) => t.status === "failed").length,
139
+ },
140
+ messages: messages.length,
141
+ };
142
+ }
143
+ async shutdown() {
144
+ this.running = false;
145
+ if (this.dispatchTimer) {
146
+ clearTimeout(this.dispatchTimer);
147
+ this.dispatchTimer = null;
148
+ }
149
+ // Release all active assignments back to pending
150
+ for (const [, { taskId, token }] of this.activeAssignments) {
151
+ try {
152
+ await this.taskQueue.release(taskId, token);
153
+ }
154
+ catch {
155
+ // task may already be completed / failed
156
+ }
157
+ }
158
+ this.activeAssignments.clear();
159
+ await this.workerManager.shutdownAll();
160
+ await this.persistState();
161
+ }
162
+ // --- Expose sub-systems for CLI layer ---
163
+ getWorkerManager() {
164
+ return this.workerManager;
165
+ }
166
+ getMailbox() {
167
+ return this.mailbox;
168
+ }
169
+ getTaskQueue() {
170
+ return this.taskQueue;
171
+ }
172
+ // --- private helpers ---
173
+ scheduleDispatch() {
174
+ if (!this.running)
175
+ return;
176
+ this.dispatchTimer = setTimeout(async () => {
177
+ try {
178
+ await this.dispatchOnce();
179
+ }
180
+ catch {
181
+ // keep loop alive
182
+ }
183
+ this.scheduleDispatch();
184
+ }, DISPATCH_INTERVAL_MS);
185
+ }
186
+ async checkWorkerHealth() {
187
+ const workers = this.workerManager.listWorkers();
188
+ for (const w of workers) {
189
+ if (w.status === "busy") {
190
+ const alive = await this.workerManager.healthCheck(w.id);
191
+ if (!alive) {
192
+ // Worker died while running a task → mark task as failed
193
+ const assignment = this.activeAssignments.get(w.id);
194
+ if (assignment) {
195
+ try {
196
+ await this.taskQueue.transition(assignment.taskId, assignment.token, "failed");
197
+ }
198
+ catch {
199
+ // ignore
200
+ }
201
+ this.activeAssignments.delete(w.id);
202
+ }
203
+ }
204
+ }
205
+ }
206
+ }
207
+ async persistState() {
208
+ const status = await this.getStatus();
209
+ await writeJson(`${this.stateDir}/${this.teamName}/state.json`, status);
210
+ }
211
+ /**
212
+ * Enrich a task prompt with matched skill context summaries.
213
+ */
214
+ async enrichWithSkills(task) {
215
+ if (this.availableSkills.length === 0)
216
+ return task.description;
217
+ let matched;
218
+ // Priority 1: Manual skills specification
219
+ if (task.skills && task.skills.length > 0) {
220
+ matched = task.skills
221
+ .map((name) => this.availableSkills.find((s) => s.name === name))
222
+ .filter((s) => s !== undefined);
223
+ }
224
+ else {
225
+ // Priority 2: Use configured skill matcher (AI or keyword)
226
+ try {
227
+ const result = this.skillMatcher.match(task.description, this.availableSkills);
228
+ matched = result instanceof Promise ? await result : result;
229
+ }
230
+ catch {
231
+ // AI matcher failed, fallback to keyword matching
232
+ matched = matchSkills(task.description, this.availableSkills);
233
+ }
234
+ }
235
+ if (matched.length === 0)
236
+ return task.description;
237
+ // Take top 3 matches, extract first 500 chars as summary
238
+ const summaries = matched.slice(0, 3).map((s) => {
239
+ const summary = s.content.slice(0, 500);
240
+ return `[Skill: ${s.name}]\n${summary}...`;
241
+ });
242
+ return `${task.description}\n\n--- Related Skills ---\n${summaries.join("\n\n")}`;
243
+ }
244
+ sleep(ms) {
245
+ return new Promise((resolve) => setTimeout(resolve, ms));
246
+ }
247
+ }
248
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/team/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface Task {
2
+ id: string;
3
+ title: string;
4
+ description: string;
5
+ status: "pending" | "claimed" | "in_progress" | "completed" | "failed";
6
+ assignee?: string;
7
+ claimToken?: string;
8
+ dependencies: string[];
9
+ files: string[];
10
+ skills?: string[];
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ }
14
+ export declare class TaskQueue {
15
+ private tasks;
16
+ private filePath;
17
+ constructor(teamDir: string);
18
+ load(): Promise<void>;
19
+ private save;
20
+ create(task: Omit<Task, "id" | "createdAt" | "updatedAt" | "status">): Promise<Task>;
21
+ claim(taskId: string, workerId: string): Promise<{
22
+ task: Task;
23
+ token: string;
24
+ }>;
25
+ transition(taskId: string, token: string, newStatus: Task["status"]): Promise<Task>;
26
+ release(taskId: string, token: string): Promise<void>;
27
+ list(filter?: {
28
+ status?: Task["status"];
29
+ }): Task[];
30
+ getBlocked(): Task[];
31
+ getReady(): Task[];
32
+ getById(taskId: string): Task | undefined;
33
+ }
34
+ //# sourceMappingURL=task-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-queue.d.ts","sourceRoot":"","sources":["../../src/team/task-queue.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM;IAIrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,IAAI;IAIZ,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpF,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAc/E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnF,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;KAAE,GAAG,IAAI,EAAE;IAKlD,UAAU,IAAI,IAAI,EAAE;IAWpB,QAAQ,IAAI,IAAI,EAAE;IAWlB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;CAG1C"}
@@ -0,0 +1,97 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readJson, writeJson } from "../runtime/state.js";
3
+ export class TaskQueue {
4
+ tasks = [];
5
+ filePath;
6
+ constructor(teamDir) {
7
+ this.filePath = `${teamDir}/tasks.json`;
8
+ }
9
+ async load() {
10
+ this.tasks = await readJson(this.filePath, []);
11
+ }
12
+ async save() {
13
+ await writeJson(this.filePath, this.tasks);
14
+ }
15
+ async create(task) {
16
+ const now = new Date().toISOString();
17
+ const newTask = {
18
+ ...task,
19
+ id: randomUUID().slice(0, 8),
20
+ status: "pending",
21
+ createdAt: now,
22
+ updatedAt: now,
23
+ };
24
+ this.tasks.push(newTask);
25
+ await this.save();
26
+ return newTask;
27
+ }
28
+ async claim(taskId, workerId) {
29
+ const task = this.tasks.find((t) => t.id === taskId);
30
+ if (!task)
31
+ throw new Error(`Task not found: ${taskId}`);
32
+ if (task.status !== "pending")
33
+ throw new Error(`Task ${taskId} is not claimable (status: ${task.status})`);
34
+ const token = randomUUID();
35
+ task.status = "claimed";
36
+ task.assignee = workerId;
37
+ task.claimToken = token;
38
+ task.updatedAt = new Date().toISOString();
39
+ await this.save();
40
+ return { task, token };
41
+ }
42
+ async transition(taskId, token, newStatus) {
43
+ const task = this.tasks.find((t) => t.id === taskId);
44
+ if (!task)
45
+ throw new Error(`Task not found: ${taskId}`);
46
+ if (task.claimToken !== token)
47
+ throw new Error(`Invalid claim token for task ${taskId}`);
48
+ task.status = newStatus;
49
+ task.updatedAt = new Date().toISOString();
50
+ if (newStatus === "completed" || newStatus === "failed") {
51
+ task.claimToken = undefined;
52
+ }
53
+ await this.save();
54
+ return task;
55
+ }
56
+ async release(taskId, token) {
57
+ const task = this.tasks.find((t) => t.id === taskId);
58
+ if (!task)
59
+ throw new Error(`Task not found: ${taskId}`);
60
+ if (task.claimToken !== token)
61
+ throw new Error(`Invalid claim token for task ${taskId}`);
62
+ task.status = "pending";
63
+ task.assignee = undefined;
64
+ task.claimToken = undefined;
65
+ task.updatedAt = new Date().toISOString();
66
+ await this.save();
67
+ }
68
+ list(filter) {
69
+ if (!filter?.status)
70
+ return [...this.tasks];
71
+ return this.tasks.filter((t) => t.status === filter.status);
72
+ }
73
+ getBlocked() {
74
+ return this.tasks.filter((t) => t.status === "pending" &&
75
+ t.dependencies.length > 0 &&
76
+ t.dependencies.some((dep) => {
77
+ const depTask = this.tasks.find((d) => d.id === dep);
78
+ return !depTask || depTask.status !== "completed";
79
+ }));
80
+ }
81
+ getReady() {
82
+ return this.tasks.filter((t) => {
83
+ if (t.status !== "pending")
84
+ return false;
85
+ if (t.dependencies.length === 0)
86
+ return true;
87
+ return t.dependencies.every((dep) => {
88
+ const depTask = this.tasks.find((d) => d.id === dep);
89
+ return depTask?.status === "completed";
90
+ });
91
+ });
92
+ }
93
+ getById(taskId) {
94
+ return this.tasks.find((t) => t.id === taskId);
95
+ }
96
+ }
97
+ //# sourceMappingURL=task-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-queue.js","sourceRoot":"","sources":["../../src/team/task-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAgB1D,MAAM,OAAO,SAAS;IACZ,KAAK,GAAW,EAAE,CAAC;IACnB,QAAQ,CAAS;IAEzB,YAAY,OAAe;QACzB,IAAI,CAAC,QAAQ,GAAG,GAAG,OAAO,aAAa,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,KAAK,GAAG,MAAM,QAAQ,CAAS,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAA6D;QACxE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAS;YACpB,GAAG,IAAI;YACP,EAAE,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5B,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,QAAgB;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,8BAA8B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAE3G,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,KAAa,EAAE,SAAyB;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QAEzF,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YACxD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,KAAa;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QAEzF,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,MAAoC;QACvC,IAAI,CAAC,MAAM,EAAE,MAAM;YAAE,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,CAAC,CAAC,MAAM,KAAK,SAAS;YACtB,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YACzB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;gBACrD,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC;YACpD,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACzC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC7C,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;gBACrD,OAAO,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,54 @@
1
+ import { SessionManager } from "../runtime/session-manager.js";
2
+ import { WorktreeManager } from "../runtime/worktree-manager.js";
3
+ export interface WorkerInfo {
4
+ id: string;
5
+ cli: string;
6
+ status: "idle" | "busy" | "dead";
7
+ paneId: string;
8
+ worktree: string;
9
+ branch: string;
10
+ pid?: number;
11
+ currentTask?: string;
12
+ }
13
+ export declare class WorkerManager {
14
+ private readonly teamName;
15
+ private readonly sessionManager;
16
+ private readonly worktreeManager;
17
+ private workers;
18
+ constructor(teamName: string, sessionManager: SessionManager, worktreeManager: WorktreeManager);
19
+ /**
20
+ * Create a new worker: create worktree + tmux pane, cd into worktree
21
+ */
22
+ spawnWorker(id: string, cli: string): Promise<WorkerInfo>;
23
+ /**
24
+ * Assign a task to a worker: start CLI in its tmux pane
25
+ */
26
+ assignTask(workerId: string, taskId: string, prompt: string, model?: string): Promise<void>;
27
+ /**
28
+ * Get worker's current output via tmux capture
29
+ */
30
+ getOutput(workerId: string): Promise<string>;
31
+ /**
32
+ * Check if a worker's tmux pane is still alive
33
+ */
34
+ healthCheck(workerId: string): Promise<boolean>;
35
+ /**
36
+ * Kill a single worker: destroy pane, remove worktree
37
+ */
38
+ killWorker(workerId: string): Promise<void>;
39
+ /**
40
+ * Shutdown all workers and kill the tmux session
41
+ */
42
+ shutdownAll(): Promise<void>;
43
+ /**
44
+ * List all workers
45
+ */
46
+ listWorkers(): WorkerInfo[];
47
+ /**
48
+ * Get all idle workers
49
+ */
50
+ getIdleWorkers(): WorkerInfo[];
51
+ private getWorkerOrThrow;
52
+ private buildCliCommand;
53
+ }
54
+ //# sourceMappingURL=worker-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-manager.d.ts","sourceRoot":"","sources":["../../src/team/worker-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IALlC,OAAO,CAAC,OAAO,CAAiC;gBAG7B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,eAAe;IAGnD;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkC/D;;OAEG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IA2BhB;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrD;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAUlC;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE;IAI3B;;OAEG;IACH,cAAc,IAAI,UAAU,EAAE;IAM9B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,eAAe;CAwBxB"}