@remnic/core 10.0.57 → 10.0.59

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 (161) hide show
  1. package/dist/access-admin-ops-surface.js +11 -11
  2. package/dist/access-authorization-probe.js +12 -12
  3. package/dist/access-boundary.js +11 -11
  4. package/dist/access-cli.js +47 -47
  5. package/dist/access-extraction-force-flush.js +11 -11
  6. package/dist/access-http-briefing.js +12 -12
  7. package/dist/access-http-query.js +13 -13
  8. package/dist/access-http.js +27 -27
  9. package/dist/access-identity-continuity-surface.js +11 -11
  10. package/dist/access-lcm-surface.js +11 -11
  11. package/dist/access-mcp.js +20 -20
  12. package/dist/access-namespace-preflight.js +11 -11
  13. package/dist/access-observe-write-surface.js +11 -11
  14. package/dist/access-operations-batch.js +12 -12
  15. package/dist/access-operations.js +19 -19
  16. package/dist/access-recall-concurrency.js +11 -11
  17. package/dist/access-recall-response.js +11 -11
  18. package/dist/access-recall-surface.js +11 -11
  19. package/dist/access-service.js +11 -11
  20. package/dist/access-surface-catalog.js +13 -13
  21. package/dist/active-recall.js +1 -1
  22. package/dist/briefing.js +2 -2
  23. package/dist/causal-consolidation.js +3 -3
  24. package/dist/{chunk-LIVNX7WK.js → chunk-2IVK5IDY.js} +2 -2
  25. package/dist/{chunk-HJQ4NKKO.js → chunk-37VTMUAL.js} +2 -2
  26. package/dist/{chunk-E2YAGEFR.js → chunk-3E3Z6UA3.js} +18 -18
  27. package/dist/{chunk-TRAOZ2WP.js → chunk-4B73TQQV.js} +2 -2
  28. package/dist/{chunk-53OFDW3P.js → chunk-4G2A7MH3.js} +3 -3
  29. package/dist/{chunk-UQYBPPVC.js → chunk-5U2BBF7E.js} +2 -2
  30. package/dist/{chunk-LTDK6HBV.js → chunk-6BO27AWQ.js} +2 -2
  31. package/dist/{chunk-65B5RFKQ.js → chunk-7NT3FKAF.js} +2 -2
  32. package/dist/{chunk-34UVJNSG.js → chunk-AMKIIRLL.js} +2 -2
  33. package/dist/{chunk-YLN4ZQV4.js → chunk-BPIAXMGC.js} +2 -2
  34. package/dist/{chunk-FZLZUDJJ.js → chunk-DJR37Q37.js} +2 -2
  35. package/dist/{chunk-IFOCK3OJ.js → chunk-EH46DHBU.js} +2 -2
  36. package/dist/{chunk-KCTL5EY7.js → chunk-EJFOGYF3.js} +3 -3
  37. package/dist/{chunk-XHEKS4UN.js → chunk-FB4JQEFS.js} +2 -2
  38. package/dist/{chunk-W3R77WHT.js → chunk-FXWX7VD3.js} +7 -7
  39. package/dist/{chunk-L5UB5BIY.js → chunk-IEW6NDHX.js} +7 -7
  40. package/dist/{chunk-W4QTA2H5.js → chunk-IQSRVR6Z.js} +2 -2
  41. package/dist/{chunk-CIMD2MUR.js → chunk-ISNPYOXR.js} +3 -3
  42. package/dist/{chunk-QAHP5SBG.js → chunk-JD5F5MYN.js} +3 -3
  43. package/dist/{chunk-HM3ZTDAX.js → chunk-JY2BGCYN.js} +2 -2
  44. package/dist/{chunk-HJ4X4BGS.js → chunk-JZRQY7ZQ.js} +2 -2
  45. package/dist/{chunk-UBOWDOL5.js → chunk-KAL5SXPP.js} +5 -5
  46. package/dist/{chunk-B43P3DTC.js → chunk-KBOQQEVC.js} +2 -2
  47. package/dist/{chunk-CTNDFKEX.js → chunk-KMJDH4KX.js} +10 -10
  48. package/dist/{chunk-LRVFS4KA.js → chunk-LLG5VNK7.js} +2 -2
  49. package/dist/{chunk-TTTPTQ6S.js → chunk-MLUPSZFK.js} +2 -2
  50. package/dist/{chunk-VGE4PUY6.js → chunk-NGH74LDV.js} +2 -2
  51. package/dist/{chunk-2EYCW2ET.js → chunk-OL7A7NKH.js} +2 -2
  52. package/dist/{chunk-AOSCGNIC.js → chunk-PM4PKC3Y.js} +2 -2
  53. package/dist/{chunk-W2KH27MQ.js → chunk-QY24FSXT.js} +16 -16
  54. package/dist/{chunk-QS5DUSBM.js → chunk-R4BR62UO.js} +2 -2
  55. package/dist/{chunk-W7NKMRAF.js → chunk-RFT4OPYI.js} +2 -2
  56. package/dist/{chunk-AO5ZOD32.js → chunk-RHJ5VGB3.js} +2 -2
  57. package/dist/{chunk-FFQNNFHX.js → chunk-RYB553SS.js} +2 -2
  58. package/dist/{chunk-3632XJMR.js → chunk-TYSD7UQO.js} +2 -2
  59. package/dist/{chunk-V4VCBFAL.js → chunk-UGTYADB4.js} +3 -3
  60. package/dist/{chunk-7XGNGLAN.js → chunk-UHH67NLU.js} +2 -2
  61. package/dist/{chunk-5LBBXI2A.js → chunk-USNU3BEQ.js} +2 -2
  62. package/dist/{chunk-OWNAWY6D.js → chunk-VCLNU6MY.js} +2 -2
  63. package/dist/{chunk-3LNAQLW4.js → chunk-WASVDS6G.js} +3 -3
  64. package/dist/{chunk-OCXDZJL4.js → chunk-WXBVGKS6.js} +14 -13
  65. package/dist/chunk-WXBVGKS6.js.map +1 -0
  66. package/dist/{chunk-4W5B5Z6P.js → chunk-WZYAXOGO.js} +2 -2
  67. package/dist/{chunk-QF5EJ5VP.js → chunk-Y5KESB7T.js} +8 -8
  68. package/dist/{chunk-6CDNOREO.js → chunk-YDDLSGYE.js} +2 -2
  69. package/dist/{chunk-M4U25HLR.js → chunk-YZNTAOPZ.js} +2 -2
  70. package/dist/{chunk-3H3PNQEF.js → chunk-ZAZZOQAQ.js} +2 -2
  71. package/dist/{chunk-P5FYZH5G.js → chunk-ZE5N4JSY.js} +2 -2
  72. package/dist/cli.js +37 -37
  73. package/dist/coding/export-okf-codegraph.js +1 -1
  74. package/dist/compounding/engine.js +3 -3
  75. package/dist/config.js +1 -1
  76. package/dist/connectors/codex-materialize-runner.js +2 -2
  77. package/dist/connectors/index.js +2 -2
  78. package/dist/convergence-refresh.js +4 -4
  79. package/dist/corpus-watermark.js +4 -4
  80. package/dist/entity-retrieval.js +2 -2
  81. package/dist/external-wiki-access.js +12 -12
  82. package/dist/extraction.js +2 -2
  83. package/dist/harmonic-retrieval.js +2 -2
  84. package/dist/index.js +47 -47
  85. package/dist/location/index.js +4 -4
  86. package/dist/maintenance/memory-governance.js +2 -2
  87. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +2 -2
  88. package/dist/maintenance/rebuild-memory-projection-runner.js +4 -4
  89. package/dist/maintenance/rebuild-memory-projection.js +3 -3
  90. package/dist/memory-browse-operations.js +12 -12
  91. package/dist/namespaces/migrate.js +3 -3
  92. package/dist/namespaces/storage.js +2 -2
  93. package/dist/operator-doctor-corpus.js +5 -5
  94. package/dist/operator-toolkit.js +10 -10
  95. package/dist/orchestration/maintenance.js +12 -12
  96. package/dist/orchestrator.js +47 -47
  97. package/dist/recall-navigation-operations.js +12 -12
  98. package/dist/recall-navigation.js +11 -11
  99. package/dist/resume-bundles.js +1 -1
  100. package/dist/semantic-consolidation.js +3 -3
  101. package/dist/semantic-rule-promotion.js +2 -2
  102. package/dist/semantic-rule-verifier.js +2 -2
  103. package/dist/source-agent-qualifier.js +2 -2
  104. package/dist/standup/build.js +2 -2
  105. package/dist/storage/memory-read-store.d.ts +11 -3
  106. package/dist/storage/memory-read-store.d.ts.map +1 -1
  107. package/dist/storage.js +1 -1
  108. package/dist/support-passport/index.js +14 -14
  109. package/dist/transfer/export-okf.js +2 -2
  110. package/dist/verified-recall.js +2 -2
  111. package/dist/who-knows-cli.js +3 -3
  112. package/dist/who-knows.js +2 -2
  113. package/package.json +2 -2
  114. package/src/storage/memory-read-store.ts +22 -32
  115. package/dist/chunk-OCXDZJL4.js.map +0 -1
  116. /package/dist/{chunk-LIVNX7WK.js.map → chunk-2IVK5IDY.js.map} +0 -0
  117. /package/dist/{chunk-HJQ4NKKO.js.map → chunk-37VTMUAL.js.map} +0 -0
  118. /package/dist/{chunk-E2YAGEFR.js.map → chunk-3E3Z6UA3.js.map} +0 -0
  119. /package/dist/{chunk-TRAOZ2WP.js.map → chunk-4B73TQQV.js.map} +0 -0
  120. /package/dist/{chunk-53OFDW3P.js.map → chunk-4G2A7MH3.js.map} +0 -0
  121. /package/dist/{chunk-UQYBPPVC.js.map → chunk-5U2BBF7E.js.map} +0 -0
  122. /package/dist/{chunk-LTDK6HBV.js.map → chunk-6BO27AWQ.js.map} +0 -0
  123. /package/dist/{chunk-65B5RFKQ.js.map → chunk-7NT3FKAF.js.map} +0 -0
  124. /package/dist/{chunk-34UVJNSG.js.map → chunk-AMKIIRLL.js.map} +0 -0
  125. /package/dist/{chunk-YLN4ZQV4.js.map → chunk-BPIAXMGC.js.map} +0 -0
  126. /package/dist/{chunk-FZLZUDJJ.js.map → chunk-DJR37Q37.js.map} +0 -0
  127. /package/dist/{chunk-IFOCK3OJ.js.map → chunk-EH46DHBU.js.map} +0 -0
  128. /package/dist/{chunk-KCTL5EY7.js.map → chunk-EJFOGYF3.js.map} +0 -0
  129. /package/dist/{chunk-XHEKS4UN.js.map → chunk-FB4JQEFS.js.map} +0 -0
  130. /package/dist/{chunk-W3R77WHT.js.map → chunk-FXWX7VD3.js.map} +0 -0
  131. /package/dist/{chunk-L5UB5BIY.js.map → chunk-IEW6NDHX.js.map} +0 -0
  132. /package/dist/{chunk-W4QTA2H5.js.map → chunk-IQSRVR6Z.js.map} +0 -0
  133. /package/dist/{chunk-CIMD2MUR.js.map → chunk-ISNPYOXR.js.map} +0 -0
  134. /package/dist/{chunk-QAHP5SBG.js.map → chunk-JD5F5MYN.js.map} +0 -0
  135. /package/dist/{chunk-HM3ZTDAX.js.map → chunk-JY2BGCYN.js.map} +0 -0
  136. /package/dist/{chunk-HJ4X4BGS.js.map → chunk-JZRQY7ZQ.js.map} +0 -0
  137. /package/dist/{chunk-UBOWDOL5.js.map → chunk-KAL5SXPP.js.map} +0 -0
  138. /package/dist/{chunk-B43P3DTC.js.map → chunk-KBOQQEVC.js.map} +0 -0
  139. /package/dist/{chunk-CTNDFKEX.js.map → chunk-KMJDH4KX.js.map} +0 -0
  140. /package/dist/{chunk-LRVFS4KA.js.map → chunk-LLG5VNK7.js.map} +0 -0
  141. /package/dist/{chunk-TTTPTQ6S.js.map → chunk-MLUPSZFK.js.map} +0 -0
  142. /package/dist/{chunk-VGE4PUY6.js.map → chunk-NGH74LDV.js.map} +0 -0
  143. /package/dist/{chunk-2EYCW2ET.js.map → chunk-OL7A7NKH.js.map} +0 -0
  144. /package/dist/{chunk-AOSCGNIC.js.map → chunk-PM4PKC3Y.js.map} +0 -0
  145. /package/dist/{chunk-W2KH27MQ.js.map → chunk-QY24FSXT.js.map} +0 -0
  146. /package/dist/{chunk-QS5DUSBM.js.map → chunk-R4BR62UO.js.map} +0 -0
  147. /package/dist/{chunk-W7NKMRAF.js.map → chunk-RFT4OPYI.js.map} +0 -0
  148. /package/dist/{chunk-AO5ZOD32.js.map → chunk-RHJ5VGB3.js.map} +0 -0
  149. /package/dist/{chunk-FFQNNFHX.js.map → chunk-RYB553SS.js.map} +0 -0
  150. /package/dist/{chunk-3632XJMR.js.map → chunk-TYSD7UQO.js.map} +0 -0
  151. /package/dist/{chunk-V4VCBFAL.js.map → chunk-UGTYADB4.js.map} +0 -0
  152. /package/dist/{chunk-7XGNGLAN.js.map → chunk-UHH67NLU.js.map} +0 -0
  153. /package/dist/{chunk-5LBBXI2A.js.map → chunk-USNU3BEQ.js.map} +0 -0
  154. /package/dist/{chunk-OWNAWY6D.js.map → chunk-VCLNU6MY.js.map} +0 -0
  155. /package/dist/{chunk-3LNAQLW4.js.map → chunk-WASVDS6G.js.map} +0 -0
  156. /package/dist/{chunk-4W5B5Z6P.js.map → chunk-WZYAXOGO.js.map} +0 -0
  157. /package/dist/{chunk-QF5EJ5VP.js.map → chunk-Y5KESB7T.js.map} +0 -0
  158. /package/dist/{chunk-6CDNOREO.js.map → chunk-YDDLSGYE.js.map} +0 -0
  159. /package/dist/{chunk-M4U25HLR.js.map → chunk-YZNTAOPZ.js.map} +0 -0
  160. /package/dist/{chunk-3H3PNQEF.js.map → chunk-ZAZZOQAQ.js.map} +0 -0
  161. /package/dist/{chunk-P5FYZH5G.js.map → chunk-ZE5N4JSY.js.map} +0 -0
@@ -4,9 +4,9 @@ import {
4
4
  renderWhoKnows,
5
5
  renderWhoKnowsJson,
6
6
  renderWhoKnowsText
7
- } from "./chunk-YLN4ZQV4.js";
8
- import "./chunk-5LBBXI2A.js";
9
- import "./chunk-OCXDZJL4.js";
7
+ } from "./chunk-BPIAXMGC.js";
8
+ import "./chunk-USNU3BEQ.js";
9
+ import "./chunk-WXBVGKS6.js";
10
10
  import "./chunk-UHVXE24Y.js";
11
11
  import "./chunk-DM5QZ3YU.js";
12
12
  import "./chunk-G6A3SGCE.js";
package/dist/who-knows.js CHANGED
@@ -9,8 +9,8 @@ import {
9
9
  loadWhoKnowsEntities,
10
10
  tokenizeTopic,
11
11
  validateWhoKnowsInput
12
- } from "./chunk-5LBBXI2A.js";
13
- import "./chunk-OCXDZJL4.js";
12
+ } from "./chunk-USNU3BEQ.js";
13
+ import "./chunk-WXBVGKS6.js";
14
14
  import "./chunk-UHVXE24Y.js";
15
15
  import "./chunk-DM5QZ3YU.js";
16
16
  import "./chunk-G6A3SGCE.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "10.0.57",
3
+ "version": "10.0.59",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3346,7 +3346,7 @@
3346
3346
  "core"
3347
3347
  ],
3348
3348
  "peerDependencies": {
3349
- "@remnic/coding-graph": "^10.0.57"
3349
+ "@remnic/coding-graph": "^10.0.59"
3350
3350
  },
3351
3351
  "peerDependenciesMeta": {
3352
3352
  "@remnic/coding-graph": {
@@ -19,7 +19,6 @@ import { RECALL_FALLBACK_DIRS } from "../utils/category-dir.js";
19
19
  import { isErrnoCode } from "../utils/errno.js";
20
20
  import { isPopulatedUnnamedEntityRecord } from "../utils/malformed-entity-record.js";
21
21
  import { isMacOsReplicationJunkBasename } from "../utils/macos-replication-junk.js";
22
- import { assertPathInsideRoot } from "../utils/path-containment.js";
23
22
  import { isAbortError } from "../abort-error.js";
24
23
  import { checkCorpusReadAbort, type CorpusReadOptions } from "../corpus-read-cancellation.js";
25
24
  import { isValidTranscriptDate } from "../wearables/day-store.js";
@@ -89,8 +88,7 @@ export interface MemoryReadStoreDeps {
89
88
  /**
90
89
  * A backend READ failure worth propagating from a strict (census) scan: an
91
90
  * errno-coded fs error that is NOT `ENOENT`. `ENOENT` (an absent dir) and
92
- * code-less rejections (symlink-escape containment failures from
93
- * assertPathInsideRoot) are expected and skipped; `EACCES`/`EIO`/… mean the
91
+ * code-less rejections are expected and skipped; `EACCES`/`EIO`/… mean the
94
92
  * corpus is unreadable and a divergence census must fail loud rather than
95
93
  * silently publish a partial count (issue #2156 round-5). Non-strict (recall)
96
94
  * callers ignore this and degrade to a best-effort partial scan.
@@ -233,9 +231,17 @@ export class MemoryReadStore {
233
231
  /**
234
232
  * Recursively collect `*.md` paths under `startDirs`, hardened against symlink
235
233
  * escape: a category dir symlinked outside memoryDir (e.g. decisions/ -> an
236
- * external dir) must NOT pull out-of-store files into a scan (info leak). Same
237
- * walker-hardening pattern as document-scanner.ts / cli.ts /
238
- * consolidation-provenance-check.ts; reuses the shared containment helper.
234
+ * external dir) must NOT pull out-of-store files into a scan (info leak).
235
+ *
236
+ * Containment is established once, not per file: the memory root is resolved
237
+ * with a single `realpath`, every directory the walk enters is `lstat`ed (a
238
+ * symlinked or non-directory entry is never followed), and the entry TYPE
239
+ * comes from `readdir(withFileTypes)` — so a symlinked entry, file or
240
+ * directory, is skipped without a per-entry `realpath`. The old per-entry
241
+ * `realpath` cost one syscall per markdown file (hundreds of thousands per
242
+ * corpus scan) to re-derive a fact the directory-level checks already
243
+ * establish; reads refuse symlinked files at open time with `O_NOFOLLOW`, so
244
+ * a path swapped to a symlink mid-scan is refused rather than followed.
239
245
  * Paths only — no frontmatter parse.
240
246
  */
241
247
  private async collectContainedMarkdownPaths(
@@ -243,12 +249,12 @@ export class MemoryReadStore {
243
249
  propagateReadErrors = false,
244
250
  options?: CorpusReadOptions,
245
251
  ): Promise<string[]> {
246
- const filePaths: string[] = [];
252
+ const filePaths: string[] = [];
247
253
 
248
- // Resolve the memory root once for the containment checks below.
249
- let memoryRootReal: string;
254
+ // Resolve the memory root once: a missing root is an empty corpus and an
255
+ // unreadable root is a backend failure the strict census must surface.
250
256
  try {
251
- memoryRootReal = await realpath(this.deps.baseDir);
257
+ await realpath(this.deps.baseDir);
252
258
  } catch (err) {
253
259
  // ENOENT: a not-yet-created root ⇒ empty. Any other errno is a backend
254
260
  // read failure — propagate for strict census callers (never publish an
@@ -260,8 +266,7 @@ export class MemoryReadStore {
260
266
  const collectPaths = async (dir: string): Promise<void> => {
261
267
  checkCorpusReadAbort(options);
262
268
  // Directory-level guard, isolated from per-entry handling: skip symlinked
263
- // or non-directory category dirs and assert the resolved dir stays inside
264
- // the memory root before reading. A failure here means the whole subtree
269
+ // or non-directory category dirs. A failure here means the whole subtree
265
270
  // does not exist or escaped the store — fail closed by skipping it.
266
271
  let dirStat: Stats;
267
272
  try {
@@ -285,19 +290,18 @@ export class MemoryReadStore {
285
290
  }
286
291
  let entries: Dirent[];
287
292
  try {
288
- assertPathInsideRoot(memoryRootReal, await realpath(dir), dir);
289
293
  entries = await readdir(dir, { withFileTypes: true });
290
294
  } catch (err) {
291
- // A containment failure carries no errno (skip); a backend read error
292
- // (EACCES …) propagates in strict census mode so a partial subtree is
293
- // not silently counted.
295
+ // A backend read error (EACCES …) propagates in strict census mode so a
296
+ // partial subtree is not silently counted. ENOENT (vanished mid-scan)
297
+ // and other non-propagatable failures skip the directory.
294
298
  if (propagateReadErrors && isPropagatableReadError(err)) throw err;
295
299
  return;
296
300
  }
297
301
 
298
302
  const subdirs: string[] = [];
299
303
  for (const entry of entries) {
300
- // Outside the per-entry try/catch below, which deliberately swallows
304
+ // Outside the per-entry handling below, which deliberately swallows
301
305
  // non-propagatable errors — a cancellation must never be swallowed with
302
306
  // them (issue #2307).
303
307
  checkCorpusReadAbort(options);
@@ -308,21 +312,7 @@ export class MemoryReadStore {
308
312
  if (entry.isDirectory()) {
309
313
  subdirs.push(fullPath);
310
314
  } else if (entry.name.endsWith(".md")) {
311
- // Isolate per-entry failures in their own try/catch: a containment or
312
- // realpath failure on ONE .md entry must not drop sibling files or,
313
- // crucially, the deferred subdir recursion below (Cursor Bugbot:
314
- // "Poisoned md skips sibling subdirs"). Mirrors the per-file try/catch
315
- // in search/document-scanner.ts scanDir and
316
- // consolidation-provenance-check.ts walkMarkdownFiles.
317
- try {
318
- assertPathInsideRoot(memoryRootReal, await realpath(fullPath), fullPath);
319
- filePaths.push(fullPath);
320
- } catch (err) {
321
- // ENOENT (vanished mid-scan) or a code-less containment/symlink
322
- // rejection ⇒ skip just this file. A backend read error propagates
323
- // in strict census mode.
324
- if (propagateReadErrors && isPropagatableReadError(err)) throw err;
325
- }
315
+ filePaths.push(fullPath);
326
316
  }
327
317
  }
328
318
  // Recurse into real subdirectories regardless of any single poisoned entry