@remnic/core 9.63.2 → 9.63.4

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 (124) hide show
  1. package/dist/access-admin-ops-surface.d.ts +4 -4
  2. package/dist/access-admin-ops-surface.js +1 -1
  3. package/dist/access-authorization-probe.d.ts +4 -4
  4. package/dist/access-authorization-probe.js +2 -2
  5. package/dist/access-boundary.d.ts +4 -4
  6. package/dist/access-boundary.js +1 -1
  7. package/dist/access-cli.js +19 -18
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +4 -4
  10. package/dist/access-extraction-force-flush.js +1 -1
  11. package/dist/access-http-lcm-compaction.d.ts +4 -4
  12. package/dist/access-http-lifecycle-flush.d.ts +4 -4
  13. package/dist/access-http-offline-stream.d.ts +4 -4
  14. package/dist/access-http-query.d.ts +13 -1
  15. package/dist/access-http-query.js +5 -2
  16. package/dist/access-http.d.ts +5 -5
  17. package/dist/access-http.js +12 -11
  18. package/dist/access-identity-continuity-surface.d.ts +3 -3
  19. package/dist/access-identity-continuity-surface.js +1 -1
  20. package/dist/access-lcm-surface.d.ts +4 -4
  21. package/dist/access-lcm-surface.js +1 -1
  22. package/dist/access-mcp.d.ts +4 -4
  23. package/dist/access-mcp.js +6 -6
  24. package/dist/access-namespace-preflight.js +1 -1
  25. package/dist/access-observe-write-surface.d.ts +4 -4
  26. package/dist/access-observe-write-surface.js +1 -1
  27. package/dist/access-offline-manifest.d.ts +3 -3
  28. package/dist/access-operations-batch.js +2 -2
  29. package/dist/access-operations.d.ts +4 -4
  30. package/dist/access-operations.js +5 -5
  31. package/dist/access-recall-concurrency.d.ts +4 -4
  32. package/dist/access-recall-concurrency.js +1 -1
  33. package/dist/access-recall-response.d.ts +4 -4
  34. package/dist/access-recall-response.js +1 -1
  35. package/dist/access-recall-surface.d.ts +4 -4
  36. package/dist/access-recall-surface.js +1 -1
  37. package/dist/{access-service-DBpEnlzA.d.ts → access-service-D-bi3r01.d.ts} +2 -8
  38. package/dist/access-service-helpers.d.ts +4 -4
  39. package/dist/access-service.d.ts +4 -4
  40. package/dist/access-service.js +1 -1
  41. package/dist/access-surface-catalog.d.ts +4 -4
  42. package/dist/access-surface-catalog.js +3 -3
  43. package/dist/bootstrap.d.ts +3 -3
  44. package/dist/buffer.js +1 -1
  45. package/dist/{catalog-CyYTf_ok.d.ts → catalog-BYIHQw1l.d.ts} +2 -10
  46. package/dist/{chunk-JJ7JW62R.js → chunk-2JL7WPXL.js} +1 -11
  47. package/dist/chunk-2JL7WPXL.js.map +1 -0
  48. package/dist/{chunk-AJSZ2EK6.js → chunk-3USQWITL.js} +2 -2
  49. package/dist/{chunk-RYGJGXL6.js → chunk-4EDAHS6D.js} +2 -2
  50. package/dist/{chunk-5W5N7XJZ.js → chunk-A4HXWNST.js} +19 -752
  51. package/dist/chunk-A4HXWNST.js.map +1 -0
  52. package/dist/{chunk-KWN6NOHQ.js → chunk-BXOZALJ6.js} +2 -2
  53. package/dist/{chunk-6F2UMP4H.js → chunk-CKWOMJDY.js} +2 -2
  54. package/dist/{chunk-MR5HWQHS.js → chunk-DFEYRCG2.js} +2 -2
  55. package/dist/{chunk-6UZR7KEK.js → chunk-DQV3LUQL.js} +7 -1
  56. package/dist/chunk-DQV3LUQL.js.map +1 -0
  57. package/dist/{chunk-EJQXDKYK.js → chunk-EJCN5ATI.js} +3 -3
  58. package/dist/{chunk-TRPX6F2G.js → chunk-GNKY5JEP.js} +10 -13
  59. package/dist/chunk-GNKY5JEP.js.map +1 -0
  60. package/dist/{chunk-XZPSBGHA.js → chunk-ISFUFLFM.js} +2 -2
  61. package/dist/{chunk-4NMVX5U7.js → chunk-JSH2TV34.js} +2 -2
  62. package/dist/{chunk-R74NCKEY.js → chunk-LNFYISZ6.js} +2 -2
  63. package/dist/{chunk-6ZYQ36IB.js → chunk-MRJ43KSG.js} +15 -2
  64. package/dist/chunk-MRJ43KSG.js.map +1 -0
  65. package/dist/{chunk-IM56VPKO.js → chunk-OR7KEGLR.js} +2 -2
  66. package/dist/{chunk-A73QHOZP.js → chunk-QOMUE4FS.js} +2 -2
  67. package/dist/chunk-RSLRGRBJ.js +727 -0
  68. package/dist/chunk-RSLRGRBJ.js.map +1 -0
  69. package/dist/{chunk-44KHFMCM.js → chunk-VG6DC2GO.js} +32 -17
  70. package/dist/{chunk-44KHFMCM.js.map → chunk-VG6DC2GO.js.map} +1 -1
  71. package/dist/{chunk-5UFQCU6M.js → chunk-ZUZD2DRV.js} +5 -5
  72. package/dist/{cli-DJwNNDL1.d.ts → cli-DEoABKXH.d.ts} +2 -2
  73. package/dist/cli.d.ts +5 -5
  74. package/dist/cli.js +15 -14
  75. package/dist/explicit-capture.d.ts +3 -3
  76. package/dist/external-wiki-access.d.ts +4 -4
  77. package/dist/external-wiki-access.js +2 -2
  78. package/dist/external-wiki-mcp-tools.d.ts +4 -4
  79. package/dist/index.d.ts +8 -8
  80. package/dist/index.js +21 -20
  81. package/dist/{maintenance-uJb74j64.d.ts → maintenance-N5ur13Al.d.ts} +1 -1
  82. package/dist/mcp-memory-inspector-app.d.ts +4 -4
  83. package/dist/namespaces/migrate.d.ts +1 -1
  84. package/dist/namespaces/storage.d.ts +1 -1
  85. package/dist/operator-toolkit.js +3 -2
  86. package/dist/orchestration/maintenance.d.ts +2 -2
  87. package/dist/orchestration/maintenance.js +3 -2
  88. package/dist/{orchestrator-CFi-5JSR.d.ts → orchestrator-ByLrpav4.d.ts} +2 -2
  89. package/dist/orchestrator.d.ts +3 -3
  90. package/dist/orchestrator.js +19 -18
  91. package/dist/{public-http-43z1YT-k.d.ts → public-http-DusietP2.d.ts} +1 -1
  92. package/dist/support-passport/index.d.ts +7 -7
  93. package/dist/support-passport/index.js +4 -4
  94. package/package.json +2 -2
  95. package/src/access-http-query.ts +12 -0
  96. package/src/access-http.test.ts +32 -0
  97. package/src/access-http.ts +3 -7
  98. package/src/admin/admin-surfaces.test.ts +5 -10
  99. package/src/admin/admin-surfaces.ts +0 -16
  100. package/src/binary-lifecycle/pipeline.test.ts +1 -1
  101. package/src/binary-lifecycle/pipeline.ts +23 -9
  102. package/src/buffer.ts +6 -0
  103. package/src/maintenance/namespace-planner.ts +0 -2
  104. package/src/namespaces/catalog.test.ts +53 -8
  105. package/src/namespaces/catalog.ts +5 -37
  106. package/src/orchestration/turn-ingestion-snapshot.test.ts +167 -0
  107. package/src/orchestration/turn-ingestion.ts +2 -1
  108. package/dist/chunk-5W5N7XJZ.js.map +0 -1
  109. package/dist/chunk-6UZR7KEK.js.map +0 -1
  110. package/dist/chunk-6ZYQ36IB.js.map +0 -1
  111. package/dist/chunk-JJ7JW62R.js.map +0 -1
  112. package/dist/chunk-TRPX6F2G.js.map +0 -1
  113. /package/dist/{chunk-AJSZ2EK6.js.map → chunk-3USQWITL.js.map} +0 -0
  114. /package/dist/{chunk-RYGJGXL6.js.map → chunk-4EDAHS6D.js.map} +0 -0
  115. /package/dist/{chunk-KWN6NOHQ.js.map → chunk-BXOZALJ6.js.map} +0 -0
  116. /package/dist/{chunk-6F2UMP4H.js.map → chunk-CKWOMJDY.js.map} +0 -0
  117. /package/dist/{chunk-MR5HWQHS.js.map → chunk-DFEYRCG2.js.map} +0 -0
  118. /package/dist/{chunk-EJQXDKYK.js.map → chunk-EJCN5ATI.js.map} +0 -0
  119. /package/dist/{chunk-XZPSBGHA.js.map → chunk-ISFUFLFM.js.map} +0 -0
  120. /package/dist/{chunk-4NMVX5U7.js.map → chunk-JSH2TV34.js.map} +0 -0
  121. /package/dist/{chunk-R74NCKEY.js.map → chunk-LNFYISZ6.js.map} +0 -0
  122. /package/dist/{chunk-IM56VPKO.js.map → chunk-OR7KEGLR.js.map} +0 -0
  123. /package/dist/{chunk-A73QHOZP.js.map → chunk-QOMUE4FS.js.map} +0 -0
  124. /package/dist/{chunk-5UFQCU6M.js.map → chunk-ZUZD2DRV.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/maintenance/namespace-planner.ts"],"sourcesContent":["import { resolveNamespaceCapabilities } from \"../capabilities.js\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport type { Dirent } from \"node:fs\";\nimport { lstat, mkdir, open, readFile, readdir, rename, rm, rmdir, stat, utimes, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { NamespaceCatalog, NamespaceKind, NamespaceRecord } from \"../namespaces/catalog.js\";\nimport { hasMemoryData } from \"../namespaces/catalog.js\";\nimport { namespaceIdentityToken } from \"../namespaces/identity.js\";\nimport { resolveNamespaceStorageRoot } from \"../namespaces/storage.js\";\nimport { displayErrorDetail } from \"../runtime/better-sqlite.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { getConfiguredNamespaces } from \"../scopes/scope-plan.js\";\nimport { resolveConversationContextCapabilities } from \"../capabilities.js\";\n\nexport type NamespaceMaintenanceJobName = string;\n\nexport type NamespaceMaintenanceSkipReason =\n | \"fanout_disabled\"\n | \"empty_root\"\n | \"branch_disabled\"\n | \"project_disabled\"\n | \"team_project_disabled\"\n | \"catalog_read_failed\"\n | \"unsafe_or_stale_root\"\n | \"budget_exhausted\"\n | \"lock_held\"\n | \"batch_lock_incomplete\"\n | \"throttled\"\n | \"job_failed\";\n\nexport interface NamespaceMaintenancePlannerOptions {\n jobName: NamespaceMaintenanceJobName;\n catalog?: NamespaceCatalog;\n now?: Date;\n budgetMode?: \"cycle\" | \"unbounded\";\n}\n\nexport interface NamespaceMaintenanceCandidate {\n namespace: string;\n kind: NamespaceKind;\n storageDir?: string;\n source: \"configured\" | \"catalog\";\n lastWriteAt?: string;\n lastMaintenanceAt?: string;\n}\n\nexport interface NamespaceMaintenancePlan {\n jobName: NamespaceMaintenanceJobName;\n generatedAt: string;\n namespaces: NamespaceMaintenanceCandidate[];\n skipped: NamespaceMaintenanceSkippedNamespace[];\n budget: {\n maxNamespacesPerCycle: number;\n selected: number;\n };\n}\n\nexport interface NamespaceMaintenanceSkippedNamespace {\n namespace: string;\n kind?: NamespaceKind;\n reason: NamespaceMaintenanceSkipReason;\n detail?: string;\n}\n\nexport interface NamespaceMaintenanceRunStatus {\n namespace: string;\n jobName: NamespaceMaintenanceJobName;\n state: \"ran\" | \"skipped\" | \"failed\";\n reason?: NamespaceMaintenanceSkipReason;\n startedAt: string;\n completedAt: string;\n itemCount?: number;\n error?: string;\n}\n\nexport interface NamespaceMaintenanceSummary {\n jobName: NamespaceMaintenanceJobName;\n generatedAt: string;\n ran: number;\n skipped: number;\n failed: number;\n statuses: NamespaceMaintenanceRunStatus[];\n}\n\nexport interface NamespaceMaintenanceBatchRunResult {\n itemCount?: number;\n itemCounts?: Record<string, number> | Map<string, number>;\n}\n\nexport interface NamespaceMaintenanceBatchRunOptions {\n requireAllLocks?: boolean;\n skipReasonForError?: (error: unknown) => NamespaceMaintenanceSkipReason | null | undefined;\n}\n\ninterface LockHandle {\n path: string;\n touch(): Promise<void>;\n release(): Promise<void>;\n}\n\nconst DEFAULT_MAX_NAMESPACES_PER_CYCLE = 20;\nconst DEFAULT_LOCK_STALE_MS = 10 * 60_000;\nconst LOCK_BASE = \"maintenance-locks\";\nconst STATUS_BASE = \"namespace-maintenance-status\";\nconst namespaceMaintenanceFs = { open, rm };\n\nexport function __setNamespaceMaintenanceFsForTest(overrides: Partial<typeof namespaceMaintenanceFs>): () => void {\n const previous = { ...namespaceMaintenanceFs };\n Object.assign(namespaceMaintenanceFs, overrides);\n return () => {\n Object.assign(namespaceMaintenanceFs, previous);\n };\n}\n\n\n\nfunction inferConfiguredKind(config: PluginConfig, namespace: string): NamespaceKind {\n if (namespace === config.defaultNamespace.trim()) return \"default\";\n if (namespace === config.sharedNamespace.trim()) return \"shared\";\n return \"explicit\";\n}\n\nfunction maxNamespacesPerCycle(config: PluginConfig): number {\n return Math.max(\n 1,\n Math.floor(\n typeof config.maintenanceMaxNamespacesPerCycle === \"number\" &&\n Number.isFinite(config.maintenanceMaxNamespacesPerCycle)\n ? config.maintenanceMaxNamespacesPerCycle\n : DEFAULT_MAX_NAMESPACES_PER_CYCLE\n )\n );\n}\n\nfunction namespaceKindAllowed(config: PluginConfig, kind: NamespaceKind): boolean {\n switch (kind) {\n case \"branch\":\n return config.maintenanceIncludeBranchNamespaces === true;\n case \"project\":\n return config.maintenanceIncludeProjectNamespaces !== false;\n case \"team-project\":\n return config.maintenanceIncludeTeamProjectNamespaces !== false;\n default:\n return true;\n }\n}\n\nfunction disabledReasonForKind(kind: NamespaceKind): NamespaceMaintenanceSkipReason {\n if (kind === \"branch\") return \"branch_disabled\";\n if (kind === \"project\") return \"project_disabled\";\n if (kind === \"team-project\") return \"team_project_disabled\";\n return \"fanout_disabled\";\n}\n\nasync function catalogRootIsLive(config: PluginConfig, record: NamespaceRecord): Promise<boolean> {\n if (typeof record.storageDir !== \"string\" || record.storageDir.length === 0) {\n return false;\n }\n try {\n const liveRoot = await resolveNamespaceStorageRoot(config, record.namespace);\n if (path.resolve(liveRoot) !== path.resolve(record.storageDir)) return false;\n return hasMemoryData(liveRoot);\n } catch {\n return false;\n }\n}\n\nfunction candidateSortKey(candidate: NamespaceMaintenanceCandidate): string {\n const write = candidate.lastWriteAt ?? \"\";\n return `${write}\\u0000${candidate.namespace}`;\n}\n\nfunction candidatePriority(candidate: NamespaceMaintenanceCandidate): number {\n if (candidate.kind === \"default\") return 0;\n if (candidate.kind === \"shared\") return 1;\n if (candidate.source === \"configured\") return 2;\n if (candidate.kind === \"team-project\") return 3;\n if (candidate.kind === \"project\") return 4;\n if (candidate.kind === \"branch\") return 8;\n return 7;\n}\n\nfunction sortCandidates(a: NamespaceMaintenanceCandidate, b: NamespaceMaintenanceCandidate): number {\n const priority = candidatePriority(a) - candidatePriority(b);\n if (priority !== 0) return priority;\n const am = Date.parse(a.lastMaintenanceAt ?? \"\");\n const bm = Date.parse(b.lastMaintenanceAt ?? \"\");\n const aMaintained = Number.isFinite(am);\n const bMaintained = Number.isFinite(bm);\n if (aMaintained && bMaintained && am !== bm) return am - bm;\n if (aMaintained !== bMaintained) return aMaintained ? 1 : -1;\n const aw = Date.parse(a.lastWriteAt ?? \"\");\n const bw = Date.parse(b.lastWriteAt ?? \"\");\n const aValid = Number.isFinite(aw);\n const bValid = Number.isFinite(bw);\n if (aValid && bValid && aw !== bw) return bw - aw;\n if (aValid !== bValid) return aValid ? -1 : 1;\n const byKey = candidateSortKey(a).localeCompare(candidateSortKey(b));\n if (byKey !== 0) return byKey;\n return a.namespace.localeCompare(b.namespace);\n}\n\nexport async function planNamespaceMaintenance(\n config: PluginConfig,\n options: NamespaceMaintenancePlannerOptions\n): Promise<NamespaceMaintenancePlan> {\n const generatedAt = (options.now ?? new Date()).toISOString();\n // When namespaces are disabled, storageFor() collapses every namespace name\n // to config.memoryDir. Seeding all configured namespaces (default + shared +\n // policies) would make a mutating maintenance job process the SAME corpus\n // once per configured name. The #1500 contract is \"namespaces disabled:\n // maintain the current default storage only,\" so collapse to the default.\n const configured = resolveNamespaceCapabilities(config).namespaces\n ? getConfiguredNamespaces(config)\n : [config.defaultNamespace.trim()].filter(Boolean);\n const byNamespace = new Map<string, NamespaceMaintenanceCandidate>();\n const skipped: NamespaceMaintenanceSkippedNamespace[] = [];\n\n for (const namespace of configured) {\n const kind = inferConfiguredKind(config, namespace);\n byNamespace.set(namespace, {\n namespace,\n kind,\n source: \"configured\",\n });\n }\n\n if (resolveNamespaceCapabilities(config).namespaces && resolveConversationContextCapabilities(config).maintenanceNamespaceFanout !== false) {\n const configuredSet = new Set(configured);\n try {\n const records = options.catalog?.enabled ? await options.catalog.listNamespaces() : [];\n for (const record of records) {\n const namespace = record.namespace.trim();\n if (!namespace) continue;\n const isConfigured = configuredSet.has(namespace);\n const kind = isConfigured ? inferConfiguredKind(config, namespace) : record.kind;\n if (!namespaceKindAllowed(config, kind)) {\n skipped.push({\n namespace,\n kind,\n reason: disabledReasonForKind(kind),\n });\n continue;\n }\n if (!isConfigured && !(await catalogRootIsLive(config, record))) {\n skipped.push({\n namespace,\n kind,\n reason: \"unsafe_or_stale_root\",\n });\n continue;\n }\n byNamespace.set(namespace, {\n namespace,\n kind,\n storageDir: record.storageDir,\n source: isConfigured ? \"configured\" : \"catalog\",\n lastWriteAt: record.lastWriteAt,\n lastMaintenanceAt: record.lastMaintenanceAt?.[options.jobName],\n });\n }\n } catch (error) {\n skipped.push({\n namespace: \"*\",\n reason: \"catalog_read_failed\",\n detail: error instanceof Error ? error.message : String(error),\n });\n }\n } else if (resolveNamespaceCapabilities(config).namespaces) {\n skipped.push({\n namespace: \"*\",\n reason: \"fanout_disabled\",\n });\n }\n\n if (options.budgetMode !== \"unbounded\") {\n const latestStatusAtByNamespace = await readLatestStatusAtByNamespace(config, options.jobName);\n for (const candidate of byNamespace.values()) {\n if (!candidate.lastMaintenanceAt) {\n candidate.lastMaintenanceAt = latestStatusAtByNamespace.get(candidate.namespace);\n }\n }\n }\n\n const candidates = [...byNamespace.values()]\n .filter((candidate) => namespaceKindAllowed(config, candidate.kind))\n .sort(sortCandidates);\n\n const max = maxNamespacesPerCycle(config);\n const applyCycleBudget = options.budgetMode !== \"unbounded\";\n const selected = applyCycleBudget ? candidates.slice(0, max) : candidates;\n if (applyCycleBudget) {\n for (const candidate of candidates.slice(max)) {\n skipped.push({\n namespace: candidate.namespace,\n kind: candidate.kind,\n reason: \"budget_exhausted\",\n });\n }\n }\n\n return {\n jobName: options.jobName,\n generatedAt,\n namespaces: selected,\n skipped,\n budget: {\n maxNamespacesPerCycle: max,\n selected: selected.length,\n },\n };\n}\n\nfunction stablePathSegment(value: string): string {\n const sanitized = value.replace(/[^a-zA-Z0-9._-]/g, \"_\").slice(0, 128) || \"unnamed\";\n if (sanitized.length <= 128 && sanitized === value) return sanitized;\n return `${sanitized.slice(0, 80)}-${createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16)}`;\n}\n\nfunction namespacePathSegment(namespace: string): string {\n const token = namespaceIdentityToken(namespace);\n if (token.length <= 160) return token;\n return `ns-${createHash(\"sha256\").update(namespace).digest(\"hex\")}`;\n}\n\nfunction lockPath(config: PluginConfig, jobName: string, namespace: string): string {\n return path.join(\n config.memoryDir,\n \"state\",\n LOCK_BASE,\n stablePathSegment(jobName),\n `${namespacePathSegment(namespace)}.lock`\n );\n}\n\nfunction namespaceMaintenanceLockStaleMs(config: PluginConfig): number {\n if (\n typeof config.maintenanceNamespaceLockStaleMs === \"number\" &&\n Number.isFinite(config.maintenanceNamespaceLockStaleMs) &&\n config.maintenanceNamespaceLockStaleMs > 0\n ) {\n return Math.floor(config.maintenanceNamespaceLockStaleMs);\n }\n return DEFAULT_LOCK_STALE_MS;\n}\n\nfunction namespaceMaintenanceLockHeartbeatMs(config: PluginConfig): number {\n const staleMs = namespaceMaintenanceLockStaleMs(config);\n return Math.max(1, Math.min(30_000, Math.floor(staleMs / 3) || 1));\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return typeof error === \"object\" && error !== null && \"code\" in error\n ? (error as { code?: string }).code\n : undefined;\n}\n\nasync function withNamespaceMaintenanceLockHeartbeat<T>(\n config: PluginConfig,\n locks: LockHandle | LockHandle[],\n task: () => Promise<T>,\n): Promise<T> {\n const activeLocks = Array.isArray(locks) ? locks : [locks];\n const interval = setInterval(() => {\n for (const lock of activeLocks) {\n void lock.touch().catch(() => undefined);\n }\n }, namespaceMaintenanceLockHeartbeatMs(config));\n interval.unref?.();\n try {\n return await task();\n } finally {\n clearInterval(interval);\n }\n}\n\nasync function removeStaleLockDirectory(filePath: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(filePath, { withFileTypes: true });\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return;\n throw error;\n }\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n await namespaceMaintenanceFs.rm(path.join(filePath, entry.name), { force: true });\n }\n try {\n await rmdir(filePath);\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return;\n throw error;\n }\n}\n\nasync function tryAcquireNamespaceMaintenanceLock(\n config: PluginConfig,\n jobName: string,\n namespace: string\n): Promise<LockHandle | null> {\n const filePath = lockPath(config, jobName, namespace);\n await mkdir(path.dirname(filePath), { recursive: true });\n try {\n const lockId = randomUUID();\n await mkdir(filePath);\n const ownerPath = path.join(filePath, `${lockId}.json`);\n let handle: Awaited<ReturnType<typeof open>> | undefined;\n try {\n handle = await namespaceMaintenanceFs.open(ownerPath, \"wx\");\n await handle.writeFile(\n `${JSON.stringify({\n lockId,\n pid: process.pid,\n jobName,\n namespace,\n acquiredAt: new Date().toISOString(),\n })}\\n`,\n \"utf8\"\n );\n await handle.close();\n } catch (setupError) {\n await handle?.close().catch(() => undefined);\n await namespaceMaintenanceFs.rm(ownerPath, { force: true }).catch(() => undefined);\n await rmdir(filePath).catch(() => undefined);\n throw setupError;\n }\n return {\n path: filePath,\n async touch() {\n try {\n const parsed = JSON.parse(await readFile(ownerPath, \"utf8\")) as { lockId?: unknown };\n if (parsed.lockId === lockId) {\n const now = new Date();\n await utimes(ownerPath, now, now);\n await utimes(filePath, now, now);\n }\n } catch {}\n },\n async release() {\n try {\n const parsed = JSON.parse(await readFile(ownerPath, \"utf8\")) as { lockId?: unknown };\n if (parsed.lockId === lockId) {\n await namespaceMaintenanceFs.rm(ownerPath, { force: true });\n await rmdir(filePath).catch(() => undefined);\n }\n } catch {}\n },\n };\n } catch (error) {\n if (errorCode(error) === \"EEXIST\") {\n const staleMs =\n namespaceMaintenanceLockStaleMs(config);\n try {\n const s = await lstat(filePath);\n if (s.isSymbolicLink()) {\n return null;\n }\n if ((s.isFile() || s.isDirectory()) && Date.now() - s.mtimeMs > staleMs) {\n try {\n if (s.isDirectory()) {\n await removeStaleLockDirectory(filePath);\n } else {\n await namespaceMaintenanceFs.rm(filePath, { force: true });\n }\n } catch (removeError) {\n if (errorCode(removeError) === \"ENOENT\") {\n return tryAcquireNamespaceMaintenanceLock(config, jobName, namespace);\n }\n if (errorCode(removeError) === \"ENOTEMPTY\") {\n return null;\n }\n throw removeError;\n }\n return tryAcquireNamespaceMaintenanceLock(config, jobName, namespace);\n }\n } catch (statError) {\n if (errorCode(statError) === \"ENOENT\") {\n return tryAcquireNamespaceMaintenanceLock(config, jobName, namespace);\n }\n throw statError;\n }\n return null;\n }\n throw error;\n }\n}\n\nfunction statusBasePath(config: PluginConfig): string {\n return path.join(config.memoryDir, \"state\", STATUS_BASE);\n}\n\nfunction statusPath(config: PluginConfig, jobName: string, namespace: string): string {\n return path.join(statusBasePath(config), stablePathSegment(jobName), `${namespacePathSegment(namespace)}.json`);\n}\n\nfunction lastRanStatusPath(config: PluginConfig, jobName: string, namespace: string): string {\n return path.join(statusBasePath(config), stablePathSegment(jobName), `${namespacePathSegment(namespace)}.last-ran.json`);\n}\n\nfunction parseStatus(value: unknown): NamespaceMaintenanceRunStatus | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const v = value as Partial<NamespaceMaintenanceRunStatus>;\n if (\n typeof v.namespace === \"string\" &&\n typeof v.jobName === \"string\" &&\n (v.state === \"ran\" || v.state === \"skipped\" || v.state === \"failed\") &&\n typeof v.startedAt === \"string\" &&\n typeof v.completedAt === \"string\"\n ) {\n return v as NamespaceMaintenanceRunStatus;\n }\n return null;\n}\n\nasync function readLatestStatusAtByNamespace(config: PluginConfig, jobName: string): Promise<Map<string, string>> {\n const latest = new Map<string, string>();\n const latestMs = new Map<string, number>();\n for (const status of [...(await readStatusFiles(config)), ...(await readLastRanStatusFiles(config))]) {\n if (status.state !== \"ran\") continue;\n if (status.jobName !== jobName) continue;\n const completedAtMs = Date.parse(status.completedAt);\n if (!Number.isFinite(completedAtMs)) continue;\n const previousMs = latestMs.get(status.namespace);\n if (previousMs !== undefined && previousMs >= completedAtMs) continue;\n latestMs.set(status.namespace, completedAtMs);\n latest.set(status.namespace, status.completedAt);\n }\n return latest;\n}\n\nasync function readStatusFile(filePath: string): Promise<NamespaceMaintenanceRunStatus | null> {\n try {\n const parsed = JSON.parse(await readFile(filePath, \"utf8\")) as unknown;\n return parseStatus(parsed);\n } catch {\n return null;\n }\n}\n\nasync function readStatusFiles(config: PluginConfig): Promise<NamespaceMaintenanceRunStatus[]> {\n if (typeof config.memoryDir !== \"string\" || config.memoryDir.length === 0) {\n return [];\n }\n const root = statusBasePath(config);\n const statuses: NamespaceMaintenanceRunStatus[] = [];\n let jobDirs: Dirent[];\n try {\n jobDirs = await readdir(root, { withFileTypes: true });\n } catch {\n return statuses;\n }\n for (const jobDir of jobDirs) {\n if (!jobDir.isDirectory()) continue;\n let files: Dirent[];\n try {\n files = await readdir(path.join(root, jobDir.name), { withFileTypes: true });\n } catch {\n continue;\n }\n for (const file of files) {\n if (!file.isFile() || !file.name.endsWith(\".json\")) continue;\n if (file.name.endsWith(\".last-ran.json\")) continue;\n const status = await readStatusFile(path.join(root, jobDir.name, file.name));\n if (status) statuses.push(status);\n }\n }\n return statuses;\n}\n\nasync function readLastRanStatusFiles(config: PluginConfig): Promise<NamespaceMaintenanceRunStatus[]> {\n if (typeof config.memoryDir !== \"string\" || config.memoryDir.length === 0) {\n return [];\n }\n const root = statusBasePath(config);\n const statuses: NamespaceMaintenanceRunStatus[] = [];\n let jobDirs: Dirent[];\n try {\n jobDirs = await readdir(root, { withFileTypes: true });\n } catch {\n return statuses;\n }\n for (const jobDir of jobDirs) {\n if (!jobDir.isDirectory()) continue;\n let files: Dirent[];\n try {\n files = await readdir(path.join(root, jobDir.name), { withFileTypes: true });\n } catch {\n continue;\n }\n for (const file of files) {\n if (!file.isFile() || !file.name.endsWith(\".last-ran.json\")) continue;\n const status = await readStatusFile(path.join(root, jobDir.name, file.name));\n if (status) statuses.push(status);\n }\n }\n return statuses;\n}\n\nasync function writeStatusPayload(target: string, status: NamespaceMaintenanceRunStatus): Promise<void> {\n const dir = path.dirname(target);\n await mkdir(dir, { recursive: true });\n const temp = `${target}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;\n const payload = {\n version: 1,\n ...status,\n };\n await writeFile(temp, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n await rename(temp, target);\n}\n\nasync function writeStatusFile(config: PluginConfig, status: NamespaceMaintenanceRunStatus): Promise<void> {\n await writeStatusPayload(statusPath(config, status.jobName, status.namespace), status);\n if (status.state === \"ran\") {\n await writeStatusPayload(lastRanStatusPath(config, status.jobName, status.namespace), status);\n }\n}\n\nasync function recordNamespaceMaintenanceStatusSafely(\n config: PluginConfig,\n status: NamespaceMaintenanceRunStatus\n): Promise<void> {\n try {\n await writeStatusFile(config, status);\n } catch {\n // Observability must not fail the maintenance operation.\n }\n}\n\nfunction maintenanceErrorDetail(error: unknown): string {\n return displayErrorDetail(error) || \"Error\";\n}\n\nexport async function readNamespaceMaintenanceStatuses(config: PluginConfig): Promise<NamespaceMaintenanceRunStatus[]> {\n return (await readStatusFiles(config)).sort((a, b) => {\n const byJob = a.jobName.localeCompare(b.jobName);\n if (byJob !== 0) return byJob;\n return a.namespace.localeCompare(b.namespace);\n });\n}\n\n/**\n * Read the last SUCCESSFUL run status per job+namespace (the\n * `<namespace>.last-ran.json` files written only when state === \"ran\").\n *\n * The latest status file (`<namespace>.json`) is overwritten on every run,\n * so after a successful run followed by a skip (budget/lock/cadence) the\n * latest file shows \"skipped\" and the prior success is invisible. Merging\n * these last-ran records into the health summary lets `lastRunAt` and run\n * history reflect the most recent successful maintenance (review #1622).\n */\nexport async function readNamespaceMaintenanceLastRanStatuses(\n config: PluginConfig,\n): Promise<NamespaceMaintenanceRunStatus[]> {\n return (await readLastRanStatusFiles(config)).sort((a, b) => {\n const byJob = a.jobName.localeCompare(b.jobName);\n if (byJob !== 0) return byJob;\n return a.namespace.localeCompare(b.namespace);\n });\n}\n\nexport type NamespaceMaintenancePlanRunnerResult = {\n itemCount?: number;\n /**\n * When `true`, the runner performed NO work for this namespace (e.g. the\n * job's own cadence gate throttled it). The planner records the namespace\n * as `state: \"skipped\"` with the given reason and does NOT touch the\n * catalog's `lastMaintenanceAt`, so a throttled namespace is not falsely\n * reported as maintained. Without this signal a runner that resolves\n * without throwing is always recorded as `state: \"ran\"`.\n */\n skipped?: boolean;\n skipReason?: string;\n} | undefined;\n\nexport async function runNamespaceMaintenancePlan(\n config: PluginConfig,\n plan: NamespaceMaintenancePlan,\n runner: (candidate: NamespaceMaintenanceCandidate) => Promise<NamespaceMaintenancePlanRunnerResult>,\n catalog?: NamespaceCatalog\n): Promise<NamespaceMaintenanceSummary> {\n const statuses: NamespaceMaintenanceRunStatus[] = [];\n\n for (const skipped of plan.skipped) {\n if (skipped.namespace === \"*\") continue;\n const now = new Date().toISOString();\n const status: NamespaceMaintenanceRunStatus = {\n namespace: skipped.namespace,\n jobName: plan.jobName,\n state: \"skipped\",\n reason: skipped.reason,\n startedAt: now,\n completedAt: now,\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n }\n\n for (const candidate of plan.namespaces) {\n const startedAt = new Date().toISOString();\n const lock = await tryAcquireNamespaceMaintenanceLock(config, plan.jobName, candidate.namespace);\n if (!lock) {\n const completedAt = new Date().toISOString();\n const status: NamespaceMaintenanceRunStatus = {\n namespace: candidate.namespace,\n jobName: plan.jobName,\n state: \"skipped\",\n reason: \"lock_held\",\n startedAt,\n completedAt,\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n continue;\n }\n try {\n const result = await withNamespaceMaintenanceLockHeartbeat(config, lock, () => runner(candidate));\n const completedAt = new Date().toISOString();\n if (result?.skipped) {\n // The runner performed no work (e.g. the job's own cadence gate\n // throttled this namespace). Record skipped WITHOUT touching the\n // catalog's lastMaintenanceAt so a throttled namespace is not\n // falsely reported as maintained.\n const status: NamespaceMaintenanceRunStatus = {\n namespace: candidate.namespace,\n jobName: plan.jobName,\n state: \"skipped\",\n reason: (result.skipReason ?? \"throttled\") as NamespaceMaintenanceSkipReason,\n startedAt,\n completedAt,\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n } else {\n const status: NamespaceMaintenanceRunStatus = {\n namespace: candidate.namespace,\n jobName: plan.jobName,\n state: \"ran\",\n startedAt,\n completedAt,\n itemCount: result?.itemCount,\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n try {\n await catalog?.markMaintenance(candidate.namespace, plan.jobName, new Date(completedAt));\n } catch {\n // Catalog maintenance touches are best-effort status metadata.\n }\n }\n } catch (error) {\n const completedAt = new Date().toISOString();\n const status: NamespaceMaintenanceRunStatus = {\n namespace: candidate.namespace,\n jobName: plan.jobName,\n state: \"failed\",\n reason: \"job_failed\",\n startedAt,\n completedAt,\n error: maintenanceErrorDetail(error),\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n } finally {\n await lock.release().catch(() => undefined);\n }\n }\n\n return {\n jobName: plan.jobName,\n generatedAt: new Date().toISOString(),\n ran: statuses.filter((s) => s.state === \"ran\").length,\n skipped: statuses.filter((s) => s.state === \"skipped\").length,\n failed: statuses.filter((s) => s.state === \"failed\").length,\n statuses,\n };\n}\n\nexport async function runNamespaceMaintenanceBatchPlan(\n config: PluginConfig,\n plan: NamespaceMaintenancePlan,\n runner: (candidates: NamespaceMaintenanceCandidate[]) => Promise<NamespaceMaintenanceBatchRunResult | undefined>,\n catalog?: NamespaceCatalog,\n options: NamespaceMaintenanceBatchRunOptions = {}\n): Promise<NamespaceMaintenanceSummary> {\n const statuses: NamespaceMaintenanceRunStatus[] = [];\n\n for (const skipped of plan.skipped) {\n if (skipped.namespace === \"*\") continue;\n const now = new Date().toISOString();\n const status: NamespaceMaintenanceRunStatus = {\n namespace: skipped.namespace,\n jobName: plan.jobName,\n state: \"skipped\",\n reason: skipped.reason,\n startedAt: now,\n completedAt: now,\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n }\n\n const acquired: Array<{\n candidate: NamespaceMaintenanceCandidate;\n lock: LockHandle;\n startedAt: string;\n }> = [];\n\n try {\n for (const candidate of plan.namespaces) {\n const startedAt = new Date().toISOString();\n const lock = await tryAcquireNamespaceMaintenanceLock(config, plan.jobName, candidate.namespace);\n if (!lock) {\n const completedAt = new Date().toISOString();\n const status: NamespaceMaintenanceRunStatus = {\n namespace: candidate.namespace,\n jobName: plan.jobName,\n state: \"skipped\",\n reason: \"lock_held\",\n startedAt,\n completedAt,\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n continue;\n }\n acquired.push({ candidate, lock, startedAt });\n }\n } catch (error) {\n await Promise.all(acquired.map(({ lock }) => lock.release().catch(() => undefined)));\n throw error;\n }\n\n if (options.requireAllLocks && acquired.length > 0 && acquired.length < plan.namespaces.length) {\n for (const { candidate, startedAt } of acquired) {\n const completedAt = new Date().toISOString();\n const status: NamespaceMaintenanceRunStatus = {\n namespace: candidate.namespace,\n jobName: plan.jobName,\n state: \"skipped\",\n reason: \"batch_lock_incomplete\",\n startedAt,\n completedAt,\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n }\n await Promise.all(acquired.map(({ lock }) => lock.release().catch(() => undefined)));\n return {\n jobName: plan.jobName,\n generatedAt: new Date().toISOString(),\n ran: statuses.filter((s) => s.state === \"ran\").length,\n skipped: statuses.filter((s) => s.state === \"skipped\").length,\n failed: statuses.filter((s) => s.state === \"failed\").length,\n statuses,\n };\n }\n\n if (acquired.length === 0) {\n return {\n jobName: plan.jobName,\n generatedAt: new Date().toISOString(),\n ran: statuses.filter((s) => s.state === \"ran\").length,\n skipped: statuses.filter((s) => s.state === \"skipped\").length,\n failed: statuses.filter((s) => s.state === \"failed\").length,\n statuses,\n };\n }\n\n try {\n const result = await withNamespaceMaintenanceLockHeartbeat(\n config,\n acquired.map(({ lock }) => lock),\n () => runner(acquired.map(({ candidate }) => candidate)),\n );\n for (const { candidate, startedAt } of acquired) {\n const completedAt = new Date().toISOString();\n const status: NamespaceMaintenanceRunStatus = {\n namespace: candidate.namespace,\n jobName: plan.jobName,\n state: \"ran\",\n startedAt,\n completedAt,\n itemCount: itemCountForNamespace(result, candidate.namespace),\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n try {\n await catalog?.markMaintenance(candidate.namespace, plan.jobName, new Date(completedAt));\n } catch {\n // Catalog maintenance touches are best-effort status metadata.\n }\n }\n } catch (error) {\n const skipReason = options.skipReasonForError?.(error);\n for (const { candidate, startedAt } of acquired) {\n const completedAt = new Date().toISOString();\n const status: NamespaceMaintenanceRunStatus = skipReason\n ? {\n namespace: candidate.namespace,\n jobName: plan.jobName,\n state: \"skipped\",\n reason: skipReason,\n startedAt,\n completedAt,\n }\n : {\n namespace: candidate.namespace,\n jobName: plan.jobName,\n state: \"failed\",\n reason: \"job_failed\",\n startedAt,\n completedAt,\n error: maintenanceErrorDetail(error),\n };\n statuses.push(status);\n await recordNamespaceMaintenanceStatusSafely(config, status);\n }\n } finally {\n await Promise.all(acquired.map(({ lock }) => lock.release().catch(() => undefined)));\n }\n\n return {\n jobName: plan.jobName,\n generatedAt: new Date().toISOString(),\n ran: statuses.filter((s) => s.state === \"ran\").length,\n skipped: statuses.filter((s) => s.state === \"skipped\").length,\n failed: statuses.filter((s) => s.state === \"failed\").length,\n statuses,\n };\n}\n\nfunction itemCountForNamespace(\n result: NamespaceMaintenanceBatchRunResult | undefined,\n namespace: string,\n): number | undefined {\n const itemCounts = result?.itemCounts;\n if (itemCounts instanceof Map) return itemCounts.get(namespace);\n if (itemCounts && Object.prototype.hasOwnProperty.call(itemCounts, namespace)) {\n return itemCounts[namespace];\n }\n return result?.itemCount;\n}\n"],"mappings":"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","names":[]}
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  ActivityStore,
12
12
  MaintenanceScheduler
13
- } from "./chunk-R74NCKEY.js";
13
+ } from "./chunk-LNFYISZ6.js";
14
14
  import {
15
15
  runPeerProfileReasoner
16
16
  } from "./chunk-I74SUMNI.js";
@@ -222,7 +222,7 @@ import {
222
222
  getWearableConnector,
223
223
  listWearableConnectors,
224
224
  screenCandidateFact
225
- } from "./chunk-5UFQCU6M.js";
225
+ } from "./chunk-ZUZD2DRV.js";
226
226
  import {
227
227
  RoutingRulesStore
228
228
  } from "./chunk-TBUEE7XF.js";
@@ -252,11 +252,10 @@ import {
252
252
  import {
253
253
  runNamespaceMaintenanceFanout,
254
254
  summarizeNamespaceMaintenanceHealth
255
- } from "./chunk-6F2UMP4H.js";
255
+ } from "./chunk-CKWOMJDY.js";
256
256
  import {
257
- NamespaceCatalog,
258
257
  planNamespaceMaintenance
259
- } from "./chunk-5W5N7XJZ.js";
258
+ } from "./chunk-RSLRGRBJ.js";
260
259
  import {
261
260
  isAboveImportanceThreshold,
262
261
  scoreImportance
@@ -284,7 +283,7 @@ import {
284
283
  } from "./chunk-NOB2T2FC.js";
285
284
  import {
286
285
  SmartBuffer
287
- } from "./chunk-6UZR7KEK.js";
286
+ } from "./chunk-DQV3LUQL.js";
288
287
  import {
289
288
  buildConsolidationPrompt,
290
289
  buildExtensionsBlockForConsolidation,
@@ -337,11 +336,14 @@ import {
337
336
  } from "./chunk-KD3QD3A5.js";
338
337
  import {
339
338
  MeetingsInputError
340
- } from "./chunk-TRPX6F2G.js";
339
+ } from "./chunk-GNKY5JEP.js";
341
340
  import {
342
341
  WearablesInputError,
343
342
  describeErrorForOperator
344
343
  } from "./chunk-V7IZKJI3.js";
344
+ import {
345
+ NamespaceCatalog
346
+ } from "./chunk-A4HXWNST.js";
345
347
  import {
346
348
  recordDreamsPhaseRun
347
349
  } from "./chunk-EQWEIIKQ.js";
@@ -358,7 +360,7 @@ import {
358
360
  filterRecallCandidates,
359
361
  isGenericRecallExcludedPath,
360
362
  isTopLevelArchivePath
361
- } from "./chunk-JJ7JW62R.js";
363
+ } from "./chunk-2JL7WPXL.js";
362
364
  import {
363
365
  importCapsule
364
366
  } from "./chunk-QYN5PXDZ.js";
@@ -13906,8 +13908,9 @@ var TurnIngestionCoordinator = class {
13906
13908
  };
13907
13909
  const outcome = typeof this.deps.buffer.addTurnWithOutcome === "function" ? await this.deps.buffer.addTurnWithOutcome(bufferKey, turn) : { decision: await this.deps.buffer.addTurn(bufferKey, turn) };
13908
13910
  if (outcome.decision === "keep_buffering") return;
13911
+ if (!outcome.extractionTurns) return;
13909
13912
  await this.deps.queueBufferedExtraction(
13910
- outcome.extractionTurns ?? this.deps.buffer.getTurns(bufferKey),
13913
+ outcome.extractionTurns,
13911
13914
  "trigger_mode",
13912
13915
  { bufferKey }
13913
13916
  );
@@ -22676,11 +22679,24 @@ async function stageRedirect(memoryDir, assets, log2, dryRun, readMarkdownFile,
22676
22679
  continue;
22677
22680
  }
22678
22681
  if (asset.redirectedAt === void 0) {
22679
- if (!dryRun) {
22680
- asset.status = "mirrored";
22682
+ let remoteSeen = false;
22683
+ for (const mdPath of mdFiles) {
22684
+ try {
22685
+ const content = await readMarkdownFile(mdPath);
22686
+ if (content.includes(asset.mirroredPath)) {
22687
+ remoteSeen = true;
22688
+ break;
22689
+ }
22690
+ } catch {
22691
+ }
22692
+ }
22693
+ if (!remoteSeen) {
22694
+ if (!dryRun) {
22695
+ asset.status = "mirrored";
22696
+ }
22697
+ log2.info(`[binary-lifecycle] preserved mirrored asset without redirected marker: ${asset.originalPath}${dryRun ? " [dry-run]" : ""}`);
22698
+ continue;
22681
22699
  }
22682
- log2.info(`[binary-lifecycle] preserved mirrored asset without redirected marker: ${asset.originalPath}${dryRun ? " [dry-run]" : ""}`);
22683
- continue;
22684
22700
  }
22685
22701
  if (!Number.isFinite(new Date(asset.mirroredAt).getTime())) {
22686
22702
  const msg = `redirect blocked for ${asset.originalPath}: manifest mirroredAt is invalid`;
@@ -22757,8 +22773,6 @@ async function stageRedirect(memoryDir, assets, log2, dryRun, readMarkdownFile,
22757
22773
  );
22758
22774
  continue;
22759
22775
  }
22760
- const redirectedAt = (/* @__PURE__ */ new Date()).toISOString();
22761
- asset.redirectedAt = redirectedAt;
22762
22776
  const verifyResult = await countRemainingLocalReferences(
22763
22777
  memoryDir,
22764
22778
  asset,
@@ -22768,6 +22782,7 @@ async function stageRedirect(memoryDir, assets, log2, dryRun, readMarkdownFile,
22768
22782
  );
22769
22783
  if (verifyResult.errors.length > 0 || verifyResult.remaining > 0) {
22770
22784
  asset.status = "error";
22785
+ delete asset.redirectedAt;
22771
22786
  for (const msg of verifyResult.errors) {
22772
22787
  log2.error(`[binary-lifecycle] ${msg}`);
22773
22788
  errors.push(msg);
@@ -22780,7 +22795,7 @@ async function stageRedirect(memoryDir, assets, log2, dryRun, readMarkdownFile,
22780
22795
  continue;
22781
22796
  }
22782
22797
  asset.status = "redirected";
22783
- asset.redirectedAt = redirectedAt;
22798
+ asset.redirectedAt = (/* @__PURE__ */ new Date()).toISOString();
22784
22799
  redirected++;
22785
22800
  log2.info(`[binary-lifecycle] redirected: ${asset.originalPath}`);
22786
22801
  }
@@ -27401,4 +27416,4 @@ export {
27401
27416
  blendGraphExpandedRecallScore,
27402
27417
  Orchestrator
27403
27418
  };
27404
- //# sourceMappingURL=chunk-44KHFMCM.js.map
27419
+ //# sourceMappingURL=chunk-VG6DC2GO.js.map