@auxx/sdk 0.0.12 → 0.0.13
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/lib/api/api.js +2 -1
- package/lib/api/schemas.js +1 -0
- package/lib/build/server/find-tool-server-modules.js +279 -0
- package/lib/build/server/find-workflow-block-server-modules.js +10 -2
- package/lib/build/server/generate-server-entry.js +46 -1
- package/lib/build/server/zod-to-provider-tool-schema.js +42 -0
- package/lib/client/workflow/index.d.ts +1 -1
- package/lib/client/workflow/index.d.ts.map +1 -1
- package/lib/commands/dev/bundle-javascript.js +17 -1
- package/lib/commands/dev/prepare-build-context.js +11 -2
- package/lib/commands/dev/server-builder.js +2 -1
- package/lib/commands/dev/upload.js +5 -1
- package/lib/commands/dev.js +2 -1
- package/lib/commands/version/create/bundle-javascript.js +4 -0
- package/lib/commands/version/create.js +5 -1
- package/lib/env-loader.js +17 -1
- package/lib/root/app.d.ts +5 -2
- package/lib/root/app.d.ts.map +1 -1
- package/lib/root/index.d.ts +4 -2
- package/lib/root/index.d.ts.map +1 -1
- package/lib/root/index.js +2 -1
- package/lib/root/tools/define-tool.d.ts +4 -0
- package/lib/root/tools/define-tool.d.ts.map +1 -0
- package/lib/root/tools/define-tool.js +7 -0
- package/lib/root/tools/index.d.ts +5 -0
- package/lib/root/tools/index.d.ts.map +1 -0
- package/lib/root/tools/index.js +3 -0
- package/lib/root/tools/refs.d.ts +9 -0
- package/lib/root/tools/refs.d.ts.map +1 -0
- package/lib/root/tools/refs.js +4 -0
- package/lib/root/tools/types.d.ts +97 -0
- package/lib/root/tools/types.d.ts.map +1 -0
- package/lib/root/tools/types.js +1 -0
- package/lib/root/workflow/types.d.ts +27 -14
- package/lib/root/workflow/types.d.ts.map +1 -1
- package/lib/root/workflow/types.js +3 -0
- package/lib/root/workflow/utils.d.ts +4 -4
- package/lib/root/workflow/utils.d.ts.map +1 -1
- package/lib/runtime/workflow.js +17 -0
- package/lib/server/connections.d.ts +1 -0
- package/lib/server/connections.d.ts.map +1 -1
- package/lib/server/index.d.ts +1 -0
- package/lib/server/index.d.ts.map +1 -1
- package/lib/shared/errors.d.ts +4 -0
- package/lib/shared/errors.d.ts.map +1 -1
- package/lib/shared/errors.js +8 -0
- package/lib/shared/index.d.ts +1 -1
- package/lib/shared/index.d.ts.map +1 -1
- package/lib/shared/index.js +1 -1
- package/lib/util/compile-and-extract-catalog.js +279 -0
- package/package.json +5 -1
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import * as esbuild from 'esbuild';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from 'url';
|
|
5
|
+
import { HIDDEN_AUXX_DIRECTORY } from '../constants/hidden-auxx-directory.js';
|
|
6
|
+
import { complete, errored } from '../errors.js';
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
const SDK_ROOT = path.resolve(__dirname, '..', '..');
|
|
10
|
+
export async function compileAndExtractCatalog() {
|
|
11
|
+
const srcDirAbsolute = path.resolve('src');
|
|
12
|
+
const candidates = ['app.ts', 'app.tsx'];
|
|
13
|
+
let appEntry;
|
|
14
|
+
for (const c of candidates) {
|
|
15
|
+
const p = path.join(srcDirAbsolute, c);
|
|
16
|
+
try {
|
|
17
|
+
await fs.access(p);
|
|
18
|
+
appEntry = p;
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (!appEntry) {
|
|
25
|
+
return complete(undefined);
|
|
26
|
+
}
|
|
27
|
+
const auxxDir = path.resolve(HIDDEN_AUXX_DIRECTORY);
|
|
28
|
+
await fs.mkdir(auxxDir, { recursive: true });
|
|
29
|
+
const outputPath = path.join(auxxDir, 'app.catalog.mjs');
|
|
30
|
+
const stubServerImports = {
|
|
31
|
+
name: 'auxx-stub-server-imports',
|
|
32
|
+
setup(build) {
|
|
33
|
+
build.onResolve({ filter: /\.server(\.tsx?)?$/ }, (args) => ({
|
|
34
|
+
path: args.path,
|
|
35
|
+
namespace: 'auxx-server-stub',
|
|
36
|
+
}));
|
|
37
|
+
build.onLoad({ filter: /.*/, namespace: 'auxx-server-stub' }, () => ({
|
|
38
|
+
contents: 'export default async () => { throw new Error("stubbed at catalog extraction") }',
|
|
39
|
+
loader: 'js',
|
|
40
|
+
}));
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const SDK_REAL_BARE = path.join(SDK_ROOT, 'lib', 'root', 'index.js');
|
|
44
|
+
const SDK_REAL_TOOLS = path.join(SDK_ROOT, 'lib', 'root', 'tools', 'index.js');
|
|
45
|
+
const SDK_REAL_WORKFLOW = path.join(SDK_ROOT, 'lib', 'root', 'workflow', 'index.js');
|
|
46
|
+
const stubSdkSubpaths = {
|
|
47
|
+
name: 'auxx-stub-sdk-subpaths',
|
|
48
|
+
setup(build) {
|
|
49
|
+
build.onResolve({ filter: /^@auxx\/sdk(\/.*)?$/ }, (args) => {
|
|
50
|
+
if (args.path === '@auxx/sdk')
|
|
51
|
+
return { path: SDK_REAL_BARE };
|
|
52
|
+
if (args.path === '@auxx/sdk/tools')
|
|
53
|
+
return { path: SDK_REAL_TOOLS };
|
|
54
|
+
if (args.path === '@auxx/sdk/workflow')
|
|
55
|
+
return { path: SDK_REAL_WORKFLOW };
|
|
56
|
+
return { path: args.path, namespace: 'auxx-sdk-stub' };
|
|
57
|
+
});
|
|
58
|
+
build.onLoad({ filter: /.*/, namespace: 'auxx-sdk-stub' }, () => ({
|
|
59
|
+
contents: `
|
|
60
|
+
const noop = () => null;
|
|
61
|
+
const handler = { get: (target, prop) => {
|
|
62
|
+
if (prop in target) return target[prop];
|
|
63
|
+
if (prop === '__esModule') return true;
|
|
64
|
+
if (typeof prop === 'symbol') return undefined;
|
|
65
|
+
return noop;
|
|
66
|
+
}};
|
|
67
|
+
module.exports = new Proxy({}, handler);
|
|
68
|
+
`,
|
|
69
|
+
loader: 'js',
|
|
70
|
+
}));
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
try {
|
|
74
|
+
await esbuild.build({
|
|
75
|
+
entryPoints: [appEntry],
|
|
76
|
+
bundle: true,
|
|
77
|
+
outfile: outputPath,
|
|
78
|
+
format: 'esm',
|
|
79
|
+
platform: 'node',
|
|
80
|
+
target: ['node18'],
|
|
81
|
+
logLevel: 'silent',
|
|
82
|
+
write: true,
|
|
83
|
+
loader: {
|
|
84
|
+
'.png': 'empty',
|
|
85
|
+
'.jpg': 'empty',
|
|
86
|
+
'.jpeg': 'empty',
|
|
87
|
+
'.gif': 'empty',
|
|
88
|
+
'.webp': 'empty',
|
|
89
|
+
'.svg': 'empty',
|
|
90
|
+
},
|
|
91
|
+
plugins: [stubServerImports, stubSdkSubpaths],
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
return errored({
|
|
96
|
+
code: 'CATALOG_COMPILE_FAILED',
|
|
97
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
let appModule;
|
|
101
|
+
try {
|
|
102
|
+
const fileUrl = pathToFileURL(outputPath).href;
|
|
103
|
+
appModule = await import(`${fileUrl}?t=${Date.now()}`);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return errored({
|
|
107
|
+
code: 'CATALOG_LOAD_FAILED',
|
|
108
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
const app = appModule.app;
|
|
112
|
+
if (!app) {
|
|
113
|
+
return complete(undefined);
|
|
114
|
+
}
|
|
115
|
+
const toolsArr = (app.tools ?? []);
|
|
116
|
+
const toolsetsArr = (app.toolsets ?? []);
|
|
117
|
+
const workflowBlocksArr = (app.workflow?.blocks ?? []);
|
|
118
|
+
const workflowTriggersArr = (app.workflow?.triggers ?? []);
|
|
119
|
+
if (!toolsArr.length &&
|
|
120
|
+
!toolsetsArr.length &&
|
|
121
|
+
!workflowBlocksArr.length &&
|
|
122
|
+
!workflowTriggersArr.length) {
|
|
123
|
+
return complete(undefined);
|
|
124
|
+
}
|
|
125
|
+
const { zodToProviderToolSchema } = await import('../build/server/zod-to-provider-tool-schema.js');
|
|
126
|
+
const slugByToolId = new Map();
|
|
127
|
+
const cataloguedToolsets = [];
|
|
128
|
+
for (const ts of toolsetsArr) {
|
|
129
|
+
if (!ts?.id) {
|
|
130
|
+
return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Toolset is missing an id' });
|
|
131
|
+
}
|
|
132
|
+
const slug = `app:${ts.id.replace('.', ':')}`;
|
|
133
|
+
cataloguedToolsets.push({
|
|
134
|
+
slug,
|
|
135
|
+
name: ts.name,
|
|
136
|
+
description: ts.description,
|
|
137
|
+
iconKey: null,
|
|
138
|
+
subGroup: ts.subGroup ?? null,
|
|
139
|
+
});
|
|
140
|
+
for (const toolId of ts.tools ?? []) {
|
|
141
|
+
slugByToolId.set(toolId, slug);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const cataloguedTools = [];
|
|
145
|
+
const cataloguedAgentTools = [];
|
|
146
|
+
const cataloguedActions = [];
|
|
147
|
+
for (const tool of toolsArr) {
|
|
148
|
+
if (!tool?.id) {
|
|
149
|
+
return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Tool is missing an id' });
|
|
150
|
+
}
|
|
151
|
+
const inputs = zodToProviderToolSchema(tool.inputs);
|
|
152
|
+
const outputs = zodToProviderToolSchema(tool.outputs);
|
|
153
|
+
const baseTool = {
|
|
154
|
+
id: tool.id,
|
|
155
|
+
name: tool.name,
|
|
156
|
+
description: tool.description,
|
|
157
|
+
inputsJsonSchema: inputs.jsonSchema,
|
|
158
|
+
outputsJsonSchema: outputs.jsonSchema,
|
|
159
|
+
requiresConnection: Boolean(tool.config?.requiresConnection),
|
|
160
|
+
timeoutMs: tool.config?.timeout ?? 15000,
|
|
161
|
+
streaming: Boolean(tool.agent?.streaming ?? tool.config?.streaming),
|
|
162
|
+
refs: outputs.refs,
|
|
163
|
+
};
|
|
164
|
+
cataloguedTools.push(baseTool);
|
|
165
|
+
if (tool.agent) {
|
|
166
|
+
const toolsetSlug = slugByToolId.get(tool.id) ?? `app:unknown:default`;
|
|
167
|
+
cataloguedAgentTools.push({
|
|
168
|
+
...baseTool,
|
|
169
|
+
agentName: tool.agent.name ?? tool.id,
|
|
170
|
+
agentDescription: tool.agent.description ?? tool.description,
|
|
171
|
+
toolsetSlug,
|
|
172
|
+
idempotent: tool.agent.idempotent ?? tool.config?.idempotent,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (tool.action) {
|
|
176
|
+
cataloguedActions.push({
|
|
177
|
+
toolId: tool.id,
|
|
178
|
+
label: tool.action.label,
|
|
179
|
+
description: tool.action.description,
|
|
180
|
+
iconKey: null,
|
|
181
|
+
color: tool.action.color,
|
|
182
|
+
surface: tool.action.surface,
|
|
183
|
+
requiresConfirmation: tool.action.requiresConfirmation,
|
|
184
|
+
confirmationMessage: tool.action.confirmationMessage,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const cataloguedTriggers = [];
|
|
189
|
+
const cataloguedWorkflowTriggers = [];
|
|
190
|
+
const cataloguedAgentTriggers = [];
|
|
191
|
+
for (const trigger of workflowTriggersArr) {
|
|
192
|
+
if (!trigger?.id) {
|
|
193
|
+
return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Trigger is missing an id' });
|
|
194
|
+
}
|
|
195
|
+
const triggerInputs = serializeWorkflowSchemaInputs(trigger.schema);
|
|
196
|
+
cataloguedTriggers.push({
|
|
197
|
+
id: trigger.id,
|
|
198
|
+
label: trigger.label,
|
|
199
|
+
description: trigger.description,
|
|
200
|
+
iconKey: null,
|
|
201
|
+
color: trigger.color,
|
|
202
|
+
inputsJsonSchema: triggerInputs,
|
|
203
|
+
refs: [],
|
|
204
|
+
});
|
|
205
|
+
if (trigger.workflow) {
|
|
206
|
+
cataloguedWorkflowTriggers.push({
|
|
207
|
+
triggerId: trigger.id,
|
|
208
|
+
label: trigger.label,
|
|
209
|
+
description: trigger.description,
|
|
210
|
+
iconKey: null,
|
|
211
|
+
color: trigger.color,
|
|
212
|
+
inputsJsonSchema: triggerInputs,
|
|
213
|
+
refs: [],
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (trigger.agent) {
|
|
217
|
+
cataloguedAgentTriggers.push({
|
|
218
|
+
triggerId: trigger.id,
|
|
219
|
+
label: trigger.agent.label ?? trigger.label,
|
|
220
|
+
description: trigger.agent.description ?? trigger.description,
|
|
221
|
+
iconKey: null,
|
|
222
|
+
color: trigger.color,
|
|
223
|
+
inputsJsonSchema: triggerInputs,
|
|
224
|
+
refs: [],
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const cataloguedBlocks = [];
|
|
229
|
+
for (const block of workflowBlocksArr) {
|
|
230
|
+
if (!block?.id) {
|
|
231
|
+
return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Block is missing an id' });
|
|
232
|
+
}
|
|
233
|
+
cataloguedBlocks.push({
|
|
234
|
+
id: block.id,
|
|
235
|
+
label: block.label,
|
|
236
|
+
description: block.description,
|
|
237
|
+
iconKey: null,
|
|
238
|
+
color: block.color,
|
|
239
|
+
inputsJsonSchema: serializeWorkflowSchemaInputs(block.schema),
|
|
240
|
+
toolMap: block.toolMap ?? {},
|
|
241
|
+
refs: [],
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
const catalog = {
|
|
245
|
+
tools: cataloguedTools,
|
|
246
|
+
triggers: cataloguedTriggers,
|
|
247
|
+
toolsets: cataloguedToolsets,
|
|
248
|
+
workflow: {
|
|
249
|
+
blocks: cataloguedBlocks,
|
|
250
|
+
triggers: cataloguedWorkflowTriggers,
|
|
251
|
+
},
|
|
252
|
+
agent: {
|
|
253
|
+
tools: cataloguedAgentTools,
|
|
254
|
+
triggers: cataloguedAgentTriggers,
|
|
255
|
+
toolsets: cataloguedToolsets,
|
|
256
|
+
},
|
|
257
|
+
actions: cataloguedActions,
|
|
258
|
+
};
|
|
259
|
+
try {
|
|
260
|
+
JSON.stringify(catalog);
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
return errored({
|
|
264
|
+
code: 'CATALOG_NOT_SERIALIZABLE',
|
|
265
|
+
message: error instanceof Error ? error.message : String(error),
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
return complete(catalog);
|
|
269
|
+
}
|
|
270
|
+
function serializeWorkflowSchemaInputs(schema) {
|
|
271
|
+
if (!schema || typeof schema !== 'object' || !schema.inputs)
|
|
272
|
+
return {};
|
|
273
|
+
const out = {};
|
|
274
|
+
for (const [key, field] of Object.entries(schema.inputs)) {
|
|
275
|
+
const fieldNode = field;
|
|
276
|
+
out[key] = typeof fieldNode?.toJSON === 'function' ? fieldNode.toJSON() : field;
|
|
277
|
+
}
|
|
278
|
+
return out;
|
|
279
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@auxx/sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"description": "CLI tool and SDK for creating Auxx apps",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -38,6 +38,10 @@
|
|
|
38
38
|
"types": "./lib/root/workflow/index.d.ts",
|
|
39
39
|
"import": "./lib/root/workflow/index.js"
|
|
40
40
|
},
|
|
41
|
+
"./tools": {
|
|
42
|
+
"types": "./lib/root/tools/index.d.ts",
|
|
43
|
+
"import": "./lib/root/tools/index.js"
|
|
44
|
+
},
|
|
41
45
|
"./shared": {
|
|
42
46
|
"types": "./lib/shared/index.d.ts",
|
|
43
47
|
"import": "./lib/shared/index.js"
|