@remnic/core 9.20.0 → 9.22.0

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 (158) hide show
  1. package/dist/access-admin-ops-surface.d.ts +18 -1
  2. package/dist/access-admin-ops-surface.js +29 -29
  3. package/dist/access-boundary.d.ts +2 -2
  4. package/dist/access-boundary.js +29 -29
  5. package/dist/access-cli.js +80 -79
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-http.d.ts +1 -1
  8. package/dist/access-http.js +38 -37
  9. package/dist/access-identity-continuity-surface.js +29 -29
  10. package/dist/access-lcm-surface.d.ts +1 -1
  11. package/dist/access-lcm-surface.js +29 -29
  12. package/dist/access-mcp-admin-tools.d.ts +18 -0
  13. package/dist/access-mcp-admin-tools.js +10 -0
  14. package/dist/access-mcp-admin-tools.js.map +1 -0
  15. package/dist/access-mcp-output-schemas.js +1 -1
  16. package/dist/access-mcp.d.ts +1 -1
  17. package/dist/access-mcp.js +35 -34
  18. package/dist/access-namespace-preflight.js +29 -29
  19. package/dist/access-observe-write-surface.d.ts +1 -1
  20. package/dist/access-observe-write-surface.js +29 -29
  21. package/dist/access-operations-batch.js +30 -30
  22. package/dist/access-operations.d.ts +5 -5
  23. package/dist/access-operations.js +32 -32
  24. package/dist/access-recall-concurrency.d.ts +1 -1
  25. package/dist/access-recall-concurrency.js +29 -29
  26. package/dist/access-recall-response.d.ts +1 -1
  27. package/dist/access-recall-response.js +29 -29
  28. package/dist/access-recall-surface.d.ts +1 -1
  29. package/dist/access-recall-surface.js +29 -29
  30. package/dist/access-schema.d.ts +76 -76
  31. package/dist/{access-service-BqUii7LY.d.ts → access-service-BtxW52vv.d.ts} +10 -0
  32. package/dist/access-service.d.ts +1 -1
  33. package/dist/access-service.js +31 -31
  34. package/dist/access-surface-catalog.d.ts +1 -1
  35. package/dist/access-surface-catalog.js +1 -0
  36. package/dist/access-surface-catalog.js.map +1 -1
  37. package/dist/active-recall.js +5 -5
  38. package/dist/adapters/index.js +4 -4
  39. package/dist/adapters/registry.js +2 -2
  40. package/dist/auto-sync-UPTUVE4X.js +1 -1
  41. package/dist/briefing.js +8 -8
  42. package/dist/causal-consolidation.js +9 -9
  43. package/dist/{chunk-JWMYVQAM.js → chunk-55FDQYPS.js} +2 -2
  44. package/dist/chunk-56BSXSHC.js +158 -0
  45. package/dist/chunk-56BSXSHC.js.map +1 -0
  46. package/dist/{chunk-62QM5MKY.js → chunk-6ANPNUVL.js} +68 -34
  47. package/dist/chunk-6ANPNUVL.js.map +1 -0
  48. package/dist/{chunk-EZKKHVFY.js → chunk-6L775BUB.js} +2 -2
  49. package/dist/{chunk-LI4ZOFHW.js → chunk-6RYWNBSA.js} +2 -2
  50. package/dist/{chunk-5IXPWEQB.js → chunk-7S5OMI76.js} +9 -9
  51. package/dist/{chunk-5IXPWEQB.js.map → chunk-7S5OMI76.js.map} +1 -1
  52. package/dist/{chunk-SB4OKS6C.js → chunk-A5N6ISRK.js} +2 -2
  53. package/dist/{chunk-V5TSUGRB.js → chunk-ACGGTPU4.js} +5 -5
  54. package/dist/{chunk-B7C3TF5H.js → chunk-BRT7KEXU.js} +2 -2
  55. package/dist/{chunk-JN3IUA2Q.js → chunk-CV6ZYXK3.js} +3 -3
  56. package/dist/{chunk-N7EVMKP6.js → chunk-DGLON3AL.js} +10 -10
  57. package/dist/{chunk-5RUE3GHQ.js → chunk-DM5A4ZFL.js} +7 -1
  58. package/dist/chunk-DM5A4ZFL.js.map +1 -0
  59. package/dist/{chunk-KHRKEELC.js → chunk-EQYBHXRR.js} +34 -34
  60. package/dist/{chunk-Z54EM5YZ.js → chunk-GF22HWS2.js} +4 -4
  61. package/dist/{chunk-QO2KODU6.js → chunk-GSWPU5CR.js} +2 -2
  62. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  63. package/dist/{chunk-5JQLAQUZ.js → chunk-JN57HZCD.js} +2 -2
  64. package/dist/{chunk-X5QS5C2O.js → chunk-KL5Y6PEV.js} +2 -2
  65. package/dist/{chunk-275ENJDK.js → chunk-KQ2XCQYN.js} +2 -2
  66. package/dist/{chunk-HJEEAO4O.js → chunk-N47ZWQBO.js} +2 -2
  67. package/dist/{chunk-AT3TDN6O.js → chunk-N6M7MRVN.js} +83 -83
  68. package/dist/{chunk-EXU5IQ3S.js → chunk-NB2P47N7.js} +2 -2
  69. package/dist/{chunk-53WDAG7X.js → chunk-OCMLGND7.js} +2 -2
  70. package/dist/{chunk-3ZUY2VQF.js → chunk-P72WZMWQ.js} +2 -2
  71. package/dist/{chunk-LRGSLV7M.js → chunk-PYHOAXTI.js} +4 -4
  72. package/dist/{chunk-4F6AANKS.js → chunk-QMGIQUBG.js} +5 -5
  73. package/dist/{chunk-TCZWBJBO.js → chunk-QTO2FGBT.js} +11 -142
  74. package/dist/chunk-QTO2FGBT.js.map +1 -0
  75. package/dist/{chunk-Q3FWRDCP.js → chunk-SACPRJ7F.js} +2 -2
  76. package/dist/{chunk-HPOY2PHQ.js → chunk-TTKWTT72.js} +6 -6
  77. package/dist/{chunk-EILX7SQR.js → chunk-W3XT32W7.js} +7 -6
  78. package/dist/chunk-W3XT32W7.js.map +1 -0
  79. package/dist/{chunk-MJYYXODM.js → chunk-XBRPEGXF.js} +4 -4
  80. package/dist/{cli-DPEhq0Cp.d.ts → cli-D9vXgWwM.d.ts} +1 -1
  81. package/dist/cli.d.ts +2 -2
  82. package/dist/cli.js +59 -58
  83. package/dist/compounding/engine.js +8 -8
  84. package/dist/config.js +2 -2
  85. package/dist/connectors/codex-materialize-runner.js +8 -8
  86. package/dist/connectors/index.js +9 -9
  87. package/dist/contradiction/index.js +1 -1
  88. package/dist/entity-retrieval.js +8 -8
  89. package/dist/explicit-capture.js +1 -1
  90. package/dist/index.d.ts +407 -407
  91. package/dist/index.js +133 -132
  92. package/dist/lcm/engine.js +2 -2
  93. package/dist/lcm/index.js +4 -4
  94. package/dist/maintenance/memory-governance.js +8 -8
  95. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +8 -8
  96. package/dist/maintenance/rebuild-memory-projection.js +9 -9
  97. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  98. package/dist/namespaces/migrate.js +12 -12
  99. package/dist/namespaces/search.js +3 -3
  100. package/dist/namespaces/storage.js +8 -8
  101. package/dist/offline-sync-impression-drain.js +1 -1
  102. package/dist/operator-toolkit.js +19 -19
  103. package/dist/orchestration/maintenance.js +14 -14
  104. package/dist/orchestrator.js +76 -75
  105. package/dist/resolution-3K27T4VO.js +1 -1
  106. package/dist/resume-bundles.js +3 -3
  107. package/dist/salvage-envelope.js +1 -1
  108. package/dist/schemas.d.ts +76 -76
  109. package/dist/search/factory.js +2 -2
  110. package/dist/search/index.js +4 -4
  111. package/dist/semantic-consolidation.js +9 -9
  112. package/dist/semantic-rule-promotion.js +8 -8
  113. package/dist/semantic-rule-verifier.js +8 -8
  114. package/dist/shared-context/manager.d.ts +8 -8
  115. package/dist/storage.js +7 -7
  116. package/dist/transfer/import-sqlite.js +2 -2
  117. package/dist/transfer/types.d.ts +66 -66
  118. package/dist/verified-recall.js +8 -8
  119. package/dist/write-envelope.js +1 -1
  120. package/package.json +2 -2
  121. package/src/access-admin-ops-surface.ts +47 -0
  122. package/src/access-boundary.ts +1 -0
  123. package/src/access-http.ts +1 -0
  124. package/src/access-mcp-admin-tools.ts +171 -0
  125. package/src/access-mcp-output-schemas.ts +6 -0
  126. package/src/access-mcp.ts +6 -141
  127. package/src/access-operations-batch.ts +1 -0
  128. package/src/access-service.ts +16 -0
  129. package/src/access-surface-catalog.ts +1 -0
  130. package/dist/chunk-5RUE3GHQ.js.map +0 -1
  131. package/dist/chunk-62QM5MKY.js.map +0 -1
  132. package/dist/chunk-EILX7SQR.js.map +0 -1
  133. package/dist/chunk-TCZWBJBO.js.map +0 -1
  134. /package/dist/{chunk-JWMYVQAM.js.map → chunk-55FDQYPS.js.map} +0 -0
  135. /package/dist/{chunk-EZKKHVFY.js.map → chunk-6L775BUB.js.map} +0 -0
  136. /package/dist/{chunk-LI4ZOFHW.js.map → chunk-6RYWNBSA.js.map} +0 -0
  137. /package/dist/{chunk-SB4OKS6C.js.map → chunk-A5N6ISRK.js.map} +0 -0
  138. /package/dist/{chunk-V5TSUGRB.js.map → chunk-ACGGTPU4.js.map} +0 -0
  139. /package/dist/{chunk-B7C3TF5H.js.map → chunk-BRT7KEXU.js.map} +0 -0
  140. /package/dist/{chunk-JN3IUA2Q.js.map → chunk-CV6ZYXK3.js.map} +0 -0
  141. /package/dist/{chunk-N7EVMKP6.js.map → chunk-DGLON3AL.js.map} +0 -0
  142. /package/dist/{chunk-KHRKEELC.js.map → chunk-EQYBHXRR.js.map} +0 -0
  143. /package/dist/{chunk-Z54EM5YZ.js.map → chunk-GF22HWS2.js.map} +0 -0
  144. /package/dist/{chunk-QO2KODU6.js.map → chunk-GSWPU5CR.js.map} +0 -0
  145. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  146. /package/dist/{chunk-5JQLAQUZ.js.map → chunk-JN57HZCD.js.map} +0 -0
  147. /package/dist/{chunk-X5QS5C2O.js.map → chunk-KL5Y6PEV.js.map} +0 -0
  148. /package/dist/{chunk-275ENJDK.js.map → chunk-KQ2XCQYN.js.map} +0 -0
  149. /package/dist/{chunk-HJEEAO4O.js.map → chunk-N47ZWQBO.js.map} +0 -0
  150. /package/dist/{chunk-AT3TDN6O.js.map → chunk-N6M7MRVN.js.map} +0 -0
  151. /package/dist/{chunk-EXU5IQ3S.js.map → chunk-NB2P47N7.js.map} +0 -0
  152. /package/dist/{chunk-53WDAG7X.js.map → chunk-OCMLGND7.js.map} +0 -0
  153. /package/dist/{chunk-3ZUY2VQF.js.map → chunk-P72WZMWQ.js.map} +0 -0
  154. /package/dist/{chunk-LRGSLV7M.js.map → chunk-PYHOAXTI.js.map} +0 -0
  155. /package/dist/{chunk-4F6AANKS.js.map → chunk-QMGIQUBG.js.map} +0 -0
  156. /package/dist/{chunk-Q3FWRDCP.js.map → chunk-SACPRJ7F.js.map} +0 -0
  157. /package/dist/{chunk-HPOY2PHQ.js.map → chunk-TTKWTT72.js.map} +0 -0
  158. /package/dist/{chunk-MJYYXODM.js.map → chunk-XBRPEGXF.js.map} +0 -0
@@ -15,8 +15,8 @@ import {
15
15
  import "./chunk-R3DJVOSM.js";
16
16
  import "./chunk-BT7NVCML.js";
17
17
  import "./chunk-5GKPFL3S.js";
18
- import "./chunk-JAKIDQB2.js";
19
18
  import "./chunk-P7FMDTKL.js";
19
+ import "./chunk-JAKIDQB2.js";
20
20
  import "./chunk-PZ5AY32C.js";
21
21
  export {
22
22
  FINGERPRINT_EXEMPT_FIELDS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.20.0",
3
+ "version": "9.22.0",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3045,7 +3045,7 @@
3045
3045
  "core"
3046
3046
  ],
3047
3047
  "peerDependencies": {
3048
- "@remnic/coding-graph": "^9.20.0"
3048
+ "@remnic/coding-graph": "^9.22.0"
3049
3049
  },
3050
3050
  "peerDependenciesMeta": {
3051
3051
  "@remnic/coding-graph": {
@@ -215,6 +215,53 @@ export class AccessAdminOpsSurface {
215
215
  };
216
216
  }
217
217
 
218
+ /**
219
+ * Operator-triggered bulk drain of the entity synthesis queue (issue #2136).
220
+ * Every automatic call site processes at most 5 entities per event, which a
221
+ * busy deployment's queue inflow outruns; this surface drains a bounded
222
+ * batch on demand. `maxEntities` is clamped to 200 per call so a single
223
+ * request stays bounded; loop until `processed < requested` to drain fully.
224
+ */
225
+ async entitySynthesisRun(
226
+ request: {
227
+ namespace?: string;
228
+ maxEntities?: number;
229
+ authenticatedPrincipal?: string;
230
+ },
231
+ principal?: string,
232
+ ): Promise<{
233
+ namespace: string;
234
+ requested: number;
235
+ processed: number;
236
+ remaining: number;
237
+ }> {
238
+ const resolvedNamespace = this.deps.writableNamespaceFor(
239
+ request.namespace,
240
+ undefined,
241
+ request.authenticatedPrincipal ?? principal,
242
+ );
243
+ let requested = 25;
244
+ if (request.maxEntities !== undefined) {
245
+ if (
246
+ typeof request.maxEntities !== "number"
247
+ || !Number.isInteger(request.maxEntities)
248
+ || request.maxEntities < 1
249
+ ) {
250
+ throw new Error(
251
+ `Invalid maxEntities: ${String(request.maxEntities)} (expected an integer >= 1)`,
252
+ );
253
+ }
254
+ requested = Math.min(200, request.maxEntities);
255
+ }
256
+ const processed = await this.deps.orchestrator.entitySynthesisCoordinator.processQueue(
257
+ resolvedNamespace,
258
+ requested,
259
+ );
260
+ const storage = await this.deps.orchestrator.getStorage(resolvedNamespace);
261
+ const remaining = (await storage.readEntitySynthesisQueue()).length;
262
+ return { namespace: resolvedNamespace, requested, processed, remaining };
263
+ }
264
+
218
265
  async conversationIndexUpdate(
219
266
  request: {
220
267
  sessionKey?: string;
@@ -82,6 +82,7 @@ export const OPERATION_NAMES = [
82
82
  "capsule_import",
83
83
  "capsule_list",
84
84
  "memory_governance_run",
85
+ "entity_synthesis_run",
85
86
  "procedure_mining_run",
86
87
  "pattern_reinforcement_run",
87
88
  "procedural_stats",
@@ -3224,6 +3224,7 @@ export class EngramAccessHttpServer {
3224
3224
  toolName === "remnic.capsule_export" ||
3225
3225
  toolName === "engram.capsule_import" ||
3226
3226
  toolName === "remnic.capsule_import" ||
3227
+ toolName === "engram.entity_synthesis_run" || toolName === "remnic.entity_synthesis_run" ||
3227
3228
  (
3228
3229
  !dreamsRunDryRun &&
3229
3230
  (toolName === "engram.dreams_run" || toolName === "remnic.dreams_run")
@@ -0,0 +1,171 @@
1
+ /**
2
+ * MCP tool-listing entries for the admin/maintenance operation surface
3
+ * (capsules, governance, entity synthesis, procedure mining, pattern
4
+ * reinforcement, procedural stats). Extracted from access-mcp.ts (#2136)
5
+ * to keep the transport file under its structural-ratchet ceiling; the
6
+ * dispatch name map and operation handlers stay in their existing homes.
7
+ */
8
+ /** Git-context schema props accepted-and-ignored by every tool (issue #569
9
+ * compatibility surface) — defined here so the tool tables and the transport
10
+ * share one copy without an import cycle. */
11
+ export const MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED: Record<string, unknown> = {
12
+ cwd: {
13
+ type: "string",
14
+ description: "Accepted for MCP client compatibility (git-context auto-injection); ignored by this tool.",
15
+ },
16
+ projectTag: {
17
+ type: "string",
18
+ description: "Accepted for MCP client compatibility; ignored by this tool.",
19
+ },
20
+ };
21
+
22
+ export const MCP_ADMIN_OPS_TOOLS: Array<{
23
+ name: string;
24
+ description: string;
25
+ inputSchema: Record<string, unknown>;
26
+ }> = [
27
+ {
28
+ name: "engram.capsule_export",
29
+ description: "Export a portable Remnic capsule archive from the namespace-scoped memory store.",
30
+ inputSchema: {
31
+ type: "object",
32
+ properties: {
33
+ name: {
34
+ type: "string",
35
+ description: "Capsule id (alphanumeric with single dashes, max 64 characters).",
36
+ },
37
+ namespace: { type: "string" },
38
+ since: {
39
+ type: "string",
40
+ description: "Only include files modified on or after this ISO 8601 timestamp.",
41
+ },
42
+ includeKinds: {
43
+ type: "array",
44
+ items: { type: "string" },
45
+ description: "Optional top-level directory allow-list.",
46
+ },
47
+ peerIds: {
48
+ type: "array",
49
+ items: { type: "string" },
50
+ description: "Optional peer id allow-list for the peers/ subtree.",
51
+ },
52
+ includeTranscripts: { type: "boolean" },
53
+ encrypt: { type: "boolean" },
54
+ ...MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
55
+ },
56
+ required: ["name"],
57
+ additionalProperties: false,
58
+ },
59
+ },
60
+ {
61
+ name: "engram.capsule_import",
62
+ description: "Import a Remnic capsule archive into the namespace-scoped memory store.",
63
+ inputSchema: {
64
+ type: "object",
65
+ properties: {
66
+ archivePath: {
67
+ type: "string",
68
+ description: "Path to a .capsule.json.gz or .capsule.json.gz.enc archive.",
69
+ },
70
+ namespace: { type: "string" },
71
+ mode: {
72
+ type: "string",
73
+ enum: ["skip", "overwrite", "fork"],
74
+ description: "Conflict handling mode. Defaults to skip.",
75
+ },
76
+ passphrase: {
77
+ type: "string",
78
+ description: "Passphrase for encrypted capsule archives.",
79
+ },
80
+ ...MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
81
+ },
82
+ required: ["archivePath"],
83
+ additionalProperties: false,
84
+ },
85
+ },
86
+ {
87
+ name: "engram.capsule_list",
88
+ description: "List capsule archives in the namespace-scoped capsule store.",
89
+ inputSchema: {
90
+ type: "object",
91
+ properties: {
92
+ namespace: { type: "string" },
93
+ sessionKey: {
94
+ type: "string",
95
+ description:
96
+ "Optional session key used to derive namespace principal when no trusted transport principal is present.",
97
+ },
98
+ ...MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
99
+ },
100
+ additionalProperties: false,
101
+ },
102
+ },
103
+ {
104
+ name: "engram.memory_governance_run",
105
+ description: "Run Remnic memory governance in a bounded shadow/apply pass.",
106
+ inputSchema: {
107
+ type: "object",
108
+ properties: {
109
+ namespace: { type: "string" },
110
+ mode: { type: "string", enum: ["shadow", "apply"] },
111
+ recentDays: { type: "number" },
112
+ maxMemories: { type: "number" },
113
+ batchSize: { type: "number" },
114
+ },
115
+ additionalProperties: false,
116
+ },
117
+ },
118
+ {
119
+ name: "engram.entity_synthesis_run",
120
+ description:
121
+ "Bulk-drain the entity synthesis queue (issue #2136). Processes up to maxEntities (default 25, max 200) queued entity names into canonical syntheses; loop until processed < requested to drain fully.",
122
+ inputSchema: {
123
+ type: "object",
124
+ properties: {
125
+ namespace: { type: "string" },
126
+ maxEntities: { type: "number" },
127
+ },
128
+ additionalProperties: false,
129
+ },
130
+ },
131
+ {
132
+ name: "engram.procedure_mining_run",
133
+ description:
134
+ "Run procedural memory mining from causal trajectories (issue #519). Respects procedural.enabled; writes under procedures/ when clusters qualify.",
135
+ inputSchema: {
136
+ type: "object",
137
+ properties: {
138
+ namespace: { type: "string" },
139
+ },
140
+ additionalProperties: false,
141
+ },
142
+ },
143
+ {
144
+ name: "engram.pattern_reinforcement_run",
145
+ description:
146
+ "Run the pattern-reinforcement maintenance job (issue #687 PR 2/4). Clusters duplicate non-procedural memories by normalized content, promotes the most-recent member to canonical, and supersedes the older duplicates. Gated on patternReinforcementEnabled and the patternReinforcementCadenceMs floor — pass force=true to bypass the cadence for an ad-hoc operator run.",
147
+ inputSchema: {
148
+ type: "object",
149
+ properties: {
150
+ namespace: { type: "string" },
151
+ force: { type: "boolean" },
152
+ },
153
+ additionalProperties: false,
154
+ },
155
+ },
156
+ {
157
+ // The canonical `remnic.procedural_stats` alias is added automatically
158
+ // by `withToolAliases` — the dual-naming invariant keeps both names
159
+ // alive for the legacy surface.
160
+ name: "engram.procedural_stats",
161
+ description:
162
+ "Procedural memory stats (issue #567): counts by status, recent write activity, and the active procedural.* config. Read-only, namespace-scoped.",
163
+ inputSchema: {
164
+ type: "object",
165
+ properties: {
166
+ namespace: { type: "string" },
167
+ },
168
+ additionalProperties: false,
169
+ },
170
+ },
171
+ ];
@@ -85,6 +85,12 @@ const TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {
85
85
  }),
86
86
  capsule_import: objectSchema({ imported: T_ARRAY, skipped: T_ARRAY, manifest: T_OBJECT }),
87
87
  capsule_list: objectSchema({ namespace: T_STRING, capsulesDir: T_STRING, capsules: T_ARRAY }),
88
+ entity_synthesis_run: objectSchema({
89
+ namespace: T_STRING,
90
+ requested: T_NUMBER,
91
+ processed: T_NUMBER,
92
+ remaining: T_NUMBER,
93
+ }),
88
94
  memory_governance_run: objectSchema({
89
95
  namespace: T_STRING,
90
96
  runId: T_STRING,
package/src/access-mcp.ts CHANGED
@@ -1,4 +1,8 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import {
3
+ MCP_ADMIN_OPS_TOOLS,
4
+ MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
5
+ } from "./access-mcp-admin-tools.js";
2
6
  import { readFile } from "node:fs/promises";
3
7
  import type { Readable, Writable } from "node:stream";
4
8
  // Importing access-operations registers the pilot boundary operations
@@ -192,6 +196,7 @@ const MCP_MIGRATED_OPERATIONS: Readonly<Record<string, OperationName>> = {
192
196
  "engram.capsule_import": "capsule_import",
193
197
  "engram.capsule_list": "capsule_list",
194
198
  "engram.memory_governance_run": "memory_governance_run",
199
+ "engram.entity_synthesis_run": "entity_synthesis_run",
195
200
  "engram.procedure_mining_run": "procedure_mining_run",
196
201
  "engram.pattern_reinforcement_run": "pattern_reinforcement_run",
197
202
  "engram.procedural_stats": "procedural_stats",
@@ -333,16 +338,6 @@ const MCP_GIT_CONTEXT_SCHEMA_PROPS_SCOPED: Record<string, unknown> = {
333
338
  "Optional project tag for non-git project scoping. When no explicit namespace is given, routes this write to the tagged project namespace.",
334
339
  },
335
340
  };
336
- const MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED: Record<string, unknown> = {
337
- cwd: {
338
- type: "string",
339
- description: "Accepted for MCP client compatibility (git-context auto-injection); ignored by this tool.",
340
- },
341
- projectTag: {
342
- type: "string",
343
- description: "Accepted for MCP client compatibility; ignored by this tool.",
344
- },
345
- };
346
341
 
347
342
  function parseMcpRequest<N extends SchemaName>(schemaName: N, args: Record<string, unknown>): SchemaTypeFor<N> {
348
343
  const allowedKeys = STRICT_MCP_SCHEMA_KEYS[schemaName];
@@ -976,137 +971,7 @@ export class EngramMcpServer {
976
971
  additionalProperties: false,
977
972
  },
978
973
  },
979
- {
980
- name: "engram.capsule_export",
981
- description: "Export a portable Remnic capsule archive from the namespace-scoped memory store.",
982
- inputSchema: {
983
- type: "object",
984
- properties: {
985
- name: {
986
- type: "string",
987
- description: "Capsule id (alphanumeric with single dashes, max 64 characters).",
988
- },
989
- namespace: { type: "string" },
990
- since: {
991
- type: "string",
992
- description: "Only include files modified on or after this ISO 8601 timestamp.",
993
- },
994
- includeKinds: {
995
- type: "array",
996
- items: { type: "string" },
997
- description: "Optional top-level directory allow-list.",
998
- },
999
- peerIds: {
1000
- type: "array",
1001
- items: { type: "string" },
1002
- description: "Optional peer id allow-list for the peers/ subtree.",
1003
- },
1004
- includeTranscripts: { type: "boolean" },
1005
- encrypt: { type: "boolean" },
1006
- ...MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
1007
- },
1008
- required: ["name"],
1009
- additionalProperties: false,
1010
- },
1011
- },
1012
- {
1013
- name: "engram.capsule_import",
1014
- description: "Import a Remnic capsule archive into the namespace-scoped memory store.",
1015
- inputSchema: {
1016
- type: "object",
1017
- properties: {
1018
- archivePath: {
1019
- type: "string",
1020
- description: "Path to a .capsule.json.gz or .capsule.json.gz.enc archive.",
1021
- },
1022
- namespace: { type: "string" },
1023
- mode: {
1024
- type: "string",
1025
- enum: ["skip", "overwrite", "fork"],
1026
- description: "Conflict handling mode. Defaults to skip.",
1027
- },
1028
- passphrase: {
1029
- type: "string",
1030
- description: "Passphrase for encrypted capsule archives.",
1031
- },
1032
- ...MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
1033
- },
1034
- required: ["archivePath"],
1035
- additionalProperties: false,
1036
- },
1037
- },
1038
- {
1039
- name: "engram.capsule_list",
1040
- description: "List capsule archives in the namespace-scoped capsule store.",
1041
- inputSchema: {
1042
- type: "object",
1043
- properties: {
1044
- namespace: { type: "string" },
1045
- sessionKey: {
1046
- type: "string",
1047
- description:
1048
- "Optional session key used to derive namespace principal when no trusted transport principal is present.",
1049
- },
1050
- ...MCP_GIT_CONTEXT_SCHEMA_PROPS_IGNORED,
1051
- },
1052
- additionalProperties: false,
1053
- },
1054
- },
1055
- {
1056
- name: "engram.memory_governance_run",
1057
- description: "Run Remnic memory governance in a bounded shadow/apply pass.",
1058
- inputSchema: {
1059
- type: "object",
1060
- properties: {
1061
- namespace: { type: "string" },
1062
- mode: { type: "string", enum: ["shadow", "apply"] },
1063
- recentDays: { type: "number" },
1064
- maxMemories: { type: "number" },
1065
- batchSize: { type: "number" },
1066
- },
1067
- additionalProperties: false,
1068
- },
1069
- },
1070
- {
1071
- name: "engram.procedure_mining_run",
1072
- description:
1073
- "Run procedural memory mining from causal trajectories (issue #519). Respects procedural.enabled; writes under procedures/ when clusters qualify.",
1074
- inputSchema: {
1075
- type: "object",
1076
- properties: {
1077
- namespace: { type: "string" },
1078
- },
1079
- additionalProperties: false,
1080
- },
1081
- },
1082
- {
1083
- name: "engram.pattern_reinforcement_run",
1084
- description:
1085
- "Run the pattern-reinforcement maintenance job (issue #687 PR 2/4). Clusters duplicate non-procedural memories by normalized content, promotes the most-recent member to canonical, and supersedes the older duplicates. Gated on patternReinforcementEnabled and the patternReinforcementCadenceMs floor — pass force=true to bypass the cadence for an ad-hoc operator run.",
1086
- inputSchema: {
1087
- type: "object",
1088
- properties: {
1089
- namespace: { type: "string" },
1090
- force: { type: "boolean" },
1091
- },
1092
- additionalProperties: false,
1093
- },
1094
- },
1095
- {
1096
- // The canonical `remnic.procedural_stats` alias is added automatically
1097
- // by `withToolAliases` — the dual-naming invariant keeps both names
1098
- // alive for the legacy surface.
1099
- name: "engram.procedural_stats",
1100
- description:
1101
- "Procedural memory stats (issue #567): counts by status, recent write activity, and the active procedural.* config. Read-only, namespace-scoped.",
1102
- inputSchema: {
1103
- type: "object",
1104
- properties: {
1105
- namespace: { type: "string" },
1106
- },
1107
- additionalProperties: false,
1108
- },
1109
- },
974
+ ...MCP_ADMIN_OPS_TOOLS,
1110
975
  {
1111
976
  name: "engram.memory_get",
1112
977
  description: "Fetch one Remnic memory by id.",
@@ -175,6 +175,7 @@ defineOperation({ name: "capsule_list", description: "List capsules.", schema: s
175
175
 
176
176
  // === GOVERNANCE ===
177
177
  defineOperation({ name: "memory_governance_run", description: "Run governance.", schema: strictSchema({ namespace: S.str, mode: S.str, recentDays: S.num, maxMemories: S.num, batchSize: S.num }), handler: async (input, ctx) => ({ result: await ctx.service.governanceRun({ namespace: optStr(input.namespace), mode: optStr(input.mode) === "apply" ? "apply" : "shadow", recentDays: optNum(input.recentDays), maxMemories: optNum(input.maxMemories), batchSize: optNum(input.batchSize), authenticatedPrincipal: ctx.authenticatedPrincipal }, ctx.authenticatedPrincipal) }) });
178
+ defineOperation({ name: "entity_synthesis_run", description: "Bulk-drain the entity synthesis queue (issue #2136).", schema: strictSchema({ namespace: S.str, maxEntities: S.num }), handler: async (input, ctx) => ({ result: await ctx.service.entitySynthesisRun({ namespace: optStr(input.namespace), maxEntities: input.maxEntities === undefined ? undefined : (input.maxEntities as number), authenticatedPrincipal: ctx.authenticatedPrincipal }, ctx.authenticatedPrincipal) }) });
178
179
  defineOperation({ name: "procedure_mining_run", description: "Run procedure mining.", schema: strictSchema({ namespace: S.str }), handler: async (input, ctx) => ({ result: await ctx.service.procedureMiningRun({ namespace: optStr(input.namespace), authenticatedPrincipal: ctx.authenticatedPrincipal }, ctx.authenticatedPrincipal) }) });
179
180
  defineOperation({ name: "pattern_reinforcement_run", description: "Run pattern reinforcement.", schema: strictSchema({ namespace: S.str, force: S.bool }), handler: async (input, ctx) => ({ result: await ctx.service.patternReinforcementRun({ namespace: optStr(input.namespace), force: input.force === true, authenticatedPrincipal: ctx.authenticatedPrincipal }, ctx.authenticatedPrincipal) }) });
180
181
  defineOperation({ name: "procedural_stats", description: "Procedural stats.", schema: strictSchema({ namespace: S.str }), handler: async (input, ctx) => ({ result: await ctx.service.procedureStats({ namespace: optStr(input.namespace) }, ctx.authenticatedPrincipal) }) });
@@ -3622,6 +3622,22 @@ export class EngramAccessService {
3622
3622
  );
3623
3623
  }
3624
3624
 
3625
+ async entitySynthesisRun(
3626
+ request: {
3627
+ namespace?: string;
3628
+ maxEntities?: number;
3629
+ authenticatedPrincipal?: string;
3630
+ },
3631
+ principal?: string,
3632
+ ): Promise<{
3633
+ namespace: string;
3634
+ requested: number;
3635
+ processed: number;
3636
+ remaining: number;
3637
+ }> {
3638
+ return this.accessAdminOpsSurface.entitySynthesisRun(request, principal);
3639
+ }
3640
+
3625
3641
  async procedureMiningRun(
3626
3642
  request: {
3627
3643
  namespace?: string;
@@ -66,6 +66,7 @@ export const MCP_TOOLS: readonly McpToolEntry[] = [
66
66
  { tool: "capsule_import", operation: "capsule_import" },
67
67
  { tool: "capsule_list", operation: "capsule_list" },
68
68
  { tool: "memory_governance_run", operation: "memory_governance_run" },
69
+ { tool: "entity_synthesis_run", operation: "entity_synthesis_run" },
69
70
  { tool: "procedure_mining_run", operation: "procedure_mining_run" },
70
71
  { tool: "pattern_reinforcement_run", operation: "pattern_reinforcement_run" },
71
72
  { tool: "procedural_stats", operation: "procedural_stats" },
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/access-mcp-output-schemas.ts"],"sourcesContent":["/**\n * Output-schema registry for MCP tools — extracted from access-mcp.ts to\n * keep that file under the 3000-LOC structural ratchet.\n *\n * Contains the per-suffix JSON-Schema declarations (derived from\n * production TS return contracts) and the application helper that\n * assigns schemas to tool objects.\n */\n\nconst T_STRING = { type: \"string\" } as const;\nconst T_NUMBER = { type: \"number\" } as const;\nconst T_BOOLEAN = { type: \"boolean\" } as const;\nconst T_ARRAY = { type: \"array\" } as const;\nconst T_OBJECT = { type: \"object\" } as const;\nconst T_NULLABLE_OBJECT = { type: [\"object\", \"null\"] } as const;\nconst T_NULLABLE_STRING = { type: [\"string\", \"null\"] } as const;\n\n/** Build a JSON Schema object type with the given properties. */\nfunction objectSchema(properties: Record<string, Readonly<Record<string, unknown>>>): Record<string, unknown> {\n return { type: \"object\", properties, additionalProperties: true };\n}\n\n/**\n * Per-suffix outputSchema registry. Tools not present here fall back to\n * `{ type: \"object\", additionalProperties: true }` in the constructor pass.\n * The `chatgpt_memory_inspector` tool ships its own precise schema and is\n * intentionally absent — the apply pass skips tools that already have one.\n */\nconst TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {\n recall: objectSchema({\n query: T_STRING,\n namespace: T_STRING,\n context: T_STRING,\n count: T_NUMBER,\n memoryIds: T_ARRAY,\n results: T_ARRAY,\n fallbackUsed: T_BOOLEAN,\n sourcesUsed: T_ARRAY,\n }),\n recall_explain: objectSchema({\n found: T_BOOLEAN,\n snapshot: T_OBJECT,\n intent: T_NULLABLE_OBJECT,\n graph: T_NULLABLE_OBJECT,\n }),\n recall_tier_explain: objectSchema({ snapshotFound: T_BOOLEAN, tierExplain: T_NULLABLE_OBJECT }),\n recall_xray: objectSchema({ snapshotFound: T_BOOLEAN, snapshot: T_OBJECT }),\n set_coding_context: objectSchema({ ok: T_BOOLEAN }),\n wearables_status: objectSchema({\n enabled: T_BOOLEAN,\n timezone: T_STRING,\n sources: T_ARRAY,\n connectorsInstalled: T_ARRAY,\n }),\n wearables_sync: T_ARRAY,\n transcript_day: T_ARRAY,\n transcript_search: T_ARRAY,\n transcript_memories: T_ARRAY,\n action_confidence: objectSchema({\n schemaVersion: T_NUMBER,\n decision: T_STRING,\n confidence: T_NUMBER,\n risk: T_STRING,\n contextReadiness: T_STRING,\n intendedAction: T_STRING,\n attentionPolicy: T_STRING,\n principle: T_STRING,\n reasons: T_ARRAY,\n blockers: T_ARRAY,\n factors: T_ARRAY,\n retrievedMemoryCount: T_NUMBER,\n scopeMismatchCount: T_NUMBER,\n safeToAct: T_BOOLEAN,\n }),\n day_summary: {\n type: [\"object\", \"null\"],\n properties: { summary: T_STRING, bullets: T_ARRAY, next_actions: T_ARRAY, risks_or_open_loops: T_ARRAY },\n additionalProperties: true,\n },\n capsule_export: objectSchema({\n archivePath: T_STRING,\n manifestPath: T_STRING,\n encryptedArchivePath: T_NULLABLE_STRING,\n manifest: T_OBJECT,\n }),\n capsule_import: objectSchema({ imported: T_ARRAY, skipped: T_ARRAY, manifest: T_OBJECT }),\n capsule_list: objectSchema({ namespace: T_STRING, capsulesDir: T_STRING, capsules: T_ARRAY }),\n memory_governance_run: objectSchema({\n namespace: T_STRING,\n runId: T_STRING,\n traceId: T_STRING,\n mode: T_STRING,\n reviewQueueCount: T_NUMBER,\n proposedActionCount: T_NUMBER,\n appliedActionCount: T_NUMBER,\n summaryPath: T_STRING,\n reportPath: T_STRING,\n }),\n procedure_mining_run: objectSchema({ namespace: T_STRING, clustersProcessed: T_NUMBER, proceduresWritten: T_NUMBER }),\n pattern_reinforcement_run: objectSchema({\n namespace: T_STRING,\n ran: T_BOOLEAN,\n clustersFound: T_NUMBER,\n canonicalsUpdated: T_NUMBER,\n duplicatesSuperseded: T_NUMBER,\n }),\n procedural_stats: objectSchema({ namespace: T_STRING, counts: T_OBJECT, recent: T_OBJECT }),\n memory_get: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, memory: T_NULLABLE_OBJECT }),\n memory_timeline: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, count: T_NUMBER, timeline: T_ARRAY }),\n memory_store: objectSchema({\n schemaVersion: T_NUMBER,\n operation: T_STRING,\n namespace: T_STRING,\n dryRun: T_BOOLEAN,\n accepted: T_BOOLEAN,\n queued: T_BOOLEAN,\n status: T_STRING,\n memoryId: T_STRING,\n }),\n suggestion_submit: objectSchema({\n schemaVersion: T_NUMBER,\n operation: T_STRING,\n namespace: T_STRING,\n dryRun: T_BOOLEAN,\n accepted: T_BOOLEAN,\n queued: T_BOOLEAN,\n status: T_STRING,\n memoryId: T_STRING,\n }),\n entity_get: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, entity: T_NULLABLE_OBJECT }),\n review_queue_list: objectSchema({ found: T_BOOLEAN, runId: T_STRING, reviewQueue: T_ARRAY }),\n observe: objectSchema({\n accepted: T_NUMBER,\n sessionKey: T_STRING,\n namespace: T_STRING,\n effectiveNamespace: T_STRING,\n lcmArchived: T_BOOLEAN,\n extractionQueued: T_BOOLEAN,\n }),\n lcm_search: objectSchema({\n query: T_STRING,\n namespace: T_STRING,\n results: T_ARRAY,\n count: T_NUMBER,\n lcmEnabled: T_BOOLEAN,\n }),\n lcm_compaction_flush: objectSchema({\n enabled: T_BOOLEAN,\n flushed: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n }),\n lcm_compaction_record: objectSchema({\n enabled: T_BOOLEAN,\n recorded: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n }),\n continuity_audit_generate: objectSchema({ enabled: T_BOOLEAN, period: T_STRING, reportPath: T_STRING }),\n continuity_incident_open: objectSchema({ created: T_BOOLEAN, incident: T_NULLABLE_OBJECT }),\n continuity_incident_close: objectSchema({ closed: T_BOOLEAN, incident: T_NULLABLE_OBJECT }),\n continuity_incident_list: objectSchema({ incidents: T_ARRAY }),\n continuity_loop_add_or_update: objectSchema({ saved: T_BOOLEAN, loop: T_NULLABLE_OBJECT }),\n continuity_loop_review: objectSchema({ reviewed: T_BOOLEAN, loop: T_NULLABLE_OBJECT }),\n identity_anchor_get: objectSchema({ found: T_BOOLEAN, anchor: T_NULLABLE_STRING }),\n identity_anchor_update: objectSchema({ updated: T_BOOLEAN, sections: T_ARRAY }),\n memory_identity: objectSchema({ found: T_BOOLEAN, identity: T_NULLABLE_STRING, message: T_STRING }),\n work_task: objectSchema({\n action: T_STRING,\n task: T_NULLABLE_OBJECT,\n tasks: T_ARRAY,\n count: T_NUMBER,\n deleted: T_BOOLEAN,\n }),\n work_project: objectSchema({\n action: T_STRING,\n project: T_NULLABLE_OBJECT,\n projects: T_ARRAY,\n count: T_NUMBER,\n deleted: T_BOOLEAN,\n }),\n work_board: objectSchema({ action: T_STRING, markdown: T_STRING, snapshot: T_OBJECT, result: T_OBJECT }),\n shared_context_write_output: objectSchema({ written: T_BOOLEAN, path: T_STRING }),\n shared_feedback_record: objectSchema({ recorded: T_BOOLEAN }),\n shared_priorities_append: objectSchema({ appended: T_BOOLEAN }),\n shared_context_cross_signals_run: objectSchema({\n crossSignalsMarkdownPath: T_STRING,\n crossSignalsPath: T_STRING,\n sourceCount: T_NUMBER,\n feedbackCount: T_NUMBER,\n overlapCount: T_NUMBER,\n }),\n shared_context_curate_daily: objectSchema({\n roundtablePath: T_STRING,\n crossSignalsMarkdownPath: T_STRING,\n crossSignalsPath: T_STRING,\n overlapCount: T_NUMBER,\n }),\n compounding_weekly_synthesize: objectSchema({\n weekId: T_STRING,\n reportPath: T_STRING,\n reportJsonPath: T_STRING,\n rubricsPath: T_STRING,\n rubricsIndexPath: T_STRING,\n mistakesCount: T_NUMBER,\n promotionCandidateCount: T_NUMBER,\n }),\n compounding_promote_candidate: objectSchema({\n enabled: T_BOOLEAN,\n dryRun: T_BOOLEAN,\n weekId: T_STRING,\n promoted: T_ARRAY,\n skipped: T_ARRAY,\n tombstoneBlocked: T_ARRAY,\n }),\n compression_guidelines_optimize: objectSchema({\n enabled: T_BOOLEAN,\n dryRun: T_BOOLEAN,\n eventCount: T_NUMBER,\n nextGuidelineVersion: T_NUMBER,\n changedRules: T_NUMBER,\n semanticRefinementApplied: T_BOOLEAN,\n persisted: T_BOOLEAN,\n }),\n compression_guidelines_activate: objectSchema({\n enabled: T_BOOLEAN,\n activated: T_BOOLEAN,\n guidelineVersion: { type: [\"number\", \"null\"] } as const,\n }),\n memory_search: objectSchema({ query: T_STRING, results: T_ARRAY, count: T_NUMBER }),\n memory_profile: objectSchema({ profile: T_STRING }),\n memory_entities_list: objectSchema({ entities: T_ARRAY, count: T_NUMBER }),\n memory_questions: objectSchema({ questions: T_ARRAY, count: T_NUMBER }),\n memory_last_recall: objectSchema({\n sessionKey: T_STRING,\n recordedAt: T_STRING,\n queryHash: T_STRING,\n queryLen: T_NUMBER,\n memoryIds: T_ARRAY,\n namespace: T_STRING,\n recallNamespaces: T_ARRAY,\n plannerMode: T_STRING,\n requestedMode: T_STRING,\n source: T_STRING,\n fallbackUsed: T_BOOLEAN,\n sourcesUsed: T_ARRAY,\n latencyMs: T_NUMBER,\n resultPaths: T_ARRAY,\n message: T_NULLABLE_STRING,\n }),\n memory_intent_debug: objectSchema({\n recordedAt: T_STRING,\n promptHash: T_STRING,\n promptLength: T_NUMBER,\n retrievalQueryHash: T_STRING,\n retrievalQueryLength: T_NUMBER,\n plannerEnabled: T_BOOLEAN,\n plannedMode: T_STRING,\n effectiveMode: T_STRING,\n recallResultLimit: T_NUMBER,\n queryIntent: T_OBJECT,\n graphExpandedIntentDetected: T_BOOLEAN,\n graphDecision: T_OBJECT,\n message: T_NULLABLE_STRING,\n }),\n memory_qmd_debug: objectSchema({\n recordedAt: T_STRING,\n queryHash: T_STRING,\n queryLength: T_NUMBER,\n collection: T_STRING,\n namespaces: T_ARRAY,\n fetchLimit: T_NUMBER,\n primaryResultCount: T_NUMBER,\n hybridResultCount: T_NUMBER,\n queryAwareSeedCount: T_NUMBER,\n resultCount: T_NUMBER,\n intentHint: T_STRING,\n explainEnabled: T_BOOLEAN,\n hybridTopUpUsed: T_BOOLEAN,\n hybridTopUpSkippedReason: T_STRING,\n results: T_ARRAY,\n message: T_NULLABLE_STRING,\n }),\n memory_graph_explain: objectSchema({ explanation: T_STRING }),\n graph_snapshot: objectSchema({ nodes: T_ARRAY, edges: T_ARRAY }),\n memory_feedback: objectSchema({ recorded: T_BOOLEAN, enabled: T_BOOLEAN }),\n memory_promote: objectSchema({ promoted: T_BOOLEAN, memoryId: T_STRING }),\n memory_outcome: objectSchema({\n ok: T_BOOLEAN,\n memoryId: T_STRING,\n mw_success: T_NUMBER,\n mw_fail: T_NUMBER,\n reason: T_STRING,\n message: T_STRING,\n }),\n memory_action_apply: objectSchema({ recorded: T_BOOLEAN, event: T_OBJECT }),\n context_checkpoint: objectSchema({ saved: T_BOOLEAN }),\n briefing: objectSchema({\n markdown: T_STRING,\n json: T_OBJECT,\n window: T_OBJECT,\n format: T_STRING,\n namespace: T_STRING,\n }),\n review_list: objectSchema({ pairs: T_ARRAY, total: T_NUMBER, durationMs: T_NUMBER }),\n review_resolve: objectSchema({ pairId: T_STRING, verb: T_STRING, affectedIds: T_ARRAY, message: T_STRING }),\n contradiction_scan_run: objectSchema({\n scanned: T_NUMBER,\n candidates: T_NUMBER,\n judged: T_NUMBER,\n queued: T_NUMBER,\n cooledDown: T_NUMBER,\n elapsedMs: T_NUMBER,\n }),\n memory_summarize_hourly: objectSchema({ ok: T_BOOLEAN, message: T_STRING }),\n conversation_index_update: objectSchema({\n enabled: T_BOOLEAN,\n sessions: T_NUMBER,\n chunks: T_NUMBER,\n skipped: T_NUMBER,\n embeddedRuns: T_NUMBER,\n }),\n profiling_report: objectSchema({\n enabled: T_BOOLEAN,\n format: T_STRING,\n traces: T_ARRAY,\n stats: T_OBJECT,\n bottleneck: T_NULLABLE_STRING,\n }),\n graph_edge_decay_run: objectSchema({ ranAt: T_STRING, disabled: T_BOOLEAN, reason: T_STRING, results: T_ARRAY }),\n live_connectors_run: objectSchema({\n ranAt: T_STRING,\n force: T_BOOLEAN,\n totalDocsImported: T_NUMBER,\n ranCount: T_NUMBER,\n skippedCount: T_NUMBER,\n errorCount: T_NUMBER,\n results: T_ARRAY,\n }),\n peer_list: objectSchema({ peers: T_ARRAY }),\n peer_get: objectSchema({ found: T_BOOLEAN, peer: T_NULLABLE_OBJECT }),\n peer_set: objectSchema({ ok: T_BOOLEAN, created: T_BOOLEAN, peer: T_OBJECT }),\n peer_delete: objectSchema({ ok: T_BOOLEAN, deleted: T_BOOLEAN }),\n peer_profile_get: objectSchema({\n found: T_BOOLEAN,\n profile: {\n type: \"object\",\n properties: {\n peerId: T_STRING,\n updatedAt: T_STRING,\n fields: { type: \"object\", additionalProperties: T_STRING },\n provenance: {\n type: \"object\",\n additionalProperties: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n observedAt: T_STRING,\n signal: T_STRING,\n sourceSessionId: T_STRING,\n note: T_STRING,\n },\n required: [\"observedAt\", \"signal\"],\n additionalProperties: true,\n },\n },\n },\n },\n required: [\"peerId\", \"updatedAt\", \"fields\", \"provenance\"],\n additionalProperties: true,\n },\n }),\n peer_forget: objectSchema({ ok: T_BOOLEAN, purged: T_BOOLEAN }),\n console_state: objectSchema({\n capturedAt: T_STRING,\n bufferState: T_OBJECT,\n extractionQueue: T_OBJECT,\n dedupRecent: T_ARRAY,\n maintenanceLedgerTail: T_ARRAY,\n qmdProbe: T_OBJECT,\n daemon: T_OBJECT,\n errors: T_ARRAY,\n }),\n dreams_status: objectSchema({ phases: T_OBJECT, windowStart: T_STRING, windowEnd: T_STRING }),\n dreams_run: objectSchema({ phase: T_STRING, durationMs: T_NUMBER, itemsProcessed: T_NUMBER }),\n coding_decision: objectSchema({\n subcommand: T_STRING,\n records: T_ARRAY,\n count: T_NUMBER,\n found: T_BOOLEAN,\n memoryId: T_STRING,\n status: T_STRING,\n supersededMemoryId: T_STRING,\n replacementMemoryId: T_STRING,\n }),\n coding_architecture: objectSchema({\n subcommand: T_STRING,\n found: T_BOOLEAN,\n refreshed: T_BOOLEAN,\n memoryId: T_STRING,\n }),\n coding_delta: objectSchema({\n subcommand: T_STRING,\n ok: T_BOOLEAN,\n kind: T_STRING,\n delta: T_OBJECT,\n nextState: T_OBJECT,\n }),\n memory_correct_plan: objectSchema({\n planId: T_STRING,\n namespace: T_STRING,\n diff: T_STRING,\n actions: T_ARRAY,\n confidence: T_NUMBER,\n }),\n memory_correct_apply: objectSchema({\n planId: T_STRING,\n status: T_STRING,\n results: T_ARRAY,\n auditMemoryId: T_STRING,\n appliedAt: T_STRING,\n }),\n memory_chat: objectSchema({\n reply: T_STRING,\n chatSessionId: T_STRING,\n pendingPlan: {\n type: \"object\",\n properties: { planId: T_STRING, preview: T_STRING },\n required: [\"planId\", \"preview\"],\n additionalProperties: true,\n },\n skippedTools: { type: \"array\", items: T_STRING },\n }),\n codegraph_index: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_list_projects: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_delete_project: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_index_status: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_search_graph: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_trace_path: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_detect_changes: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_query_graph: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_schema: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_snippet: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_architecture: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_search_code: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_manage_adr: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_ingest_traces: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n};\n\n/**\n * Apply outputSchema from the registry to every tool that lacks one.\n * Suffix resolution strips the canonical or legacy prefix so both\n * `remnic.*` and `engram.*` aliases inherit the same schema.\n * Tools that already have an explicit outputSchema are skipped.\n */\nexport function applyToolOutputSchemas<T extends { name: string; outputSchema?: unknown }>(\n tools: ReadonlyArray<T>,\n canonicalPrefix: string,\n legacyPrefix: string\n): T[] {\n return tools.map((tool) => {\n if (tool.outputSchema) return tool;\n const name = tool.name as string;\n const suffix = name.startsWith(canonicalPrefix)\n ? name.slice(canonicalPrefix.length)\n : name.startsWith(legacyPrefix)\n ? name.slice(legacyPrefix.length)\n : name;\n return { ...tool, outputSchema: TOOL_OUTPUT_SCHEMAS[suffix] ?? { type: \"object\", additionalProperties: true } };\n });\n}\n"],"mappings":"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","names":[]}