@neon/tools 0.5.0 → 0.6.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # `@neon/tools`
2
2
 
3
- Agent tools for the Neon Management API and for the `@neon/sdk` workflows that attach compute and return a connection string. Select only the operations and workflows an agent needs, then use the canonical descriptors directly or adapt them for MCP, Eve, and Mastra.
3
+ Agent tools for the `@neon/sdk` ergonomic client. Select the methods an agent needs, then use the descriptors directly or adapt them for MCP, Eve, and Mastra.
4
4
 
5
5
  ```bash
6
6
  npm install @neon/tools
@@ -8,7 +8,7 @@ npm install @neon/tools
8
8
 
9
9
  ## Create tools
10
10
 
11
- `apiKey` is a Bearer credential: a Neon API key or a Neon OAuth access token. A function is called on every request, which is how short-lived OAuth tokens get refreshed. A credential is required when a tool executes — at construction, on `execute()`, or from MCP `authInfo` — and an empty value is rejected rather than ignored.
11
+ Selectors are SDK paths. The returned record is keyed by those paths. Each tool's published `id` is the path in snake_case (`projects.list` → `projects_list`). `toolIds` lists every published selector.
12
12
 
13
13
  ```ts
14
14
  import { createNeonTools } from "@neon/tools";
@@ -16,111 +16,77 @@ import { createNeonTools } from "@neon/tools";
16
16
  const apiKey = process.env.NEON_API_KEY;
17
17
  if (!apiKey) throw new Error("NEON_API_KEY is required");
18
18
 
19
- const operations = ["listProjects", "createProject"] as const;
20
-
21
19
  const tools = createNeonTools({
22
20
  apiKey,
23
- operations,
21
+ tools: [
22
+ "projects.list",
23
+ "projects.createAndConnect",
24
+ "branches.createWithCompute",
25
+ ],
24
26
  });
25
27
 
26
- const result = await tools.listProjects.execute({
27
- limit: 10,
28
+ const listed = await tools["projects.list"].execute({ limit: 10 });
29
+ const created = await tools["projects.createAndConnect"].execute({
30
+ name: "agent-project",
31
+ region_id: "aws-us-east-1",
28
32
  });
29
33
  ```
30
34
 
31
- OAuth access tokens use the same option. Pass a getter when the token can change:
35
+ `limit` on a list tool caps how many items come back.
36
+
37
+ MCP and Mastra publish `tool.id` (`projects_list`), not the record key.
38
+
39
+ `apiKey` is a Bearer credential: a Neon API key or a Neon OAuth access token. A function is called on every request, which is how short-lived OAuth tokens get refreshed. A credential is required when a tool executes — at construction, on `execute()`, or from MCP `authInfo` — and an empty value is rejected rather than ignored.
32
40
 
33
41
  ```ts
34
42
  const tools = createNeonTools({
35
43
  apiKey: () => oauth.getAccessToken(),
36
- operations,
44
+ tools: ["projects.list"],
37
45
  });
38
- ```
39
-
40
- Or supply the token per call:
41
-
42
- ```ts
43
- const tools = createNeonTools({ operations });
44
46
 
45
- await tools.listProjects.execute(
47
+ await tools["projects.list"].execute(
46
48
  { limit: 10 },
47
49
  { apiKey: oauthAccessToken },
48
50
  );
49
51
  ```
50
52
 
51
- The returned record is keyed by OpenAPI operation ID or workflow id. Each tool includes its Zod 4 `inputSchema`, snake-case `id`, title, description, safety annotations, stability metadata, and an `execute()` function. Inputs are flat: path, query, header, and body fields sit on one object. A body that is a single object wrapper is lifted, so `create_project` takes `{ name, region_id, org_id, ... }` rather than `{ project: { name } }`. A body with several properties keeps those properties, so `create_project_branch` takes `{ project_id, branch, endpoints, annotation_value }` and `branch` is still an object. Two email-provider updates keep a `body` field because the API request is a discriminated union.
53
+ Each tool includes its Zod 4 `inputSchema`, published `id`, title, description, safety annotations, stability metadata, and `execute()`. Inputs are snake_case at the tool boundary. `execute()` strictly validates the input, rejects unknown fields, and returns typed, JSON-safe `{ data }`. Neon SDK errors remain typed and are thrown to the caller.
52
54
 
53
- `operationIds` exports every valid operation selector. `execute()` strictly validates the input, rejects unknown fields instead of dropping them, and returns typed, JSON-safe `{ data }`. Neon SDK errors remain typed and are thrown to the caller.
54
-
55
- ## Workflows
56
-
57
- `workflows` selects methods from the `@neon/sdk` ergonomic client. These are not OpenAPI operations: they attach a default compute, wait until the resource is ready, and return a connection string. `operations` is the generated Management API. At least one of the two arrays is required.
58
-
59
- Both workflow tools poll until the resource is ready. The default deadline is five minutes (`wait.timeoutMs`). Pass `wait: { timeoutMs: 30_000 }` on `createNeonTools` or `createNeonTool` to bound that. Set it below the host's own tool-call timeout, otherwise the host gives up first. An abort `signal` on `execute` or a wait timeout stops the poll, not the create: the branch or project may already exist, and the error does not include its id. List before retrying. `metadata.method` and `metadata.path` name the first request; extra readiness GETs are not listed there. `inject.projectId` still works on `createBranchWithCompute` because its path is `/projects/{project_id}/branches`.
55
+ Paginated lists call `.all()` and return the item array. Do not pass a cursor; those fields are omitted from the input schema.
60
56
 
61
57
  ```ts
62
- const tools = createNeonTools({
63
- apiKey,
64
- operations: ["listProjects"],
65
- workflows: ["createBranchWithCompute", "createProjectAndConnect"],
66
- });
67
-
68
- const { data } = await tools.createBranchWithCompute.execute({
69
- project_id: "project-id",
70
- name: "feature-x",
71
- });
72
-
73
- await tools.createProjectAndConnect.execute({
74
- name: "agent-project",
75
- region_id: "aws-us-east-1",
76
- });
58
+ const createBranch = createNeonTool("branches.createWithCompute", { apiKey });
77
59
  ```
78
60
 
79
- `createNeonTool` accepts the same workflow ids:
61
+ ## Writes and waiting
80
62
 
81
- ```ts
82
- const createBranch = createNeonTool("createBranchWithCompute", { apiKey });
83
- ```
63
+ Tools run with `waitForReadiness: true`. When a mutation response includes an `operations` array, the call waits until those operations finish. The default deadline is five minutes (`wait.timeoutMs`). Pass `wait: { timeoutMs: 30_000 }` on `createNeonTools` or `createNeonTool` to bound that. Set it below the host's own tool-call timeout, otherwise the host gives up first.
84
64
 
85
- `workflowIds` lists the selectors. Record keys name the entity (`createBranchWithCompute`, `createProjectAndConnect`) and call `neon.branches.createWithCompute` and `neon.projects.createAndConnect`. Published ids are `create_branch_with_compute` and `create_project_and_connect`. Input fields are snake_case, same as generated tools. `names` can rename a workflow the same way it renames an operation:
65
+ An abort `signal` on `execute` or a wait timeout stops the poll, not the create: the branch or project may already exist, and the error does not include its id. List before retrying.
86
66
 
87
- ```ts
88
- const tools = createNeonTools({
89
- apiKey,
90
- workflows: ["createBranchWithCompute"],
91
- names: { createBranchWithCompute: "create_branch" },
92
- });
67
+ `functions.deploy` can still return `pending`. Its response has no `operations` array, so the tool does not poll.
93
68
 
94
- tools.createBranchWithCompute.id; // "create_branch"
95
- ```
69
+ `metadata.method` and `metadata.path` name the first request; extra readiness GETs are not listed there.
96
70
 
97
- `create_project_branch` still creates a branch with no compute when `endpoints` is omitted. It can attach compute if you pass `endpoints`; it does not wait or return a connection string. Use `createBranchWithCompute` when the next step needs to connect.
71
+ These public client methods are not tools: `projects.create`, `branches.create`, `operations.waitFor`, `postgres.roles.password`, and `storage.objects.get`. Use `projects.createAndConnect` and `branches.createWithCompute` for creates that attach compute and return a connection string. Waiting is what the write tools already do.
98
72
 
99
73
  ## Optional host add-ons
100
74
 
101
- None of these change the default `createNeonTools({ apiKey, operations })` path. They exist so a host can replace hand-written Management API tools without losing descriptions, call tracking, or a grant-scoped project/branch.
102
-
103
75
  ### Descriptions
104
76
 
105
- Pass a map keyed by OpenAPI operation ID or snake-case tool `id`, or a function that can append to the generated text:
77
+ Pass a map keyed by SDK path or published `id`, or a function that can append to the generated text:
106
78
 
107
79
  ```ts
108
80
  const tools = createNeonTools({
109
81
  apiKey,
110
- operations,
82
+ tools: ["projects.list", "projects.delete"],
111
83
  descriptions: {
112
- listProjects:
84
+ "projects.list":
113
85
  "List Neon projects in your account. Do not use for projects shared with you.",
114
- delete_project:
86
+ projects_delete:
115
87
  "Delete a Neon project and all its data. NEVER run autonomously; always ask the user first.",
116
88
  },
117
89
  });
118
-
119
- const noticed = createNeonTools({
120
- apiKey,
121
- operations,
122
- descriptions: (tool) => `${tool.description}\nNotice: scoped to one project.`,
123
- });
124
90
  ```
125
91
 
126
92
  ### Tracking
@@ -130,9 +96,8 @@ const noticed = createNeonTools({
130
96
  ```ts
131
97
  const tools = createNeonTools({
132
98
  apiKey,
133
- operations,
99
+ tools: ["projects.list"],
134
100
  onExecute: async ({ id, execute }) => {
135
- // record `id`, wrap in a span, then:
136
101
  return execute();
137
102
  },
138
103
  });
@@ -142,38 +107,35 @@ This package does not send analytics. Mutating `event.input` does not change a g
142
107
 
143
108
  ### Names
144
109
 
145
- `name` rewrites every published tool `id`. `names` overrides one tool first, keyed by OpenAPI operation ID or the generated snake-case `id`:
110
+ `name` rewrites every published tool `id`. `names` overrides one tool first, keyed by SDK path or the generated snake-case `id`:
146
111
 
147
112
  ```ts
148
113
  const tools = createNeonTools({
149
114
  apiKey,
150
- operations: ["createProjectBranch", "listProjects"] as const,
151
- names: { createProjectBranch: "create_branch" },
115
+ tools: ["branches.createWithCompute", "projects.list"] as const,
116
+ names: { "branches.createWithCompute": "create_branch" },
152
117
  name: (id) => `neon_${id}`,
153
118
  });
154
-
155
- tools.createProjectBranch.id; // "neon_create_branch"
156
- tools.listProjects.id; // "neon_list_projects"
157
119
  ```
158
120
 
159
- The record is still keyed by operation ID (`tools.createProjectBranch`). MCP and Mastra publish `tool.id`. Eve uses the filename as the model-facing name, so name the file after the published `id`. Duplicate or non-snake-case ids throw, and a `names` key that matches no selected tool throws.
121
+ Those tools publish as `neon_create_branch` and `neon_projects_list`. The record is still keyed by SDK path (`tools["branches.createWithCompute"]`). MCP and Mastra publish `tool.id`. Eve uses the filename as the model-facing name, so name the file after the published `id`. Duplicate or non-snake-case ids throw, and a `names` key that matches no selected tool throws.
160
122
 
161
123
  ### Project and branch injection
162
124
 
163
- Tools take path parameters as `project_id` and `branch_id`. A host that already knows those values can inject them, including on `createBranchWithCompute`. Without `omitFromSchema`, the published field becomes optional and a caller-supplied value wins. With `omitFromSchema: true`, the field is removed from the published schema and the injector is the only source:
125
+ Tools take path parameters as `project_id` and `branch_id`. A host that already knows those values can inject them, including on `branches.createWithCompute`. Without `omitFromSchema`, the published field becomes optional and a caller-supplied value wins. With `omitFromSchema: true`, the field is removed from the published schema and the injector is the only source:
164
126
 
165
127
  ```ts
166
128
  const tools = createNeonTools({
167
129
  apiKey,
168
- operations: ["getProject", "deleteProjectBranch"] as const,
130
+ tools: ["projects.get", "branches.delete"] as const,
169
131
  inject: {
170
132
  projectId: "project-id",
171
133
  omitFromSchema: true,
172
134
  },
173
135
  });
174
136
 
175
- await tools.getProject.execute({});
176
- await tools.deleteProjectBranch.execute({ branch_id: "br-id" });
137
+ await tools["projects.get"].execute({});
138
+ await tools["branches.delete"].execute({ branch_id: "br-id" });
177
139
  ```
178
140
 
179
141
  Use a getter when the value is request-scoped. The getter can read the host's own `AsyncLocalStorage` (this package does not export one):
@@ -184,21 +146,21 @@ import { AsyncLocalStorage } from "node:async_hooks";
184
146
  const grant = new AsyncLocalStorage<{ projectId: string }>();
185
147
 
186
148
  const tools = createNeonTools({
187
- operations: ["getProject"] as const,
149
+ tools: ["projects.get"] as const,
188
150
  inject: {
189
151
  projectId: () => grant.getStore()?.projectId,
190
152
  omitFromSchema: true,
191
153
  },
192
154
  });
193
155
 
194
- await grant.run({ projectId: "project-id" }, () => tools.getProject.execute({}));
156
+ await grant.run({ projectId: "project-id" }, () =>
157
+ tools["projects.get"].execute({}),
158
+ );
195
159
  ```
196
160
 
197
- Injectors only apply to tools that have that path key. `listProjects` is unchanged. Empty inject values fail closed. Invalid ids still fail the original path schema before fetch.
198
-
199
- `onExecute` and `inject` apply to workflow tools the same way they apply to generated tools. Grant filtering, read-only filtering, and access-control notices stay in the host.
161
+ Injectors only apply to tools that have that path key. `projects.list` is unchanged. Empty inject values fail closed. Invalid ids still fail the original path schema before fetch.
200
162
 
201
- Injection reads the URL template, so it fills path `project_id` and `branch_id` only. Query and body fields with those names stay caller-supplied, including `getConnectionURI.branch_id`, `createOrgApiKey.project_id`, `createNeonAuthIntegration.project_id` / `branch_id`, `createNeonAuthNewUser.project_id`, `createNeonAuthProviderSDKKeys.project_id`, `transferNeonAuthProviderProject.project_id`, `addProjectJWKS.branch_id`, `createProjectEndpoint.branch_id`, `updateProjectEndpoint.branch_id`, and `getProjectAdvisorSecurityIssues.branch_id`. `omitFromSchema: true` does not hide those fields.
163
+ Injection reads the URL template, so it fills path `project_id` and `branch_id` only. Query and body fields with those names stay caller-supplied, including `postgres.connectionString`'s `branch_id`. `omitFromSchema: true` does not hide those fields.
202
164
 
203
165
  ## Request schemas
204
166
 
@@ -216,7 +178,7 @@ const body = zCreateProjectBody.parse({
216
178
  });
217
179
  ```
218
180
 
219
- These are the raw OpenAPI request shapes, not the flat tool input. `zCreateProjectBody` still wraps fields in `project`. The tool `create_project` does not.
181
+ These are the raw OpenAPI request shapes, not the tool input. `zCreateProjectBody` still wraps fields in `project`. `projects.createAndConnect` does not.
220
182
 
221
183
  These schemas are strict. If a newly added API field is not recognized, upgrade `@neon/tools`; use `@neon/sdk` directly until a matching tools release is available.
222
184
 
@@ -235,7 +197,7 @@ if (!apiKey) throw new Error("NEON_API_KEY is required");
235
197
  const server = new McpServer({ name: "neon", version: "1.0.0" });
236
198
  const tools = createNeonTools({
237
199
  apiKey,
238
- operations: ["listProjects", "createProject"] as const,
200
+ tools: ["projects.list", "projects.createAndConnect"] as const,
239
201
  });
240
202
 
241
203
  registerNeonTools(server, tools);
@@ -245,7 +207,7 @@ For a remote MCP server that already authenticated the client, omit `apiKey` at
245
207
 
246
208
  ```ts
247
209
  const tools = createNeonTools({
248
- operations: ["listProjects", "createProject"] as const,
210
+ tools: ["projects.list", "projects.createAndConnect"] as const,
249
211
  });
250
212
  registerNeonTools(server, tools);
251
213
  ```
@@ -267,7 +229,6 @@ MCP annotations are advisory; the protocol does not enforce approval. Tools expo
267
229
  Eve requires Node.js 24 or later.
268
230
 
269
231
  ```ts
270
- // agent/tools/create_project.ts
271
232
  import { defineTool } from "eve/tools";
272
233
  import { createNeonTool } from "@neon/tools";
273
234
  import { toEveTool } from "@neon/tools/eve";
@@ -277,7 +238,7 @@ if (!apiKey) throw new Error("NEON_API_KEY is required");
277
238
 
278
239
  export default defineTool(
279
240
  toEveTool(
280
- createNeonTool("createProject", {
241
+ createNeonTool("projects.createAndConnect", {
281
242
  apiKey,
282
243
  }),
283
244
  ),
@@ -300,19 +261,19 @@ if (!apiKey) throw new Error("NEON_API_KEY is required");
300
261
 
301
262
  const neonTools = createNeonTools({
302
263
  apiKey,
303
- operations: ["listProjects", "createProject"] as const,
264
+ tools: ["projects.list", "projects.createAndConnect"] as const,
304
265
  });
305
266
  const configs = toMastraTools(neonTools);
306
267
 
307
- const listProjects = createTool(configs.list_projects);
308
- const createProject = createTool(configs.create_project);
268
+ const listProjects = createTool(configs.projects_list);
269
+ const createProject = createTool(configs.projects_create_and_connect);
309
270
  ```
310
271
 
311
272
  The adapter maps approval requirements to Mastra's `requireApproval` field and forwards its abort signal.
312
273
 
313
274
  ## Safety and binary data
314
275
 
315
- Every non-read operation is conservatively marked as potentially destructive and requires approval. Reads that return connection credentials, role passwords, or Neon Auth provider secrets also require approval.
276
+ Every non-read operation is conservatively marked as potentially destructive and requires approval. Reads that return connection credentials also require approval.
316
277
 
317
278
  Binary request fields accept base64 strings:
318
279
 
@@ -322,10 +283,7 @@ import { createNeonTool } from "@neon/tools";
322
283
  const apiKey = process.env.NEON_API_KEY;
323
284
  if (!apiKey) throw new Error("NEON_API_KEY is required");
324
285
 
325
- const deployFunction = createNeonTool(
326
- "createProjectBranchFunctionDeployment",
327
- { apiKey },
328
- );
286
+ const deployFunction = createNeonTool("functions.deploy", { apiKey });
329
287
 
330
288
  await deployFunction.execute({
331
289
  project_id: "project-id",
@@ -335,16 +293,4 @@ await deployFunction.execute({
335
293
  });
336
294
  ```
337
295
 
338
- Binary responses are JSON-safe:
339
-
340
- ```ts
341
- {
342
- data: {
343
- base64: "aGVsbG8=",
344
- contentType: "application/octet-stream",
345
- size: 5,
346
- },
347
- }
348
- ```
349
-
350
296
  `@neon/tools` supports Node.js 20.19 or later. Framework integrations also require the Node.js version supported by that framework.
package/dist/index.d.ts CHANGED
@@ -1,67 +1,41 @@
1
- import { type NeonConfig, NeonError } from "@neon/sdk";
2
- import { type NeonBearerCredential } from "./lib/auth.js";
1
+ import { NeonError } from "@neon/sdk";
3
2
  import { type InjectedNeonTool, type NeonToolCustomizeOptions, type NeonToolInjectOptions, type NeonToolNameOverrides } from "./lib/customize.js";
4
- import { type NeonWorkflowId, type WorkflowFactories, workflowIds } from "./lib/workflows.js";
5
- import { type NeonOperationId, operationFactories, operationIds } from "./operations.gen.js";
3
+ import { type NeonToolId, type ToolClientOptions, toolFactories, toolIds } from "./lib/ergonomic/index.js";
6
4
  export type { NeonBearerCredential } from "./lib/auth.js";
7
5
  export type { InjectedNeonTool, NeonToolCustomizeOptions, NeonToolDescriptionOverrides, NeonToolDescriptionSource, NeonToolInjectOptions, NeonToolInjectValue, NeonToolNameOverrides, NeonToolNameSource, NeonToolOnExecute, NeonToolOnExecuteEvent, } from "./lib/customize.js";
8
6
  export type { JsonSafe, JsonSafeBlob, NeonTool, NeonToolAnnotations, NeonToolExecutionContext, NeonToolMetadata, NeonToolResult, } from "./lib/operation.js";
9
- export type { NeonOperationId, NeonWorkflowId };
10
- export { NeonError, operationIds, workflowIds };
11
- type OperationFactories = typeof operationFactories;
12
- export type NeonTools<Operations extends readonly NeonOperationId[] = [], Workflows extends readonly NeonWorkflowId[] = []> = {
13
- [Operation in Operations[number]]: ReturnType<OperationFactories[Operation]>;
14
- } & {
15
- [Workflow in Workflows[number]]: ReturnType<WorkflowFactories[Workflow]>;
7
+ export type { NeonToolId };
8
+ export { NeonError, toolIds };
9
+ type ToolFactories = typeof toolFactories;
10
+ export type NeonTools<Tools extends readonly NeonToolId[] = []> = {
11
+ [Tool in Tools[number]]: ReturnType<ToolFactories[Tool]>;
16
12
  };
17
- export type InjectedNeonTools<Operations extends readonly NeonOperationId[], Inject, Workflows extends readonly NeonWorkflowId[] = []> = {
18
- [Operation in Operations[number]]: InjectedNeonTool<ReturnType<OperationFactories[Operation]>, Inject>;
19
- } & {
20
- [Workflow in Workflows[number]]: InjectedNeonTool<ReturnType<WorkflowFactories[Workflow]>, Inject>;
13
+ export type InjectedNeonTools<Tools extends readonly NeonToolId[], Inject> = {
14
+ [Tool in Tools[number]]: InjectedNeonTool<ReturnType<ToolFactories[Tool]>, Inject>;
21
15
  };
22
16
  type WithPublishedId<Tool> = Tool extends {
23
17
  id: string;
24
18
  } ? Omit<Tool, "id"> & {
25
19
  id: string;
26
20
  } : Tool;
27
- export interface NeonToolsClientOptions extends Pick<NeonConfig, "baseUrl" | "fetch" | "wait">, Omit<NeonToolCustomizeOptions, "name" | "names"> {
28
- apiKey?: NeonBearerCredential;
21
+ export interface NeonToolsClientOptions extends ToolClientOptions, Omit<NeonToolCustomizeOptions, "name" | "names"> {
29
22
  }
30
- interface OperationSelection {
31
- operations: readonly NeonOperationId[];
32
- workflows?: readonly NeonWorkflowId[];
33
- }
34
- interface WorkflowSelection {
35
- workflows: readonly NeonWorkflowId[];
36
- operations?: readonly NeonOperationId[];
37
- }
38
- type CreateNeonToolsInput = NeonToolsClientOptions & (OperationSelection | WorkflowSelection);
39
- export type CreateNeonToolsOptions<Operations extends readonly NeonOperationId[] = readonly NeonOperationId[], Workflows extends readonly NeonWorkflowId[] = readonly []> = NeonToolsClientOptions & (Workflows extends readonly [] ? {
40
- operations: Operations;
41
- workflows?: Workflows;
42
- } : Operations extends readonly [] ? {
43
- workflows: Workflows;
44
- operations?: Operations;
45
- } : {
46
- operations: Operations;
47
- workflows: Workflows;
48
- });
49
- type SelectedOperations<T> = T extends {
50
- operations: infer O extends readonly NeonOperationId[];
51
- } ? O : [];
52
- type SelectedWorkflows<T> = T extends {
53
- workflows: infer W extends readonly NeonWorkflowId[];
54
- } ? W : [];
55
- type NeonToolsFor<T, Inject> = T extends CreateNeonToolsInput ? Inject extends NeonToolInjectOptions ? InjectedNeonTools<SelectedOperations<T>, Inject, SelectedWorkflows<T>> : NeonTools<SelectedOperations<T>, SelectedWorkflows<T>> : never;
56
- type NeonToolId = NeonOperationId | NeonWorkflowId;
57
- type ToolForId<Id extends NeonToolId> = Id extends NeonWorkflowId ? ReturnType<WorkflowFactories[Id]> : Id extends NeonOperationId ? ReturnType<OperationFactories[Id]> : never;
58
- type NamedNeonTools<Operations extends readonly NeonOperationId[], Workflows extends readonly NeonWorkflowId[], Inject> = {
59
- [Operation in Operations[number]]: WithPublishedId<Inject extends NeonToolInjectOptions ? InjectedNeonTool<ReturnType<OperationFactories[Operation]>, Inject> : ReturnType<OperationFactories[Operation]>>;
60
- } & {
61
- [Workflow in Workflows[number]]: WithPublishedId<Inject extends NeonToolInjectOptions ? InjectedNeonTool<ReturnType<WorkflowFactories[Workflow]>, Inject> : ReturnType<WorkflowFactories[Workflow]>>;
23
+ type CreateNeonToolsInput = NeonToolsClientOptions & {
24
+ tools: readonly NeonToolId[];
25
+ };
26
+ export type CreateNeonToolsOptions<Tools extends readonly NeonToolId[] = readonly NeonToolId[]> = NeonToolsClientOptions & {
27
+ tools: Tools;
28
+ };
29
+ type SelectedTools<T> = T extends {
30
+ tools: infer S extends readonly NeonToolId[];
31
+ } ? S : [];
32
+ type NeonToolsFor<T, Inject> = T extends CreateNeonToolsInput ? Inject extends NeonToolInjectOptions ? InjectedNeonTools<SelectedTools<T>, Inject> : NeonTools<SelectedTools<T>> : never;
33
+ type ToolForId<Id extends NeonToolId> = ReturnType<ToolFactories[Id]>;
34
+ type NamedNeonTools<Tools extends readonly NeonToolId[], Inject> = {
35
+ [Tool in Tools[number]]: WithPublishedId<Inject extends NeonToolInjectOptions ? InjectedNeonTool<ReturnType<ToolFactories[Tool]>, Inject> : ReturnType<ToolFactories[Tool]>>;
62
36
  };
63
37
  type NamedNeonTool<Id extends NeonToolId, Inject> = WithPublishedId<Inject extends NeonToolInjectOptions ? InjectedNeonTool<ToolForId<Id>, Inject> : ToolForId<Id>>;
64
- type NamedNeonToolsFor<T, Inject> = T extends CreateNeonToolsInput ? NamedNeonTools<SelectedOperations<T>, SelectedWorkflows<T>, Inject> : never;
38
+ type NamedNeonToolsFor<T, Inject> = T extends CreateNeonToolsInput ? NamedNeonTools<SelectedTools<T>, Inject> : never;
65
39
  export declare function createNeonTools<const T extends CreateNeonToolsInput, const Inject extends NeonToolInjectOptions | undefined = undefined>(options: T & {
66
40
  inject?: Inject;
67
41
  } & ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAIN,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEN,KAAK,UAAU,EACf,KAAK,iBAAiB,EAEtB,aAAa,EACb,OAAO,EAEP,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACX,gBAAgB,EAChB,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,UAAU,EAAE,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAE9B,KAAK,aAAa,GAAG,OAAO,aAAa,CAAC;AAE1C,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,SAAS,UAAU,EAAE,GAAG,EAAE,IAAI;KAChE,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,SAAS,UAAU,EAAE,EAAE,MAAM,IAAI;KAC3E,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,gBAAgB,CACxC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAC/B,MAAM,CACN;CACD,CAAC;AAEF,KAAK,eAAe,CAAC,IAAI,IAAI,IAAI,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GACrD,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GACjC,IAAI,CAAC;AAER,MAAM,WAAW,sBAChB,SAAQ,iBAAiB,EACxB,IAAI,CAAC,wBAAwB,EAAE,MAAM,GAAG,OAAO,CAAC;CAAG;AAErD,KAAK,oBAAoB,GAAG,sBAAsB,GAAG;IACpD,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,sBAAsB,CACjC,KAAK,SAAS,SAAS,UAAU,EAAE,GAAG,SAAS,UAAU,EAAE,IACxD,sBAAsB,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAE9C,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS;IACjC,KAAK,EAAE,MAAM,CAAC,SAAS,SAAS,UAAU,EAAE,CAAC;CAC7C,GACE,CAAC,GACD,EAAE,CAAC;AAEN,KAAK,YAAY,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,SAAS,oBAAoB,GAC1D,MAAM,SAAS,qBAAqB,GACnC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAC3C,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAC5B,KAAK,CAAC;AAET,KAAK,SAAS,CAAC,EAAE,SAAS,UAAU,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;AA0FtE,KAAK,cAAc,CAAC,KAAK,SAAS,SAAS,UAAU,EAAE,EAAE,MAAM,IAAI;KACjE,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,eAAe,CACvC,MAAM,SAAS,qBAAqB,GACjC,gBAAgB,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,GACzD,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAClC;CACD,CAAC;AAEF,KAAK,aAAa,CAAC,EAAE,SAAS,UAAU,EAAE,MAAM,IAAI,eAAe,CAClE,MAAM,SAAS,qBAAqB,GACjC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,GACvC,SAAS,CAAC,EAAE,CAAC,CAChB,CAAC;AAEF,KAAK,iBAAiB,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,SAAS,oBAAoB,GAC/D,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GACxC,KAAK,CAAC;AAET,wBAAgB,eAAe,CAC9B,KAAK,CAAC,CAAC,SAAS,oBAAoB,EACpC,KAAK,CAAC,MAAM,SAAS,qBAAqB,GAAG,SAAS,GAAG,SAAS,EAElE,OAAO,EAAE,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,CAC/B;IAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAAE,GAC/D;IAAE,KAAK,EAAE,qBAAqB,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CACjE,GACA,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAChC,wBAAgB,eAAe,CAC9B,KAAK,CAAC,CAAC,SAAS,oBAAoB,EACpC,KAAK,CAAC,MAAM,SAAS,qBAAqB,GAAG,SAAS,GAAG,SAAS,EACjE,OAAO,EAAE,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAY7D,wBAAgB,cAAc,CAC7B,KAAK,CAAC,EAAE,SAAS,UAAU,EAC3B,KAAK,CAAC,MAAM,SAAS,qBAAqB,GAAG,SAAS,GAAG,SAAS,EAElE,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,sBAAsB,GAAG;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,CACA;IAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAAE,GAC/D;IAAE,KAAK,EAAE,qBAAqB,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CACjE,GACA,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7B,wBAAgB,cAAc,CAC7B,KAAK,CAAC,EAAE,SAAS,UAAU,EAC3B,KAAK,CAAC,MAAM,SAAS,qBAAqB,GAAG,SAAS,GAAG,SAAS,EAElE,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,sBAAsB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,MAAM,SAAS,qBAAqB,GACpC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,GACvC,SAAS,CAAC,EAAE,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -1,49 +1,33 @@
1
- import { missingBearerCredential, requireBearerCredential } from "./lib/auth.js";
2
1
  import { applyToolCustomization, assertToolCustomizeOptions, hasToolCustomization } from "./lib/customize.js";
3
- import { isNeonWorkflowId, workflowFactoryFor, workflowIds } from "./lib/workflows.js";
4
- import { operationFactories, operationIds } from "./operations.gen.js";
5
- import { NeonError, createNeonClient } from "@neon/sdk";
2
+ import { toolFactories } from "./lib/ergonomic/catalog.js";
3
+ import { isNeonToolId, toolIds, unpublishedToolError } from "./lib/ergonomic/ids.js";
4
+ import { NeonError } from "@neon/sdk";
6
5
  //#region src/index.ts
7
- const createRawClient = (options) => createNeonClient({
8
- apiKey: options.apiKey === void 0 ? missingBearerCredential : requireBearerCredential(options.apiKey),
9
- ...options.baseUrl === void 0 ? {} : { baseUrl: options.baseUrl },
10
- ...options.fetch === void 0 ? {} : { fetch: options.fetch },
11
- ...options.wait === void 0 ? {} : { wait: options.wait }
12
- }).client;
13
- const operationFactoryFor = (operationId) => {
14
- const knownOperationId = operationIds.find((candidate) => candidate === operationId);
15
- if (knownOperationId === void 0) throw new TypeError(`Unknown Neon operation "${operationId}".`);
16
- return operationFactories[knownOperationId];
17
- };
18
6
  const assertKnownNameKeys = (names, tools) => {
19
7
  if (names === void 0 || typeof names === "function") return;
20
8
  const known = new Set(tools.flatMap((tool) => [tool.operationId, tool.id]));
21
9
  const unknown = Object.keys(names).filter((key) => !known.has(key));
22
10
  if (unknown.length > 0) throw new TypeError(`Unknown Neon tool name override: ${unknown.join(", ")}`);
23
11
  };
24
- function assertNeonTools(value, operations, workflows) {
25
- if (typeof value !== "object" || value === null) throw new TypeError("Expected generated Neon tools to be an object.");
26
- for (const operationId of operations) if (!(operationId in value)) throw new TypeError(`Missing generated Neon tool "${operationId}".`);
27
- for (const workflowId of workflows) if (!(workflowId in value)) throw new TypeError(`Missing Neon workflow tool "${workflowId}".`);
12
+ function assertNeonTools(value, tools) {
13
+ if (typeof value !== "object" || value === null) throw new TypeError("Expected Neon tools to be an object.");
14
+ for (const toolId of tools) if (!(toolId in value)) throw new TypeError(`Missing Neon tool "${toolId}".`);
28
15
  }
16
+ const factoryFor = (id) => {
17
+ const known = toolIds.find((candidate) => candidate === id);
18
+ if (known === void 0) throw unpublishedToolError(id);
19
+ return toolFactories[known];
20
+ };
29
21
  const bindTools = (options) => {
30
22
  assertToolCustomizeOptions(options);
31
- const operations = options.operations ?? [];
32
- const workflows = options.workflows ?? [];
33
- if (operations.length === 0 && workflows.length === 0) throw new TypeError("createNeonTools requires at least one operation or workflow");
34
- const selectedOperations = /* @__PURE__ */ new Set();
35
- const operationEntries = operations.map((operationId) => {
36
- if (selectedOperations.has(operationId)) throw new Error(`Duplicate Neon operation "${operationId}"`);
37
- selectedOperations.add(operationId);
38
- return [operationId, operationFactoryFor(operationId)(createRawClient(options))];
23
+ const selected = options.tools;
24
+ if (selected === void 0 || selected.length === 0) throw new TypeError("createNeonTools requires at least one tool");
25
+ const seen = /* @__PURE__ */ new Set();
26
+ const rawEntries = selected.map((toolId) => {
27
+ if (seen.has(toolId)) throw new Error(`Duplicate Neon tool "${toolId}"`);
28
+ seen.add(toolId);
29
+ return [toolId, factoryFor(toolId)(options)];
39
30
  });
40
- const selectedWorkflows = /* @__PURE__ */ new Set();
41
- const workflowEntries = workflows.map((workflowId) => {
42
- if (selectedWorkflows.has(workflowId)) throw new Error(`Duplicate Neon workflow "${workflowId}"`);
43
- selectedWorkflows.add(workflowId);
44
- return [workflowId, workflowFactoryFor(workflowId)(options)];
45
- });
46
- const rawEntries = [...operationEntries, ...workflowEntries];
47
31
  assertKnownNameKeys(options.names, rawEntries.map(([, tool]) => tool));
48
32
  const entries = rawEntries.map(([id, tool]) => {
49
33
  return [id, hasToolCustomization(options) ? applyToolCustomization(tool, options) : tool];
@@ -55,23 +39,18 @@ const bindTools = (options) => {
55
39
  publishedIds.set(tool.id, id);
56
40
  }
57
41
  const tools = Object.fromEntries(entries);
58
- assertNeonTools(tools, operations, workflows);
42
+ assertNeonTools(tools, selected);
59
43
  return tools;
60
44
  };
61
45
  function createNeonTools(options) {
62
46
  return bindTools(options);
63
47
  }
64
48
  function createNeonTool(id, options) {
49
+ if (!isNeonToolId(id)) throw unpublishedToolError(id);
65
50
  assertToolCustomizeOptions(options);
66
- let tool;
67
- if (isNeonWorkflowId(id)) tool = workflowFactoryFor(id)(options);
68
- else {
69
- const knownOperationId = operationIds.find((candidate) => candidate === id);
70
- if (knownOperationId === void 0) throw new TypeError(`Unknown Neon operation or workflow "${id}".`);
71
- tool = operationFactories[knownOperationId](createRawClient(options));
72
- }
51
+ const tool = factoryFor(id)(options);
73
52
  assertKnownNameKeys(options.names, [tool]);
74
53
  return hasToolCustomization(options) ? applyToolCustomization(tool, options) : tool;
75
54
  }
76
55
  //#endregion
77
- export { NeonError, createNeonTool, createNeonTools, operationIds, workflowIds };
56
+ export { NeonError, createNeonTool, createNeonTools, toolIds };
@@ -0,0 +1,54 @@
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
+ export type PublishedId<Id extends string> = Id extends `${infer Head}.${infer Rest}` ? `${Snake<Head>}_${PublishedId<Rest>}` : Snake<Id>;
15
+ export declare const publishedId: <Id extends string>(id: Id) => PublishedId<Id>;
16
+ export declare const toolClient: (options: ToolClientOptions, context?: NeonToolExecutionContext) => NeonClient<true>;
17
+ export declare const collectObjectList: (neon: NeonClient<true>, input: {
18
+ project_id: string;
19
+ branch_id: string;
20
+ bucket_name: string;
21
+ prefix?: string;
22
+ delimiter?: string;
23
+ limit?: number;
24
+ }, signal?: AbortSignal) => Promise<{
25
+ folders: string[];
26
+ objects: import("@neon/sdk").BucketObject[];
27
+ prefix: string;
28
+ }>;
29
+ export declare const collectPages: <T>(list: Paginated<T>, maxItems?: number) => Promise<T[]>;
30
+ 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>>>;
31
+ type GeneratedTool<G extends NeonOperationId> = ReturnType<(typeof operationFactories)[G]>;
32
+ type GeneratedSchema<G extends NeonOperationId> = GeneratedTool<G>["inputSchema"];
33
+ type GeneratedInput<G extends NeonOperationId> = z.output<GeneratedSchema<G>>;
34
+ type GeneratedArg<G extends NeonOperationId> = z.input<GeneratedSchema<G>>;
35
+ type FromGeneratedMeta = {
36
+ list?: boolean;
37
+ annotations?: NeonToolAnnotations;
38
+ requiresApproval?: boolean;
39
+ };
40
+ type OmittedInput<G extends NeonOperationId, Keys extends string> = Omit<GeneratedInput<G>, Keys>;
41
+ type OmittedArg<G extends NeonOperationId, Keys extends string> = Omit<GeneratedArg<G>, Keys>;
42
+ export declare function fromGenerated<const Id extends NeonToolId, const G extends NeonOperationId, Output>(options: ToolClientOptions, spec: FromGeneratedMeta & {
43
+ id: Id;
44
+ generated: G;
45
+ run: (neon: NeonClient<true>, input: GeneratedInput<G>, signal?: AbortSignal) => Promise<Output>;
46
+ }): NeonTool<GeneratedSchema<G>, PublishedId<Id>, JsonSafe<Awaited<Output>>>;
47
+ export declare function fromGenerated<const Id extends NeonToolId, const G extends NeonOperationId, const Keys extends keyof GeneratedInput<G> & string, Output>(options: ToolClientOptions, spec: FromGeneratedMeta & {
48
+ id: Id;
49
+ generated: G;
50
+ omit: readonly Keys[];
51
+ run: (neon: NeonClient<true>, input: OmittedInput<G, Keys>, signal?: AbortSignal) => Promise<Output>;
52
+ }): NeonTool<z.ZodType<OmittedInput<G, Keys>, OmittedArg<G, Keys>>, PublishedId<Id>, JsonSafe<Awaited<Output>>>;
53
+ export {};
54
+ //# 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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"}