@mclawnet/swarm 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/always-on-activity-reader.test.d.ts +2 -0
- package/dist/__tests__/always-on-activity-reader.test.d.ts.map +1 -0
- package/dist/__tests__/always-on-activity-reader.test.js +193 -0
- package/dist/__tests__/always-on-activity-reader.test.js.map +1 -0
- package/dist/__tests__/always-on-config.test.d.ts +2 -0
- package/dist/__tests__/always-on-config.test.d.ts.map +1 -0
- package/dist/__tests__/always-on-config.test.js +285 -0
- package/dist/__tests__/always-on-config.test.js.map +1 -0
- package/dist/__tests__/always-on-manager.test.d.ts +2 -0
- package/dist/__tests__/always-on-manager.test.d.ts.map +1 -0
- package/dist/__tests__/always-on-manager.test.js +797 -0
- package/dist/__tests__/always-on-manager.test.js.map +1 -0
- package/dist/__tests__/always-on-parity.test.d.ts +2 -0
- package/dist/__tests__/always-on-parity.test.d.ts.map +1 -0
- package/dist/__tests__/always-on-parity.test.js +20 -0
- package/dist/__tests__/always-on-parity.test.js.map +1 -0
- package/dist/__tests__/cascade-picker.test.d.ts +2 -0
- package/dist/__tests__/cascade-picker.test.d.ts.map +1 -0
- package/dist/__tests__/cascade-picker.test.js +122 -0
- package/dist/__tests__/cascade-picker.test.js.map +1 -0
- package/dist/__tests__/coordinator-shipment.test.d.ts +2 -0
- package/dist/__tests__/coordinator-shipment.test.d.ts.map +1 -0
- package/dist/__tests__/coordinator-shipment.test.js +280 -0
- package/dist/__tests__/coordinator-shipment.test.js.map +1 -0
- package/dist/__tests__/coordinator-workspace-recover.test.d.ts +2 -0
- package/dist/__tests__/coordinator-workspace-recover.test.d.ts.map +1 -0
- package/dist/__tests__/coordinator-workspace-recover.test.js +140 -0
- package/dist/__tests__/coordinator-workspace-recover.test.js.map +1 -0
- package/dist/__tests__/coordinator-workspace.test.d.ts +2 -0
- package/dist/__tests__/coordinator-workspace.test.d.ts.map +1 -0
- package/dist/__tests__/coordinator-workspace.test.js +135 -0
- package/dist/__tests__/coordinator-workspace.test.js.map +1 -0
- package/dist/__tests__/default-runner-epipe.test.d.ts +2 -0
- package/dist/__tests__/default-runner-epipe.test.d.ts.map +1 -0
- package/dist/__tests__/default-runner-epipe.test.js +43 -0
- package/dist/__tests__/default-runner-epipe.test.js.map +1 -0
- package/dist/__tests__/discovery-scheduler.test.d.ts +2 -0
- package/dist/__tests__/discovery-scheduler.test.d.ts.map +1 -0
- package/dist/__tests__/discovery-scheduler.test.js +367 -0
- package/dist/__tests__/discovery-scheduler.test.js.map +1 -0
- package/dist/__tests__/env-forward-e2e.test.d.ts +2 -0
- package/dist/__tests__/env-forward-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/env-forward-e2e.test.js +57 -0
- package/dist/__tests__/env-forward-e2e.test.js.map +1 -0
- package/dist/__tests__/gh-pr-creator.test.d.ts +2 -0
- package/dist/__tests__/gh-pr-creator.test.d.ts.map +1 -0
- package/dist/__tests__/gh-pr-creator.test.js +107 -0
- package/dist/__tests__/gh-pr-creator.test.js.map +1 -0
- package/dist/__tests__/git-worktree-provider.test.d.ts +2 -0
- package/dist/__tests__/git-worktree-provider.test.d.ts.map +1 -0
- package/dist/__tests__/git-worktree-provider.test.js +98 -0
- package/dist/__tests__/git-worktree-provider.test.js.map +1 -0
- package/dist/__tests__/gitignore-check.test.d.ts +2 -0
- package/dist/__tests__/gitignore-check.test.d.ts.map +1 -0
- package/dist/__tests__/gitignore-check.test.js +39 -0
- package/dist/__tests__/gitignore-check.test.js.map +1 -0
- package/dist/__tests__/idea-research-source.test.d.ts +2 -0
- package/dist/__tests__/idea-research-source.test.d.ts.map +1 -0
- package/dist/__tests__/idea-research-source.test.js +425 -0
- package/dist/__tests__/idea-research-source.test.js.map +1 -0
- package/dist/__tests__/idea-todo-source.test.d.ts +2 -0
- package/dist/__tests__/idea-todo-source.test.d.ts.map +1 -0
- package/dist/__tests__/idea-todo-source.test.js +258 -0
- package/dist/__tests__/idea-todo-source.test.js.map +1 -0
- package/dist/__tests__/introspection-dedupe.test.d.ts +2 -0
- package/dist/__tests__/introspection-dedupe.test.d.ts.map +1 -0
- package/dist/__tests__/introspection-dedupe.test.js +484 -0
- package/dist/__tests__/introspection-dedupe.test.js.map +1 -0
- package/dist/__tests__/introspection-source.test.d.ts +2 -0
- package/dist/__tests__/introspection-source.test.d.ts.map +1 -0
- package/dist/__tests__/introspection-source.test.js +1051 -0
- package/dist/__tests__/introspection-source.test.js.map +1 -0
- package/dist/__tests__/migration-roles.test.js +1 -22
- package/dist/__tests__/migration-roles.test.js.map +1 -1
- package/dist/__tests__/reconcile-researching.test.d.ts +2 -0
- package/dist/__tests__/reconcile-researching.test.d.ts.map +1 -0
- package/dist/__tests__/reconcile-researching.test.js +224 -0
- package/dist/__tests__/reconcile-researching.test.js.map +1 -0
- package/dist/__tests__/role-loader-preamble-all.test.js +3 -1
- package/dist/__tests__/role-loader-preamble-all.test.js.map +1 -1
- package/dist/__tests__/role-loader.test.js +95 -0
- package/dist/__tests__/role-loader.test.js.map +1 -1
- package/dist/__tests__/role-prompt-no-legacy-protocol.test.js +3 -1
- package/dist/__tests__/role-prompt-no-legacy-protocol.test.js.map +1 -1
- package/dist/__tests__/secret-scrub.test.d.ts +2 -0
- package/dist/__tests__/secret-scrub.test.d.ts.map +1 -0
- package/dist/__tests__/secret-scrub.test.js +55 -0
- package/dist/__tests__/secret-scrub.test.js.map +1 -0
- package/dist/__tests__/shipment-actions.test.d.ts +2 -0
- package/dist/__tests__/shipment-actions.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-actions.test.js +378 -0
- package/dist/__tests__/shipment-actions.test.js.map +1 -0
- package/dist/__tests__/shipment-persistence.test.d.ts +2 -0
- package/dist/__tests__/shipment-persistence.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-persistence.test.js +120 -0
- package/dist/__tests__/shipment-persistence.test.js.map +1 -0
- package/dist/__tests__/shipment-pipeline.test.d.ts +2 -0
- package/dist/__tests__/shipment-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-pipeline.test.js +392 -0
- package/dist/__tests__/shipment-pipeline.test.js.map +1 -0
- package/dist/__tests__/shipment-report.test.d.ts +2 -0
- package/dist/__tests__/shipment-report.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-report.test.js +78 -0
- package/dist/__tests__/shipment-report.test.js.map +1 -0
- package/dist/__tests__/shipment-stdin-integration.test.d.ts +2 -0
- package/dist/__tests__/shipment-stdin-integration.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-stdin-integration.test.js +49 -0
- package/dist/__tests__/shipment-stdin-integration.test.js.map +1 -0
- package/dist/__tests__/shipment-type-parity.test.d.ts +2 -0
- package/dist/__tests__/shipment-type-parity.test.d.ts.map +1 -0
- package/dist/__tests__/shipment-type-parity.test.js +10 -0
- package/dist/__tests__/shipment-type-parity.test.js.map +1 -0
- package/dist/__tests__/snapshot-copy-provider.test.d.ts +2 -0
- package/dist/__tests__/snapshot-copy-provider.test.d.ts.map +1 -0
- package/dist/__tests__/snapshot-copy-provider.test.js +88 -0
- package/dist/__tests__/snapshot-copy-provider.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-backend.test.js +153 -0
- package/dist/__tests__/swarm-coordinator-backend.test.js.map +1 -1
- package/dist/__tests__/swarm-coordinator-complete-intercept.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-complete-intercept.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-complete-intercept.test.js +111 -0
- package/dist/__tests__/swarm-coordinator-complete-intercept.test.js.map +1 -0
- package/dist/__tests__/task-store-source.test.d.ts +2 -0
- package/dist/__tests__/task-store-source.test.d.ts.map +1 -0
- package/dist/__tests__/task-store-source.test.js +56 -0
- package/dist/__tests__/task-store-source.test.js.map +1 -0
- package/dist/__tests__/transport-detect.test.d.ts +2 -0
- package/dist/__tests__/transport-detect.test.d.ts.map +1 -0
- package/dist/__tests__/transport-detect.test.js +92 -0
- package/dist/__tests__/transport-detect.test.js.map +1 -0
- package/dist/__tests__/workcycle-runner-cascade.test.d.ts +2 -0
- package/dist/__tests__/workcycle-runner-cascade.test.d.ts.map +1 -0
- package/dist/__tests__/workcycle-runner-cascade.test.js +203 -0
- package/dist/__tests__/workcycle-runner-cascade.test.js.map +1 -0
- package/dist/__tests__/workcycle-runner.test.d.ts +2 -0
- package/dist/__tests__/workcycle-runner.test.d.ts.map +1 -0
- package/dist/__tests__/workcycle-runner.test.js +369 -0
- package/dist/__tests__/workcycle-runner.test.js.map +1 -0
- package/dist/__tests__/workspace-diff.test.d.ts +2 -0
- package/dist/__tests__/workspace-diff.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-diff.test.js +62 -0
- package/dist/__tests__/workspace-diff.test.js.map +1 -0
- package/dist/__tests__/workspace-manager.test.d.ts +2 -0
- package/dist/__tests__/workspace-manager.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-manager.test.js +120 -0
- package/dist/__tests__/workspace-manager.test.js.map +1 -0
- package/dist/__tests__/workspace-types.test.d.ts +2 -0
- package/dist/__tests__/workspace-types.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-types.test.js +37 -0
- package/dist/__tests__/workspace-types.test.js.map +1 -0
- package/dist/__tests__/worktree-gc.test.d.ts +2 -0
- package/dist/__tests__/worktree-gc.test.d.ts.map +1 -0
- package/dist/__tests__/worktree-gc.test.js +183 -0
- package/dist/__tests__/worktree-gc.test.js.map +1 -0
- package/dist/always-on/activity-reader.d.ts +27 -0
- package/dist/always-on/activity-reader.d.ts.map +1 -0
- package/dist/always-on/activity-reader.js +95 -0
- package/dist/always-on/activity-reader.js.map +1 -0
- package/dist/always-on/always-on-manager.d.ts +170 -0
- package/dist/always-on/always-on-manager.d.ts.map +1 -0
- package/dist/always-on/always-on-manager.js +538 -0
- package/dist/always-on/always-on-manager.js.map +1 -0
- package/dist/always-on/config.d.ts +141 -0
- package/dist/always-on/config.d.ts.map +1 -0
- package/dist/always-on/config.js +324 -0
- package/dist/always-on/config.js.map +1 -0
- package/dist/always-on/discovery-scheduler.d.ts +60 -0
- package/dist/always-on/discovery-scheduler.d.ts.map +1 -0
- package/dist/always-on/discovery-scheduler.js +287 -0
- package/dist/always-on/discovery-scheduler.js.map +1 -0
- package/dist/always-on/ideas-client.d.ts +23 -0
- package/dist/always-on/ideas-client.d.ts.map +1 -0
- package/dist/always-on/ideas-client.js +13 -0
- package/dist/always-on/ideas-client.js.map +1 -0
- package/dist/always-on/reconcile-researching.d.ts +42 -0
- package/dist/always-on/reconcile-researching.d.ts.map +1 -0
- package/dist/always-on/reconcile-researching.js +133 -0
- package/dist/always-on/reconcile-researching.js.map +1 -0
- package/dist/always-on/task-sources/cascade-picker.d.ts +42 -0
- package/dist/always-on/task-sources/cascade-picker.d.ts.map +1 -0
- package/dist/always-on/task-sources/cascade-picker.js +65 -0
- package/dist/always-on/task-sources/cascade-picker.js.map +1 -0
- package/dist/always-on/task-sources/idea-dedupe.d.ts +62 -0
- package/dist/always-on/task-sources/idea-dedupe.d.ts.map +1 -0
- package/dist/always-on/task-sources/idea-dedupe.js +130 -0
- package/dist/always-on/task-sources/idea-dedupe.js.map +1 -0
- package/dist/always-on/task-sources/idea-research-source.d.ts +46 -0
- package/dist/always-on/task-sources/idea-research-source.d.ts.map +1 -0
- package/dist/always-on/task-sources/idea-research-source.js +308 -0
- package/dist/always-on/task-sources/idea-research-source.js.map +1 -0
- package/dist/always-on/task-sources/idea-sort.d.ts +3 -0
- package/dist/always-on/task-sources/idea-sort.d.ts.map +1 -0
- package/dist/always-on/task-sources/idea-sort.js +25 -0
- package/dist/always-on/task-sources/idea-sort.js.map +1 -0
- package/dist/always-on/task-sources/idea-todo-source.d.ts +48 -0
- package/dist/always-on/task-sources/idea-todo-source.d.ts.map +1 -0
- package/dist/always-on/task-sources/idea-todo-source.js +226 -0
- package/dist/always-on/task-sources/idea-todo-source.js.map +1 -0
- package/dist/always-on/task-sources/introspection-source.d.ts +101 -0
- package/dist/always-on/task-sources/introspection-source.d.ts.map +1 -0
- package/dist/always-on/task-sources/introspection-source.js +695 -0
- package/dist/always-on/task-sources/introspection-source.js.map +1 -0
- package/dist/always-on/task-sources/task-store-source.d.ts +15 -0
- package/dist/always-on/task-sources/task-store-source.d.ts.map +1 -0
- package/dist/always-on/task-sources/task-store-source.js +59 -0
- package/dist/always-on/task-sources/task-store-source.js.map +1 -0
- package/dist/always-on/task-sources/types.d.ts +108 -0
- package/dist/always-on/task-sources/types.d.ts.map +1 -0
- package/dist/always-on/task-sources/types.js +13 -0
- package/dist/always-on/task-sources/types.js.map +1 -0
- package/dist/always-on/types.d.ts +76 -0
- package/dist/always-on/types.d.ts.map +1 -0
- package/dist/always-on/types.js +17 -0
- package/dist/always-on/types.js.map +1 -0
- package/dist/always-on/workcycle-runner.d.ts +115 -0
- package/dist/always-on/workcycle-runner.d.ts.map +1 -0
- package/dist/always-on/workcycle-runner.js +285 -0
- package/dist/always-on/workcycle-runner.js.map +1 -0
- package/dist/always-on/worktree-gc.d.ts +41 -0
- package/dist/always-on/worktree-gc.d.ts.map +1 -0
- package/dist/always-on/worktree-gc.js +167 -0
- package/dist/always-on/worktree-gc.js.map +1 -0
- package/dist/index.d.ts +26 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -1
- package/dist/index.js.map +1 -1
- package/dist/persistence.d.ts +37 -1
- package/dist/persistence.d.ts.map +1 -1
- package/dist/persistence.js +48 -0
- package/dist/persistence.js.map +1 -1
- package/dist/retrospective.d.ts.map +1 -1
- package/dist/retrospective.js +6 -0
- package/dist/retrospective.js.map +1 -1
- package/dist/roles/role-loader.d.ts +1 -1
- package/dist/roles/role-loader.d.ts.map +1 -1
- package/dist/roles/role-loader.js +18 -0
- package/dist/roles/role-loader.js.map +1 -1
- package/dist/roles/types.d.ts +12 -0
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/shipment/gh-pr-creator.d.ts +28 -0
- package/dist/shipment/gh-pr-creator.d.ts.map +1 -0
- package/dist/shipment/gh-pr-creator.js +80 -0
- package/dist/shipment/gh-pr-creator.js.map +1 -0
- package/dist/shipment/report.d.ts +27 -0
- package/dist/shipment/report.d.ts.map +1 -0
- package/dist/shipment/report.js +41 -0
- package/dist/shipment/report.js.map +1 -0
- package/dist/shipment/secret-scrub.d.ts +12 -0
- package/dist/shipment/secret-scrub.d.ts.map +1 -0
- package/dist/shipment/secret-scrub.js +30 -0
- package/dist/shipment/secret-scrub.js.map +1 -0
- package/dist/shipment/shipment-actions.d.ts +85 -0
- package/dist/shipment/shipment-actions.d.ts.map +1 -0
- package/dist/shipment/shipment-actions.js +190 -0
- package/dist/shipment/shipment-actions.js.map +1 -0
- package/dist/shipment/shipment-pipeline.d.ts +48 -0
- package/dist/shipment/shipment-pipeline.d.ts.map +1 -0
- package/dist/shipment/shipment-pipeline.js +256 -0
- package/dist/shipment/shipment-pipeline.js.map +1 -0
- package/dist/shipment/transport-detect.d.ts +16 -0
- package/dist/shipment/transport-detect.d.ts.map +1 -0
- package/dist/shipment/transport-detect.js +54 -0
- package/dist/shipment/transport-detect.js.map +1 -0
- package/dist/shipment/workspace-diff.d.ts +39 -0
- package/dist/shipment/workspace-diff.d.ts.map +1 -0
- package/dist/shipment/workspace-diff.js +64 -0
- package/dist/shipment/workspace-diff.js.map +1 -0
- package/dist/swarm-coordinator.d.ts +20 -1
- package/dist/swarm-coordinator.d.ts.map +1 -1
- package/dist/swarm-coordinator.js +193 -10
- package/dist/swarm-coordinator.js.map +1 -1
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/workspace/git-worktree-provider.d.ts +11 -0
- package/dist/workspace/git-worktree-provider.d.ts.map +1 -0
- package/dist/workspace/git-worktree-provider.js +123 -0
- package/dist/workspace/git-worktree-provider.js.map +1 -0
- package/dist/workspace/gitignore-check.d.ts +10 -0
- package/dist/workspace/gitignore-check.d.ts.map +1 -0
- package/dist/workspace/gitignore-check.js +25 -0
- package/dist/workspace/gitignore-check.js.map +1 -0
- package/dist/workspace/index.d.ts +5 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +5 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/snapshot-copy-provider.d.ts +11 -0
- package/dist/workspace/snapshot-copy-provider.d.ts.map +1 -0
- package/dist/workspace/snapshot-copy-provider.js +66 -0
- package/dist/workspace/snapshot-copy-provider.js.map +1 -0
- package/dist/workspace/types.d.ts +36 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +2 -0
- package/dist/workspace/types.js.map +1 -0
- package/dist/workspace/workspace-manager.d.ts +30 -0
- package/dist/workspace/workspace-manager.d.ts.map +1 -0
- package/dist/workspace/workspace-manager.js +104 -0
- package/dist/workspace/workspace-manager.js.map +1 -0
- package/package.json +4 -4
- package/roles/queen.md +1 -0
- package/templates/introspection.md +64 -0
- package/templates/research-only.md +58 -0
- package/roles/preset-analyst-simons.md +0 -39
- package/roles/preset-architect-knuth.md +0 -39
- package/roles/preset-designer-norman.md +0 -39
- package/roles/preset-designer.md +0 -39
- package/roles/preset-dev-carmack.md +0 -39
- package/roles/preset-dev-gosling.md +0 -39
- package/roles/preset-developer.md +0 -52
- package/roles/preset-manager-grove.md +0 -39
- package/roles/preset-manager-musk.md +0 -39
- package/roles/preset-pm.md +0 -78
- package/roles/preset-researcher-feynman.md +0 -39
- package/roles/preset-reviewer.md +0 -46
- package/roles/preset-strategist-buffett.md +0 -39
- package/roles/preset-strategist-munger.md +0 -39
- package/roles/preset-strategist-sunzi.md +0 -39
- package/roles/preset-tester-beck.md +0 -40
- package/roles/preset-tester.md +0 -47
- package/roles/preset-writer-orwell.md +0 -39
- package/roles/preset-writer.md +0 -39
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// WorkCycleRunner — M7.1 bridge between DiscoveryScheduler and the existing
|
|
2
|
+
// swarm/worktree/shipment pipeline.
|
|
3
|
+
//
|
|
4
|
+
// Responsibilities (kept deliberately small):
|
|
5
|
+
// 1. Pull the next task via an injected `pickNextTask` callback (TaskStore
|
|
6
|
+
// lives in the agent package; we stay decoupled via DI).
|
|
7
|
+
// 2. Create a single-cycle synthetic swarm via SwarmCoordinator.create with
|
|
8
|
+
// a stable `m7-cycle-<uuid>` swarmId prefix so the UI / persisted history
|
|
9
|
+
// can identify scheduler-spawned swarms later.
|
|
10
|
+
// 3. Wait for the swarm to reach a terminal state (or timeout) by polling
|
|
11
|
+
// coordinator.getSwarm().status.
|
|
12
|
+
// 4. Load the persisted ShipmentResult and return a structured
|
|
13
|
+
// WorkCycleResult to the caller (typically DiscoveryScheduler.onFire).
|
|
14
|
+
//
|
|
15
|
+
// Best-effort: every failure path is captured in the returned `error` field;
|
|
16
|
+
// run() never throws — a thrown runner would crash the DiscoveryScheduler tick
|
|
17
|
+
// loop, defeating the purpose of always-on.
|
|
18
|
+
import { randomUUID } from "node:crypto";
|
|
19
|
+
import { createLogger } from "@mclawnet/logger";
|
|
20
|
+
import { loadShipmentResult } from "../persistence.js";
|
|
21
|
+
/** Template the runner picks when TaskRef.cycleKind === "research" (M8.1). */
|
|
22
|
+
const RESEARCH_TEMPLATE_NAME = "research-only";
|
|
23
|
+
const DEFAULT_POLL_TIMEOUT_MS = 30 * 60 * 1000;
|
|
24
|
+
const DEFAULT_POLL_INTERVAL_MS = 5_000;
|
|
25
|
+
const DEFAULT_INITIAL_SETTLE_MS = 5_000;
|
|
26
|
+
const moduleLog = createLogger({ module: "swarm" });
|
|
27
|
+
/** Real-clock sleep. Replaced in tests via opts.sleep. */
|
|
28
|
+
function defaultSleep(ms) {
|
|
29
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
30
|
+
}
|
|
31
|
+
export class WorkCycleRunner {
|
|
32
|
+
pickNextTask;
|
|
33
|
+
resolveTaskSource;
|
|
34
|
+
coordinator;
|
|
35
|
+
log;
|
|
36
|
+
pollTimeoutMs;
|
|
37
|
+
pollIntervalMs;
|
|
38
|
+
initialSettleMs;
|
|
39
|
+
sleep;
|
|
40
|
+
constructor(opts) {
|
|
41
|
+
this.pickNextTask = opts.pickNextTask;
|
|
42
|
+
if (opts.resolveTaskSource)
|
|
43
|
+
this.resolveTaskSource = opts.resolveTaskSource;
|
|
44
|
+
this.coordinator = opts.swarmCoordinator;
|
|
45
|
+
this.log = opts.log ?? moduleLog;
|
|
46
|
+
this.pollTimeoutMs = opts.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;
|
|
47
|
+
this.pollIntervalMs = opts.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
48
|
+
this.initialSettleMs = opts.initialSettleMs ?? DEFAULT_INITIAL_SETTLE_MS;
|
|
49
|
+
this.sleep = opts.sleep ?? defaultSleep;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Run one work cycle. Never throws — every failure is folded into the
|
|
53
|
+
* returned WorkCycleResult so DiscoveryScheduler.onFire can stay shape-
|
|
54
|
+
* stable across success and failure paths.
|
|
55
|
+
*/
|
|
56
|
+
async run(input) {
|
|
57
|
+
const cycleId = randomUUID();
|
|
58
|
+
// Match the spec: prefix lets UI/persisted history identify scheduler-
|
|
59
|
+
// spawned swarms (vs. user-driven ones in M6.x flows).
|
|
60
|
+
const swarmId = `m7-cycle-${cycleId}`;
|
|
61
|
+
const startedAt = new Date().toISOString();
|
|
62
|
+
// 1. Pick a task — null means "nothing to do this cycle".
|
|
63
|
+
let task;
|
|
64
|
+
try {
|
|
65
|
+
task = await this.pickNextTask(input.projectRoot);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
69
|
+
this.log.warn({ err: msg, cycleId }, "pickNextTask threw — skipping cycle");
|
|
70
|
+
return {
|
|
71
|
+
cycleId,
|
|
72
|
+
swarmId,
|
|
73
|
+
taskRef: null,
|
|
74
|
+
status: "skipped",
|
|
75
|
+
error: `pickNextTask failed: ${msg}`,
|
|
76
|
+
startedAt,
|
|
77
|
+
endedAt: new Date().toISOString(),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (!task) {
|
|
81
|
+
this.log.info({ cycleId, projectRoot: input.projectRoot }, "no task available — skipping cycle");
|
|
82
|
+
return {
|
|
83
|
+
cycleId,
|
|
84
|
+
swarmId,
|
|
85
|
+
taskRef: null,
|
|
86
|
+
status: "skipped",
|
|
87
|
+
error: "no task available",
|
|
88
|
+
startedAt,
|
|
89
|
+
endedAt: new Date().toISOString(),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Resolve the source that produced this task so we can drive its
|
|
93
|
+
// onClaim / onSuccess / onFailure lifecycle. Null when the runner is
|
|
94
|
+
// running in legacy M7 single-source mode (no cascade picker injected).
|
|
95
|
+
const source = this.resolveTaskSource ? this.resolveTaskSource(task) : null;
|
|
96
|
+
// 2. Spawn the swarm.
|
|
97
|
+
// M8.1: research cycles override the default template so the worker
|
|
98
|
+
// operates under read-mostly + markdown-only constraints (see
|
|
99
|
+
// packages/@clawnet/swarm/templates/research-only.md). The override is
|
|
100
|
+
// task-driven, not config-driven — the same project can flip between
|
|
101
|
+
// execute (TaskStore / IdeaTodoSource) and research (IdeaResearchSource)
|
|
102
|
+
// cycles without an always-on.json edit.
|
|
103
|
+
const templateName = task.cycleKind === "research" ? RESEARCH_TEMPLATE_NAME : input.templateName ?? "minimal";
|
|
104
|
+
try {
|
|
105
|
+
await this.coordinator.create(swarmId, {
|
|
106
|
+
workDir: input.projectRoot,
|
|
107
|
+
templateName,
|
|
108
|
+
task: task.description ?? task.title,
|
|
109
|
+
kind: "always-on-cycle",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
114
|
+
this.log.warn({ err: msg, cycleId, swarmId }, "coordinator.create failed");
|
|
115
|
+
// Even though we never spawned, give the source a chance to clean up
|
|
116
|
+
// any optimistic state (it didn't claim yet, so onFailure is the right
|
|
117
|
+
// signal). Best-effort.
|
|
118
|
+
await this.invokeHook(source, "onFailure", task, swarmId, msg);
|
|
119
|
+
return {
|
|
120
|
+
cycleId,
|
|
121
|
+
swarmId,
|
|
122
|
+
taskRef: task,
|
|
123
|
+
status: "failed",
|
|
124
|
+
error: `coordinator.create failed: ${msg}`,
|
|
125
|
+
startedAt,
|
|
126
|
+
endedAt: new Date().toISOString(),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Source has now "claimed" the task — let it record the in-flight state
|
|
130
|
+
// (IdeaTodoSource PATCHes the idea to researching + linkedSwarmTaskId).
|
|
131
|
+
await this.invokeHook(source, "onClaim", task, swarmId);
|
|
132
|
+
this.log.info({ cycleId, swarmId, taskId: task.id, taskTitle: task.title, source: source?.name ?? null }, "work cycle: swarm spawned, awaiting terminal state");
|
|
133
|
+
// 3. Wait for terminal state (polling). Best-effort — timeout cancels.
|
|
134
|
+
const waitResult = await this.waitForTerminal(swarmId);
|
|
135
|
+
// 4. Load shipment regardless of outcome — it's the artifact M6.2 UI uses
|
|
136
|
+
// and may exist even on failure (partial work). Best-effort.
|
|
137
|
+
let shipment;
|
|
138
|
+
try {
|
|
139
|
+
const loaded = loadShipmentResult(input.projectRoot, swarmId);
|
|
140
|
+
if (loaded)
|
|
141
|
+
shipment = loaded;
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
this.log.warn({ err: err instanceof Error ? err.message : String(err), cycleId, swarmId }, "loadShipmentResult failed (best-effort)");
|
|
145
|
+
}
|
|
146
|
+
// 5. Drive source lifecycle hooks based on the terminal outcome. Per the
|
|
147
|
+
// M8.0 design contract: success = swarm completed AND shipment
|
|
148
|
+
// actually landed (strategy !== "skipped"); everything else is a
|
|
149
|
+
// failure path and the source should clean up (IdeaTodoSource
|
|
150
|
+
// reverts status=todo so the cycle can retry).
|
|
151
|
+
const hookKind = waitResult.status === "completed" && shipment && shipment.strategy !== "skipped"
|
|
152
|
+
? "onSuccess"
|
|
153
|
+
: "onFailure";
|
|
154
|
+
const hookError = hookKind === "onFailure"
|
|
155
|
+
? waitResult.error ?? shipment?.error ?? `shipment strategy=${shipment?.strategy ?? "none"}`
|
|
156
|
+
: undefined;
|
|
157
|
+
await this.invokeHook(source, hookKind, task, swarmId, hookError);
|
|
158
|
+
return {
|
|
159
|
+
cycleId,
|
|
160
|
+
swarmId,
|
|
161
|
+
taskRef: task,
|
|
162
|
+
status: waitResult.status,
|
|
163
|
+
...(shipment ? { shipment } : {}),
|
|
164
|
+
...(waitResult.error ? { error: waitResult.error } : {}),
|
|
165
|
+
startedAt,
|
|
166
|
+
endedAt: new Date().toISOString(),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Best-effort invocation of a source lifecycle hook. Swallows the source's
|
|
171
|
+
* exceptions so a misbehaving hook never crashes the runner — the cycle
|
|
172
|
+
* already reached its terminal state and the result is locked in.
|
|
173
|
+
*/
|
|
174
|
+
async invokeHook(source, kind, taskRef, swarmId, error) {
|
|
175
|
+
if (!source)
|
|
176
|
+
return;
|
|
177
|
+
const fn = source[kind];
|
|
178
|
+
if (typeof fn !== "function")
|
|
179
|
+
return;
|
|
180
|
+
try {
|
|
181
|
+
if (kind === "onFailure") {
|
|
182
|
+
await source.onFailure(taskRef, swarmId, error);
|
|
183
|
+
}
|
|
184
|
+
else if (kind === "onSuccess") {
|
|
185
|
+
await source.onSuccess(taskRef, swarmId);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
await source.onClaim(taskRef, swarmId);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
this.log.warn({
|
|
193
|
+
err: err instanceof Error ? err.message : String(err),
|
|
194
|
+
source: source.name,
|
|
195
|
+
hook: kind,
|
|
196
|
+
swarmId,
|
|
197
|
+
taskId: taskRef.id,
|
|
198
|
+
}, "task-source hook threw (best-effort)");
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Poll coordinator.getSwarm(swarmId) until the swarm enters a terminal
|
|
203
|
+
* state or the swarm is removed from the registry (cleanup already ran).
|
|
204
|
+
*
|
|
205
|
+
* Returns {status, error?} so the caller can build the full result.
|
|
206
|
+
* Status interpretation:
|
|
207
|
+
* - "completed" → swarm.status flipped to completed (we then call
|
|
208
|
+
* coordinator.complete to release resources if it's still in the map)
|
|
209
|
+
* - "failed" → swarm.status flipped to failed (we then call .fail)
|
|
210
|
+
* - "completed" (gone from map) → cleanup already happened externally;
|
|
211
|
+
* treat as completed without re-calling complete()
|
|
212
|
+
* - "failed" (timeout exceeded) → cancel via destroy and return failed
|
|
213
|
+
*/
|
|
214
|
+
async waitForTerminal(swarmId) {
|
|
215
|
+
// Initial settle so we don't hammer the coordinator immediately after create.
|
|
216
|
+
if (this.initialSettleMs > 0) {
|
|
217
|
+
await this.sleep(this.initialSettleMs);
|
|
218
|
+
}
|
|
219
|
+
// PR-B D12 — no deadline. Loop until coordinator state turns terminal
|
|
220
|
+
// (completed/failed/cancelled) or paused (D14 → runner promotes to
|
|
221
|
+
// completed). pollTimeoutMs option kept for back-compat but unused;
|
|
222
|
+
// callers (always-on-manager) no longer pass it.
|
|
223
|
+
// eslint-disable-next-line no-constant-condition
|
|
224
|
+
while (true) {
|
|
225
|
+
const swarm = this.coordinator.getSwarm(swarmId);
|
|
226
|
+
if (!swarm) {
|
|
227
|
+
// Swarm was already cleaned up (e.g. complete() was called externally
|
|
228
|
+
// and runRetroAndCleanup removed it from the map). Treat as completed
|
|
229
|
+
// — the shipment.json on disk is the source of truth.
|
|
230
|
+
this.log.info({ swarmId }, "swarm no longer in registry — treating as completed");
|
|
231
|
+
return { status: "completed" };
|
|
232
|
+
}
|
|
233
|
+
if (swarm.status === "completed") {
|
|
234
|
+
// Best-effort: ensure cleanup runs so shipment writeback + memory sync
|
|
235
|
+
// happen. complete() is idempotent (no-op if not present).
|
|
236
|
+
try {
|
|
237
|
+
await this.coordinator.complete(swarmId);
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
this.log.warn({ err: err instanceof Error ? err.message : String(err), swarmId }, "coordinator.complete failed (best-effort)");
|
|
241
|
+
}
|
|
242
|
+
return { status: "completed" };
|
|
243
|
+
}
|
|
244
|
+
if (swarm.status === "failed") {
|
|
245
|
+
try {
|
|
246
|
+
await this.coordinator.fail(swarmId);
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
this.log.warn({ err: err instanceof Error ? err.message : String(err), swarmId }, "coordinator.fail failed (best-effort)");
|
|
250
|
+
}
|
|
251
|
+
return { status: "failed" };
|
|
252
|
+
}
|
|
253
|
+
if (swarm.status === "cancelled") {
|
|
254
|
+
// External cancel — treat as failed (the cycle didn't produce its
|
|
255
|
+
// intended outcome). No cleanup call needed; cancelled is terminal.
|
|
256
|
+
return { status: "failed", error: "swarm was cancelled externally" };
|
|
257
|
+
}
|
|
258
|
+
// PR-B D14 — paused = "queen stopped responding for ≥100 min". This
|
|
259
|
+
// is the coordinator's idle-fallback (startQueenCheck → swarm.status
|
|
260
|
+
// = paused) and it would otherwise sit forever holding CLI sessions
|
|
261
|
+
// + worktree disk. Runner promotes paused to completed so the full
|
|
262
|
+
// cleanup chain (runRetroAndCleanup → closeSession → workspace
|
|
263
|
+
// dispose → shipment of whatever progress was made) fires. Same
|
|
264
|
+
// spawner-owned pattern PR-A B2c added for IntrospectionSource,
|
|
265
|
+
// applied here at the runner layer for ordinary always-on cycles.
|
|
266
|
+
if (swarm.status === "paused") {
|
|
267
|
+
this.log.info({ swarmId }, "always-on cycle hit coordinator auto-pause — runner completing on swarm's behalf to release resources");
|
|
268
|
+
try {
|
|
269
|
+
await this.coordinator.complete(swarmId);
|
|
270
|
+
}
|
|
271
|
+
catch (err) {
|
|
272
|
+
this.log.warn({ err: err instanceof Error ? err.message : String(err), swarmId }, "coordinator.complete after auto-pause failed (best-effort)");
|
|
273
|
+
}
|
|
274
|
+
return { status: "completed" };
|
|
275
|
+
}
|
|
276
|
+
// PR-B D12 — no more pollTimeoutMs cap. There's no multi-cycle
|
|
277
|
+
// continuation mechanism, so cutting a cycle off at 30 min just
|
|
278
|
+
// burned tokens with zero accumulated progress. Long cycles run to
|
|
279
|
+
// queen-driven completion, with D14 (paused → complete) as the
|
|
280
|
+
// resource-leak guard.
|
|
281
|
+
await this.sleep(this.pollIntervalMs);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=workcycle-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workcycle-runner.js","sourceRoot":"","sources":["../../src/always-on/workcycle-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Default debug-window: keep failed-cycle worktrees for 24h before reaping. */
|
|
2
|
+
export declare const DEFAULT_WORKTREE_GC_AGE_MS: number;
|
|
3
|
+
export interface WorktreeGcOptions {
|
|
4
|
+
/** Project workDir (e.g. /Users/me/myproject). */
|
|
5
|
+
workDir: string;
|
|
6
|
+
/** ClawNet HOME used to resolve snapshot location. */
|
|
7
|
+
home: string;
|
|
8
|
+
/** Eligible-age cutoff. Default 24h. */
|
|
9
|
+
maxAgeMs?: number;
|
|
10
|
+
/** Clock override for tests. */
|
|
11
|
+
now?: () => Date;
|
|
12
|
+
/**
|
|
13
|
+
* Set false in tests to compute counts but NOT delete. Production always
|
|
14
|
+
* leaves this true (the default).
|
|
15
|
+
*/
|
|
16
|
+
dryRun?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface WorktreeGcResult {
|
|
19
|
+
/** Total `.worktrees/<dir>` entries observed. */
|
|
20
|
+
scanned: number;
|
|
21
|
+
/** Entries removed this pass. */
|
|
22
|
+
removed: number;
|
|
23
|
+
/** Entries retained (still active OR within debug window). */
|
|
24
|
+
retained: number;
|
|
25
|
+
/** Per-entry decisions for log spelunking. Limited to first 50 to bound log size. */
|
|
26
|
+
decisions: Array<{
|
|
27
|
+
name: string;
|
|
28
|
+
action: "removed" | "retained-active" | "retained-young";
|
|
29
|
+
ageMs: number;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Run one GC pass for one project's `.worktrees/`. Safe to call on every
|
|
34
|
+
* fired tick — when there's nothing to clean it's a cheap top-level
|
|
35
|
+
* readdir + per-entry stat pass (NO recursion into worktree contents).
|
|
36
|
+
*
|
|
37
|
+
* Errors at every layer are swallowed (logged via the returned result, not
|
|
38
|
+
* thrown) so a single bad worktree dir can't break the always-on tick loop.
|
|
39
|
+
*/
|
|
40
|
+
export declare function gcWorktrees(opts: WorktreeGcOptions): WorktreeGcResult;
|
|
41
|
+
//# sourceMappingURL=worktree-gc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-gc.d.ts","sourceRoot":"","sources":["../../src/always-on/worktree-gc.ts"],"names":[],"mappings":"AAsDA,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,QAAsB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7G;AASD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,CAgErE"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// PR-B Sub-PR-B4 — always-on worktree GC.
|
|
2
|
+
//
|
|
3
|
+
// Each fired always-on tick spawns a swarm that prepares a workspace
|
|
4
|
+
// (git worktree or, more commonly in practice, a snapshot-copy of the
|
|
5
|
+
// full repo) under `<projectRoot>/.worktrees/<swarmId>/`. SwarmCoordinator.
|
|
6
|
+
// destroy() / complete() / fail() dispose the workspace as part of
|
|
7
|
+
// runRetroAndCleanup, but **failures along that path leave directories
|
|
8
|
+
// behind**: pollTimeoutMs strands (removed in Sub-PR-B1), coordinator
|
|
9
|
+
// crashes, manual UI cancels mid-cleanup, sentinel files left when the
|
|
10
|
+
// SnapshotCopyProvider couldn't atomically delete.
|
|
11
|
+
//
|
|
12
|
+
// Over a 24h aggressive-mode run that's 144 ticks × ~few-hundred MB each.
|
|
13
|
+
// Real disk pressure shows up after a day or two of unattended running.
|
|
14
|
+
//
|
|
15
|
+
// GC strategy:
|
|
16
|
+
// - scan `<projectRoot>/.worktrees/`
|
|
17
|
+
// - for each entry, read mtime + check active-swarm membership
|
|
18
|
+
// - retain if: (a) is an active swarm in the coordinator-tracked snapshot
|
|
19
|
+
// set (recovery.json status ∉ completed/failed/cancelled), OR
|
|
20
|
+
// (b) mtime is younger than maxAgeMs (24h default — debug window)
|
|
21
|
+
// - otherwise: rm -rf
|
|
22
|
+
//
|
|
23
|
+
// PR-B follow-up — size telemetry removed.
|
|
24
|
+
// The original implementation reported {totalBytesBefore, totalBytesAfter}
|
|
25
|
+
// by walking every file under every worktree synchronously with
|
|
26
|
+
// readdirSync + statSync (`safeDirBytes`). In production a worktree is a
|
|
27
|
+
// full repo copy *including* node_modules — ~70k+ files. Across the
|
|
28
|
+
// average ~15 retained worktrees, one GC pass issued ~1M sync stat
|
|
29
|
+
// syscalls (>10 min wall clock), pegging the agent at 99% CPU and
|
|
30
|
+
// freezing the Node event loop. Symptoms: log goes silent, hub
|
|
31
|
+
// proxy_rpc 503 agent_timeout, InboxWatcher fs.watch never fires,
|
|
32
|
+
// queen-driven `swarm_complete_request` stays delivered=false until
|
|
33
|
+
// agent restart. Profile evidence: CPU samples showed `stat` / `readdir`
|
|
34
|
+
// dominating with `safeDirBytes` as the entry frame.
|
|
35
|
+
//
|
|
36
|
+
// The bytes were nice-to-have telemetry, not load-bearing for the reap
|
|
37
|
+
// decision. Deleted entirely — if a future use case needs size info it
|
|
38
|
+
// should use OS-native `du -sk` via spawnSync (kernel-side walk, 100×
|
|
39
|
+
// faster) or batch async readdir with explicit event-loop yields. NEVER
|
|
40
|
+
// reintroduce a synchronous recursive stat walk into the always-on tick
|
|
41
|
+
// path.
|
|
42
|
+
import { existsSync, readdirSync, readFileSync, rmSync, statSync, } from "node:fs";
|
|
43
|
+
import { join } from "node:path";
|
|
44
|
+
import { projectRoot as projRoot } from "@mclawnet/task";
|
|
45
|
+
/** Default debug-window: keep failed-cycle worktrees for 24h before reaping. */
|
|
46
|
+
export const DEFAULT_WORKTREE_GC_AGE_MS = 24 * 60 * 60 * 1000;
|
|
47
|
+
const EMPTY_RESULT = {
|
|
48
|
+
scanned: 0,
|
|
49
|
+
removed: 0,
|
|
50
|
+
retained: 0,
|
|
51
|
+
decisions: [],
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Run one GC pass for one project's `.worktrees/`. Safe to call on every
|
|
55
|
+
* fired tick — when there's nothing to clean it's a cheap top-level
|
|
56
|
+
* readdir + per-entry stat pass (NO recursion into worktree contents).
|
|
57
|
+
*
|
|
58
|
+
* Errors at every layer are swallowed (logged via the returned result, not
|
|
59
|
+
* thrown) so a single bad worktree dir can't break the always-on tick loop.
|
|
60
|
+
*/
|
|
61
|
+
export function gcWorktrees(opts) {
|
|
62
|
+
const maxAge = opts.maxAgeMs ?? DEFAULT_WORKTREE_GC_AGE_MS;
|
|
63
|
+
const now = (opts.now ?? (() => new Date())).call(null).getTime();
|
|
64
|
+
const dryRun = opts.dryRun ?? false;
|
|
65
|
+
const worktreesDir = join(opts.workDir, ".worktrees");
|
|
66
|
+
if (!existsSync(worktreesDir))
|
|
67
|
+
return { ...EMPTY_RESULT, decisions: [] };
|
|
68
|
+
const active = loadActiveSwarmIds(opts.workDir, opts.home);
|
|
69
|
+
let entries;
|
|
70
|
+
try {
|
|
71
|
+
entries = readdirSync(worktreesDir);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return { ...EMPTY_RESULT, decisions: [] };
|
|
75
|
+
}
|
|
76
|
+
const result = {
|
|
77
|
+
scanned: 0,
|
|
78
|
+
removed: 0,
|
|
79
|
+
retained: 0,
|
|
80
|
+
decisions: [],
|
|
81
|
+
};
|
|
82
|
+
for (const name of entries) {
|
|
83
|
+
const fp = join(worktreesDir, name);
|
|
84
|
+
let stat;
|
|
85
|
+
try {
|
|
86
|
+
stat = statSync(fp);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
continue; // entry vanished between readdir and stat
|
|
90
|
+
}
|
|
91
|
+
if (!stat.isDirectory())
|
|
92
|
+
continue;
|
|
93
|
+
result.scanned += 1;
|
|
94
|
+
const ageMs = now - stat.mtimeMs;
|
|
95
|
+
if (active.has(name)) {
|
|
96
|
+
result.retained += 1;
|
|
97
|
+
pushDecision(result, name, "retained-active", ageMs);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (ageMs < maxAge) {
|
|
101
|
+
result.retained += 1;
|
|
102
|
+
pushDecision(result, name, "retained-young", ageMs);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (!dryRun) {
|
|
106
|
+
try {
|
|
107
|
+
rmSync(fp, { recursive: true, force: true });
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Best-effort: failed rm (perms, in-use file on Windows). Counts as
|
|
111
|
+
// retained — we tried, didn't succeed, dir still on disk.
|
|
112
|
+
result.retained += 1;
|
|
113
|
+
pushDecision(result, name, "retained-young", ageMs);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
result.removed += 1;
|
|
118
|
+
pushDecision(result, name, "removed", ageMs);
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
function pushDecision(result, name, action, ageMs) {
|
|
123
|
+
if (result.decisions.length < 50) {
|
|
124
|
+
result.decisions.push({ name, action, ageMs });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Read this project's swarms snapshot dir and return the set of swarmIds
|
|
129
|
+
* whose recovery.json status is NOT terminal (still running / paused /
|
|
130
|
+
* creating). Those swarms' worktrees must NOT be GC'd even if they look
|
|
131
|
+
* old on disk — they're active state, just stalled.
|
|
132
|
+
*/
|
|
133
|
+
function loadActiveSwarmIds(workDir, home) {
|
|
134
|
+
const swarmsDir = join(projRoot(workDir, home), "swarms");
|
|
135
|
+
if (!existsSync(swarmsDir))
|
|
136
|
+
return new Set();
|
|
137
|
+
const active = new Set();
|
|
138
|
+
let entries;
|
|
139
|
+
try {
|
|
140
|
+
entries = readdirSync(swarmsDir);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return active;
|
|
144
|
+
}
|
|
145
|
+
for (const swarmId of entries) {
|
|
146
|
+
const recoveryPath = join(swarmsDir, swarmId, "recovery.json");
|
|
147
|
+
if (!existsSync(recoveryPath))
|
|
148
|
+
continue;
|
|
149
|
+
try {
|
|
150
|
+
const raw = JSON.parse(readFileSync(recoveryPath, "utf-8"));
|
|
151
|
+
const status = raw.status;
|
|
152
|
+
// Treat "paused" as ACTIVE for GC purposes — Sub-PR-B1's D14 runner
|
|
153
|
+
// will promote it to complete on next tick and free its workspace
|
|
154
|
+
// through the normal dispose path. Reaping a paused worktree out
|
|
155
|
+
// from under D14 would lose any in-progress work.
|
|
156
|
+
const terminal = status === "completed" || status === "failed" || status === "cancelled";
|
|
157
|
+
if (!terminal)
|
|
158
|
+
active.add(swarmId);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Unparseable snapshot — be conservative, treat as active.
|
|
162
|
+
active.add(swarmId);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return active;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=worktree-gc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-gc.js","sourceRoot":"","sources":["../../src/always-on/worktree-gc.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
export { SwarmCoordinator } from "./swarm-coordinator.js";
|
|
2
2
|
export { initRoles, loadRole, listRoles, buildRolePrompt, parseRoleFile, listRolesWithSource, getRoleSource, getRoleRaw, saveRole, deleteRole, } from "./roles/role-loader.js";
|
|
3
3
|
export type { RoleSource, RoleListItem } from "./roles/role-loader.js";
|
|
4
|
-
export { saveSwarmSnapshot, loadSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, readMessageLog, listRecoverableSwarmIds, } from "./persistence.js";
|
|
4
|
+
export { saveSwarmSnapshot, loadSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, readMessageLog, listRecoverableSwarmIds, saveShipmentResult, loadShipmentResult, } from "./persistence.js";
|
|
5
5
|
export type { SwarmSnapshot } from "./persistence.js";
|
|
6
|
+
export type { ShipmentResult } from "./shipment/shipment-pipeline.js";
|
|
7
|
+
export { applyShipment, mergeShipment, discardShipment, } from "./shipment/shipment-actions.js";
|
|
8
|
+
export type { ShipmentActionKind, ShipmentActionInput, ShipmentActionResult, } from "./shipment/shipment-actions.js";
|
|
6
9
|
export { runRetrospective } from "./retrospective.js";
|
|
7
10
|
export type { RetrospectiveResult, RoleEvaluation } from "./retrospective.js";
|
|
11
|
+
export { createDraftPR } from "./shipment/gh-pr-creator.js";
|
|
12
|
+
export type { CreateDraftPRInput, CreateDraftPRReturn, CreateDraftPROptions, CommandRunnerWithStdin, } from "./shipment/gh-pr-creator.js";
|
|
8
13
|
export { listRecoverableSwarms, recoverSwarm } from "./recovery.js";
|
|
9
14
|
export { InboxStore } from "./inbox-store.js";
|
|
10
15
|
export type { InboxMessage } from "./inbox-store.js";
|
|
@@ -13,7 +18,24 @@ export { InboxRelay } from "./inbox-relay.js";
|
|
|
13
18
|
export { InboxWatcher, type InboxRelayLike as InboxWatcherRelayLike } from "./inbox-watcher.js";
|
|
14
19
|
export { WakeupScheduler, type WakeupRelayLike } from "./wakeup-scheduler.js";
|
|
15
20
|
export { WatchManager, type WatchRegistration, type WatchManagerOptions } from "./watch-manager.js";
|
|
16
|
-
export
|
|
21
|
+
export { DiscoveryScheduler } from "./always-on/discovery-scheduler.js";
|
|
22
|
+
export { DEFAULT_DAILY_BUDGET, DEFAULT_TICK_INTERVAL_MS, RECENT_TICKS_CAP, } from "./always-on/types.js";
|
|
23
|
+
export type { AlwaysOnMode, GateDecision, GateContext, Gate, TickRecord, DiscoverySchedulerOptions, DiscoverySchedulerSnapshot, } from "./always-on/types.js";
|
|
24
|
+
export { loadAlwaysOnConfig, saveAlwaysOnConfig, mergeAlwaysOnConfig, alwaysOnConfigPath, localYMD, DEFAULT_ALWAYS_ON_CONFIG, DEFAULT_ALWAYS_ON_TEMPLATE, DEFAULT_ALWAYS_ON_TASK_SOURCES, DEFAULT_INTROSPECTION_COOLDOWN_HOURS, resolveTaskSources, } from "./always-on/config.js";
|
|
25
|
+
export type { AlwaysOnConfig, AlwaysOnTaskSourcesConfig, AlwaysOnRuntimeState, AlwaysOnPersistedConfig, } from "./always-on/config.js";
|
|
26
|
+
export { AlwaysOnManager } from "./always-on/always-on-manager.js";
|
|
27
|
+
export type { AlwaysOnManagerOptions } from "./always-on/always-on-manager.js";
|
|
28
|
+
export { WorkCycleRunner } from "./always-on/workcycle-runner.js";
|
|
29
|
+
export type { WorkCycleInput, WorkCycleResult, WorkCycleRunnerOptions, TaskRef, Logger as WorkCycleRunnerLogger, } from "./always-on/workcycle-runner.js";
|
|
30
|
+
export type { TaskSource, TaskSourceKind, TaskRef as CascadeTaskRef } from "./always-on/task-sources/types.js";
|
|
31
|
+
export { createCascadePicker, type CascadePicker, type CascadePickResult, type CascadePickerLogger, } from "./always-on/task-sources/cascade-picker.js";
|
|
32
|
+
export { createTaskStoreSource, type TaskStoreSourceOptions, } from "./always-on/task-sources/task-store-source.js";
|
|
33
|
+
export { createIdeaTodoSource, markIdeaResearching, sortIdeasForPicking, type IdeaTodoSourceOptions, } from "./always-on/task-sources/idea-todo-source.js";
|
|
34
|
+
export { createIdeaResearchSource, sortIdeasForResearch, parseReportFrontmatter, normaliseConclusion, type IdeaResearchSourceOptions, } from "./always-on/task-sources/idea-research-source.js";
|
|
35
|
+
export { createIntrospectionSource, parseCandidatesOutput, buildIntrospectionTaskPrompt, INTROSPECTION_TEMPLATE_NAME, INTROSPECTION_SOURCE_TAG, INTROSPECTION_SOURCE_ROLE, INTROSPECTION_MAX_IDEAS, type IntrospectionSourceOptions, type IntrospectionCandidate, } from "./always-on/task-sources/introspection-source.js";
|
|
36
|
+
export { reconcileOrphanedResearching, type ReconcileOptions, type ReconcileReport, type ReconcileLogger, } from "./always-on/reconcile-researching.js";
|
|
37
|
+
export type { IdeasClient, IdeasListFilter, IdeasPatch, Idea, IdeaStatus, IdeaPriority, CreateIdeaInput, ResearchRef, ResearchKind, ResearchConclusion, } from "./always-on/ideas-client.js";
|
|
38
|
+
export type { SessionAdapter, HubAdapter, SwarmInstance, RoleInstance, SwarmAction, SwarmMessage, SwarmCreateOptions, RouteEndpoint, SwarmStatus, PlanStatus, SwarmKind, } from "./types.js";
|
|
17
39
|
export type { RoleDefinition, DelegationMap, DelegationEntry } from "./roles/types.js";
|
|
18
40
|
export { listTemplates, loadTemplate, listTemplatesWithSource, getTemplateSource, getTemplateRaw, saveTemplate, deleteTemplate, } from "./templates/template-loader.js";
|
|
19
41
|
export type { TemplateDefinition, TemplateRoleSpec } from "./templates/types.js";
|
|
@@ -22,4 +44,6 @@ export { listProjectDirs, resolveWorkDir, loadProjectSummary, loadSwarmSummaries
|
|
|
22
44
|
export type { TaskStatus, TaskCounts, ProjectSummary, SwarmSummary, } from "./projects-fs.js";
|
|
23
45
|
export { PROJECT_FILE_WHITELIST, isWhitelistedRelPath, listProjectFiles, readProjectFile, writeProjectFile, ProjectFilesError, } from "./project-files.js";
|
|
24
46
|
export type { ProjectFileRelPath, ProjectFileEntry, ProjectFileContent, } from "./project-files.js";
|
|
47
|
+
export { WorkspaceManager, GitWorktreeProvider, SnapshotCopyProvider, } from "./workspace/index.js";
|
|
48
|
+
export type { WorkspaceHandle, WorkspaceProvider, WorkspaceStrategy, WorkspacePrepareInput, } from "./workspace/index.js";
|
|
25
49
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EACrE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GACrE,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
// @mclawnet/swarm — Swarm coordination, message routing, and role management
|
|
2
2
|
export { SwarmCoordinator } from "./swarm-coordinator.js";
|
|
3
3
|
export { initRoles, loadRole, listRoles, buildRolePrompt, parseRoleFile, listRolesWithSource, getRoleSource, getRoleRaw, saveRole, deleteRole, } from "./roles/role-loader.js";
|
|
4
|
-
export { saveSwarmSnapshot, loadSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, readMessageLog, listRecoverableSwarmIds, } from "./persistence.js";
|
|
4
|
+
export { saveSwarmSnapshot, loadSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, readMessageLog, listRecoverableSwarmIds, saveShipmentResult, loadShipmentResult, } from "./persistence.js";
|
|
5
|
+
export { applyShipment, mergeShipment, discardShipment, } from "./shipment/shipment-actions.js";
|
|
5
6
|
export { runRetrospective } from "./retrospective.js";
|
|
7
|
+
// PR-A: re-export gh-pr-creator so chat-session worktree ship can reuse the
|
|
8
|
+
// same git push + gh pr create logic without depending on SwarmInstance.
|
|
9
|
+
export { createDraftPR } from "./shipment/gh-pr-creator.js";
|
|
6
10
|
export { listRecoverableSwarms, recoverSwarm } from "./recovery.js";
|
|
7
11
|
export { InboxStore } from "./inbox-store.js";
|
|
8
12
|
export { pickStrongestStatus } from "./plan-sync.js";
|
|
@@ -10,7 +14,26 @@ export { InboxRelay } from "./inbox-relay.js";
|
|
|
10
14
|
export { InboxWatcher } from "./inbox-watcher.js";
|
|
11
15
|
export { WakeupScheduler } from "./wakeup-scheduler.js";
|
|
12
16
|
export { WatchManager } from "./watch-manager.js";
|
|
17
|
+
// M7.0 always-on primitive (no swarm wiring yet; M7.1 will wire onFire).
|
|
18
|
+
export { DiscoveryScheduler } from "./always-on/discovery-scheduler.js";
|
|
19
|
+
export { DEFAULT_DAILY_BUDGET, DEFAULT_TICK_INTERVAL_MS, RECENT_TICKS_CAP, } from "./always-on/types.js";
|
|
20
|
+
// M7.2 always-on per-project config persistence.
|
|
21
|
+
export { loadAlwaysOnConfig, saveAlwaysOnConfig, mergeAlwaysOnConfig, alwaysOnConfigPath, localYMD, DEFAULT_ALWAYS_ON_CONFIG, DEFAULT_ALWAYS_ON_TEMPLATE, DEFAULT_ALWAYS_ON_TASK_SOURCES, DEFAULT_INTROSPECTION_COOLDOWN_HOURS, resolveTaskSources, } from "./always-on/config.js";
|
|
22
|
+
// M7.3 per-project scheduler lifecycle owner.
|
|
23
|
+
export { AlwaysOnManager } from "./always-on/always-on-manager.js";
|
|
24
|
+
// M7.1 work-cycle runner — bridges DiscoveryScheduler.onFire to swarm spawn.
|
|
25
|
+
export { WorkCycleRunner } from "./always-on/workcycle-runner.js";
|
|
26
|
+
export { createCascadePicker, } from "./always-on/task-sources/cascade-picker.js";
|
|
27
|
+
export { createTaskStoreSource, } from "./always-on/task-sources/task-store-source.js";
|
|
28
|
+
export { createIdeaTodoSource, markIdeaResearching, sortIdeasForPicking, } from "./always-on/task-sources/idea-todo-source.js";
|
|
29
|
+
// M8.1 — research cycle task source.
|
|
30
|
+
export { createIdeaResearchSource, sortIdeasForResearch, parseReportFrontmatter, normaliseConclusion, } from "./always-on/task-sources/idea-research-source.js";
|
|
31
|
+
// M8.2 — queen self-introspection task source.
|
|
32
|
+
export { createIntrospectionSource, parseCandidatesOutput, buildIntrospectionTaskPrompt, INTROSPECTION_TEMPLATE_NAME, INTROSPECTION_SOURCE_TAG, INTROSPECTION_SOURCE_ROLE, INTROSPECTION_MAX_IDEAS, } from "./always-on/task-sources/introspection-source.js";
|
|
33
|
+
// M8 hotfix I6 — boot reconciliation for orphaned status=researching ideas.
|
|
34
|
+
export { reconcileOrphanedResearching, } from "./always-on/reconcile-researching.js";
|
|
13
35
|
export { listTemplates, loadTemplate, listTemplatesWithSource, getTemplateSource, getTemplateRaw, saveTemplate, deleteTemplate, } from "./templates/template-loader.js";
|
|
14
36
|
export { listProjectDirs, resolveWorkDir, loadProjectSummary, loadSwarmSummaries, listAllProjectSummaries, } from "./projects-fs.js";
|
|
15
37
|
export { PROJECT_FILE_WHITELIST, isWhitelistedRelPath, listProjectFiles, readProjectFile, writeProjectFile, ProjectFilesError, } from "./project-files.js";
|
|
38
|
+
export { WorkspaceManager, GitWorktreeProvider, SnapshotCopyProvider, } from "./workspace/index.js";
|
|
16
39
|
//# sourceMappingURL=index.js.map
|