dual-brain 0.2.30 → 0.3.1
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/precompact.mjs +3 -3
- package/hooks/session-end.mjs +3 -3
- package/hooks/task-classifier.mjs +328 -0
- package/hooks/vibe-router.mjs +387 -0
- package/install.mjs +2 -2
- 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,32 @@
|
|
|
1
|
+
interface AnalysisResult {
|
|
2
|
+
specificity: number;
|
|
3
|
+
signals: {
|
|
4
|
+
hasFileRefs: boolean;
|
|
5
|
+
hasTechTerms: boolean;
|
|
6
|
+
hasExactInstructions: boolean;
|
|
7
|
+
isVague: boolean;
|
|
8
|
+
wordCount: number;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function analyzeInput(input: string | null | undefined): AnalysisResult;
|
|
12
|
+
export declare function detectCorrection(input: string | null | undefined): boolean;
|
|
13
|
+
export interface Calibration {
|
|
14
|
+
specificity?: number;
|
|
15
|
+
corrections?: number;
|
|
16
|
+
autonomy?: number;
|
|
17
|
+
interactions?: number;
|
|
18
|
+
lastUpdated?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function updateCalibration(calibration: Calibration, input: string, correction?: boolean): Calibration;
|
|
21
|
+
interface Adaptation {
|
|
22
|
+
clarifyBeforeActing: boolean;
|
|
23
|
+
explainReasoning: boolean;
|
|
24
|
+
suggestNextSteps: boolean;
|
|
25
|
+
askForApproval: boolean;
|
|
26
|
+
autoExecute: boolean;
|
|
27
|
+
responseStyle: 'terse' | 'normal' | 'detailed';
|
|
28
|
+
userLevel: 'advanced' | 'intermediate' | 'beginner';
|
|
29
|
+
}
|
|
30
|
+
export declare function getAdaptation(calibration: Calibration): Adaptation;
|
|
31
|
+
export declare function formatCalibration(calibration: Calibration): string;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// User calibration module — tracks specificity, corrections, and autonomy signals
|
|
2
|
+
// to adapt dual-brain behavior to any user from vague vibe-coder to precise expert.
|
|
3
|
+
const FILE_REF_RE = /(?:src\/|\.mjs|\.tsx?|\.jsx?|\.json|\.ya?ml|\.sh|line\s+\d+|\bL\d+\b)/i;
|
|
4
|
+
const TECH_TERM_RE = /\b(?:regex|middleware|api|endpoint|refactor|migration|schema|auth(?:entication)?|jwt|token|hook|dispatch|pipeline|module|function|class|interface|type|import|export|async|await|promise|callback|handler|router|controller|service|repository|factory|singleton|decorator|mixin|proxy|guard|interceptor|serializer|validator|transformer|adapter|facade|strategy|observer|subscriber|emitter|stream|buffer|cache|queue|worker|thread|mutex|semaphore|socket|websocket|http|grpc|graphql|rest|orm|sql|nosql|index|query|transaction|migration|seed|fixture|mock|stub|spy|assertion|coverage|lint|typecheck|bundle|compile|transpile|minify|tree.shake|dead.code|chunk|lazy.load|ssr|csr|hydrat)\b/i;
|
|
5
|
+
const VAGUE_RE = /\b(?:idk|just|make\s+it|fix\s+it|whatever|vibes?|better|nicer|faster|cleaner|improve|help|do\s+it|yeah|sure|ok|okay|hmm|uh|er|um)\b/i;
|
|
6
|
+
const AUTONOMY_HIGH_RE = /\b(?:just\s+do\s+it|go(?:\s+ahead)?|build\s+it|ship\s+it|run\s+it|execute|do\s+it|proceed|continue|carry\s+on|handle\s+it|take\s+care|make\s+it\s+happen|yolo)\b/i;
|
|
7
|
+
const QUESTION_RE = /\?|^(?:how|what|why|when|where|which|should|can|could|would|is|are|do|does|did|will|won't|don't)\b/i;
|
|
8
|
+
const CORRECTION_RE = /^(?:no[,.]?|not\s|wrong|stop|don't|that'?s?\s+not|i\s+said|i\s+meant)\b|(?:\binstead\b|\brather\b|\bactually\b)/i;
|
|
9
|
+
export function analyzeInput(input) {
|
|
10
|
+
const text = (input || '').trim();
|
|
11
|
+
const words = text.split(/\s+/).filter(Boolean);
|
|
12
|
+
const wordCount = words.length;
|
|
13
|
+
const hasFileRefs = FILE_REF_RE.test(text);
|
|
14
|
+
const hasTechTerms = TECH_TERM_RE.test(text);
|
|
15
|
+
const hasExactInstructions = /\b(?:step\s+\d|first[,\s]|then[,\s]|finally[,\s]|specifically|exactly|must|should\s+(?:use|call|return|handle)|(?:use|call|return|throw|emit|dispatch)\s+\w)/i.test(text);
|
|
16
|
+
const isVague = VAGUE_RE.test(text.toLowerCase()) || wordCount <= 3;
|
|
17
|
+
let specificity;
|
|
18
|
+
if (hasFileRefs || /\bline\s*\d+\b|\bL\d+\b/i.test(text) || (hasTechTerms && hasExactInstructions)) {
|
|
19
|
+
specificity = 5;
|
|
20
|
+
}
|
|
21
|
+
else if (hasTechTerms && wordCount >= 6) {
|
|
22
|
+
specificity = 4;
|
|
23
|
+
}
|
|
24
|
+
else if (!isVague && wordCount >= 8) {
|
|
25
|
+
specificity = 3;
|
|
26
|
+
}
|
|
27
|
+
else if (wordCount >= 4 && !isVague) {
|
|
28
|
+
specificity = 2;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
specificity = 1;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
specificity,
|
|
35
|
+
signals: {
|
|
36
|
+
hasFileRefs,
|
|
37
|
+
hasTechTerms,
|
|
38
|
+
hasExactInstructions,
|
|
39
|
+
isVague,
|
|
40
|
+
wordCount
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function detectCorrection(input) {
|
|
45
|
+
return CORRECTION_RE.test((input || '').trim());
|
|
46
|
+
}
|
|
47
|
+
function clamp(value, min = 1, max = 5) {
|
|
48
|
+
return Math.min(max, Math.max(min, value));
|
|
49
|
+
}
|
|
50
|
+
function round1(value) {
|
|
51
|
+
return Math.round(value * 10) / 10;
|
|
52
|
+
}
|
|
53
|
+
function detectAutonomySignal(input) {
|
|
54
|
+
const text = (input || '').trim();
|
|
55
|
+
if (AUTONOMY_HIGH_RE.test(text))
|
|
56
|
+
return 5;
|
|
57
|
+
if (QUESTION_RE.test(text))
|
|
58
|
+
return 2;
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
export function updateCalibration(calibration, input, correction = false) {
|
|
62
|
+
const { specificity: newSpec } = analyzeInput(input);
|
|
63
|
+
const autonomySignal = detectAutonomySignal(input);
|
|
64
|
+
const prev = {
|
|
65
|
+
specificity: calibration.specificity ?? 3,
|
|
66
|
+
corrections: calibration.corrections ?? 3,
|
|
67
|
+
autonomy: calibration.autonomy ?? 3,
|
|
68
|
+
interactions: calibration.interactions ?? 0
|
|
69
|
+
};
|
|
70
|
+
const specificity = round1(clamp(prev.specificity * 0.7 + newSpec * 0.3));
|
|
71
|
+
const corrections = round1(clamp(correction ? prev.corrections - 0.3 : prev.corrections + 0.1));
|
|
72
|
+
let autonomy = prev.autonomy;
|
|
73
|
+
if (autonomySignal !== null) {
|
|
74
|
+
autonomy = round1(clamp(prev.autonomy * 0.7 + autonomySignal * 0.3));
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
specificity,
|
|
78
|
+
corrections,
|
|
79
|
+
autonomy,
|
|
80
|
+
interactions: prev.interactions + 1,
|
|
81
|
+
lastUpdated: new Date().toISOString()
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function getAdaptation(calibration) {
|
|
85
|
+
const s = calibration.specificity ?? 3;
|
|
86
|
+
const c = calibration.corrections ?? 3;
|
|
87
|
+
const a = calibration.autonomy ?? 3;
|
|
88
|
+
const clarifyBeforeActing = s < 2.5 || c > 3;
|
|
89
|
+
const explainReasoning = a < 3;
|
|
90
|
+
const suggestNextSteps = a < 4;
|
|
91
|
+
const askForApproval = c < 2.5;
|
|
92
|
+
const autoExecute = a > 4 && c > 3.5;
|
|
93
|
+
let responseStyle;
|
|
94
|
+
const combined = (s + c + a) / 3;
|
|
95
|
+
if (combined >= 4) {
|
|
96
|
+
responseStyle = 'terse';
|
|
97
|
+
}
|
|
98
|
+
else if (combined >= 2.5) {
|
|
99
|
+
responseStyle = 'normal';
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
responseStyle = 'detailed';
|
|
103
|
+
}
|
|
104
|
+
let userLevel;
|
|
105
|
+
if (s >= 4) {
|
|
106
|
+
userLevel = 'advanced';
|
|
107
|
+
}
|
|
108
|
+
else if (s >= 2.5) {
|
|
109
|
+
userLevel = 'intermediate';
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
userLevel = 'beginner';
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
clarifyBeforeActing,
|
|
116
|
+
explainReasoning,
|
|
117
|
+
suggestNextSteps,
|
|
118
|
+
askForApproval,
|
|
119
|
+
autoExecute,
|
|
120
|
+
responseStyle,
|
|
121
|
+
userLevel
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export function formatCalibration(calibration) {
|
|
125
|
+
const { userLevel, responseStyle } = getAdaptation(calibration);
|
|
126
|
+
const s = calibration.specificity ?? 3;
|
|
127
|
+
const c = calibration.corrections ?? 3;
|
|
128
|
+
const a = calibration.autonomy ?? 3;
|
|
129
|
+
const autonomyLabel = a >= 4 ? 'high autonomy' : a >= 2.5 ? 'normal autonomy' : 'low autonomy';
|
|
130
|
+
const trustLabel = c >= 4 ? 'high trust' : c >= 2.5 ? 'good trust' : 'low trust';
|
|
131
|
+
return `User: ${userLevel} · ${autonomyLabel} · ${trustLabel}\n (specificity: ${s}, corrections: ${c}, autonomy: ${a})`;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=calibration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calibration.js","sourceRoot":"","sources":["../../src/calibration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface CheckpointResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
id: string | null;
|
|
4
|
+
label: string;
|
|
5
|
+
timestamp: string;
|
|
6
|
+
}
|
|
7
|
+
interface CheckpointEntry {
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
timestamp: string;
|
|
11
|
+
type: string;
|
|
12
|
+
tag?: string;
|
|
13
|
+
status: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Check if checkpoint capability is available.
|
|
17
|
+
*/
|
|
18
|
+
export declare function hasCheckpoints(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Create a checkpoint before a risky operation.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createCheckpoint(label: string, opts?: {
|
|
23
|
+
cwd?: string;
|
|
24
|
+
}): CheckpointResult;
|
|
25
|
+
/**
|
|
26
|
+
* List recent checkpoints (most recent first, up to 20).
|
|
27
|
+
*/
|
|
28
|
+
export declare function listCheckpoints(cwd?: string): CheckpointEntry[];
|
|
29
|
+
/**
|
|
30
|
+
* Get the most recent checkpoint.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getLastCheckpoint(cwd?: string): CheckpointEntry | null;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// checkpoint.ts — Checkpoint wrapper for dual-brain execution safety.
|
|
2
|
+
// Wraps Replit's native checkpoint system with a git-based fallback.
|
|
3
|
+
// Exports: hasCheckpoints, createCheckpoint, listCheckpoints, getLastCheckpoint
|
|
4
|
+
import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
/**
|
|
8
|
+
* Check if checkpoint capability is available.
|
|
9
|
+
*/
|
|
10
|
+
export function hasCheckpoints() {
|
|
11
|
+
try {
|
|
12
|
+
// Check for Replit checkpoint binary
|
|
13
|
+
if (existsSync('/usr/local/bin/replit-checkpoint'))
|
|
14
|
+
return true;
|
|
15
|
+
execSync('which replit-checkpoint', { stdio: 'pipe', timeout: 2000 });
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a checkpoint before a risky operation.
|
|
24
|
+
*/
|
|
25
|
+
export function createCheckpoint(label, opts = {}) {
|
|
26
|
+
const cwd = opts.cwd || process.cwd();
|
|
27
|
+
const timestamp = new Date().toISOString();
|
|
28
|
+
const id = `cp-${Date.now()}`;
|
|
29
|
+
// Try Replit checkpoint first
|
|
30
|
+
if (hasCheckpoints()) {
|
|
31
|
+
try {
|
|
32
|
+
execSync('replit-checkpoint create', { cwd, stdio: 'pipe', timeout: 10000 });
|
|
33
|
+
_logCheckpoint({ id, label, timestamp, type: 'replit', status: 'created' }, cwd);
|
|
34
|
+
return { success: true, id, label, timestamp };
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Fall through to git-based checkpoint
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Fallback: git stash + tag
|
|
41
|
+
try {
|
|
42
|
+
// Stash any uncommitted changes
|
|
43
|
+
const status = execSync('git status --porcelain', { cwd, encoding: 'utf8', timeout: 5000 }).trim();
|
|
44
|
+
if (status) {
|
|
45
|
+
execSync(`git stash push -m "dual-brain-checkpoint: ${label}"`, { cwd, stdio: 'pipe', timeout: 10000 });
|
|
46
|
+
execSync('git stash pop', { cwd, stdio: 'pipe', timeout: 10000 });
|
|
47
|
+
}
|
|
48
|
+
// Create a lightweight tag
|
|
49
|
+
const safeLabel = label.replace(/[^a-zA-Z0-9-_]/g, '-').slice(0, 50);
|
|
50
|
+
const tagName = `db-checkpoint/${safeLabel}-${Date.now()}`;
|
|
51
|
+
execSync(`git tag "${tagName}"`, { cwd, stdio: 'pipe', timeout: 5000 });
|
|
52
|
+
_logCheckpoint({ id, label, timestamp, type: 'git-tag', tag: tagName, status: 'created' }, cwd);
|
|
53
|
+
return { success: true, id, label, timestamp };
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
_logCheckpoint({ id, label, timestamp, type: 'failed', status: 'failed' }, cwd);
|
|
57
|
+
return { success: false, id: null, label, timestamp };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* List recent checkpoints (most recent first, up to 20).
|
|
62
|
+
*/
|
|
63
|
+
export function listCheckpoints(cwd) {
|
|
64
|
+
const logPath = join(cwd || process.cwd(), '.dual-brain', 'checkpoints.jsonl');
|
|
65
|
+
if (!existsSync(logPath))
|
|
66
|
+
return [];
|
|
67
|
+
try {
|
|
68
|
+
return readFileSync(logPath, 'utf8')
|
|
69
|
+
.trim()
|
|
70
|
+
.split('\n')
|
|
71
|
+
.filter(Boolean)
|
|
72
|
+
.map(line => JSON.parse(line))
|
|
73
|
+
.reverse()
|
|
74
|
+
.slice(0, 20);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the most recent checkpoint.
|
|
82
|
+
*/
|
|
83
|
+
export function getLastCheckpoint(cwd) {
|
|
84
|
+
const checkpoints = listCheckpoints(cwd);
|
|
85
|
+
return checkpoints[0] || null;
|
|
86
|
+
}
|
|
87
|
+
// ─── Internal helpers ─────────────────────────────────────────────────────────
|
|
88
|
+
function _logCheckpoint(entry, cwd) {
|
|
89
|
+
const dir = join(cwd || process.cwd(), '.dual-brain');
|
|
90
|
+
mkdirSync(dir, { recursive: true });
|
|
91
|
+
const logPath = join(dir, 'checkpoints.jsonl');
|
|
92
|
+
const line = JSON.stringify(entry) + '\n';
|
|
93
|
+
try {
|
|
94
|
+
const existing = existsSync(logPath) ? readFileSync(logPath, 'utf8') : '';
|
|
95
|
+
writeFileSync(logPath, existing + line);
|
|
96
|
+
}
|
|
97
|
+
catch { /* non-fatal */ }
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect CI system in use.
|
|
3
|
+
* @param {string} [cwd]
|
|
4
|
+
* @returns {{ systems: string[], primary: string|null }}
|
|
5
|
+
*/
|
|
6
|
+
export declare function detectCI(cwd?: string): {
|
|
7
|
+
systems: string[];
|
|
8
|
+
primary: string | null;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Get recent CI run status using gh CLI.
|
|
12
|
+
* @param {string} [cwd]
|
|
13
|
+
* @returns {{ available: boolean, runs: object[], hasFailures: boolean, lastRun: object|null }}
|
|
14
|
+
*/
|
|
15
|
+
export declare function getCIStatus(cwd?: string): {
|
|
16
|
+
available: boolean;
|
|
17
|
+
runs: unknown[];
|
|
18
|
+
hasFailures: boolean;
|
|
19
|
+
lastRun: unknown;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Get failed CI run logs and classify the failure.
|
|
23
|
+
* @param {string|number} runId
|
|
24
|
+
* @param {string} [cwd]
|
|
25
|
+
* @returns {object}
|
|
26
|
+
*/
|
|
27
|
+
export declare function triageFailure(runId: string | number, cwd?: string): Record<string, unknown>;
|
|
28
|
+
/**
|
|
29
|
+
* Full CI triage: detect CI, fetch status, classify failures, map to files.
|
|
30
|
+
* @param {string} [cwd]
|
|
31
|
+
* @returns {object}
|
|
32
|
+
*/
|
|
33
|
+
export declare function fullTriage(cwd?: string): Record<string, unknown>;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Detect CI system in use.
|
|
6
|
+
* @param {string} [cwd]
|
|
7
|
+
* @returns {{ systems: string[], primary: string|null }}
|
|
8
|
+
*/
|
|
9
|
+
export function detectCI(cwd) {
|
|
10
|
+
const root = cwd || process.cwd();
|
|
11
|
+
const systems = [];
|
|
12
|
+
if (existsSync(join(root, '.github/workflows')))
|
|
13
|
+
systems.push('github-actions');
|
|
14
|
+
if (existsSync(join(root, '.circleci')))
|
|
15
|
+
systems.push('circleci');
|
|
16
|
+
if (existsSync(join(root, '.gitlab-ci.yml')))
|
|
17
|
+
systems.push('gitlab-ci');
|
|
18
|
+
if (existsSync(join(root, 'Jenkinsfile')))
|
|
19
|
+
systems.push('jenkins');
|
|
20
|
+
if (existsSync(join(root, '.travis.yml')))
|
|
21
|
+
systems.push('travis');
|
|
22
|
+
if (existsSync(join(root, 'vercel.json')) || existsSync(join(root, '.vercel')))
|
|
23
|
+
systems.push('vercel');
|
|
24
|
+
if (existsSync(join(root, 'netlify.toml')))
|
|
25
|
+
systems.push('netlify');
|
|
26
|
+
return { systems, primary: systems[0] || null };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get recent CI run status using gh CLI.
|
|
30
|
+
* @param {string} [cwd]
|
|
31
|
+
* @returns {{ available: boolean, runs: object[], hasFailures: boolean, lastRun: object|null }}
|
|
32
|
+
*/
|
|
33
|
+
export function getCIStatus(cwd) {
|
|
34
|
+
try {
|
|
35
|
+
const json = execSync('gh run list --limit 5 --json databaseId,name,status,conclusion,headBranch,createdAt', { cwd, encoding: 'utf8', timeout: 10000 });
|
|
36
|
+
const runs = JSON.parse(json);
|
|
37
|
+
return {
|
|
38
|
+
available: true,
|
|
39
|
+
runs: runs.map((r) => ({
|
|
40
|
+
id: r.databaseId,
|
|
41
|
+
name: r.name,
|
|
42
|
+
status: r.status,
|
|
43
|
+
conclusion: r.conclusion,
|
|
44
|
+
branch: r.headBranch,
|
|
45
|
+
createdAt: r.createdAt,
|
|
46
|
+
})),
|
|
47
|
+
hasFailures: runs.some((r) => r.conclusion === 'failure'),
|
|
48
|
+
lastRun: runs[0] || null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return { available: false, runs: [], hasFailures: false, lastRun: null };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get failed CI run logs and classify the failure.
|
|
57
|
+
* @param {string|number} runId
|
|
58
|
+
* @param {string} [cwd]
|
|
59
|
+
* @returns {object}
|
|
60
|
+
*/
|
|
61
|
+
export function triageFailure(runId, cwd) {
|
|
62
|
+
try {
|
|
63
|
+
const logs = execSync(`gh run view ${runId} --log-failed 2>/dev/null | tail -100`, {
|
|
64
|
+
cwd, encoding: 'utf8', timeout: 15000,
|
|
65
|
+
});
|
|
66
|
+
const classification = classifyFailure(logs);
|
|
67
|
+
const fileHints = extractFileHints(logs, cwd);
|
|
68
|
+
return {
|
|
69
|
+
success: true,
|
|
70
|
+
runId,
|
|
71
|
+
logs: logs.slice(-3000), // last 3000 chars
|
|
72
|
+
classification,
|
|
73
|
+
fileHints,
|
|
74
|
+
suggestedAction: getSuggestedAction(classification),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
79
|
+
return { success: false, runId, error: msg };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Classify a CI failure from log output.
|
|
84
|
+
* @param {string} logs
|
|
85
|
+
* @returns {{ type: string, confidence: string }}
|
|
86
|
+
*/
|
|
87
|
+
function classifyFailure(logs) {
|
|
88
|
+
const lower = logs.toLowerCase();
|
|
89
|
+
if (lower.includes('syntaxerror') || lower.includes('parse error'))
|
|
90
|
+
return { type: 'syntax', confidence: 'high' };
|
|
91
|
+
if (lower.includes('typeerror') || lower.includes('type error'))
|
|
92
|
+
return { type: 'type-error', confidence: 'high' };
|
|
93
|
+
if (lower.includes('referenceerror'))
|
|
94
|
+
return { type: 'reference-error', confidence: 'high' };
|
|
95
|
+
if (lower.includes('test fail') || lower.includes('tests failed') || lower.includes('assertion'))
|
|
96
|
+
return { type: 'test-failure', confidence: 'high' };
|
|
97
|
+
if (lower.includes('enoent') || lower.includes('no such file'))
|
|
98
|
+
return { type: 'missing-file', confidence: 'high' };
|
|
99
|
+
if (lower.includes('permission denied') || lower.includes('eacces'))
|
|
100
|
+
return { type: 'permissions', confidence: 'high' };
|
|
101
|
+
if (lower.includes('timeout') || lower.includes('timed out'))
|
|
102
|
+
return { type: 'timeout', confidence: 'medium' };
|
|
103
|
+
if (lower.includes('out of memory') || lower.includes('heap'))
|
|
104
|
+
return { type: 'oom', confidence: 'medium' };
|
|
105
|
+
if (lower.includes('npm err') || lower.includes('yarn error') || lower.includes('dependency'))
|
|
106
|
+
return { type: 'dependency', confidence: 'medium' };
|
|
107
|
+
if (lower.includes('lint') || lower.includes('eslint'))
|
|
108
|
+
return { type: 'lint', confidence: 'high' };
|
|
109
|
+
if (lower.includes('build fail'))
|
|
110
|
+
return { type: 'build', confidence: 'medium' };
|
|
111
|
+
if (lower.includes('docker') || lower.includes('container'))
|
|
112
|
+
return { type: 'container', confidence: 'medium' };
|
|
113
|
+
return { type: 'unknown', confidence: 'low' };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Extract local file paths referenced in CI logs.
|
|
117
|
+
* @param {string} logs
|
|
118
|
+
* @param {string} [cwd]
|
|
119
|
+
* @returns {string[]}
|
|
120
|
+
*/
|
|
121
|
+
function extractFileHints(logs, cwd) {
|
|
122
|
+
const files = new Set();
|
|
123
|
+
const root = cwd || process.cwd();
|
|
124
|
+
const patterns = [
|
|
125
|
+
/(?:at\s+)?([a-zA-Z0-9_./\\-]+\.[a-zA-Z]+):(\d+)/g,
|
|
126
|
+
/(?:in\s+)?([a-zA-Z0-9_./\\-]+\.[a-zA-Z]+)\((\d+)\)/g,
|
|
127
|
+
/Error in ([a-zA-Z0-9_./\\-]+\.[a-zA-Z]+)/g,
|
|
128
|
+
];
|
|
129
|
+
for (const pattern of patterns) {
|
|
130
|
+
for (const match of logs.matchAll(pattern)) {
|
|
131
|
+
const file = match[1];
|
|
132
|
+
if (file && !file.includes('node_modules') && existsSync(join(root, file))) {
|
|
133
|
+
files.add(file);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return [...files];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get a human-readable suggested action for a failure classification.
|
|
141
|
+
* @param {{ type: string }} classification
|
|
142
|
+
* @returns {string}
|
|
143
|
+
*/
|
|
144
|
+
function getSuggestedAction(classification) {
|
|
145
|
+
const actions = {
|
|
146
|
+
'syntax': 'Fix syntax error in the identified file',
|
|
147
|
+
'type-error': 'Check type annotations and function signatures',
|
|
148
|
+
'reference-error': 'Check for undefined variables or missing imports',
|
|
149
|
+
'test-failure': 'Run tests locally and fix failing assertions',
|
|
150
|
+
'missing-file': 'Check if a required file was deleted or not committed',
|
|
151
|
+
'permissions': 'Check file permissions and access rights',
|
|
152
|
+
'timeout': 'Investigate slow operations or increase timeout',
|
|
153
|
+
'oom': 'Check for memory leaks or reduce batch size',
|
|
154
|
+
'dependency': 'Run npm install and check for version conflicts',
|
|
155
|
+
'lint': 'Run linter locally and fix violations',
|
|
156
|
+
'build': 'Check build configuration and dependencies',
|
|
157
|
+
'container': 'Check Dockerfile and container configuration',
|
|
158
|
+
'unknown': 'Review full CI logs for error details',
|
|
159
|
+
};
|
|
160
|
+
return actions[classification.type] || actions.unknown;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Full CI triage: detect CI, fetch status, classify failures, map to files.
|
|
164
|
+
* @param {string} [cwd]
|
|
165
|
+
* @returns {object}
|
|
166
|
+
*/
|
|
167
|
+
export function fullTriage(cwd) {
|
|
168
|
+
const ci = detectCI(cwd);
|
|
169
|
+
if (!ci.primary)
|
|
170
|
+
return { available: false, reason: 'no-ci-detected' };
|
|
171
|
+
const status = getCIStatus(cwd);
|
|
172
|
+
if (!status.available)
|
|
173
|
+
return { available: false, reason: 'gh-cli-unavailable' };
|
|
174
|
+
if (!status.hasFailures)
|
|
175
|
+
return { available: true, healthy: true, message: 'All CI runs passing' };
|
|
176
|
+
const failedRuns = status.runs.filter((r) => r.conclusion === 'failure');
|
|
177
|
+
const triages = failedRuns.slice(0, 3).map((r) => triageFailure(r.id, cwd));
|
|
178
|
+
return {
|
|
179
|
+
available: true,
|
|
180
|
+
healthy: false,
|
|
181
|
+
failedRuns: failedRuns.length,
|
|
182
|
+
triages,
|
|
183
|
+
topIssue: triages[0]?.classification || null,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// ─── CLI (direct invocation) ──────────────────────────────────────────────────
|
|
187
|
+
const isMain = process.argv[1]?.endsWith('ci-triage.ts') || process.argv[1]?.endsWith('ci-triage.js');
|
|
188
|
+
if (isMain) {
|
|
189
|
+
const cwd = process.argv[2] || process.cwd();
|
|
190
|
+
const result = fullTriage(cwd);
|
|
191
|
+
process.stdout.write(JSON.stringify(result, null, 2) + '\n');
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=ci-triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-triage.js","sourceRoot":"","sources":["../../src/ci-triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
interface LoopAction {
|
|
2
|
+
type: string;
|
|
3
|
+
mode?: string;
|
|
4
|
+
}
|
|
5
|
+
interface LoopResult {
|
|
6
|
+
phase: string;
|
|
7
|
+
action: LoopAction;
|
|
8
|
+
rationale?: string;
|
|
9
|
+
shouldAskUser?: boolean;
|
|
10
|
+
surfaceNoticings?: unknown[];
|
|
11
|
+
plan: unknown | null;
|
|
12
|
+
nextDispatch: unknown | null;
|
|
13
|
+
mode?: {
|
|
14
|
+
primary: string;
|
|
15
|
+
confidence: number;
|
|
16
|
+
};
|
|
17
|
+
estimatedCost?: number;
|
|
18
|
+
suggestion?: unknown;
|
|
19
|
+
waveSummary?: unknown;
|
|
20
|
+
replanned?: boolean;
|
|
21
|
+
gateCondition?: string;
|
|
22
|
+
}
|
|
23
|
+
interface LoopContext {
|
|
24
|
+
files?: string[];
|
|
25
|
+
recentFiles?: string[];
|
|
26
|
+
priorFailures?: unknown[];
|
|
27
|
+
uncommittedFiles?: string[];
|
|
28
|
+
_detectedIntent?: string | null;
|
|
29
|
+
_immersionContext?: string;
|
|
30
|
+
_inboxBrief?: string;
|
|
31
|
+
_crystallizedIdeas?: string[];
|
|
32
|
+
_updateNotice?: string;
|
|
33
|
+
priorDebriefs?: unknown[];
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Entry point: process a user message through the full cognitive loop.
|
|
38
|
+
* Returns a LoopResult that tells the caller exactly what to do next.
|
|
39
|
+
*/
|
|
40
|
+
export declare function enter(userMessage: string, context?: LoopContext): LoopResult;
|
|
41
|
+
/**
|
|
42
|
+
* Called after a wave completes. Processes debriefs and determines next action.
|
|
43
|
+
*/
|
|
44
|
+
export declare function advance(rawResults: string[], completedWaveId: string, context?: LoopContext): LoopResult;
|
|
45
|
+
export declare function getActivePlan(): unknown;
|
|
46
|
+
export declare function getLoopStatus(): {
|
|
47
|
+
hasActivePlan: boolean;
|
|
48
|
+
completedWaves: number;
|
|
49
|
+
totalWaves: number;
|
|
50
|
+
replans: number;
|
|
51
|
+
totalDispatches: number;
|
|
52
|
+
debriefCount: number;
|
|
53
|
+
};
|
|
54
|
+
export declare function resetLoop(): void;
|
|
55
|
+
export declare function shutdown(): void;
|
|
56
|
+
export {};
|