@dbx-tools/appkit 0.9.129 → 0.9.131
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/index.ts +5 -1
- package/lib/index.d.ts +5 -1
- package/lib/index.js +4 -2
- package/lib/src/appkit.js +8 -1
- package/lib/src/openapi-tool.d.ts +34 -0
- package/lib/src/openapi-tool.js +175 -0
- package/lib/src/telemetry.d.ts +39 -0
- package/lib/src/telemetry.js +126 -0
- package/lib/src/tool-provider.d.ts +2 -0
- package/lib/src/tool-provider.js +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +28 -9
- package/src/appkit.ts +7 -0
- package/src/openapi-tool.ts +246 -0
- package/src/telemetry.ts +179 -0
- package/src/tool-provider.ts +2 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/** AppKit telemetry compatibility helpers. */
|
|
2
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
3
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
4
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
5
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
return path;
|
|
9
|
+
};
|
|
10
|
+
import { createRequire } from "node:module";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { pathToFileURL } from "node:url";
|
|
13
|
+
/** Return the request pathname without its query string. */
|
|
14
|
+
function requestPath(request) {
|
|
15
|
+
return request.url?.split("?", 1)[0] ?? "";
|
|
16
|
+
}
|
|
17
|
+
/** Whether one request matches the default or configured HTTP telemetry exclusions. */
|
|
18
|
+
export function excludeHttpTelemetryRequest(request, options = {}) {
|
|
19
|
+
if (request.method === "HEAD")
|
|
20
|
+
return true;
|
|
21
|
+
const pathname = requestPath(request);
|
|
22
|
+
for (const pattern of options.exclude ?? []) {
|
|
23
|
+
if (pattern.endsWith("*")) {
|
|
24
|
+
if (pathname.startsWith(pattern.slice(0, -1)))
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
else if (pathname === pattern) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return options.filter?.(request) ?? false;
|
|
32
|
+
}
|
|
33
|
+
function appKitInternalModuleUrl(relativePath) {
|
|
34
|
+
const require = createRequire(import.meta.url);
|
|
35
|
+
const packageRoot = path.dirname(require.resolve("@databricks/appkit/package.json"));
|
|
36
|
+
return pathToFileURL(path.join(packageRoot, "dist", ...relativePath.split("/"))).href;
|
|
37
|
+
}
|
|
38
|
+
function isNativeHttpInstrumentation(value) {
|
|
39
|
+
if (!value || typeof value !== "object")
|
|
40
|
+
return false;
|
|
41
|
+
const candidate = value;
|
|
42
|
+
return typeof candidate.getConfig === "function" && typeof candidate.setConfig === "function";
|
|
43
|
+
}
|
|
44
|
+
async function nativeInstrumentations() {
|
|
45
|
+
const loaded = (await import(__rewriteRelativeImportExtension(appKitInternalModuleUrl("telemetry/instrumentations.js"))));
|
|
46
|
+
if (!loaded.instrumentations) {
|
|
47
|
+
throw new Error("@databricks/appkit no longer exposes its native instrumentations");
|
|
48
|
+
}
|
|
49
|
+
return loaded.instrumentations;
|
|
50
|
+
}
|
|
51
|
+
async function nativeHttpInstrumentation() {
|
|
52
|
+
const instrumentation = (await nativeInstrumentations()).http;
|
|
53
|
+
if (!isNativeHttpInstrumentation(instrumentation)) {
|
|
54
|
+
throw new Error("@databricks/appkit no longer exposes the expected native HTTP telemetry instrumentation");
|
|
55
|
+
}
|
|
56
|
+
return instrumentation;
|
|
57
|
+
}
|
|
58
|
+
async function nativeTelemetryManagerClass() {
|
|
59
|
+
const loaded = (await import(__rewriteRelativeImportExtension(appKitInternalModuleUrl("telemetry/telemetry-manager.js"))));
|
|
60
|
+
if (!loaded.TelemetryManager) {
|
|
61
|
+
throw new Error("@databricks/appkit no longer exposes its native telemetry manager");
|
|
62
|
+
}
|
|
63
|
+
return loaded.TelemetryManager;
|
|
64
|
+
}
|
|
65
|
+
async function nativeTelemetryManager() {
|
|
66
|
+
return (await nativeTelemetryManagerClass()).getInstance();
|
|
67
|
+
}
|
|
68
|
+
function requireNativeTracerProvider(manager) {
|
|
69
|
+
if (!manager.tracerProvider) {
|
|
70
|
+
throw new Error("AppKit's native tracer provider has not started");
|
|
71
|
+
}
|
|
72
|
+
return manager.tracerProvider;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Extend AppKit's native HTTP request filter without registering a second HTTP
|
|
76
|
+
* instrumentation. AppKit 0.81 owns the instrumentation but does not expose a
|
|
77
|
+
* public filter option, so this compatibility hook mutates its existing
|
|
78
|
+
* singleton before `createApp()` registers it.
|
|
79
|
+
*/
|
|
80
|
+
export async function configureNativeHttpTelemetry(options = {}) {
|
|
81
|
+
const instrumentation = await nativeHttpInstrumentation();
|
|
82
|
+
const config = instrumentation.getConfig();
|
|
83
|
+
const appKitFilter = config.ignoreIncomingRequestHook;
|
|
84
|
+
instrumentation.setConfig({
|
|
85
|
+
...config,
|
|
86
|
+
ignoreIncomingRequestHook: (request) => Boolean(appKitFilter?.(request)) || excludeHttpTelemetryRequest(request, options),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Bind AppKit's native instrumentations to the provider AppKit started. This is
|
|
91
|
+
* called after AppKit's deferred `TelemetryManager.start()` phase so a runtime
|
|
92
|
+
* that already occupied the global OTel slot cannot leave native spans no-op.
|
|
93
|
+
*/
|
|
94
|
+
export async function bindNativeTelemetryProvider() {
|
|
95
|
+
const manager = await nativeTelemetryManager();
|
|
96
|
+
if (!manager.tracerProvider)
|
|
97
|
+
return false;
|
|
98
|
+
for (const instrumentation of Object.values(await nativeInstrumentations())) {
|
|
99
|
+
instrumentation.setTracerProvider?.(manager.tracerProvider);
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
/** Contribute a processor before AppKit builds its native tracer provider. */
|
|
104
|
+
export async function registerNativeSpanProcessor(processor) {
|
|
105
|
+
(await nativeTelemetryManagerClass()).registerSpanProcessor(processor);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Return a tracer provider that resolves AppKit's provider when a tracer method
|
|
109
|
+
* is invoked. AppKit starts its provider after plugin setup, while consumers
|
|
110
|
+
* such as Mastra construct their OTel bridge during setup.
|
|
111
|
+
*/
|
|
112
|
+
export async function deferredNativeTracerProvider() {
|
|
113
|
+
const manager = await nativeTelemetryManager();
|
|
114
|
+
return {
|
|
115
|
+
getTracer(name, version, options) {
|
|
116
|
+
return new Proxy({}, {
|
|
117
|
+
get(_target, property) {
|
|
118
|
+
const tracer = requireNativeTracerProvider(manager).getTracer(name, version, options);
|
|
119
|
+
const value = Reflect.get(tracer, property, tracer);
|
|
120
|
+
return typeof value === "function" ? value.bind(tracer) : value;
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7Ozs7Ozs7OztBQUc5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBMEN6Qyw0REFBNEQ7QUFDNUQsU0FBUyxXQUFXLENBQUMsT0FBd0I7SUFDM0MsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCx1RkFBdUY7QUFDdkYsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxPQUF3QixFQUN4QixVQUFzQyxFQUFFO0lBRXhDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLEtBQUssTUFBTSxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM1QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUM3RCxDQUFDO2FBQU0sSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJ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LEVBQUUsTUFBTSxDQUFZLENBQUM7b0JBQy9ELE9BQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ2xFLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQXBwS2l0IHRlbGVtZXRyeSBjb21wYXRpYmlsaXR5IGhlbHBlcnMuICovXG5cbmltcG9ydCB0eXBlIHsgSW5jb21pbmdNZXNzYWdlIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG5pbXBvcnQgdHlwZSB7IFRyYWNlciwgVHJhY2VyT3B0aW9ucywgVHJhY2VyUHJvdmlkZXIgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgdHlwZSB7IFNwYW5Qcm9jZXNzb3IgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2VcIjtcblxudHlwZSBJbmNvbWluZ1JlcXVlc3RGaWx0ZXIgPSAocmVxdWVzdDogSW5jb21pbmdNZXNzYWdlKSA9PiBib29sZWFuO1xuXG5pbnRlcmZhY2UgTmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbkNvbmZpZyB7XG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBpZ25vcmVJbmNvbWluZ1JlcXVlc3RIb29rPzogSW5jb21pbmdSZXF1ZXN0RmlsdGVyO1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgTmF0aXZlSW5zdHJ1bWVudGF0aW9uIHtcbiAgc2V0VHJhY2VyUHJvdmlkZXI/KHByb3ZpZGVyOiBUcmFjZXJQcm92aWRlcik6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBOYXRpdmVIdHRwSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgTmF0aXZlSW5zdHJ1bWVudGF0aW9uIHtcbiAgZ2V0Q29uZmlnKCk6IE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb25Db25maWc7XG4gIHNldENvbmZpZyhjb25maWc6IE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb25Db25maWcpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgTmF0aXZlVGVsZW1ldHJ5TWFuYWdlciB7XG4gIHRyYWNlclByb3ZpZGVyPzogVHJhY2VyUHJvdmlkZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVUZWxlbWV0cnlNYW5hZ2VyQ2xhc3Mge1xuICBnZXRJbnN0YW5jZSgpOiBOYXRpdmVUZWxlbWV0cnlNYW5hZ2VyO1xuICByZWdpc3RlclNwYW5Qcm9jZXNzb3IocHJvY2Vzc29yOiBTcGFuUHJvY2Vzc29yKTogdm9pZDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIEFwcEtpdCdzIG5hdGl2ZSBIVFRQIHJlcXVlc3QgdHJhY2luZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmF0aXZlSHR0cFRlbGVtZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogUmVxdWVzdCBwYXRocyB0byBleGNsdWRlLiBBIHRyYWlsaW5nIGAqYCBtYXRjaGVzIGV2ZXJ5IHBhdGggd2l0aCB0aGF0XG4gICAqIHByZWZpeDsgb3RoZXIgdmFsdWVzIGFyZSBleGFjdCBwYXRoIG1hdGNoZXMuIFF1ZXJ5IHN0cmluZ3MgYXJlIGlnbm9yZWQuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBBZGRpdGlvbmFsIGNhbGxlci1vd25lZCByZXF1ZXN0IGZpbHRlci4gUmV0dXJuaW5nIGB0cnVlYCBleGNsdWRlcyB0aGUgcmVxdWVzdC4gKi9cbiAgcmVhZG9ubHkgZmlsdGVyPzogSW5jb21pbmdSZXF1ZXN0RmlsdGVyO1xufVxuXG4vKiogUmV0dXJuIHRoZSByZXF1ZXN0IHBhdGhuYW1lIHdpdGhvdXQgaXRzIHF1ZXJ5IHN0cmluZy4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RQYXRoKHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSk6IHN0cmluZyB7XG4gIHJldHVybiByZXF1ZXN0LnVybD8uc3BsaXQoXCI/XCIsIDEpWzBdID8/IFwiXCI7XG59XG5cbi8qKiBXaGV0aGVyIG9uZSByZXF1ZXN0IG1hdGNoZXMgdGhlIGRlZmF1bHQgb3IgY29uZmlndXJlZCBIVFRQIHRlbGVtZXRyeSBleGNsdXNpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2x1ZGVIdHRwVGVsZW1ldHJ5UmVxdWVzdChcbiAgcmVxdWVzdDogSW5jb21pbmdNZXNzYWdlLFxuICBvcHRpb25zOiBOYXRpdmVIdHRwVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogYm9vbGVhbiB7XG4gIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gXCJIRUFEXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwYXRobmFtZSA9IHJlcXVlc3RQYXRoKHJlcXVlc3QpO1xuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2Ygb3B0aW9ucy5leGNsdWRlID8/IFtdKSB7XG4gICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoXCIqXCIpKSB7XG4gICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aChwYXR0ZXJuLnNsaWNlKDAsIC0xKSkpIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocGF0aG5hbWUgPT09IHBhdHRlcm4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucy5maWx0ZXI/LihyZXF1ZXN0KSA/PyBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYXBwS2l0SW50ZXJuYWxNb2R1bGVVcmwocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCBwYWNrYWdlUm9vdCA9IHBhdGguZGlybmFtZShyZXF1aXJlLnJlc29sdmUoXCJAZGF0YWJyaWNrcy9hcHBraXQvcGFja2FnZS5qc29uXCIpKTtcbiAgcmV0dXJuIHBhdGhUb0ZpbGVVUkwocGF0aC5qb2luKHBhY2thZ2VSb290LCBcImRpc3RcIiwgLi4ucmVsYXRpdmVQYXRoLnNwbGl0KFwiL1wiKSkpLmhyZWY7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZSBhcyBQYXJ0aWFsPE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24+O1xuICByZXR1cm4gdHlwZW9mIGNhbmRpZGF0ZS5nZXRDb25maWcgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgY2FuZGlkYXRlLnNldENvbmZpZyA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXRpdmVJbnN0cnVtZW50YXRpb25zKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTmF0aXZlSW5zdHJ1bWVudGF0aW9uPj4ge1xuICBjb25zdCBsb2FkZWQgPSAoYXdhaXQgaW1wb3J0KGFwcEtpdEludGVybmFsTW9kdWxlVXJsKFwidGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbnMuanNcIikpKSBhcyB7XG4gICAgaW5zdHJ1bWVudGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIE5hdGl2ZUluc3RydW1lbnRhdGlvbj47XG4gIH07XG4gIGlmICghbG9hZGVkLmluc3RydW1lbnRhdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJAZGF0YWJyaWNrcy9hcHBraXQgbm8gbG9uZ2VyIGV4cG9zZXMgaXRzIG5hdGl2ZSBpbnN0cnVtZW50YXRpb25zXCIpO1xuICB9XG4gIHJldHVybiBsb2FkZWQuaW5zdHJ1bWVudGF0aW9ucztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmF0aXZlSHR0cEluc3RydW1lbnRhdGlvbigpOiBQcm9taXNlPE5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24+IHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9uID0gKGF3YWl0IG5hdGl2ZUluc3RydW1lbnRhdGlvbnMoKSkuaHR0cDtcbiAgaWYgKCFpc05hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24oaW5zdHJ1bWVudGF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQGRhdGFicmlja3MvYXBwa2l0IG5vIGxvbmdlciBleHBvc2VzIHRoZSBleHBlY3RlZCBuYXRpdmUgSFRUUCB0ZWxlbWV0cnkgaW5zdHJ1bWVudGF0aW9uXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gaW5zdHJ1bWVudGF0aW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyQ2xhc3MoKTogUHJvbWlzZTxOYXRpdmVUZWxlbWV0cnlNYW5hZ2VyQ2xhc3M+IHtcbiAgY29uc3QgbG9hZGVkID0gKGF3YWl0IGltcG9ydChhcHBLaXRJbnRlcm5hbE1vZHVsZVVybChcInRlbGVtZXRyeS90ZWxlbWV0cnktbWFuYWdlci5qc1wiKSkpIGFzIHtcbiAgICBUZWxlbWV0cnlNYW5hZ2VyPzogTmF0aXZlVGVsZW1ldHJ5TWFuYWdlckNsYXNzO1xuICB9O1xuICBpZiAoIWxvYWRlZC5UZWxlbWV0cnlNYW5hZ2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQGRhdGFicmlja3MvYXBwa2l0IG5vIGxvbmdlciBleHBvc2VzIGl0cyBuYXRpdmUgdGVsZW1ldHJ5IG1hbmFnZXJcIik7XG4gIH1cbiAgcmV0dXJuIGxvYWRlZC5UZWxlbWV0cnlNYW5hZ2VyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyKCk6IFByb21pc2U8TmF0aXZlVGVsZW1ldHJ5TWFuYWdlcj4ge1xuICByZXR1cm4gKGF3YWl0IG5hdGl2ZVRlbGVtZXRyeU1hbmFnZXJDbGFzcygpKS5nZXRJbnN0YW5jZSgpO1xufVxuXG5mdW5jdGlvbiByZXF1aXJlTmF0aXZlVHJhY2VyUHJvdmlkZXIobWFuYWdlcjogTmF0aXZlVGVsZW1ldHJ5TWFuYWdlcik6IFRyYWNlclByb3ZpZGVyIHtcbiAgaWYgKCFtYW5hZ2VyLnRyYWNlclByb3ZpZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwS2l0J3MgbmF0aXZlIHRyYWNlciBwcm92aWRlciBoYXMgbm90IHN0YXJ0ZWRcIik7XG4gIH1cbiAgcmV0dXJuIG1hbmFnZXIudHJhY2VyUHJvdmlkZXI7XG59XG5cbi8qKlxuICogRXh0ZW5kIEFwcEtpdCdzIG5hdGl2ZSBIVFRQIHJlcXVlc3QgZmlsdGVyIHdpdGhvdXQgcmVnaXN0ZXJpbmcgYSBzZWNvbmQgSFRUUFxuICogaW5zdHJ1bWVudGF0aW9uLiBBcHBLaXQgMC44MSBvd25zIHRoZSBpbnN0cnVtZW50YXRpb24gYnV0IGRvZXMgbm90IGV4cG9zZSBhXG4gKiBwdWJsaWMgZmlsdGVyIG9wdGlvbiwgc28gdGhpcyBjb21wYXRpYmlsaXR5IGhvb2sgbXV0YXRlcyBpdHMgZXhpc3RpbmdcbiAqIHNpbmdsZXRvbiBiZWZvcmUgYGNyZWF0ZUFwcCgpYCByZWdpc3RlcnMgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25maWd1cmVOYXRpdmVIdHRwVGVsZW1ldHJ5KFxuICBvcHRpb25zOiBOYXRpdmVIdHRwVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGluc3RydW1lbnRhdGlvbiA9IGF3YWl0IG5hdGl2ZUh0dHBJbnN0cnVtZW50YXRpb24oKTtcbiAgY29uc3QgY29uZmlnID0gaW5zdHJ1bWVudGF0aW9uLmdldENvbmZpZygpO1xuICBjb25zdCBhcHBLaXRGaWx0ZXIgPSBjb25maWcuaWdub3JlSW5jb21pbmdSZXF1ZXN0SG9vaztcbiAgaW5zdHJ1bWVudGF0aW9uLnNldENvbmZpZyh7XG4gICAgLi4uY29uZmlnLFxuICAgIGlnbm9yZUluY29taW5nUmVxdWVzdEhvb2s6IChyZXF1ZXN0KSA9PlxuICAgICAgQm9vbGVhbihhcHBLaXRGaWx0ZXI/LihyZXF1ZXN0KSkgfHwgZXhjbHVkZUh0dHBUZWxlbWV0cnlSZXF1ZXN0KHJlcXVlc3QsIG9wdGlvbnMpLFxuICB9KTtcbn1cblxuLyoqXG4gKiBCaW5kIEFwcEtpdCdzIG5hdGl2ZSBpbnN0cnVtZW50YXRpb25zIHRvIHRoZSBwcm92aWRlciBBcHBLaXQgc3RhcnRlZC4gVGhpcyBpc1xuICogY2FsbGVkIGFmdGVyIEFwcEtpdCdzIGRlZmVycmVkIGBUZWxlbWV0cnlNYW5hZ2VyLnN0YXJ0KClgIHBoYXNlIHNvIGEgcnVudGltZVxuICogdGhhdCBhbHJlYWR5IG9jY3VwaWVkIHRoZSBnbG9iYWwgT1RlbCBzbG90IGNhbm5vdCBsZWF2ZSBuYXRpdmUgc3BhbnMgbm8tb3AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiaW5kTmF0aXZlVGVsZW1ldHJ5UHJvdmlkZXIoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG1hbmFnZXIgPSBhd2FpdCBuYXRpdmVUZWxlbWV0cnlNYW5hZ2VyKCk7XG4gIGlmICghbWFuYWdlci50cmFjZXJQcm92aWRlcikgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IGluc3RydW1lbnRhdGlvbiBvZiBPYmplY3QudmFsdWVzKGF3YWl0IG5hdGl2ZUluc3RydW1lbnRhdGlvbnMoKSkpIHtcbiAgICBpbnN0cnVtZW50YXRpb24uc2V0VHJhY2VyUHJvdmlkZXI/LihtYW5hZ2VyLnRyYWNlclByb3ZpZGVyKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIENvbnRyaWJ1dGUgYSBwcm9jZXNzb3IgYmVmb3JlIEFwcEtpdCBidWlsZHMgaXRzIG5hdGl2ZSB0cmFjZXIgcHJvdmlkZXIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJOYXRpdmVTcGFuUHJvY2Vzc29yKHByb2Nlc3NvcjogU3BhblByb2Nlc3Nvcik6IFByb21pc2U8dm9pZD4ge1xuICAoYXdhaXQgbmF0aXZlVGVsZW1ldHJ5TWFuYWdlckNsYXNzKCkpLnJlZ2lzdGVyU3BhblByb2Nlc3Nvcihwcm9jZXNzb3IpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIHRyYWNlciBwcm92aWRlciB0aGF0IHJlc29sdmVzIEFwcEtpdCdzIHByb3ZpZGVyIHdoZW4gYSB0cmFjZXIgbWV0aG9kXG4gKiBpcyBpbnZva2VkLiBBcHBLaXQgc3RhcnRzIGl0cyBwcm92aWRlciBhZnRlciBwbHVnaW4gc2V0dXAsIHdoaWxlIGNvbnN1bWVyc1xuICogc3VjaCBhcyBNYXN0cmEgY29uc3RydWN0IHRoZWlyIE9UZWwgYnJpZGdlIGR1cmluZyBzZXR1cC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlZmVycmVkTmF0aXZlVHJhY2VyUHJvdmlkZXIoKTogUHJvbWlzZTxUcmFjZXJQcm92aWRlcj4ge1xuICBjb25zdCBtYW5hZ2VyID0gYXdhaXQgbmF0aXZlVGVsZW1ldHJ5TWFuYWdlcigpO1xuICByZXR1cm4ge1xuICAgIGdldFRyYWNlcihuYW1lOiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIG9wdGlvbnM/OiBUcmFjZXJPcHRpb25zKTogVHJhY2VyIHtcbiAgICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgVHJhY2VyLCB7XG4gICAgICAgIGdldChfdGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRyYWNlciA9IHJlcXVpcmVOYXRpdmVUcmFjZXJQcm92aWRlcihtYW5hZ2VyKS5nZXRUcmFjZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0cmFjZXIsIHByb3BlcnR5LCB0cmFjZXIpIGFzIHVua25vd247XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdmFsdWUuYmluZCh0cmFjZXIpIDogdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
@@ -12,6 +12,8 @@ export interface AgentToolExecutionContext {
|
|
|
12
12
|
readonly resourceId?: string;
|
|
13
13
|
/** Model endpoint selected for the current agent turn. */
|
|
14
14
|
readonly model?: string;
|
|
15
|
+
/** Browser application origin associated with the current agent turn. */
|
|
16
|
+
readonly origin?: string;
|
|
15
17
|
/** Best-effort progress sink validated by the hosting integration. */
|
|
16
18
|
readonly writeProgress?: (event: unknown, options?: AgentToolProgressOptions) => Promise<void>;
|
|
17
19
|
}
|
package/lib/src/tool-provider.js
CHANGED
|
@@ -17,4 +17,4 @@ export class ToolRegistryPlugin extends Plugin {
|
|
|
17
17
|
return executeFromRegistry(this.toolRegistry, name, args, signal);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBFQUEwRTtBQUUxRSxPQUFPLEVBQUUsTUFBTSxFQUF5QixNQUFNLG9CQUFvQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsaUJBQWlCLEdBSWxCLE1BQU0seUJBQXlCLENBQUM7QUFvQmpDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFnQixrQkFDcEIsU0FBUSxNQUFlO0lBTXZCLG1EQUFtRDtJQUNuRCxhQUFhO1FBQ1gsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxnQkFBZ0IsQ0FDZCxJQUFZLEVBQ1osSUFBYSxFQUNiLE1BQW9CLEVBQ3BCLFFBQW9DO1FBRXBDLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBBcHBLaXQgcGx1Z2luIGJhc2UgZm9yIHRvb2xzIGJhY2tlZCBieSB0aGUgbmF0aXZlIHJlZ2lzdHJ5IGhlbHBlcnMuICovXG5cbmltcG9ydCB7IFBsdWdpbiwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgZXhlY3V0ZUZyb21SZWdpc3RyeSxcbiAgdG9vbHNGcm9tUmVnaXN0cnksXG4gIHR5cGUgQWdlbnRUb29sRGVmaW5pdGlvbixcbiAgdHlwZSBUb29sUHJvdmlkZXIsXG4gIHR5cGUgVG9vbFJlZ2lzdHJ5LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcblxuLyoqIERlbGl2ZXJ5IG9wdGlvbnMgZm9yIG9uZSBhZ2VudC10b29sIHByb2dyZXNzIGV2ZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZ2VudFRvb2xQcm9ncmVzc09wdGlvbnMge1xuICAvKiogU3RyZWFtIHRoZSBldmVudCB0byBhY3RpdmUgY2xpZW50cyB3aXRob3V0IHBlcnNpc3RpbmcgaXQgaW4gbWVzc2FnZSBoaXN0b3J5LiAqL1xuICByZWFkb25seSB0cmFuc2llbnQ/OiBib29sZWFuO1xufVxuXG4vKiogT3B0aW9uYWwgcmVxdWVzdCBzdGF0ZSBzdXBwbGllZCBieSBhbiBhZ2VudCBob3N0IHdoZW4gZGlzcGF0Y2hpbmcgYSBwbHVnaW4gdG9vbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCB7XG4gIC8qKiBSZXNvdXJjZSBpZGVudGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYWdlbnQgdHVybi4gKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZD86IHN0cmluZztcbiAgLyoqIE1vZGVsIGVuZHBvaW50IHNlbGVjdGVkIGZvciB0aGUgY3VycmVudCBhZ2VudCB0dXJuLiAqL1xuICByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgLyoqIEJyb3dzZXIgYXBwbGljYXRpb24gb3JpZ2luIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBhZ2VudCB0dXJuLiAqL1xuICByZWFkb25seSBvcmlnaW4/OiBzdHJpbmc7XG4gIC8qKiBCZXN0LWVmZm9ydCBwcm9ncmVzcyBzaW5rIHZhbGlkYXRlZCBieSB0aGUgaG9zdGluZyBpbnRlZ3JhdGlvbi4gKi9cbiAgcmVhZG9ubHkgd3JpdGVQcm9ncmVzcz86IChldmVudDogdW5rbm93biwgb3B0aW9ucz86IEFnZW50VG9vbFByb2dyZXNzT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIEFwcEtpdCdzIGBUb29sUHJvdmlkZXJgIGNvbnRyYWN0IGZyb20gb25lIG5hdGl2ZSB0b29sIHJlZ2lzdHJ5LlxuICpcbiAqIFN1YmNsYXNzZXMgb3duIG9ubHkgdGhlaXIgcmVnaXN0cnkgZW50cmllcy4gVmFsaWRhdGlvbiwgTExNLWZyaWVuZGx5IHNjaGVtYVxuICogZXJyb3JzLCB0b29sIGRlc2NyaXB0aW9ucywgYW5kIGRpc3BhdGNoIHN0YXkgb24gQXBwS2l0J3MgbmF0aXZlIGhlbHBlcnMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUb29sUmVnaXN0cnlQbHVnaW48VENvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcgPSBCYXNlUGx1Z2luQ29uZmlnPlxuICBleHRlbmRzIFBsdWdpbjxUQ29uZmlnPlxuICBpbXBsZW1lbnRzIFRvb2xQcm92aWRlclxue1xuICAvKiogTmF0aXZlIEFwcEtpdCB0b29sIGVudHJpZXMgZXhwb3NlZCBieSB0aGlzIHBsdWdpbi4gKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0b29sUmVnaXN0cnkoKTogVG9vbFJlZ2lzdHJ5O1xuXG4gIC8qKiBUb29sIGRlZmluaXRpb25zIG9mZmVyZWQgdG8gYW4gQXBwS2l0IGFnZW50LiAqL1xuICBnZXRBZ2VudFRvb2xzKCk6IEFnZW50VG9vbERlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIHRvb2xzRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbFJlZ2lzdHJ5KTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBhbmQgZGlzcGF0Y2ggb25lIEFwcEtpdCBhZ2VudCB0b29sIGNhbGwuICovXG4gIGV4ZWN1dGVBZ2VudFRvb2woXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgX2NvbnRleHQ/OiBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gZXhlY3V0ZUZyb21SZWdpc3RyeSh0aGlzLnRvb2xSZWdpc3RyeSwgbmFtZSwgYXJncywgc2lnbmFsKTtcbiAgfVxufVxuIl19
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/_auto-configure.ts","../src/appkit.ts","../src/brand-context.ts","../src/bundle.ts","../src/cache-storage.ts","../src/databricks.ts","../src/files-cache.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/migration.ts","../src/pgaddress.ts","../src/plugin-execution.ts","../src/plugin-registry.ts","../src/provision.ts","../src/request-tags.ts","../src/tool-operations.ts","../src/tool-provider.ts","../src/toolkit-entries.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/_auto-configure.ts","../src/appkit.ts","../src/brand-context.ts","../src/bundle.ts","../src/cache-storage.ts","../src/databricks.ts","../src/files-cache.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/migration.ts","../src/openapi-tool.ts","../src/pgaddress.ts","../src/plugin-execution.ts","../src/plugin-registry.ts","../src/provision.ts","../src/request-tags.ts","../src/telemetry.ts","../src/tool-operations.ts","../src/tool-provider.ts","../src/toolkit-entries.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@databricks/appkit": "0.81.0",
|
|
23
|
-
"@dbx-tools/projen": "^0.9.
|
|
23
|
+
"@dbx-tools/projen": "^0.9.131",
|
|
24
|
+
"@types/json-schema": "^7",
|
|
24
25
|
"@types/node": "^24.6.0",
|
|
25
26
|
"typescript": "^5.9.3",
|
|
26
27
|
"vitest": "3.2.4"
|
|
@@ -30,13 +31,15 @@
|
|
|
30
31
|
},
|
|
31
32
|
"dependencies": {
|
|
32
33
|
"@databricks/sdk-experimental": "^0.17.0",
|
|
33
|
-
"@dbx-tools/auth": "^0.9.
|
|
34
|
-
"@dbx-tools/cache": "^0.9.
|
|
35
|
-
"@dbx-tools/core": "^0.9.
|
|
36
|
-
"@dbx-tools/lakebase": "^0.9.
|
|
37
|
-
"@dbx-tools/postgres": "^0.9.
|
|
38
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
39
|
-
"@dbx-tools/shared-fs": "^0.9.
|
|
34
|
+
"@dbx-tools/auth": "^0.9.131",
|
|
35
|
+
"@dbx-tools/cache": "^0.9.131",
|
|
36
|
+
"@dbx-tools/core": "^0.9.131",
|
|
37
|
+
"@dbx-tools/lakebase": "^0.9.131",
|
|
38
|
+
"@dbx-tools/postgres": "^0.9.131",
|
|
39
|
+
"@dbx-tools/shared-core": "^0.9.131",
|
|
40
|
+
"@dbx-tools/shared-fs": "^0.9.131",
|
|
41
|
+
"@opentelemetry/api": "^1.9.1",
|
|
42
|
+
"@opentelemetry/sdk-trace-base": "2.8.0",
|
|
40
43
|
"zod": "4.3.6"
|
|
41
44
|
},
|
|
42
45
|
"main": "./lib/index.js",
|
|
@@ -90,6 +93,10 @@
|
|
|
90
93
|
"types": "./lib/src/migration.d.ts",
|
|
91
94
|
"default": "./lib/src/migration.js"
|
|
92
95
|
},
|
|
96
|
+
"./openapi-tool": {
|
|
97
|
+
"types": "./lib/src/openapi-tool.d.ts",
|
|
98
|
+
"default": "./lib/src/openapi-tool.js"
|
|
99
|
+
},
|
|
93
100
|
"./pgaddress": {
|
|
94
101
|
"types": "./lib/src/pgaddress.d.ts",
|
|
95
102
|
"default": "./lib/src/pgaddress.js"
|
|
@@ -110,6 +117,10 @@
|
|
|
110
117
|
"types": "./lib/src/request-tags.d.ts",
|
|
111
118
|
"default": "./lib/src/request-tags.js"
|
|
112
119
|
},
|
|
120
|
+
"./telemetry": {
|
|
121
|
+
"types": "./lib/src/telemetry.d.ts",
|
|
122
|
+
"default": "./lib/src/telemetry.js"
|
|
123
|
+
},
|
|
113
124
|
"./tool-operations": {
|
|
114
125
|
"types": "./lib/src/tool-operations.d.ts",
|
|
115
126
|
"default": "./lib/src/tool-operations.js"
|
|
@@ -129,7 +140,7 @@
|
|
|
129
140
|
"./package.json": "./package.json"
|
|
130
141
|
}
|
|
131
142
|
},
|
|
132
|
-
"version": "0.9.
|
|
143
|
+
"version": "0.9.131",
|
|
133
144
|
"types": "./lib/index.d.ts",
|
|
134
145
|
"dbxToolsConfig": {
|
|
135
146
|
"tags": [
|
|
@@ -182,6 +193,10 @@
|
|
|
182
193
|
"types": "./lib/src/migration.d.ts",
|
|
183
194
|
"default": "./lib/src/migration.js"
|
|
184
195
|
},
|
|
196
|
+
"./openapi-tool": {
|
|
197
|
+
"types": "./lib/src/openapi-tool.d.ts",
|
|
198
|
+
"default": "./lib/src/openapi-tool.js"
|
|
199
|
+
},
|
|
185
200
|
"./pgaddress": {
|
|
186
201
|
"types": "./lib/src/pgaddress.d.ts",
|
|
187
202
|
"default": "./lib/src/pgaddress.js"
|
|
@@ -202,6 +217,10 @@
|
|
|
202
217
|
"types": "./lib/src/request-tags.d.ts",
|
|
203
218
|
"default": "./lib/src/request-tags.js"
|
|
204
219
|
},
|
|
220
|
+
"./telemetry": {
|
|
221
|
+
"types": "./lib/src/telemetry.d.ts",
|
|
222
|
+
"default": "./lib/src/telemetry.js"
|
|
223
|
+
},
|
|
205
224
|
"./tool-operations": {
|
|
206
225
|
"types": "./lib/src/tool-operations.d.ts",
|
|
207
226
|
"default": "./lib/src/tool-operations.js"
|
package/src/appkit.ts
CHANGED
|
@@ -51,6 +51,7 @@ import {
|
|
|
51
51
|
} from "./interceptor.ts";
|
|
52
52
|
import { applyLakebaseEnv, type LakebaseConnection } from "./lakebase-resolver.ts";
|
|
53
53
|
import { provisionCacheSchema } from "./provision.ts";
|
|
54
|
+
import { bindNativeTelemetryProvider } from "./telemetry.ts";
|
|
54
55
|
|
|
55
56
|
const logger = log.logger("appkit");
|
|
56
57
|
|
|
@@ -309,6 +310,12 @@ export async function createApp<T extends AppKitPlugins>(
|
|
|
309
310
|
const appConfig = { ...config };
|
|
310
311
|
delete appConfig.autoConfigure;
|
|
311
312
|
delete appConfig.interceptor;
|
|
313
|
+
const onPluginsReady = appConfig.onPluginsReady;
|
|
314
|
+
appConfig.onPluginsReady = async (app) => {
|
|
315
|
+
const bound = await bindNativeTelemetryProvider();
|
|
316
|
+
logger.debug("createApp: native telemetry provider binding", { bound });
|
|
317
|
+
await onPluginsReady?.(app);
|
|
318
|
+
};
|
|
312
319
|
|
|
313
320
|
if (shouldInjectCacheStorage(config)) {
|
|
314
321
|
logger.debug("createApp: inject memory-first cache storage");
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI operation loading and JSON Schema extraction.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { readFile } from "node:fs/promises";
|
|
8
|
+
import { object } from "@dbx-tools/shared-core";
|
|
9
|
+
import { urlBuilder, type UrlBuilder } from "@dbx-tools/shared-core/net";
|
|
10
|
+
import type { JSONSchema7 } from "json-schema";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
|
|
13
|
+
const HTTP_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD", "TRACE"] as const;
|
|
14
|
+
|
|
15
|
+
const JsonObjectSchema = z
|
|
16
|
+
.record(z.string(), z.unknown())
|
|
17
|
+
.describe("A JSON object embedded in an OpenAPI document.");
|
|
18
|
+
|
|
19
|
+
const OpenApiMediaTypeSchema = z
|
|
20
|
+
.object({
|
|
21
|
+
schema: JsonObjectSchema.describe("The JSON Schema for this media type."),
|
|
22
|
+
})
|
|
23
|
+
.describe("One OpenAPI media type.");
|
|
24
|
+
|
|
25
|
+
const OpenApiRequestBodySchema = z
|
|
26
|
+
.object({
|
|
27
|
+
content: z
|
|
28
|
+
.record(z.string(), OpenApiMediaTypeSchema)
|
|
29
|
+
.describe("Request media types keyed by content type."),
|
|
30
|
+
})
|
|
31
|
+
.describe("An OpenAPI request body.");
|
|
32
|
+
|
|
33
|
+
const OpenApiResponseSchema = z
|
|
34
|
+
.object({
|
|
35
|
+
content: z
|
|
36
|
+
.record(z.string(), OpenApiMediaTypeSchema)
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("Response media types keyed by content type."),
|
|
39
|
+
})
|
|
40
|
+
.describe("One OpenAPI response.");
|
|
41
|
+
|
|
42
|
+
const OpenApiOperationSchema = z
|
|
43
|
+
.object({
|
|
44
|
+
operationId: z.string().describe("The stable operation identifier."),
|
|
45
|
+
summary: z.string().optional().describe("The short operation summary."),
|
|
46
|
+
description: z.string().optional().describe("The full operation description."),
|
|
47
|
+
requestBody: OpenApiRequestBodySchema.optional().describe(
|
|
48
|
+
"The optional operation request body.",
|
|
49
|
+
),
|
|
50
|
+
responses: z
|
|
51
|
+
.record(z.string(), OpenApiResponseSchema)
|
|
52
|
+
.describe("Operation responses keyed by HTTP status."),
|
|
53
|
+
})
|
|
54
|
+
.describe("The OpenAPI fields required to define a tool.");
|
|
55
|
+
|
|
56
|
+
const OpenApiPathSchema = z
|
|
57
|
+
.object({
|
|
58
|
+
get: OpenApiOperationSchema.optional(),
|
|
59
|
+
post: OpenApiOperationSchema.optional(),
|
|
60
|
+
put: OpenApiOperationSchema.optional(),
|
|
61
|
+
patch: OpenApiOperationSchema.optional(),
|
|
62
|
+
delete: OpenApiOperationSchema.optional(),
|
|
63
|
+
options: OpenApiOperationSchema.optional(),
|
|
64
|
+
head: OpenApiOperationSchema.optional(),
|
|
65
|
+
trace: OpenApiOperationSchema.optional(),
|
|
66
|
+
})
|
|
67
|
+
.describe("Operations available at one OpenAPI path.");
|
|
68
|
+
|
|
69
|
+
const OpenApiDocumentSchema = z
|
|
70
|
+
.object({
|
|
71
|
+
paths: z
|
|
72
|
+
.record(z.string(), OpenApiPathSchema)
|
|
73
|
+
.refine((paths) => Object.keys(paths).length > 0, "OpenAPI paths must not be empty")
|
|
74
|
+
.describe("OpenAPI path items keyed by URL path."),
|
|
75
|
+
components: JsonObjectSchema.optional().describe("Reusable OpenAPI components."),
|
|
76
|
+
servers: z
|
|
77
|
+
.array(
|
|
78
|
+
z.object({
|
|
79
|
+
url: z.string().describe("Server base URL."),
|
|
80
|
+
}),
|
|
81
|
+
)
|
|
82
|
+
.optional()
|
|
83
|
+
.describe("OpenAPI server definitions."),
|
|
84
|
+
})
|
|
85
|
+
.describe("An OpenAPI document used to define HTTP tools.");
|
|
86
|
+
|
|
87
|
+
type OpenApiDocument = z.infer<typeof OpenApiDocumentSchema>;
|
|
88
|
+
type OpenApiOperation = z.infer<typeof OpenApiOperationSchema>;
|
|
89
|
+
|
|
90
|
+
/** HTTP method supported by an {@link OpenApiTool}. */
|
|
91
|
+
export type OpenApiHttpMethod = (typeof HTTP_METHODS)[number];
|
|
92
|
+
|
|
93
|
+
/** One executable HTTP operation derived from an OpenAPI document. */
|
|
94
|
+
export interface OpenApiTool {
|
|
95
|
+
/** Stable operation identifier. */
|
|
96
|
+
id: string;
|
|
97
|
+
/** Model-facing operation description. */
|
|
98
|
+
description: string;
|
|
99
|
+
/** Resolved operation URL, or the OpenAPI path for a local document without a server URL. */
|
|
100
|
+
url: string;
|
|
101
|
+
/** HTTP method used by the operation. */
|
|
102
|
+
method: OpenApiHttpMethod;
|
|
103
|
+
/** JSON Schema describing operation input. */
|
|
104
|
+
inputSchema: JSONSchema7;
|
|
105
|
+
/** JSON Schema describing a successful operation result. */
|
|
106
|
+
outputSchema: JSONSchema7;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Request options used while loading an OpenAPI document. */
|
|
110
|
+
export interface OpenApiToolsOptions {
|
|
111
|
+
/** Cancels an HTTP request or file read. */
|
|
112
|
+
signal?: AbortSignal;
|
|
113
|
+
/** Headers sent when `source` is an HTTP(S) URL. */
|
|
114
|
+
headers?: RequestInit["headers"];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Load an HTTP(S) URL or local file and return its OpenAPI operations as tool schemas. */
|
|
118
|
+
export async function openApiTools(
|
|
119
|
+
source: string,
|
|
120
|
+
options: OpenApiToolsOptions = {},
|
|
121
|
+
): Promise<OpenApiTool[]> {
|
|
122
|
+
const sourceUrl = httpUrl(source);
|
|
123
|
+
const document = OpenApiDocumentSchema.parse(
|
|
124
|
+
sourceUrl
|
|
125
|
+
? await fetchDocument(sourceUrl, options)
|
|
126
|
+
: await readDocument(source, options.signal),
|
|
127
|
+
);
|
|
128
|
+
return Object.entries(document.paths).flatMap(([path, item]) =>
|
|
129
|
+
HTTP_METHODS.flatMap((method) => {
|
|
130
|
+
const operation = item[method.toLowerCase() as Lowercase<OpenApiHttpMethod>];
|
|
131
|
+
return operation ? [operationTool(document, sourceUrl, path, method, operation)] : [];
|
|
132
|
+
}),
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function httpUrl(source: string): UrlBuilder | undefined {
|
|
137
|
+
const value = source.trim();
|
|
138
|
+
if (!value.startsWith("http://") && !value.startsWith("https://")) return undefined;
|
|
139
|
+
const url = urlBuilder(value);
|
|
140
|
+
return url?.scheme === "http" || url?.scheme === "https" ? url : undefined;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function fetchDocument(url: URL, options: OpenApiToolsOptions): Promise<unknown> {
|
|
144
|
+
const response = await fetch(url, {
|
|
145
|
+
signal: options.signal,
|
|
146
|
+
headers: options.headers,
|
|
147
|
+
});
|
|
148
|
+
if (!response.ok) {
|
|
149
|
+
throw new Error(`OpenAPI request failed with HTTP ${response.status}: ${url}`);
|
|
150
|
+
}
|
|
151
|
+
return response.json();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function readDocument(path: string, signal?: AbortSignal): Promise<unknown> {
|
|
155
|
+
return JSON.parse(await readFile(path, { encoding: "utf8", signal }));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function operationTool(
|
|
159
|
+
document: OpenApiDocument,
|
|
160
|
+
sourceUrl: URL | undefined,
|
|
161
|
+
path: string,
|
|
162
|
+
method: OpenApiHttpMethod,
|
|
163
|
+
operation: OpenApiOperation,
|
|
164
|
+
): OpenApiTool {
|
|
165
|
+
const requestSchema = jsonSchema(operation.requestBody?.content) ?? { type: "object" };
|
|
166
|
+
const responseSchema = successfulResponseSchema(operation);
|
|
167
|
+
return {
|
|
168
|
+
id: operation.operationId,
|
|
169
|
+
description:
|
|
170
|
+
operation.description?.trim() || operation.summary?.trim() || operation.operationId,
|
|
171
|
+
url: operationUrl(document, sourceUrl, path),
|
|
172
|
+
method,
|
|
173
|
+
inputSchema: resolveReferences(document, requestSchema) as JSONSchema7,
|
|
174
|
+
outputSchema: resolveReferences(document, responseSchema) as JSONSchema7,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function successfulResponseSchema(operation: OpenApiOperation): Record<string, unknown> {
|
|
179
|
+
for (const [status, response] of Object.entries(operation.responses)) {
|
|
180
|
+
const schema = jsonSchema(response.content);
|
|
181
|
+
if (/^2(?:\d{2}|XX)$/i.test(status) && schema) return schema;
|
|
182
|
+
}
|
|
183
|
+
return {};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function jsonSchema(
|
|
187
|
+
content: Record<string, z.infer<typeof OpenApiMediaTypeSchema>> | undefined,
|
|
188
|
+
): Record<string, unknown> | undefined {
|
|
189
|
+
const mediaType = Object.entries(content ?? {}).find(([type]) =>
|
|
190
|
+
/^application\/(?:[^+;]+\+)?json(?:;|$)/i.test(type),
|
|
191
|
+
);
|
|
192
|
+
return mediaType?.[1].schema;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function operationUrl(document: OpenApiDocument, sourceUrl: URL | undefined, path: string): string {
|
|
196
|
+
const server = document.servers?.[0]?.url;
|
|
197
|
+
if (server) {
|
|
198
|
+
const base = sourceUrl ? urlBuilder(new URL(server, sourceUrl)) : httpUrl(server);
|
|
199
|
+
return base
|
|
200
|
+
? base.withPathAppend(path).toString()
|
|
201
|
+
: `${server.replace(/\/$/, "")}/${path.replace(/^\//, "")}`;
|
|
202
|
+
}
|
|
203
|
+
return sourceUrl ? (urlBuilder(sourceUrl)?.withPathReplace(path).toString() ?? path) : path;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function resolveReferences(
|
|
207
|
+
document: OpenApiDocument,
|
|
208
|
+
value: unknown,
|
|
209
|
+
active: ReadonlySet<string> = new Set(),
|
|
210
|
+
): unknown {
|
|
211
|
+
if (Array.isArray(value)) return value.map((item) => resolveReferences(document, item, active));
|
|
212
|
+
if (!object.isRecord(value)) return value;
|
|
213
|
+
const reference = typeof value.$ref === "string" ? value.$ref : undefined;
|
|
214
|
+
if (reference) {
|
|
215
|
+
if (active.has(reference)) throw new Error(`Cyclic OpenAPI reference: ${reference}`);
|
|
216
|
+
const target = referenceTarget(document, reference);
|
|
217
|
+
const next = new Set(active).add(reference);
|
|
218
|
+
const { $ref: _ignored, ...siblings } = value;
|
|
219
|
+
return {
|
|
220
|
+
...(resolveReferences(document, target, next) as Record<string, unknown>),
|
|
221
|
+
...(resolveReferences(document, siblings, next) as Record<string, unknown>),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
return Object.fromEntries(
|
|
225
|
+
Object.entries(value).map(([key, child]) => [key, resolveReferences(document, child, active)]),
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function referenceTarget(document: OpenApiDocument, reference: string): unknown {
|
|
230
|
+
if (!reference.startsWith("#/")) throw new Error(`Unsupported OpenAPI reference: ${reference}`);
|
|
231
|
+
let current: unknown = document;
|
|
232
|
+
for (const rawSegment of reference.slice(2).split("/")) {
|
|
233
|
+
const segment = rawSegment.replaceAll("~1", "/").replaceAll("~0", "~");
|
|
234
|
+
if (!object.isRecord(current) || !(segment in current)) {
|
|
235
|
+
throw new Error(`Unresolved OpenAPI reference: ${reference}`);
|
|
236
|
+
}
|
|
237
|
+
current = current[segment];
|
|
238
|
+
}
|
|
239
|
+
return current;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (import.meta.main) {
|
|
243
|
+
const source = process.argv[2];
|
|
244
|
+
if (!source) throw new Error("Usage: bun openapi-tool.ts <openapi-url-or-file>");
|
|
245
|
+
console.log(JSON.stringify(await openApiTools(source), null, 2));
|
|
246
|
+
}
|