@remnic/core 9.3.732 → 9.3.734

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 (294) hide show
  1. package/dist/access-boundary.d.ts +10 -10
  2. package/dist/access-boundary.js +9 -9
  3. package/dist/access-cli.js +25 -23
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +10 -10
  6. package/dist/access-http.js +14 -14
  7. package/dist/access-mcp.d.ts +10 -10
  8. package/dist/access-mcp.js +13 -13
  9. package/dist/access-operations-batch.js +11 -11
  10. package/dist/access-operations.d.ts +10 -10
  11. package/dist/access-operations.js +12 -12
  12. package/dist/{access-service-Byoe3HsT.d.ts → access-service-rjFfmfKB.d.ts} +4 -4
  13. package/dist/access-service.d.ts +10 -10
  14. package/dist/access-service.js +8 -8
  15. package/dist/access-surface-catalog.d.ts +10 -10
  16. package/dist/action-confidence.d.ts +1 -1
  17. package/dist/active-memory-bridge.d.ts +1 -1
  18. package/dist/active-memory-bridge.js +3 -2
  19. package/dist/active-recall.d.ts +1 -1
  20. package/dist/behavior-learner.d.ts +1 -1
  21. package/dist/behavior-signals.d.ts +1 -1
  22. package/dist/bootstrap.d.ts +9 -9
  23. package/dist/briefing.d.ts +1 -1
  24. package/dist/buffer-surprise-report.d.ts +1 -1
  25. package/dist/buffer.d.ts +1 -1
  26. package/dist/calibration.d.ts +1 -1
  27. package/dist/capabilities.d.ts +97 -2
  28. package/dist/capabilities.js +11 -3
  29. package/dist/{catalog-DM1nk7cM.d.ts → catalog-DHYXzM4-.d.ts} +2 -2
  30. package/dist/causal-behavior.d.ts +1 -1
  31. package/dist/causal-consolidation.d.ts +1 -1
  32. package/dist/causal-trajectory-graph.d.ts +1 -1
  33. package/dist/{chunk-24D66MMN.js → chunk-2L5RTVMO.js} +7 -4
  34. package/dist/chunk-2L5RTVMO.js.map +1 -0
  35. package/dist/{chunk-KQYGNGON.js → chunk-3QETM5NG.js} +6 -3
  36. package/dist/chunk-3QETM5NG.js.map +1 -0
  37. package/dist/{chunk-ZQUAVZNG.js → chunk-54RCE5Z3.js} +7 -4
  38. package/dist/chunk-54RCE5Z3.js.map +1 -0
  39. package/dist/{chunk-NOU77OHX.js → chunk-5DIKZKOD.js} +2 -2
  40. package/dist/{chunk-CGPHMNL4.js → chunk-5OYHJIJN.js} +10 -6
  41. package/dist/chunk-5OYHJIJN.js.map +1 -0
  42. package/dist/{chunk-LUCARK4W.js → chunk-6U7TES2M.js} +29 -28
  43. package/dist/chunk-6U7TES2M.js.map +1 -0
  44. package/dist/{chunk-FFUCCKPN.js → chunk-7FPJFCXL.js} +10 -7
  45. package/dist/chunk-7FPJFCXL.js.map +1 -0
  46. package/dist/{chunk-PMAQRUN4.js → chunk-CILX2XW7.js} +5 -2
  47. package/dist/chunk-CILX2XW7.js.map +1 -0
  48. package/dist/{chunk-ZVHRSR2R.js → chunk-ET5HXSQL.js} +6 -3
  49. package/dist/chunk-ET5HXSQL.js.map +1 -0
  50. package/dist/{chunk-KSJCXXOU.js → chunk-FAGERSH2.js} +6 -3
  51. package/dist/chunk-FAGERSH2.js.map +1 -0
  52. package/dist/{chunk-FYWUNVFZ.js → chunk-IDIXGGDN.js} +6 -6
  53. package/dist/{chunk-CX77GNMB.js → chunk-IWMGBNXY.js} +6 -3
  54. package/dist/chunk-IWMGBNXY.js.map +1 -0
  55. package/dist/{chunk-GGL34GCW.js → chunk-IZLTOS5L.js} +7 -4
  56. package/dist/chunk-IZLTOS5L.js.map +1 -0
  57. package/dist/{chunk-HHNSLPX7.js → chunk-K7PAILHO.js} +10 -9
  58. package/dist/chunk-K7PAILHO.js.map +1 -0
  59. package/dist/{chunk-UZYLX7M6.js → chunk-LV32K4OP.js} +9 -6
  60. package/dist/chunk-LV32K4OP.js.map +1 -0
  61. package/dist/{chunk-HJWQJUKQ.js → chunk-NDYQIN6C.js} +3 -3
  62. package/dist/{chunk-DKT3X5C3.js → chunk-PEF2XOIV.js} +7 -4
  63. package/dist/chunk-PEF2XOIV.js.map +1 -0
  64. package/dist/{chunk-646B5ERJ.js → chunk-PKO5NJ65.js} +51 -48
  65. package/dist/chunk-PKO5NJ65.js.map +1 -0
  66. package/dist/{chunk-QZHF4BWN.js → chunk-Q5LGXWNG.js} +6 -6
  67. package/dist/{chunk-ESF7TRYJ.js → chunk-SHJGBAIW.js} +37 -2
  68. package/dist/{chunk-ESF7TRYJ.js.map → chunk-SHJGBAIW.js.map} +1 -1
  69. package/dist/{chunk-O4ZIBPIW.js → chunk-T7CGPTFU.js} +3 -3
  70. package/dist/{chunk-PLBIPT6I.js → chunk-TJSQHO4Q.js} +7 -4
  71. package/dist/chunk-TJSQHO4Q.js.map +1 -0
  72. package/dist/{chunk-6TUWSUUD.js → chunk-UF3N7IRP.js} +26 -24
  73. package/dist/chunk-UF3N7IRP.js.map +1 -0
  74. package/dist/{chunk-P3VJCTVE.js → chunk-UH3NYOHN.js} +4 -3
  75. package/dist/chunk-UH3NYOHN.js.map +1 -0
  76. package/dist/{chunk-J6BH2OBA.js → chunk-UK6U5C3N.js} +8 -5
  77. package/dist/chunk-UK6U5C3N.js.map +1 -0
  78. package/dist/{chunk-OTQE66IX.js → chunk-V5OVSGB6.js} +6 -3
  79. package/dist/chunk-V5OVSGB6.js.map +1 -0
  80. package/dist/{chunk-H3MB3F62.js → chunk-WHQ2JB35.js} +4 -3
  81. package/dist/chunk-WHQ2JB35.js.map +1 -0
  82. package/dist/{chunk-NIZQH6AU.js → chunk-WTTVFSCO.js} +8 -7
  83. package/dist/chunk-WTTVFSCO.js.map +1 -0
  84. package/dist/{chunk-OUITHS6V.js → chunk-Z7J3OAPR.js} +357 -325
  85. package/dist/chunk-Z7J3OAPR.js.map +1 -0
  86. package/dist/{cli-Dt-tuiYH.d.ts → cli-XVpmSoQs.d.ts} +3 -3
  87. package/dist/cli.d.ts +11 -11
  88. package/dist/cli.js +20 -20
  89. package/dist/compounding/engine.d.ts +3 -2
  90. package/dist/compounding/engine.js +2 -1
  91. package/dist/compounding/preference-consolidator.d.ts +1 -1
  92. package/dist/compression-optimizer.d.ts +1 -1
  93. package/dist/config.d.ts +1 -1
  94. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  95. package/dist/connectors/codex-materialize.d.ts +1 -1
  96. package/dist/connectors/index.d.ts +1 -1
  97. package/dist/consolidation-provenance-check.d.ts +1 -1
  98. package/dist/consolidation-undo.d.ts +1 -1
  99. package/dist/contradiction/index.d.ts +2 -2
  100. package/dist/contradiction/index.js +2 -1
  101. package/dist/{contradiction-scan-HWGEOUDS.js → contradiction-scan-OUHMCUBT.js} +3 -2
  102. package/dist/conversation-index/backend.d.ts +1 -1
  103. package/dist/conversation-index/chunker.d.ts +1 -1
  104. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  105. package/dist/conversation-index/indexer.d.ts +1 -1
  106. package/dist/conversation-index/search.d.ts +1 -1
  107. package/dist/day-summary.d.ts +1 -1
  108. package/dist/delinearize.d.ts +1 -1
  109. package/dist/direct-answer-wiring.d.ts +1 -1
  110. package/dist/direct-answer.d.ts +1 -1
  111. package/dist/embedding-fallback.d.ts +1 -1
  112. package/dist/embedding-fallback.js +2 -2
  113. package/dist/enrichment/index.d.ts +1 -1
  114. package/dist/entity-retrieval.d.ts +1 -1
  115. package/dist/entity-retrieval.js +2 -1
  116. package/dist/entity-schema.d.ts +1 -1
  117. package/dist/explicit-capture.d.ts +9 -9
  118. package/dist/explicit-capture.js +2 -1
  119. package/dist/extraction-faithfulness.d.ts +1 -1
  120. package/dist/extraction-judge-telemetry.d.ts +1 -1
  121. package/dist/extraction-judge-training.d.ts +1 -1
  122. package/dist/extraction-judge.d.ts +1 -1
  123. package/dist/extraction.d.ts +1 -1
  124. package/dist/extraction.js +3 -3
  125. package/dist/fallback-llm.d.ts +1 -1
  126. package/dist/{first-start-migration-OOR57AYR.js → first-start-migration-W4U6XDKI.js} +7 -6
  127. package/dist/first-start-migration-W4U6XDKI.js.map +1 -0
  128. package/dist/graph-dashboard-diff.d.ts +1 -1
  129. package/dist/graph-dashboard-key.d.ts +1 -1
  130. package/dist/graph-dashboard-parser.d.ts +1 -1
  131. package/dist/graph-edge-reinforcement.d.ts +1 -1
  132. package/dist/graph-snapshot.d.ts +1 -1
  133. package/dist/graph.d.ts +1 -1
  134. package/dist/identity-continuity.d.ts +1 -1
  135. package/dist/importance.d.ts +1 -1
  136. package/dist/index.d.ts +12 -12
  137. package/dist/index.js +43 -43
  138. package/dist/intent.d.ts +1 -1
  139. package/dist/lcm/engine.d.ts +1 -1
  140. package/dist/lcm/index.d.ts +1 -1
  141. package/dist/lcm/tools.d.ts +1 -1
  142. package/dist/lifecycle.d.ts +1 -1
  143. package/dist/live-connectors-runner.d.ts +1 -1
  144. package/dist/local-llm.d.ts +1 -1
  145. package/dist/local-llm.js +2 -1
  146. package/dist/local-model-endpoint.d.ts +1 -1
  147. package/dist/maintenance/memory-governance.d.ts +1 -1
  148. package/dist/mcp-memory-inspector-app.d.ts +10 -10
  149. package/dist/memory-action-policy.d.ts +1 -1
  150. package/dist/memory-cache.d.ts +1 -1
  151. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  152. package/dist/memory-projection-store.d.ts +1 -1
  153. package/dist/memory-provenance.d.ts +1 -1
  154. package/dist/memory-worth-outcomes.d.ts +1 -1
  155. package/dist/models-json.d.ts +1 -1
  156. package/dist/namespaces/migrate.d.ts +2 -2
  157. package/dist/namespaces/migrate.js +6 -6
  158. package/dist/namespaces/principal.d.ts +1 -1
  159. package/dist/namespaces/principal.js +2 -1
  160. package/dist/namespaces/search.d.ts +1 -1
  161. package/dist/namespaces/search.js +4 -4
  162. package/dist/namespaces/storage.d.ts +2 -2
  163. package/dist/namespaces/storage.js +2 -1
  164. package/dist/native-knowledge.d.ts +1 -1
  165. package/dist/operator-toolkit.d.ts +1 -1
  166. package/dist/operator-toolkit.js +11 -11
  167. package/dist/orchestration/compression-guideline-coordinator.d.ts +1 -1
  168. package/dist/orchestration/maintenance.d.ts +2 -2
  169. package/dist/orchestration/maintenance.js +6 -5
  170. package/dist/{orchestrator-B4KjaOtY.d.ts → orchestrator-BXi-gadS.d.ts} +66 -5
  171. package/dist/orchestrator.d.ts +5 -5
  172. package/dist/orchestrator.js +20 -18
  173. package/dist/patterns-cli.d.ts +1 -1
  174. package/dist/policy-runtime.d.ts +1 -1
  175. package/dist/provenance.d.ts +1 -1
  176. package/dist/qmd-recall-cache.d.ts +1 -1
  177. package/dist/qmd.d.ts +1 -1
  178. package/dist/recall-disclosure-escalation.d.ts +1 -1
  179. package/dist/recall-explain-renderer.d.ts +1 -1
  180. package/dist/recall-planner-llm.d.ts +1 -1
  181. package/dist/recall-state.d.ts +1 -1
  182. package/dist/recall-tag-filter.d.ts +1 -1
  183. package/dist/recall-xray-cli.d.ts +1 -1
  184. package/dist/recall-xray-renderer.d.ts +1 -1
  185. package/dist/recall-xray.d.ts +1 -1
  186. package/dist/resolve-auth-token.d.ts +1 -1
  187. package/dist/retrieval-agents.d.ts +1 -1
  188. package/dist/retrieval-tiers.d.ts +1 -1
  189. package/dist/routing/engine.d.ts +1 -1
  190. package/dist/routing/store.d.ts +1 -1
  191. package/dist/schemas.d.ts +22 -22
  192. package/dist/search/embed-helper.d.ts +1 -1
  193. package/dist/search/embed-helper.js +2 -2
  194. package/dist/search/factory.d.ts +1 -1
  195. package/dist/search/factory.js +3 -3
  196. package/dist/search/index.d.ts +1 -1
  197. package/dist/search/index.js +3 -3
  198. package/dist/search/lancedb-backend.d.ts +1 -1
  199. package/dist/search/meilisearch-backend.d.ts +1 -1
  200. package/dist/search/noop-backend.d.ts +1 -1
  201. package/dist/search/orama-backend.d.ts +1 -1
  202. package/dist/search/port.d.ts +1 -1
  203. package/dist/search/remote-backend.d.ts +1 -1
  204. package/dist/{semantic-SLAa_prH.d.ts → semantic-DJR8_DMQ.d.ts} +1 -1
  205. package/dist/{semantic-consolidation-CstTvHPo.d.ts → semantic-consolidation-DeL5grLx.d.ts} +1 -1
  206. package/dist/semantic-consolidation.d.ts +2 -2
  207. package/dist/semantic-rule-verifier.d.ts +1 -1
  208. package/dist/session-observer-bands.d.ts +1 -1
  209. package/dist/session-observer-state.d.ts +1 -1
  210. package/dist/shared-context/manager.d.ts +1 -1
  211. package/dist/signal.d.ts +1 -1
  212. package/dist/storage.d.ts +1 -1
  213. package/dist/summarizer.d.ts +1 -1
  214. package/dist/summarizer.js +3 -2
  215. package/dist/summary-snapshot.d.ts +1 -1
  216. package/dist/temporal-supersession.d.ts +1 -1
  217. package/dist/temporal-validity.d.ts +1 -1
  218. package/dist/threading.d.ts +1 -1
  219. package/dist/tier-migration.d.ts +1 -1
  220. package/dist/tier-routing.d.ts +1 -1
  221. package/dist/{tier-stats-3LYQ3VV5.js → tier-stats-LSM35HZY.js} +5 -2
  222. package/dist/tier-stats-LSM35HZY.js.map +1 -0
  223. package/dist/topics.d.ts +1 -1
  224. package/dist/transcript.d.ts +1 -1
  225. package/dist/transfer/types.d.ts +12 -12
  226. package/dist/trust-score-stage.d.ts +1 -1
  227. package/dist/trust-score.d.ts +1 -1
  228. package/dist/{types-VkxElCHR.d.ts → types-CpFz51Pv.d.ts} +1 -1
  229. package/dist/types.d.ts +1 -1
  230. package/dist/utility-runtime.d.ts +1 -1
  231. package/package.json +2 -2
  232. package/src/access-service.ts +42 -37
  233. package/src/active-memory-bridge.ts +2 -1
  234. package/src/admin/admin-surfaces.ts +2 -1
  235. package/src/capabilities.test.ts +178 -0
  236. package/src/capabilities.ts +197 -0
  237. package/src/cli.ts +13 -9
  238. package/src/compounding/engine.ts +4 -3
  239. package/src/contradiction/contradiction-scan.ts +4 -3
  240. package/src/embedding-fallback.ts +5 -2
  241. package/src/entity-retrieval.ts +3 -2
  242. package/src/explicit-capture.ts +2 -1
  243. package/src/extraction.ts +6 -3
  244. package/src/local-llm.ts +4 -3
  245. package/src/maintenance/first-start-migration.ts +6 -3
  246. package/src/maintenance/namespace-maintenance-fanout.ts +2 -1
  247. package/src/maintenance/namespace-planner.ts +4 -3
  248. package/src/maintenance/tier-stats.ts +2 -1
  249. package/src/namespaces/catalog.ts +2 -1
  250. package/src/namespaces/migrate.ts +2 -1
  251. package/src/namespaces/principal.ts +6 -5
  252. package/src/namespaces/scope-profiles.ts +2 -1
  253. package/src/namespaces/search.ts +2 -1
  254. package/src/namespaces/storage.ts +4 -3
  255. package/src/operator-toolkit.ts +19 -18
  256. package/src/orchestration/maintenance.ts +8 -4
  257. package/src/orchestration/semantic-consolidation-coordinator.ts +454 -0
  258. package/src/orchestration/tier-migration-coordinator.ts +5 -4
  259. package/src/orchestrator.ts +78 -417
  260. package/src/scopes/scope-plan.ts +3 -2
  261. package/src/search/embed-helper.ts +5 -2
  262. package/src/search/factory.ts +9 -6
  263. package/src/summarizer.ts +3 -2
  264. package/dist/chunk-24D66MMN.js.map +0 -1
  265. package/dist/chunk-646B5ERJ.js.map +0 -1
  266. package/dist/chunk-6TUWSUUD.js.map +0 -1
  267. package/dist/chunk-CGPHMNL4.js.map +0 -1
  268. package/dist/chunk-CX77GNMB.js.map +0 -1
  269. package/dist/chunk-DKT3X5C3.js.map +0 -1
  270. package/dist/chunk-FFUCCKPN.js.map +0 -1
  271. package/dist/chunk-GGL34GCW.js.map +0 -1
  272. package/dist/chunk-H3MB3F62.js.map +0 -1
  273. package/dist/chunk-HHNSLPX7.js.map +0 -1
  274. package/dist/chunk-J6BH2OBA.js.map +0 -1
  275. package/dist/chunk-KQYGNGON.js.map +0 -1
  276. package/dist/chunk-KSJCXXOU.js.map +0 -1
  277. package/dist/chunk-LUCARK4W.js.map +0 -1
  278. package/dist/chunk-NIZQH6AU.js.map +0 -1
  279. package/dist/chunk-OTQE66IX.js.map +0 -1
  280. package/dist/chunk-OUITHS6V.js.map +0 -1
  281. package/dist/chunk-P3VJCTVE.js.map +0 -1
  282. package/dist/chunk-PLBIPT6I.js.map +0 -1
  283. package/dist/chunk-PMAQRUN4.js.map +0 -1
  284. package/dist/chunk-UZYLX7M6.js.map +0 -1
  285. package/dist/chunk-ZQUAVZNG.js.map +0 -1
  286. package/dist/chunk-ZVHRSR2R.js.map +0 -1
  287. package/dist/first-start-migration-OOR57AYR.js.map +0 -1
  288. package/dist/tier-stats-3LYQ3VV5.js.map +0 -1
  289. /package/dist/{chunk-NOU77OHX.js.map → chunk-5DIKZKOD.js.map} +0 -0
  290. /package/dist/{chunk-FYWUNVFZ.js.map → chunk-IDIXGGDN.js.map} +0 -0
  291. /package/dist/{chunk-HJWQJUKQ.js.map → chunk-NDYQIN6C.js.map} +0 -0
  292. /package/dist/{chunk-QZHF4BWN.js.map → chunk-Q5LGXWNG.js.map} +0 -0
  293. /package/dist/{chunk-O4ZIBPIW.js.map → chunk-T7CGPTFU.js.map} +0 -0
  294. /package/dist/{contradiction-scan-HWGEOUDS.js.map → contradiction-scan-OUHMCUBT.js.map} +0 -0
@@ -1,3 +1,6 @@
1
+ import {
2
+ resolveNamespaceCapabilities
3
+ } from "./chunk-SHJGBAIW.js";
1
4
  import {
2
5
  isLikelyUnsafeRegex
3
6
  } from "./chunk-U3PN77QT.js";
@@ -13,7 +16,7 @@ function compileSafePrincipalRegex(pattern) {
13
16
  }
14
17
  }
15
18
  function resolvePrincipal(sessionKey, config) {
16
- if (!config.namespacesEnabled) return "default";
19
+ if (!resolveNamespaceCapabilities(config).namespaces) return "default";
17
20
  const sk = typeof sessionKey === "string" && sessionKey.trim().length > 0 ? sessionKey : "";
18
21
  const mode = config.principalFromSessionKeyMode;
19
22
  const rules = config.principalFromSessionKeyRules ?? [];
@@ -44,28 +47,28 @@ function resolvePrincipal(sessionKey, config) {
44
47
  return "default";
45
48
  }
46
49
  function canReadNamespace(principal, namespace, config) {
47
- if (!config.namespacesEnabled) return true;
50
+ if (!resolveNamespaceCapabilities(config).namespaces) return true;
48
51
  if (!principal) return false;
49
52
  const policy = config.namespacePolicies.find((p) => p.name === namespace);
50
53
  if (!policy) return namespace === config.defaultNamespace || namespace === config.sharedNamespace;
51
54
  return policy.readPrincipals.includes(principal) || policy.readPrincipals.includes("*");
52
55
  }
53
56
  function canWriteNamespace(principal, namespace, config) {
54
- if (!config.namespacesEnabled) return true;
57
+ if (!resolveNamespaceCapabilities(config).namespaces) return true;
55
58
  if (!principal) return false;
56
59
  const policy = config.namespacePolicies.find((p) => p.name === namespace);
57
60
  if (!policy) return namespace === config.defaultNamespace;
58
61
  return policy.writePrincipals.includes(principal) || policy.writePrincipals.includes("*");
59
62
  }
60
63
  function defaultNamespaceForPrincipal(principal, config) {
61
- if (!config.namespacesEnabled) return config.defaultNamespace;
64
+ if (!resolveNamespaceCapabilities(config).namespaces) return config.defaultNamespace;
62
65
  if (!principal) return config.defaultNamespace;
63
66
  const exists = config.namespacePolicies.some((p) => p.name === principal);
64
67
  return exists ? principal : config.defaultNamespace;
65
68
  }
66
69
  function recallNamespacesForPrincipal(principal, config) {
67
70
  const out = [];
68
- if (!config.namespacesEnabled) return [config.defaultNamespace];
71
+ if (!resolveNamespaceCapabilities(config).namespaces) return [config.defaultNamespace];
69
72
  if (!principal) return out;
70
73
  const selfNs = defaultNamespaceForPrincipal(principal, config);
71
74
  if (config.defaultRecallNamespaces.includes("self") && canReadNamespace(principal, selfNs, config)) {
@@ -89,4 +92,4 @@ export {
89
92
  defaultNamespaceForPrincipal,
90
93
  recallNamespacesForPrincipal
91
94
  };
92
- //# sourceMappingURL=chunk-UZYLX7M6.js.map
95
+ //# sourceMappingURL=chunk-LV32K4OP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/namespaces/principal.ts"],"sourcesContent":["import { resolveNamespaceCapabilities } from \"../capabilities.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { isLikelyUnsafeRegex } from \"../routing/engine.js\";\n\nconst MAX_REGEX_SESSION_KEY_LENGTH = 512;\n\nfunction compileSafePrincipalRegex(pattern: string): RegExp | null {\n if (isLikelyUnsafeRegex(pattern)) return null;\n try {\n return new RegExp(pattern);\n } catch {\n return null;\n }\n}\n\nexport function resolvePrincipal(sessionKey: string | undefined, config: PluginConfig): string | undefined {\n if (!resolveNamespaceCapabilities(config).namespaces) return \"default\";\n const sk = typeof sessionKey === \"string\" && sessionKey.trim().length > 0\n ? sessionKey\n : \"\";\n const mode = config.principalFromSessionKeyMode;\n const rules = config.principalFromSessionKeyRules ?? [];\n\n if (!sk) return undefined;\n\n if (mode === \"prefix\") {\n for (const r of rules) {\n if (sk.startsWith(r.match)) return r.principal;\n }\n } else if (mode === \"map\") {\n for (const r of rules) {\n if (sk === r.match) return r.principal;\n }\n } else if (mode === \"regex\") {\n if (sk.length <= MAX_REGEX_SESSION_KEY_LENGTH) {\n for (const r of rules) {\n const re = compileSafePrincipalRegex(r.match);\n if (re?.test(sk)) {\n return r.principal;\n }\n }\n }\n }\n\n // Fallback heuristic: \"agent:<agentId>:<channelType>:...\"\n const parts = sk.split(\":\");\n if (parts.length >= 2 && parts[0] === \"agent\") {\n const agentId = parts[1];\n if (agentId && agentId.length > 0) return agentId;\n }\n return \"default\";\n}\n\nexport function canReadNamespace(principal: string | undefined, namespace: string, config: PluginConfig): boolean {\n if (!resolveNamespaceCapabilities(config).namespaces) return true;\n if (!principal) return false;\n const policy = config.namespacePolicies.find((p) => p.name === namespace);\n if (!policy) return namespace === config.defaultNamespace || namespace === config.sharedNamespace;\n return policy.readPrincipals.includes(principal) || policy.readPrincipals.includes(\"*\");\n}\n\nexport function canWriteNamespace(principal: string | undefined, namespace: string, config: PluginConfig): boolean {\n if (!resolveNamespaceCapabilities(config).namespaces) return true;\n if (!principal) return false;\n const policy = config.namespacePolicies.find((p) => p.name === namespace);\n if (!policy) return namespace === config.defaultNamespace;\n return policy.writePrincipals.includes(principal) || policy.writePrincipals.includes(\"*\");\n}\n\n/**\n * Default \"self\" namespace for a principal.\n *\n * Heuristic:\n * - If there's a namespace policy with the same name as the principal, use it.\n * - Otherwise use config.defaultNamespace.\n */\nexport function defaultNamespaceForPrincipal(principal: string | undefined, config: PluginConfig): string {\n if (!resolveNamespaceCapabilities(config).namespaces) return config.defaultNamespace;\n if (!principal) return config.defaultNamespace;\n const exists = config.namespacePolicies.some((p) => p.name === principal);\n return exists ? principal : config.defaultNamespace;\n}\n\nexport function recallNamespacesForPrincipal(principal: string | undefined, config: PluginConfig): string[] {\n const out: string[] = [];\n if (!resolveNamespaceCapabilities(config).namespaces) return [config.defaultNamespace];\n if (!principal) return out;\n\n const selfNs = defaultNamespaceForPrincipal(principal, config);\n if (config.defaultRecallNamespaces.includes(\"self\") && canReadNamespace(principal, selfNs, config)) {\n out.push(selfNs);\n }\n if (config.defaultRecallNamespaces.includes(\"shared\") && canReadNamespace(principal, config.sharedNamespace, config)) {\n out.push(config.sharedNamespace);\n }\n\n for (const p of config.namespacePolicies) {\n if (p.includeInRecallByDefault && canReadNamespace(principal, p.name, config)) {\n if (!out.includes(p.name)) out.push(p.name);\n }\n }\n\n return out;\n}\n"],"mappings":"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","names":[]}
@@ -3,13 +3,13 @@ import {
3
3
  } from "./chunk-FVZ2ISIX.js";
4
4
  import {
5
5
  defineOperation
6
- } from "./chunk-NOU77OHX.js";
6
+ } from "./chunk-5DIKZKOD.js";
7
7
  import {
8
8
  DECISION_SUBCOMMANDS,
9
9
  DELTA_SUBCOMMANDS,
10
10
  EngramAccessInputError,
11
11
  isCodegraphToolName
12
- } from "./chunk-646B5ERJ.js";
12
+ } from "./chunk-PKO5NJ65.js";
13
13
  import {
14
14
  CorrectionContractError
15
15
  } from "./chunk-WNGXQMRI.js";
@@ -465,4 +465,4 @@ export {
465
465
  codegraphIngestTracesOperation,
466
466
  REGISTERED_OPERATIONS
467
467
  };
468
- //# sourceMappingURL=chunk-HJWQJUKQ.js.map
468
+ //# sourceMappingURL=chunk-NDYQIN6C.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-PWFWCGOO.js";
9
9
  import {
10
10
  LocalLlmClient
11
- } from "./chunk-24D66MMN.js";
11
+ } from "./chunk-2L5RTVMO.js";
12
12
  import {
13
13
  sessionStoragePaths
14
14
  } from "./chunk-S4DDLTPX.js";
@@ -24,6 +24,9 @@ import {
24
24
  import {
25
25
  extractJsonCandidates
26
26
  } from "./chunk-RGMVMVMF.js";
27
+ import {
28
+ resolveLocalLlmCapabilities
29
+ } from "./chunk-SHJGBAIW.js";
27
30
  import {
28
31
  log
29
32
  } from "./chunk-NU3CSQ4H.js";
@@ -61,7 +64,7 @@ var HourlySummarizer = class {
61
64
  gatewayConfig,
62
65
  fallbackLlmRuntimeContextFromConfig(config)
63
66
  );
64
- if (!gatewayConfig?.agents?.defaults?.model?.primary && !config.localLlmEnabled && config.modelSource !== "gateway") {
67
+ if (!gatewayConfig?.agents?.defaults?.model?.primary && !resolveLocalLlmCapabilities(config).localLlm && config.modelSource !== "gateway") {
65
68
  log.warn("no gateway default AI and local LLM disabled \u2014 hourly summarization disabled");
66
69
  }
67
70
  }
@@ -69,7 +72,7 @@ var HourlySummarizer = class {
69
72
  return this.config.modelSource === "gateway";
70
73
  }
71
74
  get shouldUseLocalLlm() {
72
- return this.config.localLlmEnabled && !this.useGatewayModelSource;
75
+ return resolveLocalLlmCapabilities(this.config).localLlm && !this.useGatewayModelSource;
73
76
  }
74
77
  withGatewayAgent(options) {
75
78
  if (!this.useGatewayModelSource) return options;
@@ -686,4 +689,4 @@ ${truncatedConversation}`;
686
689
  export {
687
690
  HourlySummarizer
688
691
  };
689
- //# sourceMappingURL=chunk-DKT3X5C3.js.map
692
+ //# sourceMappingURL=chunk-PEF2XOIV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/summarizer.ts"],"sourcesContent":["import { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { log } from \"./logger.js\";\nimport { LocalLlmClient } from \"./local-llm.js\";\nimport { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig, gatewayTaskChainOptions } from \"./fallback-llm.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { extractJsonCandidates } from \"./json-extract.js\";\nimport type { HourlySummary, TranscriptEntry, PluginConfig, GatewayConfig } from \"./types.js\";\nimport type { TranscriptManager } from \"./transcript.js\";\nimport { readSummarySnapshot, upsertSummarySnapshot, writeSummarySnapshot } from \"./summary-snapshot.js\";\nimport {\n encodeStoragePathSegment,\n resolveSafeStoragePath,\n} from \"./storage-paths.js\";\nimport { sessionStoragePaths } from \"./session-identity.js\";\nimport { resolveLocalLlmCapabilities } from \"./capabilities.js\";\n\n// Schema for LLM summary output\nconst HourlySummarySchema = z.object({\n bullets: z\n .array(z.string().trim().min(1))\n .min(1)\n .describe(\"3-5 bullet points summarizing the hour's activity\"),\n});\n\ntype HourlySummaryResult = z.infer<typeof HourlySummarySchema>;\n\nconst HourlySummaryExtendedSchema = z.object({\n topics: z.array(z.string()).default([]),\n decisions: z.array(z.string()).default([]),\n actionItems: z.array(z.string()).default([]),\n rejected: z.array(z.string()).default([]),\n});\n\ntype HourlySummaryExtendedResult = z.infer<typeof HourlySummaryExtendedSchema>;\n\ntype HourlySummaryExtendedMeta = {\n userTurns: number;\n assistantTurns: number;\n toolCalls: number;\n toolCounts: Record<string, number>;\n};\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport class HourlySummarizer {\n private summariesDir: string;\n private config: PluginConfig;\n private localLlm: LocalLlmClient;\n private fallbackLlm: FallbackLlmClient;\n private modelRegistry: ModelRegistry;\n private transcript?: TranscriptManager;\n\n constructor(config: PluginConfig, gatewayConfig?: GatewayConfig, modelRegistry?: ModelRegistry, transcript?: TranscriptManager) {\n this.config = config;\n this.summariesDir = path.join(config.memoryDir, \"summaries\", \"hourly\");\n this.modelRegistry = modelRegistry ?? new ModelRegistry(config.memoryDir);\n this.transcript = transcript;\n\n // Initialize local LLM client with shared model registry\n this.localLlm = new LocalLlmClient(config, this.modelRegistry);\n\n // Initialize fallback client with gateway config\n this.fallbackLlm = new FallbackLlmClient(\n gatewayConfig,\n fallbackLlmRuntimeContextFromConfig(config),\n );\n\n if (!gatewayConfig?.agents?.defaults?.model?.primary && !resolveLocalLlmCapabilities(config).localLlm && config.modelSource !== \"gateway\") {\n log.warn(\"no gateway default AI and local LLM disabled — hourly summarization disabled\");\n }\n }\n\n private get useGatewayModelSource(): boolean {\n return this.config.modelSource === \"gateway\";\n }\n\n private get shouldUseLocalLlm(): boolean {\n return resolveLocalLlmCapabilities(this.config).localLlm && !this.useGatewayModelSource;\n }\n\n private withGatewayAgent(options: import(\"./fallback-llm.js\").FallbackLlmOptions): import(\"./fallback-llm.js\").FallbackLlmOptions {\n if (!this.useGatewayModelSource) return options;\n // Shared resolution (taskModelChain > gatewayAgentId) — gotcha #22. Issue #1365.\n return { ...options, ...gatewayTaskChainOptions(this.config) };\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.summariesDir, { recursive: true });\n log.info(\"hourly summarizer initialized\");\n }\n\n private async summarySessionDir(sessionKey: string): Promise<string> {\n return resolveSafeStoragePath(\n this.summariesDir,\n encodeStoragePathSegment(sessionKey, \"session\"),\n );\n }\n\n private async legacySummarySessionDir(sessionKey: string): Promise<string | null> {\n if (sessionKey.includes(\"\\0\")) return null;\n try {\n return await resolveSafeStoragePath(this.summariesDir, sessionKey);\n } catch {\n return null;\n }\n }\n\n private summaryDateString(hour: string): string {\n const dateStr = hour.slice(0, 10);\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(dateStr)) {\n throw new Error(`invalid hourly summary timestamp: ${hour}`);\n }\n return dateStr;\n }\n\n // Generate summary for a specific hour and session\n async generateSummary(\n sessionKey: string,\n hourStart: Date,\n entries: TranscriptEntry[]\n ): Promise<HourlySummary | null> {\n if (entries.length === 0) return null;\n\n // Format entries for the LLM\n const conversation = entries\n .map((e) => `[${e.role}] ${e.content}`)\n .join(\"\\n\\n\");\n\n if (this.config.hourlySummariesExtendedEnabled) {\n const extended = await this.generateExtended(sessionKey, hourStart, conversation, entries);\n if (!extended) return null;\n const meta: HourlySummaryExtendedMeta = {\n userTurns: entries.filter((e) => e.role === \"user\").length,\n assistantTurns: entries.filter((e) => e.role === \"assistant\").length,\n toolCalls: extended._meta.toolCalls,\n toolCounts: extended._meta.toolCounts,\n };\n // Keep HourlySummary surface stable; encode \"topics\" as bullets for recall injection.\n const base: HourlySummary = {\n hour: hourStart.toISOString(),\n sessionKey,\n bullets: extended.topics.length > 0 ? extended.topics.slice(0, 5) : [\"(summary generated)\"],\n turnCount: entries.length,\n generatedAt: new Date().toISOString(),\n };\n const withExtras = base as any;\n withExtras._extended = extended;\n withExtras._extendedMeta = meta;\n return base;\n }\n\n const hourIso = hourStart.toISOString();\n const startTime = Date.now();\n\n // Try local LLM first if enabled\n if (this.shouldUseLocalLlm) {\n try {\n const localResult = await this.generateWithLocalLlm(conversation);\n if (localResult) {\n const durationMs = Date.now() - startTime;\n log.debug(\n `generated hourly summary for ${sessionKey} at ${hourIso} in ${durationMs}ms using local LLM`\n );\n return {\n hour: hourIso,\n sessionKey,\n bullets: localResult.bullets,\n turnCount: entries.length,\n generatedAt: new Date().toISOString(),\n };\n }\n // Local failed, fall back if allowed\n if (!this.config.localLlmFallback) {\n log.warn(\"summary generation: local LLM failed and fallback disabled\");\n return null;\n }\n log.info(\"summary generation: local LLM unavailable, falling back to gateway default AI\");\n } catch (err) {\n if (!this.config.localLlmFallback) {\n log.warn(\"summary generation: local LLM error and fallback disabled:\", err);\n return null;\n }\n log.info(\"summary generation: local LLM error, falling back to gateway default AI:\", err);\n }\n }\n\n // Fall back to gateway's default AI\n log.info(\"summary generation: falling back to gateway default AI\");\n\n try {\n const messages = [\n {\n role: \"system\" as const,\n content: `You are a conversation summarization system. Summarize the following conversation transcript into 3-5 concise bullet points.\n\nGuidelines:\n- Focus on what was accomplished, decided, or discussed\n- Include specific topics, projects, or entities mentioned\n- Note any significant user requests or agent actions\n- Keep bullets brief but informative (1-2 sentences each)\n- Skip trivial greetings or meta-conversation\n- Use present tense for ongoing work, past for completed items\n\nRespond with valid JSON matching this schema:\n{\n \"bullets\": [\"bullet 1\", \"bullet 2\", \"bullet 3\"]\n}`,\n },\n { role: \"user\" as const, content: `Summarize this conversation:\\n\\n${conversation}` },\n ];\n\n const result = await this.fallbackLlm.parseWithSchema(\n messages,\n HourlySummarySchema,\n this.withGatewayAgent({ temperature: 0.3, maxTokens: 8192 }),\n );\n\n const durationMs = Date.now() - startTime;\n\n if (result) {\n log.debug(\n `generated hourly summary for ${sessionKey} at ${hourIso} in ${durationMs}ms via fallback`,\n );\n return {\n hour: hourIso,\n sessionKey,\n bullets: result.bullets,\n turnCount: entries.length,\n generatedAt: new Date().toISOString(),\n };\n }\n\n log.warn(\"summary generation fallback returned no parsed output\");\n return null;\n } catch (err) {\n log.error(\"summary generation fallback failed\", err);\n return null;\n }\n }\n\n private async generateExtended(\n sessionKey: string,\n hourStart: Date,\n conversation: string,\n entries: TranscriptEntry[],\n ): Promise<(HourlySummaryExtendedResult & { _meta: HourlySummaryExtendedMeta }) | null> {\n const hourIso = hourStart.toISOString();\n const startTime = Date.now();\n\n const hourEnd = new Date(hourStart.getTime() + 60 * 60 * 1000);\n let toolCounts: Record<string, number> = {};\n if (this.config.hourlySummariesIncludeToolStats && this.transcript) {\n const uses = await this.transcript.readToolUse(sessionKey, hourStart, hourEnd);\n for (const u of uses) toolCounts[u.tool] = (toolCounts[u.tool] ?? 0) + 1;\n }\n\n const sys = `You are a conversation summarization system.\\n\\nSummarize the hour into structured sections.\\n\\nReturn valid JSON matching:\\n{\\n \\\"topics\\\": [\\\"...\\\"],\\n \\\"decisions\\\": [\\\"...\\\"],\\n \\\"actionItems\\\": [\\\"...\\\"],\\n \\\"rejected\\\": [\\\"...\\\"]\\n}\\n\\nGuidelines:\\n- Prefer concrete topics and decisions.\\n- Action items should be imperative.\\n- Rejected ideas are things that were explicitly discarded or reversed.\\n- If there are none for a section, return an empty array.\\n`;\n\n const toolStatsLine = Object.keys(toolCounts).length > 0\n ? `Tools used (counts): ${Object.entries(toolCounts).sort((a,b)=>b[1]-a[1]).slice(0,10).map(([k,v])=>`${k}=${v}`).join(\", \")}\\n\\n`\n : \"\";\n const userTurns = entries.filter((e) => e.role === \"user\").length;\n const assistantTurns = entries.filter((e) => e.role === \"assistant\").length;\n const toolCalls = Object.values(toolCounts).reduce((a,b)=>a+b,0);\n const statsLine = `Stats: userTurns=${userTurns}, assistantTurns=${assistantTurns}, toolCalls=${toolCalls}\\n\\n`;\n\n const user = `Hour: ${hourIso}\\nSession: ${sessionKey}\\n\\n${statsLine}${toolStatsLine}Conversation:\\n${conversation}\\n`;\n\n // Try local LLM first if enabled\n if (this.shouldUseLocalLlm) {\n try {\n const contextSizes = this.modelRegistry.calculateContextSizes(this.config.localLlmModel, this.config.localLlmMaxContext);\n const truncated = user.length > contextSizes.maxInputChars ? user.slice(0, contextSizes.maxInputChars) + \"\\n\\n[truncated]\" : user;\n const response = await this.localLlm.chatCompletion(\n [\n { role: \"system\", content: \"Output valid JSON only.\" },\n { role: \"user\", content: sys + \"\\n\\n\" + truncated },\n ],\n {\n temperature: 0.2,\n maxTokens: contextSizes.maxOutputTokens,\n operation: \"hourly_summary_extended\",\n priority: \"background\",\n },\n );\n if (response?.content) {\n const content = response.content.trim();\n for (const candidate of extractJsonCandidates(content)) {\n try {\n const parsed = JSON.parse(candidate);\n const result = HourlySummaryExtendedSchema.parse(parsed);\n log.debug(\n `generated extended hourly summary for ${sessionKey} at ${hourIso} in ${Date.now() - startTime}ms (local)`,\n );\n return { ...result, _meta: { userTurns, assistantTurns, toolCalls, toolCounts } };\n } catch {\n // keep trying candidates\n }\n }\n }\n } catch (err) {\n if (!this.config.localLlmFallback) return null;\n log.info(\"extended summary: local failed, falling back:\", err);\n }\n }\n\n try {\n const result = await this.fallbackLlm.parseWithSchema(\n [\n { role: \"system\" as const, content: sys },\n { role: \"user\" as const, content: user },\n ],\n HourlySummaryExtendedSchema,\n this.withGatewayAgent({ temperature: 0.2, maxTokens: 2048 }),\n );\n if (result) {\n log.debug(`generated extended hourly summary for ${sessionKey} at ${hourIso} in ${Date.now() - startTime}ms (fallback)`);\n return { ...result, _meta: { userTurns, assistantTurns, toolCalls, toolCounts } };\n }\n return null;\n } catch (err) {\n log.error(\"extended summary generation failed\", err);\n return null;\n }\n }\n\n /**\n * Generate summary using local LLM with JSON mode.\n * Uses dynamic context sizing based on model capabilities.\n */\n private async generateWithLocalLlm(conversation: string): Promise<HourlySummaryResult | null> {\n // Get dynamic context sizes based on model capabilities\n const contextSizes = this.modelRegistry.calculateContextSizes(\n this.config.localLlmModel,\n this.config.localLlmMaxContext\n );\n log.debug(`Summarizer model context: ${contextSizes.description}`);\n\n const maxConversationChars = contextSizes.maxInputChars;\n const truncatedConversation = conversation.length > maxConversationChars\n ? conversation.slice(0, maxConversationChars) + \"\\n\\n[truncated]\"\n : conversation;\n\n const instructions = `You are a conversation summarization system. Summarize the following conversation transcript into 3-5 concise bullet points.\n\nGuidelines:\n- Focus on what was accomplished, decided, or discussed\n- Include specific topics, projects, or entities mentioned\n- Note any significant user requests or agent actions\n- Keep bullets brief but informative (1-2 sentences each)\n- Skip trivial greetings or meta-conversation\n- Use present tense for ongoing work, past for completed items\n\nRespond with valid JSON matching this schema:\n{\n \"bullets\": [\"bullet 1\", \"bullet 2\", \"bullet 3\"]\n}`;\n\n const fullPrompt = `${instructions}\\n\\nConversation to summarize:\\n${truncatedConversation}`;\n\n const response = await this.localLlm.chatCompletion(\n [\n { role: \"system\", content: \"You are a conversation summarization system. Output valid JSON only.\" },\n { role: \"user\", content: fullPrompt },\n ],\n {\n temperature: 0.3,\n maxTokens: contextSizes.maxOutputTokens,\n operation: \"hourly_summary\",\n priority: \"background\",\n },\n );\n\n if (!response?.content) {\n return null;\n }\n\n try {\n // Parse JSON response\n const content = response.content.trim();\n for (const candidate of extractJsonCandidates(content)) {\n try {\n const parsed = JSON.parse(candidate);\n return HourlySummarySchema.parse(parsed);\n } catch {\n // keep trying candidates\n }\n }\n return null;\n } catch (err) {\n log.warn(\"local LLM summary: failed to parse JSON response:\", err);\n return null;\n }\n }\n\n // Save summary to file\n async saveSummary(summary: HourlySummary): Promise<void> {\n const sessionDir = await this.summarySessionDir(summary.sessionKey);\n await mkdir(sessionDir, { recursive: true });\n\n // Format date as YYYY-MM-DD for the filename\n const dateStr = this.summaryDateString(summary.hour);\n const filePath = await resolveSafeStoragePath(sessionDir, `${dateStr}.md`);\n\n // Format hour as HH:00 for display\n const hourStr = summary.hour.slice(11, 13);\n\n // Build markdown content\n const lines: string[] = [];\n\n // Check if file exists to append or create\n let existingContent = \"\";\n try {\n existingContent = await readFile(filePath, \"utf-8\");\n } catch {\n // File doesn't exist yet, will create new\n }\n\n // Check if this hour already exists (idempotent)\n const hourHeader = `## ${hourStr}:00`;\n if (existingContent.includes(hourHeader)) {\n // Replace existing hour section\n const headerMatch = new RegExp(`(^|\\\\n)${escapeRegExp(hourHeader)}\\\\n`).exec(existingContent);\n const sectionStart = headerMatch\n ? headerMatch.index + headerMatch[1].length\n : existingContent.indexOf(hourHeader);\n const nextHeaderPattern = /\\n## \\d{2}:00\\n/g;\n nextHeaderPattern.lastIndex = sectionStart + hourHeader.length;\n const nextHeader = nextHeaderPattern.exec(existingContent);\n const beforeHour = existingContent.slice(0, sectionStart);\n const afterHour = nextHeader\n ? existingContent.slice(nextHeader.index + 1)\n : \"\";\n const newSection = this.formatHourSection(summary, hourHeader);\n existingContent = beforeHour + newSection.trimEnd() + (afterHour ? \"\\n\\n\" + afterHour : \"\\n\");\n\n await writeFile(filePath, existingContent, \"utf-8\");\n log.debug(`updated hourly summary for ${summary.sessionKey} at ${hourStr}:00`);\n } else {\n // Append new hour section\n const newSection = this.formatHourSection(summary, hourHeader);\n\n if (existingContent) {\n // Add to existing file\n await writeFile(filePath, existingContent.trimEnd() + \"\\n\\n\" + newSection, \"utf-8\");\n } else {\n // Create new file with header\n const header = `# Hourly Summaries — ${dateStr}\\n\\n*Session: ${summary.sessionKey}*\\n`;\n await writeFile(filePath, header + \"\\n\" + newSection, \"utf-8\");\n }\n log.debug(`saved hourly summary for ${summary.sessionKey} at ${hourStr}:00`);\n }\n try {\n await upsertSummarySnapshot(this.config.memoryDir, summary);\n } catch (error) {\n log.warn(\n `hourly summarizer: failed to update summary snapshot for ${summary.sessionKey} (fail-open): ${String(error)}`,\n );\n }\n }\n\n private formatHourSection(summary: HourlySummary, hourHeader: string): string {\n const ext = (summary as any)._extended as (HourlySummaryExtendedResult & { _meta?: HourlySummaryExtendedMeta }) | undefined;\n const meta = (summary as any)._extendedMeta as HourlySummaryExtendedMeta | undefined;\n const lines: string[] = [hourHeader, \"\"];\n\n if (this.config.hourlySummariesExtendedEnabled && ext) {\n lines.push(\"### Topics Discussed\");\n for (const t of ext.topics) lines.push(`- ${t}`);\n lines.push(\"\");\n lines.push(\"### Decisions Made\");\n for (const d of ext.decisions) lines.push(`- ${d}`);\n lines.push(\"\");\n lines.push(\"### Action Items\");\n for (const a of ext.actionItems) lines.push(`- ${a}`);\n lines.push(\"\");\n lines.push(\"### Rejected Ideas / Reversals\");\n for (const r of ext.rejected) lines.push(`- ${r}`);\n lines.push(\"\");\n if (meta && Object.keys(meta.toolCounts).length > 0) {\n lines.push(\"### Tools Used\");\n const top = Object.entries(meta.toolCounts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 12);\n for (const [name, count] of top) lines.push(`- ${name}: ${count}`);\n lines.push(\"\");\n }\n lines.push(\"### Stats\");\n lines.push(`- Turns: ${summary.turnCount}`);\n if (meta) {\n lines.push(`- User turns: ${meta.userTurns}`);\n lines.push(`- Assistant turns: ${meta.assistantTurns}`);\n lines.push(`- Tool calls: ${meta.toolCalls}`);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n for (const bullet of summary.bullets) lines.push(`- ${bullet}`);\n lines.push(` *(${summary.turnCount} turns)*`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n // Read recent summaries for recall injection\n async readRecent(sessionKey: string, hours: number): Promise<HourlySummary[]> {\n try {\n const cutoffTime = Date.now() - hours * 60 * 60 * 1000;\n\n const snapshot = await readSummarySnapshot(this.config.memoryDir, sessionKey);\n if (snapshot) {\n return snapshot\n .filter((s) => new Date(s.hour).getTime() >= cutoffTime)\n .sort((a, b) => new Date(b.hour).getTime() - new Date(a.hour).getTime());\n }\n\n const summaries: HourlySummary[] = [];\n const encodedDir = await this.summarySessionDir(sessionKey);\n const legacyDir = await this.legacySummarySessionDir(sessionKey);\n const seenDirs = new Set<string>();\n\n for (const sessionDir of [encodedDir, legacyDir]) {\n if (!sessionDir || seenDirs.has(sessionDir)) continue;\n seenDirs.add(sessionDir);\n const parsed = await this.readSummaryDir(sessionDir, sessionKey);\n summaries.push(...parsed);\n }\n\n const byHour = new Map<string, HourlySummary>();\n for (const summary of summaries) {\n if (!byHour.has(summary.hour)) byHour.set(summary.hour, summary);\n }\n\n const sortedSummaries = Array.from(byHour.values()).sort(\n (a, b) => new Date(b.hour).getTime() - new Date(a.hour).getTime(),\n );\n\n // Filter to recent hours while materializing the full parsed history.\n const recent = sortedSummaries.filter(\n (s) => new Date(s.hour).getTime() >= cutoffTime,\n );\n\n if (sortedSummaries.length > 0) {\n try {\n await writeSummarySnapshot(\n this.config.memoryDir,\n sessionKey,\n sortedSummaries,\n );\n } catch (error) {\n log.warn(\n `hourly summarizer: failed to materialize summary snapshot for ${sessionKey} (fail-open): ${String(error)}`,\n );\n }\n }\n\n return recent;\n } catch {\n // Directory doesn't exist or error reading\n return [];\n }\n }\n\n private async readSummaryDir(\n sessionDir: string,\n sessionKey: string,\n ): Promise<HourlySummary[]> {\n let files: string[];\n try {\n files = await readdir(sessionDir);\n } catch {\n return [];\n }\n\n const summaries: HourlySummary[] = [];\n const mdFiles = files.filter((f) => f.endsWith(\".md\"));\n for (const file of mdFiles) {\n const filePath = await resolveSafeStoragePath(sessionDir, file).catch(() => null);\n if (filePath === null) continue;\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n summaries.push(...this.parseSummaryFile(content, sessionKey, file));\n } catch {\n // Skip unreadable summary files.\n }\n }\n\n return summaries;\n }\n\n private parseSummaryFile(\n content: string,\n sessionKey: string,\n filename: string\n ): HourlySummary[] {\n const summaries: HourlySummary[] = [];\n\n // Extract date from filename (YYYY-MM-DD.md)\n const dateMatch = filename.match(/^(\\d{4}-\\d{2}-\\d{2})\\.md$/);\n if (!dateMatch) return summaries;\n const dateStr = dateMatch[1];\n\n // Split by hour sections\n const hourSections = content.split(/\\n## (\\d{2}):00\\n/);\n\n // First element is the header, skip it\n for (let i = 1; i < hourSections.length; i += 2) {\n const hourStr = hourSections[i];\n const sectionContent = hourSections[i + 1] || \"\";\n\n // Parse bullets\n const bullets: string[] = [];\n const lines = sectionContent.split(\"\\n\");\n let turnCount = 0;\n\n let inTopics = false;\n let sawExtendedTopicsHeader = false;\n for (const line of lines) {\n if (line.startsWith(\"### Topics\")) {\n inTopics = true;\n sawExtendedTopicsHeader = true;\n continue;\n }\n if (line.startsWith(\"### \") && !line.startsWith(\"### Topics\")) {\n inTopics = false;\n }\n const bulletMatch = line.match(/^- (.+)$/);\n if (bulletMatch) {\n // For extended format, only treat topic bullets as recall bullets.\n if (!sawExtendedTopicsHeader || inTopics) bullets.push(bulletMatch[1]);\n }\n const turnMatch = line.match(/\\((\\d+) turns?\\)/);\n if (turnMatch) turnCount = parseInt(turnMatch[1], 10);\n }\n\n if (bullets.length > 0) {\n summaries.push({\n hour: `${dateStr}T${hourStr}:00:00.000Z`,\n sessionKey,\n bullets,\n turnCount,\n generatedAt: \"\", // Not stored in file, not needed for recall\n });\n }\n }\n\n return summaries;\n }\n\n // Format summaries for recall injection\n formatForRecall(summaries: HourlySummary[], maxCount: number): string {\n if (summaries.length === 0) return \"\";\n\n const limited = summaries.slice(0, maxCount);\n const lines: string[] = [`## Recent Activity (last ${limited.length} hours)`];\n\n for (const summary of limited) {\n const hourStr = summary.hour.slice(11, 16); // HH:MM\n for (const bullet of summary.bullets) {\n lines.push(`- ${hourStr}: ${bullet}`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n // Main entry point for cron job\n async runHourly(): Promise<void> {\n log.debug(\"running hourly summary generation\");\n\n // Get active sessions from transcript\n const sessions = await this.getActiveSessions();\n\n for (const sessionKey of sessions) {\n // Calculate the hour we want to summarize (previous hour)\n const now = new Date();\n const hourStart = new Date(now.getTime() - 60 * 60 * 1000);\n hourStart.setMinutes(0, 0, 0);\n const hourEnd = new Date(hourStart.getTime() + 60 * 60 * 1000);\n\n // Get entries for this session in the target hour\n const entries = await this.getTranscriptEntries(sessionKey, hourStart, hourEnd);\n\n if (entries.length === 0) {\n log.debug(`no transcript entries for ${sessionKey} at ${hourStart.toISOString()}`);\n continue;\n }\n\n // Generate and save summary\n const summary = await this.generateSummary(sessionKey, hourStart, entries);\n if (summary) {\n await this.saveSummary(summary);\n log.info(`generated hourly summary for ${sessionKey} (${entries.length} turns)`);\n }\n }\n }\n\n // Get list of active sessions from transcript directory\n private async getActiveSessions(): Promise<string[]> {\n const transcriptDir = await resolveSafeStoragePath(\n this.config.memoryDir,\n \"transcripts\",\n ).catch(() => null);\n if (transcriptDir === null) return [];\n\n try {\n const sessionKeys = new Set<string>();\n const typeEntries = await readdir(transcriptDir, { withFileTypes: true });\n for (const typeEnt of typeEntries) {\n if (!typeEnt.isDirectory()) continue;\n const typeDir = await resolveSafeStoragePath(transcriptDir, typeEnt.name).catch(() => null);\n if (typeDir === null) continue;\n const idEntries = await readdir(typeDir, { withFileTypes: true });\n for (const idEnt of idEntries) {\n if (!idEnt.isDirectory()) continue;\n const chanDir = await resolveSafeStoragePath(typeDir, idEnt.name).catch(() => null);\n if (chanDir === null) continue;\n const files = (await readdir(chanDir)).filter((f) => f.endsWith(\".jsonl\")).sort();\n for (const file of files) {\n const transcriptPath = await resolveSafeStoragePath(chanDir, file).catch(() => null);\n if (transcriptPath === null) continue;\n await this.collectTranscriptSessionKeys(transcriptPath, sessionKeys);\n }\n }\n }\n return Array.from(sessionKeys);\n } catch {\n return [];\n }\n }\n\n private async collectTranscriptSessionKeys(\n transcriptPath: string,\n sessionKeys: Set<string>,\n ): Promise<void> {\n try {\n const raw = await readFile(transcriptPath, \"utf-8\");\n for (const line of raw.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const entry = JSON.parse(line) as TranscriptEntry;\n if (typeof entry.sessionKey === \"string\" && entry.sessionKey.length > 0) {\n sessionKeys.add(entry.sessionKey);\n }\n } catch {\n // ignore malformed transcript lines\n }\n }\n } catch {\n // ignore unreadable transcript files\n }\n }\n\n // Get transcript entries for a session within a time range\n private async getTranscriptEntries(\n sessionKey: string,\n startTime: Date,\n endTime: Date\n ): Promise<TranscriptEntry[]> {\n // Shared session-identity layer (issue #1496, rule #22). Arbitrary keys\n // route to `session/<hash>`; legacy `agent:<id>:...` keep their paths. The\n // shared helper also supplies the read-back-only candidate dirs (mirrors\n // TranscriptManager) so legacy `other/default` AND old `parts.length >= 3`\n // data stays discoverable here too.\n const paths = sessionStoragePaths(sessionKey);\n\n try {\n const transcriptRoot = path.join(this.config.memoryDir, \"transcripts\");\n const candidateDirs = new Set(\n [paths.dir, paths.alternateDir, paths.legacyDir, ...paths.readbackDirs].filter(\n (dir): dir is string => typeof dir === \"string\" && dir.length > 0,\n ),\n );\n const entries: TranscriptEntry[] = [];\n // Dedup identical raw rows that a partially-applied migration may have\n // left in both the primary dir and a read-back dir (issue #1496, cursor\n // review). Exact raw JSONL line is the stable identity.\n const seenRawLines = new Set<string>();\n\n // Read all daily transcript files in the directory\n for (const candidateDir of candidateDirs) {\n const transcriptDir = await resolveSafeStoragePath(transcriptRoot, candidateDir).catch(() => null);\n if (transcriptDir === null) continue;\n\n const files = await readdir(transcriptDir).catch(() => []);\n for (const file of files) {\n if (!file.endsWith(\".jsonl\")) continue;\n\n const transcriptPath = await resolveSafeStoragePath(transcriptDir, file).catch(() => null);\n if (transcriptPath === null) continue;\n\n try {\n const content = await readFile(transcriptPath, \"utf-8\");\n const lines = content.trim().split(\"\\n\");\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const entry = JSON.parse(line) as TranscriptEntry;\n const entryTime = new Date(entry.timestamp).getTime();\n\n if (\n entry.sessionKey === sessionKey &&\n entryTime >= startTime.getTime() &&\n entryTime < endTime.getTime() &&\n !seenRawLines.has(line)\n ) {\n seenRawLines.add(line);\n entries.push(entry);\n }\n } catch {\n // Skip malformed lines\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n return entries;\n } catch {\n return [];\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -69,10 +69,10 @@ import {
69
69
  resolveScopeProfilePlan,
70
70
  resolveWritableNamespaceValue,
71
71
  sanitizeFragment
72
- } from "./chunk-J6BH2OBA.js";
72
+ } from "./chunk-UK6U5C3N.js";
73
73
  import {
74
74
  namespaceCollectionName
75
- } from "./chunk-KQYGNGON.js";
75
+ } from "./chunk-3QETM5NG.js";
76
76
  import {
77
77
  namespaceIdentityFromToken
78
78
  } from "./chunk-ZFXCQPNO.js";
@@ -96,16 +96,10 @@ import {
96
96
  persistExplicitCapture,
97
97
  queueExplicitCaptureForReview,
98
98
  validateExplicitCaptureInput
99
- } from "./chunk-PMAQRUN4.js";
99
+ } from "./chunk-CILX2XW7.js";
100
100
  import {
101
101
  CrossNamespaceBudget
102
102
  } from "./chunk-ODPLEWB6.js";
103
- import {
104
- resolveAccessSetupCapabilities,
105
- resolveGraphConstructionCapabilities,
106
- resolveIndexingCapabilities,
107
- resolveMemoryLifecycleCapabilities
108
- } from "./chunk-ESF7TRYJ.js";
109
103
  import {
110
104
  defaultCapsulesDir
111
105
  } from "./chunk-ZY2MNJR6.js";
@@ -171,7 +165,16 @@ import {
171
165
  defaultNamespaceForPrincipal,
172
166
  recallNamespacesForPrincipal,
173
167
  resolvePrincipal
174
- } from "./chunk-UZYLX7M6.js";
168
+ } from "./chunk-LV32K4OP.js";
169
+ import {
170
+ resolveAccessSetupCapabilities,
171
+ resolveGraphConstructionCapabilities,
172
+ resolveIdentityContinuityCapabilities,
173
+ resolveIndexingCapabilities,
174
+ resolveMemoryLifecycleCapabilities,
175
+ resolveNamespaceCapabilities,
176
+ resolveQmdCapabilities
177
+ } from "./chunk-SHJGBAIW.js";
175
178
  import {
176
179
  expandTildePath
177
180
  } from "./chunk-EYIEWJNI.js";
@@ -2487,7 +2490,7 @@ function walkRedact(value, key) {
2487
2490
  }
2488
2491
  function inspectScope(options) {
2489
2492
  const { config } = options;
2490
- const namespacesEnabled = options.namespacesEnabled ?? config.namespacesEnabled === true;
2493
+ const namespacesEnabled = options.namespacesEnabled ?? resolveNamespaceCapabilities(config).namespaces === true;
2491
2494
  const plan = resolveScopePlan({
2492
2495
  config,
2493
2496
  sessionKey: options.sessionKey,
@@ -3097,7 +3100,7 @@ var EngramAccessService = class {
3097
3100
  resolveNamespace(namespace) {
3098
3101
  const requested = namespace?.trim();
3099
3102
  if (!requested) return this.orchestrator.config.defaultNamespace;
3100
- if (!this.orchestrator.config.namespacesEnabled && requested !== this.orchestrator.config.defaultNamespace) {
3103
+ if (!resolveNamespaceCapabilities(this.orchestrator.config).namespaces && requested !== this.orchestrator.config.defaultNamespace) {
3101
3104
  throw new EngramAccessInputError(`unsupported namespace: ${requested}`);
3102
3105
  }
3103
3106
  return requested;
@@ -3174,8 +3177,8 @@ var EngramAccessService = class {
3174
3177
  * scattered-config-read ratchet flat). READ-ONLY: never mutates session. */
3175
3178
  async resolveCodingScopeInputs(request) {
3176
3179
  const hasSession = typeof request.sessionKey === "string" && request.sessionKey.length > 0;
3177
- const codingContext = hasSession && this.orchestrator.config.namespacesEnabled && this.orchestrator.config.codingMode?.projectScope ? this.orchestrator.getCodingContextForSession(request.sessionKey) ?? await this.resolveCodingContextFromOptions(request) : null;
3178
- const overlay = hasSession && this.orchestrator.config.namespacesEnabled && this.orchestrator.config.codingMode?.projectScope ? resolveCodingNamespaceOverlay(
3180
+ const codingContext = hasSession && resolveNamespaceCapabilities(this.orchestrator.config).namespaces && this.orchestrator.config.codingMode?.projectScope ? this.orchestrator.getCodingContextForSession(request.sessionKey) ?? await this.resolveCodingContextFromOptions(request) : null;
3181
+ const overlay = hasSession && resolveNamespaceCapabilities(this.orchestrator.config).namespaces && this.orchestrator.config.codingMode?.projectScope ? resolveCodingNamespaceOverlay(
3179
3182
  codingContext,
3180
3183
  this.orchestrator.config.codingMode,
3181
3184
  this.orchestrator.config.defaultNamespace
@@ -3321,7 +3324,7 @@ var EngramAccessService = class {
3321
3324
  this.orchestrator.config
3322
3325
  );
3323
3326
  const hasSession = typeof request.sessionKey === "string" && request.sessionKey.length > 0;
3324
- const overlayEligible = hasSession && this.orchestrator.config.namespacesEnabled === true && this.orchestrator.config.codingMode?.projectScope === true;
3327
+ const overlayEligible = hasSession && resolveNamespaceCapabilities(this.orchestrator.config).namespaces === true && this.orchestrator.config.codingMode?.projectScope === true;
3325
3328
  let attachedContext = hasSession ? this.orchestrator.getCodingContextForSession(request.sessionKey) : null;
3326
3329
  let seededContext = false;
3327
3330
  if (overlayEligible && !attachedContext) {
@@ -3400,7 +3403,7 @@ var EngramAccessService = class {
3400
3403
  request.authenticatedPrincipal
3401
3404
  );
3402
3405
  const willWriteObjectiveState = this.orchestrator.config.objectiveStateMemoryEnabled === true && this.orchestrator.config.objectiveStateSnapshotWritesEnabled === true;
3403
- if (willWriteObjectiveState && this.orchestrator.config.namespacesEnabled === true && !canWriteNamespace(principal, baseNamespace, this.orchestrator.config)) {
3406
+ if (willWriteObjectiveState && resolveNamespaceCapabilities(this.orchestrator.config).namespaces === true && !canWriteNamespace(principal, baseNamespace, this.orchestrator.config)) {
3404
3407
  clearSeededContext();
3405
3408
  throw new EngramAccessInputError(
3406
3409
  `namespace is not writable: ${baseNamespace}`
@@ -3454,7 +3457,7 @@ var EngramAccessService = class {
3454
3457
  return scope.codingOverlayApplied ? this.orchestrator.config.defaultNamespace : scope.writeNamespace;
3455
3458
  }
3456
3459
  async objectiveStateStoreLocationForNamespace(namespace) {
3457
- if (!this.orchestrator.config.namespacesEnabled) {
3460
+ if (!resolveNamespaceCapabilities(this.orchestrator.config).namespaces) {
3458
3461
  return {
3459
3462
  memoryDir: this.orchestrator.config.memoryDir,
3460
3463
  objectiveStateStoreDir: this.orchestrator.config.objectiveStateStoreDir
@@ -3466,14 +3469,14 @@ var EngramAccessService = class {
3466
3469
  objectiveStateStoreDir: objectiveStateStoreOverrideForNamespace({
3467
3470
  memoryDir: this.orchestrator.config.memoryDir,
3468
3471
  configuredStoreDir: this.orchestrator.config.objectiveStateStoreDir,
3469
- namespacesEnabled: this.orchestrator.config.namespacesEnabled,
3472
+ namespacesEnabled: resolveNamespaceCapabilities(this.orchestrator.config).namespaces,
3470
3473
  namespace
3471
3474
  })
3472
3475
  };
3473
3476
  }
3474
3477
  resolveReadableNamespace(namespace, principal) {
3475
3478
  const resolved = this.resolveNamespace(namespace);
3476
- const namespacesEnabled = this.orchestrator.config.namespacesEnabled;
3479
+ const namespacesEnabled = resolveNamespaceCapabilities(this.orchestrator.config).namespaces;
3477
3480
  if (!namespacesEnabled) {
3478
3481
  return resolved;
3479
3482
  }
@@ -3492,7 +3495,7 @@ var EngramAccessService = class {
3492
3495
  if (requested) {
3493
3496
  return [this.resolveReadableNamespace(requested, principal)];
3494
3497
  }
3495
- if (!this.orchestrator.config.namespacesEnabled) {
3498
+ if (!resolveNamespaceCapabilities(this.orchestrator.config).namespaces) {
3496
3499
  return [this.resolveNamespace(void 0)];
3497
3500
  }
3498
3501
  if (!principal) {
@@ -3533,7 +3536,7 @@ var EngramAccessService = class {
3533
3536
  return [...new Set(candidates)].filter((namespace) => canReadNamespace(principal, namespace, config));
3534
3537
  }
3535
3538
  resolveMemorySearchNamespacesForCollection(collection, namespaces, collectionPrincipal) {
3536
- if (!this.orchestrator.config.namespacesEnabled) {
3539
+ if (!resolveNamespaceCapabilities(this.orchestrator.config).namespaces) {
3537
3540
  return namespaces;
3538
3541
  }
3539
3542
  const baseCollection = this.orchestrator.config.qmdCollection;
@@ -4011,7 +4014,7 @@ var EngramAccessService = class {
4011
4014
  const resolvedNamespace = this.resolveNamespace(namespace);
4012
4015
  const storage = await this.orchestrator.getStorage(resolvedNamespace);
4013
4016
  const searchBackend = this.orchestrator.config.searchBackend ?? "qmd";
4014
- const qmdEnabled = this.orchestrator.config.qmdEnabled === true;
4017
+ const qmdEnabled = resolveQmdCapabilities(this.orchestrator.config).qmd === true;
4015
4018
  let projectionAvailable = false;
4016
4019
  try {
4017
4020
  await stat2(getMemoryProjectionPath(storage.dir));
@@ -4022,7 +4025,7 @@ var EngramAccessService = class {
4022
4025
  return {
4023
4026
  ok: true,
4024
4027
  memoryDir: storage.dir,
4025
- namespacesEnabled: this.orchestrator.config.namespacesEnabled === true,
4028
+ namespacesEnabled: resolveNamespaceCapabilities(this.orchestrator.config).namespaces === true,
4026
4029
  defaultNamespace: this.orchestrator.config.defaultNamespace,
4027
4030
  searchBackend,
4028
4031
  qmdEnabled,
@@ -4037,7 +4040,7 @@ var EngramAccessService = class {
4037
4040
  };
4038
4041
  }
4039
4042
  qmdCollectionForHealth(namespace, storageDir) {
4040
- if (this.orchestrator.config.namespacesEnabled !== true) {
4043
+ if (resolveNamespaceCapabilities(this.orchestrator.config).namespaces !== true) {
4041
4044
  return this.orchestrator.config.qmdCollection;
4042
4045
  }
4043
4046
  const useLegacyDefaultCollection = namespace === this.orchestrator.config.defaultNamespace && storageDir === this.orchestrator.config.memoryDir;
@@ -4063,7 +4066,7 @@ var EngramAccessService = class {
4063
4066
  debugStatus: searchBackend !== "qmd" ? `backend=${searchBackend}` : "backend=disabled"
4064
4067
  };
4065
4068
  }
4066
- if (this.orchestrator.config.namespacesEnabled === true) {
4069
+ if (resolveNamespaceCapabilities(this.orchestrator.config).namespaces === true) {
4067
4070
  const namespaceHealth = await this.namespaceQmdHealth(searchBackend, qmdEnabled, namespace, collection);
4068
4071
  if (namespaceHealth) return namespaceHealth;
4069
4072
  }
@@ -4387,7 +4390,7 @@ var EngramAccessService = class {
4387
4390
  const normalizedRequest = { ...request, query };
4388
4391
  const authenticatedPrincipal = request.authenticatedPrincipal?.trim();
4389
4392
  const principal = this.resolveRequestPrincipal(request.sessionKey, authenticatedPrincipal);
4390
- if (this.orchestrator.config.namespacesEnabled && !principal) {
4393
+ if (resolveNamespaceCapabilities(this.orchestrator.config).namespaces && !principal) {
4391
4394
  throw new EngramAccessInputError(
4392
4395
  "authentication required: namespaces are enabled and no principal was supplied"
4393
4396
  );
@@ -4452,7 +4455,7 @@ var EngramAccessService = class {
4452
4455
  const namespace = namespaceOverride ?? this.orchestrator.config.defaultNamespace;
4453
4456
  const mode = this.normalizeRecallMode(request.mode);
4454
4457
  const maybePrincipal = this.resolveRequestPrincipal(request.sessionKey, authenticatedPrincipal);
4455
- if (this.orchestrator.config.namespacesEnabled && !maybePrincipal) {
4458
+ if (resolveNamespaceCapabilities(this.orchestrator.config).namespaces && !maybePrincipal) {
4456
4459
  throw new EngramAccessInputError(
4457
4460
  "authentication required: namespaces are enabled and no principal was supplied"
4458
4461
  );
@@ -4460,7 +4463,7 @@ var EngramAccessService = class {
4460
4463
  const principal = maybePrincipal ?? "default";
4461
4464
  const principalNamespace = defaultNamespaceForPrincipal(principal, this.orchestrator.config);
4462
4465
  const profileCodingContext = request.sessionKey && typeof this.orchestrator.getCodingContextForSession === "function" ? this.orchestrator.getCodingContextForSession(request.sessionKey) : null;
4463
- const profileCodingOverlay = !namespaceOverride && profileCodingContext && this.orchestrator.config.namespacesEnabled && this.orchestrator.config.codingMode?.projectScope ? resolveCodingNamespaceOverlay(
4466
+ const profileCodingOverlay = !namespaceOverride && profileCodingContext && resolveNamespaceCapabilities(this.orchestrator.config).namespaces && this.orchestrator.config.codingMode?.projectScope ? resolveCodingNamespaceOverlay(
4464
4467
  profileCodingContext,
4465
4468
  this.orchestrator.config.codingMode,
4466
4469
  this.orchestrator.config.defaultNamespace
@@ -4707,7 +4710,7 @@ var EngramAccessService = class {
4707
4710
  if (!canReadNamespace(principal, requestedNamespace, this.orchestrator.config)) {
4708
4711
  return { found: false };
4709
4712
  }
4710
- } else if (this.orchestrator.config.namespacesEnabled && !principal) {
4713
+ } else if (resolveNamespaceCapabilities(this.orchestrator.config).namespaces && !principal) {
4711
4714
  return { found: false };
4712
4715
  }
4713
4716
  const snapshot = request.sessionKey ? (() => {
@@ -4722,7 +4725,7 @@ var EngramAccessService = class {
4722
4725
  return candidate.namespace === requestedNamespace ? candidate : null;
4723
4726
  })();
4724
4727
  const readableSnapshot = (() => {
4725
- if (!snapshot || !this.orchestrator.config.namespacesEnabled) return snapshot;
4728
+ if (!snapshot || !resolveNamespaceCapabilities(this.orchestrator.config).namespaces) return snapshot;
4726
4729
  const snapshotNamespace = snapshot.namespace ?? this.orchestrator.config.defaultNamespace;
4727
4730
  return canReadNamespace(principal, snapshotNamespace, this.orchestrator.config) ? snapshot : null;
4728
4731
  })();
@@ -4730,7 +4733,7 @@ var EngramAccessService = class {
4730
4733
  if (requestedNamespace) return requestedNamespace;
4731
4734
  if (readableSnapshot?.namespace) return readableSnapshot.namespace;
4732
4735
  const fallbackNamespace = this.orchestrator.config.defaultNamespace;
4733
- if (!this.orchestrator.config.namespacesEnabled) return fallbackNamespace;
4736
+ if (!resolveNamespaceCapabilities(this.orchestrator.config).namespaces) return fallbackNamespace;
4734
4737
  return canReadNamespace(principal, fallbackNamespace, this.orchestrator.config) ? fallbackNamespace : null;
4735
4738
  })();
4736
4739
  if (!namespace) return { found: false };
@@ -4742,7 +4745,7 @@ var EngramAccessService = class {
4742
4745
  return { found: true, snapshot: readableSnapshot ?? void 0, intent, graph };
4743
4746
  }
4744
4747
  async recallTierExplain(sessionKey, namespace, authenticatedPrincipal) {
4745
- const namespacesEnabled = this.orchestrator.config.namespacesEnabled;
4748
+ const namespacesEnabled = resolveNamespaceCapabilities(this.orchestrator.config).namespaces;
4746
4749
  const requestedNamespace = namespace?.trim() ? this.resolveNamespace(namespace) : void 0;
4747
4750
  const principal = authenticatedPrincipal?.trim() || resolvePrincipal(sessionKey, this.orchestrator.config);
4748
4751
  if (requestedNamespace) {
@@ -4783,7 +4786,7 @@ var EngramAccessService = class {
4783
4786
  `recallXray: disclosure must be one of: chunk, section, raw (got: ${String(request.disclosure)})`
4784
4787
  );
4785
4788
  }
4786
- const namespacesEnabled = this.orchestrator.config.namespacesEnabled;
4789
+ const namespacesEnabled = resolveNamespaceCapabilities(this.orchestrator.config).namespaces;
4787
4790
  const requestedNamespace = request.namespace?.trim() ? this.resolveNamespace(request.namespace) : void 0;
4788
4791
  const authenticatedPrincipal = request.authenticatedPrincipal?.trim();
4789
4792
  const principal = authenticatedPrincipal || resolvePrincipal(request.sessionKey, this.orchestrator.config);
@@ -6284,7 +6287,7 @@ var EngramAccessService = class {
6284
6287
  sourceFormat: m.sourceFormat,
6285
6288
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
6286
6289
  }));
6287
- const writeNamespaceOverride = this.orchestrator.config.namespacesEnabled === true ? writeNamespace : void 0;
6290
+ const writeNamespaceOverride = resolveNamespaceCapabilities(this.orchestrator.config).namespaces === true ? writeNamespace : void 0;
6288
6291
  const principalOverride = typeof scope.principal === "string" && scope.principal.length > 0 ? scope.principal : void 0;
6289
6292
  try {
6290
6293
  const extractionPromise = this.orchestrator.ingestReplayBatch(turns, {
@@ -6389,7 +6392,7 @@ var EngramAccessService = class {
6389
6392
  ) ?? request.sessionPrefix
6390
6393
  ] : [void 0];
6391
6394
  const hasScopedSession = typeof request.sessionKey === "string" && request.sessionKey.length > 0 || lcmSessionPrefixes.some((prefix) => typeof prefix === "string" && prefix.length > 0);
6392
- if (!hasScopedSession && this.orchestrator.config.namespacesEnabled === true) {
6395
+ if (!hasScopedSession && resolveNamespaceCapabilities(this.orchestrator.config).namespaces === true) {
6393
6396
  return {
6394
6397
  query: request.query,
6395
6398
  namespace,
@@ -6620,7 +6623,7 @@ var EngramAccessService = class {
6620
6623
  */
6621
6624
  resolveImplicitLcmReadFallbackNamespace(principal) {
6622
6625
  const config = this.orchestrator.config;
6623
- if (!config.namespacesEnabled) return config.defaultNamespace;
6626
+ if (!resolveNamespaceCapabilities(config).namespaces) return config.defaultNamespace;
6624
6627
  if (canReadNamespace(principal, config.defaultNamespace, config)) {
6625
6628
  return config.defaultNamespace;
6626
6629
  }
@@ -6844,7 +6847,7 @@ var EngramAccessService = class {
6844
6847
  // ── Parity tools (match OpenClaw plugin feature set) ──────────────────
6845
6848
  // ── Continuity / Identity ──────────────────────────────────────────────
6846
6849
  async continuityAuditGenerate(request) {
6847
- if (!this.orchestrator.config.identityContinuityEnabled) {
6850
+ if (!resolveIdentityContinuityCapabilities(this.orchestrator.config).identityContinuity) {
6848
6851
  return { enabled: false, reason: "Identity continuity is disabled. Enable `identityContinuityEnabled: true`." };
6849
6852
  }
6850
6853
  if (!this.orchestrator.config.continuityAuditEnabled) {
@@ -6859,7 +6862,7 @@ var EngramAccessService = class {
6859
6862
  return { enabled: true, period: audit.period, key: audit.key, reportPath: audit.reportPath };
6860
6863
  }
6861
6864
  async continuityIncidentOpen(request) {
6862
- if (!this.orchestrator.config.identityContinuityEnabled) {
6865
+ if (!resolveIdentityContinuityCapabilities(this.orchestrator.config).identityContinuity) {
6863
6866
  return { enabled: false, reason: "Identity continuity is disabled. Enable `identityContinuityEnabled: true`." };
6864
6867
  }
6865
6868
  if (!this.orchestrator.config.continuityIncidentLoggingEnabled) {
@@ -6877,7 +6880,7 @@ var EngramAccessService = class {
6877
6880
  return { created: true, incident: created };
6878
6881
  }
6879
6882
  async continuityIncidentClose(request) {
6880
- if (!this.orchestrator.config.identityContinuityEnabled) {
6883
+ if (!resolveIdentityContinuityCapabilities(this.orchestrator.config).identityContinuity) {
6881
6884
  return { enabled: false, reason: "Identity continuity is disabled." };
6882
6885
  }
6883
6886
  if (!this.orchestrator.config.continuityIncidentLoggingEnabled) {
@@ -6900,7 +6903,7 @@ var EngramAccessService = class {
6900
6903
  return { closed: true, incident: closed };
6901
6904
  }
6902
6905
  async continuityIncidentList(request) {
6903
- if (!this.orchestrator.config.identityContinuityEnabled) {
6906
+ if (!resolveIdentityContinuityCapabilities(this.orchestrator.config).identityContinuity) {
6904
6907
  return { enabled: false, reason: "Identity continuity is disabled." };
6905
6908
  }
6906
6909
  const state = request.state === "closed" || request.state === "all" ? request.state : "open";
@@ -6911,7 +6914,7 @@ var EngramAccessService = class {
6911
6914
  return { state, incidents, count: incidents.length };
6912
6915
  }
6913
6916
  async continuityLoopAddOrUpdate(request) {
6914
- if (!this.orchestrator.config.identityContinuityEnabled) {
6917
+ if (!resolveIdentityContinuityCapabilities(this.orchestrator.config).identityContinuity) {
6915
6918
  return { enabled: false, reason: "Identity continuity is disabled." };
6916
6919
  }
6917
6920
  const resolvedNs = this.writableNamespaceFor(request.namespace, void 0, request.principal);
@@ -6928,7 +6931,7 @@ var EngramAccessService = class {
6928
6931
  return { saved: true, loop };
6929
6932
  }
6930
6933
  async continuityLoopReview(request) {
6931
- if (!this.orchestrator.config.identityContinuityEnabled) {
6934
+ if (!resolveIdentityContinuityCapabilities(this.orchestrator.config).identityContinuity) {
6932
6935
  return { enabled: false, reason: "Identity continuity is disabled." };
6933
6936
  }
6934
6937
  const id = request.id?.trim();
@@ -6944,7 +6947,7 @@ var EngramAccessService = class {
6944
6947
  return { reviewed: true, loop: reviewed };
6945
6948
  }
6946
6949
  async identityAnchorGet(request) {
6947
- if (!this.orchestrator.config.identityContinuityEnabled) {
6950
+ if (!resolveIdentityContinuityCapabilities(this.orchestrator.config).identityContinuity) {
6948
6951
  return { enabled: false, reason: "Identity continuity is disabled." };
6949
6952
  }
6950
6953
  const resolvedNs = this.resolveReadableNamespace(request.namespace, request.principal);
@@ -6962,7 +6965,7 @@ var EngramAccessService = class {
6962
6965
  * compatibility but will be removed in a future major version.
6963
6966
  */
6964
6967
  async identityAnchorUpdate(request) {
6965
- if (!this.orchestrator.config.identityContinuityEnabled) {
6968
+ if (!resolveIdentityContinuityCapabilities(this.orchestrator.config).identityContinuity) {
6966
6969
  return { enabled: false, reason: "Identity continuity is disabled." };
6967
6970
  }
6968
6971
  const updates = {
@@ -7301,7 +7304,7 @@ ${next}`);
7301
7304
  throw new EngramAccessInputError("collection must be a non-empty string");
7302
7305
  }
7303
7306
  let results;
7304
- if (!this.orchestrator.config.namespacesEnabled) {
7307
+ if (!resolveNamespaceCapabilities(this.orchestrator.config).namespaces) {
7305
7308
  this.resolveReadableNamespace(namespace, principal);
7306
7309
  results = collection === "global" ? await this.orchestrator.qmd.searchGlobal(query, maxResults) : await this.orchestrator.qmd.search(query, collection, maxResults);
7307
7310
  } else {
@@ -7823,7 +7826,7 @@ ${next}`);
7823
7826
  return { namespace: resolved, storage };
7824
7827
  }
7825
7828
  async getWritableStorageForNamespace(namespace, principal) {
7826
- if (this.orchestrator.config.namespacesEnabled && !principal?.trim()) {
7829
+ if (resolveNamespaceCapabilities(this.orchestrator.config).namespaces && !principal?.trim()) {
7827
7830
  throw new EngramAccessInputError(
7828
7831
  "authentication required: namespaces are enabled and no principal was supplied"
7829
7832
  );
@@ -8380,7 +8383,7 @@ ${next}`);
8380
8383
  */
8381
8384
  async adminPromoteMemory(request) {
8382
8385
  const config = this.orchestrator.config;
8383
- const namespacesEnabled = config.namespacesEnabled === true;
8386
+ const namespacesEnabled = resolveNamespaceCapabilities(config).namespaces === true;
8384
8387
  let sourceNamespace;
8385
8388
  if (request.namespace) {
8386
8389
  sourceNamespace = this.resolveReadableNamespace(
@@ -8480,4 +8483,4 @@ export {
8480
8483
  shapeMemorySummary,
8481
8484
  EngramAccessService
8482
8485
  };
8483
- //# sourceMappingURL=chunk-646B5ERJ.js.map
8486
+ //# sourceMappingURL=chunk-PKO5NJ65.js.map