@mindrian_os/install 1.13.0-beta.11

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 (597) hide show
  1. package/.claude-plugin/plugin.json +21 -0
  2. package/.mcp.json +9 -0
  3. package/CHANGELOG.md +3333 -0
  4. package/LICENSE +123 -0
  5. package/README.md +673 -0
  6. package/agents/brain-query.md +80 -0
  7. package/agents/framework-runner.md +237 -0
  8. package/agents/grading.md +188 -0
  9. package/agents/investor.md +128 -0
  10. package/agents/larry-extended.md +135 -0
  11. package/agents/opportunity-scanner.md +91 -0
  12. package/agents/persona-analyst.md +132 -0
  13. package/agents/research.md +89 -0
  14. package/agents/reverse-salient-agent.md +27 -0
  15. package/bin/cli.js +142 -0
  16. package/bin/mindrian-mcp-server.cjs +182 -0
  17. package/bin/mindrian-tools.cjs +765 -0
  18. package/commands/act.md +439 -0
  19. package/commands/admin.md +404 -0
  20. package/commands/analyze-needs.md +42 -0
  21. package/commands/analyze-systems.md +39 -0
  22. package/commands/analyze-timing.md +42 -0
  23. package/commands/auto-explore.md +64 -0
  24. package/commands/beautiful-question.md +40 -0
  25. package/commands/brain-derive.md +78 -0
  26. package/commands/build-knowledge.md +42 -0
  27. package/commands/build-thesis.md +46 -0
  28. package/commands/causal.md +234 -0
  29. package/commands/challenge-assumptions.md +33 -0
  30. package/commands/compare-ventures.md +83 -0
  31. package/commands/dashboard.md +110 -0
  32. package/commands/deep-grade.md +82 -0
  33. package/commands/diagnose.md +58 -0
  34. package/commands/diagnostics.md +151 -0
  35. package/commands/doctor.md +151 -0
  36. package/commands/dominant-designs.md +40 -0
  37. package/commands/explain-decision.md +87 -0
  38. package/commands/explore-domains.md +42 -0
  39. package/commands/explore-futures.md +40 -0
  40. package/commands/explore-trends.md +42 -0
  41. package/commands/export.md +103 -0
  42. package/commands/file-meeting.md +724 -0
  43. package/commands/find-analogies.md +188 -0
  44. package/commands/find-bottlenecks.md +62 -0
  45. package/commands/find-connections.md +76 -0
  46. package/commands/funding.md +81 -0
  47. package/commands/grade.md +203 -0
  48. package/commands/graph.md +128 -0
  49. package/commands/hat-briefing.md +125 -0
  50. package/commands/heal.md +196 -0
  51. package/commands/help.md +399 -0
  52. package/commands/hmi-status.md +172 -0
  53. package/commands/jtbd.md +241 -0
  54. package/commands/leadership.md +73 -0
  55. package/commands/lean-canvas.md +40 -0
  56. package/commands/macro-trends.md +40 -0
  57. package/commands/map-unknowns.md +40 -0
  58. package/commands/memory.md +173 -0
  59. package/commands/models.md +175 -0
  60. package/commands/mos-reason.md +285 -0
  61. package/commands/mullins.md +120 -0
  62. package/commands/new-project.md +481 -0
  63. package/commands/onboard.md +434 -0
  64. package/commands/operator.md +149 -0
  65. package/commands/opportunities.md +144 -0
  66. package/commands/organize.md +497 -0
  67. package/commands/persona.md +198 -0
  68. package/commands/pipeline.md +112 -0
  69. package/commands/present.md +91 -0
  70. package/commands/publish.md +201 -0
  71. package/commands/query.md +124 -0
  72. package/commands/radar.md +72 -0
  73. package/commands/reanalyze.md +91 -0
  74. package/commands/research.md +196 -0
  75. package/commands/room.md +352 -0
  76. package/commands/rooms.md +598 -0
  77. package/commands/root-cause.md +40 -0
  78. package/commands/rs-experts.md +85 -0
  79. package/commands/rs-explain.md +100 -0
  80. package/commands/rs-fetch.md +94 -0
  81. package/commands/rs-thesis.md +85 -0
  82. package/commands/scenario-plan.md +40 -0
  83. package/commands/scheduled-tasks.md +285 -0
  84. package/commands/score-innovation.md +43 -0
  85. package/commands/scout.md +239 -0
  86. package/commands/setup.md +618 -0
  87. package/commands/snapshot.md +147 -0
  88. package/commands/speakers.md +84 -0
  89. package/commands/splash.md +28 -0
  90. package/commands/status.md +75 -0
  91. package/commands/structure-argument.md +42 -0
  92. package/commands/suggest-next.md +80 -0
  93. package/commands/systems-thinking.md +40 -0
  94. package/commands/think-hats.md +42 -0
  95. package/commands/update.md +181 -0
  96. package/commands/user-needs.md +40 -0
  97. package/commands/validate.md +40 -0
  98. package/commands/value-proposition.md +61 -0
  99. package/commands/vault.md +180 -0
  100. package/commands/visualize.md +52 -0
  101. package/commands/whitespace.md +507 -0
  102. package/commands/wiki.md +69 -0
  103. package/hooks/hooks.json +381 -0
  104. package/hooks/run-hook.cmd +64 -0
  105. package/lib/__init__.py +0 -0
  106. package/lib/__pycache__/__init__.cpython-312.pyc +0 -0
  107. package/lib/agents/auto-explore-agent.cjs +1043 -0
  108. package/lib/agents/reverse-salient-agent.cjs +679 -0
  109. package/lib/agents/tension-hook-agent.cjs +544 -0
  110. package/lib/brain/ROOM.md +44 -0
  111. package/lib/brain/chain-recommender.cjs +301 -0
  112. package/lib/chat/chat-context.js +185 -0
  113. package/lib/chat/chat-panel.js +721 -0
  114. package/lib/chat/fabric-chat.cjs +288 -0
  115. package/lib/chat/generative-tools.js +219 -0
  116. package/lib/conversation/ROOM.md +39 -0
  117. package/lib/conversation/classifier-rules.json +38 -0
  118. package/lib/conversation/classifier.cjs +264 -0
  119. package/lib/conversation/operator.cjs +287 -0
  120. package/lib/copy/115-spec-strings.cjs +55 -0
  121. package/lib/core/__init__.py +0 -0
  122. package/lib/core/__nav-stub.cjs +14 -0
  123. package/lib/core/__pycache__/__init__.cpython-312.pyc +0 -0
  124. package/lib/core/__pycache__/rs-math.cpython-312.pyc +0 -0
  125. package/lib/core/__pycache__/rs_cache.cpython-312.pyc +0 -0
  126. package/lib/core/__pycache__/rs_corpus.cpython-312.pyc +0 -0
  127. package/lib/core/__pycache__/rs_hybrid.cpython-312.pyc +0 -0
  128. package/lib/core/__pycache__/rs_math.cpython-312.pyc +0 -0
  129. package/lib/core/__pycache__/rs_rooms.cpython-312.pyc +0 -0
  130. package/lib/core/artifact-id.cjs +148 -0
  131. package/lib/core/asset-ops.cjs +151 -0
  132. package/lib/core/auto-commit-throttle.cjs +129 -0
  133. package/lib/core/bearer-token.cjs +199 -0
  134. package/lib/core/brain-client.cjs +865 -0
  135. package/lib/core/brain-derivation-prompts.cjs +326 -0
  136. package/lib/core/brain-derivation-queue.cjs +431 -0
  137. package/lib/core/brain-derivation.cjs +580 -0
  138. package/lib/core/brain-md-schema.cjs +528 -0
  139. package/lib/core/brain-md-staleness.cjs +357 -0
  140. package/lib/core/brain-response-sanitize.cjs +188 -0
  141. package/lib/core/bridge-writer.cjs +477 -0
  142. package/lib/core/chat-context-builder.cjs +253 -0
  143. package/lib/core/cross-room-aggregator.cjs +762 -0
  144. package/lib/core/daily-briefing.cjs +438 -0
  145. package/lib/core/decision-capture.cjs +618 -0
  146. package/lib/core/deep-links.cjs +82 -0
  147. package/lib/core/dispatch-optimizer.cjs +354 -0
  148. package/lib/core/dual-path-detector.cjs +84 -0
  149. package/lib/core/dual-path-detector.test.cjs +334 -0
  150. package/lib/core/exports-log.cjs +79 -0
  151. package/lib/core/feynman-minto-invariants.cjs +605 -0
  152. package/lib/core/folder-memory-async.cjs +338 -0
  153. package/lib/core/folder-memory-shared.cjs +890 -0
  154. package/lib/core/folder-memory.cjs +416 -0
  155. package/lib/core/framework-chain-composer.cjs +411 -0
  156. package/lib/core/frontmatter-schemas.cjs +330 -0
  157. package/lib/core/git-ops.cjs +141 -0
  158. package/lib/core/graph-ops.cjs +258 -0
  159. package/lib/core/hat-persistence.cjs +362 -0
  160. package/lib/core/index.cjs +60 -0
  161. package/lib/core/integration-registry.cjs +232 -0
  162. package/lib/core/intelligence-cascade.cjs +661 -0
  163. package/lib/core/lazygraph-ops.cjs +1057 -0
  164. package/lib/core/lru-cache.cjs +139 -0
  165. package/lib/core/mcp-profiles.cjs +182 -0
  166. package/lib/core/meeting-ops.cjs +54 -0
  167. package/lib/core/memory-ops.cjs +600 -0
  168. package/lib/core/migrations/ROOM.md +33 -0
  169. package/lib/core/migrations/phase-109-nodes-provenance.cjs +339 -0
  170. package/lib/core/migrations/phase-109-session-focus.cjs +99 -0
  171. package/lib/core/model-profiles.cjs +246 -0
  172. package/lib/core/mullins-scaffold.cjs +160 -0
  173. package/lib/core/nav-dial.cjs +316 -0
  174. package/lib/core/navigation/ROOM.md +15 -0
  175. package/lib/core/navigation/explanation.cjs +43 -0
  176. package/lib/core/navigation/focus.cjs +135 -0
  177. package/lib/core/navigation/ingestion.cjs +82 -0
  178. package/lib/core/navigation/insights.cjs +350 -0
  179. package/lib/core/navigation/memory-events.cjs +118 -0
  180. package/lib/core/navigation/neighborhood.cjs +78 -0
  181. package/lib/core/navigation/packet.cjs +182 -0
  182. package/lib/core/navigation/room-home.cjs +127 -0
  183. package/lib/core/navigation/transitions.cjs +82 -0
  184. package/lib/core/navigation-engine-shared.cjs +242 -0
  185. package/lib/core/navigation-engine.cjs +664 -0
  186. package/lib/core/navigation.cjs +60 -0
  187. package/lib/core/nl-graph-queries.cjs +164 -0
  188. package/lib/core/offer-presenter.cjs +406 -0
  189. package/lib/core/opportunity-extractor.cjs +183 -0
  190. package/lib/core/opportunity-ops.cjs +1371 -0
  191. package/lib/core/persona-ops.cjs +537 -0
  192. package/lib/core/persona-taxonomy.cjs +190 -0
  193. package/lib/core/platform-gates.cjs +120 -0
  194. package/lib/core/platform.cjs +257 -0
  195. package/lib/core/proactive-intelligence.cjs +528 -0
  196. package/lib/core/problem-type-router.cjs +315 -0
  197. package/lib/core/reasoning-ops.cjs +639 -0
  198. package/lib/core/reverse-salient-persona-suffix.cjs +115 -0
  199. package/lib/core/room-classifier-strict-mode.cjs +229 -0
  200. package/lib/core/room-db.cjs +127 -0
  201. package/lib/core/room-ops-async.cjs +92 -0
  202. package/lib/core/room-ops-shared.cjs +64 -0
  203. package/lib/core/room-ops-sync.cjs +70 -0
  204. package/lib/core/room-ops.cjs +32 -0
  205. package/lib/core/room-type-detector.cjs +386 -0
  206. package/lib/core/rs-brain-substrate-prompts.cjs +129 -0
  207. package/lib/core/rs-brain-substrate.cjs +570 -0
  208. package/lib/core/rs-breakthrough-scorer.cjs +255 -0
  209. package/lib/core/rs-canon-violations.cjs +82 -0
  210. package/lib/core/rs-chain-feeder.cjs +343 -0
  211. package/lib/core/rs-commercial-assessor.cjs +280 -0
  212. package/lib/core/rs-differential-scorer.cjs +376 -0
  213. package/lib/core/rs-domain-analyzer.cjs +385 -0
  214. package/lib/core/rs-egress-prompts.cjs +113 -0
  215. package/lib/core/rs-egress-telemetry.cjs +225 -0
  216. package/lib/core/rs-egress-violations.cjs +53 -0
  217. package/lib/core/rs-expert-mapper.cjs +467 -0
  218. package/lib/core/rs-fetcher-academic.cjs +697 -0
  219. package/lib/core/rs-fetcher-experts.cjs +314 -0
  220. package/lib/core/rs-fetcher-industry.cjs +731 -0
  221. package/lib/core/rs-fetcher-patents.cjs +564 -0
  222. package/lib/core/rs-innovation-classifier.cjs +194 -0
  223. package/lib/core/rs-mind-map.cjs +656 -0
  224. package/lib/core/rs-neo4j-writer.cjs +388 -0
  225. package/lib/core/rs-nl-to-query.cjs +425 -0
  226. package/lib/core/rs-pinecone-bridge.cjs +303 -0
  227. package/lib/core/rs-preprocessor.cjs +350 -0
  228. package/lib/core/rs-query-matrix.cjs +316 -0
  229. package/lib/core/rs-query-to-text.cjs +438 -0
  230. package/lib/core/rs-sqlite-mirror.cjs +443 -0
  231. package/lib/core/rs-thesis-generator.cjs +188 -0
  232. package/lib/core/rs_cache.py +479 -0
  233. package/lib/core/rs_corpus.py +468 -0
  234. package/lib/core/rs_hybrid.py +586 -0
  235. package/lib/core/rs_math.py +287 -0
  236. package/lib/core/rs_rooms.py +193 -0
  237. package/lib/core/scheduled-scanner.cjs +463 -0
  238. package/lib/core/scratchpad-ops.cjs +201 -0
  239. package/lib/core/section-8-trace-schema.cjs +138 -0
  240. package/lib/core/section-registry.cjs +111 -0
  241. package/lib/core/session-state.cjs +144 -0
  242. package/lib/core/shallow-doc-parser.cjs +174 -0
  243. package/lib/core/shallow-doc-parser.test.cjs +226 -0
  244. package/lib/core/skill-activation-router.cjs +284 -0
  245. package/lib/core/state-ops.cjs +46 -0
  246. package/lib/core/statusline-cache.cjs +266 -0
  247. package/lib/core/token-estimator.cjs +348 -0
  248. package/lib/core/user-archetype.cjs +239 -0
  249. package/lib/core/user-md-ops.cjs +524 -0
  250. package/lib/core/visual-ops.cjs +624 -0
  251. package/lib/core/write-lock.cjs +149 -0
  252. package/lib/graph/canvas-graph.js +467 -0
  253. package/lib/graph/constellation-config.cjs +299 -0
  254. package/lib/graph/graph-detail-panel.js +165 -0
  255. package/lib/hmi/ROOM.md +47 -0
  256. package/lib/hmi/across-session-memory.cjs +604 -0
  257. package/lib/hmi/cross-room-memory.cjs +575 -0
  258. package/lib/hmi/decoy-tier.cjs +395 -0
  259. package/lib/hmi/jtbd-classifier.cjs +219 -0
  260. package/lib/hmi/jtbd-state.cjs +199 -0
  261. package/lib/hmi/jtbd-taxonomy.json +392 -0
  262. package/lib/hmi/selector-dispatcher.cjs +546 -0
  263. package/lib/hmi/selector-telemetry.cjs +263 -0
  264. package/lib/hmi/shape-f0-renderer.cjs +139 -0
  265. package/lib/hmi/shape-f1-fallback.cjs +80 -0
  266. package/lib/hmi/shape-f1-renderer.cjs +138 -0
  267. package/lib/hmi/shape-f2-renderer.cjs +132 -0
  268. package/lib/hmi/shape-f3-renderer.cjs +66 -0
  269. package/lib/hmi/shape-f4-renderer.cjs +72 -0
  270. package/lib/hmi/shape-f5-renderer.cjs +155 -0
  271. package/lib/hmi/shape-f6-plan-review-renderer.cjs +312 -0
  272. package/lib/hmi/shape-f6-renderer.cjs +144 -0
  273. package/lib/hmi/shape-g-renderer.cjs +219 -0
  274. package/lib/hmi/shape-h-renderer.cjs +222 -0
  275. package/lib/hmi/tier-check.cjs +63 -0
  276. package/lib/import/PRECONDITIONS.md +41 -0
  277. package/lib/import/branding.cjs +210 -0
  278. package/lib/import/branding.test.cjs +235 -0
  279. package/lib/import/classifications-sync.cjs +104 -0
  280. package/lib/import/classifications-sync.test.cjs +129 -0
  281. package/lib/import/enricher.cjs +296 -0
  282. package/lib/import/enricher.test.cjs +273 -0
  283. package/lib/import/integration.test.cjs +376 -0
  284. package/lib/import/manifest.cjs +129 -0
  285. package/lib/import/manifest.schema.json +185 -0
  286. package/lib/import/manifest.test.cjs +123 -0
  287. package/lib/import/meeting-detector.cjs +92 -0
  288. package/lib/import/meeting-detector.test.cjs +100 -0
  289. package/lib/import/person-detector.cjs +229 -0
  290. package/lib/import/person-detector.test.cjs +149 -0
  291. package/lib/import/report.cjs +186 -0
  292. package/lib/import/report.test.cjs +186 -0
  293. package/lib/import/room-md-scaffolder.cjs +49 -0
  294. package/lib/import/router.cjs +224 -0
  295. package/lib/import/router.test.cjs +356 -0
  296. package/lib/import/run-all-tests.cjs +36 -0
  297. package/lib/import/smoke-test.cjs +213 -0
  298. package/lib/import/smoke-test.test.cjs +148 -0
  299. package/lib/import/test-fixtures/collision-vault/preexisting-room/STATE.md +8 -0
  300. package/lib/import/test-fixtures/collision-vault/preexisting-room/problem-definition/onboarding/onboarding.md +7 -0
  301. package/lib/import/test-fixtures/collision-vault/source/onboarding.md +5 -0
  302. package/lib/import/test-fixtures/obsidian-vault/.obsidian/workspace.json +1 -0
  303. package/lib/import/test-fixtures/obsidian-vault/notes/with-wikilinks.md +4 -0
  304. package/lib/import/test-fixtures/tiny-vault/notes/2026-01-15-team-sync.md +9 -0
  305. package/lib/import/test-fixtures/tiny-vault/notes/empty.md +3 -0
  306. package/lib/import/test-fixtures/tiny-vault/notes/onboarding.md +5 -0
  307. package/lib/import/test-fixtures/tiny-vault/notes/pricing.md +5 -0
  308. package/lib/import/test-fixtures/tiny-vault/notes/random.md +4 -0
  309. package/lib/import/undo.test.cjs +199 -0
  310. package/lib/import/vault-scanner.cjs +105 -0
  311. package/lib/import/vault-scanner.test.cjs +67 -0
  312. package/lib/mcp/app-html/dashboard.html +316 -0
  313. package/lib/mcp/app-html/graph.html +428 -0
  314. package/lib/mcp/app-html/mindrian-platform.html +1841 -0
  315. package/lib/mcp/app-html/wiki.html +383 -0
  316. package/lib/mcp/app-views.cjs +322 -0
  317. package/lib/mcp/brain-router.cjs +418 -0
  318. package/lib/mcp/capability-registry.cjs +62 -0
  319. package/lib/mcp/larry-context.cjs +46 -0
  320. package/lib/mcp/larry-server-instructions.md +114 -0
  321. package/lib/mcp/pipeline-state.cjs +275 -0
  322. package/lib/mcp/prompts.cjs +302 -0
  323. package/lib/mcp/resources.cjs +227 -0
  324. package/lib/mcp/session-catchup.cjs +327 -0
  325. package/lib/mcp/surface-detect.cjs +75 -0
  326. package/lib/mcp/tool-router.cjs +1034 -0
  327. package/lib/memory/aaak-compress.cjs +403 -0
  328. package/lib/memory/aaak-compress.test.cjs +288 -0
  329. package/lib/memory/async-artifact-auto-commit.test.cjs +223 -0
  330. package/lib/memory/bearer-token.test.cjs +315 -0
  331. package/lib/memory/brain-cache-lru.test.cjs +259 -0
  332. package/lib/memory/brain-client-query-shape.test.cjs +160 -0
  333. package/lib/memory/brain-derivation-graceful-degradation.test.cjs +1019 -0
  334. package/lib/memory/brain-derivation-queue.test.cjs +539 -0
  335. package/lib/memory/brain-derivation.test.cjs +634 -0
  336. package/lib/memory/brain-derive-command.test.cjs +534 -0
  337. package/lib/memory/brain-md-invariants-validator.test.cjs +704 -0
  338. package/lib/memory/brain-md-schema.test.cjs +467 -0
  339. package/lib/memory/brain-md-staleness.test.cjs +525 -0
  340. package/lib/memory/brain-server-resolution.test.cjs +314 -0
  341. package/lib/memory/chain-recommender.test.cjs +233 -0
  342. package/lib/memory/chat-context.test.cjs +128 -0
  343. package/lib/memory/command-registry.test.cjs +220 -0
  344. package/lib/memory/cross-room-aggregator.test.cjs +909 -0
  345. package/lib/memory/dashboard-server.test.cjs +256 -0
  346. package/lib/memory/debouncer-drain-at-prompt.test.cjs +389 -0
  347. package/lib/memory/decision-capture.test.cjs +632 -0
  348. package/lib/memory/decision-capture.worker.cjs +70 -0
  349. package/lib/memory/explain-decision-command.test.cjs +521 -0
  350. package/lib/memory/explain-decision-footer.test.cjs +316 -0
  351. package/lib/memory/explored-materials-store.cjs +392 -0
  352. package/lib/memory/feynman-minto-guardian.test.cjs +736 -0
  353. package/lib/memory/feynman-minto-invariants.test.cjs +511 -0
  354. package/lib/memory/feynman-prompts-drift.test.cjs +144 -0
  355. package/lib/memory/feynman-prompts.cjs +151 -0
  356. package/lib/memory/feynman-prompts.test.cjs +96 -0
  357. package/lib/memory/folder-memory-quadruple.test.cjs +548 -0
  358. package/lib/memory/folder-memory.test.cjs +503 -0
  359. package/lib/memory/framework-chain-composer.test.cjs +515 -0
  360. package/lib/memory/frontmatter-schema-validator.test.cjs +290 -0
  361. package/lib/memory/heal-command.test.cjs +604 -0
  362. package/lib/memory/index-artifact-transaction.test.cjs +333 -0
  363. package/lib/memory/lazygraph-rs-discoveries-view.test.cjs +122 -0
  364. package/lib/memory/mcp-input-validation.test.cjs +240 -0
  365. package/lib/memory/mcp-server-brain-deps.test.cjs +270 -0
  366. package/lib/memory/mcp-stack-fallback.test.cjs +433 -0
  367. package/lib/memory/minto-debouncer.test.cjs +407 -0
  368. package/lib/memory/minto-debouncer.worker.cjs +46 -0
  369. package/lib/memory/minto-migration-v88.test.cjs +265 -0
  370. package/lib/memory/minto-schema-v88.test.cjs +390 -0
  371. package/lib/memory/mos-status-renderer.test.cjs +631 -0
  372. package/lib/memory/narrative-schema.cjs +376 -0
  373. package/lib/memory/narrative-schema.test.cjs +209 -0
  374. package/lib/memory/nav-dial.test.cjs +414 -0
  375. package/lib/memory/navigation-engine-core.test.cjs +722 -0
  376. package/lib/memory/navigation-invariants.test.cjs +483 -0
  377. package/lib/memory/offer-presenter.test.cjs +554 -0
  378. package/lib/memory/on-stop-snapshot.test.cjs +404 -0
  379. package/lib/memory/pending-tension-store.cjs +373 -0
  380. package/lib/memory/post-compact-reinjection.test.cjs +854 -0
  381. package/lib/memory/post-write-triple.test.cjs +317 -0
  382. package/lib/memory/pre-compact-snapshot.test.cjs +495 -0
  383. package/lib/memory/problem-type-router.test.cjs +656 -0
  384. package/lib/memory/query-efficiency-telemetry.test.cjs +370 -0
  385. package/lib/memory/recompile-room-references.test.cjs +392 -0
  386. package/lib/memory/recompile-room-references.worker.cjs +42 -0
  387. package/lib/memory/record-decision-dual-write.test.cjs +454 -0
  388. package/lib/memory/room-classifier-strict-mode.test.cjs +417 -0
  389. package/lib/memory/room-minto-hook.test.cjs +398 -0
  390. package/lib/memory/rs-discovery-engine.test.cjs +323 -0
  391. package/lib/memory/run-feynman-tests.cjs +1247 -0
  392. package/lib/memory/security-trifecta.test.cjs +312 -0
  393. package/lib/memory/session-start-brain-staleness.test.cjs +363 -0
  394. package/lib/memory/session-start-triple-injection.test.cjs +514 -0
  395. package/lib/memory/sessionstart-banner-formatter.cjs +318 -0
  396. package/lib/memory/sessionstart-minto-banner.test.cjs +373 -0
  397. package/lib/memory/skill-activation-router.test.cjs +419 -0
  398. package/lib/memory/stamp-artifact-write.test.cjs +304 -0
  399. package/lib/memory/statusline-active-room.test.cjs +315 -0
  400. package/lib/memory/statusline-minto-segment.test.cjs +292 -0
  401. package/lib/memory/sync-async-entry-points.test.cjs +204 -0
  402. package/lib/memory/test-bridge-writer-enhanced.cjs +452 -0
  403. package/lib/memory/test-rs-brain-substrate-shape.cjs +529 -0
  404. package/lib/memory/test-rs-brain-substrate.cjs +636 -0
  405. package/lib/memory/test-rs-breakthrough-scorer.cjs +375 -0
  406. package/lib/memory/test-rs-canon-violations.cjs +218 -0
  407. package/lib/memory/test-rs-chain-feeder-core.cjs +344 -0
  408. package/lib/memory/test-rs-chain-feeder-skill-spawn.cjs +297 -0
  409. package/lib/memory/test-rs-commercial-assessor.cjs +385 -0
  410. package/lib/memory/test-rs-differential-scorer.cjs +480 -0
  411. package/lib/memory/test-rs-discovery-engine.cjs +603 -0
  412. package/lib/memory/test-rs-domain-analyzer.cjs +492 -0
  413. package/lib/memory/test-rs-egress-primitives.cjs +420 -0
  414. package/lib/memory/test-rs-expert-mapper.cjs +547 -0
  415. package/lib/memory/test-rs-explain-command.cjs +443 -0
  416. package/lib/memory/test-rs-fetcher-academic.cjs +848 -0
  417. package/lib/memory/test-rs-fetcher-experts.cjs +496 -0
  418. package/lib/memory/test-rs-fetcher-industry.cjs +702 -0
  419. package/lib/memory/test-rs-fetcher-patents.cjs +674 -0
  420. package/lib/memory/test-rs-innovation-classifier.cjs +301 -0
  421. package/lib/memory/test-rs-mind-map.cjs +646 -0
  422. package/lib/memory/test-rs-neo4j-writer.cjs +518 -0
  423. package/lib/memory/test-rs-nl-to-query.cjs +449 -0
  424. package/lib/memory/test-rs-pinecone-bridge.cjs +277 -0
  425. package/lib/memory/test-rs-preprocessor.cjs +433 -0
  426. package/lib/memory/test-rs-query-matrix.cjs +391 -0
  427. package/lib/memory/test-rs-query-to-text.cjs +551 -0
  428. package/lib/memory/test-rs-sqlite-mirror.cjs +649 -0
  429. package/lib/memory/test-rs-thesis-generator.cjs +360 -0
  430. package/lib/memory/triple-context-formatter.cjs +473 -0
  431. package/lib/memory/triple-context-formatter.test.cjs +442 -0
  432. package/lib/memory/user-md-persona.test.cjs +565 -0
  433. package/lib/memory/userpromptsubmit-integration.test.cjs +690 -0
  434. package/lib/memory/validators/README.md +157 -0
  435. package/lib/memory/validators/brain-md-invariants.cjs +475 -0
  436. package/lib/memory/validators/brain-substrate-invariants.cjs +285 -0
  437. package/lib/memory/validators/external-academic-invariants.cjs +249 -0
  438. package/lib/memory/validators/external-industry-invariants.cjs +271 -0
  439. package/lib/memory/validators/external-patents-invariants.cjs +266 -0
  440. package/lib/memory/validators/minto-invariants.cjs +62 -0
  441. package/lib/memory/validators/navigation-invariants.cjs +340 -0
  442. package/lib/memory/validators/queue-health.cjs +95 -0
  443. package/lib/memory/validators/snapshot-integrity.cjs +129 -0
  444. package/lib/memory/validators/stale-lifecycle.cjs +116 -0
  445. package/lib/memory/vault-section-minto-generator-atomic.test.cjs +556 -0
  446. package/lib/memory/vault-section-minto-generator-atomic.worker.cjs +73 -0
  447. package/lib/memory/write-lock-atomic.test.cjs +137 -0
  448. package/lib/memory/write-lock-atomic.worker.cjs +55 -0
  449. package/lib/parity/check-parity.cjs +83 -0
  450. package/lib/presentation/presentation-server.cjs +101 -0
  451. package/lib/presentation/presentation-watcher.cjs +123 -0
  452. package/lib/quickview/hub-server.cjs +719 -0
  453. package/lib/quickview/server.cjs +533 -0
  454. package/lib/render/JTBD-PALETTES.md +145 -0
  455. package/lib/render/ROOM.md +59 -0
  456. package/lib/render/render-v2.cjs +486 -0
  457. package/lib/render/render-v2.test.cjs +267 -0
  458. package/lib/render/render.cjs +65 -0
  459. package/lib/state/ROOM.md +46 -0
  460. package/lib/state/state-md-parser.cjs +215 -0
  461. package/lib/statusline/ROOM.md +38 -0
  462. package/lib/statusline/banner-suppression.cjs +50 -0
  463. package/lib/statusline/surface-detect.cjs +85 -0
  464. package/lib/update-bootstrap.sh.template +145 -0
  465. package/lib/vault/frontmatter-schema.cjs +297 -0
  466. package/lib/vault/room-scanner.cjs +352 -0
  467. package/lib/vault/wikilink-builder.cjs +231 -0
  468. package/lib/vault/wikilink-builder.test.cjs +182 -0
  469. package/lib/wiki/graph-links.cjs +281 -0
  470. package/lib/wiki/page-renderer.cjs +229 -0
  471. package/lib/wiki/wiki-chat.cjs +81 -0
  472. package/lib/wiki/wiki-layout.cjs +1459 -0
  473. package/lib/wiki/wiki-search.cjs +142 -0
  474. package/lib/wiki/wiki-server.cjs +678 -0
  475. package/lib/wiki/wiki-watcher.cjs +105 -0
  476. package/lib/workflow/ROOM.md +47 -0
  477. package/lib/workflow/command-resolver.cjs +155 -0
  478. package/lib/workflow/command-resolver.test.cjs +235 -0
  479. package/package.json +44 -0
  480. package/pipelines/analogy/01-decompose.md +80 -0
  481. package/pipelines/analogy/02-abstract.md +87 -0
  482. package/pipelines/analogy/03-search.md +135 -0
  483. package/pipelines/analogy/04-transfer.md +101 -0
  484. package/pipelines/analogy/05-validate.md +106 -0
  485. package/pipelines/analogy/CHAIN.md +56 -0
  486. package/pipelines/discovery/01-explore-domains.md +44 -0
  487. package/pipelines/discovery/02-think-hats.md +50 -0
  488. package/pipelines/discovery/03-analyze-needs.md +54 -0
  489. package/pipelines/discovery/CHAIN.md +37 -0
  490. package/pipelines/thesis/01-structure-argument.md +45 -0
  491. package/pipelines/thesis/02-challenge-assumptions.md +48 -0
  492. package/pipelines/thesis/03-build-thesis.md +54 -0
  493. package/pipelines/thesis/CHAIN.md +37 -0
  494. package/references/brain/causal-directives.md +91 -0
  495. package/references/brain/causal-enrichment.cypher +165 -0
  496. package/references/brain/command-triggers-schema.md +226 -0
  497. package/references/brain/graph-architecture.md +317 -0
  498. package/references/brain/query-patterns.md +460 -0
  499. package/references/brain/room-hierarchy-schema.md +218 -0
  500. package/references/brain/schema.md +76 -0
  501. package/references/capability-radar/capabilities-index.md +241 -0
  502. package/references/capability-radar/changelog-cache.md +81 -0
  503. package/references/causal/causal-schema.md +103 -0
  504. package/references/design/email-template-standard.md +155 -0
  505. package/references/design/graph-visualization-standard.md +178 -0
  506. package/references/document-generation.md +179 -0
  507. package/references/hsi/HSI-TOOLS-REFERENCE.md +222 -0
  508. package/references/import-config.md +141 -0
  509. package/references/integrations/detection-patterns.md +101 -0
  510. package/references/meeting/artifact-template.md +377 -0
  511. package/references/meeting/cross-meeting-intelligence.md +216 -0
  512. package/references/meeting/cross-relationship-patterns.md +202 -0
  513. package/references/meeting/live-join-interface.md +244 -0
  514. package/references/meeting/section-mapping.md +192 -0
  515. package/references/meeting/segment-classification.md +258 -0
  516. package/references/meeting/speaker-profile-template.md +219 -0
  517. package/references/meeting/summary-template.md +348 -0
  518. package/references/meeting/transcript-patterns.md +226 -0
  519. package/references/methodology/analyze-needs.md +135 -0
  520. package/references/methodology/analyze-systems.md +121 -0
  521. package/references/methodology/analyze-timing.md +149 -0
  522. package/references/methodology/beautiful-question.md +109 -0
  523. package/references/methodology/build-knowledge.md +161 -0
  524. package/references/methodology/build-thesis.md +237 -0
  525. package/references/methodology/challenge-assumptions.md +127 -0
  526. package/references/methodology/diagnose.md +169 -0
  527. package/references/methodology/dominant-designs.md +212 -0
  528. package/references/methodology/explore-domains.md +147 -0
  529. package/references/methodology/explore-futures.md +163 -0
  530. package/references/methodology/explore-trends.md +129 -0
  531. package/references/methodology/find-bottlenecks.md +131 -0
  532. package/references/methodology/grade.md +211 -0
  533. package/references/methodology/index.md +97 -0
  534. package/references/methodology/leadership.md +200 -0
  535. package/references/methodology/lean-canvas.md +116 -0
  536. package/references/methodology/macro-trends.md +192 -0
  537. package/references/methodology/map-unknowns.md +137 -0
  538. package/references/methodology/mullins-7-domains.md +104 -0
  539. package/references/methodology/problem-types.md +65 -0
  540. package/references/methodology/root-cause.md +178 -0
  541. package/references/methodology/sapphire-encoding.md +355 -0
  542. package/references/methodology/scenario-plan.md +178 -0
  543. package/references/methodology/score-innovation.md +154 -0
  544. package/references/methodology/structure-argument.md +158 -0
  545. package/references/methodology/systems-thinking.md +159 -0
  546. package/references/methodology/think-hats.md +147 -0
  547. package/references/methodology/triz-matrix.json +751 -0
  548. package/references/methodology/triz-principles.md +501 -0
  549. package/references/methodology/user-needs.md +199 -0
  550. package/references/methodology/validate.md +163 -0
  551. package/references/methodology/value-proposition.md +244 -0
  552. package/references/opportunities/funding-lifecycle.md +103 -0
  553. package/references/opportunities/grant-api-patterns.md +99 -0
  554. package/references/opportunities/opportunity-template.md +84 -0
  555. package/references/personality/assessment-philosophy.md +72 -0
  556. package/references/personality/lexicon.md +100 -0
  557. package/references/personality/persona-chains.md +56 -0
  558. package/references/personality/pws-lexicon-full.md +499 -0
  559. package/references/personality/voice-dna.md +156 -0
  560. package/references/personas/hat-perspectives.md +76 -0
  561. package/references/personas/persona-template.md +63 -0
  562. package/references/pipeline/act-output-contract.md +88 -0
  563. package/references/pipeline/chains-index.md +39 -0
  564. package/references/pws-profile-generation.md +79 -0
  565. package/references/reasoning/reasoning-schema.md +143 -0
  566. package/references/reasoning/reasoning-template.md +68 -0
  567. package/references/reasoning/run-template.md +38 -0
  568. package/references/research/RESEARCH_14_CLAUDE_CODE_SOURCE_ARCHITECTURE.md +209 -0
  569. package/references/research/RESEARCH_15_V1.8_OPTIMIZATION_JTBD.md +375 -0
  570. package/references/research/RESEARCH_16_NATIVE_FIRST_PLUGIN_ARCHITECTURE.md +575 -0
  571. package/references/research/RESEARCH_17_MCP_UI_FRAMEWORKS.md +272 -0
  572. package/references/taxonomy/TAXONOMY.md +192 -0
  573. package/references/templates/MINTO.md +36 -0
  574. package/references/user-research/2026-04-05-leah-lawrence-session.md +202 -0
  575. package/references/vault-kit/README.md +35 -0
  576. package/references/vault-kit/app.json +12 -0
  577. package/references/vault-kit/appearance.json +12 -0
  578. package/references/vault-kit/graph.json +35 -0
  579. package/references/vault-kit/snippets/mindrian-destijl.css +297 -0
  580. package/references/vault-kit/templates/new-artifact.md +37 -0
  581. package/references/vault-kit/templates/new-meeting-note.md +35 -0
  582. package/references/vault-kit/templates/new-team-profile.md +29 -0
  583. package/references/vault-kit/templates/new-xref.md +35 -0
  584. package/references/visual/symbol-system.md +151 -0
  585. package/skills/MOSDeckEngine/SKILL.md +325 -0
  586. package/skills/brain-connector/SKILL.md +114 -0
  587. package/skills/context-engine/SKILL.md +147 -0
  588. package/skills/conversation-mode/SKILL.md +102 -0
  589. package/skills/larry-personality/SKILL.md +219 -0
  590. package/skills/larry-personality/framework-chains.md +92 -0
  591. package/skills/larry-personality/mode-engine.md +185 -0
  592. package/skills/mullins-scaffold/SKILL.md +61 -0
  593. package/skills/mullins-scaffold/scaffold.json +146 -0
  594. package/skills/pws-methodology/SKILL.md +49 -0
  595. package/skills/room-passive/SKILL.md +165 -0
  596. package/skills/room-proactive/SKILL.md +250 -0
  597. package/skills/ui-system/SKILL.md +277 -0
@@ -0,0 +1,288 @@
1
+ /**
2
+ * MindrianOS Plugin -- Fabric Chat (NL to SQL)
3
+ * Translates natural language questions into SQLite SQL queries
4
+ * against the Room's Fabric (LazyGraph), executes them, and formats results.
5
+ *
6
+ * Uses BYOAPI pattern: user's Claude API key for NL-to-SQL translation.
7
+ * Designed for both Node.js (CJS) and browser (IIFE) environments.
8
+ *
9
+ * Exports: nlToSQL, executeAndFormat, injectContext, GRAPH_SCHEMA
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ // -- Graph Schema (all 14 Thread types + node properties) --
15
+
16
+ var GRAPH_SCHEMA = {
17
+ nodeTypes: [
18
+ {
19
+ name: 'Artifact',
20
+ properties: ['id TEXT PRIMARY KEY', 'title TEXT', 'section TEXT', 'methodology TEXT', 'created TEXT', 'content_hash TEXT'],
21
+ description: 'A markdown knowledge Entry filed in a Room Section'
22
+ },
23
+ {
24
+ name: 'Section',
25
+ properties: ['name TEXT PRIMARY KEY', 'label TEXT'],
26
+ description: 'A domain of knowledge (problem, market, solution, team, etc.)'
27
+ }
28
+ ],
29
+ edgeTypes: [
30
+ { name: 'INFORMS', from: 'Artifact', to: 'Artifact', properties: [], description: 'One Entry references another via wikilink' },
31
+ { name: 'CONTRADICTS', from: 'Artifact', to: 'Artifact', properties: ['confidence TEXT'], description: 'Two Entries make opposing claims (a Tension)' },
32
+ { name: 'CONVERGES', from: 'Artifact', to: 'Artifact', properties: ['term TEXT'], description: 'Same theme in 3+ Entries (a Pattern)' },
33
+ { name: 'ENABLES', from: 'Artifact', to: 'Artifact', properties: [], description: 'One Entry unblocks another' },
34
+ { name: 'INVALIDATES', from: 'Artifact', to: 'Artifact', properties: [], description: 'One Entry makes another stale' },
35
+ { name: 'BELONGS_TO', from: 'Artifact', to: 'Section', properties: [], description: 'Entry is filed in a Section' },
36
+ { name: 'REASONING_INFORMS', from: 'Section', to: 'Section', properties: ['provides TEXT'], description: 'Minto reasoning chain between Sections' },
37
+ { name: 'HSI_CONNECTION', from: 'Artifact', to: 'Artifact', properties: ['hsi_score REAL', 'lsa_sim REAL', 'semantic_sim REAL', 'surprise_type TEXT', 'breakthrough_potential REAL', 'tier TEXT'], description: 'Hidden Structural Insight -- a Surprise connection' },
38
+ { name: 'REVERSE_SALIENT', from: 'Section', to: 'Section', properties: ['differential_score REAL', 'innovation_type TEXT', 'source_artifact TEXT', 'target_artifact TEXT', 'innovation_thesis TEXT'], description: 'Bottleneck -- where understanding lags behind ambition (Hughes 1983)' },
39
+ { name: 'ANALOGOUS_TO', from: 'Artifact', to: 'Artifact', properties: ['analogy_distance TEXT', 'structural_fitness REAL', 'source_domain TEXT', 'transfer_map TEXT', 'discovery_method TEXT'], description: 'Design-by-Analogy cross-domain bridge' },
40
+ { name: 'STRUCTURALLY_ISOMORPHIC', from: 'Section', to: 'Section', properties: ['isomorphism_score REAL', 'mapped_elements TEXT', 'source TEXT'], description: 'Identical relational topology between Sections' },
41
+ { name: 'RESOLVES_VIA', from: 'Artifact', to: 'Artifact', properties: ['resolution_type TEXT', 'triz_principle TEXT', 'analogy_source TEXT', 'confidence REAL'], description: 'Contradiction resolved via analogy or TRIZ principle' },
42
+ { name: 'CAUSES', from: 'Artifact', to: 'Artifact', properties: ['mechanism TEXT', 'confidence REAL', 'framework TEXT', 'direction TEXT'], description: 'One Entry directly causes or triggers effects in another' },
43
+ { name: 'ROOT_CAUSE_OF', from: 'Artifact', to: 'Artifact', properties: ['chain_length INTEGER', 'intermediate_causes TEXT', 'confidence REAL', 'discovery_source TEXT'], description: 'Traces backward to the root cause of a problem chain' }
44
+ ],
45
+ sampleQueries: [
46
+ { question: 'What entries are in the problem-definition section?', sql: "SELECT n2.title, n2.id FROM edges e JOIN nodes n1 ON e.target = n1.id JOIN nodes n2 ON e.source = n2.id WHERE e.type = 'BELONGS_TO' AND n1.id = 'problem-definition'" },
47
+ { question: 'What contradictions exist in this room?', sql: "SELECT n1.title AS from_entry, n2.title AS to_entry, json_extract(e.properties, '$.confidence') AS confidence FROM edges e JOIN nodes n1 ON e.source = n1.id JOIN nodes n2 ON e.target = n2.id WHERE e.type = 'CONTRADICTS'" },
48
+ { question: 'Show all surprises with high breakthrough potential', sql: "SELECT n1.title, n2.title, json_extract(e.properties, '$.hsi_score') AS hsi_score, json_extract(e.properties, '$.surprise_type') AS surprise_type FROM edges e JOIN nodes n1 ON e.source = n1.id JOIN nodes n2 ON e.target = n2.id WHERE e.type = 'HSI_CONNECTION' AND CAST(json_extract(e.properties, '$.breakthrough_potential') AS REAL) > 0.7" },
49
+ { question: 'Which sections have bottlenecks?', sql: "SELECT n1.id AS lagging, n2.id AS leading, json_extract(e.properties, '$.differential_score') AS differential_score, json_extract(e.properties, '$.innovation_thesis') AS innovation_thesis FROM edges e JOIN nodes n1 ON e.source = n1.id JOIN nodes n2 ON e.target = n2.id WHERE e.type = 'REVERSE_SALIENT'" },
50
+ { question: 'How many entries per section?', sql: "SELECT n2.id AS section, n2.title AS label, COUNT(*) AS entry_count FROM edges e JOIN nodes n2 ON e.target = n2.id WHERE e.type = 'BELONGS_TO' GROUP BY n2.id ORDER BY entry_count DESC" },
51
+ { question: 'What cross-domain analogies exist?', sql: "SELECT n1.title, n2.title, json_extract(e.properties, '$.analogy_distance') AS analogy_distance, json_extract(e.properties, '$.source_domain') AS source_domain FROM edges e JOIN nodes n1 ON e.source = n1.id JOIN nodes n2 ON e.target = n2.id WHERE e.type = 'ANALOGOUS_TO'" },
52
+ { question: 'What causes what in this room?', sql: "SELECT n1.title AS cause, n2.title AS effect, json_extract(e.properties, '$.mechanism') AS mechanism FROM edges e JOIN nodes n1 ON e.source = n1.id JOIN nodes n2 ON e.target = n2.id WHERE e.type = 'CAUSES'" },
53
+ { question: 'What are the root causes of problems?', sql: "SELECT n1.title AS root_cause, n2.title AS symptom, json_extract(e.properties, '$.chain_length') AS chain_length FROM edges e JOIN nodes n1 ON e.source = n1.id JOIN nodes n2 ON e.target = n2.id WHERE e.type = 'ROOT_CAUSE_OF'" }
54
+ ]
55
+ };
56
+
57
+ /**
58
+ * Build the schema description string for the NL-to-SQL system prompt.
59
+ * @param {object} [schema] - Optional custom schema override
60
+ * @returns {string} Schema description for LLM context
61
+ */
62
+ function buildSchemaDescription(schema) {
63
+ var s = schema || GRAPH_SCHEMA;
64
+ var lines = [];
65
+
66
+ lines.push('## SQLite Graph Schema');
67
+ lines.push('');
68
+ lines.push('Database: room/.mindrian/room.db');
69
+ lines.push('Tables: nodes (id, label, section, title, metadata JSON), edges (source, target, type, weight, properties JSON)');
70
+ lines.push('');
71
+ lines.push('### Node Types (stored in nodes.label)');
72
+ for (var i = 0; i < s.nodeTypes.length; i++) {
73
+ var nt = s.nodeTypes[i];
74
+ lines.push('- ' + nt.name + ': ' + nt.description);
75
+ lines.push(' Properties (in metadata JSON): ' + nt.properties.join(', '));
76
+ }
77
+
78
+ lines.push('');
79
+ lines.push('### Edge Types (stored in edges.type) -- 14 Thread Types');
80
+ for (var j = 0; j < s.edgeTypes.length; j++) {
81
+ var et = s.edgeTypes[j];
82
+ var propsStr = et.properties.length > 0 ? ' [' + et.properties.join(', ') + ']' : '';
83
+ lines.push('- ' + et.name + ' (' + et.from + ' -> ' + et.to + ')' + propsStr + ': ' + et.description);
84
+ }
85
+
86
+ lines.push('');
87
+ lines.push('### Sample Queries');
88
+ for (var k = 0; k < s.sampleQueries.length; k++) {
89
+ var sq = s.sampleQueries[k];
90
+ lines.push('Q: ' + sq.question);
91
+ lines.push('SQL: ' + sq.sql);
92
+ lines.push('');
93
+ }
94
+
95
+ return lines.join('\n');
96
+ }
97
+
98
+ /**
99
+ * Build the system prompt for NL-to-SQL translation.
100
+ * @param {object} [schema] - Optional custom schema override
101
+ * @returns {string} System prompt
102
+ */
103
+ function buildNlToSQLPrompt(schema) {
104
+ var schemaDesc = buildSchemaDescription(schema);
105
+
106
+ return [
107
+ 'You are a SQLite SQL query translator for MindrianOS.',
108
+ 'Your job is to convert natural language questions about a Room\'s knowledge graph (the Fabric) into valid SQLite SQL queries.',
109
+ '',
110
+ 'RULES:',
111
+ '1. Return ONLY the SQL query -- no explanation, no markdown fencing, no preamble.',
112
+ '2. The database has two main tables: nodes (id, label, section, title, metadata JSON) and edges (source, target, type, weight, properties JSON).',
113
+ '3. Use json_extract(properties, \'$.key\') to access edge properties and json_extract(metadata, \'$.key\') for node metadata.',
114
+ '4. String comparisons are case-sensitive. Use LOWER() for case-insensitive matching.',
115
+ '5. Always use meaningful column aliases (AS ...) for readability.',
116
+ '6. If the question is ambiguous, write a broad query that returns useful results.',
117
+ '7. For graph traversals, JOIN edges with nodes: edges e JOIN nodes n1 ON e.source = n1.id JOIN nodes n2 ON e.target = n2.id.',
118
+ '8. LIMIT results to 25 unless the user asks for all.',
119
+ '9. Use GROUP BY with aggregate functions (COUNT, AVG, etc.).',
120
+ '10. For path queries use recursive CTEs: WITH RECURSIVE path AS (...).',
121
+ '',
122
+ schemaDesc
123
+ ].join('\n');
124
+ }
125
+
126
+ // -- NL to SQL Translation (Browser-compatible, uses fetch) --
127
+
128
+ /**
129
+ * Translate a natural language question to a SQLite SQL query.
130
+ * Uses the Anthropic Messages API (BYOAPI) via fetch.
131
+ *
132
+ * @param {string} question - Natural language question
133
+ * @param {string} apiKey - User's Anthropic API key
134
+ * @param {object} [options] - Optional overrides
135
+ * @param {object} [options.schema] - Custom graph schema
136
+ * @param {string} [options.model] - Model ID (default: claude-haiku-4-20250414)
137
+ * @returns {Promise<{sql: string, error?: string}>}
138
+ */
139
+ async function nlToSQL(question, apiKey, options) {
140
+ options = options || {};
141
+ var model = options.model || 'claude-haiku-4-20250414';
142
+ var systemPrompt = buildNlToSQLPrompt(options.schema);
143
+
144
+ if (!apiKey) {
145
+ return { sql: '', error: 'No API key provided' };
146
+ }
147
+
148
+ if (!question || !question.trim()) {
149
+ return { sql: '', error: 'No question provided' };
150
+ }
151
+
152
+ try {
153
+ var response = await fetch('https://api.anthropic.com/v1/messages', {
154
+ method: 'POST',
155
+ headers: {
156
+ 'Content-Type': 'application/json',
157
+ 'x-api-key': apiKey,
158
+ 'anthropic-version': '2023-06-01',
159
+ 'anthropic-dangerous-direct-browser-access': 'true'
160
+ },
161
+ body: JSON.stringify({
162
+ model: model,
163
+ max_tokens: 512,
164
+ system: systemPrompt,
165
+ messages: [{ role: 'user', content: question }]
166
+ })
167
+ });
168
+
169
+ if (!response.ok) {
170
+ var errText = await response.text();
171
+ var errMsg = 'API error (' + response.status + ')';
172
+ try {
173
+ var errJson = JSON.parse(errText);
174
+ if (errJson.error && errJson.error.message) errMsg = errJson.error.message;
175
+ } catch (_) {}
176
+ return { sql: '', error: errMsg };
177
+ }
178
+
179
+ var data = await response.json();
180
+ var sql = '';
181
+ if (data.content && data.content.length > 0) {
182
+ sql = data.content[0].text.trim();
183
+ // Strip any markdown code fencing the model might add despite instructions
184
+ sql = sql.replace(/^```(?:sql)?\n?/i, '').replace(/\n?```$/i, '').trim();
185
+ }
186
+
187
+ return { sql: sql };
188
+ } catch (err) {
189
+ return { sql: '', error: 'Connection error: ' + (err.message || 'unknown') };
190
+ }
191
+ }
192
+
193
+ // Backward-compat alias
194
+ var nlToCypher = nlToSQL;
195
+
196
+ /**
197
+ * Execute a SQL query against SQLite room.db and format results as a chat-friendly response.
198
+ * For Node.js server-side use (requires lazygraph-ops.cjs connection).
199
+ *
200
+ * @param {string} sql - SQL query string
201
+ * @param {object} conn - node:sqlite DatabaseSync object (from lazygraph-ops openGraph)
202
+ * @returns {Promise<{rows: Array<object>, formatted: string, error?: string}>}
203
+ */
204
+ async function executeAndFormat(sql, conn) {
205
+ if (!sql) {
206
+ return { rows: [], formatted: 'No query to execute.', error: 'Empty query' };
207
+ }
208
+
209
+ try {
210
+ var rows = conn.prepare(sql).all();
211
+
212
+ if (!rows || rows.length === 0) {
213
+ return { rows: [], formatted: 'No results found for this query.' };
214
+ }
215
+
216
+ // Format as markdown table
217
+ var keys = Object.keys(rows[0]);
218
+ var headerRow = '| ' + keys.join(' | ') + ' |';
219
+ var sepRow = '| ' + keys.map(function() { return '---'; }).join(' | ') + ' |';
220
+ var dataRows = rows.map(function(row) {
221
+ return '| ' + keys.map(function(k) {
222
+ var val = row[k];
223
+ if (val === null || val === undefined) return '--';
224
+ if (typeof val === 'object') return JSON.stringify(val);
225
+ return String(val);
226
+ }).join(' | ') + ' |';
227
+ });
228
+
229
+ var formatted = headerRow + '\n' + sepRow + '\n' + dataRows.join('\n');
230
+
231
+ // Add count summary
232
+ formatted += '\n\n*' + rows.length + ' result' + (rows.length === 1 ? '' : 's') + ' returned.*';
233
+
234
+ return { rows: rows, formatted: formatted };
235
+ } catch (err) {
236
+ return { rows: [], formatted: '', error: 'Query error: ' + (err.message || 'unknown') };
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Build a context injection string from a clicked graph element.
242
+ * Used when Constellation node/edge clicks inject context into the chat.
243
+ *
244
+ * @param {string} nodeId - The ID of the clicked node (artifact id or section name)
245
+ * @param {string} nodeType - 'Artifact' or 'Section'
246
+ * @param {string} [label] - Display label of the node
247
+ * @returns {string} A natural language question to inject into chat
248
+ */
249
+ function injectContext(nodeId, nodeType, label) {
250
+ var displayName = label || nodeId;
251
+
252
+ if (nodeType === 'Section') {
253
+ return 'Tell me about the ' + displayName + ' section. What entries does it contain and what are its key connections?';
254
+ }
255
+
256
+ if (nodeType === 'Artifact') {
257
+ return 'Tell me about the entry "' + displayName + '". What does it connect to and what threads involve it?';
258
+ }
259
+
260
+ // Generic fallback
261
+ return 'Tell me about "' + displayName + '".';
262
+ }
263
+
264
+ // -- Module exports --
265
+
266
+ // Node.js CJS
267
+ if (typeof module !== 'undefined' && module.exports) {
268
+ module.exports = {
269
+ GRAPH_SCHEMA: GRAPH_SCHEMA,
270
+ buildSchemaDescription: buildSchemaDescription,
271
+ nlToSQL: nlToSQL,
272
+ nlToCypher: nlToCypher, // backward-compat alias
273
+ executeAndFormat: executeAndFormat,
274
+ injectContext: injectContext
275
+ };
276
+ }
277
+
278
+ // Browser global
279
+ if (typeof window !== 'undefined') {
280
+ window.FabricChat = {
281
+ GRAPH_SCHEMA: GRAPH_SCHEMA,
282
+ buildSchemaDescription: buildSchemaDescription,
283
+ nlToSQL: nlToSQL,
284
+ nlToCypher: nlToCypher, // backward-compat alias
285
+ executeAndFormat: executeAndFormat,
286
+ injectContext: injectContext
287
+ };
288
+ }
@@ -0,0 +1,219 @@
1
+ /**
2
+ * MindrianOS Plugin -- Generative Tools for Larry Chat
3
+ * Defines AI tool definitions (Anthropic API format), execution handlers,
4
+ * and a declarative UI renderer (json-render pattern) for inline components.
5
+ *
6
+ * Tools:
7
+ * - highlightCluster: highlight graph nodes by section or edge type
8
+ * - filterEdgeType: filter graph to show specific edge type
9
+ * - showInsight: render structured insight card inline in chat
10
+ *
11
+ * Zero dependencies. Embeddable via script tag or CJS require.
12
+ * Follows var/IIFE pattern matching canvas-graph.js and chat-panel.js.
13
+ *
14
+ * Usage:
15
+ * GenerativeTools.TOOL_DEFINITIONS // array for Anthropic API tools param
16
+ * GenerativeTools.executeToolCall(name, input, context)
17
+ * GenerativeTools.renderComponent(component) // returns HTML string
18
+ */
19
+
20
+ 'use strict';
21
+
22
+ var GenerativeTools = (function() {
23
+
24
+ // -- Tool definitions (Anthropic API format) --
25
+
26
+ var TOOL_DEFINITIONS = [
27
+ {
28
+ name: 'highlightCluster',
29
+ description: 'Highlight a group of nodes on the knowledge graph. Use for section names (e.g., "market-analysis", "problem-definition") or edge types (CONTRADICTS, CONVERGES, ENABLES, INFORMS). Always call this when the user asks to "show" or "highlight" something on the graph.',
30
+ input_schema: {
31
+ type: 'object',
32
+ properties: {
33
+ group: { type: 'string', description: 'Section name or edge type to highlight (e.g., "market-analysis", "CONTRADICTS")' }
34
+ },
35
+ required: ['group']
36
+ }
37
+ },
38
+ {
39
+ name: 'filterEdgeType',
40
+ description: 'Filter the graph to show only edges of a specific type. Use when user asks about relationships, connections of a specific kind, or wants to focus on contradictions/convergences/etc.',
41
+ input_schema: {
42
+ type: 'object',
43
+ properties: {
44
+ edgeType: { type: 'string', enum: ['CONTRADICTS', 'CONVERGES', 'ENABLES', 'INFORMS', 'HSI_CONNECTION', 'REVERSE_SALIENT'], description: 'Edge type to filter' }
45
+ },
46
+ required: ['edgeType']
47
+ }
48
+ },
49
+ {
50
+ name: 'showInsight',
51
+ description: 'Render a visual insight card in the chat with structured data. Use when presenting analysis results, summaries, or comparisons. The card renders inline in the chat.',
52
+ input_schema: {
53
+ type: 'object',
54
+ properties: {
55
+ title: { type: 'string', description: 'Card title' },
56
+ items: {
57
+ type: 'array',
58
+ items: {
59
+ type: 'object',
60
+ properties: {
61
+ label: { type: 'string' },
62
+ value: { type: 'string' },
63
+ color: { type: 'string', description: 'Optional hex color for accent' }
64
+ },
65
+ required: ['label', 'value']
66
+ },
67
+ description: 'Key-value items to display'
68
+ },
69
+ footer: { type: 'string', description: 'Optional footer text' }
70
+ },
71
+ required: ['title', 'items']
72
+ }
73
+ }
74
+ ];
75
+
76
+ // -- Tool execution --
77
+
78
+ function executeToolCall(toolName, toolInput, context) {
79
+ context = context || {};
80
+ var graph = context.graph || null;
81
+
82
+ if (toolName === 'highlightCluster') {
83
+ if (!graph || typeof graph.highlightCluster !== 'function') {
84
+ return { success: false, message: 'Graph not available on this view' };
85
+ }
86
+ graph.highlightCluster(toolInput.group);
87
+ return { success: true, message: 'Highlighted ' + toolInput.group };
88
+ }
89
+
90
+ if (toolName === 'filterEdgeType') {
91
+ if (!graph || typeof graph.highlightCluster !== 'function') {
92
+ return { success: false, message: 'Graph not available on this view' };
93
+ }
94
+ // highlightCluster already handles edge types
95
+ graph.highlightCluster(toolInput.edgeType);
96
+ return { success: true, message: 'Filtered to ' + toolInput.edgeType + ' edges' };
97
+ }
98
+
99
+ if (toolName === 'showInsight') {
100
+ return {
101
+ success: true,
102
+ rendered: true,
103
+ component: {
104
+ type: 'insight-card',
105
+ title: toolInput.title,
106
+ items: toolInput.items,
107
+ footer: toolInput.footer || ''
108
+ }
109
+ };
110
+ }
111
+
112
+ return { success: false, message: 'Unknown tool: ' + toolName };
113
+ }
114
+
115
+ // -- Declarative UI renderer (json-render pattern, GENUI-01) --
116
+
117
+ function escapeHtml(str) {
118
+ if (!str) return '';
119
+ return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
120
+ }
121
+
122
+ function renderComponent(component) {
123
+ if (!component || !component.type) return '';
124
+
125
+ if (component.type === 'insight-card') {
126
+ return renderInsightCard(component);
127
+ }
128
+
129
+ if (component.type === 'list') {
130
+ return renderList(component);
131
+ }
132
+
133
+ if (component.type === 'table') {
134
+ return renderTable(component);
135
+ }
136
+
137
+ return '<div style="color:var(--text-muted,#666);font-size:11px;">Unknown component: ' + escapeHtml(component.type) + '</div>';
138
+ }
139
+
140
+ function renderInsightCard(comp) {
141
+ var html = '<div style="border-left:3px solid var(--mondrian-yellow,#E8B931);background:rgba(232,185,49,0.06);border-radius:6px;padding:12px 14px;margin:4px 0;font-size:13px;">';
142
+ html += '<div style="font-weight:600;margin-bottom:8px;color:var(--text-primary,#EEF0F4);">' + escapeHtml(comp.title) + '</div>';
143
+
144
+ if (comp.items && comp.items.length) {
145
+ for (var i = 0; i < comp.items.length; i++) {
146
+ var item = comp.items[i];
147
+ var colorDot = item.color
148
+ ? '<span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:' + escapeHtml(item.color) + ';margin-right:6px;vertical-align:middle;"></span>'
149
+ : '';
150
+ html += '<div style="display:flex;align-items:baseline;gap:6px;margin-bottom:4px;line-height:1.4;">';
151
+ html += colorDot;
152
+ html += '<span style="color:var(--text-secondary,#999);min-width:80px;">' + escapeHtml(item.label) + '</span>';
153
+ html += '<span style="color:var(--text-primary,#EEF0F4);">' + escapeHtml(item.value) + '</span>';
154
+ html += '</div>';
155
+ }
156
+ }
157
+
158
+ if (comp.footer) {
159
+ html += '<div style="margin-top:8px;font-size:11px;color:var(--text-muted,#666);border-top:1px solid var(--border-color,#2A2A2A);padding-top:6px;">' + escapeHtml(comp.footer) + '</div>';
160
+ }
161
+
162
+ html += '</div>';
163
+ return html;
164
+ }
165
+
166
+ function renderList(comp) {
167
+ var html = '<div style="border-left:3px solid var(--mondrian-blue,#1B3B6F);background:rgba(27,59,111,0.06);border-radius:6px;padding:12px 14px;margin:4px 0;font-size:13px;">';
168
+ if (comp.title) {
169
+ html += '<div style="font-weight:600;margin-bottom:8px;color:var(--text-primary,#EEF0F4);">' + escapeHtml(comp.title) + '</div>';
170
+ }
171
+ if (comp.items && comp.items.length) {
172
+ html += '<ul style="margin:0;padding-left:18px;color:var(--text-primary,#EEF0F4);">';
173
+ for (var i = 0; i < comp.items.length; i++) {
174
+ var item = typeof comp.items[i] === 'string' ? comp.items[i] : (comp.items[i].label || comp.items[i].value || '');
175
+ html += '<li style="margin-bottom:3px;line-height:1.4;">' + escapeHtml(item) + '</li>';
176
+ }
177
+ html += '</ul>';
178
+ }
179
+ html += '</div>';
180
+ return html;
181
+ }
182
+
183
+ function renderTable(comp) {
184
+ var html = '<div style="border-left:3px solid var(--mondrian-red,#C23B22);background:rgba(194,59,34,0.06);border-radius:6px;padding:12px 14px;margin:4px 0;font-size:12px;overflow-x:auto;">';
185
+ if (comp.title) {
186
+ html += '<div style="font-weight:600;margin-bottom:8px;font-size:13px;color:var(--text-primary,#EEF0F4);">' + escapeHtml(comp.title) + '</div>';
187
+ }
188
+ if (comp.headers && comp.rows) {
189
+ html += '<table style="width:100%;border-collapse:collapse;">';
190
+ html += '<thead><tr>';
191
+ for (var h = 0; h < comp.headers.length; h++) {
192
+ html += '<th style="text-align:left;padding:4px 8px;border-bottom:1px solid var(--border-color,#2A2A2A);color:var(--text-secondary,#999);font-weight:500;">' + escapeHtml(comp.headers[h]) + '</th>';
193
+ }
194
+ html += '</tr></thead><tbody>';
195
+ for (var r = 0; r < comp.rows.length; r++) {
196
+ html += '<tr>';
197
+ var row = comp.rows[r];
198
+ for (var c = 0; c < row.length; c++) {
199
+ html += '<td style="padding:4px 8px;border-bottom:1px solid rgba(42,42,42,0.5);color:var(--text-primary,#EEF0F4);">' + escapeHtml(row[c]) + '</td>';
200
+ }
201
+ html += '</tr>';
202
+ }
203
+ html += '</tbody></table>';
204
+ }
205
+ html += '</div>';
206
+ return html;
207
+ }
208
+
209
+ return {
210
+ TOOL_DEFINITIONS: TOOL_DEFINITIONS,
211
+ executeToolCall: executeToolCall,
212
+ renderComponent: renderComponent
213
+ };
214
+
215
+ })();
216
+
217
+ // Module exports
218
+ if (typeof window !== 'undefined') window.GenerativeTools = GenerativeTools;
219
+ if (typeof module !== 'undefined') module.exports = GenerativeTools;
@@ -0,0 +1,39 @@
1
+ ---
2
+ type: directory-identity
3
+ name: lib/conversation
4
+ purpose: Conversation operator state machine + NL classifier (Phase 99)
5
+ phase: 99
6
+ canon_parts: [3, 4, 7]
7
+ created: 2026-05-01
8
+ ---
9
+
10
+ # lib/conversation/
11
+
12
+ The conversation layer. Owns the explicit operator state machine that makes Larry's per-turn behavior deterministic.
13
+
14
+ ## Files
15
+
16
+ - `operator.cjs` - state primitive: `getCurrent / transition / validate`. Per-room JSON at `<roomDir>/.mindrian/conversation-operator.json`. Cold-start default: JUST_TALK. Atomic writes (mktemp + rename). Every transition emits an `OPERATOR_TRANSITION` typed edge to the local graph (Canon Part 4).
17
+ - `classifier.cjs` (Plan 99-02) - heuristic NL classifier. Detects operator transitions from user messages + tool invocations. No LLM round-trip (D-10). Confidence threshold 0.6 (D-12).
18
+ - `entity-signals.cjs` (DEFERRED to Phase 102.A) - shared lexicon for entity-introduction signals. Phase 99 ships an inline regex matcher inside classifier.cjs.
19
+
20
+ ## The five operators
21
+
22
+ | Operator | Render contract |
23
+ |----------|-----------------|
24
+ | JUST_TALK | Prose only. No 4-zone. No Zone 4. No Intelligence Strip. |
25
+ | EXPLORE_CAPTURE | Prose during talk; Shape E only on crystallization with Shape F.4 confirmation gate. |
26
+ | BUILD_ROOM | Every response ends with 4-zone anatomy + Zone 4 footer. |
27
+ | METHODOLOGY | No shape mid-session. Shape E or F at gate points only. Banned: spontaneous Zone 4 footers. |
28
+ | DECISION_GATE | Shape F.x active. Keyboard input only. No prose. |
29
+
30
+ ## Canon Part 8 boundary (LOCAL ONLY)
31
+
32
+ This directory writes only to `<roomDir>/.mindrian/conversation-operator.json` and `<roomDir>/.room-graph/room.db`. Never to Brain. Never queries Brain. Operator transitions are LOCAL data per Canon Part 8.
33
+
34
+ ## Consumers
35
+
36
+ - Phase 100 `lib/hmi/jtbd-classifier.cjs` reads operator as classifier input (stratum 2).
37
+ - Phase 102 `lib/render/render-v2.cjs` consumes operator via `render(zones, mode, operator, tier)`.
38
+ - Phase 95.1 drift class F detector reads operator to suppress false-positives during legitimate METHODOLOGY-mode silence.
39
+ - Sprites Workspace v2.0 reads the state file directly to render the right UI mode.
@@ -0,0 +1,38 @@
1
+ {
2
+ "schema_version": "1.0.0",
3
+ "comment": "Phase 99-02 heuristic classifier rules. Tunable without code edits. Schema documented in 99-02-PLAN.md task 1.",
4
+ "tool_markers": [
5
+ { "pattern_type": "regex", "pattern": "^/mos:room\\b", "target_op": "BUILD_ROOM", "weight": 0.95, "trigger": "mos_command" },
6
+ { "pattern_type": "regex", "pattern": "^/mos:operator\\b", "target_op": null, "weight": 0.0, "trigger": null, "comment": "no transition; just shows state" },
7
+ { "pattern_type": "regex", "pattern": "^/mos:status\\b", "target_op": null, "weight": 0.0, "trigger": null, "comment": "diagnostic; does not change operator" },
8
+ { "pattern_type": "regex", "pattern": "^/mos:[a-z-]+", "target_op": "METHODOLOGY", "weight": 0.95, "trigger": "mos_command" },
9
+ { "pattern_type": "literal", "pattern": "/exit", "target_op": "BUILD_ROOM", "weight": 0.95, "trigger": "mos_command", "from_required": "METHODOLOGY" }
10
+ ],
11
+ "intent_patterns": [
12
+ { "pattern_type": "literal_ci", "pattern": "just talking", "target_op": "JUST_TALK", "weight": 0.7 },
13
+ { "pattern_type": "literal_ci", "pattern": "set this aside", "target_op": "JUST_TALK", "weight": 0.7 },
14
+ { "pattern_type": "literal_ci", "pattern": "off topic", "target_op": "JUST_TALK", "weight": 0.6 },
15
+ { "pattern_type": "literal_ci", "pattern": "by the way", "target_op": "JUST_TALK", "weight": 0.3 },
16
+ { "pattern_type": "literal_ci", "pattern": "let's file this", "target_op": "BUILD_ROOM", "weight": 0.7 },
17
+ { "pattern_type": "literal_ci", "pattern": "lets file this", "target_op": "BUILD_ROOM", "weight": 0.7 },
18
+ { "pattern_type": "literal_ci", "pattern": "add to the room", "target_op": "BUILD_ROOM", "weight": 0.7 },
19
+ { "pattern_type": "literal_ci", "pattern": "file this", "target_op": "BUILD_ROOM", "weight": 0.6 },
20
+ { "pattern_type": "literal_ci", "pattern": "save this", "target_op": "BUILD_ROOM", "weight": 0.6 },
21
+ { "pattern_type": "literal_ci", "pattern": "capture this", "target_op": "BUILD_ROOM", "weight": 0.6 },
22
+ { "pattern_type": "literal_ci", "pattern": "interesting", "target_op": "EXPLORE_CAPTURE", "weight": 0.4 },
23
+ { "pattern_type": "literal_ci", "pattern": "worth noting", "target_op": "EXPLORE_CAPTURE", "weight": 0.5 },
24
+ { "pattern_type": "literal_ci", "pattern": "did you know", "target_op": "EXPLORE_CAPTURE", "weight": 0.4 },
25
+ { "pattern_type": "literal_ci", "pattern": "i noticed", "target_op": "EXPLORE_CAPTURE", "weight": 0.5 },
26
+ { "pattern_type": "literal_ci", "pattern": "i wonder", "target_op": "EXPLORE_CAPTURE", "weight": 0.4 }
27
+ ],
28
+ "entity_signals": [
29
+ { "pattern_type": "regex", "pattern": "\\b[A-Z][a-z]+\\s+[A-Z][a-z]+\\b", "name": "person_full_name", "boost_op": "EXPLORE_CAPTURE", "weight": 0.3 },
30
+ { "pattern_type": "regex_ci", "pattern": "\\b(by|before|deadline|due|eod|eow)\\b", "name": "deadline_word", "boost_op": "EXPLORE_CAPTURE", "weight": 0.3 },
31
+ { "pattern_type": "regex", "pattern": "\\bQ[1-4]\\b", "name": "fiscal_quarter", "boost_op": "EXPLORE_CAPTURE", "weight": 0.3 },
32
+ { "pattern_type": "regex_ci", "pattern": "\\b(venture|startup|company|project)\\s+[\"']?[A-Z]", "name": "venture_name", "boost_op": "EXPLORE_CAPTURE", "weight": 0.3 }
33
+ ],
34
+ "thresholds": {
35
+ "transition_min_confidence": 0.6,
36
+ "tool_marker_override_floor": 0.95
37
+ }
38
+ }