@remnic/core 9.63.12 → 9.64.1

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 (403) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -11
  2. package/dist/access-admin-ops-surface.js +15 -15
  3. package/dist/access-authorization-probe.d.ts +11 -11
  4. package/dist/access-authorization-probe.js +16 -16
  5. package/dist/access-boundary.d.ts +11 -11
  6. package/dist/access-boundary.js +15 -15
  7. package/dist/access-cli.js +49 -49
  8. package/dist/access-coding-context-resolution.d.ts +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +11 -11
  10. package/dist/access-extraction-force-flush.js +15 -15
  11. package/dist/access-health-types.d.ts +1 -1
  12. package/dist/access-http-lcm-compaction.d.ts +11 -11
  13. package/dist/access-http-lifecycle-flush.d.ts +11 -11
  14. package/dist/access-http-offline-stream.d.ts +11 -11
  15. package/dist/access-http-query.d.ts +2 -2
  16. package/dist/access-http-query.js +17 -17
  17. package/dist/access-http.d.ts +12 -12
  18. package/dist/access-http.js +26 -26
  19. package/dist/access-identity-continuity-surface.d.ts +9 -9
  20. package/dist/access-identity-continuity-surface.js +15 -15
  21. package/dist/access-lcm-surface.d.ts +11 -11
  22. package/dist/access-lcm-surface.js +15 -15
  23. package/dist/access-mcp.d.ts +11 -11
  24. package/dist/access-mcp.js +20 -20
  25. package/dist/access-memory-search-fanout.d.ts +2 -2
  26. package/dist/{access-namespace-preflight-CrF0FKaz.d.ts → access-namespace-preflight-Dj9uR4Cq.d.ts} +1 -1
  27. package/dist/access-namespace-preflight.d.ts +3 -3
  28. package/dist/access-namespace-preflight.js +15 -15
  29. package/dist/access-observe-write-surface.d.ts +11 -11
  30. package/dist/access-observe-write-surface.js +15 -15
  31. package/dist/access-offline-manifest.d.ts +9 -9
  32. package/dist/access-operations-batch.js +16 -16
  33. package/dist/access-operations.d.ts +11 -11
  34. package/dist/access-operations.js +19 -19
  35. package/dist/access-recall-concurrency.d.ts +11 -11
  36. package/dist/access-recall-concurrency.js +15 -15
  37. package/dist/access-recall-response.d.ts +11 -11
  38. package/dist/access-recall-response.js +15 -15
  39. package/dist/access-recall-surface.d.ts +11 -11
  40. package/dist/access-recall-surface.js +15 -15
  41. package/dist/{access-service-U6jiERic.d.ts → access-service-Bd0lzaHp.d.ts} +7 -7
  42. package/dist/access-service-helpers.d.ts +11 -11
  43. package/dist/access-service.d.ts +11 -11
  44. package/dist/access-service.js +15 -15
  45. package/dist/access-surface-catalog.d.ts +11 -11
  46. package/dist/access-surface-catalog.js +17 -17
  47. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  48. package/dist/action-confidence.d.ts +1 -1
  49. package/dist/active-memory-bridge.d.ts +1 -1
  50. package/dist/active-recall.d.ts +1 -1
  51. package/dist/active-recall.js +1 -1
  52. package/dist/ambient-provenance.d.ts +1 -1
  53. package/dist/artifact-search.d.ts +1 -1
  54. package/dist/behavior-learner.d.ts +1 -1
  55. package/dist/behavior-signals.d.ts +1 -1
  56. package/dist/bootstrap.d.ts +9 -9
  57. package/dist/briefing-window.d.ts +2 -2
  58. package/dist/briefing.d.ts +2 -2
  59. package/dist/briefing.js +3 -3
  60. package/dist/buffer-surprise-report.d.ts +1 -1
  61. package/dist/buffer-turn-helpers.d.ts +1 -1
  62. package/dist/buffer.d.ts +2 -2
  63. package/dist/buffer.js +2 -2
  64. package/dist/bulk-import/index.d.ts +3 -3
  65. package/dist/calibration.d.ts +1 -1
  66. package/dist/capabilities.d.ts +1 -1
  67. package/dist/{catalog-C0KIwZqR.d.ts → catalog-rKYbN7zF.d.ts} +1 -1
  68. package/dist/causal-behavior.d.ts +1 -1
  69. package/dist/causal-consolidation.d.ts +1 -1
  70. package/dist/causal-consolidation.js +4 -4
  71. package/dist/causal-trajectory-graph.d.ts +1 -1
  72. package/dist/{chunk-5SZ6CLGJ.js → chunk-2RZCOG63.js} +3 -2
  73. package/dist/{chunk-5SZ6CLGJ.js.map → chunk-2RZCOG63.js.map} +1 -1
  74. package/dist/{chunk-7DRSWPUV.js → chunk-3CYVTO6A.js} +3 -3
  75. package/dist/{chunk-LJQGQUNS.js → chunk-4FSCGYTQ.js} +2 -2
  76. package/dist/{chunk-HP6B732E.js → chunk-4KKVDOCD.js} +24 -24
  77. package/dist/{chunk-36XS2ASP.js → chunk-5Q5BEWJ3.js} +2 -2
  78. package/dist/{chunk-4XN35YQD.js → chunk-5TBO7CDR.js} +29 -1
  79. package/dist/chunk-5TBO7CDR.js.map +1 -0
  80. package/dist/{chunk-BYFKJXIR.js → chunk-6I6IOMKS.js} +2 -2
  81. package/dist/{chunk-YI25J2JD.js → chunk-7D3TTGHY.js} +22 -13
  82. package/dist/chunk-7D3TTGHY.js.map +1 -0
  83. package/dist/{chunk-4IIDTPSK.js → chunk-7X35RPN3.js} +2 -2
  84. package/dist/{chunk-FEP45MYY.js → chunk-AGC3Q53R.js} +2 -2
  85. package/dist/{chunk-ZWYXSF2T.js → chunk-AL43367I.js} +96 -4
  86. package/dist/chunk-AL43367I.js.map +1 -0
  87. package/dist/{chunk-WCWIV2JH.js → chunk-B2GICNOJ.js} +2 -2
  88. package/dist/{chunk-BTBAHTQ5.js → chunk-CI6YIT5S.js} +2 -2
  89. package/dist/{chunk-CUDSA46O.js → chunk-CUIAHZPZ.js} +2 -2
  90. package/dist/{chunk-BTUIHRRR.js → chunk-D267K4V5.js} +2 -2
  91. package/dist/{chunk-QICOU4RY.js → chunk-DLZBOEJY.js} +2 -2
  92. package/dist/{chunk-AR253JBM.js → chunk-DPPTG6VJ.js} +1 -1
  93. package/dist/chunk-DPPTG6VJ.js.map +1 -0
  94. package/dist/{chunk-BPLPGOUJ.js → chunk-DRS3OX77.js} +2 -2
  95. package/dist/{chunk-3F3CVVDS.js → chunk-DTQ3OB7O.js} +2 -2
  96. package/dist/{chunk-Z4UPRZR6.js → chunk-DZ2AVS2H.js} +2 -2
  97. package/dist/{chunk-YINSSARY.js → chunk-EAWJSY2Z.js} +1 -1
  98. package/dist/{chunk-NWHKHBL4.js → chunk-FMGTFMT3.js} +9 -9
  99. package/dist/{chunk-57WMVU4D.js → chunk-GSQDPL45.js} +3 -3
  100. package/dist/{chunk-UUYQWKHO.js → chunk-IHPYTG6F.js} +2 -2
  101. package/dist/{chunk-XREXYQ5U.js → chunk-IPUUMLSM.js} +21 -21
  102. package/dist/{chunk-SQ3EGGII.js → chunk-J3JEW5CT.js} +2 -2
  103. package/dist/{chunk-VCEE4YNA.js → chunk-JE3AKPOO.js} +2 -2
  104. package/dist/{chunk-IUSV4XJC.js → chunk-KOE3RLNN.js} +2 -2
  105. package/dist/{chunk-WQ6TRWAE.js → chunk-NMQXUGTU.js} +3 -3
  106. package/dist/{chunk-V2YH7T6T.js → chunk-OTVHRZZD.js} +2 -2
  107. package/dist/{chunk-77E7LLMV.js → chunk-OWAYQK5V.js} +8 -8
  108. package/dist/{chunk-YGSDWO3U.js → chunk-P4SD7BSA.js} +2 -2
  109. package/dist/{chunk-G5F4MXXC.js → chunk-Q3IRE6E4.js} +2 -2
  110. package/dist/{chunk-HZXO2CJ6.js → chunk-QHNO6AND.js} +2 -2
  111. package/dist/{chunk-5OOTHWGJ.js → chunk-RMB22Q3R.js} +2 -2
  112. package/dist/{chunk-BB2LH5JM.js → chunk-RNORDDD6.js} +11 -1
  113. package/dist/chunk-RNORDDD6.js.map +1 -0
  114. package/dist/{chunk-BS75WJBH.js → chunk-UIYYS2YI.js} +4 -4
  115. package/dist/{chunk-SYU5JOBQ.js → chunk-UWSETW6O.js} +2 -2
  116. package/dist/{chunk-CK3DZ6OE.js → chunk-VCNGVU62.js} +2 -2
  117. package/dist/{chunk-DIJCMHUE.js → chunk-VSKA2ATE.js} +2 -2
  118. package/dist/{chunk-PQODT53H.js → chunk-WDFXRHOZ.js} +3 -3
  119. package/dist/{chunk-6NMZXEJ7.js → chunk-WNO5W2TP.js} +2 -2
  120. package/dist/{chunk-RFFCBYBD.js → chunk-XBRGJJK7.js} +2 -2
  121. package/dist/{chunk-R5AWIILH.js → chunk-XFAWGUNX.js} +2 -2
  122. package/dist/{chunk-JASFZQ76.js → chunk-XSPRZZEX.js} +3 -3
  123. package/dist/{chunk-EHC3FIJ4.js → chunk-Y5ZIQFWH.js} +2 -2
  124. package/dist/{chunk-6IKXAAJI.js → chunk-YY63AMGP.js} +2 -2
  125. package/dist/{chunk-7ML7STOD.js → chunk-ZGGTIBWN.js} +2 -2
  126. package/dist/{chunk-X6HNXVXS.js → chunk-ZUIVJ3BB.js} +4 -4
  127. package/dist/{cli-BsaYHAH9.d.ts → cli-0dDmOsJ8.d.ts} +5 -5
  128. package/dist/cli.d.ts +13 -13
  129. package/dist/cli.js +39 -39
  130. package/dist/coding/pre-action-gate.d.ts +1 -1
  131. package/dist/compounding/engine.d.ts +2 -2
  132. package/dist/compounding/engine.js +3 -3
  133. package/dist/compounding/preference-consolidator.d.ts +1 -1
  134. package/dist/compression-optimizer.d.ts +1 -1
  135. package/dist/config.d.ts +1 -1
  136. package/dist/config.js +1 -1
  137. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  138. package/dist/connectors/codex-materialize-runner.js +3 -3
  139. package/dist/connectors/codex-materialize.d.ts +1 -1
  140. package/dist/connectors/index.d.ts +1 -1
  141. package/dist/connectors/index.js +4 -4
  142. package/dist/consolidation-provenance-check.d.ts +2 -2
  143. package/dist/consolidation-undo.d.ts +2 -2
  144. package/dist/contradiction/index.d.ts +2 -2
  145. package/dist/converge-config.d.ts +1 -1
  146. package/dist/convergence-refresh.d.ts +2 -2
  147. package/dist/convergence-refresh.js +5 -5
  148. package/dist/conversation-index/backend.d.ts +1 -1
  149. package/dist/conversation-index/chunker.d.ts +1 -1
  150. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  151. package/dist/conversation-index/indexer.d.ts +1 -1
  152. package/dist/conversation-index/search.d.ts +1 -1
  153. package/dist/corpus-watermark.d.ts +1 -1
  154. package/dist/corpus-watermark.js +5 -5
  155. package/dist/day-summary.d.ts +1 -1
  156. package/dist/delinearize.d.ts +1 -1
  157. package/dist/dependency-propagation-config.d.ts +1 -1
  158. package/dist/{dependency-propagation-delivery-Cph4PnBe.d.ts → dependency-propagation-delivery-Cr8u-XwC.d.ts} +1 -1
  159. package/dist/direct-answer-wiring.d.ts +1 -1
  160. package/dist/direct-answer.d.ts +1 -1
  161. package/dist/embedding-fallback.d.ts +1 -1
  162. package/dist/enrichment/index.d.ts +1 -1
  163. package/dist/entity-origin-fields.d.ts +1 -1
  164. package/dist/entity-retrieval.d.ts +2 -2
  165. package/dist/entity-retrieval.js +3 -3
  166. package/dist/entity-schema.d.ts +1 -1
  167. package/dist/episodic-context.d.ts +1 -1
  168. package/dist/explicit-capture.d.ts +9 -9
  169. package/dist/external-wiki-access.d.ts +11 -11
  170. package/dist/external-wiki-access.js +16 -16
  171. package/dist/external-wiki-collection-registration.d.ts +1 -1
  172. package/dist/external-wiki-collection.d.ts +1 -1
  173. package/dist/external-wiki-mcp-tools.d.ts +11 -11
  174. package/dist/extraction-error-classification.d.ts +1 -1
  175. package/dist/extraction-faithfulness.d.ts +1 -1
  176. package/dist/extraction-judge-telemetry.d.ts +1 -1
  177. package/dist/extraction-judge-training.d.ts +1 -1
  178. package/dist/extraction-judge.d.ts +1 -1
  179. package/dist/extraction-liveness.d.ts +1 -1
  180. package/dist/extraction-normalization.d.ts +1 -1
  181. package/dist/extraction-prompt.d.ts +1 -1
  182. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  183. package/dist/extraction-source-grounding.d.ts +1 -1
  184. package/dist/extraction.d.ts +1 -1
  185. package/dist/extraction.js +8 -8
  186. package/dist/fallback-llm.d.ts +1 -1
  187. package/dist/graph-dashboard-diff.d.ts +1 -1
  188. package/dist/graph-dashboard-key.d.ts +1 -1
  189. package/dist/graph-dashboard-parser.d.ts +1 -1
  190. package/dist/graph-edge-reinforcement.d.ts +1 -1
  191. package/dist/graph-path-reconstruction.d.ts +1 -1
  192. package/dist/graph-path-scoring.d.ts +1 -1
  193. package/dist/graph-snapshot.d.ts +1 -1
  194. package/dist/graph.d.ts +1 -1
  195. package/dist/harmonic-retrieval.js +1 -1
  196. package/dist/importance.d.ts +1 -1
  197. package/dist/importers/index.d.ts +1 -1
  198. package/dist/in-flight-reads.d.ts +1 -1
  199. package/dist/index.d.ts +21 -21
  200. package/dist/index.js +49 -49
  201. package/dist/intent.d.ts +1 -1
  202. package/dist/lcm/engine.d.ts +1 -1
  203. package/dist/lcm/index.d.ts +1 -1
  204. package/dist/lcm/tools.d.ts +1 -1
  205. package/dist/lifecycle.d.ts +1 -1
  206. package/dist/live-connectors-runner.d.ts +1 -1
  207. package/dist/local-llm.d.ts +1 -1
  208. package/dist/local-model-endpoint.d.ts +1 -1
  209. package/dist/maintenance/memory-governance.d.ts +1 -1
  210. package/dist/maintenance/memory-governance.js +3 -3
  211. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  212. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  213. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  214. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  215. package/dist/{maintenance-BNq31xpo.d.ts → maintenance-BpNjuZk4.d.ts} +3 -3
  216. package/dist/mcp-memory-inspector-app.d.ts +11 -11
  217. package/dist/memory-action-policy.d.ts +1 -1
  218. package/dist/memory-cache.d.ts +1 -1
  219. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  220. package/dist/memory-projection-store.d.ts +1 -1
  221. package/dist/memory-provenance.d.ts +1 -1
  222. package/dist/memory-snapshot.d.ts +1 -1
  223. package/dist/memory-worth-outcomes.d.ts +2 -2
  224. package/dist/models-json.d.ts +1 -1
  225. package/dist/namespaces/migrate.d.ts +3 -3
  226. package/dist/namespaces/migrate.js +4 -4
  227. package/dist/namespaces/principal.d.ts +1 -1
  228. package/dist/namespaces/search.d.ts +1 -1
  229. package/dist/namespaces/storage.d.ts +3 -3
  230. package/dist/namespaces/storage.js +3 -3
  231. package/dist/native-knowledge.d.ts +1 -1
  232. package/dist/offline-sync-impression-drain.d.ts +1 -1
  233. package/dist/operator-doctor-corpus.d.ts +1 -1
  234. package/dist/operator-doctor-corpus.js +6 -6
  235. package/dist/operator-doctor-replica.d.ts +1 -1
  236. package/dist/operator-toolkit.d.ts +3 -3
  237. package/dist/operator-toolkit.js +12 -12
  238. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  239. package/dist/orchestration/maintenance.d.ts +4 -4
  240. package/dist/orchestration/maintenance.js +9 -9
  241. package/dist/{orchestrator-CBuUOP2J.d.ts → orchestrator-B3ZQ8CTJ.d.ts} +8 -8
  242. package/dist/orchestrator.d.ts +9 -9
  243. package/dist/orchestrator.js +49 -49
  244. package/dist/patterns-cli.d.ts +1 -1
  245. package/dist/{pipeline-CW_Q4WvX.d.ts → pipeline-q5emoXD6.d.ts} +1 -1
  246. package/dist/policy-runtime.d.ts +1 -1
  247. package/dist/proactive-contention.d.ts +1 -1
  248. package/dist/provenance.d.ts +1 -1
  249. package/dist/{public-http-jMlmLny4.d.ts → public-http-CQN-i7Ai.d.ts} +1 -1
  250. package/dist/{qmd-q-cAzYuC.d.ts → qmd-YC6YGphs.d.ts} +1 -1
  251. package/dist/qmd-preflight.d.ts +2 -2
  252. package/dist/qmd-recall-cache.d.ts +1 -1
  253. package/dist/qmd.d.ts +2 -2
  254. package/dist/recall-concurrency-config.d.ts +1 -1
  255. package/dist/recall-disclosure-escalation.d.ts +1 -1
  256. package/dist/recall-explain-renderer.d.ts +1 -1
  257. package/dist/recall-explain-renderer.js +3 -3
  258. package/dist/recall-memory-map.d.ts +1 -1
  259. package/dist/recall-planner-llm.d.ts +1 -1
  260. package/dist/recall-state.d.ts +1 -1
  261. package/dist/recall-tag-filter.d.ts +1 -1
  262. package/dist/recall-timings.d.ts +1 -1
  263. package/dist/recall-xray-cli.d.ts +1 -1
  264. package/dist/recall-xray-cli.js +4 -4
  265. package/dist/recall-xray-renderer.d.ts +1 -1
  266. package/dist/recall-xray-renderer.js +3 -3
  267. package/dist/recall-xray.d.ts +1 -1
  268. package/dist/recall-xray.js +2 -2
  269. package/dist/reconcile/cursor.d.ts +1 -1
  270. package/dist/reconcile/manifest.d.ts +1 -1
  271. package/dist/reconcile/plan.d.ts +1 -1
  272. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  273. package/dist/replay/normalizers/claude.d.ts +1 -1
  274. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  275. package/dist/replay/normalizers/shared.d.ts +1 -1
  276. package/dist/replay/runner.d.ts +1 -1
  277. package/dist/replay/types.d.ts +1 -1
  278. package/dist/replica-divergence.d.ts +1 -1
  279. package/dist/replica-peers-config.d.ts +1 -1
  280. package/dist/resolve-auth-token.d.ts +1 -1
  281. package/dist/resume-bundles.js +2 -2
  282. package/dist/retrieval-agents.d.ts +2 -2
  283. package/dist/retrieval-tiers.d.ts +1 -1
  284. package/dist/routing/engine.d.ts +1 -1
  285. package/dist/routing/store.d.ts +1 -1
  286. package/dist/salvage-envelope.d.ts +1 -1
  287. package/dist/{scope-profiles-CIr4mXgp.d.ts → scope-profiles-De8F7YQ6.d.ts} +1 -1
  288. package/dist/search/embed-helper.d.ts +1 -1
  289. package/dist/search/factory.d.ts +1 -1
  290. package/dist/search/index.d.ts +1 -1
  291. package/dist/search/lancedb-backend.d.ts +1 -1
  292. package/dist/search/meilisearch-backend.d.ts +1 -1
  293. package/dist/search/noop-backend.d.ts +1 -1
  294. package/dist/search/orama-backend.d.ts +1 -1
  295. package/dist/search/port.d.ts +1 -1
  296. package/dist/search/remote-backend.d.ts +1 -1
  297. package/dist/{semantic-consolidation-BZ6J46j-.d.ts → semantic-consolidation-Bf-hm2LQ.d.ts} +1 -1
  298. package/dist/semantic-consolidation.d.ts +2 -2
  299. package/dist/semantic-consolidation.js +4 -4
  300. package/dist/semantic-rule-promotion.js +3 -3
  301. package/dist/semantic-rule-verifier.d.ts +1 -1
  302. package/dist/semantic-rule-verifier.js +3 -3
  303. package/dist/{service-CCl4iyyY.d.ts → service-D83osSRn.d.ts} +2 -2
  304. package/dist/session-observer-bands.d.ts +1 -1
  305. package/dist/session-observer-state.d.ts +1 -1
  306. package/dist/shared-context/manager.d.ts +1 -1
  307. package/dist/signal.d.ts +1 -1
  308. package/dist/source-agent-qualifier.d.ts +1 -1
  309. package/dist/source-agent-qualifier.js +7 -7
  310. package/dist/{storage-BPXmJKIt.d.ts → storage-BHWbpbhj.d.ts} +1 -1
  311. package/dist/storage.d.ts +2 -2
  312. package/dist/storage.js +2 -2
  313. package/dist/summarizer.d.ts +1 -1
  314. package/dist/summary-snapshot.d.ts +1 -1
  315. package/dist/support-passport/index.d.ts +14 -14
  316. package/dist/support-passport/index.js +18 -18
  317. package/dist/temporal-supersession.d.ts +2 -2
  318. package/dist/temporal-timeline-recall.d.ts +1 -1
  319. package/dist/temporal-validity.d.ts +1 -1
  320. package/dist/threading.d.ts +1 -1
  321. package/dist/tier-migration.d.ts +2 -2
  322. package/dist/tier-routing.d.ts +1 -1
  323. package/dist/topics.d.ts +1 -1
  324. package/dist/transcript.d.ts +1 -1
  325. package/dist/trust-score-stage.d.ts +1 -1
  326. package/dist/trust-score.d.ts +1 -1
  327. package/dist/{types-CltSWcND.d.ts → types-CpgsN-Gb.d.ts} +24 -3
  328. package/dist/types.d.ts +1 -1
  329. package/dist/types.js +1 -1
  330. package/dist/utility-runtime.d.ts +1 -1
  331. package/dist/verified-recall.js +3 -3
  332. package/dist/write-envelope.d.ts +1 -1
  333. package/package.json +2 -2
  334. package/src/config.ts +5 -6
  335. package/src/connectors/index.test.ts +24 -0
  336. package/src/connectors/index.ts +2 -0
  337. package/src/connectors/prime-agent.ts +38 -0
  338. package/src/location/cli.ts +163 -0
  339. package/src/location/config.test.ts +75 -0
  340. package/src/location/config.ts +105 -0
  341. package/src/location/intervals.test.ts +202 -0
  342. package/src/location/intervals.ts +221 -0
  343. package/src/location/parse-companions.ts +12 -0
  344. package/src/location/pipeline.test.ts +324 -0
  345. package/src/location/pipeline.ts +245 -0
  346. package/src/location/recall-exclusion.test.ts +36 -0
  347. package/src/location/registry.test.ts +74 -0
  348. package/src/location/registry.ts +54 -0
  349. package/src/location/store.test.ts +170 -0
  350. package/src/location/store.ts +478 -0
  351. package/src/location/types.ts +95 -0
  352. package/src/orchestration/generic-recall-paths.ts +17 -0
  353. package/src/orchestration/orchestrator-helpers.ts +22 -0
  354. package/src/orchestration/qmd-result-resolver.ts +1 -0
  355. package/src/types.ts +2 -3
  356. package/dist/chunk-4XN35YQD.js.map +0 -1
  357. package/dist/chunk-AR253JBM.js.map +0 -1
  358. package/dist/chunk-BB2LH5JM.js.map +0 -1
  359. package/dist/chunk-YI25J2JD.js.map +0 -1
  360. package/dist/chunk-ZWYXSF2T.js.map +0 -1
  361. /package/dist/{chunk-7DRSWPUV.js.map → chunk-3CYVTO6A.js.map} +0 -0
  362. /package/dist/{chunk-LJQGQUNS.js.map → chunk-4FSCGYTQ.js.map} +0 -0
  363. /package/dist/{chunk-HP6B732E.js.map → chunk-4KKVDOCD.js.map} +0 -0
  364. /package/dist/{chunk-36XS2ASP.js.map → chunk-5Q5BEWJ3.js.map} +0 -0
  365. /package/dist/{chunk-BYFKJXIR.js.map → chunk-6I6IOMKS.js.map} +0 -0
  366. /package/dist/{chunk-4IIDTPSK.js.map → chunk-7X35RPN3.js.map} +0 -0
  367. /package/dist/{chunk-FEP45MYY.js.map → chunk-AGC3Q53R.js.map} +0 -0
  368. /package/dist/{chunk-WCWIV2JH.js.map → chunk-B2GICNOJ.js.map} +0 -0
  369. /package/dist/{chunk-BTBAHTQ5.js.map → chunk-CI6YIT5S.js.map} +0 -0
  370. /package/dist/{chunk-CUDSA46O.js.map → chunk-CUIAHZPZ.js.map} +0 -0
  371. /package/dist/{chunk-BTUIHRRR.js.map → chunk-D267K4V5.js.map} +0 -0
  372. /package/dist/{chunk-QICOU4RY.js.map → chunk-DLZBOEJY.js.map} +0 -0
  373. /package/dist/{chunk-BPLPGOUJ.js.map → chunk-DRS3OX77.js.map} +0 -0
  374. /package/dist/{chunk-3F3CVVDS.js.map → chunk-DTQ3OB7O.js.map} +0 -0
  375. /package/dist/{chunk-Z4UPRZR6.js.map → chunk-DZ2AVS2H.js.map} +0 -0
  376. /package/dist/{chunk-YINSSARY.js.map → chunk-EAWJSY2Z.js.map} +0 -0
  377. /package/dist/{chunk-NWHKHBL4.js.map → chunk-FMGTFMT3.js.map} +0 -0
  378. /package/dist/{chunk-57WMVU4D.js.map → chunk-GSQDPL45.js.map} +0 -0
  379. /package/dist/{chunk-UUYQWKHO.js.map → chunk-IHPYTG6F.js.map} +0 -0
  380. /package/dist/{chunk-XREXYQ5U.js.map → chunk-IPUUMLSM.js.map} +0 -0
  381. /package/dist/{chunk-SQ3EGGII.js.map → chunk-J3JEW5CT.js.map} +0 -0
  382. /package/dist/{chunk-VCEE4YNA.js.map → chunk-JE3AKPOO.js.map} +0 -0
  383. /package/dist/{chunk-IUSV4XJC.js.map → chunk-KOE3RLNN.js.map} +0 -0
  384. /package/dist/{chunk-WQ6TRWAE.js.map → chunk-NMQXUGTU.js.map} +0 -0
  385. /package/dist/{chunk-V2YH7T6T.js.map → chunk-OTVHRZZD.js.map} +0 -0
  386. /package/dist/{chunk-77E7LLMV.js.map → chunk-OWAYQK5V.js.map} +0 -0
  387. /package/dist/{chunk-YGSDWO3U.js.map → chunk-P4SD7BSA.js.map} +0 -0
  388. /package/dist/{chunk-G5F4MXXC.js.map → chunk-Q3IRE6E4.js.map} +0 -0
  389. /package/dist/{chunk-HZXO2CJ6.js.map → chunk-QHNO6AND.js.map} +0 -0
  390. /package/dist/{chunk-5OOTHWGJ.js.map → chunk-RMB22Q3R.js.map} +0 -0
  391. /package/dist/{chunk-BS75WJBH.js.map → chunk-UIYYS2YI.js.map} +0 -0
  392. /package/dist/{chunk-SYU5JOBQ.js.map → chunk-UWSETW6O.js.map} +0 -0
  393. /package/dist/{chunk-CK3DZ6OE.js.map → chunk-VCNGVU62.js.map} +0 -0
  394. /package/dist/{chunk-DIJCMHUE.js.map → chunk-VSKA2ATE.js.map} +0 -0
  395. /package/dist/{chunk-PQODT53H.js.map → chunk-WDFXRHOZ.js.map} +0 -0
  396. /package/dist/{chunk-6NMZXEJ7.js.map → chunk-WNO5W2TP.js.map} +0 -0
  397. /package/dist/{chunk-RFFCBYBD.js.map → chunk-XBRGJJK7.js.map} +0 -0
  398. /package/dist/{chunk-R5AWIILH.js.map → chunk-XFAWGUNX.js.map} +0 -0
  399. /package/dist/{chunk-JASFZQ76.js.map → chunk-XSPRZZEX.js.map} +0 -0
  400. /package/dist/{chunk-EHC3FIJ4.js.map → chunk-Y5ZIQFWH.js.map} +0 -0
  401. /package/dist/{chunk-6IKXAAJI.js.map → chunk-YY63AMGP.js.map} +0 -0
  402. /package/dist/{chunk-7ML7STOD.js.map → chunk-ZGGTIBWN.js.map} +0 -0
  403. /package/dist/{chunk-X6HNXVXS.js.map → chunk-ZUIVJ3BB.js.map} +0 -0
@@ -569,6 +569,29 @@ interface MeetingRecord extends FusedMeeting {
569
569
  formatVersion: number;
570
570
  }
571
571
 
572
+ /** One configured location source: a registered provider plus its toggle. */
573
+ interface LocationSourceConfig {
574
+ /** Must match a registered provider id. */
575
+ id: string;
576
+ /** `false` short-circuits this source only. */
577
+ enabled: boolean;
578
+ }
579
+ /** Opt-in location synchronization settings. */
580
+ interface LocationConfig {
581
+ /** Master gate: `false` short-circuits every location path. */
582
+ enabled: boolean;
583
+ /** IANA timezone used to bucket observations into local days. */
584
+ timezone: string;
585
+ /** Number of local days to synchronize per run; integer 1..90. */
586
+ syncDays: number;
587
+ /**
588
+ * When `false` (the default), place coordinates are dropped before any
589
+ * persistence, rendering, or error reporting — only place labels remain.
590
+ */
591
+ retainCoordinates: boolean;
592
+ sources: LocationSourceConfig[];
593
+ }
594
+
572
595
  /**
573
596
  * Wearable transcript subsystem — shared types (issue: wearable connectors).
574
597
  *
@@ -2375,10 +2398,8 @@ interface PluginConfig extends BoundedJsonlStateConfig, SecurityConfig {
2375
2398
  */
2376
2399
  wearables: WearablesConfig;
2377
2400
  activity: ActivityConfig;
2378
- /** Retrospective meeting intelligence (issue #1900): detect + fuse meetings
2379
- * from already-ingested audio + screen activity. Disabled by default.
2380
- */
2381
2401
  meetings: MeetingsConfig;
2402
+ location: LocationConfig;
2382
2403
  /**
2383
2404
  * At-rest encryption configuration (issue #690 PR 3/4).
2384
2405
  *
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { bb as AccessTrackingEntry, a1 as ActiveRecallChatType, a5 as ActiveRecallModelFallbackPolicy, a3 as ActiveRecallPromptStyle, a2 as ActiveRecallQueryMode, a4 as ActiveRecallThinking, w as AgentAccessAuthToken, ct as AgentAccessHttpConfig, cu as AgentDefaultsConfig, cv as AgentPersona, A as AgentPersonaModelConfig, cw as BehaviorLoopAdjustment, t as BehaviorLoopPolicyState, cx as BehaviorSignalDirection, a7 as BehaviorSignalEvent, cy as BehaviorSignalType, bf as BootstrapOptions, bg as BootstrapResult, g as BriefingActiveThread, cz as BriefingCalendarSourceError, bB as BriefingConfig, d as BriefingFocus, c as BriefingFollowup, i as BriefingOpenCommitment, j as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, bC as BriefingWindow, cA as BufferEntryState, b7 as BufferState, a8 as BufferSurpriseEvent, k as BufferTurn, f as CalendarEvent, e as CalendarSource, y as CaptureMode, cB as ChatConfig, n as Checkpoint, cC as CodexCliReasoningEffort, cD as CodexCompactionFlushMode, bF as CodexCompatConfig, cE as CodexConnectorConfig, C as CodingContext, cF as CodingGraphLspConfig, bo as CodingKnowledgeConfig, bi as CodingModeConfig, cG as CompressionGuidelineActivationState, ae as CompressionGuidelineOptimizerActionSummary, ad as CompressionGuidelineOptimizerEventCounts, af as CompressionGuidelineOptimizerRuleUpdate, cH as CompressionGuidelineOptimizerSourceWindow, ai as CompressionGuidelineOptimizerState, cI as ConfidenceTier, cJ as ConsolidationAction, cK as ConsolidationItem, bh as ConsolidationObservation, aF as ConsolidationResult, aj as ConvergeConfig, a0 as ConvergeConflictPolicy, U as ConversationThread, cL as CronConversationRecallMode, cM as CronRecallMode, bG as DEFAULT_RECALL_DISCLOSURE, aG as DaySummaryResult, al as DependencyPropagationConfig, cN as DreamingConfig, cO as DreamingNarrativePromptStyle, cP as DreamsDeepSleepConfig, cQ as DreamsLightSleepConfig, D as DreamsPhase, cR as DreamsPhaseStatus, cS as DreamsPhasesConfig, cT as DreamsRemConfig, a as DreamsRunResult, bd as DreamsStatusResult, cU as EngramTraceEvent, ba as EntityActivityEntry, E as EntityFile, ak as EntityMention, b9 as EntityRelationship, an as EntitySchemaDefinition, ao as EntitySchemaSectionDefinition, am as EntityStructuredSection, b5 as EntityTimelineEntry, ap as ExtractedFact, cV as ExtractedProcedureStep, cW as ExtractedQuestion, cX as ExtractedReasoningTrace, cY as ExtractedReasoningTraceStep, cZ as ExtractedRelationship, _ as ExtractionFailureClass, c_ as ExtractionPassSource, a6 as ExtractionResult, F as FaithfulnessFrontmatter, b8 as FileHygieneConfig, G as GatewayConfig, c$ as GitHubLiveConnectorConfig, d0 as GmailLiveConnectorConfig, d1 as GoogleDriveLiveConnectorConfig, d2 as HeartbeatConfig, d3 as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, $ as ImportanceLevel, ar as ImportanceScore, V as LifecycleState, L as LiveConnectorsConfig, d4 as LlmTraceCallback, d5 as LlmTraceEvent, at as MemoryActionEligibilityContext, bQ as MemoryActionEligibilitySource, ah as MemoryActionEvent, d6 as MemoryActionOutcome, d7 as MemoryActionPolicyDecision, au as MemoryActionPolicyResult, d8 as MemoryActionStatus, ag as MemoryActionType, x as MemoryCategory, M as MemoryFile, m as MemoryFrontmatter, as as MemoryIntent, K as MemoryLifecycleEvent, av as MemoryLifecycleEventType, aw as MemoryLifecycleStateSummary, b6 as MemoryLink, d9 as MemoryLinkType, bR as MemoryObservation, da as MemoryOsPresetName, J as MemoryProjectionCurrentState, bS as MemoryScope, z as MemoryStatus, bc as MemorySummary, aA as MetaState, db as ModelApi, dc as ModelDefinitionConfig, dd as ModelProviderAuthMode, ax as ModelProviderConfig, de as NamespacePolicy, ay as NativeKnowledgeConfig, df as NativeKnowledgeFolderRuleConfig, dg as NativeKnowledgeObsidianVaultConfig, dh as NativeKnowledgeOpenClawWorkspaceConfig, di as NotionLiveConnectorConfig, P as PluginConfig, X as PolicyClass, dj as PrincipalFromSessionKeyMode, dk as PrincipalRule, dl as ProceduralConfig, aq as ProvenanceConfig, N as ProvenanceSource, aH as QmdSearchExplain, Q as QmdSearchResult, dm as QuestionEntry, bT as RECALL_DISCLOSURE_LEVELS, dn as ReasoningEffort, o as RecallDisclosure, dp as RecallPipelineConfig, R as RecallPlanMode, be as RecallSectionConfig, b as RecallTierExplain, dq as RecallTraceEvent, dr as RelevanceFeedback, aC as RetrievalTier, ds as SPECULATIVE_TTL_DAYS, dt as ScopeProfileAutoPromoteConfig, q as ScopeProfileConfig, r as ScopeProfileLayerId, s as ScopeProfilePromotionTarget, du as ScopeProfileTeamProjectConfig, dv as ScopeTeamConfig, dw as ScoredEntity, v as SecretRef, dx as SemanticChunkingConfigShape, S as SessionObserverBandConfig, dy as SignalLevel, aD as SignalScanResult, dz as SlotBehaviorConfig, dA as SlotMismatchMode, p as SourceConnectorProvenance, c2 as SupportPassportConfig, aE as TopicScore, T as TranscriptEntry, dB as TriggerMode, O as TrustWeights, W as VerificationState, dC as confidenceTier, b$ as isRecallDisclosure } from './types-CltSWcND.js';
1
+ export { bb as AccessTrackingEntry, a1 as ActiveRecallChatType, a5 as ActiveRecallModelFallbackPolicy, a3 as ActiveRecallPromptStyle, a2 as ActiveRecallQueryMode, a4 as ActiveRecallThinking, w as AgentAccessAuthToken, ct as AgentAccessHttpConfig, cu as AgentDefaultsConfig, cv as AgentPersona, A as AgentPersonaModelConfig, cw as BehaviorLoopAdjustment, t as BehaviorLoopPolicyState, cx as BehaviorSignalDirection, a7 as BehaviorSignalEvent, cy as BehaviorSignalType, bf as BootstrapOptions, bg as BootstrapResult, g as BriefingActiveThread, cz as BriefingCalendarSourceError, bB as BriefingConfig, d as BriefingFocus, c as BriefingFollowup, i as BriefingOpenCommitment, j as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, bC as BriefingWindow, cA as BufferEntryState, b7 as BufferState, a8 as BufferSurpriseEvent, k as BufferTurn, f as CalendarEvent, e as CalendarSource, y as CaptureMode, cB as ChatConfig, n as Checkpoint, cC as CodexCliReasoningEffort, cD as CodexCompactionFlushMode, bF as CodexCompatConfig, cE as CodexConnectorConfig, C as CodingContext, cF as CodingGraphLspConfig, bo as CodingKnowledgeConfig, bi as CodingModeConfig, cG as CompressionGuidelineActivationState, ae as CompressionGuidelineOptimizerActionSummary, ad as CompressionGuidelineOptimizerEventCounts, af as CompressionGuidelineOptimizerRuleUpdate, cH as CompressionGuidelineOptimizerSourceWindow, ai as CompressionGuidelineOptimizerState, cI as ConfidenceTier, cJ as ConsolidationAction, cK as ConsolidationItem, bh as ConsolidationObservation, aF as ConsolidationResult, aj as ConvergeConfig, a0 as ConvergeConflictPolicy, U as ConversationThread, cL as CronConversationRecallMode, cM as CronRecallMode, bG as DEFAULT_RECALL_DISCLOSURE, aG as DaySummaryResult, al as DependencyPropagationConfig, cN as DreamingConfig, cO as DreamingNarrativePromptStyle, cP as DreamsDeepSleepConfig, cQ as DreamsLightSleepConfig, D as DreamsPhase, cR as DreamsPhaseStatus, cS as DreamsPhasesConfig, cT as DreamsRemConfig, a as DreamsRunResult, bd as DreamsStatusResult, cU as EngramTraceEvent, ba as EntityActivityEntry, E as EntityFile, ak as EntityMention, b9 as EntityRelationship, an as EntitySchemaDefinition, ao as EntitySchemaSectionDefinition, am as EntityStructuredSection, b5 as EntityTimelineEntry, ap as ExtractedFact, cV as ExtractedProcedureStep, cW as ExtractedQuestion, cX as ExtractedReasoningTrace, cY as ExtractedReasoningTraceStep, cZ as ExtractedRelationship, _ as ExtractionFailureClass, c_ as ExtractionPassSource, a6 as ExtractionResult, F as FaithfulnessFrontmatter, b8 as FileHygieneConfig, G as GatewayConfig, c$ as GitHubLiveConnectorConfig, d0 as GmailLiveConnectorConfig, d1 as GoogleDriveLiveConnectorConfig, d2 as HeartbeatConfig, d3 as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, $ as ImportanceLevel, ar as ImportanceScore, V as LifecycleState, L as LiveConnectorsConfig, d4 as LlmTraceCallback, d5 as LlmTraceEvent, at as MemoryActionEligibilityContext, bQ as MemoryActionEligibilitySource, ah as MemoryActionEvent, d6 as MemoryActionOutcome, d7 as MemoryActionPolicyDecision, au as MemoryActionPolicyResult, d8 as MemoryActionStatus, ag as MemoryActionType, x as MemoryCategory, M as MemoryFile, m as MemoryFrontmatter, as as MemoryIntent, K as MemoryLifecycleEvent, av as MemoryLifecycleEventType, aw as MemoryLifecycleStateSummary, b6 as MemoryLink, d9 as MemoryLinkType, bR as MemoryObservation, da as MemoryOsPresetName, J as MemoryProjectionCurrentState, bS as MemoryScope, z as MemoryStatus, bc as MemorySummary, aA as MetaState, db as ModelApi, dc as ModelDefinitionConfig, dd as ModelProviderAuthMode, ax as ModelProviderConfig, de as NamespacePolicy, ay as NativeKnowledgeConfig, df as NativeKnowledgeFolderRuleConfig, dg as NativeKnowledgeObsidianVaultConfig, dh as NativeKnowledgeOpenClawWorkspaceConfig, di as NotionLiveConnectorConfig, P as PluginConfig, X as PolicyClass, dj as PrincipalFromSessionKeyMode, dk as PrincipalRule, dl as ProceduralConfig, aq as ProvenanceConfig, N as ProvenanceSource, aH as QmdSearchExplain, Q as QmdSearchResult, dm as QuestionEntry, bT as RECALL_DISCLOSURE_LEVELS, dn as ReasoningEffort, o as RecallDisclosure, dp as RecallPipelineConfig, R as RecallPlanMode, be as RecallSectionConfig, b as RecallTierExplain, dq as RecallTraceEvent, dr as RelevanceFeedback, aC as RetrievalTier, ds as SPECULATIVE_TTL_DAYS, dt as ScopeProfileAutoPromoteConfig, q as ScopeProfileConfig, r as ScopeProfileLayerId, s as ScopeProfilePromotionTarget, du as ScopeProfileTeamProjectConfig, dv as ScopeTeamConfig, dw as ScoredEntity, v as SecretRef, dx as SemanticChunkingConfigShape, S as SessionObserverBandConfig, dy as SignalLevel, aD as SignalScanResult, dz as SlotBehaviorConfig, dA as SlotMismatchMode, p as SourceConnectorProvenance, c2 as SupportPassportConfig, aE as TopicScore, T as TranscriptEntry, dB as TriggerMode, O as TrustWeights, W as VerificationState, dC as confidenceTier, b$ as isRecallDisclosure } from './types-CpgsN-Gb.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  import './external-wiki-config.js';
package/dist/types.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  SPECULATIVE_TTL_DAYS,
5
5
  confidenceTier,
6
6
  isRecallDisclosure
7
- } from "./chunk-AR253JBM.js";
7
+ } from "./chunk-DPPTG6VJ.js";
8
8
  import "./chunk-PZ5AY32C.js";
9
9
  export {
10
10
  DEFAULT_RECALL_DISCLOSURE,
@@ -1,6 +1,6 @@
1
1
  import { TierRoutingPolicy } from './tier-routing.js';
2
2
  import './lifecycle.js';
3
- import './types-CltSWcND.js';
3
+ import './types-CpgsN-Gb.js';
4
4
  import './message-parts/index.js';
5
5
  import './bounded-jsonl-state.js';
6
6
  import './operator-doctor-types.js';
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-BTBAHTQ5.js";
4
+ } from "./chunk-CI6YIT5S.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-5SZ6CLGJ.js";
6
+ import "./chunk-2RZCOG63.js";
7
7
  import "./chunk-UHVXE24Y.js";
8
8
  import "./chunk-46WM6JX2.js";
9
9
  import "./chunk-SXIMQLGV.js";
@@ -22,7 +22,7 @@ import "./chunk-ET356KSB.js";
22
22
  import "./chunk-72A4L5JJ.js";
23
23
  import "./chunk-A7Q43EUZ.js";
24
24
  import "./chunk-S2V7RUCL.js";
25
- import "./chunk-AR253JBM.js";
25
+ import "./chunk-DPPTG6VJ.js";
26
26
  import "./chunk-SCU65EZI.js";
27
27
  import "./chunk-PO7NXBG2.js";
28
28
  import "./chunk-S2HLHAZ4.js";
@@ -1,4 +1,4 @@
1
- import { x as MemoryCategory } from './types-CltSWcND.js';
1
+ import { x as MemoryCategory } from './types-CpgsN-Gb.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  import './operator-doctor-types.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.63.12",
3
+ "version": "9.64.1",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3156,7 +3156,7 @@
3156
3156
  "core"
3157
3157
  ],
3158
3158
  "peerDependencies": {
3159
- "@remnic/coding-graph": "^9.63.12"
3159
+ "@remnic/coding-graph": "^9.64.1"
3160
3160
  },
3161
3161
  "peerDependenciesMeta": {
3162
3162
  "@remnic/coding-graph": {
package/src/config.ts CHANGED
@@ -61,9 +61,8 @@ import {
61
61
  resolveNamespaceCatalogEnabled,
62
62
  } from "./emit-legacy-tools.js";
63
63
  import { parseWearablesConfig } from "./wearables/config.js";
64
- import { parseMeetingsConfig } from "./meetings/config.js";
65
- import { parseActivityConfig } from "./activity/config.js";
66
- import { parseProvenanceConfig } from "./provenance.js";
64
+ import { parseCaptureCompanionConfigs } from "./location/parse-companions.js";
65
+ import { parseLocationConfig } from "./location/config.js";
67
66
  import { parseBoundedJsonlStateConfig } from "./bounded-jsonl-state.js";
68
67
  import { parseCodingKnowledgeConfig } from "./coding/coding-knowledge-config.js";
69
68
  import { parseChatConfig } from "./chat/chat-config.js";
@@ -1159,9 +1158,8 @@ export function parseConfig(
1159
1158
  recallMaxProcedures,
1160
1159
  };
1161
1160
  const wearables = parseWearablesConfig(cfg.wearables);
1162
- const activity = parseActivityConfig(cfg.activity);
1163
- const meetings = parseMeetingsConfig(cfg.meetings);
1164
- const provenance = parseProvenanceConfig(cfg.provenance);
1161
+ const { activity, meetings, provenance } = parseCaptureCompanionConfigs(cfg);
1162
+ const location = parseLocationConfig(cfg.location);
1165
1163
  // Coding-agent project/branch scoping (issue #569)
1166
1164
  const rawCodingMode =
1167
1165
  cfg.codingMode && typeof cfg.codingMode === "object" && !Array.isArray(cfg.codingMode)
@@ -2323,6 +2321,7 @@ export function parseConfig(
2323
2321
  wearables,
2324
2322
  meetings,
2325
2323
  activity,
2324
+ location,
2326
2325
  provenance,
2327
2326
  // At-rest encryption (#690): coerceBool handles CLI string "true" (#36).
2328
2327
  secureStoreEnabled: coerceBool(cfg.secureStoreEnabled) === true,
@@ -174,6 +174,30 @@ test("BUILTIN catalog includes the omp (oh-my-pi) connector", async (t) => {
174
174
  );
175
175
  });
176
176
 
177
+ test("BUILTIN catalog includes the prime-agent connector", async (t) => {
178
+ const sandbox = makeSandbox(t);
179
+
180
+ await withEnv(
181
+ {
182
+ HOME: sandbox.home,
183
+ USERPROFILE: sandbox.home,
184
+ XDG_CONFIG_HOME: sandbox.xdgConfigHome,
185
+ },
186
+ () => {
187
+ const registry = loadRegistry();
188
+ const primeAgent = registry.connectors.find((connector) => connector.id === "prime-agent");
189
+
190
+ assert.ok(primeAgent, "prime-agent connector should be present in the built-in catalog");
191
+ assert.equal(primeAgent?.requiresToken, true);
192
+ assert.equal(primeAgent?.capabilities?.connectionType, "http");
193
+ assert.ok(
194
+ (primeAgent?.tags ?? []).includes("official"),
195
+ "prime-agent should be tagged official",
196
+ );
197
+ },
198
+ );
199
+ });
200
+
177
201
  test("loadRegistry filters custom connectors with invalid IDs", async (t) => {
178
202
  const sandbox = makeSandbox(t);
179
203
 
@@ -38,6 +38,7 @@ import {
38
38
  droidMcpDoctorCheck as droidMcpDoctorCheckImpl,
39
39
  readDroidMcpProvenance,
40
40
  } from "./droid-mcp.js";
41
+ import { PRIME_AGENT_CONNECTOR_MANIFEST } from "./prime-agent.js";
41
42
 
42
43
  // Native memory artifact materialization for Codex CLI (#378). Surfaced here
43
44
  // so downstream callers can `import { materializeForNamespace } from "@remnic/core/connectors"`.
@@ -464,6 +465,7 @@ export const BUILTIN_CONNECTORS: ConnectorManifest[] = [
464
465
  tags: ["official", "ai", "omp", "pi", "coding-agent"],
465
466
  requiresToken: true,
466
467
  },
468
+ PRIME_AGENT_CONNECTOR_MANIFEST,
467
469
  {
468
470
  id: "replit",
469
471
  name: "Replit Agent",
@@ -0,0 +1,38 @@
1
+ import type { ConnectorManifest } from "./index.js";
2
+
3
+ /**
4
+ * Builtin manifest for the Prime Agent connector (#2313). Prime Agent is a
5
+ * Pi-fork coding agent; the runtime extension is `@remnic/plugin-pi`, published
6
+ * to `~/.prime/agent/extensions/remnic` (override: `PRIME_AGENT_CODING_AGENT_DIR`)
7
+ * by `PrimeAgentMemoryExtensionPublisher` in the plugin-pi package.
8
+ *
9
+ * Declared in this sibling module — not inline in index.ts — so the connector
10
+ * catalog addition does not grow index.ts past its file-size ratchet ceiling
11
+ * (same pattern as `DROID_CONNECTOR_MANIFEST` in droid-mcp.ts).
12
+ */
13
+ export const PRIME_AGENT_CONNECTOR_MANIFEST: ConnectorManifest = {
14
+ id: "prime-agent",
15
+ name: "Prime Agent",
16
+ version: "1.0.0",
17
+ description:
18
+ "Prime Agent — Pi-fork coding agent; native extension for recall, observe, MCP tools, and compaction coordination",
19
+ capabilities: {
20
+ observe: true,
21
+ recall: true,
22
+ store: true,
23
+ search: true,
24
+ entities: true,
25
+ realtimeSync: true,
26
+ batch: true,
27
+ maxBudgetChars: 32000,
28
+ connectionType: "http",
29
+ },
30
+ configSchema: {
31
+ remnicDaemonUrl: "URL of the Remnic daemon (default: http://127.0.0.1:4318)",
32
+ namespace: "Optional namespace",
33
+ installExtension: "Install the Prime Agent extension into ~/.prime/agent/extensions/remnic (default: true)",
34
+ },
35
+ author: "Remnic",
36
+ tags: ["official", "ai", "prime-agent", "pi", "coding-agent"],
37
+ requiresToken: true,
38
+ };
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Location surface helpers (issue #2044): status, provider health checks, and
3
+ * multi-day sync. Pure `@remnic/core` — no optional packages, no host CLI
4
+ * wiring; a host adapter (or the core CLI, in a later slice) renders these
5
+ * structured results into its own command surface.
6
+ */
7
+
8
+ import { getLocationProvider } from "./registry.js";
9
+ import { isValidLocationDate, localDayKey } from "./intervals.js";
10
+ import { listLocationDayDates, loadLocationSyncState, parseLocationDaySummary, readLocationDay } from "./store.js";
11
+ import { syncLocationDay, type LocationDaySyncOptions, type LocationSourceSyncResult } from "./pipeline.js";
12
+ import type { LocationConfig, LocationProvider } from "./types.js";
13
+
14
+ export interface LocationSourceStatus {
15
+ id: string;
16
+ enabled: boolean;
17
+ providerRegistered: boolean;
18
+ lastSyncedAtUtc?: string;
19
+ trackedDays: number;
20
+ }
21
+
22
+ export interface LocationDayStatus {
23
+ date: string;
24
+ sources: string[];
25
+ observationCount: number;
26
+ }
27
+
28
+ export interface LocationStatusReport {
29
+ enabled: boolean;
30
+ timezone: string;
31
+ sources: LocationSourceStatus[];
32
+ /** Stored day documents, newest first (at most `maxDays`). */
33
+ recentDays: LocationDayStatus[];
34
+ }
35
+
36
+ export interface LocationStatusOptions {
37
+ /** Provider lookup seam (defaults to the registry); tests inject doubles. */
38
+ getProvider?: (id: string) => LocationProvider | undefined;
39
+ /** Cap on day documents listed; defaults to 7. */
40
+ maxDays?: number;
41
+ now?: () => Date;
42
+ }
43
+
44
+ export async function locationStatus(
45
+ config: LocationConfig,
46
+ memoryDir: string,
47
+ options: LocationStatusOptions = {},
48
+ ): Promise<LocationStatusReport> {
49
+ const resolveProvider = options.getProvider ?? getLocationProvider;
50
+ const state = await loadLocationSyncState(memoryDir);
51
+ const sources: LocationSourceStatus[] = config.sources.map((source) => {
52
+ const sourceState = state.sources[source.id];
53
+ return {
54
+ id: source.id,
55
+ enabled: source.enabled,
56
+ providerRegistered: resolveProvider(source.id) !== undefined,
57
+ ...(sourceState?.lastSyncedAtUtc === undefined ? {} : { lastSyncedAtUtc: sourceState.lastSyncedAtUtc }),
58
+ trackedDays: Object.keys(sourceState?.days ?? {}).length,
59
+ };
60
+ });
61
+
62
+ const maxDays = options.maxDays ?? 7;
63
+ const recentDays: LocationDayStatus[] = [];
64
+ for (const date of (await listLocationDayDates(memoryDir)).slice(0, Math.max(0, maxDays))) {
65
+ const raw = await readLocationDay(memoryDir, date);
66
+ const summary = raw === null ? null : parseLocationDaySummary(raw);
67
+ recentDays.push({
68
+ date,
69
+ sources: summary?.sources ?? [],
70
+ observationCount: summary?.observationCount ?? 0,
71
+ });
72
+ }
73
+ return { enabled: config.enabled, timezone: config.timezone, sources, recentDays };
74
+ }
75
+
76
+ export interface LocationSourceCheckResult {
77
+ id: string;
78
+ ok: boolean;
79
+ detail?: string;
80
+ skipped?: "location-disabled" | "source-disabled" | "provider-not-registered";
81
+ }
82
+
83
+ export interface LocationCheckOptions {
84
+ signal?: AbortSignal;
85
+ getProvider?: (id: string) => LocationProvider | undefined;
86
+ }
87
+
88
+ /** Probe every configured provider's health. The master gate short-circuits. */
89
+ export async function checkLocationSources(
90
+ config: LocationConfig,
91
+ options: LocationCheckOptions = {},
92
+ ): Promise<LocationSourceCheckResult[]> {
93
+ if (!config.enabled) {
94
+ return config.sources.map((source) => ({ id: source.id, ok: false, skipped: "location-disabled" as const }));
95
+ }
96
+ const resolveProvider = options.getProvider ?? getLocationProvider;
97
+ const results: LocationSourceCheckResult[] = [];
98
+ for (const source of config.sources) {
99
+ if (!source.enabled) {
100
+ results.push({ id: source.id, ok: false, skipped: "source-disabled" });
101
+ continue;
102
+ }
103
+ const provider = resolveProvider(source.id);
104
+ if (provider === undefined) {
105
+ results.push({ id: source.id, ok: false, skipped: "provider-not-registered" });
106
+ continue;
107
+ }
108
+ try {
109
+ const check = await provider.verify(options.signal);
110
+ results.push({
111
+ id: source.id,
112
+ ok: check.ok,
113
+ ...(check.detail === undefined || check.detail.length === 0 ? {} : { detail: check.detail }),
114
+ });
115
+ } catch (error) {
116
+ results.push({ id: source.id, ok: false, detail: error instanceof Error ? error.name : "provider error" });
117
+ }
118
+ }
119
+ return results;
120
+ }
121
+
122
+ function shiftIsoDate(date: string, days: number): string {
123
+ const parsed = new Date(`${date}T00:00:00Z`);
124
+ parsed.setUTCDate(parsed.getUTCDate() + days);
125
+ return parsed.toISOString().slice(0, 10);
126
+ }
127
+
128
+ export interface LocationSyncRunOptions
129
+ extends Omit<LocationDaySyncOptions, "config" | "date" | "memoryDir"> {
130
+ config: LocationConfig;
131
+ memoryDir: string;
132
+ /** Exclusive end date (local YYYY-MM-DD); defaults to today in config.timezone. */
133
+ endDate?: string;
134
+ /** Number of days to sync ending at endDate; defaults to config.syncDays. */
135
+ days?: number;
136
+ now?: () => Date;
137
+ }
138
+ /**
139
+ * Sync the trailing `days` local days ending AT `endDate` (inclusive).
140
+ * `endDate` defaults to yesterday in config.timezone (today is incomplete);
141
+ * days run oldest-first so a failure stops before newer days, matching the
142
+ * incremental-sync intent of `syncDays`.
143
+ */
144
+ export async function syncLocation(
145
+ options: LocationSyncRunOptions,
146
+ ): Promise<Array<{ date: string; results: LocationSourceSyncResult[] }>> {
147
+ const { config, memoryDir, endDate, days, ...rest } = options;
148
+ if (endDate !== undefined && !isValidLocationDate(endDate)) {
149
+ throw new RangeError(`Invalid location endDate "${endDate}"; expected a real YYYY-MM-DD day.`);
150
+ }
151
+ const now = rest.now ?? (() => new Date());
152
+ const end = endDate ?? shiftIsoDate(localDayKey(now().toISOString(), config.timezone), -1);
153
+ const count = days ?? config.syncDays;
154
+ if (!Number.isInteger(count) || count < 1 || count > 90) {
155
+ throw new RangeError("location sync days must be an integer from 1 to 90");
156
+ }
157
+ const runs: Array<{ date: string; results: LocationSourceSyncResult[] }> = [];
158
+ for (let offset = count; offset >= 1; offset -= 1) {
159
+ const date = shiftIsoDate(end, -(offset - 1));
160
+ runs.push({ date, results: await syncLocationDay({ ...rest, config, memoryDir, date, now }) });
161
+ }
162
+ return runs;
163
+ }
@@ -0,0 +1,75 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { defaultLocationConfig, parseLocationConfig } from "./config.js";
5
+
6
+ test("parseLocationConfig defaults to an inert configuration", () => {
7
+ assert.deepEqual(defaultLocationConfig(), {
8
+ enabled: false,
9
+ timezone: "UTC",
10
+ syncDays: 1,
11
+ retainCoordinates: false,
12
+ sources: [],
13
+ });
14
+ assert.deepEqual(parseLocationConfig(undefined), defaultLocationConfig());
15
+ assert.deepEqual(parseLocationConfig(null), defaultLocationConfig());
16
+ });
17
+
18
+ test("parseLocationConfig treats string false gates as disabled", () => {
19
+ assert.equal(parseLocationConfig({ enabled: "false", sources: [{ id: "reitti" }] }).enabled, false);
20
+ assert.equal(
21
+ parseLocationConfig({
22
+ enabled: true,
23
+ retainCoordinates: "0",
24
+ sources: [{ id: "reitti", enabled: "false" }],
25
+ }).retainCoordinates,
26
+ false,
27
+ );
28
+ });
29
+
30
+ test("parseLocationConfig rejects unrecognized gate values instead of defaulting", () => {
31
+ assert.throws(() => parseLocationConfig({ enabled: "maybe" }), TypeError);
32
+ assert.throws(() => parseLocationConfig({ retainCoordinates: 42 }), TypeError);
33
+ assert.throws(() => parseLocationConfig({ sources: [{ id: "reitti", enabled: "nope" }] }), TypeError);
34
+ });
35
+
36
+ test("parseLocationConfig validates the timezone at parse time", () => {
37
+ assert.throws(() => parseLocationConfig({ timezone: "Mars/Olympus" }), RangeError);
38
+ assert.equal(parseLocationConfig({ timezone: "America/Chicago" }).timezone, "America/Chicago");
39
+ assert.throws(() => parseLocationConfig({ timezone: "" }), TypeError);
40
+ });
41
+
42
+ test("parseLocationConfig enforces the syncDays integer range", () => {
43
+ assert.equal(parseLocationConfig({ syncDays: "3" }).syncDays, 3);
44
+ assert.throws(() => parseLocationConfig({ syncDays: 0 }), RangeError);
45
+ assert.throws(() => parseLocationConfig({ syncDays: 1.5 }), RangeError);
46
+ assert.throws(() => parseLocationConfig({ syncDays: 91 }), RangeError);
47
+ assert.throws(() => parseLocationConfig({ syncDays: "abc" }), TypeError);
48
+ });
49
+
50
+ test("parseLocationConfig requires a source when enabled", () => {
51
+ assert.throws(() => parseLocationConfig({ enabled: true }), RangeError);
52
+ assert.throws(() => parseLocationConfig({ enabled: true, sources: "reitti" }), TypeError);
53
+ const parsed = parseLocationConfig({ enabled: true, sources: [{ id: "reitti" }] });
54
+ assert.deepEqual(parsed.sources, [{ id: "reitti", enabled: true }]);
55
+ });
56
+
57
+ test("parseLocationConfig rejects malformed source entries", () => {
58
+ assert.throws(() => parseLocationConfig({ sources: [{ id: "" }] }), TypeError);
59
+ assert.throws(() => parseLocationConfig({ sources: [{}] }), TypeError);
60
+ assert.throws(() => parseLocationConfig({ sources: [{ id: "Bad_Id" }] }), RangeError);
61
+ assert.throws(() => parseLocationConfig({ sources: [{ id: "../escape" }] }), RangeError);
62
+ assert.throws(() => parseLocationConfig({ sources: ["reitti"] }), TypeError);
63
+ });
64
+
65
+ test("parseLocationConfig rejects duplicate source ids", () => {
66
+ assert.throws(
67
+ () => parseLocationConfig({ enabled: true, sources: [{ id: "reitti" }, { id: "reitti", enabled: false }] }),
68
+ RangeError,
69
+ );
70
+ });
71
+
72
+ test("parseLocationConfig rejects non-object blocks", () => {
73
+ assert.throws(() => parseLocationConfig("nope"), TypeError);
74
+ assert.throws(() => parseLocationConfig([1, 2]), TypeError);
75
+ });
@@ -0,0 +1,105 @@
1
+ import { coerceBooleanLike, coerceNumber } from "../connectors/coerce.js";
2
+ import { assertValidTimezone } from "../activity/digest.js";
3
+ import type { LocationConfig, LocationSourceConfig } from "./types.js";
4
+
5
+ const PROVIDER_ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
6
+
7
+ /** The inert default: disabled, UTC days, one day per run, no sources, no coordinates. */
8
+ export function defaultLocationConfig(): LocationConfig {
9
+ return {
10
+ enabled: false,
11
+ timezone: "UTC",
12
+ syncDays: 1,
13
+ retainCoordinates: false,
14
+ sources: [],
15
+ };
16
+ }
17
+
18
+ function asRecord(value: unknown, name: string): Record<string, unknown> {
19
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
20
+ throw new TypeError(`${name} must be an object`);
21
+ }
22
+ return value as Record<string, unknown>;
23
+ }
24
+
25
+ function optionalNonEmptyString(value: unknown, name: string): string | undefined {
26
+ if (value === undefined) return undefined;
27
+ if (typeof value !== "string" || value.length === 0) throw new TypeError(`${name} must be a non-empty string`);
28
+ return value;
29
+ }
30
+
31
+ function parseLocationSource(value: unknown): LocationSourceConfig {
32
+ const raw = asRecord(value, "location source");
33
+ const id = optionalNonEmptyString(raw.id, "location source id");
34
+ if (id === undefined) {
35
+ throw new TypeError("location source requires id");
36
+ }
37
+ if (!PROVIDER_ID_PATTERN.test(id)) {
38
+ throw new RangeError(
39
+ `location source id must be a lowercase kebab string (a-z, 0-9, hyphens): got "${id}"`,
40
+ );
41
+ }
42
+ const enabledValue = coerceBooleanLike(raw.enabled, "location source enabled");
43
+ if (raw.enabled !== undefined && enabledValue === undefined) {
44
+ throw new TypeError(`location source '${id}' enabled must be a boolean`);
45
+ }
46
+ return { id, enabled: enabledValue ?? true };
47
+ }
48
+
49
+ /**
50
+ * Parse the unified `location.*` block. `enabled` gates everything and
51
+ * requires at least one source; a source's own `enabled` gates that source
52
+ * only. `retainCoordinates` defaults to `false` — coordinates are privacy
53
+ * data and are dropped everywhere unless explicitly retained.
54
+ */
55
+ export function parseLocationConfig(raw: unknown): LocationConfig {
56
+ const defaults = defaultLocationConfig();
57
+ if (raw === undefined || raw === null) {
58
+ return { ...defaults };
59
+ }
60
+ const config = asRecord(raw, "location");
61
+ const enabledValue = coerceBooleanLike(config.enabled, "location.enabled");
62
+ if (config.enabled !== undefined && enabledValue === undefined) {
63
+ throw new TypeError("location.enabled must be a boolean");
64
+ }
65
+ const enabled = enabledValue ?? false;
66
+
67
+ const timezone = optionalNonEmptyString(config.timezone, "location.timezone") ?? "UTC";
68
+ // Validate the IANA zone at parse so a typo fails at config load, not
69
+ // mid-sync after some sources may already have advanced their state.
70
+ assertValidTimezone(timezone);
71
+
72
+ const syncDaysValue = coerceNumber(config.syncDays, "location.syncDays");
73
+ if (config.syncDays !== undefined && syncDaysValue === undefined) {
74
+ throw new TypeError("location.syncDays must be a finite number");
75
+ }
76
+ const syncDays = syncDaysValue ?? 1;
77
+ if (!Number.isInteger(syncDays) || syncDays < 1 || syncDays > 90) {
78
+ throw new RangeError("location.syncDays must be an integer from 1 to 90");
79
+ }
80
+
81
+ const retainCoordinatesValue = coerceBooleanLike(config.retainCoordinates, "location.retainCoordinates");
82
+ if (config.retainCoordinates !== undefined && retainCoordinatesValue === undefined) {
83
+ throw new TypeError("location.retainCoordinates must be a boolean");
84
+ }
85
+ const retainCoordinates = retainCoordinatesValue ?? false;
86
+
87
+ if (config.sources !== undefined && !Array.isArray(config.sources)) {
88
+ throw new TypeError("location.sources must be an array");
89
+ }
90
+ const sources = (config.sources ?? []).map(parseLocationSource);
91
+ // Day payloads and sync state are keyed on source id; two sources sharing
92
+ // an id would overwrite each other's state. Reject the collision at parse.
93
+ const ids = new Set<string>();
94
+ for (const source of sources) {
95
+ if (ids.has(source.id)) {
96
+ throw new RangeError(`location source id must be unique: ${source.id}`);
97
+ }
98
+ ids.add(source.id);
99
+ }
100
+ if (enabled && sources.length === 0) {
101
+ throw new RangeError("location.enabled requires at least one source");
102
+ }
103
+
104
+ return { enabled, timezone, syncDays, retainCoordinates, sources };
105
+ }