@ouispec/agent-worker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/approvals/client.d.ts +29 -0
  4. package/dist/approvals/client.d.ts.map +1 -0
  5. package/dist/approvals/client.js +50 -0
  6. package/dist/approvals/client.js.map +1 -0
  7. package/dist/approvals/continuation.d.ts +28 -0
  8. package/dist/approvals/continuation.d.ts.map +1 -0
  9. package/dist/approvals/continuation.js +43 -0
  10. package/dist/approvals/continuation.js.map +1 -0
  11. package/dist/approvals/preview.d.ts +15 -0
  12. package/dist/approvals/preview.d.ts.map +1 -0
  13. package/dist/approvals/preview.js +33 -0
  14. package/dist/approvals/preview.js.map +1 -0
  15. package/dist/approvals/requirement.d.ts +15 -0
  16. package/dist/approvals/requirement.d.ts.map +1 -0
  17. package/dist/approvals/requirement.js +26 -0
  18. package/dist/approvals/requirement.js.map +1 -0
  19. package/dist/authz/tool-policy.d.ts +63 -0
  20. package/dist/authz/tool-policy.d.ts.map +1 -0
  21. package/dist/authz/tool-policy.js +23 -0
  22. package/dist/authz/tool-policy.js.map +1 -0
  23. package/dist/container/server.d.ts +24 -0
  24. package/dist/container/server.d.ts.map +1 -0
  25. package/dist/container/server.js +119 -0
  26. package/dist/container/server.js.map +1 -0
  27. package/dist/emit/http-adapter.d.ts +15 -0
  28. package/dist/emit/http-adapter.d.ts.map +1 -0
  29. package/dist/emit/http-adapter.js +35 -0
  30. package/dist/emit/http-adapter.js.map +1 -0
  31. package/dist/emit/types.d.ts +9 -0
  32. package/dist/emit/types.d.ts.map +1 -0
  33. package/dist/emit/types.js +7 -0
  34. package/dist/emit/types.js.map +1 -0
  35. package/dist/events/http-waiter.d.ts +19 -0
  36. package/dist/events/http-waiter.d.ts.map +1 -0
  37. package/dist/events/http-waiter.js +20 -0
  38. package/dist/events/http-waiter.js.map +1 -0
  39. package/dist/index.d.ts +60 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +45 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/lambda/handler.d.ts +38 -0
  44. package/dist/lambda/handler.d.ts.map +1 -0
  45. package/dist/lambda/handler.js +26 -0
  46. package/dist/lambda/handler.js.map +1 -0
  47. package/dist/model.d.ts +33 -0
  48. package/dist/model.d.ts.map +1 -0
  49. package/dist/model.js +15 -0
  50. package/dist/model.js.map +1 -0
  51. package/dist/openapi/document.d.ts +87 -0
  52. package/dist/openapi/document.d.ts.map +1 -0
  53. package/dist/openapi/document.js +117 -0
  54. package/dist/openapi/document.js.map +1 -0
  55. package/dist/openapi/executor.d.ts +51 -0
  56. package/dist/openapi/executor.d.ts.map +1 -0
  57. package/dist/openapi/executor.js +140 -0
  58. package/dist/openapi/executor.js.map +1 -0
  59. package/dist/openapi/index.d.ts +14 -0
  60. package/dist/openapi/index.d.ts.map +1 -0
  61. package/dist/openapi/index.js +9 -0
  62. package/dist/openapi/index.js.map +1 -0
  63. package/dist/openapi/loader.d.ts +81 -0
  64. package/dist/openapi/loader.d.ts.map +1 -0
  65. package/dist/openapi/loader.js +361 -0
  66. package/dist/openapi/loader.js.map +1 -0
  67. package/dist/openapi/x-agent.d.ts +34 -0
  68. package/dist/openapi/x-agent.d.ts.map +1 -0
  69. package/dist/openapi/x-agent.js +102 -0
  70. package/dist/openapi/x-agent.js.map +1 -0
  71. package/dist/orchestrator.d.ts +12 -0
  72. package/dist/orchestrator.d.ts.map +1 -0
  73. package/dist/orchestrator.js +1019 -0
  74. package/dist/orchestrator.js.map +1 -0
  75. package/dist/prompt/builder.d.ts +29 -0
  76. package/dist/prompt/builder.d.ts.map +1 -0
  77. package/dist/prompt/builder.js +129 -0
  78. package/dist/prompt/builder.js.map +1 -0
  79. package/dist/prompt/index.d.ts +15 -0
  80. package/dist/prompt/index.d.ts.map +1 -0
  81. package/dist/prompt/index.js +13 -0
  82. package/dist/prompt/index.js.map +1 -0
  83. package/dist/prompt/rules/base.d.ts +6 -0
  84. package/dist/prompt/rules/base.d.ts.map +1 -0
  85. package/dist/prompt/rules/base.js +38 -0
  86. package/dist/prompt/rules/base.js.map +1 -0
  87. package/dist/prompt/rules/communication.d.ts +7 -0
  88. package/dist/prompt/rules/communication.d.ts.map +1 -0
  89. package/dist/prompt/rules/communication.js +53 -0
  90. package/dist/prompt/rules/communication.js.map +1 -0
  91. package/dist/prompt/rules/tool-strategy.d.ts +6 -0
  92. package/dist/prompt/rules/tool-strategy.d.ts.map +1 -0
  93. package/dist/prompt/rules/tool-strategy.js +42 -0
  94. package/dist/prompt/rules/tool-strategy.js.map +1 -0
  95. package/dist/prompt/rules/ui-control.d.ts +10 -0
  96. package/dist/prompt/rules/ui-control.d.ts.map +1 -0
  97. package/dist/prompt/rules/ui-control.js +44 -0
  98. package/dist/prompt/rules/ui-control.js.map +1 -0
  99. package/dist/prompt/types.d.ts +85 -0
  100. package/dist/prompt/types.d.ts.map +1 -0
  101. package/dist/prompt/types.js +10 -0
  102. package/dist/prompt/types.js.map +1 -0
  103. package/dist/realtime/long-poll.d.ts +21 -0
  104. package/dist/realtime/long-poll.d.ts.map +1 -0
  105. package/dist/realtime/long-poll.js +36 -0
  106. package/dist/realtime/long-poll.js.map +1 -0
  107. package/dist/runtime/config.d.ts +4 -0
  108. package/dist/runtime/config.d.ts.map +1 -0
  109. package/dist/runtime/config.js +29 -0
  110. package/dist/runtime/config.js.map +1 -0
  111. package/dist/runtime/turn-runner.d.ts +32 -0
  112. package/dist/runtime/turn-runner.d.ts.map +1 -0
  113. package/dist/runtime/turn-runner.js +216 -0
  114. package/dist/runtime/turn-runner.js.map +1 -0
  115. package/dist/runtime/types.d.ts +244 -0
  116. package/dist/runtime/types.d.ts.map +1 -0
  117. package/dist/runtime/types.js +2 -0
  118. package/dist/runtime/types.js.map +1 -0
  119. package/dist/testing/desk-events.d.ts +12 -0
  120. package/dist/testing/desk-events.d.ts.map +1 -0
  121. package/dist/testing/desk-events.js +62 -0
  122. package/dist/testing/desk-events.js.map +1 -0
  123. package/dist/testing/index.d.ts +8 -0
  124. package/dist/testing/index.d.ts.map +1 -0
  125. package/dist/testing/index.js +7 -0
  126. package/dist/testing/index.js.map +1 -0
  127. package/dist/testing/openapi-fixture.d.ts +47 -0
  128. package/dist/testing/openapi-fixture.d.ts.map +1 -0
  129. package/dist/testing/openapi-fixture.js +370 -0
  130. package/dist/testing/openapi-fixture.js.map +1 -0
  131. package/dist/tools/async-binding.d.ts +71 -0
  132. package/dist/tools/async-binding.d.ts.map +1 -0
  133. package/dist/tools/async-binding.js +104 -0
  134. package/dist/tools/async-binding.js.map +1 -0
  135. package/dist/tools/builtin-tools.d.ts +20 -0
  136. package/dist/tools/builtin-tools.d.ts.map +1 -0
  137. package/dist/tools/builtin-tools.js +108 -0
  138. package/dist/tools/builtin-tools.js.map +1 -0
  139. package/dist/tools/entity-tools.d.ts +6 -0
  140. package/dist/tools/entity-tools.d.ts.map +1 -0
  141. package/dist/tools/entity-tools.js +227 -0
  142. package/dist/tools/entity-tools.js.map +1 -0
  143. package/dist/tools/input-validation.d.ts +16 -0
  144. package/dist/tools/input-validation.d.ts.map +1 -0
  145. package/dist/tools/input-validation.js +75 -0
  146. package/dist/tools/input-validation.js.map +1 -0
  147. package/dist/tools/load-all-tools.d.ts +12 -0
  148. package/dist/tools/load-all-tools.d.ts.map +1 -0
  149. package/dist/tools/load-all-tools.js +42 -0
  150. package/dist/tools/load-all-tools.js.map +1 -0
  151. package/dist/tools/schema-loader.d.ts +24 -0
  152. package/dist/tools/schema-loader.d.ts.map +1 -0
  153. package/dist/tools/schema-loader.js +267 -0
  154. package/dist/tools/schema-loader.js.map +1 -0
  155. package/dist/tools/types.d.ts +85 -0
  156. package/dist/tools/types.d.ts.map +1 -0
  157. package/dist/tools/types.js +22 -0
  158. package/dist/tools/types.js.map +1 -0
  159. package/dist/turn-policy.d.ts +68 -0
  160. package/dist/turn-policy.d.ts.map +1 -0
  161. package/dist/turn-policy.js +21 -0
  162. package/dist/turn-policy.js.map +1 -0
  163. package/dist/types.d.ts +151 -0
  164. package/dist/types.d.ts.map +1 -0
  165. package/dist/types.js +2 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/ui/channel.d.ts +64 -0
  168. package/dist/ui/channel.d.ts.map +1 -0
  169. package/dist/ui/channel.js +81 -0
  170. package/dist/ui/channel.js.map +1 -0
  171. package/dist/ui/knowledge.d.ts +30 -0
  172. package/dist/ui/knowledge.d.ts.map +1 -0
  173. package/dist/ui/knowledge.js +66 -0
  174. package/dist/ui/knowledge.js.map +1 -0
  175. package/dist/ui/observations.d.ts +41 -0
  176. package/dist/ui/observations.d.ts.map +1 -0
  177. package/dist/ui/observations.js +236 -0
  178. package/dist/ui/observations.js.map +1 -0
  179. package/dist/ui/snapshot.d.ts +33 -0
  180. package/dist/ui/snapshot.d.ts.map +1 -0
  181. package/dist/ui/snapshot.js +75 -0
  182. package/dist/ui/snapshot.js.map +1 -0
  183. package/dist/ui/ui-sequence.d.ts +75 -0
  184. package/dist/ui/ui-sequence.d.ts.map +1 -0
  185. package/dist/ui/ui-sequence.js +73 -0
  186. package/dist/ui/ui-sequence.js.map +1 -0
  187. package/dist/ui/ui-tools.d.ts +59 -0
  188. package/dist/ui/ui-tools.d.ts.map +1 -0
  189. package/dist/ui/ui-tools.js +244 -0
  190. package/dist/ui/ui-tools.js.map +1 -0
  191. package/package.json +78 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * The parts of an OpenAPI 3.0 or 3.1 document the tool loader reads, and the
3
+ * conversion of its schemas into the JSON Schema a tool declares.
4
+ */
5
+ export const HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'];
6
+ /** Thrown for anything the loader refuses; the message names the operation. */
7
+ export class OpenApiToolError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'OpenApiToolError';
11
+ }
12
+ }
13
+ function isReference(value) {
14
+ return !!value && typeof value === 'object' && typeof value.$ref === 'string';
15
+ }
16
+ /**
17
+ * Resolves `#/...` references in one document. `where` names the operation in
18
+ * errors. A reference outside the document, or one that does not resolve, is refused.
19
+ */
20
+ export function createResolver(doc) {
21
+ function lookup(ref, where) {
22
+ if (!ref.startsWith('#/'))
23
+ throw new OpenApiToolError(`${where}: $ref "${ref}" is not in this document`);
24
+ let node = doc;
25
+ for (const raw of ref.slice(2).split('/')) {
26
+ const key = raw.replace(/~1/g, '/').replace(/~0/g, '~');
27
+ if (!node || typeof node !== 'object' || !(key in node)) {
28
+ throw new OpenApiToolError(`${where}: $ref "${ref}" does not resolve`);
29
+ }
30
+ node = node[key];
31
+ }
32
+ return node;
33
+ }
34
+ /** Follow references until a value that is not one. */
35
+ function deref(value, where) {
36
+ const seen = new Set();
37
+ let current = value;
38
+ while (isReference(current)) {
39
+ if (seen.has(current.$ref))
40
+ throw new OpenApiToolError(`${where}: ${current.$ref} refers to itself`);
41
+ seen.add(current.$ref);
42
+ current = lookup(current.$ref, where);
43
+ }
44
+ return current;
45
+ }
46
+ return { deref, lookup };
47
+ }
48
+ /** Keywords OpenAPI adds to a schema that are not JSON Schema, and mean nothing to a tool's input. */
49
+ const OPENAPI_ONLY_KEYWORDS = new Set(['discriminator', 'xml', 'externalDocs', 'example', 'nullable']);
50
+ /** Keywords whose value is one schema. */
51
+ const SUBSCHEMA_KEYWORDS = ['items', 'additionalProperties', 'not', 'contains', 'propertyNames', 'if', 'then', 'else', 'unevaluatedProperties', 'unevaluatedItems', 'additionalItems'];
52
+ /** Keywords whose value is a list of schemas. */
53
+ const SUBSCHEMA_LIST_KEYWORDS = ['allOf', 'anyOf', 'oneOf', 'prefixItems'];
54
+ /** Keywords whose value maps names to schemas. */
55
+ const SUBSCHEMA_MAP_KEYWORDS = ['properties', 'patternProperties', 'dependentSchemas', '$defs', 'definitions'];
56
+ /**
57
+ * An OpenAPI schema as the JSON Schema of a tool's input: every reference inlined,
58
+ * 3.0's `nullable` as a `null` type, `example` as `examples`, and properties the
59
+ * server sets (`readOnly`) left out, since a caller never sends them.
60
+ *
61
+ * A schema that refers to itself cannot be inlined and is refused.
62
+ */
63
+ export function toInputSchema(schema, resolver, where, stack = []) {
64
+ if (isReference(schema)) {
65
+ const ref = schema.$ref;
66
+ if (stack.includes(ref))
67
+ throw new OpenApiToolError(`${where}: ${ref} refers to itself, so it cannot be inlined into a tool's input`);
68
+ return toInputSchema(resolver.lookup(ref, where), resolver, where, [...stack, ref]);
69
+ }
70
+ if (!schema || typeof schema !== 'object' || Array.isArray(schema)) {
71
+ return typeof schema === 'boolean' ? (schema ? {} : { not: {} }) : {};
72
+ }
73
+ const source = schema;
74
+ const out = {};
75
+ for (const [key, value] of Object.entries(source)) {
76
+ if (OPENAPI_ONLY_KEYWORDS.has(key) || key.startsWith('x-'))
77
+ continue;
78
+ if (SUBSCHEMA_KEYWORDS.includes(key) && value && typeof value === 'object') {
79
+ out[key] = toInputSchema(value, resolver, where, stack);
80
+ }
81
+ else if (SUBSCHEMA_LIST_KEYWORDS.includes(key) && Array.isArray(value)) {
82
+ out[key] = value.map((entry) => toInputSchema(entry, resolver, where, stack));
83
+ }
84
+ else if (SUBSCHEMA_MAP_KEYWORDS.includes(key) && value && typeof value === 'object') {
85
+ out[key] = Object.fromEntries(Object.entries(value).map(([name, entry]) => [name, toInputSchema(entry, resolver, where, stack)]));
86
+ }
87
+ else {
88
+ out[key] = value;
89
+ }
90
+ }
91
+ if (source.example !== undefined && out.examples === undefined)
92
+ out.examples = [source.example];
93
+ // 3.0: `nullable: true` beside a type allows null too.
94
+ if (source.nullable === true && out.type !== undefined) {
95
+ const types = Array.isArray(out.type) ? out.type : [out.type];
96
+ if (!types.includes('null'))
97
+ out.type = [...types, 'null'];
98
+ }
99
+ // The server sets read-only properties; a caller never sends them.
100
+ if (out.properties && typeof out.properties === 'object') {
101
+ const properties = source.properties;
102
+ const readOnly = Object.keys(properties).filter((name) => {
103
+ const entry = isReference(properties[name]) ? resolver.deref(properties[name], where) : properties[name];
104
+ return !!entry && typeof entry === 'object' && entry.readOnly === true;
105
+ });
106
+ if (readOnly.length > 0) {
107
+ out.properties = Object.fromEntries(Object.entries(out.properties).filter(([name]) => !readOnly.includes(name)));
108
+ if (Array.isArray(out.required)) {
109
+ out.required = out.required.filter((name) => !readOnly.includes(name));
110
+ if (out.required.length === 0)
111
+ delete out.required;
112
+ }
113
+ }
114
+ }
115
+ return out;
116
+ }
117
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/openapi/document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Calls one OpenAPI operation as the caller the auth seam names.
3
+ *
4
+ * The API decides what the caller may do: a permission they lack comes back as the
5
+ * route's own refusal (a 403), which is returned as the tool's error, with the
6
+ * status and body, for the model to read. Nothing here widens or checks access.
7
+ */
8
+ import type { ToolExecutionContext, ToolExecutionResult } from '../tools/types.js';
9
+ import type { HttpMethod } from './document.js';
10
+ /** Where each input property goes in the request. */
11
+ export type InputPlacement = {
12
+ in: 'path';
13
+ name: string;
14
+ } | {
15
+ in: 'query';
16
+ name: string;
17
+ style: 'form' | 'spaceDelimited' | 'pipeDelimited' | 'deepObject';
18
+ explode: boolean;
19
+ }
20
+ /** One field of a JSON object body, flattened beside the parameters. */
21
+ | {
22
+ in: 'bodyField';
23
+ name: string;
24
+ }
25
+ /** The whole JSON body, under the input property `body`. */
26
+ | {
27
+ in: 'body';
28
+ };
29
+ export interface OperationRef {
30
+ operationId: string;
31
+ method: HttpMethod;
32
+ path: string;
33
+ }
34
+ /**
35
+ * Who a call acts as: the headers that make the API treat it as that caller.
36
+ *
37
+ * It is required and has no default. A product passes its own mechanism, such as a
38
+ * signed assertion naming the user (Closure's is ADR-0182's), or the credential an
39
+ * MCP client authenticated with.
40
+ */
41
+ export type ActAs = (ctx: ToolExecutionContext, operation: OperationRef) => Record<string, string> | Promise<Record<string, string>>;
42
+ export interface ExecutorPlan extends OperationRef {
43
+ baseUrl: string;
44
+ placements: Map<string, InputPlacement>;
45
+ /** Header parameters the operation requires; only actAs can supply them. */
46
+ requiredHeaders: string[];
47
+ actAs: ActAs;
48
+ fetch: typeof fetch;
49
+ }
50
+ export declare function executeOperation(plan: ExecutorPlan, input: Record<string, unknown>, ctx: ToolExecutionContext): Promise<ToolExecutionResult>;
51
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/openapi/executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,qDAAqD;AACrD,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,eAAe,GAAG,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AACpH,wEAAwE;GACtE;IAAE,EAAE,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACnC,4DAA4D;GAC1D;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnB,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,MAAM,MAAM,KAAK,GAAG,CAClB,GAAG,EAAE,oBAAoB,EACzB,SAAS,EAAE,YAAY,KACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxC,4EAA4E;IAC5E,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,OAAO,KAAK,CAAC;CACrB;AA2DD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAgE9B"}
@@ -0,0 +1,140 @@
1
+ function serialiseQuery(search, placement, value) {
2
+ const { name, style, explode } = placement;
3
+ if (Array.isArray(value)) {
4
+ const items = value.map(String);
5
+ if (style === 'form' && explode)
6
+ for (const item of items)
7
+ search.append(name, item);
8
+ else
9
+ search.append(name, items.join(style === 'spaceDelimited' ? ' ' : style === 'pipeDelimited' ? '|' : ','));
10
+ return;
11
+ }
12
+ if (value && typeof value === 'object') {
13
+ const entries = Object.entries(value);
14
+ if (style === 'deepObject')
15
+ for (const [key, v] of entries)
16
+ search.append(`${name}[${key}]`, String(v));
17
+ else if (explode)
18
+ for (const [key, v] of entries)
19
+ search.append(key, String(v));
20
+ else
21
+ search.append(name, entries.flatMap(([key, v]) => [key, String(v)]).join(','));
22
+ return;
23
+ }
24
+ search.append(name, String(value));
25
+ }
26
+ function serialisePath(value) {
27
+ if (Array.isArray(value))
28
+ return value.map((v) => encodeURIComponent(String(v))).join(',');
29
+ if (value && typeof value === 'object') {
30
+ return Object.entries(value)
31
+ .flatMap(([key, v]) => [encodeURIComponent(key), encodeURIComponent(String(v))])
32
+ .join(',');
33
+ }
34
+ return encodeURIComponent(String(value));
35
+ }
36
+ /** The API's own words for a refusal, from the common error shapes. */
37
+ function refusalMessage(body) {
38
+ if (typeof body === 'string')
39
+ return body.trim() || undefined;
40
+ if (!body || typeof body !== 'object')
41
+ return undefined;
42
+ const b = body;
43
+ const error = b.error;
44
+ if (typeof error === 'string')
45
+ return error;
46
+ if (error && typeof error === 'object' && typeof error.message === 'string') {
47
+ return error.message;
48
+ }
49
+ if (typeof b.message === 'string')
50
+ return b.message;
51
+ if (typeof b.detail === 'string')
52
+ return b.detail;
53
+ if (typeof b.title === 'string')
54
+ return b.title;
55
+ return undefined;
56
+ }
57
+ async function readResponse(response) {
58
+ const text = await response.text();
59
+ if (text === '')
60
+ return undefined;
61
+ if (/\bjson\b|\+json/i.test(response.headers.get('content-type') ?? '')) {
62
+ try {
63
+ return JSON.parse(text);
64
+ }
65
+ catch {
66
+ return text;
67
+ }
68
+ }
69
+ return text;
70
+ }
71
+ export async function executeOperation(plan, input, ctx) {
72
+ const ref = { operationId: plan.operationId, method: plan.method, path: plan.path };
73
+ let identity;
74
+ try {
75
+ identity = await plan.actAs(ctx, ref);
76
+ }
77
+ catch (err) {
78
+ return { success: false, error: `${plan.operationId} could not act as the user: ${err instanceof Error ? err.message : String(err)}` };
79
+ }
80
+ if (!identity || typeof identity !== 'object' || Object.values(identity).some((v) => typeof v !== 'string')) {
81
+ return { success: false, error: `${plan.operationId} could not act as the user: actAs returned no headers` };
82
+ }
83
+ const suppliedHeaders = new Set(Object.keys(identity).map((h) => h.toLowerCase()));
84
+ for (const header of plan.requiredHeaders) {
85
+ if (!suppliedHeaders.has(header.toLowerCase())) {
86
+ return { success: false, error: `${plan.operationId} needs the header ${header}, which actAs did not supply` };
87
+ }
88
+ }
89
+ let path = plan.path;
90
+ const search = new URLSearchParams();
91
+ let body;
92
+ const fields = {};
93
+ let hasFields = false;
94
+ for (const [key, value] of Object.entries(input)) {
95
+ const placement = plan.placements.get(key);
96
+ if (!placement || value === undefined)
97
+ continue;
98
+ if (placement.in === 'path')
99
+ path = path.split(`{${placement.name}}`).join(serialisePath(value));
100
+ else if (placement.in === 'query')
101
+ serialiseQuery(search, placement, value);
102
+ else if (placement.in === 'bodyField') {
103
+ fields[placement.name] = value;
104
+ hasFields = true;
105
+ }
106
+ else
107
+ body = value;
108
+ }
109
+ if (hasFields)
110
+ body = fields;
111
+ const query = search.toString();
112
+ const url = `${plan.baseUrl}${path}${query ? `?${query}` : ''}`;
113
+ const headers = { accept: 'application/json' };
114
+ if (body !== undefined)
115
+ headers['content-type'] = 'application/json';
116
+ Object.assign(headers, identity);
117
+ let response;
118
+ try {
119
+ response = await plan.fetch(url, {
120
+ method: plan.method.toUpperCase(),
121
+ headers,
122
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
123
+ ...(ctx.abortSignal ? { signal: ctx.abortSignal } : {}),
124
+ });
125
+ }
126
+ catch (err) {
127
+ return { success: false, error: `${plan.operationId} could not reach the API: ${err instanceof Error ? err.message : String(err)}` };
128
+ }
129
+ const payload = await readResponse(response);
130
+ if (response.ok)
131
+ return { success: true, data: payload === undefined ? { status: response.status } : payload };
132
+ const message = refusalMessage(payload);
133
+ const status = `${response.status}${response.statusText ? ` ${response.statusText}` : ''}`;
134
+ return {
135
+ success: false,
136
+ error: `${plan.operationId} was refused: ${status}${message ? `: ${message}` : ''}`,
137
+ data: { status: response.status, ...(payload !== undefined ? { body: payload } : {}) },
138
+ };
139
+ }
140
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/openapi/executor.ts"],"names":[],"mappings":"AA8CA,SAAS,cAAc,CAAC,MAAuB,EAAE,SAAmD,EAAE,KAAc;IAClH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO;YAAE,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;YAChF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/G,OAAO;IACT,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC;QACjE,IAAI,KAAK,KAAK,YAAY;YAAE,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,OAAO;gBAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aACnG,IAAI,OAAO;YAAE,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,OAAO;gBAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;;YAC3E,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3F,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aACpD,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC/E,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,uEAAuE;AACvE,SAAS,cAAc,CAAC,IAAa;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IAC9D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACtB,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAQ,KAAiC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzG,OAAQ,KAAgC,CAAC,OAAO,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC;IACpD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IAClD,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IAChD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAkB;IAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAkB,EAClB,KAA8B,EAC9B,GAAyB;IAEzB,MAAM,GAAG,GAAiB,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAElG,IAAI,QAAgC,CAAC;IACrC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACzI,CAAC;IACD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC5G,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,uDAAuD,EAAE,CAAC;IAC/G,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACnF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,qBAAqB,MAAM,8BAA8B,EAAE,CAAC;QACjH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,IAAa,CAAC;IAClB,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAChD,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;aAC5F,IAAI,SAAS,CAAC,EAAE,KAAK,OAAO;YAAE,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;aACvE,IAAI,SAAS,CAAC,EAAE,KAAK,WAAW,EAAE,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC/B,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;;YAAM,IAAI,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,IAAI,SAAS;QAAE,IAAI,GAAG,MAAM,CAAC;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAChE,MAAM,OAAO,GAA2B,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACvE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IACrE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEjC,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;YACjC,OAAO;YACP,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACvI,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAE/G,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC3F,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,iBAAiB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QACnF,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;KACvF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * API tools generated from any OpenAPI 3 document (ADR-0181 §2): the loader, the
3
+ * executor's auth seam, and the input validator every generated tool is checked with.
4
+ */
5
+ export { loadOpenApiTools } from './loader.js';
6
+ export type { OpenApiTool, OpenApiToolsOptions, OpenApiToolAudience } from './loader.js';
7
+ export type { ActAs, OperationRef } from './executor.js';
8
+ export { OpenApiToolError } from './document.js';
9
+ export type { OpenApiDocument, OpenApiOperation, OpenApiParameter, OpenApiPathItem, OpenApiRequestBody, SecurityRequirement, HttpMethod, } from './document.js';
10
+ export { API_OPERATION_EFFECTS } from './x-agent.js';
11
+ export { createToolInputValidator } from '../tools/input-validation.js';
12
+ export type { ToolInputValidation, ToolInputValidator } from '../tools/input-validation.js';
13
+ export type { RegisteredTool, ToolExecutionContext, ToolExecutionResult } from '../tools/types.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACzF,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC5F,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * API tools generated from any OpenAPI 3 document (ADR-0181 §2): the loader, the
3
+ * executor's auth seam, and the input validator every generated tool is checked with.
4
+ */
5
+ export { loadOpenApiTools } from './loader.js';
6
+ export { OpenApiToolError } from './document.js';
7
+ export { API_OPERATION_EFFECTS } from './x-agent.js';
8
+ export { createToolInputValidator } from '../tools/input-validation.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAUjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * loadOpenApiTools — a product's OpenAPI 3 document becomes its agent tools
3
+ * (ADR-0181 §2). No second manifest format: the document is read directly.
4
+ *
5
+ * - An operation is a tool only when its `x-agent` says `expose: true`.
6
+ * - Its name is its `operationId`; its description its `summary` and `description`;
7
+ * its input its parameters and JSON request body, validated by the worker before
8
+ * every call.
9
+ * - Its effect and `destructive` come from `x-agent`, and are on the tool for
10
+ * approvals to key on (ADR-0228).
11
+ * - Its required permissions are its standard `security` requirement.
12
+ * - A call runs as the caller the required `actAs` seam names, and the API decides
13
+ * what that caller may do.
14
+ * - The product's own assistant (`audience: 'pa'`) gets only the operations flagged
15
+ * `pa: true`, and the flag is refused on anything but a read (ADR-0227 §2.1).
16
+ * - An operation that starts a job names its declared completion event in
17
+ * `x-async-binding` (W9). It is checked against the product's declarations at
18
+ * load, and with a waiter the tool waits for the job to settle.
19
+ *
20
+ * Anything that cannot become a safe, callable tool is refused at load, naming the
21
+ * operation.
22
+ */
23
+ import { type ActionEffect } from '@ouispec/bindings';
24
+ import type { EventCatalog, EventWaiter } from '@ouispec/agent-events';
25
+ import type { RegisteredTool } from '../tools/types.js';
26
+ import { type HttpMethod, type OpenApiDocument, type SecurityRequirement } from './document.js';
27
+ import { type ActAs } from './executor.js';
28
+ /** `agents`: every exposed operation, for backend, MCP and external agents. `pa`: only those flagged `pa: true`. */
29
+ export type OpenApiToolAudience = 'agents' | 'pa';
30
+ export interface OpenApiToolsOptions {
31
+ /** Where the API is served. Each operation's path is appended to it. */
32
+ baseUrl: string;
33
+ /** Who a call acts as. Required; there is no default. */
34
+ actAs: ActAs;
35
+ /** Which operations become tools. */
36
+ audience: OpenApiToolAudience;
37
+ /** The fetch to call the API with. Default: the global fetch. */
38
+ fetch?: typeof fetch;
39
+ /**
40
+ * The product's event declarations. Required when an exposed operation has an
41
+ * `x-async-binding`: its completion must be declared there.
42
+ */
43
+ events?: EventCatalog;
44
+ /**
45
+ * How an async operation's tool waits for its job to settle (for example
46
+ * `createHttpEventWaiter`). Without one, the tool returns the dispatch.
47
+ */
48
+ waiter?: EventWaiter;
49
+ }
50
+ export interface OpenApiTool extends RegisteredTool {
51
+ kind: 'backend';
52
+ effect: ActionEffect;
53
+ destructive: boolean;
54
+ /** The operation's `summary`, else its id. */
55
+ title: string;
56
+ /** What happens when it runs, from `x-agent.consequence`. */
57
+ consequence?: string;
58
+ operation: {
59
+ operationId: string;
60
+ method: HttpMethod;
61
+ path: string;
62
+ /** The operation's `summary`, else its id: a short title for previews. */
63
+ title: string;
64
+ /** Its standard security requirement: any one entry, each scheme with the permissions it needs. */
65
+ security: SecurityRequirement[];
66
+ /** For an operation that starts a job: the declared events it settles on, and how long it is waited for. */
67
+ async?: {
68
+ completion: string;
69
+ failure?: string;
70
+ correlation: string;
71
+ idField: string;
72
+ timeoutMs: number;
73
+ };
74
+ };
75
+ }
76
+ /**
77
+ * Turn an OpenAPI 3 document into tools. Throws `OpenApiToolError`, naming the
78
+ * operation, for anything it refuses.
79
+ */
80
+ export declare function loadOpenApiTools(document: OpenApiDocument, options: OpenApiToolsOptions): OpenApiTool[];
81
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/openapi/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,mBAAmB,CAAC;AACnG,OAAO,EAKL,KAAK,UAAU,EAEf,KAAK,eAAe,EAKpB,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAoB,KAAK,KAAK,EAA0C,MAAM,eAAe,CAAC;AAGrG,oHAAoH;AACpH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,IAAI,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,KAAK,EAAE,KAAK,CAAC;IACb,qCAAqC;IACrC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,UAAU,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,0EAA0E;QAC1E,KAAK,EAAE,MAAM,CAAC;QACd,mGAAmG;QACnG,QAAQ,EAAE,mBAAmB,EAAE,CAAC;QAChC,4GAA4G;QAC5G,KAAK,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3G,CAAC;CACH;AA4PD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,mBAAmB,GAAG,WAAW,EAAE,CAsHvG"}