@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,11 @@
1
+ "use strict";
2
+ /**
3
+ * Skill-learning types — the closed Do → Learn → Improve loop.
4
+ *
5
+ * See planning-62-skill-learning.md. All durable rows live in the per-agent
6
+ * history.db (no second database). Provenance keys (`origin`, `pinned`,
7
+ * `createdFromSession`, `createdAt`) are ordinary extra frontmatter the skill
8
+ * parser already ignores, so a learned skill is a plain SKILL.md.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agent/skill-learning/types.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Skill writer — applies a validated ReviewProposal to disk.
3
+ *
4
+ * The gateway (this module), NOT the reviewer model, writes files. All the
5
+ * safety guards live here:
6
+ * - name / reserved-name / size validation (mirrors mcp/tools/skills/handlers.ts
7
+ * — keep in sync; src/ cannot import from mcp/ because tsc rootDir is ./src).
8
+ * - HARD provenance guard: only `origin: auto` skills are ever edited or
9
+ * overwritten; a create that collides with a non-auto skill is refused.
10
+ * - priority/dedup: a create that duplicates an existing auto skill (by name
11
+ * or description) is downgraded to an edit of that skill.
12
+ * - `mode: propose` writes to a review queue (`skills/.pending/`) instead of live.
13
+ */
14
+ import type { ReviewProposal, WriteOutcome, SkillOrigin, SkillLearningMode } from './types';
15
+ export declare const PENDING_DIRNAME = ".pending";
16
+ export interface ExistingSkill {
17
+ name: string;
18
+ description: string;
19
+ origin: SkillOrigin;
20
+ filePath: string;
21
+ }
22
+ export interface WriterContext {
23
+ workspaceDir: string;
24
+ sessionId: string;
25
+ now: number;
26
+ mode: SkillLearningMode;
27
+ /** Existing skills for dedup + provenance decisions (name, desc, origin, path). */
28
+ existing: ExistingSkill[];
29
+ }
30
+ /** Read the `origin` frontmatter of an on-disk skill; missing ⇒ 'user' (never writable). */
31
+ export declare function readSkillOrigin(filePath: string): SkillOrigin;
32
+ /**
33
+ * Apply a proposal. Never throws — validation/guard failures return a
34
+ * `written:false` outcome with a reason. Idempotent per (name, content).
35
+ */
36
+ export declare function applyProposal(proposal: ReviewProposal, ctx: WriterContext): WriteOutcome;
37
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/agent/skill-learning/writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAU5F,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,iBAAiB,CAAC;IACxB,mFAAmF;IACnF,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAUD,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQ7D;AAkDD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,aAAa,GAAG,YAAY,CAiGxF"}
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ /**
3
+ * Skill writer — applies a validated ReviewProposal to disk.
4
+ *
5
+ * The gateway (this module), NOT the reviewer model, writes files. All the
6
+ * safety guards live here:
7
+ * - name / reserved-name / size validation (mirrors mcp/tools/skills/handlers.ts
8
+ * — keep in sync; src/ cannot import from mcp/ because tsc rootDir is ./src).
9
+ * - HARD provenance guard: only `origin: auto` skills are ever edited or
10
+ * overwritten; a create that collides with a non-auto skill is refused.
11
+ * - priority/dedup: a create that duplicates an existing auto skill (by name
12
+ * or description) is downgraded to an edit of that skill.
13
+ * - `mode: propose` writes to a review queue (`skills/.pending/`) instead of live.
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.PENDING_DIRNAME = void 0;
50
+ exports.readSkillOrigin = readSkillOrigin;
51
+ exports.applyProposal = applyProposal;
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ const parser_1 = require("../../skills/parser");
55
+ // --- Guards mirrored from mcp/tools/skills/handlers.ts (keep in sync) ---------
56
+ const VALID_NAME_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
57
+ const RESERVED_NAMES = new Set([
58
+ 'help', 'sessions', 'session', 'new', 'clear', 'compact',
59
+ 'rename', 'model', 'restart', 'access', 'configure',
60
+ ]);
61
+ const MAX_SKILL_SIZE = 100 * 1024; // 100KB
62
+ exports.PENDING_DIRNAME = '.pending';
63
+ function validateName(name) {
64
+ if (!VALID_NAME_RE.test(name)) {
65
+ return `invalid skill name "${name}" (lowercase alphanumeric + hyphens, 1-64 chars)`;
66
+ }
67
+ if (RESERVED_NAMES.has(name))
68
+ return `skill name "${name}" is reserved`;
69
+ return null;
70
+ }
71
+ /** Read the `origin` frontmatter of an on-disk skill; missing ⇒ 'user' (never writable). */
72
+ function readSkillOrigin(filePath) {
73
+ try {
74
+ const raw = fs.readFileSync(filePath, 'utf-8');
75
+ const fm = (0, parser_1.extractFrontmatter)(raw)?.frontmatter;
76
+ return fm && fm['origin'] === 'auto' ? 'auto' : 'user';
77
+ }
78
+ catch {
79
+ return 'user';
80
+ }
81
+ }
82
+ function buildSkillMd(opts) {
83
+ // YAML-safe double-quoted scalar: collapse newlines (desc is single-line),
84
+ // strip other control chars, then escape backslashes BEFORE quotes. A raw
85
+ // backslash/newline in the (transcript-derived) description would otherwise
86
+ // produce invalid frontmatter → the freshly written skill never parses/loads.
87
+ const desc = opts.description
88
+ .replace(/[\r\n]+/g, ' ')
89
+ .replace(/[\x00-\x1f]/g, ' ')
90
+ .replace(/\\/g, '\\\\')
91
+ .replace(/"/g, '\\"');
92
+ return [
93
+ '---',
94
+ `name: ${opts.name}`,
95
+ `description: "${desc}"`,
96
+ `origin: ${opts.origin}`,
97
+ `createdFromSession: ${opts.createdFromSession}`,
98
+ `createdAt: ${opts.createdAt}`,
99
+ `pinned: ${opts.pinned}`,
100
+ '---',
101
+ '',
102
+ opts.body.trimEnd(),
103
+ '',
104
+ ].join('\n');
105
+ }
106
+ function atomicWrite(filePath, content) {
107
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
108
+ const tmp = filePath + '.tmp';
109
+ fs.writeFileSync(tmp, content, 'utf-8');
110
+ fs.renameSync(tmp, filePath);
111
+ }
112
+ /** Directory a skill (or its pending queue entry) is written to. */
113
+ function skillFilePath(workspaceDir, name, queued) {
114
+ const base = queued
115
+ ? path.join(workspaceDir, 'skills', exports.PENDING_DIRNAME, name)
116
+ : path.join(workspaceDir, 'skills', name);
117
+ return path.join(base, 'SKILL.md');
118
+ }
119
+ /**
120
+ * Apply a proposal. Never throws — validation/guard failures return a
121
+ * `written:false` outcome with a reason. Idempotent per (name, content).
122
+ */
123
+ function applyProposal(proposal, ctx) {
124
+ if (proposal.action === 'none')
125
+ return { written: false, action: 'none' };
126
+ const queued = ctx.mode === 'propose';
127
+ // Resolve intended action + target, applying priority/dedup for `create`.
128
+ let action = proposal.action;
129
+ let name = (proposal.name ?? proposal.targetSkill ?? '').trim();
130
+ let target;
131
+ if (proposal.action === 'edit') {
132
+ name = (proposal.targetSkill ?? proposal.name ?? '').trim();
133
+ target = ctx.existing.find((s) => s.name === name);
134
+ if (!target)
135
+ return { written: false, action: 'edit', name, reason: 'edit target not found' };
136
+ if (target.origin !== 'auto') {
137
+ return { written: false, action: 'edit', name, reason: 'provenance guard: target is not origin:auto' };
138
+ }
139
+ }
140
+ else {
141
+ // create — collision + dedup
142
+ const byName = ctx.existing.find((s) => s.name === name);
143
+ if (byName) {
144
+ if (byName.origin !== 'auto') {
145
+ return { written: false, action: 'create', name, reason: 'provenance guard: name collides with non-auto skill' };
146
+ }
147
+ // duplicate of an existing auto skill → downgrade to edit
148
+ action = 'edit';
149
+ target = byName;
150
+ }
151
+ else {
152
+ // dedup by description against auto skills → downgrade to edit
153
+ const byDesc = ctx.existing.find((s) => s.origin === 'auto' && normalizeDesc(s.description) === normalizeDesc(proposal.desc ?? ''));
154
+ if (byDesc && normalizeDesc(proposal.desc ?? '')) {
155
+ action = 'edit';
156
+ name = byDesc.name;
157
+ target = byDesc;
158
+ }
159
+ }
160
+ }
161
+ const nameError = validateName(name);
162
+ if (nameError)
163
+ return { written: false, action, name, reason: nameError };
164
+ const description = (proposal.desc ?? target?.description ?? '').trim();
165
+ const body = (proposal.body ?? '').trim();
166
+ if (!description)
167
+ return { written: false, action, name, reason: 'missing description' };
168
+ if (!body)
169
+ return { written: false, action, name, reason: 'missing body' };
170
+ // Preserve provenance on edit; stamp fresh on create.
171
+ let createdAt = ctx.now;
172
+ let createdFromSession = ctx.sessionId;
173
+ let pinned = false;
174
+ if (action === 'edit' && target) {
175
+ try {
176
+ const fm = (0, parser_1.extractFrontmatter)(fs.readFileSync(target.filePath, 'utf-8'))?.frontmatter;
177
+ if (fm) {
178
+ if (typeof fm['createdAt'] === 'number')
179
+ createdAt = fm['createdAt'];
180
+ if (typeof fm['createdFromSession'] === 'string')
181
+ createdFromSession = fm['createdFromSession'];
182
+ if (fm['pinned'] === true)
183
+ pinned = true;
184
+ }
185
+ }
186
+ catch {
187
+ /* keep defaults */
188
+ }
189
+ }
190
+ const skillMd = buildSkillMd({
191
+ name,
192
+ description,
193
+ body,
194
+ origin: 'auto',
195
+ createdFromSession,
196
+ createdAt,
197
+ pinned,
198
+ });
199
+ if (Buffer.byteLength(skillMd, 'utf-8') > MAX_SKILL_SIZE) {
200
+ return { written: false, action, name, reason: `skill exceeds ${MAX_SKILL_SIZE} bytes` };
201
+ }
202
+ // HARD provenance guard against the on-disk source of truth (not just the
203
+ // in-memory `ctx.existing` registry). A user file can occupy the exact target
204
+ // path while being invisible to `ctx.existing` — its frontmatter fails to
205
+ // parse, or its `name` field differs from its directory. Re-read the real
206
+ // target and refuse unless it is origin:auto. Skips the `.pending` queue
207
+ // (separate namespace, never a live user skill).
208
+ const targetPath = skillFilePath(ctx.workspaceDir, name, queued);
209
+ if (!queued && fs.existsSync(targetPath) && readSkillOrigin(targetPath) !== 'auto') {
210
+ return { written: false, action, name, reason: 'provenance guard: on-disk target is not origin:auto' };
211
+ }
212
+ try {
213
+ atomicWrite(targetPath, skillMd);
214
+ }
215
+ catch (err) {
216
+ return { written: false, action, name, reason: `write failed: ${err.message}` };
217
+ }
218
+ return { written: true, action, name, queued };
219
+ }
220
+ function normalizeDesc(d) {
221
+ return d.trim().toLowerCase().replace(/\s+/g, ' ');
222
+ }
223
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/agent/skill-learning/writer.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,32 @@ import { LoadedWorkspace, WatchHandle } from '../types';
2
2
  export declare class MissingRequiredFileError extends Error {
3
3
  constructor(fileName: string);
4
4
  }
5
+ export type OverBudgetMode = 'warn' | 'error';
6
+ export interface MemoryBudgetConfig {
7
+ memoryBudgetChars: number;
8
+ userBudgetChars: number;
9
+ overBudget: OverBudgetMode;
10
+ writeRouting: boolean;
11
+ }
12
+ export declare const DEFAULT_MEMORY_BUDGET: MemoryBudgetConfig;
13
+ /**
14
+ * Resolve a (possibly partial or malformed) memory-budget config into a complete
15
+ * one, falling back to the documented defaults. An unknown `overBudget` value or
16
+ * a non-numeric / negative budget is treated as "not set" and defaulted, so bad
17
+ * operator config never throws at compose (fail-safe, mirrors #310's tz guard).
18
+ */
19
+ export declare function resolveMemoryBudget(cfg?: Partial<MemoryBudgetConfig>): MemoryBudgetConfig;
20
+ /**
21
+ * Build a compact, injectable INDEX of an over-budget MEMORY.md (planning-64 K2
22
+ * core-shrink): the section headings, each top-level (`#`/`##`) section with a
23
+ * short brief, plus a pointer telling the agent the full content lives on disk and
24
+ * is reachable via the `memory_search` / `memory_get` tools. Derived
25
+ * deterministically from the file structure — NO LLM and NO mutation of the
26
+ * on-disk file. Fenced code blocks are skipped so a `# comment` inside ``` is not
27
+ * mistaken for a heading. Returns `null` when the file has no headings to index
28
+ * (caller then keeps full content).
29
+ */
30
+ export declare function buildMemoryIndex(content: string, maxChars?: number): string | null;
5
31
  /**
6
32
  * Migrate workspace files from legacy lowercase names to uppercase canonical names.
7
33
  * - If lowercase exists and uppercase does NOT: rename lowercase → uppercase
@@ -15,6 +41,20 @@ export interface LoadWorkspaceOptions {
15
41
  logger?: {
16
42
  warn: (msg: string) => void;
17
43
  };
44
+ /**
45
+ * Soft per-file char budgets for MEMORY.md/USER.md. When omitted, the
46
+ * documented defaults (DEFAULT_MEMORY_BUDGET) apply — so callers and tests
47
+ * that don't pass it are unaffected.
48
+ */
49
+ memoryBudget?: Partial<MemoryBudgetConfig>;
50
+ /**
51
+ * K2 core-shrink (planning-64): when true, an over-budget MEMORY.md is injected
52
+ * as a compact auto-generated index + a pointer to the memory_search tool,
53
+ * instead of the banner + truncated full text. Defaults to FALSE (opt-in) — the
54
+ * gateway sets it true only when the knowledge archive is enabled, so the index
55
+ * pointer never references a tool that isn't wired.
56
+ */
57
+ coreShrink?: boolean;
18
58
  }
19
59
  /**
20
60
  * Load workspace markdown files and assemble the system prompt.
@@ -22,14 +62,51 @@ export interface LoadWorkspaceOptions {
22
62
  export declare function loadWorkspace(workspaceDir: string, opts?: LoadWorkspaceOptions): Promise<LoadedWorkspace>;
23
63
  /**
24
64
  * Canonical workspace files the agent is authorized to write itself, per the
25
- * memory rule (see MEMORY_RULE above). When ONLY these change, a busy session
26
- * must not be force-restarted: the change most likely came from that very
27
- * session mid-turn, and a deferred restart would stop it the moment the turn
28
- * completes (the self-restart footgun). Idle sessions are still restarted so
29
- * the change reaches them on their next spawn, and the recomposed CLAUDE.md
30
- * carries the change into every future spawn regardless.
65
+ * memory rule (see MEMORY_RULE above), split into two tiers by how urgently a
66
+ * change needs to reach a running session — and, crucially, by the fact that
67
+ * CLAUDE.md is frozen-at-spawn (a live process never re-reads it; the recomposed
68
+ * file applies on the next natural spawn regardless).
69
+ *
70
+ * MEMORY_FILES — self-authored data the agent writes about itself/the user
71
+ * (MEMORY.md, USER.md). A write here is almost always the running session
72
+ * curating its own memory mid-work. Since the process already holds what it
73
+ * just wrote and every future spawn reads the recomposed CLAUDE.md, restarting
74
+ * ANY session (busy or idle) buys nothing — it only drops in-context state and
75
+ * forces a SQLite-replay respawn. Memory-only changes therefore restart
76
+ * nothing at all (see the watcher callback in src/index.ts).
77
+ *
78
+ * IDENTITY_FILES — operator-authored identity (SOUL.md, AGENTS.md, IDENTITY.md).
79
+ * These want to reach sessions "soon-ish", but still never justify SIGKILLing
80
+ * an idle bystander: a deferred restart (respawn on next message) is lossless
81
+ * and applies the change just as correctly. IDENTITY.md is API-writable and
82
+ * composed into CLAUDE.md exactly like SOUL/AGENTS, so it belongs in this tier
83
+ * for the same reason — omitting it would SIGKILL idle sessions on an
84
+ * IDENTITY.md write while deferring the semantically identical SOUL write.
85
+ */
86
+ export declare const MEMORY_FILES: Set<string>;
87
+ export declare const IDENTITY_FILES: Set<string>;
88
+ /**
89
+ * Union of the two tiers — kept for callers that only need "did the agent write
90
+ * this itself?" (e.g. the busy-session skip guard).
31
91
  */
32
92
  export declare const AGENT_WRITABLE_FILES: Set<string>;
93
+ /**
94
+ * How a workspace change should affect already-running sessions. CLAUDE.md is
95
+ * always recomposed on disk regardless; this only decides the restart strategy.
96
+ *
97
+ * - `none` Restart nothing. Self-authored memory (MEMORY.md/USER.md):
98
+ * the writing session already holds the change and every future
99
+ * spawn reads the recomposed CLAUDE.md, so a restart is pure
100
+ * downside. A memory write can never drop a live session.
101
+ * - `defer-idle` Operator identity (SOUL.md/AGENTS.md/IDENTITY.md), possibly
102
+ * mixed with memory files: skip busy sessions (self-restart footgun) and
103
+ * defer idle ones (lossless respawn on next message) — never
104
+ * SIGKILL an idle bystander.
105
+ * - `restart` Any non-agent-writable change (HEARTBEAT.md, operator config,
106
+ * etc.) or an empty change list: today's normal restart-or-defer.
107
+ */
108
+ export type WorkspaceRestartAction = 'none' | 'defer-idle' | 'restart';
109
+ export declare function classifyWorkspaceRestart(changedFiles: string[]): WorkspaceRestartAction;
33
110
  /**
34
111
  * Watch a workspace directory for changes.
35
112
  * Calls onChange (debounced 300ms) with the de-duplicated list of canonical
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-loader.d.ts","sourceRoot":"","sources":["../../src/agent/workspace-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIxE,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,QAAQ,EAAE,MAAM;CAI7B;AA6CD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAuBhE;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuE/G;AAID;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,aAK/B,CAAC;AAWH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,GACzC,WAAW,CA8Cb"}
1
+ {"version":3,"file":"workspace-loader.d.ts","sourceRoot":"","sources":["../../src/agent/workspace-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIxE,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,QAAQ,EAAE,MAAM;CAI7B;AA8ED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IAIxB,UAAU,EAAE,cAAc,CAAC;IAI3B,YAAY,EAAE,OAAO,CAAC;CACvB;AAKD,eAAO,MAAM,qBAAqB,EAAE,kBAKnC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAYzF;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,MAAM,GAAG,IAAI,CA2ChF;AA+CD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAuBhE;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACzC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3C;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CA+F/G;AAID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,YAAY,aAA4C,CAAC;AACtE,eAAO,MAAM,cAAc,aAA2D,CAAC;AAEvF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,aAG/B,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;AAEvE,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAKvF;AAWD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,GACzC,WAAW,CA8Cb"}