@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.
- package/README.md +149 -20
- package/config.template.json +59 -1
- package/dist/agent/dreaming/accept.d.ts +43 -0
- package/dist/agent/dreaming/accept.d.ts.map +1 -0
- package/dist/agent/dreaming/accept.js +230 -0
- package/dist/agent/dreaming/accept.js.map +1 -0
- package/dist/agent/dreaming/applier.d.ts +77 -0
- package/dist/agent/dreaming/applier.d.ts.map +1 -0
- package/dist/agent/dreaming/applier.js +406 -0
- package/dist/agent/dreaming/applier.js.map +1 -0
- package/dist/agent/dreaming/audit.d.ts +27 -0
- package/dist/agent/dreaming/audit.d.ts.map +1 -0
- package/dist/agent/dreaming/audit.js +100 -0
- package/dist/agent/dreaming/audit.js.map +1 -0
- package/dist/agent/dreaming/compactor.d.ts +66 -0
- package/dist/agent/dreaming/compactor.d.ts.map +1 -0
- package/dist/agent/dreaming/compactor.js +306 -0
- package/dist/agent/dreaming/compactor.js.map +1 -0
- package/dist/agent/dreaming/config.d.ts +19 -0
- package/dist/agent/dreaming/config.d.ts.map +1 -0
- package/dist/agent/dreaming/config.js +107 -0
- package/dist/agent/dreaming/config.js.map +1 -0
- package/dist/agent/dreaming/episodic.d.ts +42 -0
- package/dist/agent/dreaming/episodic.d.ts.map +1 -0
- package/dist/agent/dreaming/episodic.js +116 -0
- package/dist/agent/dreaming/episodic.js.map +1 -0
- package/dist/agent/dreaming/gather.d.ts +31 -0
- package/dist/agent/dreaming/gather.d.ts.map +1 -0
- package/dist/agent/dreaming/gather.js +55 -0
- package/dist/agent/dreaming/gather.js.map +1 -0
- package/dist/agent/dreaming/index.d.ts +87 -0
- package/dist/agent/dreaming/index.d.ts.map +1 -0
- package/dist/agent/dreaming/index.js +377 -0
- package/dist/agent/dreaming/index.js.map +1 -0
- package/dist/agent/dreaming/migrate-cli.d.ts +17 -0
- package/dist/agent/dreaming/migrate-cli.d.ts.map +1 -0
- package/dist/agent/dreaming/migrate-cli.js +42 -0
- package/dist/agent/dreaming/migrate-cli.js.map +1 -0
- package/dist/agent/dreaming/migrate.d.ts +72 -0
- package/dist/agent/dreaming/migrate.d.ts.map +1 -0
- package/dist/agent/dreaming/migrate.js +374 -0
- package/dist/agent/dreaming/migrate.js.map +1 -0
- package/dist/agent/dreaming/report.d.ts +39 -0
- package/dist/agent/dreaming/report.d.ts.map +1 -0
- package/dist/agent/dreaming/report.js +121 -0
- package/dist/agent/dreaming/report.js.map +1 -0
- package/dist/agent/dreaming/reviewer.d.ts +43 -0
- package/dist/agent/dreaming/reviewer.d.ts.map +1 -0
- package/dist/agent/dreaming/reviewer.js +249 -0
- package/dist/agent/dreaming/reviewer.js.map +1 -0
- package/dist/agent/dreaming/staleness.d.ts +68 -0
- package/dist/agent/dreaming/staleness.d.ts.map +1 -0
- package/dist/agent/dreaming/staleness.js +281 -0
- package/dist/agent/dreaming/staleness.js.map +1 -0
- package/dist/agent/dreaming/types.d.ts +130 -0
- package/dist/agent/dreaming/types.d.ts.map +1 -0
- package/dist/agent/dreaming/types.js +10 -0
- package/dist/agent/dreaming/types.js.map +1 -0
- package/dist/agent/knowledge/archive-db.d.ts +114 -0
- package/dist/agent/knowledge/archive-db.d.ts.map +1 -0
- package/dist/agent/knowledge/archive-db.js +474 -0
- package/dist/agent/knowledge/archive-db.js.map +1 -0
- package/dist/agent/knowledge/chunk.d.ts +21 -0
- package/dist/agent/knowledge/chunk.d.ts.map +1 -0
- package/dist/agent/knowledge/chunk.js +67 -0
- package/dist/agent/knowledge/chunk.js.map +1 -0
- package/dist/agent/knowledge/config.d.ts +20 -0
- package/dist/agent/knowledge/config.d.ts.map +1 -0
- package/dist/agent/knowledge/config.js +143 -0
- package/dist/agent/knowledge/config.js.map +1 -0
- package/dist/agent/knowledge/graph-demo.d.ts +25 -0
- package/dist/agent/knowledge/graph-demo.d.ts.map +1 -0
- package/dist/agent/knowledge/graph-demo.js +132 -0
- package/dist/agent/knowledge/graph-demo.js.map +1 -0
- package/dist/agent/knowledge/index.d.ts +24 -0
- package/dist/agent/knowledge/index.d.ts.map +1 -0
- package/dist/agent/knowledge/index.js +50 -0
- package/dist/agent/knowledge/index.js.map +1 -0
- package/dist/agent/knowledge/indexer.d.ts +34 -0
- package/dist/agent/knowledge/indexer.d.ts.map +1 -0
- package/dist/agent/knowledge/indexer.js +271 -0
- package/dist/agent/knowledge/indexer.js.map +1 -0
- package/dist/agent/knowledge/lifecycle.d.ts +91 -0
- package/dist/agent/knowledge/lifecycle.d.ts.map +1 -0
- package/dist/agent/knowledge/lifecycle.js +205 -0
- package/dist/agent/knowledge/lifecycle.js.map +1 -0
- package/dist/agent/knowledge/provenance.d.ts +15 -0
- package/dist/agent/knowledge/provenance.d.ts.map +1 -0
- package/dist/agent/knowledge/provenance.js +37 -0
- package/dist/agent/knowledge/provenance.js.map +1 -0
- package/dist/agent/knowledge/reindex-cli.d.ts +13 -0
- package/dist/agent/knowledge/reindex-cli.d.ts.map +1 -0
- package/dist/agent/knowledge/reindex-cli.js +53 -0
- package/dist/agent/knowledge/reindex-cli.js.map +1 -0
- package/dist/agent/knowledge/reindex-spawn.d.ts +30 -0
- package/dist/agent/knowledge/reindex-spawn.d.ts.map +1 -0
- package/dist/agent/knowledge/reindex-spawn.js +97 -0
- package/dist/agent/knowledge/reindex-spawn.js.map +1 -0
- package/dist/agent/knowledge/shared-promote.d.ts +18 -0
- package/dist/agent/knowledge/shared-promote.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-promote.js +29 -0
- package/dist/agent/knowledge/shared-promote.js.map +1 -0
- package/dist/agent/knowledge/shared-writer.d.ts +24 -0
- package/dist/agent/knowledge/shared-writer.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-writer.js +97 -0
- package/dist/agent/knowledge/shared-writer.js.map +1 -0
- package/dist/agent/knowledge/types.d.ts +83 -0
- package/dist/agent/knowledge/types.d.ts.map +1 -0
- package/dist/agent/knowledge/types.js +12 -0
- package/dist/agent/knowledge/types.js.map +1 -0
- package/dist/agent/knowledge/wiki.d.ts +107 -0
- package/dist/agent/knowledge/wiki.d.ts.map +1 -0
- package/dist/agent/knowledge/wiki.js +415 -0
- package/dist/agent/knowledge/wiki.js.map +1 -0
- package/dist/agent/memory-metrics.d.ts +48 -0
- package/dist/agent/memory-metrics.d.ts.map +1 -0
- package/dist/agent/memory-metrics.js +156 -0
- package/dist/agent/memory-metrics.js.map +1 -0
- package/dist/agent/runner.d.ts +24 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +82 -6
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/skill-learning/config.d.ts +18 -0
- package/dist/agent/skill-learning/config.d.ts.map +1 -0
- package/dist/agent/skill-learning/config.js +71 -0
- package/dist/agent/skill-learning/config.js.map +1 -0
- package/dist/agent/skill-learning/curator.d.ts +45 -0
- package/dist/agent/skill-learning/curator.d.ts.map +1 -0
- package/dist/agent/skill-learning/curator.js +171 -0
- package/dist/agent/skill-learning/curator.js.map +1 -0
- package/dist/agent/skill-learning/index.d.ts +79 -0
- package/dist/agent/skill-learning/index.d.ts.map +1 -0
- package/dist/agent/skill-learning/index.js +308 -0
- package/dist/agent/skill-learning/index.js.map +1 -0
- package/dist/agent/skill-learning/metrics.d.ts +13 -0
- package/dist/agent/skill-learning/metrics.d.ts.map +1 -0
- package/dist/agent/skill-learning/metrics.js +109 -0
- package/dist/agent/skill-learning/metrics.js.map +1 -0
- package/dist/agent/skill-learning/notifier.d.ts +111 -0
- package/dist/agent/skill-learning/notifier.d.ts.map +1 -0
- package/dist/agent/skill-learning/notifier.js +398 -0
- package/dist/agent/skill-learning/notifier.js.map +1 -0
- package/dist/agent/skill-learning/reviewer.d.ts +61 -0
- package/dist/agent/skill-learning/reviewer.d.ts.map +1 -0
- package/dist/agent/skill-learning/reviewer.js +271 -0
- package/dist/agent/skill-learning/reviewer.js.map +1 -0
- package/dist/agent/skill-learning/telemetry.d.ts +22 -0
- package/dist/agent/skill-learning/telemetry.d.ts.map +1 -0
- package/dist/agent/skill-learning/telemetry.js +90 -0
- package/dist/agent/skill-learning/telemetry.js.map +1 -0
- package/dist/agent/skill-learning/trigger.d.ts +23 -0
- package/dist/agent/skill-learning/trigger.d.ts.map +1 -0
- package/dist/agent/skill-learning/trigger.js +44 -0
- package/dist/agent/skill-learning/trigger.js.map +1 -0
- package/dist/agent/skill-learning/types.d.ts +165 -0
- package/dist/agent/skill-learning/types.d.ts.map +1 -0
- package/dist/agent/skill-learning/types.js +11 -0
- package/dist/agent/skill-learning/types.js.map +1 -0
- package/dist/agent/skill-learning/writer.d.ts +37 -0
- package/dist/agent/skill-learning/writer.d.ts.map +1 -0
- package/dist/agent/skill-learning/writer.js +223 -0
- package/dist/agent/skill-learning/writer.js.map +1 -0
- package/dist/agent/workspace-loader.d.ts +83 -6
- package/dist/agent/workspace-loader.d.ts.map +1 -1
- package/dist/agent/workspace-loader.js +207 -14
- package/dist/agent/workspace-loader.js.map +1 -1
- package/dist/api/gateway-router.d.ts +2 -0
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +293 -6
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/share-router.d.ts.map +1 -1
- package/dist/api/share-router.js +27 -1
- package/dist/api/share-router.js.map +1 -1
- package/dist/api/skills-router.d.ts +2 -2
- package/dist/api/skills-router.d.ts.map +1 -1
- package/dist/api/skills-router.js +61 -1
- package/dist/api/skills-router.js.map +1 -1
- package/dist/apps/agent-manager.d.ts +7 -0
- package/dist/apps/agent-manager.d.ts.map +1 -1
- package/dist/apps/agent-manager.js +13 -1
- package/dist/apps/agent-manager.js.map +1 -1
- package/dist/config/migrator.d.ts +2 -0
- package/dist/config/migrator.d.ts.map +1 -1
- package/dist/config/migrator.js +72 -1
- package/dist/config/migrator.js.map +1 -1
- package/dist/history/cleanup.d.ts +7 -0
- package/dist/history/cleanup.d.ts.map +1 -1
- package/dist/history/cleanup.js +27 -0
- package/dist/history/cleanup.js.map +1 -1
- package/dist/history/db.d.ts +65 -0
- package/dist/history/db.d.ts.map +1 -1
- package/dist/history/db.js +261 -0
- package/dist/history/db.js.map +1 -1
- package/dist/index.js +122 -20
- package/dist/index.js.map +1 -1
- package/dist/session/process.d.ts +10 -0
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +86 -1
- package/dist/session/process.js.map +1 -1
- package/dist/share/share-store.d.ts +11 -0
- package/dist/share/share-store.d.ts.map +1 -1
- package/dist/share/share-store.js +3 -1
- package/dist/share/share-store.js.map +1 -1
- package/dist/skills/loader.d.ts +8 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +29 -1
- package/dist/skills/loader.js.map +1 -1
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/web-ui.d.ts.map +1 -1
- package/dist/ui/web-ui.js +1126 -3
- package/dist/ui/web-ui.js.map +1 -1
- package/mcp/package.json +2 -1
- package/mcp/server.ts +2 -0
- package/mcp/tools/image/module.ts +114 -9
- package/mcp/tools/memory/archive-reader.test.ts +212 -0
- package/mcp/tools/memory/archive-reader.ts +253 -0
- package/mcp/tools/memory/module.ts +152 -0
- package/mcp/tools/memory/retrieval-recorder.ts +66 -0
- package/mcp/tools/shared/share-client.ts +20 -1
- package/mcp/tools/skills/module.ts +28 -0
- package/package.json +1 -1
- 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)
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
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;
|
|
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"}
|