@neon/tools 0.5.0 → 0.7.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/README.md +61 -110
- package/dist/index.d.ts +24 -50
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -43
- package/dist/lib/ergonomic/bind.d.ts +57 -0
- package/dist/lib/ergonomic/bind.d.ts.map +1 -0
- package/dist/lib/ergonomic/bind.js +126 -0
- package/dist/lib/ergonomic/catalog.d.ts +2601 -0
- package/dist/lib/ergonomic/catalog.d.ts.map +1 -0
- package/dist/lib/ergonomic/catalog.js +703 -0
- package/dist/lib/ergonomic/composed.d.ts +450 -0
- package/dist/lib/ergonomic/composed.d.ts.map +1 -0
- package/dist/lib/ergonomic/composed.js +186 -0
- package/dist/lib/ergonomic/ids.d.ts +7 -0
- package/dist/lib/ergonomic/ids.d.ts.map +1 -0
- package/dist/lib/ergonomic/ids.js +122 -0
- package/dist/lib/ergonomic/index.d.ts +4 -0
- package/dist/lib/ergonomic/index.d.ts.map +1 -0
- package/dist/lib/ergonomic/index.js +4 -0
- package/package.json +2 -2
- package/dist/lib/workflows.d.ts +0 -315
- package/dist/lib/workflows.d.ts.map +0 -1
- package/dist/lib/workflows.js +0 -113
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type NeonClient, type NeonConfig, type Paginated } from "@neon/sdk";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
import { type NeonOperationId, operationFactories } from "../../operations.gen.js";
|
|
4
|
+
import { type NeonBearerCredential } from "../auth.js";
|
|
5
|
+
import type { JsonSafe, NeonTool, NeonToolAnnotations, NeonToolExecutionContext } from "../operation.js";
|
|
6
|
+
import type { NeonToolId } from "./ids.js";
|
|
7
|
+
export interface ToolClientOptions {
|
|
8
|
+
apiKey?: NeonBearerCredential;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
fetch?: typeof fetch;
|
|
11
|
+
wait?: NeonConfig["wait"];
|
|
12
|
+
}
|
|
13
|
+
type Snake<S extends string> = S extends `${infer Head}${infer Rest}` ? Head extends Uppercase<Head> ? Head extends Lowercase<Head> ? `${Head}${Snake<Rest>}` : `_${Lowercase<Head>}${Snake<Rest>}` : `${Head}${Snake<Rest>}` : S;
|
|
14
|
+
type LastSegment<Id extends string> = Id extends `${string}.${infer Rest}` ? LastSegment<Rest> : Id;
|
|
15
|
+
type ResourcePath<Id extends string, Acc extends string = ""> = Id extends `${infer Head}.${infer Rest}` ? ResourcePath<Rest, Acc extends "" ? Head : `${Acc}.${Head}`> : Acc;
|
|
16
|
+
type SnakeDots<Id extends string> = Id extends `${infer Head}.${infer Rest}` ? `${Snake<Head>}_${SnakeDots<Rest>}` : Snake<Id>;
|
|
17
|
+
export type PublishedId<Id extends string> = Id extends `${string}.${string}` ? `${Snake<LastSegment<Id>>}_${SnakeDots<ResourcePath<Id>>}` : Snake<Id>;
|
|
18
|
+
export declare const publishedId: <Id extends string>(id: Id) => PublishedId<Id>;
|
|
19
|
+
export declare const toolClient: (options: ToolClientOptions, context?: NeonToolExecutionContext) => NeonClient<true>;
|
|
20
|
+
export declare const collectObjectList: (neon: NeonClient<true>, input: {
|
|
21
|
+
project_id: string;
|
|
22
|
+
branch_id: string;
|
|
23
|
+
bucket_name: string;
|
|
24
|
+
prefix?: string;
|
|
25
|
+
delimiter?: string;
|
|
26
|
+
limit?: number;
|
|
27
|
+
}, signal?: AbortSignal) => Promise<{
|
|
28
|
+
folders: string[];
|
|
29
|
+
objects: import("@neon/sdk").BucketObject[];
|
|
30
|
+
prefix: string;
|
|
31
|
+
}>;
|
|
32
|
+
export declare const collectPages: <T>(list: Paginated<T>, maxItems?: number) => Promise<T[]>;
|
|
33
|
+
export declare const bindTool: <const InputSchema extends z.ZodType, const Id extends string, Output>(options: ToolClientOptions, tool: Omit<NeonTool<InputSchema, Id, JsonSafe<Awaited<Output>>>, "execute">, run: (neon: NeonClient<true>, input: z.output<InputSchema>, signal?: AbortSignal) => Promise<Output>) => NeonTool<InputSchema, Id, JsonSafe<Awaited<Output>>>;
|
|
34
|
+
type GeneratedTool<G extends NeonOperationId> = ReturnType<(typeof operationFactories)[G]>;
|
|
35
|
+
type GeneratedSchema<G extends NeonOperationId> = GeneratedTool<G>["inputSchema"];
|
|
36
|
+
type GeneratedInput<G extends NeonOperationId> = z.output<GeneratedSchema<G>>;
|
|
37
|
+
type GeneratedArg<G extends NeonOperationId> = z.input<GeneratedSchema<G>>;
|
|
38
|
+
type FromGeneratedMeta = {
|
|
39
|
+
list?: boolean;
|
|
40
|
+
annotations?: NeonToolAnnotations;
|
|
41
|
+
requiresApproval?: boolean;
|
|
42
|
+
};
|
|
43
|
+
type OmittedInput<G extends NeonOperationId, Keys extends string> = Omit<GeneratedInput<G>, Keys>;
|
|
44
|
+
type OmittedArg<G extends NeonOperationId, Keys extends string> = Omit<GeneratedArg<G>, Keys>;
|
|
45
|
+
export declare function fromGenerated<const Id extends NeonToolId, const G extends NeonOperationId, Output>(options: ToolClientOptions, spec: FromGeneratedMeta & {
|
|
46
|
+
id: Id;
|
|
47
|
+
generated: G;
|
|
48
|
+
run: (neon: NeonClient<true>, input: GeneratedInput<G>, signal?: AbortSignal) => Promise<Output>;
|
|
49
|
+
}): NeonTool<GeneratedSchema<G>, PublishedId<Id>, JsonSafe<Awaited<Output>>>;
|
|
50
|
+
export declare function fromGenerated<const Id extends NeonToolId, const G extends NeonOperationId, const Keys extends keyof GeneratedInput<G> & string, Output>(options: ToolClientOptions, spec: FromGeneratedMeta & {
|
|
51
|
+
id: Id;
|
|
52
|
+
generated: G;
|
|
53
|
+
omit: readonly Keys[];
|
|
54
|
+
run: (neon: NeonClient<true>, input: OmittedInput<G, Keys>, signal?: AbortSignal) => Promise<Output>;
|
|
55
|
+
}): NeonTool<z.ZodType<OmittedInput<G, Keys>, OmittedArg<G, Keys>>, PublishedId<Id>, JsonSafe<Awaited<Output>>>;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=bind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../../../src/lib/ergonomic/bind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { missingBearerCredential, requireBearerCredential } from "../auth.js";
|
|
2
|
+
import { toToolResult } from "../result.js";
|
|
3
|
+
import { operationFactories } from "../../operations.gen.js";
|
|
4
|
+
import { NeonError, createNeonClient } from "@neon/sdk";
|
|
5
|
+
import * as z from "zod";
|
|
6
|
+
//#region src/lib/ergonomic/bind.ts
|
|
7
|
+
const ALL_PAGES = " This tool returns every page. Pass limit to cap how many items come back. Do not pass a cursor.";
|
|
8
|
+
const inertClient = createNeonClient({ apiKey: "unused" }).client;
|
|
9
|
+
const snakeSegment = (segment) => segment.replace(/[A-Z]/g, (character) => `_${character.toLowerCase()}`);
|
|
10
|
+
const publishedId = (id) => {
|
|
11
|
+
const dot = id.lastIndexOf(".");
|
|
12
|
+
if (dot === -1) return snakeSegment(id);
|
|
13
|
+
return `${snakeSegment(id.slice(dot + 1))}_${id.slice(0, dot).split(".").map(snakeSegment).join("_")}`;
|
|
14
|
+
};
|
|
15
|
+
const resolveApiKey = (options, context) => {
|
|
16
|
+
if (context !== void 0 && "apiKey" in context) {
|
|
17
|
+
if (context.apiKey === void 0) throw new TypeError("A Neon API key or OAuth access token is required");
|
|
18
|
+
return requireBearerCredential(context.apiKey);
|
|
19
|
+
}
|
|
20
|
+
return options.apiKey === void 0 ? missingBearerCredential : requireBearerCredential(options.apiKey);
|
|
21
|
+
};
|
|
22
|
+
const toolClient = (options, context) => createNeonClient({
|
|
23
|
+
apiKey: resolveApiKey(options, context),
|
|
24
|
+
throwOnError: true,
|
|
25
|
+
waitForReadiness: true,
|
|
26
|
+
...options.baseUrl === void 0 ? {} : { baseUrl: options.baseUrl },
|
|
27
|
+
...options.fetch === void 0 ? {} : { fetch: options.fetch },
|
|
28
|
+
...options.wait === void 0 ? {} : { wait: options.wait }
|
|
29
|
+
});
|
|
30
|
+
const objectListPage = (value) => {
|
|
31
|
+
if ("objects" in value && "folders" in value) return value;
|
|
32
|
+
if ("error" in value && value.error !== void 0) throw value.error;
|
|
33
|
+
if ("data" in value && value.data !== void 0) return value.data;
|
|
34
|
+
throw new NeonError("Object list returned no data.", "client");
|
|
35
|
+
};
|
|
36
|
+
const collectObjectList = async (neon, input, signal) => {
|
|
37
|
+
const folders = [];
|
|
38
|
+
const objects = [];
|
|
39
|
+
let prefix = "";
|
|
40
|
+
let cursor;
|
|
41
|
+
for (;;) {
|
|
42
|
+
const page = objectListPage(await neon.storage.objects.list(input.project_id, input.branch_id, input.bucket_name, {
|
|
43
|
+
...input.prefix === void 0 ? {} : { prefix: input.prefix },
|
|
44
|
+
...input.delimiter === void 0 ? {} : { delimiter: input.delimiter },
|
|
45
|
+
...input.limit === void 0 ? {} : { limit: input.limit },
|
|
46
|
+
...cursor === void 0 ? {} : { cursor }
|
|
47
|
+
}, { signal }));
|
|
48
|
+
for (const folder of page.folders) {
|
|
49
|
+
if (input.limit !== void 0 && folders.length + objects.length >= input.limit) break;
|
|
50
|
+
folders.push(folder);
|
|
51
|
+
}
|
|
52
|
+
for (const object of page.objects) {
|
|
53
|
+
if (input.limit !== void 0 && folders.length + objects.length >= input.limit) break;
|
|
54
|
+
objects.push(object);
|
|
55
|
+
}
|
|
56
|
+
prefix = page.prefix;
|
|
57
|
+
if (input.limit !== void 0 && folders.length + objects.length >= input.limit) break;
|
|
58
|
+
if (page.next_cursor) {
|
|
59
|
+
cursor = page.next_cursor;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (page.is_truncated) throw new NeonError("Object list was truncated without a next cursor.", "client");
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
folders,
|
|
67
|
+
objects,
|
|
68
|
+
prefix
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
const collectPages = async (list, maxItems) => {
|
|
72
|
+
if (maxItems === void 0) {
|
|
73
|
+
const result = await list.all();
|
|
74
|
+
if (result.error) throw result.error;
|
|
75
|
+
if (result.data === void 0) throw new NeonError("List returned no data.", "client");
|
|
76
|
+
return result.data;
|
|
77
|
+
}
|
|
78
|
+
const items = [];
|
|
79
|
+
let cursor;
|
|
80
|
+
for (;;) {
|
|
81
|
+
const result = await list.page(cursor);
|
|
82
|
+
if (result.error) throw result.error;
|
|
83
|
+
if (result.data === void 0) throw new NeonError("List returned no data.", "client");
|
|
84
|
+
items.push(...result.data.items);
|
|
85
|
+
if (items.length >= maxItems) return items.slice(0, maxItems);
|
|
86
|
+
if (!result.data.cursor || result.data.items.length === 0) break;
|
|
87
|
+
cursor = result.data.cursor;
|
|
88
|
+
}
|
|
89
|
+
return items;
|
|
90
|
+
};
|
|
91
|
+
const bindTool = (options, tool, run) => ({
|
|
92
|
+
...tool,
|
|
93
|
+
async execute(input, context) {
|
|
94
|
+
const parsed = await tool.inputSchema.parseAsync(input);
|
|
95
|
+
const result = await run(toolClient(options, context), parsed, context?.signal);
|
|
96
|
+
return toToolResult(result);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
function fromGenerated(options, spec) {
|
|
100
|
+
const generated = operationFactories[spec.generated](inertClient);
|
|
101
|
+
const schema = generated.inputSchema;
|
|
102
|
+
const inputSchema = spec.omit === void 0 || spec.omit.length === 0 ? schema : omitObjectKeys(schema, spec.omit);
|
|
103
|
+
return {
|
|
104
|
+
operationId: spec.id,
|
|
105
|
+
id: publishedId(spec.id),
|
|
106
|
+
title: generated.title,
|
|
107
|
+
description: spec.list ? `${generated.description.trimEnd()}${ALL_PAGES}` : generated.description,
|
|
108
|
+
inputSchema,
|
|
109
|
+
annotations: spec.annotations ?? generated.annotations,
|
|
110
|
+
requiresApproval: spec.requiresApproval ?? generated.requiresApproval,
|
|
111
|
+
metadata: generated.metadata,
|
|
112
|
+
async execute(input, context) {
|
|
113
|
+
const parsed = await inputSchema.parseAsync(input);
|
|
114
|
+
const result = await spec.run(toolClient(options, context), parsed, context?.signal);
|
|
115
|
+
return toToolResult(result);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const omitObjectKeys = (schema, keys) => {
|
|
120
|
+
if (!(schema instanceof z.ZodObject)) throw new TypeError("Generated tool input schemas must be objects");
|
|
121
|
+
const mask = {};
|
|
122
|
+
for (const key of keys) mask[key] = true;
|
|
123
|
+
return schema.omit(mask);
|
|
124
|
+
};
|
|
125
|
+
//#endregion
|
|
126
|
+
export { bindTool, collectObjectList, collectPages, fromGenerated, publishedId, toolClient };
|