agent-bober 0.17.1 → 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/plugin.json +1 -1
- package/CHANGELOG.md +15 -0
- package/README.md +158 -5
- 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/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/index.js +12 -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
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { validateManifest } from "./decomposer.js";
|
|
3
|
+
import { runCritiqueLoop } from "./critic-deep.js";
|
|
4
|
+
// ── Constants ────────────────────────────────────────────────────────
|
|
5
|
+
export const DEEP_PLAN_SYSTEM_PROMPT = `You are a tech-lead creating a coarse outline of independent sub-project areas for a high-level goal.
|
|
6
|
+
|
|
7
|
+
Output ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:
|
|
8
|
+
{
|
|
9
|
+
"areas": [
|
|
10
|
+
{ "name": "<free-form area name>", "intent": "<what this sub-project area covers>" }
|
|
11
|
+
]
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
Rules:
|
|
15
|
+
- "name" is a free-form label describing a major concern of the goal (e.g. "Authentication", "Data Layer", "Web Frontend").
|
|
16
|
+
- "intent" is a concise description of what this area covers and why it is independent.
|
|
17
|
+
- You MUST include at least 1 area.
|
|
18
|
+
- Do NOT include folder names, kebab-case slugs, or implementation details — this is a coarse planning outline only.
|
|
19
|
+
- Output the JSON object and nothing else.`;
|
|
20
|
+
export const DEEP_PLAN_COERCION_INSTRUCTION = `Your previous response was not a valid outline.
|
|
21
|
+
Output ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:
|
|
22
|
+
{
|
|
23
|
+
"areas": [
|
|
24
|
+
{ "name": "<free-form area name>", "intent": "<what this sub-project area covers>" }
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
Rules:
|
|
29
|
+
- "name" must be a non-empty string describing a major concern of the goal.
|
|
30
|
+
- "intent" must be a non-empty string describing what the area covers.
|
|
31
|
+
- You MUST include at least 1 area.
|
|
32
|
+
- Output the JSON object and nothing else.`;
|
|
33
|
+
export const DEEP_EXPAND_SYSTEM_PROMPT = `You are a tech-lead expanding a coarse outline into independent, buildable sub-projects.
|
|
34
|
+
|
|
35
|
+
Output ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:
|
|
36
|
+
{
|
|
37
|
+
"children": [
|
|
38
|
+
{ "folder": "<short-kebab-case-dir-name>", "task": "<self-contained build instruction>" }
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
Rules:
|
|
43
|
+
- "folder" must be a short kebab-case directory name (e.g. "api-server", "web-frontend", "cli-tool").
|
|
44
|
+
- "task" must be a complete, self-contained instruction that a code-generation agent can execute independently.
|
|
45
|
+
- You MUST include at least 1 child.
|
|
46
|
+
- Do NOT include "config", "concurrency", "rootDir", or "provider" keys anywhere in the output.
|
|
47
|
+
- Each child carries ONLY "folder" and "task" — no other keys.
|
|
48
|
+
- Output the JSON object and nothing else.`;
|
|
49
|
+
export const DEEP_EXPAND_COERCION_INSTRUCTION = `Your previous response was not a valid fleet manifest.
|
|
50
|
+
Output ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:
|
|
51
|
+
{
|
|
52
|
+
"children": [
|
|
53
|
+
{ "folder": "<short-kebab-case-dir-name>", "task": "<self-contained build instruction>" }
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
Rules:
|
|
58
|
+
- "folder" must be a short kebab-case directory name.
|
|
59
|
+
- "task" must be a complete, self-contained build instruction.
|
|
60
|
+
- You MUST include at least 1 child.
|
|
61
|
+
- Do NOT include "config", "concurrency", "rootDir", or "provider" keys anywhere in the output.
|
|
62
|
+
- Each child carries ONLY "folder" and "task" — no other keys.
|
|
63
|
+
- Output the JSON object and nothing else.`;
|
|
64
|
+
export const DEEP_PLAN_MAX_RETRIES = 1;
|
|
65
|
+
export const DEEP_EXPAND_MAX_RETRIES = 1;
|
|
66
|
+
// bober: fixed budget = (1+DEEP_PLAN_MAX_RETRIES)+(1+DEEP_EXPAND_MAX_RETRIES); upgrade path: increase retries constants
|
|
67
|
+
export const DEEP_MAX_TOTAL_CALLS = 4;
|
|
68
|
+
// ── Local Outline schema ─────────────────────────────────────────────
|
|
69
|
+
const OutlineAreaSchema = z.object({
|
|
70
|
+
name: z.string().min(1),
|
|
71
|
+
intent: z.string(),
|
|
72
|
+
});
|
|
73
|
+
const OutlineSchema = z.object({
|
|
74
|
+
areas: z.array(OutlineAreaSchema).min(1),
|
|
75
|
+
});
|
|
76
|
+
// ── validateOutline (NEVER throws) ───────────────────────────────────
|
|
77
|
+
export function validateOutline(rawText) {
|
|
78
|
+
let parsed;
|
|
79
|
+
// Try direct parse first
|
|
80
|
+
try {
|
|
81
|
+
parsed = JSON.parse(rawText.trim());
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Try extracting JSON from markdown code fences
|
|
85
|
+
const fenceMatch = /```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/.exec(rawText);
|
|
86
|
+
if (fenceMatch) {
|
|
87
|
+
try {
|
|
88
|
+
parsed = JSON.parse(fenceMatch[1].trim());
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Fall through
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Try finding the first { ... } block
|
|
95
|
+
if (!parsed) {
|
|
96
|
+
const braceStart = rawText.indexOf("{");
|
|
97
|
+
const braceEnd = rawText.lastIndexOf("}");
|
|
98
|
+
if (braceStart !== -1 && braceEnd > braceStart) {
|
|
99
|
+
try {
|
|
100
|
+
parsed = JSON.parse(rawText.slice(braceStart, braceEnd + 1));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return {
|
|
104
|
+
ok: false,
|
|
105
|
+
error: `No valid JSON object found in response. Raw: ${rawText.slice(0, 200)}`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
return {
|
|
111
|
+
ok: false,
|
|
112
|
+
error: `No JSON object found in response. Raw: ${rawText.slice(0, 200)}`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const result = OutlineSchema.safeParse(parsed);
|
|
118
|
+
if (!result.success) {
|
|
119
|
+
const issues = result.error.issues
|
|
120
|
+
.map((i) => ` - ${i.path.join(".")}: ${i.message}`)
|
|
121
|
+
.join("\n");
|
|
122
|
+
return { ok: false, error: issues };
|
|
123
|
+
}
|
|
124
|
+
return { ok: true, outline: result.data };
|
|
125
|
+
}
|
|
126
|
+
// ── Internal: one PLAN call ──────────────────────────────────────────
|
|
127
|
+
async function callPlan(input) {
|
|
128
|
+
const { client, model, goal, count, priorText, formattedError } = input;
|
|
129
|
+
const firstUserContent = count
|
|
130
|
+
? `${goal}\n\n(Outline into approximately ${count} areas.)`
|
|
131
|
+
: goal;
|
|
132
|
+
let messages;
|
|
133
|
+
if (priorText !== undefined && formattedError !== undefined) {
|
|
134
|
+
// Coercion retry: 3-message shape [user, assistant, user]
|
|
135
|
+
messages = [
|
|
136
|
+
{ role: "user", content: firstUserContent },
|
|
137
|
+
{ role: "assistant", content: priorText },
|
|
138
|
+
{
|
|
139
|
+
role: "user",
|
|
140
|
+
content: `${DEEP_PLAN_COERCION_INSTRUCTION}\n\nPrevious validation error:\n${formattedError}`,
|
|
141
|
+
},
|
|
142
|
+
];
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// First turn: single user message
|
|
146
|
+
messages = [{ role: "user", content: firstUserContent }];
|
|
147
|
+
}
|
|
148
|
+
const response = await client.chat({
|
|
149
|
+
model,
|
|
150
|
+
system: DEEP_PLAN_SYSTEM_PROMPT,
|
|
151
|
+
messages,
|
|
152
|
+
jsonObjectMode: true,
|
|
153
|
+
});
|
|
154
|
+
return response.text;
|
|
155
|
+
}
|
|
156
|
+
// ── Internal: one EXPAND call ────────────────────────────────────────
|
|
157
|
+
async function callExpand(input) {
|
|
158
|
+
const { client, model, outline, goal, priorText, formattedError } = input;
|
|
159
|
+
const firstUserContent = `Goal: ${goal}\n\nOutline:\n${JSON.stringify(outline)}`;
|
|
160
|
+
let messages;
|
|
161
|
+
if (priorText !== undefined && formattedError !== undefined) {
|
|
162
|
+
// Coercion retry: 3-message shape [user, assistant, user]
|
|
163
|
+
messages = [
|
|
164
|
+
{ role: "user", content: firstUserContent },
|
|
165
|
+
{ role: "assistant", content: priorText },
|
|
166
|
+
{
|
|
167
|
+
role: "user",
|
|
168
|
+
content: `${DEEP_EXPAND_COERCION_INSTRUCTION}\n\nPrevious validation error:\n${formattedError}`,
|
|
169
|
+
},
|
|
170
|
+
];
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// First turn: single user message
|
|
174
|
+
messages = [{ role: "user", content: firstUserContent }];
|
|
175
|
+
}
|
|
176
|
+
// NEW: append critique feedback to the first user turn only when present
|
|
177
|
+
const { critiqueFeedback } = input;
|
|
178
|
+
if (critiqueFeedback && messages.length === 1) {
|
|
179
|
+
messages = [{ role: "user", content: firstUserContent + `\n\nPrior reviewer feedback to address:\n${critiqueFeedback}` }];
|
|
180
|
+
}
|
|
181
|
+
const response = await client.chat({
|
|
182
|
+
model,
|
|
183
|
+
system: DEEP_EXPAND_SYSTEM_PROMPT,
|
|
184
|
+
messages,
|
|
185
|
+
jsonObjectMode: true,
|
|
186
|
+
});
|
|
187
|
+
return response.text;
|
|
188
|
+
}
|
|
189
|
+
// ── Stages ───────────────────────────────────────────────────────────
|
|
190
|
+
export async function runPlanStage(input) {
|
|
191
|
+
const { client, model, goal, count, maxRetries } = input;
|
|
192
|
+
const maxAttempts = 1 + maxRetries;
|
|
193
|
+
let lastError = "Unknown error";
|
|
194
|
+
let priorText;
|
|
195
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
196
|
+
const rawText = await callPlan({
|
|
197
|
+
client,
|
|
198
|
+
model,
|
|
199
|
+
goal,
|
|
200
|
+
count,
|
|
201
|
+
priorText: attempt > 0 ? priorText : undefined,
|
|
202
|
+
formattedError: attempt > 0 ? lastError : undefined,
|
|
203
|
+
});
|
|
204
|
+
const validated = validateOutline(rawText);
|
|
205
|
+
if (validated.ok) {
|
|
206
|
+
return validated.outline;
|
|
207
|
+
}
|
|
208
|
+
lastError = validated.error;
|
|
209
|
+
priorText = rawText;
|
|
210
|
+
}
|
|
211
|
+
throw new Error(`deep plan failed after ${maxAttempts} attempt${maxAttempts === 1 ? "" : "s"}:\n${lastError}`);
|
|
212
|
+
}
|
|
213
|
+
export async function runExpandStage(input) {
|
|
214
|
+
const { client, model, outline, goal, maxRetries } = input;
|
|
215
|
+
const { critiqueFeedback } = input; // NEW
|
|
216
|
+
const maxAttempts = 1 + maxRetries;
|
|
217
|
+
let lastError = "Unknown error";
|
|
218
|
+
let priorText;
|
|
219
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
220
|
+
const rawText = await callExpand({
|
|
221
|
+
client,
|
|
222
|
+
model,
|
|
223
|
+
outline,
|
|
224
|
+
goal,
|
|
225
|
+
priorText: attempt > 0 ? priorText : undefined,
|
|
226
|
+
formattedError: attempt > 0 ? lastError : undefined,
|
|
227
|
+
critiqueFeedback: attempt === 0 ? critiqueFeedback : undefined,
|
|
228
|
+
});
|
|
229
|
+
const validated = validateManifest(rawText);
|
|
230
|
+
if (validated.ok) {
|
|
231
|
+
return validated.manifest;
|
|
232
|
+
}
|
|
233
|
+
lastError = validated.error;
|
|
234
|
+
priorText = rawText;
|
|
235
|
+
}
|
|
236
|
+
throw new Error(`deep expand failed after ${maxAttempts} attempt${maxAttempts === 1 ? "" : "s"}:\n${lastError}`);
|
|
237
|
+
}
|
|
238
|
+
// ── Public entrypoint ────────────────────────────────────────────────
|
|
239
|
+
export async function decomposeGoalDeep(input) {
|
|
240
|
+
const { goal, client, model, count, planMaxRetries = DEEP_PLAN_MAX_RETRIES, expandMaxRetries = DEEP_EXPAND_MAX_RETRIES, } = input;
|
|
241
|
+
// PLAN strictly precedes EXPAND — never parallel
|
|
242
|
+
const outline = await runPlanStage({
|
|
243
|
+
client,
|
|
244
|
+
model,
|
|
245
|
+
goal,
|
|
246
|
+
count,
|
|
247
|
+
maxRetries: planMaxRetries,
|
|
248
|
+
});
|
|
249
|
+
const manifest = await runExpandStage({
|
|
250
|
+
client,
|
|
251
|
+
model,
|
|
252
|
+
outline,
|
|
253
|
+
goal,
|
|
254
|
+
maxRetries: expandMaxRetries,
|
|
255
|
+
});
|
|
256
|
+
if (input.critique === true) {
|
|
257
|
+
return runCritiqueLoop({ client, model, goal, outline, baseline: manifest, expandMaxRetries });
|
|
258
|
+
}
|
|
259
|
+
return manifest;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=decomposer-deep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decomposer-deep.js","sourceRoot":"","sources":["../../src/fleet/decomposer-deep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FleetManifest } from "./manifest.js";
|
|
2
|
+
import type { LLMClient } from "../providers/types.js";
|
|
3
|
+
export declare const DECOMPOSE_SYSTEM_PROMPT = "You are a tech-lead decomposing ONE high-level goal into N independent, buildable sub-projects.\n\nOutput ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:\n{\n \"children\": [\n { \"folder\": \"<short-kebab-case-dir-name>\", \"task\": \"<self-contained build instruction>\" }\n ]\n}\n\nRules:\n- \"folder\" must be a short kebab-case directory name (e.g. \"api-server\", \"web-frontend\", \"cli-tool\").\n- \"task\" must be a complete, self-contained instruction that a code-generation agent can execute independently.\n- You MUST include at least 1 child.\n- Do NOT include \"config\", \"concurrency\", \"rootDir\", or \"provider\" keys anywhere in the output.\n- Each child carries ONLY \"folder\" and \"task\" \u2014 no other keys.\n- Output the JSON object and nothing else.";
|
|
4
|
+
export declare const DECOMPOSE_COERCION_INSTRUCTION = "Your previous response was not a valid fleet manifest.\nOutput ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:\n{\n \"children\": [\n { \"folder\": \"<short-kebab-case-dir-name>\", \"task\": \"<self-contained build instruction>\" }\n ]\n}\n\nRules:\n- \"folder\" must be a short kebab-case directory name.\n- \"task\" must be a complete, self-contained build instruction.\n- You MUST include at least 1 child.\n- Do NOT include \"config\", \"concurrency\", \"rootDir\", or \"provider\" keys anywhere in the output.\n- Each child carries ONLY \"folder\" and \"task\" \u2014 no other keys.\n- Output the JSON object and nothing else.";
|
|
5
|
+
export declare const DECOMPOSE_MAX_RETRIES = 1;
|
|
6
|
+
export interface DecomposeInput {
|
|
7
|
+
goal: string;
|
|
8
|
+
client: LLMClient;
|
|
9
|
+
model: string;
|
|
10
|
+
maxRetries?: number;
|
|
11
|
+
}
|
|
12
|
+
type ValidateResult = {
|
|
13
|
+
ok: true;
|
|
14
|
+
manifest: FleetManifest;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
error: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function validateManifest(rawText: string): ValidateResult;
|
|
20
|
+
export declare function decomposeGoal(input: DecomposeInput): Promise<FleetManifest>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=decomposer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decomposer.d.ts","sourceRoot":"","sources":["../../src/fleet/decomposer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,uBAAuB,CAAC;AAIhE,eAAO,MAAM,uBAAuB,o0BAeO,CAAC;AAE5C,eAAO,MAAM,8BAA8B,krBAcA,CAAC;AAE5C,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAIvC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,cAAc,GACf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA0CjC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA4DhE;AAID,wBAAsB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA4BjF"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { FleetManifestSchema } from "./manifest.js";
|
|
2
|
+
// ── Constants ────────────────────────────────────────────────────────
|
|
3
|
+
export const DECOMPOSE_SYSTEM_PROMPT = `You are a tech-lead decomposing ONE high-level goal into N independent, buildable sub-projects.
|
|
4
|
+
|
|
5
|
+
Output ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:
|
|
6
|
+
{
|
|
7
|
+
"children": [
|
|
8
|
+
{ "folder": "<short-kebab-case-dir-name>", "task": "<self-contained build instruction>" }
|
|
9
|
+
]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
Rules:
|
|
13
|
+
- "folder" must be a short kebab-case directory name (e.g. "api-server", "web-frontend", "cli-tool").
|
|
14
|
+
- "task" must be a complete, self-contained instruction that a code-generation agent can execute independently.
|
|
15
|
+
- You MUST include at least 1 child.
|
|
16
|
+
- Do NOT include "config", "concurrency", "rootDir", or "provider" keys anywhere in the output.
|
|
17
|
+
- Each child carries ONLY "folder" and "task" — no other keys.
|
|
18
|
+
- Output the JSON object and nothing else.`;
|
|
19
|
+
export const DECOMPOSE_COERCION_INSTRUCTION = `Your previous response was not a valid fleet manifest.
|
|
20
|
+
Output ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:
|
|
21
|
+
{
|
|
22
|
+
"children": [
|
|
23
|
+
{ "folder": "<short-kebab-case-dir-name>", "task": "<self-contained build instruction>" }
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
Rules:
|
|
28
|
+
- "folder" must be a short kebab-case directory name.
|
|
29
|
+
- "task" must be a complete, self-contained build instruction.
|
|
30
|
+
- You MUST include at least 1 child.
|
|
31
|
+
- Do NOT include "config", "concurrency", "rootDir", or "provider" keys anywhere in the output.
|
|
32
|
+
- Each child carries ONLY "folder" and "task" — no other keys.
|
|
33
|
+
- Output the JSON object and nothing else.`;
|
|
34
|
+
export const DECOMPOSE_MAX_RETRIES = 1;
|
|
35
|
+
// ── Internal: one LLM call ───────────────────────────────────────────
|
|
36
|
+
async function callDecomposer(input) {
|
|
37
|
+
const { client, model, goal, priorText, formattedError } = input;
|
|
38
|
+
let messages;
|
|
39
|
+
if (priorText !== undefined && formattedError !== undefined) {
|
|
40
|
+
// Coercion retry: 3-message shape [user, assistant, user]
|
|
41
|
+
messages = [
|
|
42
|
+
{ role: "user", content: goal },
|
|
43
|
+
{ role: "assistant", content: priorText },
|
|
44
|
+
{
|
|
45
|
+
role: "user",
|
|
46
|
+
content: `${DECOMPOSE_COERCION_INSTRUCTION}\n\nPrevious validation error:\n${formattedError}`,
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// First turn: single user message
|
|
52
|
+
messages = [{ role: "user", content: goal }];
|
|
53
|
+
}
|
|
54
|
+
const response = await client.chat({
|
|
55
|
+
model,
|
|
56
|
+
system: DECOMPOSE_SYSTEM_PROMPT,
|
|
57
|
+
messages,
|
|
58
|
+
jsonObjectMode: true,
|
|
59
|
+
});
|
|
60
|
+
return response.text;
|
|
61
|
+
}
|
|
62
|
+
// ── Internal: extract + validate + config-key guard ──────────────────
|
|
63
|
+
export function validateManifest(rawText) {
|
|
64
|
+
let parsed;
|
|
65
|
+
// Try direct parse first
|
|
66
|
+
try {
|
|
67
|
+
parsed = JSON.parse(rawText.trim());
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Try extracting JSON from markdown code fences
|
|
71
|
+
const fenceMatch = /```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/.exec(rawText);
|
|
72
|
+
if (fenceMatch) {
|
|
73
|
+
try {
|
|
74
|
+
parsed = JSON.parse(fenceMatch[1].trim());
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Fall through
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Try finding the first { ... } block
|
|
81
|
+
if (!parsed) {
|
|
82
|
+
const braceStart = rawText.indexOf("{");
|
|
83
|
+
const braceEnd = rawText.lastIndexOf("}");
|
|
84
|
+
if (braceStart !== -1 && braceEnd > braceStart) {
|
|
85
|
+
try {
|
|
86
|
+
parsed = JSON.parse(rawText.slice(braceStart, braceEnd + 1));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return {
|
|
90
|
+
ok: false,
|
|
91
|
+
error: `No valid JSON object found in response. Raw: ${rawText.slice(0, 200)}`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return {
|
|
97
|
+
ok: false,
|
|
98
|
+
error: `No JSON object found in response. Raw: ${rawText.slice(0, 200)}`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const result = FleetManifestSchema.safeParse(parsed);
|
|
104
|
+
if (!result.success) {
|
|
105
|
+
const issues = result.error.issues
|
|
106
|
+
.map((i) => ` - ${i.path.join(".")}: ${i.message}`)
|
|
107
|
+
.join("\n");
|
|
108
|
+
return { ok: false, error: issues };
|
|
109
|
+
}
|
|
110
|
+
// Config-key guard: children must not carry a "config" key
|
|
111
|
+
// (FleetChildSchema.config is optional, so safeParse alone accepts it)
|
|
112
|
+
const offending = result.data.children.find((c) => Object.prototype.hasOwnProperty.call(c, "config"));
|
|
113
|
+
if (offending) {
|
|
114
|
+
return {
|
|
115
|
+
ok: false,
|
|
116
|
+
error: `child "${offending.folder}": children must not carry a "config" key`,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return { ok: true, manifest: result.data };
|
|
120
|
+
}
|
|
121
|
+
// ── Public entrypoint ────────────────────────────────────────────────
|
|
122
|
+
export async function decomposeGoal(input) {
|
|
123
|
+
const { goal, client, model, maxRetries = DECOMPOSE_MAX_RETRIES } = input;
|
|
124
|
+
const maxAttempts = 1 + maxRetries;
|
|
125
|
+
let lastError = "Unknown error";
|
|
126
|
+
let priorText;
|
|
127
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
128
|
+
const rawText = await callDecomposer({
|
|
129
|
+
client,
|
|
130
|
+
model,
|
|
131
|
+
goal,
|
|
132
|
+
priorText: attempt > 0 ? priorText : undefined,
|
|
133
|
+
formattedError: attempt > 0 ? lastError : undefined,
|
|
134
|
+
});
|
|
135
|
+
const validated = validateManifest(rawText);
|
|
136
|
+
if (validated.ok) {
|
|
137
|
+
return validated.manifest;
|
|
138
|
+
}
|
|
139
|
+
lastError = validated.error;
|
|
140
|
+
priorText = rawText;
|
|
141
|
+
}
|
|
142
|
+
throw new Error(`Fleet decomposition failed after ${maxAttempts} attempt${maxAttempts === 1 ? "" : "s"}:\n${lastError}`);
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=decomposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decomposer.js","sourceRoot":"","sources":["../../src/fleet/decomposer.ts"],"names":[],"mappings":"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"}
|
package/dist/fleet/index.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ import type { Command } from "commander";
|
|
|
2
2
|
import { FleetCoordinator } from "./coordinator.js";
|
|
3
3
|
import { OutcomeAggregator } from "./aggregator.js";
|
|
4
4
|
import { PortfolioReporter } from "./reporter.js";
|
|
5
|
+
import { createClient } from "../providers/factory.js";
|
|
6
|
+
import { decomposeGoal } from "./decomposer.js";
|
|
7
|
+
import { decomposeGoalDeep } from "./decomposer-deep.js";
|
|
5
8
|
import type { PortfolioReport } from "./reporter.js";
|
|
6
9
|
export type { PortfolioReport };
|
|
7
10
|
export interface FleetDeps {
|
|
@@ -28,6 +31,96 @@ export interface FleetOptions {
|
|
|
28
31
|
* @param deps - Optional DI for testing (coordinator / aggregator / reporter).
|
|
29
32
|
*/
|
|
30
33
|
export declare function runFleet(manifestPath: string, options?: FleetOptions, deps?: FleetDeps): Promise<PortfolioReport>;
|
|
34
|
+
export interface FleetExpandOptions {
|
|
35
|
+
/** Soft target for number of children to decompose */
|
|
36
|
+
count?: string;
|
|
37
|
+
/** Override the decomposer LLM provider (default: "openai-compat") */
|
|
38
|
+
provider?: string;
|
|
39
|
+
/** Override the decomposer LLM model (default: "deepseek-v4-pro") */
|
|
40
|
+
model?: string;
|
|
41
|
+
/** Override the manifest rootDir (default: ".") */
|
|
42
|
+
root?: string;
|
|
43
|
+
/** Override manifest concurrency (default: 3) */
|
|
44
|
+
concurrency?: string;
|
|
45
|
+
/** Override the output path for the written manifest */
|
|
46
|
+
out?: string;
|
|
47
|
+
/** When true, chain into runFleet(outPath) after writing */
|
|
48
|
+
yes?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface FleetExpandDeps {
|
|
51
|
+
decompose?: typeof decomposeGoal;
|
|
52
|
+
runFleet?: typeof runFleet;
|
|
53
|
+
createClient?: typeof createClient;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Core logic for `fleet expand <goal>`:
|
|
57
|
+
*
|
|
58
|
+
* 1. Build the DeepSeek LLMClient (credential fail-fast BEFORE any IO).
|
|
59
|
+
* 2. Call decomposeGoal to get a children-only FleetManifest.
|
|
60
|
+
* 3. Assemble { rootDir, concurrency, children }.
|
|
61
|
+
* 4. Atomically write the manifest to outPath (overwrite with notice).
|
|
62
|
+
* 5. Print the manifest + a review hint.
|
|
63
|
+
* 6. If --yes, chain into runFleet(outPath) and print Fleet Summary.
|
|
64
|
+
* Otherwise stop (exit 0).
|
|
65
|
+
*
|
|
66
|
+
* @param goal - The high-level goal to decompose into children.
|
|
67
|
+
* @param opts - Parsed Commander options.
|
|
68
|
+
* @param deps - Optional DI seams for testing (decompose, runFleet, createClient).
|
|
69
|
+
*/
|
|
70
|
+
export declare function runFleetExpand(goal: string, opts: FleetExpandOptions, deps?: FleetExpandDeps): Promise<void>;
|
|
71
|
+
export interface FleetExpandDeepOptions {
|
|
72
|
+
/** Soft target for number of children to decompose */
|
|
73
|
+
count?: string;
|
|
74
|
+
/** Override the decomposer LLM provider (default: "openai-compat") */
|
|
75
|
+
provider?: string;
|
|
76
|
+
/** Override the decomposer LLM model (default: "deepseek-v4-pro") */
|
|
77
|
+
model?: string;
|
|
78
|
+
/** Override the manifest rootDir (default: ".") */
|
|
79
|
+
root?: string;
|
|
80
|
+
/** Override manifest concurrency (default: 3) */
|
|
81
|
+
concurrency?: string;
|
|
82
|
+
/** Override the output path for the written manifest */
|
|
83
|
+
out?: string;
|
|
84
|
+
/** When true, chain into runFleet(outPath) after writing */
|
|
85
|
+
yes?: boolean;
|
|
86
|
+
/** When true, run a fresh-context critic gate that re-expands degenerate manifests */
|
|
87
|
+
critique?: boolean;
|
|
88
|
+
}
|
|
89
|
+
export interface FleetExpandDeepDeps {
|
|
90
|
+
decomposeDeep?: typeof decomposeGoalDeep;
|
|
91
|
+
runFleet?: typeof runFleet;
|
|
92
|
+
createClient?: typeof createClient;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Core logic for `fleet expand-deep <goal>`:
|
|
96
|
+
*
|
|
97
|
+
* 1. Build the DeepSeek LLMClient (credential fail-fast BEFORE any IO).
|
|
98
|
+
* 2. Call decomposeGoalDeep to get a children-only FleetManifest (two-stage plan→expand).
|
|
99
|
+
* 3. Assemble { rootDir, concurrency, children }.
|
|
100
|
+
* 4. Atomically write the manifest to outPath (overwrite with notice).
|
|
101
|
+
* 5. Print the manifest + a review hint.
|
|
102
|
+
* 6. If --yes, chain into runFleet(outPath) and print Fleet Summary.
|
|
103
|
+
* Otherwise stop (exit 0).
|
|
104
|
+
*
|
|
105
|
+
* @param goal - The high-level goal to decompose into children.
|
|
106
|
+
* @param opts - Parsed Commander options.
|
|
107
|
+
* @param deps - Optional DI seams for testing (decomposeDeep, runFleet, createClient).
|
|
108
|
+
*/
|
|
109
|
+
export declare function runFleetExpandDeep(goal: string, opts: FleetExpandDeepOptions, deps?: FleetExpandDeepDeps): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Attach `expand-deep <goal>` as a child subcommand of the existing `fleet` command.
|
|
112
|
+
* Options: --count, --provider, --model, --root, --concurrency, --out, --yes.
|
|
113
|
+
*
|
|
114
|
+
* The action body is a thin wrapper around runFleetExpandDeep for testability.
|
|
115
|
+
*/
|
|
116
|
+
export declare function registerFleetExpandDeepSubcommand(fleet: Command): void;
|
|
117
|
+
/**
|
|
118
|
+
* Attach `expand <goal>` as a child subcommand of the existing `fleet` command.
|
|
119
|
+
* Options: --count, --provider, --model, --root, --concurrency, --out, --yes.
|
|
120
|
+
*
|
|
121
|
+
* The action body is a thin wrapper around runFleetExpand for testability.
|
|
122
|
+
*/
|
|
123
|
+
export declare function registerFleetExpandSubcommand(fleet: Command): void;
|
|
31
124
|
/**
|
|
32
125
|
* Register `agent-bober fleet <manifest>` with the commander program.
|
|
33
126
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fleet/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fleet/index.ts"],"names":[],"mappings":"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"}
|