@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.
Files changed (474) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -11
  2. package/dist/access-admin-ops-surface.js +41 -41
  3. package/dist/access-authorization-probe.d.ts +11 -11
  4. package/dist/access-authorization-probe.js +42 -42
  5. package/dist/access-boundary.d.ts +11 -11
  6. package/dist/access-boundary.js +41 -41
  7. package/dist/access-cli.js +101 -99
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +11 -11
  11. package/dist/access-extraction-force-flush.js +41 -41
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +11 -11
  14. package/dist/access-http-lifecycle-flush.d.ts +11 -11
  15. package/dist/access-http-offline-stream.d.ts +11 -11
  16. package/dist/access-http-query.d.ts +2 -2
  17. package/dist/access-http-query.js +43 -43
  18. package/dist/access-http.d.ts +12 -12
  19. package/dist/access-http.js +58 -57
  20. package/dist/access-identity-continuity-surface.d.ts +9 -9
  21. package/dist/access-identity-continuity-surface.js +41 -41
  22. package/dist/access-lcm-surface.d.ts +11 -11
  23. package/dist/access-lcm-surface.js +41 -41
  24. package/dist/access-mcp-output-schemas.js +1 -1
  25. package/dist/access-mcp-sse.d.ts +20 -0
  26. package/dist/access-mcp-sse.js +8 -0
  27. package/dist/access-mcp-sse.js.map +1 -0
  28. package/dist/access-mcp.d.ts +11 -11
  29. package/dist/access-mcp.js +50 -50
  30. package/dist/access-memory-search-fanout.d.ts +2 -2
  31. package/dist/{access-namespace-preflight-50VIkPhB.d.ts → access-namespace-preflight-S8fhQcCo.d.ts} +1 -1
  32. package/dist/access-namespace-preflight.d.ts +3 -3
  33. package/dist/access-namespace-preflight.js +41 -41
  34. package/dist/access-observe-write-surface.d.ts +11 -11
  35. package/dist/access-observe-write-surface.js +41 -41
  36. package/dist/access-offline-manifest.d.ts +9 -9
  37. package/dist/access-offline-manifest.js +5 -5
  38. package/dist/access-operations-batch.js +42 -42
  39. package/dist/access-operations.d.ts +11 -11
  40. package/dist/access-operations.js +47 -47
  41. package/dist/access-recall-concurrency.d.ts +11 -11
  42. package/dist/access-recall-concurrency.js +41 -41
  43. package/dist/access-recall-response.d.ts +11 -11
  44. package/dist/access-recall-response.js +41 -41
  45. package/dist/access-recall-surface.d.ts +11 -11
  46. package/dist/access-recall-surface.js +41 -41
  47. package/dist/{access-service-Dz6I9AZ-.d.ts → access-service-DcfM0Vf0.d.ts} +7 -7
  48. package/dist/access-service-helpers.d.ts +11 -11
  49. package/dist/access-service.d.ts +11 -11
  50. package/dist/access-service.js +41 -41
  51. package/dist/access-surface-catalog.d.ts +11 -11
  52. package/dist/access-surface-catalog.js +43 -43
  53. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  54. package/dist/action-confidence.d.ts +1 -1
  55. package/dist/active-memory-bridge.d.ts +1 -1
  56. package/dist/active-recall.d.ts +1 -1
  57. package/dist/active-recall.js +3 -3
  58. package/dist/ambient-provenance.d.ts +1 -1
  59. package/dist/artifact-search.d.ts +1 -1
  60. package/dist/behavior-learner.d.ts +1 -1
  61. package/dist/behavior-signals.d.ts +1 -1
  62. package/dist/bootstrap.d.ts +9 -9
  63. package/dist/briefing-window.d.ts +2 -2
  64. package/dist/briefing.d.ts +2 -2
  65. package/dist/briefing.js +16 -16
  66. package/dist/buffer-surprise-report.d.ts +1 -1
  67. package/dist/buffer-turn-helpers.d.ts +1 -1
  68. package/dist/buffer.d.ts +2 -2
  69. package/dist/buffer.js +5 -5
  70. package/dist/bulk-import/index.d.ts +3 -3
  71. package/dist/calibration.d.ts +1 -1
  72. package/dist/capabilities.d.ts +1 -1
  73. package/dist/{catalog-C2jA-gLm.d.ts → catalog-BmBXTtOs.d.ts} +1 -1
  74. package/dist/causal-behavior.d.ts +1 -1
  75. package/dist/causal-consolidation.d.ts +1 -1
  76. package/dist/causal-consolidation.js +17 -17
  77. package/dist/causal-trajectory-graph.d.ts +1 -1
  78. package/dist/{chunk-52DBRDP5.js → chunk-23F7HGBV.js} +1 -1
  79. package/dist/{chunk-TNXNECAN.js → chunk-2OXIPF3A.js} +4 -4
  80. package/dist/{chunk-MSXUEYH6.js → chunk-3HHLOKKU.js} +2 -2
  81. package/dist/{chunk-OMGQAXUK.js → chunk-47BX23NA.js} +2 -2
  82. package/dist/{chunk-GO657WPH.js → chunk-52I6AHO6.js} +2 -2
  83. package/dist/{chunk-QD55QEEY.js → chunk-5CSKIWEB.js} +5 -5
  84. package/dist/{chunk-NMFPYAJ6.js → chunk-5GZ6UWY5.js} +8 -8
  85. package/dist/{chunk-KSZKQTZS.js → chunk-5KVMT25I.js} +2 -2
  86. package/dist/{chunk-D35XLYQ7.js → chunk-5NZIRM4Q.js} +7 -7
  87. package/dist/{chunk-DB2MKBQ7.js → chunk-7JPKRZD5.js} +2 -2
  88. package/dist/{chunk-Z3YEGSR4.js → chunk-A7GQBJP5.js} +9 -4
  89. package/dist/chunk-A7GQBJP5.js.map +1 -0
  90. package/dist/{chunk-PMNN247H.js → chunk-AAJK3PZ6.js} +2 -2
  91. package/dist/{chunk-6FUMA6AA.js → chunk-B3TZLAO4.js} +2 -2
  92. package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
  93. package/dist/{chunk-42GDJAU7.js → chunk-CIWOW2FH.js} +2 -2
  94. package/dist/{chunk-GNWLTCKC.js → chunk-CNZVEU4X.js} +2 -2
  95. package/dist/{chunk-CWPTYKCF.js → chunk-DGKVUPBM.js} +3 -3
  96. package/dist/{chunk-XJE6NHLT.js → chunk-FNYVWAIK.js} +55 -55
  97. package/dist/{chunk-THZ5UEQZ.js → chunk-FUPIAP6Q.js} +3 -3
  98. package/dist/{chunk-POSD62F5.js → chunk-G3TUQJFU.js} +2 -2
  99. package/dist/{chunk-Y3QQZOZ4.js → chunk-G775FE2E.js} +21 -21
  100. package/dist/{chunk-BEUB5ABO.js → chunk-GB4R6B5M.js} +2 -2
  101. package/dist/{chunk-XZBXINXZ.js → chunk-GIC6BASP.js} +4 -4
  102. package/dist/{chunk-6TMIW4HE.js → chunk-HWWGPS2N.js} +2 -2
  103. package/dist/{chunk-PPAKBRI7.js → chunk-IBHUZEKL.js} +2 -2
  104. package/dist/{chunk-6LMRUFBH.js → chunk-J67E4JNT.js} +2 -2
  105. package/dist/{chunk-FKBRP3J2.js → chunk-JHU543UU.js} +2 -2
  106. package/dist/{chunk-OCYRMVPT.js → chunk-JVGBDNXA.js} +2 -2
  107. package/dist/{chunk-IGOINKTD.js → chunk-K4E3Y3ZX.js} +2 -2
  108. package/dist/chunk-K4E3Y3ZX.js.map +1 -0
  109. package/dist/{chunk-GUG4LW4I.js → chunk-KIJCXLW7.js} +2 -2
  110. package/dist/{chunk-IN6D6BJG.js → chunk-KVXMN33W.js} +15 -15
  111. package/dist/chunk-LD72P4YS.js +29 -0
  112. package/dist/chunk-LD72P4YS.js.map +1 -0
  113. package/dist/chunk-LTDN5WYF.js +202 -0
  114. package/dist/chunk-LTDN5WYF.js.map +1 -0
  115. package/dist/{chunk-2C34EKRJ.js → chunk-MBDUNO7J.js} +2 -2
  116. package/dist/{chunk-V6LJENGW.js → chunk-MFI4QPW5.js} +2 -2
  117. package/dist/{chunk-4NKIGSJM.js → chunk-MK7EJLB4.js} +4 -4
  118. package/dist/{chunk-RACZB5HT.js → chunk-N37X5RU7.js} +4 -4
  119. package/dist/{chunk-PORKQEAW.js → chunk-NABJLNLU.js} +139 -107
  120. package/dist/chunk-NABJLNLU.js.map +1 -0
  121. package/dist/{chunk-AG46P24C.js → chunk-NNBZS3DY.js} +4 -4
  122. package/dist/{chunk-J2GY4UCR.js → chunk-NSP3HFJZ.js} +2 -2
  123. package/dist/{chunk-CEK6AHIG.js → chunk-OJSCH7QT.js} +8 -8
  124. package/dist/{chunk-MAWHEUAA.js → chunk-OT7WQ2I3.js} +2 -2
  125. package/dist/{chunk-ZW4SVXEY.js → chunk-Q3UMNZRK.js} +6 -6
  126. package/dist/{chunk-HQI2OQB5.js → chunk-Q5YKVBIV.js} +5 -5
  127. package/dist/{chunk-FHY6HIAY.js → chunk-QU2V4IO3.js} +2 -2
  128. package/dist/{chunk-2SW3N5HX.js → chunk-RF3LMSQW.js} +2 -2
  129. package/dist/{chunk-O7ERGZDA.js → chunk-RJ57OOCD.js} +2 -2
  130. package/dist/{chunk-KDYU3KZT.js → chunk-RLEJULGN.js} +5 -5
  131. package/dist/{chunk-7O24F2VS.js → chunk-SJ5L4ZZX.js} +2 -2
  132. package/dist/{chunk-BWZVFWMX.js → chunk-SOQLXIQX.js} +2 -2
  133. package/dist/{chunk-ZKE227GO.js → chunk-SRILZVR4.js} +2 -2
  134. package/dist/chunk-SRT6SHVZ.js +34 -0
  135. package/dist/chunk-SRT6SHVZ.js.map +1 -0
  136. package/dist/{chunk-2W4MTU4P.js → chunk-TEJKBBWS.js} +32 -26
  137. package/dist/chunk-TEJKBBWS.js.map +1 -0
  138. package/dist/{chunk-YV4ST46A.js → chunk-TKSBOV7N.js} +5 -5
  139. package/dist/{chunk-67U6UK5Q.js → chunk-TWMGWLHD.js} +2 -2
  140. package/dist/{chunk-726CXBJO.js → chunk-UAWSKMWQ.js} +2 -2
  141. package/dist/{chunk-MGVOBLUK.js → chunk-VCYY7XEL.js} +2 -2
  142. package/dist/{chunk-46XR5FNZ.js → chunk-VSWRJQQW.js} +31 -5
  143. package/dist/chunk-VSWRJQQW.js.map +1 -0
  144. package/dist/{chunk-ABPLUXVY.js → chunk-VX5YHEGJ.js} +3 -3
  145. package/dist/{chunk-SFJPCNBI.js → chunk-XVNDP3RO.js} +2 -2
  146. package/dist/{chunk-QVEKPVCG.js → chunk-ZC5L6ME2.js} +3 -3
  147. package/dist/{chunk-VVWOEKOZ.js → chunk-ZJGHOPEO.js} +43 -43
  148. package/dist/{chunk-4COPICMD.js → chunk-ZVUGRXSY.js} +6 -6
  149. package/dist/{cli-BOuEb4Ia.d.ts → cli-CFpMhqz5.d.ts} +5 -5
  150. package/dist/cli.d.ts +13 -13
  151. package/dist/cli.js +77 -76
  152. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  153. package/dist/coding/export-okf-codegraph.js +16 -16
  154. package/dist/coding/pre-action-gate.d.ts +1 -1
  155. package/dist/compounding/engine.d.ts +2 -2
  156. package/dist/compounding/engine.js +16 -16
  157. package/dist/compounding/preference-consolidator.d.ts +1 -1
  158. package/dist/compression-optimizer.d.ts +1 -1
  159. package/dist/config.d.ts +1 -1
  160. package/dist/config.js +3 -3
  161. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  162. package/dist/connectors/codex-materialize-runner.js +16 -16
  163. package/dist/connectors/codex-materialize.d.ts +1 -1
  164. package/dist/connectors/index.d.ts +1 -1
  165. package/dist/connectors/index.js +17 -17
  166. package/dist/consolidation-provenance-check.d.ts +2 -2
  167. package/dist/consolidation-undo.d.ts +2 -2
  168. package/dist/contradiction/index.d.ts +3 -3
  169. package/dist/converge-config.d.ts +1 -1
  170. package/dist/convergence-refresh.d.ts +2 -2
  171. package/dist/convergence-refresh.js +20 -20
  172. package/dist/conversation-index/backend.d.ts +1 -1
  173. package/dist/conversation-index/chunker.d.ts +1 -1
  174. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  175. package/dist/conversation-index/indexer.d.ts +1 -1
  176. package/dist/conversation-index/search.d.ts +1 -1
  177. package/dist/corpus-watermark.d.ts +1 -1
  178. package/dist/corpus-watermark.js +19 -19
  179. package/dist/cross-lingual-recall.d.ts +1 -1
  180. package/dist/day-summary.d.ts +1 -1
  181. package/dist/delinearize.d.ts +1 -1
  182. package/dist/dependency-propagation-config.d.ts +1 -1
  183. package/dist/{dependency-propagation-delivery-D4WMbOwA.d.ts → dependency-propagation-delivery-BC3bCEet.d.ts} +1 -1
  184. package/dist/direct-answer-wiring.d.ts +1 -1
  185. package/dist/direct-answer.d.ts +1 -1
  186. package/dist/embedding-fallback.d.ts +1 -1
  187. package/dist/enrichment/index.d.ts +1 -1
  188. package/dist/entity-origin-fields.d.ts +1 -1
  189. package/dist/entity-retrieval.d.ts +2 -2
  190. package/dist/entity-retrieval.js +16 -16
  191. package/dist/entity-schema.d.ts +1 -1
  192. package/dist/episodic-context.d.ts +1 -1
  193. package/dist/eval-trajectory-contracts.d.ts +1 -1
  194. package/dist/eval-trajectory-store.d.ts +1 -1
  195. package/dist/eval-trajectory.d.ts +1 -1
  196. package/dist/explicit-capture.d.ts +9 -9
  197. package/dist/explicit-capture.js +1 -1
  198. package/dist/external-wiki-access.d.ts +11 -11
  199. package/dist/external-wiki-access.js +42 -42
  200. package/dist/external-wiki-collection-registration.d.ts +1 -1
  201. package/dist/external-wiki-collection.d.ts +1 -1
  202. package/dist/external-wiki-mcp-tools.d.ts +11 -11
  203. package/dist/extraction-error-classification.d.ts +1 -1
  204. package/dist/extraction-faithfulness.d.ts +1 -1
  205. package/dist/extraction-judge-telemetry.d.ts +1 -1
  206. package/dist/extraction-judge-training.d.ts +1 -1
  207. package/dist/extraction-judge.d.ts +1 -1
  208. package/dist/extraction-liveness.d.ts +1 -1
  209. package/dist/extraction-normalization.d.ts +1 -1
  210. package/dist/extraction-prompt.d.ts +1 -1
  211. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  212. package/dist/extraction-source-grounding.d.ts +1 -1
  213. package/dist/extraction.d.ts +1 -1
  214. package/dist/extraction.js +29 -29
  215. package/dist/fallback-llm.d.ts +1 -1
  216. package/dist/{first-start-migration-KHIMCBIC.js → first-start-migration-UG32BSG2.js} +4 -4
  217. package/dist/graph-dashboard-diff.d.ts +1 -1
  218. package/dist/graph-dashboard-key.d.ts +1 -1
  219. package/dist/graph-dashboard-parser.d.ts +1 -1
  220. package/dist/graph-edge-reinforcement.d.ts +1 -1
  221. package/dist/graph-path-reconstruction.d.ts +1 -1
  222. package/dist/graph-path-scoring.d.ts +1 -1
  223. package/dist/graph-snapshot.d.ts +1 -1
  224. package/dist/graph.d.ts +1 -1
  225. package/dist/harmonic-retrieval.js +1 -1
  226. package/dist/importance.d.ts +1 -1
  227. package/dist/importers/index.d.ts +1 -1
  228. package/dist/in-flight-reads.d.ts +1 -1
  229. package/dist/{index-DuJnzwHv.d.ts → index-D4hS9uxK.d.ts} +2 -2
  230. package/dist/index.d.ts +43 -24
  231. package/dist/index.js +162 -158
  232. package/dist/intent.d.ts +1 -1
  233. package/dist/lcm/engine.d.ts +1 -1
  234. package/dist/lcm/engine.js +3 -2
  235. package/dist/lcm/index.d.ts +1 -1
  236. package/dist/lcm/index.js +8 -7
  237. package/dist/lcm/tools.d.ts +1 -1
  238. package/dist/lifecycle.d.ts +1 -1
  239. package/dist/live-connectors-runner.d.ts +1 -1
  240. package/dist/local-llm.d.ts +1 -1
  241. package/dist/local-model-endpoint.d.ts +1 -1
  242. package/dist/location/index.d.ts +3 -3
  243. package/dist/location/index.js +47 -47
  244. package/dist/maintenance/memory-governance.d.ts +1 -1
  245. package/dist/maintenance/memory-governance.js +17 -17
  246. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  247. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +17 -17
  248. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  249. package/dist/maintenance/rebuild-memory-projection.js +19 -19
  250. package/dist/{maintenance-BBeaeYRR.d.ts → maintenance-BRcc3Hx8.d.ts} +3 -3
  251. package/dist/mcp-memory-inspector-app.d.ts +11 -11
  252. package/dist/memory-action-policy.d.ts +1 -1
  253. package/dist/memory-cache.d.ts +1 -1
  254. package/dist/memory-controller.d.ts +1 -1
  255. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  256. package/dist/memory-projection-store.d.ts +1 -1
  257. package/dist/memory-provenance.d.ts +1 -1
  258. package/dist/memory-snapshot.d.ts +1 -1
  259. package/dist/memory-subject-cli.d.ts +11 -11
  260. package/dist/memory-subject.d.ts +11 -11
  261. package/dist/memory-worth-outcomes.d.ts +2 -2
  262. package/dist/models-json.d.ts +1 -1
  263. package/dist/namespaces/migrate.d.ts +3 -3
  264. package/dist/namespaces/migrate.js +17 -17
  265. package/dist/namespaces/principal.d.ts +1 -1
  266. package/dist/namespaces/search.d.ts +1 -1
  267. package/dist/namespaces/search.js +9 -9
  268. package/dist/namespaces/storage.d.ts +3 -3
  269. package/dist/namespaces/storage.js +16 -16
  270. package/dist/native-binding-hint.d.ts +24 -0
  271. package/dist/native-binding-hint.js +10 -0
  272. package/dist/native-binding-hint.js.map +1 -0
  273. package/dist/native-knowledge.d.ts +1 -1
  274. package/dist/offline-sync-impression-drain.d.ts +1 -1
  275. package/dist/offline-sync-impression-drain.js +4 -4
  276. package/dist/operator-doctor-corpus.d.ts +1 -1
  277. package/dist/operator-doctor-corpus.js +20 -20
  278. package/dist/operator-doctor-replica.d.ts +1 -1
  279. package/dist/operator-toolkit.d.ts +3 -3
  280. package/dist/operator-toolkit.js +30 -30
  281. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  282. package/dist/orchestration/maintenance.d.ts +4 -4
  283. package/dist/orchestration/maintenance.js +31 -31
  284. package/dist/{orchestrator-CaqnwNwM.d.ts → orchestrator-Btq9lzAN.d.ts} +8 -8
  285. package/dist/orchestrator.d.ts +9 -9
  286. package/dist/orchestrator.js +124 -122
  287. package/dist/patterns-cli.d.ts +1 -1
  288. package/dist/{pipeline-CrxVjlJr.d.ts → pipeline-CZoNdFb5.d.ts} +1 -1
  289. package/dist/policy-runtime.d.ts +1 -1
  290. package/dist/proactive-contention.d.ts +1 -1
  291. package/dist/provenance.d.ts +1 -1
  292. package/dist/{public-http-CmQRjQCD.d.ts → public-http-C9-CHc40.d.ts} +1 -1
  293. package/dist/{qmd-BZgbJm0g.d.ts → qmd-VIjSCKIE.d.ts} +1 -1
  294. package/dist/qmd-preflight.d.ts +2 -2
  295. package/dist/qmd-recall-cache.d.ts +1 -1
  296. package/dist/qmd.d.ts +2 -2
  297. package/dist/qmd.js +4 -4
  298. package/dist/recall-concurrency-config.d.ts +1 -1
  299. package/dist/recall-disclosure-escalation.d.ts +1 -1
  300. package/dist/recall-explain-renderer.d.ts +1 -1
  301. package/dist/recall-memory-map.d.ts +1 -1
  302. package/dist/recall-navigate-access.d.ts +1 -1
  303. package/dist/recall-navigate.d.ts +1 -1
  304. package/dist/recall-planner-llm.d.ts +1 -1
  305. package/dist/recall-state.d.ts +1 -1
  306. package/dist/recall-tag-filter.d.ts +1 -1
  307. package/dist/recall-timings.d.ts +1 -1
  308. package/dist/recall-xray-cli.d.ts +1 -1
  309. package/dist/recall-xray-renderer.d.ts +1 -1
  310. package/dist/recall-xray.d.ts +1 -1
  311. package/dist/reconcile/cursor.d.ts +1 -1
  312. package/dist/reconcile/manifest.d.ts +1 -1
  313. package/dist/reconcile/plan.d.ts +1 -1
  314. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  315. package/dist/replay/normalizers/claude.d.ts +1 -1
  316. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  317. package/dist/replay/normalizers/shared.d.ts +1 -1
  318. package/dist/replay/runner.d.ts +1 -1
  319. package/dist/replay/types.d.ts +1 -1
  320. package/dist/replica-divergence.d.ts +1 -1
  321. package/dist/replica-peers-config.d.ts +1 -1
  322. package/dist/resolve-auth-token.d.ts +1 -1
  323. package/dist/resume-bundles.js +4 -4
  324. package/dist/retrieval-agents.d.ts +2 -2
  325. package/dist/retrieval-tiers.d.ts +1 -1
  326. package/dist/routing/engine.d.ts +1 -1
  327. package/dist/routing/store.d.ts +1 -1
  328. package/dist/salvage-envelope.d.ts +1 -1
  329. package/dist/schemas.d.ts +24 -24
  330. package/dist/{scope-profiles-DFaojvoP.d.ts → scope-profiles-DqbxQXIS.d.ts} +1 -1
  331. package/dist/search/embed-helper.d.ts +1 -1
  332. package/dist/search/factory.d.ts +1 -1
  333. package/dist/search/factory.js +8 -8
  334. package/dist/search/index.d.ts +1 -1
  335. package/dist/search/index.js +12 -12
  336. package/dist/search/lancedb-backend.d.ts +1 -1
  337. package/dist/search/lancedb-backend.js +2 -2
  338. package/dist/search/meilisearch-backend.d.ts +1 -1
  339. package/dist/search/meilisearch-backend.js +2 -2
  340. package/dist/search/noop-backend.d.ts +1 -1
  341. package/dist/search/orama-backend.d.ts +1 -1
  342. package/dist/search/orama-backend.js +2 -2
  343. package/dist/search/port.d.ts +1 -1
  344. package/dist/search/remote-backend.d.ts +1 -1
  345. package/dist/{semantic-consolidation-BiX68wZA.d.ts → semantic-consolidation-DW3rEUoW.d.ts} +1 -1
  346. package/dist/semantic-consolidation.d.ts +2 -2
  347. package/dist/semantic-consolidation.js +17 -17
  348. package/dist/semantic-rule-promotion.js +16 -16
  349. package/dist/semantic-rule-verifier.d.ts +1 -1
  350. package/dist/semantic-rule-verifier.js +16 -16
  351. package/dist/{service-D5h2zZ0M.d.ts → service-B2vJU_Bx.d.ts} +2 -2
  352. package/dist/session-observer-bands.d.ts +1 -1
  353. package/dist/session-observer-state.d.ts +1 -1
  354. package/dist/shared-context/manager.d.ts +1 -1
  355. package/dist/signal.d.ts +1 -1
  356. package/dist/source-agent-qualifier.d.ts +1 -1
  357. package/dist/source-agent-qualifier.js +27 -27
  358. package/dist/standup/build.d.ts +9 -3
  359. package/dist/standup/build.js +99 -7
  360. package/dist/{storage-CtsaojWD.d.ts → storage-6fn7BPmb.d.ts} +1 -1
  361. package/dist/storage.d.ts +2 -2
  362. package/dist/storage.js +15 -15
  363. package/dist/subject-config.d.ts +1 -1
  364. package/dist/summarizer.d.ts +1 -1
  365. package/dist/summary-snapshot.d.ts +1 -1
  366. package/dist/support-passport/index.d.ts +14 -14
  367. package/dist/support-passport/index.js +44 -44
  368. package/dist/temporal-supersession.d.ts +2 -2
  369. package/dist/temporal-timeline-recall.d.ts +1 -1
  370. package/dist/temporal-validity.d.ts +1 -1
  371. package/dist/threading.d.ts +1 -1
  372. package/dist/tier-migration.d.ts +2 -2
  373. package/dist/tier-routing.d.ts +1 -1
  374. package/dist/topics.d.ts +1 -1
  375. package/dist/transcript.d.ts +1 -1
  376. package/dist/transfer/export-okf.d.ts +1 -1
  377. package/dist/transfer/export-okf.js +17 -17
  378. package/dist/trust-score-stage.d.ts +1 -1
  379. package/dist/trust-score.d.ts +1 -1
  380. package/dist/{types-CIpfYz1I.d.ts → types-eM7QIcX2.d.ts} +4 -0
  381. package/dist/types.d.ts +1 -1
  382. package/dist/utility-runtime.d.ts +1 -1
  383. package/dist/verified-recall.js +16 -16
  384. package/dist/who-knows-cli.d.ts +11 -11
  385. package/dist/who-knows-cli.js +17 -17
  386. package/dist/who-knows.d.ts +11 -11
  387. package/dist/who-knows.js +16 -16
  388. package/dist/write-envelope.d.ts +1 -1
  389. package/package.json +2 -2
  390. package/scripts/ensure-better-sqlite3.mjs +10 -0
  391. package/src/access-http.test.ts +41 -17
  392. package/src/access-http.ts +10 -10
  393. package/src/access-mcp-output-schemas.ts +1 -1
  394. package/src/access-mcp-sse.ts +50 -0
  395. package/src/activity/config.test.ts +1 -1
  396. package/src/activity/config.ts +20 -4
  397. package/src/activity/journal.test.ts +40 -0
  398. package/src/activity/timeline/index.ts +1 -0
  399. package/src/activity/timeline/recap-window.test.ts +129 -0
  400. package/src/activity/timeline/recap-window.ts +55 -0
  401. package/src/activity/types.ts +4 -0
  402. package/src/config.test.ts +1 -1
  403. package/src/dedup/index.ts +7 -0
  404. package/src/dedup/merge-decision.test.ts +157 -0
  405. package/src/dedup/merge-decision.ts +78 -0
  406. package/src/lcm/engine.ts +4 -1
  407. package/src/native-binding-hint.test.ts +38 -0
  408. package/src/native-binding-hint.ts +51 -0
  409. package/src/standup/build.test.ts +138 -12
  410. package/src/standup/build.ts +172 -23
  411. package/src/standup/http-glue.ts +1 -1
  412. package/dist/chunk-2W4MTU4P.js.map +0 -1
  413. package/dist/chunk-46XR5FNZ.js.map +0 -1
  414. package/dist/chunk-IGOINKTD.js.map +0 -1
  415. package/dist/chunk-PORKQEAW.js.map +0 -1
  416. package/dist/chunk-VOSWUO3K.js +0 -100
  417. package/dist/chunk-VOSWUO3K.js.map +0 -1
  418. package/dist/chunk-Z3YEGSR4.js.map +0 -1
  419. /package/dist/{chunk-52DBRDP5.js.map → chunk-23F7HGBV.js.map} +0 -0
  420. /package/dist/{chunk-TNXNECAN.js.map → chunk-2OXIPF3A.js.map} +0 -0
  421. /package/dist/{chunk-MSXUEYH6.js.map → chunk-3HHLOKKU.js.map} +0 -0
  422. /package/dist/{chunk-OMGQAXUK.js.map → chunk-47BX23NA.js.map} +0 -0
  423. /package/dist/{chunk-GO657WPH.js.map → chunk-52I6AHO6.js.map} +0 -0
  424. /package/dist/{chunk-QD55QEEY.js.map → chunk-5CSKIWEB.js.map} +0 -0
  425. /package/dist/{chunk-NMFPYAJ6.js.map → chunk-5GZ6UWY5.js.map} +0 -0
  426. /package/dist/{chunk-KSZKQTZS.js.map → chunk-5KVMT25I.js.map} +0 -0
  427. /package/dist/{chunk-D35XLYQ7.js.map → chunk-5NZIRM4Q.js.map} +0 -0
  428. /package/dist/{chunk-DB2MKBQ7.js.map → chunk-7JPKRZD5.js.map} +0 -0
  429. /package/dist/{chunk-PMNN247H.js.map → chunk-AAJK3PZ6.js.map} +0 -0
  430. /package/dist/{chunk-6FUMA6AA.js.map → chunk-B3TZLAO4.js.map} +0 -0
  431. /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
  432. /package/dist/{chunk-42GDJAU7.js.map → chunk-CIWOW2FH.js.map} +0 -0
  433. /package/dist/{chunk-GNWLTCKC.js.map → chunk-CNZVEU4X.js.map} +0 -0
  434. /package/dist/{chunk-CWPTYKCF.js.map → chunk-DGKVUPBM.js.map} +0 -0
  435. /package/dist/{chunk-XJE6NHLT.js.map → chunk-FNYVWAIK.js.map} +0 -0
  436. /package/dist/{chunk-THZ5UEQZ.js.map → chunk-FUPIAP6Q.js.map} +0 -0
  437. /package/dist/{chunk-POSD62F5.js.map → chunk-G3TUQJFU.js.map} +0 -0
  438. /package/dist/{chunk-Y3QQZOZ4.js.map → chunk-G775FE2E.js.map} +0 -0
  439. /package/dist/{chunk-BEUB5ABO.js.map → chunk-GB4R6B5M.js.map} +0 -0
  440. /package/dist/{chunk-XZBXINXZ.js.map → chunk-GIC6BASP.js.map} +0 -0
  441. /package/dist/{chunk-6TMIW4HE.js.map → chunk-HWWGPS2N.js.map} +0 -0
  442. /package/dist/{chunk-PPAKBRI7.js.map → chunk-IBHUZEKL.js.map} +0 -0
  443. /package/dist/{chunk-6LMRUFBH.js.map → chunk-J67E4JNT.js.map} +0 -0
  444. /package/dist/{chunk-FKBRP3J2.js.map → chunk-JHU543UU.js.map} +0 -0
  445. /package/dist/{chunk-OCYRMVPT.js.map → chunk-JVGBDNXA.js.map} +0 -0
  446. /package/dist/{chunk-GUG4LW4I.js.map → chunk-KIJCXLW7.js.map} +0 -0
  447. /package/dist/{chunk-IN6D6BJG.js.map → chunk-KVXMN33W.js.map} +0 -0
  448. /package/dist/{chunk-2C34EKRJ.js.map → chunk-MBDUNO7J.js.map} +0 -0
  449. /package/dist/{chunk-V6LJENGW.js.map → chunk-MFI4QPW5.js.map} +0 -0
  450. /package/dist/{chunk-4NKIGSJM.js.map → chunk-MK7EJLB4.js.map} +0 -0
  451. /package/dist/{chunk-RACZB5HT.js.map → chunk-N37X5RU7.js.map} +0 -0
  452. /package/dist/{chunk-AG46P24C.js.map → chunk-NNBZS3DY.js.map} +0 -0
  453. /package/dist/{chunk-J2GY4UCR.js.map → chunk-NSP3HFJZ.js.map} +0 -0
  454. /package/dist/{chunk-CEK6AHIG.js.map → chunk-OJSCH7QT.js.map} +0 -0
  455. /package/dist/{chunk-MAWHEUAA.js.map → chunk-OT7WQ2I3.js.map} +0 -0
  456. /package/dist/{chunk-ZW4SVXEY.js.map → chunk-Q3UMNZRK.js.map} +0 -0
  457. /package/dist/{chunk-HQI2OQB5.js.map → chunk-Q5YKVBIV.js.map} +0 -0
  458. /package/dist/{chunk-FHY6HIAY.js.map → chunk-QU2V4IO3.js.map} +0 -0
  459. /package/dist/{chunk-2SW3N5HX.js.map → chunk-RF3LMSQW.js.map} +0 -0
  460. /package/dist/{chunk-O7ERGZDA.js.map → chunk-RJ57OOCD.js.map} +0 -0
  461. /package/dist/{chunk-KDYU3KZT.js.map → chunk-RLEJULGN.js.map} +0 -0
  462. /package/dist/{chunk-7O24F2VS.js.map → chunk-SJ5L4ZZX.js.map} +0 -0
  463. /package/dist/{chunk-BWZVFWMX.js.map → chunk-SOQLXIQX.js.map} +0 -0
  464. /package/dist/{chunk-ZKE227GO.js.map → chunk-SRILZVR4.js.map} +0 -0
  465. /package/dist/{chunk-YV4ST46A.js.map → chunk-TKSBOV7N.js.map} +0 -0
  466. /package/dist/{chunk-67U6UK5Q.js.map → chunk-TWMGWLHD.js.map} +0 -0
  467. /package/dist/{chunk-726CXBJO.js.map → chunk-UAWSKMWQ.js.map} +0 -0
  468. /package/dist/{chunk-MGVOBLUK.js.map → chunk-VCYY7XEL.js.map} +0 -0
  469. /package/dist/{chunk-ABPLUXVY.js.map → chunk-VX5YHEGJ.js.map} +0 -0
  470. /package/dist/{chunk-SFJPCNBI.js.map → chunk-XVNDP3RO.js.map} +0 -0
  471. /package/dist/{chunk-QVEKPVCG.js.map → chunk-ZC5L6ME2.js.map} +0 -0
  472. /package/dist/{chunk-VVWOEKOZ.js.map → chunk-ZJGHOPEO.js.map} +0 -0
  473. /package/dist/{chunk-4COPICMD.js.map → chunk-ZVUGRXSY.js.map} +0 -0
  474. /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, previousDate } from "./build.js";
7
+ import { buildStandup, parseStandupDate, previousActiveDate } from "./build.js";
8
8
 
9
- test("parseStandupDate rejects garbage and defaults to UTC today", () => {
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
- assert.equal(previousDate("2026-08-18"), "2026-08-17");
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
- test("buildStandup is deterministic and marks missing days", async () => {
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-18.md"),
21
- "---\ndate: 2026-08-18\n---\n# Today\n- shipped standup\n- blocker: waiting on review\n",
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-18");
25
- const b = buildStandup(memoryDir, "2026-08-18");
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
- assert.equal(a.yesterday, "2026-08-17");
28
- assert.match(a.markdown, /blocker: waiting on review/);
29
- assert.match(a.activityGrid, /yesterday \| \./);
30
- assert.match(a.activityGrid, /today \| x/);
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
  }
@@ -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 || raw === "") {
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
- throw new Error(`invalid --date ${value}; expected YYYY-MM-DD`);
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
- export function previousDate(date: string): string {
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 - 86_400_000).toISOString().slice(0, 10);
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 = previousDate(date);
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(todayBody);
37
- const blockers = extractBlockers(todayBody);
38
- const activityGrid = renderGrid(yesterdayBody, todayBody);
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 body.split("\n").filter((line) => !line.startsWith("---")).slice(0, n).join("\n").trim() || "_Empty digest._";
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
- function renderGrid(yesterday: string | null, today: string | null): string {
101
- const y = yesterday ? "x" : ".";
102
- const t = today ? "x" : ".";
103
- return ["| day | digest |", "|---|---|", `| yesterday | ${y} |`, `| today | ${t} |`].join("\n");
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 plus an activity grid.
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
- }
@@ -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 ? { date } : {}) }, { service })) as { result: unknown };
13
+ const output = (await op.run({ ...(date === null ? {} : { date }) }, { service })) as { result: unknown };
14
14
  respondJson(res, 200, output.result);
15
15
  }