agent-bober 0.17.0 → 0.18.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +25 -0
- package/README.md +169 -6
- package/dist/chat/answerer.d.ts +17 -0
- package/dist/chat/answerer.d.ts.map +1 -0
- package/dist/chat/answerer.js +52 -0
- package/dist/chat/answerer.js.map +1 -0
- package/dist/chat/approval-cursor.d.ts +25 -0
- package/dist/chat/approval-cursor.d.ts.map +1 -0
- package/dist/chat/approval-cursor.js +61 -0
- package/dist/chat/approval-cursor.js.map +1 -0
- package/dist/chat/approval-reader.d.ts +11 -0
- package/dist/chat/approval-reader.d.ts.map +1 -0
- package/dist/chat/approval-reader.js +20 -0
- package/dist/chat/approval-reader.js.map +1 -0
- package/dist/chat/careful-sidecar.d.ts +15 -0
- package/dist/chat/careful-sidecar.d.ts.map +1 -0
- package/dist/chat/careful-sidecar.js +39 -0
- package/dist/chat/careful-sidecar.js.map +1 -0
- package/dist/chat/chat-session.d.ts +129 -0
- package/dist/chat/chat-session.d.ts.map +1 -0
- package/dist/chat/chat-session.js +470 -0
- package/dist/chat/chat-session.js.map +1 -0
- package/dist/chat/completion-tailer.d.ts +27 -0
- package/dist/chat/completion-tailer.d.ts.map +1 -0
- package/dist/chat/completion-tailer.js +187 -0
- package/dist/chat/completion-tailer.js.map +1 -0
- package/dist/chat/conversation-store.d.ts +22 -0
- package/dist/chat/conversation-store.d.ts.map +1 -0
- package/dist/chat/conversation-store.js +66 -0
- package/dist/chat/conversation-store.js.map +1 -0
- package/dist/chat/cursor-store.d.ts +23 -0
- package/dist/chat/cursor-store.d.ts.map +1 -0
- package/dist/chat/cursor-store.js +42 -0
- package/dist/chat/cursor-store.js.map +1 -0
- package/dist/chat/pid-sidecar.d.ts +22 -0
- package/dist/chat/pid-sidecar.d.ts.map +1 -0
- package/dist/chat/pid-sidecar.js +42 -0
- package/dist/chat/pid-sidecar.js.map +1 -0
- package/dist/chat/roster-reader.d.ts +16 -0
- package/dist/chat/roster-reader.d.ts.map +1 -0
- package/dist/chat/roster-reader.js +39 -0
- package/dist/chat/roster-reader.js.map +1 -0
- package/dist/chat/run-spawner.d.ts +71 -0
- package/dist/chat/run-spawner.d.ts.map +1 -0
- package/dist/chat/run-spawner.js +121 -0
- package/dist/chat/run-spawner.js.map +1 -0
- package/dist/chat/slash-commands.d.ts +36 -0
- package/dist/chat/slash-commands.d.ts.map +1 -0
- package/dist/chat/slash-commands.js +133 -0
- package/dist/chat/slash-commands.js.map +1 -0
- package/dist/chat/steer-cleanup.d.ts +12 -0
- package/dist/chat/steer-cleanup.d.ts.map +1 -0
- package/dist/chat/steer-cleanup.js +60 -0
- package/dist/chat/steer-cleanup.js.map +1 -0
- package/dist/chat/turn-classifier.d.ts +43 -0
- package/dist/chat/turn-classifier.d.ts.map +1 -0
- package/dist/chat/turn-classifier.js +150 -0
- package/dist/chat/turn-classifier.js.map +1 -0
- package/dist/cli/commands/blackboard.d.ts +33 -0
- package/dist/cli/commands/blackboard.d.ts.map +1 -0
- package/dist/cli/commands/blackboard.js +114 -0
- package/dist/cli/commands/blackboard.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +13 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +43 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/evolve.d.ts +18 -0
- package/dist/cli/commands/evolve.d.ts.map +1 -0
- package/dist/cli/commands/evolve.js +72 -0
- package/dist/cli/commands/evolve.js.map +1 -0
- package/dist/cli/commands/facts.d.ts +15 -0
- package/dist/cli/commands/facts.d.ts.map +1 -0
- package/dist/cli/commands/facts.js +213 -0
- package/dist/cli/commands/facts.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +1 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/medical.d.ts +24 -0
- package/dist/cli/commands/medical.d.ts.map +1 -0
- package/dist/cli/commands/medical.js +132 -0
- package/dist/cli/commands/medical.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +2 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +94 -7
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +29 -3
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/replay.d.ts +17 -0
- package/dist/cli/commands/replay.d.ts.map +1 -0
- package/dist/cli/commands/replay.js +261 -0
- package/dist/cli/commands/replay.js.map +1 -0
- package/dist/cli/commands/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +27 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +17 -3
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/update.d.ts +18 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +81 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.js +15 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +8 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/role-providers.d.ts +1 -1
- package/dist/config/role-providers.d.ts.map +1 -1
- package/dist/config/role-providers.js +6 -1
- package/dist/config/role-providers.js.map +1 -1
- package/dist/config/schema.d.ts +467 -222
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +25 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/contracts/eval-result.d.ts +84 -84
- package/dist/contracts/spec.d.ts +28 -28
- package/dist/contracts/sprint-contract.d.ts +4 -4
- package/dist/fleet/critic-deep.d.ts +53 -0
- package/dist/fleet/critic-deep.d.ts.map +1 -0
- package/dist/fleet/critic-deep.js +199 -0
- package/dist/fleet/critic-deep.js.map +1 -0
- package/dist/fleet/decomposer-deep-constants.d.ts +4 -0
- package/dist/fleet/decomposer-deep-constants.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep-constants.js +14 -0
- package/dist/fleet/decomposer-deep-constants.js.map +1 -0
- package/dist/fleet/decomposer-deep-types.d.ts +8 -0
- package/dist/fleet/decomposer-deep-types.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep-types.js +9 -0
- package/dist/fleet/decomposer-deep-types.js.map +1 -0
- package/dist/fleet/decomposer-deep.d.ts +51 -0
- package/dist/fleet/decomposer-deep.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep.js +261 -0
- package/dist/fleet/decomposer-deep.js.map +1 -0
- package/dist/fleet/decomposer.d.ts +22 -0
- package/dist/fleet/decomposer.d.ts.map +1 -0
- package/dist/fleet/decomposer.js +144 -0
- package/dist/fleet/decomposer.js.map +1 -0
- package/dist/fleet/index.d.ts +93 -0
- package/dist/fleet/index.d.ts.map +1 -1
- package/dist/fleet/index.js +230 -2
- package/dist/fleet/index.js.map +1 -1
- package/dist/fleet/manifest-write.d.ts +30 -0
- package/dist/fleet/manifest-write.d.ts.map +1 -0
- package/dist/fleet/manifest-write.js +90 -0
- package/dist/fleet/manifest-write.js.map +1 -0
- package/dist/fleet/manifest.d.ts +6 -6
- package/dist/fleet/shared-blackboard.d.ts +51 -0
- package/dist/fleet/shared-blackboard.d.ts.map +1 -0
- package/dist/fleet/shared-blackboard.js +79 -0
- package/dist/fleet/shared-blackboard.js.map +1 -0
- package/dist/fleet/synthesis.d.ts +16 -0
- package/dist/fleet/synthesis.d.ts.map +1 -0
- package/dist/fleet/synthesis.js +22 -0
- package/dist/fleet/synthesis.js.map +1 -0
- package/dist/fleet/tier-policy.d.ts +18 -0
- package/dist/fleet/tier-policy.d.ts.map +1 -0
- package/dist/fleet/tier-policy.js +53 -0
- package/dist/fleet/tier-policy.js.map +1 -0
- package/dist/fleet/tool-role-guard.d.ts +24 -0
- package/dist/fleet/tool-role-guard.d.ts.map +1 -0
- package/dist/fleet/tool-role-guard.js +55 -0
- package/dist/fleet/tool-role-guard.js.map +1 -0
- package/dist/incident/resolution-verify.d.ts +4 -4
- package/dist/incident/types.d.ts +8 -8
- package/dist/mcp/run-manager.d.ts +9 -1
- package/dist/mcp/run-manager.d.ts.map +1 -1
- package/dist/mcp/run-manager.js.map +1 -1
- package/dist/medical/adapters/apple-health.d.ts +32 -0
- package/dist/medical/adapters/apple-health.d.ts.map +1 -0
- package/dist/medical/adapters/apple-health.js +100 -0
- package/dist/medical/adapters/apple-health.js.map +1 -0
- package/dist/medical/audit.d.ts +31 -0
- package/dist/medical/audit.d.ts.map +1 -0
- package/dist/medical/audit.js +56 -0
- package/dist/medical/audit.js.map +1 -0
- package/dist/medical/consent.d.ts +37 -0
- package/dist/medical/consent.d.ts.map +1 -0
- package/dist/medical/consent.js +73 -0
- package/dist/medical/consent.js.map +1 -0
- package/dist/medical/disclaimer.d.ts +11 -0
- package/dist/medical/disclaimer.d.ts.map +1 -0
- package/dist/medical/disclaimer.js +21 -0
- package/dist/medical/disclaimer.js.map +1 -0
- package/dist/medical/egress.d.ts +30 -0
- package/dist/medical/egress.d.ts.map +1 -0
- package/dist/medical/egress.js +50 -0
- package/dist/medical/egress.js.map +1 -0
- package/dist/medical/engine.d.ts +73 -0
- package/dist/medical/engine.d.ts.map +1 -0
- package/dist/medical/engine.js +333 -0
- package/dist/medical/engine.js.map +1 -0
- package/dist/medical/guardrails.d.ts +47 -0
- package/dist/medical/guardrails.d.ts.map +1 -0
- package/dist/medical/guardrails.js +92 -0
- package/dist/medical/guardrails.js.map +1 -0
- package/dist/medical/health-store.d.ts +80 -0
- package/dist/medical/health-store.d.ts.map +1 -0
- package/dist/medical/health-store.js +204 -0
- package/dist/medical/health-store.js.map +1 -0
- package/dist/medical/inference.d.ts +22 -0
- package/dist/medical/inference.d.ts.map +1 -0
- package/dist/medical/inference.js +39 -0
- package/dist/medical/inference.js.map +1 -0
- package/dist/medical/ingestion.d.ts +33 -0
- package/dist/medical/ingestion.d.ts.map +1 -0
- package/dist/medical/ingestion.js +52 -0
- package/dist/medical/ingestion.js.map +1 -0
- package/dist/medical/numerics.d.ts +66 -0
- package/dist/medical/numerics.d.ts.map +1 -0
- package/dist/medical/numerics.js +216 -0
- package/dist/medical/numerics.js.map +1 -0
- package/dist/medical/red-flag.d.ts +42 -0
- package/dist/medical/red-flag.d.ts.map +1 -0
- package/dist/medical/red-flag.js +161 -0
- package/dist/medical/red-flag.js.map +1 -0
- package/dist/medical/refusal.d.ts +46 -0
- package/dist/medical/refusal.d.ts.map +1 -0
- package/dist/medical/refusal.js +131 -0
- package/dist/medical/refusal.js.map +1 -0
- package/dist/medical/retrieval/grounding-critic.d.ts +34 -0
- package/dist/medical/retrieval/grounding-critic.d.ts.map +1 -0
- package/dist/medical/retrieval/grounding-critic.js +153 -0
- package/dist/medical/retrieval/grounding-critic.js.map +1 -0
- package/dist/medical/retrieval/literature.d.ts +78 -0
- package/dist/medical/retrieval/literature.d.ts.map +1 -0
- package/dist/medical/retrieval/literature.js +292 -0
- package/dist/medical/retrieval/literature.js.map +1 -0
- package/dist/medical/retrieval/medline-source.d.ts +72 -0
- package/dist/medical/retrieval/medline-source.d.ts.map +1 -0
- package/dist/medical/retrieval/medline-source.js +120 -0
- package/dist/medical/retrieval/medline-source.js.map +1 -0
- package/dist/medical/team.d.ts +15 -0
- package/dist/medical/team.d.ts.map +1 -0
- package/dist/medical/team.js +44 -0
- package/dist/medical/team.js.map +1 -0
- package/dist/medical/types.d.ts +175 -0
- package/dist/medical/types.d.ts.map +1 -0
- package/dist/medical/types.js +8 -0
- package/dist/medical/types.js.map +1 -0
- package/dist/medical/whoop/whoop-client.d.ts +114 -0
- package/dist/medical/whoop/whoop-client.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-client.js +226 -0
- package/dist/medical/whoop/whoop-client.js.map +1 -0
- package/dist/medical/whoop/whoop-sync.d.ts +25 -0
- package/dist/medical/whoop/whoop-sync.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-sync.js +97 -0
- package/dist/medical/whoop/whoop-sync.js.map +1 -0
- package/dist/medical/whoop/whoop-token.d.ts +44 -0
- package/dist/medical/whoop/whoop-token.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-token.js +66 -0
- package/dist/medical/whoop/whoop-token.js.map +1 -0
- package/dist/orchestrator/context-handoff.d.ts +60 -60
- package/dist/orchestrator/contract-materialization.d.ts +33 -0
- package/dist/orchestrator/contract-materialization.d.ts.map +1 -0
- package/dist/orchestrator/contract-materialization.js +113 -0
- package/dist/orchestrator/contract-materialization.js.map +1 -0
- package/dist/orchestrator/memory/distill.d.ts +4 -1
- package/dist/orchestrator/memory/distill.d.ts.map +1 -1
- package/dist/orchestrator/memory/distill.js +41 -1
- package/dist/orchestrator/memory/distill.js.map +1 -1
- package/dist/orchestrator/memory/fact-detector.d.ts +61 -0
- package/dist/orchestrator/memory/fact-detector.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-detector.js +153 -0
- package/dist/orchestrator/memory/fact-detector.js.map +1 -0
- package/dist/orchestrator/memory/fact-judge.d.ts +19 -0
- package/dist/orchestrator/memory/fact-judge.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-judge.js +121 -0
- package/dist/orchestrator/memory/fact-judge.js.map +1 -0
- package/dist/orchestrator/memory/fact-retrieve.d.ts +52 -0
- package/dist/orchestrator/memory/fact-retrieve.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-retrieve.js +117 -0
- package/dist/orchestrator/memory/fact-retrieve.js.map +1 -0
- package/dist/orchestrator/memory/hygiene.d.ts +66 -0
- package/dist/orchestrator/memory/hygiene.d.ts.map +1 -0
- package/dist/orchestrator/memory/hygiene.js +153 -0
- package/dist/orchestrator/memory/hygiene.js.map +1 -0
- package/dist/orchestrator/memory/reconcile.d.ts +47 -0
- package/dist/orchestrator/memory/reconcile.d.ts.map +1 -0
- package/dist/orchestrator/memory/reconcile.js +116 -0
- package/dist/orchestrator/memory/reconcile.js.map +1 -0
- package/dist/orchestrator/memory/retrieve.d.ts +5 -3
- package/dist/orchestrator/memory/retrieve.d.ts.map +1 -1
- package/dist/orchestrator/memory/retrieve.js +9 -6
- package/dist/orchestrator/memory/retrieve.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +19 -3
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +63 -52
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +16 -1
- package/dist/orchestrator/planner-agent.js.map +1 -1
- package/dist/orchestrator/selfimprove/eval-guards.d.ts +51 -0
- package/dist/orchestrator/selfimprove/eval-guards.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/eval-guards.js +120 -0
- package/dist/orchestrator/selfimprove/eval-guards.js.map +1 -0
- package/dist/orchestrator/selfimprove/gepa.d.ts +74 -0
- package/dist/orchestrator/selfimprove/gepa.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/gepa.js +227 -0
- package/dist/orchestrator/selfimprove/gepa.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-harness.d.ts +65 -0
- package/dist/orchestrator/selfimprove/replay-harness.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-harness.js +134 -0
- package/dist/orchestrator/selfimprove/replay-harness.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-store.d.ts +45 -0
- package/dist/orchestrator/selfimprove/replay-store.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-store.js +119 -0
- package/dist/orchestrator/selfimprove/replay-store.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-types.d.ts +32 -0
- package/dist/orchestrator/selfimprove/replay-types.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-types.js +15 -0
- package/dist/orchestrator/selfimprove/replay-types.js.map +1 -0
- package/dist/orchestrator/workflow/engine.d.ts +3 -1
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.d.ts +18 -0
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.js +41 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -1
- package/dist/orchestrator/workflow/ts-engine.d.ts +3 -1
- package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/ts-engine.js +2 -2
- package/dist/orchestrator/workflow/ts-engine.js.map +1 -1
- package/dist/orchestrator/workflow/workflow-engine.d.ts +3 -1
- package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/workflow-engine.js +3 -3
- package/dist/orchestrator/workflow/workflow-engine.js.map +1 -1
- package/dist/state/facts.d.ts +110 -0
- package/dist/state/facts.d.ts.map +1 -0
- package/dist/state/facts.js +208 -0
- package/dist/state/facts.js.map +1 -0
- package/dist/state/guidance.d.ts +37 -0
- package/dist/state/guidance.d.ts.map +1 -0
- package/dist/state/guidance.js +144 -0
- package/dist/state/guidance.js.map +1 -0
- package/dist/state/history.d.ts +2 -2
- package/dist/state/index.d.ts +1 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +1 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/memory.d.ts +43 -11
- package/dist/state/memory.d.ts.map +1 -1
- package/dist/state/memory.js +93 -15
- package/dist/state/memory.js.map +1 -1
- package/dist/state/pause.d.ts +47 -0
- package/dist/state/pause.d.ts.map +1 -0
- package/dist/state/pause.js +146 -0
- package/dist/state/pause.js.map +1 -0
- package/dist/state/sprint-state.d.ts +8 -0
- package/dist/state/sprint-state.d.ts.map +1 -1
- package/dist/state/sprint-state.js +32 -1
- package/dist/state/sprint-state.js.map +1 -1
- package/dist/teams/registry.d.ts +16 -0
- package/dist/teams/registry.d.ts.map +1 -0
- package/dist/teams/registry.js +53 -0
- package/dist/teams/registry.js.map +1 -0
- package/dist/teams/types.d.ts +25 -0
- package/dist/teams/types.d.ts.map +1 -0
- package/dist/teams/types.js +2 -0
- package/dist/teams/types.js.map +1 -0
- package/package.json +3 -1
package/dist/fleet/index.js
CHANGED
|
@@ -7,13 +7,17 @@
|
|
|
7
7
|
// registerFleetCommand: wires `agent-bober fleet <manifest>` into the
|
|
8
8
|
// commander program (mirrors registerWorktreeCommand pattern).
|
|
9
9
|
import chalk from "chalk";
|
|
10
|
+
import { join } from "node:path";
|
|
10
11
|
import { load } from "./manifest.js";
|
|
11
12
|
import { buildChildConfig } from "./child-config.js";
|
|
12
13
|
import { FleetCoordinator } from "./coordinator.js";
|
|
13
14
|
import { OutcomeAggregator } from "./aggregator.js";
|
|
14
15
|
import { PortfolioReporter } from "./reporter.js";
|
|
15
|
-
import { validateApiKey } from "../providers/factory.js";
|
|
16
|
+
import { validateApiKey, createClient } from "../providers/factory.js";
|
|
16
17
|
import { logger } from "../utils/logger.js";
|
|
18
|
+
import { decomposeGoal } from "./decomposer.js";
|
|
19
|
+
import { decomposeGoalDeep } from "./decomposer-deep.js";
|
|
20
|
+
import { writeManifestWithProvenance } from "./manifest-write.js";
|
|
17
21
|
// ── Credential fail-fast ──────────────────────────────────────────────
|
|
18
22
|
/**
|
|
19
23
|
* Validate DeepSeek credentials for every child BEFORE spawning anything.
|
|
@@ -73,6 +77,228 @@ export async function runFleet(manifestPath, options, deps) {
|
|
|
73
77
|
await reporter.write(effectiveManifest.rootDir, report);
|
|
74
78
|
return report;
|
|
75
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Core logic for `fleet expand <goal>`:
|
|
82
|
+
*
|
|
83
|
+
* 1. Build the DeepSeek LLMClient (credential fail-fast BEFORE any IO).
|
|
84
|
+
* 2. Call decomposeGoal to get a children-only FleetManifest.
|
|
85
|
+
* 3. Assemble { rootDir, concurrency, children }.
|
|
86
|
+
* 4. Atomically write the manifest to outPath (overwrite with notice).
|
|
87
|
+
* 5. Print the manifest + a review hint.
|
|
88
|
+
* 6. If --yes, chain into runFleet(outPath) and print Fleet Summary.
|
|
89
|
+
* Otherwise stop (exit 0).
|
|
90
|
+
*
|
|
91
|
+
* @param goal - The high-level goal to decompose into children.
|
|
92
|
+
* @param opts - Parsed Commander options.
|
|
93
|
+
* @param deps - Optional DI seams for testing (decompose, runFleet, createClient).
|
|
94
|
+
*/
|
|
95
|
+
export async function runFleetExpand(goal, opts, deps) {
|
|
96
|
+
// ── Step 1: build the decomposer LLM client (credential fail-fast) ──
|
|
97
|
+
// This MUST run before any filesystem write. createClient/validateApiKey
|
|
98
|
+
// throws synchronously when DEEPSEEK_API_KEY is missing for api.deepseek.com.
|
|
99
|
+
const model = opts.model ?? "deepseek-v4-pro";
|
|
100
|
+
const clientBuilder = deps?.createClient ?? createClient;
|
|
101
|
+
const client = clientBuilder(opts.provider ?? "openai-compat", "https://api.deepseek.com", undefined, model, "FleetDecomposer");
|
|
102
|
+
// ── Step 2: decompose the goal ────────────────────────────────────
|
|
103
|
+
// Fold --count hint into the goal as a soft target for the decomposer.
|
|
104
|
+
const goalWithHint = opts.count !== undefined
|
|
105
|
+
? `${goal}\n\n(Decompose into approximately ${opts.count} independent sub-projects.)`
|
|
106
|
+
: goal;
|
|
107
|
+
const decomposeFn = deps?.decompose ?? decomposeGoal;
|
|
108
|
+
const decomposed = await decomposeFn({ goal: goalWithHint, client, model, maxRetries: 1 });
|
|
109
|
+
// ── Step 3: assemble the manifest ────────────────────────────────
|
|
110
|
+
const root = opts.root ?? ".";
|
|
111
|
+
const concurrency = opts.concurrency ? Number(opts.concurrency) : 3;
|
|
112
|
+
const manifest = {
|
|
113
|
+
rootDir: root,
|
|
114
|
+
concurrency,
|
|
115
|
+
children: decomposed.children,
|
|
116
|
+
};
|
|
117
|
+
// ── Step 4: atomic write with provenance + recoverable overwrite ──
|
|
118
|
+
const outPath = opts.out ?? join(root, ".bober", "fleet-expand.json");
|
|
119
|
+
await writeManifestWithProvenance({
|
|
120
|
+
outPath,
|
|
121
|
+
manifest,
|
|
122
|
+
provenance: {
|
|
123
|
+
command: "fleet expand",
|
|
124
|
+
goal,
|
|
125
|
+
critique: false,
|
|
126
|
+
childCount: manifest.children.length,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
// ── Step 5: print the manifest + review hint ──────────────────────
|
|
130
|
+
console.log();
|
|
131
|
+
console.log(chalk.bold("═══ Fleet Expand Manifest ═══"));
|
|
132
|
+
console.log();
|
|
133
|
+
console.log(JSON.stringify(manifest, null, 2));
|
|
134
|
+
console.log();
|
|
135
|
+
console.log(`Manifest written to: ${outPath}`);
|
|
136
|
+
console.log(`Review then run: agent-bober fleet "${outPath}"`);
|
|
137
|
+
console.log();
|
|
138
|
+
// ── Step 6: --yes gate ────────────────────────────────────────────
|
|
139
|
+
// runFleet is ONLY reachable when opts.yes is true. Default exits 0.
|
|
140
|
+
if (opts.yes) {
|
|
141
|
+
const runFleetFn = deps?.runFleet ?? runFleet;
|
|
142
|
+
const report = await runFleetFn(outPath);
|
|
143
|
+
console.log();
|
|
144
|
+
console.log(chalk.bold("═══ Fleet Summary ═══"));
|
|
145
|
+
console.log();
|
|
146
|
+
console.log(` Total: ${chalk.cyan(String(report.total))} children`);
|
|
147
|
+
console.log(` Completed: ${chalk.green(String(report.completed))}`);
|
|
148
|
+
if (report.failed > 0) {
|
|
149
|
+
console.log(` Failed: ${chalk.red(String(report.failed))}`);
|
|
150
|
+
}
|
|
151
|
+
if (report.other > 0) {
|
|
152
|
+
console.log(` Other: ${chalk.yellow(String(report.other))}`);
|
|
153
|
+
}
|
|
154
|
+
console.log();
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
process.exitCode = 0;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Core logic for `fleet expand-deep <goal>`:
|
|
162
|
+
*
|
|
163
|
+
* 1. Build the DeepSeek LLMClient (credential fail-fast BEFORE any IO).
|
|
164
|
+
* 2. Call decomposeGoalDeep to get a children-only FleetManifest (two-stage plan→expand).
|
|
165
|
+
* 3. Assemble { rootDir, concurrency, children }.
|
|
166
|
+
* 4. Atomically write the manifest to outPath (overwrite with notice).
|
|
167
|
+
* 5. Print the manifest + a review hint.
|
|
168
|
+
* 6. If --yes, chain into runFleet(outPath) and print Fleet Summary.
|
|
169
|
+
* Otherwise stop (exit 0).
|
|
170
|
+
*
|
|
171
|
+
* @param goal - The high-level goal to decompose into children.
|
|
172
|
+
* @param opts - Parsed Commander options.
|
|
173
|
+
* @param deps - Optional DI seams for testing (decomposeDeep, runFleet, createClient).
|
|
174
|
+
*/
|
|
175
|
+
export async function runFleetExpandDeep(goal, opts, deps) {
|
|
176
|
+
// ── Step 1: build the decomposer LLM client (credential fail-fast) ──
|
|
177
|
+
// This MUST run before any filesystem write. createClient/validateApiKey
|
|
178
|
+
// throws synchronously when DEEPSEEK_API_KEY is missing for api.deepseek.com.
|
|
179
|
+
const model = opts.model ?? "deepseek-v4-pro";
|
|
180
|
+
const clientBuilder = deps?.createClient ?? createClient;
|
|
181
|
+
const client = clientBuilder(opts.provider ?? "openai-compat", "https://api.deepseek.com", undefined, model, "FleetDecomposer");
|
|
182
|
+
// ── Step 2: decompose the goal ────────────────────────────────────
|
|
183
|
+
// Fold --count hint into the goal as a soft target for the decomposer.
|
|
184
|
+
const goalWithHint = opts.count !== undefined
|
|
185
|
+
? `${goal}\n\n(Decompose into approximately ${opts.count} independent sub-projects.)`
|
|
186
|
+
: goal;
|
|
187
|
+
const decomposeDeepFn = deps?.decomposeDeep ?? decomposeGoalDeep;
|
|
188
|
+
const decomposed = await decomposeDeepFn({
|
|
189
|
+
goal: goalWithHint,
|
|
190
|
+
client,
|
|
191
|
+
model,
|
|
192
|
+
...(opts.critique ? { critique: true } : {}),
|
|
193
|
+
});
|
|
194
|
+
// ── Step 3: assemble the manifest ────────────────────────────────
|
|
195
|
+
const root = opts.root ?? ".";
|
|
196
|
+
const concurrency = opts.concurrency ? Number(opts.concurrency) : 3;
|
|
197
|
+
const manifest = {
|
|
198
|
+
rootDir: root,
|
|
199
|
+
concurrency,
|
|
200
|
+
children: decomposed.children,
|
|
201
|
+
};
|
|
202
|
+
// ── Step 4: atomic write with provenance + recoverable overwrite ──
|
|
203
|
+
const outPath = opts.out ?? join(root, ".bober", "fleet-expand.json");
|
|
204
|
+
await writeManifestWithProvenance({
|
|
205
|
+
outPath,
|
|
206
|
+
manifest,
|
|
207
|
+
provenance: {
|
|
208
|
+
command: "fleet expand-deep",
|
|
209
|
+
goal,
|
|
210
|
+
critique: opts.critique === true,
|
|
211
|
+
childCount: manifest.children.length,
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
// ── Step 5: print the manifest + review hint ──────────────────────
|
|
215
|
+
console.log();
|
|
216
|
+
console.log(chalk.bold("═══ Fleet Expand-Deep Manifest ═══"));
|
|
217
|
+
console.log();
|
|
218
|
+
console.log(JSON.stringify(manifest, null, 2));
|
|
219
|
+
console.log();
|
|
220
|
+
console.log(`Manifest written to: ${outPath}`);
|
|
221
|
+
console.log(`Review then run: agent-bober fleet "${outPath}"`);
|
|
222
|
+
console.log();
|
|
223
|
+
// ── Step 6: --yes gate ────────────────────────────────────────────
|
|
224
|
+
// runFleet is ONLY reachable when opts.yes is true. Default exits 0.
|
|
225
|
+
if (opts.yes) {
|
|
226
|
+
const runFleetFn = deps?.runFleet ?? runFleet;
|
|
227
|
+
const report = await runFleetFn(outPath);
|
|
228
|
+
console.log();
|
|
229
|
+
console.log(chalk.bold("═══ Fleet Summary ═══"));
|
|
230
|
+
console.log();
|
|
231
|
+
console.log(` Total: ${chalk.cyan(String(report.total))} children`);
|
|
232
|
+
console.log(` Completed: ${chalk.green(String(report.completed))}`);
|
|
233
|
+
if (report.failed > 0) {
|
|
234
|
+
console.log(` Failed: ${chalk.red(String(report.failed))}`);
|
|
235
|
+
}
|
|
236
|
+
if (report.other > 0) {
|
|
237
|
+
console.log(` Other: ${chalk.yellow(String(report.other))}`);
|
|
238
|
+
}
|
|
239
|
+
console.log();
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
process.exitCode = 0;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// ── registerFleetExpandDeepSubcommand ─────────────────────────────────
|
|
246
|
+
/**
|
|
247
|
+
* Attach `expand-deep <goal>` as a child subcommand of the existing `fleet` command.
|
|
248
|
+
* Options: --count, --provider, --model, --root, --concurrency, --out, --yes.
|
|
249
|
+
*
|
|
250
|
+
* The action body is a thin wrapper around runFleetExpandDeep for testability.
|
|
251
|
+
*/
|
|
252
|
+
export function registerFleetExpandDeepSubcommand(fleet) {
|
|
253
|
+
fleet
|
|
254
|
+
.command("expand-deep <goal>")
|
|
255
|
+
.description("Robustly decompose a large/ambiguous goal (two-stage plan-then-expand) into a fleet manifest and optionally run it")
|
|
256
|
+
.option("--count <n>", "Soft target for number of sub-projects")
|
|
257
|
+
.option("--provider <p>", "Override the decomposer LLM provider (default: openai-compat)")
|
|
258
|
+
.option("--model <m>", "Override the decomposer LLM model (default: deepseek-v4-pro)")
|
|
259
|
+
.option("--root <dir>", "Override the manifest rootDir (default: .)")
|
|
260
|
+
.option("--concurrency <c>", "Override manifest concurrency (default: 3)")
|
|
261
|
+
.option("--out <path>", "Override the output path for the written manifest")
|
|
262
|
+
.option("--yes", "Chain into fleet run after writing the manifest")
|
|
263
|
+
.option("--critique", "Run a fresh-context critic gate that re-expands degenerate manifests")
|
|
264
|
+
.action(async (goal, opts) => {
|
|
265
|
+
try {
|
|
266
|
+
await runFleetExpandDeep(goal, opts);
|
|
267
|
+
}
|
|
268
|
+
catch (err) {
|
|
269
|
+
logger.error(`Fleet expand-deep failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
270
|
+
process.exitCode = 1;
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
// ── registerFleetExpandSubcommand ─────────────────────────────────────
|
|
275
|
+
/**
|
|
276
|
+
* Attach `expand <goal>` as a child subcommand of the existing `fleet` command.
|
|
277
|
+
* Options: --count, --provider, --model, --root, --concurrency, --out, --yes.
|
|
278
|
+
*
|
|
279
|
+
* The action body is a thin wrapper around runFleetExpand for testability.
|
|
280
|
+
*/
|
|
281
|
+
export function registerFleetExpandSubcommand(fleet) {
|
|
282
|
+
fleet
|
|
283
|
+
.command("expand <goal>")
|
|
284
|
+
.description("Decompose a goal into a fleet manifest and optionally run it")
|
|
285
|
+
.option("--count <n>", "Soft target for number of sub-projects")
|
|
286
|
+
.option("--provider <p>", "Override the decomposer LLM provider (default: openai-compat)")
|
|
287
|
+
.option("--model <m>", "Override the decomposer LLM model (default: deepseek-v4-pro)")
|
|
288
|
+
.option("--root <dir>", "Override the manifest rootDir (default: .)")
|
|
289
|
+
.option("--concurrency <c>", "Override manifest concurrency (default: 3)")
|
|
290
|
+
.option("--out <path>", "Override the output path for the written manifest")
|
|
291
|
+
.option("--yes", "Chain into fleet run after writing the manifest")
|
|
292
|
+
.action(async (goal, opts) => {
|
|
293
|
+
try {
|
|
294
|
+
await runFleetExpand(goal, opts);
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
logger.error(`Fleet expand failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
298
|
+
process.exitCode = 1;
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
}
|
|
76
302
|
// ── registerFleetCommand ──────────────────────────────────────────────
|
|
77
303
|
/**
|
|
78
304
|
* Register `agent-bober fleet <manifest>` with the commander program.
|
|
@@ -83,7 +309,7 @@ export async function runFleet(manifestPath, options, deps) {
|
|
|
83
309
|
* report IO failure)
|
|
84
310
|
*/
|
|
85
311
|
export function registerFleetCommand(program) {
|
|
86
|
-
program
|
|
312
|
+
const fleet = program
|
|
87
313
|
.command("fleet <manifest>")
|
|
88
314
|
.description("Run a fleet of agent-bober children from a manifest")
|
|
89
315
|
.option("--concurrency <n>", "Override manifest concurrency")
|
|
@@ -113,5 +339,7 @@ export function registerFleetCommand(program) {
|
|
|
113
339
|
process.exitCode = 1;
|
|
114
340
|
}
|
|
115
341
|
});
|
|
342
|
+
registerFleetExpandSubcommand(fleet);
|
|
343
|
+
registerFleetExpandDeepSubcommand(fleet);
|
|
116
344
|
}
|
|
117
345
|
//# sourceMappingURL=index.js.map
|
package/dist/fleet/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fleet/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fleet/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,oEAAoE;AACpE,mEAAmE;AACnE,uEAAuE;AACvE,EAAE;AACF,sEAAsE;AACtE,yEAAyE;AAEzE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAgBlE,yEAAyE;AAEzE;;;;GAIG;AACH,SAAS,2BAA2B,CAAC,QAAuB;IAC1D,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAEpC,MAAM,QAAQ,GAAG;YACf,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;YACzC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE;YAC7C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE;SACrC,CAAC;QAEX,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,CAAC,GAAG,OAIT,CAAC;YACF,MAAM,MAAM,GACV,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ;gBAC9C,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;gBAC5B,CAAC,CAAC,SAAS,CAAC;YAChB,cAAc,CAAC,CAAC,CAAC,QAAQ,IAAI,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;AACH,CAAC;AAWD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,YAAoB,EACpB,OAAsB,EACtB,IAAgB;IAEhB,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC;IAE1C,gFAAgF;IAChF,MAAM,iBAAiB,GAAG;QACxB,GAAG,QAAQ;QACX,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC;IAEF,2CAA2C;IAC3C,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;IAE/C,yBAAyB;IACzB,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,IAAI,iBAAiB,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,IAAI,iBAAiB,EAAE,CAAC;IAE3D,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAmB,MAAM,OAAO,CAAC,GAAG,CAChD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAC/C,CAAC;IAEF,0BAA0B;IAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAExD,OAAO,MAAM,CAAC;AAChB,CAAC;AA2BD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,IAAwB,EACxB,IAAsB;IAEtB,uEAAuE;IACvE,yEAAyE;IACzE,8EAA8E;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,EAAE,YAAY,IAAI,YAAY,CAAC;IACzD,MAAM,MAAM,GAAc,aAAa,CACrC,IAAI,CAAC,QAAQ,IAAI,eAAe,EAChC,0BAA0B,EAC1B,SAAS,EACT,KAAK,EACL,iBAAiB,CAClB,CAAC;IAEF,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,YAAY,GAChB,IAAI,CAAC,KAAK,KAAK,SAAS;QACtB,CAAC,CAAC,GAAG,IAAI,qCAAqC,IAAI,CAAC,KAAK,6BAA6B;QACrF,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,WAAW,GAAG,IAAI,EAAE,SAAS,IAAI,aAAa,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAE3F,oEAAoE;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;IAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAkB;QAC9B,OAAO,EAAE,IAAI;QACb,WAAW;QACX,QAAQ,EAAE,UAAU,CAAC,QAAQ;KAC9B,CAAC;IAEF,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACtE,MAAM,2BAA2B,CAAC;QAChC,OAAO;QACP,QAAQ;QACR,UAAU,EAAE;YACV,OAAO,EAAE,cAAc;YACvB,IAAI;YACJ,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;SACrC;KACF,CAAC,CAAC;IAEH,qEAAqE;IACrE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,GAAG,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,qEAAqE;IACrE,qEAAqE;IACrE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,IAAI,EAAE,QAAQ,IAAI,QAAQ,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AA6BD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,IAA4B,EAC5B,IAA0B;IAE1B,uEAAuE;IACvE,yEAAyE;IACzE,8EAA8E;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,EAAE,YAAY,IAAI,YAAY,CAAC;IACzD,MAAM,MAAM,GAAc,aAAa,CACrC,IAAI,CAAC,QAAQ,IAAI,eAAe,EAChC,0BAA0B,EAC1B,SAAS,EACT,KAAK,EACL,iBAAiB,CAClB,CAAC;IAEF,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,YAAY,GAChB,IAAI,CAAC,KAAK,KAAK,SAAS;QACtB,CAAC,CAAC,GAAG,IAAI,qCAAqC,IAAI,CAAC,KAAK,6BAA6B;QACrF,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,eAAe,GAAG,IAAI,EAAE,aAAa,IAAI,iBAAiB,CAAC;IACjE,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC;QACvC,IAAI,EAAE,YAAY;QAClB,MAAM;QACN,KAAK;QACL,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC,CAAC;IAEH,oEAAoE;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;IAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAkB;QAC9B,OAAO,EAAE,IAAI;QACb,WAAW;QACX,QAAQ,EAAE,UAAU,CAAC,QAAQ;KAC9B,CAAC;IAEF,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACtE,MAAM,2BAA2B,CAAC;QAChC,OAAO;QACP,QAAQ;QACR,UAAU,EAAE;YACV,OAAO,EAAE,mBAAmB;YAC5B,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;YAChC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;SACrC;KACF,CAAC,CAAC;IAEH,qEAAqE;IACrE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,GAAG,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,qEAAqE;IACrE,qEAAqE;IACrE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,IAAI,EAAE,QAAQ,IAAI,QAAQ,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,yEAAyE;AAEzE;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,KAAc;IAC9D,KAAK;SACF,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CACV,oHAAoH,CACrH;SACA,MAAM,CAAC,aAAa,EAAE,wCAAwC,CAAC;SAC/D,MAAM,CAAC,gBAAgB,EAAE,+DAA+D,CAAC;SACzF,MAAM,CAAC,aAAa,EAAE,8DAA8D,CAAC;SACrF,MAAM,CAAC,cAAc,EAAE,4CAA4C,CAAC;SACpE,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;SACzE,MAAM,CAAC,cAAc,EAAE,mDAAmD,CAAC;SAC3E,MAAM,CAAC,OAAO,EAAE,iDAAiD,CAAC;SAClE,MAAM,CAAC,YAAY,EAAE,sEAAsE,CAAC;SAC5F,MAAM,CACL,KAAK,EACH,IAAY,EACZ,IASC,EACD,EAAE;QACF,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CACV,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAChF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC;AAED,yEAAyE;AAEzE;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,KAAc;IAC1D,KAAK;SACF,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,8DAA8D,CAAC;SAC3E,MAAM,CAAC,aAAa,EAAE,wCAAwC,CAAC;SAC/D,MAAM,CAAC,gBAAgB,EAAE,+DAA+D,CAAC;SACzF,MAAM,CAAC,aAAa,EAAE,8DAA8D,CAAC;SACrF,MAAM,CAAC,cAAc,EAAE,4CAA4C,CAAC;SACpE,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;SACzE,MAAM,CAAC,cAAc,EAAE,mDAAmD,CAAC;SAC3E,MAAM,CAAC,OAAO,EAAE,iDAAiD,CAAC;SAClE,MAAM,CACL,KAAK,EACH,IAAY,EACZ,IAQC,EACD,EAAE;QACF,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CACV,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC3E,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC;AAED,yEAAyE;AAEzE;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;SAC5D,MAAM,CAAC,cAAc,EAAE,2BAA2B,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,IAA6C,EAAE,EAAE;QAChF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE;gBACtC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpE,OAAO,EAAE,IAAI,CAAC,IAAI;aACnB,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;YACtE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,6BAA6B,CAAC,KAAK,CAAC,CAAC;IACrC,iCAAiC,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FleetManifest } from "./manifest.js";
|
|
2
|
+
export interface ManifestProvenance {
|
|
3
|
+
command: string;
|
|
4
|
+
goal: string;
|
|
5
|
+
critique: boolean;
|
|
6
|
+
childCount: number;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
}
|
|
9
|
+
export interface WriteManifestArgs {
|
|
10
|
+
outPath: string;
|
|
11
|
+
manifest: FleetManifest;
|
|
12
|
+
provenance: Omit<ManifestProvenance, "timestamp">;
|
|
13
|
+
log?: (msg: string) => void;
|
|
14
|
+
now?: () => number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Atomically write a fleet manifest to outPath, emit a provenance sidecar,
|
|
18
|
+
* and (on overwrite) preserve the prior manifest as <outPath>.bak and log
|
|
19
|
+
* an informative notice.
|
|
20
|
+
*
|
|
21
|
+
* Steps:
|
|
22
|
+
* 1. ensureDir(dirname(outPath))
|
|
23
|
+
* 2. Check if outPath already exists
|
|
24
|
+
* 3. If exists: tolerantly read+parse <outPath>.meta.json (missing/corrupt → null),
|
|
25
|
+
* rename outPath to <outPath>.bak, log notice
|
|
26
|
+
* 4. Atomically write new manifest via tmp+rename
|
|
27
|
+
* 5. Write provenance sidecar to <outPath>.meta.json
|
|
28
|
+
*/
|
|
29
|
+
export declare function writeManifestWithProvenance(args: WriteManifestArgs): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=manifest-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-write.d.ts","sourceRoot":"","sources":["../../src/fleet/manifest-write.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAClD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAyBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DxF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// ── fleet/manifest-write.ts ───────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// writeManifestWithProvenance: shared helper for fleet expand and
|
|
4
|
+
// fleet expand-deep Step-4 writes. Emits a provenance sidecar,
|
|
5
|
+
// preserves the prior manifest as .bak on overwrite, and prints an
|
|
6
|
+
// informative non-blocking notice.
|
|
7
|
+
import { writeFile, rename, access, readFile } from "node:fs/promises";
|
|
8
|
+
import { randomBytes } from "node:crypto";
|
|
9
|
+
import { dirname, basename } from "node:path";
|
|
10
|
+
import { ensureDir } from "../state/helpers.js";
|
|
11
|
+
// ── Relative-age formatter ────────────────────────────────────────────
|
|
12
|
+
// bober: simple string bucketing; upgrade to a full humanize lib if sub-minute
|
|
13
|
+
// precision is needed for UI display.
|
|
14
|
+
function formatRelativeAge(deltaMs) {
|
|
15
|
+
const totalSeconds = Math.floor(deltaMs / 1000);
|
|
16
|
+
if (totalSeconds < 60) {
|
|
17
|
+
return "just now";
|
|
18
|
+
}
|
|
19
|
+
const totalMinutes = Math.floor(totalSeconds / 60);
|
|
20
|
+
if (totalMinutes < 60) {
|
|
21
|
+
return `${totalMinutes}m ago`;
|
|
22
|
+
}
|
|
23
|
+
const totalHours = Math.floor(totalMinutes / 60);
|
|
24
|
+
if (totalHours < 24) {
|
|
25
|
+
return `${totalHours}h ago`;
|
|
26
|
+
}
|
|
27
|
+
const totalDays = Math.floor(totalHours / 24);
|
|
28
|
+
return `${totalDays}d ago`;
|
|
29
|
+
}
|
|
30
|
+
// ── Helper ────────────────────────────────────────────────────────────
|
|
31
|
+
/**
|
|
32
|
+
* Atomically write a fleet manifest to outPath, emit a provenance sidecar,
|
|
33
|
+
* and (on overwrite) preserve the prior manifest as <outPath>.bak and log
|
|
34
|
+
* an informative notice.
|
|
35
|
+
*
|
|
36
|
+
* Steps:
|
|
37
|
+
* 1. ensureDir(dirname(outPath))
|
|
38
|
+
* 2. Check if outPath already exists
|
|
39
|
+
* 3. If exists: tolerantly read+parse <outPath>.meta.json (missing/corrupt → null),
|
|
40
|
+
* rename outPath to <outPath>.bak, log notice
|
|
41
|
+
* 4. Atomically write new manifest via tmp+rename
|
|
42
|
+
* 5. Write provenance sidecar to <outPath>.meta.json
|
|
43
|
+
*/
|
|
44
|
+
export async function writeManifestWithProvenance(args) {
|
|
45
|
+
const { outPath, manifest, provenance } = args;
|
|
46
|
+
const log = args.log ?? console.log;
|
|
47
|
+
const now = args.now ?? Date.now;
|
|
48
|
+
const sidecarPath = `${outPath}.meta.json`;
|
|
49
|
+
const bakPath = `${outPath}.bak`;
|
|
50
|
+
const { command } = provenance;
|
|
51
|
+
// Step 1: ensure output directory exists
|
|
52
|
+
await ensureDir(dirname(outPath));
|
|
53
|
+
// Step 2: check if the manifest already exists
|
|
54
|
+
const alreadyExisted = await access(outPath).then(() => true, () => false);
|
|
55
|
+
// Step 3: if it exists, back it up and log a notice
|
|
56
|
+
if (alreadyExisted) {
|
|
57
|
+
// Tolerantly read prior sidecar — missing or corrupt must never abort the write
|
|
58
|
+
let prior;
|
|
59
|
+
try {
|
|
60
|
+
const raw = await readFile(sidecarPath, "utf-8");
|
|
61
|
+
prior = JSON.parse(raw);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
prior = null;
|
|
65
|
+
}
|
|
66
|
+
// Move prior manifest to .bak BEFORE writing the new one
|
|
67
|
+
await rename(outPath, bakPath);
|
|
68
|
+
// Log informative notice
|
|
69
|
+
if (prior !== null) {
|
|
70
|
+
const ageMs = now() - Date.parse(prior.timestamp);
|
|
71
|
+
const relAge = formatRelativeAge(ageMs);
|
|
72
|
+
log(`[${command}] Replacing manifest from \`${prior.command}\` for goal "${prior.goal}" (${prior.childCount} children, ${relAge}) → kept as ${basename(outPath)}.bak`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
log(`[${command}] Overwriting existing manifest at ${outPath} → kept as ${basename(outPath)}.bak`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Step 4: atomically write the new manifest via tmp+rename
|
|
79
|
+
const rnd = randomBytes(4).toString("hex");
|
|
80
|
+
const tmp = `${outPath}.${process.pid}.${Date.now()}.${rnd}.tmp`;
|
|
81
|
+
await writeFile(tmp, JSON.stringify(manifest, null, 2), { encoding: "utf-8" });
|
|
82
|
+
await rename(tmp, outPath);
|
|
83
|
+
// Step 5: write provenance sidecar
|
|
84
|
+
const sidecar = {
|
|
85
|
+
...provenance,
|
|
86
|
+
timestamp: new Date(now()).toISOString(),
|
|
87
|
+
};
|
|
88
|
+
await writeFile(sidecarPath, JSON.stringify(sidecar, null, 2), { encoding: "utf-8" });
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=manifest-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-write.js","sourceRoot":"","sources":["../../src/fleet/manifest-write.ts"],"names":[],"mappings":"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"}
|
package/dist/fleet/manifest.d.ts
CHANGED
|
@@ -4,12 +4,12 @@ export declare const FleetChildSchema: z.ZodObject<{
|
|
|
4
4
|
task: z.ZodString;
|
|
5
5
|
config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
6
6
|
}, "strip", z.ZodTypeAny, {
|
|
7
|
-
folder: string;
|
|
8
7
|
task: string;
|
|
8
|
+
folder: string;
|
|
9
9
|
config?: Record<string, unknown> | undefined;
|
|
10
10
|
}, {
|
|
11
|
-
folder: string;
|
|
12
11
|
task: string;
|
|
12
|
+
folder: string;
|
|
13
13
|
config?: Record<string, unknown> | undefined;
|
|
14
14
|
}>;
|
|
15
15
|
export type FleetChild = z.infer<typeof FleetChildSchema>;
|
|
@@ -21,26 +21,26 @@ export declare const FleetManifestSchema: z.ZodObject<{
|
|
|
21
21
|
task: z.ZodString;
|
|
22
22
|
config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
23
23
|
}, "strip", z.ZodTypeAny, {
|
|
24
|
-
folder: string;
|
|
25
24
|
task: string;
|
|
25
|
+
folder: string;
|
|
26
26
|
config?: Record<string, unknown> | undefined;
|
|
27
27
|
}, {
|
|
28
|
-
folder: string;
|
|
29
28
|
task: string;
|
|
29
|
+
folder: string;
|
|
30
30
|
config?: Record<string, unknown> | undefined;
|
|
31
31
|
}>, "many">;
|
|
32
32
|
}, "strip", z.ZodTypeAny, {
|
|
33
33
|
rootDir: string;
|
|
34
34
|
concurrency: number;
|
|
35
35
|
children: {
|
|
36
|
-
folder: string;
|
|
37
36
|
task: string;
|
|
37
|
+
folder: string;
|
|
38
38
|
config?: Record<string, unknown> | undefined;
|
|
39
39
|
}[];
|
|
40
40
|
}, {
|
|
41
41
|
children: {
|
|
42
|
-
folder: string;
|
|
43
42
|
task: string;
|
|
43
|
+
folder: string;
|
|
44
44
|
config?: Record<string, unknown> | undefined;
|
|
45
45
|
}[];
|
|
46
46
|
rootDir?: string | undefined;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { FactRecord } from "../state/facts.js";
|
|
2
|
+
export declare const BLACKBOARD_MAX_ROUNDS = 3;
|
|
3
|
+
export interface BlackboardFinding {
|
|
4
|
+
childFolder: string;
|
|
5
|
+
round: number;
|
|
6
|
+
payload: string;
|
|
7
|
+
confidence?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface SharedBlackboardOpts {
|
|
10
|
+
dbPath: string;
|
|
11
|
+
namespace: string;
|
|
12
|
+
busyTimeoutMs?: number;
|
|
13
|
+
maxRounds?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Bounded inter-agent exchange wrapper over one shared facts.db.
|
|
17
|
+
* Opens the db in WAL mode with a busy_timeout so concurrent fleet
|
|
18
|
+
* children can publish findings without SQLITE_BUSY deadlocks.
|
|
19
|
+
*
|
|
20
|
+
* bober: single-file SQLite WAL (better-sqlite3 synchronous writes);
|
|
21
|
+
* swap for a network WAL (e.g. Turso/libSQL) if fleet grows beyond
|
|
22
|
+
* one host or requires cross-machine exchange.
|
|
23
|
+
*/
|
|
24
|
+
export declare class SharedBlackboard {
|
|
25
|
+
private store;
|
|
26
|
+
private namespace;
|
|
27
|
+
private maxRounds;
|
|
28
|
+
private constructor();
|
|
29
|
+
/**
|
|
30
|
+
* Open (or create) a shared WAL facts.db at dbPath.
|
|
31
|
+
* Ensures the parent directory exists before opening.
|
|
32
|
+
* Returns a ready-to-use SharedBlackboard instance.
|
|
33
|
+
*/
|
|
34
|
+
static open(opts: SharedBlackboardOpts): Promise<SharedBlackboard>;
|
|
35
|
+
/**
|
|
36
|
+
* Publish a finding from one fleet child.
|
|
37
|
+
* Throws when finding.round exceeds the effective maxRounds cap.
|
|
38
|
+
* Returns the persisted FactRecord.
|
|
39
|
+
*/
|
|
40
|
+
publish(finding: BlackboardFinding, now: string): FactRecord;
|
|
41
|
+
/**
|
|
42
|
+
* Return all active 'finding' facts in this namespace published by
|
|
43
|
+
* children OTHER than selfFolder.
|
|
44
|
+
*/
|
|
45
|
+
readSiblings(selfFolder: string): FactRecord[];
|
|
46
|
+
/** Return ALL active 'finding' facts in this namespace. */
|
|
47
|
+
readAll(): FactRecord[];
|
|
48
|
+
/** Close the underlying database connection. */
|
|
49
|
+
close(): void;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=shared-blackboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-blackboard.d.ts","sourceRoot":"","sources":["../../src/fleet/shared-blackboard.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAIvC,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;IAMP;;;;OAIG;WACU,IAAI,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAexE;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU;IAkB5D;;;OAGG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE;IAM9C,2DAA2D;IAC3D,OAAO,IAAI,UAAU,EAAE;IAIvB,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { dirname } from "node:path";
|
|
2
|
+
import { ensureDir } from "../state/helpers.js";
|
|
3
|
+
import { FactStore } from "../state/facts.js";
|
|
4
|
+
// ── Constants ────────────────────────────────────────────────────────
|
|
5
|
+
export const BLACKBOARD_MAX_ROUNDS = 3;
|
|
6
|
+
// ── SharedBlackboard ─────────────────────────────────────────────────
|
|
7
|
+
/**
|
|
8
|
+
* Bounded inter-agent exchange wrapper over one shared facts.db.
|
|
9
|
+
* Opens the db in WAL mode with a busy_timeout so concurrent fleet
|
|
10
|
+
* children can publish findings without SQLITE_BUSY deadlocks.
|
|
11
|
+
*
|
|
12
|
+
* bober: single-file SQLite WAL (better-sqlite3 synchronous writes);
|
|
13
|
+
* swap for a network WAL (e.g. Turso/libSQL) if fleet grows beyond
|
|
14
|
+
* one host or requires cross-machine exchange.
|
|
15
|
+
*/
|
|
16
|
+
export class SharedBlackboard {
|
|
17
|
+
store;
|
|
18
|
+
namespace;
|
|
19
|
+
maxRounds;
|
|
20
|
+
constructor(store, namespace, maxRounds) {
|
|
21
|
+
this.store = store;
|
|
22
|
+
this.namespace = namespace;
|
|
23
|
+
this.maxRounds = maxRounds;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Open (or create) a shared WAL facts.db at dbPath.
|
|
27
|
+
* Ensures the parent directory exists before opening.
|
|
28
|
+
* Returns a ready-to-use SharedBlackboard instance.
|
|
29
|
+
*/
|
|
30
|
+
static async open(opts) {
|
|
31
|
+
if (opts.dbPath !== ":memory:") {
|
|
32
|
+
await ensureDir(dirname(opts.dbPath));
|
|
33
|
+
}
|
|
34
|
+
const store = new FactStore(opts.dbPath, {
|
|
35
|
+
journalModeWal: opts.dbPath !== ":memory:",
|
|
36
|
+
busyTimeoutMs: opts.busyTimeoutMs ?? 5000,
|
|
37
|
+
});
|
|
38
|
+
const maxRounds = Math.min(opts.maxRounds ?? BLACKBOARD_MAX_ROUNDS, BLACKBOARD_MAX_ROUNDS);
|
|
39
|
+
return new SharedBlackboard(store, opts.namespace, maxRounds);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Publish a finding from one fleet child.
|
|
43
|
+
* Throws when finding.round exceeds the effective maxRounds cap.
|
|
44
|
+
* Returns the persisted FactRecord.
|
|
45
|
+
*/
|
|
46
|
+
publish(finding, now) {
|
|
47
|
+
if (finding.round > this.maxRounds) {
|
|
48
|
+
throw new Error(`blackboard round ${finding.round} exceeds cap ${this.maxRounds}`);
|
|
49
|
+
}
|
|
50
|
+
return this.store.insertFact({
|
|
51
|
+
scope: this.namespace,
|
|
52
|
+
subject: finding.childFolder,
|
|
53
|
+
predicate: "finding",
|
|
54
|
+
value: finding.payload,
|
|
55
|
+
confidence: finding.confidence ?? 1,
|
|
56
|
+
sourceRunId: null,
|
|
57
|
+
tValid: now,
|
|
58
|
+
tCreated: now,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Return all active 'finding' facts in this namespace published by
|
|
63
|
+
* children OTHER than selfFolder.
|
|
64
|
+
*/
|
|
65
|
+
readSiblings(selfFolder) {
|
|
66
|
+
return this.store
|
|
67
|
+
.getActiveFacts(this.namespace, undefined, "finding")
|
|
68
|
+
.filter((f) => f.subject !== selfFolder);
|
|
69
|
+
}
|
|
70
|
+
/** Return ALL active 'finding' facts in this namespace. */
|
|
71
|
+
readAll() {
|
|
72
|
+
return this.store.getActiveFacts(this.namespace, undefined, "finding");
|
|
73
|
+
}
|
|
74
|
+
/** Close the underlying database connection. */
|
|
75
|
+
close() {
|
|
76
|
+
this.store.close();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=shared-blackboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-blackboard.js","sourceRoot":"","sources":["../../src/fleet/shared-blackboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,wEAAwE;AAExE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAkBvC,wEAAwE;AAExE;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAgB;IACnB,KAAK,CAAY;IACjB,SAAS,CAAS;IAClB,SAAS,CAAS;IAE1B,YAAoB,KAAgB,EAAE,SAAiB,EAAE,SAAiB;QACxE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAA0B;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE;YACvC,cAAc,EAAE,IAAI,CAAC,MAAM,KAAK,UAAU;YAC1C,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;SAC1C,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,IAAI,CAAC,SAAS,IAAI,qBAAqB,EACvC,qBAAqB,CACtB,CAAC;QACF,OAAO,IAAI,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,OAA0B,EAAE,GAAW;QAC7C,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,oBAAoB,OAAO,CAAC,KAAK,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAClE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC3B,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,OAAO,EAAE,OAAO,CAAC,WAAW;YAC5B,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,OAAO,CAAC,OAAO;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;YACnC,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,UAAkB;QAC7B,OAAO,IAAI,CAAC,KAAK;aACd,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;aACpD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,2DAA2D;IAC3D,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACzE,CAAC;IAED,gDAAgD;IAChD,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SharedBlackboard } from "./shared-blackboard.js";
|
|
2
|
+
import type { PortfolioReport } from "./reporter.js";
|
|
3
|
+
import type { FactRecord } from "../state/facts.js";
|
|
4
|
+
export interface SynthesisBundle {
|
|
5
|
+
rounds: number;
|
|
6
|
+
childResults: PortfolioReport;
|
|
7
|
+
findings: FactRecord[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Assemble a SynthesisBundle from the final-round child results, the round
|
|
11
|
+
* count, and (if a blackboard was used) all of its findings.
|
|
12
|
+
* PURE: no LLM, no network, no IO — just shapes existing data into JSON.
|
|
13
|
+
* When blackboard is null, findings is [].
|
|
14
|
+
*/
|
|
15
|
+
export declare function collect(blackboard: SharedBlackboard | null, childResults: PortfolioReport, rounds: number): SynthesisBundle;
|
|
16
|
+
//# sourceMappingURL=synthesis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../src/fleet/synthesis.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,eAAe,CAAC;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAID;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,UAAU,EAAE,gBAAgB,GAAG,IAAI,EACnC,YAAY,EAAE,eAAe,EAC7B,MAAM,EAAE,MAAM,GACb,eAAe,CAMjB"}
|