@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.
- package/.claude-plugin/plugin.json +21 -0
- package/.mcp.json +9 -0
- package/CHANGELOG.md +3333 -0
- package/LICENSE +123 -0
- package/README.md +673 -0
- package/agents/brain-query.md +80 -0
- package/agents/framework-runner.md +237 -0
- package/agents/grading.md +188 -0
- package/agents/investor.md +128 -0
- package/agents/larry-extended.md +135 -0
- package/agents/opportunity-scanner.md +91 -0
- package/agents/persona-analyst.md +132 -0
- package/agents/research.md +89 -0
- package/agents/reverse-salient-agent.md +27 -0
- package/bin/cli.js +142 -0
- package/bin/mindrian-mcp-server.cjs +182 -0
- package/bin/mindrian-tools.cjs +765 -0
- package/commands/act.md +439 -0
- package/commands/admin.md +404 -0
- package/commands/analyze-needs.md +42 -0
- package/commands/analyze-systems.md +39 -0
- package/commands/analyze-timing.md +42 -0
- package/commands/auto-explore.md +64 -0
- package/commands/beautiful-question.md +40 -0
- package/commands/brain-derive.md +78 -0
- package/commands/build-knowledge.md +42 -0
- package/commands/build-thesis.md +46 -0
- package/commands/causal.md +234 -0
- package/commands/challenge-assumptions.md +33 -0
- package/commands/compare-ventures.md +83 -0
- package/commands/dashboard.md +110 -0
- package/commands/deep-grade.md +82 -0
- package/commands/diagnose.md +58 -0
- package/commands/diagnostics.md +151 -0
- package/commands/doctor.md +151 -0
- package/commands/dominant-designs.md +40 -0
- package/commands/explain-decision.md +87 -0
- package/commands/explore-domains.md +42 -0
- package/commands/explore-futures.md +40 -0
- package/commands/explore-trends.md +42 -0
- package/commands/export.md +103 -0
- package/commands/file-meeting.md +724 -0
- package/commands/find-analogies.md +188 -0
- package/commands/find-bottlenecks.md +62 -0
- package/commands/find-connections.md +76 -0
- package/commands/funding.md +81 -0
- package/commands/grade.md +203 -0
- package/commands/graph.md +128 -0
- package/commands/hat-briefing.md +125 -0
- package/commands/heal.md +196 -0
- package/commands/help.md +399 -0
- package/commands/hmi-status.md +172 -0
- package/commands/jtbd.md +241 -0
- package/commands/leadership.md +73 -0
- package/commands/lean-canvas.md +40 -0
- package/commands/macro-trends.md +40 -0
- package/commands/map-unknowns.md +40 -0
- package/commands/memory.md +173 -0
- package/commands/models.md +175 -0
- package/commands/mos-reason.md +285 -0
- package/commands/mullins.md +120 -0
- package/commands/new-project.md +481 -0
- package/commands/onboard.md +434 -0
- package/commands/operator.md +149 -0
- package/commands/opportunities.md +144 -0
- package/commands/organize.md +497 -0
- package/commands/persona.md +198 -0
- package/commands/pipeline.md +112 -0
- package/commands/present.md +91 -0
- package/commands/publish.md +201 -0
- package/commands/query.md +124 -0
- package/commands/radar.md +72 -0
- package/commands/reanalyze.md +91 -0
- package/commands/research.md +196 -0
- package/commands/room.md +352 -0
- package/commands/rooms.md +598 -0
- package/commands/root-cause.md +40 -0
- package/commands/rs-experts.md +85 -0
- package/commands/rs-explain.md +100 -0
- package/commands/rs-fetch.md +94 -0
- package/commands/rs-thesis.md +85 -0
- package/commands/scenario-plan.md +40 -0
- package/commands/scheduled-tasks.md +285 -0
- package/commands/score-innovation.md +43 -0
- package/commands/scout.md +239 -0
- package/commands/setup.md +618 -0
- package/commands/snapshot.md +147 -0
- package/commands/speakers.md +84 -0
- package/commands/splash.md +28 -0
- package/commands/status.md +75 -0
- package/commands/structure-argument.md +42 -0
- package/commands/suggest-next.md +80 -0
- package/commands/systems-thinking.md +40 -0
- package/commands/think-hats.md +42 -0
- package/commands/update.md +181 -0
- package/commands/user-needs.md +40 -0
- package/commands/validate.md +40 -0
- package/commands/value-proposition.md +61 -0
- package/commands/vault.md +180 -0
- package/commands/visualize.md +52 -0
- package/commands/whitespace.md +507 -0
- package/commands/wiki.md +69 -0
- package/hooks/hooks.json +381 -0
- package/hooks/run-hook.cmd +64 -0
- package/lib/__init__.py +0 -0
- package/lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/lib/agents/auto-explore-agent.cjs +1043 -0
- package/lib/agents/reverse-salient-agent.cjs +679 -0
- package/lib/agents/tension-hook-agent.cjs +544 -0
- package/lib/brain/ROOM.md +44 -0
- package/lib/brain/chain-recommender.cjs +301 -0
- package/lib/chat/chat-context.js +185 -0
- package/lib/chat/chat-panel.js +721 -0
- package/lib/chat/fabric-chat.cjs +288 -0
- package/lib/chat/generative-tools.js +219 -0
- package/lib/conversation/ROOM.md +39 -0
- package/lib/conversation/classifier-rules.json +38 -0
- package/lib/conversation/classifier.cjs +264 -0
- package/lib/conversation/operator.cjs +287 -0
- package/lib/copy/115-spec-strings.cjs +55 -0
- package/lib/core/__init__.py +0 -0
- package/lib/core/__nav-stub.cjs +14 -0
- package/lib/core/__pycache__/__init__.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs-math.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_cache.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_corpus.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_hybrid.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_math.cpython-312.pyc +0 -0
- package/lib/core/__pycache__/rs_rooms.cpython-312.pyc +0 -0
- package/lib/core/artifact-id.cjs +148 -0
- package/lib/core/asset-ops.cjs +151 -0
- package/lib/core/auto-commit-throttle.cjs +129 -0
- package/lib/core/bearer-token.cjs +199 -0
- package/lib/core/brain-client.cjs +865 -0
- package/lib/core/brain-derivation-prompts.cjs +326 -0
- package/lib/core/brain-derivation-queue.cjs +431 -0
- package/lib/core/brain-derivation.cjs +580 -0
- package/lib/core/brain-md-schema.cjs +528 -0
- package/lib/core/brain-md-staleness.cjs +357 -0
- package/lib/core/brain-response-sanitize.cjs +188 -0
- package/lib/core/bridge-writer.cjs +477 -0
- package/lib/core/chat-context-builder.cjs +253 -0
- package/lib/core/cross-room-aggregator.cjs +762 -0
- package/lib/core/daily-briefing.cjs +438 -0
- package/lib/core/decision-capture.cjs +618 -0
- package/lib/core/deep-links.cjs +82 -0
- package/lib/core/dispatch-optimizer.cjs +354 -0
- package/lib/core/dual-path-detector.cjs +84 -0
- package/lib/core/dual-path-detector.test.cjs +334 -0
- package/lib/core/exports-log.cjs +79 -0
- package/lib/core/feynman-minto-invariants.cjs +605 -0
- package/lib/core/folder-memory-async.cjs +338 -0
- package/lib/core/folder-memory-shared.cjs +890 -0
- package/lib/core/folder-memory.cjs +416 -0
- package/lib/core/framework-chain-composer.cjs +411 -0
- package/lib/core/frontmatter-schemas.cjs +330 -0
- package/lib/core/git-ops.cjs +141 -0
- package/lib/core/graph-ops.cjs +258 -0
- package/lib/core/hat-persistence.cjs +362 -0
- package/lib/core/index.cjs +60 -0
- package/lib/core/integration-registry.cjs +232 -0
- package/lib/core/intelligence-cascade.cjs +661 -0
- package/lib/core/lazygraph-ops.cjs +1057 -0
- package/lib/core/lru-cache.cjs +139 -0
- package/lib/core/mcp-profiles.cjs +182 -0
- package/lib/core/meeting-ops.cjs +54 -0
- package/lib/core/memory-ops.cjs +600 -0
- package/lib/core/migrations/ROOM.md +33 -0
- package/lib/core/migrations/phase-109-nodes-provenance.cjs +339 -0
- package/lib/core/migrations/phase-109-session-focus.cjs +99 -0
- package/lib/core/model-profiles.cjs +246 -0
- package/lib/core/mullins-scaffold.cjs +160 -0
- package/lib/core/nav-dial.cjs +316 -0
- package/lib/core/navigation/ROOM.md +15 -0
- package/lib/core/navigation/explanation.cjs +43 -0
- package/lib/core/navigation/focus.cjs +135 -0
- package/lib/core/navigation/ingestion.cjs +82 -0
- package/lib/core/navigation/insights.cjs +350 -0
- package/lib/core/navigation/memory-events.cjs +118 -0
- package/lib/core/navigation/neighborhood.cjs +78 -0
- package/lib/core/navigation/packet.cjs +182 -0
- package/lib/core/navigation/room-home.cjs +127 -0
- package/lib/core/navigation/transitions.cjs +82 -0
- package/lib/core/navigation-engine-shared.cjs +242 -0
- package/lib/core/navigation-engine.cjs +664 -0
- package/lib/core/navigation.cjs +60 -0
- package/lib/core/nl-graph-queries.cjs +164 -0
- package/lib/core/offer-presenter.cjs +406 -0
- package/lib/core/opportunity-extractor.cjs +183 -0
- package/lib/core/opportunity-ops.cjs +1371 -0
- package/lib/core/persona-ops.cjs +537 -0
- package/lib/core/persona-taxonomy.cjs +190 -0
- package/lib/core/platform-gates.cjs +120 -0
- package/lib/core/platform.cjs +257 -0
- package/lib/core/proactive-intelligence.cjs +528 -0
- package/lib/core/problem-type-router.cjs +315 -0
- package/lib/core/reasoning-ops.cjs +639 -0
- package/lib/core/reverse-salient-persona-suffix.cjs +115 -0
- package/lib/core/room-classifier-strict-mode.cjs +229 -0
- package/lib/core/room-db.cjs +127 -0
- package/lib/core/room-ops-async.cjs +92 -0
- package/lib/core/room-ops-shared.cjs +64 -0
- package/lib/core/room-ops-sync.cjs +70 -0
- package/lib/core/room-ops.cjs +32 -0
- package/lib/core/room-type-detector.cjs +386 -0
- package/lib/core/rs-brain-substrate-prompts.cjs +129 -0
- package/lib/core/rs-brain-substrate.cjs +570 -0
- package/lib/core/rs-breakthrough-scorer.cjs +255 -0
- package/lib/core/rs-canon-violations.cjs +82 -0
- package/lib/core/rs-chain-feeder.cjs +343 -0
- package/lib/core/rs-commercial-assessor.cjs +280 -0
- package/lib/core/rs-differential-scorer.cjs +376 -0
- package/lib/core/rs-domain-analyzer.cjs +385 -0
- package/lib/core/rs-egress-prompts.cjs +113 -0
- package/lib/core/rs-egress-telemetry.cjs +225 -0
- package/lib/core/rs-egress-violations.cjs +53 -0
- package/lib/core/rs-expert-mapper.cjs +467 -0
- package/lib/core/rs-fetcher-academic.cjs +697 -0
- package/lib/core/rs-fetcher-experts.cjs +314 -0
- package/lib/core/rs-fetcher-industry.cjs +731 -0
- package/lib/core/rs-fetcher-patents.cjs +564 -0
- package/lib/core/rs-innovation-classifier.cjs +194 -0
- package/lib/core/rs-mind-map.cjs +656 -0
- package/lib/core/rs-neo4j-writer.cjs +388 -0
- package/lib/core/rs-nl-to-query.cjs +425 -0
- package/lib/core/rs-pinecone-bridge.cjs +303 -0
- package/lib/core/rs-preprocessor.cjs +350 -0
- package/lib/core/rs-query-matrix.cjs +316 -0
- package/lib/core/rs-query-to-text.cjs +438 -0
- package/lib/core/rs-sqlite-mirror.cjs +443 -0
- package/lib/core/rs-thesis-generator.cjs +188 -0
- package/lib/core/rs_cache.py +479 -0
- package/lib/core/rs_corpus.py +468 -0
- package/lib/core/rs_hybrid.py +586 -0
- package/lib/core/rs_math.py +287 -0
- package/lib/core/rs_rooms.py +193 -0
- package/lib/core/scheduled-scanner.cjs +463 -0
- package/lib/core/scratchpad-ops.cjs +201 -0
- package/lib/core/section-8-trace-schema.cjs +138 -0
- package/lib/core/section-registry.cjs +111 -0
- package/lib/core/session-state.cjs +144 -0
- package/lib/core/shallow-doc-parser.cjs +174 -0
- package/lib/core/shallow-doc-parser.test.cjs +226 -0
- package/lib/core/skill-activation-router.cjs +284 -0
- package/lib/core/state-ops.cjs +46 -0
- package/lib/core/statusline-cache.cjs +266 -0
- package/lib/core/token-estimator.cjs +348 -0
- package/lib/core/user-archetype.cjs +239 -0
- package/lib/core/user-md-ops.cjs +524 -0
- package/lib/core/visual-ops.cjs +624 -0
- package/lib/core/write-lock.cjs +149 -0
- package/lib/graph/canvas-graph.js +467 -0
- package/lib/graph/constellation-config.cjs +299 -0
- package/lib/graph/graph-detail-panel.js +165 -0
- package/lib/hmi/ROOM.md +47 -0
- package/lib/hmi/across-session-memory.cjs +604 -0
- package/lib/hmi/cross-room-memory.cjs +575 -0
- package/lib/hmi/decoy-tier.cjs +395 -0
- package/lib/hmi/jtbd-classifier.cjs +219 -0
- package/lib/hmi/jtbd-state.cjs +199 -0
- package/lib/hmi/jtbd-taxonomy.json +392 -0
- package/lib/hmi/selector-dispatcher.cjs +546 -0
- package/lib/hmi/selector-telemetry.cjs +263 -0
- package/lib/hmi/shape-f0-renderer.cjs +139 -0
- package/lib/hmi/shape-f1-fallback.cjs +80 -0
- package/lib/hmi/shape-f1-renderer.cjs +138 -0
- package/lib/hmi/shape-f2-renderer.cjs +132 -0
- package/lib/hmi/shape-f3-renderer.cjs +66 -0
- package/lib/hmi/shape-f4-renderer.cjs +72 -0
- package/lib/hmi/shape-f5-renderer.cjs +155 -0
- package/lib/hmi/shape-f6-plan-review-renderer.cjs +312 -0
- package/lib/hmi/shape-f6-renderer.cjs +144 -0
- package/lib/hmi/shape-g-renderer.cjs +219 -0
- package/lib/hmi/shape-h-renderer.cjs +222 -0
- package/lib/hmi/tier-check.cjs +63 -0
- package/lib/import/PRECONDITIONS.md +41 -0
- package/lib/import/branding.cjs +210 -0
- package/lib/import/branding.test.cjs +235 -0
- package/lib/import/classifications-sync.cjs +104 -0
- package/lib/import/classifications-sync.test.cjs +129 -0
- package/lib/import/enricher.cjs +296 -0
- package/lib/import/enricher.test.cjs +273 -0
- package/lib/import/integration.test.cjs +376 -0
- package/lib/import/manifest.cjs +129 -0
- package/lib/import/manifest.schema.json +185 -0
- package/lib/import/manifest.test.cjs +123 -0
- package/lib/import/meeting-detector.cjs +92 -0
- package/lib/import/meeting-detector.test.cjs +100 -0
- package/lib/import/person-detector.cjs +229 -0
- package/lib/import/person-detector.test.cjs +149 -0
- package/lib/import/report.cjs +186 -0
- package/lib/import/report.test.cjs +186 -0
- package/lib/import/room-md-scaffolder.cjs +49 -0
- package/lib/import/router.cjs +224 -0
- package/lib/import/router.test.cjs +356 -0
- package/lib/import/run-all-tests.cjs +36 -0
- package/lib/import/smoke-test.cjs +213 -0
- package/lib/import/smoke-test.test.cjs +148 -0
- package/lib/import/test-fixtures/collision-vault/preexisting-room/STATE.md +8 -0
- package/lib/import/test-fixtures/collision-vault/preexisting-room/problem-definition/onboarding/onboarding.md +7 -0
- package/lib/import/test-fixtures/collision-vault/source/onboarding.md +5 -0
- package/lib/import/test-fixtures/obsidian-vault/.obsidian/workspace.json +1 -0
- package/lib/import/test-fixtures/obsidian-vault/notes/with-wikilinks.md +4 -0
- package/lib/import/test-fixtures/tiny-vault/notes/2026-01-15-team-sync.md +9 -0
- package/lib/import/test-fixtures/tiny-vault/notes/empty.md +3 -0
- package/lib/import/test-fixtures/tiny-vault/notes/onboarding.md +5 -0
- package/lib/import/test-fixtures/tiny-vault/notes/pricing.md +5 -0
- package/lib/import/test-fixtures/tiny-vault/notes/random.md +4 -0
- package/lib/import/undo.test.cjs +199 -0
- package/lib/import/vault-scanner.cjs +105 -0
- package/lib/import/vault-scanner.test.cjs +67 -0
- package/lib/mcp/app-html/dashboard.html +316 -0
- package/lib/mcp/app-html/graph.html +428 -0
- package/lib/mcp/app-html/mindrian-platform.html +1841 -0
- package/lib/mcp/app-html/wiki.html +383 -0
- package/lib/mcp/app-views.cjs +322 -0
- package/lib/mcp/brain-router.cjs +418 -0
- package/lib/mcp/capability-registry.cjs +62 -0
- package/lib/mcp/larry-context.cjs +46 -0
- package/lib/mcp/larry-server-instructions.md +114 -0
- package/lib/mcp/pipeline-state.cjs +275 -0
- package/lib/mcp/prompts.cjs +302 -0
- package/lib/mcp/resources.cjs +227 -0
- package/lib/mcp/session-catchup.cjs +327 -0
- package/lib/mcp/surface-detect.cjs +75 -0
- package/lib/mcp/tool-router.cjs +1034 -0
- package/lib/memory/aaak-compress.cjs +403 -0
- package/lib/memory/aaak-compress.test.cjs +288 -0
- package/lib/memory/async-artifact-auto-commit.test.cjs +223 -0
- package/lib/memory/bearer-token.test.cjs +315 -0
- package/lib/memory/brain-cache-lru.test.cjs +259 -0
- package/lib/memory/brain-client-query-shape.test.cjs +160 -0
- package/lib/memory/brain-derivation-graceful-degradation.test.cjs +1019 -0
- package/lib/memory/brain-derivation-queue.test.cjs +539 -0
- package/lib/memory/brain-derivation.test.cjs +634 -0
- package/lib/memory/brain-derive-command.test.cjs +534 -0
- package/lib/memory/brain-md-invariants-validator.test.cjs +704 -0
- package/lib/memory/brain-md-schema.test.cjs +467 -0
- package/lib/memory/brain-md-staleness.test.cjs +525 -0
- package/lib/memory/brain-server-resolution.test.cjs +314 -0
- package/lib/memory/chain-recommender.test.cjs +233 -0
- package/lib/memory/chat-context.test.cjs +128 -0
- package/lib/memory/command-registry.test.cjs +220 -0
- package/lib/memory/cross-room-aggregator.test.cjs +909 -0
- package/lib/memory/dashboard-server.test.cjs +256 -0
- package/lib/memory/debouncer-drain-at-prompt.test.cjs +389 -0
- package/lib/memory/decision-capture.test.cjs +632 -0
- package/lib/memory/decision-capture.worker.cjs +70 -0
- package/lib/memory/explain-decision-command.test.cjs +521 -0
- package/lib/memory/explain-decision-footer.test.cjs +316 -0
- package/lib/memory/explored-materials-store.cjs +392 -0
- package/lib/memory/feynman-minto-guardian.test.cjs +736 -0
- package/lib/memory/feynman-minto-invariants.test.cjs +511 -0
- package/lib/memory/feynman-prompts-drift.test.cjs +144 -0
- package/lib/memory/feynman-prompts.cjs +151 -0
- package/lib/memory/feynman-prompts.test.cjs +96 -0
- package/lib/memory/folder-memory-quadruple.test.cjs +548 -0
- package/lib/memory/folder-memory.test.cjs +503 -0
- package/lib/memory/framework-chain-composer.test.cjs +515 -0
- package/lib/memory/frontmatter-schema-validator.test.cjs +290 -0
- package/lib/memory/heal-command.test.cjs +604 -0
- package/lib/memory/index-artifact-transaction.test.cjs +333 -0
- package/lib/memory/lazygraph-rs-discoveries-view.test.cjs +122 -0
- package/lib/memory/mcp-input-validation.test.cjs +240 -0
- package/lib/memory/mcp-server-brain-deps.test.cjs +270 -0
- package/lib/memory/mcp-stack-fallback.test.cjs +433 -0
- package/lib/memory/minto-debouncer.test.cjs +407 -0
- package/lib/memory/minto-debouncer.worker.cjs +46 -0
- package/lib/memory/minto-migration-v88.test.cjs +265 -0
- package/lib/memory/minto-schema-v88.test.cjs +390 -0
- package/lib/memory/mos-status-renderer.test.cjs +631 -0
- package/lib/memory/narrative-schema.cjs +376 -0
- package/lib/memory/narrative-schema.test.cjs +209 -0
- package/lib/memory/nav-dial.test.cjs +414 -0
- package/lib/memory/navigation-engine-core.test.cjs +722 -0
- package/lib/memory/navigation-invariants.test.cjs +483 -0
- package/lib/memory/offer-presenter.test.cjs +554 -0
- package/lib/memory/on-stop-snapshot.test.cjs +404 -0
- package/lib/memory/pending-tension-store.cjs +373 -0
- package/lib/memory/post-compact-reinjection.test.cjs +854 -0
- package/lib/memory/post-write-triple.test.cjs +317 -0
- package/lib/memory/pre-compact-snapshot.test.cjs +495 -0
- package/lib/memory/problem-type-router.test.cjs +656 -0
- package/lib/memory/query-efficiency-telemetry.test.cjs +370 -0
- package/lib/memory/recompile-room-references.test.cjs +392 -0
- package/lib/memory/recompile-room-references.worker.cjs +42 -0
- package/lib/memory/record-decision-dual-write.test.cjs +454 -0
- package/lib/memory/room-classifier-strict-mode.test.cjs +417 -0
- package/lib/memory/room-minto-hook.test.cjs +398 -0
- package/lib/memory/rs-discovery-engine.test.cjs +323 -0
- package/lib/memory/run-feynman-tests.cjs +1247 -0
- package/lib/memory/security-trifecta.test.cjs +312 -0
- package/lib/memory/session-start-brain-staleness.test.cjs +363 -0
- package/lib/memory/session-start-triple-injection.test.cjs +514 -0
- package/lib/memory/sessionstart-banner-formatter.cjs +318 -0
- package/lib/memory/sessionstart-minto-banner.test.cjs +373 -0
- package/lib/memory/skill-activation-router.test.cjs +419 -0
- package/lib/memory/stamp-artifact-write.test.cjs +304 -0
- package/lib/memory/statusline-active-room.test.cjs +315 -0
- package/lib/memory/statusline-minto-segment.test.cjs +292 -0
- package/lib/memory/sync-async-entry-points.test.cjs +204 -0
- package/lib/memory/test-bridge-writer-enhanced.cjs +452 -0
- package/lib/memory/test-rs-brain-substrate-shape.cjs +529 -0
- package/lib/memory/test-rs-brain-substrate.cjs +636 -0
- package/lib/memory/test-rs-breakthrough-scorer.cjs +375 -0
- package/lib/memory/test-rs-canon-violations.cjs +218 -0
- package/lib/memory/test-rs-chain-feeder-core.cjs +344 -0
- package/lib/memory/test-rs-chain-feeder-skill-spawn.cjs +297 -0
- package/lib/memory/test-rs-commercial-assessor.cjs +385 -0
- package/lib/memory/test-rs-differential-scorer.cjs +480 -0
- package/lib/memory/test-rs-discovery-engine.cjs +603 -0
- package/lib/memory/test-rs-domain-analyzer.cjs +492 -0
- package/lib/memory/test-rs-egress-primitives.cjs +420 -0
- package/lib/memory/test-rs-expert-mapper.cjs +547 -0
- package/lib/memory/test-rs-explain-command.cjs +443 -0
- package/lib/memory/test-rs-fetcher-academic.cjs +848 -0
- package/lib/memory/test-rs-fetcher-experts.cjs +496 -0
- package/lib/memory/test-rs-fetcher-industry.cjs +702 -0
- package/lib/memory/test-rs-fetcher-patents.cjs +674 -0
- package/lib/memory/test-rs-innovation-classifier.cjs +301 -0
- package/lib/memory/test-rs-mind-map.cjs +646 -0
- package/lib/memory/test-rs-neo4j-writer.cjs +518 -0
- package/lib/memory/test-rs-nl-to-query.cjs +449 -0
- package/lib/memory/test-rs-pinecone-bridge.cjs +277 -0
- package/lib/memory/test-rs-preprocessor.cjs +433 -0
- package/lib/memory/test-rs-query-matrix.cjs +391 -0
- package/lib/memory/test-rs-query-to-text.cjs +551 -0
- package/lib/memory/test-rs-sqlite-mirror.cjs +649 -0
- package/lib/memory/test-rs-thesis-generator.cjs +360 -0
- package/lib/memory/triple-context-formatter.cjs +473 -0
- package/lib/memory/triple-context-formatter.test.cjs +442 -0
- package/lib/memory/user-md-persona.test.cjs +565 -0
- package/lib/memory/userpromptsubmit-integration.test.cjs +690 -0
- package/lib/memory/validators/README.md +157 -0
- package/lib/memory/validators/brain-md-invariants.cjs +475 -0
- package/lib/memory/validators/brain-substrate-invariants.cjs +285 -0
- package/lib/memory/validators/external-academic-invariants.cjs +249 -0
- package/lib/memory/validators/external-industry-invariants.cjs +271 -0
- package/lib/memory/validators/external-patents-invariants.cjs +266 -0
- package/lib/memory/validators/minto-invariants.cjs +62 -0
- package/lib/memory/validators/navigation-invariants.cjs +340 -0
- package/lib/memory/validators/queue-health.cjs +95 -0
- package/lib/memory/validators/snapshot-integrity.cjs +129 -0
- package/lib/memory/validators/stale-lifecycle.cjs +116 -0
- package/lib/memory/vault-section-minto-generator-atomic.test.cjs +556 -0
- package/lib/memory/vault-section-minto-generator-atomic.worker.cjs +73 -0
- package/lib/memory/write-lock-atomic.test.cjs +137 -0
- package/lib/memory/write-lock-atomic.worker.cjs +55 -0
- package/lib/parity/check-parity.cjs +83 -0
- package/lib/presentation/presentation-server.cjs +101 -0
- package/lib/presentation/presentation-watcher.cjs +123 -0
- package/lib/quickview/hub-server.cjs +719 -0
- package/lib/quickview/server.cjs +533 -0
- package/lib/render/JTBD-PALETTES.md +145 -0
- package/lib/render/ROOM.md +59 -0
- package/lib/render/render-v2.cjs +486 -0
- package/lib/render/render-v2.test.cjs +267 -0
- package/lib/render/render.cjs +65 -0
- package/lib/state/ROOM.md +46 -0
- package/lib/state/state-md-parser.cjs +215 -0
- package/lib/statusline/ROOM.md +38 -0
- package/lib/statusline/banner-suppression.cjs +50 -0
- package/lib/statusline/surface-detect.cjs +85 -0
- package/lib/update-bootstrap.sh.template +145 -0
- package/lib/vault/frontmatter-schema.cjs +297 -0
- package/lib/vault/room-scanner.cjs +352 -0
- package/lib/vault/wikilink-builder.cjs +231 -0
- package/lib/vault/wikilink-builder.test.cjs +182 -0
- package/lib/wiki/graph-links.cjs +281 -0
- package/lib/wiki/page-renderer.cjs +229 -0
- package/lib/wiki/wiki-chat.cjs +81 -0
- package/lib/wiki/wiki-layout.cjs +1459 -0
- package/lib/wiki/wiki-search.cjs +142 -0
- package/lib/wiki/wiki-server.cjs +678 -0
- package/lib/wiki/wiki-watcher.cjs +105 -0
- package/lib/workflow/ROOM.md +47 -0
- package/lib/workflow/command-resolver.cjs +155 -0
- package/lib/workflow/command-resolver.test.cjs +235 -0
- package/package.json +44 -0
- package/pipelines/analogy/01-decompose.md +80 -0
- package/pipelines/analogy/02-abstract.md +87 -0
- package/pipelines/analogy/03-search.md +135 -0
- package/pipelines/analogy/04-transfer.md +101 -0
- package/pipelines/analogy/05-validate.md +106 -0
- package/pipelines/analogy/CHAIN.md +56 -0
- package/pipelines/discovery/01-explore-domains.md +44 -0
- package/pipelines/discovery/02-think-hats.md +50 -0
- package/pipelines/discovery/03-analyze-needs.md +54 -0
- package/pipelines/discovery/CHAIN.md +37 -0
- package/pipelines/thesis/01-structure-argument.md +45 -0
- package/pipelines/thesis/02-challenge-assumptions.md +48 -0
- package/pipelines/thesis/03-build-thesis.md +54 -0
- package/pipelines/thesis/CHAIN.md +37 -0
- package/references/brain/causal-directives.md +91 -0
- package/references/brain/causal-enrichment.cypher +165 -0
- package/references/brain/command-triggers-schema.md +226 -0
- package/references/brain/graph-architecture.md +317 -0
- package/references/brain/query-patterns.md +460 -0
- package/references/brain/room-hierarchy-schema.md +218 -0
- package/references/brain/schema.md +76 -0
- package/references/capability-radar/capabilities-index.md +241 -0
- package/references/capability-radar/changelog-cache.md +81 -0
- package/references/causal/causal-schema.md +103 -0
- package/references/design/email-template-standard.md +155 -0
- package/references/design/graph-visualization-standard.md +178 -0
- package/references/document-generation.md +179 -0
- package/references/hsi/HSI-TOOLS-REFERENCE.md +222 -0
- package/references/import-config.md +141 -0
- package/references/integrations/detection-patterns.md +101 -0
- package/references/meeting/artifact-template.md +377 -0
- package/references/meeting/cross-meeting-intelligence.md +216 -0
- package/references/meeting/cross-relationship-patterns.md +202 -0
- package/references/meeting/live-join-interface.md +244 -0
- package/references/meeting/section-mapping.md +192 -0
- package/references/meeting/segment-classification.md +258 -0
- package/references/meeting/speaker-profile-template.md +219 -0
- package/references/meeting/summary-template.md +348 -0
- package/references/meeting/transcript-patterns.md +226 -0
- package/references/methodology/analyze-needs.md +135 -0
- package/references/methodology/analyze-systems.md +121 -0
- package/references/methodology/analyze-timing.md +149 -0
- package/references/methodology/beautiful-question.md +109 -0
- package/references/methodology/build-knowledge.md +161 -0
- package/references/methodology/build-thesis.md +237 -0
- package/references/methodology/challenge-assumptions.md +127 -0
- package/references/methodology/diagnose.md +169 -0
- package/references/methodology/dominant-designs.md +212 -0
- package/references/methodology/explore-domains.md +147 -0
- package/references/methodology/explore-futures.md +163 -0
- package/references/methodology/explore-trends.md +129 -0
- package/references/methodology/find-bottlenecks.md +131 -0
- package/references/methodology/grade.md +211 -0
- package/references/methodology/index.md +97 -0
- package/references/methodology/leadership.md +200 -0
- package/references/methodology/lean-canvas.md +116 -0
- package/references/methodology/macro-trends.md +192 -0
- package/references/methodology/map-unknowns.md +137 -0
- package/references/methodology/mullins-7-domains.md +104 -0
- package/references/methodology/problem-types.md +65 -0
- package/references/methodology/root-cause.md +178 -0
- package/references/methodology/sapphire-encoding.md +355 -0
- package/references/methodology/scenario-plan.md +178 -0
- package/references/methodology/score-innovation.md +154 -0
- package/references/methodology/structure-argument.md +158 -0
- package/references/methodology/systems-thinking.md +159 -0
- package/references/methodology/think-hats.md +147 -0
- package/references/methodology/triz-matrix.json +751 -0
- package/references/methodology/triz-principles.md +501 -0
- package/references/methodology/user-needs.md +199 -0
- package/references/methodology/validate.md +163 -0
- package/references/methodology/value-proposition.md +244 -0
- package/references/opportunities/funding-lifecycle.md +103 -0
- package/references/opportunities/grant-api-patterns.md +99 -0
- package/references/opportunities/opportunity-template.md +84 -0
- package/references/personality/assessment-philosophy.md +72 -0
- package/references/personality/lexicon.md +100 -0
- package/references/personality/persona-chains.md +56 -0
- package/references/personality/pws-lexicon-full.md +499 -0
- package/references/personality/voice-dna.md +156 -0
- package/references/personas/hat-perspectives.md +76 -0
- package/references/personas/persona-template.md +63 -0
- package/references/pipeline/act-output-contract.md +88 -0
- package/references/pipeline/chains-index.md +39 -0
- package/references/pws-profile-generation.md +79 -0
- package/references/reasoning/reasoning-schema.md +143 -0
- package/references/reasoning/reasoning-template.md +68 -0
- package/references/reasoning/run-template.md +38 -0
- package/references/research/RESEARCH_14_CLAUDE_CODE_SOURCE_ARCHITECTURE.md +209 -0
- package/references/research/RESEARCH_15_V1.8_OPTIMIZATION_JTBD.md +375 -0
- package/references/research/RESEARCH_16_NATIVE_FIRST_PLUGIN_ARCHITECTURE.md +575 -0
- package/references/research/RESEARCH_17_MCP_UI_FRAMEWORKS.md +272 -0
- package/references/taxonomy/TAXONOMY.md +192 -0
- package/references/templates/MINTO.md +36 -0
- package/references/user-research/2026-04-05-leah-lawrence-session.md +202 -0
- package/references/vault-kit/README.md +35 -0
- package/references/vault-kit/app.json +12 -0
- package/references/vault-kit/appearance.json +12 -0
- package/references/vault-kit/graph.json +35 -0
- package/references/vault-kit/snippets/mindrian-destijl.css +297 -0
- package/references/vault-kit/templates/new-artifact.md +37 -0
- package/references/vault-kit/templates/new-meeting-note.md +35 -0
- package/references/vault-kit/templates/new-team-profile.md +29 -0
- package/references/vault-kit/templates/new-xref.md +35 -0
- package/references/visual/symbol-system.md +151 -0
- package/skills/MOSDeckEngine/SKILL.md +325 -0
- package/skills/brain-connector/SKILL.md +114 -0
- package/skills/context-engine/SKILL.md +147 -0
- package/skills/conversation-mode/SKILL.md +102 -0
- package/skills/larry-personality/SKILL.md +219 -0
- package/skills/larry-personality/framework-chains.md +92 -0
- package/skills/larry-personality/mode-engine.md +185 -0
- package/skills/mullins-scaffold/SKILL.md +61 -0
- package/skills/mullins-scaffold/scaffold.json +146 -0
- package/skills/pws-methodology/SKILL.md +49 -0
- package/skills/room-passive/SKILL.md +165 -0
- package/skills/room-proactive/SKILL.md +250 -0
- package/skills/ui-system/SKILL.md +277 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
5
|
+
*
|
|
6
|
+
* Phase 122-03 -- chain-recommender.cjs (recommendFrameworkChain via FEEDS_INTO)
|
|
7
|
+
* ==============================================================================
|
|
8
|
+
* recommendFrameworkChain({ problemType?, currentFramework?, roomState? })
|
|
9
|
+
* -> [frameworkName, ...] (ordered, length 1..4; the seed is element 0)
|
|
10
|
+
*
|
|
11
|
+
* What it does (the MINIMAL Phase-3 surface; rich room-state input -- which
|
|
12
|
+
* sections exist, which is filed -- is a v1.14 follow-up per 122-RESEARCH.md
|
|
13
|
+
* Open Question 2):
|
|
14
|
+
* 1. Picks a seed framework:
|
|
15
|
+
* - currentFramework given -> seed = currentFramework
|
|
16
|
+
* - else problemType (or roomState.problemType) given -> map the enum
|
|
17
|
+
* (UDP / IDP / WDP, or the 'undefined' / 'ill-defined' / 'well-defined'
|
|
18
|
+
* aliases) through lib/core/problem-type-router.cjs to its first
|
|
19
|
+
* recommended skill, then resolve that skill slug to a framework name
|
|
20
|
+
* via data/command-registry.json (the resolver's registry; we do not
|
|
21
|
+
* re-derive the mapping).
|
|
22
|
+
* - else roomState.activeJtbd given -> resolve via lib/hmi/jtbd-taxonomy.json
|
|
23
|
+
* (first methodology hook -> skill slug -> framework name).
|
|
24
|
+
* - else seed = a sensible default ("Beautiful Question Framework").
|
|
25
|
+
* The seed-picking REUSES problem-type-router; it builds no new heavy
|
|
26
|
+
* room reader.
|
|
27
|
+
* 2. Walks FEEDS_INTO from the seed, REUSING lib/core/framework-chain-composer.cjs
|
|
28
|
+
* (proposeNextFramework over already-parsed FEEDS_INTO edges -- it does not
|
|
29
|
+
* hand-roll graph traversal). The edges come from roomState (a pre-parsed
|
|
30
|
+
* edge array roomState.feedsIntoEdges, or a BRAIN.md framework_chain_predictions
|
|
31
|
+
* section body roomState.brainSection that parseFrameworkChainSection parses).
|
|
32
|
+
* Takes up to 3 successors -> [seed, ...successors] (max length 4).
|
|
33
|
+
* 3. Degrades: no edges / no successor / Brain unavailable / any error -> [seed].
|
|
34
|
+
* Never throws, never returns null.
|
|
35
|
+
* composeWorkflow(thatList) (the resolver, lib/workflow/command-resolver.cjs)
|
|
36
|
+
* attaches the commands -- the recommender NEVER names a command itself.
|
|
37
|
+
*
|
|
38
|
+
* Canon Part 8 (Graph Boundary): the only Brain touch is lib/core/brain-client.cjs
|
|
39
|
+
* isAvailable() (a sync boolean). Any FEEDS_INTO Cypher (the 122-04 async wiring)
|
|
40
|
+
* carries ONLY framework names + problem-type / phase enums, bound via
|
|
41
|
+
* brain-client.sanitizeCypherInput and forwarded as $-params -- never a command
|
|
42
|
+
* string, never user content (no artifact bodies, no meeting text, no proprietary
|
|
43
|
+
* numbers). This file contains zero command literals (the pre-commit / test grep
|
|
44
|
+
* guard from 122-02 enforces that).
|
|
45
|
+
*
|
|
46
|
+
* Hard dependency -- brain-cleanup Phase 5 (enrichCausalEdges rewritten to
|
|
47
|
+
* FEEDS_INTO) -- is DONE (per 122-RESEARCH.md + STATE.md), so nothing here is
|
|
48
|
+
* externally blocked.
|
|
49
|
+
*
|
|
50
|
+
* License: BSL 1.1.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
const fs = require('node:fs');
|
|
54
|
+
const path = require('node:path');
|
|
55
|
+
|
|
56
|
+
const composer = require('../core/framework-chain-composer.cjs'); // proposeNextFramework, parseFrameworkChainSection, KNOWN_FRAMEWORKS
|
|
57
|
+
const problemTypeRouter = require('../core/problem-type-router.cjs'); // routeByProblemType (UDP / IDP / WDP -> skill family)
|
|
58
|
+
const brainClient = require('../core/brain-client.cjs'); // the ONLY Brain path: isAvailable() + sanitizeCypherInput
|
|
59
|
+
|
|
60
|
+
// ---------- Frozen constants ----------
|
|
61
|
+
|
|
62
|
+
const DEFAULT_SEED = 'Beautiful Question Framework';
|
|
63
|
+
const MAX_CHAIN_LENGTH = 4; // seed + up to 3 successors
|
|
64
|
+
const MAX_HOPS = MAX_CHAIN_LENGTH - 1;
|
|
65
|
+
|
|
66
|
+
// Problem-type enum aliases -> the canonical UDP / IDP / WDP set that
|
|
67
|
+
// problem-type-router understands. Anything not here yields no router opinion,
|
|
68
|
+
// and the recommender falls through to the next seed source.
|
|
69
|
+
const PROBLEM_TYPE_ALIASES = Object.freeze({
|
|
70
|
+
udp: 'UDP', 'undefined': 'UDP', 'undefined-problem': 'UDP', 'undefined_problem': 'UDP', undefinedproblem: 'UDP',
|
|
71
|
+
idp: 'IDP', 'ill-defined': 'IDP', 'ill_defined': 'IDP', illdefined: 'IDP', 'ill-defined-problem': 'IDP',
|
|
72
|
+
wdp: 'WDP', 'well-defined': 'WDP', 'well_defined': 'WDP', welldefined: 'WDP', 'well-defined-problem': 'WDP',
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// The FEEDS_INTO traversal Cypher template that the 122-04 async wiring binds
|
|
76
|
+
// via $-params. Documented here so the Canon Part 8 boundary is visible: the
|
|
77
|
+
// only bound parameter is a framework name (a generic handle), passed through
|
|
78
|
+
// brainClient.sanitizeCypherInput first. Never interpolated, never carries a
|
|
79
|
+
// command string, never carries user content.
|
|
80
|
+
const FEEDS_INTO_CYPHER =
|
|
81
|
+
'MATCH p=(a:Framework {name:$seed})-[:FEEDS_INTO*1..3]->(b:Framework) ' +
|
|
82
|
+
'RETURN [n IN nodes(p) | n.name] AS chain, length(p) AS depth ' +
|
|
83
|
+
'ORDER BY depth ASC LIMIT 5';
|
|
84
|
+
|
|
85
|
+
// ---------- Registry slug -> framework name (read-only, cached) ----------
|
|
86
|
+
|
|
87
|
+
const REGISTRY_PATH = path.join(__dirname, '..', '..', 'data', 'command-registry.json');
|
|
88
|
+
let _registryCache = null;
|
|
89
|
+
function _loadRegistry() {
|
|
90
|
+
if (_registryCache) return _registryCache;
|
|
91
|
+
try { _registryCache = JSON.parse(fs.readFileSync(REGISTRY_PATH, 'utf8')); }
|
|
92
|
+
catch (_e) { _registryCache = { commands: [] }; } // degrade: empty registry
|
|
93
|
+
return _registryCache;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Resolve a command SLUG (e.g. "beautiful-question") to its first declared
|
|
97
|
+
// framework name via the generated registry. We split the command string on
|
|
98
|
+
// ':' rather than writing the prefix as a literal (the file must stay free of
|
|
99
|
+
// command literals per the Canon Part 8 grep guard). Returns null when the
|
|
100
|
+
// slug is unknown or the registry is empty.
|
|
101
|
+
function _slugToFramework(slug) {
|
|
102
|
+
if (typeof slug !== 'string' || slug.length === 0) return null;
|
|
103
|
+
const reg = _loadRegistry();
|
|
104
|
+
const cmds = Array.isArray(reg.commands) ? reg.commands : [];
|
|
105
|
+
for (const c of cmds) {
|
|
106
|
+
if (!c || typeof c.command !== 'string') continue;
|
|
107
|
+
const parts = c.command.split(':');
|
|
108
|
+
if (parts.length < 2) continue;
|
|
109
|
+
const cmdSlug = parts.slice(1).join(':');
|
|
110
|
+
if (cmdSlug === slug) {
|
|
111
|
+
return (Array.isArray(c.frameworks) && c.frameworks.length > 0) ? c.frameworks[0] : null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ---------- JTBD -> seed framework (read-only, cached, optional) ----------
|
|
118
|
+
|
|
119
|
+
const JTBD_TAXONOMY_PATH = path.join(__dirname, '..', 'hmi', 'jtbd-taxonomy.json');
|
|
120
|
+
let _jtbdCache = null;
|
|
121
|
+
function _loadJtbdTaxonomy() {
|
|
122
|
+
if (_jtbdCache) return _jtbdCache;
|
|
123
|
+
try { _jtbdCache = JSON.parse(fs.readFileSync(JTBD_TAXONOMY_PATH, 'utf8')); }
|
|
124
|
+
catch (_e) { _jtbdCache = { entries: [] }; }
|
|
125
|
+
return _jtbdCache;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function _jtbdToFramework(jtbdId) {
|
|
129
|
+
if (typeof jtbdId !== 'string' || jtbdId.length === 0) return null;
|
|
130
|
+
const tax = _loadJtbdTaxonomy();
|
|
131
|
+
const entries = Array.isArray(tax.entries) ? tax.entries : [];
|
|
132
|
+
const entry = entries.find(function (e) { return e && e.id === jtbdId; });
|
|
133
|
+
if (!entry || !Array.isArray(entry.methodology_hooks) || entry.methodology_hooks.length === 0) return null;
|
|
134
|
+
// methodology_hooks are full command strings (e.g. "mos:diagnose"); split on
|
|
135
|
+
// ':' to get the slug, then resolve via the registry. We never write the
|
|
136
|
+
// command prefix as a literal in this file.
|
|
137
|
+
const firstHook = entry.methodology_hooks[0];
|
|
138
|
+
if (typeof firstHook !== 'string') return null;
|
|
139
|
+
const parts = firstHook.split(':');
|
|
140
|
+
if (parts.length < 2) return null;
|
|
141
|
+
return _slugToFramework(parts.slice(1).join(':'));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ---------- Seed picking ----------
|
|
145
|
+
|
|
146
|
+
function _normalizeProblemType(pt) {
|
|
147
|
+
if (typeof pt !== 'string' || pt.length === 0) return null;
|
|
148
|
+
const lc = pt.trim().toLowerCase();
|
|
149
|
+
if (Object.prototype.hasOwnProperty.call(PROBLEM_TYPE_ALIASES, lc)) return PROBLEM_TYPE_ALIASES[lc];
|
|
150
|
+
// Already a canonical token? routeByProblemType only knows UDP / IDP / WDP.
|
|
151
|
+
const up = pt.trim().toUpperCase();
|
|
152
|
+
if (up === 'UDP' || up === 'IDP' || up === 'WDP') return up;
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// problemType -> seed framework, REUSING problem-type-router. The router
|
|
157
|
+
// returns skill slugs; we resolve the first to a framework via the registry.
|
|
158
|
+
function _seedFromProblemType(pt) {
|
|
159
|
+
const canonical = _normalizeProblemType(pt);
|
|
160
|
+
if (canonical === null) return null;
|
|
161
|
+
let routing;
|
|
162
|
+
try { routing = problemTypeRouter.routeByProblemType(canonical, null); }
|
|
163
|
+
catch (_e) { return null; }
|
|
164
|
+
if (!routing || !Array.isArray(routing.recommended_skills) || routing.recommended_skills.length === 0) return null;
|
|
165
|
+
return _slugToFramework(routing.recommended_skills[0]);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function _pickSeed(problemType, currentFramework, roomState) {
|
|
169
|
+
// 1. An explicit current framework wins (even if not in KNOWN_FRAMEWORKS --
|
|
170
|
+
// the FEEDS_INTO walk just yields [seed] if it has no outgoing edge).
|
|
171
|
+
if (typeof currentFramework === 'string' && currentFramework.trim().length > 0) {
|
|
172
|
+
return currentFramework.trim();
|
|
173
|
+
}
|
|
174
|
+
// 2. problemType (arg) or roomState.problemType -> router -> registry.
|
|
175
|
+
const ptFromArg = _seedFromProblemType(problemType);
|
|
176
|
+
if (ptFromArg) return ptFromArg;
|
|
177
|
+
if (roomState && typeof roomState === 'object') {
|
|
178
|
+
const ptFromRoom = _seedFromProblemType(roomState.problemType);
|
|
179
|
+
if (ptFromRoom) return ptFromRoom;
|
|
180
|
+
// 3. roomState.activeJtbd -> jtbd-taxonomy hook -> registry.
|
|
181
|
+
const jtbdSeed = _jtbdToFramework(roomState.activeJtbd);
|
|
182
|
+
if (jtbdSeed) return jtbdSeed;
|
|
183
|
+
}
|
|
184
|
+
// 4. Sensible default.
|
|
185
|
+
return DEFAULT_SEED;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// ---------- FEEDS_INTO walk (reuse, do not hand-roll) ----------
|
|
189
|
+
|
|
190
|
+
// Collect already-parsed FEEDS_INTO edges from roomState. Two accepted shapes:
|
|
191
|
+
// roomState.feedsIntoEdges -- a pre-parsed array of { from, to, confidence?, ... }
|
|
192
|
+
// roomState.brainSection -- a BRAIN.md framework_chain_predictions section
|
|
193
|
+
// ({ body, ... }); parsed via the composer.
|
|
194
|
+
// Returns [] when neither is present. Never throws.
|
|
195
|
+
function _collectEdges(roomState) {
|
|
196
|
+
if (!roomState || typeof roomState !== 'object') return [];
|
|
197
|
+
if (Array.isArray(roomState.feedsIntoEdges)) return roomState.feedsIntoEdges;
|
|
198
|
+
if (roomState.brainSection && typeof roomState.brainSection === 'object') {
|
|
199
|
+
try { return composer.parseFrameworkChainSection(roomState.brainSection) || []; }
|
|
200
|
+
catch (_e) { return []; }
|
|
201
|
+
}
|
|
202
|
+
// Some callers pass the whole BRAIN.md sections map.
|
|
203
|
+
if (roomState.brainSections && typeof roomState.brainSections === 'object') {
|
|
204
|
+
const sec = roomState.brainSections.framework_chain_predictions;
|
|
205
|
+
if (sec && typeof sec === 'object') {
|
|
206
|
+
try { return composer.parseFrameworkChainSection(sec) || []; }
|
|
207
|
+
catch (_e) { return []; }
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Walk FEEDS_INTO from `seed` over `edges`, REUSING composer.proposeNextFramework.
|
|
214
|
+
// Returns [seed, ...successors] (max length MAX_CHAIN_LENGTH). Cycle-safe.
|
|
215
|
+
function _walkChain(seed, edges) {
|
|
216
|
+
const chain = [seed];
|
|
217
|
+
if (!Array.isArray(edges) || edges.length === 0) return chain;
|
|
218
|
+
const seen = new Set([String(seed).toLowerCase()]);
|
|
219
|
+
let current = seed;
|
|
220
|
+
for (let hop = 0; hop < MAX_HOPS; hop += 1) {
|
|
221
|
+
let proposal;
|
|
222
|
+
try { proposal = composer.proposeNextFramework(current, edges); }
|
|
223
|
+
catch (_e) { break; }
|
|
224
|
+
if (!proposal || typeof proposal.next !== 'string' || proposal.next.length === 0) break;
|
|
225
|
+
const nextLc = proposal.next.toLowerCase();
|
|
226
|
+
if (seen.has(nextLc)) break; // cycle guard
|
|
227
|
+
chain.push(proposal.next);
|
|
228
|
+
seen.add(nextLc);
|
|
229
|
+
current = proposal.next;
|
|
230
|
+
if (chain.length >= MAX_CHAIN_LENGTH) break;
|
|
231
|
+
}
|
|
232
|
+
return chain;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// ---------- Public API ----------
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* recommendFrameworkChain({ problemType?, currentFramework?, roomState? } = {})
|
|
239
|
+
* -> [frameworkName, ...] (ordered, length 1..4; element 0 is the seed)
|
|
240
|
+
*
|
|
241
|
+
* Synchronous. Seeds from problemType / currentFramework / roomState.activeJtbd
|
|
242
|
+
* (reusing problem-type-router), walks FEEDS_INTO from the seed (reusing
|
|
243
|
+
* framework-chain-composer over already-parsed edges supplied via roomState),
|
|
244
|
+
* and degrades to [seed] when there is no outgoing FEEDS_INTO edge, no Brain,
|
|
245
|
+
* or any error. Never throws, never returns null. The returned list is
|
|
246
|
+
* framework names ONLY -- attach commands with composeWorkflow() (the resolver).
|
|
247
|
+
*
|
|
248
|
+
* The "fresh Brain query" branch (a live FEEDS_INTO traversal via
|
|
249
|
+
* brain-client.query with $seed bound through brainClient.sanitizeCypherInput,
|
|
250
|
+
* using FEEDS_INTO_CYPHER above) is wired by 122-04's navigation hook (which is
|
|
251
|
+
* async); here, when brainClient.isAvailable() is true but roomState carries no
|
|
252
|
+
* offline edges, the synchronous path degrades to [seed] -- a true statement
|
|
253
|
+
* (reliability rule 5: degrade, do not fabricate).
|
|
254
|
+
*
|
|
255
|
+
* @param {{ problemType?: string, currentFramework?: string, roomState?: object }} [opts]
|
|
256
|
+
* @returns {string[]}
|
|
257
|
+
*/
|
|
258
|
+
function recommendFrameworkChain(opts) {
|
|
259
|
+
const o = (opts && typeof opts === 'object') ? opts : {};
|
|
260
|
+
let seed;
|
|
261
|
+
try {
|
|
262
|
+
seed = _pickSeed(o.problemType, o.currentFramework, o.roomState);
|
|
263
|
+
} catch (_e) {
|
|
264
|
+
seed = DEFAULT_SEED;
|
|
265
|
+
}
|
|
266
|
+
if (typeof seed !== 'string' || seed.length === 0) seed = DEFAULT_SEED;
|
|
267
|
+
|
|
268
|
+
// Defence-in-depth: any framework name that would ever reach the Brain (the
|
|
269
|
+
// 122-04 async path) is sanitized through the same whitelist brain-client
|
|
270
|
+
// uses for $-bound params. No-op for well-formed names; here it just proves
|
|
271
|
+
// the boundary is honored at the source.
|
|
272
|
+
try {
|
|
273
|
+
if (brainClient && typeof brainClient.isAvailable === 'function' && brainClient.isAvailable()
|
|
274
|
+
&& brainClient._test && typeof brainClient._test.sanitizeCypherInput === 'function') {
|
|
275
|
+
// sanitized seed kept local; the live query is 122-04's async wiring.
|
|
276
|
+
void brainClient._test.sanitizeCypherInput(seed);
|
|
277
|
+
}
|
|
278
|
+
} catch (_e) { /* never let the boundary check throw */ }
|
|
279
|
+
|
|
280
|
+
let edges;
|
|
281
|
+
try { edges = _collectEdges(o.roomState); }
|
|
282
|
+
catch (_e) { edges = []; }
|
|
283
|
+
|
|
284
|
+
let chain;
|
|
285
|
+
try { chain = _walkChain(seed, edges); }
|
|
286
|
+
catch (_e) { chain = [seed]; }
|
|
287
|
+
|
|
288
|
+
// Final shape guard: always a non-empty array of strings, length 1..4.
|
|
289
|
+
if (!Array.isArray(chain) || chain.length === 0) return [seed];
|
|
290
|
+
const cleaned = chain.filter(function (x) { return typeof x === 'string' && x.length > 0; });
|
|
291
|
+
if (cleaned.length === 0) return [seed];
|
|
292
|
+
return cleaned.slice(0, MAX_CHAIN_LENGTH);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
module.exports = {
|
|
296
|
+
recommendFrameworkChain: recommendFrameworkChain,
|
|
297
|
+
// Constants exposed for invariant tests + the 122-04 async wiring.
|
|
298
|
+
DEFAULT_SEED: DEFAULT_SEED,
|
|
299
|
+
MAX_CHAIN_LENGTH: MAX_CHAIN_LENGTH,
|
|
300
|
+
FEEDS_INTO_CYPHER: FEEDS_INTO_CYPHER,
|
|
301
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MindrianOS Plugin -- Chat Context Builder
|
|
3
|
+
* Builds Larry's system prompt from ROOM_DATA for the BYOAPI chat panel.
|
|
4
|
+
*
|
|
5
|
+
* Zero dependencies. Embeddable via script tag or CJS require.
|
|
6
|
+
* Follows var/IIFE pattern matching canvas-graph.js.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
var ChatContext = (function() {
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Build room context string from ROOM_DATA.
|
|
15
|
+
* Summarizes room name, governing thought, sections, and graph stats.
|
|
16
|
+
* @param {object} roomData - The ROOM_DATA object injected into the page
|
|
17
|
+
* @returns {string} Context string, max ~2000 chars
|
|
18
|
+
*/
|
|
19
|
+
function buildRoomContext(roomData) {
|
|
20
|
+
if (!roomData) return 'No room data available.';
|
|
21
|
+
|
|
22
|
+
var parts = [];
|
|
23
|
+
var charBudget = 2000;
|
|
24
|
+
|
|
25
|
+
// Room name
|
|
26
|
+
var roomName = (roomData.state && roomData.state.name)
|
|
27
|
+
|| roomData.roomName
|
|
28
|
+
|| 'Unnamed Room';
|
|
29
|
+
parts.push('Room: ' + roomName);
|
|
30
|
+
|
|
31
|
+
// Stage
|
|
32
|
+
var stage = (roomData.state && roomData.state.stage)
|
|
33
|
+
|| roomData.stage
|
|
34
|
+
|| '';
|
|
35
|
+
if (stage) {
|
|
36
|
+
parts.push('Stage: ' + stage);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Governing thought from MINTO
|
|
40
|
+
if (roomData.minto) {
|
|
41
|
+
var gt = '';
|
|
42
|
+
if (typeof roomData.minto === 'string') {
|
|
43
|
+
// MINTO content as raw string
|
|
44
|
+
var gtMatch = roomData.minto.match(/governing_thought:\s*["']?([^"'\n]+)/);
|
|
45
|
+
if (gtMatch) gt = gtMatch[1].trim();
|
|
46
|
+
} else if (roomData.minto.governing_thought) {
|
|
47
|
+
gt = roomData.minto.governing_thought;
|
|
48
|
+
}
|
|
49
|
+
if (gt) {
|
|
50
|
+
parts.push('Governing Thought: ' + gt);
|
|
51
|
+
}
|
|
52
|
+
// Pyramid levels
|
|
53
|
+
if (roomData.minto.levels && roomData.minto.levels.length > 0) {
|
|
54
|
+
parts.push('MINTO Levels: ' + roomData.minto.levels.join(', '));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Sections with artifact counts
|
|
59
|
+
var sections = (roomData.state && roomData.state.sections)
|
|
60
|
+
|| roomData.sections
|
|
61
|
+
|| [];
|
|
62
|
+
if (sections.length > 0) {
|
|
63
|
+
var sectionLines = [];
|
|
64
|
+
for (var i = 0; i < sections.length; i++) {
|
|
65
|
+
var s = sections[i];
|
|
66
|
+
var label = s.label || s.id || s.name || ('Section ' + (i + 1));
|
|
67
|
+
var count = s.entryCount || s.artifacts || s.count || 0;
|
|
68
|
+
sectionLines.push(' - ' + label + ' (' + count + ' artifacts)');
|
|
69
|
+
}
|
|
70
|
+
parts.push('Sections:\n' + sectionLines.join('\n'));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Graph structure summary
|
|
74
|
+
var graph = roomData.graph;
|
|
75
|
+
if (graph && graph.elements) {
|
|
76
|
+
var nodeCount = (graph.elements.nodes || []).length;
|
|
77
|
+
var edgeCount = (graph.elements.edges || []).length;
|
|
78
|
+
|
|
79
|
+
if (nodeCount > 0 || edgeCount > 0) {
|
|
80
|
+
var graphLine = 'Graph: ' + nodeCount + ' nodes, ' + edgeCount + ' edges';
|
|
81
|
+
|
|
82
|
+
// Edge type distribution
|
|
83
|
+
var edgeTypes = {};
|
|
84
|
+
var edgeArr = graph.elements.edges || [];
|
|
85
|
+
for (var j = 0; j < edgeArr.length; j++) {
|
|
86
|
+
var eType = (edgeArr[j].data && edgeArr[j].data.type) || 'unknown';
|
|
87
|
+
edgeTypes[eType] = (edgeTypes[eType] || 0) + 1;
|
|
88
|
+
}
|
|
89
|
+
var typeStrs = [];
|
|
90
|
+
for (var t in edgeTypes) {
|
|
91
|
+
if (edgeTypes.hasOwnProperty(t)) {
|
|
92
|
+
typeStrs.push(t + ':' + edgeTypes[t]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (typeStrs.length > 0) {
|
|
96
|
+
graphLine += ' [' + typeStrs.join(', ') + ']';
|
|
97
|
+
}
|
|
98
|
+
parts.push(graphLine);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Stats
|
|
103
|
+
if (roomData.stats) {
|
|
104
|
+
var statParts = [];
|
|
105
|
+
if (roomData.stats.meetings) statParts.push(roomData.stats.meetings + ' meetings');
|
|
106
|
+
if (roomData.stats.speakers) statParts.push(roomData.stats.speakers + ' speakers');
|
|
107
|
+
if (roomData.stats.artifacts) statParts.push(roomData.stats.artifacts + ' total artifacts');
|
|
108
|
+
if (statParts.length > 0) {
|
|
109
|
+
parts.push('Stats: ' + statParts.join(', '));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Current view
|
|
114
|
+
if (roomData.currentView) {
|
|
115
|
+
parts.push('Current view: ' + roomData.currentView);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Assemble and truncate
|
|
119
|
+
var result = parts.join('\n');
|
|
120
|
+
if (result.length > charBudget) {
|
|
121
|
+
result = result.slice(0, charBudget - 15) + '\n[...truncated]';
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Build the full system prompt for Larry, embedding voice DNA and room context.
|
|
128
|
+
* @param {string} roomContext - Output of buildRoomContext()
|
|
129
|
+
* @returns {string} Full system prompt
|
|
130
|
+
*/
|
|
131
|
+
function buildSystemPrompt(roomContext) {
|
|
132
|
+
var voiceDNA = [
|
|
133
|
+
'You are Larry, an AI innovation co-founder embedded in a MindrianOS Data Room.',
|
|
134
|
+
'',
|
|
135
|
+
'VOICE RULES:',
|
|
136
|
+
'- Conversational, not academic. Provocative, not condescending.',
|
|
137
|
+
'- Concise: most responses 3-8 sentences, not 30.',
|
|
138
|
+
'- Warm but demanding. Curious, not interrogating.',
|
|
139
|
+
'- If your response looks like it belongs in a PDF, delete it and start over.',
|
|
140
|
+
'',
|
|
141
|
+
'SIGNATURE OPENERS (rotate naturally):',
|
|
142
|
+
'- "Very simply..." when distilling complexity',
|
|
143
|
+
'- "Think about it like this..." when reframing',
|
|
144
|
+
'- "Here\'s what everyone misses..." when revealing hidden insight',
|
|
145
|
+
'- "Let me challenge you with this..." when provoking deeper thinking',
|
|
146
|
+
'- "Notice what\'s happening here..." when surfacing patterns',
|
|
147
|
+
'',
|
|
148
|
+
'REFRAME TECHNIQUE (your power move, use sparingly):',
|
|
149
|
+
'- Flip the user\'s framing to reveal something they didn\'t see.',
|
|
150
|
+
'- "You\'re thinking about this as X. But what if it\'s actually Y?"',
|
|
151
|
+
'- "That\'s not a problem -- that\'s a category containing dozens of problems."',
|
|
152
|
+
'',
|
|
153
|
+
'PACING: Use short punchy sentences for key insights. Let insights breathe.',
|
|
154
|
+
].join('\n');
|
|
155
|
+
|
|
156
|
+
var instructions = [
|
|
157
|
+
'',
|
|
158
|
+
'== Room Context ==',
|
|
159
|
+
roomContext || 'No room context available.',
|
|
160
|
+
'',
|
|
161
|
+
'== Instructions ==',
|
|
162
|
+
'You are Larry, embedded in a MindrianOS Data Room. Answer questions about THIS room\'s content.',
|
|
163
|
+
'You can reference specific sections, artifacts, graph relationships, and the governing thought.',
|
|
164
|
+
'When discussing the room\'s structure, you may reference Simon\'s Architecture of Complexity naturally -- never as a lecture.',
|
|
165
|
+
'You can call tools to highlight graph clusters and filter views.',
|
|
166
|
+
'Stay grounded in the room data above. If asked about something not in the room, say so.',
|
|
167
|
+
].join('\n');
|
|
168
|
+
|
|
169
|
+
return voiceDNA + instructions;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return {
|
|
173
|
+
buildRoomContext: buildRoomContext,
|
|
174
|
+
buildSystemPrompt: buildSystemPrompt
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
})();
|
|
178
|
+
|
|
179
|
+
// Module exports
|
|
180
|
+
if (typeof window !== 'undefined') {
|
|
181
|
+
window.ChatContext = ChatContext;
|
|
182
|
+
}
|
|
183
|
+
if (typeof module !== 'undefined') {
|
|
184
|
+
module.exports = ChatContext;
|
|
185
|
+
}
|