@0xmaxma/claude-gateway 1.6.8 → 1.7.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 (223) hide show
  1. package/README.md +149 -20
  2. package/config.template.json +59 -1
  3. package/dist/agent/dreaming/accept.d.ts +43 -0
  4. package/dist/agent/dreaming/accept.d.ts.map +1 -0
  5. package/dist/agent/dreaming/accept.js +230 -0
  6. package/dist/agent/dreaming/accept.js.map +1 -0
  7. package/dist/agent/dreaming/applier.d.ts +77 -0
  8. package/dist/agent/dreaming/applier.d.ts.map +1 -0
  9. package/dist/agent/dreaming/applier.js +406 -0
  10. package/dist/agent/dreaming/applier.js.map +1 -0
  11. package/dist/agent/dreaming/audit.d.ts +27 -0
  12. package/dist/agent/dreaming/audit.d.ts.map +1 -0
  13. package/dist/agent/dreaming/audit.js +100 -0
  14. package/dist/agent/dreaming/audit.js.map +1 -0
  15. package/dist/agent/dreaming/compactor.d.ts +66 -0
  16. package/dist/agent/dreaming/compactor.d.ts.map +1 -0
  17. package/dist/agent/dreaming/compactor.js +306 -0
  18. package/dist/agent/dreaming/compactor.js.map +1 -0
  19. package/dist/agent/dreaming/config.d.ts +19 -0
  20. package/dist/agent/dreaming/config.d.ts.map +1 -0
  21. package/dist/agent/dreaming/config.js +107 -0
  22. package/dist/agent/dreaming/config.js.map +1 -0
  23. package/dist/agent/dreaming/episodic.d.ts +42 -0
  24. package/dist/agent/dreaming/episodic.d.ts.map +1 -0
  25. package/dist/agent/dreaming/episodic.js +116 -0
  26. package/dist/agent/dreaming/episodic.js.map +1 -0
  27. package/dist/agent/dreaming/gather.d.ts +31 -0
  28. package/dist/agent/dreaming/gather.d.ts.map +1 -0
  29. package/dist/agent/dreaming/gather.js +55 -0
  30. package/dist/agent/dreaming/gather.js.map +1 -0
  31. package/dist/agent/dreaming/index.d.ts +87 -0
  32. package/dist/agent/dreaming/index.d.ts.map +1 -0
  33. package/dist/agent/dreaming/index.js +377 -0
  34. package/dist/agent/dreaming/index.js.map +1 -0
  35. package/dist/agent/dreaming/migrate-cli.d.ts +17 -0
  36. package/dist/agent/dreaming/migrate-cli.d.ts.map +1 -0
  37. package/dist/agent/dreaming/migrate-cli.js +42 -0
  38. package/dist/agent/dreaming/migrate-cli.js.map +1 -0
  39. package/dist/agent/dreaming/migrate.d.ts +72 -0
  40. package/dist/agent/dreaming/migrate.d.ts.map +1 -0
  41. package/dist/agent/dreaming/migrate.js +374 -0
  42. package/dist/agent/dreaming/migrate.js.map +1 -0
  43. package/dist/agent/dreaming/report.d.ts +39 -0
  44. package/dist/agent/dreaming/report.d.ts.map +1 -0
  45. package/dist/agent/dreaming/report.js +121 -0
  46. package/dist/agent/dreaming/report.js.map +1 -0
  47. package/dist/agent/dreaming/reviewer.d.ts +43 -0
  48. package/dist/agent/dreaming/reviewer.d.ts.map +1 -0
  49. package/dist/agent/dreaming/reviewer.js +249 -0
  50. package/dist/agent/dreaming/reviewer.js.map +1 -0
  51. package/dist/agent/dreaming/staleness.d.ts +68 -0
  52. package/dist/agent/dreaming/staleness.d.ts.map +1 -0
  53. package/dist/agent/dreaming/staleness.js +281 -0
  54. package/dist/agent/dreaming/staleness.js.map +1 -0
  55. package/dist/agent/dreaming/types.d.ts +130 -0
  56. package/dist/agent/dreaming/types.d.ts.map +1 -0
  57. package/dist/agent/dreaming/types.js +10 -0
  58. package/dist/agent/dreaming/types.js.map +1 -0
  59. package/dist/agent/knowledge/archive-db.d.ts +114 -0
  60. package/dist/agent/knowledge/archive-db.d.ts.map +1 -0
  61. package/dist/agent/knowledge/archive-db.js +474 -0
  62. package/dist/agent/knowledge/archive-db.js.map +1 -0
  63. package/dist/agent/knowledge/chunk.d.ts +21 -0
  64. package/dist/agent/knowledge/chunk.d.ts.map +1 -0
  65. package/dist/agent/knowledge/chunk.js +67 -0
  66. package/dist/agent/knowledge/chunk.js.map +1 -0
  67. package/dist/agent/knowledge/config.d.ts +20 -0
  68. package/dist/agent/knowledge/config.d.ts.map +1 -0
  69. package/dist/agent/knowledge/config.js +143 -0
  70. package/dist/agent/knowledge/config.js.map +1 -0
  71. package/dist/agent/knowledge/graph-demo.d.ts +25 -0
  72. package/dist/agent/knowledge/graph-demo.d.ts.map +1 -0
  73. package/dist/agent/knowledge/graph-demo.js +132 -0
  74. package/dist/agent/knowledge/graph-demo.js.map +1 -0
  75. package/dist/agent/knowledge/index.d.ts +24 -0
  76. package/dist/agent/knowledge/index.d.ts.map +1 -0
  77. package/dist/agent/knowledge/index.js +50 -0
  78. package/dist/agent/knowledge/index.js.map +1 -0
  79. package/dist/agent/knowledge/indexer.d.ts +34 -0
  80. package/dist/agent/knowledge/indexer.d.ts.map +1 -0
  81. package/dist/agent/knowledge/indexer.js +271 -0
  82. package/dist/agent/knowledge/indexer.js.map +1 -0
  83. package/dist/agent/knowledge/lifecycle.d.ts +91 -0
  84. package/dist/agent/knowledge/lifecycle.d.ts.map +1 -0
  85. package/dist/agent/knowledge/lifecycle.js +205 -0
  86. package/dist/agent/knowledge/lifecycle.js.map +1 -0
  87. package/dist/agent/knowledge/provenance.d.ts +15 -0
  88. package/dist/agent/knowledge/provenance.d.ts.map +1 -0
  89. package/dist/agent/knowledge/provenance.js +37 -0
  90. package/dist/agent/knowledge/provenance.js.map +1 -0
  91. package/dist/agent/knowledge/reindex-cli.d.ts +13 -0
  92. package/dist/agent/knowledge/reindex-cli.d.ts.map +1 -0
  93. package/dist/agent/knowledge/reindex-cli.js +53 -0
  94. package/dist/agent/knowledge/reindex-cli.js.map +1 -0
  95. package/dist/agent/knowledge/reindex-spawn.d.ts +30 -0
  96. package/dist/agent/knowledge/reindex-spawn.d.ts.map +1 -0
  97. package/dist/agent/knowledge/reindex-spawn.js +97 -0
  98. package/dist/agent/knowledge/reindex-spawn.js.map +1 -0
  99. package/dist/agent/knowledge/shared-promote.d.ts +18 -0
  100. package/dist/agent/knowledge/shared-promote.d.ts.map +1 -0
  101. package/dist/agent/knowledge/shared-promote.js +29 -0
  102. package/dist/agent/knowledge/shared-promote.js.map +1 -0
  103. package/dist/agent/knowledge/shared-writer.d.ts +24 -0
  104. package/dist/agent/knowledge/shared-writer.d.ts.map +1 -0
  105. package/dist/agent/knowledge/shared-writer.js +97 -0
  106. package/dist/agent/knowledge/shared-writer.js.map +1 -0
  107. package/dist/agent/knowledge/types.d.ts +83 -0
  108. package/dist/agent/knowledge/types.d.ts.map +1 -0
  109. package/dist/agent/knowledge/types.js +12 -0
  110. package/dist/agent/knowledge/types.js.map +1 -0
  111. package/dist/agent/knowledge/wiki.d.ts +107 -0
  112. package/dist/agent/knowledge/wiki.d.ts.map +1 -0
  113. package/dist/agent/knowledge/wiki.js +415 -0
  114. package/dist/agent/knowledge/wiki.js.map +1 -0
  115. package/dist/agent/memory-metrics.d.ts +48 -0
  116. package/dist/agent/memory-metrics.d.ts.map +1 -0
  117. package/dist/agent/memory-metrics.js +156 -0
  118. package/dist/agent/memory-metrics.js.map +1 -0
  119. package/dist/agent/runner.d.ts +24 -1
  120. package/dist/agent/runner.d.ts.map +1 -1
  121. package/dist/agent/runner.js +82 -6
  122. package/dist/agent/runner.js.map +1 -1
  123. package/dist/agent/skill-learning/config.d.ts +18 -0
  124. package/dist/agent/skill-learning/config.d.ts.map +1 -0
  125. package/dist/agent/skill-learning/config.js +71 -0
  126. package/dist/agent/skill-learning/config.js.map +1 -0
  127. package/dist/agent/skill-learning/curator.d.ts +45 -0
  128. package/dist/agent/skill-learning/curator.d.ts.map +1 -0
  129. package/dist/agent/skill-learning/curator.js +171 -0
  130. package/dist/agent/skill-learning/curator.js.map +1 -0
  131. package/dist/agent/skill-learning/index.d.ts +79 -0
  132. package/dist/agent/skill-learning/index.d.ts.map +1 -0
  133. package/dist/agent/skill-learning/index.js +308 -0
  134. package/dist/agent/skill-learning/index.js.map +1 -0
  135. package/dist/agent/skill-learning/metrics.d.ts +13 -0
  136. package/dist/agent/skill-learning/metrics.d.ts.map +1 -0
  137. package/dist/agent/skill-learning/metrics.js +109 -0
  138. package/dist/agent/skill-learning/metrics.js.map +1 -0
  139. package/dist/agent/skill-learning/notifier.d.ts +111 -0
  140. package/dist/agent/skill-learning/notifier.d.ts.map +1 -0
  141. package/dist/agent/skill-learning/notifier.js +398 -0
  142. package/dist/agent/skill-learning/notifier.js.map +1 -0
  143. package/dist/agent/skill-learning/reviewer.d.ts +61 -0
  144. package/dist/agent/skill-learning/reviewer.d.ts.map +1 -0
  145. package/dist/agent/skill-learning/reviewer.js +271 -0
  146. package/dist/agent/skill-learning/reviewer.js.map +1 -0
  147. package/dist/agent/skill-learning/telemetry.d.ts +22 -0
  148. package/dist/agent/skill-learning/telemetry.d.ts.map +1 -0
  149. package/dist/agent/skill-learning/telemetry.js +90 -0
  150. package/dist/agent/skill-learning/telemetry.js.map +1 -0
  151. package/dist/agent/skill-learning/trigger.d.ts +23 -0
  152. package/dist/agent/skill-learning/trigger.d.ts.map +1 -0
  153. package/dist/agent/skill-learning/trigger.js +44 -0
  154. package/dist/agent/skill-learning/trigger.js.map +1 -0
  155. package/dist/agent/skill-learning/types.d.ts +165 -0
  156. package/dist/agent/skill-learning/types.d.ts.map +1 -0
  157. package/dist/agent/skill-learning/types.js +11 -0
  158. package/dist/agent/skill-learning/types.js.map +1 -0
  159. package/dist/agent/skill-learning/writer.d.ts +37 -0
  160. package/dist/agent/skill-learning/writer.d.ts.map +1 -0
  161. package/dist/agent/skill-learning/writer.js +223 -0
  162. package/dist/agent/skill-learning/writer.js.map +1 -0
  163. package/dist/agent/workspace-loader.d.ts +83 -6
  164. package/dist/agent/workspace-loader.d.ts.map +1 -1
  165. package/dist/agent/workspace-loader.js +207 -14
  166. package/dist/agent/workspace-loader.js.map +1 -1
  167. package/dist/api/gateway-router.d.ts +2 -0
  168. package/dist/api/gateway-router.d.ts.map +1 -1
  169. package/dist/api/gateway-router.js +293 -6
  170. package/dist/api/gateway-router.js.map +1 -1
  171. package/dist/api/share-router.d.ts.map +1 -1
  172. package/dist/api/share-router.js +27 -1
  173. package/dist/api/share-router.js.map +1 -1
  174. package/dist/api/skills-router.d.ts +2 -2
  175. package/dist/api/skills-router.d.ts.map +1 -1
  176. package/dist/api/skills-router.js +61 -1
  177. package/dist/api/skills-router.js.map +1 -1
  178. package/dist/apps/agent-manager.d.ts +7 -0
  179. package/dist/apps/agent-manager.d.ts.map +1 -1
  180. package/dist/apps/agent-manager.js +13 -1
  181. package/dist/apps/agent-manager.js.map +1 -1
  182. package/dist/config/migrator.d.ts +2 -0
  183. package/dist/config/migrator.d.ts.map +1 -1
  184. package/dist/config/migrator.js +72 -1
  185. package/dist/config/migrator.js.map +1 -1
  186. package/dist/history/cleanup.d.ts +7 -0
  187. package/dist/history/cleanup.d.ts.map +1 -1
  188. package/dist/history/cleanup.js +27 -0
  189. package/dist/history/cleanup.js.map +1 -1
  190. package/dist/history/db.d.ts +65 -0
  191. package/dist/history/db.d.ts.map +1 -1
  192. package/dist/history/db.js +261 -0
  193. package/dist/history/db.js.map +1 -1
  194. package/dist/index.js +122 -20
  195. package/dist/index.js.map +1 -1
  196. package/dist/session/process.d.ts +10 -0
  197. package/dist/session/process.d.ts.map +1 -1
  198. package/dist/session/process.js +86 -1
  199. package/dist/session/process.js.map +1 -1
  200. package/dist/share/share-store.d.ts +11 -0
  201. package/dist/share/share-store.d.ts.map +1 -1
  202. package/dist/share/share-store.js +3 -1
  203. package/dist/share/share-store.js.map +1 -1
  204. package/dist/skills/loader.d.ts +8 -0
  205. package/dist/skills/loader.d.ts.map +1 -1
  206. package/dist/skills/loader.js +29 -1
  207. package/dist/skills/loader.js.map +1 -1
  208. package/dist/types.d.ts +116 -0
  209. package/dist/types.d.ts.map +1 -1
  210. package/dist/ui/web-ui.d.ts.map +1 -1
  211. package/dist/ui/web-ui.js +1126 -3
  212. package/dist/ui/web-ui.js.map +1 -1
  213. package/mcp/package.json +2 -1
  214. package/mcp/server.ts +2 -0
  215. package/mcp/tools/image/module.ts +114 -9
  216. package/mcp/tools/memory/archive-reader.test.ts +212 -0
  217. package/mcp/tools/memory/archive-reader.ts +253 -0
  218. package/mcp/tools/memory/module.ts +152 -0
  219. package/mcp/tools/memory/retrieval-recorder.ts +66 -0
  220. package/mcp/tools/shared/share-client.ts +20 -1
  221. package/mcp/tools/skills/module.ts +28 -0
  222. package/package.json +1 -1
  223. package/resource/claude_gateway.svg +1038 -112
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ /**
3
+ * Resolve the effective skill-learning config for one agent.
4
+ *
5
+ * Precedence mirrors `resolveRetentionDays` (history/cleanup.ts): a per-agent
6
+ * override wins over the global gateway default, which wins over the built-in
7
+ * default. The gateway does not central-default — defaults are applied here at
8
+ * the consumption site.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.SKILL_LEARNING_DEFAULTS = void 0;
12
+ exports.resolveSkillLearningConfig = resolveSkillLearningConfig;
13
+ exports.isValidTimezone = isValidTimezone;
14
+ exports.SKILL_LEARNING_DEFAULTS = {
15
+ enabled: true,
16
+ mode: 'auto',
17
+ minToolCalls: 5,
18
+ reviewModel: 'claude-haiku-4-5-20251001',
19
+ maxAutoSkills: 50,
20
+ maxAgeDays: 30,
21
+ minUsesToKeep: 2,
22
+ pruneHour: 3,
23
+ pruneTimezone: 'UTC',
24
+ maxReviewsPerDay: 20,
25
+ notify: true,
26
+ };
27
+ /** Pick the first defined value in precedence order, else the default. */
28
+ function pick(agent, global, fallback) {
29
+ if (agent !== undefined)
30
+ return agent;
31
+ if (global !== undefined)
32
+ return global;
33
+ return fallback;
34
+ }
35
+ /**
36
+ * Merge a per-agent override and the global gateway config into a fully
37
+ * resolved config. Either side may be undefined/partial.
38
+ */
39
+ function resolveSkillLearningConfig(agentCfg, globalCfg) {
40
+ const d = exports.SKILL_LEARNING_DEFAULTS;
41
+ // Normalize the timezone once, here, so every consumer (curator scheduler,
42
+ // telemetry day-window) receives a value Intl accepts — an invalid tz falls
43
+ // back to UTC rather than each consumer re-guarding (or crashing) on its own.
44
+ const rawTz = pick(agentCfg?.pruneTimezone, globalCfg?.pruneTimezone, d.pruneTimezone);
45
+ return {
46
+ enabled: pick(agentCfg?.enabled, globalCfg?.enabled, d.enabled),
47
+ mode: pick(agentCfg?.mode, globalCfg?.mode, d.mode),
48
+ minToolCalls: pick(agentCfg?.minToolCalls, globalCfg?.minToolCalls, d.minToolCalls),
49
+ reviewModel: pick(agentCfg?.reviewModel, globalCfg?.reviewModel, d.reviewModel),
50
+ maxAutoSkills: pick(agentCfg?.maxAutoSkills, globalCfg?.maxAutoSkills, d.maxAutoSkills),
51
+ maxAgeDays: pick(agentCfg?.maxAgeDays, globalCfg?.maxAgeDays, d.maxAgeDays),
52
+ minUsesToKeep: pick(agentCfg?.minUsesToKeep, globalCfg?.minUsesToKeep, d.minUsesToKeep),
53
+ pruneHour: pick(agentCfg?.pruneHour, globalCfg?.pruneHour, d.pruneHour),
54
+ pruneTimezone: isValidTimezone(rawTz) ? rawTz : 'UTC',
55
+ maxReviewsPerDay: pick(agentCfg?.maxReviewsPerDay, globalCfg?.maxReviewsPerDay, d.maxReviewsPerDay),
56
+ notify: pick(agentCfg?.notify, globalCfg?.notify, d.notify),
57
+ };
58
+ }
59
+ /** Validate a timezone string; fall back to UTC on anything Intl rejects (boot-safety, lesson #310). */
60
+ function isValidTimezone(tz) {
61
+ if (typeof tz !== 'string' || tz.length === 0)
62
+ return false;
63
+ try {
64
+ new Intl.DateTimeFormat('en-US', { timeZone: tz });
65
+ return true;
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ }
71
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/agent/skill-learning/config.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AA6BH,gEAsBC;AAGD,0CAQC;AA1DY,QAAA,uBAAuB,GAA6B;IAC/D,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,2BAA2B;IACxC,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,CAAC;IAChB,SAAS,EAAE,CAAC;IACZ,aAAa,EAAE,KAAK;IACpB,gBAAgB,EAAE,EAAE;IACpB,MAAM,EAAE,IAAI;CACb,CAAC;AAEF,0EAA0E;AAC1E,SAAS,IAAI,CAAI,KAAoB,EAAE,MAAqB,EAAE,QAAW;IACvE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,0BAA0B,CACxC,QAA8B,EAC9B,SAA+B;IAE/B,MAAM,CAAC,GAAG,+BAAuB,CAAC;IAClC,2EAA2E;IAC3E,4EAA4E;IAC5E,8EAA8E;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IACvF,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;QAC/D,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QACnD,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC;QACnF,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC;QAC/E,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC;QACvF,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC;QAC3E,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC;QACvF,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;QACvE,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;QACrD,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,CAAC;QACnG,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,wGAAwG;AACxG,SAAgB,eAAe,CAAC,EAAsB;IACpD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Curator — the anti-rot half of the loop. Daily, per agent:
3
+ * - prune origin:auto skills that are BOTH unused (`times_loaded < minUsesToKeep`)
4
+ * AND stale (`age > maxAgeDays`) and not pinned;
5
+ * - enforce the `maxAutoSkills` cap by evicting least-recently-used auto skills;
6
+ * - NEVER touch hand-authored (non-auto) or pinned skills;
7
+ * - run telemetry retention even when learning is disabled (tables don't grow
8
+ * unbounded);
9
+ * - log the effectiveness rollup headline.
10
+ *
11
+ * The scheduler mirrors `scheduleCleanup` (history/cleanup.ts) + `msUntilNextHour`,
12
+ * guarded by `isValidTimezone` fallback-to-UTC (boot-safety, lesson #310).
13
+ */
14
+ import type { HistoryDB } from '../../history/db';
15
+ import type { ResolvedSkillLearningCfg } from './types';
16
+ /** Telemetry retention window — keep this many days of turn_metrics/review rows. */
17
+ export declare const TELEMETRY_RETENTION_DAYS = 90;
18
+ export interface CuratorDeps {
19
+ db: HistoryDB;
20
+ workspaceDir: string;
21
+ agentId: string;
22
+ cfg: ResolvedSkillLearningCfg;
23
+ now: number;
24
+ logger?: {
25
+ info: (msg: string) => void;
26
+ };
27
+ /** Injectable skill-dir remover (defaults to fs rm) — for tests. */
28
+ removeSkillDir?: (dir: string) => void;
29
+ }
30
+ export interface CuratorResult {
31
+ pruned: string[];
32
+ evicted: string[];
33
+ telemetryRowsRemoved: number;
34
+ }
35
+ /**
36
+ * Run one curation sweep. Always runs telemetry retention; skips skill pruning
37
+ * when disabled. Pure w.r.t. time (`now` injected) and fs (remover injectable).
38
+ */
39
+ export declare function curateOnce(deps: CuratorDeps): CuratorResult;
40
+ /**
41
+ * Start the daily curator scheduler (mirror `scheduleCleanup`). Returns a
42
+ * canceller. Invalid `pruneTimezone` falls back to UTC (never throws at boot).
43
+ */
44
+ export declare function startCurator(makeDeps: () => Omit<CuratorDeps, 'now'>, cfg: ResolvedSkillLearningCfg): () => void;
45
+ //# sourceMappingURL=curator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curator.d.ts","sourceRoot":"","sources":["../../../src/agent/skill-learning/curator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAGxD,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,SAAS,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,wBAAwB,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACzC,oEAAoE;IACpE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CA4C3D;AAwCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,wBAAwB,GAAG,MAAM,IAAI,CAiBhH"}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ /**
3
+ * Curator — the anti-rot half of the loop. Daily, per agent:
4
+ * - prune origin:auto skills that are BOTH unused (`times_loaded < minUsesToKeep`)
5
+ * AND stale (`age > maxAgeDays`) and not pinned;
6
+ * - enforce the `maxAutoSkills` cap by evicting least-recently-used auto skills;
7
+ * - NEVER touch hand-authored (non-auto) or pinned skills;
8
+ * - run telemetry retention even when learning is disabled (tables don't grow
9
+ * unbounded);
10
+ * - log the effectiveness rollup headline.
11
+ *
12
+ * The scheduler mirrors `scheduleCleanup` (history/cleanup.ts) + `msUntilNextHour`,
13
+ * guarded by `isValidTimezone` fallback-to-UTC (boot-safety, lesson #310).
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.TELEMETRY_RETENTION_DAYS = void 0;
50
+ exports.curateOnce = curateOnce;
51
+ exports.startCurator = startCurator;
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ const cleanup_1 = require("../../history/cleanup");
55
+ const config_1 = require("./config");
56
+ const writer_1 = require("./writer");
57
+ const metrics_1 = require("./metrics");
58
+ const DAY_MS = 24 * 60 * 60 * 1000;
59
+ /** Telemetry retention window — keep this many days of turn_metrics/review rows. */
60
+ exports.TELEMETRY_RETENTION_DAYS = 90;
61
+ function defaultRemove(dir) {
62
+ fs.rmSync(dir, { recursive: true, force: true });
63
+ }
64
+ /**
65
+ * Run one curation sweep. Always runs telemetry retention; skips skill pruning
66
+ * when disabled. Pure w.r.t. time (`now` injected) and fs (remover injectable).
67
+ */
68
+ function curateOnce(deps) {
69
+ const { db, workspaceDir, cfg, now } = deps;
70
+ const remove = deps.removeSkillDir ?? defaultRemove;
71
+ const result = { pruned: [], evicted: [], telemetryRowsRemoved: 0 };
72
+ // Telemetry retention ALWAYS runs (even when disabled) so the tables are bounded.
73
+ result.telemetryRowsRemoved = db.pruneTelemetry(now - exports.TELEMETRY_RETENTION_DAYS * DAY_MS);
74
+ if (!cfg.enabled) {
75
+ logRollup(deps);
76
+ return result;
77
+ }
78
+ const auto = db.listSkillStats().filter((s) => s.origin === 'auto' && s.pinned !== 1);
79
+ // 1. Stale + unused prune (both conditions; age-prune disabled when maxAgeDays<=0).
80
+ const survivors = [];
81
+ for (const s of auto) {
82
+ const ageMs = s.createdAt != null ? now - s.createdAt : 0;
83
+ const unused = s.timesLoaded < cfg.minUsesToKeep;
84
+ const stale = cfg.maxAgeDays > 0 && ageMs > cfg.maxAgeDays * DAY_MS;
85
+ if (unused && stale) {
86
+ if (pruneSkill(s.name, deps, remove))
87
+ result.pruned.push(s.name);
88
+ }
89
+ else {
90
+ survivors.push(s);
91
+ }
92
+ }
93
+ // 2. Cap eviction (LRU) among the survivors (0 = unbounded).
94
+ if (cfg.maxAutoSkills > 0 && survivors.length > cfg.maxAutoSkills) {
95
+ const lru = survivors
96
+ .slice()
97
+ // Oldest-used first. Fall back to createdAt for never-used skills so a
98
+ // brand-new (lastUsedAt=null) skill is not treated as the stalest and
99
+ // evicted before it is ever loaded.
100
+ .sort((a, b) => (a.lastUsedAt ?? a.createdAt ?? 0) - (b.lastUsedAt ?? b.createdAt ?? 0));
101
+ const overflow = survivors.length - cfg.maxAutoSkills;
102
+ for (const s of lru.slice(0, overflow)) {
103
+ if (pruneSkill(s.name, deps, remove))
104
+ result.evicted.push(s.name);
105
+ }
106
+ }
107
+ logRollup(deps);
108
+ return result;
109
+ }
110
+ /**
111
+ * Remove a skill dir + drop its stat row. Returns `true` if the directory was
112
+ * actually removed, `false` if it was preserved (adopted by the user). Re-verify
113
+ * provenance against the on-disk file, not the (possibly stale) stat row: a user
114
+ * who "adopts" an auto skill — editing SKILL.md and flipping `origin` away from
115
+ * `auto` — must never have it deleted, even though the skill_stats row still says
116
+ * origin:auto. Drop the stale row either way so it stops being tracked as auto.
117
+ */
118
+ function pruneSkill(name, deps, remove) {
119
+ const skillDir = path.join(deps.workspaceDir, 'skills', name);
120
+ const skillFile = path.join(skillDir, 'SKILL.md');
121
+ if (fs.existsSync(skillFile) && (0, writer_1.readSkillOrigin)(skillFile) !== 'auto') {
122
+ deps.db.deleteSkillStat(name);
123
+ return false;
124
+ }
125
+ try {
126
+ remove(skillDir);
127
+ }
128
+ catch {
129
+ /* best-effort — still drop the stat row */
130
+ }
131
+ deps.db.deleteSkillStat(name);
132
+ return true;
133
+ }
134
+ function logRollup(deps) {
135
+ if (!deps.logger)
136
+ return;
137
+ try {
138
+ const r = (0, metrics_1.computeRollup)(deps.db, deps.agentId, deps.now);
139
+ deps.logger.info(`[skill-learning:${deps.agentId}] rollup — autoSkills=${r.adoption.autoSkills} ` +
140
+ `sticky(>=3)=${r.adoption.stickyPct.toFixed(0)}% netTokens=${r.netTokens.net} ` +
141
+ `(saved=${r.netTokens.savedByReuse} spent=${r.netTokens.spentReviewing})`);
142
+ }
143
+ catch {
144
+ /* logging is best-effort */
145
+ }
146
+ }
147
+ /**
148
+ * Start the daily curator scheduler (mirror `scheduleCleanup`). Returns a
149
+ * canceller. Invalid `pruneTimezone` falls back to UTC (never throws at boot).
150
+ */
151
+ function startCurator(makeDeps, cfg) {
152
+ const tz = (0, config_1.isValidTimezone)(cfg.pruneTimezone) ? cfg.pruneTimezone : 'UTC';
153
+ let timer;
154
+ const schedule = () => {
155
+ const delay = (0, cleanup_1.msUntilNextHour)(cfg.pruneHour, tz);
156
+ timer = setTimeout(() => {
157
+ try {
158
+ curateOnce({ ...makeDeps(), now: Date.now() });
159
+ }
160
+ catch {
161
+ /* best-effort */
162
+ }
163
+ schedule();
164
+ }, delay);
165
+ if (typeof timer.unref === 'function')
166
+ timer.unref();
167
+ };
168
+ schedule();
169
+ return () => clearTimeout(timer);
170
+ }
171
+ //# sourceMappingURL=curator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curator.js","sourceRoot":"","sources":["../../../src/agent/skill-learning/curator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * SkillLearningManager — the only export the runner/index wire to.
3
+ *
4
+ * Owns the closed loop: cheap per-turn telemetry capture (always-on), a
5
+ * debounced session-idle review trigger, the print-only reviewer, the
6
+ * provenance-guarded writer, and the daily curator. All turn-lifecycle methods
7
+ * are best-effort and MUST never throw into the runner's hot path.
8
+ */
9
+ import { HistoryDB } from '../../history/db';
10
+ import { type ClaudeSpawnFn } from './reviewer';
11
+ import { type CuratorResult } from './curator';
12
+ import { SkillNotifier, type ChannelTokens } from './notifier';
13
+ import type { SkillLearningConfig, ResolvedSkillLearningCfg, SkillMetricsRollup } from './types';
14
+ /** Debounce: fire the review this long after the last turn ends (session-idle proxy). */
15
+ export declare const REVIEW_IDLE_DEBOUNCE_MS = 20000;
16
+ export interface SkillLearningManagerOpts {
17
+ db: HistoryDB;
18
+ agentId: string;
19
+ workspaceDir: string;
20
+ mcpToolsDir?: string;
21
+ sharedSkillsDir?: string;
22
+ globalCfg?: SkillLearningConfig;
23
+ agentCfg?: SkillLearningConfig;
24
+ logger?: {
25
+ info: (msg: string) => void;
26
+ warn?: (msg: string) => void;
27
+ };
28
+ /** Injectable reviewer spawn — tests script the model; production uses the real claude -p. */
29
+ reviewSpawn?: ClaudeSpawnFn;
30
+ /** Injectable clock (tests). */
31
+ now?: () => number;
32
+ /** Channel credentials for skill-write notifications (fan-out across all configured channels). */
33
+ channels?: ChannelTokens;
34
+ /** Injectable notifier (tests). Production builds one from `channels`. */
35
+ notifier?: SkillNotifier;
36
+ }
37
+ export declare class SkillLearningManager {
38
+ readonly cfg: ResolvedSkillLearningCfg;
39
+ private readonly db;
40
+ private readonly agentId;
41
+ private readonly workspaceDir;
42
+ private readonly mcpToolsDir?;
43
+ private readonly sharedSkillsDir?;
44
+ private readonly logger?;
45
+ private readonly reviewSpawn?;
46
+ private readonly now;
47
+ private readonly notifier;
48
+ private readonly accum;
49
+ private readonly reviewInFlight;
50
+ private readonly idleTimers;
51
+ constructor(opts: SkillLearningManagerOpts);
52
+ isEnabled(): boolean;
53
+ /** A user turn begins. `invokedSkills` = skills detected in the incoming message. */
54
+ onTurnStart(mapKey: string, sessionId: string, firstUserMessage: string, invokedSkills?: string[]): void;
55
+ /** A tool_use block streamed by. Deduped by block id (cumulative snapshots). */
56
+ onToolUse(mapKey: string, toolUseId?: string): void;
57
+ onTokenUsage(mapKey: string, inputTokens: number, totalTokens: number): void;
58
+ onRecoveryFired(mapKey: string): void;
59
+ /** A user turn ended. Persist the metric row + arm the idle-review debounce. */
60
+ onTurnEnd(mapKey: string, sessionId: string): void;
61
+ private scheduleIdleReview;
62
+ /**
63
+ * The gated review entry (also the direct test seam). Reads session signals,
64
+ * checks the daily budget, and — if the gate passes — runs the reviewer and
65
+ * applies the proposal. Never throws.
66
+ */
67
+ runReviewNow(mapKey: string, sessionId: string): Promise<void>;
68
+ /** Start the daily curator scheduler. Returns a canceller. */
69
+ startCurator(): () => void;
70
+ /** Run one curation sweep immediately (test/ops seam). */
71
+ curateNow(): CuratorResult;
72
+ /** The effectiveness rollup (REST/MCP read side). */
73
+ rollup(): SkillMetricsRollup;
74
+ private freshAccum;
75
+ private gatherTranscript;
76
+ /** All loaded skills with resolved provenance + path (for dedup + guards). */
77
+ private loadExistingSkills;
78
+ }
79
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/skill-learning/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI7C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAoB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,KAAK,EAAkB,mBAAmB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEjH,yFAAyF;AACzF,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAuB9C,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,SAAS,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACvE,8FAA8F;IAC9F,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,GAAG,EAAE,wBAAwB,CAAC;IACvC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAEzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoD;gBAEnE,IAAI,EAAE,wBAAwB;IAoB1C,SAAS,IAAI,OAAO;IAMpB,qFAAqF;IACrF,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,IAAI;IAuB5G,gFAAgF;IAChF,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAUnD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAO5E,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOrC,gFAAgF;IAChF,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IA6BlD,OAAO,CAAC,kBAAkB;IAY1B;;;;OAIG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuFpE,8DAA8D;IAC9D,YAAY,IAAI,MAAM,IAAI;IAa1B,0DAA0D;IAC1D,SAAS,IAAI,aAAa;IAW1B,qDAAqD;IACrD,MAAM,IAAI,kBAAkB;IAM5B,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,gBAAgB;IAQxB,8EAA8E;IAC9E,OAAO,CAAC,kBAAkB;CAsB3B"}