@mclawnet/swarm 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -0
- package/dist/__tests__/action-parser.test.js +29 -82
- package/dist/__tests__/action-parser.test.js.map +1 -1
- package/dist/__tests__/coordinator-create-tx.test.d.ts +2 -0
- package/dist/__tests__/coordinator-create-tx.test.d.ts.map +1 -0
- package/dist/__tests__/coordinator-create-tx.test.js +114 -0
- package/dist/__tests__/coordinator-create-tx.test.js.map +1 -0
- package/dist/__tests__/coordinator-inbox-migration.test.d.ts +2 -0
- package/dist/__tests__/coordinator-inbox-migration.test.d.ts.map +1 -0
- package/dist/__tests__/coordinator-inbox-migration.test.js +56 -0
- package/dist/__tests__/coordinator-inbox-migration.test.js.map +1 -0
- package/dist/__tests__/inbox-integration.test.d.ts +2 -0
- package/dist/__tests__/inbox-integration.test.d.ts.map +1 -0
- package/dist/__tests__/inbox-integration.test.js +120 -0
- package/dist/__tests__/inbox-integration.test.js.map +1 -0
- package/dist/__tests__/inbox-persistence-recovery.test.d.ts +2 -0
- package/dist/__tests__/inbox-persistence-recovery.test.d.ts.map +1 -0
- package/dist/__tests__/inbox-persistence-recovery.test.js +139 -0
- package/dist/__tests__/inbox-persistence-recovery.test.js.map +1 -0
- package/dist/__tests__/inbox-relay-interceptor.test.d.ts +2 -0
- package/dist/__tests__/inbox-relay-interceptor.test.d.ts.map +1 -0
- package/dist/__tests__/inbox-relay-interceptor.test.js +156 -0
- package/dist/__tests__/inbox-relay-interceptor.test.js.map +1 -0
- package/dist/__tests__/inbox-relay.test.d.ts +2 -0
- package/dist/__tests__/inbox-relay.test.d.ts.map +1 -0
- package/dist/__tests__/inbox-relay.test.js +318 -0
- package/dist/__tests__/inbox-relay.test.js.map +1 -0
- package/dist/__tests__/inbox-store.test.d.ts +2 -0
- package/dist/__tests__/inbox-store.test.d.ts.map +1 -0
- package/dist/__tests__/inbox-store.test.js +129 -0
- package/dist/__tests__/inbox-store.test.js.map +1 -0
- package/dist/__tests__/inbox-watcher.test.d.ts +2 -0
- package/dist/__tests__/inbox-watcher.test.d.ts.map +1 -0
- package/dist/__tests__/inbox-watcher.test.js +104 -0
- package/dist/__tests__/inbox-watcher.test.js.map +1 -0
- package/dist/__tests__/persistence-path.test.d.ts +2 -0
- package/dist/__tests__/persistence-path.test.d.ts.map +1 -0
- package/dist/__tests__/persistence-path.test.js +79 -0
- package/dist/__tests__/persistence-path.test.js.map +1 -0
- package/dist/__tests__/persistence-robust.test.d.ts +2 -0
- package/dist/__tests__/persistence-robust.test.d.ts.map +1 -0
- package/dist/__tests__/persistence-robust.test.js +125 -0
- package/dist/__tests__/persistence-robust.test.js.map +1 -0
- package/dist/__tests__/persistence.test.d.ts +2 -0
- package/dist/__tests__/persistence.test.d.ts.map +1 -0
- package/dist/__tests__/persistence.test.js +105 -0
- package/dist/__tests__/persistence.test.js.map +1 -0
- package/dist/__tests__/phase4-5-e2e.test.d.ts +2 -0
- package/dist/__tests__/phase4-5-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/phase4-5-e2e.test.js +203 -0
- package/dist/__tests__/phase4-5-e2e.test.js.map +1 -0
- package/dist/__tests__/phase6-7-e2e.test.d.ts +2 -0
- package/dist/__tests__/phase6-7-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/phase6-7-e2e.test.js +93 -0
- package/dist/__tests__/phase6-7-e2e.test.js.map +1 -0
- package/dist/__tests__/recovery-cross-project.test.d.ts +2 -0
- package/dist/__tests__/recovery-cross-project.test.d.ts.map +1 -0
- package/dist/__tests__/recovery-cross-project.test.js +87 -0
- package/dist/__tests__/recovery-cross-project.test.js.map +1 -0
- package/dist/__tests__/recovery-forwards-to-coordinator.test.d.ts +2 -0
- package/dist/__tests__/recovery-forwards-to-coordinator.test.d.ts.map +1 -0
- package/dist/__tests__/recovery-forwards-to-coordinator.test.js +59 -0
- package/dist/__tests__/recovery-forwards-to-coordinator.test.js.map +1 -0
- package/dist/__tests__/recovery-resume.test.d.ts +2 -0
- package/dist/__tests__/recovery-resume.test.d.ts.map +1 -0
- package/dist/__tests__/recovery-resume.test.js +132 -0
- package/dist/__tests__/recovery-resume.test.js.map +1 -0
- package/dist/__tests__/retrospective.test.js +1 -0
- package/dist/__tests__/retrospective.test.js.map +1 -1
- package/dist/__tests__/role-loader-preamble-all.test.d.ts +2 -0
- package/dist/__tests__/role-loader-preamble-all.test.d.ts.map +1 -0
- package/dist/__tests__/role-loader-preamble-all.test.js +38 -0
- package/dist/__tests__/role-loader-preamble-all.test.js.map +1 -0
- package/dist/__tests__/role-loader-tools.test.d.ts +2 -0
- package/dist/__tests__/role-loader-tools.test.d.ts.map +1 -0
- package/dist/__tests__/role-loader-tools.test.js +39 -0
- package/dist/__tests__/role-loader-tools.test.js.map +1 -0
- package/dist/__tests__/role-loader.test.js +116 -1
- package/dist/__tests__/role-loader.test.js.map +1 -1
- package/dist/__tests__/role-prompt-no-legacy-protocol.test.d.ts +2 -0
- package/dist/__tests__/role-prompt-no-legacy-protocol.test.d.ts.map +1 -0
- package/dist/__tests__/role-prompt-no-legacy-protocol.test.js +37 -0
- package/dist/__tests__/role-prompt-no-legacy-protocol.test.js.map +1 -0
- package/dist/__tests__/role-tools.test.d.ts +2 -0
- package/dist/__tests__/role-tools.test.d.ts.map +1 -0
- package/dist/__tests__/role-tools.test.js +80 -0
- package/dist/__tests__/role-tools.test.js.map +1 -0
- package/dist/__tests__/spawn-role-injects-briefings.test.d.ts +2 -0
- package/dist/__tests__/spawn-role-injects-briefings.test.d.ts.map +1 -0
- package/dist/__tests__/spawn-role-injects-briefings.test.js +182 -0
- package/dist/__tests__/spawn-role-injects-briefings.test.js.map +1 -0
- package/dist/__tests__/spawn-role-tool-policy.test.d.ts +2 -0
- package/dist/__tests__/spawn-role-tool-policy.test.d.ts.map +1 -0
- package/dist/__tests__/spawn-role-tool-policy.test.js +96 -0
- package/dist/__tests__/spawn-role-tool-policy.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-inbox-watcher.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-inbox-watcher.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-inbox-watcher.test.js +61 -0
- package/dist/__tests__/swarm-coordinator-inbox-watcher.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-inbox.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-inbox.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-inbox.test.js +182 -0
- package/dist/__tests__/swarm-coordinator-inbox.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-init.test.js +36 -8
- package/dist/__tests__/swarm-coordinator-init.test.js.map +1 -1
- package/dist/__tests__/swarm-coordinator-legacy-plan-review-warn.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-legacy-plan-review-warn.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-legacy-plan-review-warn.test.js +113 -0
- package/dist/__tests__/swarm-coordinator-legacy-plan-review-warn.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-plan-review-intercept.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-plan-review-intercept.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-plan-review-intercept.test.js +465 -0
- package/dist/__tests__/swarm-coordinator-plan-review-intercept.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-plan-review-recovery.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-plan-review-recovery.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-plan-review-recovery.test.js +284 -0
- package/dist/__tests__/swarm-coordinator-plan-review-recovery.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-plan-review.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-plan-review.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-plan-review.test.js +294 -0
- package/dist/__tests__/swarm-coordinator-plan-review.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-resume.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-resume.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-resume.test.js +93 -0
- package/dist/__tests__/swarm-coordinator-resume.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-roleId.test.js +2 -2
- package/dist/__tests__/swarm-coordinator-roleId.test.js.map +1 -1
- package/dist/__tests__/swarm-destroy-detach.test.d.ts +2 -0
- package/dist/__tests__/swarm-destroy-detach.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-destroy-detach.test.js +135 -0
- package/dist/__tests__/swarm-destroy-detach.test.js.map +1 -0
- package/dist/action-parser.d.ts +0 -9
- package/dist/action-parser.d.ts.map +1 -1
- package/dist/action-parser.js +0 -114
- package/dist/action-parser.js.map +1 -1
- package/dist/inbox-relay.d.ts +50 -0
- package/dist/inbox-relay.d.ts.map +1 -0
- package/dist/inbox-relay.js +168 -0
- package/dist/inbox-relay.js.map +1 -0
- package/dist/inbox-store.d.ts +25 -0
- package/dist/inbox-store.d.ts.map +1 -0
- package/dist/inbox-store.js +95 -0
- package/dist/inbox-store.js.map +1 -0
- package/dist/inbox-watcher.d.ts +13 -0
- package/dist/inbox-watcher.d.ts.map +1 -0
- package/dist/inbox-watcher.js +89 -0
- package/dist/inbox-watcher.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/persistence.d.ts +19 -5
- package/dist/persistence.d.ts.map +1 -1
- package/dist/persistence.js +97 -22
- package/dist/persistence.js.map +1 -1
- package/dist/recovery.d.ts +12 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +14 -19
- package/dist/recovery.js.map +1 -1
- package/dist/roles/role-loader.d.ts +28 -1
- package/dist/roles/role-loader.d.ts.map +1 -1
- package/dist/roles/role-loader.js +73 -1
- package/dist/roles/role-loader.js.map +1 -1
- package/dist/roles/role-tools.d.ts +16 -0
- package/dist/roles/role-tools.d.ts.map +1 -0
- package/dist/roles/role-tools.js +25 -0
- package/dist/roles/role-tools.js.map +1 -0
- package/dist/roles/types.d.ts +4 -0
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/swarm-coordinator.d.ts +176 -12
- package/dist/swarm-coordinator.d.ts.map +1 -1
- package/dist/swarm-coordinator.js +863 -370
- package/dist/swarm-coordinator.js.map +1 -1
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -6
- package/roles/analyst-livermore.md +6 -30
- package/roles/designer-rams.md +2 -30
- package/roles/dev-torvalds.md +8 -44
- package/roles/developer.md +5 -21
- package/roles/director-jia.md +20 -49
- package/roles/editor-boyong.md +8 -40
- package/roles/macro-dalio.md +6 -30
- package/roles/planner-maoni.md +24 -53
- package/roles/pm-jobs.md +20 -71
- package/roles/preset-analyst-simons.md +2 -18
- package/roles/preset-architect-knuth.md +2 -18
- package/roles/preset-designer-norman.md +2 -18
- package/roles/preset-designer.md +2 -18
- package/roles/preset-dev-carmack.md +2 -18
- package/roles/preset-dev-gosling.md +2 -18
- package/roles/preset-developer.md +7 -23
- package/roles/preset-manager-grove.md +2 -18
- package/roles/preset-manager-musk.md +2 -18
- package/roles/preset-pm.md +7 -34
- package/roles/preset-researcher-feynman.md +2 -18
- package/roles/preset-reviewer.md +5 -21
- package/roles/preset-strategist-buffett.md +2 -18
- package/roles/preset-strategist-munger.md +2 -18
- package/roles/preset-strategist-sunzi.md +2 -18
- package/roles/preset-tester-beck.md +2 -18
- package/roles/preset-tester.md +5 -21
- package/roles/preset-writer-orwell.md +2 -18
- package/roles/preset-writer.md +2 -18
- package/roles/quant-simons.md +5 -32
- package/roles/queen.md +25 -41
- package/roles/reviewer-martin.md +11 -37
- package/roles/reviewer.md +20 -21
- package/roles/rhythm-tangsan.md +5 -29
- package/roles/risk-taleb.md +4 -32
- package/roles/script-shitiesheng.md +8 -31
- package/roles/storyboard-xuke.md +9 -29
- package/roles/strategist-soros.md +16 -73
- package/roles/tester-beck.md +4 -40
- package/roles/tester.md +5 -21
- package/roles/trader-jones.md +4 -32
- package/roles/vfx-guchangwei.md +8 -27
- package/roles/writer-zhouzi.md +7 -39
- package/templates/dev-team-pro.md +4 -1
- package/templates/dev-team.md +3 -1
- package/templates/minimal.md +2 -1
- package/templates/trading-team.md +6 -1
- package/templates/video-team.md +4 -1
- package/templates/writing-team.md +4 -1
|
@@ -1,18 +1,61 @@
|
|
|
1
1
|
import type { SessionAdapter, HubAdapter } from "./types.js";
|
|
2
|
-
import
|
|
2
|
+
import { InboxRelay } from "./inbox-relay.js";
|
|
3
|
+
import { InboxWatcher } from "./inbox-watcher.js";
|
|
4
|
+
import { TaskStore } from "@mclawnet/task";
|
|
3
5
|
import type { SwarmInstance, RoleInstance, SwarmCreateOptions, CustomRoleDefinition } from "./types.js";
|
|
4
6
|
/**
|
|
5
7
|
* SwarmCoordinator — orchestrates multi-role Claude CLI swarms.
|
|
6
8
|
*
|
|
7
9
|
* Composes (not replaces) SessionAdapter. Each role instance is a separate
|
|
8
|
-
* session in SessionAdapter. Communication between roles
|
|
9
|
-
*
|
|
10
|
+
* session in SessionAdapter. Communication between roles flows through
|
|
11
|
+
* file-based InboxStore + InboxRelay.
|
|
10
12
|
*/
|
|
11
13
|
export declare class SwarmCoordinator {
|
|
12
14
|
private sessionAdapter;
|
|
13
15
|
private hub;
|
|
16
|
+
/**
|
|
17
|
+
* Optional factory that resolves a per-swarm TaskStore (workDir-scoped).
|
|
18
|
+
* When present, spawnRole appends a "### 任务上下文" briefing section to
|
|
19
|
+
* the role's system prompt. Failures are best-effort logged.
|
|
20
|
+
*
|
|
21
|
+
* Backward compat: also accepts a pre-built single TaskStore instance.
|
|
22
|
+
*/
|
|
23
|
+
private taskStoreFactory?;
|
|
24
|
+
/**
|
|
25
|
+
* Optional override for the user-home root (no `.clawnet` suffix).
|
|
26
|
+
* Threaded to InboxRelay and to inline `new InboxStore(...)` / `TaskStore`
|
|
27
|
+
* calls so test harnesses pinned to a tmpdir don't fall through to
|
|
28
|
+
* `homedir()` and write files into the real `~/.clawnet`. When omitted,
|
|
29
|
+
* inline call sites still honour `CLAWNET_HOME` env var as before.
|
|
30
|
+
*/
|
|
31
|
+
private home?;
|
|
14
32
|
private swarms;
|
|
15
|
-
|
|
33
|
+
readonly inboxRelay: InboxRelay;
|
|
34
|
+
readonly inboxWatcher: InboxWatcher;
|
|
35
|
+
constructor(sessionAdapter: SessionAdapter, hub: HubAdapter,
|
|
36
|
+
/**
|
|
37
|
+
* Optional factory that resolves a per-swarm TaskStore (workDir-scoped).
|
|
38
|
+
* When present, spawnRole appends a "### 任务上下文" briefing section to
|
|
39
|
+
* the role's system prompt. Failures are best-effort logged.
|
|
40
|
+
*
|
|
41
|
+
* Backward compat: also accepts a pre-built single TaskStore instance.
|
|
42
|
+
*/
|
|
43
|
+
taskStoreFactory?: (TaskStore | ((workDir: string) => TaskStore | undefined)) | undefined,
|
|
44
|
+
/**
|
|
45
|
+
* Optional override for the user-home root (no `.clawnet` suffix).
|
|
46
|
+
* Threaded to InboxRelay and to inline `new InboxStore(...)` / `TaskStore`
|
|
47
|
+
* calls so test harnesses pinned to a tmpdir don't fall through to
|
|
48
|
+
* `homedir()` and write files into the real `~/.clawnet`. When omitted,
|
|
49
|
+
* inline call sites still honour `CLAWNET_HOME` env var as before.
|
|
50
|
+
*/
|
|
51
|
+
home?: string | undefined);
|
|
52
|
+
/** Resolve the user-home root used for InboxStore / TaskStore lookups. */
|
|
53
|
+
private resolveHome;
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the TaskStore for a given swarm's workDir.
|
|
56
|
+
* Returns undefined if no factory was wired or if the factory returned undefined.
|
|
57
|
+
*/
|
|
58
|
+
private resolveTaskStore;
|
|
16
59
|
/** Create a new swarm with two-phase initialization. */
|
|
17
60
|
create(swarmSessionId: string, options: SwarmCreateOptions): Promise<void>;
|
|
18
61
|
/** Handle user message directed at the swarm. */
|
|
@@ -37,10 +80,45 @@ export declare class SwarmCoordinator {
|
|
|
37
80
|
total: number;
|
|
38
81
|
};
|
|
39
82
|
}): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Persist the per-role claudeSessionId immediately (e.g. from `system/init`
|
|
85
|
+
* frame, before the first turn_complete). Returns true if a role was found
|
|
86
|
+
* and updated; false otherwise (no-op for non-swarm sessions).
|
|
87
|
+
*/
|
|
88
|
+
setRoleClaudeSessionId(swarmId: string, instanceId: string, claudeSessionId: string): boolean;
|
|
89
|
+
/** Convenience: same as setRoleClaudeSessionId but takes the `${swarmId}::${instanceId}` roleSessionId. */
|
|
90
|
+
setRoleClaudeSessionIdBySession(roleSessionId: string, claudeSessionId: string): boolean;
|
|
40
91
|
/** Spawn a new role instance in a swarm. */
|
|
41
|
-
spawnRole(swarmId: string, roleName: string,
|
|
92
|
+
spawnRole(swarmId: string, roleName: string, taskPrompt?: string, customPrompt?: string, customDefinition?: CustomRoleDefinition, additionalDirs?: string[], resumeId?: string, presetInstanceId?: string): Promise<RoleInstance>;
|
|
93
|
+
/**
|
|
94
|
+
* Recover a previously persisted swarm by id.
|
|
95
|
+
*
|
|
96
|
+
* Locates the snapshot via `listRecoverableSwarmIds()`, then for each role
|
|
97
|
+
* in the snapshot spawns a Claude session via `--resume role.claudeSessionId`
|
|
98
|
+
* (when present) so the per-role conversation continues. Roles without a
|
|
99
|
+
* stored claudeSessionId start fresh.
|
|
100
|
+
*
|
|
101
|
+
* After all roles are spawned, drains each role's offline inbox via
|
|
102
|
+
* `inboxRelay.deliver`. Drain failures are best-effort: warn but never throw.
|
|
103
|
+
*
|
|
104
|
+
* Recovered swarms start in `paused` state — caller must explicitly resume
|
|
105
|
+
* (matches existing behaviour in `recoverSwarm` helper).
|
|
106
|
+
*/
|
|
107
|
+
recover(swarmId: string): Promise<void>;
|
|
42
108
|
/** Stop a role instance. */
|
|
43
109
|
stopRole(swarmId: string, instanceId: string): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Roll back side-effects from a partially-completed `create()`.
|
|
112
|
+
*
|
|
113
|
+
* Called from create()'s catch block. Mirrors `destroy()` but is
|
|
114
|
+
* deliberately tolerant of partial state (timer may not exist, snapshot
|
|
115
|
+
* may not exist, sessions list comes from the caller's accumulator
|
|
116
|
+
* because `swarm.roles` may not yet contain every opened session).
|
|
117
|
+
*
|
|
118
|
+
* Best-effort: every step is wrapped — we never throw out of cleanup.
|
|
119
|
+
* Logs a warn so operators see WHY a swarm was rolled back.
|
|
120
|
+
*/
|
|
121
|
+
private cleanupPartialCreate;
|
|
44
122
|
/** Destroy an entire swarm. */
|
|
45
123
|
destroy(swarmId: string): Promise<void>;
|
|
46
124
|
/** Check if a session ID belongs to any swarm. */
|
|
@@ -53,22 +131,108 @@ export declare class SwarmCoordinator {
|
|
|
53
131
|
complete(swarmId: string): Promise<void>;
|
|
54
132
|
/** Mark a swarm as failed. Releases all resources — closes sessions, deletes snapshot, removes from memory. */
|
|
55
133
|
fail(swarmId: string): Promise<void>;
|
|
134
|
+
/**
|
|
135
|
+
* InboxRelay messageInterceptor hook. Consumes `plan_review_result`
|
|
136
|
+
* envelopes (written by the `plan_review_submit` MCP tool out-of-process)
|
|
137
|
+
* and converts them into the normalized `submitPlanReview()` flow:
|
|
138
|
+
* planStatus flip, timer clear, plan_approved/plan_rejected to queen.
|
|
139
|
+
*
|
|
140
|
+
* Returning `true` removes the raw message from the LLM payload and marks
|
|
141
|
+
* it delivered so it doesn't re-fire. Returning `false` lets the relay
|
|
142
|
+
* push the message normally.
|
|
143
|
+
*
|
|
144
|
+
* Failures (parse error, invalid verdict) are logged + consumed to avoid a
|
|
145
|
+
* tight reload loop on a malformed file. The submitPlanReview call is
|
|
146
|
+
* idempotent so duplicate reviewer envelopes (e.g. retries) are safe.
|
|
147
|
+
*/
|
|
148
|
+
private handleInterceptedMessage;
|
|
149
|
+
/**
|
|
150
|
+
* Apply a plan review verdict from a reviewer (or system on timeout).
|
|
151
|
+
* Idempotent: when planStatus is already "approved" or "rejected", logs and
|
|
152
|
+
* returns. Clears any pending planReviewTimer.
|
|
153
|
+
*
|
|
154
|
+
* Wired to the `plan_review_submit` MCP tool by the host (Task 3); this
|
|
155
|
+
* method itself does not call back into MCP.
|
|
156
|
+
*/
|
|
157
|
+
submitPlanReview(args: {
|
|
158
|
+
swarmId: string;
|
|
159
|
+
from: string;
|
|
160
|
+
verdict: "approved" | "rejected";
|
|
161
|
+
body?: string;
|
|
162
|
+
}): Promise<void>;
|
|
163
|
+
/**
|
|
164
|
+
* Defensive recovery: re-emit plan_approved / plan_rejected to the queen if
|
|
165
|
+
* planStatus is finalised but no matching system envelope exists in the
|
|
166
|
+
* queen's inbox. Called from the queen check-in tick.
|
|
167
|
+
*
|
|
168
|
+
* Catches the case where the deferred submitPlanReview's call to
|
|
169
|
+
* deliverInbox() threw (e.g. transient fs error or lockfile contention) and
|
|
170
|
+
* only logged a warning — leaving planStatus = "approved" but the queen
|
|
171
|
+
* never receiving plan_approved, which would otherwise wedge the swarm.
|
|
172
|
+
*
|
|
173
|
+
* Idempotent: if a system plan_approved/plan_rejected already exists in the
|
|
174
|
+
* queen inbox (delivered or undelivered), we do nothing.
|
|
175
|
+
*/
|
|
176
|
+
private reconcilePlanStatusForQueen;
|
|
56
177
|
/** Run retrospective analysis then clean up swarm resources. */
|
|
57
178
|
private runRetroAndCleanup;
|
|
179
|
+
/**
|
|
180
|
+
* Detach all tasks owned by a swarm: clear their swarmId and owner so they
|
|
181
|
+
* survive the swarm's lifecycle and can be reassigned. Best-effort — any
|
|
182
|
+
* failure is logged and swallowed; never blocks destroy/complete/fail.
|
|
183
|
+
*
|
|
184
|
+
* Tasks belonging to other swarms are not touched.
|
|
185
|
+
*/
|
|
186
|
+
private detachTasks;
|
|
187
|
+
/**
|
|
188
|
+
* Build the boot-time "### 任务上下文" section appended to a role's system
|
|
189
|
+
* prompt. Returns null when no taskStore is wired (caller already gates on
|
|
190
|
+
* that, but we double-check here for safety).
|
|
191
|
+
*
|
|
192
|
+
* Queen vs. worker contract:
|
|
193
|
+
* - queen → lead briefing (queenInstanceId is this role itself) + member briefing
|
|
194
|
+
* - other → task briefing (owner-scoped) + member briefing
|
|
195
|
+
*
|
|
196
|
+
* The "### 任务上下文" anchor and inner section anchors are load-bearing
|
|
197
|
+
* (matched verbatim by tests and by the agent itself).
|
|
198
|
+
*/
|
|
199
|
+
private buildBriefingSection;
|
|
200
|
+
/**
|
|
201
|
+
* Append a message to a target instance's inbox file then trigger
|
|
202
|
+
* InboxRelay.deliver to push it through the agent's stdin (single-flight).
|
|
203
|
+
* Best-effort: returns silently when the swarm has no workDir (in-memory
|
|
204
|
+
* fixtures used by tests), keeping behaviour compatible with the previous
|
|
205
|
+
* router.send path.
|
|
206
|
+
*/
|
|
207
|
+
private deliverInbox;
|
|
208
|
+
/**
|
|
209
|
+
* Broadcast helper: deliverInbox to every role in the swarm except those
|
|
210
|
+
* already stopped. Includes `spawning` roles intentionally — the inbox file
|
|
211
|
+
* is durable, so the relay (or runPostStart drain in the spawn path) will
|
|
212
|
+
* deliver the message once the role's stdin opens. Matches the legacy
|
|
213
|
+
* router.broadcast behaviour, which never gated on "spawning".
|
|
214
|
+
*/
|
|
215
|
+
private broadcastInbox;
|
|
58
216
|
private findQueen;
|
|
217
|
+
/**
|
|
218
|
+
* Public lookup: returns the active queen role instance for a swarm, or
|
|
219
|
+
* undefined when the swarm/queen is not present. Identifies the queen by
|
|
220
|
+
* `definition.type === "queen"` (not by roleName) so custom queen roles
|
|
221
|
+
* with non-default names are also recognised.
|
|
222
|
+
*/
|
|
223
|
+
findQueenInstance(swarmId: string): RoleInstance | undefined;
|
|
59
224
|
private findReviewer;
|
|
60
225
|
/** Build a summary of the previous swarm run from messages.jsonl for continuation. */
|
|
61
226
|
private buildContinuationSummary;
|
|
62
227
|
/** Send plan to reviewer for review. Auto-approves if no reviewer available. */
|
|
63
228
|
private requestPlanReview;
|
|
64
|
-
/**
|
|
65
|
-
|
|
229
|
+
/**
|
|
230
|
+
* (Re)arm the plan-review timeout fallback. Clears any prior timer first so
|
|
231
|
+
* call sites don't need to. The fire path delegates to submitPlanReview so
|
|
232
|
+
* its idempotency guard protects against reviewer/timer races.
|
|
233
|
+
*/
|
|
234
|
+
private armPlanReviewTimeout;
|
|
66
235
|
private findByRoleSessionId;
|
|
67
|
-
private executeAction;
|
|
68
|
-
/** On-demand spawn: start a role instance if it's not currently running. */
|
|
69
|
-
private ensureRoleStarted;
|
|
70
|
-
/** Send a message with exponential backoff retry. Fire-and-forget (async). */
|
|
71
|
-
private sendWithRetry;
|
|
72
236
|
private startQueenCheck;
|
|
73
237
|
private buildRoleListString;
|
|
74
238
|
private buildStatusPayload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swarm-coordinator.d.ts","sourceRoot":"","sources":["../src/swarm-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"swarm-coordinator.d.ts","sourceRoot":"","sources":["../src/swarm-coordinator.ts"],"names":[],"mappings":"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"}
|