skillscript-runtime 0.2.4
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/ARCHITECTURE.md +70 -0
- package/LICENSE +21 -0
- package/README.md +346 -0
- package/dist/audit.d.ts +33 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +76 -0
- package/dist/audit.js.map +1 -0
- package/dist/bootstrap.d.ts +69 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +117 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +805 -0
- package/dist/cli.js.map +1 -0
- package/dist/compile.d.ts +88 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +544 -0
- package/dist/compile.js.map +1 -0
- package/dist/connectors/agent-noop.d.ts +23 -0
- package/dist/connectors/agent-noop.d.ts.map +1 -0
- package/dist/connectors/agent-noop.js +43 -0
- package/dist/connectors/agent-noop.js.map +1 -0
- package/dist/connectors/agent.d.ts +54 -0
- package/dist/connectors/agent.d.ts.map +1 -0
- package/dist/connectors/agent.js +21 -0
- package/dist/connectors/agent.js.map +1 -0
- package/dist/connectors/index.d.ts +13 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +17 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/local-model.d.ts +41 -0
- package/dist/connectors/local-model.d.ts.map +1 -0
- package/dist/connectors/local-model.js +106 -0
- package/dist/connectors/local-model.js.map +1 -0
- package/dist/connectors/mcp.d.ts +22 -0
- package/dist/connectors/mcp.d.ts.map +1 -0
- package/dist/connectors/mcp.js +31 -0
- package/dist/connectors/mcp.js.map +1 -0
- package/dist/connectors/memory-store.d.ts +53 -0
- package/dist/connectors/memory-store.d.ts.map +1 -0
- package/dist/connectors/memory-store.js +169 -0
- package/dist/connectors/memory-store.js.map +1 -0
- package/dist/connectors/registry.d.ts +74 -0
- package/dist/connectors/registry.d.ts.map +1 -0
- package/dist/connectors/registry.js +127 -0
- package/dist/connectors/registry.js.map +1 -0
- package/dist/connectors/skill-store.d.ts +38 -0
- package/dist/connectors/skill-store.d.ts.map +1 -0
- package/dist/connectors/skill-store.js +314 -0
- package/dist/connectors/skill-store.js.map +1 -0
- package/dist/connectors/types.d.ts +188 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/connectors/types.js +35 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/dashboard/server.d.ts +40 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +122 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/spa/app.js +375 -0
- package/dist/dashboard/spa/index.html +26 -0
- package/dist/dashboard/spa/styles.css +99 -0
- package/dist/errors.d.ts +111 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +187 -0
- package/dist/errors.js.map +1 -0
- package/dist/filters.d.ts +17 -0
- package/dist/filters.d.ts.map +1 -0
- package/dist/filters.js +40 -0
- package/dist/filters.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/lint.d.ts +97 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +990 -0
- package/dist/lint.js.map +1 -0
- package/dist/mcp-server.d.ts +93 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +505 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/metrics.d.ts +51 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +107 -0
- package/dist/metrics.js.map +1 -0
- package/dist/parser.d.ts +160 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +991 -0
- package/dist/parser.js.map +1 -0
- package/dist/provenance.d.ts +43 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +58 -0
- package/dist/provenance.js.map +1 -0
- package/dist/runtime.d.ts +145 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1071 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scheduler.d.ts +121 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +271 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/skill-manager.d.ts +121 -0
- package/dist/skill-manager.d.ts.map +1 -0
- package/dist/skill-manager.js +251 -0
- package/dist/skill-manager.js.map +1 -0
- package/dist/testing/conformance.d.ts +57 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +365 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/trace.d.ts +141 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +226 -0
- package/dist/trace.js.map +1 -0
- package/examples/README.md +56 -0
- package/examples/classify-support-ticket.skill.md +30 -0
- package/examples/cut-release-tag.skill.md +40 -0
- package/examples/doc-qa-with-citations.skill.md +12 -0
- package/examples/feedback-sentiment-scan.skill.md +29 -0
- package/examples/hello.skill.md +9 -0
- package/examples/hello.skill.provenance.json +10 -0
- package/examples/morning-brief.skill.md +24 -0
- package/examples/programmatic-trace-demo.mjs +89 -0
- package/examples/service-health-watch.skill.md +18 -0
- package/package.json +100 -0
- package/scaffold/config.toml +35 -0
- package/scaffold/connectors.json +19 -0
- package/scaffold/examples/hello.skill.md +9 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { SkillStore, SkillStoreClass, MemoryStore, MemoryStoreClass, LocalModel, LocalModelClass, McpConnector, McpConnectorClass, StaticCapabilities } from "./types.js";
|
|
2
|
+
import type { AgentConnector, AgentConnectorClass } from "./agent.js";
|
|
3
|
+
export declare class Registry {
|
|
4
|
+
private skillStores;
|
|
5
|
+
private memoryStores;
|
|
6
|
+
private localModels;
|
|
7
|
+
private mcpConnectors;
|
|
8
|
+
private agentConnectors;
|
|
9
|
+
registerSkillStore(name: string, instance: SkillStore): void;
|
|
10
|
+
registerMemoryStore(name: string, instance: MemoryStore): void;
|
|
11
|
+
registerLocalModel(name: string, instance: LocalModel): void;
|
|
12
|
+
registerMcpConnector(name: string, instance: McpConnector): void;
|
|
13
|
+
registerAgentConnector(name: string, instance: AgentConnector): void;
|
|
14
|
+
getSkillStore(name?: string): SkillStore;
|
|
15
|
+
getMemoryStore(name?: string): MemoryStore;
|
|
16
|
+
getLocalModel(name?: string): LocalModel;
|
|
17
|
+
getMcpConnector(name?: string): McpConnector;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the registered AgentConnector or a transparent `NoOpAgentConnector`
|
|
20
|
+
* when none is wired. Unlike the other `get*` methods, this never throws —
|
|
21
|
+
* the no-op fallback lets `# Output: prompt-context:` dispatch resolve
|
|
22
|
+
* cleanly in test/dev environments without an explicit substrate setup.
|
|
23
|
+
* Adopters wire a real impl for production via `registerAgentConnector`.
|
|
24
|
+
*/
|
|
25
|
+
getAgentConnector(name?: string): AgentConnector;
|
|
26
|
+
getSkillStoreClass(name?: string): SkillStoreClass;
|
|
27
|
+
getMemoryStoreClass(name?: string): MemoryStoreClass;
|
|
28
|
+
getLocalModelClass(name?: string): LocalModelClass;
|
|
29
|
+
getMcpConnectorClass(name?: string): McpConnectorClass;
|
|
30
|
+
getAgentConnectorClass(name?: string): AgentConnectorClass;
|
|
31
|
+
listSkillStoreClasses(): SkillStoreClass[];
|
|
32
|
+
listMemoryStoreClasses(): MemoryStoreClass[];
|
|
33
|
+
listLocalModelClasses(): LocalModelClass[];
|
|
34
|
+
listMcpConnectorClasses(): McpConnectorClass[];
|
|
35
|
+
listAgentConnectorClasses(): AgentConnectorClass[];
|
|
36
|
+
listSkillStores(): Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
instance: SkillStore;
|
|
39
|
+
ctor: SkillStoreClass;
|
|
40
|
+
}>;
|
|
41
|
+
listMemoryStores(): Array<{
|
|
42
|
+
name: string;
|
|
43
|
+
instance: MemoryStore;
|
|
44
|
+
ctor: MemoryStoreClass;
|
|
45
|
+
}>;
|
|
46
|
+
listLocalModels(): Array<{
|
|
47
|
+
name: string;
|
|
48
|
+
instance: LocalModel;
|
|
49
|
+
ctor: LocalModelClass;
|
|
50
|
+
}>;
|
|
51
|
+
listMcpConnectors(): Array<{
|
|
52
|
+
name: string;
|
|
53
|
+
instance: McpConnector;
|
|
54
|
+
ctor: McpConnectorClass;
|
|
55
|
+
}>;
|
|
56
|
+
listAgentConnectors(): Array<{
|
|
57
|
+
name: string;
|
|
58
|
+
instance: AgentConnector;
|
|
59
|
+
ctor: AgentConnectorClass;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Static capabilities for every registered connector class, deduplicated
|
|
63
|
+
* by class identity. The linter's primary input — it builds the combined
|
|
64
|
+
* feature set from this and validates skill `# Requires:` clauses
|
|
65
|
+
* without ever calling `manifest()` or constructing additional instances.
|
|
66
|
+
*/
|
|
67
|
+
getAllStaticCapabilities(): StaticCapabilities[];
|
|
68
|
+
hasSkillStore(name?: string): boolean;
|
|
69
|
+
hasMemoryStore(name?: string): boolean;
|
|
70
|
+
hasLocalModel(name?: string): boolean;
|
|
71
|
+
hasMcpConnector(name?: string): boolean;
|
|
72
|
+
hasAgentConnector(name?: string): boolean;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA4BtE,qBAAa,QAAQ;IACnB,OAAO,CAAC,WAAW,CAAyD;IAC5E,OAAO,CAAC,YAAY,CAA2D;IAC/E,OAAO,CAAC,WAAW,CAAyD;IAC5E,OAAO,CAAC,aAAa,CAA6D;IAClF,OAAO,CAAC,eAAe,CAAiE;IAIxF,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI;IAI5D,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAI9D,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI;IAI5D,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIhE,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAMpE,aAAa,CAAC,IAAI,SAAY,GAAG,UAAU;IAG3C,cAAc,CAAC,IAAI,SAAY,GAAG,WAAW;IAG7C,aAAa,CAAC,IAAI,SAAY,GAAG,UAAU;IAG3C,eAAe,CAAC,IAAI,SAAY,GAAG,YAAY;IAG/C;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,SAAY,GAAG,cAAc;IAQnD,kBAAkB,CAAC,IAAI,SAAY,GAAG,eAAe;IAGrD,mBAAmB,CAAC,IAAI,SAAY,GAAG,gBAAgB;IAGvD,kBAAkB,CAAC,IAAI,SAAY,GAAG,eAAe;IAGrD,oBAAoB,CAAC,IAAI,SAAY,GAAG,iBAAiB;IAGzD,sBAAsB,CAAC,IAAI,SAAY,GAAG,mBAAmB;IAQ7D,qBAAqB,IAAI,eAAe,EAAE;IAC1C,sBAAsB,IAAI,gBAAgB,EAAE;IAC5C,qBAAqB,IAAI,eAAe,EAAE;IAC1C,uBAAuB,IAAI,iBAAiB,EAAE;IAC9C,yBAAyB,IAAI,mBAAmB,EAAE;IAOlD,eAAe,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC;IACvF,gBAAgB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAC1F,eAAe,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC;IACvF,iBAAiB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAC7F,mBAAmB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAInG;;;;;OAKG;IACH,wBAAwB,IAAI,kBAAkB,EAAE;IAYhD,aAAa,CAAC,IAAI,SAAY,GAAG,OAAO;IACxC,cAAc,CAAC,IAAI,SAAY,GAAG,OAAO;IACzC,aAAa,CAAC,IAAI,SAAY,GAAG,OAAO;IACxC,eAAe,CAAC,IAAI,SAAY,GAAG,OAAO;IAC1C,iBAAiB,CAAC,IAAI,SAAY,GAAG,OAAO;CAC7C"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { NoOpAgentConnector } from "./agent-noop.js";
|
|
2
|
+
export class Registry {
|
|
3
|
+
skillStores = new Map();
|
|
4
|
+
memoryStores = new Map();
|
|
5
|
+
localModels = new Map();
|
|
6
|
+
mcpConnectors = new Map();
|
|
7
|
+
agentConnectors = new Map();
|
|
8
|
+
// ─── Register ───────────────────────────────────────────────────────────
|
|
9
|
+
registerSkillStore(name, instance) {
|
|
10
|
+
this.skillStores.set(name, { instance, ctor: ctorOf(instance) });
|
|
11
|
+
}
|
|
12
|
+
registerMemoryStore(name, instance) {
|
|
13
|
+
this.memoryStores.set(name, { instance, ctor: ctorOf(instance) });
|
|
14
|
+
}
|
|
15
|
+
registerLocalModel(name, instance) {
|
|
16
|
+
this.localModels.set(name, { instance, ctor: ctorOf(instance) });
|
|
17
|
+
}
|
|
18
|
+
registerMcpConnector(name, instance) {
|
|
19
|
+
this.mcpConnectors.set(name, { instance, ctor: ctorOf(instance) });
|
|
20
|
+
}
|
|
21
|
+
registerAgentConnector(name, instance) {
|
|
22
|
+
this.agentConnectors.set(name, { instance, ctor: ctorOf(instance) });
|
|
23
|
+
}
|
|
24
|
+
// ─── Get instance (runtime dispatch) ────────────────────────────────────
|
|
25
|
+
getSkillStore(name = "primary") {
|
|
26
|
+
return must(this.skillStores, name, "SkillStore").instance;
|
|
27
|
+
}
|
|
28
|
+
getMemoryStore(name = "primary") {
|
|
29
|
+
return must(this.memoryStores, name, "MemoryStore").instance;
|
|
30
|
+
}
|
|
31
|
+
getLocalModel(name = "default") {
|
|
32
|
+
return must(this.localModels, name, "LocalModel").instance;
|
|
33
|
+
}
|
|
34
|
+
getMcpConnector(name = "primary") {
|
|
35
|
+
return must(this.mcpConnectors, name, "McpConnector").instance;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Returns the registered AgentConnector or a transparent `NoOpAgentConnector`
|
|
39
|
+
* when none is wired. Unlike the other `get*` methods, this never throws —
|
|
40
|
+
* the no-op fallback lets `# Output: prompt-context:` dispatch resolve
|
|
41
|
+
* cleanly in test/dev environments without an explicit substrate setup.
|
|
42
|
+
* Adopters wire a real impl for production via `registerAgentConnector`.
|
|
43
|
+
*/
|
|
44
|
+
getAgentConnector(name = "primary") {
|
|
45
|
+
const entry = this.agentConnectors.get(name);
|
|
46
|
+
if (entry !== undefined)
|
|
47
|
+
return entry.instance;
|
|
48
|
+
return DEFAULT_AGENT_CONNECTOR;
|
|
49
|
+
}
|
|
50
|
+
// ─── Get class (linter offline lookup) ──────────────────────────────────
|
|
51
|
+
getSkillStoreClass(name = "primary") {
|
|
52
|
+
return must(this.skillStores, name, "SkillStore").ctor;
|
|
53
|
+
}
|
|
54
|
+
getMemoryStoreClass(name = "primary") {
|
|
55
|
+
return must(this.memoryStores, name, "MemoryStore").ctor;
|
|
56
|
+
}
|
|
57
|
+
getLocalModelClass(name = "default") {
|
|
58
|
+
return must(this.localModels, name, "LocalModel").ctor;
|
|
59
|
+
}
|
|
60
|
+
getMcpConnectorClass(name = "primary") {
|
|
61
|
+
return must(this.mcpConnectors, name, "McpConnector").ctor;
|
|
62
|
+
}
|
|
63
|
+
getAgentConnectorClass(name = "primary") {
|
|
64
|
+
const entry = this.agentConnectors.get(name);
|
|
65
|
+
if (entry !== undefined)
|
|
66
|
+
return entry.ctor;
|
|
67
|
+
return NoOpAgentConnector;
|
|
68
|
+
}
|
|
69
|
+
// ─── List distinct classes per kind ─────────────────────────────────────
|
|
70
|
+
listSkillStoreClasses() { return distinct(this.skillStores); }
|
|
71
|
+
listMemoryStoreClasses() { return distinct(this.memoryStores); }
|
|
72
|
+
listLocalModelClasses() { return distinct(this.localModels); }
|
|
73
|
+
listMcpConnectorClasses() { return distinct(this.mcpConnectors); }
|
|
74
|
+
listAgentConnectorClasses() { return distinct(this.agentConnectors); }
|
|
75
|
+
// ─── Enumerate registered instances by name ──────────────────────────────
|
|
76
|
+
// Discovery surface for runtime_capabilities (MCP tool, v0.2.1) — pairs
|
|
77
|
+
// the registered name with the per-instance ctor for staticCapabilities()
|
|
78
|
+
// calls. Excludes the implicit NoOp agent-connector fallback.
|
|
79
|
+
listSkillStores() { return entries(this.skillStores); }
|
|
80
|
+
listMemoryStores() { return entries(this.memoryStores); }
|
|
81
|
+
listLocalModels() { return entries(this.localModels); }
|
|
82
|
+
listMcpConnectors() { return entries(this.mcpConnectors); }
|
|
83
|
+
listAgentConnectors() { return entries(this.agentConnectors); }
|
|
84
|
+
// ─── Aggregate view for the linter ──────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Static capabilities for every registered connector class, deduplicated
|
|
87
|
+
* by class identity. The linter's primary input — it builds the combined
|
|
88
|
+
* feature set from this and validates skill `# Requires:` clauses
|
|
89
|
+
* without ever calling `manifest()` or constructing additional instances.
|
|
90
|
+
*/
|
|
91
|
+
getAllStaticCapabilities() {
|
|
92
|
+
return [
|
|
93
|
+
...this.listSkillStoreClasses().map((c) => c.staticCapabilities()),
|
|
94
|
+
...this.listMemoryStoreClasses().map((c) => c.staticCapabilities()),
|
|
95
|
+
...this.listLocalModelClasses().map((c) => c.staticCapabilities()),
|
|
96
|
+
...this.listMcpConnectorClasses().map((c) => c.staticCapabilities()),
|
|
97
|
+
...this.listAgentConnectorClasses().map((c) => c.staticCapabilities()),
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
// ─── Existence checks ───────────────────────────────────────────────────
|
|
101
|
+
hasSkillStore(name = "primary") { return this.skillStores.has(name); }
|
|
102
|
+
hasMemoryStore(name = "primary") { return this.memoryStores.has(name); }
|
|
103
|
+
hasLocalModel(name = "default") { return this.localModels.has(name); }
|
|
104
|
+
hasMcpConnector(name = "primary") { return this.mcpConnectors.has(name); }
|
|
105
|
+
hasAgentConnector(name = "primary") { return this.agentConnectors.has(name); }
|
|
106
|
+
}
|
|
107
|
+
const DEFAULT_AGENT_CONNECTOR = new NoOpAgentConnector();
|
|
108
|
+
function ctorOf(instance) {
|
|
109
|
+
return instance.constructor;
|
|
110
|
+
}
|
|
111
|
+
function must(map, name, kind) {
|
|
112
|
+
const entry = map.get(name);
|
|
113
|
+
if (entry === undefined) {
|
|
114
|
+
throw new Error(`${kind} '${name}' not registered. Registered: ${Array.from(map.keys()).join(", ") || "(none)"}.`);
|
|
115
|
+
}
|
|
116
|
+
return entry;
|
|
117
|
+
}
|
|
118
|
+
function distinct(map) {
|
|
119
|
+
const seen = new Set();
|
|
120
|
+
for (const entry of map.values())
|
|
121
|
+
seen.add(entry.ctor);
|
|
122
|
+
return Array.from(seen);
|
|
123
|
+
}
|
|
124
|
+
function entries(map) {
|
|
125
|
+
return Array.from(map.entries()).map(([name, e]) => ({ name, instance: e.instance, ctor: e.ctor }));
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { SkillStore, SkillSource, SkillMeta, SkillStatus, SkillFilter, VersionInfo, StaticCapabilities, ManifestInfo } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Filesystem-backed SkillStore. Skills live as `*.skill.md` files under a
|
|
4
|
+
* directory. Per-skill version history lives in a sidecar `*.versions.jsonl`
|
|
5
|
+
* (append-only, one JSON object per line).
|
|
6
|
+
*
|
|
7
|
+
* Limitations of the filesystem substrate (acknowledged):
|
|
8
|
+
* - `load(name, version)` cannot return historical bytes — only the current
|
|
9
|
+
* file content is on disk. If `version` is supplied and doesn't match
|
|
10
|
+
* the current file's hash, throws `VersionNotFoundError`. A
|
|
11
|
+
* content-addressed substrate (git-backed, S3, etc.) would preserve
|
|
12
|
+
* bytes per version.
|
|
13
|
+
* - `versions()` reads the `.jsonl` sidecar if present, else synthesizes
|
|
14
|
+
* one entry from the file's mtime (for legacy files written before
|
|
15
|
+
* T2's versioning landed).
|
|
16
|
+
* - `query()` reads every file's headers on each call. Fine for small
|
|
17
|
+
* stores; a larger substrate caches metadata.
|
|
18
|
+
*
|
|
19
|
+
* `version` string format: first 12 chars of `content_hash` — short, stable,
|
|
20
|
+
* shareable. Consumers MUST treat `version` as opaque (equality only).
|
|
21
|
+
*/
|
|
22
|
+
export declare class FilesystemSkillStore implements SkillStore {
|
|
23
|
+
private readonly rootDir;
|
|
24
|
+
static staticCapabilities(): StaticCapabilities;
|
|
25
|
+
constructor(rootDir: string);
|
|
26
|
+
manifest(): Promise<ManifestInfo>;
|
|
27
|
+
load(name: string, version?: string): Promise<SkillSource>;
|
|
28
|
+
query(filter?: SkillFilter): Promise<SkillMeta[]>;
|
|
29
|
+
metadata(name: string): Promise<SkillMeta>;
|
|
30
|
+
versions(name: string): Promise<VersionInfo[]>;
|
|
31
|
+
store(name: string, source: string, metadata?: Partial<SkillMeta>): Promise<VersionInfo>;
|
|
32
|
+
delete(name: string): Promise<void>;
|
|
33
|
+
update_status(name: string, status: SkillStatus): Promise<VersionInfo>;
|
|
34
|
+
private pathFor;
|
|
35
|
+
private versionsPathFor;
|
|
36
|
+
private buildMeta;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=skill-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-store.d.ts","sourceRoot":"","sources":["../../src/connectors/skill-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,YAAY,EACb,MAAM,YAAY,CAAC;AAKpB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,oBAAqB,YAAW,UAAU;IAgBzC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAfpC,MAAM,CAAC,kBAAkB,IAAI,kBAAkB;gBAelB,OAAO,EAAE,MAAM;IAEtC,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAUjC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA0B1D,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0BjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAa1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAmC9C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBxF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAenC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IA4B5E,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,eAAe;YAIT,SAAS;CAkBxB"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { readFile, readdir, writeFile, mkdir, stat, unlink, appendFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { SkillNotFoundError, VersionNotFoundError, StorageConflictError } from "../errors.js";
|
|
5
|
+
const CONTRACT_VERSION = "1.0.0";
|
|
6
|
+
/**
|
|
7
|
+
* Filesystem-backed SkillStore. Skills live as `*.skill.md` files under a
|
|
8
|
+
* directory. Per-skill version history lives in a sidecar `*.versions.jsonl`
|
|
9
|
+
* (append-only, one JSON object per line).
|
|
10
|
+
*
|
|
11
|
+
* Limitations of the filesystem substrate (acknowledged):
|
|
12
|
+
* - `load(name, version)` cannot return historical bytes — only the current
|
|
13
|
+
* file content is on disk. If `version` is supplied and doesn't match
|
|
14
|
+
* the current file's hash, throws `VersionNotFoundError`. A
|
|
15
|
+
* content-addressed substrate (git-backed, S3, etc.) would preserve
|
|
16
|
+
* bytes per version.
|
|
17
|
+
* - `versions()` reads the `.jsonl` sidecar if present, else synthesizes
|
|
18
|
+
* one entry from the file's mtime (for legacy files written before
|
|
19
|
+
* T2's versioning landed).
|
|
20
|
+
* - `query()` reads every file's headers on each call. Fine for small
|
|
21
|
+
* stores; a larger substrate caches metadata.
|
|
22
|
+
*
|
|
23
|
+
* `version` string format: first 12 chars of `content_hash` — short, stable,
|
|
24
|
+
* shareable. Consumers MUST treat `version` as opaque (equality only).
|
|
25
|
+
*/
|
|
26
|
+
export class FilesystemSkillStore {
|
|
27
|
+
rootDir;
|
|
28
|
+
static staticCapabilities() {
|
|
29
|
+
return {
|
|
30
|
+
connector_type: "skill_store",
|
|
31
|
+
implementation: "FilesystemSkillStore",
|
|
32
|
+
contract_version: CONTRACT_VERSION,
|
|
33
|
+
features: {
|
|
34
|
+
supports_writes: true,
|
|
35
|
+
supports_versioning: true,
|
|
36
|
+
supports_tag_filter: false,
|
|
37
|
+
supports_audit_trail: true,
|
|
38
|
+
supports_atomic_status_transitions: false,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
constructor(rootDir) {
|
|
43
|
+
this.rootDir = rootDir;
|
|
44
|
+
}
|
|
45
|
+
async manifest() {
|
|
46
|
+
return {
|
|
47
|
+
capabilities_version: "1",
|
|
48
|
+
manifest: {
|
|
49
|
+
kind: "filesystem",
|
|
50
|
+
root_dir: this.rootDir,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async load(name, version) {
|
|
55
|
+
const path = this.pathFor(name);
|
|
56
|
+
let source;
|
|
57
|
+
try {
|
|
58
|
+
source = await readFile(path, "utf8");
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (err.code === "ENOENT") {
|
|
62
|
+
throw new SkillNotFoundError(name, "FilesystemSkillStore");
|
|
63
|
+
}
|
|
64
|
+
throw err;
|
|
65
|
+
}
|
|
66
|
+
const content_hash = hashSource(source);
|
|
67
|
+
const versionLabel = shortHash(content_hash);
|
|
68
|
+
if (version !== undefined && version !== versionLabel) {
|
|
69
|
+
throw new VersionNotFoundError(name, version, "FilesystemSkillStore");
|
|
70
|
+
}
|
|
71
|
+
const meta = await this.buildMeta(name, source);
|
|
72
|
+
return {
|
|
73
|
+
name,
|
|
74
|
+
version: versionLabel,
|
|
75
|
+
content_hash,
|
|
76
|
+
source,
|
|
77
|
+
metadata: meta,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async query(filter) {
|
|
81
|
+
let entries;
|
|
82
|
+
try {
|
|
83
|
+
entries = await readdir(this.rootDir);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
if (err.code === "ENOENT")
|
|
87
|
+
return [];
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
90
|
+
const metas = [];
|
|
91
|
+
for (const entry of entries) {
|
|
92
|
+
// `.skill.md` is the source convention (committed, authored). The
|
|
93
|
+
// bare `.skill` extension is reserved for compiled artifacts emitted
|
|
94
|
+
// alongside `.skill.provenance.json` sidecars — derived, gitignored.
|
|
95
|
+
if (!entry.endsWith(".skill.md"))
|
|
96
|
+
continue;
|
|
97
|
+
const name = entry.slice(0, -".skill.md".length);
|
|
98
|
+
try {
|
|
99
|
+
const source = await readFile(join(this.rootDir, entry), "utf8");
|
|
100
|
+
metas.push(await this.buildMeta(name, source));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Unreadable file — skip.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
metas.sort((a, b) => a.name.localeCompare(b.name));
|
|
107
|
+
return applyFilter(metas, filter);
|
|
108
|
+
}
|
|
109
|
+
async metadata(name) {
|
|
110
|
+
let source;
|
|
111
|
+
try {
|
|
112
|
+
source = await readFile(this.pathFor(name), "utf8");
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
if (err.code === "ENOENT") {
|
|
116
|
+
throw new SkillNotFoundError(name, "FilesystemSkillStore");
|
|
117
|
+
}
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
return this.buildMeta(name, source);
|
|
121
|
+
}
|
|
122
|
+
async versions(name) {
|
|
123
|
+
const sidecar = this.versionsPathFor(name);
|
|
124
|
+
let lines;
|
|
125
|
+
try {
|
|
126
|
+
const body = await readFile(sidecar, "utf8");
|
|
127
|
+
lines = body.split("\n").filter((l) => l.trim() !== "");
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
if (err.code !== "ENOENT")
|
|
131
|
+
throw err;
|
|
132
|
+
// No sidecar — verify the skill file itself exists. If neither
|
|
133
|
+
// exists, it's a not-found. If the file exists but no sidecar,
|
|
134
|
+
// synthesize a single legacy entry from current state.
|
|
135
|
+
const meta = await this.metadata(name).catch((e) => {
|
|
136
|
+
if (e instanceof SkillNotFoundError)
|
|
137
|
+
throw e;
|
|
138
|
+
throw e;
|
|
139
|
+
});
|
|
140
|
+
const fileStat = await stat(this.pathFor(name));
|
|
141
|
+
return [{
|
|
142
|
+
name,
|
|
143
|
+
version: meta.version,
|
|
144
|
+
content_hash: meta.content_hash,
|
|
145
|
+
status: meta.status,
|
|
146
|
+
changed_at: Math.floor(fileStat.mtimeMs / 1000),
|
|
147
|
+
}];
|
|
148
|
+
}
|
|
149
|
+
const out = [];
|
|
150
|
+
for (const line of lines) {
|
|
151
|
+
try {
|
|
152
|
+
out.push(JSON.parse(line));
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Skip malformed; resilient to partial-write tear at append time.
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
async store(name, source, metadata) {
|
|
161
|
+
if (!/^[A-Za-z0-9][\w\-.]*$/.test(name)) {
|
|
162
|
+
throw new StorageConflictError(name, "name contains characters unsafe for filesystem path", "FilesystemSkillStore");
|
|
163
|
+
}
|
|
164
|
+
await mkdir(this.rootDir, { recursive: true });
|
|
165
|
+
const content_hash = hashSource(source);
|
|
166
|
+
const version = shortHash(content_hash);
|
|
167
|
+
const status = metadata?.status ?? extractStatus(source) ?? "Draft";
|
|
168
|
+
const nowSec = Math.floor(Date.now() / 1000);
|
|
169
|
+
await writeFile(this.pathFor(name), source, "utf8");
|
|
170
|
+
const info = {
|
|
171
|
+
name,
|
|
172
|
+
version,
|
|
173
|
+
content_hash,
|
|
174
|
+
status,
|
|
175
|
+
changed_at: nowSec,
|
|
176
|
+
...(metadata?.author !== undefined ? { changed_by: metadata.author } : {}),
|
|
177
|
+
};
|
|
178
|
+
await appendFile(this.versionsPathFor(name), JSON.stringify(info) + "\n", "utf8");
|
|
179
|
+
return info;
|
|
180
|
+
}
|
|
181
|
+
async delete(name) {
|
|
182
|
+
let removed = false;
|
|
183
|
+
for (const p of [this.pathFor(name), this.versionsPathFor(name)]) {
|
|
184
|
+
try {
|
|
185
|
+
await unlink(p);
|
|
186
|
+
removed = true;
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
if (err.code !== "ENOENT")
|
|
190
|
+
throw err;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (!removed) {
|
|
194
|
+
throw new SkillNotFoundError(name, "FilesystemSkillStore");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async update_status(name, status) {
|
|
198
|
+
const path = this.pathFor(name);
|
|
199
|
+
let source;
|
|
200
|
+
try {
|
|
201
|
+
source = await readFile(path, "utf8");
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
if (err.code === "ENOENT") {
|
|
205
|
+
throw new SkillNotFoundError(name, "FilesystemSkillStore");
|
|
206
|
+
}
|
|
207
|
+
throw err;
|
|
208
|
+
}
|
|
209
|
+
const previous_status = extractStatus(source) ?? "Draft";
|
|
210
|
+
const updated = rewriteStatusHeader(source, status);
|
|
211
|
+
await writeFile(path, updated, "utf8");
|
|
212
|
+
const content_hash = hashSource(updated);
|
|
213
|
+
const version = shortHash(content_hash);
|
|
214
|
+
const info = {
|
|
215
|
+
name,
|
|
216
|
+
version,
|
|
217
|
+
content_hash,
|
|
218
|
+
status,
|
|
219
|
+
previous_status,
|
|
220
|
+
changed_at: Math.floor(Date.now() / 1000),
|
|
221
|
+
};
|
|
222
|
+
await appendFile(this.versionsPathFor(name), JSON.stringify(info) + "\n", "utf8");
|
|
223
|
+
return info;
|
|
224
|
+
}
|
|
225
|
+
pathFor(name) {
|
|
226
|
+
return join(this.rootDir, `${name}.skill.md`);
|
|
227
|
+
}
|
|
228
|
+
versionsPathFor(name) {
|
|
229
|
+
return join(this.rootDir, `${name}.versions.jsonl`);
|
|
230
|
+
}
|
|
231
|
+
async buildMeta(name, source) {
|
|
232
|
+
const content_hash = hashSource(source);
|
|
233
|
+
const version = shortHash(content_hash);
|
|
234
|
+
const status = extractStatus(source) ?? "Draft";
|
|
235
|
+
const description = extractHeader(source, "Description");
|
|
236
|
+
const fileStat = await stat(this.pathFor(name)).catch(() => null);
|
|
237
|
+
const updated_at = fileStat ? Math.floor(fileStat.mtimeMs / 1000) : 0;
|
|
238
|
+
const meta = {
|
|
239
|
+
name,
|
|
240
|
+
version,
|
|
241
|
+
content_hash,
|
|
242
|
+
status,
|
|
243
|
+
created_at: updated_at,
|
|
244
|
+
updated_at,
|
|
245
|
+
};
|
|
246
|
+
if (description !== null)
|
|
247
|
+
meta.description = description;
|
|
248
|
+
return meta;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function hashSource(source) {
|
|
252
|
+
return createHash("sha256").update(source, "utf8").digest("hex");
|
|
253
|
+
}
|
|
254
|
+
function shortHash(content_hash) {
|
|
255
|
+
return content_hash.slice(0, 12);
|
|
256
|
+
}
|
|
257
|
+
function extractHeader(body, key) {
|
|
258
|
+
const re = new RegExp(`^#\\s*${key}\\s*:\\s*(.+?)\\s*$`, "m");
|
|
259
|
+
const m = re.exec(body);
|
|
260
|
+
return m ? m[1] : null;
|
|
261
|
+
}
|
|
262
|
+
function extractStatus(source) {
|
|
263
|
+
const raw = extractHeader(source, "Status");
|
|
264
|
+
if (raw === null)
|
|
265
|
+
return null;
|
|
266
|
+
const lower = raw.toLowerCase();
|
|
267
|
+
if (lower === "draft")
|
|
268
|
+
return "Draft";
|
|
269
|
+
if (lower === "approved")
|
|
270
|
+
return "Approved";
|
|
271
|
+
if (lower === "disabled")
|
|
272
|
+
return "Disabled";
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Rewrite or insert the `# Status:` header. If absent, inserts after the
|
|
277
|
+
* `# Skill:` line (or at the top of the file as a fallback).
|
|
278
|
+
*/
|
|
279
|
+
function rewriteStatusHeader(source, status) {
|
|
280
|
+
const re = /^#\s*Status\s*:\s*.+?\s*$/m;
|
|
281
|
+
if (re.test(source)) {
|
|
282
|
+
return source.replace(re, `# Status: ${status}`);
|
|
283
|
+
}
|
|
284
|
+
const skillLineRe = /^(#\s*Skill\s*:\s*.+?)\s*$/m;
|
|
285
|
+
if (skillLineRe.test(source)) {
|
|
286
|
+
return source.replace(skillLineRe, `$1\n# Status: ${status}`);
|
|
287
|
+
}
|
|
288
|
+
return `# Status: ${status}\n${source}`;
|
|
289
|
+
}
|
|
290
|
+
function applyFilter(metas, filter) {
|
|
291
|
+
if (filter === undefined)
|
|
292
|
+
return metas;
|
|
293
|
+
let out = metas;
|
|
294
|
+
if (filter.status !== undefined) {
|
|
295
|
+
const wanted = Array.isArray(filter.status) ? filter.status : [filter.status];
|
|
296
|
+
out = out.filter((m) => wanted.includes(m.status));
|
|
297
|
+
}
|
|
298
|
+
if (filter.name_pattern !== undefined) {
|
|
299
|
+
const pat = new RegExp(filter.name_pattern);
|
|
300
|
+
out = out.filter((m) => pat.test(m.name));
|
|
301
|
+
}
|
|
302
|
+
if (filter.since !== undefined) {
|
|
303
|
+
const since = filter.since;
|
|
304
|
+
out = out.filter((m) => m.updated_at >= since);
|
|
305
|
+
}
|
|
306
|
+
if (filter.offset !== undefined) {
|
|
307
|
+
out = out.slice(filter.offset);
|
|
308
|
+
}
|
|
309
|
+
if (filter.limit !== undefined) {
|
|
310
|
+
out = out.slice(0, filter.limit);
|
|
311
|
+
}
|
|
312
|
+
return out;
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=skill-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-store.js","sourceRoot":"","sources":["../../src/connectors/skill-store.ts"],"names":[],"mappings":"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"}
|