@vibesdotdev/client 0.1.0 → 1.0.0-rc.2
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 +21 -0
- package/README.md +31 -0
- package/dist/api-client-plugin.d.ts +4 -0
- package/dist/api-client-plugin.d.ts.map +1 -0
- package/dist/api-client-plugin.js +20 -0
- package/dist/api-client-plugin.js.map +1 -0
- package/dist/api-client.impl.d.ts +23 -0
- package/dist/api-client.impl.d.ts.map +1 -0
- package/dist/api-client.impl.js +47 -0
- package/dist/api-client.impl.js.map +1 -0
- package/dist/client.consumer.plugin.d.ts +3 -0
- package/dist/client.consumer.plugin.d.ts.map +1 -0
- package/dist/client.consumer.plugin.js +10 -0
- package/dist/client.consumer.plugin.js.map +1 -0
- package/dist/cloud.plugin.d.ts +3 -0
- package/dist/cloud.plugin.d.ts.map +1 -0
- package/dist/cloud.plugin.js +10 -0
- package/dist/cloud.plugin.js.map +1 -0
- package/dist/config/client.config.descriptor.d.ts +4 -0
- package/dist/config/client.config.descriptor.d.ts.map +1 -0
- package/dist/config/client.config.descriptor.js +32 -0
- package/dist/config/client.config.descriptor.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/settings.d.ts +9 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +25 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/docs/client.api-request.docs.descriptor.d.ts +4 -0
- package/dist/docs/client.api-request.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/client.api-request.docs.descriptor.js +71 -0
- package/dist/docs/client.api-request.docs.descriptor.js.map +1 -0
- package/dist/events/auth-rejected.event.d.ts +35 -0
- package/dist/events/auth-rejected.event.d.ts.map +1 -0
- package/dist/events/auth-rejected.event.js +36 -0
- package/dist/events/auth-rejected.event.js.map +1 -0
- package/dist/factory.d.ts +5 -1
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +16 -17
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/kind-augment.d.ts +11 -0
- package/dist/kind-augment.d.ts.map +1 -0
- package/dist/kind-augment.js +2 -0
- package/dist/kind-augment.js.map +1 -0
- package/dist/lib/client/api-diagnostics.d.ts +79 -0
- package/dist/lib/client/api-diagnostics.d.ts.map +1 -0
- package/dist/lib/client/api-diagnostics.js +111 -0
- package/dist/lib/client/api-diagnostics.js.map +1 -0
- package/dist/lib/client/configured.d.ts +78 -0
- package/dist/lib/client/configured.d.ts.map +1 -0
- package/dist/lib/client/configured.js +261 -0
- package/dist/lib/client/configured.js.map +1 -0
- package/dist/lib/client/internal/auth-headers.d.ts +11 -0
- package/dist/lib/client/internal/auth-headers.d.ts.map +1 -0
- package/dist/lib/client/internal/auth-headers.js +35 -0
- package/dist/lib/client/internal/auth-headers.js.map +1 -0
- package/dist/lib/client/internal/base-client.d.ts +5 -2
- package/dist/lib/client/internal/base-client.d.ts.map +1 -1
- package/dist/lib/client/internal/base-client.js +42 -22
- package/dist/lib/client/internal/base-client.js.map +1 -1
- package/dist/lib/client/internal/base-helpers.d.ts.map +1 -1
- package/dist/lib/client/internal/base-helpers.js +20 -20
- package/dist/lib/client/internal/base-helpers.js.map +1 -1
- package/dist/lib/client/internal/base-types.d.ts +10 -5
- package/dist/lib/client/internal/base-types.d.ts.map +1 -1
- package/dist/lib/client/internal/base-types.js +5 -3
- package/dist/lib/client/internal/base-types.js.map +1 -1
- package/dist/lib/client/internal/client-values.d.ts +43 -0
- package/dist/lib/client/internal/client-values.d.ts.map +1 -0
- package/dist/lib/client/internal/client-values.js +76 -0
- package/dist/lib/client/internal/client-values.js.map +1 -0
- package/dist/lib/client/internal/endpoint.d.ts +6 -5
- package/dist/lib/client/internal/endpoint.d.ts.map +1 -1
- package/dist/lib/client/internal/endpoint.js +3 -0
- package/dist/lib/client/internal/endpoint.js.map +1 -1
- package/dist/lib/client/internal/generator.d.ts +98 -9
- package/dist/lib/client/internal/generator.d.ts.map +1 -1
- package/dist/lib/client/internal/generator.js +92 -140
- package/dist/lib/client/internal/generator.js.map +1 -1
- package/dist/lib/client/internal/request-builder.d.ts +5 -2
- package/dist/lib/client/internal/request-builder.d.ts.map +1 -1
- package/dist/lib/client/internal/request-builder.js +105 -65
- package/dist/lib/client/internal/request-builder.js.map +1 -1
- package/dist/lib/client/internal/sse-stream.d.ts +9 -5
- package/dist/lib/client/internal/sse-stream.d.ts.map +1 -1
- package/dist/lib/client/internal/sse-stream.js +96 -94
- package/dist/lib/client/internal/sse-stream.js.map +1 -1
- package/dist/lib/client/internal/timeout-signal.d.ts +8 -0
- package/dist/lib/client/internal/timeout-signal.d.ts.map +1 -0
- package/dist/lib/client/internal/timeout-signal.js +17 -0
- package/dist/lib/client/internal/timeout-signal.js.map +1 -0
- package/dist/lib/client/internal/transport/http2-fetch.d.ts +8 -0
- package/dist/lib/client/internal/transport/http2-fetch.d.ts.map +1 -0
- package/dist/lib/client/internal/transport/http2-fetch.js +17 -0
- package/dist/lib/client/internal/transport/http2-fetch.js.map +1 -0
- package/dist/lib/client/internal/vibes-client.d.ts +17 -8
- package/dist/lib/client/internal/vibes-client.d.ts.map +1 -1
- package/dist/lib/client/internal/vibes-client.js +127 -67
- package/dist/lib/client/internal/vibes-client.js.map +1 -1
- package/dist/lib/client/internal/wrap-fetch.d.ts +3 -2
- package/dist/lib/client/internal/wrap-fetch.d.ts.map +1 -1
- package/dist/lib/client/internal/wrap-fetch.js +14 -33
- package/dist/lib/client/internal/wrap-fetch.js.map +1 -1
- package/dist/lib/client/runtime-fetch.d.ts +14 -0
- package/dist/lib/client/runtime-fetch.d.ts.map +1 -0
- package/dist/lib/client/runtime-fetch.js +25 -0
- package/dist/lib/client/runtime-fetch.js.map +1 -0
- package/dist/lib/client/types.d.ts +18 -9
- package/dist/lib/client/types.d.ts.map +1 -1
- package/dist/lib/client/types.js +22 -3
- package/dist/lib/client/types.js.map +1 -1
- package/dist/plugin.d.ts +2 -18
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +7 -74
- package/dist/plugin.js.map +1 -1
- package/dist/runtime-client.d.ts +10 -0
- package/dist/runtime-client.d.ts.map +1 -0
- package/dist/runtime-client.js +14 -0
- package/dist/runtime-client.js.map +1 -0
- package/dist/schemas/auth-rejected.d.ts +12 -0
- package/dist/schemas/auth-rejected.d.ts.map +1 -0
- package/dist/schemas/auth-rejected.js +11 -0
- package/dist/schemas/auth-rejected.js.map +1 -0
- package/dist/schemas/sdk-languages.d.ts +47 -0
- package/dist/schemas/sdk-languages.d.ts.map +1 -0
- package/dist/schemas/sdk-languages.js +75 -0
- package/dist/schemas/sdk-languages.js.map +1 -0
- package/dist/schemas/settings.d.ts +14 -0
- package/dist/schemas/settings.d.ts.map +1 -0
- package/dist/schemas/settings.js +10 -0
- package/dist/schemas/settings.js.map +1 -0
- package/dist/schemas/validated-request.d.ts +19 -0
- package/dist/schemas/validated-request.d.ts.map +1 -0
- package/dist/schemas/validated-request.js +2 -0
- package/dist/schemas/validated-request.js.map +1 -0
- package/dist/schemas.d.ts +23 -8
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +8 -2
- package/dist/schemas.js.map +1 -1
- package/dist/sse-client.d.ts +17 -15
- package/dist/sse-client.d.ts.map +1 -1
- package/dist/sse-client.js +111 -91
- package/dist/sse-client.js.map +1 -1
- package/dist/svelte/client-svelte.plugin.d.ts +3 -0
- package/dist/svelte/client-svelte.plugin.d.ts.map +1 -0
- package/dist/svelte/client-svelte.plugin.js +35 -0
- package/dist/svelte/index.d.ts +3 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +2 -0
- package/dist/svelte/styles.css +8 -0
- package/dist/svelte/tool-widgets/ApiRequestToolCard.svelte +53 -0
- package/dist/svelte/tool-widgets/ApiRequestToolCard.svelte.d.ts +5 -0
- package/dist/svelte/tool-widgets/ApiRequestToolCard.svelte.d.ts.map +1 -0
- package/dist/svelte/tool-widgets/index.d.ts +2 -0
- package/dist/svelte/tool-widgets/index.d.ts.map +1 -0
- package/dist/svelte/tool-widgets/index.js +1 -0
- package/dist/tools/api-request/api-request.contract.d.ts +19 -0
- package/dist/tools/api-request/api-request.contract.d.ts.map +1 -0
- package/dist/tools/api-request/api-request.contract.js +110 -0
- package/dist/tools/api-request/api-request.contract.js.map +1 -0
- package/dist/tools/api-request/api-request.descriptor.d.ts +11 -4
- package/dist/tools/api-request/api-request.descriptor.d.ts.map +1 -1
- package/dist/tools/api-request/api-request.descriptor.js +8 -5
- package/dist/tools/api-request/api-request.descriptor.js.map +1 -1
- package/dist/tools/api-request/api-request.impl.cloud.d.ts +15 -0
- package/dist/tools/api-request/api-request.impl.cloud.d.ts.map +1 -0
- package/dist/tools/api-request/api-request.impl.cloud.js +75 -0
- package/dist/tools/api-request/api-request.impl.cloud.js.map +1 -0
- package/dist/tools/api-request/api-request.impl.consumer.d.ts +5 -3
- package/dist/tools/api-request/api-request.impl.consumer.d.ts.map +1 -1
- package/dist/tools/api-request/api-request.impl.consumer.js +27 -33
- package/dist/tools/api-request/api-request.impl.consumer.js.map +1 -1
- package/dist/tools/api-request/api-request.view.d.ts +29 -0
- package/dist/tools/api-request/api-request.view.d.ts.map +1 -0
- package/dist/tools/api-request/api-request.view.js +62 -0
- package/dist/tools/api-request/api-request.view.js.map +1 -0
- package/dist/tools/api-request/schemas/index.d.ts +12 -5
- package/dist/tools/api-request/schemas/index.d.ts.map +1 -1
- package/dist/tools/api-request/schemas/index.js +24 -6
- package/dist/tools/api-request/schemas/index.js.map +1 -1
- package/dist/tui/client-tui.plugin.d.ts +3 -0
- package/dist/tui/client-tui.plugin.d.ts.map +1 -0
- package/dist/tui/client-tui.plugin.js +32 -0
- package/dist/tui/client-tui.plugin.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +2 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/tool-widgets/ApiRequestToolWidget.impl.tui.d.ts +17 -0
- package/dist/tui/tool-widgets/ApiRequestToolWidget.impl.tui.d.ts.map +1 -0
- package/dist/tui/tool-widgets/ApiRequestToolWidget.impl.tui.js +28 -0
- package/dist/tui/tool-widgets/ApiRequestToolWidget.impl.tui.js.map +1 -0
- package/dist/validated-request.d.ts +27 -0
- package/dist/validated-request.d.ts.map +1 -0
- package/dist/validated-request.js +119 -0
- package/dist/validated-request.js.map +1 -0
- package/package.json +190 -45
- package/SPEC.md +0 -107
- package/dist/lib/client/internal/node/http2-fetch.node.d.ts +0 -2
- package/dist/lib/client/internal/node/http2-fetch.node.d.ts.map +0 -1
- package/dist/lib/client/internal/node/http2-fetch.node.js +0 -131
- package/dist/lib/client/internal/node/http2-fetch.node.js.map +0 -1
- package/dist/lib/client/node.d.ts +0 -5
- package/dist/lib/client/node.d.ts.map +0 -1
- package/dist/lib/client/node.js +0 -33
- package/dist/lib/client/node.js.map +0 -1
- package/dist/tools/api-request/index.d.ts +0 -5
- package/dist/tools/api-request/index.d.ts.map +0 -1
- package/dist/tools/api-request/index.js +0 -4
- package/dist/tools/api-request/index.js.map +0 -1
- package/src/factory.ts +0 -114
- package/src/index.ts +0 -15
- package/src/lib/client/core.ts +0 -13
- package/src/lib/client/internal/base-client.ts +0 -107
- package/src/lib/client/internal/base-helpers.ts +0 -74
- package/src/lib/client/internal/base-types.ts +0 -42
- package/src/lib/client/internal/endpoint.ts +0 -51
- package/src/lib/client/internal/generator.ts +0 -181
- package/src/lib/client/internal/index.ts +0 -4
- package/src/lib/client/internal/node/http2-fetch.node.ts +0 -138
- package/src/lib/client/internal/request-builder.ts +0 -147
- package/src/lib/client/internal/sse-stream.ts +0 -130
- package/src/lib/client/internal/vibes-client.ts +0 -167
- package/src/lib/client/internal/wrap-fetch.ts +0 -59
- package/src/lib/client/node.ts +0 -36
- package/src/lib/client/types.ts +0 -156
- package/src/plugin.ts +0 -104
- package/src/schemas.ts +0 -91
- package/src/sse-client.ts +0 -155
- package/src/tools/api-request/api-request.descriptor.ts +0 -28
- package/src/tools/api-request/api-request.impl.consumer.ts +0 -66
- package/src/tools/api-request/index.ts +0 -4
- package/src/tools/api-request/schemas/index.ts +0 -29
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { redactedExcerpt, redactCredentials } from '@vibesdotdev/shared/utils';
|
|
3
|
+
import { readClientValue, readClientFields, JsonValueSchema } from "../../lib/client/internal/client-values.js";
|
|
4
|
+
import { apiRequestInputSchema } from "./schemas/index.js";
|
|
5
|
+
import { CapabilityError, CaughtFailureSchema, isCapabilityError } from '@vibesdotdev/kernel';
|
|
6
|
+
const FORBIDDEN_AUTH_HEADERS = new Set([
|
|
7
|
+
'authorization',
|
|
8
|
+
'proxy-authorization',
|
|
9
|
+
'cookie',
|
|
10
|
+
'set-cookie',
|
|
11
|
+
'x-api-key',
|
|
12
|
+
'x-auth-token'
|
|
13
|
+
]);
|
|
14
|
+
export class ApiRequestContractError extends CapabilityError {
|
|
15
|
+
contractCode;
|
|
16
|
+
constructor(contractCode, message, options) {
|
|
17
|
+
super(redactedExcerpt(message), contractCode === 'UNKNOWN_APP' ? 'NOT_FOUND' : contractCode.startsWith('NO_AUTH') ? 'AUTH_REQUIRED' : 'INVALID_INPUT', { reason: contractCode.toLowerCase().replaceAll('_', '-'), cause: options?.cause });
|
|
18
|
+
this.contractCode = contractCode;
|
|
19
|
+
this.name = 'ApiRequestContractError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function assertSafeHeaders(headers) {
|
|
23
|
+
for (const name of Object.keys(headers ?? {})) {
|
|
24
|
+
if (FORBIDDEN_AUTH_HEADERS.has(name.trim().toLowerCase())) {
|
|
25
|
+
throw new ApiRequestContractError('AUTH_HEADER_FORBIDDEN', `Header "${name}" is managed by the authenticated API client and cannot be supplied to api-request.`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function resolveDeclaredServiceOrigin(app, runtime) {
|
|
30
|
+
try {
|
|
31
|
+
const selected = runtime.hasKind('infra/service')
|
|
32
|
+
? await runtime.query('infra/service').withId(app).select()
|
|
33
|
+
: undefined;
|
|
34
|
+
if (!selected) {
|
|
35
|
+
throw new CapabilityError('Service is not declared in this runtime.', 'NOT_FOUND', {
|
|
36
|
+
reason: 'service-undeclared',
|
|
37
|
+
details: { serviceId: app }
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return await selected.impl.origin();
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (!(error instanceof Error && isCapabilityError(error) && error.reason === 'service-undeclared'))
|
|
44
|
+
throw error;
|
|
45
|
+
throw new ApiRequestContractError('UNKNOWN_APP', `Unknown vibes app "${app}" — no infra/service declares it in the configured service environment.`, { cause: error });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function resolveApiRequestTarget(input, runtime) {
|
|
49
|
+
input = readClientValue(apiRequestInputSchema, input, 'api-request-input-invalid');
|
|
50
|
+
const app = input.app?.trim();
|
|
51
|
+
if (!app) {
|
|
52
|
+
throw new ApiRequestContractError('APP_REQUIRED', 'api-request requires an explicit app id naming a declared infra/service.');
|
|
53
|
+
}
|
|
54
|
+
assertSafeHeaders(input.headers);
|
|
55
|
+
const origin = await resolveDeclaredServiceOrigin(app, runtime);
|
|
56
|
+
let configured;
|
|
57
|
+
let target;
|
|
58
|
+
try {
|
|
59
|
+
configured = new URL(origin);
|
|
60
|
+
target = new URL(input.path, `${origin}/`);
|
|
61
|
+
}
|
|
62
|
+
catch (cause) {
|
|
63
|
+
throw new ApiRequestContractError('INVALID_APP_ORIGIN', `The configured origin for vibes app "${app}" is not a valid URL.`, { cause });
|
|
64
|
+
}
|
|
65
|
+
if (configured.protocol !== 'http:' && configured.protocol !== 'https:') {
|
|
66
|
+
throw new ApiRequestContractError('INVALID_APP_ORIGIN', `The configured origin for vibes app "${app}" must use HTTP or HTTPS.`);
|
|
67
|
+
}
|
|
68
|
+
const configuredOrigin = configured.origin;
|
|
69
|
+
if (!input.path.startsWith('/') ||
|
|
70
|
+
input.path.startsWith('//') ||
|
|
71
|
+
target.origin !== configuredOrigin) {
|
|
72
|
+
throw new ApiRequestContractError('INVALID_PATH', 'api-request path must begin with one slash and cannot override the configured app origin.');
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
app,
|
|
76
|
+
origin: configuredOrigin,
|
|
77
|
+
url: target.toString()
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function apiRequestErrorOutput(error) {
|
|
81
|
+
const failure = CaughtFailureSchema.parse(error);
|
|
82
|
+
return readClientFields(() => {
|
|
83
|
+
const status = readClientValue(z.object({ status: z.number().int().optional() }), failure, 'api-request-failure-unreadable').status;
|
|
84
|
+
return { status: 'error', error: {
|
|
85
|
+
message: failure instanceof Error ? redactedExcerpt(failure.message, { maxChars: 2000 }) : 'The API request failed.',
|
|
86
|
+
code: failure instanceof ApiRequestContractError ? failure.contractCode : failure instanceof CapabilityError && failure.reason === 'no-auth-client' ? 'NO_AUTH_CLIENT' : 'API_REQUEST_FAILED', status
|
|
87
|
+
} };
|
|
88
|
+
}, 'api-request-failure-unreadable');
|
|
89
|
+
}
|
|
90
|
+
/** Apply the shared credential redactor before emitting a tool result. */
|
|
91
|
+
export function apiRequestSuccessOutput(response) {
|
|
92
|
+
const value = readClientValue(JsonValueSchema, response, 'api-request-response-invalid');
|
|
93
|
+
return { status: 'success', response: redactApiResponse(value) };
|
|
94
|
+
}
|
|
95
|
+
function redactApiResponse(value) {
|
|
96
|
+
if (value === null)
|
|
97
|
+
return null;
|
|
98
|
+
if (Array.isArray(value))
|
|
99
|
+
return value.map(redactApiResponse);
|
|
100
|
+
const string = z.string().safeParse(value);
|
|
101
|
+
if (string.success)
|
|
102
|
+
return redactCredentials(string.data);
|
|
103
|
+
const record = z.record(z.string(), JsonValueSchema).safeParse(value);
|
|
104
|
+
if (!record.success)
|
|
105
|
+
return value;
|
|
106
|
+
return Object.fromEntries(Object.entries(record.data).map(([key, entry]) => [key,
|
|
107
|
+
redactCredentials(`${key}=credential-value`) !== `${key}=credential-value`
|
|
108
|
+
? '[redacted]' : redactApiResponse(entry)]));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=api-request.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-request.contract.js","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,23 +23,30 @@ declare const _default: {
|
|
|
23
23
|
GET: "GET";
|
|
24
24
|
POST: "POST";
|
|
25
25
|
PUT: "PUT";
|
|
26
|
-
DELETE: "DELETE";
|
|
27
26
|
PATCH: "PATCH";
|
|
27
|
+
DELETE: "DELETE";
|
|
28
28
|
}>;
|
|
29
29
|
path: import("zod/v4").ZodString;
|
|
30
|
-
query: import("zod/v4").ZodOptional<import("zod/v4").ZodRecord<import("zod/v4").ZodString, import("zod/v4").
|
|
31
|
-
body: import("zod/v4").ZodOptional<import("zod/v4").
|
|
30
|
+
query: import("zod/v4").ZodOptional<import("zod/v4").ZodRecord<import("zod/v4").ZodString, import("zod/v4").ZodOptional<import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodString, import("zod/v4").ZodNumber, import("zod/v4").ZodBoolean, import("zod/v4").ZodArray<import("zod/v4").ZodString>]>>>>;
|
|
31
|
+
body: import("zod/v4").ZodOptional<import("zod/v4").ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, import("zod/v4/core").$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>;
|
|
32
32
|
headers: import("zod/v4").ZodOptional<import("zod/v4").ZodRecord<import("zod/v4").ZodString, import("zod/v4").ZodString>>;
|
|
33
|
+
app: import("zod/v4").ZodOptional<import("zod/v4").ZodString>;
|
|
33
34
|
}, import("zod/v4/core").$strip>;
|
|
34
35
|
output: import("zod/v4").ZodObject<{
|
|
35
36
|
status: import("zod/v4").ZodEnum<{
|
|
36
37
|
error: "error";
|
|
37
38
|
success: "success";
|
|
38
39
|
}>;
|
|
39
|
-
response: import("zod/v4").ZodOptional<import("zod/v4").
|
|
40
|
+
response: import("zod/v4").ZodOptional<import("zod/v4").ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, import("zod/v4/core").$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>;
|
|
40
41
|
error: import("zod/v4").ZodOptional<import("zod/v4").ZodObject<{
|
|
41
42
|
message: import("zod/v4").ZodString;
|
|
43
|
+
failure: import("zod/v4").ZodOptional<import("zod/v4").ZodObject<{
|
|
44
|
+
name: import("zod/v4").ZodString;
|
|
45
|
+
code: import("zod/v4").ZodOptional<import("zod/v4").ZodString>;
|
|
46
|
+
reason: import("zod/v4").ZodOptional<import("zod/v4").ZodString>;
|
|
47
|
+
}, import("zod/v4/core").$strip>>;
|
|
42
48
|
code: import("zod/v4").ZodOptional<import("zod/v4").ZodString>;
|
|
49
|
+
status: import("zod/v4").ZodOptional<import("zod/v4").ZodNumber>;
|
|
43
50
|
}, import("zod/v4/core").$strip>>;
|
|
44
51
|
}, import("zod/v4/core").$strip>;
|
|
45
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-request.descriptor.d.ts","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.descriptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG
|
|
1
|
+
{"version":3,"file":"api-request.descriptor.d.ts","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.descriptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKH,wBAsBG"}
|
|
@@ -3,16 +3,19 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Metadata for the api-request tool. Safe to import anywhere.
|
|
5
5
|
*/
|
|
6
|
-
import { createRuntimeAsset } from '@vibesdotdev/
|
|
6
|
+
import { createRuntimeAsset } from '@vibesdotdev/kernel/factory';
|
|
7
7
|
import { apiRequestInputSchema, apiRequestOutputSchema } from "./schemas/index.js";
|
|
8
8
|
export default createRuntimeAsset({
|
|
9
9
|
kind: 'tools/tool',
|
|
10
10
|
id: 'api-request',
|
|
11
11
|
name: 'API Request',
|
|
12
|
-
description: 'Make an authenticated API request to
|
|
13
|
-
mcpDescription: '
|
|
14
|
-
hardware: ['consumer'],
|
|
15
|
-
|
|
12
|
+
description: 'Make an authenticated API request to an explicitly named Vibes app.',
|
|
13
|
+
mcpDescription: 'Vibes API request. app is required via the infra/service catalog; auth/cookie headers are rejected. Ex: {app:"account",method:"GET",path:"/api/profile"}.',
|
|
14
|
+
hardware: ['consumer', 'cloud'],
|
|
15
|
+
// MCP adapters do not yet thread verified caller auth into ToolCallContext.
|
|
16
|
+
// Keep the tool out of MCP discovery until that surface owns the contract;
|
|
17
|
+
// direct/worker/agent surfaces fail closed on explicit auth context.
|
|
18
|
+
purpose: ['direct', 'worker', 'agent'],
|
|
16
19
|
category: 'execution',
|
|
17
20
|
subcategory: 'api-request',
|
|
18
21
|
tags: ['api', 'network'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-request.descriptor.js","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.descriptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"api-request.descriptor.js","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.descriptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,eAAe,kBAAkB,CAAC;IACjC,IAAI,EAAE,YAAY;IAClB,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,qEAAqE;IAClF,cAAc,EACb,2JAA2J;IAC5J,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;IAC/B,4EAA4E;IAC5E,2EAA2E;IAC3E,qEAAqE;IACrE,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;IACtC,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,aAAa;IAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;IACxB,MAAM,EAAE,OAAO;IACf,gBAAgB,EAAE,IAAI;IACtB,WAAW,EAAE,CAAC,kBAAkB,CAAC;IACjC,OAAO,EAAE;QACR,KAAK,EAAE,qBAAqB;QAC5B,MAAM,EAAE,sBAAsB;KAC9B;CACD,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api-request Tool Implementation (Cloud)
|
|
3
|
+
*
|
|
4
|
+
* Resolves the requested app through the declared infra/service catalog and
|
|
5
|
+
* forwards only caller-scoped authentication supplied by the tool execution
|
|
6
|
+
* context. Cloud execution fails closed when the surface did not provide a
|
|
7
|
+
* JWT or cookie.
|
|
8
|
+
*/
|
|
9
|
+
import type { VibesRuntime, ToolCallContext } from '@vibesdotdev/kernel';
|
|
10
|
+
import type { ApiRequestInput, ApiRequestOutput } from './schemas/index.ts';
|
|
11
|
+
declare const _default: {
|
|
12
|
+
execute(input: ApiRequestInput, runtime: VibesRuntime, ctx: ToolCallContext): Promise<ApiRequestOutput>;
|
|
13
|
+
};
|
|
14
|
+
export default _default;
|
|
15
|
+
//# sourceMappingURL=api-request.impl.cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-request.impl.cloud.d.ts","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.impl.cloud.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAUzE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;;mBAqDnE,eAAe,WACb,YAAY,OAChB,eAAe,GAClB,OAAO,CAAC,gBAAgB,CAAC;;AAL7B,wBA4BE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { valueFreeFailure, CaughtFailureSchema } from '@vibesdotdev/kernel';
|
|
2
|
+
import { JsonValueSchema, readClientValue } from "../../lib/client/internal/client-values.js";
|
|
3
|
+
import { apiRequestInputSchema } from "./schemas/index.js";
|
|
4
|
+
import * as z from 'zod/v4';
|
|
5
|
+
import { vibesApiClient } from "../../factory.js";
|
|
6
|
+
import { ApiRequestContractError, apiRequestErrorOutput, apiRequestSuccessOutput, resolveApiRequestTarget } from "./api-request.contract.js";
|
|
7
|
+
function nonEmptyMetadataString(ctx, key) {
|
|
8
|
+
const value = readClientValue(z.object({ metadata: z.record(z.string(), JsonValueSchema).optional() }), ctx, 'api-request-context-unreadable').metadata?.[key];
|
|
9
|
+
const parsed = z.string().safeParse(value);
|
|
10
|
+
if (!parsed.success)
|
|
11
|
+
return null;
|
|
12
|
+
const trimmed = parsed.data.trim();
|
|
13
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
14
|
+
}
|
|
15
|
+
const FORWARDABLE_AUTH_COOKIES = new Set([
|
|
16
|
+
'__Secure-better-auth.session_token',
|
|
17
|
+
'better-auth.session_token'
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* Extract only the canonical Better Auth session cookie. Tool metadata may
|
|
21
|
+
* carry the caller's complete host Cookie header; forwarding that verbatim to
|
|
22
|
+
* a sibling app would leak unrelated host-only cookies across trust domains.
|
|
23
|
+
*/
|
|
24
|
+
function resolveForwardableAuthCookie(rawCookie) {
|
|
25
|
+
for (const part of rawCookie.split(';')) {
|
|
26
|
+
const separator = part.indexOf('=');
|
|
27
|
+
if (separator <= 0)
|
|
28
|
+
continue;
|
|
29
|
+
const name = part.slice(0, separator).trim();
|
|
30
|
+
const value = part.slice(separator + 1).trim();
|
|
31
|
+
if (FORWARDABLE_AUTH_COOKIES.has(name) && value.length > 0 && !/[\r\n]/.test(value)) {
|
|
32
|
+
return `${name}=${value}`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function resolveCallerAuth(ctx) {
|
|
38
|
+
const jwt = nonEmptyMetadataString(ctx, 'jwt');
|
|
39
|
+
if (jwt) {
|
|
40
|
+
return { auth: { type: 'bearer', credentials: jwt } };
|
|
41
|
+
}
|
|
42
|
+
const cookie = nonEmptyMetadataString(ctx, 'cookie');
|
|
43
|
+
if (cookie) {
|
|
44
|
+
const authCookie = resolveForwardableAuthCookie(cookie);
|
|
45
|
+
if (authCookie)
|
|
46
|
+
return { headers: { Cookie: authCookie } };
|
|
47
|
+
}
|
|
48
|
+
throw new ApiRequestContractError('NO_AUTH_CONTEXT', 'Cloud api-request requires caller-scoped JWT or a canonical Better Auth session cookie from the execution surface.');
|
|
49
|
+
}
|
|
50
|
+
export default {
|
|
51
|
+
async execute(input, runtime, ctx) {
|
|
52
|
+
try {
|
|
53
|
+
input = readClientValue(apiRequestInputSchema, input, 'api-request-input-invalid');
|
|
54
|
+
const target = await resolveApiRequestTarget(input, runtime);
|
|
55
|
+
const apiClient = vibesApiClient({
|
|
56
|
+
id: `api-request:${target.app}`,
|
|
57
|
+
baseUrl: target.origin,
|
|
58
|
+
runtime,
|
|
59
|
+
...resolveCallerAuth(ctx)
|
|
60
|
+
});
|
|
61
|
+
const response = await apiClient.request(target.url, {
|
|
62
|
+
method: input.method,
|
|
63
|
+
query: input.query ?? {},
|
|
64
|
+
body: input.body ?? undefined,
|
|
65
|
+
headers: input.headers ?? {}
|
|
66
|
+
});
|
|
67
|
+
return apiRequestSuccessOutput(response);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const projected = apiRequestErrorOutput(error);
|
|
71
|
+
return { status: 'error', error: { ...projected.error, failure: valueFreeFailure(CaughtFailureSchema.parse(error)) } };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=api-request.impl.cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-request.impl.cloud.js","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.impl.cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* api-request Tool Implementation (Consumer)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Resolves the requested app through the declared infra/service catalog, then
|
|
5
|
+
* sends the absolute target URL through the explicitly registered auth API
|
|
6
|
+
* client. The auth client owns the consumer credential provider; api-request
|
|
7
|
+
* never reads or accepts credentials itself.
|
|
6
8
|
*/
|
|
7
|
-
import type
|
|
9
|
+
import { type VibesRuntime, type ToolCallContext } from '@vibesdotdev/kernel';
|
|
8
10
|
import type { ApiRequestInput, ApiRequestOutput } from './schemas/index.ts';
|
|
9
11
|
declare const _default: {
|
|
10
12
|
execute(input: ApiRequestInput, runtime: VibesRuntime, _ctx: ToolCallContext): Promise<ApiRequestOutput>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-request.impl.consumer.d.ts","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.impl.consumer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-request.impl.consumer.d.ts","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.impl.consumer.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,OAAO,EAAmB,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAS/F,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;;mBAoBnE,eAAe,WACb,YAAY,QACf,eAAe,GACnB,OAAO,CAAC,gBAAgB,CAAC;;AAL7B,wBAuBE"}
|
|
@@ -1,50 +1,44 @@
|
|
|
1
|
+
import { valueFreeFailure, CaughtFailureSchema } from '@vibesdotdev/kernel';
|
|
2
|
+
import { readClientValue } from "../../lib/client/internal/client-values.js";
|
|
3
|
+
import { apiRequestInputSchema } from "./schemas/index.js";
|
|
1
4
|
/**
|
|
2
5
|
* api-request Tool Implementation (Consumer)
|
|
3
6
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
7
|
+
* Resolves the requested app through the declared infra/service catalog, then
|
|
8
|
+
* sends the absolute target URL through the explicitly registered auth API
|
|
9
|
+
* client. The auth client owns the consumer credential provider; api-request
|
|
10
|
+
* never reads or accepts credentials itself.
|
|
6
11
|
*/
|
|
7
|
-
|
|
12
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
13
|
+
import { getVibesClient } from '@vibesdotdev/kernel/client';
|
|
14
|
+
import { apiRequestErrorOutput, apiRequestSuccessOutput, resolveApiRequestTarget } from "./api-request.contract.js";
|
|
15
|
+
async function resolveAuthenticatedApiClient(runtime) {
|
|
8
16
|
try {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
17
|
+
const client = await getVibesClient('client', runtime);
|
|
18
|
+
const apiClient = await client.resolve('auth');
|
|
19
|
+
return apiClient;
|
|
13
20
|
}
|
|
14
|
-
catch {
|
|
15
|
-
|
|
21
|
+
catch (cause) {
|
|
22
|
+
throw new CapabilityError('The authenticated auth API client is not available in this runtime.', 'AUTH_REQUIRED', { reason: 'no-auth-client', cause });
|
|
16
23
|
}
|
|
17
|
-
throw new Error('API client not available in runtime context. Ensure api/client kind is registered.');
|
|
18
24
|
}
|
|
19
25
|
export default {
|
|
20
26
|
async execute(input, runtime, _ctx) {
|
|
21
|
-
const method = input.method;
|
|
22
|
-
const path = input.path;
|
|
23
|
-
const query = input.query ?? {};
|
|
24
|
-
const body = input.body ?? undefined;
|
|
25
|
-
const headers = input.headers ?? {};
|
|
26
27
|
try {
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
input = readClientValue(apiRequestInputSchema, input, 'api-request-input-invalid');
|
|
29
|
+
const target = await resolveApiRequestTarget(input, runtime);
|
|
30
|
+
const apiClient = await resolveAuthenticatedApiClient(runtime);
|
|
31
|
+
const response = await apiClient.request(target.url, {
|
|
32
|
+
method: input.method,
|
|
33
|
+
query: input.query ?? {},
|
|
34
|
+
body: input.body ?? undefined,
|
|
35
|
+
headers: input.headers ?? {}
|
|
33
36
|
});
|
|
34
|
-
return
|
|
35
|
-
status: 'success',
|
|
36
|
-
response
|
|
37
|
-
};
|
|
37
|
+
return apiRequestSuccessOutput(response);
|
|
38
38
|
}
|
|
39
39
|
catch (error) {
|
|
40
|
-
const
|
|
41
|
-
return {
|
|
42
|
-
status: 'error',
|
|
43
|
-
error: {
|
|
44
|
-
message,
|
|
45
|
-
code: 'API_REQUEST_FAILED'
|
|
46
|
-
}
|
|
47
|
-
};
|
|
40
|
+
const projected = apiRequestErrorOutput(error);
|
|
41
|
+
return { status: 'error', error: { ...projected.error, failure: valueFreeFailure(CaughtFailureSchema.parse(error)) } };
|
|
48
42
|
}
|
|
49
43
|
}
|
|
50
44
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-request.impl.consumer.js","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.impl.consumer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"api-request.impl.consumer.js","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.impl.consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAkB,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAA2C,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,OAAO,EACN,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,MAAM,2BAA2B,CAAC;AAGnC,KAAK,UAAU,6BAA6B,CAC3C,OAAqB;IAErB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,cAAc,CAAmB,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,SAAS,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,eAAe,CACxB,qEAAqE,EAAE,eAAe,EACtF,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,CACnC,CAAC;IACH,CAAC;AAEF,CAAC;AAED,eAAe;IACd,KAAK,CAAC,OAAO,CACZ,KAAsB,EACtB,OAAqB,EACrB,IAAqB;QAErB,IAAI,CAAC;YACJ,KAAK,GAAG,eAAe,CAAC,qBAAqB,EAAE,KAAK,EAAE,2BAA2B,CAAC,CAAC;YACnF,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,MAAM,6BAA6B,CAAC,OAAO,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAY,MAAM,CAAC,GAAG,EAAE;gBAC/D,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;gBACxB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;gBAC7B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;aAC5B,CAAC,CAAC;YAEH,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACxH,CAAC;IACF,CAAC;CACD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ValueFreeFailure } from '@vibesdotdev/kernel';
|
|
2
|
+
/** Shared method, app-scoped URL, status and redacted body projection. */
|
|
3
|
+
import * as z from 'zod/v4';
|
|
4
|
+
export declare const API_REQUEST_BODY_EXCERPT_MAX = 240;
|
|
5
|
+
export interface ApiRequestCardModel {
|
|
6
|
+
method: string;
|
|
7
|
+
url: string;
|
|
8
|
+
statusLabel: string;
|
|
9
|
+
httpStatus: number | null;
|
|
10
|
+
bodyExcerpt: string;
|
|
11
|
+
title: string;
|
|
12
|
+
failed: boolean;
|
|
13
|
+
failure?: ValueFreeFailure;
|
|
14
|
+
}
|
|
15
|
+
declare const CardBoundarySchema: z.ZodUnknown;
|
|
16
|
+
type CardValue = z.input<typeof CardBoundarySchema>;
|
|
17
|
+
declare const RecordSchema: z.ZodRecord<z.ZodString, z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>;
|
|
18
|
+
export declare function rec(value: CardValue): z.infer<typeof RecordSchema> | {
|
|
19
|
+
failure: ValueFreeFailure;
|
|
20
|
+
} | null;
|
|
21
|
+
export declare function excerptBody(value: CardValue, maxLength?: number): string;
|
|
22
|
+
export declare function apiRequestCardModel(options: {
|
|
23
|
+
input?: CardValue;
|
|
24
|
+
args?: CardValue;
|
|
25
|
+
output?: CardValue;
|
|
26
|
+
error?: string | null;
|
|
27
|
+
}): ApiRequestCardModel;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=api-request.view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-request.view.d.ts","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.view.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACpH,0EAA0E;AAC1E,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,MAAM,WAAW,mBAAmB;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAAE;AACtM,QAAA,MAAM,kBAAkB,cAAc,CAAC;AACvC,KAAK,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACpD,QAAA,MAAM,YAAY,2QAAwC,CAAC;AAG3D,wBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GAAG;IAAE,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAGzG;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,SAA+B,GAAG,MAAM,CAQ9F;AAWD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,mBAAmB,CAapJ"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { CapabilityError, CaughtFailureSchema, valueFreeFailure } from '@vibesdotdev/kernel';
|
|
2
|
+
/** Shared method, app-scoped URL, status and redacted body projection. */
|
|
3
|
+
import * as z from 'zod/v4';
|
|
4
|
+
import { redactedExcerpt, redactCredentials } from '@vibesdotdev/shared/utils';
|
|
5
|
+
import { JsonValueSchema, QuerySchema, readClientValue } from "../../lib/client/internal/client-values.js";
|
|
6
|
+
export const API_REQUEST_BODY_EXCERPT_MAX = 240;
|
|
7
|
+
const CardBoundarySchema = z.unknown();
|
|
8
|
+
const RecordSchema = z.record(z.string(), JsonValueSchema);
|
|
9
|
+
const InputSchema = z.object({ method: z.string().optional().catch(undefined), path: z.string().optional().catch(undefined), app: z.string().optional().catch(undefined), query: QuerySchema.optional().catch(undefined) });
|
|
10
|
+
const OutputSchema = z.object({ status: z.enum(['success', 'error']).optional().catch(undefined), response: JsonValueSchema.optional().catch(undefined), error: z.object({ message: z.string().optional(), status: z.number().int().optional() }).optional().catch(undefined) });
|
|
11
|
+
export function rec(value) {
|
|
12
|
+
try {
|
|
13
|
+
return RecordSchema.safeParse(value).data ?? null;
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
return { failure: valueFreeFailure(CaughtFailureSchema.parse(error)) };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function excerptBody(value, maxLength = API_REQUEST_BODY_EXCERPT_MAX) {
|
|
20
|
+
if (value === undefined || value === null)
|
|
21
|
+
return '';
|
|
22
|
+
try {
|
|
23
|
+
const parsed = readClientValue(JsonValueSchema, value, 'api-card-value-invalid');
|
|
24
|
+
const text = z.string().safeParse(parsed);
|
|
25
|
+
const normalized = redactedExcerpt(text.success ? text.data : JSON.stringify(parsed), { maxChars: Math.max(maxLength, 1) + 1 }).replace(/\s+/g, ' ').trim();
|
|
26
|
+
return normalized.length <= maxLength ? normalized : maxLength <= 1 ? '…' : `${normalized.slice(0, maxLength - 1).trimEnd()}…`;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw new CapabilityError('The API card body could not be read.', 'INVALID_INPUT', { reason: 'api-card-value-unreadable', cause: valueFreeFailure(CaughtFailureSchema.parse(error)) });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function formatQuery(query) {
|
|
33
|
+
const params = new URLSearchParams();
|
|
34
|
+
for (const [key, value] of Object.entries(query ?? {})) {
|
|
35
|
+
if (value === undefined)
|
|
36
|
+
continue;
|
|
37
|
+
if (Array.isArray(value))
|
|
38
|
+
value.forEach(item => params.append(key, item));
|
|
39
|
+
else
|
|
40
|
+
params.set(key, String(value));
|
|
41
|
+
}
|
|
42
|
+
const encoded = params.toString();
|
|
43
|
+
return encoded ? `?${encoded}` : '';
|
|
44
|
+
}
|
|
45
|
+
export function apiRequestCardModel(options) {
|
|
46
|
+
try {
|
|
47
|
+
const input = InputSchema.safeParse(options.input ?? options.args).data;
|
|
48
|
+
const output = OutputSchema.safeParse(options.output).data;
|
|
49
|
+
const method = input?.method?.toUpperCase() ?? '', path = input?.path ?? '', app = input?.app ?? '';
|
|
50
|
+
const url = redactCredentials(`${app && path ? `${app}:` : ''}${path}${formatQuery(input?.query)}`);
|
|
51
|
+
const httpStatus = output?.error?.status ?? null, outcome = output?.status;
|
|
52
|
+
const failed = Boolean(options.error) || outcome === 'error' || (httpStatus !== null && httpStatus >= 400);
|
|
53
|
+
const statusLabel = httpStatus !== null ? String(httpStatus) : outcome ?? '';
|
|
54
|
+
const bodyExcerpt = excerptBody(failed ? output?.error?.message ?? options.error ?? output?.response : output?.response);
|
|
55
|
+
const title = redactCredentials([method, path].filter(Boolean).join(' ') || 'API request');
|
|
56
|
+
return { method, url, statusLabel, httpStatus, bodyExcerpt, title, failed };
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return { method: '', url: '', statusLabel: 'error', httpStatus: null, bodyExcerpt: '[unreadable]', title: 'API request', failed: true, failure: valueFreeFailure(CaughtFailureSchema.parse(error)) };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=api-request.view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-request.view.js","sourceRoot":"","sources":["../../../src/tools/api-request/api-request.view.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,25 +7,32 @@ import * as z from 'zod/v4';
|
|
|
7
7
|
export declare const apiRequestInputSchema: z.ZodObject<{
|
|
8
8
|
method: z.ZodEnum<{
|
|
9
9
|
GET: "GET";
|
|
10
|
-
DELETE: "DELETE";
|
|
11
10
|
POST: "POST";
|
|
12
11
|
PUT: "PUT";
|
|
13
12
|
PATCH: "PATCH";
|
|
13
|
+
DELETE: "DELETE";
|
|
14
14
|
}>;
|
|
15
15
|
path: z.ZodString;
|
|
16
|
-
query: z.ZodOptional<z.ZodRecord<z.ZodString, z.
|
|
17
|
-
body: z.ZodOptional<z.
|
|
16
|
+
query: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodString>]>>>>;
|
|
17
|
+
body: z.ZodOptional<z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>;
|
|
18
18
|
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
19
|
+
app: z.ZodOptional<z.ZodString>;
|
|
19
20
|
}, z.core.$strip>;
|
|
20
21
|
export declare const apiRequestOutputSchema: z.ZodObject<{
|
|
21
22
|
status: z.ZodEnum<{
|
|
22
|
-
success: "success";
|
|
23
23
|
error: "error";
|
|
24
|
+
success: "success";
|
|
24
25
|
}>;
|
|
25
|
-
response: z.ZodOptional<z.
|
|
26
|
+
response: z.ZodOptional<z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>;
|
|
26
27
|
error: z.ZodOptional<z.ZodObject<{
|
|
27
28
|
message: z.ZodString;
|
|
29
|
+
failure: z.ZodOptional<z.ZodObject<{
|
|
30
|
+
name: z.ZodString;
|
|
31
|
+
code: z.ZodOptional<z.ZodString>;
|
|
32
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
33
|
+
}, z.core.$strip>>;
|
|
28
34
|
code: z.ZodOptional<z.ZodString>;
|
|
35
|
+
status: z.ZodOptional<z.ZodNumber>;
|
|
29
36
|
}, z.core.$strip>>;
|
|
30
37
|
}, z.core.$strip>;
|
|
31
38
|
export type ApiRequestInput = z.infer<typeof apiRequestInputSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/api-request/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/api-request/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;iBAwBhC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;iBAWjC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
|
@@ -4,20 +4,38 @@
|
|
|
4
4
|
* Input/output schemas for the api-request tool.
|
|
5
5
|
*/
|
|
6
6
|
import * as z from 'zod/v4';
|
|
7
|
+
import { JsonValueSchema } from "../../../lib/client/internal/client-values.js";
|
|
7
8
|
export const apiRequestInputSchema = z.object({
|
|
8
9
|
method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']),
|
|
9
|
-
path: z
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
path: z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1)
|
|
13
|
+
.refine((path) => path.startsWith('/') && !path.startsWith('//'), {
|
|
14
|
+
message: 'Path must begin with one slash and cannot override the app origin.'
|
|
15
|
+
}),
|
|
16
|
+
query: z
|
|
17
|
+
.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]).optional())
|
|
18
|
+
.optional(),
|
|
19
|
+
body: JsonValueSchema.optional(),
|
|
20
|
+
headers: z.record(z.string(), z.string()).optional(),
|
|
21
|
+
/**
|
|
22
|
+
* Target vibes app id (e.g. `account`, `platform`, `knowledge`, `ai`). The
|
|
23
|
+
* implementation requires this value and resolves it from the declared
|
|
24
|
+
* infra/service catalog for the configured service environment. It remains
|
|
25
|
+
* schema-optional so omission returns the stable APP_REQUIRED tool error
|
|
26
|
+
* instead of a generic validation failure.
|
|
27
|
+
*/
|
|
28
|
+
app: z.string().min(1).optional()
|
|
13
29
|
});
|
|
14
30
|
export const apiRequestOutputSchema = z.object({
|
|
15
31
|
status: z.enum(['success', 'error']),
|
|
16
|
-
response:
|
|
32
|
+
response: JsonValueSchema.optional(),
|
|
17
33
|
error: z
|
|
18
34
|
.object({
|
|
19
35
|
message: z.string(),
|
|
20
|
-
code: z.string().optional()
|
|
36
|
+
failure: z.object({ name: z.string(), code: z.string().optional(), reason: z.string().optional() }).optional(),
|
|
37
|
+
code: z.string().optional(),
|
|
38
|
+
status: z.number().int().optional()
|
|
21
39
|
})
|
|
22
40
|
.optional()
|
|
23
41
|
});
|