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.
Files changed (309) hide show
  1. package/.dual-brain/docs/claude-code-extension-points.md +32 -0
  2. package/.dual-brain/docs/data-tools-capabilities.md +181 -0
  3. package/.dual-brain/docs/ecosystem-tools.md +91 -0
  4. package/.dual-brain/docs/panel-handoff.md +124 -0
  5. package/.dual-brain/docs/ruflo-analysis.md +48 -0
  6. package/bin/dual-brain.mjs +56 -56
  7. package/dist/mcp-server/index.d.ts +27 -0
  8. package/dist/mcp-server/index.js +359 -0
  9. package/dist/mcp-server/index.js.map +1 -0
  10. package/dist/src/agent-protocol.d.ts +163 -0
  11. package/dist/src/agent-protocol.js +368 -0
  12. package/dist/src/agent-protocol.js.map +1 -0
  13. package/dist/src/agents/registry.d.ts +52 -0
  14. package/dist/src/agents/registry.js +393 -0
  15. package/dist/src/agents/registry.js.map +1 -0
  16. package/dist/src/awareness.d.ts +93 -0
  17. package/dist/src/awareness.js +406 -0
  18. package/dist/src/awareness.js.map +1 -0
  19. package/dist/src/brief.d.ts +48 -0
  20. package/dist/src/brief.js +179 -0
  21. package/dist/src/brief.js.map +1 -0
  22. package/dist/src/calibration.d.ts +32 -0
  23. package/dist/src/calibration.js +133 -0
  24. package/dist/src/calibration.js.map +1 -0
  25. package/dist/src/checkpoint.d.ts +33 -0
  26. package/dist/src/checkpoint.js +99 -0
  27. package/dist/src/checkpoint.js.map +1 -0
  28. package/dist/src/ci-triage.d.ts +33 -0
  29. package/dist/src/ci-triage.js +193 -0
  30. package/dist/src/ci-triage.js.map +1 -0
  31. package/dist/src/cognitive-loop.d.ts +56 -0
  32. package/dist/src/cognitive-loop.js +495 -0
  33. package/dist/src/cognitive-loop.js.map +1 -0
  34. package/dist/src/collaboration.d.ts +147 -0
  35. package/dist/src/collaboration.js +438 -0
  36. package/dist/src/collaboration.js.map +1 -0
  37. package/dist/src/context-intel.d.ts +47 -0
  38. package/dist/src/context-intel.js +156 -0
  39. package/dist/src/context-intel.js.map +1 -0
  40. package/dist/src/context.d.ts +53 -0
  41. package/dist/src/context.js +332 -0
  42. package/dist/src/context.js.map +1 -0
  43. package/dist/src/continuity.d.ts +89 -0
  44. package/dist/src/continuity.js +230 -0
  45. package/dist/src/continuity.js.map +1 -0
  46. package/dist/src/cost-tracker.d.ts +47 -0
  47. package/dist/src/cost-tracker.js +170 -0
  48. package/dist/src/cost-tracker.js.map +1 -0
  49. package/dist/src/debrief.d.ts +53 -0
  50. package/dist/src/debrief.js +222 -0
  51. package/dist/src/debrief.js.map +1 -0
  52. package/dist/src/decide.d.ts +96 -0
  53. package/dist/src/decide.js +744 -0
  54. package/dist/src/decide.js.map +1 -0
  55. package/dist/src/decompose.d.ts +39 -0
  56. package/dist/src/decompose.js +218 -0
  57. package/dist/src/decompose.js.map +1 -0
  58. package/dist/src/detect.d.ts +91 -0
  59. package/dist/src/detect.js +544 -0
  60. package/dist/src/detect.js.map +1 -0
  61. package/dist/src/dispatch.d.ts +154 -0
  62. package/dist/src/dispatch.js +1306 -0
  63. package/dist/src/dispatch.js.map +1 -0
  64. package/dist/src/doctor.d.ts +421 -0
  65. package/dist/src/doctor.js +1689 -0
  66. package/dist/src/doctor.js.map +1 -0
  67. package/dist/src/engine.d.ts +70 -0
  68. package/dist/src/engine.js +155 -0
  69. package/dist/src/engine.js.map +1 -0
  70. package/dist/src/envelope.d.ts +36 -0
  71. package/dist/src/envelope.js +80 -0
  72. package/dist/src/envelope.js.map +1 -0
  73. package/dist/src/failure-memory.d.ts +55 -0
  74. package/dist/src/failure-memory.js +175 -0
  75. package/dist/src/failure-memory.js.map +1 -0
  76. package/dist/src/fx.d.ts +87 -0
  77. package/dist/src/fx.js +272 -0
  78. package/dist/src/fx.js.map +1 -0
  79. package/dist/src/governance.d.ts +93 -0
  80. package/dist/src/governance.js +261 -0
  81. package/dist/src/governance.js.map +1 -0
  82. package/dist/src/handoff.d.ts +11 -0
  83. package/dist/src/handoff.js +90 -0
  84. package/dist/src/handoff.js.map +1 -0
  85. package/dist/src/head-protocol.d.ts +76 -0
  86. package/dist/src/head-protocol.js +109 -0
  87. package/dist/src/head-protocol.js.map +1 -0
  88. package/dist/src/head.d.ts +222 -0
  89. package/dist/src/head.js +765 -0
  90. package/dist/src/head.js.map +1 -0
  91. package/dist/src/health.d.ts +132 -0
  92. package/dist/src/health.js +435 -0
  93. package/dist/src/health.js.map +1 -0
  94. package/dist/src/inbox.d.ts +70 -0
  95. package/dist/src/inbox.js +218 -0
  96. package/dist/src/inbox.js.map +1 -0
  97. package/dist/src/index.d.ts +33 -0
  98. package/dist/src/index.js +38 -0
  99. package/dist/src/index.js.map +1 -0
  100. package/dist/src/install-hooks.d.ts +13 -0
  101. package/dist/src/install-hooks.js +88 -0
  102. package/dist/src/install-hooks.js.map +1 -0
  103. package/dist/src/integrity.d.ts +59 -0
  104. package/dist/src/integrity.js +206 -0
  105. package/dist/src/integrity.js.map +1 -0
  106. package/dist/src/intelligence.d.ts +104 -0
  107. package/dist/src/intelligence.js +391 -0
  108. package/dist/src/intelligence.js.map +1 -0
  109. package/dist/src/ledger.d.ts +54 -0
  110. package/dist/src/ledger.js +179 -0
  111. package/dist/src/ledger.js.map +1 -0
  112. package/dist/src/living-docs.d.ts +14 -0
  113. package/dist/src/living-docs.js +197 -0
  114. package/dist/src/living-docs.js.map +1 -0
  115. package/dist/src/memory-tiers.d.ts +37 -0
  116. package/dist/src/memory-tiers.js +160 -0
  117. package/dist/src/memory-tiers.js.map +1 -0
  118. package/dist/src/model-profiles.d.ts +65 -0
  119. package/dist/src/model-profiles.js +568 -0
  120. package/dist/src/model-profiles.js.map +1 -0
  121. package/dist/src/models.d.ts +58 -0
  122. package/dist/src/models.js +327 -0
  123. package/dist/src/models.js.map +1 -0
  124. package/dist/src/narrative.d.ts +54 -0
  125. package/dist/src/narrative.js +163 -0
  126. package/dist/src/narrative.js.map +1 -0
  127. package/dist/src/nextstep.d.ts +16 -0
  128. package/dist/src/nextstep.js +103 -0
  129. package/dist/src/nextstep.js.map +1 -0
  130. package/dist/src/observer.d.ts +18 -0
  131. package/dist/src/observer.js +251 -0
  132. package/dist/src/observer.js.map +1 -0
  133. package/dist/src/outcome.d.ts +110 -0
  134. package/dist/src/outcome.js +377 -0
  135. package/dist/src/outcome.js.map +1 -0
  136. package/dist/src/pipeline.d.ts +167 -0
  137. package/dist/src/pipeline.js +1503 -0
  138. package/dist/src/pipeline.js.map +1 -0
  139. package/dist/src/playbook.d.ts +59 -0
  140. package/dist/src/playbook.js +238 -0
  141. package/dist/src/playbook.js.map +1 -0
  142. package/dist/src/pr-agent.d.ts +97 -0
  143. package/dist/src/pr-agent.js +195 -0
  144. package/dist/src/pr-agent.js.map +1 -0
  145. package/dist/src/predictive.d.ts +57 -0
  146. package/dist/src/predictive.js +230 -0
  147. package/dist/src/predictive.js.map +1 -0
  148. package/dist/src/profile.d.ts +294 -0
  149. package/dist/src/profile.js +1347 -0
  150. package/dist/src/profile.js.map +1 -0
  151. package/dist/src/prompt-audit.d.ts +22 -0
  152. package/dist/src/prompt-audit.js +194 -0
  153. package/dist/src/prompt-audit.js.map +1 -0
  154. package/dist/src/prompt-intel.d.ts +12 -0
  155. package/dist/src/prompt-intel.js +321 -0
  156. package/dist/src/prompt-intel.js.map +1 -0
  157. package/dist/src/provider-context.d.ts +121 -0
  158. package/dist/src/provider-context.js +222 -0
  159. package/dist/src/provider-context.js.map +1 -0
  160. package/dist/src/provider-manager.d.ts +92 -0
  161. package/dist/src/provider-manager.js +428 -0
  162. package/dist/src/provider-manager.js.map +1 -0
  163. package/dist/src/receipt.d.ts +87 -0
  164. package/dist/src/receipt.js +326 -0
  165. package/dist/src/receipt.js.map +1 -0
  166. package/dist/src/recommendations.d.ts +13 -0
  167. package/dist/src/recommendations.js +291 -0
  168. package/dist/src/recommendations.js.map +1 -0
  169. package/dist/src/redact.d.ts +15 -0
  170. package/dist/src/redact.js +129 -0
  171. package/dist/src/redact.js.map +1 -0
  172. package/dist/src/replit.d.ts +397 -0
  173. package/dist/src/replit.js +1160 -0
  174. package/dist/src/replit.js.map +1 -0
  175. package/dist/src/repo.d.ts +149 -0
  176. package/dist/src/repo.js +416 -0
  177. package/dist/src/repo.js.map +1 -0
  178. package/dist/src/revert.d.ts +30 -0
  179. package/dist/src/revert.js +166 -0
  180. package/dist/src/revert.js.map +1 -0
  181. package/dist/src/room.d.ts +102 -0
  182. package/dist/src/room.js +212 -0
  183. package/dist/src/room.js.map +1 -0
  184. package/dist/src/routing-advisor.d.ts +57 -0
  185. package/dist/src/routing-advisor.js +221 -0
  186. package/dist/src/routing-advisor.js.map +1 -0
  187. package/dist/src/self-correct.d.ts +40 -0
  188. package/dist/src/self-correct.js +137 -0
  189. package/dist/src/self-correct.js.map +1 -0
  190. package/dist/src/session-lock.d.ts +35 -0
  191. package/dist/src/session-lock.js +134 -0
  192. package/dist/src/session-lock.js.map +1 -0
  193. package/dist/src/session.d.ts +267 -0
  194. package/dist/src/session.js +1660 -0
  195. package/dist/src/session.js.map +1 -0
  196. package/dist/src/settings-tui.d.ts +5 -0
  197. package/dist/src/settings-tui.js +422 -0
  198. package/dist/src/settings-tui.js.map +1 -0
  199. package/dist/src/setup-flow.d.ts +63 -0
  200. package/dist/src/setup-flow.js +233 -0
  201. package/dist/src/setup-flow.js.map +1 -0
  202. package/dist/src/signal.d.ts +19 -0
  203. package/dist/src/signal.js +122 -0
  204. package/dist/src/signal.js.map +1 -0
  205. package/dist/src/simmer.d.ts +85 -0
  206. package/dist/src/simmer.js +224 -0
  207. package/dist/src/simmer.js.map +1 -0
  208. package/dist/src/state-export.d.ts +129 -0
  209. package/dist/src/state-export.js +233 -0
  210. package/dist/src/state-export.js.map +1 -0
  211. package/dist/src/strategy.d.ts +54 -0
  212. package/dist/src/strategy.js +95 -0
  213. package/dist/src/strategy.js.map +1 -0
  214. package/dist/src/subscription.d.ts +40 -0
  215. package/dist/src/subscription.js +189 -0
  216. package/dist/src/subscription.js.map +1 -0
  217. package/dist/src/templates.d.ts +208 -0
  218. package/dist/src/templates.js +238 -0
  219. package/dist/src/templates.js.map +1 -0
  220. package/dist/src/test.d.ts +9 -0
  221. package/dist/src/test.js +1173 -0
  222. package/dist/src/test.js.map +1 -0
  223. package/dist/src/think-engine.d.ts +67 -0
  224. package/dist/src/think-engine.js +412 -0
  225. package/dist/src/think-engine.js.map +1 -0
  226. package/dist/src/tui.d.ts +71 -0
  227. package/dist/src/tui.js +242 -0
  228. package/dist/src/tui.js.map +1 -0
  229. package/dist/src/types.d.ts +177 -0
  230. package/dist/src/types.js +6 -0
  231. package/dist/src/types.js.map +1 -0
  232. package/dist/src/update-check.d.ts +7 -0
  233. package/dist/src/update-check.js +36 -0
  234. package/dist/src/update-check.js.map +1 -0
  235. package/dist/src/wave-planner.d.ts +30 -0
  236. package/dist/src/wave-planner.js +281 -0
  237. package/dist/src/wave-planner.js.map +1 -0
  238. package/hooks/head-guard.sh +41 -0
  239. package/hooks/task-classifier.mjs +328 -0
  240. package/hooks/vibe-router.mjs +387 -0
  241. package/package.json +29 -153
  242. package/src/agents/registry.mjs +0 -405
  243. package/src/awareness.mjs +0 -425
  244. package/src/brief.mjs +0 -266
  245. package/src/calibration.mjs +0 -148
  246. package/src/checkpoint.mjs +0 -109
  247. package/src/ci-triage.mjs +0 -191
  248. package/src/cognitive-loop.mjs +0 -562
  249. package/src/collaboration.mjs +0 -545
  250. package/src/context-intel.mjs +0 -158
  251. package/src/context.mjs +0 -389
  252. package/src/continuity.mjs +0 -298
  253. package/src/cost-tracker.mjs +0 -184
  254. package/src/debrief.mjs +0 -228
  255. package/src/decide.mjs +0 -1099
  256. package/src/decompose.mjs +0 -331
  257. package/src/detect.mjs +0 -702
  258. package/src/dispatch.mjs +0 -1447
  259. package/src/doctor.mjs +0 -1607
  260. package/src/envelope.mjs +0 -139
  261. package/src/failure-memory.mjs +0 -178
  262. package/src/fx.mjs +0 -276
  263. package/src/governance.mjs +0 -279
  264. package/src/handoff.mjs +0 -87
  265. package/src/head-protocol.mjs +0 -128
  266. package/src/head.mjs +0 -952
  267. package/src/health.mjs +0 -528
  268. package/src/inbox.mjs +0 -195
  269. package/src/index.mjs +0 -44
  270. package/src/install-hooks.mjs +0 -100
  271. package/src/integrity.mjs +0 -245
  272. package/src/intelligence.mjs +0 -447
  273. package/src/ledger.mjs +0 -196
  274. package/src/living-docs.mjs +0 -210
  275. package/src/memory-tiers.mjs +0 -193
  276. package/src/models.mjs +0 -363
  277. package/src/narrative.mjs +0 -169
  278. package/src/nextstep.mjs +0 -100
  279. package/src/observer.mjs +0 -241
  280. package/src/outcome.mjs +0 -400
  281. package/src/pipeline.mjs +0 -1711
  282. package/src/playbook.mjs +0 -257
  283. package/src/pr-agent.mjs +0 -214
  284. package/src/predictive.mjs +0 -250
  285. package/src/profile.mjs +0 -1411
  286. package/src/prompt-audit.mjs +0 -231
  287. package/src/prompt-intel.mjs +0 -325
  288. package/src/provider-context.mjs +0 -257
  289. package/src/receipt.mjs +0 -344
  290. package/src/recommendations.mjs +0 -296
  291. package/src/redact.mjs +0 -192
  292. package/src/replit.mjs +0 -1210
  293. package/src/repo.mjs +0 -445
  294. package/src/revert.mjs +0 -149
  295. package/src/routing-advisor.mjs +0 -204
  296. package/src/self-correct.mjs +0 -147
  297. package/src/session-lock.mjs +0 -160
  298. package/src/session.mjs +0 -1655
  299. package/src/settings-tui.mjs +0 -373
  300. package/src/setup-flow.mjs +0 -223
  301. package/src/signal.mjs +0 -115
  302. package/src/simmer.mjs +0 -241
  303. package/src/strategy.mjs +0 -235
  304. package/src/subscription.mjs +0 -212
  305. package/src/templates.mjs +0 -260
  306. package/src/think-engine.mjs +0 -428
  307. package/src/tui.mjs +0 -276
  308. package/src/update-check.mjs +0 -35
  309. package/src/wave-planner.mjs +0 -294
@@ -0,0 +1,14 @@
1
+ export declare function initLivingDocs(cwd?: string): {
2
+ created: boolean;
3
+ path: string;
4
+ };
5
+ export declare function appendAction(action: Record<string, unknown>, cwd?: string): Record<string, unknown>;
6
+ export declare function appendDecision(decision: Record<string, unknown>, cwd?: string): Record<string, unknown>;
7
+ export declare function createCheckpoint(summary: string, cwd?: string): Record<string, unknown>;
8
+ export declare function updateState(newContent: string, cwd?: string): void;
9
+ export declare function updateRoadmap(newContent: string, cwd?: string): void;
10
+ export declare function updateVision(newContent: string, cwd?: string): void;
11
+ export declare function getProjectState(cwd?: string): Record<string, unknown>;
12
+ export declare function getRecentActions(cwd?: string, limit?: number): Record<string, unknown>[];
13
+ export declare function getOpenTasks(cwd?: string): Record<string, unknown>[];
14
+ export declare function updateProject(updates: Record<string, unknown>, cwd?: string): Record<string, unknown>;
@@ -0,0 +1,197 @@
1
+ // living-docs.mjs — Living document system for .dualbrain/.
2
+ // Manages project.json, vision.md, roadmap.md, state.md, actions.jsonl, decisions.jsonl, checkpoints.jsonl.
3
+ import { readFileSync, writeFileSync, appendFileSync, mkdirSync, existsSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { execSync } from 'node:child_process';
6
+ const DIR = '.dualbrain';
7
+ function docsDir(cwd = process.cwd()) {
8
+ return join(cwd, DIR);
9
+ }
10
+ function ensureDir(cwd) {
11
+ mkdirSync(docsDir(cwd), { recursive: true });
12
+ }
13
+ function filePath(name, cwd) {
14
+ return join(docsDir(cwd), name);
15
+ }
16
+ function readFileSafe(name, cwd, fallback = '') {
17
+ try {
18
+ return readFileSync(filePath(name, cwd), 'utf8');
19
+ }
20
+ catch {
21
+ return fallback;
22
+ }
23
+ }
24
+ function readJsonSafe(name, cwd, fallback = {}) {
25
+ try {
26
+ return JSON.parse(readFileSync(filePath(name, cwd), 'utf8'));
27
+ }
28
+ catch {
29
+ return fallback;
30
+ }
31
+ }
32
+ function readPackageJson(cwd) {
33
+ try {
34
+ return JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
35
+ }
36
+ catch {
37
+ return {};
38
+ }
39
+ }
40
+ function gitExec(cmd, cwd) {
41
+ try {
42
+ return execSync(cmd, { cwd, stdio: ['ignore', 'pipe', 'pipe'] }).toString().trim();
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ export function initLivingDocs(cwd = process.cwd()) {
49
+ const dir = docsDir(cwd);
50
+ const existed = existsSync(dir);
51
+ ensureDir(cwd);
52
+ const pkg = readPackageJson(cwd);
53
+ if (!existsSync(filePath('project.json', cwd))) {
54
+ const project = {
55
+ name: pkg.name ?? '',
56
+ version: pkg.version ?? '0.0.1',
57
+ created: new Date().toISOString(),
58
+ workStyle: 'balanced',
59
+ userCalibration: { specificity: 3, corrections: 3, autonomy: 3 },
60
+ team: [],
61
+ providers: {},
62
+ };
63
+ writeFileSync(filePath('project.json', cwd), JSON.stringify(project, null, 2));
64
+ }
65
+ if (!existsSync(filePath('vision.md', cwd))) {
66
+ writeFileSync(filePath('vision.md', cwd), '# Vision\n\n_Not yet defined. Type your vision and HEAD will maintain this document._\n');
67
+ }
68
+ if (!existsSync(filePath('roadmap.md', cwd))) {
69
+ writeFileSync(filePath('roadmap.md', cwd), '# Roadmap\n\n_No roadmap yet. As you work, HEAD will build this from your actions._\n');
70
+ }
71
+ if (!existsSync(filePath('state.md', cwd))) {
72
+ writeFileSync(filePath('state.md', cwd), '# Current State\n\n_Fresh project. No history yet._\n');
73
+ }
74
+ for (const log of ['actions.jsonl', 'decisions.jsonl', 'checkpoints.jsonl']) {
75
+ if (!existsSync(filePath(log, cwd))) {
76
+ writeFileSync(filePath(log, cwd), '');
77
+ }
78
+ }
79
+ return { created: !existed, path: dir };
80
+ }
81
+ export function appendAction(action, cwd = process.cwd()) {
82
+ ensureDir(cwd);
83
+ const entry = {
84
+ id: `act_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
85
+ timestamp: new Date().toISOString(),
86
+ type: 'task',
87
+ intent: '',
88
+ status: 'started',
89
+ owner: 'head',
90
+ files: [],
91
+ proof: null,
92
+ cost: null,
93
+ result: null,
94
+ ...action,
95
+ };
96
+ appendFileSync(filePath('actions.jsonl', cwd), JSON.stringify(entry) + '\n');
97
+ return entry;
98
+ }
99
+ export function appendDecision(decision, cwd = process.cwd()) {
100
+ ensureDir(cwd);
101
+ const entry = {
102
+ id: `dec_${Date.now()}`,
103
+ timestamp: new Date().toISOString(),
104
+ question: '',
105
+ decision: '',
106
+ reasoning: '',
107
+ participants: [],
108
+ supersedes: null,
109
+ ...decision,
110
+ };
111
+ appendFileSync(filePath('decisions.jsonl', cwd), JSON.stringify(entry) + '\n');
112
+ return entry;
113
+ }
114
+ export function createCheckpoint(summary, cwd = process.cwd()) {
115
+ ensureDir(cwd);
116
+ const gitRef = gitExec('git rev-parse HEAD', cwd) ?? 'unknown';
117
+ const branch = gitExec('git rev-parse --abbrev-ref HEAD', cwd) ?? 'unknown';
118
+ const stateSnapshot = readFileSafe('state.md', cwd, '');
119
+ const entry = {
120
+ id: `cp_${Date.now()}`,
121
+ timestamp: new Date().toISOString(),
122
+ gitRef,
123
+ branch,
124
+ summary,
125
+ stateSnapshot,
126
+ };
127
+ appendFileSync(filePath('checkpoints.jsonl', cwd), JSON.stringify(entry) + '\n');
128
+ return entry;
129
+ }
130
+ export function updateState(newContent, cwd = process.cwd()) {
131
+ ensureDir(cwd);
132
+ writeFileSync(filePath('state.md', cwd), newContent);
133
+ }
134
+ export function updateRoadmap(newContent, cwd = process.cwd()) {
135
+ ensureDir(cwd);
136
+ writeFileSync(filePath('roadmap.md', cwd), newContent);
137
+ }
138
+ export function updateVision(newContent, cwd = process.cwd()) {
139
+ ensureDir(cwd);
140
+ const prev = readFileSafe('vision.md', cwd, '');
141
+ writeFileSync(filePath('vision.md', cwd), newContent);
142
+ if (prev !== newContent) {
143
+ appendDecision({
144
+ question: 'What is the project vision?',
145
+ decision: newContent.slice(0, 200),
146
+ reasoning: 'Vision document updated.',
147
+ participants: ['head'],
148
+ supersedes: null,
149
+ }, cwd);
150
+ }
151
+ }
152
+ export function getProjectState(cwd = process.cwd()) {
153
+ const project = readJsonSafe('project.json', cwd, {});
154
+ const state = readFileSafe('state.md', cwd, '');
155
+ const actions = getRecentActions(cwd, 20);
156
+ const decisions = readLastLines('decisions.jsonl', cwd, 5);
157
+ const checkpoints = readLastLines('checkpoints.jsonl', cwd, 1);
158
+ return {
159
+ project,
160
+ state,
161
+ recentActions: actions,
162
+ recentDecisions: decisions,
163
+ lastCheckpoint: checkpoints[0] ?? null,
164
+ };
165
+ }
166
+ function readLastLines(name, cwd, n) {
167
+ const raw = readFileSafe(name, cwd, '');
168
+ const lines = raw.split('\n').filter(l => l.trim());
169
+ return lines.slice(-n).map(l => { try {
170
+ return JSON.parse(l);
171
+ }
172
+ catch {
173
+ return null;
174
+ } }).filter(Boolean);
175
+ }
176
+ export function getRecentActions(cwd = process.cwd(), limit = 20) {
177
+ return readLastLines('actions.jsonl', cwd, limit);
178
+ }
179
+ export function getOpenTasks(cwd = process.cwd()) {
180
+ const raw = readFileSafe('actions.jsonl', cwd, '');
181
+ const lines = raw.split('\n').filter(l => l.trim());
182
+ const entries = lines.map(l => { try {
183
+ return JSON.parse(l);
184
+ }
185
+ catch {
186
+ return null;
187
+ } }).filter(Boolean);
188
+ return entries.filter(e => e.status === 'started' || e.status === 'blocked');
189
+ }
190
+ export function updateProject(updates, cwd = process.cwd()) {
191
+ ensureDir(cwd);
192
+ const current = readJsonSafe('project.json', cwd, {});
193
+ const merged = { ...current, ...updates };
194
+ writeFileSync(filePath('project.json', cwd), JSON.stringify(merged, null, 2));
195
+ return merged;
196
+ }
197
+ //# sourceMappingURL=living-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"living-docs.js","sourceRoot":"","sources":["../../src/living-docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ interface MemoryItem {
2
+ source: string;
3
+ content: string;
4
+ }
5
+ interface MemoryContext {
6
+ narrative: string;
7
+ simmerBrief: string;
8
+ warmItems: MemoryItem[];
9
+ combined: string;
10
+ }
11
+ interface HotMemory {
12
+ narrative: string;
13
+ simmerBrief: string;
14
+ combined: string;
15
+ }
16
+ interface Signals {
17
+ userMessage?: string;
18
+ files?: string[];
19
+ intent?: string;
20
+ }
21
+ /**
22
+ * Load hot memory — always returned, every turn.
23
+ */
24
+ export declare function loadHot(): HotMemory;
25
+ /**
26
+ * Load warm memory — contextually relevant items paged in based on signals.
27
+ */
28
+ export declare function loadWarm(signals?: Signals): MemoryItem[];
29
+ /**
30
+ * Load cold memory — only when explicitly requested or when signals strongly indicate need.
31
+ */
32
+ export declare function loadCold(query: string): MemoryItem[];
33
+ /**
34
+ * Full context assembly — combines hot + warm based on current signals.
35
+ */
36
+ export declare function assemble(signals?: Signals): MemoryContext;
37
+ export {};
@@ -0,0 +1,160 @@
1
+ // memory-tiers.ts — Hot/Warm/Cold memory with active paging.
2
+ //
3
+ // Hot: loaded every turn (narrative + active simmer). Always in HEAD's context.
4
+ // Warm: loaded on demand (recent debriefs, narrative history, relevant past decisions).
5
+ // Cold: past sessions, archived patterns. Only retrieved when explicitly needed.
6
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import * as narrative from './narrative.js';
9
+ import * as simmer from './simmer.js';
10
+ const STATE_DIR = join(process.cwd(), '.dualbrain');
11
+ /**
12
+ * Load hot memory — always returned, every turn.
13
+ */
14
+ export function loadHot() {
15
+ const narr = narrative.load();
16
+ const simmering = simmer.brief();
17
+ const parts = [];
18
+ if (narr)
19
+ parts.push(narr);
20
+ if (simmering)
21
+ parts.push(`[Simmering]\n${simmering}`);
22
+ return {
23
+ narrative: narr,
24
+ simmerBrief: simmering,
25
+ combined: parts.join('\n\n'),
26
+ };
27
+ }
28
+ /**
29
+ * Load warm memory — contextually relevant items paged in based on signals.
30
+ */
31
+ export function loadWarm(signals = {}) {
32
+ const items = [];
33
+ // Recent narrative history if we're resuming or context feels thin
34
+ if (_looksLikeResume(signals.userMessage) || !narrative.load()) {
35
+ const history = narrative.recentHistory(3);
36
+ if (history.length > 0) {
37
+ items.push({
38
+ source: 'narrative-history',
39
+ content: history.map((h) => h.text).join('\n---\n'),
40
+ });
41
+ }
42
+ }
43
+ // Recent debriefs if we're continuing dispatch work
44
+ if (signals.intent === 'dispatch' || signals.intent === 'proceed') {
45
+ const debriefs = _loadRecentDebriefs(3);
46
+ if (debriefs.length > 0) {
47
+ items.push({
48
+ source: 'recent-debriefs',
49
+ content: debriefs.map((d) => `[${d.status}] ${d.objective || d.summary || ''}`).join('\n'),
50
+ });
51
+ }
52
+ }
53
+ // Routing decisions if making a new routing choice
54
+ if (signals.intent === 'route' || signals.intent === 'dispatch') {
55
+ const decisions = _loadRecentDecisions(5);
56
+ if (decisions.length > 0) {
57
+ items.push({
58
+ source: 'routing-history',
59
+ content: decisions.map((d) => `${d.provider}/${d.model}: ${d.reason || ''}`).join('\n'),
60
+ });
61
+ }
62
+ }
63
+ return items;
64
+ }
65
+ /**
66
+ * Load cold memory — only when explicitly requested or when signals strongly indicate need.
67
+ */
68
+ export function loadCold(query) {
69
+ const items = [];
70
+ // Search past handoffs (from continuity.mjs)
71
+ const handoffs = _searchHandoffs(query);
72
+ if (handoffs.length > 0) {
73
+ items.push({
74
+ source: 'past-sessions',
75
+ content: handoffs.map((h) => `[${h.timestamp}] ${h.task || ''}: ${h.resumeHint || ''}`).join('\n'),
76
+ });
77
+ }
78
+ return items;
79
+ }
80
+ /**
81
+ * Full context assembly — combines hot + warm based on current signals.
82
+ */
83
+ export function assemble(signals = {}) {
84
+ const hot = loadHot();
85
+ const warm = loadWarm(signals);
86
+ const parts = [];
87
+ if (hot.combined)
88
+ parts.push(hot.combined);
89
+ if (warm.length > 0) {
90
+ const warmText = warm.map(w => `[${w.source}]\n${w.content}`).join('\n\n');
91
+ parts.push(warmText);
92
+ }
93
+ return {
94
+ narrative: hot.narrative,
95
+ simmerBrief: hot.simmerBrief,
96
+ warmItems: warm,
97
+ combined: parts.join('\n\n---\n\n'),
98
+ };
99
+ }
100
+ // -- Internal helpers --
101
+ function _looksLikeResume(msg) {
102
+ if (!msg)
103
+ return false;
104
+ const lower = msg.toLowerCase();
105
+ return /continue|where were we|pick up|resume|what's next|whats next/.test(lower);
106
+ }
107
+ function _loadRecentDebriefs(n) {
108
+ try {
109
+ const loopFile = join(STATE_DIR, 'cognitive-loop.json');
110
+ if (!existsSync(loopFile))
111
+ return [];
112
+ const loop = JSON.parse(readFileSync(loopFile, 'utf8'));
113
+ return (loop.debriefs || []).slice(-n);
114
+ }
115
+ catch {
116
+ return [];
117
+ }
118
+ }
119
+ function _loadRecentDecisions(n) {
120
+ try {
121
+ const file = join(STATE_DIR, 'decisions.jsonl');
122
+ if (!existsSync(file))
123
+ return [];
124
+ const lines = readFileSync(file, 'utf8').trim().split('\n').filter(Boolean);
125
+ return lines.slice(-n).map(l => { try {
126
+ return JSON.parse(l);
127
+ }
128
+ catch {
129
+ return null;
130
+ } }).filter(Boolean);
131
+ }
132
+ catch {
133
+ return [];
134
+ }
135
+ }
136
+ function _searchHandoffs(query) {
137
+ try {
138
+ const handoffDir = join(STATE_DIR, 'handoffs');
139
+ if (!existsSync(handoffDir))
140
+ return [];
141
+ const files = readdirSync(handoffDir).filter(f => f.endsWith('.json')).slice(-10);
142
+ const results = [];
143
+ const queryLower = query.toLowerCase();
144
+ for (const f of files) {
145
+ try {
146
+ const data = JSON.parse(readFileSync(join(handoffDir, f), 'utf8'));
147
+ const text = JSON.stringify(data).toLowerCase();
148
+ if (text.includes(queryLower)) {
149
+ results.push(data);
150
+ }
151
+ }
152
+ catch { }
153
+ }
154
+ return results.slice(-3);
155
+ }
156
+ catch {
157
+ return [];
158
+ }
159
+ }
160
+ //# sourceMappingURL=memory-tiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-tiers.js","sourceRoot":"","sources":["../../src/memory-tiers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Static capability profiles for AI models used by the dual-brain orchestrator.
3
+ * Used for routing decisions, pairing assessments, and task-model matching.
4
+ *
5
+ * Version bumped when profiles are added/modified — consumers can cache-invalidate on this.
6
+ */
7
+ import type { ModelProfile, Provider, LatencyTier, CostTier } from './types.ts';
8
+ export declare const PROFILES: ModelProfile[];
9
+ /**
10
+ * Look up a model profile by ID. Supports fuzzy matching:
11
+ * 'opus' matches 'claude-opus-4-6', 'sonnet' matches 'claude-sonnet-4-6', etc.
12
+ */
13
+ export declare function getProfile(modelId: string | null | undefined): ModelProfile | null;
14
+ interface TraitComparisonEntry {
15
+ [modelId: string]: number | string;
16
+ delta: number;
17
+ advantage: string;
18
+ }
19
+ interface CompareResult {
20
+ models: [string, string];
21
+ traits: Record<string, TraitComparisonEntry>;
22
+ languages: Record<string, TraitComparisonEntry>;
23
+ summary: Record<string, {
24
+ advantages: string[];
25
+ tier: number;
26
+ cost: CostTier;
27
+ speed: LatencyTier;
28
+ }>;
29
+ }
30
+ interface CompareError {
31
+ error: string;
32
+ }
33
+ /**
34
+ * Compare two models, returning relative strengths across all dimensions.
35
+ */
36
+ export declare function compareModels(idA: string, idB: string): CompareResult | CompareError;
37
+ interface FindBestOptions {
38
+ provider?: Provider;
39
+ tier?: number;
40
+ maxTier?: number;
41
+ costTier?: CostTier;
42
+ }
43
+ /**
44
+ * Find the best model for a given trait, with optional constraints.
45
+ */
46
+ export declare function findBestFor(trait: string, options?: FindBestOptions): ModelProfile | null;
47
+ interface PairingAssessment {
48
+ models: [string, string];
49
+ balance: 'complementary' | 'redundant' | 'lopsided';
50
+ description: string;
51
+ strengths: string[];
52
+ gaps: string[];
53
+ }
54
+ interface PairingError {
55
+ error: string;
56
+ }
57
+ /**
58
+ * Assess how well two models pair together for dual-brain work.
59
+ */
60
+ export declare function getPairingAssessment(idA: string, idB: string): PairingAssessment | PairingError;
61
+ /**
62
+ * Returns the current profile version for cache invalidation.
63
+ */
64
+ export declare function getProfileVersion(): string;
65
+ export default PROFILES;