@remnic/core 9.19.0 → 9.20.0

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 (306) hide show
  1. package/dist/access-admin-ops-surface.d.ts +8 -8
  2. package/dist/access-admin-ops-surface.js +8 -8
  3. package/dist/access-boundary.d.ts +8 -8
  4. package/dist/access-boundary.js +8 -8
  5. package/dist/access-cli.js +32 -32
  6. package/dist/access-http.d.ts +8 -8
  7. package/dist/access-http.js +12 -12
  8. package/dist/access-identity-continuity-surface.d.ts +6 -6
  9. package/dist/access-identity-continuity-surface.js +8 -8
  10. package/dist/access-lcm-surface.d.ts +8 -8
  11. package/dist/access-lcm-surface.js +8 -8
  12. package/dist/access-mcp.d.ts +8 -8
  13. package/dist/access-mcp.js +11 -11
  14. package/dist/access-memory-search-fanout.d.ts +2 -2
  15. package/dist/{access-namespace-preflight-BsawJa-L.d.ts → access-namespace-preflight-tmwQgCT6.d.ts} +1 -1
  16. package/dist/access-namespace-preflight.d.ts +3 -3
  17. package/dist/access-namespace-preflight.js +8 -8
  18. package/dist/access-observe-write-surface.d.ts +8 -8
  19. package/dist/access-observe-write-surface.js +8 -8
  20. package/dist/access-operations-batch.js +9 -9
  21. package/dist/access-operations.d.ts +8 -8
  22. package/dist/access-operations.js +10 -10
  23. package/dist/access-recall-concurrency.d.ts +8 -8
  24. package/dist/access-recall-concurrency.js +8 -8
  25. package/dist/access-recall-response.d.ts +8 -8
  26. package/dist/access-recall-response.js +8 -8
  27. package/dist/access-recall-surface.d.ts +8 -8
  28. package/dist/access-recall-surface.js +8 -8
  29. package/dist/{access-service-DLuVnV6a.d.ts → access-service-BqUii7LY.d.ts} +6 -6
  30. package/dist/access-service.d.ts +8 -8
  31. package/dist/access-service.js +8 -8
  32. package/dist/access-surface-catalog.d.ts +8 -8
  33. package/dist/action-confidence.d.ts +1 -1
  34. package/dist/active-memory-bridge.d.ts +1 -1
  35. package/dist/active-recall.d.ts +1 -1
  36. package/dist/active-recall.js +1 -1
  37. package/dist/{auto-sync-IH3G25MT.js → auto-sync-UPTUVE4X.js} +3 -3
  38. package/dist/behavior-learner.d.ts +1 -1
  39. package/dist/behavior-signals.d.ts +1 -1
  40. package/dist/bootstrap.d.ts +6 -6
  41. package/dist/briefing.d.ts +2 -2
  42. package/dist/briefing.js +4 -4
  43. package/dist/buffer-surprise-report.d.ts +1 -1
  44. package/dist/buffer.d.ts +2 -2
  45. package/dist/bulk-import/index.d.ts +3 -3
  46. package/dist/calibration.d.ts +1 -1
  47. package/dist/capabilities.d.ts +1 -1
  48. package/dist/{catalog-O6P8694A.d.ts → catalog-iWvWz61I.d.ts} +1 -1
  49. package/dist/causal-behavior.d.ts +1 -1
  50. package/dist/causal-consolidation.d.ts +1 -1
  51. package/dist/causal-consolidation.js +5 -5
  52. package/dist/causal-trajectory-graph.d.ts +1 -1
  53. package/dist/{chunk-YUWFASAK.js → chunk-275ENJDK.js} +2 -2
  54. package/dist/{chunk-EZFVVEQG.js → chunk-3ZUY2VQF.js} +2 -2
  55. package/dist/{chunk-HRREDJSL.js → chunk-4F6AANKS.js} +3 -3
  56. package/dist/{chunk-U7D5HWNG.js → chunk-4PYLBXX6.js} +2 -2
  57. package/dist/{chunk-3LZSS77C.js → chunk-53WDAG7X.js} +2 -2
  58. package/dist/{chunk-QEEMLGCO.js → chunk-5IXPWEQB.js} +5 -5
  59. package/dist/{chunk-VSVX777Y.js → chunk-5JQLAQUZ.js} +2 -2
  60. package/dist/{chunk-DR65EEXG.js → chunk-62QM5MKY.js} +7 -7
  61. package/dist/{chunk-WYL5ODHJ.js → chunk-6NZ7U4R4.js} +1 -1
  62. package/dist/chunk-6NZ7U4R4.js.map +1 -0
  63. package/dist/{chunk-OFQUY5NZ.js → chunk-7M6APKJL.js} +331 -5
  64. package/dist/chunk-7M6APKJL.js.map +1 -0
  65. package/dist/{chunk-OOJQ6ID5.js → chunk-AT3TDN6O.js} +1017 -296
  66. package/dist/chunk-AT3TDN6O.js.map +1 -0
  67. package/dist/{chunk-DQCUBRTZ.js → chunk-B7C3TF5H.js} +2 -2
  68. package/dist/{chunk-RPOOJPMB.js → chunk-EILX7SQR.js} +3 -3
  69. package/dist/{chunk-D5H3B36B.js → chunk-EXU5IQ3S.js} +2 -2
  70. package/dist/{chunk-KUF7OIFK.js → chunk-EZKKHVFY.js} +2 -2
  71. package/dist/{chunk-S5HCKQ7Q.js → chunk-GEUDRENF.js} +2 -2
  72. package/dist/{chunk-X7GOH7Y6.js → chunk-HJEEAO4O.js} +2 -2
  73. package/dist/{chunk-FL7MNSH3.js → chunk-HPOY2PHQ.js} +3 -3
  74. package/dist/{chunk-Q55XM4SU.js → chunk-JFDEYXF7.js} +2 -2
  75. package/dist/{chunk-UVSDFM7R.js → chunk-JN3IUA2Q.js} +2 -2
  76. package/dist/{chunk-PLRDZ2OO.js → chunk-JWMYVQAM.js} +2 -2
  77. package/dist/{chunk-KOFVOVJG.js → chunk-KHRKEELC.js} +17 -17
  78. package/dist/{chunk-Y4JHE2ML.js → chunk-LI4ZOFHW.js} +2 -2
  79. package/dist/{chunk-MLW3J7IC.js → chunk-LMHDFOVV.js} +3 -3
  80. package/dist/{chunk-X6E5WAGX.js → chunk-N7EVMKP6.js} +6 -6
  81. package/dist/{chunk-HCNG42P3.js → chunk-Q3FWRDCP.js} +2 -2
  82. package/dist/{chunk-5MFHOX5T.js → chunk-QO2KODU6.js} +2 -2
  83. package/dist/{chunk-W3DJOT22.js → chunk-TCZWBJBO.js} +2 -2
  84. package/dist/{chunk-B3ABVQ36.js → chunk-UHVXE24Y.js} +2 -1
  85. package/dist/{chunk-UX3ZXN34.js → chunk-UV72DEZD.js} +2 -2
  86. package/dist/{chunk-OZSL2QZC.js → chunk-V5TSUGRB.js} +5 -5
  87. package/dist/{chunk-CH3BRJ3P.js → chunk-X5QS5C2O.js} +2 -2
  88. package/dist/{cli-0dQHR6e6.d.ts → cli-DPEhq0Cp.d.ts} +5 -5
  89. package/dist/cli.d.ts +10 -10
  90. package/dist/cli.js +25 -25
  91. package/dist/compounding/engine.d.ts +2 -2
  92. package/dist/compounding/engine.js +4 -4
  93. package/dist/compounding/preference-consolidator.d.ts +1 -1
  94. package/dist/compression-optimizer.d.ts +1 -1
  95. package/dist/config.d.ts +1 -1
  96. package/dist/config.js +1 -1
  97. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  98. package/dist/connectors/codex-materialize-runner.js +4 -4
  99. package/dist/connectors/codex-materialize.d.ts +1 -1
  100. package/dist/connectors/index.d.ts +1 -1
  101. package/dist/connectors/index.js +4 -4
  102. package/dist/consolidation-provenance-check.d.ts +2 -2
  103. package/dist/consolidation-undo.d.ts +2 -2
  104. package/dist/contradiction/index.d.ts +2 -2
  105. package/dist/conversation-index/backend.d.ts +1 -1
  106. package/dist/conversation-index/chunker.d.ts +1 -1
  107. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  108. package/dist/conversation-index/indexer.d.ts +1 -1
  109. package/dist/conversation-index/search.d.ts +1 -1
  110. package/dist/day-summary.d.ts +1 -1
  111. package/dist/delinearize.d.ts +1 -1
  112. package/dist/direct-answer-wiring.d.ts +1 -1
  113. package/dist/direct-answer.d.ts +1 -1
  114. package/dist/embedding-fallback.d.ts +1 -1
  115. package/dist/enrichment/index.d.ts +1 -1
  116. package/dist/entity-retrieval.d.ts +2 -2
  117. package/dist/entity-retrieval.js +4 -4
  118. package/dist/entity-schema.d.ts +1 -1
  119. package/dist/explicit-capture.d.ts +6 -6
  120. package/dist/extraction-faithfulness.d.ts +1 -1
  121. package/dist/extraction-judge-telemetry.d.ts +1 -1
  122. package/dist/extraction-judge-training.d.ts +1 -1
  123. package/dist/extraction-judge.d.ts +1 -1
  124. package/dist/extraction.d.ts +1 -1
  125. package/dist/fallback-llm.d.ts +1 -1
  126. package/dist/graph-dashboard-diff.d.ts +1 -1
  127. package/dist/graph-dashboard-key.d.ts +1 -1
  128. package/dist/graph-dashboard-parser.d.ts +1 -1
  129. package/dist/graph-edge-reinforcement.d.ts +1 -1
  130. package/dist/graph-snapshot.d.ts +1 -1
  131. package/dist/graph.d.ts +1 -1
  132. package/dist/importance.d.ts +1 -1
  133. package/dist/importers/index.d.ts +1 -1
  134. package/dist/in-flight-reads.d.ts +1 -1
  135. package/dist/index.d.ts +468 -88
  136. package/dist/index.js +66 -36
  137. package/dist/intent.d.ts +1 -1
  138. package/dist/lcm/engine.d.ts +1 -1
  139. package/dist/lcm/index.d.ts +1 -1
  140. package/dist/lcm/tools.d.ts +1 -1
  141. package/dist/lifecycle.d.ts +1 -1
  142. package/dist/live-connectors-runner.d.ts +1 -1
  143. package/dist/local-llm.d.ts +1 -1
  144. package/dist/local-model-endpoint.d.ts +1 -1
  145. package/dist/maintenance/memory-governance.d.ts +1 -1
  146. package/dist/maintenance/memory-governance.js +4 -4
  147. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  148. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +4 -4
  149. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  150. package/dist/maintenance/rebuild-memory-projection.js +5 -5
  151. package/dist/mcp-memory-inspector-app.d.ts +8 -8
  152. package/dist/memory-action-policy.d.ts +1 -1
  153. package/dist/memory-cache.d.ts +1 -1
  154. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  155. package/dist/memory-projection-store.d.ts +1 -1
  156. package/dist/memory-provenance.d.ts +1 -1
  157. package/dist/memory-worth-outcomes.d.ts +2 -2
  158. package/dist/models-json.d.ts +1 -1
  159. package/dist/namespaces/migrate.d.ts +3 -3
  160. package/dist/namespaces/migrate.js +5 -5
  161. package/dist/namespaces/principal.d.ts +1 -1
  162. package/dist/namespaces/search.d.ts +1 -1
  163. package/dist/namespaces/storage.d.ts +3 -3
  164. package/dist/namespaces/storage.js +4 -4
  165. package/dist/native-knowledge.d.ts +1 -1
  166. package/dist/offline-sync-impression-drain.d.ts +1 -1
  167. package/dist/operator-toolkit.d.ts +2 -2
  168. package/dist/operator-toolkit.js +9 -9
  169. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  170. package/dist/orchestration/maintenance.d.ts +3 -3
  171. package/dist/orchestration/maintenance.js +9 -9
  172. package/dist/{orchestrator-B8ickLkd.d.ts → orchestrator-DB93S48I.d.ts} +5 -5
  173. package/dist/orchestrator.d.ts +6 -6
  174. package/dist/orchestrator.js +32 -32
  175. package/dist/patterns-cli.d.ts +1 -1
  176. package/dist/{pipeline-B669unGm.d.ts → pipeline-DmGc-H66.d.ts} +1 -1
  177. package/dist/policy-runtime.d.ts +1 -1
  178. package/dist/proactive-contention.d.ts +1 -1
  179. package/dist/provenance.d.ts +1 -1
  180. package/dist/{qmd-D0PVXmea.d.ts → qmd-cJT0crkF.d.ts} +1 -1
  181. package/dist/qmd-preflight.d.ts +2 -2
  182. package/dist/qmd-recall-cache.d.ts +1 -1
  183. package/dist/qmd.d.ts +2 -2
  184. package/dist/recall-concurrency-config.d.ts +1 -1
  185. package/dist/recall-disclosure-escalation.d.ts +1 -1
  186. package/dist/recall-explain-renderer.d.ts +1 -1
  187. package/dist/recall-explain-renderer.js +3 -3
  188. package/dist/recall-memory-map.d.ts +1 -1
  189. package/dist/recall-planner-llm.d.ts +1 -1
  190. package/dist/recall-state.d.ts +1 -1
  191. package/dist/recall-tag-filter.d.ts +1 -1
  192. package/dist/recall-timings.d.ts +1 -1
  193. package/dist/recall-xray-cli.d.ts +1 -1
  194. package/dist/recall-xray-cli.js +4 -4
  195. package/dist/recall-xray-renderer.d.ts +1 -1
  196. package/dist/recall-xray-renderer.js +3 -3
  197. package/dist/recall-xray.d.ts +1 -1
  198. package/dist/recall-xray.js +2 -2
  199. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  200. package/dist/replay/normalizers/claude.d.ts +1 -1
  201. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  202. package/dist/replay/normalizers/shared.d.ts +1 -1
  203. package/dist/replay/runner.d.ts +1 -1
  204. package/dist/replay/types.d.ts +1 -1
  205. package/dist/resolve-auth-token.d.ts +1 -1
  206. package/dist/resume-bundles.js +2 -2
  207. package/dist/retrieval-agents.d.ts +2 -2
  208. package/dist/retrieval-tiers.d.ts +1 -1
  209. package/dist/routing/engine.d.ts +1 -1
  210. package/dist/routing/store.d.ts +1 -1
  211. package/dist/salvage-envelope.d.ts +1 -1
  212. package/dist/{scope-profiles-BOp3gSzp.d.ts → scope-profiles-KG2nODX7.d.ts} +1 -1
  213. package/dist/search/embed-helper.d.ts +1 -1
  214. package/dist/search/factory.d.ts +1 -1
  215. package/dist/search/index.d.ts +1 -1
  216. package/dist/search/lancedb-backend.d.ts +1 -1
  217. package/dist/search/meilisearch-backend.d.ts +1 -1
  218. package/dist/search/noop-backend.d.ts +1 -1
  219. package/dist/search/orama-backend.d.ts +1 -1
  220. package/dist/search/port.d.ts +1 -1
  221. package/dist/search/remote-backend.d.ts +1 -1
  222. package/dist/{semantic-consolidation-C7SZNzUJ.d.ts → semantic-consolidation-BaZlg0D8.d.ts} +1 -1
  223. package/dist/semantic-consolidation.d.ts +2 -2
  224. package/dist/semantic-consolidation.js +5 -5
  225. package/dist/semantic-rule-promotion.js +4 -4
  226. package/dist/semantic-rule-verifier.d.ts +1 -1
  227. package/dist/semantic-rule-verifier.js +4 -4
  228. package/dist/session-observer-bands.d.ts +1 -1
  229. package/dist/session-observer-state.d.ts +1 -1
  230. package/dist/shared-context/manager.d.ts +1 -1
  231. package/dist/signal.d.ts +1 -1
  232. package/dist/{storage-CJ_Fia4H.d.ts → storage-BKhHHnRo.d.ts} +2 -221
  233. package/dist/storage.d.ts +2 -2
  234. package/dist/storage.js +3 -3
  235. package/dist/summarizer.d.ts +1 -1
  236. package/dist/summary-snapshot.d.ts +1 -1
  237. package/dist/temporal-supersession.d.ts +2 -2
  238. package/dist/temporal-timeline-recall.d.ts +1 -1
  239. package/dist/temporal-validity.d.ts +1 -1
  240. package/dist/threading.d.ts +1 -1
  241. package/dist/tier-migration.d.ts +2 -2
  242. package/dist/tier-routing.d.ts +1 -1
  243. package/dist/topics.d.ts +1 -1
  244. package/dist/transcript.d.ts +1 -1
  245. package/dist/trust-score-stage.d.ts +1 -1
  246. package/dist/trust-score.d.ts +1 -1
  247. package/dist/{types-GeWGXq9E.d.ts → types-GBQZuT7l.d.ts} +395 -1
  248. package/dist/types.d.ts +1 -1
  249. package/dist/types.js +1 -1
  250. package/dist/utility-runtime.d.ts +1 -1
  251. package/dist/verified-recall.js +4 -4
  252. package/dist/write-envelope.d.ts +1 -1
  253. package/package.json +2 -2
  254. package/src/config.ts +3 -3
  255. package/src/meetings/build.test.ts +646 -0
  256. package/src/meetings/build.ts +365 -0
  257. package/src/meetings/cli.test.ts +276 -0
  258. package/src/meetings/cli.ts +242 -0
  259. package/src/meetings/config.test.ts +72 -0
  260. package/src/meetings/config.ts +183 -0
  261. package/src/meetings/errors.ts +13 -0
  262. package/src/meetings/fuse.test.ts +208 -0
  263. package/src/meetings/fuse.ts +297 -0
  264. package/src/meetings/index.ts +11 -1
  265. package/src/meetings/memory-generator.ts +116 -0
  266. package/src/meetings/recall-exclusion.test.ts +88 -0
  267. package/src/meetings/store.test.ts +232 -0
  268. package/src/meetings/store.ts +465 -0
  269. package/src/meetings/types.ts +111 -0
  270. package/src/orchestration/orchestrator-helpers.ts +23 -3
  271. package/src/orchestration/recall-search-pipeline.test.ts +182 -0
  272. package/src/orchestration/recall-search-pipeline.ts +36 -15
  273. package/src/types.ts +6 -0
  274. package/dist/chunk-OFQUY5NZ.js.map +0 -1
  275. package/dist/chunk-OOJQ6ID5.js.map +0 -1
  276. package/dist/chunk-WYL5ODHJ.js.map +0 -1
  277. /package/dist/{auto-sync-IH3G25MT.js.map → auto-sync-UPTUVE4X.js.map} +0 -0
  278. /package/dist/{chunk-YUWFASAK.js.map → chunk-275ENJDK.js.map} +0 -0
  279. /package/dist/{chunk-EZFVVEQG.js.map → chunk-3ZUY2VQF.js.map} +0 -0
  280. /package/dist/{chunk-HRREDJSL.js.map → chunk-4F6AANKS.js.map} +0 -0
  281. /package/dist/{chunk-U7D5HWNG.js.map → chunk-4PYLBXX6.js.map} +0 -0
  282. /package/dist/{chunk-3LZSS77C.js.map → chunk-53WDAG7X.js.map} +0 -0
  283. /package/dist/{chunk-QEEMLGCO.js.map → chunk-5IXPWEQB.js.map} +0 -0
  284. /package/dist/{chunk-VSVX777Y.js.map → chunk-5JQLAQUZ.js.map} +0 -0
  285. /package/dist/{chunk-DR65EEXG.js.map → chunk-62QM5MKY.js.map} +0 -0
  286. /package/dist/{chunk-DQCUBRTZ.js.map → chunk-B7C3TF5H.js.map} +0 -0
  287. /package/dist/{chunk-RPOOJPMB.js.map → chunk-EILX7SQR.js.map} +0 -0
  288. /package/dist/{chunk-D5H3B36B.js.map → chunk-EXU5IQ3S.js.map} +0 -0
  289. /package/dist/{chunk-KUF7OIFK.js.map → chunk-EZKKHVFY.js.map} +0 -0
  290. /package/dist/{chunk-S5HCKQ7Q.js.map → chunk-GEUDRENF.js.map} +0 -0
  291. /package/dist/{chunk-X7GOH7Y6.js.map → chunk-HJEEAO4O.js.map} +0 -0
  292. /package/dist/{chunk-FL7MNSH3.js.map → chunk-HPOY2PHQ.js.map} +0 -0
  293. /package/dist/{chunk-Q55XM4SU.js.map → chunk-JFDEYXF7.js.map} +0 -0
  294. /package/dist/{chunk-UVSDFM7R.js.map → chunk-JN3IUA2Q.js.map} +0 -0
  295. /package/dist/{chunk-PLRDZ2OO.js.map → chunk-JWMYVQAM.js.map} +0 -0
  296. /package/dist/{chunk-KOFVOVJG.js.map → chunk-KHRKEELC.js.map} +0 -0
  297. /package/dist/{chunk-Y4JHE2ML.js.map → chunk-LI4ZOFHW.js.map} +0 -0
  298. /package/dist/{chunk-MLW3J7IC.js.map → chunk-LMHDFOVV.js.map} +0 -0
  299. /package/dist/{chunk-X6E5WAGX.js.map → chunk-N7EVMKP6.js.map} +0 -0
  300. /package/dist/{chunk-HCNG42P3.js.map → chunk-Q3FWRDCP.js.map} +0 -0
  301. /package/dist/{chunk-5MFHOX5T.js.map → chunk-QO2KODU6.js.map} +0 -0
  302. /package/dist/{chunk-W3DJOT22.js.map → chunk-TCZWBJBO.js.map} +0 -0
  303. /package/dist/{chunk-B3ABVQ36.js.map → chunk-UHVXE24Y.js.map} +0 -0
  304. /package/dist/{chunk-UX3ZXN34.js.map → chunk-UV72DEZD.js.map} +0 -0
  305. /package/dist/{chunk-OZSL2QZC.js.map → chunk-V5TSUGRB.js.map} +0 -0
  306. /package/dist/{chunk-CH3BRJ3P.js.map → chunk-X5QS5C2O.js.map} +0 -0
@@ -351,7 +351,7 @@ function parseWearablesConfig(value) {
351
351
  redactionPatterns = raw.redactionPatterns;
352
352
  compileRedactionPatterns(redactionPatterns);
353
353
  }
354
- const parseBoundedInt = (value2, name, fallback, min, max) => {
354
+ const parseBoundedInt2 = (value2, name, fallback, min, max) => {
355
355
  if (value2 === void 0) return fallback;
356
356
  const coerced = coerceNumber(value2);
357
357
  if (coerced === void 0 || !Number.isInteger(coerced) || coerced < min || coerced > max) {
@@ -361,21 +361,21 @@ function parseWearablesConfig(value) {
361
361
  }
362
362
  return coerced;
363
363
  };
364
- const autoSyncIntervalMinutes = parseBoundedInt(
364
+ const autoSyncIntervalMinutes = parseBoundedInt2(
365
365
  raw.autoSyncIntervalMinutes,
366
366
  "wearables.autoSyncIntervalMinutes",
367
367
  defaults.autoSyncIntervalMinutes,
368
368
  1,
369
369
  MAX_AUTO_SYNC_INTERVAL_MINUTES
370
370
  );
371
- const autoSyncDays = parseBoundedInt(
371
+ const autoSyncDays = parseBoundedInt2(
372
372
  raw.autoSyncDays,
373
373
  "wearables.autoSyncDays",
374
374
  defaults.autoSyncDays,
375
375
  1,
376
376
  MAX_AUTO_SYNC_WINDOW_DAYS
377
377
  );
378
- const autoSyncDeepDays = parseBoundedInt(
378
+ const autoSyncDeepDays = parseBoundedInt2(
379
379
  raw.autoSyncDeepDays,
380
380
  "wearables.autoSyncDeepDays",
381
381
  defaults.autoSyncDeepDays,
@@ -436,6 +436,324 @@ function parseWearablesConfig(value) {
436
436
  };
437
437
  }
438
438
 
439
+ // src/meetings/detect.ts
440
+ import { createHash } from "crypto";
441
+ var DEFAULT_MEETING_APP_PATTERNS = [
442
+ "zoom.us",
443
+ "Zoom",
444
+ "Microsoft Teams",
445
+ "teams.microsoft.com",
446
+ "meet.google.com",
447
+ "Webex",
448
+ "Slack",
449
+ // huddle windows
450
+ "FaceTime"
451
+ ];
452
+ var DEFAULT_MEETINGS_DETECTION_CONFIG = {
453
+ appPatterns: [...DEFAULT_MEETING_APP_PATTERNS],
454
+ minOverlapMinutes: 2,
455
+ audioOnlyMinMinutes: 15,
456
+ mergeGapMinutes: 2
457
+ };
458
+ function ms(iso) {
459
+ if (typeof iso !== "string") return Number.NaN;
460
+ if (!Number.isFinite(Date.parse(iso))) return Number.NaN;
461
+ const m = iso.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|[+-](?:0\d:[0-5]\d|1[0-3]:[0-5]\d|14:00))$/);
462
+ if (m === null) return Number.NaN;
463
+ const [year, month, day, hour, minute, second] = m.slice(1).map(Number);
464
+ const daysInMonth = month >= 1 && month <= 12 ? new Date(Date.UTC(year, month, 0)).getUTCDate() : 0;
465
+ if (day < 1 || day > daysInMonth || hour > 23 || minute > 59 || second > 59) return Number.NaN;
466
+ return Date.parse(iso);
467
+ }
468
+ function overlapMs(aStart, aEnd, bStart, bEnd) {
469
+ const start = Math.max(aStart, bStart);
470
+ const end = Math.min(aEnd, bEnd);
471
+ return end > start ? end - start : 0;
472
+ }
473
+ function meetingId(date, startUtc) {
474
+ if (!isValidDay(date)) {
475
+ throw new RangeError(`meetings: invalid day "${date}" for a meeting id; expected a real YYYY-MM-DD.`);
476
+ }
477
+ const startMs = ms(startUtc);
478
+ if (Number.isNaN(startMs)) {
479
+ throw new RangeError(`meetings: invalid meeting start "${startUtc}" for a meeting id.`);
480
+ }
481
+ const anchor = new Date(startMs).toISOString();
482
+ const hash = createHash("sha256").update(`${date}|${anchor}`, "utf8").digest("hex").slice(0, 8);
483
+ return `mtg-${date}-${hash}`;
484
+ }
485
+ function isFinitePair(a, b) {
486
+ return Number.isFinite(a) && Number.isFinite(b) && b > a;
487
+ }
488
+ function combineDetection(a, b) {
489
+ if (a === "app+audio" || b === "app+audio") return "app+audio";
490
+ if (a === "provider" || b === "provider") return "provider";
491
+ return "audio";
492
+ }
493
+ function buildCandidates(audioWindows, appSpans, config) {
494
+ const minOverlapMs = config.minOverlapMinutes * 6e4;
495
+ const audioOnlyMs = config.audioOnlyMinMinutes * 6e4;
496
+ const candidates = [];
497
+ for (const window of audioWindows) {
498
+ const startMs = ms(window.startUtc);
499
+ const endMs = ms(window.endUtc);
500
+ if (!isFinitePair(startMs, endMs)) continue;
501
+ if (window.providerMeeting === true) {
502
+ candidates.push({
503
+ startMs,
504
+ endMs,
505
+ detectionSource: "provider",
506
+ sources: [window.source],
507
+ ...window.title !== void 0 ? { title: window.title } : {}
508
+ });
509
+ continue;
510
+ }
511
+ let bestApp;
512
+ for (const span of appSpans) {
513
+ const spanStart = ms(span.startUtc);
514
+ const spanEnd = ms(span.endUtc);
515
+ if (!isFinitePair(spanStart, spanEnd)) continue;
516
+ const overlap = overlapMs(startMs, endMs, spanStart, spanEnd);
517
+ if (overlap <= 0 || overlap < minOverlapMs) continue;
518
+ if (bestApp === void 0 || overlap > bestApp.overlap) {
519
+ bestApp = { span, overlap };
520
+ } else if (overlap === bestApp.overlap) {
521
+ const bestStart = ms(bestApp.span.startUtc);
522
+ const better = spanStart < bestStart || spanStart === bestStart && (span.app < bestApp.span.app || span.app === bestApp.span.app && spanEnd < ms(bestApp.span.endUtc));
523
+ if (better) bestApp = { span, overlap };
524
+ }
525
+ }
526
+ if (bestApp !== void 0) {
527
+ candidates.push({
528
+ startMs,
529
+ endMs,
530
+ app: bestApp.span.app,
531
+ detectionSource: "app+audio",
532
+ sources: [window.source],
533
+ ...window.title !== void 0 ? { title: window.title } : {}
534
+ });
535
+ continue;
536
+ }
537
+ if (endMs - startMs >= audioOnlyMs && Number.isInteger(window.distinctNonWearerSpeakers) && window.distinctNonWearerSpeakers >= 2) {
538
+ candidates.push({
539
+ startMs,
540
+ endMs,
541
+ detectionSource: "audio",
542
+ sources: [window.source],
543
+ ...window.title !== void 0 ? { title: window.title } : {}
544
+ });
545
+ }
546
+ }
547
+ return candidates;
548
+ }
549
+ var DETECTION_RANK = {
550
+ "app+audio": 0,
551
+ provider: 1,
552
+ audio: 2
553
+ };
554
+ function candidateOrder(a, b) {
555
+ return a.startMs - b.startMs || a.endMs - b.endMs || DETECTION_RANK[a.detectionSource] - DETECTION_RANK[b.detectionSource] || (a.app ?? "").localeCompare(b.app ?? "") || (a.title ?? "").localeCompare(b.title ?? "") || (a.sources[0] ?? "").localeCompare(b.sources[0] ?? "");
556
+ }
557
+ function mergeCandidates(candidates, mergeGapMs) {
558
+ const sorted = [...candidates].sort(candidateOrder);
559
+ const merged = [];
560
+ for (const candidate of sorted) {
561
+ const prev = merged[merged.length - 1];
562
+ const overlaps = prev !== void 0 && candidate.startMs < prev.endMs;
563
+ const sameAppAdjacent = prev !== void 0 && prev.app !== void 0 && prev.app === candidate.app && candidate.startMs - prev.endMs <= mergeGapMs;
564
+ if (prev !== void 0 && (overlaps || sameAppAdjacent)) {
565
+ prev.endMs = Math.max(prev.endMs, candidate.endMs);
566
+ prev.app = prev.app ?? candidate.app;
567
+ prev.detectionSource = combineDetection(prev.detectionSource, candidate.detectionSource);
568
+ prev.sources = [.../* @__PURE__ */ new Set([...prev.sources, ...candidate.sources])];
569
+ prev.title = prev.title ?? candidate.title;
570
+ continue;
571
+ }
572
+ merged.push({ ...candidate, sources: [...candidate.sources] });
573
+ }
574
+ return merged;
575
+ }
576
+ function assertFiniteNonNegative(name, value) {
577
+ if (!Number.isFinite(value) || value < 0) {
578
+ throw new RangeError(`meetings config "${name}" must be a finite, non-negative number (got ${value}).`);
579
+ }
580
+ }
581
+ function isValidDay(date) {
582
+ const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(date);
583
+ if (m === null) return false;
584
+ const [, year, month, day] = m.map(Number);
585
+ const daysInMonth = month >= 1 && month <= 12 ? new Date(Date.UTC(year, month, 0)).getUTCDate() : 0;
586
+ return day >= 1 && day <= daysInMonth;
587
+ }
588
+ function validateConfig(config) {
589
+ assertFiniteNonNegative("minOverlapMinutes", config.minOverlapMinutes);
590
+ assertFiniteNonNegative("audioOnlyMinMinutes", config.audioOnlyMinMinutes);
591
+ assertFiniteNonNegative("mergeGapMinutes", config.mergeGapMinutes);
592
+ }
593
+ function detectMeetings(input, config = DEFAULT_MEETINGS_DETECTION_CONFIG) {
594
+ validateConfig(config);
595
+ if (!isValidDay(input.date)) {
596
+ throw new RangeError(`meetings: invalid day "${input.date}"; expected a real YYYY-MM-DD.`);
597
+ }
598
+ const candidates = buildCandidates(input.audioWindows, input.appSpans, config);
599
+ const merged = mergeCandidates(candidates, config.mergeGapMinutes * 6e4);
600
+ return merged.map((candidate) => {
601
+ const startUtc = new Date(candidate.startMs).toISOString();
602
+ const endUtc = new Date(candidate.endMs).toISOString();
603
+ return {
604
+ id: meetingId(input.date, startUtc),
605
+ date: input.date,
606
+ startUtc,
607
+ endUtc,
608
+ ...candidate.app !== void 0 ? { app: candidate.app } : {},
609
+ detectionSource: candidate.detectionSource,
610
+ sources: [...candidate.sources].sort((a, b) => a < b ? -1 : a > b ? 1 : 0),
611
+ ...candidate.title !== void 0 ? { title: candidate.title } : {}
612
+ };
613
+ });
614
+ }
615
+
616
+ // src/meetings/config.ts
617
+ var DEFAULT_MIN_OVERLAP_MINUTES = 2;
618
+ var DEFAULT_AUDIO_ONLY_MIN_MINUTES = 15;
619
+ var DEFAULT_MERGE_GAP_MINUTES = 2;
620
+ var DEFAULT_CONTEXT_DWELL_SECONDS = 20;
621
+ var DEFAULT_MAX_CONTEXT_CHARS = 4e3;
622
+ var DEFAULT_SUMMARY_MODE = "smart";
623
+ var DEFAULT_SOURCE_TRUST2 = 0.85;
624
+ var DEFAULT_AUTO_APPROVE_TRUST2 = 0.7;
625
+ var DEFAULT_REVIEW_TRUST2 = 0.45;
626
+ var SUMMARY_MODES = ["off", "review", "smart"];
627
+ var DEFAULT_MEETINGS_CONFIG = {
628
+ enabled: false,
629
+ appPatterns: [...DEFAULT_MEETING_APP_PATTERNS],
630
+ minOverlapMinutes: DEFAULT_MIN_OVERLAP_MINUTES,
631
+ audioOnlyMinMinutes: DEFAULT_AUDIO_ONLY_MIN_MINUTES,
632
+ mergeGapMinutes: DEFAULT_MERGE_GAP_MINUTES,
633
+ contextDwellSeconds: DEFAULT_CONTEXT_DWELL_SECONDS,
634
+ maxContextChars: DEFAULT_MAX_CONTEXT_CHARS,
635
+ summaryMode: DEFAULT_SUMMARY_MODE,
636
+ sourceTrust: DEFAULT_SOURCE_TRUST2,
637
+ autoApproveTrust: DEFAULT_AUTO_APPROVE_TRUST2,
638
+ reviewTrust: DEFAULT_REVIEW_TRUST2
639
+ };
640
+ function parseBool2(value, name, fallback) {
641
+ if (value === void 0 || value === null) return fallback;
642
+ const coerced = coerceBool(value);
643
+ if (coerced === void 0) {
644
+ throw new Error(
645
+ `${name} must be a boolean-like value (true/false/1/0/yes/no/on/off); got ${JSON.stringify(value)}`
646
+ );
647
+ }
648
+ return coerced;
649
+ }
650
+ function parseBoundedInt(value, name, fallback, min, max) {
651
+ if (value === void 0 || value === null) return fallback;
652
+ const coerced = coerceNumber(value);
653
+ if (coerced === void 0 || !Number.isFinite(coerced) || !Number.isInteger(coerced) || coerced < min || coerced > max) {
654
+ throw new Error(
655
+ `${name} must be an integer between ${min} and ${max}; got ${JSON.stringify(value)}`
656
+ );
657
+ }
658
+ return coerced;
659
+ }
660
+ function parseAppPatterns(value) {
661
+ if (value === void 0 || value === null) {
662
+ return [...DEFAULT_MEETING_APP_PATTERNS];
663
+ }
664
+ if (!Array.isArray(value)) {
665
+ throw new Error(
666
+ `meetings.appPatterns must be an array of non-empty strings; got ${JSON.stringify(value)}`
667
+ );
668
+ }
669
+ const patterns = [];
670
+ for (const entry of value) {
671
+ if (typeof entry !== "string" || entry.trim().length === 0) {
672
+ throw new Error(
673
+ `meetings.appPatterns entries must be non-empty strings; got ${JSON.stringify(entry)}`
674
+ );
675
+ }
676
+ patterns.push(entry);
677
+ }
678
+ const merged = [...DEFAULT_MEETING_APP_PATTERNS, ...patterns];
679
+ return [...new Set(merged)];
680
+ }
681
+ function parseSummaryMode(value) {
682
+ if (value === void 0 || value === null) return DEFAULT_SUMMARY_MODE;
683
+ if (typeof value === "string" && SUMMARY_MODES.includes(value)) {
684
+ return value;
685
+ }
686
+ throw new Error(
687
+ `meetings.summaryMode must be one of ${SUMMARY_MODES.join(", ")}; got ${JSON.stringify(value)}`
688
+ );
689
+ }
690
+ function parseTrust01(value, name, fallback) {
691
+ if (value === void 0 || value === null) return fallback;
692
+ const coerced = coerceNumber(value);
693
+ if (coerced === void 0 || !Number.isFinite(coerced) || coerced < 0 || coerced > 1) {
694
+ throw new Error(`${name} must be a number in [0, 1]; got ${JSON.stringify(value)}`);
695
+ }
696
+ return coerced;
697
+ }
698
+ function parseMeetingsConfig(value) {
699
+ if (value === void 0 || value === null) {
700
+ return { ...DEFAULT_MEETINGS_CONFIG, appPatterns: [...DEFAULT_MEETING_APP_PATTERNS] };
701
+ }
702
+ if (typeof value !== "object" || Array.isArray(value)) {
703
+ throw new Error(`meetings must be an object; got ${JSON.stringify(value)}`);
704
+ }
705
+ const raw = value;
706
+ const config = {
707
+ enabled: parseBool2(raw.enabled, "meetings.enabled", DEFAULT_MEETINGS_CONFIG.enabled),
708
+ appPatterns: parseAppPatterns(raw.appPatterns),
709
+ minOverlapMinutes: parseBoundedInt(
710
+ raw.minOverlapMinutes,
711
+ "meetings.minOverlapMinutes",
712
+ DEFAULT_MIN_OVERLAP_MINUTES,
713
+ 0,
714
+ 1440
715
+ ),
716
+ audioOnlyMinMinutes: parseBoundedInt(
717
+ raw.audioOnlyMinMinutes,
718
+ "meetings.audioOnlyMinMinutes",
719
+ DEFAULT_AUDIO_ONLY_MIN_MINUTES,
720
+ 1,
721
+ 1440
722
+ ),
723
+ mergeGapMinutes: parseBoundedInt(
724
+ raw.mergeGapMinutes,
725
+ "meetings.mergeGapMinutes",
726
+ DEFAULT_MERGE_GAP_MINUTES,
727
+ 0,
728
+ 1440
729
+ ),
730
+ contextDwellSeconds: parseBoundedInt(
731
+ raw.contextDwellSeconds,
732
+ "meetings.contextDwellSeconds",
733
+ DEFAULT_CONTEXT_DWELL_SECONDS,
734
+ 0,
735
+ 86400
736
+ ),
737
+ maxContextChars: parseBoundedInt(
738
+ raw.maxContextChars,
739
+ "meetings.maxContextChars",
740
+ DEFAULT_MAX_CONTEXT_CHARS,
741
+ 0,
742
+ 1e6
743
+ ),
744
+ summaryMode: parseSummaryMode(raw.summaryMode),
745
+ sourceTrust: parseTrust01(raw.sourceTrust, "meetings.sourceTrust", DEFAULT_SOURCE_TRUST2),
746
+ autoApproveTrust: parseTrust01(raw.autoApproveTrust, "meetings.autoApproveTrust", DEFAULT_AUTO_APPROVE_TRUST2),
747
+ reviewTrust: parseTrust01(raw.reviewTrust, "meetings.reviewTrust", DEFAULT_REVIEW_TRUST2)
748
+ };
749
+ if (config.autoApproveTrust < config.reviewTrust) {
750
+ throw new Error(
751
+ `meetings.autoApproveTrust (${config.autoApproveTrust}) must be >= meetings.reviewTrust (${config.reviewTrust}); an inverted gate would auto-approve below the review bar`
752
+ );
753
+ }
754
+ return config;
755
+ }
756
+
439
757
  // src/coding/coding-knowledge-config.ts
440
758
  var CODING_KNOWLEDGE_DEFAULTS = Object.freeze({
441
759
  enabled: false,
@@ -1442,6 +1760,7 @@ function parseConfig(raw, rawOperatorConfig, runtimeSet) {
1442
1760
  };
1443
1761
  const wearables = parseWearablesConfig(cfg.wearables);
1444
1762
  const activity = parseActivityConfig(cfg.activity);
1763
+ const meetings = parseMeetingsConfig(cfg.meetings);
1445
1764
  const provenance = parseProvenanceConfig(cfg.provenance);
1446
1765
  const rawCodingMode = cfg.codingMode && typeof cfg.codingMode === "object" && !Array.isArray(cfg.codingMode) ? cfg.codingMode : {};
1447
1766
  const codingProjectScopeRaw = coerceBool(rawCodingMode.projectScope);
@@ -2222,6 +2541,7 @@ function parseConfig(raw, rawOperatorConfig, runtimeSet) {
2222
2541
  dreamsPhases,
2223
2542
  procedural,
2224
2543
  wearables,
2544
+ meetings,
2225
2545
  activity,
2226
2546
  provenance,
2227
2547
  // At-rest encryption (#690): coerceBool handles CLI string "true" (#36).
@@ -3622,10 +3942,16 @@ export {
3622
3942
  defaultWearableFusionConfig,
3623
3943
  defaultWearablesConfig,
3624
3944
  parseWearablesConfig,
3945
+ DEFAULT_MEETING_APP_PATTERNS,
3946
+ DEFAULT_MEETINGS_DETECTION_CONFIG,
3947
+ meetingId,
3948
+ detectMeetings,
3949
+ DEFAULT_MEETINGS_CONFIG,
3950
+ parseMeetingsConfig,
3625
3951
  isOpenaiApiKeyDisabled,
3626
3952
  resolveEnvVars,
3627
3953
  DEFAULT_REASONING_MODEL,
3628
3954
  VALID_MEMORY_CATEGORIES,
3629
3955
  parseConfig
3630
3956
  };
3631
- //# sourceMappingURL=chunk-OFQUY5NZ.js.map
3957
+ //# sourceMappingURL=chunk-7M6APKJL.js.map