@mindrian_os/cli 1.13.0-beta.10 → 1.13.0-beta.43
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/CHANGELOG.md +340 -13
- package/README.md +76 -579
- package/bin/cli.js +166 -40
- package/lib/core/active-plugin-root.cjs +207 -0
- package/package.json +7 -13
- package/.claude-plugin/plugin.json +0 -21
- package/.mcp.json +0 -9
- package/agents/brain-query.md +0 -80
- package/agents/framework-runner.md +0 -237
- package/agents/grading.md +0 -188
- package/agents/investor.md +0 -128
- package/agents/larry-extended.md +0 -135
- package/agents/opportunity-scanner.md +0 -91
- package/agents/persona-analyst.md +0 -132
- package/agents/research.md +0 -89
- package/agents/reverse-salient-agent.md +0 -27
- package/bin/mindrian-mcp-server.cjs +0 -182
- package/bin/mindrian-tools.cjs +0 -765
- package/commands/act.md +0 -433
- package/commands/admin.md +0 -404
- package/commands/analyze-needs.md +0 -36
- package/commands/analyze-systems.md +0 -33
- package/commands/analyze-timing.md +0 -36
- package/commands/auto-explore.md +0 -64
- package/commands/beautiful-question.md +0 -34
- package/commands/brain-derive.md +0 -78
- package/commands/build-knowledge.md +0 -36
- package/commands/build-thesis.md +0 -40
- package/commands/causal.md +0 -228
- package/commands/challenge-assumptions.md +0 -33
- package/commands/compare-ventures.md +0 -77
- package/commands/dashboard.md +0 -110
- package/commands/deep-grade.md +0 -76
- package/commands/diagnose.md +0 -52
- package/commands/diagnostics.md +0 -145
- package/commands/doctor.md +0 -151
- package/commands/dominant-designs.md +0 -34
- package/commands/explain-decision.md +0 -87
- package/commands/explore-domains.md +0 -36
- package/commands/explore-futures.md +0 -34
- package/commands/explore-trends.md +0 -36
- package/commands/export.md +0 -103
- package/commands/file-meeting.md +0 -724
- package/commands/find-analogies.md +0 -182
- package/commands/find-bottlenecks.md +0 -56
- package/commands/find-connections.md +0 -70
- package/commands/funding.md +0 -81
- package/commands/grade.md +0 -197
- package/commands/graph.md +0 -128
- package/commands/hat-briefing.md +0 -119
- package/commands/heal.md +0 -196
- package/commands/help.md +0 -399
- package/commands/hmi-status.md +0 -172
- package/commands/jtbd.md +0 -241
- package/commands/leadership.md +0 -73
- package/commands/lean-canvas.md +0 -34
- package/commands/macro-trends.md +0 -34
- package/commands/map-unknowns.md +0 -34
- package/commands/memory.md +0 -173
- package/commands/models.md +0 -175
- package/commands/mos-reason.md +0 -279
- package/commands/mullins.md +0 -114
- package/commands/new-project.md +0 -481
- package/commands/onboard.md +0 -434
- package/commands/operator.md +0 -149
- package/commands/opportunities.md +0 -144
- package/commands/organize.md +0 -497
- package/commands/persona.md +0 -192
- package/commands/pipeline.md +0 -106
- package/commands/present.md +0 -91
- package/commands/publish.md +0 -201
- package/commands/query.md +0 -124
- package/commands/radar.md +0 -72
- package/commands/reanalyze.md +0 -91
- package/commands/research.md +0 -190
- package/commands/room.md +0 -352
- package/commands/rooms.md +0 -598
- package/commands/root-cause.md +0 -34
- package/commands/rs-experts.md +0 -79
- package/commands/rs-explain.md +0 -94
- package/commands/rs-fetch.md +0 -88
- package/commands/rs-thesis.md +0 -79
- package/commands/scenario-plan.md +0 -34
- package/commands/scheduled-tasks.md +0 -285
- package/commands/score-innovation.md +0 -37
- package/commands/scout.md +0 -239
- package/commands/setup.md +0 -618
- package/commands/snapshot.md +0 -147
- package/commands/speakers.md +0 -84
- package/commands/splash.md +0 -28
- package/commands/status.md +0 -75
- package/commands/structure-argument.md +0 -36
- package/commands/suggest-next.md +0 -74
- package/commands/systems-thinking.md +0 -34
- package/commands/think-hats.md +0 -36
- package/commands/update.md +0 -181
- package/commands/user-needs.md +0 -34
- package/commands/validate.md +0 -34
- package/commands/value-proposition.md +0 -55
- package/commands/vault.md +0 -180
- package/commands/visualize.md +0 -52
- package/commands/whitespace.md +0 -501
- package/commands/wiki.md +0 -69
- package/hooks/hooks.json +0 -381
- package/hooks/run-hook.cmd +0 -64
- package/lib/__init__.py +0 -0
- package/lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/lib/agents/auto-explore-agent.cjs +0 -1043
- package/lib/agents/reverse-salient-agent.cjs +0 -679
- package/lib/agents/tension-hook-agent.cjs +0 -544
- package/lib/chat/chat-context.js +0 -185
- package/lib/chat/chat-panel.js +0 -721
- package/lib/chat/fabric-chat.cjs +0 -288
- package/lib/chat/generative-tools.js +0 -219
- package/lib/conversation/ROOM.md +0 -39
- package/lib/conversation/classifier-rules.json +0 -38
- package/lib/conversation/classifier.cjs +0 -264
- package/lib/conversation/operator.cjs +0 -287
- package/lib/copy/115-spec-strings.cjs +0 -55
- package/lib/core/__init__.py +0 -0
- package/lib/core/__nav-stub.cjs +0 -14
- 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 +0 -148
- package/lib/core/asset-ops.cjs +0 -151
- package/lib/core/auto-commit-throttle.cjs +0 -129
- package/lib/core/bearer-token.cjs +0 -199
- package/lib/core/brain-client.cjs +0 -865
- package/lib/core/brain-derivation-prompts.cjs +0 -326
- package/lib/core/brain-derivation-queue.cjs +0 -431
- package/lib/core/brain-derivation.cjs +0 -580
- package/lib/core/brain-md-schema.cjs +0 -528
- package/lib/core/brain-md-staleness.cjs +0 -357
- package/lib/core/brain-response-sanitize.cjs +0 -188
- package/lib/core/bridge-writer.cjs +0 -477
- package/lib/core/chat-context-builder.cjs +0 -253
- package/lib/core/cross-room-aggregator.cjs +0 -762
- package/lib/core/daily-briefing.cjs +0 -438
- package/lib/core/decision-capture.cjs +0 -618
- package/lib/core/deep-links.cjs +0 -82
- package/lib/core/dispatch-optimizer.cjs +0 -354
- package/lib/core/dual-path-detector.cjs +0 -84
- package/lib/core/dual-path-detector.test.cjs +0 -334
- package/lib/core/exports-log.cjs +0 -79
- package/lib/core/feynman-minto-invariants.cjs +0 -605
- package/lib/core/folder-memory-async.cjs +0 -338
- package/lib/core/folder-memory-shared.cjs +0 -890
- package/lib/core/folder-memory.cjs +0 -416
- package/lib/core/framework-chain-composer.cjs +0 -411
- package/lib/core/frontmatter-schemas.cjs +0 -330
- package/lib/core/git-ops.cjs +0 -141
- package/lib/core/graph-ops.cjs +0 -258
- package/lib/core/hat-persistence.cjs +0 -362
- package/lib/core/index.cjs +0 -60
- package/lib/core/integration-registry.cjs +0 -232
- package/lib/core/intelligence-cascade.cjs +0 -661
- package/lib/core/lazygraph-ops.cjs +0 -1057
- package/lib/core/lru-cache.cjs +0 -139
- package/lib/core/mcp-profiles.cjs +0 -182
- package/lib/core/meeting-ops.cjs +0 -54
- package/lib/core/memory-ops.cjs +0 -600
- package/lib/core/migrations/ROOM.md +0 -33
- package/lib/core/migrations/phase-109-nodes-provenance.cjs +0 -339
- package/lib/core/migrations/phase-109-session-focus.cjs +0 -99
- package/lib/core/model-profiles.cjs +0 -246
- package/lib/core/mullins-scaffold.cjs +0 -160
- package/lib/core/nav-dial.cjs +0 -316
- package/lib/core/navigation/ROOM.md +0 -15
- package/lib/core/navigation/explanation.cjs +0 -43
- package/lib/core/navigation/focus.cjs +0 -135
- package/lib/core/navigation/ingestion.cjs +0 -82
- package/lib/core/navigation/insights.cjs +0 -350
- package/lib/core/navigation/memory-events.cjs +0 -118
- package/lib/core/navigation/neighborhood.cjs +0 -78
- package/lib/core/navigation/packet.cjs +0 -182
- package/lib/core/navigation/room-home.cjs +0 -127
- package/lib/core/navigation/transitions.cjs +0 -82
- package/lib/core/navigation-engine-shared.cjs +0 -242
- package/lib/core/navigation-engine.cjs +0 -664
- package/lib/core/navigation.cjs +0 -60
- package/lib/core/nl-graph-queries.cjs +0 -164
- package/lib/core/offer-presenter.cjs +0 -406
- package/lib/core/opportunity-extractor.cjs +0 -183
- package/lib/core/opportunity-ops.cjs +0 -1371
- package/lib/core/persona-ops.cjs +0 -537
- package/lib/core/persona-taxonomy.cjs +0 -190
- package/lib/core/platform-gates.cjs +0 -120
- package/lib/core/platform.cjs +0 -257
- package/lib/core/proactive-intelligence.cjs +0 -528
- package/lib/core/problem-type-router.cjs +0 -315
- package/lib/core/reasoning-ops.cjs +0 -639
- package/lib/core/reverse-salient-persona-suffix.cjs +0 -115
- package/lib/core/room-classifier-strict-mode.cjs +0 -229
- package/lib/core/room-db.cjs +0 -127
- package/lib/core/room-ops-async.cjs +0 -92
- package/lib/core/room-ops-shared.cjs +0 -64
- package/lib/core/room-ops-sync.cjs +0 -70
- package/lib/core/room-ops.cjs +0 -32
- package/lib/core/room-type-detector.cjs +0 -386
- package/lib/core/rs-brain-substrate-prompts.cjs +0 -129
- package/lib/core/rs-brain-substrate.cjs +0 -570
- package/lib/core/rs-breakthrough-scorer.cjs +0 -255
- package/lib/core/rs-canon-violations.cjs +0 -82
- package/lib/core/rs-chain-feeder.cjs +0 -343
- package/lib/core/rs-commercial-assessor.cjs +0 -280
- package/lib/core/rs-differential-scorer.cjs +0 -376
- package/lib/core/rs-domain-analyzer.cjs +0 -385
- package/lib/core/rs-egress-prompts.cjs +0 -113
- package/lib/core/rs-egress-telemetry.cjs +0 -225
- package/lib/core/rs-egress-violations.cjs +0 -53
- package/lib/core/rs-expert-mapper.cjs +0 -467
- package/lib/core/rs-fetcher-academic.cjs +0 -697
- package/lib/core/rs-fetcher-experts.cjs +0 -314
- package/lib/core/rs-fetcher-industry.cjs +0 -731
- package/lib/core/rs-fetcher-patents.cjs +0 -564
- package/lib/core/rs-innovation-classifier.cjs +0 -194
- package/lib/core/rs-mind-map.cjs +0 -656
- package/lib/core/rs-neo4j-writer.cjs +0 -388
- package/lib/core/rs-nl-to-query.cjs +0 -425
- package/lib/core/rs-pinecone-bridge.cjs +0 -303
- package/lib/core/rs-preprocessor.cjs +0 -350
- package/lib/core/rs-query-matrix.cjs +0 -316
- package/lib/core/rs-query-to-text.cjs +0 -438
- package/lib/core/rs-sqlite-mirror.cjs +0 -443
- package/lib/core/rs-thesis-generator.cjs +0 -188
- package/lib/core/rs_cache.py +0 -479
- package/lib/core/rs_corpus.py +0 -468
- package/lib/core/rs_hybrid.py +0 -586
- package/lib/core/rs_math.py +0 -287
- package/lib/core/rs_rooms.py +0 -193
- package/lib/core/scheduled-scanner.cjs +0 -463
- package/lib/core/scratchpad-ops.cjs +0 -201
- package/lib/core/section-8-trace-schema.cjs +0 -138
- package/lib/core/section-registry.cjs +0 -111
- package/lib/core/session-state.cjs +0 -144
- package/lib/core/shallow-doc-parser.cjs +0 -174
- package/lib/core/shallow-doc-parser.test.cjs +0 -226
- package/lib/core/skill-activation-router.cjs +0 -284
- package/lib/core/state-ops.cjs +0 -46
- package/lib/core/statusline-cache.cjs +0 -266
- package/lib/core/token-estimator.cjs +0 -348
- package/lib/core/user-archetype.cjs +0 -239
- package/lib/core/user-md-ops.cjs +0 -524
- package/lib/core/visual-ops.cjs +0 -624
- package/lib/core/write-lock.cjs +0 -149
- package/lib/graph/canvas-graph.js +0 -467
- package/lib/graph/constellation-config.cjs +0 -299
- package/lib/graph/graph-detail-panel.js +0 -165
- package/lib/hmi/ROOM.md +0 -47
- package/lib/hmi/across-session-memory.cjs +0 -604
- package/lib/hmi/cross-room-memory.cjs +0 -575
- package/lib/hmi/decoy-tier.cjs +0 -395
- package/lib/hmi/jtbd-classifier.cjs +0 -219
- package/lib/hmi/jtbd-state.cjs +0 -199
- package/lib/hmi/jtbd-taxonomy.json +0 -392
- package/lib/hmi/selector-dispatcher.cjs +0 -546
- package/lib/hmi/selector-telemetry.cjs +0 -263
- package/lib/hmi/shape-f0-renderer.cjs +0 -139
- package/lib/hmi/shape-f1-fallback.cjs +0 -80
- package/lib/hmi/shape-f1-renderer.cjs +0 -138
- package/lib/hmi/shape-f2-renderer.cjs +0 -132
- package/lib/hmi/shape-f3-renderer.cjs +0 -66
- package/lib/hmi/shape-f4-renderer.cjs +0 -72
- package/lib/hmi/shape-f5-renderer.cjs +0 -155
- package/lib/hmi/shape-f6-plan-review-renderer.cjs +0 -312
- package/lib/hmi/shape-f6-renderer.cjs +0 -144
- package/lib/hmi/shape-g-renderer.cjs +0 -219
- package/lib/hmi/shape-h-renderer.cjs +0 -222
- package/lib/hmi/tier-check.cjs +0 -63
- package/lib/import/PRECONDITIONS.md +0 -41
- package/lib/import/branding.cjs +0 -210
- package/lib/import/branding.test.cjs +0 -235
- package/lib/import/classifications-sync.cjs +0 -104
- package/lib/import/classifications-sync.test.cjs +0 -129
- package/lib/import/enricher.cjs +0 -296
- package/lib/import/enricher.test.cjs +0 -273
- package/lib/import/integration.test.cjs +0 -376
- package/lib/import/manifest.cjs +0 -129
- package/lib/import/manifest.schema.json +0 -185
- package/lib/import/manifest.test.cjs +0 -123
- package/lib/import/meeting-detector.cjs +0 -92
- package/lib/import/meeting-detector.test.cjs +0 -100
- package/lib/import/person-detector.cjs +0 -229
- package/lib/import/person-detector.test.cjs +0 -149
- package/lib/import/report.cjs +0 -186
- package/lib/import/report.test.cjs +0 -186
- package/lib/import/room-md-scaffolder.cjs +0 -49
- package/lib/import/router.cjs +0 -224
- package/lib/import/router.test.cjs +0 -356
- package/lib/import/run-all-tests.cjs +0 -36
- package/lib/import/smoke-test.cjs +0 -213
- package/lib/import/smoke-test.test.cjs +0 -148
- package/lib/import/test-fixtures/collision-vault/preexisting-room/STATE.md +0 -8
- package/lib/import/test-fixtures/collision-vault/preexisting-room/problem-definition/onboarding/onboarding.md +0 -7
- package/lib/import/test-fixtures/collision-vault/source/onboarding.md +0 -5
- package/lib/import/test-fixtures/obsidian-vault/.obsidian/workspace.json +0 -1
- package/lib/import/test-fixtures/obsidian-vault/notes/with-wikilinks.md +0 -4
- package/lib/import/test-fixtures/tiny-vault/notes/2026-01-15-team-sync.md +0 -9
- package/lib/import/test-fixtures/tiny-vault/notes/empty.md +0 -3
- package/lib/import/test-fixtures/tiny-vault/notes/onboarding.md +0 -5
- package/lib/import/test-fixtures/tiny-vault/notes/pricing.md +0 -5
- package/lib/import/test-fixtures/tiny-vault/notes/random.md +0 -4
- package/lib/import/undo.test.cjs +0 -199
- package/lib/import/vault-scanner.cjs +0 -105
- package/lib/import/vault-scanner.test.cjs +0 -67
- package/lib/mcp/app-html/dashboard.html +0 -316
- package/lib/mcp/app-html/graph.html +0 -428
- package/lib/mcp/app-html/mindrian-platform.html +0 -1841
- package/lib/mcp/app-html/wiki.html +0 -383
- package/lib/mcp/app-views.cjs +0 -322
- package/lib/mcp/brain-router.cjs +0 -418
- package/lib/mcp/capability-registry.cjs +0 -62
- package/lib/mcp/larry-context.cjs +0 -46
- package/lib/mcp/larry-server-instructions.md +0 -114
- package/lib/mcp/pipeline-state.cjs +0 -275
- package/lib/mcp/prompts.cjs +0 -302
- package/lib/mcp/resources.cjs +0 -227
- package/lib/mcp/session-catchup.cjs +0 -327
- package/lib/mcp/surface-detect.cjs +0 -75
- package/lib/mcp/tool-router.cjs +0 -1034
- package/lib/memory/aaak-compress.cjs +0 -403
- package/lib/memory/aaak-compress.test.cjs +0 -288
- package/lib/memory/async-artifact-auto-commit.test.cjs +0 -223
- package/lib/memory/bearer-token.test.cjs +0 -315
- package/lib/memory/brain-cache-lru.test.cjs +0 -259
- package/lib/memory/brain-client-query-shape.test.cjs +0 -160
- package/lib/memory/brain-derivation-graceful-degradation.test.cjs +0 -1019
- package/lib/memory/brain-derivation-queue.test.cjs +0 -539
- package/lib/memory/brain-derivation.test.cjs +0 -634
- package/lib/memory/brain-derive-command.test.cjs +0 -534
- package/lib/memory/brain-md-invariants-validator.test.cjs +0 -704
- package/lib/memory/brain-md-schema.test.cjs +0 -467
- package/lib/memory/brain-md-staleness.test.cjs +0 -525
- package/lib/memory/brain-server-resolution.test.cjs +0 -314
- package/lib/memory/chat-context.test.cjs +0 -128
- package/lib/memory/cross-room-aggregator.test.cjs +0 -909
- package/lib/memory/dashboard-server.test.cjs +0 -256
- package/lib/memory/debouncer-drain-at-prompt.test.cjs +0 -389
- package/lib/memory/decision-capture.test.cjs +0 -632
- package/lib/memory/decision-capture.worker.cjs +0 -70
- package/lib/memory/explain-decision-command.test.cjs +0 -521
- package/lib/memory/explain-decision-footer.test.cjs +0 -316
- package/lib/memory/explored-materials-store.cjs +0 -392
- package/lib/memory/feynman-minto-guardian.test.cjs +0 -736
- package/lib/memory/feynman-minto-invariants.test.cjs +0 -511
- package/lib/memory/feynman-prompts-drift.test.cjs +0 -144
- package/lib/memory/feynman-prompts.cjs +0 -151
- package/lib/memory/feynman-prompts.test.cjs +0 -96
- package/lib/memory/folder-memory-quadruple.test.cjs +0 -548
- package/lib/memory/folder-memory.test.cjs +0 -503
- package/lib/memory/framework-chain-composer.test.cjs +0 -515
- package/lib/memory/frontmatter-schema-validator.test.cjs +0 -290
- package/lib/memory/heal-command.test.cjs +0 -604
- package/lib/memory/index-artifact-transaction.test.cjs +0 -333
- package/lib/memory/lazygraph-rs-discoveries-view.test.cjs +0 -122
- package/lib/memory/mcp-input-validation.test.cjs +0 -240
- package/lib/memory/mcp-server-brain-deps.test.cjs +0 -270
- package/lib/memory/mcp-stack-fallback.test.cjs +0 -433
- package/lib/memory/minto-debouncer.test.cjs +0 -407
- package/lib/memory/minto-debouncer.worker.cjs +0 -46
- package/lib/memory/minto-migration-v88.test.cjs +0 -265
- package/lib/memory/minto-schema-v88.test.cjs +0 -390
- package/lib/memory/mos-status-renderer.test.cjs +0 -631
- package/lib/memory/narrative-schema.cjs +0 -376
- package/lib/memory/narrative-schema.test.cjs +0 -209
- package/lib/memory/nav-dial.test.cjs +0 -414
- package/lib/memory/navigation-engine-core.test.cjs +0 -722
- package/lib/memory/navigation-invariants.test.cjs +0 -483
- package/lib/memory/offer-presenter.test.cjs +0 -554
- package/lib/memory/on-stop-snapshot.test.cjs +0 -404
- package/lib/memory/pending-tension-store.cjs +0 -373
- package/lib/memory/post-compact-reinjection.test.cjs +0 -854
- package/lib/memory/post-write-triple.test.cjs +0 -317
- package/lib/memory/pre-compact-snapshot.test.cjs +0 -495
- package/lib/memory/problem-type-router.test.cjs +0 -656
- package/lib/memory/query-efficiency-telemetry.test.cjs +0 -370
- package/lib/memory/recompile-room-references.test.cjs +0 -392
- package/lib/memory/recompile-room-references.worker.cjs +0 -42
- package/lib/memory/record-decision-dual-write.test.cjs +0 -454
- package/lib/memory/room-classifier-strict-mode.test.cjs +0 -417
- package/lib/memory/room-minto-hook.test.cjs +0 -398
- package/lib/memory/rs-discovery-engine.test.cjs +0 -323
- package/lib/memory/run-feynman-tests.cjs +0 -1239
- package/lib/memory/security-trifecta.test.cjs +0 -312
- package/lib/memory/session-start-brain-staleness.test.cjs +0 -363
- package/lib/memory/session-start-triple-injection.test.cjs +0 -514
- package/lib/memory/sessionstart-banner-formatter.cjs +0 -318
- package/lib/memory/sessionstart-minto-banner.test.cjs +0 -373
- package/lib/memory/skill-activation-router.test.cjs +0 -419
- package/lib/memory/stamp-artifact-write.test.cjs +0 -304
- package/lib/memory/statusline-active-room.test.cjs +0 -315
- package/lib/memory/statusline-minto-segment.test.cjs +0 -292
- package/lib/memory/sync-async-entry-points.test.cjs +0 -204
- package/lib/memory/test-bridge-writer-enhanced.cjs +0 -452
- package/lib/memory/test-rs-brain-substrate-shape.cjs +0 -529
- package/lib/memory/test-rs-brain-substrate.cjs +0 -636
- package/lib/memory/test-rs-breakthrough-scorer.cjs +0 -375
- package/lib/memory/test-rs-canon-violations.cjs +0 -218
- package/lib/memory/test-rs-chain-feeder-core.cjs +0 -344
- package/lib/memory/test-rs-chain-feeder-skill-spawn.cjs +0 -297
- package/lib/memory/test-rs-commercial-assessor.cjs +0 -385
- package/lib/memory/test-rs-differential-scorer.cjs +0 -480
- package/lib/memory/test-rs-discovery-engine.cjs +0 -603
- package/lib/memory/test-rs-domain-analyzer.cjs +0 -492
- package/lib/memory/test-rs-egress-primitives.cjs +0 -420
- package/lib/memory/test-rs-expert-mapper.cjs +0 -547
- package/lib/memory/test-rs-explain-command.cjs +0 -443
- package/lib/memory/test-rs-fetcher-academic.cjs +0 -848
- package/lib/memory/test-rs-fetcher-experts.cjs +0 -496
- package/lib/memory/test-rs-fetcher-industry.cjs +0 -702
- package/lib/memory/test-rs-fetcher-patents.cjs +0 -674
- package/lib/memory/test-rs-innovation-classifier.cjs +0 -301
- package/lib/memory/test-rs-mind-map.cjs +0 -646
- package/lib/memory/test-rs-neo4j-writer.cjs +0 -518
- package/lib/memory/test-rs-nl-to-query.cjs +0 -449
- package/lib/memory/test-rs-pinecone-bridge.cjs +0 -277
- package/lib/memory/test-rs-preprocessor.cjs +0 -433
- package/lib/memory/test-rs-query-matrix.cjs +0 -391
- package/lib/memory/test-rs-query-to-text.cjs +0 -551
- package/lib/memory/test-rs-sqlite-mirror.cjs +0 -649
- package/lib/memory/test-rs-thesis-generator.cjs +0 -360
- package/lib/memory/triple-context-formatter.cjs +0 -473
- package/lib/memory/triple-context-formatter.test.cjs +0 -442
- package/lib/memory/user-md-persona.test.cjs +0 -565
- package/lib/memory/userpromptsubmit-integration.test.cjs +0 -690
- package/lib/memory/validators/README.md +0 -157
- package/lib/memory/validators/brain-md-invariants.cjs +0 -475
- package/lib/memory/validators/brain-substrate-invariants.cjs +0 -285
- package/lib/memory/validators/external-academic-invariants.cjs +0 -249
- package/lib/memory/validators/external-industry-invariants.cjs +0 -271
- package/lib/memory/validators/external-patents-invariants.cjs +0 -266
- package/lib/memory/validators/minto-invariants.cjs +0 -62
- package/lib/memory/validators/navigation-invariants.cjs +0 -340
- package/lib/memory/validators/queue-health.cjs +0 -95
- package/lib/memory/validators/snapshot-integrity.cjs +0 -129
- package/lib/memory/validators/stale-lifecycle.cjs +0 -116
- package/lib/memory/vault-section-minto-generator-atomic.test.cjs +0 -556
- package/lib/memory/vault-section-minto-generator-atomic.worker.cjs +0 -73
- package/lib/memory/write-lock-atomic.test.cjs +0 -137
- package/lib/memory/write-lock-atomic.worker.cjs +0 -55
- package/lib/parity/check-parity.cjs +0 -83
- package/lib/presentation/presentation-server.cjs +0 -101
- package/lib/presentation/presentation-watcher.cjs +0 -123
- package/lib/quickview/hub-server.cjs +0 -719
- package/lib/quickview/server.cjs +0 -533
- package/lib/render/JTBD-PALETTES.md +0 -145
- package/lib/render/ROOM.md +0 -59
- package/lib/render/render-v2.cjs +0 -486
- package/lib/render/render-v2.test.cjs +0 -267
- package/lib/render/render.cjs +0 -65
- package/lib/state/ROOM.md +0 -46
- package/lib/state/state-md-parser.cjs +0 -215
- package/lib/statusline/ROOM.md +0 -38
- package/lib/statusline/banner-suppression.cjs +0 -50
- package/lib/statusline/surface-detect.cjs +0 -85
- package/lib/update-bootstrap.sh.template +0 -145
- package/lib/vault/frontmatter-schema.cjs +0 -297
- package/lib/vault/room-scanner.cjs +0 -352
- package/lib/vault/wikilink-builder.cjs +0 -231
- package/lib/vault/wikilink-builder.test.cjs +0 -182
- package/lib/wiki/graph-links.cjs +0 -281
- package/lib/wiki/page-renderer.cjs +0 -229
- package/lib/wiki/wiki-chat.cjs +0 -81
- package/lib/wiki/wiki-layout.cjs +0 -1459
- package/lib/wiki/wiki-search.cjs +0 -142
- package/lib/wiki/wiki-server.cjs +0 -678
- package/lib/wiki/wiki-watcher.cjs +0 -105
- package/pipelines/analogy/01-decompose.md +0 -80
- package/pipelines/analogy/02-abstract.md +0 -87
- package/pipelines/analogy/03-search.md +0 -135
- package/pipelines/analogy/04-transfer.md +0 -101
- package/pipelines/analogy/05-validate.md +0 -106
- package/pipelines/analogy/CHAIN.md +0 -56
- package/pipelines/discovery/01-explore-domains.md +0 -44
- package/pipelines/discovery/02-think-hats.md +0 -50
- package/pipelines/discovery/03-analyze-needs.md +0 -54
- package/pipelines/discovery/CHAIN.md +0 -37
- package/pipelines/thesis/01-structure-argument.md +0 -45
- package/pipelines/thesis/02-challenge-assumptions.md +0 -48
- package/pipelines/thesis/03-build-thesis.md +0 -54
- package/pipelines/thesis/CHAIN.md +0 -37
- package/references/brain/causal-directives.md +0 -91
- package/references/brain/causal-enrichment.cypher +0 -165
- package/references/brain/command-triggers-schema.md +0 -226
- package/references/brain/graph-architecture.md +0 -317
- package/references/brain/query-patterns.md +0 -460
- package/references/brain/room-hierarchy-schema.md +0 -218
- package/references/brain/schema.md +0 -76
- package/references/capability-radar/capabilities-index.md +0 -241
- package/references/capability-radar/changelog-cache.md +0 -81
- package/references/causal/causal-schema.md +0 -103
- package/references/design/email-template-standard.md +0 -155
- package/references/design/graph-visualization-standard.md +0 -178
- package/references/document-generation.md +0 -179
- package/references/hsi/HSI-TOOLS-REFERENCE.md +0 -222
- package/references/import-config.md +0 -141
- package/references/integrations/detection-patterns.md +0 -101
- package/references/meeting/artifact-template.md +0 -377
- package/references/meeting/cross-meeting-intelligence.md +0 -216
- package/references/meeting/cross-relationship-patterns.md +0 -202
- package/references/meeting/live-join-interface.md +0 -244
- package/references/meeting/section-mapping.md +0 -192
- package/references/meeting/segment-classification.md +0 -258
- package/references/meeting/speaker-profile-template.md +0 -219
- package/references/meeting/summary-template.md +0 -348
- package/references/meeting/transcript-patterns.md +0 -226
- package/references/methodology/analyze-needs.md +0 -135
- package/references/methodology/analyze-systems.md +0 -121
- package/references/methodology/analyze-timing.md +0 -149
- package/references/methodology/beautiful-question.md +0 -109
- package/references/methodology/build-knowledge.md +0 -161
- package/references/methodology/build-thesis.md +0 -237
- package/references/methodology/challenge-assumptions.md +0 -127
- package/references/methodology/diagnose.md +0 -169
- package/references/methodology/dominant-designs.md +0 -212
- package/references/methodology/explore-domains.md +0 -147
- package/references/methodology/explore-futures.md +0 -163
- package/references/methodology/explore-trends.md +0 -129
- package/references/methodology/find-bottlenecks.md +0 -131
- package/references/methodology/grade.md +0 -211
- package/references/methodology/index.md +0 -97
- package/references/methodology/leadership.md +0 -200
- package/references/methodology/lean-canvas.md +0 -116
- package/references/methodology/macro-trends.md +0 -192
- package/references/methodology/map-unknowns.md +0 -137
- package/references/methodology/mullins-7-domains.md +0 -104
- package/references/methodology/problem-types.md +0 -65
- package/references/methodology/root-cause.md +0 -178
- package/references/methodology/sapphire-encoding.md +0 -355
- package/references/methodology/scenario-plan.md +0 -178
- package/references/methodology/score-innovation.md +0 -154
- package/references/methodology/structure-argument.md +0 -158
- package/references/methodology/systems-thinking.md +0 -159
- package/references/methodology/think-hats.md +0 -147
- package/references/methodology/triz-matrix.json +0 -751
- package/references/methodology/triz-principles.md +0 -501
- package/references/methodology/user-needs.md +0 -199
- package/references/methodology/validate.md +0 -163
- package/references/methodology/value-proposition.md +0 -244
- package/references/opportunities/funding-lifecycle.md +0 -103
- package/references/opportunities/grant-api-patterns.md +0 -99
- package/references/opportunities/opportunity-template.md +0 -84
- package/references/personality/assessment-philosophy.md +0 -72
- package/references/personality/lexicon.md +0 -100
- package/references/personality/persona-chains.md +0 -56
- package/references/personality/pws-lexicon-full.md +0 -499
- package/references/personality/voice-dna.md +0 -156
- package/references/personas/hat-perspectives.md +0 -76
- package/references/personas/persona-template.md +0 -63
- package/references/pipeline/act-output-contract.md +0 -88
- package/references/pipeline/chains-index.md +0 -39
- package/references/pws-profile-generation.md +0 -79
- package/references/reasoning/reasoning-schema.md +0 -143
- package/references/reasoning/reasoning-template.md +0 -68
- package/references/reasoning/run-template.md +0 -38
- package/references/research/RESEARCH_14_CLAUDE_CODE_SOURCE_ARCHITECTURE.md +0 -209
- package/references/research/RESEARCH_15_V1.8_OPTIMIZATION_JTBD.md +0 -375
- package/references/research/RESEARCH_16_NATIVE_FIRST_PLUGIN_ARCHITECTURE.md +0 -575
- package/references/research/RESEARCH_17_MCP_UI_FRAMEWORKS.md +0 -272
- package/references/taxonomy/TAXONOMY.md +0 -192
- package/references/templates/MINTO.md +0 -36
- package/references/user-research/2026-04-05-leah-lawrence-session.md +0 -202
- package/references/vault-kit/README.md +0 -35
- package/references/vault-kit/app.json +0 -12
- package/references/vault-kit/appearance.json +0 -12
- package/references/vault-kit/graph.json +0 -35
- package/references/vault-kit/snippets/mindrian-destijl.css +0 -297
- package/references/vault-kit/templates/new-artifact.md +0 -37
- package/references/vault-kit/templates/new-meeting-note.md +0 -35
- package/references/vault-kit/templates/new-team-profile.md +0 -29
- package/references/vault-kit/templates/new-xref.md +0 -35
- package/references/visual/symbol-system.md +0 -151
- package/skills/MOSDeckEngine/SKILL.md +0 -325
- package/skills/brain-connector/SKILL.md +0 -114
- package/skills/context-engine/SKILL.md +0 -147
- package/skills/conversation-mode/SKILL.md +0 -102
- package/skills/larry-personality/SKILL.md +0 -219
- package/skills/larry-personality/framework-chains.md +0 -92
- package/skills/larry-personality/mode-engine.md +0 -185
- package/skills/mullins-scaffold/SKILL.md +0 -61
- package/skills/mullins-scaffold/scaffold.json +0 -146
- package/skills/pws-methodology/SKILL.md +0 -49
- package/skills/room-passive/SKILL.md +0 -165
- package/skills/room-proactive/SKILL.md +0 -250
- package/skills/ui-system/SKILL.md +0 -277
|
@@ -1,544 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2026 Mindrian. BSL 1.1.
|
|
3
|
-
*
|
|
4
|
-
* Phase 116-02 Wave 2 -- TensionHookAgent surface module.
|
|
5
|
-
* Phase 116-04 Wave 4 -- adds 5 telemetry emit helpers per CONTEXT.md D-04.
|
|
6
|
-
* Mirrors lib/agents/reverse-salient-agent.cjs lines 393-446 emitDetected /
|
|
7
|
-
* emitActedOn pattern. All payloads scalar-only per Canon Part 8 (D-04a).
|
|
8
|
-
* Suppression paths still emit tension_detected per Pitfall 5 (D-04c).
|
|
9
|
-
*
|
|
10
|
-
* Mirrors lib/agents/reverse-salient-agent.cjs Steps 5+6 (surfaceFinding +
|
|
11
|
-
* handleUserResponse) per docs/AGENTIC-SURFACING-PATTERN.md. Detection runs
|
|
12
|
-
* upstream in scripts/preflight-tension-surface.cjs (116-01); this module
|
|
13
|
-
* routes the user's F.1 pick back into JSONL state + RESOLVES_VIA cascade.
|
|
14
|
-
*
|
|
15
|
-
* Graph-native HARD RULES (memory feedback_reverse_salient_agent_graph_native.md):
|
|
16
|
-
* 1. Reads route through lib/core/navigation.cjs only (Phase 109 D-06 chokepoint).
|
|
17
|
-
* 2. NEVER require any direct DB module (chokepoint violation).
|
|
18
|
-
* 3. NEVER require a Brain client (Canon Part 8 boundary).
|
|
19
|
-
* 4. NEVER write to stdout / stderr (telemetry side-channel rule).
|
|
20
|
-
* 5. F.1 dispatch ONLY via lib/hmi/selector-dispatcher.cjs pickShape.
|
|
21
|
-
* 6. RESOLVES_VIA edge ONLY via lib/core/lazygraph-ops.cjs upsertEdge.
|
|
22
|
-
*
|
|
23
|
-
* Per CONTEXT.md D-02 + D-02a: NO persona-keyed suffix; the Phase 115
|
|
24
|
-
* persona variant module is NOT consumed. Larry-voice is neutral citation
|
|
25
|
-
* (the citation text lives in 116-01's additionalContext directive; this
|
|
26
|
-
* module is the response-routing surface).
|
|
27
|
-
*
|
|
28
|
-
* Per CONTEXT.md D-08: zero surface-specific branches. 88.2-05 selector
|
|
29
|
-
* dispatcher already shipped tri-polar so the F.1 surface is identical
|
|
30
|
-
* across CLI / Desktop / Cowork.
|
|
31
|
-
*
|
|
32
|
-
* Pure CJS, node built-ins only, zero new runtime dependencies.
|
|
33
|
-
*/
|
|
34
|
-
'use strict';
|
|
35
|
-
|
|
36
|
-
const path = require('node:path');
|
|
37
|
-
const crypto = require('node:crypto');
|
|
38
|
-
|
|
39
|
-
// Phase 109 chokepoint (read-side reference; the agent stays read-clean
|
|
40
|
-
// because detection lives in the SessionStart hook, not here, but holding
|
|
41
|
-
// the require keeps the chokepoint adherence grep green and lets future
|
|
42
|
-
// Wave 4 telemetry land without restructuring).
|
|
43
|
-
const navigation = require('../core/navigation.cjs');
|
|
44
|
-
const pendingStore = require('../memory/pending-tension-store.cjs');
|
|
45
|
-
// Lazy requires (test substitution friendly):
|
|
46
|
-
// - lib/hmi/selector-dispatcher.cjs (loaded inside surfaceFinding)
|
|
47
|
-
// - lib/core/lazygraph-ops.cjs (loaded inside buildResolvedViaEdge)
|
|
48
|
-
|
|
49
|
-
// ---------- Constants ----------
|
|
50
|
-
|
|
51
|
-
const F1_VERBS = ['Resolve', 'Later', 'Skip'];
|
|
52
|
-
const F1_HEADER = '-- mindrianOS -- pending tension -- pick a verb --';
|
|
53
|
-
const VALID_RESPONSES = Object.freeze(new Set(['RESOLVE', 'LATER', 'SKIP', 'FREE_TEXT']));
|
|
54
|
-
const TENSION_ID_LEN = 32;
|
|
55
|
-
|
|
56
|
-
// Touch the navigation chokepoint reference so static analysis reports
|
|
57
|
-
// it as used; the actual read calls land Wave 4 alongside telemetry.
|
|
58
|
-
// eslint-disable-next-line no-unused-vars
|
|
59
|
-
const _navigation_ref = navigation;
|
|
60
|
-
|
|
61
|
-
// ---------- Helpers ----------
|
|
62
|
-
|
|
63
|
-
function isHex32(v) {
|
|
64
|
-
return typeof v === 'string' && /^[0-9a-f]{32}$/.test(v);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function isNonEmptyString(v) {
|
|
68
|
-
return typeof v === 'string' && v.length > 0;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// ---------- composeFinding (deterministic id, Canon Part 8 clean) ----------
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Build a Canon-Part-8-clean finding object. All fields are scalar IDs and
|
|
75
|
-
* enum-like section names; NO body_text / source_title / target_title or
|
|
76
|
-
* any other user-content string lives in the finding (those live in the
|
|
77
|
-
* graph and are fetched by Larry on his first turn via navigation.cjs per
|
|
78
|
-
* the 116-01 directive contract).
|
|
79
|
-
*
|
|
80
|
-
* Deterministic: same inputs always yield the same finding (id is the
|
|
81
|
-
* caller-supplied tension_id, which itself is computed deterministically
|
|
82
|
-
* by lib/memory/pending-tension-store.cjs computeTensionId).
|
|
83
|
-
*
|
|
84
|
-
* @param {object} args
|
|
85
|
-
* @param {string} args.tension_id 32-char hex
|
|
86
|
-
* @param {string} args.source_node_id node id (NOT title text)
|
|
87
|
-
* @param {string} args.target_node_id node id (NOT title text)
|
|
88
|
-
* @param {string} args.source_section
|
|
89
|
-
* @param {string} args.target_section
|
|
90
|
-
* @param {string} args.tension_type enum
|
|
91
|
-
* @returns {object|null}
|
|
92
|
-
*/
|
|
93
|
-
function composeFinding(args) {
|
|
94
|
-
const a = (args && typeof args === 'object') ? args : {};
|
|
95
|
-
if (!isNonEmptyString(a.tension_id)) return null;
|
|
96
|
-
if (typeof a.tension_id === 'string' && a.tension_id.length !== TENSION_ID_LEN) {
|
|
97
|
-
// Tolerate non-hex but length-matched ids for forward-compat with
|
|
98
|
-
// upstream id schemes; reject only on empty / non-string.
|
|
99
|
-
}
|
|
100
|
-
return {
|
|
101
|
-
id: String(a.tension_id),
|
|
102
|
-
tension_type: isNonEmptyString(a.tension_type) ? a.tension_type : null,
|
|
103
|
-
source_node_id: isNonEmptyString(a.source_node_id) ? a.source_node_id : null,
|
|
104
|
-
target_node_id: isNonEmptyString(a.target_node_id) ? a.target_node_id : null,
|
|
105
|
-
source_section: isNonEmptyString(a.source_section) ? a.source_section : null,
|
|
106
|
-
target_section: isNonEmptyString(a.target_section) ? a.target_section : null,
|
|
107
|
-
// NO body_text. NO source_title. NO target_title. NO quoted_text. (Canon Part 8)
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ---------- surfaceFinding (the F.1 dispatch surface) ----------
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Routes a detected tension finding through the F.1 Mini Decision Gate via
|
|
115
|
-
* lib/hmi/selector-dispatcher.cjs pickShape. Honors the suppression paths:
|
|
116
|
-
* - tier === 0 -> {surfaced:false, suppress_reason:'tier_0'} (no dispatch)
|
|
117
|
-
* - operator JUST_TALK -> {surfaced:false, suppress_reason:'just_talk'} (no dispatch)
|
|
118
|
-
* - dispatcher error -> {surfaced:false, suppress_reason:<err code>}
|
|
119
|
-
*
|
|
120
|
-
* Per CONTEXT.md D-02 (locked): Larry-voice render is neutral citation.
|
|
121
|
-
* The body / quote rendering happens upstream in 116-01's
|
|
122
|
-
* composeLarryVoiceDirective (additionalContext); this surface is the
|
|
123
|
-
* verb-selection gate the user picks against. recommendedVerb is null
|
|
124
|
-
* because Phase 116 deliberately omits recommendation (D-02b).
|
|
125
|
-
*
|
|
126
|
-
* @param {object} args
|
|
127
|
-
* @param {object} args.finding composeFinding output
|
|
128
|
-
* @param {string} args.roomDir
|
|
129
|
-
* @param {string} args.sessionId
|
|
130
|
-
* @param {number} args.tier 0 / 1 / 2 / 3 (Mode B/A by tier-check)
|
|
131
|
-
* @param {string} args.operator null or 'JUST_TALK' (others are pass-through)
|
|
132
|
-
* @returns {object}
|
|
133
|
-
*/
|
|
134
|
-
function surfaceFinding(args) {
|
|
135
|
-
const a = (args && typeof args === 'object') ? args : {};
|
|
136
|
-
const finding = a.finding;
|
|
137
|
-
const roomDir = a.roomDir;
|
|
138
|
-
const tier = (typeof a.tier === 'number') ? a.tier : 0;
|
|
139
|
-
const operator = (typeof a.operator === 'string' && a.operator.length > 0) ? a.operator : null;
|
|
140
|
-
|
|
141
|
-
if (!finding || typeof finding !== 'object') {
|
|
142
|
-
return { surfaced: false, suppress_reason: 'invalid_finding' };
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Suppression check 1: tier 0 -- short-circuit pre-dispatch (RESEARCH 3.4).
|
|
146
|
-
if (tier === 0) {
|
|
147
|
-
return { surfaced: false, suppress_reason: 'tier_0', finding: finding };
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Suppression check 2: JUST_TALK -- short-circuit pre-dispatch.
|
|
151
|
-
if (operator === 'JUST_TALK') {
|
|
152
|
-
return { surfaced: false, suppress_reason: 'just_talk', finding: finding };
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Lazy-require the dispatcher (test substitution friendly).
|
|
156
|
-
let dispatcher;
|
|
157
|
-
try {
|
|
158
|
-
dispatcher = require('../hmi/selector-dispatcher.cjs');
|
|
159
|
-
} catch (e) {
|
|
160
|
-
return { surfaced: false, suppress_reason: 'dispatcher_load_failed', finding: finding };
|
|
161
|
-
}
|
|
162
|
-
if (!dispatcher || typeof dispatcher.pickShape !== 'function') {
|
|
163
|
-
return { surfaced: false, suppress_reason: 'pickShape_unavailable', finding: finding };
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const surfaceStartedAtMs = Date.now();
|
|
167
|
-
let result;
|
|
168
|
-
try {
|
|
169
|
-
result = dispatcher.pickShape({
|
|
170
|
-
requestedShape: 'F.1',
|
|
171
|
-
roomDir: roomDir,
|
|
172
|
-
operator: operator,
|
|
173
|
-
tier: tier,
|
|
174
|
-
payload: {
|
|
175
|
-
verbs: F1_VERBS.slice(),
|
|
176
|
-
header: F1_HEADER,
|
|
177
|
-
recommendedVerb: null, // D-02 neutral; no recommendation
|
|
178
|
-
emitTelemetry: true, // 116-04 selector_presentation event fires via this flag
|
|
179
|
-
},
|
|
180
|
-
});
|
|
181
|
-
} catch (e) {
|
|
182
|
-
const detail = String((e && e.message) || '').slice(0, 40);
|
|
183
|
-
return { surfaced: false, suppress_reason: 'dispatch_threw:' + detail, finding: finding };
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
if (!result || result.shape === 'error') {
|
|
187
|
-
const errCode = (result && result.rendered && result.rendered.error)
|
|
188
|
-
? String(result.rendered.error)
|
|
189
|
-
: 'unknown_dispatch_error';
|
|
190
|
-
return { surfaced: false, suppress_reason: errCode, finding: finding };
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return {
|
|
194
|
-
surfaced: true,
|
|
195
|
-
finding: finding,
|
|
196
|
-
contract: (result.rendered && result.rendered.contract) ? result.rendered.contract : null,
|
|
197
|
-
rendered: result.rendered || null,
|
|
198
|
-
surfaceStartedAtMs: surfaceStartedAtMs,
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// ---------- buildResolvedViaEdge (RESOLVES_VIA cascade emission) ----------
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Sibling helper to lib/hmi/shape-f0-renderer.cjs buildRejectedBecauseEdge.
|
|
206
|
-
* Writes a RESOLVES_VIA typed cascade edge via lazygraph-ops.upsertEdge.
|
|
207
|
-
*
|
|
208
|
-
* properties.source = 'tension-hook' distinguishes this edge from the
|
|
209
|
-
* rs-engine-sourced edges that share the same edge type (the 89-07 agent
|
|
210
|
-
* uses a different edge type entirely; this attribution lets a downstream
|
|
211
|
-
* audit identify which agentic surface produced each cascade).
|
|
212
|
-
*
|
|
213
|
-
* Wrapped in try/catch -- never throws.
|
|
214
|
-
*
|
|
215
|
-
* @param {object} args
|
|
216
|
-
* @param {string} args.roomDir
|
|
217
|
-
* @param {string} args.tension_id
|
|
218
|
-
* @param {string} args.source_node_id
|
|
219
|
-
* @param {string} args.target_node_id
|
|
220
|
-
* @param {string} args.parent_decision_id
|
|
221
|
-
* @param {string} [args.actor_id]
|
|
222
|
-
* @param {object} args.db node:sqlite DatabaseSync handle
|
|
223
|
-
* @returns {{ok:boolean, reason?:string, edgeType?:string, edge?:object}}
|
|
224
|
-
*/
|
|
225
|
-
function buildResolvedViaEdge(args) {
|
|
226
|
-
try {
|
|
227
|
-
const a = (args && typeof args === 'object') ? args : {};
|
|
228
|
-
if (!isNonEmptyString(a.tension_id)) {
|
|
229
|
-
return { ok: false, reason: 'invalid_tension_id' };
|
|
230
|
-
}
|
|
231
|
-
if (!isNonEmptyString(a.source_node_id)) {
|
|
232
|
-
return { ok: false, reason: 'invalid_source_id' };
|
|
233
|
-
}
|
|
234
|
-
if (!isNonEmptyString(a.target_node_id)) {
|
|
235
|
-
return { ok: false, reason: 'invalid_target_id' };
|
|
236
|
-
}
|
|
237
|
-
if (!isNonEmptyString(a.parent_decision_id)) {
|
|
238
|
-
return { ok: false, reason: 'invalid_parent_decision_id' };
|
|
239
|
-
}
|
|
240
|
-
if (!a.db) {
|
|
241
|
-
return { ok: false, reason: 'db_unavailable' };
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
let lazygraph;
|
|
245
|
-
try {
|
|
246
|
-
lazygraph = require('../core/lazygraph-ops.cjs');
|
|
247
|
-
} catch (e) {
|
|
248
|
-
return {
|
|
249
|
-
ok: false,
|
|
250
|
-
reason: 'lazygraph_load_failed',
|
|
251
|
-
detail: String((e && e.message) || '').slice(0, 80),
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
if (!lazygraph || typeof lazygraph.upsertEdge !== 'function') {
|
|
255
|
-
return { ok: false, reason: 'upsertEdge_not_available' };
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
const props = {
|
|
259
|
-
source: 'tension-hook', // distinguishes from rs-engine origin
|
|
260
|
-
agent: 'unresolved-tension',
|
|
261
|
-
tension_id: a.tension_id,
|
|
262
|
-
parent_decision_id: a.parent_decision_id,
|
|
263
|
-
resolved_at: new Date().toISOString(),
|
|
264
|
-
};
|
|
265
|
-
if (isNonEmptyString(a.actor_id)) {
|
|
266
|
-
props.actor_id = a.actor_id;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
const result = lazygraph.upsertEdge(a.db, {
|
|
270
|
-
type: 'RESOLVES_VIA',
|
|
271
|
-
source: a.source_node_id,
|
|
272
|
-
target: a.target_node_id,
|
|
273
|
-
properties: props,
|
|
274
|
-
});
|
|
275
|
-
if (!result || result.ok !== true) {
|
|
276
|
-
return { ok: false, reason: (result && result.reason) || 'upsert_failed' };
|
|
277
|
-
}
|
|
278
|
-
return { ok: true, edgeType: 'RESOLVES_VIA', edge: result };
|
|
279
|
-
} catch (e) {
|
|
280
|
-
return {
|
|
281
|
-
ok: false,
|
|
282
|
-
reason: 'edge_build_threw_caught',
|
|
283
|
-
detail: String((e && e.message) || '').slice(0, 80),
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// ---------- handleUserResponse (post-F.1 routing) ----------
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Routes the user's F.1 selection back into JSONL state + cascade edge.
|
|
292
|
-
*
|
|
293
|
-
* RESOLVE -> markResolved(roomSlug, finding.id, 'RESOLVE') + buildResolvedViaEdge
|
|
294
|
-
* LATER -> requeue(roomSlug, finding.id) (state -> 'queued'; surfacing_count NOT decremented)
|
|
295
|
-
* SKIP -> appendTension preserving state='surfaced' with last_response='SKIP'
|
|
296
|
-
* (re-evaluated next SessionStart per RESEARCH 11.2)
|
|
297
|
-
* FREE_TEXT -> log only; Larry interprets per Canon Part 3 Verb 10; no JSONL state change
|
|
298
|
-
*
|
|
299
|
-
* Wrapped in try/catch -- never throws. Returns scalar-only result envelope
|
|
300
|
-
* (no user-content fields) so the caller can mirror to telemetry safely.
|
|
301
|
-
*
|
|
302
|
-
* @param {object} args
|
|
303
|
-
* @param {object} args.finding
|
|
304
|
-
* @param {string} args.roomDir
|
|
305
|
-
* @param {string} args.userResponse 'RESOLVE'|'LATER'|'SKIP'|'FREE_TEXT' (case-insensitive)
|
|
306
|
-
* @param {number} args.surfaceStartedAtMs Date.now() at surfaceFinding time
|
|
307
|
-
* @param {object} args.db node:sqlite DatabaseSync handle (for RESOLVE path)
|
|
308
|
-
* @param {string} [args.actor_id]
|
|
309
|
-
* @returns {object}
|
|
310
|
-
*/
|
|
311
|
-
function handleUserResponse(args) {
|
|
312
|
-
try {
|
|
313
|
-
const a = (args && typeof args === 'object') ? args : {};
|
|
314
|
-
const finding = a.finding;
|
|
315
|
-
const roomDir = a.roomDir;
|
|
316
|
-
const userResponse = String(a.userResponse || '').toUpperCase();
|
|
317
|
-
const surfaceStartedAtMs = Number.isFinite(a.surfaceStartedAtMs) ? a.surfaceStartedAtMs : Date.now();
|
|
318
|
-
const latency_ms = Math.max(0, Math.floor(Date.now() - surfaceStartedAtMs));
|
|
319
|
-
|
|
320
|
-
if (!finding || typeof finding !== 'object') {
|
|
321
|
-
return { ok: false, reason: 'invalid_finding', latency_ms: latency_ms };
|
|
322
|
-
}
|
|
323
|
-
if (!VALID_RESPONSES.has(userResponse)) {
|
|
324
|
-
return { ok: false, reason: 'invalid_response', latency_ms: latency_ms };
|
|
325
|
-
}
|
|
326
|
-
const roomSlug = path.basename(typeof roomDir === 'string' ? roomDir : '');
|
|
327
|
-
|
|
328
|
-
if (userResponse === 'RESOLVE') {
|
|
329
|
-
const r1 = pendingStore.markResolved(roomSlug, finding.id, 'RESOLVE');
|
|
330
|
-
const r2 = buildResolvedViaEdge({
|
|
331
|
-
roomDir: roomDir,
|
|
332
|
-
tension_id: finding.id,
|
|
333
|
-
source_node_id: finding.source_node_id,
|
|
334
|
-
target_node_id: finding.target_node_id,
|
|
335
|
-
parent_decision_id: 'tension:' + String(finding.id || ''),
|
|
336
|
-
actor_id: a.actor_id,
|
|
337
|
-
db: a.db,
|
|
338
|
-
});
|
|
339
|
-
// Wave-4 telemetry: emit tension_resolved per CONTEXT.md D-04.
|
|
340
|
-
try {
|
|
341
|
-
emitResolved(roomDir, finding, {
|
|
342
|
-
latency_ms: latency_ms,
|
|
343
|
-
resolved_via_edge_emitted: !!(r2 && r2.ok),
|
|
344
|
-
});
|
|
345
|
-
} catch (_e) { /* never throw on telemetry */ }
|
|
346
|
-
return {
|
|
347
|
-
ok: true,
|
|
348
|
-
response: 'RESOLVE',
|
|
349
|
-
latency_ms: latency_ms,
|
|
350
|
-
jsonl: r1,
|
|
351
|
-
edge: r2,
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
if (userResponse === 'LATER') {
|
|
356
|
-
const r1 = pendingStore.requeue(roomSlug, finding.id);
|
|
357
|
-
// No emit per RESEARCH Section 11.2 row 4: the next session start's
|
|
358
|
-
// tension_detected captures the re-enter (no separate LATER event).
|
|
359
|
-
return {
|
|
360
|
-
ok: true,
|
|
361
|
-
response: 'LATER',
|
|
362
|
-
latency_ms: latency_ms,
|
|
363
|
-
jsonl: r1,
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
if (userResponse === 'SKIP') {
|
|
368
|
-
// Per RESEARCH Section 11.2: state stays 'surfaced'; record last_response='SKIP'
|
|
369
|
-
// via a transition append. We read the current entry (LWW replay) and write
|
|
370
|
-
// a sibling entry preserving state but recording the skip, so a later
|
|
371
|
-
// SessionStart re-evaluates whether to surface again.
|
|
372
|
-
const all = pendingStore.readTensions(roomSlug);
|
|
373
|
-
const current = (Array.isArray(all)
|
|
374
|
-
? all.find((t) => t && t.tension_id === finding.id)
|
|
375
|
-
: null);
|
|
376
|
-
if (!current) {
|
|
377
|
-
return { ok: false, reason: 'tension_not_found_for_skip', latency_ms: latency_ms };
|
|
378
|
-
}
|
|
379
|
-
const next = Object.assign({}, current, { last_response: 'SKIP' });
|
|
380
|
-
const r1 = pendingStore.appendTension(roomSlug, next);
|
|
381
|
-
// Wave-4 telemetry: emit tension_skipped per CONTEXT.md D-04.
|
|
382
|
-
try {
|
|
383
|
-
emitSkipped(roomDir, finding, {
|
|
384
|
-
latency_ms: latency_ms,
|
|
385
|
-
surfacing_count: Number(current.surfacing_count) || 0,
|
|
386
|
-
});
|
|
387
|
-
} catch (_e) { /* never throw on telemetry */ }
|
|
388
|
-
return {
|
|
389
|
-
ok: true,
|
|
390
|
-
response: 'SKIP',
|
|
391
|
-
latency_ms: latency_ms,
|
|
392
|
-
jsonl: r1,
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
if (userResponse === 'FREE_TEXT') {
|
|
397
|
-
// Larry interprets per Canon Part 3 Verb 10. No JSONL state change.
|
|
398
|
-
return {
|
|
399
|
-
ok: true,
|
|
400
|
-
response: 'FREE_TEXT',
|
|
401
|
-
latency_ms: latency_ms,
|
|
402
|
-
};
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
// Unreachable -- VALID_RESPONSES guarded above.
|
|
406
|
-
return { ok: false, reason: 'unknown_response', latency_ms: latency_ms };
|
|
407
|
-
} catch (e) {
|
|
408
|
-
return {
|
|
409
|
-
ok: false,
|
|
410
|
-
reason: 'handle_response_threw',
|
|
411
|
-
detail: String((e && e.message) || '').slice(0, 80),
|
|
412
|
-
};
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
// ---------- Telemetry helpers (Canon Part 8 scalar-only payloads) ----------
|
|
417
|
-
//
|
|
418
|
-
// Each helper wraps recordSelectorMirror in try/catch and coerces every value
|
|
419
|
-
// to a scalar type (string / number / boolean / null). NEVER carries
|
|
420
|
-
// finding.body_text, finding.source_title, finding.target_title (those don't
|
|
421
|
-
// exist on the Phase 116 finding object per 116-02 composeFinding contract;
|
|
422
|
-
// the fence is defense-in-depth).
|
|
423
|
-
//
|
|
424
|
-
// Mirrors lib/agents/reverse-salient-agent.cjs lines 393-446 emitDetected /
|
|
425
|
-
// emitActedOn pattern verbatim with field substitutions per RESEARCH 4.5.
|
|
426
|
-
|
|
427
|
-
function emitDetected(roomDir, finding, ctx) {
|
|
428
|
-
try {
|
|
429
|
-
const telemetry = require('../hmi/selector-telemetry.cjs');
|
|
430
|
-
if (!telemetry || typeof telemetry.recordSelectorMirror !== 'function') {
|
|
431
|
-
return { ok: false, reason: 'telemetry_module_unavailable' };
|
|
432
|
-
}
|
|
433
|
-
const c = (ctx && typeof ctx === 'object') ? ctx : {};
|
|
434
|
-
const payload = {
|
|
435
|
-
tension_id: String((finding && finding.id) || ''),
|
|
436
|
-
tension_type: String((finding && finding.tension_type) || ''),
|
|
437
|
-
source_edge_count: Number(c.source_edge_count) || 0,
|
|
438
|
-
tier: Number(c.tier) || 0,
|
|
439
|
-
surfacing_count: Number(c.surfacing_count) || 0,
|
|
440
|
-
surfaced: Boolean(c.surfaced),
|
|
441
|
-
suppress_reason: c.suppress_reason === null || c.suppress_reason === undefined
|
|
442
|
-
? null
|
|
443
|
-
: String(c.suppress_reason),
|
|
444
|
-
brain_offline_flag: Boolean(c.brain_offline_flag),
|
|
445
|
-
selection_priority: Number(c.selection_priority) || 0,
|
|
446
|
-
};
|
|
447
|
-
return telemetry.recordSelectorMirror(roomDir, 'tension_detected', payload);
|
|
448
|
-
} catch (_e) {
|
|
449
|
-
return { ok: false, reason: 'detected_telemetry_threw' };
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
function emitSurfaced(roomDir, finding, ctx) {
|
|
454
|
-
try {
|
|
455
|
-
const telemetry = require('../hmi/selector-telemetry.cjs');
|
|
456
|
-
if (!telemetry || typeof telemetry.recordSelectorMirror !== 'function') {
|
|
457
|
-
return { ok: false, reason: 'telemetry_module_unavailable' };
|
|
458
|
-
}
|
|
459
|
-
const c = (ctx && typeof ctx === 'object') ? ctx : {};
|
|
460
|
-
const payload = {
|
|
461
|
-
tension_id: String((finding && finding.id) || ''),
|
|
462
|
-
tension_type: String((finding && finding.tension_type) || ''),
|
|
463
|
-
tier: Number(c.tier) || 0,
|
|
464
|
-
surfacing_count: Number(c.surfacing_count) || 0,
|
|
465
|
-
f1_verb_count: Number(c.f1_verb_count) || 4,
|
|
466
|
-
};
|
|
467
|
-
return telemetry.recordSelectorMirror(roomDir, 'tension_surfaced', payload);
|
|
468
|
-
} catch (_e) {
|
|
469
|
-
return { ok: false, reason: 'surfaced_telemetry_threw' };
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
function emitResolved(roomDir, finding, ctx) {
|
|
474
|
-
try {
|
|
475
|
-
const telemetry = require('../hmi/selector-telemetry.cjs');
|
|
476
|
-
if (!telemetry || typeof telemetry.recordSelectorMirror !== 'function') {
|
|
477
|
-
return { ok: false, reason: 'telemetry_module_unavailable' };
|
|
478
|
-
}
|
|
479
|
-
const c = (ctx && typeof ctx === 'object') ? ctx : {};
|
|
480
|
-
const safeLatency = Number.isFinite(c.latency_ms) ? Math.max(0, Math.floor(c.latency_ms)) : 0;
|
|
481
|
-
const payload = {
|
|
482
|
-
tension_id: String((finding && finding.id) || ''),
|
|
483
|
-
response: 'RESOLVE',
|
|
484
|
-
latency_ms: safeLatency,
|
|
485
|
-
resolved_via_edge_emitted: Boolean(c.resolved_via_edge_emitted),
|
|
486
|
-
};
|
|
487
|
-
return telemetry.recordSelectorMirror(roomDir, 'tension_resolved', payload);
|
|
488
|
-
} catch (_e) {
|
|
489
|
-
return { ok: false, reason: 'resolved_telemetry_threw' };
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
function emitDecayed(roomDir, tension_id, ctx) {
|
|
494
|
-
try {
|
|
495
|
-
const telemetry = require('../hmi/selector-telemetry.cjs');
|
|
496
|
-
if (!telemetry || typeof telemetry.recordSelectorMirror !== 'function') {
|
|
497
|
-
return { ok: false, reason: 'telemetry_module_unavailable' };
|
|
498
|
-
}
|
|
499
|
-
const c = (ctx && typeof ctx === 'object') ? ctx : {};
|
|
500
|
-
const payload = {
|
|
501
|
-
tension_id: String(tension_id || ''),
|
|
502
|
-
surfacing_count: Number(c.surfacing_count) || 3,
|
|
503
|
-
evaluation_pass_id: String(c.evaluation_pass_id || ''),
|
|
504
|
-
};
|
|
505
|
-
return telemetry.recordSelectorMirror(roomDir, 'tension_decayed', payload);
|
|
506
|
-
} catch (_e) {
|
|
507
|
-
return { ok: false, reason: 'decayed_telemetry_threw' };
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
function emitSkipped(roomDir, finding, ctx) {
|
|
512
|
-
try {
|
|
513
|
-
const telemetry = require('../hmi/selector-telemetry.cjs');
|
|
514
|
-
if (!telemetry || typeof telemetry.recordSelectorMirror !== 'function') {
|
|
515
|
-
return { ok: false, reason: 'telemetry_module_unavailable' };
|
|
516
|
-
}
|
|
517
|
-
const c = (ctx && typeof ctx === 'object') ? ctx : {};
|
|
518
|
-
const safeLatency = Number.isFinite(c.latency_ms) ? Math.max(0, Math.floor(c.latency_ms)) : 0;
|
|
519
|
-
const payload = {
|
|
520
|
-
tension_id: String((finding && finding.id) || ''),
|
|
521
|
-
latency_ms: safeLatency,
|
|
522
|
-
surfacing_count: Number(c.surfacing_count) || 0,
|
|
523
|
-
};
|
|
524
|
-
return telemetry.recordSelectorMirror(roomDir, 'tension_skipped', payload);
|
|
525
|
-
} catch (_e) {
|
|
526
|
-
return { ok: false, reason: 'skipped_telemetry_threw' };
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
// ---------- Module exports ----------
|
|
531
|
-
|
|
532
|
-
module.exports = {
|
|
533
|
-
composeFinding: composeFinding,
|
|
534
|
-
surfaceFinding: surfaceFinding,
|
|
535
|
-
buildResolvedViaEdge: buildResolvedViaEdge,
|
|
536
|
-
handleUserResponse: handleUserResponse,
|
|
537
|
-
emitDetected: emitDetected,
|
|
538
|
-
emitSurfaced: emitSurfaced,
|
|
539
|
-
emitResolved: emitResolved,
|
|
540
|
-
emitDecayed: emitDecayed,
|
|
541
|
-
emitSkipped: emitSkipped,
|
|
542
|
-
F1_VERBS: F1_VERBS.slice(),
|
|
543
|
-
F1_HEADER: F1_HEADER,
|
|
544
|
-
};
|