dual-brain 0.2.30 → 0.3.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/.dual-brain/docs/claude-code-extension-points.md +32 -0
- package/.dual-brain/docs/data-tools-capabilities.md +181 -0
- package/.dual-brain/docs/ecosystem-tools.md +91 -0
- package/.dual-brain/docs/panel-handoff.md +124 -0
- package/.dual-brain/docs/ruflo-analysis.md +48 -0
- package/bin/dual-brain.mjs +56 -56
- package/dist/mcp-server/index.d.ts +27 -0
- package/dist/mcp-server/index.js +359 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/src/agent-protocol.d.ts +163 -0
- package/dist/src/agent-protocol.js +368 -0
- package/dist/src/agent-protocol.js.map +1 -0
- package/dist/src/agents/registry.d.ts +52 -0
- package/dist/src/agents/registry.js +393 -0
- package/dist/src/agents/registry.js.map +1 -0
- package/dist/src/awareness.d.ts +93 -0
- package/dist/src/awareness.js +406 -0
- package/dist/src/awareness.js.map +1 -0
- package/dist/src/brief.d.ts +48 -0
- package/dist/src/brief.js +179 -0
- package/dist/src/brief.js.map +1 -0
- package/dist/src/calibration.d.ts +32 -0
- package/dist/src/calibration.js +133 -0
- package/dist/src/calibration.js.map +1 -0
- package/dist/src/checkpoint.d.ts +33 -0
- package/dist/src/checkpoint.js +99 -0
- package/dist/src/checkpoint.js.map +1 -0
- package/dist/src/ci-triage.d.ts +33 -0
- package/dist/src/ci-triage.js +193 -0
- package/dist/src/ci-triage.js.map +1 -0
- package/dist/src/cognitive-loop.d.ts +56 -0
- package/dist/src/cognitive-loop.js +495 -0
- package/dist/src/cognitive-loop.js.map +1 -0
- package/dist/src/collaboration.d.ts +147 -0
- package/dist/src/collaboration.js +438 -0
- package/dist/src/collaboration.js.map +1 -0
- package/dist/src/context-intel.d.ts +47 -0
- package/dist/src/context-intel.js +156 -0
- package/dist/src/context-intel.js.map +1 -0
- package/dist/src/context.d.ts +53 -0
- package/dist/src/context.js +332 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/continuity.d.ts +89 -0
- package/dist/src/continuity.js +230 -0
- package/dist/src/continuity.js.map +1 -0
- package/dist/src/cost-tracker.d.ts +47 -0
- package/dist/src/cost-tracker.js +170 -0
- package/dist/src/cost-tracker.js.map +1 -0
- package/dist/src/debrief.d.ts +53 -0
- package/dist/src/debrief.js +222 -0
- package/dist/src/debrief.js.map +1 -0
- package/dist/src/decide.d.ts +96 -0
- package/dist/src/decide.js +744 -0
- package/dist/src/decide.js.map +1 -0
- package/dist/src/decompose.d.ts +39 -0
- package/dist/src/decompose.js +218 -0
- package/dist/src/decompose.js.map +1 -0
- package/dist/src/detect.d.ts +91 -0
- package/dist/src/detect.js +544 -0
- package/dist/src/detect.js.map +1 -0
- package/dist/src/dispatch.d.ts +154 -0
- package/dist/src/dispatch.js +1306 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/doctor.d.ts +421 -0
- package/dist/src/doctor.js +1689 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/engine.d.ts +70 -0
- package/dist/src/engine.js +155 -0
- package/dist/src/engine.js.map +1 -0
- package/dist/src/envelope.d.ts +36 -0
- package/dist/src/envelope.js +80 -0
- package/dist/src/envelope.js.map +1 -0
- package/dist/src/failure-memory.d.ts +55 -0
- package/dist/src/failure-memory.js +175 -0
- package/dist/src/failure-memory.js.map +1 -0
- package/dist/src/fx.d.ts +87 -0
- package/dist/src/fx.js +272 -0
- package/dist/src/fx.js.map +1 -0
- package/dist/src/governance.d.ts +93 -0
- package/dist/src/governance.js +261 -0
- package/dist/src/governance.js.map +1 -0
- package/dist/src/handoff.d.ts +11 -0
- package/dist/src/handoff.js +90 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/head-protocol.d.ts +76 -0
- package/dist/src/head-protocol.js +109 -0
- package/dist/src/head-protocol.js.map +1 -0
- package/dist/src/head.d.ts +222 -0
- package/dist/src/head.js +765 -0
- package/dist/src/head.js.map +1 -0
- package/dist/src/health.d.ts +132 -0
- package/dist/src/health.js +435 -0
- package/dist/src/health.js.map +1 -0
- package/dist/src/inbox.d.ts +70 -0
- package/dist/src/inbox.js +218 -0
- package/dist/src/inbox.js.map +1 -0
- package/dist/src/index.d.ts +33 -0
- package/dist/src/index.js +38 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/install-hooks.d.ts +13 -0
- package/dist/src/install-hooks.js +88 -0
- package/dist/src/install-hooks.js.map +1 -0
- package/dist/src/integrity.d.ts +59 -0
- package/dist/src/integrity.js +206 -0
- package/dist/src/integrity.js.map +1 -0
- package/dist/src/intelligence.d.ts +104 -0
- package/dist/src/intelligence.js +391 -0
- package/dist/src/intelligence.js.map +1 -0
- package/dist/src/ledger.d.ts +54 -0
- package/dist/src/ledger.js +179 -0
- package/dist/src/ledger.js.map +1 -0
- package/dist/src/living-docs.d.ts +14 -0
- package/dist/src/living-docs.js +197 -0
- package/dist/src/living-docs.js.map +1 -0
- package/dist/src/memory-tiers.d.ts +37 -0
- package/dist/src/memory-tiers.js +160 -0
- package/dist/src/memory-tiers.js.map +1 -0
- package/dist/src/model-profiles.d.ts +65 -0
- package/dist/src/model-profiles.js +568 -0
- package/dist/src/model-profiles.js.map +1 -0
- package/dist/src/models.d.ts +58 -0
- package/dist/src/models.js +327 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/narrative.d.ts +54 -0
- package/dist/src/narrative.js +163 -0
- package/dist/src/narrative.js.map +1 -0
- package/dist/src/nextstep.d.ts +16 -0
- package/dist/src/nextstep.js +103 -0
- package/dist/src/nextstep.js.map +1 -0
- package/dist/src/observer.d.ts +18 -0
- package/dist/src/observer.js +251 -0
- package/dist/src/observer.js.map +1 -0
- package/dist/src/outcome.d.ts +110 -0
- package/dist/src/outcome.js +377 -0
- package/dist/src/outcome.js.map +1 -0
- package/dist/src/pipeline.d.ts +167 -0
- package/dist/src/pipeline.js +1503 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/src/playbook.d.ts +59 -0
- package/dist/src/playbook.js +238 -0
- package/dist/src/playbook.js.map +1 -0
- package/dist/src/pr-agent.d.ts +97 -0
- package/dist/src/pr-agent.js +195 -0
- package/dist/src/pr-agent.js.map +1 -0
- package/dist/src/predictive.d.ts +57 -0
- package/dist/src/predictive.js +230 -0
- package/dist/src/predictive.js.map +1 -0
- package/dist/src/profile.d.ts +294 -0
- package/dist/src/profile.js +1347 -0
- package/dist/src/profile.js.map +1 -0
- package/dist/src/prompt-audit.d.ts +22 -0
- package/dist/src/prompt-audit.js +194 -0
- package/dist/src/prompt-audit.js.map +1 -0
- package/dist/src/prompt-intel.d.ts +12 -0
- package/dist/src/prompt-intel.js +321 -0
- package/dist/src/prompt-intel.js.map +1 -0
- package/dist/src/provider-context.d.ts +121 -0
- package/dist/src/provider-context.js +222 -0
- package/dist/src/provider-context.js.map +1 -0
- package/dist/src/provider-manager.d.ts +92 -0
- package/dist/src/provider-manager.js +428 -0
- package/dist/src/provider-manager.js.map +1 -0
- package/dist/src/receipt.d.ts +87 -0
- package/dist/src/receipt.js +326 -0
- package/dist/src/receipt.js.map +1 -0
- package/dist/src/recommendations.d.ts +13 -0
- package/dist/src/recommendations.js +291 -0
- package/dist/src/recommendations.js.map +1 -0
- package/dist/src/redact.d.ts +15 -0
- package/dist/src/redact.js +129 -0
- package/dist/src/redact.js.map +1 -0
- package/dist/src/replit.d.ts +397 -0
- package/dist/src/replit.js +1160 -0
- package/dist/src/replit.js.map +1 -0
- package/dist/src/repo.d.ts +149 -0
- package/dist/src/repo.js +416 -0
- package/dist/src/repo.js.map +1 -0
- package/dist/src/revert.d.ts +30 -0
- package/dist/src/revert.js +166 -0
- package/dist/src/revert.js.map +1 -0
- package/dist/src/room.d.ts +102 -0
- package/dist/src/room.js +212 -0
- package/dist/src/room.js.map +1 -0
- package/dist/src/routing-advisor.d.ts +57 -0
- package/dist/src/routing-advisor.js +221 -0
- package/dist/src/routing-advisor.js.map +1 -0
- package/dist/src/self-correct.d.ts +40 -0
- package/dist/src/self-correct.js +137 -0
- package/dist/src/self-correct.js.map +1 -0
- package/dist/src/session-lock.d.ts +35 -0
- package/dist/src/session-lock.js +134 -0
- package/dist/src/session-lock.js.map +1 -0
- package/dist/src/session.d.ts +267 -0
- package/dist/src/session.js +1660 -0
- package/dist/src/session.js.map +1 -0
- package/dist/src/settings-tui.d.ts +5 -0
- package/dist/src/settings-tui.js +422 -0
- package/dist/src/settings-tui.js.map +1 -0
- package/dist/src/setup-flow.d.ts +63 -0
- package/dist/src/setup-flow.js +233 -0
- package/dist/src/setup-flow.js.map +1 -0
- package/dist/src/signal.d.ts +19 -0
- package/dist/src/signal.js +122 -0
- package/dist/src/signal.js.map +1 -0
- package/dist/src/simmer.d.ts +85 -0
- package/dist/src/simmer.js +224 -0
- package/dist/src/simmer.js.map +1 -0
- package/dist/src/state-export.d.ts +129 -0
- package/dist/src/state-export.js +233 -0
- package/dist/src/state-export.js.map +1 -0
- package/dist/src/strategy.d.ts +54 -0
- package/dist/src/strategy.js +95 -0
- package/dist/src/strategy.js.map +1 -0
- package/dist/src/subscription.d.ts +40 -0
- package/dist/src/subscription.js +189 -0
- package/dist/src/subscription.js.map +1 -0
- package/dist/src/templates.d.ts +208 -0
- package/dist/src/templates.js +238 -0
- package/dist/src/templates.js.map +1 -0
- package/dist/src/test.d.ts +9 -0
- package/dist/src/test.js +1173 -0
- package/dist/src/test.js.map +1 -0
- package/dist/src/think-engine.d.ts +67 -0
- package/dist/src/think-engine.js +412 -0
- package/dist/src/think-engine.js.map +1 -0
- package/dist/src/tui.d.ts +71 -0
- package/dist/src/tui.js +242 -0
- package/dist/src/tui.js.map +1 -0
- package/dist/src/types.d.ts +177 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/update-check.d.ts +7 -0
- package/dist/src/update-check.js +36 -0
- package/dist/src/update-check.js.map +1 -0
- package/dist/src/wave-planner.d.ts +30 -0
- package/dist/src/wave-planner.js +281 -0
- package/dist/src/wave-planner.js.map +1 -0
- package/hooks/head-guard.sh +41 -0
- package/hooks/task-classifier.mjs +328 -0
- package/hooks/vibe-router.mjs +387 -0
- package/package.json +29 -153
- package/src/agents/registry.mjs +0 -405
- package/src/awareness.mjs +0 -425
- package/src/brief.mjs +0 -266
- package/src/calibration.mjs +0 -148
- package/src/checkpoint.mjs +0 -109
- package/src/ci-triage.mjs +0 -191
- package/src/cognitive-loop.mjs +0 -562
- package/src/collaboration.mjs +0 -545
- package/src/context-intel.mjs +0 -158
- package/src/context.mjs +0 -389
- package/src/continuity.mjs +0 -298
- package/src/cost-tracker.mjs +0 -184
- package/src/debrief.mjs +0 -228
- package/src/decide.mjs +0 -1099
- package/src/decompose.mjs +0 -331
- package/src/detect.mjs +0 -702
- package/src/dispatch.mjs +0 -1447
- package/src/doctor.mjs +0 -1607
- package/src/envelope.mjs +0 -139
- package/src/failure-memory.mjs +0 -178
- package/src/fx.mjs +0 -276
- package/src/governance.mjs +0 -279
- package/src/handoff.mjs +0 -87
- package/src/head-protocol.mjs +0 -128
- package/src/head.mjs +0 -952
- package/src/health.mjs +0 -528
- package/src/inbox.mjs +0 -195
- package/src/index.mjs +0 -44
- package/src/install-hooks.mjs +0 -100
- package/src/integrity.mjs +0 -245
- package/src/intelligence.mjs +0 -447
- package/src/ledger.mjs +0 -196
- package/src/living-docs.mjs +0 -210
- package/src/memory-tiers.mjs +0 -193
- package/src/models.mjs +0 -363
- package/src/narrative.mjs +0 -169
- package/src/nextstep.mjs +0 -100
- package/src/observer.mjs +0 -241
- package/src/outcome.mjs +0 -400
- package/src/pipeline.mjs +0 -1711
- package/src/playbook.mjs +0 -257
- package/src/pr-agent.mjs +0 -214
- package/src/predictive.mjs +0 -250
- package/src/profile.mjs +0 -1411
- package/src/prompt-audit.mjs +0 -231
- package/src/prompt-intel.mjs +0 -325
- package/src/provider-context.mjs +0 -257
- package/src/receipt.mjs +0 -344
- package/src/recommendations.mjs +0 -296
- package/src/redact.mjs +0 -192
- package/src/replit.mjs +0 -1210
- package/src/repo.mjs +0 -445
- package/src/revert.mjs +0 -149
- package/src/routing-advisor.mjs +0 -204
- package/src/self-correct.mjs +0 -147
- package/src/session-lock.mjs +0 -160
- package/src/session.mjs +0 -1655
- package/src/settings-tui.mjs +0 -373
- package/src/setup-flow.mjs +0 -223
- package/src/signal.mjs +0 -115
- package/src/simmer.mjs +0 -241
- package/src/strategy.mjs +0 -235
- package/src/subscription.mjs +0 -212
- package/src/templates.mjs +0 -260
- package/src/think-engine.mjs +0 -428
- package/src/tui.mjs +0 -276
- package/src/update-check.mjs +0 -35
- package/src/wave-planner.mjs +0 -294
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
// Cognitive Loop — the integration layer that makes HEAD a continuous process.
|
|
2
|
+
// Replaces single-shot deliberation with: perceive → plan → predict → dispatch → debrief → replan → ...
|
|
3
|
+
import { processTurn, loadState, recordDispatchOutcome } from './head.js';
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
import { planWaves, shouldReplan, replan } from './wave-planner.js';
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
import { parseDebrief, generateDebriefInstruction, integrateDebrief, summarizeWaveOutcome } from './debrief.js';
|
|
8
|
+
import { predictFailureModes, generatePreventions, scoreDispatchReadiness, evolvePatterns, loadSessionPatterns } from './predictive.js';
|
|
9
|
+
import { writeDeliberation } from './head-protocol.js';
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
import { generateInboxBrief, purge as purgeInbox } from './inbox.js';
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
import * as memoryTiers from './memory-tiers.js';
|
|
14
|
+
import * as narrative from './narrative.js';
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
import * as simmer from './simmer.js';
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
import { build as buildEnvelope } from './envelope.js';
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
import { acquire as acquireSession, release as releaseSession } from './session-lock.js';
|
|
21
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
// ── Pattern cache ──────────────────────────────────────────────────────────
|
|
24
|
+
let _patternsCache = null;
|
|
25
|
+
let _patternsCacheTs = 0;
|
|
26
|
+
function getCachedPatterns() {
|
|
27
|
+
if (!_patternsCache || Date.now() - _patternsCacheTs > 5000) {
|
|
28
|
+
_patternsCache = loadSessionPatterns();
|
|
29
|
+
_patternsCacheTs = Date.now();
|
|
30
|
+
}
|
|
31
|
+
return _patternsCache;
|
|
32
|
+
}
|
|
33
|
+
const LOOP_STATE_DIR = join(process.cwd(), '.dualbrain');
|
|
34
|
+
const LOOP_STATE_FILE = join(LOOP_STATE_DIR, 'cognitive-loop.json');
|
|
35
|
+
// ── Loop state persistence ──────────────────────────────────────────────────
|
|
36
|
+
function loadLoopState() {
|
|
37
|
+
try {
|
|
38
|
+
if (existsSync(LOOP_STATE_FILE)) {
|
|
39
|
+
return JSON.parse(readFileSync(LOOP_STATE_FILE, 'utf8'));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch { }
|
|
43
|
+
return freshLoopState();
|
|
44
|
+
}
|
|
45
|
+
function freshLoopState() {
|
|
46
|
+
return {
|
|
47
|
+
sessionId: Date.now().toString(36),
|
|
48
|
+
activePlan: null,
|
|
49
|
+
completedWaves: [],
|
|
50
|
+
debriefs: [],
|
|
51
|
+
situationHistory: [],
|
|
52
|
+
replans: 0,
|
|
53
|
+
totalDispatches: 0,
|
|
54
|
+
totalTokensEstimated: 0,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function saveLoopState(state) {
|
|
58
|
+
mkdirSync(LOOP_STATE_DIR, { recursive: true });
|
|
59
|
+
writeFileSync(LOOP_STATE_FILE, JSON.stringify(state, null, 2));
|
|
60
|
+
}
|
|
61
|
+
// ── The cognitive loop ──────────────────────────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Entry point: process a user message through the full cognitive loop.
|
|
64
|
+
* Returns a LoopResult that tells the caller exactly what to do next.
|
|
65
|
+
*/
|
|
66
|
+
export function enter(userMessage, context = {}) {
|
|
67
|
+
// Session lock: one HEAD at a time
|
|
68
|
+
const lock = acquireSession();
|
|
69
|
+
if (!lock.acquired) {
|
|
70
|
+
return {
|
|
71
|
+
phase: 'readonly',
|
|
72
|
+
action: { type: 'respond', mode: 'readonly' },
|
|
73
|
+
rationale: `Another session (${lock.existingSession}) is active. This session is read-only to prevent split-brain.`,
|
|
74
|
+
shouldAskUser: false,
|
|
75
|
+
surfaceNoticings: [],
|
|
76
|
+
plan: null,
|
|
77
|
+
nextDispatch: null,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const headState = loadState();
|
|
81
|
+
const loopState = loadLoopState();
|
|
82
|
+
// Check if we just auto-updated — surface it naturally
|
|
83
|
+
_checkUpdateNotice(context);
|
|
84
|
+
// Immersion: load memory tiers so HEAD is "in the song"
|
|
85
|
+
const memory = memoryTiers.assemble({
|
|
86
|
+
userMessage,
|
|
87
|
+
files: context.files || [],
|
|
88
|
+
intent: context._detectedIntent || undefined,
|
|
89
|
+
});
|
|
90
|
+
if (memory.combined) {
|
|
91
|
+
context._immersionContext = memory.combined;
|
|
92
|
+
}
|
|
93
|
+
// Check inbox for HEAD before processing
|
|
94
|
+
const inboxBrief = generateInboxBrief('head');
|
|
95
|
+
if (inboxBrief) {
|
|
96
|
+
context._inboxBrief = inboxBrief;
|
|
97
|
+
}
|
|
98
|
+
// Simmer: check for crystallized ideas to surface
|
|
99
|
+
const crystallized = simmer.harvest();
|
|
100
|
+
if (crystallized.length > 0) {
|
|
101
|
+
context._crystallizedIdeas = crystallized.map((i) => i.idea);
|
|
102
|
+
}
|
|
103
|
+
// Phase 1: Full cognitive pipeline
|
|
104
|
+
const turn = processTurn(headState, userMessage, context);
|
|
105
|
+
// Save situation for history (includes mode for turn-over-turn tracking)
|
|
106
|
+
const mode = turn.situation?.mode || { primary: 'work', confidence: 0.5 };
|
|
107
|
+
loopState.situationHistory.push({
|
|
108
|
+
ts: Date.now(),
|
|
109
|
+
depth: turn.depth,
|
|
110
|
+
action: turn.action.type,
|
|
111
|
+
confidence: turn.result.confidence.score,
|
|
112
|
+
mode: mode.primary,
|
|
113
|
+
});
|
|
114
|
+
// Surface update notice as a noticing
|
|
115
|
+
if (context._updateNotice) {
|
|
116
|
+
turn.result.surfaceNoticings = turn.result.surfaceNoticings || [];
|
|
117
|
+
turn.result.surfaceNoticings.unshift({
|
|
118
|
+
type: 'update',
|
|
119
|
+
severity: 'low',
|
|
120
|
+
observation: context._updateNotice,
|
|
121
|
+
shouldSurface: true,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Narrative evolution: update HEAD's running understanding
|
|
125
|
+
_evolveNarrative(turn, userMessage, context);
|
|
126
|
+
// Simmer: capture any ideas from user message that aren't direct tasks
|
|
127
|
+
_captureSimmerSignals(userMessage, turn);
|
|
128
|
+
// If HEAD says don't dispatch, or it's a "proceed" with no active plan, respond
|
|
129
|
+
if ((!turn.shouldDispatch && !turn.shouldThink) || (turn.action.type === 'proceed' && !loopState.activePlan)) {
|
|
130
|
+
saveLoopState(loopState);
|
|
131
|
+
return {
|
|
132
|
+
phase: 'respond',
|
|
133
|
+
action: turn.action,
|
|
134
|
+
rationale: turn.rationale,
|
|
135
|
+
shouldAskUser: turn.shouldAskUser,
|
|
136
|
+
surfaceNoticings: turn.result.surfaceNoticings,
|
|
137
|
+
plan: null,
|
|
138
|
+
nextDispatch: null,
|
|
139
|
+
mode,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// Persist deliberation artifact for deliberation-gate hook validation
|
|
143
|
+
try {
|
|
144
|
+
writeDeliberation(userMessage, { situation: turn.situation, result: turn.result });
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
// Non-fatal: don't break the loop if deliberation persistence fails
|
|
148
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
149
|
+
process.stderr.write(`[cognitive-loop] writeDeliberation failed: ${message.slice(0, 120)}\n`);
|
|
150
|
+
}
|
|
151
|
+
// Phase 2: Plan waves
|
|
152
|
+
const plan = planWaves(turn, {
|
|
153
|
+
files: context.files || [],
|
|
154
|
+
priorDebriefs: loopState.debriefs,
|
|
155
|
+
diagnosticPatterns: getCachedPatterns(),
|
|
156
|
+
});
|
|
157
|
+
loopState.activePlan = plan;
|
|
158
|
+
saveLoopState(loopState);
|
|
159
|
+
// Phase 3: Prepare first wave for dispatch
|
|
160
|
+
const firstWave = plan.waves?.[0];
|
|
161
|
+
if (!firstWave) {
|
|
162
|
+
return {
|
|
163
|
+
phase: 'respond',
|
|
164
|
+
action: turn.action,
|
|
165
|
+
rationale: 'Wave planner produced empty plan — falling back to direct response',
|
|
166
|
+
shouldAskUser: true,
|
|
167
|
+
surfaceNoticings: turn.result.surfaceNoticings,
|
|
168
|
+
plan,
|
|
169
|
+
nextDispatch: null,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const prepared = prepareWave(firstWave, turn, context, loopState);
|
|
173
|
+
// Don't dispatch unready work — return as blocked
|
|
174
|
+
if (prepared.blockers.length > 0 && !prepared.allReady) {
|
|
175
|
+
saveLoopState(loopState);
|
|
176
|
+
return {
|
|
177
|
+
phase: 'blocked',
|
|
178
|
+
action: turn.action,
|
|
179
|
+
rationale: turn.rationale,
|
|
180
|
+
shouldAskUser: true,
|
|
181
|
+
surfaceNoticings: turn.result.surfaceNoticings,
|
|
182
|
+
plan,
|
|
183
|
+
nextDispatch: prepared,
|
|
184
|
+
suggestion: prepared.blockers[0],
|
|
185
|
+
mode,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
phase: 'dispatch',
|
|
190
|
+
action: turn.action,
|
|
191
|
+
rationale: turn.rationale,
|
|
192
|
+
shouldAskUser: turn.shouldAskUser,
|
|
193
|
+
surfaceNoticings: turn.result.surfaceNoticings,
|
|
194
|
+
plan,
|
|
195
|
+
nextDispatch: prepared,
|
|
196
|
+
estimatedCost: plan.estimatedCost,
|
|
197
|
+
mode,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Called after a wave completes. Processes debriefs and determines next action.
|
|
202
|
+
*/
|
|
203
|
+
export function advance(rawResults, completedWaveId, context = {}) {
|
|
204
|
+
const loopState = loadLoopState();
|
|
205
|
+
const plan = loopState.activePlan;
|
|
206
|
+
if (!plan) {
|
|
207
|
+
return { phase: 'done', action: { type: 'respond', mode: 'direct' }, rationale: 'No active plan', plan: null, nextDispatch: null };
|
|
208
|
+
}
|
|
209
|
+
// Parse debriefs from raw results
|
|
210
|
+
const debriefs = rawResults.map((r) => parseDebrief(r));
|
|
211
|
+
// Track dispatch outcomes in HEAD state for self-awareness
|
|
212
|
+
const headState = loadState();
|
|
213
|
+
for (const d of debriefs) {
|
|
214
|
+
recordDispatchOutcome(headState, { type: d.artifacts?.tier || 'execute', objective: completedWaveId, status: d.status, durationMs: 0 });
|
|
215
|
+
}
|
|
216
|
+
const waveSummary = summarizeWaveOutcome(debriefs);
|
|
217
|
+
// Bridge field names between debrief (scopeDelta) and wave-planner (scopeChange)
|
|
218
|
+
waveSummary.scopeChange = waveSummary.scopeDelta;
|
|
219
|
+
waveSummary.confidence = waveSummary.aggregateConfidence;
|
|
220
|
+
waveSummary.blockers = waveSummary.allBlockers;
|
|
221
|
+
// Record
|
|
222
|
+
loopState.debriefs.push(...debriefs);
|
|
223
|
+
loopState.completedWaves.push(completedWaveId);
|
|
224
|
+
// Evolve prediction accuracy
|
|
225
|
+
const predictions = loopState._lastPredictions || [];
|
|
226
|
+
for (const d of debriefs) {
|
|
227
|
+
evolvePatterns(d, predictions);
|
|
228
|
+
}
|
|
229
|
+
// Post-wave verbal reflection (Reflexion pattern)
|
|
230
|
+
_postWaveReflection(waveSummary, loopState);
|
|
231
|
+
// Check if we need to replan
|
|
232
|
+
const needsReplan = shouldReplan(plan, waveSummary);
|
|
233
|
+
let activePlan = plan;
|
|
234
|
+
if (needsReplan) {
|
|
235
|
+
// Integrate each debrief into situation progressively
|
|
236
|
+
let updatedSituation = (loopState.situationHistory[loopState.situationHistory.length - 1] || {});
|
|
237
|
+
for (const d of debriefs) {
|
|
238
|
+
updatedSituation = integrateDebrief(updatedSituation, d);
|
|
239
|
+
}
|
|
240
|
+
activePlan = replan(plan, waveSummary, { situation: updatedSituation, result: { depth: plan._depth || 'full' } });
|
|
241
|
+
loopState.activePlan = activePlan;
|
|
242
|
+
loopState.replans++;
|
|
243
|
+
}
|
|
244
|
+
// Find next wave to dispatch
|
|
245
|
+
const nextWave = activePlan.waves.find((w) => !loopState.completedWaves.includes(w.id));
|
|
246
|
+
if (!nextWave) {
|
|
247
|
+
// All waves done — synthesize
|
|
248
|
+
const finalSummary = summarizeWaveOutcome(loopState.debriefs);
|
|
249
|
+
// Clean expired inbox messages now that all work is complete
|
|
250
|
+
try {
|
|
251
|
+
purgeInbox();
|
|
252
|
+
}
|
|
253
|
+
catch { /* non-fatal */ }
|
|
254
|
+
saveLoopState(loopState);
|
|
255
|
+
return {
|
|
256
|
+
phase: 'done',
|
|
257
|
+
action: { type: 'synthesize', mode: 'complete' },
|
|
258
|
+
rationale: `All ${loopState.completedWaves.length} waves complete. ${loopState.replans} replan(s).`,
|
|
259
|
+
plan: activePlan,
|
|
260
|
+
nextDispatch: null,
|
|
261
|
+
waveSummary: finalSummary,
|
|
262
|
+
replanned: needsReplan,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
// Check gate condition
|
|
266
|
+
if (nextWave.gateCondition) {
|
|
267
|
+
const gateMet = evaluateGate(nextWave.gateCondition, waveSummary, loopState);
|
|
268
|
+
if (!gateMet) {
|
|
269
|
+
saveLoopState(loopState);
|
|
270
|
+
return {
|
|
271
|
+
phase: 'gated',
|
|
272
|
+
action: { type: 'pause', mode: 'gate-unmet' },
|
|
273
|
+
rationale: `Gate condition not met: ${nextWave.gateCondition}`,
|
|
274
|
+
plan: activePlan,
|
|
275
|
+
nextDispatch: null,
|
|
276
|
+
waveSummary,
|
|
277
|
+
gateCondition: nextWave.gateCondition,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Prepare next wave
|
|
282
|
+
const lastDeliberation = { situation: context, result: { depth: activePlan._depth || 'full' } };
|
|
283
|
+
const prepared = prepareWave(nextWave, lastDeliberation, { ...context, priorDebriefs: loopState.debriefs }, loopState);
|
|
284
|
+
saveLoopState(loopState);
|
|
285
|
+
return {
|
|
286
|
+
phase: 'dispatch',
|
|
287
|
+
action: { type: 'dispatch', mode: nextWave.phase },
|
|
288
|
+
rationale: `Wave ${loopState.completedWaves.length + 1}/${activePlan.waves.length}: ${nextWave.phase}`,
|
|
289
|
+
plan: activePlan,
|
|
290
|
+
nextDispatch: prepared,
|
|
291
|
+
waveSummary,
|
|
292
|
+
replanned: needsReplan,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Prepare a wave for dispatch: run predictions, generate preventions, check readiness.
|
|
297
|
+
*/
|
|
298
|
+
function prepareWave(wave, deliberation, context, loopState) {
|
|
299
|
+
const agents = wave.agents.map((agentSpec) => {
|
|
300
|
+
// Predict failure modes for this agent
|
|
301
|
+
const predictions = predictFailureModes(agentSpec, {
|
|
302
|
+
patterns: getCachedPatterns(),
|
|
303
|
+
priorFailures: (context.priorDebriefs || []),
|
|
304
|
+
});
|
|
305
|
+
// Generate prevention instructions
|
|
306
|
+
const preventions = generatePreventions(predictions);
|
|
307
|
+
// Generate debrief instruction
|
|
308
|
+
const debriefInstruction = generateDebriefInstruction(agentSpec.tier, {
|
|
309
|
+
scope: typeof agentSpec.scope === 'string' ? agentSpec.scope : undefined,
|
|
310
|
+
});
|
|
311
|
+
// Score readiness
|
|
312
|
+
const readiness = scoreDispatchReadiness(agentSpec, { waves: [wave] }, predictions);
|
|
313
|
+
// Check inbox for messages relevant to this worker tier
|
|
314
|
+
const workerInbox = generateInboxBrief(`worker:${agentSpec.tier}`);
|
|
315
|
+
return {
|
|
316
|
+
...agentSpec,
|
|
317
|
+
preventions,
|
|
318
|
+
debriefInstruction,
|
|
319
|
+
readiness,
|
|
320
|
+
predictions,
|
|
321
|
+
prompt: buildAgentPrompt(agentSpec, preventions, debriefInstruction, workerInbox),
|
|
322
|
+
};
|
|
323
|
+
});
|
|
324
|
+
// Store predictions for later evolution
|
|
325
|
+
loopState._lastPredictions = agents.flatMap((a) => a.predictions);
|
|
326
|
+
return {
|
|
327
|
+
waveId: wave.id,
|
|
328
|
+
phase: wave.phase,
|
|
329
|
+
parallel: wave.parallel,
|
|
330
|
+
agents,
|
|
331
|
+
allReady: agents.every((a) => a.readiness.ready),
|
|
332
|
+
blockers: agents.flatMap((a) => a.readiness.blockers),
|
|
333
|
+
warnings: agents.flatMap((a) => a.readiness.warnings),
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Build the full prompt for an agent using dispatch envelopes.
|
|
338
|
+
* Workers get understanding (prose preamble), not just instructions.
|
|
339
|
+
*/
|
|
340
|
+
function buildAgentPrompt(agentSpec, preventions, debriefInstruction, inboxBrief) {
|
|
341
|
+
const envelope = buildEnvelope(agentSpec, {
|
|
342
|
+
preventions: typeof preventions === 'string' ? preventions : undefined,
|
|
343
|
+
debriefInstruction,
|
|
344
|
+
inboxBrief: inboxBrief ?? undefined,
|
|
345
|
+
});
|
|
346
|
+
return envelope.full;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Evaluate a wave gate condition against the current state.
|
|
350
|
+
*/
|
|
351
|
+
function evaluateGate(condition, waveSummary, loopState) {
|
|
352
|
+
const lower = condition.toLowerCase();
|
|
353
|
+
if (lower.includes('confidence') && lower.includes('above')) {
|
|
354
|
+
const threshold = parseFloat(condition.match(/[\d.]+/)?.[0] || '0.5');
|
|
355
|
+
return (waveSummary.aggregateConfidence || 0) >= threshold;
|
|
356
|
+
}
|
|
357
|
+
if (lower.includes('no blocker')) {
|
|
358
|
+
return (waveSummary.allBlockers || []).length === 0;
|
|
359
|
+
}
|
|
360
|
+
if (lower.includes('scope confirmed')) {
|
|
361
|
+
return waveSummary.scopeDelta === 'same' || waveSummary.scopeDelta === 'smaller';
|
|
362
|
+
}
|
|
363
|
+
// Default: gate passes
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
// ── Immersion helpers ──────────────────────────────────────────────────────
|
|
367
|
+
/**
|
|
368
|
+
* Evolve HEAD's running narrative after processing a turn.
|
|
369
|
+
* Captures: what happened, what was decided, what the user cared about.
|
|
370
|
+
*/
|
|
371
|
+
function _evolveNarrative(turn, userMessage, context) {
|
|
372
|
+
const parts = [];
|
|
373
|
+
const t = turn;
|
|
374
|
+
// What the user said (compressed)
|
|
375
|
+
const userSnippet = userMessage.length > 120 ? userMessage.slice(0, 120) + '...' : userMessage;
|
|
376
|
+
parts.push(`User: "${userSnippet}"`);
|
|
377
|
+
// What HEAD decided
|
|
378
|
+
const action = t.action;
|
|
379
|
+
if (action.type === 'dispatch') {
|
|
380
|
+
parts.push(`Decision: dispatch ${action.mode || 'work'} (confidence: ${t.result.confidence.score})`);
|
|
381
|
+
}
|
|
382
|
+
else if (action.type === 'respond') {
|
|
383
|
+
parts.push(`Decision: respond directly (${t.depth} depth)`);
|
|
384
|
+
}
|
|
385
|
+
else if (action.type === 'clarify') {
|
|
386
|
+
parts.push(`Decision: need clarification`);
|
|
387
|
+
}
|
|
388
|
+
// Noticings worth remembering
|
|
389
|
+
if (t.result.surfaceNoticings?.length) {
|
|
390
|
+
parts.push(`Noticed: ${t.result.surfaceNoticings.join('; ')}`);
|
|
391
|
+
}
|
|
392
|
+
// Crystallized simmer items surfaced this turn
|
|
393
|
+
if (context._crystallizedIdeas?.length) {
|
|
394
|
+
parts.push(`Crystallized ideas surfaced: ${context._crystallizedIdeas.join('; ')}`);
|
|
395
|
+
}
|
|
396
|
+
narrative.evolve(parts.join('. '));
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Capture signals from user message that might be simmer-worthy.
|
|
400
|
+
* Looks for: analogies, "what if" ideas, vague suggestions, meta-observations.
|
|
401
|
+
*/
|
|
402
|
+
function _captureSimmerSignals(userMessage, turn) {
|
|
403
|
+
const lower = userMessage.toLowerCase();
|
|
404
|
+
const t = turn;
|
|
405
|
+
// Skip short/command messages
|
|
406
|
+
if (userMessage.length < 30)
|
|
407
|
+
return;
|
|
408
|
+
// Detect idea-like patterns
|
|
409
|
+
const ideaPatterns = [
|
|
410
|
+
/what if (.{10,80})/i,
|
|
411
|
+
/maybe (?:we |it |this )(.{10,80})/i,
|
|
412
|
+
/i feel like (.{10,80})/i,
|
|
413
|
+
/(?:like|similar to) (.{10,80}?)(?: - | — |\.|\?|$)/i,
|
|
414
|
+
/consider (.{10,80})/i,
|
|
415
|
+
];
|
|
416
|
+
for (const pattern of ideaPatterns) {
|
|
417
|
+
const match = userMessage.match(pattern);
|
|
418
|
+
if (match) {
|
|
419
|
+
simmer.add(match[0].slice(0, 120), { origin: 'user-message' });
|
|
420
|
+
return; // One simmer per message max
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// If the message is exploratory (questions about approach) and depth is "full" or "deep",
|
|
424
|
+
// the whole message might be worth simmering
|
|
425
|
+
if (t.depth === 'deep' && /\?/.test(userMessage) && userMessage.length > 60) {
|
|
426
|
+
const isExploration = /how|should|could|what about|think/i.test(lower);
|
|
427
|
+
if (isExploration) {
|
|
428
|
+
simmer.add(userMessage.slice(0, 150), { origin: 'exploratory-question', initialHeat: 1.5 });
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Post-wave narrative reflection — called after advance() processes debriefs.
|
|
434
|
+
* This is the verbal self-reflection piece (Reflexion pattern).
|
|
435
|
+
*/
|
|
436
|
+
function _postWaveReflection(waveSummary, loopState) {
|
|
437
|
+
const parts = [];
|
|
438
|
+
parts.push(`Wave ${loopState.completedWaves.length} complete.`);
|
|
439
|
+
if (waveSummary.aggregateConfidence != null) {
|
|
440
|
+
parts.push(`Confidence: ${waveSummary.aggregateConfidence.toFixed(2)}`);
|
|
441
|
+
}
|
|
442
|
+
if (waveSummary.allBlockers?.length) {
|
|
443
|
+
parts.push(`Blockers emerged: ${waveSummary.allBlockers.join('; ')}`);
|
|
444
|
+
}
|
|
445
|
+
if (waveSummary.scopeDelta && waveSummary.scopeDelta !== 'same') {
|
|
446
|
+
parts.push(`Scope shifted: ${waveSummary.scopeDelta}`);
|
|
447
|
+
}
|
|
448
|
+
if (loopState.replans > 0) {
|
|
449
|
+
parts.push(`Replanned ${loopState.replans} time(s) — adapting to reality.`);
|
|
450
|
+
}
|
|
451
|
+
narrative.evolve(parts.join(' '));
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Check for update notice and surface it to HEAD's awareness.
|
|
455
|
+
*/
|
|
456
|
+
function _checkUpdateNotice(context) {
|
|
457
|
+
try {
|
|
458
|
+
const noticeFile = join(LOOP_STATE_DIR, '.update-notice');
|
|
459
|
+
if (!existsSync(noticeFile))
|
|
460
|
+
return;
|
|
461
|
+
const notice = JSON.parse(readFileSync(noticeFile, 'utf8'));
|
|
462
|
+
if (Date.now() - notice.ts < 5 * 60 * 1000) {
|
|
463
|
+
context._updateNotice = `Updated dual-brain ${notice.from} → ${notice.to}`;
|
|
464
|
+
}
|
|
465
|
+
// Clear it after reading (one-shot)
|
|
466
|
+
try {
|
|
467
|
+
writeFileSync(noticeFile, '');
|
|
468
|
+
}
|
|
469
|
+
catch { }
|
|
470
|
+
}
|
|
471
|
+
catch { }
|
|
472
|
+
}
|
|
473
|
+
// ── Query functions ─────────────────────────────────────────────────────────
|
|
474
|
+
export function getActivePlan() {
|
|
475
|
+
return loadLoopState().activePlan;
|
|
476
|
+
}
|
|
477
|
+
export function getLoopStatus() {
|
|
478
|
+
const state = loadLoopState();
|
|
479
|
+
return {
|
|
480
|
+
hasActivePlan: !!state.activePlan,
|
|
481
|
+
completedWaves: state.completedWaves.length,
|
|
482
|
+
totalWaves: state.activePlan?.waves?.length || 0,
|
|
483
|
+
replans: state.replans,
|
|
484
|
+
totalDispatches: state.totalDispatches,
|
|
485
|
+
debriefCount: state.debriefs.length,
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
export function resetLoop() {
|
|
489
|
+
saveLoopState(freshLoopState());
|
|
490
|
+
releaseSession();
|
|
491
|
+
}
|
|
492
|
+
export function shutdown() {
|
|
493
|
+
releaseSession();
|
|
494
|
+
}
|
|
495
|
+
//# sourceMappingURL=cognitive-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cognitive-loop.js","sourceRoot":"","sources":["../../src/cognitive-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
export interface Finding {
|
|
2
|
+
agentId: string;
|
|
3
|
+
type: string;
|
|
4
|
+
content: string;
|
|
5
|
+
confidence: number;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
}
|
|
8
|
+
export interface Decision {
|
|
9
|
+
agentId: string;
|
|
10
|
+
decision: string;
|
|
11
|
+
rationale: string;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
}
|
|
14
|
+
export interface Warning {
|
|
15
|
+
agentId: string;
|
|
16
|
+
severity: string;
|
|
17
|
+
message: string;
|
|
18
|
+
timestamp: number;
|
|
19
|
+
}
|
|
20
|
+
export interface Blackboard {
|
|
21
|
+
findings: Finding[];
|
|
22
|
+
files: Set<string> | string[];
|
|
23
|
+
decisions: Decision[];
|
|
24
|
+
warnings: Warning[];
|
|
25
|
+
context: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
export interface Agent {
|
|
28
|
+
id: string;
|
|
29
|
+
role: string;
|
|
30
|
+
provider: string;
|
|
31
|
+
model: string | null;
|
|
32
|
+
status: 'registered' | 'running' | 'completed' | 'failed';
|
|
33
|
+
startedAt: number | null;
|
|
34
|
+
completedAt: number | null;
|
|
35
|
+
result: unknown;
|
|
36
|
+
summary: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface CollaborationEvent {
|
|
39
|
+
type: string;
|
|
40
|
+
agentId: string;
|
|
41
|
+
data: unknown;
|
|
42
|
+
timestamp: number;
|
|
43
|
+
}
|
|
44
|
+
export interface ChainStage {
|
|
45
|
+
index: number;
|
|
46
|
+
role: string;
|
|
47
|
+
tier: string;
|
|
48
|
+
promptTemplate: (session: CollaborationSession) => string;
|
|
49
|
+
provider: string;
|
|
50
|
+
model: string | null;
|
|
51
|
+
dependsOn: number[];
|
|
52
|
+
}
|
|
53
|
+
export interface CollaborationSession {
|
|
54
|
+
id: string;
|
|
55
|
+
objective: string;
|
|
56
|
+
created: number;
|
|
57
|
+
status: string;
|
|
58
|
+
blackboard: Blackboard;
|
|
59
|
+
agents: Agent[];
|
|
60
|
+
events: CollaborationEvent[];
|
|
61
|
+
chain: ChainStage[] | null;
|
|
62
|
+
currentStage: number;
|
|
63
|
+
crossReview: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface SynthesisResult {
|
|
66
|
+
sessionId: string;
|
|
67
|
+
objective: string;
|
|
68
|
+
status: string;
|
|
69
|
+
agents: {
|
|
70
|
+
total: number;
|
|
71
|
+
completed: number;
|
|
72
|
+
failed: number;
|
|
73
|
+
running: number;
|
|
74
|
+
};
|
|
75
|
+
summaries: Array<{
|
|
76
|
+
role: string;
|
|
77
|
+
provider: string;
|
|
78
|
+
model: string | null;
|
|
79
|
+
summary: string | null;
|
|
80
|
+
durationMs: number;
|
|
81
|
+
}>;
|
|
82
|
+
findings: number;
|
|
83
|
+
decisions: Decision[];
|
|
84
|
+
warnings: Warning[];
|
|
85
|
+
filesAffected: string[];
|
|
86
|
+
totalDurationMs: number;
|
|
87
|
+
eventCount: number;
|
|
88
|
+
}
|
|
89
|
+
export interface CrossReviewResult {
|
|
90
|
+
prompt: string;
|
|
91
|
+
provider: string;
|
|
92
|
+
model: string | null;
|
|
93
|
+
tier: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create a fresh collaboration session.
|
|
97
|
+
*/
|
|
98
|
+
export declare function createSession(taskId: string | null, objective: string, opts?: {
|
|
99
|
+
chain?: ChainStage[] | null;
|
|
100
|
+
crossReview?: boolean;
|
|
101
|
+
}): CollaborationSession;
|
|
102
|
+
export declare function addFinding(session: CollaborationSession, agentId: string, type: string, content: string, confidence?: number): void;
|
|
103
|
+
export declare function addDecision(session: CollaborationSession, agentId: string, decision: string, rationale: string): void;
|
|
104
|
+
export declare function addWarning(session: CollaborationSession, agentId: string, severity: string, message: string): void;
|
|
105
|
+
export declare function setContext(session: CollaborationSession, key: string, value: unknown, agentId?: string): void;
|
|
106
|
+
export declare function trackFile(session: CollaborationSession, filePath: string, agentId: string): void;
|
|
107
|
+
export declare function registerAgent(session: CollaborationSession, agentId: string, role: string, provider: string, model: string): Agent;
|
|
108
|
+
export declare function startAgent(session: CollaborationSession, agentId: string): void;
|
|
109
|
+
export declare function completeAgent(session: CollaborationSession, agentId: string, result: unknown, summary?: string): void;
|
|
110
|
+
/**
|
|
111
|
+
* Build a context injection string for the next agent in the collaboration.
|
|
112
|
+
*/
|
|
113
|
+
export declare function buildAgentContext(session: CollaborationSession, forAgentId: string, maxTokens?: number): string;
|
|
114
|
+
export declare function defineChain(stages: Array<{
|
|
115
|
+
role: string;
|
|
116
|
+
tier?: string;
|
|
117
|
+
promptTemplate: (session: CollaborationSession) => string;
|
|
118
|
+
provider?: string;
|
|
119
|
+
model?: string | null;
|
|
120
|
+
}>): ChainStage[];
|
|
121
|
+
export declare function getNextStage(session: CollaborationSession): ChainStage | null;
|
|
122
|
+
export declare function advanceChain(session: CollaborationSession): boolean;
|
|
123
|
+
export declare function buildChainPrompt(session: CollaborationSession, stage: ChainStage): string;
|
|
124
|
+
export declare function buildCrossReviewPrompt(session: CollaborationSession, agentId: string, availableProviders?: string[]): CrossReviewResult | null;
|
|
125
|
+
export declare function synthesize(session: CollaborationSession): SynthesisResult;
|
|
126
|
+
export declare function planCodeReviewChain(objective: string, scope: string[], opts?: {
|
|
127
|
+
planProvider?: string;
|
|
128
|
+
planModel?: string;
|
|
129
|
+
codeProvider?: string;
|
|
130
|
+
codeModel?: string;
|
|
131
|
+
reviewProvider?: string;
|
|
132
|
+
reviewModel?: string;
|
|
133
|
+
}): ChainStage[];
|
|
134
|
+
export declare function researchSynthesizePattern(question: string, sources: string[], opts?: {
|
|
135
|
+
altProvider?: string;
|
|
136
|
+
researchModel?: string;
|
|
137
|
+
synthProvider?: string;
|
|
138
|
+
synthModel?: string;
|
|
139
|
+
}): ChainStage[];
|
|
140
|
+
export declare function dualReviewPattern(files: string[], context: string, opts?: {
|
|
141
|
+
claudeModel?: string;
|
|
142
|
+
openaiModel?: string;
|
|
143
|
+
reconcileModel?: string;
|
|
144
|
+
}): ChainStage[];
|
|
145
|
+
export declare function saveSession(session: CollaborationSession, cwd?: string): void;
|
|
146
|
+
export declare function loadSession(sessionId: string, cwd?: string): CollaborationSession | null;
|
|
147
|
+
export declare function persistEvents(session: CollaborationSession, cwd?: string): void;
|