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,251 @@
|
|
|
1
|
+
// Runtime-layer skill management API. User-facing surface for storing and
|
|
2
|
+
// deleting skills with referential-integrity guarantees that the connector
|
|
3
|
+
// contract intentionally delegates to this layer.
|
|
4
|
+
//
|
|
5
|
+
// `ReferentialIntegrityError` is a runtime-layer error class — NOT a
|
|
6
|
+
// `ConnectorError` subclass. The distinction matters: the executor's
|
|
7
|
+
// `else:` / `# OnError:` machinery catches `ConnectorError`s thrown
|
|
8
|
+
// inside skill execution and routes them through the recovery chain.
|
|
9
|
+
// `ReferentialIntegrityError` is thrown by `deleteSkill()`, which is a
|
|
10
|
+
// user-facing management API — not a skill-execution op — so it surfaces
|
|
11
|
+
// directly to the caller and bypasses recovery routing.
|
|
12
|
+
import { parse } from "./parser.js";
|
|
13
|
+
/**
|
|
14
|
+
* Thrown by `deleteSkill()` when the target skill is referenced by other
|
|
15
|
+
* skills and `opts.force` is not set. Runtime-layer error, distinct from
|
|
16
|
+
* the `ConnectorError` hierarchy in `src/errors.ts`.
|
|
17
|
+
*/
|
|
18
|
+
export class ReferentialIntegrityError extends Error {
|
|
19
|
+
skill_name;
|
|
20
|
+
referenced_by;
|
|
21
|
+
constructor(skill_name, referenced_by) {
|
|
22
|
+
super(`Cannot delete skill '${skill_name}' — referenced by: ${referenced_by.join(", ")}. ` +
|
|
23
|
+
`Pass { force: true } to delete anyway.`);
|
|
24
|
+
this.skill_name = skill_name;
|
|
25
|
+
this.referenced_by = referenced_by;
|
|
26
|
+
this.name = "ReferentialIntegrityError";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Runtime reference index. Maps `referencedSkill → set of skills that
|
|
31
|
+
* reference it`. Bidirectional bookkeeping lets storeSkill/delete updates
|
|
32
|
+
* stay O(refs) instead of O(N) scans.
|
|
33
|
+
*
|
|
34
|
+
* **Out-of-band edit tolerance.** If someone edits a `.skill` file directly
|
|
35
|
+
* (bypassing storeSkill), the index goes stale until the runtime restarts
|
|
36
|
+
* or `runtime.invalidateConnector()` triggers a rebuild. Not a correctness
|
|
37
|
+
* issue — the next startup scan re-derives — but operators editing files
|
|
38
|
+
* by hand will see incorrect referential-integrity checks until they
|
|
39
|
+
* either restart or invalidate.
|
|
40
|
+
*
|
|
41
|
+
* The runtime ships an explicit `rebuildIndex()` escape hatch for live
|
|
42
|
+
* recovery without restart.
|
|
43
|
+
*/
|
|
44
|
+
export class ReferenceIndex {
|
|
45
|
+
/** `name → skills that reference name` (deleteSkill consumes this). */
|
|
46
|
+
referencedBy = new Map();
|
|
47
|
+
/** `name → skills that name references` (storeSkill bookkeeping). */
|
|
48
|
+
referencing = new Map();
|
|
49
|
+
/** Skills that reference the given target. Empty array if none. */
|
|
50
|
+
referencesTo(name) {
|
|
51
|
+
const set = this.referencedBy.get(name);
|
|
52
|
+
return set ? Array.from(set).sort() : [];
|
|
53
|
+
}
|
|
54
|
+
/** Skills that the given source references. Empty array if none. */
|
|
55
|
+
referencesFrom(name) {
|
|
56
|
+
const set = this.referencing.get(name);
|
|
57
|
+
return set ? Array.from(set).sort() : [];
|
|
58
|
+
}
|
|
59
|
+
/** Update edges for one skill — replaces its outgoing edges. Used after storeSkill. */
|
|
60
|
+
setOutgoing(name, targets) {
|
|
61
|
+
// Drop old outgoing edges from referencedBy.
|
|
62
|
+
const oldTargets = this.referencing.get(name);
|
|
63
|
+
if (oldTargets !== undefined) {
|
|
64
|
+
for (const t of oldTargets) {
|
|
65
|
+
const set = this.referencedBy.get(t);
|
|
66
|
+
if (set !== undefined) {
|
|
67
|
+
set.delete(name);
|
|
68
|
+
if (set.size === 0)
|
|
69
|
+
this.referencedBy.delete(t);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (targets.length === 0) {
|
|
74
|
+
this.referencing.delete(name);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.referencing.set(name, new Set(targets));
|
|
78
|
+
for (const t of targets) {
|
|
79
|
+
let set = this.referencedBy.get(t);
|
|
80
|
+
if (set === undefined) {
|
|
81
|
+
set = new Set();
|
|
82
|
+
this.referencedBy.set(t, set);
|
|
83
|
+
}
|
|
84
|
+
set.add(name);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Drop all edges originating from `name`. Used after deleteSkill. */
|
|
89
|
+
drop(name) {
|
|
90
|
+
this.setOutgoing(name, []);
|
|
91
|
+
}
|
|
92
|
+
/** Total edge count — for tests + diagnostics. */
|
|
93
|
+
size() {
|
|
94
|
+
let n = 0;
|
|
95
|
+
for (const set of this.referencing.values())
|
|
96
|
+
n += set.size;
|
|
97
|
+
return n;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Replace this index's edges with another's. Used by
|
|
101
|
+
* `invalidateConnector()` when rebuilding from disk — the caller passes
|
|
102
|
+
* the long-lived index, we rebuild a fresh one off the store, then
|
|
103
|
+
* atomically swap the edges.
|
|
104
|
+
*/
|
|
105
|
+
replaceAll(other) {
|
|
106
|
+
this.referencedBy.clear();
|
|
107
|
+
this.referencing.clear();
|
|
108
|
+
for (const [name, targets] of other.referencing) {
|
|
109
|
+
this.setOutgoing(name, Array.from(targets));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Walk a skill's parsed AST and extract names of skills it references via
|
|
115
|
+
* the `&` op. Returns a deduplicated, sorted list. Includes references to
|
|
116
|
+
* both data-skills (which inline at compile time) and procedural skills
|
|
117
|
+
* (which compile to runtime invocations) — the integrity check should fire
|
|
118
|
+
* for either, since deleting any referenced skill breaks the source.
|
|
119
|
+
*
|
|
120
|
+
* Walks foreach + if bodies recursively. T3+ grammar; T1 returns empty.
|
|
121
|
+
*/
|
|
122
|
+
export function extractReferences(source) {
|
|
123
|
+
const parsed = parse(source);
|
|
124
|
+
const refs = new Set();
|
|
125
|
+
for (const target of parsed.targets.values()) {
|
|
126
|
+
collectAmpRefs(target.ops, refs);
|
|
127
|
+
if (target.elseBlock !== undefined)
|
|
128
|
+
collectAmpRefs(target.elseBlock, refs);
|
|
129
|
+
}
|
|
130
|
+
return Array.from(refs).sort();
|
|
131
|
+
}
|
|
132
|
+
function collectAmpRefs(ops, out) {
|
|
133
|
+
for (const op of ops) {
|
|
134
|
+
if (op.kind === "&" && op.ampParams !== undefined) {
|
|
135
|
+
out.add(op.ampParams.skillName);
|
|
136
|
+
}
|
|
137
|
+
if (op.foreachBody !== undefined)
|
|
138
|
+
collectAmpRefs(op.foreachBody, out);
|
|
139
|
+
if (op.ifBranches !== undefined) {
|
|
140
|
+
for (const branch of op.ifBranches)
|
|
141
|
+
collectAmpRefs(branch.body, out);
|
|
142
|
+
}
|
|
143
|
+
if (op.ifElseBody !== undefined)
|
|
144
|
+
collectAmpRefs(op.ifElseBody, out);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Build a fresh reference index from a SkillStore by scanning every skill.
|
|
149
|
+
* Called once at runtime startup; subsequent storeSkill/deleteSkill calls
|
|
150
|
+
* maintain incrementally.
|
|
151
|
+
*/
|
|
152
|
+
export async function buildReferenceIndex(store) {
|
|
153
|
+
const index = new ReferenceIndex();
|
|
154
|
+
const metas = await store.query();
|
|
155
|
+
for (const meta of metas) {
|
|
156
|
+
try {
|
|
157
|
+
const source = await store.load(meta.name);
|
|
158
|
+
const refs = extractReferences(source.source);
|
|
159
|
+
if (refs.length > 0)
|
|
160
|
+
index.setOutgoing(meta.name, refs);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Skip unreadable entries; query returned them but load failed.
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return index;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Store (create or update) a skill, then update the reference index for
|
|
170
|
+
* its outgoing edges. Returns the substrate's `VersionInfo`.
|
|
171
|
+
*/
|
|
172
|
+
export async function storeSkill(name, source, options) {
|
|
173
|
+
const store = options.registry.getSkillStore(options.storeName);
|
|
174
|
+
const info = await store.store(name, source, options.metadata);
|
|
175
|
+
options.index.setOutgoing(name, extractReferences(source));
|
|
176
|
+
return info;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Delete a skill. Default behavior: index lookup; if any skill references
|
|
180
|
+
* the target, throw `ReferentialIntegrityError`. With `opts.force`, skip
|
|
181
|
+
* the check and dispatch directly to the substrate (which may still
|
|
182
|
+
* refuse for its own reasons, e.g., a signed-artifact store).
|
|
183
|
+
*/
|
|
184
|
+
export async function deleteSkill(name, options) {
|
|
185
|
+
if (options.force !== true) {
|
|
186
|
+
const referencedBy = options.index.referencesTo(name);
|
|
187
|
+
if (referencedBy.length > 0) {
|
|
188
|
+
throw new ReferentialIntegrityError(name, referencedBy);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const store = options.registry.getSkillStore(options.storeName);
|
|
192
|
+
await store.delete(name);
|
|
193
|
+
options.index.drop(name);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Invalidate a connector's cached state. **"Refresh everything dependent
|
|
197
|
+
* on this connector."** Type-aware behavior:
|
|
198
|
+
*
|
|
199
|
+
* - Any connector kind: calls `instance.invalidateManifest()` if defined.
|
|
200
|
+
* Triggers a refresh on the next `manifest()` call.
|
|
201
|
+
* - SkillStore (when an `index` is passed in `options`): also rebuilds
|
|
202
|
+
* the reference index by re-scanning the store. The recovery path for
|
|
203
|
+
* stale reference state after operators edit `.skill` files directly
|
|
204
|
+
* without going through `storeSkill()`.
|
|
205
|
+
*
|
|
206
|
+
* Used in dev/hot-reload loops and after operators change connector state
|
|
207
|
+
* out-of-band (new Ollama model loaded, new MCP server wired, manual
|
|
208
|
+
* .skill file edit).
|
|
209
|
+
*
|
|
210
|
+
* Convention reminder: connectors bump their internal `capabilities_version`
|
|
211
|
+
* on schema/structural changes, NOT on every query. This invalidate hook
|
|
212
|
+
* is the explicit escape valve for cases where the version-bump didn't
|
|
213
|
+
* fire (e.g., live model installation that the connector didn't observe,
|
|
214
|
+
* or out-of-band .skill file edits the runtime didn't mediate).
|
|
215
|
+
*
|
|
216
|
+
* Returns `Promise<void>` because the SkillStore reference-index rebuild
|
|
217
|
+
* is async. Non-SkillStore invalidations complete synchronously but the
|
|
218
|
+
* surface is uniform.
|
|
219
|
+
*/
|
|
220
|
+
export async function invalidateConnector(name, registry, options = {}) {
|
|
221
|
+
let matchedSkillStore = null;
|
|
222
|
+
for (const lookup of [
|
|
223
|
+
() => registry.hasLocalModel(name) ? registry.getLocalModel(name) : null,
|
|
224
|
+
() => registry.hasMemoryStore(name) ? registry.getMemoryStore(name) : null,
|
|
225
|
+
() => registry.hasSkillStore(name) ? registry.getSkillStore(name) : null,
|
|
226
|
+
() => registry.hasMcpConnector(name) ? registry.getMcpConnector(name) : null,
|
|
227
|
+
]) {
|
|
228
|
+
const instance = lookup();
|
|
229
|
+
if (instance === null)
|
|
230
|
+
continue;
|
|
231
|
+
const maybe = instance;
|
|
232
|
+
if (typeof maybe.invalidateManifest === "function") {
|
|
233
|
+
maybe.invalidateManifest();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Reference-index rebuild for SkillStore invalidations. Out-of-band
|
|
237
|
+
// .skill file edits (vim, direct disk writes) leave the in-memory
|
|
238
|
+
// reference index stale — incremental updates only fire through
|
|
239
|
+
// storeSkill(). A SkillStore invalidate is the explicit recovery.
|
|
240
|
+
if (registry.hasSkillStore(name)) {
|
|
241
|
+
matchedSkillStore = registry.getSkillStore(name);
|
|
242
|
+
if (options.index !== undefined) {
|
|
243
|
+
const fresh = await buildReferenceIndex(matchedSkillStore);
|
|
244
|
+
// Replace this index's edges with the rebuilt set. We do it by
|
|
245
|
+
// walking known edges + clearing them, then applying the fresh
|
|
246
|
+
// edges — cheaper than mutating private state from outside.
|
|
247
|
+
options.index.replaceAll(fresh);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=skill-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../src/skill-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { SkillStore, SkillStoreClass, MemoryStore, MemoryStoreClass, PortableMemory, LocalModel, LocalModelClass, McpConnector, McpConnectorClass } from "../connectors/types.js";
|
|
2
|
+
import type { AgentConnector, AgentConnectorClass } from "../connectors/agent.js";
|
|
3
|
+
export interface ConformanceTest {
|
|
4
|
+
category: ConformanceCategory;
|
|
5
|
+
name: string;
|
|
6
|
+
run(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export type ConformanceCategory = "method-existence" | "return-type" | "error-contract" | "static-capabilities" | "feature-behavior";
|
|
9
|
+
export interface SkillStoreFixture {
|
|
10
|
+
build(): SkillStore;
|
|
11
|
+
ctor: SkillStoreClass;
|
|
12
|
+
teardown?(instance: SkillStore): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare const SkillStoreConformance: {
|
|
15
|
+
buildTests(fixture: SkillStoreFixture): ConformanceTest[];
|
|
16
|
+
};
|
|
17
|
+
export interface MemoryStoreFixture {
|
|
18
|
+
build(): MemoryStore;
|
|
19
|
+
ctor: MemoryStoreClass;
|
|
20
|
+
seed?(instance: MemoryStore, memories: Partial<PortableMemory>[]): Promise<void>;
|
|
21
|
+
teardown?(instance: MemoryStore): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare const MemoryStoreConformance: {
|
|
24
|
+
buildTests(fixture: MemoryStoreFixture): ConformanceTest[];
|
|
25
|
+
};
|
|
26
|
+
export interface LocalModelFixture {
|
|
27
|
+
build(): LocalModel;
|
|
28
|
+
ctor: LocalModelClass;
|
|
29
|
+
/** Set true if the model is reachable in the test environment. Default false. */
|
|
30
|
+
liveDispatch?: boolean;
|
|
31
|
+
teardown?(instance: LocalModel): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
export declare const LocalModelConformance: {
|
|
34
|
+
buildTests(fixture: LocalModelFixture): ConformanceTest[];
|
|
35
|
+
};
|
|
36
|
+
export interface McpConnectorFixture {
|
|
37
|
+
build(): McpConnector;
|
|
38
|
+
ctor: McpConnectorClass;
|
|
39
|
+
/** A tool name the connector should handle; used in the dispatch test. */
|
|
40
|
+
testToolName?: string;
|
|
41
|
+
teardown?(instance: McpConnector): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
export declare const McpConnectorConformance: {
|
|
44
|
+
buildTests(fixture: McpConnectorFixture): ConformanceTest[];
|
|
45
|
+
};
|
|
46
|
+
export interface AgentConnectorFixture {
|
|
47
|
+
build(): AgentConnector;
|
|
48
|
+
ctor: AgentConnectorClass;
|
|
49
|
+
/** Optional id the connector treats as reachable; used in deliver/wake tests. */
|
|
50
|
+
testAgentId?: string;
|
|
51
|
+
teardown?(instance: AgentConnector): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
export declare const AgentConnectorConformance: {
|
|
54
|
+
buildTests(fixture: AgentConnectorFixture): ConformanceTest[];
|
|
55
|
+
};
|
|
56
|
+
export type { SkillMeta } from "../connectors/types.js";
|
|
57
|
+
//# sourceMappingURL=conformance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAEf,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EAGlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED,MAAM,MAAM,mBAAmB,GAC3B,kBAAkB,GAClB,aAAa,GACb,gBAAgB,GAChB,qBAAqB,GACrB,kBAAkB,CAAC;AAIvB,MAAM,WAAW,iBAAiB;IAChC,KAAK,IAAI,UAAU,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,qBAAqB;wBACZ,iBAAiB,GAAG,eAAe,EAAE;CAyG1D,CAAC;AAIF,MAAM,WAAW,kBAAkB;IACjC,KAAK,IAAI,WAAW,CAAC;IACrB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,QAAQ,CAAC,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,eAAO,MAAM,sBAAsB;wBACb,kBAAkB,GAAG,eAAe,EAAE;CAmC3D,CAAC;AAIF,MAAM,WAAW,iBAAiB;IAChC,KAAK,IAAI,UAAU,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,qBAAqB;wBACZ,iBAAiB,GAAG,eAAe,EAAE;CAyB1D,CAAC;AAIF,MAAM,WAAW,mBAAmB;IAClC,KAAK,IAAI,YAAY,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,eAAO,MAAM,uBAAuB;wBACd,mBAAmB,GAAG,eAAe,EAAE;CAe5D,CAAC;AAIF,MAAM,WAAW,qBAAqB;IACpC,KAAK,IAAI,cAAc,CAAC;IACxB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED,eAAO,MAAM,yBAAyB;wBAChB,qBAAqB,GAAG,eAAe,EAAE;CAqD9D,CAAC;AAsHF,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC"}
|