@autoview/cli 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.
- package/LICENSE +661 -0
- package/README.md +407 -0
- package/lib/AutoViewAgent.d.ts +109 -0
- package/lib/AutoViewAgent.js +123 -0
- package/lib/AutoViewAgent.js.map +1 -0
- package/lib/agent/emitMcpServer.d.ts +15 -0
- package/lib/agent/emitMcpServer.js +157 -0
- package/lib/agent/emitMcpServer.js.map +1 -0
- package/lib/agent/emitReport.d.ts +14 -0
- package/lib/agent/emitReport.js +85 -0
- package/lib/agent/emitReport.js.map +1 -0
- package/lib/agent/toolSurface.d.ts +130 -0
- package/lib/agent/toolSurface.js +342 -0
- package/lib/agent/toolSurface.js.map +1 -0
- package/lib/agent/verifyAgentTasks.d.ts +87 -0
- package/lib/agent/verifyAgentTasks.js +126 -0
- package/lib/agent/verifyAgentTasks.js.map +1 -0
- package/lib/cli/main.d.ts +2 -0
- package/lib/cli/main.js +295 -0
- package/lib/cli/main.js.map +1 -0
- package/lib/compiler/AutoViewInterfaceCompiler.d.ts +27 -0
- package/lib/compiler/AutoViewInterfaceCompiler.js +68 -0
- package/lib/compiler/AutoViewInterfaceCompiler.js.map +1 -0
- package/lib/constants/AutoViewFrontendTemplate.d.ts +1 -0
- package/lib/constants/AutoViewFrontendTemplate.js +46 -0
- package/lib/constants/AutoViewFrontendTemplate.js.map +1 -0
- package/lib/constants/AutoViewSystemPromptConstant.d.ts +5 -0
- package/lib/constants/AutoViewSystemPromptConstant.js +4 -0
- package/lib/constants/AutoViewSystemPromptConstant.js.map +1 -0
- package/lib/context/IAutoViewAgentContext.d.ts +60 -0
- package/lib/context/IAutoViewAgentContext.js +3 -0
- package/lib/context/IAutoViewAgentContext.js.map +1 -0
- package/lib/fromSwagger.d.ts +53 -0
- package/lib/fromSwagger.js +513 -0
- package/lib/fromSwagger.js.map +1 -0
- package/lib/generateDeterministic.d.ts +26 -0
- package/lib/generateDeterministic.js +75 -0
- package/lib/generateDeterministic.js.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.js +41 -0
- package/lib/index.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoView.d.ts +17 -0
- package/lib/orchestrate/orchestrateAutoView.js +491 -0
- package/lib/orchestrate/orchestrateAutoView.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewProductPlan.d.ts +37 -0
- package/lib/orchestrate/orchestrateAutoViewProductPlan.js +109 -0
- package/lib/orchestrate/orchestrateAutoViewProductPlan.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewRender.d.ts +133 -0
- package/lib/orchestrate/orchestrateAutoViewRender.js +943 -0
- package/lib/orchestrate/orchestrateAutoViewRender.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewRenderDeterministic.d.ts +24 -0
- package/lib/orchestrate/orchestrateAutoViewRenderDeterministic.js +92 -0
- package/lib/orchestrate/orchestrateAutoViewRenderDeterministic.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewReview.d.ts +48 -0
- package/lib/orchestrate/orchestrateAutoViewReview.js +328 -0
- package/lib/orchestrate/orchestrateAutoViewReview.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewScaffold.d.ts +45 -0
- package/lib/orchestrate/orchestrateAutoViewScaffold.js +586 -0
- package/lib/orchestrate/orchestrateAutoViewScaffold.js.map +1 -0
- package/lib/orchestrate/orchestrateAutoViewSdkStudy.d.ts +26 -0
- package/lib/orchestrate/orchestrateAutoViewSdkStudy.js +85 -0
- package/lib/orchestrate/orchestrateAutoViewSdkStudy.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewProductPlan.d.ts +96 -0
- package/lib/orchestrate/structures/IAutoViewProductPlan.js +3 -0
- package/lib/orchestrate/structures/IAutoViewProductPlan.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewProductPlanApplication.d.ts +38 -0
- package/lib/orchestrate/structures/IAutoViewProductPlanApplication.js +3 -0
- package/lib/orchestrate/structures/IAutoViewProductPlanApplication.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewRenderApplication.d.ts +38 -0
- package/lib/orchestrate/structures/IAutoViewRenderApplication.js +3 -0
- package/lib/orchestrate/structures/IAutoViewRenderApplication.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewReviewApplication.d.ts +40 -0
- package/lib/orchestrate/structures/IAutoViewReviewApplication.js +3 -0
- package/lib/orchestrate/structures/IAutoViewReviewApplication.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewSdkMap.d.ts +63 -0
- package/lib/orchestrate/structures/IAutoViewSdkMap.js +3 -0
- package/lib/orchestrate/structures/IAutoViewSdkMap.js.map +1 -0
- package/lib/orchestrate/structures/IAutoViewSdkStudyApplication.d.ts +37 -0
- package/lib/orchestrate/structures/IAutoViewSdkStudyApplication.js +3 -0
- package/lib/orchestrate/structures/IAutoViewSdkStudyApplication.js.map +1 -0
- package/lib/orchestrate/utils/HistoryMessage.d.ts +10 -0
- package/lib/orchestrate/utils/HistoryMessage.js +25 -0
- package/lib/orchestrate/utils/HistoryMessage.js.map +1 -0
- package/lib/orchestrate/utils/auditFrontendRuntime.d.ts +53 -0
- package/lib/orchestrate/utils/auditFrontendRuntime.js +362 -0
- package/lib/orchestrate/utils/auditFrontendRuntime.js.map +1 -0
- package/lib/orchestrate/utils/buildDeterministicPlan.d.ts +4 -0
- package/lib/orchestrate/utils/buildDeterministicPlan.js +233 -0
- package/lib/orchestrate/utils/buildDeterministicPlan.js.map +1 -0
- package/lib/orchestrate/utils/buildDeterministicSdkMap.d.ts +22 -0
- package/lib/orchestrate/utils/buildDeterministicSdkMap.js +154 -0
- package/lib/orchestrate/utils/buildDeterministicSdkMap.js.map +1 -0
- package/lib/orchestrate/utils/cacheNodeModules.d.ts +31 -0
- package/lib/orchestrate/utils/cacheNodeModules.js +134 -0
- package/lib/orchestrate/utils/cacheNodeModules.js.map +1 -0
- package/lib/orchestrate/utils/describeEndpointPropsShape.d.ts +37 -0
- package/lib/orchestrate/utils/describeEndpointPropsShape.js +192 -0
- package/lib/orchestrate/utils/describeEndpointPropsShape.js.map +1 -0
- package/lib/orchestrate/utils/describeEndpointRequestBodyShape.d.ts +22 -0
- package/lib/orchestrate/utils/describeEndpointRequestBodyShape.js +29 -0
- package/lib/orchestrate/utils/describeEndpointRequestBodyShape.js.map +1 -0
- package/lib/orchestrate/utils/describeEndpointResponseShape.d.ts +19 -0
- package/lib/orchestrate/utils/describeEndpointResponseShape.js +30 -0
- package/lib/orchestrate/utils/describeEndpointResponseShape.js.map +1 -0
- package/lib/orchestrate/utils/executeCachedBatch.d.ts +22 -0
- package/lib/orchestrate/utils/executeCachedBatch.js +64 -0
- package/lib/orchestrate/utils/executeCachedBatch.js.map +1 -0
- package/lib/orchestrate/utils/loadShoppingFixture.d.ts +33 -0
- package/lib/orchestrate/utils/loadShoppingFixture.js +17 -0
- package/lib/orchestrate/utils/loadShoppingFixture.js.map +1 -0
- package/lib/orchestrate/utils/normalizeProductPlanPaths.d.ts +24 -0
- package/lib/orchestrate/utils/normalizeProductPlanPaths.js +77 -0
- package/lib/orchestrate/utils/normalizeProductPlanPaths.js.map +1 -0
- package/lib/orchestrate/utils/renderJsonSchema.d.ts +23 -0
- package/lib/orchestrate/utils/renderJsonSchema.js +122 -0
- package/lib/orchestrate/utils/renderJsonSchema.js.map +1 -0
- package/lib/orchestrate/utils/renderResourcePage.d.ts +36 -0
- package/lib/orchestrate/utils/renderResourcePage.js +1415 -0
- package/lib/orchestrate/utils/renderResourcePage.js.map +1 -0
- package/lib/orchestrate/utils/validateFrontendTypecheck.d.ts +109 -0
- package/lib/orchestrate/utils/validateFrontendTypecheck.js +274 -0
- package/lib/orchestrate/utils/validateFrontendTypecheck.js.map +1 -0
- package/lib/preview/renderPreview.d.ts +22 -0
- package/lib/preview/renderPreview.js +198 -0
- package/lib/preview/renderPreview.js.map +1 -0
- package/lib/typings/compiler.d.ts +39 -0
- package/lib/typings/compiler.js +3 -0
- package/lib/typings/compiler.js.map +1 -0
- package/lib/typings/events.d.ts +106 -0
- package/lib/typings/events.js +3 -0
- package/lib/typings/events.js.map +1 -0
- package/lib/typings/index.d.ts +10 -0
- package/lib/typings/index.js +27 -0
- package/lib/typings/index.js.map +1 -0
- package/lib/typings/misc.d.ts +78 -0
- package/lib/typings/misc.js +3 -0
- package/lib/typings/misc.js.map +1 -0
- package/lib/utils/ArrayUtil.d.ts +8 -0
- package/lib/utils/ArrayUtil.js +30 -0
- package/lib/utils/ArrayUtil.js.map +1 -0
- package/lib/utils/StringUtil.d.ts +11 -0
- package/lib/utils/StringUtil.js +28 -0
- package/lib/utils/StringUtil.js.map +1 -0
- package/lib/utils/classifyEndpoints.d.ts +62 -0
- package/lib/utils/classifyEndpoints.js +216 -0
- package/lib/utils/classifyEndpoints.js.map +1 -0
- package/lib/utils/endpointFilter.d.ts +26 -0
- package/lib/utils/endpointFilter.js +0 -0
- package/lib/utils/endpointFilter.js.map +1 -0
- package/lib/utils/extractFields.d.ts +85 -0
- package/lib/utils/extractFields.js +231 -0
- package/lib/utils/extractFields.js.map +1 -0
- package/lib/utils/index.d.ts +13 -0
- package/lib/utils/index.js +30 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/normalizeForNestia.d.ts +34 -0
- package/lib/utils/normalizeForNestia.js +133 -0
- package/lib/utils/normalizeForNestia.js.map +1 -0
- package/lib/utils/resourcePlan.d.ts +39 -0
- package/lib/utils/resourcePlan.js +95 -0
- package/lib/utils/resourcePlan.js.map +1 -0
- package/lib/utils/sliceDocument.d.ts +17 -0
- package/lib/utils/sliceDocument.js +114 -0
- package/lib/utils/sliceDocument.js.map +1 -0
- package/lib/utils/toEndpoints.d.ts +90 -0
- package/lib/utils/toEndpoints.js +227 -0
- package/lib/utils/toEndpoints.js.map +1 -0
- package/lib/verify/runWorkflows.d.ts +25 -0
- package/lib/verify/runWorkflows.js +366 -0
- package/lib/verify/runWorkflows.js.map +1 -0
- package/lib/verify/workflows.d.ts +53 -0
- package/lib/verify/workflows.js +107 -0
- package/lib/verify/workflows.js.map +1 -0
- package/package.json +82 -0
- package/prompts/AUTOVIEW_RENDER.md +398 -0
- package/prompts/AUTOVIEW_REVIEW.md +60 -0
- package/prompts/AUTOVIEW_SDK_STUDY.md +89 -0
- package/src/AutoViewAgent.ts +222 -0
- package/src/agent/emitMcpServer.integration.test.ts +168 -0
- package/src/agent/emitMcpServer.test.ts +51 -0
- package/src/agent/emitMcpServer.ts +178 -0
- package/src/agent/emitReport.ts +117 -0
- package/src/agent/toolSurface.test.ts +243 -0
- package/src/agent/toolSurface.ts +501 -0
- package/src/agent/verifyAgentTasks.test.ts +106 -0
- package/src/agent/verifyAgentTasks.ts +171 -0
- package/src/cli/main.ts +363 -0
- package/src/compiler/AutoViewInterfaceCompiler.ts +69 -0
- package/src/constants/AutoViewFrontendTemplate.ts +42 -0
- package/src/constants/AutoViewSystemPromptConstant.ts +6 -0
- package/src/context/IAutoViewAgentContext.ts +84 -0
- package/src/fromSwagger.test.ts +269 -0
- package/src/fromSwagger.ts +500 -0
- package/src/generateDeterministic.test.ts +39 -0
- package/src/generateDeterministic.ts +77 -0
- package/src/index.ts +30 -0
- package/src/orchestrate/orchestrateAutoView.ts +590 -0
- package/src/orchestrate/orchestrateAutoViewProductPlan.ts +121 -0
- package/src/orchestrate/orchestrateAutoViewRender.ts +1117 -0
- package/src/orchestrate/orchestrateAutoViewRenderDeterministic.ts +101 -0
- package/src/orchestrate/orchestrateAutoViewReview.ts +272 -0
- package/src/orchestrate/orchestrateAutoViewScaffold.ts +627 -0
- package/src/orchestrate/orchestrateAutoViewSdkStudy.ts +90 -0
- package/src/orchestrate/renderNavTs.test.ts +74 -0
- package/src/orchestrate/structures/IAutoViewProductPlan.ts +119 -0
- package/src/orchestrate/structures/IAutoViewProductPlanApplication.ts +41 -0
- package/src/orchestrate/structures/IAutoViewRenderApplication.ts +40 -0
- package/src/orchestrate/structures/IAutoViewReviewApplication.ts +42 -0
- package/src/orchestrate/structures/IAutoViewSdkMap.ts +72 -0
- package/src/orchestrate/structures/IAutoViewSdkStudyApplication.ts +40 -0
- package/src/orchestrate/utils/HistoryMessage.ts +41 -0
- package/src/orchestrate/utils/auditFrontendRuntime.test.ts +18 -0
- package/src/orchestrate/utils/auditFrontendRuntime.ts +454 -0
- package/src/orchestrate/utils/buildDeterministicPlan.test.ts +170 -0
- package/src/orchestrate/utils/buildDeterministicPlan.ts +289 -0
- package/src/orchestrate/utils/buildDeterministicSdkMap.test.ts +90 -0
- package/src/orchestrate/utils/buildDeterministicSdkMap.ts +169 -0
- package/src/orchestrate/utils/cacheNodeModules.ts +136 -0
- package/src/orchestrate/utils/describeEndpointPropsShape.test.ts +86 -0
- package/src/orchestrate/utils/describeEndpointPropsShape.ts +202 -0
- package/src/orchestrate/utils/describeEndpointRequestBodyShape.test.ts +87 -0
- package/src/orchestrate/utils/describeEndpointRequestBodyShape.ts +31 -0
- package/src/orchestrate/utils/describeEndpointResponseShape.test.ts +70 -0
- package/src/orchestrate/utils/describeEndpointResponseShape.ts +32 -0
- package/src/orchestrate/utils/executeCachedBatch.ts +59 -0
- package/src/orchestrate/utils/loadShoppingFixture.ts +52 -0
- package/src/orchestrate/utils/normalizeProductPlanPaths.ts +92 -0
- package/src/orchestrate/utils/renderJsonSchema.test.ts +162 -0
- package/src/orchestrate/utils/renderJsonSchema.ts +133 -0
- package/src/orchestrate/utils/renderResourcePage.test.ts +468 -0
- package/src/orchestrate/utils/renderResourcePage.ts +1624 -0
- package/src/orchestrate/utils/validateFrontendTypecheck.test.ts +32 -0
- package/src/orchestrate/utils/validateFrontendTypecheck.ts +335 -0
- package/src/preview/renderPreview.ts +273 -0
- package/src/typings/compiler.ts +47 -0
- package/src/typings/events.ts +155 -0
- package/src/typings/index.ts +10 -0
- package/src/typings/misc.ts +93 -0
- package/src/utils/ArrayUtil.ts +16 -0
- package/src/utils/StringUtil.ts +29 -0
- package/src/utils/classifyEndpoints.test.ts +86 -0
- package/src/utils/classifyEndpoints.ts +291 -0
- package/src/utils/endpointFilter.test.ts +50 -0
- package/src/utils/endpointFilter.ts +0 -0
- package/src/utils/extractFields.test.ts +82 -0
- package/src/utils/extractFields.ts +306 -0
- package/src/utils/index.ts +13 -0
- package/src/utils/normalizeForNestia.test.ts +93 -0
- package/src/utils/normalizeForNestia.ts +139 -0
- package/src/utils/resourcePlan.test.ts +104 -0
- package/src/utils/resourcePlan.ts +180 -0
- package/src/utils/sliceDocument.test.ts +85 -0
- package/src/utils/sliceDocument.ts +119 -0
- package/src/utils/toEndpoints.test.ts +251 -0
- package/src/utils/toEndpoints.ts +343 -0
- package/src/verify/runWorkflows.ts +403 -0
- package/src/verify/workflows.test.ts +117 -0
- package/src/verify/workflows.ts +154 -0
- package/template/CLAUDE.md +140 -0
- package/template/Dockerfile +31 -0
- package/template/PROMPT.md +80 -0
- package/template/SANDBOX.md +70 -0
- package/template/app/api/health/route.ts +10 -0
- package/template/app/globals.css +97 -0
- package/template/app/layout.tsx +30 -0
- package/template/app/page.tsx +19 -0
- package/template/components/AppShell.tsx +114 -0
- package/template/components/auto/CatalogGrid.tsx +159 -0
- package/template/components/auto/ConfirmButton.tsx +67 -0
- package/template/components/auto/EmbeddedCollection.tsx +144 -0
- package/template/components/auto/ResourceDashboard.tsx +104 -0
- package/template/components/auto/ResourceDetail.tsx +93 -0
- package/template/components/auto/ResourceForm.tsx +235 -0
- package/template/components/auto/ResourceIcon.tsx +88 -0
- package/template/components/auto/ResourceLanding.tsx +155 -0
- package/template/components/auto/ResourceTable.tsx +223 -0
- package/template/components/auto/formatValue.tsx +186 -0
- package/template/components/auto/types.ts +42 -0
- package/template/components/ui/badge.tsx +40 -0
- package/template/components/ui/button.tsx +57 -0
- package/template/components/ui/card.tsx +86 -0
- package/template/components/ui/dialog.tsx +119 -0
- package/template/components/ui/input.tsx +23 -0
- package/template/components/ui/label.tsx +24 -0
- package/template/components/ui/pagination.tsx +117 -0
- package/template/components/ui/select.tsx +92 -0
- package/template/components/ui/sheet.tsx +135 -0
- package/template/components/ui/skeleton.tsx +15 -0
- package/template/components/ui/table.tsx +120 -0
- package/template/components/ui/tabs.tsx +55 -0
- package/template/lib/utils.ts +35 -0
- package/template/next.config.mjs +52 -0
- package/template/package.json +46 -0
- package/template/postcss.config.js +6 -0
- package/template/scripts/start-shopping-backend.sh +56 -0
- package/template/tailwind.config.ts +96 -0
- package/template/tsconfig.json +29 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildToolSurface = buildToolSurface;
|
|
4
|
+
exports.analyzeConsumability = analyzeConsumability;
|
|
5
|
+
exports.coverToolSurface = coverToolSurface;
|
|
6
|
+
const classifyEndpoints_1 = require("../utils/classifyEndpoints");
|
|
7
|
+
const extractFields_1 = require("../utils/extractFields");
|
|
8
|
+
const toEndpoints_1 = require("../utils/toEndpoints");
|
|
9
|
+
const READ_ROLES = new Set(["list", "search", "detail"]);
|
|
10
|
+
/** Field names that identify a record (the value a path param consumes). */
|
|
11
|
+
const ID_NAMES = ["id", "uuid"];
|
|
12
|
+
/** The first identifying field name present (`id` preferred over `uuid`), or null. */
|
|
13
|
+
const firstIdName = (names) => {
|
|
14
|
+
var _a;
|
|
15
|
+
const set = new Set([...names].map((n) => n.toLowerCase()));
|
|
16
|
+
return (_a = ID_NAMES.find((n) => set.has(n))) !== null && _a !== void 0 ? _a : null;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Whether a read endpoint's response element carries an identifying field
|
|
20
|
+
* (`id` / `uuid`) — i.e. whether it can PRODUCE an id for a consumer. Handles
|
|
21
|
+
* both named component responses and INLINE response schemas, and collection
|
|
22
|
+
* wrappers named generically (`data`/`entries`) OR after the resource
|
|
23
|
+
* (`{ databases: [...] }`, DigitalOcean), including inline array items.
|
|
24
|
+
*/
|
|
25
|
+
function producedIdField(op, doc) {
|
|
26
|
+
var _a;
|
|
27
|
+
// Named-type path (nestia/AutoBE convention).
|
|
28
|
+
if (op.responseBody !== null) {
|
|
29
|
+
const elementFields = op.responseBody.isArray
|
|
30
|
+
? (0, extractFields_1.extractFields)(op.responseBody.typeName, doc)
|
|
31
|
+
: (() => {
|
|
32
|
+
var _a;
|
|
33
|
+
const top = (0, extractFields_1.extractFields)(op.responseBody.typeName, doc);
|
|
34
|
+
// The collection field is either generically named (`data`/`entries`)
|
|
35
|
+
// or named after the resource (`{ namespaces: [...] }`, common on
|
|
36
|
+
// DigitalOcean once nestia promotes the inline response to a named
|
|
37
|
+
// type). Fall back to the first array field so the latter is found —
|
|
38
|
+
// producedIdField only runs on list/search reads, so an array IS the
|
|
39
|
+
// collection.
|
|
40
|
+
const col = (_a = (0, extractFields_1.findCollectionField)(top)) !== null && _a !== void 0 ? _a : top.find((f) => f.kind === "array" && f.ref !== undefined);
|
|
41
|
+
return (col === null || col === void 0 ? void 0 : col.ref) !== undefined ? (0, extractFields_1.extractFields)(col.ref, doc) : top;
|
|
42
|
+
})();
|
|
43
|
+
const named = firstIdName(elementFields.map((f) => f.name));
|
|
44
|
+
if (named !== null)
|
|
45
|
+
return named;
|
|
46
|
+
// else: the promoted type was a dead/empty ref (nestia emits a `*.GetResponse`
|
|
47
|
+
// not registered in components, just like `*.GetQuery`) — fall through to the
|
|
48
|
+
// raw inline response schema, which still carries the real array.
|
|
49
|
+
}
|
|
50
|
+
// Inline response schema (DigitalOcean): introspect the raw schema.
|
|
51
|
+
if (op.responseSchema === null)
|
|
52
|
+
return null;
|
|
53
|
+
const { properties } = (0, extractFields_1.resolveProperties)(op.responseSchema, doc);
|
|
54
|
+
// The collection array: a known-named one, else the sole/first array property.
|
|
55
|
+
const arrayEntries = Object.entries(properties).filter(([, p]) => p.type === "array");
|
|
56
|
+
const collection = (_a = arrayEntries.find(([n]) => extractFields_1.COLLECTION_FIELD_NAMES.has(n.toLowerCase()))) !== null && _a !== void 0 ? _a : arrayEntries[0];
|
|
57
|
+
if (collection !== undefined) {
|
|
58
|
+
const items = collection[1].items;
|
|
59
|
+
if (items !== undefined) {
|
|
60
|
+
return firstIdName(Object.keys((0, extractFields_1.resolveProperties)(items, doc).properties));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// A single object (detail) returning an inline schema.
|
|
64
|
+
return firstIdName(Object.keys(properties));
|
|
65
|
+
}
|
|
66
|
+
/** Roles whose response is a browsable collection — the only legitimate id
|
|
67
|
+
* PRODUCERS. A `detail` read returns one object but needs the id to be called,
|
|
68
|
+
* so it cannot produce that id (circular); excluding it keeps navigability honest. */
|
|
69
|
+
const COLLECTION_ROLES = new Set(["list", "search"]);
|
|
70
|
+
/**
|
|
71
|
+
* The shared producer model used by BOTH the tool surface and the consumability
|
|
72
|
+
* report, so they never disagree on what is navigable. For each resource, the
|
|
73
|
+
* collection read (list/search) whose element exposes an id — keyed by the
|
|
74
|
+
* endpoint's CLASSIFIED resource (so a verb path like `/pet/findByStatus` is
|
|
75
|
+
* bucketed under `pet`, not `findByStatus`).
|
|
76
|
+
*/
|
|
77
|
+
function producerIndex(document) {
|
|
78
|
+
var _a, _b;
|
|
79
|
+
const endpoints = (0, toEndpoints_1.toEndpoints)(document);
|
|
80
|
+
const roleOf = new Map();
|
|
81
|
+
const resourceOf = new Map();
|
|
82
|
+
for (const g of (0, classifyEndpoints_1.classifyEndpoints)(endpoints, document)) {
|
|
83
|
+
for (const c of g.endpoints) {
|
|
84
|
+
roleOf.set(c.endpoint, c.role);
|
|
85
|
+
resourceOf.set(c.endpoint, (_b = (_a = c.chain.at(-1)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : c.resource);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const producerOf = new Map();
|
|
89
|
+
const readableResources = new Set();
|
|
90
|
+
for (const e of endpoints) {
|
|
91
|
+
const role = roleOf.get(e);
|
|
92
|
+
const resource = resourceOf.get(e);
|
|
93
|
+
if (role === undefined || resource === undefined)
|
|
94
|
+
continue;
|
|
95
|
+
if (READ_ROLES.has(role))
|
|
96
|
+
readableResources.add(resource);
|
|
97
|
+
if (!COLLECTION_ROLES.has(role))
|
|
98
|
+
continue;
|
|
99
|
+
// A genuine producer ENUMERATES the resource. One that is itself scoped by
|
|
100
|
+
// that resource's own id (`/files/{file_id}/trash` → resource `files`, but
|
|
101
|
+
// it requires `file_id`) cannot produce that id — it is circular, so skip it.
|
|
102
|
+
const selfScoped = e.parameters.some((p) => resourceOfParam(e.path, p.name) === resource);
|
|
103
|
+
if (selfScoped)
|
|
104
|
+
continue;
|
|
105
|
+
const field = producedIdField(e, document);
|
|
106
|
+
if (field !== null && !producerOf.has(resource)) {
|
|
107
|
+
producerOf.set(resource, { tool: e.accessor.join("."), field });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const nested = nestedProducers(endpoints, document, roleOf);
|
|
111
|
+
return { endpoints, roleOf, producerOf, readableResources, nested };
|
|
112
|
+
}
|
|
113
|
+
/** The named element type of a read endpoint's response (for recursion). */
|
|
114
|
+
function responseElementTypeName(op, doc) {
|
|
115
|
+
var _a;
|
|
116
|
+
if (op.responseBody === null)
|
|
117
|
+
return null;
|
|
118
|
+
if (op.responseBody.isArray)
|
|
119
|
+
return op.responseBody.typeName;
|
|
120
|
+
const col = (0, extractFields_1.findCollectionField)((0, extractFields_1.extractFields)(op.responseBody.typeName, doc));
|
|
121
|
+
return (_a = col === null || col === void 0 ? void 0 : col.ref) !== null && _a !== void 0 ? _a : op.responseBody.typeName;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Resources whose ids are obtainable NESTED inside a read response, not from a
|
|
125
|
+
* dedicated endpoint — `order` detail returns `goods: IShoppingOrderGood[]`,
|
|
126
|
+
* `sale` returns `units: IShoppingSaleUnit[]` (each unit holds `stocks: […]`).
|
|
127
|
+
* Walks each read's response type graph (depth-bounded) and, for every
|
|
128
|
+
* array-field whose element carries an id, records WHICH read tool exposes it
|
|
129
|
+
* and the nested path — so the tool surface can hand the agent a real producer
|
|
130
|
+
* hint ("stockId ← sale.get, at units[].stocks[].id"), not just say it exists.
|
|
131
|
+
*/
|
|
132
|
+
function nestedProducers(endpoints, doc, roleOf) {
|
|
133
|
+
const out = new Map();
|
|
134
|
+
const visit = (typeName, tool, parts, depth, seen) => {
|
|
135
|
+
if (depth > 3 || seen.has(typeName))
|
|
136
|
+
return;
|
|
137
|
+
seen.add(typeName);
|
|
138
|
+
for (const f of (0, extractFields_1.extractFields)(typeName, doc)) {
|
|
139
|
+
if (f.kind === "array" && f.ref !== undefined) {
|
|
140
|
+
const childParts = [...parts, f.name];
|
|
141
|
+
const idField = firstIdName((0, extractFields_1.extractFields)(f.ref, doc).map((x) => x.name));
|
|
142
|
+
const key = f.name.toLowerCase();
|
|
143
|
+
if (idField !== null) {
|
|
144
|
+
// Prefer the SHALLOWEST path (fewest array hops) — `sale → units[]`
|
|
145
|
+
// beats `order → goods[].units[]` for the same `units` id, so the
|
|
146
|
+
// agent is pointed at the most direct producer.
|
|
147
|
+
const existing = out.get(key);
|
|
148
|
+
if (existing === undefined || childParts.length < existing.path.split(".").length) {
|
|
149
|
+
out.set(key, {
|
|
150
|
+
tool,
|
|
151
|
+
path: childParts.map((p) => `${p}[]`).join("."),
|
|
152
|
+
field: idField,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
visit(f.ref, tool, childParts, depth + 1, seen); // recurse: units → stocks
|
|
157
|
+
}
|
|
158
|
+
else if (f.kind === "ref" && f.ref !== undefined) {
|
|
159
|
+
visit(f.ref, tool, parts, depth + 1, seen);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
for (const e of endpoints) {
|
|
164
|
+
const role = roleOf.get(e);
|
|
165
|
+
if (role === undefined || !READ_ROLES.has(role))
|
|
166
|
+
continue;
|
|
167
|
+
const el = responseElementTypeName(e, doc);
|
|
168
|
+
if (el !== null)
|
|
169
|
+
visit(el, e.accessor.join("."), [], 0, new Set());
|
|
170
|
+
}
|
|
171
|
+
return out;
|
|
172
|
+
}
|
|
173
|
+
/** The static path segment that an `{param}` addresses (`/sales/{saleId}` → `sales`). */
|
|
174
|
+
function resourceOfParam(path, param) {
|
|
175
|
+
const segs = path.split("/").filter((s) => s.length > 0);
|
|
176
|
+
for (let i = 0; i < segs.length; i++) {
|
|
177
|
+
if (segs[i] === `{${param}}`)
|
|
178
|
+
return i > 0 ? segs[i - 1] : null;
|
|
179
|
+
}
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
function paramType(schema) {
|
|
183
|
+
const type = schema === null || schema === void 0 ? void 0 : schema.type;
|
|
184
|
+
return type === "integer" || type === "number" ? "number" : "string";
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Build the agent tool surface from an OpenAPI document.
|
|
188
|
+
*/
|
|
189
|
+
function buildToolSurface(document) {
|
|
190
|
+
const { endpoints, roleOf, producerOf, nested } = producerIndex(document);
|
|
191
|
+
return endpoints.map((e) => {
|
|
192
|
+
const role = roleOf.get(e);
|
|
193
|
+
const readOnly = role !== undefined && READ_ROLES.has(role);
|
|
194
|
+
const method = e.method.toUpperCase();
|
|
195
|
+
const name = e.accessor.join(".");
|
|
196
|
+
const properties = {};
|
|
197
|
+
const required = [];
|
|
198
|
+
const producers = [];
|
|
199
|
+
for (const p of e.parameters) {
|
|
200
|
+
const resource = resourceOfParam(e.path, p.name);
|
|
201
|
+
const direct = resource !== null ? producerOf.get(resource) : undefined;
|
|
202
|
+
const nestedP = resource !== null ? nested.get(resource.toLowerCase()) : undefined;
|
|
203
|
+
let description = p.description || `path parameter ${p.name}`;
|
|
204
|
+
if (direct !== undefined && direct.tool !== name) {
|
|
205
|
+
// a dedicated list/search produces this id directly
|
|
206
|
+
producers.push({ param: p.name, tool: direct.tool, field: direct.field });
|
|
207
|
+
description = `the ${direct.field} of a ${resource}; obtain it from the \`${direct.tool}\` tool — use each item's \`${direct.field}\` field`;
|
|
208
|
+
}
|
|
209
|
+
else if (nestedP !== undefined && nestedP.tool !== name) {
|
|
210
|
+
// the id lives nested inside a parent read's response
|
|
211
|
+
producers.push({
|
|
212
|
+
param: p.name,
|
|
213
|
+
tool: nestedP.tool,
|
|
214
|
+
field: `${nestedP.path}.${nestedP.field}`,
|
|
215
|
+
});
|
|
216
|
+
description = `the ${nestedP.field} of a ${resource}; obtain it from the \`${nestedP.tool}\` tool's response at \`${nestedP.path}.${nestedP.field}\``;
|
|
217
|
+
}
|
|
218
|
+
properties[p.name] = { type: paramType(p.schema), description };
|
|
219
|
+
required.push(p.name);
|
|
220
|
+
}
|
|
221
|
+
if (e.query !== null) {
|
|
222
|
+
properties.query = {
|
|
223
|
+
type: "object",
|
|
224
|
+
description: "optional search / filter / pagination",
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (e.requestBody !== null) {
|
|
228
|
+
properties.body = {
|
|
229
|
+
type: "object",
|
|
230
|
+
description: `request body (${e.requestBody.typeName})`,
|
|
231
|
+
};
|
|
232
|
+
required.push("body");
|
|
233
|
+
}
|
|
234
|
+
const tag = readOnly ? "[READ]" : "[WRITE — mutates server state]";
|
|
235
|
+
const chainNote = producers.length > 0
|
|
236
|
+
? ` Inputs come from: ${producers.map((p) => `${p.param} ← ${p.tool}.${p.field}`).join("; ")}.`
|
|
237
|
+
: "";
|
|
238
|
+
return {
|
|
239
|
+
name,
|
|
240
|
+
description: `${tag} ${e.description || `${method} ${e.path}`}`.trim() + chainNote,
|
|
241
|
+
inputSchema: { type: "object", properties, required },
|
|
242
|
+
annotations: {
|
|
243
|
+
readOnlyHint: readOnly,
|
|
244
|
+
destructiveHint: method === "DELETE",
|
|
245
|
+
idempotentHint: method === "GET" || method === "PUT" || method === "DELETE",
|
|
246
|
+
},
|
|
247
|
+
operation: {
|
|
248
|
+
method,
|
|
249
|
+
path: e.path,
|
|
250
|
+
pathParams: e.parameters.map((p) => p.name),
|
|
251
|
+
hasQuery: e.query !== null,
|
|
252
|
+
hasBody: e.requestBody !== null,
|
|
253
|
+
},
|
|
254
|
+
producers,
|
|
255
|
+
};
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* True when a path param names an entity identifier (`id`, `*_id`, `*Id`,
|
|
260
|
+
* `uuid`) — the kind that must be produced by another endpoint. A param that is
|
|
261
|
+
* a human-known key instead (`repository_name`, `template_key`, `scope`, a
|
|
262
|
+
* `slug`/`code`) is caller-supplied, so its absence of a producer is not a gap.
|
|
263
|
+
*/
|
|
264
|
+
function isIdLikeParam(name) {
|
|
265
|
+
return /(^id$)|(_id$)|([a-z]Id$)|(^uuid$)|(_uuid$)|([a-z]Uuid$)/.test(name);
|
|
266
|
+
}
|
|
267
|
+
function analyzeConsumability(document) {
|
|
268
|
+
// ONE producer model, shared with the tool surface — so the report never
|
|
269
|
+
// claims an input is navigable that the tools give no producer hint for.
|
|
270
|
+
const { endpoints, roleOf, producerOf, readableResources, nested } = producerIndex(document);
|
|
271
|
+
const isReadTool = (e) => {
|
|
272
|
+
const role = roleOf.get(e);
|
|
273
|
+
return role !== undefined && READ_ROLES.has(role);
|
|
274
|
+
};
|
|
275
|
+
// Classify every id input once, then aggregate purely (no mutable counters).
|
|
276
|
+
const inputs = endpoints.flatMap((e) => e.parameters.map((p) => {
|
|
277
|
+
const resource = resourceOfParam(e.path, p.name);
|
|
278
|
+
const ref = { tool: e.accessor.join("."), param: p.name, resource: resource !== null && resource !== void 0 ? resource : "?" };
|
|
279
|
+
const status = resource !== null && producerOf.has(resource)
|
|
280
|
+
? "resolved"
|
|
281
|
+
: resource !== null && nested.has(resource.toLowerCase())
|
|
282
|
+
? "nested"
|
|
283
|
+
: // a non-id param (`username`, `scope`, `*_name`) is a caller-known
|
|
284
|
+
// key regardless of whether its resource is readable — not a gap.
|
|
285
|
+
!isIdLikeParam(p.name)
|
|
286
|
+
? "userInput"
|
|
287
|
+
: // an entity id: readable resource but no producer traced =
|
|
288
|
+
// undetermined; never read at all = a genuine orphan.
|
|
289
|
+
resource !== null && readableResources.has(resource)
|
|
290
|
+
? "untraceable"
|
|
291
|
+
: "orphan";
|
|
292
|
+
return Object.assign(Object.assign({}, ref), { status });
|
|
293
|
+
}));
|
|
294
|
+
const readTools = endpoints.filter(isReadTool).length;
|
|
295
|
+
return {
|
|
296
|
+
tools: endpoints.length,
|
|
297
|
+
readTools,
|
|
298
|
+
writeTools: endpoints.length - readTools,
|
|
299
|
+
referenceInputs: inputs.length,
|
|
300
|
+
resolved: inputs.filter((i) => i.status === "resolved").length,
|
|
301
|
+
nested: inputs.filter((i) => i.status === "nested").length,
|
|
302
|
+
untraceable: inputs
|
|
303
|
+
.filter((i) => i.status === "untraceable")
|
|
304
|
+
.map(({ tool, param, resource }) => ({ tool, param, resource })),
|
|
305
|
+
userInputs: inputs
|
|
306
|
+
.filter((i) => i.status === "userInput")
|
|
307
|
+
.map(({ tool, param, resource }) => ({ tool, param, resource })),
|
|
308
|
+
orphan: inputs
|
|
309
|
+
.filter((i) => i.status === "orphan")
|
|
310
|
+
.map(({ tool, param, resource }) => ({ tool, param, resource })),
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Deterministic structural coverage of a tool surface — the LLM-independent
|
|
315
|
+
* verification: is the tool graph navigable (every id input has a declared
|
|
316
|
+
* producer)? Reported as a report card, distinct from running an agent.
|
|
317
|
+
*/
|
|
318
|
+
function coverToolSurface(tools) {
|
|
319
|
+
// Classify every path param once, then aggregate purely (no mutable counters).
|
|
320
|
+
const inputs = tools.flatMap((t) => {
|
|
321
|
+
const producerParams = new Set(t.producers.map((p) => p.param));
|
|
322
|
+
return t.operation.pathParams.map((param) => ({
|
|
323
|
+
tool: t.name,
|
|
324
|
+
param,
|
|
325
|
+
resolved: producerParams.has(param),
|
|
326
|
+
}));
|
|
327
|
+
});
|
|
328
|
+
const readTools = tools.filter((t) => t.annotations.readOnlyHint).length;
|
|
329
|
+
const resolvedInputs = inputs.filter((i) => i.resolved).length;
|
|
330
|
+
return {
|
|
331
|
+
tools: tools.length,
|
|
332
|
+
readTools,
|
|
333
|
+
writeTools: tools.length - readTools,
|
|
334
|
+
referenceInputs: inputs.length,
|
|
335
|
+
resolvedInputs,
|
|
336
|
+
orphanInputs: inputs.length - resolvedInputs,
|
|
337
|
+
orphans: inputs
|
|
338
|
+
.filter((i) => !i.resolved)
|
|
339
|
+
.map(({ tool, param }) => ({ tool, param })),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=toolSurface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolSurface.js","sourceRoot":"","sources":["../../src/agent/toolSurface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { OpenApi } from "@typia/interface";
|
|
2
|
+
import { IAgentTool } from "./toolSurface";
|
|
3
|
+
/**
|
|
4
|
+
* Behavioral verification of an agent tool surface — the trust layer.
|
|
5
|
+
*
|
|
6
|
+
* The consumability report proves the surface is *structurally* navigable
|
|
7
|
+
* (every id has a producer). This proves it *behaviorally*: a real agent, given
|
|
8
|
+
* the tools, completes named tasks end-to-end against the live backend. It is
|
|
9
|
+
* how "the API works for an agent" is demonstrated rather than asserted — the
|
|
10
|
+
* agent analogue of the frontend's workflow verifier.
|
|
11
|
+
*
|
|
12
|
+
* The deterministic parts (tool conversion + HTTP execution) are pure and
|
|
13
|
+
* unit-tested; the agent loop is driven by a configurable model (the operator's
|
|
14
|
+
* choice via env / opts), since which model an API's agents will use is the
|
|
15
|
+
* operator's call, not ours.
|
|
16
|
+
*/
|
|
17
|
+
/** OpenAI / OpenRouter function-calling tool shape. */
|
|
18
|
+
export interface IFunctionTool {
|
|
19
|
+
type: "function";
|
|
20
|
+
function: {
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
parameters: object;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** OpenAI function names allow only `[a-zA-Z0-9_-]` — the dotted accessor (fine
|
|
27
|
+
* for MCP) is not valid, so sanitize for the function-calling path. */
|
|
28
|
+
export declare const functionName: (toolName: string) => string;
|
|
29
|
+
/** Convert the agent tool surface to OpenAI function-calling tools. */
|
|
30
|
+
export declare function toFunctionTools(tools: IAgentTool[]): IFunctionTool[];
|
|
31
|
+
/**
|
|
32
|
+
* Execute one tool call against a live backend: substitute path params, attach
|
|
33
|
+
* query / body, issue the HTTP request, return the response text. Pure aside
|
|
34
|
+
* from the network call — deterministic in how it maps a call to a request.
|
|
35
|
+
*/
|
|
36
|
+
export declare function executeToolCall(tools: IAgentTool[], name: string, args: Record<string, unknown>, opts: {
|
|
37
|
+
baseUrl: string;
|
|
38
|
+
auth?: string;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
ok: boolean;
|
|
41
|
+
text: string;
|
|
42
|
+
}>;
|
|
43
|
+
export interface IAgentTask {
|
|
44
|
+
id: string;
|
|
45
|
+
prompt: string;
|
|
46
|
+
/** Optional success predicate over the agent's final answer (e.g. contains a known value). */
|
|
47
|
+
expect?: (answer: string) => boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface IAgentTaskResult {
|
|
50
|
+
id: string;
|
|
51
|
+
answer: string;
|
|
52
|
+
toolCalls: string[];
|
|
53
|
+
passed: boolean | null;
|
|
54
|
+
}
|
|
55
|
+
/** Minimal OpenAI-compatible client surface this verifier needs (so the SDK is injected, not imported). */
|
|
56
|
+
export interface IChatClient {
|
|
57
|
+
chat: {
|
|
58
|
+
completions: {
|
|
59
|
+
create(req: unknown): Promise<{
|
|
60
|
+
choices: Array<{
|
|
61
|
+
message: {
|
|
62
|
+
content: string | null;
|
|
63
|
+
tool_calls?: Array<{
|
|
64
|
+
id: string;
|
|
65
|
+
function: {
|
|
66
|
+
name: string;
|
|
67
|
+
arguments: string;
|
|
68
|
+
};
|
|
69
|
+
}>;
|
|
70
|
+
};
|
|
71
|
+
}>;
|
|
72
|
+
}>;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Run the agent through each task against the tool surface + backend. The chat
|
|
78
|
+
* client and model are injected by the caller (configurable, e.g. from `.env`).
|
|
79
|
+
*/
|
|
80
|
+
export declare function verifyAgentTasks(document: OpenApi.IDocument, opts: {
|
|
81
|
+
client: IChatClient;
|
|
82
|
+
model: string;
|
|
83
|
+
baseUrl: string;
|
|
84
|
+
auth?: string;
|
|
85
|
+
tasks: IAgentTask[];
|
|
86
|
+
maxTurns?: number;
|
|
87
|
+
}): Promise<IAgentTaskResult[]>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.functionName = void 0;
|
|
13
|
+
exports.toFunctionTools = toFunctionTools;
|
|
14
|
+
exports.executeToolCall = executeToolCall;
|
|
15
|
+
exports.verifyAgentTasks = verifyAgentTasks;
|
|
16
|
+
const toolSurface_1 = require("./toolSurface");
|
|
17
|
+
/** OpenAI function names allow only `[a-zA-Z0-9_-]` — the dotted accessor (fine
|
|
18
|
+
* for MCP) is not valid, so sanitize for the function-calling path. */
|
|
19
|
+
const functionName = (toolName) => toolName.replace(/[^A-Za-z0-9_-]/g, "_");
|
|
20
|
+
exports.functionName = functionName;
|
|
21
|
+
/** Convert the agent tool surface to OpenAI function-calling tools. */
|
|
22
|
+
function toFunctionTools(tools) {
|
|
23
|
+
return tools.map((t) => ({
|
|
24
|
+
type: "function",
|
|
25
|
+
function: {
|
|
26
|
+
name: (0, exports.functionName)(t.name),
|
|
27
|
+
description: t.description,
|
|
28
|
+
parameters: t.inputSchema,
|
|
29
|
+
},
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Execute one tool call against a live backend: substitute path params, attach
|
|
34
|
+
* query / body, issue the HTTP request, return the response text. Pure aside
|
|
35
|
+
* from the network call — deterministic in how it maps a call to a request.
|
|
36
|
+
*/
|
|
37
|
+
function executeToolCall(tools, name, args, opts) {
|
|
38
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
var _a, _b;
|
|
40
|
+
const tool = tools.find((t) => t.name === name);
|
|
41
|
+
if (tool === undefined)
|
|
42
|
+
return { ok: false, text: `unknown tool: ${name}` };
|
|
43
|
+
let path = tool.operation.path;
|
|
44
|
+
for (const p of tool.operation.pathParams) {
|
|
45
|
+
path = path.replace(`{${p}}`, encodeURIComponent(String((_a = args[p]) !== null && _a !== void 0 ? _a : "")));
|
|
46
|
+
}
|
|
47
|
+
const url = new URL(opts.baseUrl.replace(/\/$/, "") + path);
|
|
48
|
+
if (tool.operation.hasQuery && args.query && typeof args.query === "object") {
|
|
49
|
+
for (const [k, v] of Object.entries(args.query)) {
|
|
50
|
+
if (v !== undefined && v !== null)
|
|
51
|
+
url.searchParams.set(k, String(v));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const method = tool.operation.method;
|
|
55
|
+
try {
|
|
56
|
+
const res = yield fetch(url, {
|
|
57
|
+
method,
|
|
58
|
+
headers: Object.assign({ "content-type": "application/json" }, (opts.auth ? { authorization: opts.auth } : {})),
|
|
59
|
+
body: ["GET", "HEAD", "DELETE"].includes(method) ? undefined : JSON.stringify((_b = args.body) !== null && _b !== void 0 ? _b : {}),
|
|
60
|
+
});
|
|
61
|
+
const text = yield res.text();
|
|
62
|
+
return { ok: res.ok, text };
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return { ok: false, text: `request failed: ${err instanceof Error ? err.message : String(err)}` };
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Run the agent through each task against the tool surface + backend. The chat
|
|
71
|
+
* client and model are injected by the caller (configurable, e.g. from `.env`).
|
|
72
|
+
*/
|
|
73
|
+
function verifyAgentTasks(document, opts) {
|
|
74
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
+
var _a, _b, _c;
|
|
76
|
+
const tools = (0, toolSurface_1.buildToolSurface)(document);
|
|
77
|
+
const fnTools = toFunctionTools(tools);
|
|
78
|
+
// function-calling sanitizes dotted names → map the sanitized name the model
|
|
79
|
+
// calls back to the real tool for execution.
|
|
80
|
+
const byFnName = new Map(tools.map((t) => [(0, exports.functionName)(t.name), t.name]));
|
|
81
|
+
const maxTurns = (_a = opts.maxTurns) !== null && _a !== void 0 ? _a : 10;
|
|
82
|
+
const results = [];
|
|
83
|
+
for (const task of opts.tasks) {
|
|
84
|
+
const messages = [
|
|
85
|
+
{ role: "system", content: "You are an API agent. Use the provided tools to complete the task, then reply in plain text with the answer. Never ask the user questions." },
|
|
86
|
+
{ role: "user", content: task.prompt },
|
|
87
|
+
];
|
|
88
|
+
const toolCalls = [];
|
|
89
|
+
let answer = "(no answer)";
|
|
90
|
+
for (let turn = 0; turn < maxTurns; turn++) {
|
|
91
|
+
const resp = yield opts.client.chat.completions.create({
|
|
92
|
+
model: opts.model,
|
|
93
|
+
messages,
|
|
94
|
+
tools: fnTools,
|
|
95
|
+
tool_choice: "auto",
|
|
96
|
+
temperature: 0,
|
|
97
|
+
});
|
|
98
|
+
const msg = resp.choices[0].message;
|
|
99
|
+
messages.push(msg);
|
|
100
|
+
if (msg.tool_calls === undefined || msg.tool_calls.length === 0) {
|
|
101
|
+
answer = (_b = msg.content) !== null && _b !== void 0 ? _b : "";
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
for (const tc of msg.tool_calls) {
|
|
105
|
+
let args = {};
|
|
106
|
+
try {
|
|
107
|
+
args = JSON.parse(tc.function.arguments || "{}");
|
|
108
|
+
}
|
|
109
|
+
catch ( /* keep {} */_d) { /* keep {} */ }
|
|
110
|
+
const realName = (_c = byFnName.get(tc.function.name)) !== null && _c !== void 0 ? _c : tc.function.name;
|
|
111
|
+
const result = yield executeToolCall(tools, realName, args, { baseUrl: opts.baseUrl, auth: opts.auth });
|
|
112
|
+
toolCalls.push(realName);
|
|
113
|
+
messages.push({ role: "tool", tool_call_id: tc.id, content: result.text.slice(0, 2500) });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
results.push({
|
|
117
|
+
id: task.id,
|
|
118
|
+
answer,
|
|
119
|
+
toolCalls,
|
|
120
|
+
passed: task.expect ? task.expect(answer) : null,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return results;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=verifyAgentTasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyAgentTasks.js","sourceRoot":"","sources":["../../src/agent/verifyAgentTasks.ts"],"names":[],"mappings":"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"}
|