@remnic/core 9.66.7 → 9.66.9
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/dist/access-admin-ops-surface.d.ts +11 -11
- package/dist/access-admin-ops-surface.js +41 -41
- package/dist/access-authorization-probe.d.ts +11 -11
- package/dist/access-authorization-probe.js +42 -42
- package/dist/access-boundary.d.ts +11 -11
- package/dist/access-boundary.js +41 -41
- package/dist/access-cli.js +101 -99
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +1 -1
- package/dist/access-extraction-force-flush.d.ts +11 -11
- package/dist/access-extraction-force-flush.js +41 -41
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-lcm-compaction.d.ts +11 -11
- package/dist/access-http-lifecycle-flush.d.ts +11 -11
- package/dist/access-http-offline-stream.d.ts +11 -11
- package/dist/access-http-query.d.ts +2 -2
- package/dist/access-http-query.js +43 -43
- package/dist/access-http.d.ts +12 -12
- package/dist/access-http.js +58 -57
- package/dist/access-identity-continuity-surface.d.ts +9 -9
- package/dist/access-identity-continuity-surface.js +41 -41
- package/dist/access-lcm-surface.d.ts +11 -11
- package/dist/access-lcm-surface.js +41 -41
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp-sse.d.ts +20 -0
- package/dist/access-mcp-sse.js +8 -0
- package/dist/access-mcp-sse.js.map +1 -0
- package/dist/access-mcp.d.ts +11 -11
- package/dist/access-mcp.js +50 -50
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-50VIkPhB.d.ts → access-namespace-preflight-S8fhQcCo.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +41 -41
- package/dist/access-observe-write-surface.d.ts +11 -11
- package/dist/access-observe-write-surface.js +41 -41
- package/dist/access-offline-manifest.d.ts +9 -9
- package/dist/access-offline-manifest.js +5 -5
- package/dist/access-operations-batch.js +42 -42
- package/dist/access-operations.d.ts +11 -11
- package/dist/access-operations.js +47 -47
- package/dist/access-recall-concurrency.d.ts +11 -11
- package/dist/access-recall-concurrency.js +41 -41
- package/dist/access-recall-response.d.ts +11 -11
- package/dist/access-recall-response.js +41 -41
- package/dist/access-recall-surface.d.ts +11 -11
- package/dist/access-recall-surface.js +41 -41
- package/dist/{access-service-Dz6I9AZ-.d.ts → access-service-DcfM0Vf0.d.ts} +7 -7
- package/dist/access-service-helpers.d.ts +11 -11
- package/dist/access-service.d.ts +11 -11
- package/dist/access-service.js +41 -41
- package/dist/access-surface-catalog.d.ts +11 -11
- package/dist/access-surface-catalog.js +43 -43
- package/dist/access-wearables-meetings-surface.d.ts +3 -3
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +3 -3
- package/dist/ambient-provenance.d.ts +1 -1
- package/dist/artifact-search.d.ts +1 -1
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +9 -9
- package/dist/briefing-window.d.ts +2 -2
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +16 -16
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer-turn-helpers.d.ts +1 -1
- package/dist/buffer.d.ts +2 -2
- package/dist/buffer.js +5 -5
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +1 -1
- package/dist/capabilities.d.ts +1 -1
- package/dist/{catalog-C2jA-gLm.d.ts → catalog-BmBXTtOs.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +17 -17
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-52DBRDP5.js → chunk-23F7HGBV.js} +1 -1
- package/dist/{chunk-TNXNECAN.js → chunk-2OXIPF3A.js} +4 -4
- package/dist/{chunk-MSXUEYH6.js → chunk-3HHLOKKU.js} +2 -2
- package/dist/{chunk-OMGQAXUK.js → chunk-47BX23NA.js} +2 -2
- package/dist/{chunk-GO657WPH.js → chunk-52I6AHO6.js} +2 -2
- package/dist/{chunk-QD55QEEY.js → chunk-5CSKIWEB.js} +5 -5
- package/dist/{chunk-NMFPYAJ6.js → chunk-5GZ6UWY5.js} +8 -8
- package/dist/{chunk-KSZKQTZS.js → chunk-5KVMT25I.js} +2 -2
- package/dist/{chunk-D35XLYQ7.js → chunk-5NZIRM4Q.js} +7 -7
- package/dist/{chunk-DB2MKBQ7.js → chunk-7JPKRZD5.js} +2 -2
- package/dist/{chunk-Z3YEGSR4.js → chunk-A7GQBJP5.js} +9 -4
- package/dist/chunk-A7GQBJP5.js.map +1 -0
- package/dist/{chunk-PMNN247H.js → chunk-AAJK3PZ6.js} +2 -2
- package/dist/{chunk-6FUMA6AA.js → chunk-B3TZLAO4.js} +2 -2
- package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
- package/dist/{chunk-42GDJAU7.js → chunk-CIWOW2FH.js} +2 -2
- package/dist/{chunk-GNWLTCKC.js → chunk-CNZVEU4X.js} +2 -2
- package/dist/{chunk-CWPTYKCF.js → chunk-DGKVUPBM.js} +3 -3
- package/dist/{chunk-XJE6NHLT.js → chunk-FNYVWAIK.js} +55 -55
- package/dist/{chunk-THZ5UEQZ.js → chunk-FUPIAP6Q.js} +3 -3
- package/dist/{chunk-POSD62F5.js → chunk-G3TUQJFU.js} +2 -2
- package/dist/{chunk-Y3QQZOZ4.js → chunk-G775FE2E.js} +21 -21
- package/dist/{chunk-BEUB5ABO.js → chunk-GB4R6B5M.js} +2 -2
- package/dist/{chunk-XZBXINXZ.js → chunk-GIC6BASP.js} +4 -4
- package/dist/{chunk-6TMIW4HE.js → chunk-HWWGPS2N.js} +2 -2
- package/dist/{chunk-PPAKBRI7.js → chunk-IBHUZEKL.js} +2 -2
- package/dist/{chunk-6LMRUFBH.js → chunk-J67E4JNT.js} +2 -2
- package/dist/{chunk-FKBRP3J2.js → chunk-JHU543UU.js} +2 -2
- package/dist/{chunk-OCYRMVPT.js → chunk-JVGBDNXA.js} +2 -2
- package/dist/{chunk-IGOINKTD.js → chunk-K4E3Y3ZX.js} +2 -2
- package/dist/chunk-K4E3Y3ZX.js.map +1 -0
- package/dist/{chunk-GUG4LW4I.js → chunk-KIJCXLW7.js} +2 -2
- package/dist/{chunk-IN6D6BJG.js → chunk-KVXMN33W.js} +15 -15
- package/dist/chunk-LD72P4YS.js +29 -0
- package/dist/chunk-LD72P4YS.js.map +1 -0
- package/dist/chunk-LTDN5WYF.js +202 -0
- package/dist/chunk-LTDN5WYF.js.map +1 -0
- package/dist/{chunk-2C34EKRJ.js → chunk-MBDUNO7J.js} +2 -2
- package/dist/{chunk-V6LJENGW.js → chunk-MFI4QPW5.js} +2 -2
- package/dist/{chunk-4NKIGSJM.js → chunk-MK7EJLB4.js} +4 -4
- package/dist/{chunk-RACZB5HT.js → chunk-N37X5RU7.js} +4 -4
- package/dist/{chunk-PORKQEAW.js → chunk-NABJLNLU.js} +139 -107
- package/dist/chunk-NABJLNLU.js.map +1 -0
- package/dist/{chunk-AG46P24C.js → chunk-NNBZS3DY.js} +4 -4
- package/dist/{chunk-J2GY4UCR.js → chunk-NSP3HFJZ.js} +2 -2
- package/dist/{chunk-CEK6AHIG.js → chunk-OJSCH7QT.js} +8 -8
- package/dist/{chunk-MAWHEUAA.js → chunk-OT7WQ2I3.js} +2 -2
- package/dist/{chunk-ZW4SVXEY.js → chunk-Q3UMNZRK.js} +6 -6
- package/dist/{chunk-HQI2OQB5.js → chunk-Q5YKVBIV.js} +5 -5
- package/dist/{chunk-FHY6HIAY.js → chunk-QU2V4IO3.js} +2 -2
- package/dist/{chunk-2SW3N5HX.js → chunk-RF3LMSQW.js} +2 -2
- package/dist/{chunk-O7ERGZDA.js → chunk-RJ57OOCD.js} +2 -2
- package/dist/{chunk-KDYU3KZT.js → chunk-RLEJULGN.js} +5 -5
- package/dist/{chunk-7O24F2VS.js → chunk-SJ5L4ZZX.js} +2 -2
- package/dist/{chunk-BWZVFWMX.js → chunk-SOQLXIQX.js} +2 -2
- package/dist/{chunk-ZKE227GO.js → chunk-SRILZVR4.js} +2 -2
- package/dist/chunk-SRT6SHVZ.js +34 -0
- package/dist/chunk-SRT6SHVZ.js.map +1 -0
- package/dist/{chunk-2W4MTU4P.js → chunk-TEJKBBWS.js} +32 -26
- package/dist/chunk-TEJKBBWS.js.map +1 -0
- package/dist/{chunk-YV4ST46A.js → chunk-TKSBOV7N.js} +5 -5
- package/dist/{chunk-67U6UK5Q.js → chunk-TWMGWLHD.js} +2 -2
- package/dist/{chunk-726CXBJO.js → chunk-UAWSKMWQ.js} +2 -2
- package/dist/{chunk-MGVOBLUK.js → chunk-VCYY7XEL.js} +2 -2
- package/dist/{chunk-46XR5FNZ.js → chunk-VSWRJQQW.js} +31 -5
- package/dist/chunk-VSWRJQQW.js.map +1 -0
- package/dist/{chunk-ABPLUXVY.js → chunk-VX5YHEGJ.js} +3 -3
- package/dist/{chunk-SFJPCNBI.js → chunk-XVNDP3RO.js} +2 -2
- package/dist/{chunk-QVEKPVCG.js → chunk-ZC5L6ME2.js} +3 -3
- package/dist/{chunk-VVWOEKOZ.js → chunk-ZJGHOPEO.js} +43 -43
- package/dist/{chunk-4COPICMD.js → chunk-ZVUGRXSY.js} +6 -6
- package/dist/{cli-BOuEb4Ia.d.ts → cli-CFpMhqz5.d.ts} +5 -5
- package/dist/cli.d.ts +13 -13
- package/dist/cli.js +77 -76
- package/dist/coding/export-okf-codegraph.d.ts +1 -1
- package/dist/coding/export-okf-codegraph.js +16 -16
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +16 -16
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +3 -3
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +16 -16
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +17 -17
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +3 -3
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +20 -20
- package/dist/conversation-index/backend.d.ts +1 -1
- package/dist/conversation-index/chunker.d.ts +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +1 -1
- package/dist/conversation-index/indexer.d.ts +1 -1
- package/dist/conversation-index/search.d.ts +1 -1
- package/dist/corpus-watermark.d.ts +1 -1
- package/dist/corpus-watermark.js +19 -19
- package/dist/cross-lingual-recall.d.ts +1 -1
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/dependency-propagation-config.d.ts +1 -1
- package/dist/{dependency-propagation-delivery-D4WMbOwA.d.ts → dependency-propagation-delivery-BC3bCEet.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer.d.ts +1 -1
- package/dist/embedding-fallback.d.ts +1 -1
- package/dist/enrichment/index.d.ts +1 -1
- package/dist/entity-origin-fields.d.ts +1 -1
- package/dist/entity-retrieval.d.ts +2 -2
- package/dist/entity-retrieval.js +16 -16
- package/dist/entity-schema.d.ts +1 -1
- package/dist/episodic-context.d.ts +1 -1
- package/dist/eval-trajectory-contracts.d.ts +1 -1
- package/dist/eval-trajectory-store.d.ts +1 -1
- package/dist/eval-trajectory.d.ts +1 -1
- package/dist/explicit-capture.d.ts +9 -9
- package/dist/explicit-capture.js +1 -1
- package/dist/external-wiki-access.d.ts +11 -11
- package/dist/external-wiki-access.js +42 -42
- package/dist/external-wiki-collection-registration.d.ts +1 -1
- package/dist/external-wiki-collection.d.ts +1 -1
- package/dist/external-wiki-mcp-tools.d.ts +11 -11
- package/dist/extraction-error-classification.d.ts +1 -1
- package/dist/extraction-faithfulness.d.ts +1 -1
- package/dist/extraction-judge-telemetry.d.ts +1 -1
- package/dist/extraction-judge-training.d.ts +1 -1
- package/dist/extraction-judge.d.ts +1 -1
- package/dist/extraction-liveness.d.ts +1 -1
- package/dist/extraction-normalization.d.ts +1 -1
- package/dist/extraction-prompt.d.ts +1 -1
- package/dist/extraction-source-grounding-rules.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts +1 -1
- package/dist/extraction.d.ts +1 -1
- package/dist/extraction.js +29 -29
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/{first-start-migration-KHIMCBIC.js → first-start-migration-UG32BSG2.js} +4 -4
- package/dist/graph-dashboard-diff.d.ts +1 -1
- package/dist/graph-dashboard-key.d.ts +1 -1
- package/dist/graph-dashboard-parser.d.ts +1 -1
- package/dist/graph-edge-reinforcement.d.ts +1 -1
- package/dist/graph-path-reconstruction.d.ts +1 -1
- package/dist/graph-path-scoring.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +1 -1
- package/dist/{index-DuJnzwHv.d.ts → index-D4hS9uxK.d.ts} +2 -2
- package/dist/index.d.ts +43 -24
- package/dist/index.js +162 -158
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +3 -2
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +8 -7
- package/dist/lcm/tools.d.ts +1 -1
- package/dist/lifecycle.d.ts +1 -1
- package/dist/live-connectors-runner.d.ts +1 -1
- package/dist/local-llm.d.ts +1 -1
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/location/index.d.ts +3 -3
- package/dist/location/index.js +47 -47
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +17 -17
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +17 -17
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +19 -19
- package/dist/{maintenance-BBeaeYRR.d.ts → maintenance-BRcc3Hx8.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +11 -11
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/memory-controller.d.ts +1 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-store.d.ts +1 -1
- package/dist/memory-provenance.d.ts +1 -1
- package/dist/memory-snapshot.d.ts +1 -1
- package/dist/memory-subject-cli.d.ts +11 -11
- package/dist/memory-subject.d.ts +11 -11
- package/dist/memory-worth-outcomes.d.ts +2 -2
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +3 -3
- package/dist/namespaces/migrate.js +17 -17
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +9 -9
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +16 -16
- package/dist/native-binding-hint.d.ts +24 -0
- package/dist/native-binding-hint.js +10 -0
- package/dist/native-binding-hint.js.map +1 -0
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/offline-sync-impression-drain.js +4 -4
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +20 -20
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +30 -30
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +31 -31
- package/dist/{orchestrator-CaqnwNwM.d.ts → orchestrator-Btq9lzAN.d.ts} +8 -8
- package/dist/orchestrator.d.ts +9 -9
- package/dist/orchestrator.js +124 -122
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-CrxVjlJr.d.ts → pipeline-CZoNdFb5.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +1 -1
- package/dist/provenance.d.ts +1 -1
- package/dist/{public-http-CmQRjQCD.d.ts → public-http-C9-CHc40.d.ts} +1 -1
- package/dist/{qmd-BZgbJm0g.d.ts → qmd-VIjSCKIE.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +2 -2
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +2 -2
- package/dist/qmd.js +4 -4
- package/dist/recall-concurrency-config.d.ts +1 -1
- package/dist/recall-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +1 -1
- package/dist/recall-memory-map.d.ts +1 -1
- package/dist/recall-navigate-access.d.ts +1 -1
- package/dist/recall-navigate.d.ts +1 -1
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-state.d.ts +1 -1
- package/dist/recall-tag-filter.d.ts +1 -1
- package/dist/recall-timings.d.ts +1 -1
- package/dist/recall-xray-cli.d.ts +1 -1
- package/dist/recall-xray-renderer.d.ts +1 -1
- package/dist/recall-xray.d.ts +1 -1
- package/dist/reconcile/cursor.d.ts +1 -1
- package/dist/reconcile/manifest.d.ts +1 -1
- package/dist/reconcile/plan.d.ts +1 -1
- package/dist/replay/normalizers/chatgpt.d.ts +1 -1
- package/dist/replay/normalizers/claude.d.ts +1 -1
- package/dist/replay/normalizers/openclaw.d.ts +1 -1
- package/dist/replay/normalizers/shared.d.ts +1 -1
- package/dist/replay/runner.d.ts +1 -1
- package/dist/replay/types.d.ts +1 -1
- package/dist/replica-divergence.d.ts +1 -1
- package/dist/replica-peers-config.d.ts +1 -1
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +4 -4
- package/dist/retrieval-agents.d.ts +2 -2
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/routing/engine.d.ts +1 -1
- package/dist/routing/store.d.ts +1 -1
- package/dist/salvage-envelope.d.ts +1 -1
- package/dist/schemas.d.ts +24 -24
- package/dist/{scope-profiles-DFaojvoP.d.ts → scope-profiles-DqbxQXIS.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/factory.js +8 -8
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +12 -12
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/orama-backend.js +2 -2
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/{semantic-consolidation-BiX68wZA.d.ts → semantic-consolidation-DW3rEUoW.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +17 -17
- package/dist/semantic-rule-promotion.js +16 -16
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +16 -16
- package/dist/{service-D5h2zZ0M.d.ts → service-B2vJU_Bx.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +1 -1
- package/dist/session-observer-state.d.ts +1 -1
- package/dist/shared-context/manager.d.ts +1 -1
- package/dist/signal.d.ts +1 -1
- package/dist/source-agent-qualifier.d.ts +1 -1
- package/dist/source-agent-qualifier.js +27 -27
- package/dist/standup/build.d.ts +9 -3
- package/dist/standup/build.js +99 -7
- package/dist/{storage-CtsaojWD.d.ts → storage-6fn7BPmb.d.ts} +1 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +15 -15
- package/dist/subject-config.d.ts +1 -1
- package/dist/summarizer.d.ts +1 -1
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/support-passport/index.d.ts +14 -14
- package/dist/support-passport/index.js +44 -44
- package/dist/temporal-supersession.d.ts +2 -2
- package/dist/temporal-timeline-recall.d.ts +1 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +2 -2
- package/dist/tier-routing.d.ts +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/export-okf.d.ts +1 -1
- package/dist/transfer/export-okf.js +17 -17
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-CIpfYz1I.d.ts → types-eM7QIcX2.d.ts} +4 -0
- package/dist/types.d.ts +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +16 -16
- package/dist/who-knows-cli.d.ts +11 -11
- package/dist/who-knows-cli.js +17 -17
- package/dist/who-knows.d.ts +11 -11
- package/dist/who-knows.js +16 -16
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -2
- package/scripts/ensure-better-sqlite3.mjs +10 -0
- package/src/access-http.test.ts +41 -17
- package/src/access-http.ts +10 -10
- package/src/access-mcp-output-schemas.ts +1 -1
- package/src/access-mcp-sse.ts +50 -0
- package/src/activity/config.test.ts +1 -1
- package/src/activity/config.ts +20 -4
- package/src/activity/journal.test.ts +40 -0
- package/src/activity/timeline/index.ts +1 -0
- package/src/activity/timeline/recap-window.test.ts +129 -0
- package/src/activity/timeline/recap-window.ts +55 -0
- package/src/activity/types.ts +4 -0
- package/src/config.test.ts +1 -1
- package/src/dedup/index.ts +7 -0
- package/src/dedup/merge-decision.test.ts +157 -0
- package/src/dedup/merge-decision.ts +78 -0
- package/src/lcm/engine.ts +4 -1
- package/src/native-binding-hint.test.ts +38 -0
- package/src/native-binding-hint.ts +51 -0
- package/src/standup/build.test.ts +138 -12
- package/src/standup/build.ts +172 -23
- package/src/standup/http-glue.ts +1 -1
- package/dist/chunk-2W4MTU4P.js.map +0 -1
- package/dist/chunk-46XR5FNZ.js.map +0 -1
- package/dist/chunk-IGOINKTD.js.map +0 -1
- package/dist/chunk-PORKQEAW.js.map +0 -1
- package/dist/chunk-VOSWUO3K.js +0 -100
- package/dist/chunk-VOSWUO3K.js.map +0 -1
- package/dist/chunk-Z3YEGSR4.js.map +0 -1
- /package/dist/{chunk-52DBRDP5.js.map → chunk-23F7HGBV.js.map} +0 -0
- /package/dist/{chunk-TNXNECAN.js.map → chunk-2OXIPF3A.js.map} +0 -0
- /package/dist/{chunk-MSXUEYH6.js.map → chunk-3HHLOKKU.js.map} +0 -0
- /package/dist/{chunk-OMGQAXUK.js.map → chunk-47BX23NA.js.map} +0 -0
- /package/dist/{chunk-GO657WPH.js.map → chunk-52I6AHO6.js.map} +0 -0
- /package/dist/{chunk-QD55QEEY.js.map → chunk-5CSKIWEB.js.map} +0 -0
- /package/dist/{chunk-NMFPYAJ6.js.map → chunk-5GZ6UWY5.js.map} +0 -0
- /package/dist/{chunk-KSZKQTZS.js.map → chunk-5KVMT25I.js.map} +0 -0
- /package/dist/{chunk-D35XLYQ7.js.map → chunk-5NZIRM4Q.js.map} +0 -0
- /package/dist/{chunk-DB2MKBQ7.js.map → chunk-7JPKRZD5.js.map} +0 -0
- /package/dist/{chunk-PMNN247H.js.map → chunk-AAJK3PZ6.js.map} +0 -0
- /package/dist/{chunk-6FUMA6AA.js.map → chunk-B3TZLAO4.js.map} +0 -0
- /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
- /package/dist/{chunk-42GDJAU7.js.map → chunk-CIWOW2FH.js.map} +0 -0
- /package/dist/{chunk-GNWLTCKC.js.map → chunk-CNZVEU4X.js.map} +0 -0
- /package/dist/{chunk-CWPTYKCF.js.map → chunk-DGKVUPBM.js.map} +0 -0
- /package/dist/{chunk-XJE6NHLT.js.map → chunk-FNYVWAIK.js.map} +0 -0
- /package/dist/{chunk-THZ5UEQZ.js.map → chunk-FUPIAP6Q.js.map} +0 -0
- /package/dist/{chunk-POSD62F5.js.map → chunk-G3TUQJFU.js.map} +0 -0
- /package/dist/{chunk-Y3QQZOZ4.js.map → chunk-G775FE2E.js.map} +0 -0
- /package/dist/{chunk-BEUB5ABO.js.map → chunk-GB4R6B5M.js.map} +0 -0
- /package/dist/{chunk-XZBXINXZ.js.map → chunk-GIC6BASP.js.map} +0 -0
- /package/dist/{chunk-6TMIW4HE.js.map → chunk-HWWGPS2N.js.map} +0 -0
- /package/dist/{chunk-PPAKBRI7.js.map → chunk-IBHUZEKL.js.map} +0 -0
- /package/dist/{chunk-6LMRUFBH.js.map → chunk-J67E4JNT.js.map} +0 -0
- /package/dist/{chunk-FKBRP3J2.js.map → chunk-JHU543UU.js.map} +0 -0
- /package/dist/{chunk-OCYRMVPT.js.map → chunk-JVGBDNXA.js.map} +0 -0
- /package/dist/{chunk-GUG4LW4I.js.map → chunk-KIJCXLW7.js.map} +0 -0
- /package/dist/{chunk-IN6D6BJG.js.map → chunk-KVXMN33W.js.map} +0 -0
- /package/dist/{chunk-2C34EKRJ.js.map → chunk-MBDUNO7J.js.map} +0 -0
- /package/dist/{chunk-V6LJENGW.js.map → chunk-MFI4QPW5.js.map} +0 -0
- /package/dist/{chunk-4NKIGSJM.js.map → chunk-MK7EJLB4.js.map} +0 -0
- /package/dist/{chunk-RACZB5HT.js.map → chunk-N37X5RU7.js.map} +0 -0
- /package/dist/{chunk-AG46P24C.js.map → chunk-NNBZS3DY.js.map} +0 -0
- /package/dist/{chunk-J2GY4UCR.js.map → chunk-NSP3HFJZ.js.map} +0 -0
- /package/dist/{chunk-CEK6AHIG.js.map → chunk-OJSCH7QT.js.map} +0 -0
- /package/dist/{chunk-MAWHEUAA.js.map → chunk-OT7WQ2I3.js.map} +0 -0
- /package/dist/{chunk-ZW4SVXEY.js.map → chunk-Q3UMNZRK.js.map} +0 -0
- /package/dist/{chunk-HQI2OQB5.js.map → chunk-Q5YKVBIV.js.map} +0 -0
- /package/dist/{chunk-FHY6HIAY.js.map → chunk-QU2V4IO3.js.map} +0 -0
- /package/dist/{chunk-2SW3N5HX.js.map → chunk-RF3LMSQW.js.map} +0 -0
- /package/dist/{chunk-O7ERGZDA.js.map → chunk-RJ57OOCD.js.map} +0 -0
- /package/dist/{chunk-KDYU3KZT.js.map → chunk-RLEJULGN.js.map} +0 -0
- /package/dist/{chunk-7O24F2VS.js.map → chunk-SJ5L4ZZX.js.map} +0 -0
- /package/dist/{chunk-BWZVFWMX.js.map → chunk-SOQLXIQX.js.map} +0 -0
- /package/dist/{chunk-ZKE227GO.js.map → chunk-SRILZVR4.js.map} +0 -0
- /package/dist/{chunk-YV4ST46A.js.map → chunk-TKSBOV7N.js.map} +0 -0
- /package/dist/{chunk-67U6UK5Q.js.map → chunk-TWMGWLHD.js.map} +0 -0
- /package/dist/{chunk-726CXBJO.js.map → chunk-UAWSKMWQ.js.map} +0 -0
- /package/dist/{chunk-MGVOBLUK.js.map → chunk-VCYY7XEL.js.map} +0 -0
- /package/dist/{chunk-ABPLUXVY.js.map → chunk-VX5YHEGJ.js.map} +0 -0
- /package/dist/{chunk-SFJPCNBI.js.map → chunk-XVNDP3RO.js.map} +0 -0
- /package/dist/{chunk-QVEKPVCG.js.map → chunk-ZC5L6ME2.js.map} +0 -0
- /package/dist/{chunk-VVWOEKOZ.js.map → chunk-ZJGHOPEO.js.map} +0 -0
- /package/dist/{chunk-4COPICMD.js.map → chunk-ZVUGRXSY.js.map} +0 -0
- /package/dist/{first-start-migration-KHIMCBIC.js.map → first-start-migration-UG32BSG2.js.map} +0 -0
|
@@ -4,30 +4,156 @@ import os from "node:os";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import test from "node:test";
|
|
6
6
|
|
|
7
|
-
import { buildStandup, parseStandupDate,
|
|
7
|
+
import { buildStandup, parseStandupDate, previousActiveDate } from "./build.js";
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
const FRONTMATTER = (date: string): string => `---\nid: digest-${date}\ncategory: fact\nstatus: active\n---\n`;
|
|
10
|
+
|
|
11
|
+
test("parseStandupDate defaults only on absence, rejects garbage and empty", () => {
|
|
10
12
|
assert.equal(parseStandupDate(undefined, new Date("2026-08-18T12:00:00Z")), "2026-08-18");
|
|
13
|
+
assert.equal(parseStandupDate(null, new Date("2026-08-18T12:00:00Z")), "2026-08-18");
|
|
11
14
|
assert.throws(() => parseStandupDate("nope"), /YYYY-MM-DD/);
|
|
12
|
-
|
|
15
|
+
// An explicitly empty date is user input, not absence (§39: reject, never
|
|
16
|
+
// silently default).
|
|
17
|
+
assert.throws(() => parseStandupDate(""), /YYYY-MM-DD/);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("previousActiveDate falls back to calendar-previous when no digests exist", async () => {
|
|
21
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-standup-"));
|
|
22
|
+
try {
|
|
23
|
+
assert.equal(previousActiveDate(memoryDir, "2026-08-18"), "2026-08-17");
|
|
24
|
+
} finally {
|
|
25
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("previousActiveDate skips idle weekend days (Monday resolves to Friday)", async () => {
|
|
30
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-standup-"));
|
|
31
|
+
try {
|
|
32
|
+
await mkdir(path.join(memoryDir, "activity"), { recursive: true });
|
|
33
|
+
// 2026-08-17 is a Monday; 2026-08-14 is the prior Friday (derived from
|
|
34
|
+
// `date -d`, not memory). Weekend has no digest files.
|
|
35
|
+
await writeFile(path.join(memoryDir, "activity", "2026-08-14.md"), "x\n", "utf8");
|
|
36
|
+
assert.equal(previousActiveDate(memoryDir, "2026-08-17"), "2026-08-14");
|
|
37
|
+
} finally {
|
|
38
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("previousActiveDate picks the most recent active day, not a fixed weekday", async () => {
|
|
43
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-standup-"));
|
|
44
|
+
try {
|
|
45
|
+
await mkdir(path.join(memoryDir, "activity"), { recursive: true });
|
|
46
|
+
// Sunday activity counts: prior day is the latest day WITH data.
|
|
47
|
+
await writeFile(path.join(memoryDir, "activity", "2026-08-16.md"), "x\n", "utf8");
|
|
48
|
+
assert.equal(previousActiveDate(memoryDir, "2026-08-17"), "2026-08-16");
|
|
49
|
+
} finally {
|
|
50
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
51
|
+
}
|
|
13
52
|
});
|
|
14
53
|
|
|
15
|
-
|
|
54
|
+
function digestBody(spans: string[]): string {
|
|
55
|
+
return ["## Timeline", "", ...spans].join("\n");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
test("buildStandup derives every section from the prior active day and stays deterministic", async () => {
|
|
16
59
|
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-standup-"));
|
|
17
60
|
try {
|
|
18
61
|
await mkdir(path.join(memoryDir, "activity"), { recursive: true });
|
|
62
|
+
// Friday 2026-08-14 has the activity; Monday 2026-08-17 is the standup day.
|
|
19
63
|
await writeFile(
|
|
20
|
-
path.join(memoryDir, "activity", "2026-08-
|
|
21
|
-
"
|
|
64
|
+
path.join(memoryDir, "activity", "2026-08-14.md"),
|
|
65
|
+
FRONTMATTER("2026-08-14") +
|
|
66
|
+
digestBody([
|
|
67
|
+
"- [09:00] Editor — refactor",
|
|
68
|
+
"- [09:30] Editor — refactor",
|
|
69
|
+
"- [10:15] Terminal — build",
|
|
70
|
+
"- [11:40] Editor — review",
|
|
71
|
+
"- [14:05] Browser — docs",
|
|
72
|
+
"- [15:20] Editor — blocker: waiting on review",
|
|
73
|
+
]),
|
|
22
74
|
"utf8",
|
|
23
75
|
);
|
|
24
|
-
const a = buildStandup(memoryDir, "2026-08-
|
|
25
|
-
const b = buildStandup(memoryDir, "2026-08-
|
|
76
|
+
const a = buildStandup(memoryDir, "2026-08-17");
|
|
77
|
+
const b = buildStandup(memoryDir, "2026-08-17");
|
|
26
78
|
assert.equal(a.markdown, b.markdown);
|
|
27
|
-
|
|
28
|
-
assert.
|
|
29
|
-
|
|
30
|
-
|
|
79
|
+
|
|
80
|
+
assert.equal(a.yesterday, "2026-08-14");
|
|
81
|
+
// Highlights come from the PRIOR day (issue #1981), and frontmatter
|
|
82
|
+
// fields never leak into rendered sections.
|
|
83
|
+
assert.ok(a.highlights.length > 0);
|
|
84
|
+
for (const line of a.highlights) {
|
|
85
|
+
assert.doesNotMatch(line, /^id: |^category: |^status: |^---$/);
|
|
86
|
+
}
|
|
87
|
+
assert.match(a.markdown, /## Highlights\n- \[09:00\] Editor — refactor/);
|
|
88
|
+
// Blockers strip list markers (no doubled bullets) and come from P.
|
|
89
|
+
assert.ok(a.blockers.some((line) => line === "[15:20] Editor — blocker: waiting on review"));
|
|
90
|
+
assert.doesNotMatch(a.markdown, /- - /);
|
|
91
|
+
// Grid: exactly hours 9, 10, 11, 14, 15 non-empty; Monday empty.
|
|
92
|
+
assert.match(a.activityGrid, /^prior day 2026-08-14 — 24 hour buckets/);
|
|
93
|
+
assert.match(a.activityGrid, /^non-empty hours: 9, 10, 11, 14, 15$/m);
|
|
94
|
+
assert.match(a.markdown, /## Today \(2026-08-17\)\n_No activity digest._/);
|
|
95
|
+
// Zero commitments → explicit empty-priorities message, never invented.
|
|
96
|
+
assert.match(a.markdown, /## Today's priorities\n- \(no tracked commitments — add priorities manually\)/);
|
|
97
|
+
} finally {
|
|
98
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test("buildStandup renders an empty grid row when the prior day has no digest", async () => {
|
|
103
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-standup-"));
|
|
104
|
+
try {
|
|
105
|
+
const brief = buildStandup(memoryDir, "2026-08-18");
|
|
106
|
+
assert.match(brief.activityGrid, /^prior day 2026-08-17: no activity digest \(empty\)$/);
|
|
107
|
+
} finally {
|
|
108
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("buildStandup lists open commitments as priorities and overdue ones as blocker candidates", async () => {
|
|
113
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-standup-"));
|
|
114
|
+
try {
|
|
115
|
+
await mkdir(path.join(memoryDir, "facts", "2026-08-10"), { recursive: true });
|
|
116
|
+
const commitment = (id: string, extra: string): string =>
|
|
117
|
+
`---\nid: ${id}\ncategory: commitment\nstatus: active\ncreated: 2026-08-10T00:00:00Z\nupdated: 2026-08-10T00:00:00Z\nsource: test\nconfidence: 0.8\nconfidenceTier: reported\ntags: []\n${extra}---\n${id} says: ship the thing\n`;
|
|
118
|
+
await writeFile(path.join(memoryDir, "facts", "2026-08-10", "open.md"), commitment("open-1", ""), "utf8");
|
|
119
|
+
await writeFile(
|
|
120
|
+
path.join(memoryDir, "facts", "2026-08-10", "due-soon.md"),
|
|
121
|
+
commitment("due-soon", "expiresAt: 2026-08-19T00:00:00Z\n"),
|
|
122
|
+
"utf8",
|
|
123
|
+
);
|
|
124
|
+
await writeFile(
|
|
125
|
+
path.join(memoryDir, "facts", "2026-08-10", "overdue.md"),
|
|
126
|
+
commitment("overdue-1", "expiresAt: 2026-08-15T00:00:00Z\n"),
|
|
127
|
+
"utf8",
|
|
128
|
+
);
|
|
129
|
+
await writeFile(
|
|
130
|
+
path.join(memoryDir, "facts", "2026-08-10", "fulfilled.md"),
|
|
131
|
+
commitment("done-1", "tags: [fulfilled]\n"),
|
|
132
|
+
"utf8",
|
|
133
|
+
);
|
|
134
|
+
await writeFile(
|
|
135
|
+
path.join(memoryDir, "facts", "2026-08-10", "review.md"),
|
|
136
|
+
commitment("pending-1", "status: pending_review\n"),
|
|
137
|
+
"utf8",
|
|
138
|
+
);
|
|
139
|
+
await writeFile(
|
|
140
|
+
path.join(memoryDir, "facts", "2026-08-10", "plain-fact.md"),
|
|
141
|
+
`---\nid: fact-1\ncategory: fact\nstatus: active\ncreated: 2026-08-10T00:00:00Z\nupdated: 2026-08-10T00:00:00Z\nsource: test\nconfidence: 0.8\nconfidenceTier: reported\ntags: []\n---\nnot a commitment\n`,
|
|
142
|
+
"utf8",
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const brief = buildStandup(memoryDir, "2026-08-17");
|
|
146
|
+
// Overdue commitment is a blocker candidate, not a priority.
|
|
147
|
+
assert.ok(brief.blockers.some((line) => line.startsWith("commitment past due: overdue-1 says: ship the thing")));
|
|
148
|
+
// Fulfiled, pending-review, and non-commitment facts never appear.
|
|
149
|
+
const priorities = brief.priorities.join("\n");
|
|
150
|
+
assert.ok(priorities.includes("due-soon says: ship the thing (due 2026-08-19)"));
|
|
151
|
+
assert.ok(priorities.includes("open-1 says: ship the thing"));
|
|
152
|
+
assert.ok(!priorities.includes("done-1"));
|
|
153
|
+
assert.ok(!priorities.includes("pending-1"));
|
|
154
|
+
assert.ok(!priorities.includes("not a commitment"));
|
|
155
|
+
// Due-first ordering: expiresAt before bare created.
|
|
156
|
+
assert.ok(priorities.indexOf("due-soon") < priorities.indexOf("open-1"));
|
|
31
157
|
} finally {
|
|
32
158
|
await rm(memoryDir, { recursive: true, force: true });
|
|
33
159
|
}
|
package/src/standup/build.ts
CHANGED
|
@@ -1,41 +1,73 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
1
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
|
|
4
|
+
import { EngramAccessInputError } from "../access-errors.js";
|
|
4
5
|
import { activityDigestPath, isValidActivityDate } from "../activity/digest.js";
|
|
6
|
+
import { parseFrontmatter } from "../storage.js";
|
|
5
7
|
|
|
6
8
|
export interface StandupBrief {
|
|
7
9
|
date: string;
|
|
8
10
|
yesterday: string;
|
|
9
11
|
today: string;
|
|
10
12
|
highlights: string[];
|
|
13
|
+
priorities: string[];
|
|
11
14
|
blockers: string[];
|
|
12
15
|
activityGrid: string;
|
|
13
16
|
markdown: string;
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
export function parseStandupDate(raw: unknown, now = new Date()): string {
|
|
17
|
-
if (raw === undefined || raw === null
|
|
20
|
+
if (raw === undefined || raw === null) {
|
|
18
21
|
return now.toISOString().slice(0, 10);
|
|
19
22
|
}
|
|
20
23
|
const value = String(raw);
|
|
21
24
|
if (!isValidActivityDate(value)) {
|
|
22
|
-
|
|
25
|
+
// Typed so the HTTP surface maps it to 400 (EngramAccessInputError);
|
|
26
|
+
// subclasses Error, so the CLI still prints the message verbatim.
|
|
27
|
+
throw new EngramAccessInputError(`invalid --date ${value}; expected YYYY-MM-DD`);
|
|
23
28
|
}
|
|
24
29
|
return value;
|
|
25
30
|
}
|
|
26
31
|
|
|
27
|
-
|
|
32
|
+
/** Look back at most this many days for the prior active day (issue #1981). */
|
|
33
|
+
const STANDUP_PRIOR_DAY_LOOKBACK = 7;
|
|
34
|
+
|
|
35
|
+
function shiftDays(date: string, days: number): string {
|
|
28
36
|
const ms = Date.parse(`${date}T00:00:00Z`);
|
|
29
|
-
return new Date(ms
|
|
37
|
+
return new Date(ms + days * 86_400_000).toISOString().slice(0, 10);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Prior active day: the most recent of the 7 days before `date` that has an
|
|
42
|
+
* activity digest (working-day lookback — Monday resolves to Friday, not
|
|
43
|
+
* Sunday, when the weekend has no digests). Calendar-previous day when no
|
|
44
|
+
* day in the window qualifies.
|
|
45
|
+
*/
|
|
46
|
+
export function previousActiveDate(memoryDir: string, date: string): string {
|
|
47
|
+
for (let back = 1; back <= STANDUP_PRIOR_DAY_LOOKBACK; back += 1) {
|
|
48
|
+
const candidate = shiftDays(date, -back);
|
|
49
|
+
if (readOptional(activityDigestPath(memoryDir, candidate)) !== null) return candidate;
|
|
50
|
+
}
|
|
51
|
+
return shiftDays(date, -1);
|
|
30
52
|
}
|
|
31
53
|
|
|
32
54
|
export function buildStandup(memoryDir: string, date: string): StandupBrief {
|
|
33
|
-
const yesterday =
|
|
55
|
+
const yesterday = previousActiveDate(memoryDir, date);
|
|
34
56
|
const todayBody = readOptional(activityDigestPath(memoryDir, date));
|
|
35
57
|
const yesterdayBody = readOptional(activityDigestPath(memoryDir, yesterday));
|
|
36
|
-
const highlights = extractHighlights(
|
|
37
|
-
const
|
|
38
|
-
const
|
|
58
|
+
const highlights = extractHighlights(yesterdayBody);
|
|
59
|
+
const commitments = sortCommitments(readOpenCommitments(memoryDir));
|
|
60
|
+
const dateMs = Date.parse(`${date}T00:00:00Z`);
|
|
61
|
+
const overdue = commitments.filter(
|
|
62
|
+
(c) => c.expiresAt !== undefined && Number.isFinite(Date.parse(c.expiresAt)) && Date.parse(c.expiresAt) < dateMs,
|
|
63
|
+
);
|
|
64
|
+
const open = commitments.filter((c) => !overdue.includes(c));
|
|
65
|
+
const priorities = open.map((c) => (c.expiresAt ? `${c.text} (due ${c.expiresAt.slice(0, 10)})` : c.text));
|
|
66
|
+
const blockers = [
|
|
67
|
+
...extractBlockers(yesterdayBody),
|
|
68
|
+
...overdue.map((c) => `commitment past due: ${c.text} (was due ${c.expiresAt?.slice(0, 10)})`),
|
|
69
|
+
];
|
|
70
|
+
const activityGrid = renderGrid(yesterday, yesterdayBody);
|
|
39
71
|
const markdown = [
|
|
40
72
|
`# Standup ${date}`,
|
|
41
73
|
"",
|
|
@@ -48,6 +80,9 @@ export function buildStandup(memoryDir: string, date: string): StandupBrief {
|
|
|
48
80
|
"## Highlights",
|
|
49
81
|
...(highlights.length > 0 ? highlights.map((line) => `- ${line}`) : ["- _None._"]),
|
|
50
82
|
"",
|
|
83
|
+
"## Today's priorities",
|
|
84
|
+
...(priorities.length > 0 ? priorities.map((line) => `- ${line}`) : ["- (no tracked commitments — add priorities manually)"]),
|
|
85
|
+
"",
|
|
51
86
|
"## Blockers",
|
|
52
87
|
...(blockers.length > 0 ? blockers.map((line) => `- ${line}`) : ["- _None._"]),
|
|
53
88
|
"",
|
|
@@ -61,6 +96,7 @@ export function buildStandup(memoryDir: string, date: string): StandupBrief {
|
|
|
61
96
|
yesterday,
|
|
62
97
|
today: date,
|
|
63
98
|
highlights,
|
|
99
|
+
priorities,
|
|
64
100
|
blockers,
|
|
65
101
|
activityGrid,
|
|
66
102
|
markdown,
|
|
@@ -75,13 +111,28 @@ function readOptional(filePath: string): string | null {
|
|
|
75
111
|
}
|
|
76
112
|
}
|
|
77
113
|
|
|
114
|
+
/** Drop a leading `--- … ---` frontmatter block so its fields never render. */
|
|
115
|
+
function stripFrontmatter(body: string): string {
|
|
116
|
+
const lines = body.split("\n");
|
|
117
|
+
if (lines[0]?.trim() !== "---") return body;
|
|
118
|
+
const end = lines.indexOf("---", 1);
|
|
119
|
+
return end < 0 ? body : lines.slice(end + 1).join("\n");
|
|
120
|
+
}
|
|
121
|
+
|
|
78
122
|
function firstLines(body: string, n: number): string {
|
|
79
|
-
return
|
|
123
|
+
return (
|
|
124
|
+
stripFrontmatter(body)
|
|
125
|
+
.split("\n")
|
|
126
|
+
.filter((line) => line.trim().length > 0 && !line.startsWith("#") && !line.startsWith("---"))
|
|
127
|
+
.slice(0, n)
|
|
128
|
+
.join("\n")
|
|
129
|
+
.trim() || "_Empty digest._"
|
|
130
|
+
);
|
|
80
131
|
}
|
|
81
132
|
|
|
82
133
|
function extractHighlights(body: string | null): string[] {
|
|
83
134
|
if (!body) return [];
|
|
84
|
-
return body
|
|
135
|
+
return stripFrontmatter(body)
|
|
85
136
|
.split("\n")
|
|
86
137
|
.map((line) => line.replace(/^[-*]\s+/, "").trim())
|
|
87
138
|
.filter((line) => line.length > 0 && !line.startsWith("#") && !line.startsWith("---"))
|
|
@@ -90,26 +141,124 @@ function extractHighlights(body: string | null): string[] {
|
|
|
90
141
|
|
|
91
142
|
function extractBlockers(body: string | null): string[] {
|
|
92
143
|
if (!body) return [];
|
|
93
|
-
return body
|
|
144
|
+
return stripFrontmatter(body)
|
|
94
145
|
.split("\n")
|
|
95
|
-
.map((line) => line.trim())
|
|
96
|
-
.filter((line) => /blocker|blocked|stuck|waiting/i.test(line))
|
|
146
|
+
.map((line) => line.replace(/^[-*]\s+/, "").trim())
|
|
147
|
+
.filter((line) => line.length > 0 && /blocker|blocked|stuck|waiting/i.test(line))
|
|
97
148
|
.slice(0, 5);
|
|
98
149
|
}
|
|
99
150
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
151
|
+
// ── Activity grid (24 hour buckets, byte-stable) ────────────────────────────
|
|
152
|
+
|
|
153
|
+
const GRID_GLYPHS = ["░", "▁", "▂", "▃", "▄", "█"] as const;
|
|
154
|
+
|
|
155
|
+
/** Local hour of a digest timeline span line `- [HH:MM] app — window`, or null. */
|
|
156
|
+
function spanHour(line: string): number | null {
|
|
157
|
+
if (!line.startsWith("- [")) return null;
|
|
158
|
+
const close = line.indexOf("]", 3);
|
|
159
|
+
if (close < 0) return null;
|
|
160
|
+
const clock = line.slice(3, close);
|
|
161
|
+
const sep = clock.indexOf(":");
|
|
162
|
+
if (sep <= 0) return null;
|
|
163
|
+
const hour = Number.parseInt(clock.slice(0, sep), 10);
|
|
164
|
+
return Number.isInteger(hour) && hour >= 0 && hour <= 23 ? hour : null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function renderGrid(yesterday: string, body: string | null): string {
|
|
168
|
+
if (!body) return `prior day ${yesterday}: no activity digest (empty)`;
|
|
169
|
+
const counts: number[] = new Array(24).fill(0);
|
|
170
|
+
for (const line of stripFrontmatter(body).split("\n")) {
|
|
171
|
+
const hour = spanHour(line);
|
|
172
|
+
if (hour !== null) counts[hour] = counts[hour]! + 1;
|
|
173
|
+
}
|
|
174
|
+
const max = Math.max(...counts);
|
|
175
|
+
if (max === 0) return `prior day ${yesterday}: digest present, no timeline activity`;
|
|
176
|
+
const glyphs = counts
|
|
177
|
+
.map((count) =>
|
|
178
|
+
count === 0 ? "·" : GRID_GLYPHS[Math.min(GRID_GLYPHS.length - 1, Math.ceil((count / max) * GRID_GLYPHS.length) - 1)],
|
|
179
|
+
)
|
|
180
|
+
.join("");
|
|
181
|
+
const nonEmpty = counts.map((count, hour) => (count > 0 ? `${hour}` : null)).filter((h): h is string => h !== null);
|
|
182
|
+
return [`prior day ${yesterday} — 24 hour buckets (· = idle):`, glyphs, `non-empty hours: ${nonEmpty.join(", ")}`].join(
|
|
183
|
+
"\n",
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── Open commitments (deterministic facts scan) ─────────────────────────────
|
|
188
|
+
|
|
189
|
+
interface OpenCommitment {
|
|
190
|
+
id: string;
|
|
191
|
+
text: string;
|
|
192
|
+
created: string;
|
|
193
|
+
expiresAt?: string;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function readOpenCommitments(memoryDir: string): OpenCommitment[] {
|
|
197
|
+
const factsDir = path.join(memoryDir, "facts");
|
|
198
|
+
let dayDirs: string[];
|
|
199
|
+
try {
|
|
200
|
+
dayDirs = readdirSync(factsDir, { withFileTypes: true })
|
|
201
|
+
.filter((entry) => entry.isDirectory() && !entry.isSymbolicLink() && isValidActivityDate(entry.name))
|
|
202
|
+
.map((entry) => entry.name)
|
|
203
|
+
.sort();
|
|
204
|
+
} catch {
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
const out: OpenCommitment[] = [];
|
|
208
|
+
for (const day of dayDirs) {
|
|
209
|
+
let files: string[];
|
|
210
|
+
try {
|
|
211
|
+
files = readdirSync(path.join(factsDir, day), { withFileTypes: true })
|
|
212
|
+
.filter((entry) => entry.isFile() && !entry.isSymbolicLink() && entry.name.endsWith(".md"))
|
|
213
|
+
.map((entry) => entry.name)
|
|
214
|
+
.sort();
|
|
215
|
+
} catch {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
for (const name of files) {
|
|
219
|
+
const parsed = parseFrontmatter(readOptional(path.join(factsDir, day, name)) ?? "");
|
|
220
|
+
if (!parsed) continue;
|
|
221
|
+
const fm = parsed.frontmatter;
|
|
222
|
+
if (fm.category !== "commitment") continue;
|
|
223
|
+
if ((fm.status ?? "active") !== "active") continue;
|
|
224
|
+
if (fm.tags.some((tag) => tag === "fulfilled" || tag === "expired")) continue;
|
|
225
|
+
const text = parsed.content
|
|
226
|
+
.split("\n")
|
|
227
|
+
.map((line) => line.trim())
|
|
228
|
+
.find((line) => line.length > 0);
|
|
229
|
+
if (!text) continue;
|
|
230
|
+
out.push({
|
|
231
|
+
id: fm.id,
|
|
232
|
+
text,
|
|
233
|
+
created: fm.created,
|
|
234
|
+
...(fm.expiresAt !== undefined ? { expiresAt: fm.expiresAt } : {}),
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return out;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function sortCommitments(list: OpenCommitment[]): OpenCommitment[] {
|
|
242
|
+
return [...list].sort((a, b) => {
|
|
243
|
+
// Due-ness first: a commitment with a concrete expiry outranks an
|
|
244
|
+
// undated one; earlier expiry is more due. Created, then id, as the
|
|
245
|
+
// stable tiebreak (§12).
|
|
246
|
+
const aDated = a.expiresAt !== undefined ? 0 : 1;
|
|
247
|
+
const bDated = b.expiresAt !== undefined ? 0 : 1;
|
|
248
|
+
if (aDated !== bDated) return aDated - bDated;
|
|
249
|
+
const ka = a.expiresAt ?? a.created;
|
|
250
|
+
const kb = b.expiresAt ?? b.created;
|
|
251
|
+
if (ka !== kb) return ka < kb ? -1 : 1;
|
|
252
|
+
if (a.id !== b.id) return a.id < b.id ? -1 : 1;
|
|
253
|
+
return 0;
|
|
254
|
+
});
|
|
104
255
|
}
|
|
105
256
|
|
|
106
257
|
export function standupHelp(): string {
|
|
107
258
|
return `Usage: remnic standup [--date YYYY-MM-DD]
|
|
108
259
|
|
|
109
|
-
Deterministic yesterday/today/blockers brief
|
|
260
|
+
Deterministic yesterday/today/blockers brief: prior-working-day highlights,
|
|
261
|
+
today's priorities from open commitments, blocker candidates, and a 24-hour
|
|
262
|
+
activity grid.
|
|
110
263
|
`;
|
|
111
264
|
}
|
|
112
|
-
|
|
113
|
-
export function standupMemoryDirPlaceholder(memoryDir: string): string {
|
|
114
|
-
return path.resolve(memoryDir);
|
|
115
|
-
}
|
package/src/standup/http-glue.ts
CHANGED
|
@@ -10,6 +10,6 @@ export async function respondStandup(
|
|
|
10
10
|
): Promise<void> {
|
|
11
11
|
const op = getOperation("standup");
|
|
12
12
|
if (!op) throw new Error("access-boundary: operation not registered: standup");
|
|
13
|
-
const output = (await op.run({ ...(date ? {
|
|
13
|
+
const output = (await op.run({ ...(date === null ? {} : { date }) }, { service })) as { result: unknown };
|
|
14
14
|
respondJson(res, 200, output.result);
|
|
15
15
|
}
|