skillscript-runtime 0.7.3 → 0.9.5
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/dist/approval.d.ts +99 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +224 -0
- package/dist/approval.js.map +1 -0
- package/dist/bootstrap.d.ts +21 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +25 -6
- package/dist/bootstrap.js.map +1 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +25 -1
- package/dist/compile.js.map +1 -1
- package/dist/composition.d.ts +29 -0
- package/dist/composition.d.ts.map +1 -1
- package/dist/composition.js +52 -1
- package/dist/composition.js.map +1 -1
- package/dist/connectors/agent-noop.d.ts +1 -1
- package/dist/connectors/agent-noop.js +1 -1
- package/dist/connectors/agent.d.ts +1 -1
- package/dist/connectors/agent.js +1 -1
- package/dist/connectors/agent.js.map +1 -1
- package/dist/connectors/local-model-mcp.d.ts +8 -0
- package/dist/connectors/local-model-mcp.d.ts.map +1 -1
- package/dist/connectors/local-model-mcp.js +10 -0
- package/dist/connectors/local-model-mcp.js.map +1 -1
- package/dist/connectors/memory-store-mcp.d.ts +12 -1
- package/dist/connectors/memory-store-mcp.d.ts.map +1 -1
- package/dist/connectors/memory-store-mcp.js +46 -1
- package/dist/connectors/memory-store-mcp.js.map +1 -1
- package/dist/connectors/memory-store.d.ts +9 -1
- package/dist/connectors/memory-store.d.ts.map +1 -1
- package/dist/connectors/memory-store.js +33 -0
- package/dist/connectors/memory-store.js.map +1 -1
- package/dist/connectors/registry.d.ts +8 -1
- package/dist/connectors/registry.d.ts.map +1 -1
- package/dist/connectors/registry.js +10 -1
- package/dist/connectors/registry.js.map +1 -1
- package/dist/connectors/skill-store.d.ts.map +1 -1
- package/dist/connectors/skill-store.js +43 -13
- package/dist/connectors/skill-store.js.map +1 -1
- package/dist/connectors/types.d.ts +43 -0
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/connectors/types.js.map +1 -1
- package/dist/dashboard/spa/app.js +37 -9
- package/dist/dispatch-validate.d.ts +64 -0
- package/dist/dispatch-validate.d.ts.map +1 -0
- package/dist/dispatch-validate.js +81 -0
- package/dist/dispatch-validate.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -1
- package/dist/help-content.d.ts.map +1 -1
- package/dist/help-content.js +95 -18
- package/dist/help-content.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lint.d.ts +14 -0
- package/dist/lint.d.ts.map +1 -1
- package/dist/lint.js +591 -98
- package/dist/lint.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +53 -11
- package/dist/mcp-server.js.map +1 -1
- package/dist/parser.d.ts +30 -3
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +143 -8
- package/dist/parser.js.map +1 -1
- package/dist/runtime.d.ts +32 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +128 -26
- package/dist/runtime.js.map +1 -1
- package/dist/scheduler.d.ts +20 -1
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +34 -1
- package/dist/scheduler.js.map +1 -1
- package/examples/classify-support-ticket.skill.md +2 -2
- package/examples/cut-release-tag.skill.md +1 -1
- package/examples/doc-qa-with-citations.skill.md +1 -1
- package/examples/feedback-sentiment-scan.skill.md +2 -2
- package/examples/hello.skill.provenance.json +1 -1
- package/examples/morning-brief.skill.md +3 -3
- package/examples/onboarding-scaffold/file-memory-store.ts +32 -1
- package/examples/queue-length-monitor.skill.md +1 -1
- package/examples/service-health-watch.skill.md +1 -1
- package/examples/youtrack-morning-sweep.skill.md +1 -1
- package/package.json +1 -1
- package/scaffold/examples/hello.skill.md +3 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v0.9.0 — skill-approval mechanism.
|
|
3
|
+
*
|
|
4
|
+
* Canonical model (per thread 29b6208e):
|
|
5
|
+
* - Draft : authored, lint+compile+view ok, cannot execute
|
|
6
|
+
* - Approved + valid hash-token : can execute (manual / trigger / composition)
|
|
7
|
+
*
|
|
8
|
+
* Approval token = `vN:<hex>` where N picks the hash function:
|
|
9
|
+
* v0 — reserved, rejected (naked "Approved" fails fast)
|
|
10
|
+
* v1 — CRC32 (bundled default; discipline-barrier strength)
|
|
11
|
+
* v2 — reserved for HMAC-SHA256
|
|
12
|
+
* v3 — reserved for Ed25519 signature
|
|
13
|
+
* adopter-extensible past v3 via `registerApprovalFn`
|
|
14
|
+
*
|
|
15
|
+
* Token is computed over the body *excluding* the `# Status:` line, so
|
|
16
|
+
* stamping the token doesn't perturb its own input.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Set the version used by `stampApprovalToken(body)` when no explicit
|
|
20
|
+
* version is passed. Adopter bootstraps that register `v2` HMAC (or
|
|
21
|
+
* stronger) call this to make the dashboard's approval flow stamp with
|
|
22
|
+
* the upgraded function. Default stays `v1` (bundled CRC32).
|
|
23
|
+
*/
|
|
24
|
+
export declare function setPreferredApprovalVersion(version: string): void;
|
|
25
|
+
export declare function getPreferredApprovalVersion(): string;
|
|
26
|
+
export interface ApprovalToken {
|
|
27
|
+
version: string;
|
|
28
|
+
token: string;
|
|
29
|
+
}
|
|
30
|
+
export type ApprovalVerification = {
|
|
31
|
+
ok: true;
|
|
32
|
+
token: ApprovalToken;
|
|
33
|
+
} | {
|
|
34
|
+
ok: false;
|
|
35
|
+
reason: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Register an approval function for a version slot. Adopter-extension API;
|
|
39
|
+
* intended for substituting cryptographic strength (HMAC, Ed25519) without
|
|
40
|
+
* touching language internals. `v0` is reserved and cannot be registered.
|
|
41
|
+
*/
|
|
42
|
+
export declare function registerApprovalFn(version: string, fn: (body: string) => string): void;
|
|
43
|
+
export declare function getApprovalFn(version: string): ((body: string) => string) | null;
|
|
44
|
+
export declare function registeredApprovalVersions(): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Strip the `# Status:` header line from a skill body. The hash input is the
|
|
47
|
+
* body MINUS this line — renaming or re-versioning a skill doesn't invalidate
|
|
48
|
+
* approval, only body edits do. Per spec point 3 in 29b6208e.
|
|
49
|
+
*/
|
|
50
|
+
export declare function stripStatusLineForHashing(body: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Parse a token string of the form `vN:<token>` into its parts. Returns
|
|
53
|
+
* null on shape mismatch — caller surfaces a clear error to the operator.
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseApprovalToken(raw: string): ApprovalToken | null;
|
|
56
|
+
/**
|
|
57
|
+
* Compute the canonical approval token for a body at a given version. The
|
|
58
|
+
* dashboard calls this when stamping `# Status: Approved <token>`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function computeApprovalToken(body: string, version?: string): ApprovalToken;
|
|
61
|
+
/**
|
|
62
|
+
* Verify a stored token against the current body. Called by runtime at every
|
|
63
|
+
* execution entry point. A mismatch means the body was edited since approval,
|
|
64
|
+
* so the human-approval gate must run again.
|
|
65
|
+
*/
|
|
66
|
+
export declare function verifyApprovalToken(body: string, rawToken: string): ApprovalVerification;
|
|
67
|
+
/**
|
|
68
|
+
* Extract the status + (optional) approval token from a skill body's
|
|
69
|
+
* `# Status:` header. Mirrors the parser's split-on-whitespace logic so
|
|
70
|
+
* SkillStore can read status without re-parsing the whole skill.
|
|
71
|
+
*
|
|
72
|
+
* Returns:
|
|
73
|
+
* - `null` if no `# Status:` header is present or the value is unparseable
|
|
74
|
+
* - `{ status, approvalToken: null }` for Draft/Disabled or naked Approved
|
|
75
|
+
* - `{ status: "Approved", approvalToken: "vN:..." }` when stamped
|
|
76
|
+
*/
|
|
77
|
+
export declare function extractStatusFromBody(body: string): {
|
|
78
|
+
status: "Draft" | "Approved" | "Disabled";
|
|
79
|
+
approvalToken: string | null;
|
|
80
|
+
} | null;
|
|
81
|
+
/**
|
|
82
|
+
* Universal execution-time gate. Called at every dispatch entry point
|
|
83
|
+
* (scheduler.dispatchSkill, MCP execute_skill handler, in-skill
|
|
84
|
+
* `$ execute_skill` op, compile-time `&` data-skill inline). Returns ok
|
|
85
|
+
* iff status is Approved AND the body's stamped token re-computes correctly.
|
|
86
|
+
*
|
|
87
|
+
* v0.9.0 — supersedes the v0.8.x "status === Approved" check; that check
|
|
88
|
+
* remains the first gate, but a stamped + verified token is now required.
|
|
89
|
+
*/
|
|
90
|
+
export declare function evaluateApprovalGate(body: string): ApprovalVerification;
|
|
91
|
+
/**
|
|
92
|
+
* Stamp `# Status: Approved <token>` into a skill body. Called by the
|
|
93
|
+
* dashboard's approval flow + by test helpers that need to produce a
|
|
94
|
+
* runnable fixture body programmatically. The function recomputes the
|
|
95
|
+
* token over the body MINUS its `# Status:` line so the stamp is
|
|
96
|
+
* idempotent regardless of the body's current header state.
|
|
97
|
+
*/
|
|
98
|
+
export declare function stampApprovalToken(body: string, version?: string): string;
|
|
99
|
+
//# sourceMappingURL=approval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAUjE;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAClC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAQtF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAEhF;AAED,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAIpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAa,GAAG,aAAa,CAWxF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,oBAAoB,CA0BxF;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAatI;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAkBvE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAWzE"}
|
package/dist/approval.js
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v0.9.0 — skill-approval mechanism.
|
|
3
|
+
*
|
|
4
|
+
* Canonical model (per thread 29b6208e):
|
|
5
|
+
* - Draft : authored, lint+compile+view ok, cannot execute
|
|
6
|
+
* - Approved + valid hash-token : can execute (manual / trigger / composition)
|
|
7
|
+
*
|
|
8
|
+
* Approval token = `vN:<hex>` where N picks the hash function:
|
|
9
|
+
* v0 — reserved, rejected (naked "Approved" fails fast)
|
|
10
|
+
* v1 — CRC32 (bundled default; discipline-barrier strength)
|
|
11
|
+
* v2 — reserved for HMAC-SHA256
|
|
12
|
+
* v3 — reserved for Ed25519 signature
|
|
13
|
+
* adopter-extensible past v3 via `registerApprovalFn`
|
|
14
|
+
*
|
|
15
|
+
* Token is computed over the body *excluding* the `# Status:` line, so
|
|
16
|
+
* stamping the token doesn't perturb its own input.
|
|
17
|
+
*/
|
|
18
|
+
const APPROVAL_FNS = new Map();
|
|
19
|
+
let PREFERRED_VERSION = "v1";
|
|
20
|
+
/**
|
|
21
|
+
* Set the version used by `stampApprovalToken(body)` when no explicit
|
|
22
|
+
* version is passed. Adopter bootstraps that register `v2` HMAC (or
|
|
23
|
+
* stronger) call this to make the dashboard's approval flow stamp with
|
|
24
|
+
* the upgraded function. Default stays `v1` (bundled CRC32).
|
|
25
|
+
*/
|
|
26
|
+
export function setPreferredApprovalVersion(version) {
|
|
27
|
+
if (version === "v0") {
|
|
28
|
+
throw new Error(`approval version 'v0' is reserved`);
|
|
29
|
+
}
|
|
30
|
+
if (!APPROVAL_FNS.has(version)) {
|
|
31
|
+
throw new Error(`approval version '${version}' is not registered; call registerApprovalFn first`);
|
|
32
|
+
}
|
|
33
|
+
PREFERRED_VERSION = version;
|
|
34
|
+
}
|
|
35
|
+
export function getPreferredApprovalVersion() {
|
|
36
|
+
return PREFERRED_VERSION;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Register an approval function for a version slot. Adopter-extension API;
|
|
40
|
+
* intended for substituting cryptographic strength (HMAC, Ed25519) without
|
|
41
|
+
* touching language internals. `v0` is reserved and cannot be registered.
|
|
42
|
+
*/
|
|
43
|
+
export function registerApprovalFn(version, fn) {
|
|
44
|
+
if (version === "v0") {
|
|
45
|
+
throw new Error(`approval version 'v0' is reserved and cannot be registered`);
|
|
46
|
+
}
|
|
47
|
+
if (!/^v\d+$/.test(version)) {
|
|
48
|
+
throw new Error(`approval version must match /^v\\d+$/ (got '${version}')`);
|
|
49
|
+
}
|
|
50
|
+
APPROVAL_FNS.set(version, fn);
|
|
51
|
+
}
|
|
52
|
+
export function getApprovalFn(version) {
|
|
53
|
+
return APPROVAL_FNS.get(version) ?? null;
|
|
54
|
+
}
|
|
55
|
+
export function registeredApprovalVersions() {
|
|
56
|
+
return [...APPROVAL_FNS.keys()].sort();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Strip the `# Status:` header line from a skill body. The hash input is the
|
|
60
|
+
* body MINUS this line — renaming or re-versioning a skill doesn't invalidate
|
|
61
|
+
* approval, only body edits do. Per spec point 3 in 29b6208e.
|
|
62
|
+
*/
|
|
63
|
+
export function stripStatusLineForHashing(body) {
|
|
64
|
+
return body
|
|
65
|
+
.split("\n")
|
|
66
|
+
.filter((line) => !/^\s*#\s*Status\s*:/i.test(line))
|
|
67
|
+
.join("\n");
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parse a token string of the form `vN:<token>` into its parts. Returns
|
|
71
|
+
* null on shape mismatch — caller surfaces a clear error to the operator.
|
|
72
|
+
*/
|
|
73
|
+
export function parseApprovalToken(raw) {
|
|
74
|
+
const m = /^(v\d+):([A-Za-z0-9_-]+)$/.exec(raw.trim());
|
|
75
|
+
if (!m || m[1] === undefined || m[2] === undefined)
|
|
76
|
+
return null;
|
|
77
|
+
return { version: m[1], token: m[2] };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Compute the canonical approval token for a body at a given version. The
|
|
81
|
+
* dashboard calls this when stamping `# Status: Approved <token>`.
|
|
82
|
+
*/
|
|
83
|
+
export function computeApprovalToken(body, version = "v1") {
|
|
84
|
+
if (version === "v0") {
|
|
85
|
+
throw new Error(`approval version 'v0' is reserved`);
|
|
86
|
+
}
|
|
87
|
+
const fn = APPROVAL_FNS.get(version);
|
|
88
|
+
if (!fn) {
|
|
89
|
+
throw new Error(`approval version '${version}' is not registered (available: ${registeredApprovalVersions().join(", ") || "none"})`);
|
|
90
|
+
}
|
|
91
|
+
return { version, token: fn(stripStatusLineForHashing(body)) };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Verify a stored token against the current body. Called by runtime at every
|
|
95
|
+
* execution entry point. A mismatch means the body was edited since approval,
|
|
96
|
+
* so the human-approval gate must run again.
|
|
97
|
+
*/
|
|
98
|
+
export function verifyApprovalToken(body, rawToken) {
|
|
99
|
+
const parsed = parseApprovalToken(rawToken);
|
|
100
|
+
if (!parsed) {
|
|
101
|
+
return {
|
|
102
|
+
ok: false,
|
|
103
|
+
reason: `approval token has invalid shape — expected 'vN:<token>', got '${rawToken}'`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (parsed.version === "v0") {
|
|
107
|
+
return { ok: false, reason: `approval version 'v0' is reserved` };
|
|
108
|
+
}
|
|
109
|
+
const fn = APPROVAL_FNS.get(parsed.version);
|
|
110
|
+
if (!fn) {
|
|
111
|
+
return {
|
|
112
|
+
ok: false,
|
|
113
|
+
reason: `approval version '${parsed.version}' is not registered (available: ${registeredApprovalVersions().join(", ") || "none"})`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const expected = fn(stripStatusLineForHashing(body));
|
|
117
|
+
if (expected !== parsed.token) {
|
|
118
|
+
return {
|
|
119
|
+
ok: false,
|
|
120
|
+
reason: `approval token mismatch — skill body has been edited since approval; re-approve via dashboard`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return { ok: true, token: parsed };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Extract the status + (optional) approval token from a skill body's
|
|
127
|
+
* `# Status:` header. Mirrors the parser's split-on-whitespace logic so
|
|
128
|
+
* SkillStore can read status without re-parsing the whole skill.
|
|
129
|
+
*
|
|
130
|
+
* Returns:
|
|
131
|
+
* - `null` if no `# Status:` header is present or the value is unparseable
|
|
132
|
+
* - `{ status, approvalToken: null }` for Draft/Disabled or naked Approved
|
|
133
|
+
* - `{ status: "Approved", approvalToken: "vN:..." }` when stamped
|
|
134
|
+
*/
|
|
135
|
+
export function extractStatusFromBody(body) {
|
|
136
|
+
const m = /^\s*#\s*Status\s*:\s*(.+?)\s*$/m.exec(body);
|
|
137
|
+
if (!m)
|
|
138
|
+
return null;
|
|
139
|
+
const raw = (m[1] ?? "").trim();
|
|
140
|
+
const parts = raw.split(/\s+/);
|
|
141
|
+
const statusRaw = (parts[0] ?? "").toLowerCase();
|
|
142
|
+
const tokenRaw = parts.slice(1).join(" ").trim();
|
|
143
|
+
let status;
|
|
144
|
+
if (statusRaw === "draft")
|
|
145
|
+
status = "Draft";
|
|
146
|
+
else if (statusRaw === "approved")
|
|
147
|
+
status = "Approved";
|
|
148
|
+
else if (statusRaw === "disabled")
|
|
149
|
+
status = "Disabled";
|
|
150
|
+
else
|
|
151
|
+
return null;
|
|
152
|
+
return { status, approvalToken: tokenRaw.length > 0 ? tokenRaw : null };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Universal execution-time gate. Called at every dispatch entry point
|
|
156
|
+
* (scheduler.dispatchSkill, MCP execute_skill handler, in-skill
|
|
157
|
+
* `$ execute_skill` op, compile-time `&` data-skill inline). Returns ok
|
|
158
|
+
* iff status is Approved AND the body's stamped token re-computes correctly.
|
|
159
|
+
*
|
|
160
|
+
* v0.9.0 — supersedes the v0.8.x "status === Approved" check; that check
|
|
161
|
+
* remains the first gate, but a stamped + verified token is now required.
|
|
162
|
+
*/
|
|
163
|
+
export function evaluateApprovalGate(body) {
|
|
164
|
+
const extracted = extractStatusFromBody(body);
|
|
165
|
+
if (extracted === null) {
|
|
166
|
+
return { ok: false, reason: `skill has no \`# Status:\` header — defaults to Draft, execution refused` };
|
|
167
|
+
}
|
|
168
|
+
if (extracted.status === "Disabled") {
|
|
169
|
+
return { ok: false, reason: `skill status is 'Disabled' — execution refused` };
|
|
170
|
+
}
|
|
171
|
+
if (extracted.status === "Draft") {
|
|
172
|
+
return { ok: false, reason: `skill status is 'Draft' — approve via dashboard before executing` };
|
|
173
|
+
}
|
|
174
|
+
if (extracted.approvalToken === null) {
|
|
175
|
+
return {
|
|
176
|
+
ok: false,
|
|
177
|
+
reason: `skill is Approved but missing approval token — re-approve via dashboard to stamp '# Status: Approved v1:<token>'`,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return verifyApprovalToken(body, extracted.approvalToken);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Stamp `# Status: Approved <token>` into a skill body. Called by the
|
|
184
|
+
* dashboard's approval flow + by test helpers that need to produce a
|
|
185
|
+
* runnable fixture body programmatically. The function recomputes the
|
|
186
|
+
* token over the body MINUS its `# Status:` line so the stamp is
|
|
187
|
+
* idempotent regardless of the body's current header state.
|
|
188
|
+
*/
|
|
189
|
+
export function stampApprovalToken(body, version) {
|
|
190
|
+
const v = version ?? PREFERRED_VERSION;
|
|
191
|
+
const token = computeApprovalToken(body, v);
|
|
192
|
+
const line = `# Status: Approved ${token.version}:${token.token}`;
|
|
193
|
+
if (/^\s*#\s*Status\s*:/m.test(body)) {
|
|
194
|
+
return body.replace(/^\s*#\s*Status\s*:.*$/m, line);
|
|
195
|
+
}
|
|
196
|
+
if (/^#\s*Skill\s*:/m.test(body)) {
|
|
197
|
+
return body.replace(/^(#\s*Skill\s*:.*?)$/m, `$1\n${line}`);
|
|
198
|
+
}
|
|
199
|
+
return `${line}\n${body}`;
|
|
200
|
+
}
|
|
201
|
+
// ─── v1: CRC32 reference impl ─────────────────────────────────────────────────
|
|
202
|
+
const CRC32_TABLE = (() => {
|
|
203
|
+
const table = new Array(256);
|
|
204
|
+
for (let i = 0; i < 256; i++) {
|
|
205
|
+
let c = i;
|
|
206
|
+
for (let k = 0; k < 8; k++) {
|
|
207
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
208
|
+
}
|
|
209
|
+
table[i] = c >>> 0;
|
|
210
|
+
}
|
|
211
|
+
return table;
|
|
212
|
+
})();
|
|
213
|
+
function crc32Utf8(input) {
|
|
214
|
+
const bytes = new TextEncoder().encode(input);
|
|
215
|
+
let crc = 0xffffffff;
|
|
216
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
217
|
+
const idx = (crc ^ (bytes[i] ?? 0)) & 0xff;
|
|
218
|
+
crc = (CRC32_TABLE[idx] ?? 0) ^ (crc >>> 8);
|
|
219
|
+
}
|
|
220
|
+
crc = (crc ^ 0xffffffff) >>> 0;
|
|
221
|
+
return crc.toString(16).padStart(8, "0");
|
|
222
|
+
}
|
|
223
|
+
registerApprovalFn("v1", crc32Utf8);
|
|
224
|
+
//# sourceMappingURL=approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"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"}
|
package/dist/bootstrap.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Registry } from "./connectors/registry.js";
|
|
2
2
|
import { FilesystemSkillStore } from "./connectors/skill-store.js";
|
|
3
3
|
import { FilesystemTraceStore } from "./trace.js";
|
|
4
|
-
import { Scheduler } from "./scheduler.js";
|
|
4
|
+
import { Scheduler, type TriggerRegistration } from "./scheduler.js";
|
|
5
5
|
import type { TraceConfig } from "./trace.js";
|
|
6
6
|
import { McpServer } from "./mcp-server.js";
|
|
7
7
|
export interface BootstrapOpts {
|
|
@@ -93,6 +93,26 @@ export declare function defaultRegistry(opts: DefaultRegistryOpts): {
|
|
|
93
93
|
* `result.mcpServer`.
|
|
94
94
|
*/
|
|
95
95
|
export declare function bootstrap(opts: BootstrapOpts): BootstrapResult;
|
|
96
|
+
/**
|
|
97
|
+
* Read `triggers.json` (if present) and re-register each imperative trigger
|
|
98
|
+
* into the scheduler with its persisted id. Prunes expired rows during the
|
|
99
|
+
* load. Re-writes the file with the pruned set so future hydrations don't
|
|
100
|
+
* re-scan dead entries.
|
|
101
|
+
*/
|
|
102
|
+
/**
|
|
103
|
+
* Hydrate persisted triggers from `triggers.json` into a scheduler. Exported
|
|
104
|
+
* as a public surface for adopter bootstraps that wire their own scheduler
|
|
105
|
+
* but want the same on-disk format. v0.9.0.
|
|
106
|
+
*/
|
|
107
|
+
export declare function hydratePersistedTriggers(scheduler: Scheduler, path: string, log?: (msg: string) => void): {
|
|
108
|
+
loaded: number;
|
|
109
|
+
pruned: number;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Serialize the scheduler's imperative-trigger set to disk atomically.
|
|
113
|
+
* Exported as a public surface for adopter bootstraps; v0.9.0.
|
|
114
|
+
*/
|
|
115
|
+
export declare function writePersistedTriggers(path: string, triggers: ReadonlyArray<TriggerRegistration>): void;
|
|
96
116
|
/**
|
|
97
117
|
* Walk the SkillStore for Approved skills with declared `# Triggers:`
|
|
98
118
|
* headers and register each into the scheduler. Returns the number of
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAMnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAMnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,SAAS,EAAgC,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kFAAkF;IAClF,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAC7B;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,oBAAoB,CAAC;IACjC,UAAU,EAAE,oBAAoB,CAAC;IACjC,qEAAqE;IACrE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sEAAsE;IACtE,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAC5B,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,gHAAgH;IAChH,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;AAuCD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,oBAAoB,CAAA;CAAE,CAkCnH;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe,CAqF9D;AAED;;;;;GAKG;AACH;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAA4D,GACjF;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAkDpC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,CAAC,mBAAmB,CAAC,GAC3C,IAAI,CAqBN;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,YAAY,CAAC,EACzD,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAA4D,GACjF,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAkClD"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -61,7 +61,12 @@ export function defaultRegistry(opts) {
|
|
|
61
61
|
registry.registerMcpConnector("llm", new LocalModelMcpConnector(defaultLocalModel));
|
|
62
62
|
const memoryStore = registry.listMemoryStores().find((e) => e.name === "primary");
|
|
63
63
|
if (memoryStore !== undefined) {
|
|
64
|
-
|
|
64
|
+
// v0.8.0 — register the SAME bridge instance under both names so
|
|
65
|
+
// bare-form `$ memory mode=fts ...` and `$ memory_write content=...`
|
|
66
|
+
// both route to it. The bridge dispatches on toolName internally.
|
|
67
|
+
const bridge = new MemoryStoreMcpConnector(memoryStore.instance);
|
|
68
|
+
registry.registerMcpConnector("memory", bridge);
|
|
69
|
+
registry.registerMcpConnector("memory_write", bridge);
|
|
65
70
|
}
|
|
66
71
|
return { registry, skillStore };
|
|
67
72
|
}
|
|
@@ -167,7 +172,12 @@ export function bootstrap(opts) {
|
|
|
167
172
|
* load. Re-writes the file with the pruned set so future hydrations don't
|
|
168
173
|
* re-scan dead entries.
|
|
169
174
|
*/
|
|
170
|
-
|
|
175
|
+
/**
|
|
176
|
+
* Hydrate persisted triggers from `triggers.json` into a scheduler. Exported
|
|
177
|
+
* as a public surface for adopter bootstraps that wire their own scheduler
|
|
178
|
+
* but want the same on-disk format. v0.9.0.
|
|
179
|
+
*/
|
|
180
|
+
export function hydratePersistedTriggers(scheduler, path, log = (msg) => process.stderr.write(`[bootstrap] ${msg}\n`)) {
|
|
171
181
|
if (!existsSync(path))
|
|
172
182
|
return { loaded: 0, pruned: 0 };
|
|
173
183
|
let parsed;
|
|
@@ -178,7 +188,7 @@ function hydratePersistedTriggers(scheduler, path, log = (msg) => process.stderr
|
|
|
178
188
|
log(`triggers.json parse failed at '${path}': ${err.message}; ignoring file`);
|
|
179
189
|
return { loaded: 0, pruned: 0 };
|
|
180
190
|
}
|
|
181
|
-
if (parsed.schema_version !== 1 || !Array.isArray(parsed.triggers)) {
|
|
191
|
+
if ((parsed.schema_version !== 1 && parsed.schema_version !== 2) || !Array.isArray(parsed.triggers)) {
|
|
182
192
|
log(`triggers.json at '${path}' has unsupported shape (schema_version=${parsed.schema_version}); ignoring`);
|
|
183
193
|
return { loaded: 0, pruned: 0 };
|
|
184
194
|
}
|
|
@@ -202,6 +212,8 @@ function hydratePersistedTriggers(scheduler, path, log = (msg) => process.stderr
|
|
|
202
212
|
name: t.name,
|
|
203
213
|
declarative: false,
|
|
204
214
|
registeredAt: t.registered_at,
|
|
215
|
+
// v0.9.0 — schema-v2 round-trips `enabled`; v1 records default to true.
|
|
216
|
+
enabled: "enabled" in t ? t.enabled : true,
|
|
205
217
|
...(t.expires_at !== null ? { expiresAt: t.expires_at } : {}),
|
|
206
218
|
}, { seedFromPersistence: true });
|
|
207
219
|
loaded++;
|
|
@@ -216,14 +228,20 @@ function hydratePersistedTriggers(scheduler, path, log = (msg) => process.stderr
|
|
|
216
228
|
}
|
|
217
229
|
return { loaded, pruned };
|
|
218
230
|
}
|
|
219
|
-
/**
|
|
220
|
-
|
|
231
|
+
/**
|
|
232
|
+
* Serialize the scheduler's imperative-trigger set to disk atomically.
|
|
233
|
+
* Exported as a public surface for adopter bootstraps; v0.9.0.
|
|
234
|
+
*/
|
|
235
|
+
export function writePersistedTriggers(path, triggers) {
|
|
221
236
|
const dir = dirname(path);
|
|
222
237
|
if (!existsSync(dir))
|
|
223
238
|
mkdirSync(dir, { recursive: true });
|
|
224
239
|
const imperative = triggers.filter((t) => !t.declarative);
|
|
240
|
+
// v0.9.0 — always write schema_version 2 with `enabled` field. Older
|
|
241
|
+
// runtimes loading a v2 file will reject (schema_version mismatch) — no
|
|
242
|
+
// installed base to worry about pre-1.0; matches pre-adoption-rule.
|
|
225
243
|
const payload = {
|
|
226
|
-
schema_version:
|
|
244
|
+
schema_version: 2,
|
|
227
245
|
triggers: imperative.map((t) => ({
|
|
228
246
|
id: t.id,
|
|
229
247
|
skill_name: t.skillName,
|
|
@@ -231,6 +249,7 @@ function writePersistedTriggers(path, triggers) {
|
|
|
231
249
|
name: t.name,
|
|
232
250
|
declarative: false,
|
|
233
251
|
registered_at: t.registeredAt,
|
|
252
|
+
enabled: t.enabled,
|
|
234
253
|
expires_at: t.expiresAt ?? null,
|
|
235
254
|
})),
|
|
236
255
|
};
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,gEAAgE;AAChE,oEAAoE;AACpE,wEAAwE;AACxE,6BAA6B;AAC7B,EAAE;AACF,0EAA0E;AAC1E,sEAAsE;AACtE,2EAA2E;AAC3E,iFAAiF;AACjF,4EAA4E;AAC5E,qFAAqF;AACrF,2EAA2E;AAC3E,0EAA0E;AAC1E,uEAAuE;AACvE,mCAAmC;AACnC,EAAE;AACF,2EAA2E;AAC3E,gEAAgE;AAEhE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,SAAS,EAA0D,MAAM,gBAAgB,CAAC;AAEnG,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
package/dist/compile.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAC;AAKzB;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9C,yEAAyE;AACzE,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5F,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,iIAAiI;IACjI,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,4HAA4H;IAC5H,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,wJAAwJ;IACxJ,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,0BAA0B,EAAE,QAAQ,CAAC;CACxD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,6GAA6G;IAC7G,iBAAiB,EAAE,mBAAmB,EAAE,CAAC;IACzC;;;;;OAKG;IACH,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sDAAsD;IACtD,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAsMxB;AAqKD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBnF"}
|
package/dist/compile.js
CHANGED
|
@@ -2,7 +2,8 @@ import { parse, } from "./parser.js";
|
|
|
2
2
|
import { applyFilter } from "./filters.js";
|
|
3
3
|
import { buildProvenance, renderInlineProvenance, } from "./provenance.js";
|
|
4
4
|
import { lint } from "./lint.js";
|
|
5
|
-
import { LintFailureError } from "./errors.js";
|
|
5
|
+
import { LintFailureError, ApprovalRejectedError } from "./errors.js";
|
|
6
|
+
import { evaluateApprovalGate } from "./approval.js";
|
|
6
7
|
/**
|
|
7
8
|
* Compile a skill source string. The high-level entrypoint embedders use.
|
|
8
9
|
* Throws on hard errors (parse errors, missing entry target, dep cycle,
|
|
@@ -238,6 +239,13 @@ async function inlineOps(ops, store, inlinedRecord, chain) {
|
|
|
238
239
|
}
|
|
239
240
|
const refParsed = parse(source.source);
|
|
240
241
|
if (refParsed.type === "data") {
|
|
242
|
+
// v0.9.0 — referenced data skills inline as part of the host body
|
|
243
|
+
// but aren't covered by the host's hash token. Verify each data
|
|
244
|
+
// skill stands on its own approval before splatting its content.
|
|
245
|
+
const gate = evaluateApprovalGate(source.source);
|
|
246
|
+
if (!gate.ok) {
|
|
247
|
+
throw new ApprovalRejectedError(refName, gate.reason, "inlineDataSkills");
|
|
248
|
+
}
|
|
241
249
|
inlinedRecord.push({
|
|
242
250
|
name: refName,
|
|
243
251
|
version: source.version,
|
|
@@ -473,6 +481,15 @@ function renderOpPrompt(op, targetName, resolved, prefix = "") {
|
|
|
473
481
|
const contentPreview = (p.content ?? "").length > 40 ? (p.content ?? "").slice(0, 40) + "..." : (p.content ?? "");
|
|
474
482
|
return [`${prefix}- Write file: ${pathSub} (${(p.content ?? "").length} chars) — content: ${contentPreview}`];
|
|
475
483
|
}
|
|
484
|
+
case "notify": {
|
|
485
|
+
const p = op.notifyParams;
|
|
486
|
+
const agentSub = substitute(p.agent, resolved);
|
|
487
|
+
const messageTail = p.message !== undefined
|
|
488
|
+
? ` with message="${substitute(p.message, resolved).slice(0, 40)}${(p.message ?? "").length > 40 ? "..." : ""}"`
|
|
489
|
+
: " (uses joined emissions)";
|
|
490
|
+
const connectorsTail = p.connectors !== undefined ? ` via [${p.connectors.join(", ")}]` : "";
|
|
491
|
+
return [`${prefix}- Notify agent: ${agentSub}${messageTail}${connectorsTail} — bind ACK to $(${op.outputVar ?? `${targetName}.output`})`];
|
|
492
|
+
}
|
|
476
493
|
}
|
|
477
494
|
}
|
|
478
495
|
function renderPrompt(parsed, resolved, order) {
|
|
@@ -580,6 +597,13 @@ function renderOpProse(op, resolved) {
|
|
|
580
597
|
const len = (p.content ?? "").length;
|
|
581
598
|
return [`Writes file ${pathSub} (${len} chars).`];
|
|
582
599
|
}
|
|
600
|
+
case "notify": {
|
|
601
|
+
const p = op.notifyParams;
|
|
602
|
+
const agentSub = substitute(p.agent, resolved);
|
|
603
|
+
const messagePart = p.message !== undefined ? `with explicit message` : `with the skill's joined emissions`;
|
|
604
|
+
const connectorsPart = p.connectors !== undefined ? ` (restricted to: ${p.connectors.join(", ")})` : "";
|
|
605
|
+
return [`Notifies agent ${agentSub} ${messagePart} via AgentConnector dispatch${connectorsPart}.`];
|
|
606
|
+
}
|
|
583
607
|
}
|
|
584
608
|
}
|
|
585
609
|
function renderProse(parsed, resolved, order) {
|