@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,373 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
3
|
+
*
|
|
4
|
+
* Phase 116-01 Wave 1 -- pending-tension-store substrate.
|
|
5
|
+
*
|
|
6
|
+
* JSONL append-only state store at ~/.mindrian/pending-tensions/<roomSlug>.jsonl.
|
|
7
|
+
* Per CONTEXT.md D-07, D-07a, D-07b: JSONL is the decay state machine ground
|
|
8
|
+
* truth; workspace-guard-clean (OUTSIDE plugin repo via os.homedir()); no user
|
|
9
|
+
* content fields per Canon Part 8.
|
|
10
|
+
*
|
|
11
|
+
* Graph-native HARD RULE (memory feedback_reverse_salient_agent_graph_native):
|
|
12
|
+
* 1. Reads route through lib/core/navigation.cjs only -- the Phase 109 D-06
|
|
13
|
+
* chokepoint is preserved (no direct DB module imports here).
|
|
14
|
+
* 2. Brain MCP is OUT of this module's surface area -- Canon Part 8 boundary
|
|
15
|
+
* is preserved (zero outbound network surface, zero remote-graph imports).
|
|
16
|
+
* 3. Telemetry side-channels via stdout / stderr are OUT of this module per
|
|
17
|
+
* RESEARCH Section 13.9 -- the SessionStart hook owns the stdout envelope.
|
|
18
|
+
*
|
|
19
|
+
* Pattern: append-only writer + LWW replay (RESEARCH Section 6.4).
|
|
20
|
+
* - Each tension is represented by its LATEST entry in the JSONL.
|
|
21
|
+
* - State changes are recorded as NEW entries with the same tension_id.
|
|
22
|
+
* - Reader plays the JSONL forward and keeps only the most-recent entry
|
|
23
|
+
* per tension_id (last-write-wins on replay).
|
|
24
|
+
*
|
|
25
|
+
* Concurrency: appendFileSync is POSIX-atomic for lines smaller than PIPE_BUF
|
|
26
|
+
* (typically 4096 bytes; tension entries are well under per RESEARCH 6.5).
|
|
27
|
+
*
|
|
28
|
+
* Pure CJS, node built-ins only, zero new runtime dependencies.
|
|
29
|
+
*/
|
|
30
|
+
'use strict';
|
|
31
|
+
|
|
32
|
+
const fs = require('node:fs');
|
|
33
|
+
const path = require('node:path');
|
|
34
|
+
const os = require('node:os');
|
|
35
|
+
const crypto = require('node:crypto');
|
|
36
|
+
|
|
37
|
+
// ---------- Constants ----------
|
|
38
|
+
|
|
39
|
+
const PENDING_TENSIONS_DIR = path.join(os.homedir(), '.mindrian', 'pending-tensions');
|
|
40
|
+
const VALID_STATES = Object.freeze(new Set(['queued', 'surfaced', 'resolved', 'dropped']));
|
|
41
|
+
const VALID_TYPES = Object.freeze(new Set([
|
|
42
|
+
'contradiction',
|
|
43
|
+
'convergence',
|
|
44
|
+
'stale_decision',
|
|
45
|
+
'open_question',
|
|
46
|
+
]));
|
|
47
|
+
const VALID_RESPONSES = Object.freeze(new Set(['RESOLVE', 'LATER', 'SKIP', 'DROPPED']));
|
|
48
|
+
const TENSION_ID_LEN = 32;
|
|
49
|
+
|
|
50
|
+
// User-content key denylist (Canon Part 8 -- artifact bodies live in the graph,
|
|
51
|
+
// never in this JSONL). Rejection is fail-fast at appendTension time so a
|
|
52
|
+
// caller bug never leaks user content to disk in the canonical state file.
|
|
53
|
+
const USER_CONTENT_KEY_DENYLIST = Object.freeze([
|
|
54
|
+
'body_text',
|
|
55
|
+
'source_title',
|
|
56
|
+
'target_title',
|
|
57
|
+
'quoted_text',
|
|
58
|
+
'artifact_body',
|
|
59
|
+
]);
|
|
60
|
+
|
|
61
|
+
// ---------- Tension id (deterministic, idempotent) ----------
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Compute the deterministic tension id for a (source, target, type) tuple.
|
|
65
|
+
* Order-sensitive per RESEARCH Section 4.3 -- swapping source and target
|
|
66
|
+
* yields a distinct id (so a contradiction edge and its reverse are
|
|
67
|
+
* tracked separately if both ever land in the graph).
|
|
68
|
+
*
|
|
69
|
+
* @param {string} sourceNodeId
|
|
70
|
+
* @param {string} targetNodeId
|
|
71
|
+
* @param {string} tensionType one of VALID_TYPES
|
|
72
|
+
* @returns {string} 32-char hex sha256 prefix
|
|
73
|
+
*/
|
|
74
|
+
function computeTensionId(sourceNodeId, targetNodeId, tensionType) {
|
|
75
|
+
const basis = String(sourceNodeId) + '|' + String(targetNodeId) + '|' + String(tensionType);
|
|
76
|
+
return crypto.createHash('sha256').update(basis).digest('hex').slice(0, TENSION_ID_LEN);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ---------- JSONL path resolution (workspace-guard-clean) ----------
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Resolve the JSONL path for a given room slug. Always returns a path under
|
|
83
|
+
* os.homedir() per D-07b (OUTSIDE the plugin repo).
|
|
84
|
+
*
|
|
85
|
+
* @param {string} roomSlug
|
|
86
|
+
* @returns {string} absolute path
|
|
87
|
+
*/
|
|
88
|
+
function jsonlPath(roomSlug) {
|
|
89
|
+
const safeSlug = encodeURIComponent(String(roomSlug || 'default-room'));
|
|
90
|
+
return path.join(PENDING_TENSIONS_DIR, safeSlug + '.jsonl');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ---------- Internal helpers ----------
|
|
94
|
+
|
|
95
|
+
function isPlainObject(v) {
|
|
96
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function isHex32(v) {
|
|
100
|
+
return typeof v === 'string' && /^[0-9a-f]{32}$/.test(v);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function violatesUserContentBoundary(entry) {
|
|
104
|
+
for (const k of USER_CONTENT_KEY_DENYLIST) {
|
|
105
|
+
if (Object.prototype.hasOwnProperty.call(entry, k)) return k;
|
|
106
|
+
}
|
|
107
|
+
// context_signature is allowed but its sub-fields must also be enum-only.
|
|
108
|
+
if (isPlainObject(entry.context_signature)) {
|
|
109
|
+
for (const k of USER_CONTENT_KEY_DENYLIST) {
|
|
110
|
+
if (Object.prototype.hasOwnProperty.call(entry.context_signature, k)) return 'context_signature.' + k;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function validateEntryShape(entry) {
|
|
117
|
+
if (!isPlainObject(entry)) return 'entry_not_object';
|
|
118
|
+
if (!isHex32(entry.tension_id)) return 'invalid_tension_id';
|
|
119
|
+
if (!VALID_TYPES.has(entry.type)) return 'invalid_type';
|
|
120
|
+
if (!VALID_STATES.has(entry.state)) return 'invalid_state';
|
|
121
|
+
if (!Number.isInteger(entry.surfacing_count) || entry.surfacing_count < 0) {
|
|
122
|
+
return 'invalid_surfacing_count';
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ---------- Public API ----------
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Append a tension entry to the room's JSONL file. Creates the directory if
|
|
131
|
+
* missing. Validates shape + Canon Part 8 boundary; rejects user-content
|
|
132
|
+
* fields.
|
|
133
|
+
*
|
|
134
|
+
* @param {string} roomSlug
|
|
135
|
+
* @param {object} entry conforming to D-07 schema
|
|
136
|
+
* @returns {{ok:true, path:string} | {ok:false, reason:string}}
|
|
137
|
+
*/
|
|
138
|
+
function appendTension(roomSlug, entry) {
|
|
139
|
+
if (!isPlainObject(entry)) {
|
|
140
|
+
return { ok: false, reason: 'entry_not_object' };
|
|
141
|
+
}
|
|
142
|
+
const violator = violatesUserContentBoundary(entry);
|
|
143
|
+
if (violator) {
|
|
144
|
+
return { ok: false, reason: 'canon_part_8_violation:' + violator };
|
|
145
|
+
}
|
|
146
|
+
const shapeErr = validateEntryShape(entry);
|
|
147
|
+
if (shapeErr) {
|
|
148
|
+
return { ok: false, reason: shapeErr };
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
fs.mkdirSync(PENDING_TENSIONS_DIR, { recursive: true });
|
|
152
|
+
const file = jsonlPath(roomSlug);
|
|
153
|
+
fs.appendFileSync(file, JSON.stringify(entry) + '\n');
|
|
154
|
+
return { ok: true, path: file };
|
|
155
|
+
} catch (err) {
|
|
156
|
+
const msg = (err && err.message) ? String(err.message) : 'append_failed';
|
|
157
|
+
return { ok: false, reason: msg.slice(0, 80) };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Read all tensions for a room, applying LWW replay (last entry per
|
|
163
|
+
* tension_id wins). Returns [] when the file is missing. Tolerates corrupt
|
|
164
|
+
* lines by skipping them silently.
|
|
165
|
+
*
|
|
166
|
+
* @param {string} roomSlug
|
|
167
|
+
* @returns {Array<object>}
|
|
168
|
+
*/
|
|
169
|
+
function readTensions(roomSlug) {
|
|
170
|
+
const file = jsonlPath(roomSlug);
|
|
171
|
+
if (!fs.existsSync(file)) return [];
|
|
172
|
+
let raw;
|
|
173
|
+
try {
|
|
174
|
+
raw = fs.readFileSync(file, 'utf8');
|
|
175
|
+
} catch (_e) {
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
const lines = raw.split('\n').filter(Boolean);
|
|
179
|
+
const byId = new Map();
|
|
180
|
+
for (const line of lines) {
|
|
181
|
+
let entry;
|
|
182
|
+
try {
|
|
183
|
+
entry = JSON.parse(line);
|
|
184
|
+
} catch (_e) {
|
|
185
|
+
continue; // corrupt line tolerated
|
|
186
|
+
}
|
|
187
|
+
if (!isPlainObject(entry) || !isHex32(entry.tension_id)) continue;
|
|
188
|
+
byId.set(entry.tension_id, entry);
|
|
189
|
+
}
|
|
190
|
+
return Array.from(byId.values());
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Find the latest entry for a single tension_id. Returns null when missing.
|
|
195
|
+
* Internal helper for the state-transition functions.
|
|
196
|
+
*/
|
|
197
|
+
function findLatest(roomSlug, tension_id) {
|
|
198
|
+
if (!isHex32(tension_id)) return null;
|
|
199
|
+
const all = readTensions(roomSlug);
|
|
200
|
+
for (const e of all) {
|
|
201
|
+
if (e.tension_id === tension_id) return e;
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Mark a tension as surfaced -- increments surfacing_count and sets
|
|
208
|
+
* last_surfaced_at to now. State transitions to 'surfaced'.
|
|
209
|
+
*/
|
|
210
|
+
function markSurfaced(roomSlug, tension_id) {
|
|
211
|
+
const prev = findLatest(roomSlug, tension_id);
|
|
212
|
+
if (!prev) return { ok: false, reason: 'tension_not_found' };
|
|
213
|
+
const next = Object.assign({}, prev, {
|
|
214
|
+
state: 'surfaced',
|
|
215
|
+
surfacing_count: (Number.isInteger(prev.surfacing_count) ? prev.surfacing_count : 0) + 1,
|
|
216
|
+
last_surfaced_at: Date.now(),
|
|
217
|
+
});
|
|
218
|
+
const r = appendTension(roomSlug, next);
|
|
219
|
+
if (!r.ok) return r;
|
|
220
|
+
return { ok: true, surfacing_count: next.surfacing_count };
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Mark a tension as resolved with a user response. State -> 'resolved'.
|
|
225
|
+
*
|
|
226
|
+
* @param {string} roomSlug
|
|
227
|
+
* @param {string} tension_id
|
|
228
|
+
* @param {string} response one of VALID_RESPONSES (RESOLVE / LATER / SKIP / DROPPED)
|
|
229
|
+
*/
|
|
230
|
+
function markResolved(roomSlug, tension_id, response) {
|
|
231
|
+
if (!VALID_RESPONSES.has(response)) {
|
|
232
|
+
return { ok: false, reason: 'invalid_response' };
|
|
233
|
+
}
|
|
234
|
+
const prev = findLatest(roomSlug, tension_id);
|
|
235
|
+
if (!prev) return { ok: false, reason: 'tension_not_found' };
|
|
236
|
+
const next = Object.assign({}, prev, {
|
|
237
|
+
state: 'resolved',
|
|
238
|
+
last_response: response,
|
|
239
|
+
});
|
|
240
|
+
const r = appendTension(roomSlug, next);
|
|
241
|
+
if (!r.ok) return r;
|
|
242
|
+
return { ok: true };
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Mark a tension as dropped (3-strikes decay or explicit drop). Terminal.
|
|
247
|
+
*/
|
|
248
|
+
function markDropped(roomSlug, tension_id) {
|
|
249
|
+
const prev = findLatest(roomSlug, tension_id);
|
|
250
|
+
if (!prev) return { ok: false, reason: 'tension_not_found' };
|
|
251
|
+
const next = Object.assign({}, prev, {
|
|
252
|
+
state: 'dropped',
|
|
253
|
+
last_response: 'DROPPED',
|
|
254
|
+
});
|
|
255
|
+
const r = appendTension(roomSlug, next);
|
|
256
|
+
if (!r.ok) return r;
|
|
257
|
+
return { ok: true };
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Re-queue a tension after the user picked LATER. State -> 'queued'.
|
|
262
|
+
* Per RESEARCH Section 11.2: surfacing_count is NOT decremented (LATER does
|
|
263
|
+
* not reset the 3-strikes budget).
|
|
264
|
+
*/
|
|
265
|
+
function requeue(roomSlug, tension_id) {
|
|
266
|
+
const prev = findLatest(roomSlug, tension_id);
|
|
267
|
+
if (!prev) return { ok: false, reason: 'tension_not_found' };
|
|
268
|
+
const next = Object.assign({}, prev, {
|
|
269
|
+
state: 'queued',
|
|
270
|
+
});
|
|
271
|
+
const r = appendTension(roomSlug, next);
|
|
272
|
+
if (!r.ok) return r;
|
|
273
|
+
return { ok: true };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Phase 116-03 Wave 3: pre-pass that scans JSONL state and writes 'dropped'
|
|
278
|
+
* transitions for tensions where surfacing_count >= 3 AND state IN
|
|
279
|
+
* ('queued', 'surfaced'). Implements the D-03 / D-03a 3-strikes rule.
|
|
280
|
+
*
|
|
281
|
+
* Idempotent: re-running on already-dropped tensions writes no new transitions
|
|
282
|
+
* because the terminal-state filter excludes 'resolved' and 'dropped' from the
|
|
283
|
+
* scan (per RESEARCH Section 11.2 rows 8 and 9).
|
|
284
|
+
*
|
|
285
|
+
* Boundary case (CONTEXT.md D-03a): if surfacing_count == 3 AND user picks
|
|
286
|
+
* RESOLVE before this pre-pass runs, state is already 'resolved' (terminal)
|
|
287
|
+
* and evaluateAndDecay leaves it alone. The 3-strikes rule only fires AFTER
|
|
288
|
+
* 3 surfacings WITHOUT resolution.
|
|
289
|
+
*
|
|
290
|
+
* Cross-session durable: reads via readTensions which is JSONL LWW replay
|
|
291
|
+
* (RESEARCH Section 6.4) so this pre-pass evaluates the LATEST state per
|
|
292
|
+
* tension_id regardless of how many sessions wrote between now and the
|
|
293
|
+
* first append.
|
|
294
|
+
*
|
|
295
|
+
* Sync. Never throws. On any error returns { droppedTensionIds: [],
|
|
296
|
+
* evaluatedCount: 0 } so the SessionStart hook can never be derailed by a
|
|
297
|
+
* decay-evaluation failure.
|
|
298
|
+
*
|
|
299
|
+
* @param {string} roomSlug
|
|
300
|
+
* @returns {{droppedTensionIds: string[], evaluatedCount: number}}
|
|
301
|
+
*/
|
|
302
|
+
function evaluateAndDecay(roomSlug) {
|
|
303
|
+
try {
|
|
304
|
+
const tensions = readTensions(roomSlug);
|
|
305
|
+
const droppedTensionIds = [];
|
|
306
|
+
for (const t of tensions) {
|
|
307
|
+
if (!isPlainObject(t)) continue;
|
|
308
|
+
const surfacingCount = Number.isInteger(t.surfacing_count) ? t.surfacing_count : 0;
|
|
309
|
+
const state = String(t.state || '');
|
|
310
|
+
// Only transition if BOTH conditions hold:
|
|
311
|
+
// - surfacing_count >= 3 (3-strikes threshold per CONTEXT.md D-03)
|
|
312
|
+
// - state IN ('queued','surfaced') -- terminal states excluded so the
|
|
313
|
+
// pre-pass is idempotent on re-runs (RESEARCH Section 11.2 rows 8+9).
|
|
314
|
+
if (surfacingCount >= 3 && (state === 'queued' || state === 'surfaced')) {
|
|
315
|
+
const next = Object.assign({}, t, {
|
|
316
|
+
state: 'dropped',
|
|
317
|
+
last_response: 'DROPPED',
|
|
318
|
+
});
|
|
319
|
+
const result = appendTension(roomSlug, next);
|
|
320
|
+
if (result && result.ok) {
|
|
321
|
+
droppedTensionIds.push(t.tension_id);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return { droppedTensionIds: droppedTensionIds, evaluatedCount: droppedTensionIds.length };
|
|
326
|
+
} catch (_e) {
|
|
327
|
+
return { droppedTensionIds: [], evaluatedCount: 0 };
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Phase 116-03 Wave 3: read-only diagnostic listing tensions that WOULD be
|
|
333
|
+
* dropped by evaluateAndDecay. Does NOT mutate JSONL.
|
|
334
|
+
*
|
|
335
|
+
* Useful for /mos:tension status diagnostics (out of scope v1; OQ-8) and for
|
|
336
|
+
* Wave-4 telemetry traces that want to inspect candidates without firing the
|
|
337
|
+
* transition.
|
|
338
|
+
*
|
|
339
|
+
* @param {string} roomSlug
|
|
340
|
+
* @returns {Array<object>}
|
|
341
|
+
*/
|
|
342
|
+
function getDecayCandidates(roomSlug) {
|
|
343
|
+
try {
|
|
344
|
+
const tensions = readTensions(roomSlug);
|
|
345
|
+
return tensions.filter(function (t) {
|
|
346
|
+
if (!isPlainObject(t)) return false;
|
|
347
|
+
const surfacingCount = Number.isInteger(t.surfacing_count) ? t.surfacing_count : 0;
|
|
348
|
+
const state = String(t.state || '');
|
|
349
|
+
return surfacingCount >= 3 && (state === 'queued' || state === 'surfaced');
|
|
350
|
+
});
|
|
351
|
+
} catch (_e) {
|
|
352
|
+
return [];
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// ---------- Module exports ----------
|
|
357
|
+
|
|
358
|
+
module.exports = {
|
|
359
|
+
computeTensionId,
|
|
360
|
+
jsonlPath,
|
|
361
|
+
appendTension,
|
|
362
|
+
readTensions,
|
|
363
|
+
markSurfaced,
|
|
364
|
+
markResolved,
|
|
365
|
+
markDropped,
|
|
366
|
+
requeue,
|
|
367
|
+
evaluateAndDecay,
|
|
368
|
+
getDecayCandidates,
|
|
369
|
+
PENDING_TENSIONS_DIR,
|
|
370
|
+
VALID_STATES,
|
|
371
|
+
VALID_TYPES,
|
|
372
|
+
VALID_RESPONSES,
|
|
373
|
+
};
|