@standardagents/builder 0.13.0 → 0.13.2

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.
@@ -1,25 +1,46 @@
1
- import { sip } from '@standardagents/sip';
1
+ import { transform, collect } from '@standardagents/sip';
2
2
 
3
3
  // src/image-processing/index.ts
4
4
  var MAX_SIZE = 1.5 * 1024 * 1024;
5
5
  var MAX_DIMENSION = 4096;
6
6
  var MAX_INPUT_SIZE = 20 * 1024 * 1024;
7
+ var MIN_QUALITY = 45;
8
+ function clampQuality(quality) {
9
+ return Math.max(1, Math.min(100, Math.round(quality)));
10
+ }
11
+ async function collectTransformedImage(input, width, height, quality) {
12
+ const image = transform(input, { width, height, quality: clampQuality(quality) });
13
+ const { data, info } = await collect(image);
14
+ return {
15
+ data,
16
+ mimeType: "image/jpeg",
17
+ width: info.width,
18
+ height: info.height
19
+ };
20
+ }
21
+ async function transformToTargetSize(input, maxWidth, maxHeight, maxBytes, quality) {
22
+ let currentQuality = clampQuality(quality);
23
+ let result = await collectTransformedImage(input, maxWidth, maxHeight, currentQuality);
24
+ while (result.data.byteLength > maxBytes && currentQuality > MIN_QUALITY) {
25
+ currentQuality -= 10;
26
+ result = await collectTransformedImage(input, maxWidth, maxHeight, currentQuality);
27
+ }
28
+ while (result.data.byteLength > maxBytes) {
29
+ const scaleFactor = Math.sqrt(maxBytes / result.data.byteLength) * 0.9;
30
+ const nextWidth = Math.max(1, Math.min(result.width - 1, Math.round(result.width * scaleFactor)));
31
+ const nextHeight = Math.max(1, Math.min(result.height - 1, Math.round(result.height * scaleFactor)));
32
+ if (nextWidth >= result.width && nextHeight >= result.height) {
33
+ break;
34
+ }
35
+ result = await collectTransformedImage(input, nextWidth, nextHeight, currentQuality);
36
+ }
37
+ return result;
38
+ }
7
39
  async function processImage(input, inputMimeType) {
8
40
  if (input.byteLength > MAX_INPUT_SIZE) {
9
41
  throw new Error(`Image too large: ${input.byteLength} bytes exceeds ${MAX_INPUT_SIZE} byte limit`);
10
42
  }
11
- const result = await sip.process(input, {
12
- maxWidth: MAX_DIMENSION,
13
- maxHeight: MAX_DIMENSION,
14
- maxBytes: MAX_SIZE,
15
- quality: 85
16
- });
17
- return {
18
- data: result.data,
19
- mimeType: "image/jpeg",
20
- width: result.width,
21
- height: result.height
22
- };
43
+ return await transformToTargetSize(input, MAX_DIMENSION, MAX_DIMENSION, MAX_SIZE, 85);
23
44
  }
24
45
  function needsProcessing(data, mimeType) {
25
46
  const binaryLength = Math.ceil(data.length * 3 / 4);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/image-processing/index.ts"],"names":[],"mappings":";;;AAiBA,IAAM,QAAA,GAAW,MAAM,IAAA,GAAO,IAAA;AAG9B,IAAM,aAAA,GAAgB,IAAA;AAGtB,IAAM,cAAA,GAAiB,KAAK,IAAA,GAAO,IAAA;AAoBnC,eAAsB,YAAA,CACpB,OACA,aAAA,EACyB;AAEzB,EAAA,IAAI,KAAA,CAAM,aAAa,cAAA,EAAgB;AACrC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAM,UAAU,CAAA,eAAA,EAAkB,cAAc,CAAA,WAAA,CAAa,CAAA;AAAA,EACnG;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO;AAAA,IACtC,QAAA,EAAU,aAAA;AAAA,IACV,SAAA,EAAW,aAAA;AAAA,IACX,QAAA,EAAU,QAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,QAAA,EAAU,YAAA;AAAA,IACV,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO;AAAA,GACjB;AACF;AAuCO,SAAS,eAAA,CAAgB,MAAc,QAAA,EAA2B;AAEvE,EAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,IAAI,CAAC,CAAA;AAGlD,EAAA,OACE,YAAA,GAAe,YACf,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,IACxB,QAAA,CAAS,SAAS,MAAM,CAAA;AAE5B;AAKO,SAAS,oBAAoB,MAAA,EAA6B;AAC/D,EAAA,MAAM,YAAA,GAAe,KAAK,MAAM,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AAChD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAKO,SAAS,oBAAoB,MAAA,EAA6B;AAC/D,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB","file":"image-processing.js","sourcesContent":["/**\n * Server-side image processing for Cloudflare Workers\n *\n * Uses @standardagents/sip for memory-efficient processing with scanline-based\n * resize and streaming output. All images are converted to JPEG.\n *\n * Features:\n * - Compress/resize images to fit under 1.5MB target\n * - Convert AVIF/WebP/PNG/JPEG to JPEG\n * - Memory-efficient scanline processing\n * - Smart quality optimization: quality first, dimensions last\n */\n\nimport { sip } from \"@standardagents/sip\";\n\n// Target 1.5MB binary → ~2MB base64 for RPC transfer\n// SQLite limit is 2MB per row, but base64 overhead means we need headroom\nconst MAX_SIZE = 1.5 * 1024 * 1024;\n\n// Memory safety limit\nconst MAX_DIMENSION = 4096;\n\n// Reject images that would consume too much memory before decoding\nconst MAX_INPUT_SIZE = 20 * 1024 * 1024; // 20MB\n\nexport interface ProcessedImage {\n data: ArrayBuffer;\n mimeType: \"image/jpeg\";\n width: number;\n height: number;\n}\n\n/**\n * Process an image to ensure it's under 1.5MB and in JPEG format.\n *\n * All images (including transparent PNGs) are converted to JPEG.\n * This trades transparency for reliability - SIP's WASM works correctly\n * in Cloudflare Workers while @jsquash's WASM loading fails.\n *\n * @param input - Raw image data as ArrayBuffer\n * @param inputMimeType - MIME type hint (unused, kept for API compatibility)\n * @returns Processed image data as JPEG with dimensions\n */\nexport async function processImage(\n input: ArrayBuffer,\n inputMimeType: string\n): Promise<ProcessedImage> {\n // Memory safety: reject very large images\n if (input.byteLength > MAX_INPUT_SIZE) {\n throw new Error(`Image too large: ${input.byteLength} bytes exceeds ${MAX_INPUT_SIZE} byte limit`);\n }\n\n // Use sip for ALL images - outputs JPEG\n const result = await sip.process(input, {\n maxWidth: MAX_DIMENSION,\n maxHeight: MAX_DIMENSION,\n maxBytes: MAX_SIZE,\n quality: 85,\n });\n\n return {\n data: result.data,\n mimeType: \"image/jpeg\",\n width: result.width,\n height: result.height,\n };\n}\n\n/**\n * Detect image format from magic bytes (fallback)\n */\nfunction detectFormat(data: ArrayBuffer, mimeType: string): string {\n const bytes = new Uint8Array(data.slice(0, 12));\n\n if (bytes[4] === 0x66 && bytes[5] === 0x74 && bytes[6] === 0x79 && bytes[7] === 0x70) {\n const brand = String.fromCharCode(...bytes.slice(8, 12));\n if (brand === \"avif\" || brand === \"avis\") return \"avif\";\n }\n\n if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4E && bytes[3] === 0x47) {\n return \"png\";\n }\n\n if (bytes[0] === 0xFF && bytes[1] === 0xD8 && bytes[2] === 0xFF) {\n return \"jpeg\";\n }\n\n if (bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46 &&\n bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50) {\n return \"webp\";\n }\n\n if (mimeType.includes(\"png\")) return \"png\";\n if (mimeType.includes(\"webp\")) return \"webp\";\n if (mimeType.includes(\"avif\")) return \"avif\";\n return \"jpeg\";\n}\n\n/**\n * Check if an image needs processing based on size and format.\n *\n * @param data - Base64-encoded image data\n * @param mimeType - MIME type of the image\n * @returns true if processing is needed\n */\nexport function needsProcessing(data: string, mimeType: string): boolean {\n // Decode base64 to get actual size\n const binaryLength = Math.ceil(data.length * 3 / 4);\n\n // Process if >2MB or unsupported format\n return (\n binaryLength > MAX_SIZE ||\n mimeType.includes(\"avif\") ||\n mimeType.includes(\"webp\")\n );\n}\n\n/**\n * Convert base64 string to ArrayBuffer\n */\nexport function base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * Convert ArrayBuffer to base64 string\n */\nexport function arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n"]}
1
+ {"version":3,"sources":["../src/image-processing/index.ts"],"names":[],"mappings":"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","file":"image-processing.js","sourcesContent":["/**\n * Server-side image processing for Cloudflare Workers\n *\n * Uses @standardagents/sip for memory-efficient processing with scanline-based\n * resize and streaming output. All images are converted to JPEG.\n *\n * Features:\n * - Compress/resize images to fit under 1.5MB target\n * - Convert AVIF/WebP/PNG/JPEG to JPEG\n * - Memory-efficient scanline processing\n * - Smart quality optimization: quality first, dimensions last\n */\n\nimport { collect, transform } from \"@standardagents/sip\";\n\n// Target 1.5MB binary → ~2MB base64 for RPC transfer\n// SQLite limit is 2MB per row, but base64 overhead means we need headroom\nconst MAX_SIZE = 1.5 * 1024 * 1024;\n\n// Memory safety limit\nconst MAX_DIMENSION = 4096;\n\n// Reject images that would consume too much memory before decoding\nconst MAX_INPUT_SIZE = 20 * 1024 * 1024; // 20MB\nconst MIN_QUALITY = 45;\n\nexport interface ProcessedImage {\n data: ArrayBuffer;\n mimeType: \"image/jpeg\";\n width: number;\n height: number;\n}\n\nfunction clampQuality(quality: number): number {\n return Math.max(1, Math.min(100, Math.round(quality)));\n}\n\nasync function collectTransformedImage(\n input: ArrayBuffer,\n width: number,\n height: number,\n quality: number\n): Promise<ProcessedImage> {\n const image = transform(input, { width, height, quality: clampQuality(quality) });\n const { data, info } = await collect(image);\n\n return {\n data,\n mimeType: \"image/jpeg\",\n width: info.width,\n height: info.height,\n };\n}\n\nasync function transformToTargetSize(\n input: ArrayBuffer,\n maxWidth: number,\n maxHeight: number,\n maxBytes: number,\n quality: number\n): Promise<ProcessedImage> {\n let currentQuality = clampQuality(quality);\n let result = await collectTransformedImage(input, maxWidth, maxHeight, currentQuality);\n\n while (result.data.byteLength > maxBytes && currentQuality > MIN_QUALITY) {\n currentQuality -= 10;\n result = await collectTransformedImage(input, maxWidth, maxHeight, currentQuality);\n }\n\n while (result.data.byteLength > maxBytes) {\n const scaleFactor = Math.sqrt(maxBytes / result.data.byteLength) * 0.9;\n const nextWidth = Math.max(1, Math.min(result.width - 1, Math.round(result.width * scaleFactor)));\n const nextHeight = Math.max(1, Math.min(result.height - 1, Math.round(result.height * scaleFactor)));\n\n if (nextWidth >= result.width && nextHeight >= result.height) {\n break;\n }\n\n result = await collectTransformedImage(input, nextWidth, nextHeight, currentQuality);\n }\n\n return result;\n}\n\n/**\n * Process an image to ensure it's under 1.5MB and in JPEG format.\n *\n * All images (including transparent PNGs) are converted to JPEG.\n * This trades transparency for reliability - SIP's WASM works correctly\n * in Cloudflare Workers while @jsquash's WASM loading fails.\n *\n * @param input - Raw image data as ArrayBuffer\n * @param inputMimeType - MIME type hint (unused, kept for API compatibility)\n * @returns Processed image data as JPEG with dimensions\n */\nexport async function processImage(\n input: ArrayBuffer,\n inputMimeType: string\n): Promise<ProcessedImage> {\n // Memory safety: reject very large images\n if (input.byteLength > MAX_INPUT_SIZE) {\n throw new Error(`Image too large: ${input.byteLength} bytes exceeds ${MAX_INPUT_SIZE} byte limit`);\n }\n\n return await transformToTargetSize(input, MAX_DIMENSION, MAX_DIMENSION, MAX_SIZE, 85);\n}\n\n/**\n * Detect image format from magic bytes (fallback)\n */\nfunction detectFormat(data: ArrayBuffer, mimeType: string): string {\n const bytes = new Uint8Array(data.slice(0, 12));\n\n if (bytes[4] === 0x66 && bytes[5] === 0x74 && bytes[6] === 0x79 && bytes[7] === 0x70) {\n const brand = String.fromCharCode(...bytes.slice(8, 12));\n if (brand === \"avif\" || brand === \"avis\") return \"avif\";\n }\n\n if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4E && bytes[3] === 0x47) {\n return \"png\";\n }\n\n if (bytes[0] === 0xFF && bytes[1] === 0xD8 && bytes[2] === 0xFF) {\n return \"jpeg\";\n }\n\n if (bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46 &&\n bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50) {\n return \"webp\";\n }\n\n if (mimeType.includes(\"png\")) return \"png\";\n if (mimeType.includes(\"webp\")) return \"webp\";\n if (mimeType.includes(\"avif\")) return \"avif\";\n return \"jpeg\";\n}\n\n/**\n * Check if an image needs processing based on size and format.\n *\n * @param data - Base64-encoded image data\n * @param mimeType - MIME type of the image\n * @returns true if processing is needed\n */\nexport function needsProcessing(data: string, mimeType: string): boolean {\n // Decode base64 to get actual size\n const binaryLength = Math.ceil(data.length * 3 / 4);\n\n // Process if >2MB or unsupported format\n return (\n binaryLength > MAX_SIZE ||\n mimeType.includes(\"avif\") ||\n mimeType.includes(\"webp\")\n );\n}\n\n/**\n * Convert base64 string to ArrayBuffer\n */\nexport function base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * Convert ArrayBuffer to base64 string\n */\nexport function arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n"]}
@@ -793,6 +793,9 @@ interface LogData {
793
793
  * User's Env interface should extend this or include these bindings.
794
794
  */
795
795
  interface Env extends ThreadEnv {
796
+ CLOUDFLARE_API_TOKEN?: string;
797
+ CLOUDFLARE_ACCOUNT_ID?: string;
798
+ CEREBRAS_API_KEY?: string;
796
799
  OPENAI_API_KEY?: string;
797
800
  ANTHROPIC_API_KEY?: string;
798
801
  OPENROUTER_API_KEY?: string;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { AgentPluginOptions, agentbuilder } from './plugin.js';
2
- import { T as ThreadEnv, a as ThreadMetadata, F as FileRecord, b as FlowState, M as Message, c as FileStats, G as GrepResult, A as AttachmentRef, d as MessageContent, E as Env, e as ThreadInstance } from './index-T0gR5l-G.js';
3
- export { k as Agent, j as BuilderThreadEndpointHandler, B as Controller, h as ControllerContext, n as FlowResult, q as ImageContentPart, I as ImageMetadata, L as LLMResponse, r as MultimodalContent, R as RequestContext, S as StorageBackend, o as TelemetryEvent, p as TextContentPart, i as ThreadEndpointContext, l as ToolCall, m as ToolResult, g as createThreadEndpointHandler, f as defineController } from './index-T0gR5l-G.js';
2
+ import { T as ThreadEnv, a as ThreadMetadata, F as FileRecord, b as FlowState, M as Message, c as FileStats, G as GrepResult, A as AttachmentRef, d as MessageContent, E as Env, e as ThreadInstance } from './index-8zDQpR2z.js';
3
+ export { k as Agent, j as BuilderThreadEndpointHandler, B as Controller, h as ControllerContext, n as FlowResult, q as ImageContentPart, I as ImageMetadata, L as LLMResponse, r as MultimodalContent, R as RequestContext, S as StorageBackend, o as TelemetryEvent, p as TextContentPart, i as ThreadEndpointContext, l as ToolCall, m as ToolResult, g as createThreadEndpointHandler, f as defineController } from './index-8zDQpR2z.js';
4
4
  import { SubagentRegistryEntry, QueueMessageInput, ModelDefinition as ModelDefinition$1, ToolArgs, PromptTextPart, PromptEnvPart, VariableDefinition, SubpromptConfig as SubpromptConfig$1, PromptToolConfig as PromptToolConfig$1, SubagentToolConfig as SubagentToolConfig$1, ReasoningConfig, SideConfig as SideConfig$1, LLMProviderInterface, ContentPart, TextPart, ImagePart, FilePart, NamespaceContext, DefinitionLoader } from '@standardagents/spec';
5
5
  export { AgentType, DefinitionLoader, GlobalNamespaceContext, HookSignatures, ImageContent, ModelCapabilities, ModelProvider, NamespaceContext, PackageSignature, PackedExports, PackedMeta, PackedMetadata, PackedNamespaceContext, PromptInput, PromptTextPart, ProviderAssistantMessage, ProviderError, ProviderErrorCode, ProviderFactory, ProviderFactoryConfig, ProviderFinishReason, ProviderGeneratedImage, ProviderMessage, ProviderMessageContent, ModelCapabilities as ProviderModelCapabilities, ProviderReasoningDetail, ProviderRequest, ProviderResponse, ProviderStreamChunk, ProviderSystemMessage, ProviderTool, ProviderToolCallPart, ProviderToolMessage, ProviderToolResultContent, ProviderUsage, ProviderUserMessage, ReasoningConfig, StructuredPrompt, TextContent, Tool, ToolArgs, ToolArgsNode, ToolArgsRawShape, ToolContent, belongsToPackage, defineAgent, defineHook, defineModel, definePrompt, defineTool, isPacked, isVisibleInNamespace, mapReasoningLevel } from '@standardagents/spec';
6
6
  import { DurableObject } from 'cloudflare:workers';