@agentproto/driver 0.1.1

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/index.mjs ADDED
@@ -0,0 +1,399 @@
1
+ import { parseDriverManifest, normalizeToolId, defineDriver } from './chunk-6NYFD4YS.mjs';
2
+ export { defineDriver, normalizeToolId } from './chunk-6NYFD4YS.mjs';
3
+ import { ToolError, validateInput, validateContext, validateOutput } from '@agentproto/tool';
4
+ import { createVerbs } from '@agentproto/manifest';
5
+
6
+ /**
7
+ * @agentproto/driver v0.1.0-alpha
8
+ * AIP-30 DRIVER.md `defineDriver` reference implementation.
9
+ */
10
+
11
+ // src/implement-tool.ts
12
+ function implementTool(tool, body) {
13
+ return Object.freeze({ tool, body });
14
+ }
15
+
16
+ // src/resolver.ts
17
+ var KIND_PREFERENCE = [
18
+ "builtin",
19
+ "sdk",
20
+ "http",
21
+ "mcp",
22
+ "cli"
23
+ ];
24
+ function resolveDriver(args) {
25
+ const { tool, candidates, context } = args;
26
+ const inputKeys = args.inputKeys ?? [];
27
+ const availability = args.availability ?? /* @__PURE__ */ new Map();
28
+ const rejected = [];
29
+ const phase1 = [];
30
+ for (const provider of candidates) {
31
+ const entry = findImplementsEntry(provider, tool);
32
+ if (!entry) {
33
+ rejected.push({ providerId: provider.id, phase: 1, reason: "tool_not_implemented" });
34
+ continue;
35
+ }
36
+ if (tool.driverConstraints.forbid.includes(provider.kind)) {
37
+ rejected.push({ providerId: provider.id, phase: 1, reason: "kind_forbidden_by_contract" });
38
+ continue;
39
+ }
40
+ if (tool.driverConstraints.requireKind.length > 0 && !tool.driverConstraints.requireKind.includes(provider.kind)) {
41
+ rejected.push({ providerId: provider.id, phase: 1, reason: "kind_not_in_required_kinds" });
42
+ continue;
43
+ }
44
+ const dropped = entry.schemaNarrowing?.dropInputs ?? [];
45
+ const usesDropped = inputKeys.find((k) => dropped.includes(k));
46
+ if (usesDropped) {
47
+ rejected.push({
48
+ providerId: provider.id,
49
+ phase: 1,
50
+ reason: `input_unsupported:${usesDropped}`
51
+ });
52
+ continue;
53
+ }
54
+ phase1.push({ provider, entry });
55
+ }
56
+ const phase2 = phase1.filter(({ provider }) => {
57
+ const a = availability.get(provider.id);
58
+ if (!a) return true;
59
+ if (a.installFailed) {
60
+ rejected.push({ providerId: provider.id, phase: 2, reason: "install_failed" });
61
+ return false;
62
+ }
63
+ if (a.versionMismatch) {
64
+ rejected.push({ providerId: provider.id, phase: 2, reason: "version_mismatch" });
65
+ return false;
66
+ }
67
+ if (a.authState === "unauthed" || a.authState === "expired") {
68
+ rejected.push({ providerId: provider.id, phase: 2, reason: `auth_state:${a.authState}` });
69
+ return false;
70
+ }
71
+ if (a.healthCheckFailedRecently) {
72
+ rejected.push({ providerId: provider.id, phase: 2, reason: "health_check_failed_recently" });
73
+ return false;
74
+ }
75
+ return true;
76
+ });
77
+ const phase3 = phase2.filter(({ provider }) => {
78
+ if (context.policyForbiddenTags && provider.policyTags.some((t) => context.policyForbiddenTags.includes(t))) {
79
+ rejected.push({ providerId: provider.id, phase: 3, reason: "policy_tag_forbidden" });
80
+ return false;
81
+ }
82
+ if (context.policyAllowedTags && context.policyAllowedTags.length > 0) {
83
+ const allowed = provider.policyTags.some(
84
+ (t) => context.policyAllowedTags.includes(t)
85
+ );
86
+ if (!allowed) {
87
+ rejected.push({ providerId: provider.id, phase: 3, reason: "policy_tag_not_in_allowlist" });
88
+ return false;
89
+ }
90
+ }
91
+ if (context.regionConstraint) {
92
+ const matches = provider.region.includes(context.regionConstraint) || provider.region.includes("global");
93
+ if (!matches) {
94
+ rejected.push({
95
+ providerId: provider.id,
96
+ phase: 3,
97
+ reason: `region_mismatch:wanted=${context.regionConstraint},have=${provider.region.join("|")}`
98
+ });
99
+ return false;
100
+ }
101
+ }
102
+ return true;
103
+ });
104
+ if (context.pinnedProvider) {
105
+ const pinned = phase3.find(({ provider }) => provider.id === context.pinnedProvider);
106
+ if (pinned) {
107
+ return { ok: true, provider: pinned.provider, implementsEntry: pinned.entry };
108
+ }
109
+ return {
110
+ ok: false,
111
+ error: {
112
+ code: "pinned_provider_unavailable",
113
+ message: `Pinned provider '${context.pinnedProvider}' was filtered by an earlier resolver phase.`,
114
+ rejected
115
+ }
116
+ };
117
+ }
118
+ if (phase3.length === 0) {
119
+ const code = inferNoRouteCode(rejected, context);
120
+ return {
121
+ ok: false,
122
+ error: {
123
+ code,
124
+ message: `No provider survived resolver filters for tool '${tool.id}'.`,
125
+ rejected
126
+ }
127
+ };
128
+ }
129
+ if (tool.defaultImplementation) {
130
+ const def = phase3.find(({ provider }) => provider.id === tool.defaultImplementation);
131
+ if (def) {
132
+ return { ok: true, provider: def.provider, implementsEntry: def.entry };
133
+ }
134
+ }
135
+ const ranked = [...phase3].sort((a, b) => {
136
+ const costA = a.entry.costOverride?.costUnitsPerCall ?? a.provider.costOverride?.costUnitsPerCall ?? Number.POSITIVE_INFINITY;
137
+ const costB = b.entry.costOverride?.costUnitsPerCall ?? b.provider.costOverride?.costUnitsPerCall ?? Number.POSITIVE_INFINITY;
138
+ if (costA !== costB) return costA - costB;
139
+ const kindA = KIND_PREFERENCE.indexOf(a.provider.kind);
140
+ const kindB = KIND_PREFERENCE.indexOf(b.provider.kind);
141
+ if (kindA !== kindB) return kindA - kindB;
142
+ return a.provider.id.localeCompare(b.provider.id);
143
+ });
144
+ const winner = ranked[0];
145
+ return { ok: true, provider: winner.provider, implementsEntry: winner.entry };
146
+ }
147
+ function findImplementsEntry(provider, tool) {
148
+ return provider.implements.find((e) => normalizeToolId(e.tool) === tool.id);
149
+ }
150
+ function inferNoRouteCode(rejected, context) {
151
+ if (rejected.length === 0) return "no_route";
152
+ const reasons = rejected.map((r) => r.reason);
153
+ if (context.regionConstraint && reasons.some((r) => r.startsWith("region_mismatch"))) {
154
+ return "region_mismatch";
155
+ }
156
+ if (reasons.some((r) => r.startsWith("policy_tag"))) {
157
+ return "policy_violation";
158
+ }
159
+ return "no_route";
160
+ }
161
+ async function runTool(args) {
162
+ const { tool, candidates, input, context = {} } = args;
163
+ const resolverContext = args.resolverContext ?? {};
164
+ const signal = args.signal ?? new AbortController().signal;
165
+ const inputKeys = isPlainObject(input) ? Object.keys(input) : [];
166
+ const resolution = resolveDriver({
167
+ tool,
168
+ candidates,
169
+ context: resolverContext,
170
+ inputKeys,
171
+ availability: args.availability
172
+ });
173
+ if (!resolution.ok) {
174
+ throw new ToolError({
175
+ code: resolution.error.code,
176
+ message: resolution.error.message,
177
+ cause: resolution.error.rejected
178
+ });
179
+ }
180
+ const { provider, implementsEntry } = resolution;
181
+ const inputValidation = validateInput(tool, input);
182
+ if (!inputValidation.ok) {
183
+ throw new ToolError(inputValidation.error);
184
+ }
185
+ const contextValidation = validateContext(tool, context);
186
+ if (!contextValidation.ok) {
187
+ throw new ToolError(contextValidation.error);
188
+ }
189
+ const mapped = applyMapping(inputValidation.value, implementsEntry.mapping);
190
+ const driverCtx = {
191
+ secrets: args.secrets ?? {},
192
+ authState: "authed",
193
+ providerId: provider.id,
194
+ driverKind: provider.kind,
195
+ implementsEntry
196
+ };
197
+ const executeFn = provider.execute[tool.id];
198
+ if (!executeFn) {
199
+ throw new ToolError({
200
+ code: "execute_binding_mismatch",
201
+ message: `provider '${provider.id}' has no execute['${tool.id}'] body`
202
+ });
203
+ }
204
+ const timeoutMs = provider.timeoutOverrideMs ?? implementsEntry.timeoutOverrideMs ?? tool.timeoutMs;
205
+ const rawOutput = await runWithTimeout(
206
+ timeoutMs,
207
+ signal,
208
+ async (sig) => executeFn({
209
+ input: mapped,
210
+ context: contextValidation.value,
211
+ driverCtx,
212
+ signal: sig
213
+ })
214
+ );
215
+ return validateOutput(tool, rawOutput);
216
+ }
217
+ function applyMapping(input, mapping) {
218
+ if (!mapping || !isPlainObject(input)) return input;
219
+ const out = {};
220
+ const mappedSrcKeys = /* @__PURE__ */ new Set();
221
+ for (const [destKey, value] of Object.entries(mapping)) {
222
+ if (typeof value === "string") mappedSrcKeys.add(value);
223
+ else mappedSrcKeys.add(value.from);
224
+ }
225
+ for (const [k, v] of Object.entries(input)) {
226
+ if (!mappedSrcKeys.has(k)) {
227
+ out[k] = v;
228
+ }
229
+ }
230
+ const inputObj = input;
231
+ for (const [destKey, value] of Object.entries(mapping)) {
232
+ if (typeof value === "string") {
233
+ const srcKey = value;
234
+ if (srcKey in inputObj) out[destKey] = inputObj[srcKey];
235
+ } else {
236
+ if (value.from in inputObj) out[destKey] = inputObj[value.from];
237
+ }
238
+ }
239
+ return out;
240
+ }
241
+ async function runWithTimeout(timeoutMs, parentSignal, fn) {
242
+ const controller = new AbortController();
243
+ const onParentAbort = () => controller.abort(parentSignal.reason);
244
+ if (parentSignal.aborted) controller.abort(parentSignal.reason);
245
+ else parentSignal.addEventListener("abort", onParentAbort, { once: true });
246
+ const timer = setTimeout(() => {
247
+ controller.abort(new ToolError({ code: "timeout", message: `exceeded ${timeoutMs}ms` }));
248
+ }, timeoutMs);
249
+ try {
250
+ return await fn(controller.signal);
251
+ } finally {
252
+ clearTimeout(timer);
253
+ parentSignal.removeEventListener("abort", onParentAbort);
254
+ }
255
+ }
256
+ function isPlainObject(v) {
257
+ return typeof v === "object" && v !== null && !Array.isArray(v);
258
+ }
259
+ var driverSpec = {
260
+ name: "driver",
261
+ aip: 30,
262
+ schemaLiteral: "agentproto/driver/v1",
263
+ pathOf: (h) => `${h.id}/DRIVER.md`,
264
+ define: (params) => {
265
+ if (!params.execute && !params.implementations) {
266
+ const stubs = {};
267
+ for (const entry of params.implements ?? []) {
268
+ const id = normalizeToolId(entry.tool);
269
+ stubs[id] = () => {
270
+ throw new Error(
271
+ `stub: no execute body for '${id}' \u2014 use driverFromManifest({ manifest, execute }) for dispatch`
272
+ );
273
+ };
274
+ }
275
+ return defineDriver({ ...params, execute: stubs });
276
+ }
277
+ return defineDriver(params);
278
+ },
279
+ parse: (source) => {
280
+ const m = parseDriverManifest(source);
281
+ const fm = m.frontmatter;
282
+ const def = {
283
+ id: fm.id,
284
+ name: fm.name,
285
+ description: fm.description,
286
+ kind: fm.kind,
287
+ ...fm.version !== void 0 && { version: fm.version },
288
+ implements: fm.implements.map((entry) => ({
289
+ tool: entry.tool,
290
+ version: entry.version,
291
+ ...entry.schema_narrowing && {
292
+ schemaNarrowing: {
293
+ ...entry.schema_narrowing.drop_inputs?.length && {
294
+ dropInputs: entry.schema_narrowing.drop_inputs
295
+ },
296
+ ...entry.schema_narrowing.drop_outputs?.length && {
297
+ dropOutputs: entry.schema_narrowing.drop_outputs
298
+ }
299
+ }
300
+ },
301
+ ...entry.mapping && { mapping: entry.mapping },
302
+ ...entry.cost_override !== void 0 && {
303
+ costOverride: entry.cost_override
304
+ },
305
+ ...entry.timeout_override_ms !== void 0 && {
306
+ timeoutOverrideMs: entry.timeout_override_ms
307
+ },
308
+ ...entry.retry_override !== void 0 && {
309
+ retryOverride: entry.retry_override
310
+ },
311
+ ...entry.metadata && { metadata: entry.metadata }
312
+ })),
313
+ ...fm.auth !== void 0 && {
314
+ auth: fm.auth
315
+ },
316
+ ...fm.network && { network: fm.network },
317
+ ...fm.region?.length && { region: fm.region },
318
+ ...fm.policy_tags?.length && { policyTags: fm.policy_tags },
319
+ ...fm.cost_override !== void 0 && {
320
+ costOverride: fm.cost_override
321
+ },
322
+ ...fm.timeout_override_ms !== void 0 && {
323
+ timeoutOverrideMs: fm.timeout_override_ms
324
+ },
325
+ ...fm.retry_override !== void 0 && {
326
+ retryOverride: fm.retry_override
327
+ },
328
+ ...fm.health_check !== void 0 && {
329
+ healthCheck: fm.health_check
330
+ },
331
+ ...fm.version_check !== void 0 && {
332
+ versionCheck: fm.version_check
333
+ },
334
+ ...fm.install?.length && {
335
+ install: fm.install
336
+ },
337
+ ...fm.tags?.length && { tags: fm.tags },
338
+ ...fm.metadata && { metadata: fm.metadata }
339
+ };
340
+ return {
341
+ frontmatter: def,
342
+ body: m.body
343
+ };
344
+ },
345
+ toFrontmatter: (params) => {
346
+ const fm = {
347
+ schema: "agentproto/driver/v1",
348
+ id: params.id,
349
+ name: params.name,
350
+ description: params.description
351
+ };
352
+ if (params.version !== void 0) fm.version = params.version;
353
+ fm.kind = params.kind;
354
+ fm.implements = (params.implements ?? []).map((entry) => {
355
+ const e = {
356
+ tool: entry.tool,
357
+ version: entry.version
358
+ };
359
+ if (entry.schemaNarrowing) {
360
+ const sn = {};
361
+ if (entry.schemaNarrowing.dropInputs?.length)
362
+ sn.drop_inputs = [...entry.schemaNarrowing.dropInputs];
363
+ if (entry.schemaNarrowing.dropOutputs?.length)
364
+ sn.drop_outputs = [...entry.schemaNarrowing.dropOutputs];
365
+ e.schema_narrowing = sn;
366
+ }
367
+ if (entry.mapping) e.mapping = entry.mapping;
368
+ if (entry.costOverride) e.cost_override = entry.costOverride;
369
+ if (entry.timeoutOverrideMs !== void 0)
370
+ e.timeout_override_ms = entry.timeoutOverrideMs;
371
+ if (entry.retryOverride) e.retry_override = entry.retryOverride;
372
+ if (entry.metadata) e.metadata = entry.metadata;
373
+ return e;
374
+ });
375
+ if (params.auth) fm.auth = params.auth;
376
+ if (params.network) fm.network = params.network;
377
+ if (params.region?.length) fm.region = [...params.region];
378
+ if (params.policyTags?.length) fm.policy_tags = [...params.policyTags];
379
+ if (params.costOverride) fm.cost_override = params.costOverride;
380
+ if (params.timeoutOverrideMs !== void 0)
381
+ fm.timeout_override_ms = params.timeoutOverrideMs;
382
+ if (params.retryOverride) fm.retry_override = params.retryOverride;
383
+ if (params.healthCheck) fm.health_check = params.healthCheck;
384
+ if (params.versionCheck) fm.version_check = params.versionCheck;
385
+ if (params.tags?.length) fm.tags = [...params.tags];
386
+ if (params.metadata && Object.keys(params.metadata).length > 0)
387
+ fm.metadata = { ...params.metadata };
388
+ return fm;
389
+ }
390
+ };
391
+ var driverVerbs = createVerbs(driverSpec);
392
+
393
+ // src/index.ts
394
+ var SPEC_NAME = "agentdriver/v1";
395
+ var SPEC_VERSION = "1.0.0-alpha";
396
+
397
+ export { SPEC_NAME, SPEC_VERSION, applyMapping, driverSpec, driverVerbs, implementTool, resolveDriver, runTool };
398
+ //# sourceMappingURL=index.mjs.map
399
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/implement-tool.ts","../src/resolver.ts","../src/run-tool.ts","../src/spec.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ToolContext, ToolHandle } from \"@agentproto/tool\"\nimport type { ExecuteFn, DriverContext } from \"./types.js\"\n\n/**\n * Body signature derived from a contract handle's generics.\n *\n * Analogous to a Solidity function `override` against an interface\n * declaration: `input` matches the contract's `inputSchema` type,\n * `context` matches `contextSchema`, and the return is checked against\n * `outputSchema`. Drift between the body and its contract is a compile\n * error, not a runtime one.\n *\n * Compare with the legacy {@link ExecuteFn} — `unknown`-typed inputs\n * that require manual `as InputType` casts at every body. That form\n * stays available for `.md`-driven dynamic loading where the contract\n * handle isn't in scope; TypeScript authors should prefer the typed\n * form via {@link implementTool}.\n */\nexport type TypedExecuteFn<TInput, TOutput, TContext extends ToolContext> = (\n args: {\n input: TInput\n context: TContext\n driverCtx: DriverContext\n signal: AbortSignal\n }\n) => Promise<TOutput> | TOutput\n\n/**\n * Typed `(contract, body)` pair — the missing \"concrete tool\" layer\n * between AIP-14 `ITool` (the contract handle) and AIP-30 PROVIDER\n * (the shared-infra bundle).\n *\n * Authored via {@link implementTool}, consumed by {@link defineDriver}\n * via `implementations: [...]` and by per-surface adapters\n * (`toAiSdkTool`, `toMastraTool`) that close the body over a\n * per-request `context`.\n */\nexport interface ToolImplementation<\n TInput = unknown,\n TOutput = unknown,\n TContext extends ToolContext = ToolContext,\n> {\n /** The AIP-14 contract handle this implementation binds to. */\n readonly tool: ToolHandle<TInput, TOutput, TContext>\n /** Typed body — see {@link TypedExecuteFn}. */\n readonly body: TypedExecuteFn<TInput, TOutput, TContext>\n}\n\n/**\n * Bind a typed body to an AIP-14 `ITool` contract handle.\n *\n * Equivalent to Solidity's `MyToken is IERC20` pattern: the compiler\n * enforces that the body's input/output/context match the contract's\n * generics. No string-keyed indirection, no manual `as` casts at\n * call sites.\n *\n * The returned {@link ToolImplementation} is the canonical typed\n * binding; downstream surfaces consume it via:\n *\n * - {@link defineDriver} — bundle ≥1 implementations into a\n * shared-infra provider for the AIP-30 resolver to dispatch through.\n * - `toAiSdkTool(impl, { context })` — adapt to AI SDK's\n * `tool({...})` shape for `streamText` / `generateText` consumers.\n * - `toMastraTool(impl, { context })` — adapt to Mastra's `createTool`\n * for `agent.stream` / `agent.generate` consumers.\n *\n * The same `impl` can be re-adapted with different per-request\n * contexts; the body is captured once and the context flows through\n * the closure each time.\n */\nexport function implementTool<\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(\n tool: ToolHandle<TInput, TOutput, TContext>,\n body: TypedExecuteFn<TInput, TOutput, TContext>\n): ToolImplementation<TInput, TOutput, TContext> {\n return Object.freeze({ tool, body })\n}\n","import type { ToolHandle } from \"@agentproto/tool\"\nimport type {\n ImplementsEntry,\n DriverHandle,\n ResolverContext,\n ResolverResult,\n} from \"./types.js\"\nimport { normalizeToolId } from \"./define-provider.js\"\n\nconst KIND_PREFERENCE: readonly string[] = [\n \"builtin\",\n \"sdk\",\n \"http\",\n \"mcp\",\n \"cli\",\n]\n\n/**\n * AIP-30 6-phase resolver. Picks one provider per call.\n *\n * Algorithm summary (full description in AIP-30 § Multi-provider routing):\n *\n * Phase 1 — Candidate set: filter providers implementing(tool.id) and\n * respecting tool.driverConstraints (forbid / requireKind)\n * and per-call schema_narrowing compatibility.\n * Phase 2 — Capability gate: drop providers with failed install /\n * version_check or stale failed health_check.\n * Phase 3 — Policy filter: drop providers violating policy_tags\n * allowlist or missing region match.\n * Phase 4 — Pin override: if context.pinnedProvider, return it or fail.\n * Phase 5 — Cost / preference rank: default_driver first, else by\n * cost_units_per_call → kind preference → recency → lex(id).\n * Phase 6 — Bind: return { provider, implementsEntry }.\n */\nexport function resolveDriver(args: {\n tool: ToolHandle\n candidates: readonly DriverHandle[]\n context: ResolverContext\n /** Inputs the call is using; used in narrowing compatibility check. */\n inputKeys?: readonly string[]\n /** Per-provider availability (capability gate from Phase 2). */\n availability?: Map<string, DriverAvailability>\n}): ResolverResult {\n const { tool, candidates, context } = args\n const inputKeys = args.inputKeys ?? []\n const availability = args.availability ?? new Map()\n const rejected: Array<{ providerId: string; phase: number; reason: string }> = []\n\n // Phase 1 — Candidate set.\n const phase1: Array<{ provider: DriverHandle; entry: ImplementsEntry }> = []\n for (const provider of candidates) {\n const entry = findImplementsEntry(provider, tool)\n if (!entry) {\n rejected.push({ providerId: provider.id, phase: 1, reason: \"tool_not_implemented\" })\n continue\n }\n if (tool.driverConstraints.forbid.includes(provider.kind)) {\n rejected.push({ providerId: provider.id, phase: 1, reason: \"kind_forbidden_by_contract\" })\n continue\n }\n if (\n tool.driverConstraints.requireKind.length > 0 &&\n !tool.driverConstraints.requireKind.includes(provider.kind)\n ) {\n rejected.push({ providerId: provider.id, phase: 1, reason: \"kind_not_in_required_kinds\" })\n continue\n }\n // Schema-narrowing compatibility: if the call uses an input the\n // provider drops, refuse. The host SHOULD surface this as\n // `input_unsupported` to the caller; the resolver simply filters.\n const dropped = entry.schemaNarrowing?.dropInputs ?? []\n const usesDropped = inputKeys.find(k => dropped.includes(k))\n if (usesDropped) {\n rejected.push({\n providerId: provider.id,\n phase: 1,\n reason: `input_unsupported:${usesDropped}`,\n })\n continue\n }\n phase1.push({ provider, entry })\n }\n\n // Phase 2 — Capability gate.\n const phase2 = phase1.filter(({ provider }) => {\n const a = availability.get(provider.id)\n if (!a) return true // unknown availability = assume available\n if (a.installFailed) {\n rejected.push({ providerId: provider.id, phase: 2, reason: \"install_failed\" })\n return false\n }\n if (a.versionMismatch) {\n rejected.push({ providerId: provider.id, phase: 2, reason: \"version_mismatch\" })\n return false\n }\n if (a.authState === \"unauthed\" || a.authState === \"expired\") {\n rejected.push({ providerId: provider.id, phase: 2, reason: `auth_state:${a.authState}` })\n return false\n }\n if (a.healthCheckFailedRecently) {\n rejected.push({ providerId: provider.id, phase: 2, reason: \"health_check_failed_recently\" })\n return false\n }\n return true\n })\n\n // Phase 3 — Policy filter.\n const phase3 = phase2.filter(({ provider }) => {\n if (\n context.policyForbiddenTags &&\n provider.policyTags.some(t => context.policyForbiddenTags!.includes(t))\n ) {\n rejected.push({ providerId: provider.id, phase: 3, reason: \"policy_tag_forbidden\" })\n return false\n }\n if (context.policyAllowedTags && context.policyAllowedTags.length > 0) {\n const allowed = provider.policyTags.some(t =>\n context.policyAllowedTags!.includes(t)\n )\n if (!allowed) {\n rejected.push({ providerId: provider.id, phase: 3, reason: \"policy_tag_not_in_allowlist\" })\n return false\n }\n }\n if (context.regionConstraint) {\n const matches =\n provider.region.includes(context.regionConstraint) ||\n provider.region.includes(\"global\")\n if (!matches) {\n rejected.push({\n providerId: provider.id,\n phase: 3,\n reason: `region_mismatch:wanted=${context.regionConstraint},have=${provider.region.join(\"|\")}`,\n })\n return false\n }\n }\n return true\n })\n\n // Phase 4 — Pin override.\n if (context.pinnedProvider) {\n const pinned = phase3.find(({ provider }) => provider.id === context.pinnedProvider)\n if (pinned) {\n return { ok: true, provider: pinned.provider, implementsEntry: pinned.entry }\n }\n return {\n ok: false,\n error: {\n code: \"pinned_provider_unavailable\",\n message: `Pinned provider '${context.pinnedProvider}' was filtered by an earlier resolver phase.`,\n rejected,\n },\n }\n }\n\n // Phase 5 — Cost / preference rank.\n if (phase3.length === 0) {\n const code = inferNoRouteCode(rejected, context)\n return {\n ok: false,\n error: {\n code,\n message: `No provider survived resolver filters for tool '${tool.id}'.`,\n rejected,\n },\n }\n }\n\n // default_driver preference.\n if (tool.defaultImplementation) {\n const def = phase3.find(({ provider }) => provider.id === tool.defaultImplementation)\n if (def) {\n return { ok: true, provider: def.provider, implementsEntry: def.entry }\n }\n }\n\n // Cost ranking.\n const ranked = [...phase3].sort((a, b) => {\n const costA = a.entry.costOverride?.costUnitsPerCall ??\n a.provider.costOverride?.costUnitsPerCall ?? Number.POSITIVE_INFINITY\n const costB = b.entry.costOverride?.costUnitsPerCall ??\n b.provider.costOverride?.costUnitsPerCall ?? Number.POSITIVE_INFINITY\n if (costA !== costB) return costA - costB\n const kindA = KIND_PREFERENCE.indexOf(a.provider.kind)\n const kindB = KIND_PREFERENCE.indexOf(b.provider.kind)\n if (kindA !== kindB) return kindA - kindB\n return a.provider.id.localeCompare(b.provider.id)\n })\n\n const winner = ranked[0]!\n return { ok: true, provider: winner.provider, implementsEntry: winner.entry }\n}\n\nexport interface DriverAvailability {\n installFailed?: boolean\n versionMismatch?: boolean\n authState?: \"unknown\" | \"unauthed\" | \"authed\" | \"expired\"\n healthCheckFailedRecently?: boolean\n /** Last successful health-check timestamp, ISO-8601. */\n lastHealthOk?: string\n}\n\nfunction findImplementsEntry(\n provider: DriverHandle,\n tool: ToolHandle\n): ImplementsEntry | undefined {\n return provider.implements.find(e => normalizeToolId(e.tool) === tool.id)\n}\n\nfunction inferNoRouteCode(\n rejected: ReadonlyArray<{ phase: number; reason: string }>,\n context: ResolverContext\n): \"no_route\" | \"policy_violation\" | \"region_mismatch\" {\n if (rejected.length === 0) return \"no_route\"\n const reasons = rejected.map(r => r.reason)\n if (\n context.regionConstraint &&\n reasons.some(r => r.startsWith(\"region_mismatch\"))\n ) {\n return \"region_mismatch\"\n }\n if (reasons.some(r => r.startsWith(\"policy_tag\"))) {\n return \"policy_violation\"\n }\n return \"no_route\"\n}\n","import {\n ToolError,\n validateContext,\n validateInput,\n validateOutput,\n type ToolContext,\n type ToolHandle,\n} from \"@agentproto/tool\"\nimport { resolveDriver, type DriverAvailability } from \"./resolver.js\"\nimport type {\n ImplementsEntry,\n MappingValue,\n DriverContext,\n DriverHandle,\n ResolverContext,\n} from \"./types.js\"\n\n/**\n * End-to-end dispatch of a TOOL contract through the AIP-30 resolver.\n *\n * 1. Resolve a provider via the 6-phase resolver.\n * 2. Validate input + context against the contract's schemas (host's job, not provider's).\n * 3. Apply mapping + schema-narrowing (refuse calls using dropped inputs).\n * 4. Build per-call DriverContext (resolved secrets, signal).\n * 5. Invoke `provider.execute[tool.id]({ input, context, driverCtx, signal })`.\n * 6. Validate output against contract's outputSchema.\n * 7. Return the typed result.\n *\n * Errors throw {@link ToolError}; consumers wrap into the standard\n * `ToolResult<T>` envelope at the boundary.\n */\nexport async function runTool<TInput, TOutput, TContext extends ToolContext>(args: {\n tool: ToolHandle<TInput, TOutput, TContext>\n candidates: readonly DriverHandle[]\n input: unknown\n context?: unknown\n resolverContext?: ResolverContext\n availability?: Map<string, DriverAvailability>\n /** Resolved secrets to inject into DriverContext. */\n secrets?: Record<string, string>\n /** Caller-set abort signal. Must be honoured. */\n signal?: AbortSignal\n}): Promise<TOutput> {\n const { tool, candidates, input, context = {} } = args\n const resolverContext = args.resolverContext ?? {}\n const signal = args.signal ?? new AbortController().signal\n\n // 1. Resolve.\n const inputKeys = isPlainObject(input) ? Object.keys(input) : []\n const resolution = resolveDriver({\n tool,\n candidates,\n context: resolverContext,\n inputKeys,\n availability: args.availability,\n })\n if (!resolution.ok) {\n throw new ToolError({\n code: resolution.error.code,\n message: resolution.error.message,\n cause: resolution.error.rejected,\n })\n }\n const { provider, implementsEntry } = resolution\n\n // 2. Validate input + context.\n const inputValidation = validateInput(tool, input)\n if (!inputValidation.ok) {\n throw new ToolError(inputValidation.error)\n }\n const contextValidation = validateContext(tool, context)\n if (!contextValidation.ok) {\n throw new ToolError(contextValidation.error)\n }\n\n // 3. Apply mapping. Schema-narrowing was already enforced in resolver\n // Phase 1; mapping is the rename/transform pass.\n const mapped = applyMapping(inputValidation.value, implementsEntry.mapping)\n\n // 4. Build DriverContext.\n const driverCtx: DriverContext = {\n secrets: args.secrets ?? {},\n authState: \"authed\",\n providerId: provider.id,\n driverKind: provider.kind,\n implementsEntry,\n }\n\n // 5. Invoke.\n const executeFn = provider.execute[tool.id]\n if (!executeFn) {\n throw new ToolError({\n code: \"execute_binding_mismatch\",\n message: `provider '${provider.id}' has no execute['${tool.id}'] body`,\n })\n }\n const timeoutMs =\n provider.timeoutOverrideMs ??\n implementsEntry.timeoutOverrideMs ??\n tool.timeoutMs\n const rawOutput = await runWithTimeout(timeoutMs, signal, async sig =>\n executeFn({\n input: mapped,\n context: contextValidation.value,\n driverCtx,\n signal: sig,\n })\n )\n\n // 6. Validate output. Throws ToolError on mismatch.\n return validateOutput(tool, rawOutput)\n}\n\n/**\n * Apply the implements entry's `mapping` to the input shape. v1\n * supports identity rename (`prompt: prompt`), key rename\n * (`style: artistic_style`), and `{ from, transform }` (the runtime\n * looks up `transform` on the provider's transformer registry — out\n * of scope for v1; we pass through the original value).\n *\n * When `mapping` is omitted, the input is returned verbatim.\n */\nexport function applyMapping(\n input: unknown,\n mapping: Record<string, MappingValue> | undefined\n): unknown {\n if (!mapping || !isPlainObject(input)) return input\n const out: Record<string, unknown> = {}\n // 1) Pass through unmapped keys verbatim.\n const mappedSrcKeys = new Set<string>()\n for (const [destKey, value] of Object.entries(mapping)) {\n if (typeof value === \"string\") mappedSrcKeys.add(value)\n else mappedSrcKeys.add(value.from)\n }\n for (const [k, v] of Object.entries(input as Record<string, unknown>)) {\n if (!mappedSrcKeys.has(k)) {\n out[k] = v\n }\n }\n // 2) Apply mapping.\n const inputObj = input as Record<string, unknown>\n for (const [destKey, value] of Object.entries(mapping)) {\n if (typeof value === \"string\") {\n // Identity / rename: out[destKey] = input[value]\n const srcKey = value\n if (srcKey in inputObj) out[destKey] = inputObj[srcKey]\n } else {\n // { from, transform } — v1 passes through; transformers reserved\n // for the kind-specific runtime to override (each runtime can\n // expose a transformer registry the entry's `metadata` keys into).\n if (value.from in inputObj) out[destKey] = inputObj[value.from]\n }\n }\n return out\n}\n\nasync function runWithTimeout<T>(\n timeoutMs: number,\n parentSignal: AbortSignal,\n fn: (signal: AbortSignal) => Promise<T>\n): Promise<T> {\n const controller = new AbortController()\n const onParentAbort = () => controller.abort(parentSignal.reason)\n if (parentSignal.aborted) controller.abort(parentSignal.reason)\n else parentSignal.addEventListener(\"abort\", onParentAbort, { once: true })\n\n const timer = setTimeout(() => {\n controller.abort(new ToolError({ code: \"timeout\", message: `exceeded ${timeoutMs}ms` }))\n }, timeoutMs)\n\n try {\n return await fn(controller.signal)\n } finally {\n clearTimeout(timer)\n parentSignal.removeEventListener(\"abort\", onParentAbort)\n }\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v)\n}\n\nexport type { ImplementsEntry, DriverContext, DriverHandle, ResolverContext }\n","/**\n * AIP-30 doctype spec — fed to `@agentproto/manifest.createVerbs`\n * to derive create / load / list / update / resolve / delete in one\n * place, mirroring the pattern in `@agentproto/tool/src/spec.ts`.\n *\n * The spec bridges two naming conventions:\n * - DRIVER.md frontmatter uses snake_case (policy_tags, schema_narrowing, …)\n * - DriverDefinition / DriverHandle use camelCase (policyTags, schemaNarrowing, …)\n *\n * `parse()` converts snake → camel so `createVerbs.load/list` hand a\n * proper `DriverDefinition` to `defineDriver`.\n *\n * `toFrontmatter()` converts camel → snake so `createVerbs.create/update`\n * write valid DRIVER.md files. Only the universal AIP-30 fields are mapped;\n * install.* is intentionally omitted until AIP-29 install shapes are stable.\n *\n * `define()` injects stub execute bodies (D3) when neither `execute` nor\n * `implementations` are present, so file-system ops work without a TS\n * dispatch module alongside the DRIVER.md.\n */\n\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport { defineDriver, normalizeToolId } from \"./define-provider.js\"\nimport { parseDriverManifest } from \"./manifest/index.js\"\nimport type { DriverDefinition, DriverHandle, ExecuteFn } from \"./types.js\"\n\nexport const driverSpec: DoctypeSpec<DriverDefinition, DriverHandle> = {\n name: \"driver\",\n aip: 30,\n schemaLiteral: \"agentproto/driver/v1\",\n\n pathOf: (h) => `${h.id}/DRIVER.md`,\n\n define: (params: DriverDefinition): DriverHandle => {\n if (!params.execute && !params.implementations) {\n const stubs: Record<string, ExecuteFn> = {}\n for (const entry of params.implements ?? []) {\n const id = normalizeToolId(entry.tool)\n stubs[id] = (): never => {\n throw new Error(\n `stub: no execute body for '${id}' — ` +\n `use driverFromManifest({ manifest, execute }) for dispatch`,\n )\n }\n }\n return defineDriver({ ...params, execute: stubs })\n }\n return defineDriver(params)\n },\n\n parse: (source: string) => {\n const m = parseDriverManifest(source)\n const fm = m.frontmatter\n\n const def: DriverDefinition = {\n id: fm.id,\n name: fm.name,\n description: fm.description,\n kind: fm.kind,\n ...(fm.version !== undefined && { version: fm.version }),\n implements: fm.implements.map((entry) => ({\n tool: entry.tool,\n version: entry.version,\n ...(entry.schema_narrowing && {\n schemaNarrowing: {\n ...(entry.schema_narrowing.drop_inputs?.length && {\n dropInputs: entry.schema_narrowing.drop_inputs,\n }),\n ...(entry.schema_narrowing.drop_outputs?.length && {\n dropOutputs: entry.schema_narrowing.drop_outputs,\n }),\n },\n }),\n ...(entry.mapping && { mapping: entry.mapping }),\n ...(entry.cost_override !== undefined && {\n costOverride: entry.cost_override as DriverDefinition[\"costOverride\"],\n }),\n ...(entry.timeout_override_ms !== undefined && {\n timeoutOverrideMs: entry.timeout_override_ms,\n }),\n ...(entry.retry_override !== undefined && {\n retryOverride: entry.retry_override as DriverDefinition[\"retryOverride\"],\n }),\n ...(entry.metadata && { metadata: entry.metadata }),\n })),\n ...(fm.auth !== undefined && {\n auth: fm.auth as DriverDefinition[\"auth\"],\n }),\n ...(fm.network && { network: fm.network }),\n ...(fm.region?.length && { region: fm.region }),\n ...(fm.policy_tags?.length && { policyTags: fm.policy_tags }),\n ...(fm.cost_override !== undefined && {\n costOverride: fm.cost_override as DriverDefinition[\"costOverride\"],\n }),\n ...(fm.timeout_override_ms !== undefined && {\n timeoutOverrideMs: fm.timeout_override_ms,\n }),\n ...(fm.retry_override !== undefined && {\n retryOverride: fm.retry_override as DriverDefinition[\"retryOverride\"],\n }),\n ...(fm.health_check !== undefined && {\n healthCheck: fm.health_check as DriverDefinition[\"healthCheck\"],\n }),\n ...(fm.version_check !== undefined && {\n versionCheck: fm.version_check as DriverDefinition[\"versionCheck\"],\n }),\n ...(fm.install?.length && {\n install: fm.install as DriverDefinition[\"install\"],\n }),\n ...(fm.tags?.length && { tags: fm.tags }),\n ...(fm.metadata && { metadata: fm.metadata }),\n }\n\n return {\n frontmatter: def as unknown as Record<string, unknown>,\n body: m.body,\n }\n },\n\n toFrontmatter: (params: DriverDefinition): Record<string, unknown> => {\n const fm: Record<string, unknown> = {\n schema: \"agentproto/driver/v1\",\n id: params.id,\n name: params.name,\n description: params.description,\n }\n if (params.version !== undefined) fm.version = params.version\n fm.kind = params.kind\n fm.implements = (params.implements ?? []).map((entry) => {\n const e: Record<string, unknown> = {\n tool: entry.tool,\n version: entry.version,\n }\n if (entry.schemaNarrowing) {\n const sn: Record<string, unknown> = {}\n if (entry.schemaNarrowing.dropInputs?.length)\n sn.drop_inputs = [...entry.schemaNarrowing.dropInputs]\n if (entry.schemaNarrowing.dropOutputs?.length)\n sn.drop_outputs = [...entry.schemaNarrowing.dropOutputs]\n e.schema_narrowing = sn\n }\n if (entry.mapping) e.mapping = entry.mapping\n if (entry.costOverride) e.cost_override = entry.costOverride\n if (entry.timeoutOverrideMs !== undefined)\n e.timeout_override_ms = entry.timeoutOverrideMs\n if (entry.retryOverride) e.retry_override = entry.retryOverride\n if (entry.metadata) e.metadata = entry.metadata\n return e\n })\n if (params.auth) fm.auth = params.auth\n if (params.network) fm.network = params.network\n if (params.region?.length) fm.region = [...params.region]\n if (params.policyTags?.length) fm.policy_tags = [...params.policyTags]\n if (params.costOverride) fm.cost_override = params.costOverride\n if (params.timeoutOverrideMs !== undefined)\n fm.timeout_override_ms = params.timeoutOverrideMs\n if (params.retryOverride) fm.retry_override = params.retryOverride\n if (params.healthCheck) fm.health_check = params.healthCheck\n if (params.versionCheck) fm.version_check = params.versionCheck\n if (params.tags?.length) fm.tags = [...params.tags]\n if (params.metadata && Object.keys(params.metadata).length > 0)\n fm.metadata = { ...params.metadata }\n return fm\n },\n}\n\nexport const driverVerbs = createVerbs(driverSpec)\n","/**\n * @agentproto/driver — AIP-30 DRIVER.md `defineDriver`\n * reference implementation + 6-phase resolver + per-call dispatch.\n *\n * Spec: https://agentproto.sh/docs/aip-30\n */\n\nexport const SPEC_NAME = \"agentdriver/v1\" as const\nexport const SPEC_VERSION = \"1.0.0-alpha\" as const\n\nexport { defineDriver, normalizeToolId } from \"./define-provider.js\"\nexport { implementTool } from \"./implement-tool.js\"\nexport { resolveDriver } from \"./resolver.js\"\nexport { runTool, applyMapping } from \"./run-tool.js\"\n\nexport type {\n ToolImplementation,\n TypedExecuteFn,\n} from \"./implement-tool.js\"\n\nexport type {\n DriverDefinition,\n DriverHandle,\n ImplementsEntry,\n MappingValue,\n ExecuteFn,\n ExecuteArgs,\n DriverContext,\n AuthConfig,\n AuthLoginConfig,\n AuthRefreshConfig,\n InstallMethod,\n VersionCheck,\n CostOverride,\n RetryPolicy,\n HealthCheckConfig,\n LoginArgs,\n LoginResult,\n RefreshArgs,\n RefreshResult,\n ParseOutputArgs,\n ParseOutputResult,\n DetectExpiryArgs,\n ResolverInput,\n ResolverContext,\n ResolverResult,\n} from \"./types.js\"\n\nexport type { DriverAvailability } from \"./resolver.js\"\n\nexport { driverSpec, driverVerbs } from \"./spec.js\"\n"]}
@@ -0,0 +1,104 @@
1
+ import { z } from 'zod';
2
+ import { g as ExecuteFn, T as ToolImplementation, a as DriverHandle } from '../types-U3ItqOQG.js';
3
+ import '@agentproto/tool';
4
+
5
+ /**
6
+ * AIP-30 DRIVER.md sidecar parser + manifest-to-handle constructor.
7
+ *
8
+ * Mirror of `@agentproto/tool/manifest`: the .md provides
9
+ * metadata + dispatch declarations (`implements[]`, `install`, `auth`,
10
+ * `network`, …); the TS module supplies the execute bodies. Both inputs
11
+ * end up in `defineDriver` so the cross-AIP invariants (id pattern,
12
+ * description length, top-level freeze, error prefix) run uniformly.
13
+ *
14
+ * The frontmatter schema below covers the AIP-30 §"Frontmatter" block
15
+ * loosely — only the universally-required fields are strictly typed
16
+ * (id, name, description, version, kind, implements). Subtype-specific
17
+ * extras (CLI argv, HTTP endpoints, MCP tool names) live under
18
+ * `metadata` or `implements[].metadata` with `unknown`-typed values
19
+ * and are validated by the kind-specific runtime packages, not here.
20
+ */
21
+
22
+ declare const driverManifestFrontmatterSchema: z.ZodObject<{
23
+ schema: z.ZodOptional<z.ZodLiteral<"agentproto/driver/v1">>;
24
+ id: z.ZodString;
25
+ name: z.ZodString;
26
+ description: z.ZodString;
27
+ version: z.ZodOptional<z.ZodString>;
28
+ kind: z.ZodEnum<{
29
+ cli: "cli";
30
+ http: "http";
31
+ mcp: "mcp";
32
+ sdk: "sdk";
33
+ builtin: "builtin";
34
+ }>;
35
+ implements: z.ZodArray<z.ZodObject<{
36
+ tool: z.ZodString;
37
+ version: z.ZodString;
38
+ schema_narrowing: z.ZodOptional<z.ZodObject<{
39
+ drop_inputs: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ drop_outputs: z.ZodOptional<z.ZodArray<z.ZodString>>;
41
+ }, z.core.$strip>>;
42
+ mapping: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
43
+ from: z.ZodString;
44
+ transform: z.ZodOptional<z.ZodString>;
45
+ }, z.core.$strip>]>>>;
46
+ cost_override: z.ZodOptional<z.ZodUnknown>;
47
+ timeout_override_ms: z.ZodOptional<z.ZodNumber>;
48
+ retry_override: z.ZodOptional<z.ZodUnknown>;
49
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
50
+ }, z.core.$loose>>;
51
+ install: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
52
+ version_check: z.ZodOptional<z.ZodUnknown>;
53
+ auth: z.ZodOptional<z.ZodUnknown>;
54
+ network: z.ZodOptional<z.ZodObject<{
55
+ egress: z.ZodOptional<z.ZodArray<z.ZodString>>;
56
+ ingress: z.ZodOptional<z.ZodArray<z.ZodString>>;
57
+ }, z.core.$strip>>;
58
+ region: z.ZodOptional<z.ZodArray<z.ZodString>>;
59
+ policy_tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
60
+ cost_override: z.ZodOptional<z.ZodUnknown>;
61
+ timeout_override_ms: z.ZodOptional<z.ZodNumber>;
62
+ retry_override: z.ZodOptional<z.ZodUnknown>;
63
+ health_check: z.ZodOptional<z.ZodUnknown>;
64
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
65
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
66
+ }, z.core.$loose>;
67
+ type DriverManifestFrontmatter = z.infer<typeof driverManifestFrontmatterSchema>;
68
+ interface DriverManifest {
69
+ frontmatter: DriverManifestFrontmatter;
70
+ body: string;
71
+ }
72
+ /**
73
+ * Parse a DRIVER.md source string into structured frontmatter + body.
74
+ * Throws on missing frontmatter or schema-invalid frontmatter.
75
+ */
76
+ declare function parseDriverManifest(source: string): DriverManifest;
77
+ /**
78
+ * Build a {@link DriverHandle} from a parsed `DRIVER.md` manifest +
79
+ * caller-supplied execute bodies. The .md is the source of truth for
80
+ * dispatch metadata (`implements[]`, install, auth, network, …); the
81
+ * TS module supplies the actual function bodies via `execute` (legacy
82
+ * keyed bag) or `implementations` (typed via `implementTool(handle, body)`).
83
+ *
84
+ * Mirrors `toolFromManifest`: same shape, same single source of truth
85
+ * principle. Goes through `defineDriver` so the AIP-30 invariants
86
+ * (`implements[]` ↔ execute consistency, top-level freeze, error
87
+ * prefix) run uniformly with the TS path.
88
+ *
89
+ * @example
90
+ * const manifest = parseDriverManifest(readFileSync("./gh-cli/DRIVER.md", "utf8"))
91
+ * const ghCli = driverFromManifest({
92
+ * manifest,
93
+ * execute: {
94
+ * "list-prs": async ({ input }) => { ... },
95
+ * },
96
+ * })
97
+ */
98
+ declare function driverFromManifest(args: {
99
+ manifest: DriverManifest;
100
+ execute?: Record<string, ExecuteFn>;
101
+ implementations?: readonly ToolImplementation<any, any, any>[];
102
+ }): DriverHandle;
103
+
104
+ export { type DriverManifest, type DriverManifestFrontmatter, driverFromManifest, driverManifestFrontmatterSchema, parseDriverManifest };
@@ -0,0 +1,3 @@
1
+ export { driverFromManifest, driverManifestFrontmatterSchema, parseDriverManifest } from '../chunk-6NYFD4YS.mjs';
2
+ //# sourceMappingURL=index.mjs.map
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}