@standardagents/builder 0.11.0-next.56def20 → 0.11.0-next.5d2e71b

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/dist/plugin.d.ts CHANGED
@@ -9,12 +9,6 @@ interface AgentPluginOptions {
9
9
  promptsDir?: string;
10
10
  agentsDir?: string;
11
11
  effectsDir?: string;
12
- /**
13
- * Additional provider packages to expose in the UI.
14
- * First-party providers (@standardagents/openai, @standardagents/openrouter) are always included.
15
- * @example ['my-custom-provider', '@company/custom-openai']
16
- */
17
- providers?: string[];
18
12
  }
19
13
  declare function agentbuilder(options?: AgentPluginOptions): Plugin;
20
14
 
package/dist/plugin.js CHANGED
@@ -397,9 +397,6 @@ declare module 'virtual:@standardagents/builder' {
397
397
  listThreads(params?: {
398
398
  agent_name?: string;
399
399
  user_id?: string;
400
- search?: string;
401
- startDate?: number;
402
- endDate?: number;
403
400
  limit?: number;
404
401
  offset?: number;
405
402
  }): Promise<{ threads: ThreadRegistryEntry[]; total: number }>;
@@ -581,91 +578,14 @@ function needsRegeneration(config) {
581
578
  return false;
582
579
  }
583
580
 
584
- // src/utils/model-parser.ts
585
- function getName(content) {
586
- return content.match(/name:\s*['"]([^'"]+)['"]/)?.[1];
587
- }
588
- function getProvider(content) {
589
- const stringMatch = content.match(/provider:\s*['"]([^'"]+)['"]/)?.[1];
590
- if (stringMatch) return stringMatch;
591
- const refMatch = content.match(/provider:\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*[,\n}]/)?.[1];
592
- return refMatch || void 0;
593
- }
594
- function getModel(content) {
595
- return content.match(/model:\s*['"]([^'"]+)['"]/)?.[1];
596
- }
597
- function getInputPrice(content) {
598
- const match = content.match(/inputPrice:\s*([\d.]+)/);
599
- return match ? parseFloat(match[1]) : void 0;
600
- }
601
- function getOutputPrice(content) {
602
- const match = content.match(/outputPrice:\s*([\d.]+)/);
603
- return match ? parseFloat(match[1]) : void 0;
604
- }
605
- function getCachedPrice(content) {
606
- const match = content.match(/cachedPrice:\s*([\d.]+)/);
607
- return match ? parseFloat(match[1]) : void 0;
608
- }
609
- function getIncludedProviders(content) {
610
- const match = content.match(/includedProviders:\s*\[([^\]]*)\]/);
611
- if (!match) return void 0;
612
- const items = match[1].match(/['"]([^'"]+)['"]/g);
613
- return items ? items.map((s) => s.replace(/['"]/g, "")) : [];
614
- }
615
- function getFallbacks(content) {
616
- const match = content.match(/fallbacks:\s*\[([^\]]*)\]/);
617
- if (!match) return [];
618
- const items = match[1].match(/['"]([^'"]+)['"]/g);
619
- return items ? items.map((s) => s.replace(/['"]/g, "")) : [];
620
- }
621
- function getProviderTools(content) {
622
- const match = content.match(/providerTools:\s*\[([^\]]*)\]/);
623
- if (!match) return [];
624
- const items = match[1].match(/['"]([^'"]+)['"]/g);
625
- return items ? items.map((s) => s.replace(/['"]/g, "")) : [];
626
- }
627
- function getCapabilities(content) {
628
- const match = content.match(/capabilities:\s*\{([^}]*)\}/s);
629
- if (!match) return void 0;
630
- const inner = match[1];
631
- const caps = {};
632
- const boolMatches = inner.matchAll(/(\w+):\s*(true|false)/g);
633
- for (const m of boolMatches) {
634
- caps[m[1]] = m[2] === "true";
635
- }
636
- const numMatches = inner.matchAll(/(\w+):\s*(\d+)/g);
637
- for (const m of numMatches) {
638
- caps[m[1]] = parseInt(m[2], 10);
639
- }
640
- return Object.keys(caps).length > 0 ? caps : void 0;
641
- }
642
- function parseModelFile(content) {
643
- const name = getName(content);
644
- if (!name) return null;
645
- return {
646
- name,
647
- provider: getProvider(content),
648
- model: getModel(content),
649
- inputPrice: getInputPrice(content),
650
- outputPrice: getOutputPrice(content),
651
- cachedPrice: getCachedPrice(content),
652
- includedProviders: getIncludedProviders(content),
653
- fallbacks: getFallbacks(content),
654
- providerTools: getProviderTools(content),
655
- capabilities: getCapabilities(content)
656
- };
657
- }
658
-
659
581
  // src/sdk/generators/generateModelFile.ts
660
- function generateModelFile(data, options) {
661
- const { providerName, providerPackage } = options;
582
+ function generateModelFile(data) {
662
583
  const lines = [
663
584
  `import { defineModel } from '@standardagents/builder';`,
664
- `import { ${providerName} } from '${providerPackage}';`,
665
585
  "",
666
586
  `export default defineModel({`,
667
587
  ` name: '${escapeString(data.name)}',`,
668
- ` provider: ${providerName},`,
588
+ ` provider: '${escapeString(data.provider)}',`,
669
589
  ` model: '${escapeString(data.model)}',`
670
590
  ];
671
591
  if (data.includedProviders && data.includedProviders.length > 0) {
@@ -674,9 +594,6 @@ function generateModelFile(data, options) {
674
594
  if (data.fallbacks && data.fallbacks.length > 0) {
675
595
  lines.push(` fallbacks: ${JSON.stringify(data.fallbacks)},`);
676
596
  }
677
- if (data.providerTools && data.providerTools.length > 0) {
678
- lines.push(` providerTools: ${JSON.stringify(data.providerTools)},`);
679
- }
680
597
  if (data.inputPrice !== void 0) {
681
598
  lines.push(` inputPrice: ${data.inputPrice},`);
682
599
  }
@@ -686,36 +603,6 @@ function generateModelFile(data, options) {
686
603
  if (data.cachedPrice !== void 0) {
687
604
  lines.push(` cachedPrice: ${data.cachedPrice},`);
688
605
  }
689
- if (data.capabilities && Object.keys(data.capabilities).length > 0) {
690
- const caps = data.capabilities;
691
- const capLines = [];
692
- if (caps.supportsImages !== void 0) {
693
- capLines.push(` supportsImages: ${caps.supportsImages},`);
694
- }
695
- if (caps.supportsToolCalls !== void 0) {
696
- capLines.push(` supportsToolCalls: ${caps.supportsToolCalls},`);
697
- }
698
- if (caps.supportsStreaming !== void 0) {
699
- capLines.push(` supportsStreaming: ${caps.supportsStreaming},`);
700
- }
701
- if (caps.supportsJsonMode !== void 0) {
702
- capLines.push(` supportsJsonMode: ${caps.supportsJsonMode},`);
703
- }
704
- if (caps.maxContextTokens !== void 0) {
705
- capLines.push(` maxContextTokens: ${caps.maxContextTokens},`);
706
- }
707
- if (caps.maxOutputTokens !== void 0) {
708
- capLines.push(` maxOutputTokens: ${caps.maxOutputTokens},`);
709
- }
710
- if (caps.reasoningLevels !== void 0) {
711
- capLines.push(` reasoningLevels: ${JSON.stringify(caps.reasoningLevels)},`);
712
- }
713
- if (capLines.length > 0) {
714
- lines.push(` capabilities: {`);
715
- lines.push(...capLines);
716
- lines.push(` },`);
717
- }
718
- }
719
606
  lines.push(`});`);
720
607
  lines.push("");
721
608
  return lines.join("\n");
@@ -970,12 +857,6 @@ function formatToolConfig(config) {
970
857
  if (config.init_user_message_property !== void 0 && config.init_user_message_property !== null) {
971
858
  parts.push(`initUserMessageProperty: '${escapeString2(config.init_user_message_property)}'`);
972
859
  }
973
- if (config.init_attachments_property !== void 0 && config.init_attachments_property !== null) {
974
- parts.push(`initAttachmentsProperty: '${escapeString2(config.init_attachments_property)}'`);
975
- }
976
- if (config.tenvs && Object.keys(config.tenvs).length > 0) {
977
- parts.push(`tenvs: ${JSON.stringify(config.tenvs)}`);
978
- }
979
860
  return `{ ${parts.join(", ")} }`;
980
861
  }
981
862
  function formatReasoningConfig(reasoning) {
@@ -1108,9 +989,6 @@ function generateAgentFile(data) {
1108
989
  if (data.toolDescription) {
1109
990
  lines.push(` toolDescription: '${escapeString3(data.toolDescription)}',`);
1110
991
  }
1111
- if (data.tenvs && Object.keys(data.tenvs).length > 0) {
1112
- lines.push(` tenvs: ${JSON.stringify(data.tenvs)},`);
1113
- }
1114
992
  lines.push(`});`);
1115
993
  lines.push("");
1116
994
  return lines.join("\n");
@@ -1147,15 +1025,8 @@ function escapeString3(str) {
1147
1025
  }
1148
1026
 
1149
1027
  // src/sdk/persistence/index.ts
1150
- var PROVIDER_PACKAGE_MAP = {
1151
- openai: { name: "openai", package: "@standardagents/openai" },
1152
- openrouter: { name: "openrouter", package: "@standardagents/openrouter" },
1153
- anthropic: { name: "anthropic", package: "@standardagents/anthropic" },
1154
- google: { name: "google", package: "@standardagents/google" },
1155
- test: { name: "test", package: "@standardagents/builder/test" }
1156
- };
1157
1028
  function nameToFilename(name) {
1158
- return name.replace(/[/\\]/g, "__").replace(/[:*?"<>|.]/g, "_").replace(/-/g, "_");
1029
+ return name.replace(/[/\\]/g, "__").replace(/[:*?"<>|]/g, "_").replace(/-/g, "_");
1159
1030
  }
1160
1031
  function getModelFilePath(modelsDir, name) {
1161
1032
  const filename = nameToFilename(name);
@@ -1177,17 +1048,7 @@ async function saveModel(modelsDir, data, overwrite = false) {
1177
1048
  error: `Model file already exists: ${filePath}. Use update to modify existing models.`
1178
1049
  };
1179
1050
  }
1180
- const providerInfo = PROVIDER_PACKAGE_MAP[data.provider];
1181
- if (!providerInfo) {
1182
- return {
1183
- success: false,
1184
- error: `Unknown provider '${data.provider}'. Must be one of: ${Object.keys(PROVIDER_PACKAGE_MAP).join(", ")}`
1185
- };
1186
- }
1187
- const content = generateModelFile(data, {
1188
- providerName: providerInfo.name,
1189
- providerPackage: providerInfo.package
1190
- });
1051
+ const content = generateModelFile(data);
1191
1052
  await fs2.promises.writeFile(filePath, content, "utf-8");
1192
1053
  return {
1193
1054
  success: true,
@@ -1251,7 +1112,7 @@ function validateModelData(data) {
1251
1112
  if (!data.provider || typeof data.provider !== "string") {
1252
1113
  return "Model provider is required and must be a string";
1253
1114
  }
1254
- const validProviders = Object.keys(PROVIDER_PACKAGE_MAP);
1115
+ const validProviders = ["openai", "openrouter", "anthropic", "google", "test"];
1255
1116
  if (!validProviders.includes(data.provider)) {
1256
1117
  return `Invalid provider '${data.provider}'. Must be one of: ${validProviders.join(", ")}`;
1257
1118
  }
@@ -1775,8 +1636,6 @@ var VIRTUAL_AGENTS_ID = "virtual:@standardagents-agents";
1775
1636
  var RESOLVED_VIRTUAL_AGENTS_ID = "\0" + VIRTUAL_AGENTS_ID;
1776
1637
  var VIRTUAL_EFFECTS_ID = "virtual:@standardagents-effects";
1777
1638
  var RESOLVED_VIRTUAL_EFFECTS_ID = "\0" + VIRTUAL_EFFECTS_ID;
1778
- var VIRTUAL_PROVIDERS_ID = "virtual:@standardagents-providers";
1779
- var RESOLVED_VIRTUAL_PROVIDERS_ID = "\0" + VIRTUAL_PROVIDERS_ID;
1780
1639
  var VIRTUAL_BUILDER_ID = "virtual:@standardagents/builder";
1781
1640
  var RESOLVED_VIRTUAL_BUILDER_ID = "\0" + VIRTUAL_BUILDER_ID;
1782
1641
  function scanApiDirectory(dir, baseRoute = "") {
@@ -2253,9 +2112,6 @@ function agentbuilder(options = {}) {
2253
2112
  ];
2254
2113
  const depsToInclude = [
2255
2114
  "zod",
2256
- "zod/v3",
2257
- "zod/v4",
2258
- "zod/v4/core",
2259
2115
  "openai"
2260
2116
  ];
2261
2117
  config.optimizeDeps = config.optimizeDeps || {};
@@ -2296,9 +2152,6 @@ function agentbuilder(options = {}) {
2296
2152
  if (id === VIRTUAL_EFFECTS_ID) {
2297
2153
  return RESOLVED_VIRTUAL_EFFECTS_ID;
2298
2154
  }
2299
- if (id === VIRTUAL_PROVIDERS_ID) {
2300
- return RESOLVED_VIRTUAL_PROVIDERS_ID;
2301
- }
2302
2155
  if (id === VIRTUAL_BUILDER_ID) {
2303
2156
  return RESOLVED_VIRTUAL_BUILDER_ID;
2304
2157
  }
@@ -2374,11 +2227,6 @@ function isPublicRoute(routePath) {
2374
2227
  return true;
2375
2228
  }
2376
2229
 
2377
- // Provider icon routes are public (used by <img src>)
2378
- if (routePath.startsWith('/api/providers/') && routePath.includes('/icon')) {
2379
- return true;
2380
- }
2381
-
2382
2230
  return false;
2383
2231
  }
2384
2232
 
@@ -2398,32 +2246,6 @@ function corsHeaders(contentType) {
2398
2246
  };
2399
2247
  }
2400
2248
 
2401
- // Helper to add CORS headers to any Response without touching the body
2402
- function addCorsHeaders(response) {
2403
- // Skip WebSocket upgrade responses - they can't be wrapped
2404
- if (response.status === 101) {
2405
- return response;
2406
- }
2407
-
2408
- // Skip if already has CORS headers
2409
- if (response.headers.has("Access-Control-Allow-Origin")) {
2410
- return response;
2411
- }
2412
-
2413
- // Create new headers with CORS added
2414
- const newHeaders = new Headers(response.headers);
2415
- for (const [key, value] of Object.entries(CORS_HEADERS)) {
2416
- newHeaders.set(key, value);
2417
- }
2418
-
2419
- // Return new Response with same body stream (not cloned, just transferred)
2420
- return new Response(response.body, {
2421
- status: response.status,
2422
- statusText: response.statusText,
2423
- headers: newHeaders,
2424
- });
2425
- }
2426
-
2427
2249
  export async function router(request, env) {
2428
2250
  const url = new URL(request.url);
2429
2251
  const pathname = url.pathname;
@@ -2475,7 +2297,7 @@ ${threadRouteCode}
2475
2297
 
2476
2298
  // If requireAuth returns a Response, it's an error (401)
2477
2299
  if (authResult instanceof Response) {
2478
- return addCorsHeaders(authResult);
2300
+ return authResult;
2479
2301
  }
2480
2302
 
2481
2303
  authContext = authResult;
@@ -2494,7 +2316,11 @@ ${threadRouteCode}
2494
2316
  const result = await controller(context);
2495
2317
 
2496
2318
  if (result instanceof Response) {
2497
- return addCorsHeaders(result);
2319
+ // Return Response objects as-is - CORS headers can't be safely added
2320
+ // to Response objects in the workerd environment without issues.
2321
+ // Controllers that return streaming/binary responses should add
2322
+ // CORS headers themselves if needed.
2323
+ return result;
2498
2324
  }
2499
2325
  if (typeof result === "string") {
2500
2326
  return new Response(result, {
@@ -2699,30 +2525,6 @@ ${effectsCode}
2699
2525
  };
2700
2526
 
2701
2527
  export const effectNames = ${JSON.stringify(effects.filter((e) => !e.error).map((e) => e.name))};
2702
- `;
2703
- }
2704
- if (id === RESOLVED_VIRTUAL_PROVIDERS_ID) {
2705
- const firstPartyProviders = [
2706
- { name: "openai", package: "@standardagents/openai", label: "OpenAI", envKey: "OPENAI_API_KEY" },
2707
- { name: "openrouter", package: "@standardagents/openrouter", label: "OpenRouter", envKey: "OPENROUTER_API_KEY" }
2708
- ];
2709
- const customProviders = (options.providers || []).map((pkg) => ({
2710
- name: pkg.split("/").pop() || pkg,
2711
- package: pkg,
2712
- label: pkg.split("/").pop() || pkg,
2713
- envKey: `${(pkg.split("/").pop() || pkg).toUpperCase().replace(/-/g, "_")}_API_KEY`,
2714
- isCustom: true
2715
- }));
2716
- const allProviders = [...firstPartyProviders, ...customProviders];
2717
- return `// Virtual providers module - lists available LLM provider packages
2718
- export const providers = ${JSON.stringify(allProviders, null, 2)};
2719
-
2720
- export const providerNames = ${JSON.stringify(allProviders.map((p) => p.name))};
2721
-
2722
- // Provider factories - dynamic imports for code splitting
2723
- export const providerFactories = {
2724
- ${allProviders.map((p) => ` "${p.name}": async () => (await import("${p.package}")).${p.name},`).join("\n")}
2725
- };
2726
2528
  `;
2727
2529
  }
2728
2530
  if (id === RESOLVED_VIRTUAL_BUILDER_ID) {
@@ -2976,26 +2778,51 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
2976
2778
  try {
2977
2779
  const filePath = path3.join(modelsDir, file);
2978
2780
  const content = fs4.readFileSync(filePath, "utf-8");
2979
- const parsed = parseModelFile(content);
2980
- if (!parsed || !parsed.name) return null;
2981
- const fallbackObjects = parsed.fallbacks.map((fallbackName, index) => ({
2781
+ const getName = (c) => c.match(/name:\s*['"]([^'"]+)['"]/)?.[1];
2782
+ const getProvider = (c) => c.match(/provider:\s*['"]([^'"]+)['"]/)?.[1];
2783
+ const getModel = (c) => c.match(/model:\s*['"]([^'"]+)['"]/)?.[1];
2784
+ const getInputPrice = (c) => {
2785
+ const match = c.match(/inputPrice:\s*([\d.]+)/);
2786
+ return match ? parseFloat(match[1]) : void 0;
2787
+ };
2788
+ const getOutputPrice = (c) => {
2789
+ const match = c.match(/outputPrice:\s*([\d.]+)/);
2790
+ return match ? parseFloat(match[1]) : void 0;
2791
+ };
2792
+ const getCachedPrice = (c) => {
2793
+ const match = c.match(/cachedPrice:\s*([\d.]+)/);
2794
+ return match ? parseFloat(match[1]) : void 0;
2795
+ };
2796
+ const getIncludedProviders = (c) => {
2797
+ const match = c.match(/includedProviders:\s*\[([^\]]*)\]/);
2798
+ if (!match) return void 0;
2799
+ const items = match[1].match(/['"]([^'"]+)['"]/g);
2800
+ return items ? items.map((s) => s.replace(/['"]/g, "")) : [];
2801
+ };
2802
+ const getFallbacks = (c) => {
2803
+ const match = c.match(/fallbacks:\s*\[([^\]]*)\]/);
2804
+ if (!match) return [];
2805
+ const items = match[1].match(/['"]([^'"]+)['"]/g);
2806
+ return items ? items.map((s) => s.replace(/['"]/g, "")) : [];
2807
+ };
2808
+ const name = getName(content);
2809
+ if (!name) return null;
2810
+ const fallbacks = getFallbacks(content);
2811
+ const fallbackObjects = fallbacks.map((fallbackName, index) => ({
2982
2812
  id: fallbackName,
2983
2813
  name: fallbackName,
2984
2814
  order: index
2985
2815
  }));
2986
2816
  return {
2987
- id: parsed.name,
2988
- name: parsed.name,
2989
- provider: parsed.provider,
2990
- provider_id: parsed.provider,
2991
- model: parsed.model,
2992
- input_price: parsed.inputPrice,
2993
- output_price: parsed.outputPrice,
2994
- cached_price: parsed.cachedPrice,
2995
- included_providers: parsed.includedProviders,
2817
+ id: name,
2818
+ name,
2819
+ provider: getProvider(content),
2820
+ model: getModel(content),
2821
+ input_price: getInputPrice(content),
2822
+ output_price: getOutputPrice(content),
2823
+ cached_price: getCachedPrice(content),
2824
+ included_providers: getIncludedProviders(content),
2996
2825
  fallbacks: fallbackObjects,
2997
- providerTools: parsed.providerTools,
2998
- capabilities: parsed.capabilities,
2999
2826
  created_at: Math.floor(Date.now() / 1e3)
3000
2827
  };
3001
2828
  } catch (error) {
@@ -3161,9 +2988,9 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
3161
2988
  try {
3162
2989
  const filePath = path3.join(promptsDir, file);
3163
2990
  const content = fs4.readFileSync(filePath, "utf-8");
3164
- const getName2 = (c) => c.match(/name:\s*['"]([^'"]+)['"]/)?.[1];
2991
+ const getName = (c) => c.match(/name:\s*['"]([^'"]+)['"]/)?.[1];
3165
2992
  const getToolDescription = (c) => c.match(/toolDescription:\s*['"]([^'"]+)['"]/)?.[1];
3166
- const getModel2 = (c) => c.match(/model:\s*['"]([^'"]+)['"]/)?.[1];
2993
+ const getModel = (c) => c.match(/model:\s*['"]([^'"]+)['"]/)?.[1];
3167
2994
  const getIncludeChat = (c) => c.match(/includeChat:\s*(true|false)/)?.[1] === "true";
3168
2995
  const getIncludePastTools = (c) => c.match(/includePastTools:\s*(true|false)/)?.[1] === "true";
3169
2996
  const getParallelToolCalls = (c) => c.match(/parallelToolCalls:\s*(true|false)/)?.[1] === "true";
@@ -3183,9 +3010,9 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
3183
3010
  if (arrayMatch) return arrayMatch[1];
3184
3011
  return "";
3185
3012
  };
3186
- const name = getName2(content);
3013
+ const name = getName(content);
3187
3014
  if (!name) return null;
3188
- const modelId = getModel2(content);
3015
+ const modelId = getModel(content);
3189
3016
  const modelDef = modelId ? modelMap[modelId] : null;
3190
3017
  return {
3191
3018
  id: name,
@@ -3356,7 +3183,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
3356
3183
  try {
3357
3184
  const filePath = path3.join(agentsDir, file);
3358
3185
  const content = fs4.readFileSync(filePath, "utf-8");
3359
- const getName2 = (c) => c.match(/name:\s*['"]([^'"]+)['"]/)?.[1];
3186
+ const getName = (c) => c.match(/name:\s*['"]([^'"]+)['"]/)?.[1];
3360
3187
  const getTitle = (c) => c.match(/title:\s*['"]([^'"]+)['"]/)?.[1];
3361
3188
  const getType = (c) => c.match(/type:\s*['"]([^'"]+)['"]/)?.[1];
3362
3189
  const getDefaultPrompt = (c) => c.match(/defaultPrompt:\s*['"]([^'"]+)['"]/)?.[1];
@@ -3374,7 +3201,7 @@ export class DurableAgentBuilder extends _BaseDurableAgentBuilder {
3374
3201
  const promptMatch = sideMatch[1].match(/prompt:\s*['"]([^'"]+)['"]/);
3375
3202
  return promptMatch ? promptMatch[1] : null;
3376
3203
  };
3377
- const name = getName2(content);
3204
+ const name = getName(content);
3378
3205
  if (!name) return null;
3379
3206
  return {
3380
3207
  id: name,