@0xmaxma/claude-gateway 1.7.9 → 1.8.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 (258) hide show
  1. package/README.md +178 -44
  2. package/dist/agent/builtin-commands.js +2 -2
  3. package/dist/agent/builtin-commands.js.map +1 -1
  4. package/dist/agent/dreaming/accept.d.ts.map +1 -1
  5. package/dist/agent/dreaming/accept.js +4 -1
  6. package/dist/agent/dreaming/accept.js.map +1 -1
  7. package/dist/agent/dreaming/config.d.ts.map +1 -1
  8. package/dist/agent/dreaming/config.js +2 -0
  9. package/dist/agent/dreaming/config.js.map +1 -1
  10. package/dist/agent/dreaming/reviewer.d.ts.map +1 -1
  11. package/dist/agent/dreaming/reviewer.js +9 -2
  12. package/dist/agent/dreaming/reviewer.js.map +1 -1
  13. package/dist/agent/dreaming/staleness.d.ts +7 -1
  14. package/dist/agent/dreaming/staleness.d.ts.map +1 -1
  15. package/dist/agent/dreaming/staleness.js +17 -2
  16. package/dist/agent/dreaming/staleness.js.map +1 -1
  17. package/dist/agent/dreaming/types.d.ts +17 -1
  18. package/dist/agent/dreaming/types.d.ts.map +1 -1
  19. package/dist/agent/knowledge/archive-db.d.ts +43 -0
  20. package/dist/agent/knowledge/archive-db.d.ts.map +1 -1
  21. package/dist/agent/knowledge/archive-db.js +130 -0
  22. package/dist/agent/knowledge/archive-db.js.map +1 -1
  23. package/dist/agent/knowledge/config.d.ts +3 -1
  24. package/dist/agent/knowledge/config.d.ts.map +1 -1
  25. package/dist/agent/knowledge/config.js +32 -10
  26. package/dist/agent/knowledge/config.js.map +1 -1
  27. package/dist/agent/knowledge/index.d.ts +11 -4
  28. package/dist/agent/knowledge/index.d.ts.map +1 -1
  29. package/dist/agent/knowledge/index.js +22 -1
  30. package/dist/agent/knowledge/index.js.map +1 -1
  31. package/dist/agent/knowledge/indexer.d.ts +0 -7
  32. package/dist/agent/knowledge/indexer.d.ts.map +1 -1
  33. package/dist/agent/knowledge/indexer.js +34 -7
  34. package/dist/agent/knowledge/indexer.js.map +1 -1
  35. package/dist/agent/knowledge/lifecycle.d.ts +20 -4
  36. package/dist/agent/knowledge/lifecycle.d.ts.map +1 -1
  37. package/dist/agent/knowledge/lifecycle.js +33 -4
  38. package/dist/agent/knowledge/lifecycle.js.map +1 -1
  39. package/dist/agent/knowledge/reflection.d.ts +114 -0
  40. package/dist/agent/knowledge/reflection.d.ts.map +1 -0
  41. package/dist/agent/knowledge/reflection.js +447 -0
  42. package/dist/agent/knowledge/reflection.js.map +1 -0
  43. package/dist/agent/knowledge/shared-dedup.d.ts +85 -0
  44. package/dist/agent/knowledge/shared-dedup.d.ts.map +1 -0
  45. package/dist/agent/knowledge/shared-dedup.js +187 -0
  46. package/dist/agent/knowledge/shared-dedup.js.map +1 -0
  47. package/dist/agent/knowledge/shared-promote.d.ts +82 -7
  48. package/dist/agent/knowledge/shared-promote.d.ts.map +1 -1
  49. package/dist/agent/knowledge/shared-promote.js +244 -11
  50. package/dist/agent/knowledge/shared-promote.js.map +1 -1
  51. package/dist/agent/knowledge/shared-staleness.d.ts +51 -0
  52. package/dist/agent/knowledge/shared-staleness.d.ts.map +1 -0
  53. package/dist/agent/knowledge/shared-staleness.js +149 -0
  54. package/dist/agent/knowledge/shared-staleness.js.map +1 -0
  55. package/dist/agent/knowledge/shared-writer.d.ts +19 -0
  56. package/dist/agent/knowledge/shared-writer.d.ts.map +1 -1
  57. package/dist/agent/knowledge/shared-writer.js +42 -0
  58. package/dist/agent/knowledge/shared-writer.js.map +1 -1
  59. package/dist/agent/knowledge/types.d.ts +24 -0
  60. package/dist/agent/knowledge/types.d.ts.map +1 -1
  61. package/dist/agent/model-catalog.d.ts +62 -0
  62. package/dist/agent/model-catalog.d.ts.map +1 -0
  63. package/dist/agent/model-catalog.js +264 -0
  64. package/dist/agent/model-catalog.js.map +1 -0
  65. package/dist/agent/runner.d.ts +83 -0
  66. package/dist/agent/runner.d.ts.map +1 -1
  67. package/dist/agent/runner.js +281 -51
  68. package/dist/agent/runner.js.map +1 -1
  69. package/dist/agent/workspace-loader.d.ts +17 -2
  70. package/dist/agent/workspace-loader.d.ts.map +1 -1
  71. package/dist/agent/workspace-loader.js +17 -1
  72. package/dist/agent/workspace-loader.js.map +1 -1
  73. package/dist/api/cron-router.d.ts +12 -8
  74. package/dist/api/cron-router.d.ts.map +1 -1
  75. package/dist/api/cron-router.js +82 -16
  76. package/dist/api/cron-router.js.map +1 -1
  77. package/dist/api/gateway-router.d.ts +4 -0
  78. package/dist/api/gateway-router.d.ts.map +1 -1
  79. package/dist/api/gateway-router.js +16 -1
  80. package/dist/api/gateway-router.js.map +1 -1
  81. package/dist/api/manifest-sources.d.ts +15 -0
  82. package/dist/api/manifest-sources.d.ts.map +1 -0
  83. package/dist/api/manifest-sources.js +27 -0
  84. package/dist/api/manifest-sources.js.map +1 -0
  85. package/dist/api/meta-router.d.ts +13 -0
  86. package/dist/api/meta-router.d.ts.map +1 -0
  87. package/dist/api/meta-router.js +26 -0
  88. package/dist/api/meta-router.js.map +1 -0
  89. package/dist/api/packages.d.ts.map +1 -1
  90. package/dist/api/packages.js +18 -198
  91. package/dist/api/packages.js.map +1 -1
  92. package/dist/api/route-registry.d.ts +81 -0
  93. package/dist/api/route-registry.d.ts.map +1 -0
  94. package/dist/api/route-registry.js +44 -0
  95. package/dist/api/route-registry.js.map +1 -0
  96. package/dist/api/router.d.ts.map +1 -1
  97. package/dist/api/router.js +21 -3
  98. package/dist/api/router.js.map +1 -1
  99. package/dist/apps/compose-generator.js +7 -4
  100. package/dist/apps/compose-generator.js.map +1 -1
  101. package/dist/apps/installer.d.ts +154 -0
  102. package/dist/apps/installer.d.ts.map +1 -1
  103. package/dist/apps/installer.js +657 -54
  104. package/dist/apps/installer.js.map +1 -1
  105. package/dist/cli/args.d.ts +25 -0
  106. package/dist/cli/args.d.ts.map +1 -0
  107. package/dist/cli/args.js +55 -0
  108. package/dist/cli/args.js.map +1 -0
  109. package/dist/cli/colors.d.ts +37 -0
  110. package/dist/cli/colors.d.ts.map +1 -0
  111. package/dist/cli/colors.js +63 -0
  112. package/dist/cli/colors.js.map +1 -0
  113. package/dist/cli/command-names.d.ts +98 -0
  114. package/dist/cli/command-names.d.ts.map +1 -0
  115. package/dist/cli/command-names.js +109 -0
  116. package/dist/cli/command-names.js.map +1 -0
  117. package/dist/cli/commands/agents.d.ts +28 -0
  118. package/dist/cli/commands/agents.d.ts.map +1 -0
  119. package/dist/cli/commands/agents.js +321 -0
  120. package/dist/cli/commands/agents.js.map +1 -0
  121. package/dist/cli/commands/channels.d.ts +17 -0
  122. package/dist/cli/commands/channels.d.ts.map +1 -0
  123. package/dist/cli/commands/channels.js +101 -0
  124. package/dist/cli/commands/channels.js.map +1 -0
  125. package/dist/cli/commands/debug-bundle.d.ts +6 -0
  126. package/dist/cli/commands/debug-bundle.d.ts.map +1 -0
  127. package/dist/cli/commands/debug-bundle.js +220 -0
  128. package/dist/cli/commands/debug-bundle.js.map +1 -0
  129. package/dist/cli/commands/doctor.d.ts +3 -0
  130. package/dist/cli/commands/doctor.d.ts.map +1 -0
  131. package/dist/cli/commands/doctor.js +104 -0
  132. package/dist/cli/commands/doctor.js.map +1 -0
  133. package/dist/cli/commands/gateway.d.ts +12 -0
  134. package/dist/cli/commands/gateway.d.ts.map +1 -0
  135. package/dist/cli/commands/gateway.js +145 -0
  136. package/dist/cli/commands/gateway.js.map +1 -0
  137. package/dist/cli/commands/service.d.ts +33 -0
  138. package/dist/cli/commands/service.d.ts.map +1 -0
  139. package/dist/cli/commands/service.js +513 -0
  140. package/dist/cli/commands/service.js.map +1 -0
  141. package/dist/cli/commands/update.d.ts +16 -0
  142. package/dist/cli/commands/update.d.ts.map +1 -0
  143. package/dist/cli/commands/update.js +149 -0
  144. package/dist/cli/commands/update.js.map +1 -0
  145. package/dist/cli/commands.generated.d.ts +4 -0
  146. package/dist/cli/commands.generated.d.ts.map +1 -0
  147. package/dist/cli/commands.generated.js +220 -0
  148. package/dist/cli/commands.generated.js.map +1 -0
  149. package/dist/cli/health.d.ts +31 -0
  150. package/dist/cli/health.d.ts.map +1 -0
  151. package/dist/cli/health.js +49 -0
  152. package/dist/cli/health.js.map +1 -0
  153. package/dist/cli/http-client.d.ts +140 -0
  154. package/dist/cli/http-client.d.ts.map +1 -0
  155. package/dist/cli/http-client.js +332 -0
  156. package/dist/cli/http-client.js.map +1 -0
  157. package/dist/cli/index.d.ts +27 -0
  158. package/dist/cli/index.d.ts.map +1 -0
  159. package/dist/cli/index.js +372 -0
  160. package/dist/cli/index.js.map +1 -0
  161. package/dist/cli/manager.d.ts +64 -0
  162. package/dist/cli/manager.d.ts.map +1 -0
  163. package/dist/cli/manager.js +181 -0
  164. package/dist/cli/manager.js.map +1 -0
  165. package/dist/cli/output.d.ts +49 -0
  166. package/dist/cli/output.d.ts.map +1 -0
  167. package/dist/cli/output.js +101 -0
  168. package/dist/cli/output.js.map +1 -0
  169. package/dist/cli/prompt.d.ts +29 -0
  170. package/dist/cli/prompt.d.ts.map +1 -0
  171. package/dist/cli/prompt.js +154 -0
  172. package/dist/cli/prompt.js.map +1 -0
  173. package/dist/cli/redact.d.ts +3 -0
  174. package/dist/cli/redact.d.ts.map +1 -0
  175. package/dist/cli/redact.js +33 -0
  176. package/dist/cli/redact.js.map +1 -0
  177. package/dist/cli/types.d.ts +22 -0
  178. package/dist/cli/types.d.ts.map +1 -0
  179. package/dist/cli/types.js +4 -0
  180. package/dist/cli/types.js.map +1 -0
  181. package/dist/config/bootstrap.d.ts +33 -0
  182. package/dist/config/bootstrap.d.ts.map +1 -0
  183. package/dist/config/bootstrap.js +117 -0
  184. package/dist/config/bootstrap.js.map +1 -0
  185. package/dist/config/loader.d.ts.map +1 -1
  186. package/dist/config/loader.js +5 -1
  187. package/dist/config/loader.js.map +1 -1
  188. package/dist/config/watcher.d.ts.map +1 -1
  189. package/dist/config/watcher.js +2 -35
  190. package/dist/config/watcher.js.map +1 -1
  191. package/dist/discord/receiver.d.ts +6 -1
  192. package/dist/discord/receiver.d.ts.map +1 -1
  193. package/dist/discord/receiver.js +9 -1
  194. package/dist/discord/receiver.js.map +1 -1
  195. package/dist/entry.d.ts +3 -0
  196. package/dist/entry.d.ts.map +1 -0
  197. package/dist/entry.js +83 -0
  198. package/dist/entry.js.map +1 -0
  199. package/dist/index.js +197 -47
  200. package/dist/index.js.map +1 -1
  201. package/dist/load-dotenv.d.ts +2 -0
  202. package/dist/load-dotenv.d.ts.map +1 -0
  203. package/dist/load-dotenv.js +68 -0
  204. package/dist/load-dotenv.js.map +1 -0
  205. package/dist/packages/registry.d.ts +50 -0
  206. package/dist/packages/registry.d.ts.map +1 -0
  207. package/dist/packages/registry.js +209 -0
  208. package/dist/packages/registry.js.map +1 -0
  209. package/dist/session/process.d.ts +20 -3
  210. package/dist/session/process.d.ts.map +1 -1
  211. package/dist/session/process.js +120 -5
  212. package/dist/session/process.js.map +1 -1
  213. package/dist/shell/claude-pty-shell.js +146 -27
  214. package/dist/shell/claude-pty-shell.js.map +1 -1
  215. package/dist/shell/draft-phantom.d.ts +49 -0
  216. package/dist/shell/draft-phantom.d.ts.map +1 -0
  217. package/dist/shell/draft-phantom.js +59 -0
  218. package/dist/shell/draft-phantom.js.map +1 -0
  219. package/dist/shell/submit-diag.d.ts +67 -0
  220. package/dist/shell/submit-diag.d.ts.map +1 -0
  221. package/dist/shell/submit-diag.js +69 -0
  222. package/dist/shell/submit-diag.js.map +1 -0
  223. package/dist/shutdown-signals.d.ts +47 -0
  224. package/dist/shutdown-signals.d.ts.map +1 -0
  225. package/dist/shutdown-signals.js +62 -0
  226. package/dist/shutdown-signals.js.map +1 -0
  227. package/dist/telegram/receiver.d.ts +6 -1
  228. package/dist/telegram/receiver.d.ts.map +1 -1
  229. package/dist/telegram/receiver.js +9 -1
  230. package/dist/telegram/receiver.js.map +1 -1
  231. package/dist/types.d.ts +25 -0
  232. package/dist/types.d.ts.map +1 -1
  233. package/dist/utils/orphan-receivers.d.ts +90 -0
  234. package/dist/utils/orphan-receivers.d.ts.map +1 -0
  235. package/dist/utils/orphan-receivers.js +218 -0
  236. package/dist/utils/orphan-receivers.js.map +1 -0
  237. package/dist/utils/paths.d.ts +16 -0
  238. package/dist/utils/paths.d.ts.map +1 -0
  239. package/dist/utils/paths.js +60 -0
  240. package/dist/utils/paths.js.map +1 -0
  241. package/dist/utils/stop-child.d.ts +21 -0
  242. package/dist/utils/stop-child.d.ts.map +1 -0
  243. package/dist/utils/stop-child.js +64 -0
  244. package/dist/utils/stop-child.js.map +1 -0
  245. package/lib/pairing.ts +1 -1
  246. package/mcp/tools/agent/handlers.ts +1 -1
  247. package/mcp/tools/discord/module.ts +23 -15
  248. package/mcp/tools/discord/receiver-server.ts +4 -0
  249. package/mcp/tools/memory/archive-reader.test.ts +25 -1
  250. package/mcp/tools/memory/archive-reader.ts +70 -12
  251. package/mcp/tools/memory/archive-writer.test.ts +168 -0
  252. package/mcp/tools/memory/archive-writer.ts +137 -0
  253. package/mcp/tools/memory/module.test.ts +187 -0
  254. package/mcp/tools/memory/module.ts +192 -6
  255. package/mcp/tools/telegram/module.ts +10 -2
  256. package/mcp/tools/telegram/receiver-server.ts +15 -6
  257. package/mcp/tools/telegram/typing.ts +178 -34
  258. package/package.json +6 -4
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Shared-KB staleness GC (issue #392 part D) — the shared-vault twin of
3
+ * `dreaming/staleness.ts`'s nightly per-agent GC, extending the SAME
4
+ * `kb_entry_lifecycle` soft-invalidate model to the shared KB, which had none
5
+ * at all (the shared vault's `kb_entry_lifecycle` table existed but was never
6
+ * populated — `indexer.ts` only computed entry blocks for `source: 'memory'`).
7
+ *
8
+ * The unit of identity here is the WHOLE NOTE (`wholeNoteEntryBlock`), not a
9
+ * bullet, so "moving a block" means moving the whole note. A stale note's
10
+ * content is written byte-identical (so its entry_hash — and thus the
11
+ * promote-back feedback loop — survives the move) to a `stale__<name>`
12
+ * sibling note, then the original file is deleted; a note retrieved AFTER
13
+ * being staled is moved back to its original name. This mirrors the personal
14
+ * archive's "decluttering by physical relocation" without merging multiple
15
+ * notes' content together (which would break entry-hash stability).
16
+ *
17
+ * Explicit `supersedes #N`-by-reference detection stays personal-only (issue
18
+ * #392 scope note): shared notes have no visible numeric id, and round 1's
19
+ * write-time merge/near-dup already provides de-facto content supersession.
20
+ * Only TTL/retrieval-based soft-invalidation applies here.
21
+ */
22
+ import { ArchiveDB } from './archive-db';
23
+ import type { ResolvedKnowledgeSharedCfg } from './types';
24
+ import type { ResolvedStalenessCfg } from '../dreaming/types';
25
+ /** Prefix a staled note's file is moved under (issue #392 part D). */
26
+ export declare const STALE_NOTE_PREFIX = "stale__";
27
+ export interface SharedStalenessResult {
28
+ invalidated: number;
29
+ promoted: number;
30
+ skippedMoves: number;
31
+ foldedLogRows: number;
32
+ }
33
+ /**
34
+ * Retire a live note: write its content byte-identical (after `comment`, which
35
+ * `wholeNoteEntryBlock` skips when hashing) to `stale__<name>`, then delete the
36
+ * original. Exported so both the TTL-based GC below and the reflection pass
37
+ * (issue #392 part C, merging a note into a cluster's canonical note) share one
38
+ * "move a note out of the active set" primitive. Returns false if the note is
39
+ * missing/empty.
40
+ */
41
+ export declare function retireSharedNote(cfg: ResolvedKnowledgeSharedCfg, name: string, comment: string): boolean;
42
+ /**
43
+ * Run the shared-KB staleness GC. Never throws; on any error the vault is left
44
+ * as-is. Deterministic given `opts.now`. Mirrors `runStalenessGc`'s shape.
45
+ */
46
+ export declare function runSharedStalenessGc(cfg: ResolvedKnowledgeSharedCfg, staleCfg: ResolvedStalenessCfg, opts?: {
47
+ now?: number;
48
+ reindex?: (cfg: ResolvedKnowledgeSharedCfg) => void;
49
+ openDb?: (cfg: ResolvedKnowledgeSharedCfg) => ArchiveDB;
50
+ }): SharedStalenessResult;
51
+ //# sourceMappingURL=shared-staleness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-staleness.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-staleness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAqB,MAAM,cAAc,CAAC;AAM5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAaxG;AAmCD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,0BAA0B,EAC/B,QAAQ,EAAE,oBAAoB,EAC9B,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,0BAA0B,KAAK,SAAS,CAAC;CACzD,GACA,qBAAqB,CA2CvB"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * Shared-KB staleness GC (issue #392 part D) — the shared-vault twin of
4
+ * `dreaming/staleness.ts`'s nightly per-agent GC, extending the SAME
5
+ * `kb_entry_lifecycle` soft-invalidate model to the shared KB, which had none
6
+ * at all (the shared vault's `kb_entry_lifecycle` table existed but was never
7
+ * populated — `indexer.ts` only computed entry blocks for `source: 'memory'`).
8
+ *
9
+ * The unit of identity here is the WHOLE NOTE (`wholeNoteEntryBlock`), not a
10
+ * bullet, so "moving a block" means moving the whole note. A stale note's
11
+ * content is written byte-identical (so its entry_hash — and thus the
12
+ * promote-back feedback loop — survives the move) to a `stale__<name>`
13
+ * sibling note, then the original file is deleted; a note retrieved AFTER
14
+ * being staled is moved back to its original name. This mirrors the personal
15
+ * archive's "decluttering by physical relocation" without merging multiple
16
+ * notes' content together (which would break entry-hash stability).
17
+ *
18
+ * Explicit `supersedes #N`-by-reference detection stays personal-only (issue
19
+ * #392 scope note): shared notes have no visible numeric id, and round 1's
20
+ * write-time merge/near-dup already provides de-facto content supersession.
21
+ * Only TTL/retrieval-based soft-invalidation applies here.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.STALE_NOTE_PREFIX = void 0;
25
+ exports.retireSharedNote = retireSharedNote;
26
+ exports.runSharedStalenessGc = runSharedStalenessGc;
27
+ const archive_db_1 = require("./archive-db");
28
+ const staleness_1 = require("../dreaming/staleness");
29
+ const indexer_1 = require("./indexer");
30
+ const lifecycle_1 = require("./lifecycle");
31
+ const shared_writer_1 = require("./shared-writer");
32
+ const config_1 = require("./config");
33
+ /** Prefix a staled note's file is moved under (issue #392 part D). */
34
+ exports.STALE_NOTE_PREFIX = 'stale__';
35
+ const ZERO = { invalidated: 0, promoted: 0, skippedMoves: 0, foldedLogRows: 0 };
36
+ /** The note "name" (pre-slug) a lifecycle row's stored path corresponds to. */
37
+ function nameFromPath(relPath) {
38
+ return relPath.replace(/\.md$/i, '');
39
+ }
40
+ /**
41
+ * Retire a live note: write its content byte-identical (after `comment`, which
42
+ * `wholeNoteEntryBlock` skips when hashing) to `stale__<name>`, then delete the
43
+ * original. Exported so both the TTL-based GC below and the reflection pass
44
+ * (issue #392 part C, merging a note into a cluster's canonical note) share one
45
+ * "move a note out of the active set" primitive. Returns false if the note is
46
+ * missing/empty.
47
+ */
48
+ function retireSharedNote(cfg, name, comment) {
49
+ const content = (0, shared_writer_1.readSharedNote)(cfg, name);
50
+ if (!content || !content.trim())
51
+ return false;
52
+ const block = (0, lifecycle_1.wholeNoteEntryBlock)(content)[0];
53
+ if (!block)
54
+ return false;
55
+ const staleName = `${exports.STALE_NOTE_PREFIX}${name}`;
56
+ (0, shared_writer_1.writeSharedNote)(cfg, staleName, `${comment}\n${block.text}`);
57
+ if ((0, shared_writer_1.deleteSharedNoteFile)(cfg, name))
58
+ return true;
59
+ // A failed delete must not leave a new stale duplicate behind or let callers
60
+ // stamp this active note invalid. Best-effort rollback preserves the invariant
61
+ // that a successful retirement has exactly one physical representation.
62
+ (0, shared_writer_1.deleteSharedNoteFile)(cfg, staleName);
63
+ return false;
64
+ }
65
+ /**
66
+ * Move a live note to `stale__<name>`, preserving its content byte-identical
67
+ * (after a leading `<!-- staled ... -->` marker line, which `wholeNoteEntryBlock`
68
+ * skips when hashing) so the entry_hash — and therefore the promote-back
69
+ * feedback loop — survives the move. Returns false (skip, don't stamp invalid)
70
+ * if the note is missing/empty or the content no longer matches the block that
71
+ * was scored (moved/edited concurrently).
72
+ */
73
+ function moveNoteToStale(cfg, r, comment) {
74
+ const name = nameFromPath(r.path);
75
+ const content = (0, shared_writer_1.readSharedNote)(cfg, name);
76
+ if (!content)
77
+ return false;
78
+ const block = (0, lifecycle_1.wholeNoteEntryBlock)(content)[0];
79
+ if (!block || block.entryHash !== r.entryHash)
80
+ return false; // content changed since scoring
81
+ return retireSharedNote(cfg, name, comment);
82
+ }
83
+ /** Move a staled note back to its original name (issue #392 promote-back). */
84
+ function moveNoteFromStale(cfg, r, comment) {
85
+ const staleName = nameFromPath(r.path); // r.path is the stale__<name> source path
86
+ const content = (0, shared_writer_1.readSharedNote)(cfg, staleName);
87
+ if (!content)
88
+ return false;
89
+ const block = (0, lifecycle_1.wholeNoteEntryBlock)(content)[0];
90
+ if (!block || block.entryHash !== r.entryHash)
91
+ return false;
92
+ const originalName = staleName.startsWith(exports.STALE_NOTE_PREFIX) ? staleName.slice(exports.STALE_NOTE_PREFIX.length) : staleName;
93
+ // Don't clobber a brand-new note that was created at the original name while
94
+ // this one sat staled — leave it staled rather than lose the newer note.
95
+ if ((0, shared_writer_1.sharedNoteExists)(cfg, originalName))
96
+ return false;
97
+ (0, shared_writer_1.writeSharedNote)(cfg, originalName, `${comment}\n${block.text}`);
98
+ (0, shared_writer_1.deleteSharedNoteFile)(cfg, staleName);
99
+ return true;
100
+ }
101
+ /**
102
+ * Run the shared-KB staleness GC. Never throws; on any error the vault is left
103
+ * as-is. Deterministic given `opts.now`. Mirrors `runStalenessGc`'s shape.
104
+ */
105
+ function runSharedStalenessGc(cfg, staleCfg, opts) {
106
+ if (!staleCfg.enabled)
107
+ return { ...ZERO };
108
+ const now = opts?.now ?? Date.now();
109
+ const reindex = opts?.reindex ?? ((c) => void (0, indexer_1.indexSharedArchive)(c));
110
+ const openDb = opts?.openDb ?? ((c) => archive_db_1.ArchiveDB.forPath((0, config_1.sharedDbPath)(c)));
111
+ const result = { ...ZERO };
112
+ try {
113
+ // Ensure lifecycle rows exist for the current notes (first_seen etc).
114
+ reindex(cfg);
115
+ const db = openDb(cfg);
116
+ if (staleCfg.recordRetrievals)
117
+ result.foldedLogRows = db.aggregateRetrievalLog();
118
+ // Every shared note is lifecycle-eligible (no evergreen/pinned distinction).
119
+ const { invalidate, promote } = (0, staleness_1.decideStaleness)(db.listLifecycle(), staleCfg, now, () => true);
120
+ const date = new Date(now).toISOString().slice(0, 10);
121
+ for (const r of invalidate) {
122
+ const comment = `<!-- staled ${date} (aged out, ${r.retrievalCount} retrievals) -->`;
123
+ if (moveNoteToStale(cfg, r, comment)) {
124
+ db.stampInvalid(r.entryHash, now);
125
+ result.invalidated++;
126
+ }
127
+ else {
128
+ result.skippedMoves++;
129
+ }
130
+ }
131
+ for (const r of promote) {
132
+ const comment = `<!-- restored ${date} (retrieved after invalidation) -->`;
133
+ if (moveNoteFromStale(cfg, r, comment)) {
134
+ db.stampInvalid(r.entryHash, null);
135
+ result.promoted++;
136
+ }
137
+ else {
138
+ result.skippedMoves++;
139
+ }
140
+ }
141
+ if (result.invalidated + result.promoted > 0)
142
+ reindex(cfg);
143
+ }
144
+ catch {
145
+ /* best-effort — leave the vault untouched on any error */
146
+ }
147
+ return result;
148
+ }
149
+ //# sourceMappingURL=shared-staleness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-staleness.js","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-staleness.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,25 @@
14
14
  * escape the notes dir.
15
15
  */
16
16
  import type { ResolvedKnowledgeSharedCfg } from './types';
17
+ /**
18
+ * Same cap the Bun-side MCP tools enforce on `memory_shared_create`/`_update`
19
+ * (`MAX_SHARED_NOTE_SIZE` in `mcp/tools/memory/module.ts`) — kept as an
20
+ * independent constant here since the two processes don't share imports
21
+ * (see the cross-runtime note in `shared-dedup.ts`). Keep both values in sync.
22
+ */
23
+ export declare const MAX_SHARED_NOTE_SIZE: number;
24
+ /** Whether a note already exists at this name (post-`sharedNoteFilename` slugification). */
25
+ export declare function sharedNoteExists(cfg: ResolvedKnowledgeSharedCfg, name: string): boolean;
26
+ /** Full content of a shared note, or null if it does not exist / is unreadable. */
27
+ export declare function readSharedNote(cfg: ResolvedKnowledgeSharedCfg, name: string): string | null;
28
+ /**
29
+ * Delete a shared note's file (issue #392 part D — the staleness GC moves a
30
+ * note's content elsewhere, then removes the original). Returns true if a file
31
+ * was actually removed, false if it didn't exist. Best-effort: any other error
32
+ * (permissions, race) is swallowed and reported as false, mirroring the rest of
33
+ * this module's "never throws into the caller's control flow" stance.
34
+ */
35
+ export declare function deleteSharedNoteFile(cfg: ResolvedKnowledgeSharedCfg, name: string): boolean;
17
36
  /** Reduce an arbitrary name to one safe `*.md` path segment (no traversal). */
18
37
  export declare function sharedNoteFilename(name: string): string;
19
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"shared-writer.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAM1D,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAqBtG"}
1
+ {"version":3,"file":"shared-writer.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAa,CAAC;AAE/C,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvF;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO3F;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ3F;AAMD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAqBtG"}
@@ -48,11 +48,53 @@ var __importStar = (this && this.__importStar) || (function () {
48
48
  };
49
49
  })();
50
50
  Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.MAX_SHARED_NOTE_SIZE = void 0;
52
+ exports.sharedNoteExists = sharedNoteExists;
53
+ exports.readSharedNote = readSharedNote;
54
+ exports.deleteSharedNoteFile = deleteSharedNoteFile;
51
55
  exports.sharedNoteFilename = sharedNoteFilename;
52
56
  exports.writeSharedNote = writeSharedNote;
53
57
  const fs = __importStar(require("fs"));
54
58
  const path = __importStar(require("path"));
55
59
  const config_1 = require("./config");
60
+ /**
61
+ * Same cap the Bun-side MCP tools enforce on `memory_shared_create`/`_update`
62
+ * (`MAX_SHARED_NOTE_SIZE` in `mcp/tools/memory/module.ts`) — kept as an
63
+ * independent constant here since the two processes don't share imports
64
+ * (see the cross-runtime note in `shared-dedup.ts`). Keep both values in sync.
65
+ */
66
+ exports.MAX_SHARED_NOTE_SIZE = 100 * 1024;
67
+ /** Whether a note already exists at this name (post-`sharedNoteFilename` slugification). */
68
+ function sharedNoteExists(cfg, name) {
69
+ return fs.existsSync(path.join((0, config_1.sharedNotesDir)(cfg), sharedNoteFilename(name)));
70
+ }
71
+ /** Full content of a shared note, or null if it does not exist / is unreadable. */
72
+ function readSharedNote(cfg, name) {
73
+ const target = path.join((0, config_1.sharedNotesDir)(cfg), sharedNoteFilename(name));
74
+ try {
75
+ return fs.readFileSync(target, 'utf8');
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ /**
82
+ * Delete a shared note's file (issue #392 part D — the staleness GC moves a
83
+ * note's content elsewhere, then removes the original). Returns true if a file
84
+ * was actually removed, false if it didn't exist. Best-effort: any other error
85
+ * (permissions, race) is swallowed and reported as false, mirroring the rest of
86
+ * this module's "never throws into the caller's control flow" stance.
87
+ */
88
+ function deleteSharedNoteFile(cfg, name) {
89
+ const target = path.join((0, config_1.sharedNotesDir)(cfg), sharedNoteFilename(name));
90
+ try {
91
+ fs.unlinkSync(target);
92
+ return true;
93
+ }
94
+ catch {
95
+ return false;
96
+ }
97
+ }
56
98
  // Monotonic per-process counter so concurrent writes within one process still get
57
99
  // distinct temp names (combined with pid for cross-process uniqueness).
58
100
  let tmpCounter = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"shared-writer.js","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-writer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,gDAQC;AAMD,0CAqBC;AA7CD,uCAAyB;AACzB,2CAA6B;AAC7B,qCAA0C;AAG1C,kFAAkF;AAClF,wEAAwE;AACxE,IAAI,UAAU,GAAG,CAAC,CAAC;AAEnB,+EAA+E;AAC/E,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,MAAM,IAAI,GAAG,IAAI;SACd,WAAW,EAAE;SACb,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjB,OAAO,GAAG,IAAI,IAAI,MAAM,KAAK,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,GAA+B,EAAE,IAAY,EAAE,OAAe;IAC5F,MAAM,GAAG,GAAG,IAAA,uBAAc,EAAC,GAAG,CAAC,CAAC;IAChC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,6EAA6E;IAC7E,gFAAgF;IAChF,iFAAiF;IACjF,8EAA8E;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACpH,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,iBAAiB;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"shared-writer.js","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-writer.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  * K2 core-shrink, K4 applier) read from it. Nothing here touches the injected
8
8
  * prompt or spawns tools.
9
9
  */
10
+ import type { StalenessConfig, ResolvedStalenessCfg } from '../dreaming/types';
10
11
  /** Trust class of an indexed chunk. Fail-closed: unclassified ⇒ `untrusted`. */
11
12
  export type OriginClass = 'owner' | 'agent' | 'untrusted' | 'system';
12
13
  /** Session context a chunk was observed in (reserved for later promotion gating). */
@@ -32,6 +33,8 @@ export interface KnowledgeSharedConfig {
32
33
  root?: string;
33
34
  mode?: 'propose' | 'auto';
34
35
  graph?: boolean;
36
+ /** issue #392 part D: shared-KB staleness GC (reuses the dreaming shape). */
37
+ staleness?: StalenessConfig;
35
38
  }
36
39
  /** Resolved, sanitized shared-KB config (all fields present). */
37
40
  export interface ResolvedKnowledgeSharedCfg {
@@ -40,6 +43,27 @@ export interface ResolvedKnowledgeSharedCfg {
40
43
  root: string;
41
44
  mode: 'propose' | 'auto';
42
45
  graph: boolean;
46
+ staleness: ResolvedStalenessCfg;
47
+ }
48
+ /** Raw config shape under `gateway.knowledge.reflection` (issue #392 part C). */
49
+ export interface KnowledgeReflectionConfig {
50
+ enabled?: boolean;
51
+ dayOfWeek?: number;
52
+ hour?: number;
53
+ minute?: number;
54
+ timezone?: string;
55
+ maxClustersPerRun?: number;
56
+ reviewModel?: string;
57
+ }
58
+ /** Resolved, sanitized reflection config (all fields present). */
59
+ export interface ResolvedKnowledgeReflectionCfg {
60
+ enabled: boolean;
61
+ dayOfWeek: number;
62
+ hour: number;
63
+ minute: number;
64
+ timezone: string;
65
+ maxClustersPerRun: number;
66
+ reviewModel: string;
43
67
  }
44
68
  /** One indexed source file. */
45
69
  export interface ArchiveSourceRow {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;AAErE,qFAAqF;AACrF,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAExF,wFAAwF;AACxF,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,+DAA+D;AAC/D,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,6EAA6E;AAC7E,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,iEAAiE;AACjE,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,+BAA+B;AAC/B,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yEAAyE;AACzE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Live chat-model catalog (issue #409).
3
+ *
4
+ * The gateway's model list used to come only from `gateway.models` in
5
+ * config.json, written once at provisioning and never touched again — so a
6
+ * catalog that changed upstream could never reach the `/models` picker or
7
+ * `GET /api/v1/models`. This fetches the catalog from the same endpoint the
8
+ * session already talks to, and falls back to the static list.
9
+ *
10
+ * Provider-agnostic by construction: the base URL and token come from env /
11
+ * `~/.claude/settings.json`, never from a hardcoded vendor host. That mirrors
12
+ * the image tool's catalog fetch (`mcp/tools/image/module.ts`), which solved
13
+ * this same problem for image models. The URL-safety check below is a second
14
+ * implementation of that module's `baseUrlIsSecure` rather than a shared one:
15
+ * `tsconfig.json` pins `rootDir` to `src/`, so nothing here can import from
16
+ * `mcp/`. Keep the two in step.
17
+ */
18
+ import type { ModelConfig } from '../types';
19
+ /** Fallback context window for a model no catalog — live or static — describes. */
20
+ export declare const DEFAULT_CONTEXT_WINDOW = 200000;
21
+ /** Reset module state. Tests only — each case needs a clean cache. */
22
+ export declare function resetModelCatalogCache(): void;
23
+ /** Tests only — the settings file is read once per process otherwise. */
24
+ export declare function resetSettingsEnvCache(): void;
25
+ /**
26
+ * Where to fetch the catalog from. `MODELS_BASE_URL` lets a deployment point
27
+ * the catalog at a different host than the messages endpoint; otherwise it is
28
+ * the same `ANTHROPIC_BASE_URL` the session process already uses. Empty means
29
+ * "not configured", which is the signal to stay on the static list.
30
+ */
31
+ export declare function catalogBaseUrl(): string;
32
+ /**
33
+ * https is required for a public catalog host — the bearer token rides every
34
+ * call. http is tolerated only for a local/internal hop, where cleartext never
35
+ * leaves the machine or network.
36
+ */
37
+ export declare function baseUrlIsSecure(raw: string): boolean;
38
+ /**
39
+ * Turn a catalog response into `ModelConfig[]`, or null when it carries no
40
+ * usable model.
41
+ *
42
+ * Two response shapes are accepted because two are in the wild: Anthropic's
43
+ * `{ data: [{ id, display_name }] }` and the `{ models: [{ id, label }] }`
44
+ * shape this gateway's own endpoints emit. A proxy may front either.
45
+ *
46
+ * `alias`, `contextWindow` and `multiplier` are not part of any catalog
47
+ * response, so they are carried over from the static entry with the same id.
48
+ * That matters beyond cosmetics: `/session` reports context use as a
49
+ * percentage of `contextWindow`, and `/compact` sizes its window from it — a
50
+ * live model that lost those fields would silently report against 200k.
51
+ */
52
+ export declare function parseModelCatalog(body: unknown, fallback: ModelConfig[]): ModelConfig[] | null;
53
+ /**
54
+ * Fetch the live catalog, or return null to mean "use the static list".
55
+ *
56
+ * Never throws and never rejects: every caller is a picker or a list endpoint
57
+ * whose correct behaviour on any failure is to show the static list. A cached
58
+ * result is reused for {@link CATALOG_TTL_MS}; concurrent callers share one
59
+ * request.
60
+ */
61
+ export declare function fetchModelCatalog(fallback: ModelConfig[], now?: number): Promise<ModelConfig[] | null>;
62
+ //# sourceMappingURL=model-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../../src/agent/model-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA4B5C,mFAAmF;AACnF,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAY9C,sEAAsE;AACtE,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AAsBD,yEAAyE;AACzE,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA0BpD;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,CA+C9F;AAID;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,WAAW,EAAE,EACvB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CA8C/B"}