@remnic/core 9.3.691 → 9.3.692

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 (87) hide show
  1. package/dist/access-boundary.d.ts +5 -4
  2. package/dist/access-boundary.js +11 -11
  3. package/dist/access-cli.js +18 -16
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +5 -4
  6. package/dist/access-http.js +15 -15
  7. package/dist/access-mcp.d.ts +5 -4
  8. package/dist/access-mcp.js +14 -14
  9. package/dist/access-operations.d.ts +5 -4
  10. package/dist/access-operations.js +13 -13
  11. package/dist/access-schema.js +3 -3
  12. package/dist/{access-service-CKnFdxH-.d.ts → access-service-DvApf9LZ.d.ts} +1 -1
  13. package/dist/access-service.d.ts +5 -4
  14. package/dist/access-service.js +10 -10
  15. package/dist/access-surface-catalog.d.ts +5 -4
  16. package/dist/bootstrap.d.ts +4 -3
  17. package/dist/{chunk-VH2DHBHG.js → chunk-2EN5WZQB.js} +2 -2
  18. package/dist/{chunk-QNG35H27.js → chunk-4IQNAOP3.js} +5 -141
  19. package/dist/chunk-4IQNAOP3.js.map +1 -0
  20. package/dist/chunk-6C2BMUZA.js +444 -0
  21. package/dist/chunk-6C2BMUZA.js.map +1 -0
  22. package/dist/{chunk-UUMYB3FR.js → chunk-6ZNIUGXB.js} +10 -10
  23. package/dist/{chunk-TSGREOYY.js → chunk-DO7MDZMU.js} +4 -4
  24. package/dist/{chunk-IPJD7WJH.js → chunk-E6BOD3UJ.js} +2 -2
  25. package/dist/{chunk-D3DNGQNQ.js → chunk-FM7KLRKN.js} +2 -2
  26. package/dist/chunk-HXNMDPHN.js +149 -0
  27. package/dist/chunk-HXNMDPHN.js.map +1 -0
  28. package/dist/{chunk-IPLYGWQF.js → chunk-KQAFEZQX.js} +5 -5
  29. package/dist/{chunk-OOO7ZKOD.js → chunk-KYH53EFD.js} +3 -3
  30. package/dist/{chunk-LQ6JI4VH.js → chunk-LD53WPMU.js} +4 -4
  31. package/dist/{chunk-7UVDIWLL.js → chunk-NEILAC3H.js} +4 -4
  32. package/dist/{chunk-K7I24ZO2.js → chunk-O4ZIV62T.js} +20 -20
  33. package/dist/{chunk-NCRDCTEJ.js → chunk-SEK4XIDN.js} +5 -5
  34. package/dist/{chunk-5CEJH5ZN.js → chunk-TAPSNIMA.js} +4 -4
  35. package/dist/{chunk-QLRYXOAD.js → chunk-UDJLF3BO.js} +2 -2
  36. package/dist/{chunk-KO6OL4I7.js → chunk-V56S3A23.js} +3 -3
  37. package/dist/{chunk-TJ5IIQIR.js → chunk-W4MICQIZ.js} +39 -368
  38. package/dist/chunk-W4MICQIZ.js.map +1 -0
  39. package/dist/{chunk-WRFKZEO6.js → chunk-YQGHW5ML.js} +4 -4
  40. package/dist/{cli-CrSW_KRq.d.ts → cli-BjsY9Le7.d.ts} +2 -2
  41. package/dist/cli.d.ts +6 -5
  42. package/dist/cli.js +25 -24
  43. package/dist/contradiction/index.js +4 -4
  44. package/dist/explicit-capture.d.ts +4 -3
  45. package/dist/index.d.ts +6 -5
  46. package/dist/index.js +32 -30
  47. package/dist/index.js.map +1 -1
  48. package/dist/mcp-memory-inspector-app.d.ts +5 -4
  49. package/dist/namespaces/migrate.js +8 -8
  50. package/dist/namespaces/search.js +7 -7
  51. package/dist/operator-toolkit.js +11 -10
  52. package/dist/orchestration/maintenance.d.ts +112 -0
  53. package/dist/orchestration/maintenance.js +39 -0
  54. package/dist/orchestration/maintenance.js.map +1 -0
  55. package/dist/{orchestrator-DvswGK76.d.ts → orchestrator-CNJCYjZ1.d.ts} +9 -33
  56. package/dist/orchestrator.d.ts +2 -1
  57. package/dist/orchestrator.js +12 -10
  58. package/dist/search/factory.js +6 -6
  59. package/dist/search/index.js +11 -11
  60. package/dist/search/lancedb-backend.js +2 -2
  61. package/dist/search/meilisearch-backend.js +2 -2
  62. package/dist/search/orama-backend.js +2 -2
  63. package/dist/transfer/autodetect.js +1 -1
  64. package/dist/transfer/backup.js +1 -1
  65. package/dist/transfer/capsule-export.js +2 -2
  66. package/package.json +12 -2
  67. package/src/orchestration/maintenance.test.ts +738 -0
  68. package/src/orchestration/maintenance.ts +557 -0
  69. package/src/orchestrator-flush.test.ts +0 -599
  70. package/src/orchestrator.ts +33 -419
  71. package/dist/chunk-QNG35H27.js.map +0 -1
  72. package/dist/chunk-TJ5IIQIR.js.map +0 -1
  73. /package/dist/{chunk-VH2DHBHG.js.map → chunk-2EN5WZQB.js.map} +0 -0
  74. /package/dist/{chunk-UUMYB3FR.js.map → chunk-6ZNIUGXB.js.map} +0 -0
  75. /package/dist/{chunk-TSGREOYY.js.map → chunk-DO7MDZMU.js.map} +0 -0
  76. /package/dist/{chunk-IPJD7WJH.js.map → chunk-E6BOD3UJ.js.map} +0 -0
  77. /package/dist/{chunk-D3DNGQNQ.js.map → chunk-FM7KLRKN.js.map} +0 -0
  78. /package/dist/{chunk-IPLYGWQF.js.map → chunk-KQAFEZQX.js.map} +0 -0
  79. /package/dist/{chunk-OOO7ZKOD.js.map → chunk-KYH53EFD.js.map} +0 -0
  80. /package/dist/{chunk-LQ6JI4VH.js.map → chunk-LD53WPMU.js.map} +0 -0
  81. /package/dist/{chunk-7UVDIWLL.js.map → chunk-NEILAC3H.js.map} +0 -0
  82. /package/dist/{chunk-K7I24ZO2.js.map → chunk-O4ZIV62T.js.map} +0 -0
  83. /package/dist/{chunk-NCRDCTEJ.js.map → chunk-SEK4XIDN.js.map} +0 -0
  84. /package/dist/{chunk-5CEJH5ZN.js.map → chunk-TAPSNIMA.js.map} +0 -0
  85. /package/dist/{chunk-QLRYXOAD.js.map → chunk-UDJLF3BO.js.map} +0 -0
  86. /package/dist/{chunk-KO6OL4I7.js.map → chunk-V56S3A23.js.map} +0 -0
  87. /package/dist/{chunk-WRFKZEO6.js.map → chunk-YQGHW5ML.js.map} +0 -0
@@ -0,0 +1,149 @@
1
+ import {
2
+ planNamespaceMaintenance,
3
+ readNamespaceMaintenanceLastRanStatuses,
4
+ readNamespaceMaintenanceStatuses,
5
+ runNamespaceMaintenancePlan
6
+ } from "./chunk-4IQNAOP3.js";
7
+
8
+ // src/maintenance/namespace-maintenance-fanout.ts
9
+ var NAMESPACE_MAINTENANCE_JOBS = [
10
+ "qmd",
11
+ "pattern-reinforcement",
12
+ "contradiction-scan",
13
+ "semantic-consolidation",
14
+ "governance",
15
+ "lifecycle",
16
+ "graph-decay",
17
+ "fact-archival",
18
+ "tier-migration"
19
+ ];
20
+ async function runNamespaceMaintenanceFanout(options) {
21
+ if (options.enabled === false) {
22
+ return {
23
+ jobName: options.jobName,
24
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
25
+ ran: 0,
26
+ skipped: 0,
27
+ failed: 0,
28
+ statuses: []
29
+ };
30
+ }
31
+ const plan = await planNamespaceMaintenance(options.config, {
32
+ jobName: options.jobName,
33
+ catalog: options.catalog
34
+ });
35
+ return runNamespaceMaintenancePlan(
36
+ options.config,
37
+ plan,
38
+ async (candidate) => {
39
+ return options.runner({
40
+ config: options.config,
41
+ candidate,
42
+ resolveStorage: options.resolveStorage
43
+ });
44
+ },
45
+ options.catalog
46
+ );
47
+ }
48
+ async function summarizeNamespaceMaintenanceHealth(config) {
49
+ const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
50
+ const statuses = await readNamespaceMaintenanceStatuses(config);
51
+ const lastRanStatuses = await readNamespaceMaintenanceLastRanStatuses(config);
52
+ const lastRanByJobNs = /* @__PURE__ */ new Map();
53
+ for (const lr of lastRanStatuses) {
54
+ lastRanByJobNs.set(`${lr.jobName}\0${lr.namespace}`, lr);
55
+ }
56
+ const byJob = /* @__PURE__ */ new Map();
57
+ for (const status of statuses) {
58
+ const bucket = byJob.get(status.jobName);
59
+ if (bucket) {
60
+ bucket.push(status);
61
+ } else {
62
+ byJob.set(status.jobName, [status]);
63
+ }
64
+ }
65
+ const knownJobs = new Set(NAMESPACE_MAINTENANCE_JOBS);
66
+ for (const jobName of byJob.keys()) {
67
+ knownJobs.add(jobName);
68
+ }
69
+ const jobs = [];
70
+ let totalRan = 0;
71
+ let totalSkipped = 0;
72
+ let totalFailed = 0;
73
+ for (const jobName of [...knownJobs].sort()) {
74
+ const jobStatuses = byJob.get(jobName) ?? [];
75
+ const ran = jobStatuses.filter((s) => s.state === "ran").length;
76
+ const skipped = jobStatuses.filter((s) => s.state === "skipped").length;
77
+ const failed = jobStatuses.filter((s) => s.state === "failed").length;
78
+ const candidates = [];
79
+ for (const st of jobStatuses) {
80
+ if (typeof st.completedAt === "string") candidates.push(st.completedAt);
81
+ const lr = lastRanByJobNs.get(`${jobName}\0${st.namespace}`);
82
+ if (lr && typeof lr.completedAt === "string") candidates.push(lr.completedAt);
83
+ }
84
+ const lastRunAt = candidates.sort().at(-1) ?? null;
85
+ totalRan += ran;
86
+ totalSkipped += skipped;
87
+ totalFailed += failed;
88
+ jobs.push({
89
+ jobName,
90
+ ran,
91
+ skipped,
92
+ failed,
93
+ lastRunAt,
94
+ namespaces: jobStatuses
95
+ });
96
+ }
97
+ return {
98
+ generatedAt,
99
+ fanoutEnabled: config.maintenanceNamespaceFanoutEnabled !== false,
100
+ namespacesEnabled: config.namespacesEnabled,
101
+ maxNamespacesPerCycle: config.maintenanceMaxNamespacesPerCycle,
102
+ jobs,
103
+ totalRan,
104
+ totalSkipped,
105
+ totalFailed
106
+ };
107
+ }
108
+ function formatNamespaceMaintenanceHealthText(summary) {
109
+ const lines = [
110
+ "=== Namespace Maintenance ===",
111
+ "",
112
+ ` fanout: ${summary.fanoutEnabled ? "enabled" : "disabled"}`,
113
+ ` namespaces: ${summary.namespacesEnabled ? "enabled" : "disabled"}`,
114
+ ` max/cycle: ${summary.maxNamespacesPerCycle}`,
115
+ ` total ran: ${summary.totalRan}`,
116
+ ` total skipped: ${summary.totalSkipped}`,
117
+ ` total failed: ${summary.totalFailed}`,
118
+ ""
119
+ ];
120
+ if (summary.totalRan === 0 && summary.totalSkipped === 0 && summary.totalFailed === 0) {
121
+ lines.push(" (no maintenance status recorded yet)");
122
+ return lines.join("\n");
123
+ }
124
+ lines.push(" Per-job breakdown:");
125
+ for (const job of summary.jobs) {
126
+ const parts = [
127
+ `ran=${job.ran}`,
128
+ `skipped=${job.skipped}`,
129
+ `failed=${job.failed}`
130
+ ];
131
+ if (job.lastRunAt) {
132
+ parts.push(`last=${job.lastRunAt}`);
133
+ }
134
+ lines.push(` ${job.jobName}: ${parts.join(", ")}`);
135
+ const failedNs = job.namespaces.filter((n) => n.state === "failed");
136
+ for (const ns of failedNs) {
137
+ const detail = ns.error ? `: ${ns.error}` : "";
138
+ lines.push(` ! ${ns.namespace} failed (reason=${ns.reason ?? "unknown"})${detail}`);
139
+ }
140
+ }
141
+ return lines.join("\n");
142
+ }
143
+
144
+ export {
145
+ runNamespaceMaintenanceFanout,
146
+ summarizeNamespaceMaintenanceHealth,
147
+ formatNamespaceMaintenanceHealthText
148
+ };
149
+ //# sourceMappingURL=chunk-HXNMDPHN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/maintenance/namespace-maintenance-fanout.ts"],"sourcesContent":["/**\n * Namespace maintenance fanout coordinator (issue #1500).\n *\n * Builds on the namespace-aware maintenance planner (#1499 / #1517) to fan out\n * the REMAINING background maintenance jobs — dreams, pattern reinforcement,\n * governance/lifecycle, contradiction scans, semantic/causal consolidation,\n * graph decay, fact archival, tier migration — across all maintained\n * namespaces.\n *\n * The planner (`namespace-planner.ts`) already handles namespace discovery\n * (configured + catalog), per-kind gating, cycle budgeting, per-job+namespace\n * locking, status recording, and catalog maintenance timestamps. QMD\n * maintenance was wired through it in #1517. This module standardizes the\n * per-job adapter pattern so every other maintenance job can be fanned out\n * with one call, and aggregates per-namespace health for doctor/dashboard.\n *\n * Design contract (issue #1500 compatibility requirements):\n * - Existing direct `runJob({ namespace })` calls continue to work unchanged.\n * - Namespaces disabled: fanout is a no-op (the planner returns only the\n * default namespace; jobs run exactly as before).\n * - `maintenanceNamespaceFanoutEnabled: false`: fanout is a no-op.\n * - A failure in one namespace must not abort other namespaces (the planner\n * already isolates per-namespace failures).\n * - Per-namespace locks prevent duplicate concurrent runs (planner-provided).\n */\n\nimport type { NamespaceCatalog } from \"../namespaces/catalog.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport {\n planNamespaceMaintenance,\n readNamespaceMaintenanceLastRanStatuses,\n readNamespaceMaintenanceStatuses,\n runNamespaceMaintenancePlan,\n type NamespaceMaintenanceCandidate,\n type NamespaceMaintenanceRunStatus,\n type NamespaceMaintenanceSummary,\n} from \"./namespace-planner.js\";\n\n/**\n * Standard maintenance job names fanned out across namespaces.\n *\n * These strings are used as the `jobName` key in:\n * - per-namespace status files (`state/namespace-maintenance-status/<job>/...`)\n * - catalog `lastMaintenanceAt[jobName]` timestamps\n * - per-job+namespace lock files (`state/maintenance-locks/<job>/...`)\n *\n * Keeping them centralized ensures the doctor, CLI, and dashboard all report\n * against the same keys.\n */\nexport const NAMESPACE_MAINTENANCE_JOBS = [\n \"qmd\",\n \"pattern-reinforcement\",\n \"contradiction-scan\",\n \"semantic-consolidation\",\n \"governance\",\n \"lifecycle\",\n \"graph-decay\",\n \"fact-archival\",\n \"tier-migration\",\n] as const;\n\nexport type NamespaceMaintenanceStandardJob =\n (typeof NAMESPACE_MAINTENANCE_JOBS)[number];\n\n/**\n * Context passed to a fanout job runner. The runner receives the per-namespace\n * candidate (namespace name, kind, storage dir) and a storage resolver that\n * the orchestrator wires to `storageRouter.storageFor(namespace)`.\n *\n * The storage resolver is intentionally typed as `unknown` here so this module\n * does not depend on the `StorageManager` class — the orchestrator provides the\n * typed resolver. This keeps the fanout module free of orchestrator/storage\n * imports and unit-testable with a stub.\n */\nexport interface NamespaceMaintenanceFanoutRunnerContext {\n config: PluginConfig;\n candidate: NamespaceMaintenanceCandidate;\n resolveStorage: (namespace: string) => Promise<unknown>;\n}\n\n/**\n * Result returned by a fanout job runner. `itemCount` is optional and\n * domain-specific (e.g. memories scanned, edges decayed, embeddings updated).\n *\n * `skipped`/`skipReason`: when a runner performs no work for a namespace\n * (e.g. the job's own cadence gate throttled it), set `skipped: true`. The\n * planner records the namespace as `state: \"skipped\"` and does NOT touch\n * the catalog's `lastMaintenanceAt`, so a throttled namespace is not\n * falsely reported as maintained.\n */\nexport interface NamespaceMaintenanceFanoutRunnerResult {\n itemCount?: number;\n skipped?: boolean;\n skipReason?: string;\n}\n\nexport type NamespaceMaintenanceFanoutRunner = (\n ctx: NamespaceMaintenanceFanoutRunnerContext,\n) => Promise<NamespaceMaintenanceFanoutRunnerResult | undefined>;\n\nexport interface RunNamespaceMaintenanceFanoutOptions {\n config: PluginConfig;\n catalog?: NamespaceCatalog;\n jobName: string;\n runner: NamespaceMaintenanceFanoutRunner;\n resolveStorage: (namespace: string) => Promise<unknown>;\n /**\n * When `false`, skip fanout entirely and return a zero-summary without\n * touching the planner or locks. This lets callers gate fanout on\n * per-job config (e.g. `semanticConsolidationEnabled`) without repeating\n * the namespace-discovery logic.\n */\n enabled?: boolean;\n}\n\n/**\n * Fan out a single maintenance job across all maintained namespaces.\n *\n * This is the primary entry point for wiring a maintenance job through the\n * namespace-aware planner. It:\n * 1. Plans which namespaces should be maintained (configured + catalog,\n * budgeted, kind-gated).\n * 2. Runs the job per-namespace through `runNamespaceMaintenancePlan`, which\n * acquires per-job+namespace locks, records status files, and touches the\n * catalog's `lastMaintenanceAt`.\n *\n * When namespaces are disabled or fanout is off, the planner returns only the\n * default namespace, so the job runs exactly once against default storage —\n * preserving single-user behavior.\n */\nexport async function runNamespaceMaintenanceFanout(\n options: RunNamespaceMaintenanceFanoutOptions,\n): Promise<NamespaceMaintenanceSummary> {\n if (options.enabled === false) {\n return {\n jobName: options.jobName,\n generatedAt: new Date().toISOString(),\n ran: 0,\n skipped: 0,\n failed: 0,\n statuses: [],\n };\n }\n\n const plan = await planNamespaceMaintenance(options.config, {\n jobName: options.jobName,\n catalog: options.catalog,\n });\n\n return runNamespaceMaintenancePlan(\n options.config,\n plan,\n async (candidate) => {\n return options.runner({\n config: options.config,\n candidate,\n resolveStorage: options.resolveStorage,\n });\n },\n options.catalog,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Health summary for doctor / dashboard / CLI\n// ---------------------------------------------------------------------------\n\nexport interface NamespaceMaintenanceJobHealth {\n jobName: string;\n ran: number;\n skipped: number;\n failed: number;\n lastRunAt: string | null;\n namespaces: NamespaceMaintenanceRunStatus[];\n}\n\nexport interface NamespaceMaintenanceHealthSummary {\n generatedAt: string;\n fanoutEnabled: boolean;\n namespacesEnabled: boolean;\n maxNamespacesPerCycle: number;\n jobs: NamespaceMaintenanceJobHealth[];\n totalRan: number;\n totalSkipped: number;\n totalFailed: number;\n}\n\n/**\n * Read all per-namespace maintenance status files and aggregate them into a\n * health summary suitable for `remnic doctor` and the admin dashboard.\n *\n * This is a pure read operation — it never runs maintenance or acquires locks.\n */\nexport async function summarizeNamespaceMaintenanceHealth(\n config: PluginConfig,\n): Promise<NamespaceMaintenanceHealthSummary> {\n const generatedAt = new Date().toISOString();\n const statuses = await readNamespaceMaintenanceStatuses(config);\n // Merge last-successful-run records so lastRunAt reflects the most recent\n // successful maintenance, not just the latest (possibly skipped/failed)\n // outcome. The latest status file is overwritten on every run; without\n // this merge a namespace that ran then got budget-skipped shows ran=0 /\n // lastRunAt=null (review #1622: preserve last successful run).\n const lastRanStatuses = await readNamespaceMaintenanceLastRanStatuses(config);\n const lastRanByJobNs = new Map<string, NamespaceMaintenanceRunStatus>();\n for (const lr of lastRanStatuses) {\n lastRanByJobNs.set(`${lr.jobName}\\u0000${lr.namespace}`, lr);\n }\n\n const byJob = new Map<string, NamespaceMaintenanceRunStatus[]>();\n for (const status of statuses) {\n const bucket = byJob.get(status.jobName);\n if (bucket) {\n bucket.push(status);\n } else {\n byJob.set(status.jobName, [status]);\n }\n }\n\n const knownJobs = new Set<string>(NAMESPACE_MAINTENANCE_JOBS);\n // Include any job names seen in status files that are not in the standard\n // set (e.g. custom jobs registered by the orchestrator) so the doctor does\n // not silently hide them.\n for (const jobName of byJob.keys()) {\n knownJobs.add(jobName);\n }\n\n const jobs: NamespaceMaintenanceJobHealth[] = [];\n let totalRan = 0;\n let totalSkipped = 0;\n let totalFailed = 0;\n\n for (const jobName of [...knownJobs].sort()) {\n const jobStatuses = byJob.get(jobName) ?? [];\n const ran = jobStatuses.filter((s) => s.state === \"ran\").length;\n const skipped = jobStatuses.filter((s) => s.state === \"skipped\").length;\n const failed = jobStatuses.filter((s) => s.state === \"failed\").length;\n // Consider BOTH the latest outcome and the last successful run so a\n // namespace that ran then was later skipped still reports lastRunAt.\n const candidates: string[] = [];\n for (const st of jobStatuses) {\n if (typeof st.completedAt === \"string\") candidates.push(st.completedAt);\n const lr = lastRanByJobNs.get(`${jobName}\\u0000${st.namespace}`);\n if (lr && typeof lr.completedAt === \"string\") candidates.push(lr.completedAt);\n }\n const lastRunAt = candidates.sort().at(-1) ?? null;\n\n totalRan += ran;\n totalSkipped += skipped;\n totalFailed += failed;\n\n jobs.push({\n jobName,\n ran,\n skipped,\n failed,\n lastRunAt,\n namespaces: jobStatuses,\n });\n }\n\n return {\n generatedAt,\n fanoutEnabled: config.maintenanceNamespaceFanoutEnabled !== false,\n namespacesEnabled: config.namespacesEnabled,\n maxNamespacesPerCycle: config.maintenanceMaxNamespacesPerCycle,\n jobs,\n totalRan,\n totalSkipped,\n totalFailed,\n };\n}\n\n/**\n * Format the health summary as human-readable text for the CLI.\n */\nexport function formatNamespaceMaintenanceHealthText(\n summary: NamespaceMaintenanceHealthSummary,\n): string {\n const lines: string[] = [\n \"=== Namespace Maintenance ===\",\n \"\",\n ` fanout: ${summary.fanoutEnabled ? \"enabled\" : \"disabled\"}`,\n ` namespaces: ${summary.namespacesEnabled ? \"enabled\" : \"disabled\"}`,\n ` max/cycle: ${summary.maxNamespacesPerCycle}`,\n ` total ran: ${summary.totalRan}`,\n ` total skipped: ${summary.totalSkipped}`,\n ` total failed: ${summary.totalFailed}`,\n \"\",\n ];\n\n if (summary.totalRan === 0 && summary.totalSkipped === 0 && summary.totalFailed === 0) {\n lines.push(\" (no maintenance status recorded yet)\");\n return lines.join(\"\\n\");\n }\n\n lines.push(\" Per-job breakdown:\");\n for (const job of summary.jobs) {\n const parts = [\n `ran=${job.ran}`,\n `skipped=${job.skipped}`,\n `failed=${job.failed}`,\n ];\n if (job.lastRunAt) {\n parts.push(`last=${job.lastRunAt}`);\n }\n lines.push(` ${job.jobName}: ${parts.join(\", \")}`);\n // Surface failed namespaces with their reason/error so operators know\n // WHAT to fix without rerunning with --json (review #1622).\n const failedNs = job.namespaces.filter((n) => n.state === \"failed\");\n for (const ns of failedNs) {\n const detail = ns.error ? `: ${ns.error}` : \"\";\n lines.push(` ! ${ns.namespace} failed (reason=${ns.reason ?? \"unknown\"})${detail}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,3 @@
1
- import {
2
- CAPSULE_SCHEMA_VERSION,
3
- EXPORT_FORMAT
4
- } from "./chunk-J4EB7DNW.js";
5
1
  import {
6
2
  CAPSULE_ID_PATTERN,
7
3
  CapsuleBlockSchema,
@@ -11,6 +7,10 @@ import {
11
7
  import {
12
8
  encryptCapsuleFile
13
9
  } from "./chunk-X7Y7WX73.js";
10
+ import {
11
+ CAPSULE_SCHEMA_VERSION,
12
+ EXPORT_FORMAT
13
+ } from "./chunk-J4EB7DNW.js";
14
14
  import {
15
15
  DEFAULT_TRANSFER_EXCLUDE_DIRS,
16
16
  computeTransferOutputRel
@@ -261,4 +261,4 @@ export {
261
261
  exportCapsule,
262
262
  isValidCapsuleSince
263
263
  };
264
- //# sourceMappingURL=chunk-IPLYGWQF.js.map
264
+ //# sourceMappingURL=chunk-KQAFEZQX.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listNamespaces
3
- } from "./chunk-D3DNGQNQ.js";
3
+ } from "./chunk-FM7KLRKN.js";
4
4
  import {
5
5
  runConsolidationProvenanceCheck
6
6
  } from "./chunk-7XH7VJN4.js";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-YBPYIAA5.js";
10
10
  import {
11
11
  summarizeNamespaceMaintenanceHealth
12
- } from "./chunk-QNG35H27.js";
12
+ } from "./chunk-HXNMDPHN.js";
13
13
  import {
14
14
  analyzeSessionIntegrity,
15
15
  applySessionRepair,
@@ -1347,4 +1347,4 @@ export {
1347
1347
  runBenchmarkRecall,
1348
1348
  runOperatorRepair
1349
1349
  };
1350
- //# sourceMappingURL=chunk-OOO7ZKOD.js.map
1350
+ //# sourceMappingURL=chunk-KYH53EFD.js.map
@@ -1,10 +1,10 @@
1
- import {
2
- scanMemoryDir
3
- } from "./chunk-AER6MT24.js";
4
1
  import {
5
2
  isSearchAborted,
6
3
  throwIfSearchAborted
7
4
  } from "./chunk-CINZGPSJ.js";
5
+ import {
6
+ scanMemoryDir
7
+ } from "./chunk-AER6MT24.js";
8
8
  import {
9
9
  resolveEnsureCollectionArgs
10
10
  } from "./chunk-YNQ6DFSV.js";
@@ -605,4 +605,4 @@ export {
605
605
  resolveOramaCollectionDbFilePath,
606
606
  OramaBackend
607
607
  };
608
- //# sourceMappingURL=chunk-LQ6JI4VH.js.map
608
+ //# sourceMappingURL=chunk-LD53WPMU.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  memoryStoreRequestSchema
3
- } from "./chunk-QLRYXOAD.js";
3
+ } from "./chunk-UDJLF3BO.js";
4
4
  import {
5
5
  defineOperation
6
- } from "./chunk-VH2DHBHG.js";
6
+ } from "./chunk-2EN5WZQB.js";
7
7
  import {
8
8
  DECISION_SUBCOMMANDS
9
- } from "./chunk-KO6OL4I7.js";
9
+ } from "./chunk-V56S3A23.js";
10
10
 
11
11
  // src/access-operations.ts
12
12
  import { z } from "zod";
@@ -150,4 +150,4 @@ export {
150
150
  codingArchitectureOperation,
151
151
  REGISTERED_OPERATIONS
152
152
  };
153
- //# sourceMappingURL=chunk-7UVDIWLL.js.map
153
+ //# sourceMappingURL=chunk-NEILAC3H.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ chatgptReplayNormalizer
3
+ } from "./chunk-MC4FJXPA.js";
1
4
  import {
2
5
  claudeReplayNormalizer
3
6
  } from "./chunk-LQHDIS7L.js";
@@ -5,8 +8,8 @@ import {
5
8
  openclawReplayNormalizer
6
9
  } from "./chunk-7F7Z6MOS.js";
7
10
  import {
8
- chatgptReplayNormalizer
9
- } from "./chunk-MC4FJXPA.js";
11
+ importSqlite
12
+ } from "./chunk-AGNBY3VG.js";
10
13
  import {
11
14
  exportJsonBundle
12
15
  } from "./chunk-UP6MOYCB.js";
@@ -16,9 +19,6 @@ import {
16
19
  import {
17
20
  importMarkdownBundle
18
21
  } from "./chunk-HDDRVXX4.js";
19
- import {
20
- importSqlite
21
- } from "./chunk-AGNBY3VG.js";
22
22
  import {
23
23
  detectImportFormat
24
24
  } from "./chunk-OZKVVUJB.js";
@@ -31,17 +31,17 @@ import {
31
31
  import {
32
32
  exportMarkdownBundle
33
33
  } from "./chunk-765K3SAT.js";
34
+ import {
35
+ buildReplayNormalizerRegistry,
36
+ clampBatchSize,
37
+ runReplay
38
+ } from "./chunk-HOJZMQ4J.js";
34
39
  import {
35
40
  TailscaleHelper
36
41
  } from "./chunk-EEC4PCG5.js";
37
42
  import {
38
43
  WebDavServer
39
44
  } from "./chunk-PYIFUBRK.js";
40
- import {
41
- buildReplayNormalizerRegistry,
42
- clampBatchSize,
43
- runReplay
44
- } from "./chunk-HOJZMQ4J.js";
45
45
  import {
46
46
  migrateObservations
47
47
  } from "./chunk-D6RIFG4O.js";
@@ -102,22 +102,22 @@ import {
102
102
  runOperatorInventory,
103
103
  runOperatorRepair,
104
104
  runOperatorSetup
105
- } from "./chunk-OOO7ZKOD.js";
105
+ } from "./chunk-KYH53EFD.js";
106
106
  import {
107
107
  listNamespaces,
108
108
  runNamespaceMigration,
109
109
  verifyNamespaces
110
- } from "./chunk-D3DNGQNQ.js";
110
+ } from "./chunk-FM7KLRKN.js";
111
111
  import {
112
112
  GraphDashboardServer
113
113
  } from "./chunk-YNDLCWXS.js";
114
- import {
115
- RoutingRulesStore
116
- } from "./chunk-WIWPSQYU.js";
117
114
  import {
118
115
  isReplaySource,
119
116
  normalizeReplaySessionKey
120
117
  } from "./chunk-2PRQG7PV.js";
118
+ import {
119
+ RoutingRulesStore
120
+ } from "./chunk-WIWPSQYU.js";
121
121
  import {
122
122
  getUtilityLearningStatus,
123
123
  learnUtilityPromotionWeights
@@ -149,7 +149,7 @@ import {
149
149
  } from "./chunk-33JBK2XP.js";
150
150
  import {
151
151
  formatNamespaceMaintenanceHealthText
152
- } from "./chunk-QNG35H27.js";
152
+ } from "./chunk-HXNMDPHN.js";
153
153
  import {
154
154
  analyzeSessionIntegrity,
155
155
  applySessionRepair,
@@ -219,16 +219,16 @@ import {
219
219
  } from "./chunk-OADWQ5CR.js";
220
220
  import {
221
221
  EngramAccessHttpServer
222
- } from "./chunk-NCRDCTEJ.js";
222
+ } from "./chunk-SEK4XIDN.js";
223
223
  import {
224
224
  WearablesInputError
225
225
  } from "./chunk-7WV3F5DQ.js";
226
226
  import {
227
227
  EngramMcpServer
228
- } from "./chunk-TSGREOYY.js";
228
+ } from "./chunk-DO7MDZMU.js";
229
229
  import {
230
230
  EngramAccessService
231
- } from "./chunk-KO6OL4I7.js";
231
+ } from "./chunk-V56S3A23.js";
232
232
  import {
233
233
  WorkStorage
234
234
  } from "./chunk-GDB4J2H3.js";
@@ -7326,4 +7326,4 @@ export {
7326
7326
  listMemoryMarkdownFilePaths,
7327
7327
  registerCli
7328
7328
  };
7329
- //# sourceMappingURL=chunk-K7I24ZO2.js.map
7329
+ //# sourceMappingURL=chunk-O4ZIV62T.js.map
@@ -6,16 +6,16 @@ import {
6
6
  } from "./chunk-7WV3F5DQ.js";
7
7
  import {
8
8
  EngramMcpServer
9
- } from "./chunk-TSGREOYY.js";
9
+ } from "./chunk-DO7MDZMU.js";
10
10
  import {
11
11
  validateRequest
12
- } from "./chunk-QLRYXOAD.js";
12
+ } from "./chunk-UDJLF3BO.js";
13
13
  import {
14
14
  getOperation
15
- } from "./chunk-VH2DHBHG.js";
15
+ } from "./chunk-2EN5WZQB.js";
16
16
  import {
17
17
  EngramAccessInputError
18
- } from "./chunk-KO6OL4I7.js";
18
+ } from "./chunk-V56S3A23.js";
19
19
  import {
20
20
  projectTagProjectId
21
21
  } from "./chunk-7MOTEVAA.js";
@@ -2079,4 +2079,4 @@ function positiveIntQueryParam(value, label) {
2079
2079
  export {
2080
2080
  EngramAccessHttpServer
2081
2081
  };
2082
- //# sourceMappingURL=chunk-NCRDCTEJ.js.map
2082
+ //# sourceMappingURL=chunk-SEK4XIDN.js.map
@@ -1,10 +1,10 @@
1
- import {
2
- scanMemoryDir
3
- } from "./chunk-AER6MT24.js";
4
1
  import {
5
2
  isSearchAborted,
6
3
  throwIfSearchAborted
7
4
  } from "./chunk-CINZGPSJ.js";
5
+ import {
6
+ scanMemoryDir
7
+ } from "./chunk-AER6MT24.js";
8
8
  import {
9
9
  resolveEnsureCollectionArgs
10
10
  } from "./chunk-YNQ6DFSV.js";
@@ -491,4 +491,4 @@ function isMissingVectorProviderColumnError(err) {
491
491
  export {
492
492
  LanceDbBackend
493
493
  };
494
- //# sourceMappingURL=chunk-5CEJH5ZN.js.map
494
+ //# sourceMappingURL=chunk-TAPSNIMA.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isValidCapsuleSince
3
- } from "./chunk-IPLYGWQF.js";
3
+ } from "./chunk-KQAFEZQX.js";
4
4
  import {
5
5
  CAPSULE_ID_PATTERN
6
6
  } from "./chunk-WEHSQBFR.js";
@@ -433,4 +433,4 @@ export {
433
433
  actionConfidenceRequestSchema,
434
434
  validateRequest
435
435
  };
436
- //# sourceMappingURL=chunk-QLRYXOAD.js.map
436
+ //# sourceMappingURL=chunk-UDJLF3BO.js.map
@@ -61,7 +61,7 @@ import {
61
61
  } from "./chunk-SAC5V6JT.js";
62
62
  import {
63
63
  namespaceCollectionName
64
- } from "./chunk-IPJD7WJH.js";
64
+ } from "./chunk-E6BOD3UJ.js";
65
65
  import {
66
66
  namespaceIdentityFromToken
67
67
  } from "./chunk-ZFXCQPNO.js";
@@ -131,7 +131,7 @@ import {
131
131
  } from "./chunk-VF4XKTX3.js";
132
132
  import {
133
133
  exportCapsule
134
- } from "./chunk-IPLYGWQF.js";
134
+ } from "./chunk-KQAFEZQX.js";
135
135
  import {
136
136
  OFFLINE_SYNC_SNAPSHOT_FORMAT,
137
137
  applyOfflineSyncChangeset,
@@ -6660,4 +6660,4 @@ export {
6660
6660
  shapeMemorySummary,
6661
6661
  EngramAccessService
6662
6662
  };
6663
- //# sourceMappingURL=chunk-KO6OL4I7.js.map
6663
+ //# sourceMappingURL=chunk-V56S3A23.js.map