@remnic/core 9.3.716 → 9.3.718

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 (257) hide show
  1. package/dist/access-boundary.d.ts +5 -5
  2. package/dist/access-boundary.js +10 -9
  3. package/dist/access-cli.js +26 -25
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +5 -5
  6. package/dist/access-http.js +14 -13
  7. package/dist/access-mcp.d.ts +5 -5
  8. package/dist/access-mcp.js +13 -12
  9. package/dist/access-operations-batch.js +11 -10
  10. package/dist/access-operations.d.ts +5 -5
  11. package/dist/access-operations.js +12 -11
  12. package/dist/{access-service-BW8cm_uU.d.ts → access-service-CZbnt0t2.d.ts} +4 -4
  13. package/dist/access-service.d.ts +5 -5
  14. package/dist/access-service.js +9 -8
  15. package/dist/access-surface-catalog.d.ts +5 -5
  16. package/dist/action-confidence.d.ts +1 -1
  17. package/dist/active-memory-bridge.d.ts +1 -1
  18. package/dist/active-recall.d.ts +1 -1
  19. package/dist/active-recall.js +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 +4 -4
  23. package/dist/briefing.d.ts +3 -1
  24. package/dist/briefing.js +3 -3
  25. package/dist/buffer-surprise-report.d.ts +1 -1
  26. package/dist/buffer.d.ts +1 -1
  27. package/dist/calibration.d.ts +1 -1
  28. package/dist/capabilities.d.ts +1 -1
  29. package/dist/{catalog-CbR0CsUw.d.ts → catalog-CEYlMs9X.d.ts} +1 -1
  30. package/dist/causal-behavior.d.ts +1 -1
  31. package/dist/causal-consolidation.d.ts +1 -1
  32. package/dist/causal-consolidation.js +4 -4
  33. package/dist/{chunk-JEIROMLX.js → chunk-2COL35PK.js} +95 -9
  34. package/dist/chunk-2COL35PK.js.map +1 -0
  35. package/dist/{chunk-XZTUMWKQ.js → chunk-2PTBLS2S.js} +2 -2
  36. package/dist/{chunk-2Y6LMOQQ.js → chunk-2VHMVWPU.js} +2 -2
  37. package/dist/{chunk-6UU43ZGD.js → chunk-4KZGLDJJ.js} +2 -2
  38. package/dist/{chunk-K44MIN6D.js → chunk-5RHM43BJ.js} +3 -3
  39. package/dist/{chunk-MECU6WSH.js → chunk-72VDBALG.js} +18 -18
  40. package/dist/{chunk-UY4JMEAK.js → chunk-7EEVXW7X.js} +2 -2
  41. package/dist/{chunk-XCTDHF7U.js → chunk-A5TUPZ3N.js} +33 -1
  42. package/dist/chunk-A5TUPZ3N.js.map +1 -0
  43. package/dist/{chunk-WI4QX7GH.js → chunk-A66YRSOS.js} +2 -2
  44. package/dist/{chunk-CTAHKIG6.js → chunk-ANI5DUAE.js} +10 -8
  45. package/dist/{chunk-CTAHKIG6.js.map → chunk-ANI5DUAE.js.map} +1 -1
  46. package/dist/{chunk-O62P2LFL.js → chunk-APUJIMDM.js} +2 -2
  47. package/dist/{chunk-MPHDVHIB.js → chunk-DIFU33GU.js} +2 -2
  48. package/dist/{chunk-DXGS5YOQ.js → chunk-EH27LHML.js} +2 -2
  49. package/dist/{chunk-BNOAB5HH.js → chunk-F3PVXKHP.js} +78 -1442
  50. package/dist/chunk-F3PVXKHP.js.map +1 -0
  51. package/dist/{chunk-6QUPUTT7.js → chunk-HLIR3RJ7.js} +6 -10
  52. package/dist/{chunk-6QUPUTT7.js.map → chunk-HLIR3RJ7.js.map} +1 -1
  53. package/dist/{chunk-SHRRWOVY.js → chunk-J6BH2OBA.js} +64 -21
  54. package/dist/chunk-J6BH2OBA.js.map +1 -0
  55. package/dist/{chunk-6FUJ2VYY.js → chunk-JAKYZGV4.js} +3 -3
  56. package/dist/{chunk-3VUPWDSE.js → chunk-JIZGYQYH.js} +4 -4
  57. package/dist/{chunk-QOIONSOI.js → chunk-KRGC4EDX.js} +2 -2
  58. package/dist/{chunk-AJOIM6UR.js → chunk-L5ASZA2F.js} +2 -2
  59. package/dist/{chunk-I56LKMF7.js → chunk-LXSG4L55.js} +2 -2
  60. package/dist/{chunk-MSVSP5VO.js → chunk-N3DUH6OO.js} +1 -1
  61. package/dist/chunk-N3DUH6OO.js.map +1 -0
  62. package/dist/{chunk-SQ4LU27I.js → chunk-NFRBADNR.js} +195 -80
  63. package/dist/chunk-NFRBADNR.js.map +1 -0
  64. package/dist/chunk-OJU73BUX.js +1688 -0
  65. package/dist/chunk-OJU73BUX.js.map +1 -0
  66. package/dist/{chunk-JVEMUX6L.js → chunk-OZ2KQ7HF.js} +2 -2
  67. package/dist/{chunk-SYDHFFAW.js → chunk-P5IPFZVH.js} +5 -5
  68. package/dist/{chunk-GM3BMWKR.js → chunk-REWQAFSA.js} +2 -2
  69. package/dist/{chunk-V7GDTQ6I.js → chunk-S35FX6MU.js} +2 -2
  70. package/dist/{chunk-MTHNJCOJ.js → chunk-S3OPGGZB.js} +2 -2
  71. package/dist/{chunk-IHMT6XTY.js → chunk-U5H7WHTS.js} +6 -4
  72. package/dist/{chunk-IHMT6XTY.js.map → chunk-U5H7WHTS.js.map} +1 -1
  73. package/dist/{chunk-RBHANGVX.js → chunk-UCJ5CDTK.js} +6 -6
  74. package/dist/{chunk-HHLWSWWF.js → chunk-URM3HW2R.js} +2 -2
  75. package/dist/{chunk-VO4UICII.js → chunk-YTZLBBEB.js} +2 -2
  76. package/dist/{chunk-OC56UWV5.js → chunk-YYOK4GVF.js} +2 -2
  77. package/dist/{cli-Dpivy32W.d.ts → cli-1orcdXOY.d.ts} +3 -3
  78. package/dist/cli.d.ts +6 -6
  79. package/dist/cli.js +28 -27
  80. package/dist/compounding/engine.d.ts +1 -1
  81. package/dist/compounding/engine.js +3 -3
  82. package/dist/compounding/preference-consolidator.d.ts +1 -1
  83. package/dist/compression-optimizer.d.ts +1 -1
  84. package/dist/config.d.ts +1 -1
  85. package/dist/config.js +1 -1
  86. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  87. package/dist/connectors/codex-materialize-runner.js +3 -3
  88. package/dist/connectors/codex-materialize.d.ts +1 -1
  89. package/dist/connectors/index.d.ts +1 -1
  90. package/dist/connectors/index.js +3 -3
  91. package/dist/consolidation-provenance-check.d.ts +1 -1
  92. package/dist/consolidation-undo.d.ts +1 -1
  93. package/dist/contradiction/index.d.ts +1 -1
  94. package/dist/conversation-index/backend.d.ts +1 -1
  95. package/dist/conversation-index/chunker.d.ts +1 -1
  96. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  97. package/dist/conversation-index/indexer.d.ts +1 -1
  98. package/dist/conversation-index/search.d.ts +1 -1
  99. package/dist/day-summary.d.ts +1 -1
  100. package/dist/delinearize.d.ts +1 -1
  101. package/dist/direct-answer-wiring.d.ts +1 -1
  102. package/dist/direct-answer.d.ts +1 -1
  103. package/dist/embedding-fallback.d.ts +1 -1
  104. package/dist/enrichment/index.d.ts +1 -1
  105. package/dist/entity-retrieval.d.ts +1 -1
  106. package/dist/entity-retrieval.js +3 -3
  107. package/dist/entity-schema.d.ts +1 -1
  108. package/dist/explicit-capture.d.ts +4 -4
  109. package/dist/extraction-faithfulness.d.ts +1 -1
  110. package/dist/extraction-judge-telemetry.d.ts +1 -1
  111. package/dist/extraction-judge-training.d.ts +1 -1
  112. package/dist/extraction-judge.d.ts +1 -1
  113. package/dist/extraction.d.ts +1 -1
  114. package/dist/fallback-llm.d.ts +1 -1
  115. package/dist/identity-continuity.d.ts +1 -1
  116. package/dist/importance.d.ts +1 -1
  117. package/dist/index.d.ts +9 -9
  118. package/dist/index.js +42 -41
  119. package/dist/index.js.map +1 -1
  120. package/dist/intent.d.ts +1 -1
  121. package/dist/lcm/engine.d.ts +1 -1
  122. package/dist/lcm/index.d.ts +1 -1
  123. package/dist/lcm/tools.d.ts +1 -1
  124. package/dist/lifecycle.d.ts +1 -1
  125. package/dist/live-connectors-runner.d.ts +1 -1
  126. package/dist/local-llm.d.ts +1 -1
  127. package/dist/maintenance/memory-governance.d.ts +1 -1
  128. package/dist/maintenance/memory-governance.js +3 -3
  129. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  130. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  131. package/dist/mcp-memory-inspector-app.d.ts +5 -5
  132. package/dist/memory-action-policy.d.ts +1 -1
  133. package/dist/memory-cache.d.ts +1 -1
  134. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  135. package/dist/memory-projection-store.d.ts +1 -1
  136. package/dist/memory-provenance.d.ts +1 -1
  137. package/dist/memory-worth-outcomes.d.ts +1 -1
  138. package/dist/models-json.d.ts +1 -1
  139. package/dist/namespaces/migrate.d.ts +2 -2
  140. package/dist/namespaces/migrate.js +4 -4
  141. package/dist/namespaces/principal.d.ts +1 -1
  142. package/dist/namespaces/search.d.ts +1 -1
  143. package/dist/namespaces/storage.d.ts +2 -2
  144. package/dist/namespaces/storage.js +3 -3
  145. package/dist/native-knowledge.d.ts +1 -1
  146. package/dist/operator-toolkit.d.ts +1 -1
  147. package/dist/operator-toolkit.js +11 -9
  148. package/dist/orchestration/maintenance.d.ts +2 -2
  149. package/dist/orchestration/maintenance.js +8 -5
  150. package/dist/{orchestrator-vygo2YIM.d.ts → orchestrator-kOxredSr.d.ts} +22 -5
  151. package/dist/orchestrator.d.ts +4 -4
  152. package/dist/orchestrator.js +17 -16
  153. package/dist/patterns-cli.d.ts +1 -1
  154. package/dist/policy-runtime.d.ts +1 -1
  155. package/dist/provenance.d.ts +1 -1
  156. package/dist/qmd-recall-cache.d.ts +1 -1
  157. package/dist/qmd.d.ts +1 -1
  158. package/dist/recall-disclosure-escalation.d.ts +1 -1
  159. package/dist/recall-explain-renderer.d.ts +1 -1
  160. package/dist/recall-explain-renderer.js +3 -3
  161. package/dist/recall-planner-llm.d.ts +1 -1
  162. package/dist/recall-state.d.ts +1 -1
  163. package/dist/recall-tag-filter.d.ts +1 -1
  164. package/dist/recall-xray-cli.d.ts +1 -1
  165. package/dist/recall-xray-cli.js +4 -4
  166. package/dist/recall-xray-renderer.d.ts +1 -1
  167. package/dist/recall-xray-renderer.js +3 -3
  168. package/dist/recall-xray.d.ts +1 -1
  169. package/dist/recall-xray.js +2 -2
  170. package/dist/resolve-auth-token.d.ts +1 -1
  171. package/dist/resume-bundles.js +2 -2
  172. package/dist/retrieval-agents.d.ts +1 -1
  173. package/dist/retrieval-tiers.d.ts +1 -1
  174. package/dist/routing/engine.d.ts +1 -1
  175. package/dist/routing/store.d.ts +1 -1
  176. package/dist/schemas.d.ts +22 -22
  177. package/dist/search/embed-helper.d.ts +1 -1
  178. package/dist/search/factory.d.ts +1 -1
  179. package/dist/search/index.d.ts +1 -1
  180. package/dist/search/lancedb-backend.d.ts +1 -1
  181. package/dist/search/meilisearch-backend.d.ts +1 -1
  182. package/dist/search/noop-backend.d.ts +1 -1
  183. package/dist/search/orama-backend.d.ts +1 -1
  184. package/dist/search/port.d.ts +1 -1
  185. package/dist/search/remote-backend.d.ts +1 -1
  186. package/dist/{semantic-consolidation-DSjMDZ1u.d.ts → semantic-consolidation-B58v3S-a.d.ts} +1 -1
  187. package/dist/semantic-consolidation.d.ts +2 -2
  188. package/dist/semantic-consolidation.js +4 -4
  189. package/dist/semantic-rule-promotion.js +3 -3
  190. package/dist/semantic-rule-verifier.d.ts +1 -1
  191. package/dist/semantic-rule-verifier.js +3 -3
  192. package/dist/session-observer-bands.d.ts +1 -1
  193. package/dist/session-observer-state.d.ts +1 -1
  194. package/dist/shared-context/manager.d.ts +1 -1
  195. package/dist/signal.d.ts +1 -1
  196. package/dist/storage.d.ts +1 -1
  197. package/dist/storage.js +2 -2
  198. package/dist/summarizer.d.ts +1 -1
  199. package/dist/summary-snapshot.d.ts +1 -1
  200. package/dist/temporal-supersession.d.ts +1 -1
  201. package/dist/temporal-validity.d.ts +1 -1
  202. package/dist/threading.d.ts +1 -1
  203. package/dist/tier-migration.d.ts +1 -1
  204. package/dist/tier-routing.d.ts +1 -1
  205. package/dist/topics.d.ts +1 -1
  206. package/dist/transcript.d.ts +1 -1
  207. package/dist/transfer/types.d.ts +12 -12
  208. package/dist/{types-D9dwzU_x.d.ts → types-ACmDOScJ.d.ts} +36 -0
  209. package/dist/types.d.ts +1 -1
  210. package/dist/types.js +1 -1
  211. package/dist/utility-runtime.d.ts +1 -1
  212. package/dist/verified-recall.js +3 -3
  213. package/package.json +2 -2
  214. package/src/access-service.ts +56 -41
  215. package/src/briefing.ts +32 -0
  216. package/src/config.ts +32 -0
  217. package/src/correction/index.ts +24 -0
  218. package/src/correction/passive-capture.test.ts +500 -0
  219. package/src/correction/passive-capture.ts +335 -0
  220. package/src/correction/passive-correction-detector.test.ts +263 -0
  221. package/src/correction/passive-correction-detector.ts +325 -0
  222. package/src/correction/passive-correction-notifications.ts +123 -0
  223. package/src/maintenance/namespace-planner.ts +3 -10
  224. package/src/orchestrator.ts +231 -73
  225. package/src/scopes/scope-plan.test.ts +168 -1
  226. package/src/scopes/scope-plan.ts +163 -0
  227. package/src/types.ts +36 -0
  228. package/dist/chunk-BNOAB5HH.js.map +0 -1
  229. package/dist/chunk-JEIROMLX.js.map +0 -1
  230. package/dist/chunk-MSVSP5VO.js.map +0 -1
  231. package/dist/chunk-SHRRWOVY.js.map +0 -1
  232. package/dist/chunk-SQ4LU27I.js.map +0 -1
  233. package/dist/chunk-XCTDHF7U.js.map +0 -1
  234. /package/dist/{chunk-XZTUMWKQ.js.map → chunk-2PTBLS2S.js.map} +0 -0
  235. /package/dist/{chunk-2Y6LMOQQ.js.map → chunk-2VHMVWPU.js.map} +0 -0
  236. /package/dist/{chunk-6UU43ZGD.js.map → chunk-4KZGLDJJ.js.map} +0 -0
  237. /package/dist/{chunk-K44MIN6D.js.map → chunk-5RHM43BJ.js.map} +0 -0
  238. /package/dist/{chunk-MECU6WSH.js.map → chunk-72VDBALG.js.map} +0 -0
  239. /package/dist/{chunk-UY4JMEAK.js.map → chunk-7EEVXW7X.js.map} +0 -0
  240. /package/dist/{chunk-WI4QX7GH.js.map → chunk-A66YRSOS.js.map} +0 -0
  241. /package/dist/{chunk-O62P2LFL.js.map → chunk-APUJIMDM.js.map} +0 -0
  242. /package/dist/{chunk-MPHDVHIB.js.map → chunk-DIFU33GU.js.map} +0 -0
  243. /package/dist/{chunk-DXGS5YOQ.js.map → chunk-EH27LHML.js.map} +0 -0
  244. /package/dist/{chunk-6FUJ2VYY.js.map → chunk-JAKYZGV4.js.map} +0 -0
  245. /package/dist/{chunk-3VUPWDSE.js.map → chunk-JIZGYQYH.js.map} +0 -0
  246. /package/dist/{chunk-QOIONSOI.js.map → chunk-KRGC4EDX.js.map} +0 -0
  247. /package/dist/{chunk-AJOIM6UR.js.map → chunk-L5ASZA2F.js.map} +0 -0
  248. /package/dist/{chunk-I56LKMF7.js.map → chunk-LXSG4L55.js.map} +0 -0
  249. /package/dist/{chunk-JVEMUX6L.js.map → chunk-OZ2KQ7HF.js.map} +0 -0
  250. /package/dist/{chunk-SYDHFFAW.js.map → chunk-P5IPFZVH.js.map} +0 -0
  251. /package/dist/{chunk-GM3BMWKR.js.map → chunk-REWQAFSA.js.map} +0 -0
  252. /package/dist/{chunk-V7GDTQ6I.js.map → chunk-S35FX6MU.js.map} +0 -0
  253. /package/dist/{chunk-MTHNJCOJ.js.map → chunk-S3OPGGZB.js.map} +0 -0
  254. /package/dist/{chunk-RBHANGVX.js.map → chunk-UCJ5CDTK.js.map} +0 -0
  255. /package/dist/{chunk-HHLWSWWF.js.map → chunk-URM3HW2R.js.map} +0 -0
  256. /package/dist/{chunk-VO4UICII.js.map → chunk-YTZLBBEB.js.map} +0 -0
  257. /package/dist/{chunk-OC56UWV5.js.map → chunk-YYOK4GVF.js.map} +0 -0
@@ -33,10 +33,16 @@
33
33
 
34
34
  import {
35
35
  canReadNamespace,
36
+ canWriteNamespace,
36
37
  defaultNamespaceForPrincipal,
37
38
  recallNamespacesForPrincipal,
38
39
  resolvePrincipal,
39
40
  } from "../namespaces/principal.js";
41
+ import {
42
+ namespaceIdentityFromToken,
43
+ namespaceIdentityToken,
44
+ } from "../namespaces/identity.js";
45
+ import path from "node:path";
40
46
  import type { ResolvedScopeProfilePlan } from "../namespaces/scope-profiles.js";
41
47
  import {
42
48
  expandScopeProfileReadNamespaces,
@@ -318,3 +324,160 @@ export function resolveScopePlan(options: ResolveScopePlanOptions): ScopePlan {
318
324
  scopeProfilePlan,
319
325
  };
320
326
  }
327
+
328
+ // ────────────────────────────────────────────────────────────────────────────
329
+ // Centralized namespace-resolution helpers (issue #1521 step 3–4)
330
+ //
331
+ // The three functions below consolidate the ad-hoc namespace-resolution logic
332
+ // that was previously scattered across orchestrator.ts (namespaceFromStorageDir,
333
+ // configuredNamespaces) and access-service.ts (resolveWritableNamespace). By
334
+ // living in THIS module they are excluded from the adHocNamespaceResolutions
335
+ // ratchet, and every consumer reaches them through a single well-known import
336
+ // instead of reimplementing the derivation inline (#1519's failure mode).
337
+ // ────────────────────────────────────────────────────────────────────────────
338
+
339
+ /**
340
+ * The configured namespace set: default + shared + every namespace-policy
341
+ * name, trimmed and de-duplicated. Pure — reads only from `config`.
342
+ *
343
+ * Replaces the `configuredNamespaces()` private method that lived on both
344
+ * `Orchestrator` and the maintenance namespace-planner (two copies of the
345
+ * same logic).
346
+ */
347
+ export function getConfiguredNamespaces(config: PluginConfig): string[] {
348
+ return Array.from(
349
+ new Set(
350
+ [
351
+ config.defaultNamespace,
352
+ config.sharedNamespace,
353
+ ...config.namespacePolicies.map((policy) => policy.name),
354
+ ]
355
+ .map((value) => value.trim())
356
+ .filter(Boolean),
357
+ ),
358
+ );
359
+ }
360
+
361
+ /**
362
+ * Options for {@link resolveNamespaceFromStorageDir}.
363
+ */
364
+ export interface ResolveNamespaceFromStorageDirOptions {
365
+ /** Plugin config (memoryDir, defaultNamespace, namespacesEnabled, …). */
366
+ readonly config: PluginConfig;
367
+ /**
368
+ * Pre-computed configured-namespace set (from {@link getConfiguredNamespaces}).
369
+ * Passed by the caller so this function does not re-derive it on every call.
370
+ */
371
+ readonly configuredNamespaces: readonly string[];
372
+ /**
373
+ * Catalog-owned dir→namespace hints (best-effort union of configured +
374
+ * catalog-discovered). May be `undefined` when no catalog hints are loaded.
375
+ */
376
+ readonly hints?: ReadonlyMap<string, ReadonlySet<string>> | undefined;
377
+ /**
378
+ * Lazy catalog-hint loader. Called ONLY after the early returns (disabled,
379
+ * memory root, no namespace segment, configured namespace) — matching the
380
+ * original lazy behavior so an eager load does not mark hints as loaded
381
+ * before the catalog file exists (codex P2).
382
+ */
383
+ readonly loadHints?: () => void;
384
+ }
385
+
386
+ /**
387
+ * Derive the namespace a storage directory belongs to.
388
+ *
389
+ * Pure (no orchestrator state): the caller passes `config`, the configured set,
390
+ * and any catalog hints. The logic is byte-identical to the private
391
+ * `namespaceFromStorageDir` method that previously lived on `Orchestrator`
392
+ * (including the token round-trip guard from codex round 6).
393
+ */
394
+ export function resolveNamespaceFromStorageDir(
395
+ storageDir: string,
396
+ options: ResolveNamespaceFromStorageDirOptions,
397
+ ): string {
398
+ const { config } = options;
399
+ if (!config.namespacesEnabled) return config.defaultNamespace;
400
+ const resolvedStorageDir = path.resolve(storageDir);
401
+ const resolvedMemoryDir = path.resolve(config.memoryDir);
402
+ if (resolvedStorageDir === resolvedMemoryDir) return config.defaultNamespace;
403
+ const m = resolvedStorageDir.match(/[\\/]namespaces[\\/]([^\\/]+)$/);
404
+ if (!m?.[1]) return config.defaultNamespace;
405
+ const dirName = m[1];
406
+ // Token-shaped raw names (codex P2 — NBsFz): a dir name might be a tokenized
407
+ // identity OR a literal raw namespace name that merely LOOKS like a token.
408
+ // A dir name that is itself a KNOWN namespace is preserved BEFORE decoding.
409
+ if (options.configuredNamespaces.includes(dirName)) {
410
+ return dirName;
411
+ }
412
+ // Load catalog hints ONLY after the early returns (codex P2: an eager load
413
+ // before the catalog file exists would mark hints as loaded and skip later
414
+ // catalog-derived rows).
415
+ options.loadHints?.();
416
+ const hints = options.hints;
417
+ const hintedNamespaces = hints?.get(resolvedStorageDir);
418
+ if (hintedNamespaces?.has(dirName)) {
419
+ return dirName;
420
+ }
421
+ if (hintedNamespaces?.size === 1) {
422
+ const [hintedNamespace] = hintedNamespaces;
423
+ if (hintedNamespace) return hintedNamespace;
424
+ }
425
+ const decoded = namespaceIdentityFromToken(dirName);
426
+ if (decoded && namespaceIdentityToken(decoded) === dirName) {
427
+ return decoded;
428
+ }
429
+ return dirName;
430
+ }
431
+
432
+ /**
433
+ * Result of resolving a writable namespace: either the authorized namespace
434
+ * or a structured rejection. The caller decides how to surface the rejection
435
+ * (e.g. as an `EngramAccessInputError` in the access-service layer), keeping
436
+ * this module free of transport-specific error types.
437
+ */
438
+ export type WritableNamespaceResult =
439
+ | { readonly ok: true; readonly namespace: string }
440
+ | { readonly ok: false; readonly reason: "unsupported" | "not_writable"; readonly namespace: string };
441
+
442
+ /**
443
+ * Resolve and authorize a writable namespace.
444
+ *
445
+ * Combines the three steps that `AccessService.resolveWritableNamespace`
446
+ * performed inline: (1) resolve the namespace value (trim → default fallback →
447
+ * validate against `namespacesEnabled`), (2) resolve the principal, (3) check
448
+ * `canWriteNamespace`. Returns a structured result so this module stays free of
449
+ * `EngramAccessInputError` (avoiding a circular dependency on access-service.ts).
450
+ *
451
+ * The caller throws `EngramAccessInputError` when `ok === false` — the access-
452
+ * service wrapper does this in one place.
453
+ */
454
+ export function resolveWritableNamespaceValue(
455
+ namespace: string | undefined,
456
+ sessionKey: string | undefined,
457
+ authenticatedPrincipal: string | undefined,
458
+ config: PluginConfig,
459
+ ): WritableNamespaceResult {
460
+ const requested = namespace?.trim();
461
+ let resolved: string;
462
+ if (!requested) {
463
+ resolved = config.defaultNamespace;
464
+ } else if (
465
+ !config.namespacesEnabled &&
466
+ requested !== config.defaultNamespace
467
+ ) {
468
+ return { ok: false, reason: "unsupported", namespace: requested };
469
+ } else {
470
+ resolved = requested;
471
+ }
472
+
473
+ const trusted = authenticatedPrincipal?.trim();
474
+ const principal =
475
+ typeof trusted === "string" && trusted.length > 0
476
+ ? trusted
477
+ : resolvePrincipal(sessionKey, config);
478
+
479
+ if (!canWriteNamespace(principal, resolved, config)) {
480
+ return { ok: false, reason: "not_writable", namespace: resolved };
481
+ }
482
+ return { ok: true, namespace: resolved };
483
+ }
package/src/types.ts CHANGED
@@ -862,6 +862,29 @@ export interface PluginConfig {
862
862
  * `24`. Parsed from `correction.planTtlHours` / `correctionPlanTtlHours`.
863
863
  */
864
864
  correctionPlanTtlHours: number;
865
+ /**
866
+ * Passive correction capture (issue #1581) — detects corrections expressed
867
+ * passively in conversation turns during extraction and routes them to the
868
+ * Correction Contract (#1580). `"off"` disables detection entirely; `"queue"`
869
+ * plans corrections for human review (conservative); `"auto"` applies
870
+ * immediately when all safety guards pass, otherwise falls back to queue.
871
+ * Default `"off"` — operators opt in (rule 48). Parsed from
872
+ * `correctionCapture.mode` / `correctionCaptureMode`.
873
+ */
874
+ correctionCaptureMode: "off" | "queue" | "auto";
875
+ /**
876
+ * Minimum planner confidence for auto-apply (issue #1581). Plans below this
877
+ * floor are queued even in `"auto"` mode. Default `0.85`. Parsed from
878
+ * `correctionCapture.confidenceFloor` / `correctionCaptureConfidenceFloor`.
879
+ */
880
+ correctionCaptureConfidenceFloor: number;
881
+ /**
882
+ * Maximum affected memories for auto-apply (issue #1581). Plans touching more
883
+ * memories than this are queued even in `"auto"` mode — a blast-radius cap.
884
+ * Default `2`. Parsed from `correctionCapture.autoApplyMaxAffected` /
885
+ * `correctionCaptureAutoApplyMaxAffected`.
886
+ */
887
+ correctionCaptureAutoApplyMaxAffected: number;
865
888
  // Tombstones — non-resurrection invariant (issue #1579).
866
889
  /**
867
890
  * Master gate for the tombstone non-resurrection invariant. When `true`
@@ -2178,6 +2201,19 @@ export interface BriefingResult {
2178
2201
  * Allows callers to distinguish "no events today" from "source unavailable".
2179
2202
  */
2180
2203
  calendarSourceErrors?: BriefingCalendarSourceError[];
2204
+ /**
2205
+ * Auto-applied passive corrections drained from the notification queue at
2206
+ * briefing time (issue #1581). Each carries a one-line summary and the undo
2207
+ * command. Drained exactly once — the queue file is cleared on read, so a
2208
+ * notification appears in at most one briefing. Absent when the correction
2209
+ * capture feature is off or no corrections were auto-applied.
2210
+ */
2211
+ correctionNotifications?: ReadonlyArray<{
2212
+ planId: string;
2213
+ summary: string;
2214
+ undoCommand: string;
2215
+ createdAt: string;
2216
+ }>;
2181
2217
  }
2182
2218
 
2183
2219
  /**