tjs-lang 0.7.5 → 0.7.6
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/demo/docs.json +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/tjs-eval.js +1 -1
- package/dist/tjs-eval.js.map +2 -2
- package/dist/tjs-lang.js +1 -1
- package/dist/tjs-lang.js.map +2 -2
- package/dist/tjs-vm.js +1 -1
- package/dist/tjs-vm.js.map +2 -2
- package/package.json +1 -1
- package/src/lang/parser-transforms.ts +3 -1
package/dist/tjs-eval.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/vm/runtime.ts", "../src/builder.ts", "../src/vm/vm.ts", "../src/lang/parser.ts", "../src/lang/types.ts", "../src/lang/parser-params.ts", "../src/lang/parser-transforms.ts", "../src/lang/inference.ts", "../src/lang/emitters/ast.ts", "../src/lang/core.ts", "../src/lang/eval.ts"],
|
|
4
|
-
"sourcesContent": ["import { s, validate, filter as schemaFilter } from 'tosijs-schema'\n\n/** Well-known symbol for custom equality (matches src/lang/runtime.ts) */\nconst tjsEquals = Symbol.for('tjs.equals')\n\n/**\n * Structural equality for AJS expressions.\n * Mirrors the TJS Is() function: symbol \u2192 .Equals \u2192 structural.\n */\nfunction isStructurallyEqual(a: unknown, b: unknown): boolean {\n // Symbol protocol\n if (\n a !== null &&\n typeof a === 'object' &&\n typeof (a as any)[tjsEquals] === 'function'\n ) {\n return (a as any)[tjsEquals](b)\n }\n if (\n b !== null &&\n typeof b === 'object' &&\n typeof (b as any)[tjsEquals] === 'function'\n ) {\n return (b as any)[tjsEquals](a)\n }\n\n // .Equals method\n if (\n a !== null &&\n typeof a === 'object' &&\n typeof (a as any).Equals === 'function'\n ) {\n return (a as any).Equals(b)\n }\n if (\n b !== null &&\n typeof b === 'object' &&\n typeof (b as any).Equals === 'function'\n ) {\n return (b as any).Equals(a)\n }\n\n if (a === b) return true\n\n // Nullish equality (null == undefined)\n if ((a === null || a === undefined) && (b === null || b === undefined))\n return true\n\n if (a === null || a === undefined || b === null || b === undefined)\n return false\n\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return false\n\n // Arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => isStructurallyEqual(v, b[i]))\n }\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\n // Objects\n const keysA = Object.keys(a as object)\n const keysB = Object.keys(b as object)\n if (keysA.length !== keysB.length) return false\n return keysA.every((k) => isStructurallyEqual((a as any)[k], (b as any)[k]))\n}\n\n// --- Monadic Error Type ---\n\n/**\n * AgentError wraps errors as values for monadic error flow.\n * When an atom fails, it stores an AgentError instead of throwing.\n * Subsequent atoms check for errors and pass them through without executing.\n */\nexport class AgentError {\n readonly $error = true as const\n readonly message: string\n readonly op: string\n readonly cause?: Error\n\n constructor(message: string, op: string, cause?: Error) {\n this.message = message\n this.op = op\n this.cause = cause\n }\n\n toString(): string {\n return `AgentError[${this.op}]: ${this.message}`\n }\n\n toJSON(): { $error: true; message: string; op: string } {\n return { $error: true, message: this.message, op: this.op }\n }\n}\n\n/**\n * Check if a value is an AgentError\n */\nexport function isAgentError(value: any): value is AgentError {\n return value instanceof AgentError || (value && value.$error === true)\n}\n\n// --- Types ---\n\nexport type OpCode = string\n\nexport interface Capabilities {\n fetch?: (url: string, init?: any) => Promise<any>\n store?: {\n get: (key: string) => Promise<any>\n set: (key: string, value: any) => Promise<void>\n query?: (query: any) => Promise<any[]>\n vectorSearch?: (\n collection: string,\n vector: number[],\n k?: number,\n filter?: any\n ) => Promise<any[]>\n }\n llm?: {\n predict: (prompt: string, options?: any) => Promise<string>\n embed?: (text: string) => Promise<number[]>\n }\n agent?: {\n run: (agentId: string, input: any) => Promise<any>\n }\n xml?: {\n parse: (xml: string) => Promise<any>\n }\n code?: {\n /** Transpile AsyncJS source to AST */\n transpile: (source: string) => { op: string; steps: any[] }\n }\n [key: string]: any\n}\n\nexport interface TraceEvent {\n op: string\n input: any\n stateDiff: Record<string, any>\n result?: any\n error?: string\n fuelBefore: number\n fuelAfter: number\n timestamp: string\n}\n\n/** Cost override: static number or dynamic function */\nexport type CostOverride =\n | number\n | ((input: any, ctx: RuntimeContext) => number)\n\nexport interface RuntimeContext {\n fuel: { current: number }\n args: Record<string, any>\n state: Record<string, any> // Current scope state\n consts: Set<string> // Variables declared with const (immutable)\n capabilities: Capabilities\n resolver: (op: string) => Atom<any, any> | undefined\n output?: any\n error?: AgentError // Monadic error - when set, subsequent atoms are skipped\n memo?: Map<string, any>\n trace?: TraceEvent[]\n warnings?: string[] // Non-fatal warnings (e.g., console.warn)\n signal?: AbortSignal // External abort signal for timeout enforcement\n costOverrides?: Record<string, CostOverride> // Per-atom cost overrides\n context?: Record<string, any> // Immutable request-scoped metadata (auth, permissions, etc.)\n runCodeDepth?: number // Track nested runCode calls to prevent infinite recursion\n}\n\nexport type AtomExec = (step: any, ctx: RuntimeContext) => Promise<void>\n\nexport interface AtomDef {\n op: OpCode\n inputSchema: any\n outputSchema?: any\n exec: AtomExec\n docs?: string\n timeoutMs?: number\n cost?: number | ((input: any, ctx: RuntimeContext) => number)\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Atom<I, O> extends AtomDef {\n create(input: I): I & { op: string }\n}\n\nexport interface AtomOptions {\n docs?: string\n timeoutMs?: number\n cost?: number | ((input: any, ctx: RuntimeContext) => number)\n}\n\nexport interface RunResult {\n result: any\n error?: AgentError\n fuelUsed: number\n trace?: TraceEvent[]\n warnings?: string[] // Non-fatal warnings emitted during execution\n}\n\n// --- Procedure Store ---\n\n/**\n * Stored procedure entry with AST and expiry metadata\n */\nexport interface StoredProcedure {\n ast: any\n createdAt: number\n expiresAt: number\n}\n\n/**\n * Module-level procedure store. In production, replace with a proper cache.\n * Default TTL: 1 hour. Max AST size: 100KB.\n */\nexport const procedureStore = new Map<string, StoredProcedure>()\n\n/** Default TTL for stored procedures: 1 hour */\nexport const DEFAULT_PROCEDURE_TTL = 60 * 60 * 1000\n\n/** Default max AST size: 100KB */\nexport const DEFAULT_MAX_AST_SIZE = 100 * 1024\n\n/** Token prefix for identifying procedure tokens */\nexport const PROCEDURE_TOKEN_PREFIX = 'proc_'\n\n/**\n * Check if a string is a procedure token\n */\nexport function isProcedureToken(value: any): value is string {\n return typeof value === 'string' && value.startsWith(PROCEDURE_TOKEN_PREFIX)\n}\n\n/**\n * Resolve a procedure token to its AST.\n * Returns the AST or throws an error if expired/not found.\n */\nexport function resolveProcedureToken(token: string): any {\n const entry = procedureStore.get(token)\n if (!entry) {\n throw new Error(`Procedure not found: ${token}`)\n }\n if (Date.now() > entry.expiresAt) {\n procedureStore.delete(token) // Clean up expired entry\n throw new Error(`Procedure expired: ${token}`)\n }\n return entry.ast\n}\n\n/**\n * Generate a unique procedure token\n */\nfunction generateProcedureToken(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return PROCEDURE_TOKEN_PREFIX + crypto.randomUUID()\n }\n // Fallback\n return (\n PROCEDURE_TOKEN_PREFIX +\n Math.random().toString(36).slice(2) +\n Date.now().toString(36)\n )\n}\n\n// --- Security ---\n\n/**\n * Properties that are forbidden to access for security reasons.\n * Accessing these could allow prototype pollution or sandbox escape.\n */\nconst FORBIDDEN_PROPERTIES = new Set(['__proto__', 'constructor', 'prototype'])\n\n/**\n * Throws if the property name is forbidden for security reasons.\n */\nfunction assertSafeProperty(prop: string): void {\n if (FORBIDDEN_PROPERTIES.has(prop)) {\n throw new Error(`Security Error: Access to '${prop}' is forbidden`)\n }\n}\n\n/**\n * SSRF Protection: Block requests to private/internal addresses.\n * Only applies to default fetch; custom capabilities handle their own validation.\n */\nconst BLOCKED_HOSTS = new Set([\n 'localhost',\n '127.0.0.1',\n '0.0.0.0',\n '[::1]',\n 'metadata.google.internal',\n])\n\nfunction isBlockedUrl(urlString: string): boolean {\n try {\n const url = new URL(urlString)\n\n // Block non-http(s) protocols\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return true\n }\n\n const host = url.hostname.toLowerCase()\n\n // Block known dangerous hosts\n if (BLOCKED_HOSTS.has(host)) return true\n\n // Block internal suffixes\n if (host.endsWith('.internal') || host.endsWith('.local')) return true\n\n // Block AWS/cloud metadata IP\n if (host === '169.254.169.254') return true\n\n // Block private IP ranges\n if (\n /^10\\./.test(host) ||\n /^192\\.168\\./.test(host) ||\n /^172\\.(1[6-9]|2\\d|3[01])\\./.test(host)\n ) {\n return true\n }\n\n return false\n } catch {\n return true // Invalid URL = blocked\n }\n}\n\n/**\n * ReDoS Protection: Detect regex patterns likely to cause catastrophic backtracking.\n * Patterns with nested quantifiers on overlapping character classes are dangerous.\n */\nfunction isSuspiciousRegex(pattern: string): boolean {\n // Nested quantifiers: (a+)+ or (a*)* or (a+)*\n if (/\\([^)]*[+*][^)]*\\)[+*]/.test(pattern)) return true\n\n // Overlapping alternation with quantifiers: (a|a)+\n if (/\\(([^|)]+)\\|\\1\\)[+*]/.test(pattern)) return true\n\n // Common ReDoS patterns\n if (/\\(\\.\\*\\)\\+/.test(pattern)) return true // (.*)+\n if (/\\(\\.\\+\\)\\+/.test(pattern)) return true // (.+)+\n if (/\\(\\[.*\\]\\+\\)\\+/.test(pattern)) return true // ([...]+)+\n\n return false\n}\n\n// --- Helpers ---\n\n/**\n * Creates a child scope for the context.\n * Uses prototype inheritance so reads fall through to parent, but writes stay local.\n */\nexport function createChildScope(ctx: RuntimeContext): RuntimeContext {\n return {\n ...ctx,\n state: Object.create(ctx.state),\n }\n}\n\n/**\n * Computes a shallow diff between two objects, returning the changes.\n */\nfunction diffObjects(\n before: Record<string, any>,\n after: Record<string, any>\n): Record<string, any> {\n const diff: Record<string, any> = {}\n const allKeys = new Set([...Object.keys(before), ...Object.keys(after)])\n\n for (const key of allKeys) {\n const beforeVal = before[key]\n const afterVal = after[key]\n\n if (afterVal !== beforeVal) {\n // For simplicity in tracing, we'll just show the new value.\n // A more complex diff could show { before: ..., after: ... }.\n diff[key] = afterVal\n }\n }\n return diff\n}\n\nexport function resolveValue(val: any, ctx: RuntimeContext): any {\n if (val && typeof val === 'object' && val.$kind === 'arg') {\n return ctx.args[val.path]\n }\n // Expression nodes - evaluate directly\n if (val && typeof val === 'object' && val.$expr) {\n return evaluateExpr(val, ctx)\n }\n if (typeof val === 'string') {\n // Special case: args.foo looks up ctx.args['foo'] directly\n // BUT only if 'args' is not a state variable (which takes precedence)\n if (val.startsWith('args.') && !('args' in ctx.state)) {\n return ctx.args[val.replace('args.', '')]\n }\n // Dot notation support\n if (val.includes('.')) {\n const parts = val.split('.')\n // Security: check each property name for forbidden access\n for (const part of parts) {\n if (FORBIDDEN_PROPERTIES.has(part)) {\n throw new Error(`Security Error: Access to '${part}' is forbidden`)\n }\n }\n let current = ctx.state[parts[0]]\n // If root variable exists, try to traverse\n if (current !== undefined) {\n for (let i = 1; i < parts.length; i++) {\n current = current?.[parts[i]]\n }\n return current\n }\n }\n // Simple state lookup (not an expression, just key)\n // Check if the key exists in state (even if value is undefined)\n if (val in ctx.state) {\n return ctx.state[val]\n }\n // Key doesn't exist in state - return the literal string\n return val\n }\n // Recursively resolve plain object values (but not arrays or special objects)\n if (\n val &&\n typeof val === 'object' &&\n !Array.isArray(val) &&\n val.constructor === Object\n ) {\n const result: Record<string, any> = {}\n for (const key of Object.keys(val)) {\n result[key] = resolveValue(val[key], ctx)\n }\n return result\n }\n // Recursively resolve array elements\n if (Array.isArray(val)) {\n return val.map((item) => resolveValue(item, ctx))\n }\n return val\n}\n\n// --- Expression Node Types ---\n\nexport type ExprNode =\n | { $expr: 'literal'; value: any }\n | { $expr: 'ident'; name: string }\n | {\n $expr: 'member'\n object: ExprNode\n property: string\n computed?: boolean\n optional?: boolean\n }\n | { $expr: 'binary'; op: string; left: ExprNode; right: ExprNode }\n | { $expr: 'unary'; op: string; argument: ExprNode }\n | {\n $expr: 'logical'\n op: '&&' | '||' | '??'\n left: ExprNode\n right: ExprNode\n }\n | {\n $expr: 'conditional'\n test: ExprNode\n consequent: ExprNode\n alternate: ExprNode\n }\n | { $expr: 'array'; elements: ExprNode[] }\n | { $expr: 'object'; properties: { key: string; value: ExprNode }[] }\n | { $expr: 'call'; callee: string; arguments: ExprNode[] }\n | {\n $expr: 'methodCall'\n object: ExprNode\n method: string\n arguments: ExprNode[]\n optional?: boolean\n }\n\n// --- Built-in Objects (Proxy-based) ---\n\n/**\n * Create a proxy that provides helpful error messages for unsupported methods\n */\nfunction createBuiltinProxy(\n name: string,\n supported: Record<string, any>,\n alternatives?: Record<string, string>\n): any {\n return new Proxy(supported, {\n get(target, prop: string) {\n if (prop in target) {\n return target[prop]\n }\n const alt = alternatives?.[prop]\n if (alt) {\n throw new Error(`${name}.${prop} is not available. ${alt}`)\n }\n throw new Error(\n `${name}.${prop} is not supported in AsyncJS. Check docs for available ${name} methods.`\n )\n },\n })\n}\n\n/**\n * Convert an example-value schema (AsyncJS style) to JSON Schema.\n * Examples:\n * 'string' or 'hello' -> { type: 'string' }\n * 0 or 42 -> { type: 'number' }\n * true/false -> { type: 'boolean' }\n * ['string'] -> { type: 'array', items: { type: 'string' } }\n * { name: 'string', age: 0 } -> { type: 'object', properties: {...}, required: [...] }\n */\nfunction convertExampleToSchema(example: any): any {\n if (example === null) {\n return { type: 'null' }\n }\n\n if (example === undefined) {\n return {}\n }\n\n // Already a JSON Schema object (has 'type' property)\n if (\n typeof example === 'object' &&\n example !== null &&\n 'type' in example &&\n typeof example.type === 'string'\n ) {\n return example\n }\n\n // tosijs-schema builder object (has 'schema' property)\n if (\n typeof example === 'object' &&\n example !== null &&\n 'schema' in example &&\n typeof example.schema === 'object'\n ) {\n return example.schema\n }\n\n const type = typeof example\n\n if (type === 'string') {\n return { type: 'string' }\n }\n\n if (type === 'number') {\n return Number.isInteger(example) ? { type: 'integer' } : { type: 'number' }\n }\n\n if (type === 'boolean') {\n return { type: 'boolean' }\n }\n\n if (Array.isArray(example)) {\n if (example.length === 0) {\n return { type: 'array' }\n }\n // Use first element as item schema\n return {\n type: 'array',\n items: convertExampleToSchema(example[0]),\n }\n }\n\n if (type === 'object') {\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [key, value] of Object.entries(example)) {\n properties[key] = convertExampleToSchema(value)\n required.push(key)\n }\n\n return {\n type: 'object',\n properties,\n required,\n }\n }\n\n // Fallback - accept anything\n return {}\n}\n\n/**\n * Built-in objects available in expressions.\n * These are Proxy objects that provide JS-like APIs mapped to safe implementations.\n */\nexport const builtins: Record<string, any> = {\n // Math - most methods are safe pure functions\n Math: createBuiltinProxy('Math', {\n // Constants\n PI: Math.PI,\n E: Math.E,\n LN2: Math.LN2,\n LN10: Math.LN10,\n LOG2E: Math.LOG2E,\n LOG10E: Math.LOG10E,\n SQRT2: Math.SQRT2,\n SQRT1_2: Math.SQRT1_2,\n\n // Safe pure functions\n abs: Math.abs,\n ceil: Math.ceil,\n floor: Math.floor,\n round: Math.round,\n trunc: Math.trunc,\n sign: Math.sign,\n sqrt: Math.sqrt,\n cbrt: Math.cbrt,\n pow: Math.pow,\n exp: Math.exp,\n expm1: Math.expm1,\n log: Math.log,\n log2: Math.log2,\n log10: Math.log10,\n log1p: Math.log1p,\n sin: Math.sin,\n cos: Math.cos,\n tan: Math.tan,\n asin: Math.asin,\n acos: Math.acos,\n atan: Math.atan,\n atan2: Math.atan2,\n sinh: Math.sinh,\n cosh: Math.cosh,\n tanh: Math.tanh,\n asinh: Math.asinh,\n acosh: Math.acosh,\n atanh: Math.atanh,\n hypot: Math.hypot,\n min: Math.min,\n max: Math.max,\n clz32: Math.clz32,\n imul: Math.imul,\n fround: Math.fround,\n\n // Random - use crypto when available\n random: () => {\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const arr = new Uint32Array(1)\n crypto.getRandomValues(arr)\n return arr[0] / (0xffffffff + 1)\n }\n return Math.random()\n },\n }),\n\n // JSON - parse and stringify\n JSON: createBuiltinProxy('JSON', {\n parse: (text: string) => JSON.parse(text),\n stringify: (value: any, replacer?: any, space?: number) =>\n JSON.stringify(value, replacer, space),\n }),\n\n // console - maps to trace/logging\n console: createBuiltinProxy(\n 'console',\n {\n log: (..._args: any[]) => {\n // In expression context, we can't access trace easily\n // This is a no-op in expressions, but works in atom context\n // The transpiler should lift console.log to a trace atom call\n return undefined\n },\n warn: (..._args: any[]) => undefined,\n error: (..._args: any[]) => undefined,\n info: (..._args: any[]) => undefined,\n },\n {\n table: 'Use console.log with JSON.stringify for structured data.',\n dir: 'Use console.log instead.',\n trace: 'Stack traces are not available in AsyncJS.',\n }\n ),\n\n // Array static methods\n Array: createBuiltinProxy(\n 'Array',\n {\n isArray: (value: any) => Array.isArray(value),\n from: (iterable: any, mapFn?: any, thisArg?: any) =>\n Array.from(iterable, mapFn, thisArg),\n of: (...items: any[]) => Array.of(...items),\n },\n {\n prototype: 'Prototype access is not allowed.',\n }\n ),\n\n // Object static methods\n Object: createBuiltinProxy(\n 'Object',\n {\n keys: (obj: any) => Object.keys(obj),\n values: (obj: any) => Object.values(obj),\n entries: (obj: any) => Object.entries(obj),\n fromEntries: (entries: any) => Object.fromEntries(entries),\n assign: (target: any, ...sources: any[]) =>\n Object.assign({}, target, ...sources),\n hasOwn: (obj: any, prop: string) => Object.hasOwn(obj, prop),\n },\n {\n prototype: 'Prototype access is not allowed.',\n create: 'Use object literals instead.',\n defineProperty: 'Property descriptors are not supported.',\n getPrototypeOf: 'Prototype access is not allowed.',\n setPrototypeOf: 'Prototype modification is not allowed.',\n }\n ),\n\n // String static methods\n String: createBuiltinProxy('String', {\n fromCharCode: (...codes: number[]) => String.fromCharCode(...codes),\n fromCodePoint: (...codePoints: number[]) =>\n String.fromCodePoint(...codePoints),\n }),\n\n // Number static methods and constants\n Number: createBuiltinProxy('Number', {\n isNaN: Number.isNaN,\n isFinite: Number.isFinite,\n isInteger: Number.isInteger,\n isSafeInteger: Number.isSafeInteger,\n parseFloat: parseFloat,\n parseInt: parseInt,\n MAX_VALUE: Number.MAX_VALUE,\n MIN_VALUE: Number.MIN_VALUE,\n MAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER,\n MIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER,\n POSITIVE_INFINITY: Number.POSITIVE_INFINITY,\n NEGATIVE_INFINITY: Number.NEGATIVE_INFINITY,\n NaN: Number.NaN,\n EPSILON: Number.EPSILON,\n }),\n\n // Global functions\n parseInt: parseInt,\n parseFloat: parseFloat,\n isNaN: isNaN,\n isFinite: isFinite,\n encodeURI: encodeURI,\n decodeURI: decodeURI,\n encodeURIComponent: encodeURIComponent,\n decodeURIComponent: decodeURIComponent,\n\n // Constants\n undefined: undefined,\n null: null,\n NaN: NaN,\n Infinity: Infinity,\n\n // Schema-based filtering - strips extra properties, validates structure\n // Returns filtered data or throws on validation failure\n filter: (data: any, schema: any): any => {\n // Convert example-value schema to JSON Schema if needed\n const jsonSchema = convertExampleToSchema(schema)\n const result = schemaFilter(data, jsonSchema)\n if (result instanceof Error) {\n throw result\n }\n return result\n },\n\n // Schema builder - exposes tosijs-schema's fluent API for building JSON Schemas\n // Usage: Schema.object({ name: Schema.string, age: Schema.number.int.min(0) })\n // Usage: Schema.response('my_schema', Schema.object({ ... })) for LLM responseFormat\n Schema: {\n // Re-export all of tosijs-schema's `s` object\n ...s,\n\n // Convenience: wrap schema in OpenAI responseFormat structure\n // Accepts either a tosijs-schema builder or a plain example object\n response: (name: string, schemaOrExample: any) => {\n const jsonSchema =\n schemaOrExample?.schema != null\n ? schemaOrExample.schema\n : convertExampleToSchema(schemaOrExample)\n\n return {\n type: 'json_schema',\n json_schema: {\n name,\n strict: true,\n schema: jsonSchema,\n },\n }\n },\n\n // Convert example value to JSON Schema (for simple cases)\n fromExample: (example: any) => convertExampleToSchema(example),\n\n // Validation: returns boolean\n isValid: (data: any, schemaOrExample: any): boolean => {\n if (schemaOrExample?.schema != null) {\n return validate(data, schemaOrExample)\n }\n return validate(data, convertExampleToSchema(schemaOrExample))\n },\n },\n\n // Set factory - creates a set-like object backed by an array\n Set: (items: any[] = []) => {\n const data = [...new globalThis.Set(items)] // dedupe initial items\n return {\n // Mutable operations\n add(item: any) {\n if (!data.includes(item)) {\n data.push(item)\n }\n return this\n },\n remove(item: any) {\n const idx = data.indexOf(item)\n if (idx !== -1) {\n data.splice(idx, 1)\n }\n return this\n },\n clear() {\n data.length = 0\n return this\n },\n // Query operations\n has(item: any) {\n return data.includes(item)\n },\n get size() {\n return data.length\n },\n toArray() {\n return [...data]\n },\n // Set operations - return new sets\n union(other: any) {\n const otherItems = other?.toArray?.() ?? other ?? []\n return builtins.Set([...data, ...otherItems])\n },\n intersection(other: any) {\n const otherItems = other?.toArray?.() ?? other ?? []\n return builtins.Set(data.filter((x: any) => otherItems.includes(x)))\n },\n diff(other: any) {\n const otherItems = other?.toArray?.() ?? other ?? []\n return builtins.Set(data.filter((x: any) => !otherItems.includes(x)))\n },\n // Iteration\n forEach(fn: (item: any) => void) {\n data.forEach(fn)\n },\n map(fn: (item: any) => any) {\n return builtins.Set(data.map(fn))\n },\n filter(fn: (item: any) => boolean) {\n return builtins.Set(data.filter(fn))\n },\n // Serialization - Sets serialize to arrays\n toJSON() {\n return [...data]\n },\n }\n },\n\n // Date factory - creates a date-like object\n // Also supports Date.now() for compatibility\n Date: (() => {\n const createDate = (d: globalThis.Date): any => ({\n // Get the underlying value\n get value() {\n return d.toISOString()\n },\n get timestamp() {\n return d.getTime()\n },\n // Components\n get year() {\n return d.getFullYear()\n },\n get month() {\n return d.getMonth() + 1 // 1-indexed\n },\n get day() {\n return d.getDate()\n },\n get hours() {\n return d.getHours()\n },\n get minutes() {\n return d.getMinutes()\n },\n get seconds() {\n return d.getSeconds()\n },\n get dayOfWeek() {\n return d.getDay()\n },\n // Arithmetic - returns new Date\n add({\n years = 0,\n months = 0,\n days = 0,\n hours = 0,\n minutes = 0,\n seconds = 0,\n ms = 0,\n }: {\n years?: number\n months?: number\n days?: number\n hours?: number\n minutes?: number\n seconds?: number\n ms?: number\n } = {}) {\n const newDate = new globalThis.Date(d.getTime())\n if (years) newDate.setFullYear(newDate.getFullYear() + years)\n if (months) newDate.setMonth(newDate.getMonth() + months)\n if (days) newDate.setDate(newDate.getDate() + days)\n if (hours) newDate.setHours(newDate.getHours() + hours)\n if (minutes) newDate.setMinutes(newDate.getMinutes() + minutes)\n if (seconds) newDate.setSeconds(newDate.getSeconds() + seconds)\n if (ms) newDate.setMilliseconds(newDate.getMilliseconds() + ms)\n return createDate(newDate)\n },\n // Difference\n diff(\n other: any,\n unit: 'ms' | 'seconds' | 'minutes' | 'hours' | 'days' = 'ms'\n ) {\n const otherTime =\n typeof other === 'object' && other.timestamp\n ? other.timestamp\n : new globalThis.Date(other).getTime()\n const diffMs = d.getTime() - otherTime\n switch (unit) {\n case 'seconds':\n return diffMs / 1000\n case 'minutes':\n return diffMs / (1000 * 60)\n case 'hours':\n return diffMs / (1000 * 60 * 60)\n case 'days':\n return diffMs / (1000 * 60 * 60 * 24)\n default:\n return diffMs\n }\n },\n // Formatting\n format(fmt = 'ISO') {\n if (fmt === 'ISO') return d.toISOString()\n if (fmt === 'date') return d.toISOString().split('T')[0]\n if (fmt === 'time') return d.toISOString().split('T')[1].split('.')[0]\n // Simple format substitution\n return fmt\n .replace('YYYY', String(d.getFullYear()))\n .replace('MM', String(d.getMonth() + 1).padStart(2, '0'))\n .replace('DD', String(d.getDate()).padStart(2, '0'))\n .replace('HH', String(d.getHours()).padStart(2, '0'))\n .replace('mm', String(d.getMinutes()).padStart(2, '0'))\n .replace('ss', String(d.getSeconds()).padStart(2, '0'))\n },\n // Comparison\n isBefore(other: any) {\n const otherTime =\n typeof other === 'object' && other.timestamp\n ? other.timestamp\n : new globalThis.Date(other).getTime()\n return d.getTime() < otherTime\n },\n isAfter(other: any) {\n const otherTime =\n typeof other === 'object' && other.timestamp\n ? other.timestamp\n : new globalThis.Date(other).getTime()\n return d.getTime() > otherTime\n },\n // String representation\n toString() {\n return d.toISOString()\n },\n // Serialization - Dates serialize to ISO strings\n toJSON() {\n return d.toISOString()\n },\n })\n\n // The Date factory function\n const DateFactory = (init?: string | number) => {\n const date =\n init !== undefined ? new globalThis.Date(init) : new globalThis.Date()\n if (isNaN(date.getTime())) {\n throw new Error(`Invalid date: ${init}`)\n }\n return createDate(date)\n }\n\n // Static methods (for Date.now() compatibility)\n DateFactory.now = () => globalThis.Date.now()\n DateFactory.parse = (str: string) => createDate(new globalThis.Date(str))\n\n return DateFactory\n })(),\n}\n\n// Built-ins that are NOT available with helpful messages\nconst unsupportedBuiltins: Record<string, string> = {\n RegExp: 'RegExp is not available. Use string methods or the regexMatch atom.',\n Promise: 'Promise is not needed. All operations are implicitly async.',\n Map: 'Map is not available. Use plain objects instead.',\n WeakSet: 'WeakSet is not available.',\n WeakMap: 'WeakMap is not available.',\n Symbol: 'Symbol is not available.',\n Proxy: 'Proxy is not available.',\n Reflect: 'Reflect is not available.',\n Function: 'Function constructor is not available. Define functions normally.',\n eval: 'eval is not available. Code is compiled, not evaluated.',\n setTimeout: 'setTimeout is not available. Use the delay atom.',\n setInterval: 'setInterval is not available. Use while loops with delay.',\n fetch: 'fetch is not available. Use the httpFetch atom.',\n require: 'require is not available. Atoms must be registered with the VM.',\n import: 'import is not available. Atoms must be registered with the VM.',\n process: 'process is not available. AsyncJS runs in a sandboxed environment.',\n window: 'window is not available. AsyncJS runs in a sandboxed environment.',\n document:\n 'document is not available. AsyncJS runs in a sandboxed environment.',\n global: 'global is not available. AsyncJS runs in a sandboxed environment.',\n globalThis: 'globalThis is not available. Use builtins directly.',\n}\n\n/** Fuel cost per expression node evaluation */\nconst EXPR_FUEL_COST = 0.01\n\n/** Fuel cost per character for string operations (1 fuel per ~10KB) */\nconst STRING_FUEL_PER_CHAR = 0.0001\n\n/** Fuel cost per element for array allocation operations */\nconst ARRAY_FUEL_PER_ELEMENT = 0.001\n\n/** Methods that allocate new arrays/strings and need proportional charging */\nconst ALLOCATING_METHODS = new Set([\n // Array methods that create new arrays\n 'concat',\n 'slice',\n 'map',\n 'filter',\n 'flatMap',\n 'flat',\n 'toReversed',\n 'toSorted',\n 'toSpliced',\n // String methods that create new strings\n 'repeat',\n 'padStart',\n 'padEnd',\n 'split',\n 'join',\n 'replace',\n 'replaceAll',\n 'substring',\n 'substr',\n 'trim',\n 'trimStart',\n 'trimEnd',\n 'toLowerCase',\n 'toUpperCase',\n // Regex methods that allocate (match returns array, split/replace covered above)\n 'match',\n 'matchAll',\n // JSON parsing creates objects\n 'parse',\n 'stringify',\n])\n\n/**\n * Evaluates an expression node against the runtime context.\n * This replaces JSEP for new code - expressions are already parsed by Acorn.\n * Each node evaluation consumes a small amount of fuel to prevent runaway expressions.\n */\nexport function evaluateExpr(node: ExprNode, ctx: RuntimeContext): any {\n // Handle non-expression values (literals passed directly)\n if (node === null || node === undefined) {\n return node\n }\n if (typeof node !== 'object' || !('$expr' in node)) {\n // It's a literal value, not an expression node\n return node\n }\n\n // Consume fuel for each expression node evaluation\n if (ctx.fuel) {\n ctx.fuel.current -= EXPR_FUEL_COST\n if (ctx.fuel.current <= 0) {\n throw new Error('Out of Fuel')\n }\n }\n\n switch (node.$expr) {\n case 'literal':\n return node.value\n\n case 'ident': {\n // Look up in state first, then args, then builtins\n if (node.name in ctx.state) {\n return ctx.state[node.name]\n }\n if (node.name in ctx.args) {\n return ctx.args[node.name]\n }\n // Check builtins (Math, JSON, Array, etc.)\n if (node.name in builtins) {\n return builtins[node.name]\n }\n // Check for unsupported builtins and give helpful error\n if (node.name in unsupportedBuiltins) {\n throw new Error(unsupportedBuiltins[node.name])\n }\n return undefined\n }\n\n case 'member': {\n const obj = evaluateExpr(node.object, ctx)\n\n // Short-circuit for optional chaining\n if (node.optional && (obj === null || obj === undefined)) {\n return undefined\n }\n\n const prop = node.property\n assertSafeProperty(prop)\n\n return obj?.[prop]\n }\n\n case 'binary': {\n const left = evaluateExpr(node.left, ctx)\n const right = evaluateExpr(node.right, ctx)\n\n switch (node.op) {\n case '+': {\n const result = left + right\n // Charge fuel proportional to string length for concatenation\n if (typeof result === 'string' && ctx.fuel) {\n ctx.fuel.current -= result.length * STRING_FUEL_PER_CHAR\n if (ctx.fuel.current <= 0) {\n ctx.error = new AgentError('Out of Fuel', 'expr.concat')\n return undefined\n }\n }\n return result\n }\n case '-':\n return left - right\n case '*':\n return left * right\n case '/':\n return left / right\n case '%':\n return left % right\n case '**':\n return left ** right\n case '>':\n return left > right\n case '<':\n return left < right\n case '>=':\n return left >= right\n case '<=':\n return left <= right\n case '==':\n return isStructurallyEqual(left, right)\n case '!=':\n return !isStructurallyEqual(left, right)\n case '===':\n return left === right\n case '!==':\n return left !== right\n default:\n throw new Error(`Unknown binary operator: ${node.op}`)\n }\n }\n\n case 'unary': {\n const arg = evaluateExpr(node.argument, ctx)\n switch (node.op) {\n case '!':\n return !arg\n case '-':\n return -arg\n case '+':\n return +arg\n case 'typeof':\n return typeof arg\n default:\n throw new Error(`Unknown unary operator: ${node.op}`)\n }\n }\n\n case 'logical': {\n // Short-circuit evaluation\n const left = evaluateExpr(node.left, ctx)\n if (node.op === '&&') {\n return left ? evaluateExpr(node.right, ctx) : left\n } else if (node.op === '??') {\n // Nullish coalescing: only use right if left is null/undefined\n return left ?? evaluateExpr(node.right, ctx)\n } else {\n // || operator\n return left ? left : evaluateExpr(node.right, ctx)\n }\n }\n\n case 'conditional': {\n const test = evaluateExpr(node.test, ctx)\n return test\n ? evaluateExpr(node.consequent, ctx)\n : evaluateExpr(node.alternate, ctx)\n }\n\n case 'array':\n return node.elements.map((el) => evaluateExpr(el, ctx))\n\n case 'object': {\n const result: Record<string, any> = {}\n for (const prop of node.properties) {\n result[prop.key] = evaluateExpr(prop.value, ctx)\n }\n return result\n }\n\n case 'call': {\n // Special case: Error() triggers monadic error flow\n if (node.callee === 'Error') {\n const args = node.arguments.map((arg) => evaluateExpr(arg, ctx))\n const message = typeof args[0] === 'string' ? args[0] : 'Error'\n ctx.error = new AgentError(message, 'Error')\n return undefined // Error triggered, subsequent operations will be skipped\n }\n\n // Check if this is a builtin global function (parseInt, parseFloat, etc.)\n if (node.callee in builtins) {\n const fn = builtins[node.callee]\n if (typeof fn === 'function') {\n const args = node.arguments.map((arg) => evaluateExpr(arg, ctx))\n return fn(...args)\n }\n }\n // For atom calls within expressions\n const atom = ctx.resolver(node.callee)\n if (!atom) {\n // Check unsupported builtins\n if (node.callee in unsupportedBuiltins) {\n throw new Error(unsupportedBuiltins[node.callee])\n }\n throw new Error(`Unknown function: ${node.callee}`)\n }\n // This is synchronous evaluation - atom calls need special handling\n // For now, throw - atom calls should be lifted to statements\n throw new Error(\n `Atom calls in expressions not yet supported: ${node.callee}`\n )\n }\n\n case 'methodCall': {\n // Method call on an object (e.g., Math.floor(x), arr.length, str.toUpperCase())\n const obj = evaluateExpr(node.object, ctx)\n\n // Short-circuit for optional chaining\n if (node.optional && (obj === null || obj === undefined)) {\n return undefined\n }\n\n const method = node.method\n assertSafeProperty(method)\n\n if (obj === null || obj === undefined) {\n throw new Error(`Cannot call method '${method}' on ${obj}`)\n }\n\n const fn = obj[method]\n if (typeof fn !== 'function') {\n throw new Error(`'${method}' is not a function`)\n }\n\n const args = node.arguments.map((arg) => evaluateExpr(arg, ctx))\n const result = fn.apply(obj, args)\n\n // Charge fuel for allocating operations based on result size\n if (ctx.fuel && ALLOCATING_METHODS.has(method)) {\n let fuelCost = 0\n if (typeof result === 'string') {\n fuelCost = result.length * STRING_FUEL_PER_CHAR\n } else if (Array.isArray(result)) {\n fuelCost = result.length * ARRAY_FUEL_PER_ELEMENT\n } else if (typeof result === 'object' && result !== null) {\n // For JSON.parse and similar, estimate based on key count\n // This is a rough estimate but catches large objects\n const keys = Object.keys(result)\n fuelCost = keys.length * ARRAY_FUEL_PER_ELEMENT\n }\n ctx.fuel.current -= fuelCost\n if (ctx.fuel.current <= 0) {\n ctx.error = new AgentError('Out of Fuel', `expr.${method}`)\n return undefined\n }\n }\n\n return result\n }\n\n default:\n throw new Error(`Unknown expression type: ${(node as any).$expr}`)\n }\n}\n\n// --- Atom Factory ---\n\nexport function defineAtom<I extends Record<string, any>, O = any>(\n op: string,\n inputSchema: any, // s.Schema<I>\n outputSchema: any | undefined, // s.Schema<O>\n fn: (input: I, ctx: RuntimeContext) => Promise<O>,\n options: AtomOptions | string = {}\n): Atom<I, O> {\n const {\n docs = '',\n timeoutMs = 1000,\n cost = 1,\n } = typeof options === 'string' ? { docs: options } : options\n\n const exec: AtomExec = async (step: any, ctx: RuntimeContext) => {\n const { op: _op, result: _res, ...inputData } = step\n\n // Skip if already in error state (monadic flow)\n if (ctx.error) return\n\n // --- Tracing Start ---\n const stateBefore = ctx.trace ? { ...ctx.state } : null\n const fuelBefore = ctx.fuel.current\n let result: any\n let error: string | undefined\n\n try {\n // 2. Deduct Fuel (check for cost overrides first)\n const overrideCost = ctx.costOverrides?.[op]\n const baseCost = overrideCost !== undefined ? overrideCost : cost\n const currentCost =\n typeof baseCost === 'function' ? baseCost(inputData, ctx) : baseCost\n if ((ctx.fuel.current -= currentCost) <= 0) {\n ctx.error = new AgentError('Out of Fuel', op)\n return\n }\n\n // 3. Execution with Timeout\n let timer: any\n const execute = async () => fn(step as I, ctx)\n\n result =\n timeoutMs > 0\n ? await Promise.race([\n execute(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Atom '${op}' timed out`)),\n timeoutMs\n )\n }),\n ]).finally(() => clearTimeout(timer))\n : await execute()\n\n // 4. Result - always set if step.result is specified (even for undefined values)\n if (step.result) {\n if (ctx.consts.has(step.result)) {\n throw new Error(`Cannot reassign const variable '${step.result}'`)\n }\n // Validate output against schema (skip for undefined results)\n if (\n result !== undefined &&\n outputSchema &&\n !validate(result, outputSchema)\n ) {\n ctx.error = new AgentError(`Output validation failed for '${op}'`, op)\n return\n }\n ctx.state[step.result] = result\n // Mark as const if resultConst is set\n if (step.resultConst) {\n ctx.consts.add(step.result)\n }\n }\n } catch (e: any) {\n error = e.message || String(e)\n // Convert exception to monadic error\n ctx.error = new AgentError(error!, op, e)\n } finally {\n // --- Tracing End ---\n if (ctx.trace && stateBefore) {\n const stateDiff = diffObjects(stateBefore, ctx.state)\n ctx.trace.push({\n op,\n input: inputData,\n stateDiff,\n result,\n error,\n fuelBefore,\n fuelAfter: ctx.fuel.current,\n timestamp: new Date().toISOString(),\n })\n }\n }\n }\n\n return {\n op,\n inputSchema,\n outputSchema,\n exec,\n docs,\n timeoutMs,\n cost,\n create: (input: I) => ({ op, ...input }),\n }\n}\n\n// --- Core Atoms ---\n\n// 1. Flow (Low cost: 0.1)\n\n/*#\n## seq (Sequence)\n\nThe root atom for all agent programs. Executes steps in order.\n\n- Stops on `return` (when `ctx.output` is set)\n- Stops on error (monadic error flow)\n- Cost: 0.1\n\n```javascript\n// AsyncJS compiles to seq at the top level\nconst x = 1\nconst y = 2\nreturn { sum: x + y }\n```\n*/\nexport const seq = defineAtom(\n 'seq',\n s.object({ steps: s.array(s.any) }),\n undefined,\n async ({ steps }, ctx) => {\n for (const step of steps) {\n if (ctx.output !== undefined) return // Return check\n if (ctx.error) return // Monadic error - skip remaining steps\n const atom = ctx.resolver(step.op)\n if (!atom) throw new Error(`Unknown Atom: ${step.op}`)\n await atom.exec(step, ctx)\n }\n },\n { docs: 'Sequence', timeoutMs: 0, cost: 0.1 }\n)\n\n/*#\n## if (Conditional)\n\nConditional branching based on expression evaluation.\n\n```javascript\nif (count > 0) {\n console.log(\"Has items\")\n} else {\n console.log(\"Empty\")\n}\n```\n*/\nexport const iff = defineAtom(\n 'if',\n s.object({\n condition: s.any, // ExprNode\n then: s.array(s.any),\n else: s.array(s.any).optional,\n }),\n undefined,\n async (step, ctx) => {\n if (evaluateExpr(step.condition, ctx)) {\n await seq.exec({ op: 'seq', steps: step.then } as any, ctx)\n } else if (step.else) {\n await seq.exec({ op: 'seq', steps: step.else } as any, ctx)\n }\n },\n { docs: 'If/Else', timeoutMs: 0, cost: 0.1 }\n)\n\n/*#\n## while (Loop)\n\nRepeats body while condition is truthy. Consumes fuel each iteration.\n\n```javascript\nlet i = 0\nwhile (i < 10) {\n console.log(i)\n i = i + 1\n}\n```\n\n**Note:** No `break`/`continue`. Use condition variables instead.\n*/\nexport const whileLoop = defineAtom(\n 'while',\n s.object({\n condition: s.any, // ExprNode\n body: s.array(s.any),\n }),\n undefined,\n async (step, ctx) => {\n while (evaluateExpr(step.condition, ctx)) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n if ((ctx.fuel.current -= 0.1) <= 0) throw new Error('Out of Fuel')\n await seq.exec({ op: 'seq', steps: step.body } as any, ctx)\n if (ctx.output !== undefined) return\n }\n },\n { docs: 'While Loop', timeoutMs: 0, cost: 0.1 }\n)\n\n/*#\n## return\n\nEnds execution and returns values from state. The schema defines which\nstate variables to include in the output.\n\n```javascript\nconst result = compute()\nreturn { result } // Returns { result: <computed value> }\n```\n*/\nexport const ret = defineAtom(\n 'return',\n undefined,\n s.any,\n async (step: any, ctx) => {\n // If in error state, propagate the error as the output\n if (ctx.error) {\n ctx.output = ctx.error\n return ctx.error\n }\n\n // New style: return has explicit value\n if ('value' in step) {\n const res = resolveValue(step.value, ctx)\n\n // Enforce object returns \u2014 agents must return objects for composability\n if (\n res !== undefined &&\n res !== null &&\n !isAgentError(res) &&\n (typeof res !== 'object' || Array.isArray(res))\n ) {\n const err = new AgentError(\n `Agent must return an object, got ${\n Array.isArray(res) ? 'array' : typeof res\n }`,\n 'return'\n )\n ctx.error = err\n ctx.output = err\n return err\n }\n\n ctx.output = res\n return res\n }\n\n // Legacy style: extract from state based on schema keys\n let res: any = {}\n if (step.schema?.properties) {\n for (const key of Object.keys(step.schema.properties)) {\n res[key] = ctx.state[key]\n }\n\n // If schema has nested structure, filter to strip extra properties\n // This makes return types act as projections\n if (step.filter !== false) {\n const filterResult = schemaFilter(res, step.schema)\n if (!(filterResult instanceof Error)) {\n res = filterResult\n }\n // If filter fails, keep original result (validation already passed above)\n }\n }\n ctx.output = res\n return res\n },\n { docs: 'Return', cost: 0.1 }\n)\n\n/*#\n## try/catch\n\nError handling with monadic error flow. When an error occurs, subsequent\nsteps are skipped until caught.\n\n```javascript\ntry {\n const data = fetch(url)\n processData(data)\n} catch (err) {\n console.warn(\"Failed: \" + err)\n return { error: err }\n}\n```\n\nThe catch block receives:\n- `err` (or custom name): error message\n- `errorOp`: the atom that failed\n*/\nexport const tryCatch = defineAtom(\n 'try',\n s.object({\n try: s.array(s.any),\n catch: s.array(s.any).optional,\n catchParam: s.string.optional,\n }),\n undefined,\n async (step, ctx) => {\n // Execute try block\n await seq.exec({ op: 'seq', steps: step.try } as any, ctx)\n\n // If an error occurred and we have a catch block, handle it\n if (ctx.error && step.catch) {\n // Store error message in state for catch block to access\n // Use the catch parameter name if provided, otherwise 'error'\n const paramName = step.catchParam || 'error'\n ctx.state[paramName] = ctx.error.message\n ctx.state['errorOp'] = ctx.error.op\n // Clear the error - catch block handles it\n ctx.error = undefined\n // Execute catch block\n await seq.exec({ op: 'seq', steps: step.catch } as any, ctx)\n // If catch block didn't set a new error, we're recovered\n // If it did, that error propagates\n }\n },\n { docs: 'Try/Catch', timeoutMs: 0, cost: 0.1 }\n)\n\nexport const errorAtom = defineAtom(\n 'Error',\n s.object({ args: s.array(s.any).optional }),\n undefined,\n async (step, ctx) => {\n const message = step.args?.[0] ?? 'Error'\n ctx.error = new AgentError(String(message), 'Error')\n },\n { docs: 'Trigger error flow', cost: 0.1 }\n)\n\n// 2. State (Low cost: 0.1)\nexport const varSet = defineAtom(\n 'varSet',\n s.object({ key: s.string, value: s.any }),\n undefined,\n async ({ key, value }, ctx) => {\n if (ctx.consts.has(key)) {\n throw new Error(`Cannot reassign const variable '${key}'`)\n }\n ctx.state[key] = resolveValue(value, ctx)\n },\n { docs: 'Set Variable', cost: 0.1 }\n)\n\nexport const constSet = defineAtom(\n 'constSet',\n s.object({ key: s.string, value: s.any }),\n undefined,\n async ({ key, value }, ctx) => {\n if (ctx.consts.has(key)) {\n throw new Error(`Cannot reassign const variable '${key}'`)\n }\n if (key in ctx.state) {\n throw new Error(`Cannot redeclare variable '${key}' as const`)\n }\n ctx.state[key] = resolveValue(value, ctx)\n ctx.consts.add(key)\n },\n { docs: 'Set Const Variable (immutable)', cost: 0.1 }\n)\n\nexport const varGet = defineAtom(\n 'varGet',\n s.object({ key: s.string }),\n s.any,\n async ({ key }, ctx) => {\n return resolveValue(key, ctx)\n },\n { docs: 'Get Variable', cost: 0.1 }\n)\n\nexport const varsImport = defineAtom(\n 'varsImport',\n s.object({\n keys: s.union([s.array(s.string), s.record(s.string)]),\n }),\n undefined,\n async ({ keys }, ctx) => {\n if (Array.isArray(keys)) {\n for (const key of keys) {\n ctx.state[key] = resolveValue({ $kind: 'arg', path: key }, ctx)\n }\n } else {\n for (const [alias, path] of Object.entries(keys)) {\n ctx.state[alias] = resolveValue({ $kind: 'arg', path: path }, ctx)\n }\n }\n },\n {\n docs: 'Import variables from args into the current scope, with optional renaming.',\n cost: 0.2,\n }\n)\n\nexport const varsLet = defineAtom(\n 'varsLet',\n s.record(s.any),\n undefined,\n async (step, ctx) => {\n for (const key of Object.keys(step)) {\n if (key === 'op' || key === 'result') continue\n ctx.state[key] = resolveValue(step[key], ctx)\n }\n },\n {\n docs: 'Initialize a set of variables in the current scope from the step object properties.',\n cost: 0.1,\n }\n)\n\nexport const varsExport = defineAtom(\n 'varsExport',\n s.object({\n keys: s.union([s.array(s.string), s.record(s.string)]),\n }),\n s.record(s.any),\n async ({ keys }, ctx) => {\n const result: Record<string, any> = {}\n if (Array.isArray(keys)) {\n for (const key of keys) {\n result[key] = resolveValue(key, ctx)\n }\n } else {\n for (const [alias, path] of Object.entries(keys)) {\n result[alias] = resolveValue(path, ctx)\n }\n }\n return result\n },\n {\n docs: 'Export variables from the current scope, with optional renaming.',\n cost: 0.2,\n }\n)\n\nexport const scope = defineAtom(\n 'scope',\n s.object({ steps: s.array(s.any) }),\n undefined,\n async ({ steps }, ctx) => {\n const scopedCtx = createChildScope(ctx)\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n // Propagate output/return up\n if (scopedCtx.output !== undefined) ctx.output = scopedCtx.output\n },\n { docs: 'Create new scope', timeoutMs: 0, cost: 0.1 }\n)\n\n// 3. List (Cost 1)\n\n/*#\n## for...of / map\n\nTransforms each item in an array. The `result` variable in each iteration\nbecomes the new item value.\n\n```javascript\nconst doubled = items.map(x => x * 2)\n\n// Or with for...of:\nconst results = []\nfor (const item of items) {\n results.push(process(item))\n}\n```\n*/\nexport const map = defineAtom(\n 'map',\n s.object({ items: s.array(s.any), as: s.string, steps: s.array(s.any) }),\n s.array(s.any),\n async ({ items, as, steps }, ctx) => {\n const results = []\n const resolvedItems = resolveValue(items, ctx)\n if (!Array.isArray(resolvedItems))\n throw new Error('map: items is not an array')\n for (const item of resolvedItems) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n const scopedCtx = createChildScope(ctx)\n scopedCtx.state[as] = item\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n results.push(scopedCtx.state['result'] ?? null)\n }\n return results\n },\n { docs: 'Map Array', timeoutMs: 0, cost: 1 }\n)\n\n/*#\n## filter\n\nKeeps items that match a condition.\n\n```javascript\nconst adults = users.filter(u => u.age >= 18)\n```\n*/\nexport const filter = defineAtom(\n 'filter',\n s.object({\n items: s.array(s.any),\n as: s.string,\n condition: s.any, // ExprNode that evaluates to boolean\n }),\n s.array(s.any),\n async ({ items, as, condition }, ctx) => {\n const results = []\n const resolvedItems = resolveValue(items, ctx)\n if (!Array.isArray(resolvedItems))\n throw new Error('filter: items is not an array')\n for (const item of resolvedItems) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n const scopedCtx = createChildScope(ctx)\n scopedCtx.state[as] = item\n const passes = evaluateExpr(condition, scopedCtx)\n if (passes) {\n results.push(item)\n }\n }\n return results\n },\n { docs: 'Filter Array', timeoutMs: 0, cost: 1 }\n)\n\n/*#\n## reduce\n\nAccumulates a single value from an array.\n\n```javascript\nconst sum = numbers.reduce((acc, n) => acc + n, 0)\n```\n*/\nexport const reduce = defineAtom(\n 'reduce',\n s.object({\n items: s.array(s.any),\n as: s.string,\n accumulator: s.string,\n initial: s.any,\n steps: s.array(s.any),\n }),\n s.any,\n async ({ items, as, accumulator, initial, steps }, ctx) => {\n const resolvedItems = resolveValue(items, ctx)\n const resolvedInitial = resolveValue(initial, ctx)\n if (!Array.isArray(resolvedItems))\n throw new Error('reduce: items is not an array')\n\n let acc = resolvedInitial\n for (const item of resolvedItems) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n const scopedCtx = createChildScope(ctx)\n scopedCtx.state[as] = item\n scopedCtx.state[accumulator] = acc\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n acc = scopedCtx.state['result'] ?? acc\n }\n return acc\n },\n { docs: 'Reduce Array', timeoutMs: 0, cost: 1 }\n)\n\n/*#\n## find\n\nReturns first item matching condition, or null.\n\n```javascript\nconst admin = users.find(u => u.role === \"admin\")\n```\n*/\nexport const find = defineAtom(\n 'find',\n s.object({\n items: s.array(s.any),\n as: s.string,\n condition: s.any, // ExprNode that evaluates to boolean\n }),\n s.any,\n async ({ items, as, condition }, ctx) => {\n const resolvedItems = resolveValue(items, ctx)\n if (!Array.isArray(resolvedItems))\n throw new Error('find: items is not an array')\n for (const item of resolvedItems) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n const scopedCtx = createChildScope(ctx)\n scopedCtx.state[as] = item\n const matches = evaluateExpr(condition, scopedCtx)\n if (matches) {\n return item\n }\n }\n return null\n },\n { docs: 'Find in Array', timeoutMs: 0, cost: 1 }\n)\n\nexport const push = defineAtom(\n 'push',\n s.object({ list: s.array(s.any), item: s.any }),\n s.array(s.any),\n async ({ list, item }, ctx) => {\n const resolvedList = resolveValue(list, ctx)\n const resolvedItem = resolveValue(item, ctx)\n if (Array.isArray(resolvedList)) resolvedList.push(resolvedItem)\n return resolvedList\n },\n { docs: 'Push to Array', cost: 1 }\n)\n\nexport const len = defineAtom(\n 'len',\n s.object({ list: s.any }),\n s.number,\n async ({ list }, ctx) => {\n const val = resolveValue(list, ctx)\n return Array.isArray(val) || typeof val === 'string' ? val.length : 0\n },\n { docs: 'Length', cost: 1 }\n)\n\n// 6. String (Cost 1)\nexport const split = defineAtom(\n 'split',\n s.object({ str: s.string, sep: s.string }),\n s.array(s.string),\n async ({ str, sep }, ctx) =>\n resolveValue(str, ctx).split(resolveValue(sep, ctx)),\n { docs: 'Split String', cost: 1 }\n)\nexport const join = defineAtom(\n 'join',\n s.object({ list: s.array(s.string), sep: s.string }),\n s.string,\n async ({ list, sep }, ctx) =>\n resolveValue(list, ctx).join(resolveValue(sep, ctx)),\n { docs: 'Join String', cost: 1 }\n)\nexport const template = defineAtom(\n 'template',\n s.object({ tmpl: s.string, vars: s.record(s.any) }),\n s.string,\n async ({ tmpl, vars }: { tmpl: string; vars: Record<string, any> }, ctx) => {\n const resolvedTmpl = resolveValue(tmpl, ctx)\n return resolvedTmpl.replace(/\\{\\{(\\w+)\\}\\}/g, (_: string, key: string) =>\n String(resolveValue(vars[key], ctx) ?? '')\n )\n },\n { docs: 'String Template', cost: 1 }\n)\n\nexport const regexMatch = defineAtom(\n 'regexMatch',\n s.object({\n pattern: s.string,\n value: s.any,\n }),\n s.boolean,\n async ({ pattern, value }, ctx: RuntimeContext) => {\n // ReDoS protection: reject patterns likely to cause catastrophic backtracking\n if (isSuspiciousRegex(pattern)) {\n throw new Error(\n `Suspicious regex pattern rejected (potential ReDoS): ${pattern}`\n )\n }\n const resolvedValue = resolveValue(value, ctx)\n const p = new RegExp(pattern)\n return p.test(resolvedValue)\n },\n {\n docs: 'Returns true if the value matches the regex pattern.',\n cost: 2,\n }\n)\n\n// 7. Object (Cost 1)\nexport const pick = defineAtom(\n 'pick',\n s.object({ obj: s.record(s.any), keys: s.array(s.string) }),\n s.record(s.any),\n async ({ obj, keys }: { obj: Record<string, any>; keys: string[] }, ctx) => {\n const resolvedObj = resolveValue(obj, ctx)\n const resolvedKeys = resolveValue(keys, ctx)\n const res: any = {}\n if (resolvedObj && Array.isArray(resolvedKeys)) {\n resolvedKeys.forEach((k: string) => (res[k] = resolvedObj[k]))\n }\n return res\n },\n { docs: 'Pick Keys', cost: 1 }\n)\n\nexport const omit = defineAtom(\n 'omit',\n s.object({ obj: s.record(s.any), keys: s.array(s.string) }),\n s.record(s.any),\n async ({ obj, keys }: { obj: Record<string, any>; keys: string[] }, ctx) => {\n const resolvedObj = resolveValue(obj, ctx)\n const resolvedKeys = new Set(resolveValue(keys, ctx))\n const res: any = {}\n if (resolvedObj) {\n Object.keys(resolvedObj).forEach((k) => {\n if (!resolvedKeys.has(k)) res[k] = resolvedObj[k]\n })\n }\n return res\n },\n { docs: 'Omit Keys', cost: 1 }\n)\n\nexport const merge = defineAtom(\n 'merge',\n s.object({ a: s.record(s.any), b: s.record(s.any) }),\n s.record(s.any),\n async ({ a, b }, ctx) => ({\n ...resolveValue(a, ctx),\n ...resolveValue(b, ctx),\n }),\n { docs: 'Merge Objects', cost: 1 }\n)\nexport const keys = defineAtom(\n 'keys',\n s.object({ obj: s.record(s.any) }),\n s.array(s.string),\n async ({ obj }, ctx) => Object.keys(resolveValue(obj, ctx) ?? {}),\n { docs: 'Object Keys', cost: 1 }\n)\n\n// 8. IO (Cost 5)\n\n/*#\n## fetch\n\nHTTP requests. Requires `fetch` capability or uses global fetch with SSRF protection.\n\n```javascript\nconst data = fetch(\"https://api.example.com/data\")\nconst posted = fetch(\"https://api.example.com/items\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: { name: \"New Item\" }\n})\n```\n\nResponse types: `\"json\"` (default for JSON content-type), `\"text\"`, `\"dataUrl\"` (for images)\n\nSecurity:\n- Requires `ctx.context.allowedFetchDomains` allowlist OR restricts to localhost\n- Automatically adds `X-Agent-Depth` header to prevent recursive agent loops\n- Custom fetch capability can override all restrictions\n*/\n\n/** Maximum agent request depth to prevent recursive loops */\nconst MAX_AGENT_DEPTH = 10\n\n/** Header name for tracking agent request depth */\nconst AGENT_DEPTH_HEADER = 'X-Agent-Depth'\n\n/**\n * Check if a URL's domain is in the allowlist.\n * Supports exact matches and wildcard subdomains (*.example.com)\n */\nfunction isDomainAllowed(urlString: string, allowedDomains: string[]): boolean {\n try {\n const url = new URL(urlString)\n const host = url.hostname.toLowerCase()\n\n for (const pattern of allowedDomains) {\n const p = pattern.toLowerCase()\n if (p.startsWith('*.')) {\n // Wildcard: *.example.com matches sub.example.com and example.com\n const suffix = p.slice(1) // .example.com\n if (host.endsWith(suffix) || host === p.slice(2)) {\n return true\n }\n } else if (host === p) {\n return true\n }\n }\n return false\n } catch {\n return false\n }\n}\n\nexport const fetch = defineAtom(\n 'httpFetch',\n s.object({\n url: s.string,\n method: s.string.optional,\n headers: s.record(s.string).optional,\n body: s.any.optional,\n responseType: s.string.optional, // 'json' | 'text' | 'dataUrl'\n }),\n s.any,\n async (step, ctx) => {\n const url = resolveValue(step.url, ctx)\n const method = resolveValue(step.method, ctx)\n const headers = resolveValue(step.headers, ctx) || {}\n const body = resolveValue(step.body, ctx)\n const responseType = resolveValue(step.responseType, ctx)\n\n // Get current depth from context (set by receiving endpoint)\n const currentDepth: number = ctx.context?.requestDepth ?? 0\n\n // Check depth limit\n if (currentDepth >= MAX_AGENT_DEPTH) {\n throw new Error(\n `Agent request depth exceeded (max ${MAX_AGENT_DEPTH}). This prevents recursive agent loops.`\n )\n }\n\n if (ctx.capabilities.fetch) {\n // Custom fetch capability handles its own validation\n // Pass depth info so it can add the header\n return ctx.capabilities.fetch(url, {\n method,\n headers: {\n ...headers,\n [AGENT_DEPTH_HEADER]: String(currentDepth + 1),\n },\n body,\n signal: ctx.signal,\n responseType,\n })\n }\n\n // Check allowlist - if configured, it controls what's allowed\n const allowedDomains: string[] | undefined =\n ctx.context?.allowedFetchDomains\n if (allowedDomains) {\n // Allowlist mode: only allow domains in the list\n if (!isDomainAllowed(url, allowedDomains)) {\n throw new Error(\n `Fetch blocked: domain not in allowlist. Allowed: ${allowedDomains.join(\n ', '\n )}`\n )\n }\n // Domain is in allowlist - skip SSRF check (allowlist takes precedence)\n } else {\n // No allowlist configured - use SSRF protection + localhost-only\n if (isBlockedUrl(url)) {\n throw new Error(\n `Blocked URL: private/internal addresses not allowed in default fetch`\n )\n }\n\n // Additionally restrict to localhost when no allowlist\n try {\n const parsed = new URL(url)\n const host = parsed.hostname.toLowerCase()\n if (host !== 'localhost' && host !== '127.0.0.1' && host !== '[::1]') {\n throw new Error(\n `Fetch blocked: no allowedFetchDomains configured. ` +\n `Set ctx.context.allowedFetchDomains or provide a custom fetch capability.`\n )\n }\n } catch (e: any) {\n if (e.message.includes('allowedFetchDomains')) throw e\n throw new Error(`Invalid URL: ${url}`)\n }\n }\n\n // Default: global fetch with abort signal and depth header\n if (typeof globalThis.fetch === 'function') {\n const res = await globalThis.fetch(url, {\n method,\n headers: {\n ...headers,\n [AGENT_DEPTH_HEADER]: String(currentDepth + 1),\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: ctx.signal, // Pass abort signal for cancellation\n })\n\n // Handle dataUrl response type - converts binary to data URI\n if (responseType === 'dataUrl') {\n const buffer = await res.arrayBuffer()\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 const base64 = btoa(binary)\n const contentType =\n res.headers.get('content-type') || 'application/octet-stream'\n return `data:${contentType};base64,${base64}`\n }\n\n // Try to parse JSON if content-type says so, else text\n const contentType = res.headers.get('content-type')\n if (\n responseType === 'json' ||\n (contentType && contentType.includes('application/json'))\n ) {\n return res.json()\n }\n return res.text()\n }\n throw new Error(\"Capability 'fetch' missing and no global fetch available\")\n },\n { docs: 'HTTP Fetch', timeoutMs: 30000, cost: 5 }\n)\n\n// 9. Store\n\n/*#\n## storeGet / storeSet\n\nPersistent key-value storage. Requires `store` capability.\n\n```javascript\n// Save data\nstoreSet(\"user:123\", { name: \"Alice\", prefs: {} })\n\n// Retrieve later\nconst user = storeGet(\"user:123\")\n```\n\n**Warning:** Default in-memory store is not suitable for production.\n*/\nexport const storeGet = defineAtom(\n 'storeGet',\n s.object({ key: s.string }),\n s.any,\n async ({ key }, ctx) => {\n const k = resolveValue(key, ctx)\n return ctx.capabilities.store?.get(k)\n },\n { docs: 'Store Get', cost: 5 }\n)\n\nexport const storeSet = defineAtom(\n 'storeSet',\n s.object({ key: s.string, value: s.any }),\n undefined,\n async ({ key, value }, ctx) => {\n const k = resolveValue(key, ctx)\n const v = resolveValue(value, ctx)\n return ctx.capabilities.store?.set(k, v)\n },\n { docs: 'Store Set', cost: 5 }\n)\n\nexport const storeQuery = defineAtom(\n 'storeQuery',\n s.object({ query: s.any }),\n s.array(s.any),\n async ({ query }, ctx) =>\n ctx.capabilities.store?.query?.(resolveValue(query, ctx)) ?? [],\n { docs: 'Store Query', cost: 5 }\n)\nexport const vectorSearch = defineAtom(\n 'storeVectorSearch',\n s.object({\n collection: s.string.optional,\n vector: s.array(s.number),\n k: s.number.optional,\n }),\n s.array(s.any),\n async ({ collection, vector, k }, ctx) =>\n ctx.capabilities.store?.vectorSearch?.(\n resolveValue(collection, ctx),\n resolveValue(vector, ctx),\n resolveValue(k, ctx)\n ) ?? [],\n {\n docs: 'Vector Search',\n cost: (input, ctx) => 5 + (resolveValue(input.k, ctx) ?? 5),\n }\n)\n\n// 10. LLM\n\n/*#\n## llmPredict\n\nCall language model. Requires `llm` capability with `predict` method.\n\n```javascript\nconst response = llmPredict(\"Summarize this: \" + text)\n\n// With options\nconst structured = llmPredict(prompt, {\n model: \"gpt-4\",\n temperature: 0.7,\n responseFormat: { type: \"json_object\" }\n})\n```\n*/\nexport const llmPredict = defineAtom(\n 'llmPredict',\n s.object({ prompt: s.string, options: s.any.optional }),\n s.string,\n async ({ prompt, options }, ctx) => {\n if (!ctx.capabilities.llm?.predict)\n throw new Error(\"Capability 'llm.predict' missing\")\n return ctx.capabilities.llm.predict(\n resolveValue(prompt, ctx),\n resolveValue(options, ctx)\n )\n },\n { docs: 'LLM Predict', timeoutMs: 120000, cost: 100 }\n)\n\nexport const agentRun = defineAtom(\n 'agentRun',\n s.object({ agentId: s.any, input: s.any }), // agentId can be string token or AST object\n s.any,\n async ({ agentId, input }, ctx) => {\n const resolvedId = resolveValue(agentId, ctx)\n const rawInput = resolveValue(input, ctx)\n\n let resolvedInput = rawInput\n if (rawInput && typeof rawInput === 'object' && !Array.isArray(rawInput)) {\n resolvedInput = {}\n for (const k in rawInput) {\n resolvedInput[k] = resolveValue(rawInput[k], ctx)\n }\n }\n\n // Check if this is a procedure token\n if (isProcedureToken(resolvedId)) {\n // Resolve the token to AST and execute directly\n const ast = resolveProcedureToken(resolvedId)\n\n // Execute the AST using the seq atom (recursive execution)\n // Create a child context with the input as args\n const childCtx: RuntimeContext = {\n ...ctx,\n args: resolvedInput,\n state: {},\n consts: new Set(),\n output: undefined,\n error: undefined,\n }\n\n const seqAtom = ctx.resolver('seq')\n if (!seqAtom) throw new Error('seq atom not found')\n await seqAtom.exec(ast, childCtx)\n\n if (childCtx.error) {\n throw new Error(childCtx.error.message || 'Sub-agent failed')\n }\n\n return childCtx.output\n }\n\n // Check if resolvedId is an AST object (has 'op' property)\n if (resolvedId && typeof resolvedId === 'object' && 'op' in resolvedId) {\n // Execute the AST directly\n const childCtx: RuntimeContext = {\n ...ctx,\n args: resolvedInput,\n state: {},\n consts: new Set(),\n output: undefined,\n error: undefined,\n }\n\n const seqAtom = ctx.resolver('seq')\n if (!seqAtom) throw new Error('seq atom not found')\n await seqAtom.exec(resolvedId, childCtx)\n\n if (childCtx.error) {\n throw new Error(childCtx.error.message || 'Sub-agent failed')\n }\n\n return childCtx.output\n }\n\n // Fall back to capability-based agent lookup\n if (!ctx.capabilities.agent?.run)\n throw new Error(\"Capability 'agent.run' missing\")\n\n const result = await ctx.capabilities.agent.run(resolvedId, resolvedInput)\n\n // Check if this is a RunResult (has fuelUsed property) - unwrap it\n if (\n result &&\n typeof result === 'object' &&\n 'fuelUsed' in result &&\n typeof result.fuelUsed === 'number'\n ) {\n // It's a RunResult - check for error and propagate\n if (result.error) {\n throw new Error(result.error.message || 'Sub-agent failed')\n }\n return result.result\n }\n\n return result\n },\n { docs: 'Run Sub-Agent (accepts procedure token, AST, or agent ID)', cost: 1 }\n)\n\n/*#\n## transpileCode (Code to AST)\n\nTranspiles AsyncJS code to an AST without executing it.\nUseful for generating agents to send to other services via fetch.\n\n```javascript\n// Generate an agent and send it to a worker\nlet code = llmPredict({ prompt: 'Write an AsyncJS data processor' })\nlet ast = transpileCode({ code })\nlet result = httpFetch({\n url: 'https://worker.example.com/run',\n method: 'POST',\n body: JSON.stringify({ ast, args: { data: myData } })\n})\n```\n\nSecurity: Only available when the `code.transpile` capability is provided.\n*/\nexport const transpileCode = defineAtom(\n 'transpileCode',\n s.object({\n code: s.string,\n }),\n s.any,\n async ({ code }, ctx) => {\n if (!ctx.capabilities.code?.transpile) {\n throw new Error(\n \"Capability 'code.transpile' missing. Enable code transpilation by providing the code capability.\"\n )\n }\n\n const resolvedCode = resolveValue(code, ctx)\n\n try {\n return ctx.capabilities.code.transpile(resolvedCode)\n } catch (e: any) {\n throw new Error(`Code transpilation failed: ${e.message}`)\n }\n },\n { docs: 'Transpile AsyncJS code to AST', cost: 1 }\n)\n\n/*#\n## runCode (Dynamic Code Execution)\n\nTranspiles and executes AsyncJS code at runtime. The generated code\nruns in the same context, sharing fuel budget, capabilities, and trace.\n\nThis enables agents to write and execute code to solve problems.\n\n```javascript\n// Agent writes code to solve a problem\nlet code = llmPredict({ prompt: 'Write AsyncJS to calculate fibonacci(10)' })\nlet result = runCode({ code, args: {} })\nreturn { answer: result }\n```\n\nThe code must be a valid AsyncJS function. The function's return value\nbecomes the result of runCode.\n\nSecurity: Only available when the `code.transpile` capability is provided.\nThe transpiled code runs with the same permissions as the parent.\nRecursion depth is limited to prevent stack overflow.\n*/\n/** Maximum nesting depth for runCode to prevent infinite recursion */\nconst MAX_RUNCODE_DEPTH = 10\n\nexport const runCode = defineAtom(\n 'runCode',\n s.object({\n code: s.string,\n args: s.record(s.any).optional,\n }),\n s.any,\n async ({ code, args }, ctx) => {\n // Check recursion depth\n const currentDepth = ctx.runCodeDepth ?? 0\n if (currentDepth >= MAX_RUNCODE_DEPTH) {\n throw new Error(\n `runCode recursion limit exceeded (max ${MAX_RUNCODE_DEPTH}). ` +\n 'This prevents infinite loops from dynamically generated code calling runCode.'\n )\n }\n\n if (!ctx.capabilities.code?.transpile) {\n throw new Error(\n \"Capability 'code.transpile' missing. Enable dynamic code execution by providing the code capability.\"\n )\n }\n\n const resolvedCode = resolveValue(code, ctx)\n const resolvedArgs = args ? resolveValue(args, ctx) : {}\n\n // Transpile the code to AST\n let ast: { op: string; steps: any[] }\n try {\n ast = ctx.capabilities.code.transpile(resolvedCode)\n } catch (e: any) {\n throw new Error(`Code transpilation failed: ${e.message}`)\n }\n\n if (ast.op !== 'seq') {\n throw new Error('Transpiled code must be a seq node')\n }\n\n // Create a child scope for the dynamic code execution\n // This isolates its variables but shares fuel, capabilities, trace\n const childCtx = createChildScope(ctx)\n childCtx.args = resolvedArgs\n childCtx.output = undefined\n childCtx.runCodeDepth = currentDepth + 1 // Increment depth for nested calls\n\n // Execute the transpiled code in the child context\n await seq.exec(ast as any, childCtx)\n\n // Propagate any error from child to parent\n if (childCtx.error) {\n ctx.error = childCtx.error\n return\n }\n\n // Return the output from the dynamic code\n return childCtx.output\n },\n { docs: 'Run dynamically generated AsyncJS code', cost: 1 }\n)\n\n// 11. Parsing (Cost 1)\nexport const jsonParse = defineAtom(\n 'jsonParse',\n s.object({ str: s.string }),\n s.any,\n async ({ str }, ctx) => JSON.parse(resolveValue(str, ctx)),\n { docs: 'Parse JSON', cost: 1 }\n)\nexport const jsonStringify = defineAtom(\n 'jsonStringify',\n s.object({ value: s.any }),\n s.string,\n async ({ value }, ctx) => JSON.stringify(resolveValue(value, ctx)),\n { docs: 'Stringify JSON', cost: 1 }\n)\nexport const xmlParse = defineAtom(\n 'xmlParse',\n s.object({ str: s.string }),\n s.any,\n async ({ str }, ctx) => {\n if (!ctx.capabilities.xml?.parse)\n throw new Error(\"Capability 'xml.parse' missing\")\n return ctx.capabilities.xml.parse(resolveValue(str, ctx))\n },\n { docs: 'Parse XML', cost: 1 }\n)\n\n// 12. Optimization\n\n/*#\n## memoize\n\nIn-memory caching within a single execution. Same key returns cached result.\n\n```javascript\n// Expensive computation cached by key\nconst result = memoize(\"expensive-\" + id, () => {\n return heavyComputation(data)\n})\n```\n*/\nexport const memoize = defineAtom(\n 'memoize',\n s.object({ key: s.string.optional, steps: s.array(s.any) }),\n s.any,\n async ({ key, steps }, ctx) => {\n // In-memory memoization scoped to VM run\n if (!ctx.memo) ctx.memo = new Map()\n\n const k =\n resolveValue(key, ctx) ??\n (await hash.exec({ value: steps, algorithm: 'SHA-256' }, ctx))\n\n // Check if result exists\n if (ctx.memo.has(k)) {\n return ctx.memo.get(k)\n }\n\n // Execute steps in isolated scope\n const scopedCtx = createChildScope(ctx)\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n\n // Result is implicit from last step or explicit scope result variable?\n // Convention: result variable or last output\n const result = scopedCtx.output ?? scopedCtx.state['result']\n\n // Store\n ctx.memo.set(k, result)\n return result\n },\n { docs: 'Memoize steps result in memory', cost: 1 }\n)\n\n/*#\n## cache\n\nPersistent caching across executions using store capability.\n\n```javascript\n// Cache API result for 1 hour (3600000 ms)\nconst weather = cache(\"weather-\" + city, 3600000, () => {\n return fetch(\"https://api.weather.com/\" + city)\n})\n```\n*/\nexport const cache = defineAtom(\n 'cache',\n s.object({\n key: s.string.optional,\n steps: s.array(s.any),\n ttlMs: s.number.optional,\n }),\n s.any,\n async ({ key, steps, ttlMs }, ctx) => {\n if (!ctx.capabilities.store)\n throw new Error(\"Capability 'store' missing for caching\")\n\n const k =\n resolveValue(key, ctx) ??\n (await hash.exec({ value: steps, algorithm: 'SHA-256' }, ctx))\n\n // Check cache\n const cacheKey = `cache:${k}`\n const cached = await ctx.capabilities.store.get(cacheKey)\n\n if (cached) {\n // If object with timestamp?\n // For simple store, we might store { val, exp }\n // Let's assume we store { val, exp } if we manage TTL manually\n // or capabilities handle TTL?\n // Standard KV doesn't enforce TTL usually unless Redis.\n // We implement soft TTL logic wrapper here.\n if (typeof cached === 'object' && cached._exp) {\n if (Date.now() < cached._exp) return cached.val\n // Expired\n } else {\n // No expiry metadata, assume valid if exists (or legacy data)\n return cached\n }\n }\n\n // Execute\n const scopedCtx = createChildScope(ctx)\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n const result = scopedCtx.output ?? scopedCtx.state['result']\n\n // Store with TTL\n const expiry = Date.now() + (ttlMs ?? 24 * 3600 * 1000)\n\n if ((ctx.fuel.current -= 5) <= 0) throw new Error('Out of Fuel')\n await ctx.capabilities.store.set(cacheKey, { val: result, _exp: expiry })\n\n return result\n },\n { docs: 'Cache steps result in store with TTL', cost: 5 }\n)\n\n// 13. Utils\nexport const random = defineAtom(\n 'random',\n s.object({\n min: s.number.optional,\n max: s.number.optional,\n format: s.string.optional,\n length: s.number.optional,\n }),\n s.any,\n async ({ min, max, format, length }, ctx) => {\n const f = resolveValue(format, ctx) ?? 'float'\n const len = resolveValue(length, ctx) ?? 10\n const mn = resolveValue(min, ctx) ?? 0\n const mx = resolveValue(max, ctx) ?? 1\n\n if (f === 'base36') {\n const chars = '0123456789abcdefghijklmnopqrstuvwxyz'\n let result = ''\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const values = new Uint8Array(len)\n crypto.getRandomValues(values)\n for (let i = 0; i < len; i++) {\n result += chars[values[i] % 36]\n }\n } else {\n for (let i = 0; i < len; i++) {\n result += chars.charAt(Math.floor(Math.random() * 36))\n }\n }\n return result\n }\n\n // Prefer cryptographically secure random when available\n let val: number\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const arr = new Uint32Array(1)\n crypto.getRandomValues(arr)\n val = arr[0] / (0xffffffff + 1)\n } else {\n val = Math.random()\n }\n\n const range = mx - mn\n const result = val * range + mn\n\n if (f === 'integer') {\n return Math.floor(result)\n }\n return result\n },\n { docs: 'Generate Random', cost: 1 }\n)\n\nexport const uuid = defineAtom(\n 'uuid',\n undefined,\n s.string,\n async () => {\n // Prefer crypto.randomUUID when available\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID()\n }\n // Fallback using crypto.getRandomValues if available\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const bytes = new Uint8Array(16)\n crypto.getRandomValues(bytes)\n bytes[6] = (bytes[6] & 0x0f) | 0x40 // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80 // variant 10\n const hex = Array.from(bytes, (b) =>\n b.toString(16).padStart(2, '0')\n ).join('')\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(\n 12,\n 16\n )}-${hex.slice(16, 20)}-${hex.slice(20)}`\n }\n // Last resort fallback (insecure, for legacy environments only)\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n },\n { docs: 'Generate UUID', cost: 1 }\n)\n\nexport const hash = defineAtom(\n 'hash',\n s.object({\n value: s.any,\n algorithm: s.string.optional, // e.g., 'SHA-256'\n }),\n s.string,\n async ({ value, algorithm }, ctx) => {\n const str =\n typeof value === 'string'\n ? value\n : JSON.stringify(resolveValue(value, ctx))\n const algo = resolveValue(algorithm, ctx) || 'SHA-256'\n\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const encoder = new TextEncoder()\n const data = encoder.encode(str)\n const hashBuffer = await crypto.subtle.digest(algo, data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n // Fallback for environments without crypto.subtle\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash |= 0 // Convert to 32bit integer\n }\n return String(hash)\n },\n { docs: 'Hash a value', cost: 1 }\n)\n\n// 14. Console (logging, warnings, errors)\n\n/*#\n## console.log / console.warn / console.error\n\nLogging utilities that integrate with trace and error flow.\n\n```javascript\nconsole.log(\"Debug info: \" + value) // Adds to trace\nconsole.warn(\"Potential issue\") // Adds to trace + warnings summary\nconsole.error(\"Fatal: \" + msg) // Triggers monadic error flow\n```\n\n- `log`: trace only (no side effects)\n- `warn`: trace + appears in `result.warnings`\n- `error`: stops execution, sets `result.error`\n*/\nexport const consoleLog = defineAtom(\n 'consoleLog',\n s.object({ message: s.any }),\n undefined,\n async ({ message }, ctx) => {\n const msg = resolveValue(message, ctx)\n if (ctx.trace) {\n ctx.trace.push({\n op: 'console.log',\n input: { message: msg },\n stateDiff: {},\n result: msg,\n fuelBefore: ctx.fuel.current,\n fuelAfter: ctx.fuel.current,\n timestamp: new Date().toISOString(),\n })\n }\n },\n { docs: 'Log to trace', cost: 0.1 }\n)\n\nexport const consoleWarn = defineAtom(\n 'consoleWarn',\n s.object({ message: s.any }),\n undefined,\n async ({ message }, ctx) => {\n const msg = resolveValue(message, ctx)\n const msgStr = typeof msg === 'string' ? msg : JSON.stringify(msg)\n // Add to warnings summary\n if (!ctx.warnings) ctx.warnings = []\n ctx.warnings.push(msgStr)\n // Add to trace for context\n if (ctx.trace) {\n ctx.trace.push({\n op: 'console.warn',\n input: { message: msg },\n stateDiff: {},\n result: msg,\n fuelBefore: ctx.fuel.current,\n fuelAfter: ctx.fuel.current,\n timestamp: new Date().toISOString(),\n })\n }\n },\n { docs: 'Add warning', cost: 0.1 }\n)\n\nexport const consoleError = defineAtom(\n 'consoleError',\n s.object({ message: s.any }),\n undefined,\n async ({ message }, ctx) => {\n const msg = resolveValue(message, ctx)\n const msgStr = typeof msg === 'string' ? msg : JSON.stringify(msg)\n ctx.error = new AgentError(msgStr, 'console.error')\n },\n { docs: 'Emit error and stop', cost: 0.1 }\n)\n\n// --- Stored Procedures ---\n\nexport const storeProcedure = defineAtom(\n 'storeProcedure',\n s.object({\n ast: s.any,\n ttl: s.number.optional,\n maxSize: s.number.optional,\n }),\n s.string,\n async ({ ast, ttl, maxSize }, ctx) => {\n const resolvedAst = resolveValue(ast, ctx)\n const resolvedTtl = ttl ? resolveValue(ttl, ctx) : DEFAULT_PROCEDURE_TTL\n const resolvedMaxSize = maxSize\n ? resolveValue(maxSize, ctx)\n : DEFAULT_MAX_AST_SIZE\n\n // Validate AST has an op\n if (!resolvedAst || typeof resolvedAst !== 'object' || !resolvedAst.op) {\n throw new Error('Invalid AST: must be an object with an \"op\" property')\n }\n\n // Check size\n const astJson = JSON.stringify(resolvedAst)\n if (astJson.length > resolvedMaxSize) {\n throw new Error(\n `AST too large: ${astJson.length} bytes exceeds limit of ${resolvedMaxSize} bytes. ` +\n `Consider reducing AST size or using a shorter TTL.`\n )\n }\n\n // Generate token and store\n const token = generateProcedureToken()\n const now = Date.now()\n procedureStore.set(token, {\n ast: resolvedAst,\n createdAt: now,\n expiresAt: now + resolvedTtl,\n })\n\n return token\n },\n { docs: 'Store an AST and return a token for later execution', cost: 1 }\n)\n\nexport const releaseProcedure = defineAtom(\n 'releaseProcedure',\n s.object({ token: s.string }),\n s.boolean,\n async ({ token }, ctx) => {\n const resolvedToken = resolveValue(token, ctx)\n return procedureStore.delete(resolvedToken)\n },\n { docs: 'Release a stored procedure by token', cost: 0.1 }\n)\n\nexport const clearExpiredProcedures = defineAtom(\n 'clearExpiredProcedures',\n undefined,\n s.number,\n async () => {\n const now = Date.now()\n let cleared = 0\n for (const [token, entry] of procedureStore) {\n if (now > entry.expiresAt) {\n procedureStore.delete(token)\n cleared++\n }\n }\n return cleared\n },\n { docs: 'Clear all expired procedures and return count', cost: 0.5 }\n)\n\n// --- Exports ---\n\nexport const coreAtoms = {\n seq,\n if: iff,\n while: whileLoop,\n return: ret,\n try: tryCatch,\n Error: errorAtom,\n varSet,\n constSet,\n varGet,\n varsImport,\n varsLet,\n varsExport,\n scope,\n map,\n filter,\n reduce,\n find,\n push,\n len,\n split,\n join,\n template,\n regexMatch,\n pick,\n omit,\n merge,\n keys,\n httpFetch: fetch,\n storeGet,\n storeSet,\n storeQuery,\n storeVectorSearch: vectorSearch,\n llmPredict,\n agentRun,\n transpileCode,\n runCode,\n jsonParse,\n jsonStringify,\n xmlParse,\n memoize,\n cache,\n random,\n uuid,\n hash,\n consoleLog,\n consoleWarn,\n consoleError,\n storeProcedure,\n releaseProcedure,\n clearExpiredProcedures,\n}\n", "import { coreAtoms, type Atom, type OpCode, type ExprNode } from './runtime'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype _AtomMap = typeof coreAtoms\n\n// --- Condition String Parser ---\n\n/**\n * Parse a simple condition string into an ExprNode.\n * Supports: identifiers, member access, binary/logical ops, literals\n * Uses the vars map to know which identifiers are state references.\n *\n * Unsupported syntax (will throw):\n * - Ternary: a ? b : c (use nested if atoms instead)\n * - Array index: a[0] (use ExprNode with computed member access)\n * - Function calls: fn(x) (use atoms)\n */\n// Reserved words that shouldn't be treated as variable references\nconst RESERVED_WORDS = new Set([\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'and',\n 'or',\n 'not', // sometimes used as aliases\n])\n\n/**\n * VarMapping maps condition variable names to state paths.\n * Keys are variable names used in the condition string,\n * values are state paths (e.g., { count: 'counter.value' }).\n */\ntype VarMapping = Record<string, string>\n\n/**\n * ItemsRef is a reference to an array in state (string path)\n * or a literal array value for iteration atoms.\n */\ntype ItemsRef = string | unknown[]\n\n/**\n * Warn if condition references identifiers not present in vars mapping.\n * This helps catch common mistakes when using the Builder API.\n */\nfunction warnMissingVars(condition: string, vars: VarMapping): void {\n // Remove string literals before scanning for identifiers\n const withoutStrings = condition\n .replace(/\"[^\"]*\"/g, '\"\"')\n .replace(/'[^']*'/g, \"''\")\n\n // Extract root identifiers only (not property accesses like obj.prop)\n // Match identifiers that are NOT preceded by a dot\n const identifiers: string[] = []\n const regex = /(?<![.])\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b/g\n let match\n while ((match = regex.exec(withoutStrings)) !== null) {\n identifiers.push(match[1])\n }\n const uniqueIds = [...new Set(identifiers)]\n\n const missing = uniqueIds.filter(\n (id) =>\n !RESERVED_WORDS.has(id) &&\n !(id in vars) &&\n // Ignore if it looks like a method call (followed by '(')\n !new RegExp(`\\\\b${id}\\\\s*\\\\(`).test(withoutStrings)\n )\n\n if (missing.length > 0) {\n console.warn(\n `[Agent99 Builder] Condition \"${condition}\" references variables not in vars mapping: ${missing.join(\n ', '\n )}. ` +\n `Add them to vars or use AsyncJS syntax (ajs\\`...\\`) which handles this automatically.`\n )\n }\n}\n\nfunction parseCondition(\n condition: string,\n vars: Record<string, any>\n): ExprNode {\n // Warn about potential missing variable mappings\n warnMissingVars(condition, vars)\n\n const tokens = tokenize(condition)\n const result = parseExpression(tokens, 0, vars)\n\n // Error if there are unconsumed tokens - indicates unsupported syntax\n if (result.pos < tokens.length) {\n const remaining = tokens.slice(result.pos).join(' ')\n throw new Error(\n `Unsupported condition syntax near '${remaining}' in: ${condition}\\n` +\n `Supported: comparisons, &&, ||, !, arithmetic, member access (a.b), literals`\n )\n }\n\n return result.node\n}\n\nfunction tokenize(expr: string): string[] {\n const tokens: string[] = []\n let i = 0\n while (i < expr.length) {\n // Skip whitespace\n while (i < expr.length && /\\s/.test(expr[i])) i++\n if (i >= expr.length) break\n\n // String literals (single or double quotes)\n if (expr[i] === '\"' || expr[i] === \"'\") {\n const quote = expr[i++]\n let str = ''\n while (i < expr.length && expr[i] !== quote) {\n if (expr[i] === '\\\\' && i + 1 < expr.length) {\n i++ // skip backslash\n str += expr[i++]\n } else {\n str += expr[i++]\n }\n }\n i++ // skip closing quote\n tokens.push(JSON.stringify(str)) // Store as JSON string for later parsing\n continue\n }\n\n // Multi-char operators\n if (expr.slice(i, i + 2).match(/^(&&|\\|\\||==|!=|>=|<=)$/)) {\n tokens.push(expr.slice(i, i + 2))\n i += 2\n continue\n }\n\n // Single-char operators (includes unsupported ?:[] for error reporting)\n if ('+-*/%><!().?:[]'.includes(expr[i])) {\n tokens.push(expr[i])\n i++\n continue\n }\n\n // Numbers\n if (/\\d/.test(expr[i])) {\n let num = ''\n while (i < expr.length && /[\\d.]/.test(expr[i])) {\n num += expr[i++]\n }\n tokens.push(num)\n continue\n }\n\n // Identifiers\n if (/[a-zA-Z_]/.test(expr[i])) {\n let id = ''\n while (i < expr.length && /[a-zA-Z0-9_]/.test(expr[i])) {\n id += expr[i++]\n }\n tokens.push(id)\n continue\n }\n\n i++\n }\n return tokens\n}\n\nfunction parseExpression(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n return parseLogicalOr(tokens, pos, vars)\n}\n\nfunction parseLogicalOr(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseLogicalAnd(tokens, pos, vars)\n\n while (tokens[newPos] === '||') {\n newPos++\n const { node: right, pos: rightPos } = parseLogicalAnd(tokens, newPos, vars)\n left = { $expr: 'logical', op: '||', left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseLogicalAnd(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseComparison(tokens, pos, vars)\n\n while (tokens[newPos] === '&&') {\n newPos++\n const { node: right, pos: rightPos } = parseComparison(tokens, newPos, vars)\n left = { $expr: 'logical', op: '&&', left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseComparison(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseAdditive(tokens, pos, vars)\n\n const compOps = ['==', '!=', '>', '<', '>=', '<=']\n while (compOps.includes(tokens[newPos])) {\n const op = tokens[newPos++]\n const { node: right, pos: rightPos } = parseAdditive(tokens, newPos, vars)\n left = { $expr: 'binary', op, left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseAdditive(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseMultiplicative(tokens, pos, vars)\n\n while (tokens[newPos] === '+' || tokens[newPos] === '-') {\n const op = tokens[newPos++]\n const { node: right, pos: rightPos } = parseMultiplicative(\n tokens,\n newPos,\n vars\n )\n left = { $expr: 'binary', op, left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseMultiplicative(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseUnary(tokens, pos, vars)\n\n while (\n tokens[newPos] === '*' ||\n tokens[newPos] === '/' ||\n tokens[newPos] === '%'\n ) {\n const op = tokens[newPos++]\n const { node: right, pos: rightPos } = parseUnary(tokens, newPos, vars)\n left = { $expr: 'binary', op, left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseUnary(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n if (tokens[pos] === '!' || tokens[pos] === '-') {\n const op = tokens[pos++]\n const { node: argument, pos: newPos } = parseUnary(tokens, pos, vars)\n return { node: { $expr: 'unary', op, argument }, pos: newPos }\n }\n return parsePrimary(tokens, pos, vars)\n}\n\nfunction parsePrimary(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n const token = tokens[pos]\n\n // Parenthesized expression\n if (token === '(') {\n const { node, pos: newPos } = parseExpression(tokens, pos + 1, vars)\n // Skip closing paren\n return { node, pos: newPos + 1 }\n }\n\n // String literal (stored as JSON)\n if (token && token.startsWith('\"')) {\n return {\n node: { $expr: 'literal', value: JSON.parse(token) },\n pos: pos + 1,\n }\n }\n\n // Number literal\n if (token && /^\\d/.test(token)) {\n return {\n node: { $expr: 'literal', value: parseFloat(token) },\n pos: pos + 1,\n }\n }\n\n // Boolean/null literals\n if (token === 'true')\n return { node: { $expr: 'literal', value: true }, pos: pos + 1 }\n if (token === 'false')\n return { node: { $expr: 'literal', value: false }, pos: pos + 1 }\n if (token === 'null')\n return { node: { $expr: 'literal', value: null }, pos: pos + 1 }\n\n // Identifier (possibly with member access via dots in vars)\n if (token && /^[a-zA-Z_]/.test(token)) {\n // Check if this identifier is in vars - if so, it's a state reference\n let node: ExprNode = { $expr: 'ident', name: token }\n let newPos = pos + 1\n\n // Handle member access (token.prop.subprop)\n while (tokens[newPos] === '.') {\n newPos++ // skip dot\n const prop = tokens[newPos++]\n node = { $expr: 'member', object: node, property: prop }\n }\n\n return { node, pos: newPos }\n }\n\n // Fallback - shouldn't happen\n return { node: { $expr: 'literal', value: null }, pos: pos + 1 }\n}\n\n// --- AST Types ---\n\nexport interface BaseNode {\n op: OpCode\n [key: string]: any\n}\n\nexport interface SeqNode extends BaseNode {\n op: 'seq'\n steps: BaseNode[]\n}\n\n// --- Helpers ---\n\nexport interface ArgRef {\n $kind: 'arg'\n path: string\n}\n\n// --- Typed Builder ---\n\n// Helper to extract input type from Atom definition\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype AtomInput<T> = T extends Atom<infer I, any> ? I : never\n\n// The Builder instance type with dynamic methods inferred from AtomMap\ntype BuilderMethods<M extends Record<string, Atom<any, any>>> = {\n [K in keyof M as M[K]['op']]: (input: AtomInput<M[K]>) => BuilderType<M>\n}\n\n// Control Flow Extensions (Custom signatures)\ninterface ControlFlow<M extends Record<string, Atom<any, any>>> {\n varsImport(keys: string[] | Record<string, string>): BuilderType<M>\n varsExport(keys: string[] | Record<string, string>): BuilderType<M>\n\n /**\n * Conditional branch. Condition is a JS-like expression string.\n * @param condition - Expression like \"count > 0 && active\"\n * @param vars - Map condition vars to state paths: { count: 'state.count' }\n * @param thenBranch - Steps to run if condition is true\n * @param elseBranch - Optional steps if condition is false\n */\n if(\n condition: string,\n vars: VarMapping,\n thenBranch: (b: BuilderType<M>) => BuilderType<M>,\n elseBranch?: (b: BuilderType<M>) => BuilderType<M>\n ): BuilderType<M>\n\n /**\n * Loop while condition is true.\n * @param condition - Expression like \"count < 10\"\n * @param vars - Map condition vars to state paths\n * @param body - Steps to run each iteration\n */\n while(\n condition: string,\n vars: VarMapping,\n body: (b: BuilderType<M>) => BuilderType<M>\n ): BuilderType<M>\n\n scope(steps: (b: BuilderType<M>) => BuilderType<M>): BuilderType<M>\n\n /**\n * Transform each item in array.\n * @param items - State path to array or literal array\n * @param as - Variable name for current item in scope\n * @param steps - Transform steps (result is new item value)\n */\n map(\n items: ItemsRef,\n as: string,\n steps: (b: BuilderType<M>) => BuilderType<M>\n ): BuilderType<M>\n\n /**\n * Filter array to items matching condition.\n * @param items - State path to array or literal array\n * @param as - Variable name for current item\n * @param condition - Filter expression using 'as' variable\n * @param vars - Additional var mappings (optional)\n */\n filter(\n items: ItemsRef,\n as: string,\n condition: string,\n vars?: VarMapping\n ): BuilderType<M>\n\n /**\n * Find first item matching condition.\n * @param items - State path to array or literal array\n * @param as - Variable name for current item\n * @param condition - Search expression\n * @param vars - Additional var mappings (optional)\n */\n find(\n items: ItemsRef,\n as: string,\n condition: string,\n vars?: VarMapping\n ): BuilderType<M>\n\n /**\n * Reduce array to single value.\n * @param items - State path to array or literal array\n * @param as - Variable name for current item\n * @param accumulator - Variable name for running result\n * @param initial - Initial accumulator value\n * @param steps - Reduction steps (result becomes new accumulator)\n */\n reduce<T>(\n items: ItemsRef,\n as: string,\n accumulator: string,\n initial: T,\n steps: (b: BuilderType<M>) => BuilderType<M>\n ): BuilderType<M>\n\n memoize(\n steps: (b: BuilderType<M>) => BuilderType<M>,\n key?: string\n ): BuilderType<M>\n\n cache(\n steps: (b: BuilderType<M>) => BuilderType<M>,\n key?: string,\n ttlMs?: number\n ): BuilderType<M>\n\n try(branches: {\n try: (b: BuilderType<M>) => BuilderType<M>\n catch?: (b: BuilderType<M>) => BuilderType<M>\n }): BuilderType<M>\n}\n\nexport class TypedBuilder<M extends Record<string, Atom<any, any>>> {\n public steps: BaseNode[] = []\n private atoms: M\n private proxy: any\n\n constructor(atoms: M) {\n this.atoms = atoms\n\n // Proxy to handle dynamic atom calls\n this.proxy = new Proxy(this, {\n get: (target, prop: string | symbol, receiver) => {\n // 1. Check for class methods (as, step, toJSON, etc.)\n if (prop in target) return (target as any)[prop]\n\n // 2. Dynamic atom methods\n if (typeof prop === 'string' && prop in target.atoms) {\n return (input: any) => {\n const atom = target.atoms[prop]\n target.add(atom.create(input))\n return receiver\n }\n }\n\n return undefined\n },\n })\n\n return this.proxy\n }\n\n private add(step: BaseNode): BuilderType<M> {\n this.steps.push(step)\n return this.proxy\n }\n\n // --- Core Fluent API ---\n\n as(variableName: string): BuilderType<M> {\n if (this.steps.length === 0) throw new Error('No step to capture')\n const last = this.steps[this.steps.length - 1]\n last.result = variableName\n return this.proxy\n }\n\n step(node: BaseNode): BuilderType<M> {\n return this.add(node)\n }\n\n return(schema: any): BuilderType<M> {\n const atom = this.atoms['return']\n if (!atom) throw new Error(\"Atom 'return' not found\")\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _schema = schema.schema ?? schema\n return this.add(atom.create({ schema: _schema }))\n }\n\n toJSON(): SeqNode {\n return {\n op: 'seq',\n steps: [...this.steps],\n }\n }\n\n // --- Custom Overloads ---\n\n varsImport(keys: string[] | Record<string, string>) {\n return this.add(this.atoms['varsImport'].create({ keys }))\n }\n\n varsExport(keys: string[] | Record<string, string>) {\n return this.add(this.atoms['varsExport'].create({ keys }))\n }\n\n // --- Control Flow Helpers ---\n\n if(\n condition: string,\n vars: VarMapping,\n thenBranch: (b: BuilderType<M>) => BuilderType<M>,\n elseBranch?: (b: BuilderType<M>) => BuilderType<M>\n ) {\n const thenB = new TypedBuilder(this.atoms)\n thenBranch(thenB as any)\n\n let elseSteps\n if (elseBranch) {\n const elseB = new TypedBuilder(this.atoms)\n elseBranch(elseB as any)\n elseSteps = elseB.steps\n }\n\n // Parse condition string into ExprNode\n const conditionExpr = parseCondition(condition, vars)\n\n const ifAtom = this.atoms['if']\n return this.add(\n ifAtom.create({\n condition: conditionExpr,\n then: thenB.steps,\n else: elseSteps,\n })\n )\n }\n\n while(\n condition: string,\n vars: VarMapping,\n body: (b: BuilderType<M>) => BuilderType<M>\n ) {\n const bodyB = new TypedBuilder(this.atoms)\n body(bodyB as any)\n\n // Parse condition string into ExprNode\n const conditionExpr = parseCondition(condition, vars)\n\n const whileAtom = this.atoms['while']\n return this.add(\n whileAtom.create({\n condition: conditionExpr,\n body: bodyB.steps,\n })\n )\n }\n\n scope(steps: (b: BuilderType<M>) => BuilderType<M>) {\n const scopeB = new TypedBuilder(this.atoms)\n steps(scopeB as any)\n const scopeAtom = this.atoms['scope']\n return this.add(\n scopeAtom.create({\n steps: scopeB.steps,\n })\n )\n }\n\n map(\n items: ItemsRef,\n as: string,\n steps: (b: BuilderType<M>) => BuilderType<M>\n ) {\n const stepsB = new TypedBuilder(this.atoms)\n steps(stepsB as any)\n const mapAtom = this.atoms['map']\n return this.add(\n mapAtom.create({\n items,\n as,\n steps: stepsB.steps,\n })\n )\n }\n\n filter(\n items: ItemsRef,\n as: string,\n condition: string,\n vars: VarMapping = {}\n ) {\n const conditionExpr = parseCondition(condition, vars)\n const filterAtom = this.atoms['filter']\n return this.add(\n filterAtom.create({\n items,\n as,\n condition: conditionExpr,\n })\n )\n }\n\n find(items: ItemsRef, as: string, condition: string, vars: VarMapping = {}) {\n const conditionExpr = parseCondition(condition, vars)\n const findAtom = this.atoms['find']\n return this.add(\n findAtom.create({\n items,\n as,\n condition: conditionExpr,\n })\n )\n }\n\n reduce<T>(\n items: ItemsRef,\n as: string,\n accumulator: string,\n initial: T,\n steps: (b: BuilderType<M>) => BuilderType<M>\n ) {\n const stepsB = new TypedBuilder(this.atoms)\n steps(stepsB as any)\n const reduceAtom = this.atoms['reduce']\n return this.add(\n reduceAtom.create({\n items,\n as,\n accumulator,\n initial,\n steps: stepsB.steps,\n })\n )\n }\n\n memoize(steps: (b: BuilderType<M>) => BuilderType<M>, key?: string) {\n const stepsB = new TypedBuilder(this.atoms)\n steps(stepsB as any)\n const memoAtom = this.atoms['memoize']\n return this.add(\n memoAtom.create({\n key,\n steps: stepsB.steps,\n })\n )\n }\n\n cache(\n steps: (b: BuilderType<M>) => BuilderType<M>,\n key?: string,\n ttlMs?: number\n ) {\n const stepsB = new TypedBuilder(this.atoms)\n steps(stepsB as any)\n const cacheAtom = this.atoms['cache']\n return this.add(\n cacheAtom.create({\n key,\n steps: stepsB.steps,\n ttlMs,\n })\n )\n }\n\n try(branches: {\n try: (b: BuilderType<M>) => BuilderType<M>\n catch?: (b: BuilderType<M>) => BuilderType<M>\n }) {\n const tryB = new TypedBuilder(this.atoms)\n branches.try(tryB as any)\n\n let catchSteps\n if (branches.catch) {\n const catchB = new TypedBuilder(this.atoms)\n branches.catch(catchB as any)\n catchSteps = catchB.steps\n }\n\n const tryAtom = this.atoms['try']\n return this.add(\n tryAtom.create({\n try: tryB.steps,\n catch: catchSteps,\n })\n )\n }\n}\n\n// Combine dynamic atom methods with class methods\nexport type BuilderType<M extends Record<string, Atom<any, any>>> =\n TypedBuilder<M> & BuilderMethods<M> & ControlFlow<M>\n\n// --- API Surface ---\n\nexport const Agent = {\n // Create a builder with default core atoms\n take(_schema?: any): BuilderType<typeof coreAtoms> {\n return new TypedBuilder(coreAtoms) as any\n },\n\n // Create a customized builder\n custom<M extends Record<string, Atom<any, any>>>(atoms: M): BuilderType<M> {\n return new TypedBuilder(atoms) as any\n },\n\n args(path: string): ArgRef {\n return { $kind: 'arg', path }\n },\n\n val(path: string): string {\n return path\n },\n}\n\n/** @deprecated Use `Agent` instead */\nexport const A99 = Agent\n", "import {\n type Atom,\n type Capabilities,\n type RunResult,\n type RuntimeContext,\n type CostOverride,\n coreAtoms,\n AgentError,\n isProcedureToken,\n resolveProcedureToken,\n} from './runtime'\nimport { TypedBuilder, type BaseNode, type BuilderType } from '../builder'\nimport { validate } from 'tosijs-schema'\nimport { transpile } from '../lang/core'\n\n/** Default timeout multiplier: milliseconds per fuel unit */\nconst FUEL_TO_MS = 10 // 1000 fuel = 10 seconds\n\nexport class AgentVM<M extends Record<string, Atom<any, any>>> {\n readonly atoms: typeof coreAtoms & M\n\n constructor(customAtoms: M = {} as M) {\n this.atoms = { ...coreAtoms, ...customAtoms }\n }\n\n get builder(): BuilderType<typeof coreAtoms & M> {\n return new TypedBuilder(this.atoms) as any\n }\n\n // Typed helper for builder\n get Agent(): BuilderType<typeof coreAtoms & M> {\n return new TypedBuilder(this.atoms) as any\n }\n\n /** @deprecated Use `Agent` instead */\n get A99(): BuilderType<typeof coreAtoms & M> {\n return this.Agent\n }\n\n resolve(op: string) {\n return this.atoms[op]\n }\n\n getTools(filter: 'flow' | 'all' | string[] = 'all') {\n let targetAtoms = Object.values(this.atoms)\n\n if (Array.isArray(filter)) {\n targetAtoms = targetAtoms.filter((a) => filter.includes(a.op))\n } else if (filter === 'flow') {\n const flowOps = [\n 'seq',\n 'if',\n 'while',\n 'return',\n 'try',\n 'varSet',\n 'varGet',\n 'scope',\n ]\n targetAtoms = targetAtoms.filter((a) => flowOps.includes(a.op))\n }\n\n return targetAtoms.map((atom) => ({\n type: 'function',\n function: {\n name: atom.op,\n description: atom.docs,\n parameters: atom.inputSchema?.schema ?? {},\n },\n }))\n }\n\n async run(\n astOrToken: BaseNode | string,\n args: Record<string, any> = {},\n options: {\n fuel?: number\n capabilities?: Capabilities\n trace?: boolean\n timeoutMs?: number // Override automatic timeout (fuel * FUEL_TO_MS)\n signal?: AbortSignal // External abort signal (e.g., from caller)\n costOverrides?: Record<string, CostOverride> // Per-atom fuel cost overrides\n context?: Record<string, any> // Request-scoped metadata (auth, permissions, etc.)\n } = {}\n ): Promise<RunResult> {\n // Resolve string input to AST\n let ast: BaseNode\n if (typeof astOrToken === 'string') {\n if (isProcedureToken(astOrToken)) {\n // Procedure token - lookup stored AST\n ast = resolveProcedureToken(astOrToken) as BaseNode\n } else {\n // AJS source code - transpile to AST\n try {\n ast = transpile(astOrToken).ast as BaseNode\n } catch (e: any) {\n throw new Error(`AJS transpilation failed: ${e.message}`)\n }\n }\n } else {\n ast = astOrToken\n }\n\n const startFuel = options.fuel ?? 1000\n\n // Calculate timeout from fuel budget (generous: 10ms per fuel unit)\n // Can be overridden with explicit timeoutMs option\n const timeoutMs = options.timeoutMs ?? startFuel * FUEL_TO_MS\n\n // Default Capabilities\n const capabilities = options.capabilities ?? {}\n\n // Track warnings\n const warnings: string[] = []\n\n // Default In-Memory Store if none provided (with warning)\n if (!capabilities.store) {\n const memoryStore = new Map<string, any>()\n let warned = false\n capabilities.store = {\n get: async (key) => {\n if (!warned) {\n warned = true\n warnings.push(\n 'Using default in-memory store (not suitable for production)'\n )\n }\n return memoryStore.get(key)\n },\n set: async (key, value) => {\n if (!warned) {\n warned = true\n warnings.push(\n 'Using default in-memory store (not suitable for production)'\n )\n }\n memoryStore.set(key, value)\n },\n }\n }\n\n // Create abort controller for timeout enforcement\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), timeoutMs)\n\n // Link external signal if provided\n if (options.signal) {\n options.signal.addEventListener('abort', () => controller.abort())\n }\n\n const ctx: RuntimeContext = {\n fuel: { current: startFuel },\n args,\n state: {},\n consts: new Set(),\n capabilities,\n resolver: (op) => this.resolve(op),\n output: undefined,\n signal: controller.signal,\n costOverrides: options.costOverrides,\n context: options.context,\n warnings, // Shared warnings array\n }\n\n if (options.trace) {\n ctx.trace = []\n }\n\n if (ast.op !== 'seq')\n throw new Error(\n \"Root AST must be 'seq'. Ensure you're passing a transpiled agent (use ajs`...` or transpile()).\"\n )\n\n // Input validation: validate args against the agent's input schema\n const inputSchema = (ast as any).inputSchema\n if (inputSchema && !validate(args, inputSchema)) {\n const error = new AgentError(\n `Input validation failed: args do not match expected schema`,\n 'vm.run'\n )\n return {\n result: error,\n error,\n fuelUsed: 0,\n trace: ctx.trace,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n }\n\n try {\n // Race execution against timeout\n await Promise.race([\n this.resolve('seq')?.exec(ast, ctx),\n new Promise<never>((_, reject) => {\n controller.signal.addEventListener('abort', () => {\n reject(\n new Error(\n `Execution timeout after ${timeoutMs}ms (fuel: ${startFuel}). Consider increasing fuel or optimizing your agent.`\n )\n )\n })\n // If already aborted, reject immediately\n if (controller.signal.aborted) {\n reject(\n new Error(\n `Execution timeout after ${timeoutMs}ms (fuel: ${startFuel}). Consider increasing fuel or optimizing your agent.`\n )\n )\n }\n }),\n ])\n } catch (e: any) {\n // Convert timeout error to AgentError\n if (\n e.message?.includes('timeout') ||\n e.message?.includes('aborted') ||\n controller.signal.aborted\n ) {\n ctx.error = new AgentError(\n `Execution timeout after ${timeoutMs}ms (fuel: ${startFuel}). Consider increasing fuel or optimizing your agent.`,\n 'vm.run'\n )\n } else {\n // Re-throw non-timeout errors\n throw e\n }\n } finally {\n clearTimeout(timeout)\n }\n\n // If there's an error but no output was set, set the error as output\n if (ctx.error && ctx.output === undefined) {\n ctx.output = ctx.error\n }\n\n // Merge any warnings added via console.warn\n const allWarnings = [...warnings, ...(ctx.warnings ?? [])]\n\n return {\n result: ctx.output,\n error: ctx.error,\n fuelUsed: startFuel - ctx.fuel.current,\n trace: ctx.trace,\n warnings: allWarnings.length > 0 ? allWarnings : undefined,\n }\n }\n}\n", "/**\n * TJS Parser \u2014 Orchestration Layer\n *\n * This module contains the main entry points: preprocess() and parse().\n * Transform functions are in parser-transforms.ts, param processing in parser-params.ts.\n */\n\nimport * as acorn from 'acorn'\nimport type { Program, FunctionDeclaration } from 'acorn'\nimport { SyntaxError } from './types'\n\n// Re-export types so external callers don't need to change imports\nexport type {\n ParseOptions,\n WasmBlock,\n TestBlock,\n PreprocessOptions,\n TjsModes,\n} from './parser-types'\n\nimport type {\n ParseOptions,\n WasmBlock,\n TestBlock,\n PreprocessOptions,\n TjsModes,\n} from './parser-types'\n\nimport { transformParenExpressions } from './parser-params'\n\nimport {\n transformTryWithoutCatch,\n extractWasmBlocks,\n transformIsOperators,\n insertAsiProtection,\n transformEqualityToStructural,\n transformTypeDeclarations,\n transformGenericDeclarations,\n transformFunctionPredicateDeclarations,\n transformUnionDeclarations,\n transformEnumDeclarations,\n transformExtendDeclarations,\n transformPolymorphicFunctions,\n transformPolymorphicConstructors,\n wrapClassDeclarations,\n transformBareAssignments,\n extractAndRunTests,\n validateNoDate,\n validateNoEval,\n validateNoVar,\n transformConstBang,\n transformBangAccess,\n transformExtensionCalls,\n} from './parser-transforms'\n\n// Re-export transformExtensionCalls for js.ts\nexport { transformExtensionCalls } from './parser-transforms'\n\nexport function preprocess(\n source: string,\n options: PreprocessOptions = {}\n): {\n source: string\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n moduleSafety?: 'none' | 'inputs' | 'all'\n tjsModes: TjsModes\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n wasmBlocks: WasmBlock[]\n tests: TestBlock[]\n testErrors: string[]\n polymorphicNames: Set<string>\n extensions: Map<string, Set<string>>\n} {\n const originalSource = source\n let moduleSafety: 'none' | 'inputs' | 'all' | undefined\n const requiredParams = new Set<string>()\n const unsafeFunctions = new Set<string>()\n const safeFunctions = new Set<string>()\n\n // Detect whether this source was emitted by fromTS (TS-originated)\n // The /* tjs <- filename */ annotation is the signal\n const isFromTS = /\\/\\*\\s*tjs\\s*<-\\s*\\S+\\s*\\*\\//.test(source)\n\n // Native TJS: all modes ON by default (TJS is its own language)\n // TS-originated or VM target (AJS): all modes OFF, safety none (JS-compatible)\n const isCompat = isFromTS || options.vmTarget\n const tjsModes: TjsModes = isCompat\n ? {\n tjsEquals: false,\n tjsClass: false,\n tjsDate: false,\n tjsNoeval: false,\n tjsStandard: false,\n tjsSafeEval: false,\n tjsNoVar: false,\n }\n : {\n tjsEquals: true,\n tjsClass: true,\n tjsDate: true,\n tjsNoeval: true,\n tjsStandard: true,\n tjsSafeEval: false, // opt-in only (adds import)\n tjsNoVar: true,\n }\n\n // Safety: native TJS defaults to 'inputs' (runtime default),\n // TS-originated and VM targets default to 'none'\n if (isCompat) {\n moduleSafety = 'none'\n }\n\n // Handle module-level safety directive: safety none | safety inputs | safety all\n // Must be at the start of the file (possibly after comments/whitespace)\n // Explicit directive always overrides the default\n const safetyMatch = source.match(\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*safety\\s+(none|inputs|all)\\b/\n )\n if (safetyMatch) {\n moduleSafety = safetyMatch[2] as 'none' | 'inputs' | 'all'\n // Remove the directive from source\n source = source.replace(\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*safety\\s+(none|inputs|all)\\s*/,\n '$1'\n )\n }\n\n // Handle TJS mode directives (can appear in any order after safety)\n // TjsStrict enables all TJS modes (useful for TS-originated code opting in)\n // TjsCompat disables all TJS modes (useful for native TJS opting out)\n // Individual modes: TjsEquals, TjsClass, TjsDate, TjsNoeval, TjsStandard, TjsSafeEval\n const directivePattern =\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*(TjsStrict|TjsCompat|TjsEquals|TjsClass|TjsDate|TjsNoeval|TjsNoVar|TjsStandard|TjsSafeEval)\\b/\n\n let match\n while ((match = source.match(directivePattern))) {\n const directive = match[2]\n\n if (directive === 'TjsStrict') {\n // Enable all TJS modes\n tjsModes.tjsEquals = true\n tjsModes.tjsClass = true\n tjsModes.tjsDate = true\n tjsModes.tjsNoeval = true\n tjsModes.tjsNoVar = true\n tjsModes.tjsStandard = true\n } else if (directive === 'TjsCompat') {\n // Disable all TJS modes (JS-compatible)\n tjsModes.tjsEquals = false\n tjsModes.tjsClass = false\n tjsModes.tjsDate = false\n tjsModes.tjsNoeval = false\n tjsModes.tjsNoVar = false\n tjsModes.tjsStandard = false\n tjsModes.tjsSafeEval = false\n } else if (directive === 'TjsEquals') {\n tjsModes.tjsEquals = true\n } else if (directive === 'TjsClass') {\n tjsModes.tjsClass = true\n } else if (directive === 'TjsDate') {\n tjsModes.tjsDate = true\n } else if (directive === 'TjsNoeval') {\n tjsModes.tjsNoeval = true\n } else if (directive === 'TjsNoVar') {\n tjsModes.tjsNoVar = true\n } else if (directive === 'TjsStandard') {\n tjsModes.tjsStandard = true\n } else if (directive === 'TjsSafeEval') {\n tjsModes.tjsSafeEval = true\n }\n\n // Remove the directive from source\n source = source.replace(\n new RegExp(\n `^(\\\\s*(?:\\\\/\\\\/[^\\\\n]*\\\\n|\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/\\\\s*)*)\\\\s*${directive}\\\\s*`\n ),\n '$1'\n )\n }\n\n // TjsStandard mode: insert semicolons to prevent ASI footguns\n // Must happen early before other transformations modify line structure\n if (tjsModes.tjsStandard) {\n source = insertAsiProtection(source)\n }\n\n // Transform const! declarations \u2014 validate immutability and emit as const\n // Must happen before acorn parsing since const! is not valid JS\n source = transformConstBang(source)\n\n // Transform !. bang access to __tjs.bang() calls\n // Must happen before acorn parsing since !. is not valid JS\n source = transformBangAccess(source)\n\n // Transform Is/IsNot infix operators to function calls\n // a Is b -> Is(a, b)\n // a IsNot b -> IsNot(a, b)\n // These are always available for explicit structural equality\n source = transformIsOperators(source)\n\n // Transform == and != to structural equality (Is/IsNot)\n // Only when TjsEquals mode is enabled and not for VM targets\n // VM targets already handle == correctly at runtime\n if (tjsModes.tjsEquals && !options.vmTarget) {\n source = transformEqualityToStructural(source)\n }\n\n // Transform Type, Generic, Union, and Enum declarations\n // Type Foo { ... } -> const Foo = Type(...)\n // Generic Bar<T, U> { ... } -> const Bar = Generic(...)\n // Union Dir 'up' | 'down' -> const Dir = Union(...)\n // Enum Status { Pending, Active, Done } -> const Status = Enum(...)\n source = transformTypeDeclarations(source)\n source = transformGenericDeclarations(source)\n source = transformFunctionPredicateDeclarations(source)\n source = transformUnionDeclarations(source)\n source = transformEnumDeclarations(source)\n\n // Transform bare assignments to const declarations\n // Foo = ... -> const Foo = ...\n source = transformBareAssignments(source)\n\n // Unified paren expression transformer\n // Handles: function params, arrow params, return types, safe/unsafe markers\n // Model: open paren can be ( or (? or (!, close can be ) or )-> or )-? or )-!\n const {\n source: transformedSource,\n returnType,\n returnSafety,\n } = transformParenExpressions(source, {\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n })\n source = transformedSource\n\n // NOTE: unsafe {} blocks removed - they provided no performance benefit because\n // the wrapper decision is made at transpile time. Use (!) on functions instead.\n // See ideas parking lot for potential future approaches.\n\n // Transform extend blocks: extend TypeName { methods } -> __ext_TypeName object\n // Must happen after paren expressions so method params are already transformed\n const extResult = transformExtendDeclarations(source)\n source = extResult.source\n\n // Handle try-without-catch: try { ... } (no catch/finally) -> monadic error handling\n // This is the idiomatic TJS way to convert exceptions to AgentError\n source = transformTryWithoutCatch(source)\n\n // Transform polymorphic functions: multiple declarations with same name -> dispatcher\n // Must happen after param transformation but before class wrapping and test extraction\n const polyResult = transformPolymorphicFunctions(source, requiredParams)\n source = polyResult.source\n\n // Extract WASM blocks: wasm(args) { ... } fallback { ... }\n const wasmBlocks = extractWasmBlocks(source)\n source = wasmBlocks.source\n\n // Extract and run test blocks: test 'desc'? { body }\n // Tests run at transpile time and are stripped from output\n const testResult = extractAndRunTests(source, options.dangerouslySkipTests)\n source = testResult.source\n\n // Transform polymorphic constructors: multiple constructor() -> factory functions\n // Must happen before wrapClassDeclarations (which needs to know about poly ctors)\n const polyCtorResult = transformPolymorphicConstructors(\n source,\n requiredParams\n )\n source = polyCtorResult.source\n\n // Mark $dispatch functions as unsafe (internal Proxy trap params, not user-facing)\n for (const cls of polyCtorResult.polyCtorClasses) {\n unsafeFunctions.add(`${cls}$dispatch`)\n }\n\n // Wrap class declarations to make them callable without `new`\n // Only when TjsClass mode is enabled\n // class Foo { } -> let Foo = class Foo { }; Foo = globalThis.__tjs?.wrapClass?.(Foo) ?? Foo;\n if (tjsModes.tjsClass) {\n source = wrapClassDeclarations(source, polyCtorResult.polyCtorClasses)\n }\n\n // Validate TjsDate mode - check for Date usage\n if (tjsModes.tjsDate) {\n source = validateNoDate(source)\n }\n\n // Validate TjsNoeval mode - check for eval/Function usage\n if (tjsModes.tjsNoeval) {\n source = validateNoEval(source)\n }\n\n // Validate TjsNoVar mode - check for var declarations\n if (tjsModes.tjsNoVar) {\n source = validateNoVar(source)\n }\n\n // Rewrite extension method calls on known-type receivers\n // Must happen after all other transforms so literals are in final form\n source = transformExtensionCalls(source, extResult.extensions)\n\n return {\n source,\n returnType,\n returnSafety,\n moduleSafety,\n tjsModes,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks: wasmBlocks.blocks,\n tests: testResult.tests,\n testErrors: testResult.errors,\n polymorphicNames: polyResult.polymorphicNames,\n extensions: extResult.extensions,\n }\n}\n\n/**\n * Parse source code into an Acorn AST\n */\nexport function parse(\n source: string,\n options: ParseOptions = {}\n): {\n ast: Program\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n moduleSafety?: 'none' | 'inputs' | 'all'\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n wasmBlocks: WasmBlock[]\n tests: TestBlock[]\n testErrors: string[]\n} {\n const {\n filename = '<source>',\n colonShorthand = true,\n vmTarget = false,\n } = options\n\n // Preprocess for custom syntax\n const {\n source: processedSource,\n returnType,\n returnSafety,\n moduleSafety,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks,\n tests,\n testErrors,\n } = colonShorthand\n ? preprocess(source, { vmTarget })\n : {\n source,\n returnType: undefined,\n returnSafety: undefined,\n moduleSafety: undefined,\n originalSource: source,\n requiredParams: new Set<string>(),\n unsafeFunctions: new Set<string>(),\n safeFunctions: new Set<string>(),\n wasmBlocks: [] as WasmBlock[],\n tests: [] as TestBlock[],\n testErrors: [] as string[],\n }\n\n try {\n const ast = acorn.parse(processedSource, {\n ecmaVersion: 2022,\n sourceType: 'module',\n locations: true,\n allowReturnOutsideFunction: false,\n })\n\n return {\n ast,\n returnType,\n returnSafety,\n moduleSafety,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks,\n tests,\n testErrors,\n }\n } catch (e: any) {\n // Convert Acorn error to our error type\n const loc = e.loc || { line: 1, column: 0 }\n throw new SyntaxError(\n e.message.replace(/\\s*\\(\\d+:\\d+\\)$/, ''), // Remove acorn's location suffix\n loc,\n originalSource,\n filename\n )\n }\n}\n\n/**\n * Validate that the source contains exactly one function declaration\n */\nexport function validateSingleFunction(\n ast: Program,\n filename?: string\n): FunctionDeclaration {\n // Check for unsupported top-level constructs FIRST\n // This gives better error messages for things like classes\n for (const node of ast.body) {\n if (node.type === 'ImportDeclaration') {\n throw new SyntaxError(\n 'Imports are not supported. All atoms must be registered with the VM.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (\n node.type === 'ExportNamedDeclaration' ||\n node.type === 'ExportDefaultDeclaration'\n ) {\n throw new SyntaxError(\n 'Exports are not supported. The function is automatically exported.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (node.type === 'ClassDeclaration') {\n throw new SyntaxError(\n 'Classes are not supported. Agent99 uses functional composition.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n }\n\n const functions = ast.body.filter(\n (node): node is FunctionDeclaration => node.type === 'FunctionDeclaration'\n )\n\n if (functions.length === 0) {\n throw new SyntaxError(\n 'Source must contain a function declaration',\n { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (functions.length > 1) {\n const second = functions[1]\n throw new SyntaxError(\n 'Only a single function per agent is allowed',\n second.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n return functions[0]\n}\n\n/**\n * Extract TDoc comment from before a function\n *\n * TJS doc comments use /\\*# ... \\*\\/ syntax and preserve full markdown content.\n * Legacy JSDoc (/\\*\\* ... \\*\\/) is supported as a fallback.\n */\nexport function extractTDoc(\n source: string,\n func: FunctionDeclaration\n): {\n description?: string\n params: Record<string, string>\n} {\n const result: { description?: string; params: Record<string, string> } = {\n params: {},\n }\n\n if (!func.loc) return result\n\n const beforeFunc = source.substring(0, func.start)\n\n // First, check for TJS doc comment: /*# ... */\n // This preserves full markdown content\n // Find the LAST /*# ... */ block and verify it immediately precedes the function\n // (only whitespace and line comments allowed between)\n const allDocBlocks = [...beforeFunc.matchAll(/\\/\\*#([\\s\\S]*?)\\*\\//g)]\n if (allDocBlocks.length > 0) {\n const lastBlock = allDocBlocks[allDocBlocks.length - 1]\n const afterBlock = beforeFunc.substring(\n lastBlock.index! + lastBlock[0].length\n )\n\n // Only attach if nothing but whitespace and line comments between doc and function\n if (/^(?:\\s|\\/\\/[^\\n]*)*$/.test(afterBlock)) {\n // Extract content, trim leading/trailing whitespace, preserve internal formatting\n let content = lastBlock[1]\n\n // Remove common leading whitespace (like dedent)\n const lines = content.split('\\n')\n // Find minimum indentation (ignoring empty lines)\n const minIndent = lines\n .filter((line) => line.trim().length > 0)\n .reduce((min, line) => {\n const indent = line.match(/^(\\s*)/)?.[1].length || 0\n return Math.min(min, indent)\n }, Infinity)\n\n // Remove that indentation from all lines\n if (minIndent > 0 && minIndent < Infinity) {\n content = lines.map((line) => line.slice(minIndent)).join('\\n')\n }\n\n result.description = content.trim()\n return result\n }\n }\n\n // Fall back to JSDoc: /** ... */\n const jsdocMatch = beforeFunc.match(/\\/\\*\\*[\\s\\S]*?\\*\\/\\s*$/)\n if (!jsdocMatch) return result\n\n const jsdoc = jsdocMatch[0]\n\n // Extract description (first non-tag content)\n const descMatch = jsdoc.match(/\\/\\*\\*\\s*\\n?\\s*\\*?\\s*([^@\\n][^\\n]*)/m)\n if (descMatch) {\n result.description = descMatch[1].trim()\n }\n\n // Extract @param tags\n const paramRegex = /@param\\s+(?:\\{[^}]+\\}\\s+)?(\\w+)\\s*-?\\s*(.*)/g\n let match\n while ((match = paramRegex.exec(jsdoc)) !== null) {\n result.params[match[1]] = match[2].trim()\n }\n\n return result\n}\n", "/**\n * Type definitions for the Agent99 JavaScript transpiler\n */\n\nimport type { Node } from 'acorn'\nimport type { SeqNode } from '../builder'\n\n// ============================================================================\n// Type System Types\n// ============================================================================\n\n/** Represents a type extracted from value patterns */\nexport interface TypeDescriptor {\n kind:\n | 'string'\n | 'number'\n | 'integer'\n | 'non-negative-integer'\n | 'boolean'\n | 'null'\n | 'undefined'\n | 'array'\n | 'object'\n | 'union'\n | 'any'\n nullable?: boolean\n /** For arrays: the element type */\n items?: TypeDescriptor\n /** For objects: the shape */\n shape?: Record<string, TypeDescriptor>\n /** For unions: the member types */\n members?: TypeDescriptor[]\n /** For destructured parameters: full parameter descriptors */\n destructuredParams?: Record<string, ParameterDescriptor>\n}\n\n/** Describes a function parameter */\nexport interface ParameterDescriptor {\n name: string\n type: TypeDescriptor\n required: boolean\n default?: any\n /** The example value used to infer the type (for autocomplete) */\n example?: any\n description?: string\n /** Source location for error reporting */\n loc?: { start: number; end: number }\n}\n\n/** Describes a function's complete signature */\nexport interface FunctionSignature {\n name: string\n description?: string\n parameters: Record<string, ParameterDescriptor>\n returns?: TypeDescriptor\n}\n\n// ============================================================================\n// Transpiler Options and Results\n// ============================================================================\n\n/** Options for the transpile function */\nexport interface TranspileOptions {\n /** Include source locations in output AST */\n sourceMaps?: boolean\n /** Atom registry for validation (optional) */\n atoms?: Record<string, { op: string }>\n /** Filename for error messages */\n filename?: string\n /** Whether to use strict type checking */\n strict?: boolean\n}\n\n/** Result of transpilation */\nexport interface TranspileResult {\n /** The Agent99 AST */\n ast: SeqNode\n /** The function signature with types */\n signature: FunctionSignature\n /** Source map (if enabled) */\n sourceMap?: SourceMap\n /** Warnings (non-fatal issues) */\n warnings: TranspileWarning[]\n}\n\n/** A non-fatal warning during transpilation */\nexport interface TranspileWarning {\n message: string\n line: number\n column: number\n source?: string\n}\n\n/** Source map for debugging */\nexport interface SourceMap {\n version: 3\n file: string\n sources: string[]\n mappings: string\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/** Base class for transpiler errors with source location */\nexport class TranspileError extends Error {\n line: number\n column: number\n source?: string\n filename?: string\n\n constructor(\n message: string,\n location: { line: number; column: number },\n source?: string,\n filename?: string\n ) {\n const loc = `${filename || '<source>'}:${location.line}:${location.column}`\n super(`${message} at ${loc}`)\n this.name = 'TranspileError'\n this.line = location.line\n this.column = location.column\n this.source = source\n this.filename = filename\n }\n}\n\n/** Syntax error during parsing */\nexport class SyntaxError extends TranspileError {\n constructor(\n message: string,\n location: { line: number; column: number },\n source?: string,\n filename?: string\n ) {\n super(message, location, source, filename)\n this.name = 'SyntaxError'\n }\n\n /**\n * Format the error with source context for better debugging\n * Shows the problematic line with a caret pointing to the error location\n */\n formatWithContext(contextLines = 2): string {\n if (!this.source) return this.message\n\n const lines = this.source.split('\\n')\n const errorLine = this.line - 1 // 0-indexed\n const startLine = Math.max(0, errorLine - contextLines)\n const endLine = Math.min(lines.length - 1, errorLine + contextLines)\n\n const output: string[] = []\n const lineNumWidth = String(endLine + 1).length\n\n // Add context before\n for (let i = startLine; i <= endLine; i++) {\n const lineNum = String(i + 1).padStart(lineNumWidth)\n const marker = i === errorLine ? '>' : ' '\n output.push(`${marker} ${lineNum} | ${lines[i]}`)\n\n // Add caret pointing to error column\n if (i === errorLine) {\n const caretPadding = ' '.repeat(lineNumWidth + 4 + this.column)\n output.push(`${caretPadding}^ ${this.message.split(' at ')[0]}`)\n }\n }\n\n return output.join('\\n')\n }\n}\n\n/** Type error during transpilation or runtime */\nexport class TypeError extends TranspileError {\n expected?: string\n received?: string\n suggestion?: string\n\n constructor(\n message: string,\n location: { line: number; column: number },\n options?: {\n expected?: string\n received?: string\n suggestion?: string\n source?: string\n filename?: string\n }\n ) {\n super(message, location, options?.source, options?.filename)\n this.name = 'TypeError'\n this.expected = options?.expected\n this.received = options?.received\n this.suggestion = options?.suggestion\n }\n}\n\n// ============================================================================\n// Transform Context\n// ============================================================================\n\n/** Context passed through the transformer */\nexport interface TransformContext {\n /** Current scope depth */\n depth: number\n /** Variables declared in current scope with their types */\n locals: Map<string, TypeDescriptor>\n /** Parent scope's context (for scope chain) */\n parent?: TransformContext\n /** Function parameters */\n parameters: Map<string, ParameterDescriptor>\n /** Registered atom names */\n atoms: Set<string>\n /** Accumulated warnings */\n warnings: TranspileWarning[]\n /** Source code for error messages */\n source: string\n /** Filename */\n filename: string\n /** Options */\n options: TranspileOptions\n}\n\n/** Create a child context for nested scopes */\nexport function createChildContext(parent: TransformContext): TransformContext {\n return {\n depth: parent.depth + 1,\n locals: new Map(),\n parent,\n parameters: parent.parameters,\n atoms: parent.atoms,\n warnings: parent.warnings,\n source: parent.source,\n filename: parent.filename,\n options: parent.options,\n }\n}\n\n/** Look up a variable in the scope chain */\nexport function lookupVariable(\n name: string,\n ctx: TransformContext\n): TypeDescriptor | undefined {\n // Check locals first\n if (ctx.locals.has(name)) {\n return ctx.locals.get(name)\n }\n // Check parameters\n if (ctx.parameters.has(name)) {\n return ctx.parameters.get(name)?.type\n }\n // Check parent scope\n if (ctx.parent) {\n return lookupVariable(name, ctx.parent)\n }\n return undefined\n}\n\n// ============================================================================\n// AST Node Helpers\n// ============================================================================\n\n/** Extract location from an Acorn node */\nexport function getLocation(node: Node): { line: number; column: number } {\n if (node.loc) {\n return { line: node.loc.start.line, column: node.loc.start.column }\n }\n return { line: 1, column: 0 }\n}\n", "/**\n * Parser parameter and annotation processing\n *\n * Handles the unified paren expression transformer that converts TJS syntax\n * (colon defaults, return type annotations, safe/unsafe markers) into valid JS.\n */\n\nimport { SyntaxError } from './types'\nimport type {\n TokenizerState,\n StructuralContext,\n ContextFrame,\n TjsModes,\n} from './parser-types'\n\nexport function transformParenExpressions(\n source: string,\n ctx: {\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n }\n): {\n source: string\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n} {\n let result = ''\n let i = 0\n let firstReturnType: string | undefined\n let firstReturnSafety: 'safe' | 'unsafe' | undefined\n\n // State machine for tokenizing\n let state: TokenizerState = 'normal'\n // Stack for template string interpolation depth (each entry is brace depth within that interpolation)\n const templateStack: number[] = []\n\n // Structural context tracking - know if we're in a class body, function body, etc.\n const contextStack: ContextFrame[] = [{ type: 'top-level', braceDepth: 0 }]\n let braceDepth = 0\n\n // Helper to get current structural context (reserved for future use)\n const _currentContext = (): StructuralContext =>\n contextStack[contextStack.length - 1]?.type || 'top-level'\n\n // Helper to check if we're directly in a class body (not nested in a function/block inside it)\n const isInClassBody = (): boolean => {\n const frame = contextStack[contextStack.length - 1]\n return frame?.type === 'class-body' && braceDepth === frame.braceDepth + 1\n }\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n // Handle state transitions based on current state\n switch (state) {\n case 'single-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === \"'\") {\n state = 'normal'\n }\n i++\n continue\n\n case 'double-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '\"') {\n state = 'normal'\n }\n i++\n continue\n\n case 'template-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n // Enter template expression\n result += nextChar\n i += 2\n templateStack.push(1) // Start with brace depth 1\n state = 'normal' // Back to normal parsing inside ${}\n continue\n }\n if (char === '`') {\n state = 'normal'\n }\n i++\n continue\n\n case 'line-comment':\n result += char\n if (char === '\\n') {\n state = 'normal'\n }\n i++\n continue\n\n case 'block-comment':\n result += char\n if (char === '*' && nextChar === '/') {\n result += nextChar\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'regex':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '[') {\n // Character class - read until ]\n i++\n while (i < source.length && source[i] !== ']') {\n result += source[i]\n if (source[i] === '\\\\' && i + 1 < source.length) {\n result += source[i + 1]\n i += 2\n } else {\n i++\n }\n }\n if (i < source.length) {\n result += source[i]\n i++\n }\n continue\n }\n if (char === '/') {\n // End of regex, consume flags\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) {\n result += source[i]\n i++\n }\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'normal':\n // Handle template stack - track braces inside template expressions\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n // Exiting template expression, back to template string\n templateStack.pop()\n result += char\n i++\n state = 'template-string'\n continue\n }\n }\n }\n\n // Check for string/comment/regex start\n if (char === \"'\") {\n result += char\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n result += char\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n result += char\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n result += char + nextChar\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n result += char + nextChar\n i += 2\n state = 'block-comment'\n continue\n }\n\n // Check for regex literal\n if (char === '/') {\n const before = result.trimEnd()\n const lastChar = before[before.length - 1]\n const isRegexContext =\n !lastChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]$/.test(before) ||\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)\\s*$/.test(\n before\n )\n if (isRegexContext) {\n result += char\n i++\n state = 'regex'\n continue\n }\n }\n\n // Now handle TJS-specific transformations in normal state\n break\n }\n\n // We're in normal state - look for TJS patterns\n\n // Track braces for structural context\n if (char === '{') {\n braceDepth++\n result += char\n i++\n continue\n }\n if (char === '}') {\n braceDepth--\n // Pop context if we're exiting it\n const frame = contextStack[contextStack.length - 1]\n if (frame && braceDepth === frame.braceDepth) {\n contextStack.pop()\n }\n result += char\n i++\n continue\n }\n\n // Look for class declarations: class Name { or class Name extends Base {\n const classMatch = source\n .slice(i)\n .match(/^class\\s+\\w+(?:\\s+extends\\s+\\w+)?\\s*\\{/)\n if (classMatch) {\n // Output everything up to but not including the {\n const classHeader = classMatch[0].slice(0, -1)\n result += classHeader\n i += classHeader.length\n // Push class-body context (will be entered when we see the {)\n contextStack.push({ type: 'class-body', braceDepth })\n continue\n }\n\n // Look for function declarations: function name( or function name (\n const funcMatch = source.slice(i).match(/^function\\s+(\\w+)\\s*\\(/)\n if (funcMatch) {\n const funcName = funcMatch[1]\n const matchLen = funcMatch[0].length\n\n // Check for safety marker right after opening paren: (? or (!\n const afterParen = source[i + matchLen]\n let safetyMarker: '?' | '!' | null = null\n let paramStart = i + matchLen\n\n if (afterParen === '?' || afterParen === '!') {\n safetyMarker = afterParen\n paramStart++\n if (safetyMarker === '!') {\n ctx.unsafeFunctions.add(funcName)\n } else {\n ctx.safeFunctions.add(funcName)\n }\n }\n\n result += `function ${funcName}(`\n i = paramStart\n\n // Find matching ) using balanced counting\n const paramsResult = extractBalancedContent(source, i, '(', ')')\n if (!paramsResult) {\n // Unbalanced - just copy character and continue\n result += source[i]\n i++\n continue\n }\n\n const { content: params, endPos } = paramsResult\n i = endPos\n\n // Process the params (transform : to = for required params, handle nested arrows)\n const processedParams = processParamString(params, ctx, true)\n result += processedParams + ')'\n\n // Check what follows the closing paren: return type annotation (:, :?, :!)\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n let safety: 'safe' | 'unsafe' | undefined\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n safety = colonMarker === ':?' ? 'safe' : 'unsafe'\n } else {\n j += 1\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n if (firstReturnType === undefined) {\n firstReturnType = typeResult.type\n if (safety) firstReturnSafety = safety\n }\n i = typeResult.endPos\n }\n }\n continue\n }\n\n // Look for class method syntax: constructor(, methodName(, get name(, set name(\n // These appear inside class bodies and need param transformation\n // Only match if we're actually in a class body (proper context tracking)\n // Must NOT match function calls in expressions (div(), span(), etc.)\n const methodMatch = source\n .slice(i)\n .match(/^(constructor|(?:get|set)\\s+\\w+|async\\s+\\w+|\\w+)\\s*\\(/)\n // Check that the preceding non-whitespace character indicates this is a\n // declaration, not a function call in an expression.\n // Method declarations follow: newline, {, ;, or start of file\n // Function calls follow: = => , [ ( . operators etc.\n const prevNonWs = (() => {\n for (let k = result.length - 1; k >= 0; k--) {\n if (!/\\s/.test(result[k])) return result[k]\n }\n return '\\n' // start of input\n })()\n // Method declarations can follow almost anything (property, }, ;, etc.)\n // Function CALLS in expressions specifically follow: = => , [ (\n const isMethodDecl =\n prevNonWs !== '=' &&\n prevNonWs !== ',' &&\n prevNonWs !== '(' &&\n prevNonWs !== '[' &&\n prevNonWs !== '>' // catches =>\n if (methodMatch && isInClassBody() && !isMethodDecl) {\n // Not a method declaration (it's a function call in an expression).\n // Skip past the identifier to prevent re-matching a suffix\n // (e.g. 'div(' \u2192 skip 'div', don't let 'iv(' match next).\n const skipLen = methodMatch[1].length\n result += source.slice(i, i + skipLen)\n i += skipLen\n continue\n }\n if (methodMatch && isInClassBody() && isMethodDecl) {\n // We're actually in a class body - this is a method definition\n const methodPart = methodMatch[1]\n const matchLen = methodMatch[0].length\n const paramStart = i + matchLen\n\n result += methodPart + '('\n i = paramStart\n\n // Find matching )\n const paramsResult = extractBalancedContent(source, i, '(', ')')\n if (!paramsResult) {\n result += source[i]\n i++\n continue\n }\n\n const { content: params, endPos } = paramsResult\n i = endPos\n\n // Process the params (transform : to = for TJS types)\n const processedParams = processParamString(params, ctx, true)\n result += processedParams + ')'\n\n // Check for return type annotation: ): type, ):! type, ):? type\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n } else {\n j++\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n i = typeResult.endPos\n }\n }\n\n continue\n }\n\n // Look for arrow function params: (params) =>\n // We need to be careful to only transform when followed by =>\n if (source[i] === '(') {\n // First, find the matching ) without consuming any safety marker\n // We'll check for safety marker only if this is actually an arrow function\n const fullParamsResult = extractBalancedContent(source, i + 1, '(', ')')\n if (!fullParamsResult) {\n result += source[i]\n i++\n continue\n }\n\n const fullContent = fullParamsResult.content\n const endPos = fullParamsResult.endPos\n\n // Check what follows: whitespace then => (arrow function) or -> (return type on arrow)\n let j = endPos\n while (j < source.length && /\\s/.test(source[j])) j++\n\n // Check for return type annotation on arrow function: ): type =>\n let arrowReturnType: string | undefined\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n } else {\n j++\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n arrowReturnType = typeResult.type\n j = typeResult.endPos\n while (j < source.length && /\\s/.test(source[j])) j++\n }\n }\n\n if (source.slice(j, j + 2) === '=>') {\n // This IS an arrow function - now check for safety marker\n let safetyMarker: '?' | '!' | null = null\n let params = fullContent\n\n // Check if content starts with safety marker (? or !) followed by whitespace\n const trimmedContent = fullContent.trimStart()\n if (\n trimmedContent.startsWith('?') &&\n (trimmedContent.length === 1 || /\\s/.test(trimmedContent[1]))\n ) {\n safetyMarker = '?'\n params = trimmedContent.slice(1)\n } else if (\n trimmedContent.startsWith('!') &&\n (trimmedContent.length === 1 || /\\s/.test(trimmedContent[1]))\n ) {\n safetyMarker = '!'\n params = trimmedContent.slice(1)\n }\n\n // Process the params\n const processedParams = processParamString(params, ctx, false)\n // Add safety marker as comment for arrow functions (since we can't track them by name)\n const safetyComment =\n safetyMarker === '?'\n ? '/* safe */ '\n : safetyMarker === '!'\n ? '/* unsafe */ '\n : ''\n result += `(${safetyComment}${processedParams})`\n // Skip the return type annotation (we extracted it but don't emit it)\n i = endPos\n // Skip to just before the =>\n while (i < j && /\\s/.test(source[i])) {\n result += source[i]\n i++\n }\n // If there was a return type, we need to skip past it to =>\n if (arrowReturnType) {\n i = j\n }\n } else {\n // Not an arrow function - recursively transform the content for nested arrows\n // but don't process as param declarations (no colon-to-equals transform)\n const transformed = transformParenExpressions(fullContent, ctx)\n result += `(${transformed.source})`\n i = endPos\n }\n continue\n }\n\n result += source[i]\n i++\n }\n\n return {\n source: result,\n returnType: firstReturnType,\n returnSafety: firstReturnSafety,\n }\n}\n\n/**\n * Extract balanced content between delimiters\n * @param source The source string\n * @param start Position after the opening delimiter\n * @param open Opening delimiter character (for depth counting of nested structures)\n * @param close Closing delimiter character\n * @returns The content between delimiters and position after closing delimiter, or null if unbalanced\n */\nfunction extractBalancedContent(\n source: string,\n start: number,\n open: string,\n close: string\n): { content: string; endPos: number } | null {\n let depth = 1\n let i = start\n let inString = false\n let stringChar = ''\n\n while (i < source.length && depth > 0) {\n const char = source[i]\n\n // Handle string literals\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n } else if (inString && char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n } else if (!inString) {\n if (char === open) depth++\n else if (char === close) depth--\n }\n i++\n }\n\n if (depth !== 0) return null\n\n return {\n content: source.slice(start, i - 1),\n endPos: i,\n }\n}\n\n/**\n * Extract a JS value starting at a position in source.\n * Handles nested objects {}, arrays [], strings, numbers, booleans, null.\n * Uses state machine to properly track nesting.\n */\nexport function extractJSValue(\n source: string,\n start: number\n): { value: string; endPos: number } | null {\n let i = start\n\n // Skip leading whitespace\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i >= source.length) return null\n\n const valueStart = i\n const firstChar = source[i]\n\n // Handle objects and arrays with balanced parsing\n if (firstChar === '{' || firstChar === '[') {\n const close = firstChar === '{' ? '}' : ']'\n const result = extractBalancedContent(source, i + 1, firstChar, close)\n if (!result) return null\n return {\n value: source.slice(valueStart, result.endPos),\n endPos: result.endPos,\n }\n }\n\n // Handle strings\n if (firstChar === \"'\" || firstChar === '\"' || firstChar === '`') {\n i++\n while (i < source.length) {\n if (source[i] === firstChar && source[i - 1] !== '\\\\') {\n i++\n return { value: source.slice(valueStart, i), endPos: i }\n }\n i++\n }\n return null // Unterminated string\n }\n\n // Handle numbers (including negative and decimals)\n if (/[-+\\d]/.test(firstChar)) {\n while (i < source.length && /[\\d.eE+-]/.test(source[i])) i++\n return { value: source.slice(valueStart, i), endPos: i }\n }\n\n // Handle keywords: true, false, null, undefined\n const keywordMatch = source.slice(i).match(/^(true|false|null|undefined)\\b/)\n if (keywordMatch) {\n return {\n value: keywordMatch[1],\n endPos: i + keywordMatch[1].length,\n }\n }\n\n return null\n}\n\n/**\n * Normalize union syntax in type strings\n * Converts single | to || for TJS consistency (needed for JS parsing)\n */\nfunction normalizeUnionSyntax(type: string): string {\n // Replace single | (not ||) with || for proper JS parsing\n // Use negative lookbehind and lookahead to avoid matching ||\n return type.replace(/(?<!\\|)\\|(?!\\|)/g, ' || ')\n}\n\n/**\n * Extract a return type value starting at the given position\n * Handles: simple types ('', 0, null), objects ({ }), arrays ([ ]), unions (| or ||)\n */\nfunction extractReturnTypeValue(\n source: string,\n start: number\n): { type: string; endPos: number } | null {\n let i = start\n let depth = 0\n let inString = false\n let stringChar = ''\n let sawContent = false\n\n // Helper to create result with normalized type\n const makeResult = (endPos: number) => ({\n type: normalizeUnionSyntax(source.slice(start, endPos).trim()),\n endPos,\n })\n\n while (i < source.length) {\n const char = source[i]\n\n // Handle string literals\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n sawContent = true\n i++\n continue\n }\n if (inString) {\n if (char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n i++ // Move past closing quote\n // Just finished a string at depth 0\n if (depth === 0) {\n // Check if next non-ws is function body { or union |\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n if (source[j] === '{') {\n // Check if it's object type or function body\n const afterBrace = source.slice(j + 1).match(/^\\s*(\\w+)\\s*:/)\n if (!afterBrace) {\n // Function body - type ends here\n return makeResult(i)\n }\n }\n if (source[j] !== '|' && source[j] !== '&') {\n // No union - type ends here\n return makeResult(i)\n }\n }\n continue\n }\n i++\n continue\n }\n\n // Track bracket depth\n if (char === '{' || char === '[' || char === '(') {\n depth++\n sawContent = true\n i++\n continue\n }\n if (char === '}' || char === ']' || char === ')') {\n depth--\n if (depth === 0) {\n i++\n // Check for union after closing bracket\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n if (source[j] === '|' || source[j] === '&') {\n continue // More type content\n }\n return makeResult(i)\n }\n i++\n continue\n }\n\n // At depth 0, check for function body\n if (depth === 0 && char === '{') {\n if (sawContent) {\n return makeResult(i)\n }\n // First { - check if object type or function body\n const afterBrace = source.slice(i + 1).match(/^\\s*(\\w+)\\s*:/)\n if (afterBrace) {\n depth++\n sawContent = true\n i++\n continue\n }\n return makeResult(i)\n }\n\n // Handle union/intersection at depth 0\n if (depth === 0 && (char === '|' || char === '&')) {\n i++\n if (i < source.length && source[i] === '|') i++ // Skip second | for ||\n while (i < source.length && /\\s/.test(source[i])) i++\n continue\n }\n\n // Handle numbers (including decimals like 14.5, -3.14)\n if (\n depth === 0 &&\n (/\\d/.test(char) || (char === '-' && /\\d/.test(source[i + 1])))\n ) {\n let j = i\n if (source[j] === '-') j++ // Skip negative sign\n while (j < source.length && /\\d/.test(source[j])) j++\n // Handle decimal part\n if (j < source.length && source[j] === '.' && /\\d/.test(source[j + 1])) {\n j++ // Skip decimal point\n while (j < source.length && /\\d/.test(source[j])) j++\n }\n // Handle exponent (1e10, 1.5e-3)\n if (j < source.length && (source[j] === 'e' || source[j] === 'E')) {\n j++\n if (j < source.length && (source[j] === '+' || source[j] === '-')) j++\n while (j < source.length && /\\d/.test(source[j])) j++\n }\n sawContent = true\n i = j\n // Check what's next\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i < source.length && source[i] === '{') {\n // Function body - type ends here\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n if (source[i] !== '|' && source[i] !== '&') {\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n continue\n }\n\n // Handle identifiers (null, undefined, true, false, type names)\n if (depth === 0 && /[a-zA-Z_]/.test(char)) {\n let j = i\n while (j < source.length && /\\w/.test(source[j])) j++\n sawContent = true\n i = j\n // Check what's next\n while (i < source.length && /\\s/.test(source[i])) i++\n\n // Identifier followed by ( \u2014 constructor/function call as return type\n // e.g. FunctionPredicate('function', { params: ... })\n if (i < source.length && source[i] === '(') {\n depth++\n i++\n continue\n }\n\n if (i < source.length && source[i] === '{') {\n // Check if function body\n const afterBrace = source.slice(i + 1).match(/^\\s*(\\w+)\\s*:/)\n if (!afterBrace) {\n // Function body - type ends before whitespace\n let typeEnd = j\n while (typeEnd > start && /\\s/.test(source[typeEnd - 1])) typeEnd--\n return {\n type: normalizeUnionSyntax(source.slice(start, typeEnd).trim()),\n endPos: j,\n }\n }\n }\n if (source[i] !== '|' && source[i] !== '&') {\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n continue\n }\n\n i++\n }\n\n // Reached end of source\n if (sawContent) {\n return makeResult(i)\n }\n return null\n}\n\n/**\n * Split parameter string respecting nested braces/brackets\n */\nfunction splitParameters(params: string): string[] {\n const result: string[] = []\n let current = ''\n let depth = 0\n let inLineComment = false\n let inBlockComment = false\n let i = 0\n\n while (i < params.length) {\n const char = params[i]\n const nextChar = params[i + 1]\n\n // Handle line comments - preserve them in output\n if (!inBlockComment && char === '/' && nextChar === '/') {\n inLineComment = true\n current += '//'\n i += 2\n continue\n }\n\n // Handle block comments - preserve them in output\n if (!inLineComment && char === '/' && nextChar === '*') {\n inBlockComment = true\n current += '/*'\n i += 2\n continue\n }\n\n // End of line comment\n if (inLineComment && char === '\\n') {\n inLineComment = false\n current += char\n i++\n continue\n }\n\n // End of block comment - preserve closing\n if (inBlockComment && char === '*' && nextChar === '/') {\n inBlockComment = false\n current += '*/'\n i += 2\n continue\n }\n\n // Inside comments - preserve the content\n if (inLineComment || inBlockComment) {\n current += char\n i++\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n current += char\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n current += char\n } else if (char === ',' && depth === 0) {\n result.push(current)\n current = ''\n } else {\n current += char\n }\n i++\n }\n\n if (current.trim()) {\n result.push(current)\n }\n\n return result\n}\n\n/**\n * Process a parameter string, transforming : to = for required params\n * and recursively handling nested arrow functions\n */\nfunction processParamString(\n params: string,\n ctx: {\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n },\n trackRequired: boolean\n): string {\n // First recursively process any nested arrow functions\n const withArrows = transformParenExpressions(params, {\n originalSource: params,\n requiredParams: ctx.requiredParams,\n unsafeFunctions: ctx.unsafeFunctions,\n safeFunctions: ctx.safeFunctions,\n }).source\n\n // Now split and process each parameter\n const paramList = splitParameters(withArrows)\n let sawOptional = false\n const seenNames = new Set<string>()\n\n // Helper to check for duplicate names\n const checkDuplicate = (name: string) => {\n if (trackRequired && /^\\w+$/.test(name)) {\n if (seenNames.has(name)) {\n throw new Error(`Duplicate parameter name '${name}'`)\n }\n seenNames.add(name)\n }\n }\n\n const processed = paramList.map((param) => {\n const trimmed = param.trim()\n if (!trimmed) return param\n\n // Handle destructured object parameters: { name: 'Clara', age = 30 }\n // Transform colons to equals inside the braces (recursive)\n // Order doesn't matter for objects, so don't enforce required-before-optional\n // ONLY do this when trackRequired is true - i.e., actual function parameters\n if (trackRequired && trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const inner = trimmed.slice(1, -1)\n const processedInner = processDestructuredObjectParams(inner, ctx)\n return `{ ${processedInner} }`\n }\n\n // Handle destructured array parameters: [first: '', second: 0]\n // ONLY do this when trackRequired is true - i.e., actual function parameters\n if (trackRequired && trimmed.startsWith('[') && trimmed.endsWith(']')) {\n const inner = trimmed.slice(1, -1)\n const processedInner = processDestructuredObjectParams(inner, ctx)\n return `[ ${processedInner} ]`\n }\n\n // Handle rest parameters: ...args: [0] -> ...args (strip type, JS forbids defaults on rest)\n // The type annotation is still captured by extractFunctionTypeInfo for __tjs metadata\n if (trimmed.startsWith('...')) {\n const restColonPos = findTopLevelColon(trimmed)\n if (restColonPos !== -1) {\n const restName = trimmed.slice(0, restColonPos).trim()\n return restName\n }\n return param\n }\n\n // Handle optional param syntax: x?: type -> x = type (not required)\n const optionalMatch = trimmed.match(/^(\\w+)\\s*\\?\\s*:\\s*(.+)$/)\n if (optionalMatch) {\n const [, name, type] = optionalMatch\n checkDuplicate(name)\n sawOptional = true\n // Optional params are NOT tracked as required\n return `${name} = ${type}`\n }\n\n // Check if param already has a default value (x = value)\n if (!hasColonNotEquals(trimmed)) {\n // Has equals sign (default value) - this is optional\n // Extract name from \"name = value\" pattern\n const eqMatch = trimmed.match(/^(\\w+)\\s*=/)\n if (eqMatch) {\n checkDuplicate(eqMatch[1])\n }\n sawOptional = true\n return param\n }\n\n // Handle required param syntax: x: type -> x = type (tracked as required)\n const colonPos = findTopLevelColon(trimmed)\n if (colonPos !== -1) {\n const name = trimmed.slice(0, colonPos).trim()\n const type = trimmed.slice(colonPos + 1).trim()\n\n checkDuplicate(name)\n\n // Required param after optional \u2014 warn but allow.\n // TypeScript permits this, and the TS\u2192TJS converter can produce it\n // when earlier params degrade to 'any' (bare name, no : or =).\n if (sawOptional && trackRequired && /^\\w+$/.test(name)) {\n // Allow it \u2014 JavaScript handles this fine (caller passes undefined)\n }\n\n if (trackRequired && /^\\w+$/.test(name)) {\n ctx.requiredParams.add(name)\n }\n return `${name} = ${type}`\n }\n\n return param\n })\n\n return processed.join(',')\n}\n\n/**\n * Process destructured object/array parameters\n *\n * In TJS destructuring patterns:\n * - `name: 'Clara'` means required param with example (transforms to `name = 'Clara'`)\n * - `age = 30` means optional param with default (stays as `age = 30`)\n * - Nested objects like `address: { street: '9 High St', zip = '0000' }` are tricky:\n * the inner object is a value (object literal), not a pattern, so we transform it back\n *\n * Key insight: In destructuring, `foo: value` at top level is a required param,\n * but at nested levels within an object value, `:` is normal object literal syntax.\n *\n * Order does NOT matter in objects (unlike positional function params).\n */\nfunction processDestructuredObjectParams(\n inner: string,\n ctx: {\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n }\n): string {\n // Split on commas at the top level (respecting nested braces)\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Check for nested destructured object: name: { ... }\n // The inner { ... } is an object literal value, not a destructuring pattern\n const nestedObjectMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjectMatch) {\n const [, name, objectLiteral] = nestedObjectMatch\n ctx.requiredParams.add(name)\n // Process the inner object as an object literal (transform = to : for values)\n const processedLiteral = processObjectLiteralValue(objectLiteral)\n return `${name} = ${processedLiteral}`\n }\n\n // Check for nested destructured array: name: [ ... ]\n const nestedArrayMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrayMatch) {\n const [, name, arrayLiteral] = nestedArrayMatch\n ctx.requiredParams.add(name)\n // Process the inner array as an array literal\n const processedLiteral = processArrayLiteralValue(arrayLiteral)\n return `${name} = ${processedLiteral}`\n }\n\n // Handle simple colon syntax: name: 'value' -> name = 'value' (required)\n const colonMatch = trimmed.match(/^(\\w+)\\s*:\\s*([\\s\\S]+)$/)\n if (colonMatch) {\n const [, name, value] = colonMatch\n ctx.requiredParams.add(name)\n return `${name} = ${value}`\n }\n\n // Handle equals syntax: name = value (optional, already valid JS)\n // Just preserve it as-is\n return part\n })\n\n return processed.join(', ')\n}\n\n/**\n * Process an object literal value (nested inside destructuring)\n *\n * In object literals, TJS allows `=` for optional values:\n * { street: '9 High St', zip = '0000' }\n *\n * This must become valid JS object literal syntax:\n * { street: '9 High St', zip: '0000' }\n *\n * (The `=` is TJS shorthand indicating the value is optional/has default,\n * but in an object literal context it must use `:`)\n */\nfunction processObjectLiteralValue(literal: string): string {\n // Remove outer braces, process content, restore braces\n const inner = literal.slice(1, -1).trim()\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Handle nested objects: key: { ... } or key = { ... }\n const nestedObjColonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjColonMatch) {\n const [, key, nested] = nestedObjColonMatch\n return `${key}: ${processObjectLiteralValue(nested)}`\n }\n const nestedObjEqualsMatch = trimmed.match(/^(\\w+)\\s*=\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjEqualsMatch) {\n const [, key, nested] = nestedObjEqualsMatch\n return `${key}: ${processObjectLiteralValue(nested)}`\n }\n\n // Handle nested arrays: key: [ ... ] or key = [ ... ]\n const nestedArrColonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrColonMatch) {\n const [, key, nested] = nestedArrColonMatch\n return `${key}: ${processArrayLiteralValue(nested)}`\n }\n const nestedArrEqualsMatch = trimmed.match(/^(\\w+)\\s*=\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrEqualsMatch) {\n const [, key, nested] = nestedArrEqualsMatch\n return `${key}: ${processArrayLiteralValue(nested)}`\n }\n\n // Transform equals to colon for simple values: key = value -> key: value\n const equalsMatch = trimmed.match(/^(\\w+)\\s*=\\s*([\\s\\S]+)$/)\n if (equalsMatch) {\n const [, key, value] = equalsMatch\n return `${key}: ${value}`\n }\n\n // Colon syntax is already valid: key: value\n return part\n })\n\n return `{ ${processed.join(', ')} }`\n}\n\n/**\n * Process an array literal value (nested inside destructuring)\n * Similar to processObjectLiteralValue but for arrays\n */\nfunction processArrayLiteralValue(literal: string): string {\n // Remove outer brackets, process content, restore brackets\n const inner = literal.slice(1, -1).trim()\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Handle nested objects\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n return processObjectLiteralValue(trimmed)\n }\n\n // Handle nested arrays\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n return processArrayLiteralValue(trimmed)\n }\n\n // Array elements are just values, no transformation needed\n return part\n })\n\n return `[ ${processed.join(', ')} ]`\n}\n\n/**\n * Check if param has a top-level colon but no top-level equals\n * This distinguishes x: type from x = type and handles nested structures\n */\nfunction hasColonNotEquals(param: string): boolean {\n let depth = 0\n let hasColon = false\n let hasEquals = false\n let inString = false\n let stringChar = ''\n\n for (let i = 0; i < param.length; i++) {\n const char = param[i]\n\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n continue\n }\n if (inString) {\n if (char === stringChar && param[i - 1] !== '\\\\') inString = false\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n } else if (depth === 0) {\n if (char === ':') hasColon = true\n if (char === '=' && param[i + 1] !== '>') hasEquals = true // Ignore =>\n }\n }\n\n return hasColon && !hasEquals\n}\n\n/**\n * Find the position of the first top-level colon in a param\n */\nfunction findTopLevelColon(param: string): number {\n let depth = 0\n let inString = false\n let stringChar = ''\n\n for (let i = 0; i < param.length; i++) {\n const char = param[i]\n\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n continue\n }\n if (inString) {\n if (char === stringChar && param[i - 1] !== '\\\\') inString = false\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n } else if (depth === 0 && char === ':') {\n return i\n }\n }\n\n return -1\n}\n\n/**\n * Preprocess source to handle custom syntax extensions\n *\n * Transforms:\n * function foo(x: 'example') { }\n * Into:\n * function foo(x = 'example') { }\n * And tracks that 'x' is a required parameter.\n *\n * Also handles return type annotation:\n * function foo(x: 'example') -> { result: 'string' } { }\n */\n", "/**\n * Parser source transforms\n *\n * All source-to-source text transforms used by the preprocess pipeline.\n * These operate on raw source strings before Acorn parsing.\n */\n\nimport { SyntaxError } from './types'\n\n/**\n * Extract a brace-balanced value from source after a regex match.\n * Returns a match-like object with [1] being the balanced { ... } content,\n * or null if no match. Handles nested braces.\n */\nfunction extractBalancedValue(\n source: string,\n startRe: RegExp\n): RegExpMatchArray | null {\n const m = source.match(startRe)\n if (!m) return null\n\n const braceStart = m.index! + m[0].length - 1 // position of opening {\n let depth = 1\n let j = braceStart + 1\n while (j < source.length && depth > 0) {\n if (source[j] === '{') depth++\n else if (source[j] === '}') depth--\n j++\n }\n if (depth !== 0) return null\n\n const balanced = source.slice(braceStart, j) // includes { and }\n const result = [m[0].slice(0, -1) + balanced, balanced] as RegExpMatchArray\n result.index = m.index\n return result\n}\nimport type {\n WasmBlock,\n TestBlock,\n ExtensionInfo,\n PolyVariant,\n TokenizerState,\n} from './parser-types'\nimport { extractJSValue } from './parser-params'\n\nexport function transformTryWithoutCatch(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'try' keyword followed by '{'\n const tryMatch = source.slice(i).match(/^\\btry\\s*\\{/)\n if (tryMatch) {\n // Found 'try {', now find the matching closing brace\n const startBrace = i + tryMatch[0].length - 1\n const bodyStart = startBrace + 1\n let depth = 1\n let j = bodyStart\n\n while (j < source.length && depth > 0) {\n const char = source[j]\n if (char === '{') depth++\n else if (char === '}') depth--\n j++\n }\n\n if (depth !== 0) {\n // Unbalanced braces, let the parser handle the error\n result += source[i]\n i++\n continue\n }\n\n // Check what comes after the closing brace\n const afterTry = source.slice(j).match(/^\\s*(catch|finally)\\b/)\n\n if (afterTry) {\n // Has catch or finally - leave it alone, copy the try block as-is\n result += source.slice(i, j)\n i = j\n } else {\n // No catch or finally - add monadic error handler\n // Returns MonadicError to maintain monadic flow (propagates through function chains)\n const body = source.slice(bodyStart, j - 1)\n result += `try {${body}} catch (__try_err) { return new (__tjs?.MonadicError ?? Error)(__try_err?.message || String(__try_err), 'try', undefined, undefined, __tjs?.getStack?.()) }`\n i = j\n }\n } else {\n result += source[i]\n i++\n }\n }\n\n return result\n}\n\n/**\n * Extract WASM blocks from source and replace with runtime dispatch code\n *\n * Simple form (body used as both WASM source and JS fallback):\n * wasm {\n * for (let i = 0; i < arr.length; i++) { arr[i] *= 2 }\n * }\n *\n * With explicit fallback (when you need different JS code):\n * wasm {\n * // WASM-optimized version\n * } fallback {\n * // Different JS implementation\n * }\n *\n * Output:\n * (globalThis.__tjs_wasm_0\n * ? globalThis.__tjs_wasm_0(captures...)\n * : (() => { body })())\n *\n * Variables are auto-captured from the body.\n */\nexport function extractWasmBlocks(source: string): {\n source: string\n blocks: WasmBlock[]\n} {\n const blocks: WasmBlock[] = []\n let result = ''\n let i = 0\n let blockId = 0\n\n while (i < source.length) {\n // Look for 'wasm {' or 'wasm{' - simple block without params\n const wasmMatch = source.slice(i).match(/^\\bwasm\\s*\\{/)\n if (wasmMatch) {\n const matchStart = i\n\n // Find the body\n const bodyStart = i + wasmMatch[0].length\n let braceDepth = 1\n let j = bodyStart\n\n while (j < source.length && braceDepth > 0) {\n const char = source[j]\n if (char === '{') braceDepth++\n else if (char === '}') braceDepth--\n j++\n }\n\n if (braceDepth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const body = source.slice(bodyStart, j - 1)\n let fallbackBody: string | undefined\n let matchEnd = j\n\n // Check for optional 'fallback {' block\n const fallbackMatch = source.slice(j).match(/^\\s*fallback\\s*\\{/)\n if (fallbackMatch) {\n const fallbackStart = j + fallbackMatch[0].length\n braceDepth = 1\n let k = fallbackStart\n\n while (k < source.length && braceDepth > 0) {\n const char = source[k]\n if (char === '{') braceDepth++\n else if (char === '}') braceDepth--\n k++\n }\n\n if (braceDepth === 0) {\n fallbackBody = source.slice(fallbackStart, k - 1)\n matchEnd = k\n }\n }\n\n // Auto-detect captured variables from the body\n const captureNames = detectCaptures(body)\n\n // Try to find type annotations from enclosing function parameters\n // Look backwards from matchStart to find the function signature\n const captures = captureNames.map((name) => {\n const typeAnnotation = findParameterType(source, matchStart, name)\n return typeAnnotation ? `${name}: ${typeAnnotation}` : name\n })\n\n // Create the block record\n const block: WasmBlock = {\n id: `__tjs_wasm_${blockId}`,\n body,\n fallback: fallbackBody,\n captures,\n start: matchStart,\n end: matchEnd,\n }\n blocks.push(block)\n\n // Generate runtime dispatch code:\n // The fallback is the body itself (or explicit fallback if provided)\n const fallbackCode = fallbackBody ?? body\n // Strip type annotations from captures for runtime args (e.g., \"xs: Float32Array\" -> \"xs\")\n const captureArgNames = captures.map((c) => c.split(':')[0].trim())\n const captureArgs =\n captureArgNames.length > 0 ? captureArgNames.join(', ') : ''\n\n // For WASM: pass captures as arguments\n // For fallback: just run inline (captures are in scope)\n const wasmCall =\n captureArgNames.length > 0\n ? `globalThis.${block.id}(${captureArgs})`\n : `globalThis.${block.id}()`\n\n const dispatch = `(globalThis.${block.id} ? ${wasmCall} : (() => {${fallbackCode}})())`\n\n result += dispatch\n i = matchEnd\n blockId++\n } else {\n result += source[i]\n i++\n }\n }\n\n return { source: result, blocks }\n}\n\n/** Check if an identifier is a WASM SIMD intrinsic (not a captured variable) */\nfunction isWasmIntrinsic(name: string): boolean {\n return name.startsWith('f32x4_') || name.startsWith('v128_')\n}\n\n/**\n * Detect variables captured from enclosing scope\n *\n * Finds identifiers that are:\n * - Used in the body\n * - Not declared within the body (let, const, var, function params)\n *\n * This is a simple heuristic - a full implementation would use proper AST analysis\n */\nfunction detectCaptures(body: string): string[] {\n // Strip comments first to avoid extracting words from comments\n const bodyWithoutComments = body\n .replace(/\\/\\/[^\\n]*/g, '') // line comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // block comments\n\n // Collect identifiers that appear as property accesses (after a dot)\n const propertyOnly = new Set<string>()\n const propPattern = /\\.([a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g\n let match\n while ((match = propPattern.exec(bodyWithoutComments)) !== null) {\n propertyOnly.add(match[1])\n }\n\n // Find all identifiers used in the body (not after a dot)\n const identifierPattern = /(?<!\\.)(\\b[a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g\n const allIdentifiers = new Set<string>()\n while ((match = identifierPattern.exec(bodyWithoutComments)) !== null) {\n allIdentifiers.add(match[1])\n }\n\n // Remove identifiers that ONLY appear as property accesses\n for (const prop of propertyOnly) {\n if (!allIdentifiers.has(prop)) continue\n // Check if this identifier is also used standalone (not just as .prop)\n const standalonePattern = new RegExp(`(?<!\\\\.)\\\\b${prop}\\\\b`, 'g')\n const dotPattern = new RegExp(`\\\\.${prop}\\\\b`, 'g')\n const standaloneMatches =\n bodyWithoutComments.match(standalonePattern)?.length || 0\n const dotMatches = bodyWithoutComments.match(dotPattern)?.length || 0\n // If every occurrence is a property access, remove it\n if (standaloneMatches <= dotMatches) {\n allIdentifiers.delete(prop)\n }\n }\n\n // Find identifiers declared in the body\n const declared = new Set<string>()\n\n // let/const/var declarations\n const declPattern = /\\b(?:let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g\n while ((match = declPattern.exec(bodyWithoutComments)) !== null) {\n declared.add(match[1])\n }\n\n // for loop variables: for (let i = ...)\n const forPattern =\n /\\bfor\\s*\\(\\s*(?:let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g\n while ((match = forPattern.exec(bodyWithoutComments)) !== null) {\n declared.add(match[1])\n }\n\n // function declarations and parameters would go here for full impl\n\n // JS keywords and builtins to exclude\n const reserved = new Set([\n 'if',\n 'else',\n 'for',\n 'while',\n 'do',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'return',\n 'function',\n 'let',\n 'const',\n 'var',\n 'new',\n 'this',\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'typeof',\n 'instanceof',\n 'in',\n 'of',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'async',\n 'await',\n 'class',\n 'extends',\n 'super',\n 'import',\n 'export',\n 'default',\n 'from',\n 'as',\n 'static',\n 'get',\n 'set',\n 'yield',\n // Common globals\n 'console',\n 'Math',\n 'Array',\n 'Object',\n 'String',\n 'Number',\n 'Boolean',\n 'Date',\n 'JSON',\n 'Promise',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Float32Array',\n 'Float64Array',\n 'Int8Array',\n 'Int16Array',\n 'Int32Array',\n 'Uint8Array',\n 'Uint16Array',\n 'Uint32Array',\n 'BigInt64Array',\n 'BigUint64Array',\n 'ArrayBuffer',\n 'DataView',\n 'Error',\n 'TypeError',\n 'RangeError',\n 'length',\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'slice',\n 'splice',\n 'map',\n 'filter',\n 'reduce',\n 'forEach',\n 'find',\n 'findIndex',\n 'indexOf',\n 'includes',\n 'globalThis',\n 'window',\n 'document',\n 'Infinity',\n 'NaN',\n 'isNaN',\n 'isFinite',\n 'parseInt',\n 'parseFloat',\n 'encodeURI',\n 'decodeURI',\n 'eval',\n 'wasmBuffer',\n ])\n\n // Return identifiers that are used but not declared or reserved\n const captures: string[] = []\n for (const id of allIdentifiers) {\n if (!declared.has(id) && !reserved.has(id) && !isWasmIntrinsic(id)) {\n captures.push(id)\n }\n }\n\n return captures.sort()\n}\n\n/**\n * Find the type annotation for a parameter in the enclosing function\n *\n * Looks backwards from wasmBlockStart to find the function signature,\n * then extracts the type annotation for the given parameter name.\n *\n * Supports:\n * - TJS colon syntax: `param: Float32Array`\n * - TypeScript syntax: `param: Float32Array`\n */\nfunction findParameterType(\n source: string,\n wasmBlockStart: number,\n paramName: string\n): string | undefined {\n // Look backwards to find the function signature\n // Find the nearest 'function' keyword before the wasm block\n const beforeBlock = source.slice(0, wasmBlockStart)\n\n // Match function declaration with parameters\n // This regex finds function signatures and captures the parameter list\n const funcPattern = /function\\s+\\w+\\s*\\(([^)]*)\\)\\s*(?:->.*?)?\\s*\\{[^}]*$/\n const match = beforeBlock.match(funcPattern)\n\n if (!match) {\n // Try arrow function or method syntax\n const arrowPattern =\n /(?:const|let|var)?\\s*\\w+\\s*=\\s*(?:async\\s*)?\\(([^)]*)\\)\\s*(?:=>|->)?\\s*\\{[^}]*$/\n const arrowMatch = beforeBlock.match(arrowPattern)\n if (!arrowMatch) return undefined\n return extractTypeFromParams(arrowMatch[1], paramName)\n }\n\n return extractTypeFromParams(match[1], paramName)\n}\n\n/**\n * Extract the type annotation for a specific parameter from a parameter list string\n */\nfunction extractTypeFromParams(\n paramsStr: string,\n paramName: string\n): string | undefined {\n // Split by comma (handling nested structures)\n const params = paramsStr.split(',').map((p) => p.trim())\n\n for (const param of params) {\n // Match patterns like:\n // - `name: Float32Array`\n // - `name: number`\n // - `name = Float32Array` (TJS example syntax)\n const colonMatch = param.match(\n new RegExp(`^${paramName}\\\\s*:\\\\s*([A-Za-z][A-Za-z0-9]*)`)\n )\n if (colonMatch) {\n return colonMatch[1]\n }\n\n // Match TypeScript-style with equals (default value that's a type constructor)\n const equalsMatch = param.match(\n new RegExp(\n `^${paramName}\\\\s*=\\\\s*(Float32Array|Float64Array|Int32Array|Uint8Array|Int8Array|Int16Array|Uint16Array|Uint32Array)`\n )\n )\n if (equalsMatch) {\n return equalsMatch[1]\n }\n }\n\n return undefined\n}\n\n/**\n * Transform Is/IsNot infix operators to function calls\n *\n * Syntax:\n * a Is b -> Is(a, b)\n * a IsNot b -> IsNot(a, b)\n *\n * This enables structural equality with a clean syntax.\n */\nexport function transformIsOperators(source: string): string {\n // Match: (simpleExpr) IsNot (simpleExpr) - must check IsNot first (longer match)\n // simpleExpr = identifier chain with optional [], () OR literals\n const exprPat =\n '([\\\\w][\\\\w.\\\\[\\\\]()]*|null|undefined|true|false|\\\\d+(?:\\\\.\\\\d+)?|\\'[^\\']*\\'|\"[^\"]*\")'\n\n // Transform IsNot first (longer keyword)\n const isNotRegex = new RegExp(exprPat + '\\\\s+IsNot\\\\s+' + exprPat, 'g')\n source = source.replace(isNotRegex, 'IsNot($1, $2)')\n\n // Transform Is\n const isRegex = new RegExp(exprPat + '\\\\s+Is\\\\s+' + exprPat, 'g')\n source = source.replace(isRegex, 'Is($1, $2)')\n\n return source\n}\n\n/**\n * Insert semicolons to prevent ASI footguns (TjsStandard mode)\n *\n * JavaScript's ASI (Automatic Semicolon Insertion) has notorious footguns:\n *\n * foo // Intended: call foo, then IIFE\n * (() => {})() // Actual: foo(...)(...) - calls foo with IIFE as argument!\n *\n * TjsStandard prevents this by treating newlines as statement terminators\n * (like Go, Swift, Kotlin). When a line starts with a problematic character\n * that could continue the previous line, we insert a semicolon.\n *\n * Problematic line starts: ( [ / + - `\n *\n * We only insert when the previous line doesn't already end with:\n * - A semicolon\n * - An opening brace/bracket/paren (multi-line expression)\n * - A comma (array/object literal or params)\n * - An operator that clearly continues (+, -, *, /, =, etc.)\n * - A keyword that expects continuation (return, throw, etc. followed by value)\n */\nexport function insertAsiProtection(source: string): string {\n // Characters that can continue a previous expression (ASI footguns)\n const continuationStarts = /^[\\s]*[([/+\\-`]/\n\n // Characters/patterns that indicate the previous line expects continuation\n // (don't insert semicolon after these)\n const expectsContinuation = /[{([,;:+\\-*/%=&|?<>!~^]\\s*$|^\\s*$/\n\n // Keywords that expect an expression to follow on same or next line\n const continueKeywords =\n /\\b(return|throw|yield|await|case|default|extends|new|typeof|void|delete|in|of|instanceof)\\s*$/\n\n const lines = source.split('\\n')\n const result: string[] = []\n let inBlockComment = false\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const prevLine = i > 0 ? lines[i - 1] : ''\n\n // Track block comment state\n if (inBlockComment) {\n result.push(line)\n if (line.includes('*/')) inBlockComment = false\n continue\n }\n\n // Check if this line opens a block comment\n const commentOpen = line.indexOf('/*')\n const commentClose = line.indexOf('*/')\n if (\n commentOpen !== -1 &&\n (commentClose === -1 || commentClose < commentOpen)\n ) {\n inBlockComment = true\n result.push(line)\n continue\n }\n\n // Check if this line starts with a problematic character\n if (i > 0 && continuationStarts.test(line)) {\n // Get the previous line without trailing comment\n const prevNoComment = prevLine\n .replace(/\\/\\/.*$/, '')\n .replace(/\\/\\*.*\\*\\/\\s*$/, '')\n\n // Don't insert if prev line clearly expects continuation\n if (\n !expectsContinuation.test(prevNoComment) &&\n !continueKeywords.test(prevNoComment)\n ) {\n // Insert semicolon at start of this line (preserving whitespace)\n const match = line.match(/^(\\s*)/)\n const indent = match ? match[1] : ''\n const rest = line.slice(indent.length)\n result.push(indent + ';' + rest)\n continue\n }\n }\n\n result.push(line)\n }\n\n return result.join('\\n')\n}\n\n/**\n * Transform == and != to Is() and IsNot() calls\n *\n * In TJS normal mode:\n * a == b -> Is(a, b) (structural equality)\n * a != b -> IsNot(a, b) (structural inequality)\n * a === b -> a === b (identity, unchanged)\n *\n * Uses a two-pass algorithm:\n * 1. Find all == and != positions (outside strings/comments/regex)\n * 2. Transform from end to start (so positions remain valid)\n */\nexport function transformEqualityToStructural(source: string): string {\n // Transform typeof to TypeOf() \u2014 fixes typeof null === 'object'\n source = source.replace(\n /\\btypeof\\s+([a-zA-Z_$][\\w$.]*(?:\\?\\.[\\w$]+)*)/g,\n 'TypeOf($1)'\n )\n\n // First pass: find all == and != positions (outside strings/comments/regex)\n const equalityOps: Array<{ pos: number; op: '==' | '!=' }> = []\n let i = 0\n let state: TokenizerState = 'normal'\n const templateStack: number[] = []\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n // Handle state transitions\n switch (state) {\n case 'single-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === \"'\") state = 'normal'\n i++\n continue\n\n case 'double-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '\"') state = 'normal'\n i++\n continue\n\n case 'template-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n i += 2\n templateStack.push(1)\n state = 'normal'\n continue\n }\n if (char === '`') state = 'normal'\n i++\n continue\n\n case 'line-comment':\n if (char === '\\n') state = 'normal'\n i++\n continue\n\n case 'block-comment':\n if (char === '*' && nextChar === '/') {\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'regex':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '[') {\n i++\n while (i < source.length && source[i] !== ']') {\n if (source[i] === '\\\\' && i + 1 < source.length) {\n i += 2\n } else {\n i++\n }\n }\n if (i < source.length) i++\n continue\n }\n if (char === '/') {\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) i++\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'normal':\n // Handle template stack\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n templateStack.pop()\n i++\n state = 'template-string'\n continue\n }\n }\n }\n\n // Check for string/comment/regex start\n if (char === \"'\") {\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n i += 2\n state = 'block-comment'\n continue\n }\n\n // Check for regex literal (simplified detection)\n if (char === '/') {\n let j = i - 1\n while (j >= 0 && /\\s/.test(source[j])) j--\n const beforeChar = j >= 0 ? source[j] : ''\n const isRegexContext =\n !beforeChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]/.test(beforeChar) ||\n (j >= 5 &&\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)$/.test(\n source.slice(Math.max(0, j - 10), j + 1)\n ))\n if (isRegexContext) {\n i++\n state = 'regex'\n continue\n }\n }\n\n // Look for == or != (but not === or !==)\n // For ==: check it's not part of !== (char before is !)\n // For !=: check it's not !== (third char is =)\n if (\n char === '=' &&\n nextChar === '=' &&\n source[i + 2] !== '=' &&\n source[i - 1] !== '!'\n ) {\n equalityOps.push({ pos: i, op: '==' })\n i += 2\n continue\n }\n if (char === '!' && nextChar === '=' && source[i + 2] !== '=') {\n equalityOps.push({ pos: i, op: '!=' })\n i += 2\n continue\n }\n break\n }\n\n i++\n }\n\n // If no equality operators found, return source unchanged\n if (equalityOps.length === 0) {\n return source\n }\n\n // Second pass: transform from end to start (so positions remain valid)\n let result = source\n for (let k = equalityOps.length - 1; k >= 0; k--) {\n const { pos, op } = equalityOps[k]\n const funcName = op === '==' ? 'Eq' : 'NotEq'\n\n // Find left operand boundary\n const leftBoundary = findLeftOperandBoundary(result, pos)\n // Find right operand boundary\n const rightBoundary = findRightOperandBoundary(result, pos + 2)\n\n const leftExpr = result.slice(leftBoundary, pos).trim()\n const rightExpr = result.slice(pos + 2, rightBoundary).trim()\n\n if (leftExpr && rightExpr) {\n // Build the replacement\n const before = result.slice(0, leftBoundary)\n const after = result.slice(rightBoundary)\n // Add space after keyword if needed (e.g., return, throw, typeof)\n const needsSpace = /[a-zA-Z0-9_$]$/.test(before)\n const spacer = needsSpace ? ' ' : ''\n result = `${before}${spacer}${funcName}(${leftExpr}, ${rightExpr})${after}`\n }\n }\n\n return result\n}\n\n/**\n * Find the start position of the left operand\n *\n * Scans backwards from the operator position to find where the left expression starts.\n * Respects operator precedence: == has lower precedence than arithmetic operators,\n * so `x % 2 == 0` has left operand `x % 2`.\n */\nfunction findLeftOperandBoundary(source: string, opPos: number): number {\n let i = opPos - 1\n\n // Skip whitespace before operator\n while (i >= 0 && /\\s/.test(source[i])) i--\n if (i < 0) return 0\n\n let depth = 0\n let inString = false\n let stringChar = ''\n\n while (i >= 0) {\n const char = source[i]\n const prevChar = i > 0 ? source[i - 1] : ''\n\n // Handle string literals (scan backwards through them)\n if (inString) {\n if (char === stringChar && prevChar !== '\\\\') {\n inString = false\n }\n i--\n continue\n }\n\n // Check for string end (we're scanning backwards, so end is opening quote)\n if ((char === '\"' || char === \"'\" || char === '`') && prevChar !== '\\\\') {\n inString = true\n stringChar = char\n i--\n continue\n }\n\n // Track depth of parens/brackets/braces (reversed since we're going backwards)\n if (char === ')' || char === ']' || char === '}') {\n depth++\n i--\n continue\n }\n if (char === '(' || char === '[') {\n if (depth > 0) {\n depth--\n i--\n continue\n }\n // Opening paren/bracket at depth 0 - this is a grouping/call paren\n // The expression starts AFTER it, not including it\n return i + 1\n }\n if (char === '{') {\n if (depth > 0) {\n depth--\n i--\n continue\n }\n // Opening brace at depth 0 \u2014 could be block statement boundary\n return i + 1\n }\n\n // Inside nested expression - keep scanning\n if (depth > 0) {\n i--\n continue\n }\n\n // At depth 0 - check for expression boundaries\n // Statement delimiters\n if (char === ';') {\n return i + 1\n }\n\n // Check for keywords that precede expressions (return, throw, etc.)\n // We need to look backwards for a word boundary and check if it's a keyword\n if (/[a-z]/.test(char)) {\n // Might be end of a keyword - scan backwards to get full word\n const wordEnd = i + 1\n let wordStart = i\n while (wordStart > 0 && /[a-z]/i.test(source[wordStart - 1])) {\n wordStart--\n }\n const word = source.slice(wordStart, wordEnd)\n // Check if preceded by word char (not a keyword then)\n const beforeWord = wordStart > 0 ? source[wordStart - 1] : ''\n if (!/[a-zA-Z0-9_$]/.test(beforeWord)) {\n // These keywords start an expression - stop after them\n if (\n [\n 'return',\n 'throw',\n 'case',\n 'typeof',\n 'void',\n 'delete',\n 'await',\n 'yield',\n ].includes(word)\n ) {\n return wordEnd\n }\n // 'new' is part of the operand (new Foo() == bar),\n // so include it by continuing the scan\n if (word === 'new') {\n return wordStart\n }\n }\n }\n\n // Arrow function - stop before =>\n if (char === '>' && prevChar === '=') {\n return i + 1\n }\n\n // Assignment operator (but not ==, !=, <=, >=)\n if (\n char === '=' &&\n prevChar !== '=' &&\n prevChar !== '!' &&\n prevChar !== '<' &&\n prevChar !== '>'\n ) {\n return i + 1\n }\n\n // Logical operators (lower precedence than ==)\n if (char === '&' && prevChar === '&') {\n return i + 1\n }\n if (char === '|' && prevChar === '|') {\n return i + 1\n }\n\n // Ternary operators\n if (char === '?' || char === ':') {\n return i + 1\n }\n\n // Comma\n if (char === ',') {\n return i + 1\n }\n\n i--\n }\n\n return 0\n}\n\n/**\n * Find the end position of the right operand\n *\n * Scans forward from after the operator to find where the right expression ends.\n */\nfunction findRightOperandBoundary(\n source: string,\n startAfterOp: number\n): number {\n let i = startAfterOp\n\n // Skip whitespace after operator\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i >= source.length) return source.length\n\n let depth = 0\n let inString = false\n let stringChar = ''\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = i + 1 < source.length ? source[i + 1] : ''\n\n // Handle string literals\n if (inString) {\n if (char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n }\n i++\n continue\n }\n\n if (\n (char === '\"' || char === \"'\" || char === '`') &&\n source[i - 1] !== '\\\\'\n ) {\n inString = true\n stringChar = char\n i++\n continue\n }\n\n // Track depth\n if (char === '(' || char === '[' || char === '{') {\n depth++\n i++\n continue\n }\n if (char === ')' || char === ']' || char === '}') {\n if (depth > 0) {\n depth--\n i++\n continue\n }\n // Closing paren at depth 0 - boundary\n return i\n }\n\n // Inside nested - keep scanning\n if (depth > 0) {\n i++\n continue\n }\n\n // At depth 0 - check for expression boundaries\n if (char === ';') {\n return i\n }\n\n // Logical operators - lower precedence than ==\n if (char === '&' && nextChar === '&') {\n return i\n }\n if (char === '|' && nextChar === '|') {\n return i\n }\n\n // Ternary\n if (char === '?') {\n return i\n }\n if (char === ':') {\n return i\n }\n\n // Comma\n if (char === ',') {\n return i\n }\n\n // Another == or != (chained equality - stop before it)\n if (\n (char === '=' || char === '!') &&\n nextChar === '=' &&\n source[i + 2] !== '='\n ) {\n return i\n }\n\n i++\n }\n\n return source.length\n}\n\n/**\n * Transform Type block declarations\n *\n * Syntax forms:\n * Type Foo 'example' -> const Foo = Type('Foo', 'example')\n * Type Foo { example: 'value' } -> const Foo = Type('Foo', 'value')\n * Type Foo 'description' { example: 'value' }\n * -> const Foo = Type('description', 'value')\n * Type Foo 'description' { example: 0, predicate(x) { return x > 0 } }\n * -> const Foo = Type('description', (x) => { ... }, 0)\n *\n * When predicate + example: auto-generate type guard from example\n */\nexport function transformTypeDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Type' keyword followed by identifier\n const typeMatch = source\n .slice(i)\n .match(/^\\bType\\s+([A-Z_][a-zA-Z0-9_]*)\\s*/)\n if (typeMatch) {\n const typeName = typeMatch[1]\n let j = i + typeMatch[0].length\n\n // Check for optional description string\n // Only treat as description if followed by = or {\n let description = typeName\n let descriptionWasExplicit = false\n const descStringMatch = source.slice(j).match(/^(['\"`])([^]*?)\\1\\s*/)\n if (descStringMatch) {\n const afterString = j + descStringMatch[0].length\n const nextChar = source[afterString]\n // Check if this looks like end of statement (not followed by = or {)\n // Note: the \\s* in the regex consumes trailing whitespace including newlines\n const isEndOfStatement =\n nextChar === undefined ||\n afterString >= source.length ||\n (nextChar !== '=' && nextChar !== '{')\n\n if (nextChar === '=' || nextChar === '{') {\n // It's a description followed by = or { block\n description = descStringMatch[2]\n descriptionWasExplicit = true\n j = afterString\n } else if (isEndOfStatement) {\n // Old simple form: Type Name 'value' - value is both example and default\n const value = descStringMatch[0].trim()\n // Preserve trailing whitespace (newlines) that was consumed by the regex\n const trailingWs = descStringMatch[0].slice(value.length)\n result += `const ${typeName} = Type('${typeName}', ${value})${trailingWs}`\n i = afterString\n continue\n }\n }\n\n // Check for = default value\n let defaultValue: string | undefined\n let posAfterDefault = j // Track position right after the default value\n const equalsMatch = source.slice(j).match(/^=\\s*/)\n if (equalsMatch) {\n j += equalsMatch[0].length\n // Parse the default value (handles +number, strings, objects, arrays, etc.)\n const valueMatch = source\n .slice(j)\n .match(\n /^(\\+?\\d+(?:\\.\\d+)?|['\"`][^'\"`]*['\"`]|\\{[^}]*\\}|\\[[^\\]]*\\]|true|false|null)/\n )\n if (valueMatch) {\n defaultValue = valueMatch[0]\n j += valueMatch[0].length\n posAfterDefault = j // Save position before consuming whitespace\n // Skip whitespace after default (only to check for block)\n const wsMatch = source.slice(j).match(/^\\s*/)\n if (wsMatch) j += wsMatch[0].length\n }\n }\n\n // Check for block { ... }\n if (source[j] === '{') {\n // Block form: Type Foo 'desc'? = default? { ... }\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n // Unbalanced - just copy and continue\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse block body for description (old syntax fallback), example, predicate\n const descInsideMatch = blockBody.match(\n /description\\s*:\\s*(['\"`])([^]*?)\\1/\n )\n if (descInsideMatch && !descriptionWasExplicit) {\n description = descInsideMatch[2]\n }\n\n // Extract example value using state machine for nested structures\n let example: string | undefined\n const exampleKeyword = blockBody.match(/example\\s*:\\s*/)\n if (exampleKeyword) {\n const valueStart = exampleKeyword.index! + exampleKeyword[0].length\n const extracted = extractJSValue(blockBody, valueStart)\n if (extracted) {\n example = extracted.value.trim()\n }\n }\n\n const predicateMatch = blockBody.match(\n /predicate\\s*\\(([^)]*)\\)\\s*\\{([^]*)\\}/\n )\n\n // Build Type() call with appropriate arguments\n // Type(description, predicateOrExample, example?, default?)\n if (predicateMatch && example) {\n // Predicate + example\n const params = predicateMatch[1].trim()\n const body = predicateMatch[2].trim()\n const defaultArg = defaultValue ? `, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', (${params}) => { if (!globalThis.__tjs?.validate(${params}, globalThis.__tjs?.infer(${example}))) return false; ${body} }, ${example}${defaultArg})`\n } else if (predicateMatch) {\n // Predicate only\n const params = predicateMatch[1].trim()\n const body = predicateMatch[2].trim()\n const defaultArg = defaultValue ? `, undefined, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', (${params}) => { ${body} }${defaultArg})`\n } else if (example) {\n // Example only (becomes validation schema)\n const defaultArg = defaultValue ? `, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', undefined, ${example}${defaultArg})`\n } else if (defaultValue) {\n // Default only (infer schema from default)\n result += `const ${typeName} = Type('${description}', ${defaultValue})`\n } else {\n // Empty block - error or description-only type\n result += `const ${typeName} = Type('${description}')`\n }\n\n i = blockEnd\n continue\n } else if (defaultValue) {\n // Simple form with default: Type Foo = 'value' or Type Foo 'desc' = 'value'\n result += `const ${typeName} = Type('${description}', ${defaultValue})`\n i = posAfterDefault // Use position before whitespace was consumed\n continue\n } else if (!descStringMatch) {\n // No description, no default, no block - look for old simple form: Type Foo 'value'\n const valueMatch = source\n .slice(j)\n .match(\n /^(['\"`][^]*?['\"`]|\\+?\\d+(?:\\.\\d+)?|true|false|null|\\{[^]*?\\}|\\[[^]*?\\])/\n )\n if (valueMatch) {\n const example = valueMatch[0]\n result += `const ${typeName} = Type('${typeName}', ${example})`\n i = j + valueMatch[0].length\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform FunctionPredicate declarations\n *\n * Block form:\n * FunctionPredicate Callback {\n * params: { x: 0, y: '' }\n * returns: false\n * }\n * \u2192 const Callback = FunctionPredicate('Callback', { params: { x: 0, y: '' }, returns: false })\n *\n * Generic block form:\n * FunctionPredicate Creator<T = {}> {\n * params: { contents: [null] }\n * returns: T\n * }\n * \u2192 const Creator = FunctionPredicate('Creator', [['T', {}]], (T) => ({ params: { contents: [null] }, returns: T }))\n *\n * Function form:\n * FunctionPredicate Handler(existingFn, 'description')\n * \u2192 const Handler = FunctionPredicate('description', existingFn)\n */\nexport function transformFunctionPredicateDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n const fpMatch = source\n .slice(i)\n .match(/^\\bFunctionPredicate\\s+([A-Z_][a-zA-Z0-9_]*)\\s*(?:<([^>]+)>)?\\s*/)\n if (fpMatch) {\n const fpName = fpMatch[1]\n const typeParamsStr = fpMatch[2] // undefined if no <...>\n const j = i + fpMatch[0].length\n\n // Check for block form: FunctionPredicate Name { ... } or FunctionPredicate Name<T> { ... }\n if (source[j] === '{') {\n // Find matching closing brace\n let depth = 1\n let k = j + 1\n while (k < source.length && depth > 0) {\n if (source[k] === '{') depth++\n else if (source[k] === '}') depth--\n k++\n }\n\n if (depth === 0) {\n const blockBody = source.slice(j + 1, k - 1).trim()\n\n // Extract params: { ... } (brace-balanced for nested objects like { el: {} })\n const paramsMatch = extractBalancedValue(blockBody, /params\\s*:\\s*\\{/)\n // Extract returns value\n const returnsMatch = blockBody.match(/returns\\s*:\\s*(.+?)(?:\\n|$)/)\n // Extract returnContract\n const contractMatch = blockBody.match(\n /returnContract\\s*:\\s*['\"](\\w+)['\"]/\n )\n // Extract description\n const descMatch = blockBody.match(/description\\s*:\\s*(['\"])([^]*?)\\1/)\n\n const spec: string[] = []\n if (paramsMatch) spec.push(`params: ${paramsMatch[1]}`)\n if (returnsMatch) spec.push(`returns: ${returnsMatch[1].trim()}`)\n if (contractMatch) {\n spec.push(`returnContract: '${contractMatch[1]}'`)\n }\n\n const desc = descMatch ? descMatch[2] : fpName\n\n if (typeParamsStr) {\n // Generic form \u2014 emit factory with type params\n const typeParams = typeParamsStr.split(',').map((p) => {\n const parts = p\n .trim()\n .split('=')\n .map((s) => s.trim())\n if (parts.length === 2) {\n const defaultVal =\n parts[1] === 'any' || parts[1] === 'undefined'\n ? 'null'\n : parts[1]\n return `['${parts[0]}', ${defaultVal}]`\n }\n return `'${parts[0]}'`\n })\n const paramNames = typeParamsStr\n .split(',')\n .map((p) => p.trim().split('=')[0].trim())\n result += `const ${fpName} = FunctionPredicate('${desc}', [${typeParams.join(\n ', '\n )}], (${paramNames.join(', ')}) => ({ ${spec.join(', ')} }))`\n } else {\n // Non-generic form\n result += `const ${fpName} = FunctionPredicate('${desc}', { ${spec.join(\n ', '\n )} })`\n }\n i = k\n continue\n }\n }\n\n // Check for function form: FunctionPredicate Name(fn, 'desc')\n if (source[j] === '(') {\n // Find matching closing paren\n let depth = 1\n let k = j + 1\n while (k < source.length && depth > 0) {\n if (source[k] === '(') depth++\n else if (source[k] === ')') depth--\n k++\n }\n\n if (depth === 0) {\n const args = source.slice(j + 1, k - 1).trim()\n // Split on comma: fn, 'description'\n const commaIdx = args.indexOf(',')\n if (commaIdx !== -1) {\n const fnRef = args.slice(0, commaIdx).trim()\n const desc = args.slice(commaIdx + 1).trim()\n result += `const ${fpName} = FunctionPredicate(${desc}, ${fnRef})`\n } else {\n // Just a function reference, name as description\n result += `const ${fpName} = FunctionPredicate('${fpName}', ${args})`\n }\n i = k\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform Generic block declarations\n *\n * Syntax:\n * Generic Pair<T, U> { description: '...', predicate(obj, T, U) { ... } }\n * Generic Container<T, U = ''> { ... } // U has default\n *\n * Transforms to:\n * const Pair = Generic(['T', 'U'], (obj, checkT, checkU) => { ... }, '...')\n * const Container = Generic(['T', ['U', '']], (obj, checkT, checkU) => { ... }, '...')\n */\nexport function transformGenericDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Generic' keyword followed by identifier and type params\n const genericMatch = source\n .slice(i)\n .match(/^\\bGeneric\\s+([A-Z][a-zA-Z0-9_]*)\\s*<([^>]+)>\\s*\\{/)\n if (genericMatch) {\n const genericName = genericMatch[1]\n const typeParamsStr = genericMatch[2]\n const blockStart = i + genericMatch[0].length - 1\n const bodyStart = blockStart + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n // Unbalanced - just copy and continue\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse type params: T, U = Default\n const typeParams = typeParamsStr.split(',').map((p) => {\n const parts = p\n .trim()\n .split('=')\n .map((s) => s.trim())\n if (parts.length === 2) {\n // 'any' and 'undefined' aren't valid JS values \u2014 use null\n const defaultVal =\n parts[1] === 'any' || parts[1] === 'undefined' ? 'null' : parts[1]\n return `['${parts[0]}', ${defaultVal}]`\n }\n return `'${parts[0]}'`\n })\n\n // Parse the block body\n // Strip declaration { ... } block before parsing (it's .d.ts metadata, not runtime)\n let parsedBody = blockBody\n const declIdx = parsedBody.search(/\\bdeclaration\\s*\\{/)\n if (declIdx !== -1) {\n // Find matching closing brace for the declaration block\n const declBraceStart = parsedBody.indexOf('{', declIdx)\n let dDepth = 1\n let dj = declBraceStart + 1\n while (dj < parsedBody.length && dDepth > 0) {\n if (parsedBody[dj] === '{') dDepth++\n else if (parsedBody[dj] === '}') dDepth--\n dj++\n }\n // Remove the declaration block\n parsedBody = parsedBody.slice(0, declIdx) + parsedBody.slice(dj)\n }\n\n const descMatch = parsedBody.match(/description\\s*:\\s*(['\"`])([^]*?)\\1/)\n const predicateMatch = parsedBody.match(\n /predicate\\s*\\(([^)]*)\\)\\s*\\{([^]*)\\}/\n )\n\n const description = descMatch ? descMatch[2] : genericName\n\n if (predicateMatch) {\n const params = predicateMatch[1]\n .trim()\n .split(',')\n .map((s) => s.trim())\n let body = predicateMatch[2].trim()\n\n // First param is the value, rest are type params\n const valueParam = params[0] || 'x'\n const typeParamNames = params.slice(1)\n const typeCheckParams = typeParamNames.map((p) => `check${p}`)\n\n // Replace type param names with check functions in body\n // e.g., T(x[0]) becomes checkT(x[0])\n typeParamNames.forEach((name, idx) => {\n body = body.replace(\n new RegExp(`\\\\b${name}\\\\s*\\\\(`, 'g'),\n `${typeCheckParams[idx]}(`\n )\n })\n\n result += `const ${genericName} = Generic([${typeParams.join(\n ', '\n )}], (${valueParam}, ${typeCheckParams.join(\n ', '\n )}) => { ${body} }, '${description}')`\n } else {\n // No predicate - create a generic that always passes\n result += `const ${genericName} = Generic([${typeParams.join(\n ', '\n )}], () => true, '${description}')`\n }\n\n i = blockEnd\n continue\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform Union declarations\n *\n * Syntax:\n * Union Direction 'cardinal direction' {\n * 'up' | 'down' | 'left' | 'right'\n * }\n *\n * Transforms to:\n * const Direction = Union('cardinal direction', ['up', 'down', 'left', 'right'])\n *\n * Also supports inline form:\n * Union Direction 'cardinal direction' 'up' | 'down' | 'left' | 'right'\n */\nexport function transformUnionDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Union' keyword followed by identifier and description\n const unionMatch = source\n .slice(i)\n .match(/^\\bUnion\\s+([A-Z][a-zA-Z0-9_]*)\\s+(['\"`])([^]*?)\\2\\s*/)\n if (unionMatch) {\n const unionName = unionMatch[1]\n const description = unionMatch[3]\n const j = i + unionMatch[0].length\n\n // Check what follows: block or inline values\n if (source[j] === '{') {\n // Block form: Union Foo 'desc' { ... }\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse values: 'a' | 'b' | 'c' or \"a\" | \"b\" or mixed\n const values = parseUnionValues(blockBody)\n result += `const ${unionName} = Union('${description}', [${values.join(\n ', '\n )}])`\n i = blockEnd\n continue\n } else {\n // Inline form: Union Foo 'desc' 'a' | 'b' | 'c'\n // Find the end of the line or statement\n let lineEnd = source.indexOf('\\n', j)\n if (lineEnd === -1) lineEnd = source.length\n const inlineValues = source.slice(j, lineEnd).trim()\n\n if (inlineValues) {\n const values = parseUnionValues(inlineValues)\n result += `const ${unionName} = Union('${description}', [${values.join(\n ', '\n )}])`\n i = lineEnd\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Parse union values from a string like: 'a' | 'b' | 123 | true\n * Returns array of value literals as strings\n */\nfunction parseUnionValues(input: string): string[] {\n const values: string[] = []\n // Split on | and trim, preserving quoted strings and literals\n const parts = input.split('|').map((p) => p.trim())\n\n for (const part of parts) {\n if (!part) continue\n // Keep the value as-is (already a valid JS literal)\n values.push(part)\n }\n\n return values\n}\n\n/**\n * Transform Enum declarations\n *\n * Syntax:\n * Enum Status 'task status' {\n * Pending\n * Active\n * Done\n * }\n *\n * Enum Color 'CSS color' {\n * Red = 'red'\n * Green = 'green'\n * Blue = 'blue'\n * }\n *\n * Transforms to:\n * const Status = Enum('task status', { Pending: 0, Active: 1, Done: 2 })\n * const Color = Enum('CSS color', { Red: 'red', Green: 'green', Blue: 'blue' })\n */\nexport function transformEnumDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Enum' keyword followed by identifier and description\n const enumMatch = source\n .slice(i)\n .match(/^\\bEnum\\s+([A-Z][a-zA-Z0-9_]*)\\s+(['\"`])([^]*?)\\2\\s*\\{/)\n if (enumMatch) {\n const enumName = enumMatch[1]\n const description = enumMatch[3]\n const blockStart = i + enumMatch[0].length - 1\n const bodyStart = blockStart + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse enum members\n const members = parseEnumMembers(blockBody)\n const membersStr = members\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ')\n\n result += `const ${enumName} = Enum('${description}', { ${membersStr} })`\n i = blockEnd\n continue\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Parse enum members from block body\n * Handles: Pending, Active = 5, Done, Name = 'value'\n * Returns array of [key, value] pairs\n */\nfunction parseEnumMembers(input: string): [string, string][] {\n const members: [string, string][] = []\n let currentNumericValue = 0\n\n // Split on newlines and commas, filter empty\n const lines = input\n .split(/[\\n,]/)\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith('//'))\n\n for (const line of lines) {\n // Match: Name or Name = value\n const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*(?:=\\s*(.+))?$/)\n if (match) {\n const key = match[1]\n const explicitValue = match[2]?.trim()\n\n if (explicitValue !== undefined) {\n members.push([key, explicitValue])\n // If it's a number, update the counter\n const numVal = Number(explicitValue)\n if (!isNaN(numVal)) {\n currentNumericValue = numVal + 1\n }\n } else {\n // Auto-increment numeric value\n members.push([key, String(currentNumericValue)])\n currentNumericValue++\n }\n }\n }\n\n return members\n}\n\n/**\n * Extension info for a single extend block\n */\n\nexport function transformExtendDeclarations(source: string): {\n source: string\n extensions: Map<string, Set<string>>\n} {\n const extensions = new Map<string, Set<string>>()\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'extend' keyword at statement boundary\n const remaining = source.slice(i)\n const extendMatch = remaining.match(/^(\\s*)extend\\s+([A-Z]\\w*)\\s*\\{/)\n\n if (!extendMatch) {\n // Check if we're at start of line or after semicolon/brace\n const lineStart =\n i === 0 ||\n source[i - 1] === '\\n' ||\n source[i - 1] === ';' ||\n source[i - 1] === '}'\n\n if (lineStart) {\n const afterWS = remaining.match(/^(\\s*)extend\\s+([A-Z]\\w*)\\s*\\{/)\n if (afterWS) {\n // Already handled above, fall through\n }\n }\n result += source[i]\n i++\n continue\n }\n\n const indent = extendMatch[1]\n const typeName = extendMatch[2]\n const blockStart = i + extendMatch[0].length - 1 // position of {\n\n // Find matching closing brace\n const blockEnd = findFunctionBodyEnd(source, blockStart)\n const blockBody = source.slice(blockStart + 1, blockEnd - 1).trim()\n\n // Parse methods from the block body\n // Match: methodName(params) { body } or async methodName(params) { body }\n const methods: { name: string; isAsync: boolean; fullText: string }[] = []\n let j = 0\n const bodySource = source.slice(blockStart + 1, blockEnd - 1)\n\n while (j < bodySource.length) {\n const methodRemaining = bodySource.slice(j)\n const methodMatch = methodRemaining.match(/^(\\s*)(async\\s+)?(\\w+)\\s*\\(/)\n\n if (!methodMatch) {\n j++\n continue\n }\n\n const methodIndent = methodMatch[1]\n const isAsync = !!methodMatch[2]\n const methodName = methodMatch[3]\n\n // Reject arrow functions \u2014 they don't bind `this`\n // We'll check after finding the body\n\n // Find the opening paren\n const parenStart = j + methodMatch[0].length - 1\n let parenDepth = 1\n let k = parenStart + 1\n while (k < bodySource.length && parenDepth > 0) {\n if (bodySource[k] === '(') parenDepth++\n if (bodySource[k] === ')') parenDepth--\n k++\n }\n const paramsStr = bodySource.slice(parenStart + 1, k - 1)\n\n // Skip whitespace to find { or =>\n let afterParams = k\n while (\n afterParams < bodySource.length &&\n /\\s/.test(bodySource[afterParams])\n ) {\n afterParams++\n }\n\n // Check for arrow function\n if (\n bodySource[afterParams] === '=' &&\n bodySource[afterParams + 1] === '>'\n ) {\n const loc = locAt(source, blockStart + 1 + j)\n throw new SyntaxError(\n `Arrow functions are not allowed in extend blocks (method '${methodName}' in extend ${typeName}). ` +\n `Use regular function syntax instead, as extension methods need 'this' binding.`,\n loc\n )\n }\n\n if (bodySource[afterParams] !== '{') {\n j++\n continue\n }\n\n // Find matching closing brace for the method body\n const methodBodyEnd = findFunctionBodyEnd(bodySource, afterParams)\n const fullMethodText = bodySource.slice(j, methodBodyEnd).trim()\n\n // Build: methodName: function(params) { body }\n // Transform TJS colon params (name: value) to JS defaults (name = value)\n const transformedParams = paramsStr\n .split(',')\n .map((p) => p.trim())\n .filter((p) => p.length > 0)\n .map((p) => {\n // name: value -> name = value (TJS colon shorthand)\n const colonMatch = p.match(/^(\\w+)\\s*:\\s*(.+)$/)\n if (colonMatch) return `${colonMatch[1]} = ${colonMatch[2]}`\n return p\n })\n .join(', ')\n const asyncPrefix = isAsync ? 'async ' : ''\n const methodBody = bodySource.slice(afterParams + 1, methodBodyEnd - 1)\n methods.push({\n name: methodName,\n isAsync,\n fullText: `${methodName}: ${asyncPrefix}function(${transformedParams}) {${methodBody}}`,\n })\n\n j = methodBodyEnd\n }\n\n // Track extensions\n const isFirstForType = !extensions.has(typeName)\n if (isFirstForType) {\n extensions.set(typeName, new Set())\n }\n const extSet = extensions.get(typeName)!\n for (const m of methods) {\n extSet.add(m.name)\n }\n\n // Generate the __ext object (or merge into existing)\n const methodEntries = methods.map((m) => ` ${m.fullText}`).join(',\\n')\n let replacement: string\n if (isFirstForType) {\n replacement = `${indent}const __ext_${typeName} = {\\n${methodEntries}\\n${indent}}\\n`\n } else {\n // Merge into existing: Object.assign(__ext_TypeName, { ... })\n replacement = `${indent}Object.assign(__ext_${typeName}, {\\n${methodEntries}\\n${indent}})\\n`\n }\n\n // Generate registration calls\n for (const m of methods) {\n replacement += `${indent}if (__tjs?.registerExtension) { __tjs.registerExtension('${typeName}', '${m.name}', __ext_${typeName}.${m.name}) }\\n`\n }\n\n result += replacement\n i = blockEnd\n }\n\n // Append any remaining source\n if (i <= source.length && result.length < source.length) {\n // Already handled character by character\n }\n\n return { source: result, extensions }\n}\n\n/**\n * Transform method calls on known-type receivers to use extension objects.\n *\n * For literals and typed variables where the type is known:\n * 'hello'.capitalize() -> __ext_String.capitalize.call('hello')\n * [1,2,3].last() -> __ext_Array.last.call([1,2,3])\n *\n * This is a best-effort source-level transform. For unknown types,\n * the runtime fallback (resolveExtension) handles it.\n */\nexport function transformExtensionCalls(\n source: string,\n extensions: Map<string, Set<string>>\n): string {\n if (extensions.size === 0) return source\n\n // Build a map of method names to possible type names for quick lookup\n const methodToTypes = new Map<string, string[]>()\n for (const [typeName, methods] of extensions) {\n for (const method of methods) {\n if (!methodToTypes.has(method)) {\n methodToTypes.set(method, [])\n }\n methodToTypes.get(method)!.push(typeName)\n }\n }\n\n let result = source\n\n // Rewrite calls on string literals: 'str'.method(...) or \"str\".method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('String')) continue\n\n // Match string literal followed by .method(\n // Single-quoted strings\n const singleQuotePattern = new RegExp(\n `('(?:[^'\\\\\\\\]|\\\\\\\\.)*')\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(singleQuotePattern, (_, str, meth, closeParen) => {\n return closeParen\n ? `__ext_String.${meth}.call(${str})`\n : `__ext_String.${meth}.call(${str}, `\n })\n\n // Double-quoted strings\n const doubleQuotePattern = new RegExp(\n `(\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\")\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(doubleQuotePattern, (_, str, meth, closeParen) => {\n return closeParen\n ? `__ext_String.${meth}.call(${str})`\n : `__ext_String.${meth}.call(${str}, `\n })\n\n // Template literals (backtick) \u2014 simple case only (no nested templates)\n const templatePattern = new RegExp(\n '(`(?:[^`\\\\\\\\]|\\\\\\\\.)*`)\\\\.' + method + '\\\\((\\\\))?',\n 'g'\n )\n result = result.replace(templatePattern, (_, str, closeParen) => {\n return closeParen\n ? `__ext_String.${method}.call(${str})`\n : `__ext_String.${method}.call(${str}, `\n })\n }\n\n // Rewrite calls on array literals: [1,2,3].method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('Array')) continue\n\n // Match array literal [...].method(\n // This is tricky \u2014 we need to find balanced brackets\n // Simple approach: find ].method( and walk backward to find matching [\n const methodDot = `].${method}(`\n let searchFrom = 0\n let idx: number\n while ((idx = result.indexOf(methodDot, searchFrom)) !== -1) {\n // Walk backward from idx to find matching [\n let bracketDepth = 1\n let k = idx - 1\n let inStr: string | false = false\n while (k >= 0 && bracketDepth > 0) {\n const ch = result[k]\n if (inStr) {\n if (ch === inStr && (k === 0 || result[k - 1] !== '\\\\')) {\n inStr = false\n }\n } else {\n if (ch === ']') bracketDepth++\n if (ch === '[') bracketDepth--\n if (ch === \"'\" || ch === '\"' || ch === '`') inStr = ch\n }\n k--\n }\n\n if (bracketDepth === 0) {\n const arrayLiteral = result.slice(k + 1, idx + 1)\n const before = result.slice(0, k + 1)\n const after = result.slice(idx + methodDot.length)\n // Check if no-args call: next char is )\n if (after[0] === ')') {\n result = `${before}__ext_Array.${method}.call(${arrayLiteral})${after.slice(\n 1\n )}`\n } else {\n result = `${before}__ext_Array.${method}.call(${arrayLiteral}, ${after}`\n }\n }\n\n searchFrom = idx + 1\n }\n }\n\n // Rewrite calls on number literals: (42).method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('Number')) continue\n\n const numPattern = new RegExp(\n `(\\\\d+(?:\\\\.\\\\d+)?)\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(numPattern, (_, num, meth, closeParen) => {\n return closeParen\n ? `__ext_Number.${meth}.call(${num})`\n : `__ext_Number.${meth}.call(${num}, `\n })\n }\n\n return result\n}\n\n/**\n * Compute {line, column} from a character offset in source.\n */\nexport function locAt(\n source: string,\n pos: number\n): { line: number; column: number } {\n let line = 1\n let column = 0\n for (let i = 0; i < pos && i < source.length; i++) {\n if (source[i] === '\\n') {\n line++\n column = 0\n } else {\n column++\n }\n }\n return { line, column }\n}\n\n/**\n * Info about a single function variant for polymorphic dispatch\n */\n\nfunction typeCheckForDefault(argExpr: string, defaultValue: string): string {\n const dv = defaultValue.trim()\n\n // String literal\n if (/^['\"`]/.test(dv)) return `typeof ${argExpr} === 'string'`\n\n // Boolean\n if (dv === 'true' || dv === 'false') return `typeof ${argExpr} === 'boolean'`\n\n // null\n if (dv === 'null') return `${argExpr} === null`\n\n // undefined\n if (dv === 'undefined') return `${argExpr} === undefined`\n\n // Array literal\n if (dv.startsWith('[')) return `Array.isArray(${argExpr})`\n\n // Object literal\n if (dv.startsWith('{'))\n return `(typeof ${argExpr} === 'object' && ${argExpr} !== null && !Array.isArray(${argExpr}))`\n\n // Non-negative integer: +N\n if (/^\\+\\d+/.test(dv))\n return `(typeof ${argExpr} === 'number' && Number.isInteger(${argExpr}) && ${argExpr} >= 0)`\n\n // Number with decimal \u2192 float\n if (/^-?\\d+\\.\\d+/.test(dv)) return `typeof ${argExpr} === 'number'`\n\n // Integer (whole number, possibly negative)\n if (/^-?\\d+$/.test(dv))\n return `(typeof ${argExpr} === 'number' && Number.isInteger(${argExpr}))`\n\n // Fallback: any\n return 'true'\n}\n\n/**\n * Get a type \"signature\" string from a default value for ambiguity checking.\n * Two params with the same signature at the same position are ambiguous.\n */\nfunction typeSignatureForDefault(defaultValue: string): string {\n const dv = defaultValue.trim()\n if (/^['\"`]/.test(dv)) return 'string'\n if (dv === 'true' || dv === 'false') return 'boolean'\n if (dv === 'null') return 'null'\n if (dv === 'undefined') return 'undefined'\n if (dv.startsWith('[')) return 'array'\n if (dv.startsWith('{')) return 'object'\n if (/^\\+\\d+/.test(dv)) return 'non-negative-integer'\n if (/^-?\\d+\\.\\d+/.test(dv)) return 'number'\n if (/^-?\\d+$/.test(dv)) return 'integer'\n return 'any'\n}\n\n/**\n * Parse a parameter string like \"a = 0, b = 'hello', c = { x: 0 }\"\n * into an array of { name, defaultValue, required } objects.\n * Handles nested braces/brackets/parens and template literals.\n */\nfunction parseParamList(\n paramStr: string,\n requiredParams: Set<string>\n): { name: string; defaultValue: string; required: boolean }[] {\n const params: { name: string; defaultValue: string; required: boolean }[] = []\n let depth = 0\n let current = ''\n let inString: string | false = false\n\n for (let i = 0; i < paramStr.length; i++) {\n const ch = paramStr[i]\n\n // Track string state\n if (!inString && (ch === \"'\" || ch === '\"' || ch === '`')) {\n inString = ch\n current += ch\n continue\n }\n if (inString) {\n current += ch\n if (ch === '\\\\') {\n i++\n if (i < paramStr.length) current += paramStr[i]\n continue\n }\n if (ch === inString) inString = false\n continue\n }\n\n // Track nesting\n if (ch === '(' || ch === '[' || ch === '{') {\n depth++\n current += ch\n continue\n }\n if (ch === ')' || ch === ']' || ch === '}') {\n depth--\n current += ch\n continue\n }\n\n // Split on comma at depth 0\n if (ch === ',' && depth === 0) {\n const param = parseOneParam(current.trim(), requiredParams)\n if (param) params.push(param)\n current = ''\n continue\n }\n\n current += ch\n }\n\n // Last param\n const trimmed = current.trim()\n if (trimmed) {\n const param = parseOneParam(trimmed, requiredParams)\n if (param) params.push(param)\n }\n\n return params\n}\n\n/**\n * Parse a single parameter like \"name = 'Alice'\" or \"/* unsafe * / x = 0\"\n */\nfunction parseOneParam(\n paramStr: string,\n requiredParams: Set<string>\n): { name: string; defaultValue: string; required: boolean } | null {\n // Strip leading /* unsafe */ comment\n const str = paramStr.replace(/^\\/\\*\\s*unsafe\\s*\\*\\/\\s*/, '')\n\n // Rest params not supported in polymorphic functions\n if (str.startsWith('...')) return null\n\n // Find = sign (the param has been transformed from : to = by transformParenExpressions)\n const eqIdx = str.indexOf('=')\n if (eqIdx === -1) {\n // No default value \u2014 untyped param\n return { name: str.trim(), defaultValue: '', required: true }\n }\n\n const name = str.slice(0, eqIdx).trim()\n const defaultValue = str.slice(eqIdx + 1).trim()\n return { name, defaultValue, required: requiredParams.has(name) }\n}\n\n/**\n * Find the end of a function body (matching closing brace).\n * Handles nested braces, strings, template literals, comments, and regex.\n * Returns the index AFTER the closing brace.\n */\nexport function findFunctionBodyEnd(\n source: string,\n openBracePos: number\n): number {\n let depth = 1\n let i = openBracePos + 1\n let inString: string | false = false\n let inLineComment = false\n let inBlockComment = false\n\n while (i < source.length && depth > 0) {\n const ch = source[i]\n const next = i + 1 < source.length ? source[i + 1] : ''\n\n // Line comment\n if (inLineComment) {\n if (ch === '\\n') inLineComment = false\n i++\n continue\n }\n\n // Block comment\n if (inBlockComment) {\n if (ch === '*' && next === '/') {\n inBlockComment = false\n i += 2\n continue\n }\n i++\n continue\n }\n\n // String tracking\n if (inString) {\n if (ch === '\\\\') {\n i += 2\n continue\n }\n if (ch === inString) inString = false\n i++\n continue\n }\n\n // Start comments\n if (ch === '/' && next === '/') {\n inLineComment = true\n i += 2\n continue\n }\n if (ch === '/' && next === '*') {\n inBlockComment = true\n i += 2\n continue\n }\n\n // Start strings\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n inString = ch\n i++\n continue\n }\n\n // Braces\n if (ch === '{') depth++\n if (ch === '}') depth--\n\n i++\n }\n\n return i\n}\n\n/**\n * Transform polymorphic functions: multiple function declarations with the\n * same name are merged into a single dispatcher function.\n *\n * Must be called AFTER transformParenExpressions (so params have = defaults)\n * but BEFORE wrapClassDeclarations.\n *\n * function greet(name = '') { ... }\n * function greet(first = '', last = '') { ... }\n *\n * becomes:\n *\n * function greet$1(name = '') { ... }\n * function greet$2(first = '', last = '') { ... }\n * function greet(...__args) {\n * if (__args.length === 1 && typeof __args[0] === 'string') return greet$1(__args[0])\n * if (__args.length === 2 && ...) return greet$2(__args[0], __args[1])\n * return __tjs.typeError('greet', 'no matching overload', __args)\n * }\n */\nexport function transformPolymorphicFunctions(\n source: string,\n requiredParams: Set<string>\n): { source: string; polymorphicNames: Set<string> } {\n const polymorphicNames = new Set<string>()\n\n // Phase 1: Find all function declarations and group by name\n // Match: optional \"export\" + optional \"async\" + \"function\" + name + \"(\"\n const funcPattern =\n /(?:^|(?<=[\\n;{}]))\\s*(export\\s+)?(async\\s+)?function\\s+(\\w+)\\s*\\(/gm\n const declarations = new Map<string, PolyVariant[]>()\n let match: RegExpExecArray | null\n\n // First pass: collect all function positions and names\n const allMatches: {\n name: string\n fullMatchStart: number\n funcKeywordStart: number\n exported: boolean\n isAsync: boolean\n }[] = []\n\n while ((match = funcPattern.exec(source)) !== null) {\n const exported = !!match[1]\n const isAsync = !!match[2]\n const name = match[3]\n const fullMatchStart = match.index\n // Find where \"function\" keyword starts (skip whitespace and export/async)\n let funcKeywordStart = fullMatchStart\n const prefix = match[0]\n const funcIdx = prefix.indexOf('function')\n if (funcIdx >= 0) funcKeywordStart = fullMatchStart + funcIdx\n\n allMatches.push({\n name,\n fullMatchStart,\n funcKeywordStart,\n exported,\n isAsync,\n })\n }\n\n // Group by name\n for (const m of allMatches) {\n if (!declarations.has(m.name)) {\n declarations.set(m.name, [])\n }\n }\n\n // Count occurrences \u2014 only process names that appear more than once\n const nameCounts = new Map<string, number>()\n for (const m of allMatches) {\n nameCounts.set(m.name, (nameCounts.get(m.name) || 0) + 1)\n }\n\n const polyNames = new Set<string>()\n for (const [name, count] of nameCounts) {\n if (count > 1) polyNames.add(name)\n }\n\n if (polyNames.size === 0) {\n return { source, polymorphicNames }\n }\n\n // Phase 2: For each polymorphic function, extract full details\n for (const m of allMatches) {\n if (!polyNames.has(m.name)) continue\n\n // Find the opening paren\n const afterFunc = source.indexOf('(', m.funcKeywordStart)\n if (afterFunc === -1) continue\n\n // Find matching closing paren\n let parenDepth = 1\n let j = afterFunc + 1\n while (j < source.length && parenDepth > 0) {\n if (source[j] === '(') parenDepth++\n if (source[j] === ')') parenDepth--\n j++\n }\n const closeParen = j - 1\n const paramStr = source.slice(afterFunc + 1, closeParen)\n\n // Find the opening brace of the function body\n let bodyStart = j\n while (bodyStart < source.length && source[bodyStart] !== '{') bodyStart++\n if (bodyStart >= source.length) continue\n\n // Find matching closing brace\n const bodyEnd = findFunctionBodyEnd(source, bodyStart)\n\n // Determine the real start (including leading whitespace, export, async)\n let realStart = m.fullMatchStart\n // Include leading whitespace on the same line\n while (realStart > 0 && source[realStart - 1] === ' ') realStart--\n\n const variants = declarations.get(m.name)!\n const params = parseParamList(paramStr, requiredParams)\n\n // Check for rest params\n const hasRestParam = paramStr.includes('...')\n if (hasRestParam) {\n const loc = locAt(source, m.funcKeywordStart)\n throw new SyntaxError(\n `Rest parameters are not supported in polymorphic function '${m.name}'. ` +\n `Use separate function names instead.`,\n loc\n )\n }\n\n variants.push({\n index: variants.length + 1,\n start: realStart,\n end: bodyEnd,\n text: source.slice(realStart, bodyEnd),\n exported: m.exported,\n isAsync: m.isAsync,\n params,\n })\n }\n\n // Phase 3: Validate \u2014 check for ambiguous variants\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n\n // Check async consistency\n const asyncCount = variants.filter((v) => v.isAsync).length\n if (asyncCount > 0 && asyncCount < variants.length) {\n const loc = locAt(source, variants[0].start)\n throw new SyntaxError(\n `Polymorphic function '${name}': all variants must be either sync or async, not mixed.`,\n loc\n )\n }\n\n // Check for ambiguous signatures (same types at same positions, differing only in required/optional)\n for (let i = 0; i < variants.length; i++) {\n for (let j = i + 1; j < variants.length; j++) {\n const a = variants[i]\n const b = variants[j]\n\n // Different max arity is fine\n if (a.params.length !== b.params.length) continue\n\n // Same arity \u2014 check if types are identical at every position\n let allSame = true\n for (let k = 0; k < a.params.length; k++) {\n const sigA = a.params[k].defaultValue\n ? typeSignatureForDefault(a.params[k].defaultValue)\n : 'any'\n const sigB = b.params[k].defaultValue\n ? typeSignatureForDefault(b.params[k].defaultValue)\n : 'any'\n if (sigA !== sigB) {\n allSame = false\n break\n }\n }\n\n if (allSame) {\n const loc = locAt(source, b.start)\n throw new SyntaxError(\n `Polymorphic function '${name}': variants ${i + 1} and ${\n j + 1\n } have ambiguous signatures ` +\n `(same parameter types at every position). Overloads must differ by arity or parameter types.`,\n loc\n )\n }\n }\n }\n }\n\n // Phase 4: Build the transformed source\n // Sort all variants by position (reverse order for safe replacement)\n const allVariants: { name: string; variant: PolyVariant }[] = []\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n for (const v of variants) {\n allVariants.push({ name, variant: v })\n }\n }\n allVariants.sort((a, b) => b.variant.start - a.variant.start)\n\n // Replace each variant in reverse order (preserves positions)\n let result = source\n for (const { name, variant } of allVariants) {\n const asyncPrefix = variant.isAsync ? 'async ' : ''\n // Rename: function greet(...) -> function greet$1(...)\n // Strip \"export\" from variants \u2014 only the dispatcher is exported\n // Use $$ in replacement to produce literal $ (avoid backreference interpretation)\n const renamed = variant.text.replace(\n new RegExp(\n `(?:export\\\\s+)?${\n asyncPrefix ? asyncPrefix.replace(/\\s+$/, '\\\\s+') : ''\n }function\\\\s+${name}\\\\s*\\\\(`\n ),\n `${asyncPrefix}function ${name}$$${variant.index}(`\n )\n result =\n result.slice(0, variant.start) + renamed + result.slice(variant.end)\n }\n\n // Phase 5: Append dispatcher functions\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n polymorphicNames.add(name)\n\n const isAsync = variants[0].isAsync\n const isExported = variants.some((v) => v.exported)\n const asyncPrefix = isAsync ? 'async ' : ''\n const exportPrefix = isExported ? 'export ' : ''\n\n // Sort variants by specificity for dispatch order:\n // 1. More params first (higher arity)\n // 2. More specific types first (integer before number, object before any)\n const sorted = [...variants].sort((a, b) => {\n // Different arity: more params = more specific (checked first within same arity group)\n if (a.params.length !== b.params.length) return 0 // arity groups handled in dispatch\n\n // Same arity: count specificity\n let specA = 0\n let specB = 0\n for (const p of a.params) {\n const sig = p.defaultValue\n ? typeSignatureForDefault(p.defaultValue)\n : 'any'\n if (sig === 'non-negative-integer') specA += 3\n else if (sig === 'integer') specA += 2\n else if (sig !== 'any') specA += 1\n }\n for (const p of b.params) {\n const sig = p.defaultValue\n ? typeSignatureForDefault(p.defaultValue)\n : 'any'\n if (sig === 'non-negative-integer') specB += 3\n else if (sig === 'integer') specB += 2\n else if (sig !== 'any') specB += 1\n }\n return specB - specA // More specific first\n })\n\n // Generate dispatch branches\n const branches: string[] = []\n for (const v of sorted) {\n const checks: string[] = [`__args.length === ${v.params.length}`]\n const args: string[] = []\n\n for (let k = 0; k < v.params.length; k++) {\n const p = v.params[k]\n args.push(`__args[${k}]`)\n if (p.defaultValue) {\n const check = typeCheckForDefault(`__args[${k}]`, p.defaultValue)\n if (check !== 'true') checks.push(check)\n }\n }\n\n branches.push(\n ` if (${checks.join(' && ')}) return ${name}$${v.index}(${args.join(\n ', '\n )})`\n )\n }\n\n const dispatcher = `\n${exportPrefix}${asyncPrefix}function ${name}(...__args) {\n${branches.join('\\n')}\n return __tjs.typeError('${name}', 'no matching overload', __args)\n}\n`\n result += dispatcher\n }\n\n return { source: result, polymorphicNames }\n}\n\n/**\n * Transform bare assignments to const declarations\n *\n * Foo = ... -> const Foo = ...\n *\n * Only transforms assignments at statement level (start of line or after semicolon/brace)\n * where the identifier starts with uppercase (to avoid breaking normal assignments)\n */\nexport function transformBareAssignments(source: string): string {\n // Match: start of line/statement, uppercase identifier, =, not ==\n // Negative lookbehind for const/let/var to avoid double-declaring\n return source.replace(\n /(?<=^|[;\\n{])\\s*([A-Z][a-zA-Z0-9_]*)\\s*=(?!=)/gm,\n (match, name) => {\n // Check if already has const/let/var before it\n return match.replace(name, `const ${name}`)\n }\n )\n}\n\n/**\n * Parse source code into an Acorn AST\n */\n\nexport function extractAndRunTests(\n source: string,\n skipTests = false\n): {\n source: string\n tests: TestBlock[]\n errors: string[]\n} {\n const tests: TestBlock[] = []\n const errors: string[] = []\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'test' keyword followed by optional string then {\n const testMatch = source.slice(i).match(/^\\btest\\s+/)\n if (testMatch) {\n const start = i\n let j = i + testMatch[0].length\n\n // Check for optional description string\n let description: string | undefined\n const descMatch = source.slice(j).match(/^(['\"`])([^]*?)\\1\\s*/)\n if (descMatch) {\n description = descMatch[2]\n j += descMatch[0].length\n }\n\n // Must have opening brace\n if (source[j] === '{') {\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth === 0) {\n const body = source.slice(bodyStart, k - 1).trim()\n const end = k\n\n const line = (source.slice(0, start).match(/\\n/g) || []).length + 1\n tests.push({ description, body, start, end, line })\n\n // Run the test unless skipped\n if (!skipTests) {\n try {\n // Execute test in isolated context\n // The test has access to the Types defined before it\n const testFn = new Function(body)\n testFn()\n } catch (err: any) {\n const desc = description || `test at line ${line}`\n errors.push(\n `Test failed: ${desc} (line ${line})\\n ${err.message || err}`\n )\n }\n }\n\n // Strip the test block from output (replace with whitespace to preserve line numbers)\n const removed = source.slice(start, end)\n const newlines = (removed.match(/\\n/g) || []).length\n result += '\\n'.repeat(newlines)\n i = end\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return { source: result, tests, errors }\n}\n\n/**\n * Wrap class declarations to make them callable without `new`\n *\n * Transforms:\n * class Foo { ... }\n * To:\n * let Foo = class Foo { ... };\n * Foo = new Proxy(Foo, { apply(t, _, a) { return Reflect.construct(t, a) } });\n *\n * This emits standalone JS with no runtime dependencies.\n */\n\n/**\n * Transform polymorphic constructors into static factory functions.\n *\n * When a class has multiple constructor() declarations, the first becomes\n * the real constructor and the rest become factory functions. The wrapClass\n * Proxy routes through a polymorphic dispatcher.\n *\n * class Point {\n * constructor(x: 0.0, y: 0.0) { this.x = x; this.y = y }\n * constructor(coords: { x: 0.0, y: 0.0 }) { this.x = coords.x; this.y = coords.y }\n * }\n *\n * becomes:\n *\n * class Point {\n * constructor(x = 0.0, y = 0.0) { this.x = x; this.y = y }\n * }\n * function Point$ctor$2(coords = { x: 0.0, y: 0.0 }) { return new Point(coords.x, coords.y) }\n * // wrapClass Proxy dispatches through polymorphic factory\n */\nexport function transformPolymorphicConstructors(\n source: string,\n requiredParams: Set<string>\n): { source: string; polyCtorClasses: Set<string> } {\n const polyCtorClasses = new Set<string>()\n\n // Find classes with multiple constructors\n const classRegex = /\\bclass\\s+(\\w+)(\\s+extends\\s+\\w+)?\\s*\\{/g\n let classMatch\n\n // Collect all class info first\n const classInfos: {\n className: string\n extendsClause: string\n bodyStart: number\n bodyEnd: number\n body: string\n }[] = []\n\n while ((classMatch = classRegex.exec(source)) !== null) {\n const className = classMatch[1]\n const extendsClause = classMatch[2]?.trim() || ''\n const bodyStart = classMatch.index + classMatch[0].length - 1\n\n const bodyEnd = findFunctionBodyEnd(source, bodyStart)\n const body = source.slice(bodyStart, bodyEnd)\n\n classInfos.push({ className, extendsClause, bodyStart, bodyEnd, body })\n }\n\n // Process in reverse order to preserve positions\n let result = source\n for (let ci = classInfos.length - 1; ci >= 0; ci--) {\n const { className, extendsClause, bodyStart, bodyEnd, body } =\n classInfos[ci]\n\n // Find all constructor declarations in the class body\n const ctorPattern = /\\bconstructor\\s*\\(/g\n let ctorMatch\n const ctorPositions: number[] = []\n\n while ((ctorMatch = ctorPattern.exec(body)) !== null) {\n ctorPositions.push(ctorMatch.index)\n }\n\n if (ctorPositions.length < 2) continue // Not polymorphic\n\n polyCtorClasses.add(className)\n\n // Parse each constructor\n interface CtorInfo {\n index: number\n paramStr: string\n bodyText: string\n fullStart: number // relative to class body\n fullEnd: number // relative to class body\n }\n const ctors: CtorInfo[] = []\n\n for (let i = 0; i < ctorPositions.length; i++) {\n const pos = ctorPositions[i]\n\n // Find opening paren\n const parenStart = body.indexOf('(', pos)\n let parenDepth = 1\n let j = parenStart + 1\n while (j < body.length && parenDepth > 0) {\n if (body[j] === '(') parenDepth++\n if (body[j] === ')') parenDepth--\n j++\n }\n const paramStr = body.slice(parenStart + 1, j - 1)\n\n // Find opening brace\n let braceStart = j\n while (braceStart < body.length && body[braceStart] !== '{') braceStart++\n\n // Find matching closing brace\n const ctorBodyEnd = findFunctionBodyEnd(body, braceStart)\n const bodyText = body.slice(braceStart + 1, ctorBodyEnd - 1)\n\n ctors.push({\n index: i + 1,\n paramStr,\n bodyText,\n fullStart: pos,\n fullEnd: ctorBodyEnd,\n })\n }\n\n // Keep the first constructor in the class, remove the rest\n // Build new class body with only the first constructor\n let newBody = body.slice(0, ctors[0].fullEnd)\n // Skip subsequent constructors\n const afterLastCtor = ctors[ctors.length - 1].fullEnd\n newBody += body.slice(afterLastCtor)\n\n // But we need to remove just the extra constructors, keeping other methods\n // Better approach: remove constructors 2..N from the body\n let cleanBody = body\n for (let i = ctors.length - 1; i >= 1; i--) {\n const ctor = ctors[i]\n // Find start of this constructor (including leading whitespace)\n let start = ctor.fullStart\n while (start > 0 && cleanBody[start - 1] === ' ') start--\n if (start > 0 && cleanBody[start - 1] === '\\n') start--\n\n cleanBody = cleanBody.slice(0, start) + cleanBody.slice(ctor.fullEnd)\n }\n\n // Generate factory functions for constructors 2..N\n let factories = ''\n for (let i = 1; i < ctors.length; i++) {\n const ctor = ctors[i]\n // Parse params for type checking in dispatcher\n const params = parseParamList(ctor.paramStr, requiredParams)\n const hasRest = ctor.paramStr.includes('...')\n if (hasRest) {\n const loc = locAt(source, bodyStart + ctor.fullStart)\n throw new SyntaxError(\n `Rest parameters are not supported in polymorphic constructors for '${className}'.`,\n loc\n )\n }\n\n // The factory function creates the object manually\n // For base classes: use Object.create + call constructor body\n // Simpler: just use new ClassName() with the first ctor's params mapped\n // Actually simplest: the factory body IS the constructor body but with\n // `this.x = ...` replaced by building an object... No, that doesn't work\n // for inheritance.\n //\n // Best approach: factory creates via new, then applies the extra ctor body\n factories += `\\nfunction ${className}$ctor$${ctor.index}(${ctor.paramStr}) {`\n factories += `\\n const __obj = Object.create(${className}.prototype)`\n if (extendsClause) {\n // For derived classes, we can't easily call super() outside constructor\n // Just call the constructor body and hope it sets fields\n // Actually \u2014 the factory can just do: new ClassName(defaultArgs) then overwrite\n // Let's use a simpler approach: the factory just does new + field assignment\n }\n factories += `\\n ;(function() {${ctor.bodyText}}).call(__obj)`\n factories += `\\n return __obj`\n factories += `\\n}\\n`\n }\n\n // Generate the polymorphic dispatcher for the Proxy's apply trap\n // First constructor variant uses Reflect.construct, rest use factories\n const dispatchBranches: string[] = []\n\n for (let i = 0; i < ctors.length; i++) {\n const ctor = ctors[i]\n const params = parseParamList(ctor.paramStr, requiredParams)\n const checks: string[] = [`a.length === ${params.length}`]\n\n for (let k = 0; k < params.length; k++) {\n const p = params[k]\n if (p.defaultValue) {\n const check = typeCheckForDefault(`a[${k}]`, p.defaultValue)\n if (check !== 'true') checks.push(check)\n }\n }\n\n if (i === 0) {\n // First constructor \u2014 use Reflect.construct\n dispatchBranches.push(\n ` if (${checks.join(' && ')}) return Reflect.construct(t, a)`\n )\n } else {\n // Factory function\n const args = params.map((_, k) => `a[${k}]`).join(', ')\n dispatchBranches.push(\n ` if (${checks.join(' && ')}) return ${className}$ctor$${\n ctor.index\n }(${args})`\n )\n }\n }\n\n // Generate the dispatcher function\n factories += `\\nfunction ${className}$dispatch(t, a) {\\n`\n factories += dispatchBranches.join('\\n') + '\\n'\n factories += ` return __tjs.typeError('${className}', 'no matching constructor', a)\\n`\n factories += `}\\n`\n\n // Replace the class body and append factories\n result = result.slice(0, bodyStart) + cleanBody + result.slice(bodyEnd)\n\n // Insert factories after the class\n const insertPos = bodyStart + cleanBody.length\n result = result.slice(0, insertPos) + factories + result.slice(insertPos)\n }\n\n return { source: result, polyCtorClasses }\n}\n\nexport function wrapClassDeclarations(\n source: string,\n polyCtorClasses: Set<string> = new Set()\n): string {\n // Match class declarations: class Name { or class Name extends Base {\n // Capture the class name and find the full class body\n const classRegex = /\\bclass\\s+(\\w+)(\\s+extends\\s+\\w+)?\\s*\\{/g\n let result = ''\n let lastIndex = 0\n let match\n\n while ((match = classRegex.exec(source)) !== null) {\n const className = match[1]\n const extendsClause = match[2] || ''\n const classStart = match.index\n const bodyStart = classStart + match[0].length - 1 // position of {\n\n // Find matching closing brace\n let depth = 1\n let i = bodyStart + 1\n while (i < source.length && depth > 0) {\n const char = source[i]\n if (char === '{') depth++\n else if (char === '}') depth--\n i++\n }\n\n if (depth === 0) {\n const classEnd = i\n const classBody = source.slice(bodyStart, classEnd)\n\n // Emit standalone JS - no runtime dependency\n result += source.slice(lastIndex, classStart)\n result += `let ${className} = class ${className}${extendsClause} ${classBody}; `\n\n if (polyCtorClasses.has(className)) {\n // Polymorphic constructor: use dispatcher function for apply trap\n result += `${className} = new Proxy(${className}, { apply(t, _, a) { return ${className}$dispatch(t, a) }, construct(t, a) { return ${className}$dispatch(t, a) } });`\n } else {\n result += `${className} = new Proxy(${className}, { apply(t, _, a) { return Reflect.construct(t, a) } });`\n }\n lastIndex = classEnd\n }\n }\n\n result += source.slice(lastIndex)\n return result\n}\n\n/**\n * Validate that Date is not used (TjsDate mode)\n * Throws an error if Date constructor or static methods are found\n */\nexport function validateNoDate(source: string): string {\n // Match Date usage: new Date, Date.now, Date.parse, Date.UTC\n const datePatterns = [\n {\n pattern: /\\bnew\\s+Date\\b/,\n message:\n 'new Date() is not allowed in TjsDate mode. Use Timestamp.now() or Timestamp.from()',\n },\n {\n pattern: /\\bDate\\.now\\b/,\n message: 'Date.now() is not allowed in TjsDate mode. Use Timestamp.now()',\n },\n {\n pattern: /\\bDate\\.parse\\b/,\n message:\n 'Date.parse() is not allowed in TjsDate mode. Use Timestamp.parse()',\n },\n {\n pattern: /\\bDate\\.UTC\\b/,\n message:\n 'Date.UTC() is not allowed in TjsDate mode. Use Timestamp.from()',\n },\n ]\n\n for (const { pattern, message } of datePatterns) {\n if (pattern.test(source)) {\n throw new Error(message)\n }\n }\n\n return source\n}\n\n/**\n * Validate that eval and Function constructor are not used (TjsNoeval mode)\n * Note: Eval and SafeFunction from TJS runtime are allowed\n */\n/**\n * Transform const! declarations to const and validate immutability\n *\n * const! declares compile-time immutable bindings. The object itself\n * is not frozen at runtime (performance trap), but the transpiler\n * rejects any code that attempts to mutate the binding's properties.\n *\n * const! config = { debug: false, port: 8080 }\n * config.debug = true // ERROR: Cannot mutate immutable binding 'config'\n * console.log(config.port) // OK: reads are fine\n *\n * Emits as plain `const` \u2014 semantics are enforced at transpile time.\n * When runtimes support records/tuples, const! can emit those instead.\n */\nexport function transformConstBang(source: string): string {\n // Find all const! declarations and collect binding names\n const immutableNames = new Set<string>()\n\n // Match: const! name = ... or const! { a, b } = ... or const! [a, b] = ...\n const constBangRe = /\\bconst!\\s+(\\w+)\\b/g\n let m\n while ((m = constBangRe.exec(source)) !== null) {\n immutableNames.add(m[1])\n }\n\n if (immutableNames.size === 0) return source\n\n // Replace const! with const\n source = source.replace(/\\bconst!\\s+/g, 'const ')\n\n // Strip comments before checking mutations (avoid false positives\n // from code examples in TDoc comments)\n const stripped = source\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // block comments\n .replace(/\\/\\/[^\\n]*/g, '') // line comments\n\n // Check for mutations to immutable bindings\n for (const name of immutableNames) {\n // Property assignment: name.prop = ..., name[key] = ...\n const assignRe = new RegExp(\n `\\\\b${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])\\\\s*(?:=(?!=)|\\\\+\\\\+|--|\\\\+=|-=|\\\\*=|\\\\/=|%=|&&=|\\\\|\\\\|=|\\\\?\\\\?=|<<=|>>=|>>>=|\\\\^=|&=|\\\\|=)`,\n 'g'\n )\n if (assignRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // Prefix increment/decrement: ++name.prop, --name.prop\n const prefixRe = new RegExp(\n `(?:\\\\+\\\\+|--)\\\\s*${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])`,\n 'g'\n )\n if (prefixRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // delete name.prop\n const deleteRe = new RegExp(\n `\\\\bdelete\\\\s+${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])`,\n 'g'\n )\n if (deleteRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // push/pop/splice/shift/unshift/sort/reverse/fill on the binding\n const mutatingMethods =\n 'push|pop|splice|shift|unshift|sort|reverse|fill|copyWithin|set'\n const methodRe = new RegExp(\n `\\\\b${name}\\\\s*\\\\.\\\\s*(?:${mutatingMethods})\\\\s*\\\\(`,\n 'g'\n )\n if (methodRe.test(stripped)) {\n throw new Error(\n `Cannot call mutating method on immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n }\n\n return source\n}\n\nexport function validateNoVar(source: string): string {\n // Match var declarations at statement level (not inside strings/comments)\n // Catches: var x, var x = ..., var {x} = ..., var [x] = ...\n const varPattern = /(?<![a-zA-Z_$])\\bvar\\s+/\n if (varPattern.test(source)) {\n throw new Error(\n 'var is not allowed in TjsNoVar mode. Use const or let instead.'\n )\n }\n return source\n}\n\nexport function validateNoEval(source: string): string {\n // Match eval() calls - but not Eval() (capital E)\n // Use negative lookbehind to avoid matching inside words\n const evalPattern = /(?<![A-Za-z_$])\\beval\\s*\\(/\n if (evalPattern.test(source)) {\n throw new Error(\n 'eval() is not allowed in TjsNoeval mode. Use Eval() from TJS runtime for safe evaluation.'\n )\n }\n\n // Match new Function() - but not SafeFunction or other *Function names\n const functionPattern = /\\bnew\\s+Function\\s*\\(/\n if (functionPattern.test(source)) {\n throw new Error(\n 'new Function() is not allowed in TjsNoeval mode. Use SafeFunction() from TJS runtime.'\n )\n }\n\n return source\n}\n\n/**\n * Transform bang access (!.) to __tjs.bang() calls.\n *\n * x!.foo \u2192 __tjs.bang(x,'foo')\n * x.y!.foo \u2192 __tjs.bang(x.y,'foo')\n * fn()!.foo \u2192 __tjs.bang(fn(),'foo')\n * arr[0]!.foo \u2192 __tjs.bang(arr[0],'foo')\n * x!.foo!.bar \u2192 __tjs.bang(__tjs.bang(x,'foo'),'bar')\n *\n * If the source is null/undefined, returns MonadicError.\n * If the source is a MonadicError, propagates it.\n * Otherwise, performs a bare property access (throws as usual).\n */\nexport function transformBangAccess(source: string): string {\n // Quick bail \u2014 no !. in source at all\n if (!source.includes('!.')) return source\n\n let result = ''\n let i = 0\n\n // State tracking for strings/comments\n type State =\n | 'normal'\n | 'string-single'\n | 'string-double'\n | 'string-template'\n | 'line-comment'\n | 'block-comment'\n let state: State = 'normal'\n let templateDepth = 0\n\n while (i < source.length) {\n const ch = source[i]\n const next = source[i + 1]\n\n // State transitions\n if (state === 'normal') {\n if (ch === '/' && next === '/') {\n state = 'line-comment'\n result += ch\n i++\n continue\n }\n if (ch === '/' && next === '*') {\n state = 'block-comment'\n result += ch\n i++\n continue\n }\n if (ch === \"'\") {\n state = 'string-single'\n result += ch\n i++\n continue\n }\n if (ch === '\"') {\n state = 'string-double'\n result += ch\n i++\n continue\n }\n if (ch === '`') {\n state = 'string-template'\n templateDepth++\n result += ch\n i++\n continue\n }\n\n // Detect bang access: ! followed by . followed by a word char (not digit)\n if (\n ch === '!' &&\n next === '.' &&\n i + 2 < source.length &&\n /[a-zA-Z_$]/.test(source[i + 2])\n ) {\n // Scan backward in `result` to find the expression start\n const exprEnd = result.length\n const exprStart = findExprStartBackward(result)\n\n if (exprStart < exprEnd) {\n const expr = result.slice(exprStart)\n result = result.slice(0, exprStart)\n\n // Scan forward to capture the property name after !.\n let j = i + 2\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n const prop = source.slice(i + 2, j)\n\n result += `__tjs.bang(${expr},'${prop}')`\n i = j\n continue\n }\n }\n\n result += ch\n i++\n } else if (state === 'line-comment') {\n result += ch\n if (ch === '\\n') state = 'normal'\n i++\n } else if (state === 'block-comment') {\n result += ch\n if (ch === '*' && next === '/') {\n result += next\n state = 'normal'\n i += 2\n } else {\n i++\n }\n } else if (state === 'string-single') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === \"'\") {\n state = 'normal'\n i++\n } else {\n i++\n }\n } else if (state === 'string-double') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === '\"') {\n state = 'normal'\n i++\n } else {\n i++\n }\n } else if (state === 'string-template') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === '`') {\n templateDepth--\n state = templateDepth > 0 ? 'string-template' : 'normal'\n i++\n } else if (ch === '$' && next === '{') {\n result += next\n i += 2\n state = 'normal'\n } else {\n i++\n }\n } else {\n result += ch\n i++\n }\n }\n\n return result\n}\n\n/**\n * Scan backward through `text` to find the start of the expression\n * that ends at the last character of `text`.\n *\n * Handles: identifiers, member chains (. and ?.), function calls (),\n * computed access [], and nested combinations.\n */\nfunction findExprStartBackward(text: string): number {\n let pos = text.length - 1\n\n // Skip trailing whitespace\n while (pos >= 0 && /\\s/.test(text[pos])) pos--\n if (pos < 0) return text.length\n\n // Walk backward consuming expression parts\n while (pos >= 0) {\n const ch = text[pos]\n\n if (/[\\w$]/.test(ch)) {\n // Identifier \u2014 consume word chars\n while (pos >= 0 && /[\\w$]/.test(text[pos])) pos--\n // Check if preceded by . or ?. (member chain continues)\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') {\n pos -= 2\n } else {\n pos--\n }\n continue\n }\n return pos + 1\n } else if (ch === ')') {\n pos = findMatchingOpen(text, pos, '(', ')')\n if (pos < 0) return 0\n pos--\n if (pos >= 0 && /[\\w$]/.test(text[pos])) continue\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') pos -= 2\n else pos--\n continue\n }\n return pos + 1\n } else if (ch === ']') {\n pos = findMatchingOpen(text, pos, '[', ']')\n if (pos < 0) return 0\n pos--\n if (pos >= 0 && /[\\w$]/.test(text[pos])) continue\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') pos -= 2\n else pos--\n continue\n }\n return pos + 1\n } else {\n return pos + 1\n }\n }\n\n return 0\n}\n\n/** Find the matching opening bracket/paren scanning backward from `pos`. */\nfunction findMatchingOpen(\n text: string,\n pos: number,\n open: string,\n close: string\n): number {\n let depth = 1\n pos--\n while (pos >= 0 && depth > 0) {\n if (text[pos] === close) depth++\n else if (text[pos] === open) depth--\n if (depth > 0) pos--\n }\n return pos\n}\n", "/**\n * Type inference from value patterns\n *\n * Extracts types from example values:\n * 'string' -> { kind: 'string' }\n * 10 -> { kind: 'number' }\n * ['string'] -> { kind: 'array', items: { kind: 'string' } }\n * { name: 'string' } -> { kind: 'object', shape: { name: { kind: 'string' } } }\n * 'string' | null -> { kind: 'string', nullable: true }\n * 'string' | 0 -> { kind: 'union', members: [{ kind: 'string' }, { kind: 'number' }] }\n */\n\nimport { parseExpressionAt } from 'acorn'\nimport type { Expression, Pattern } from 'acorn'\nimport type { TypeDescriptor, ParameterDescriptor } from './types'\nimport { getLocation, TranspileError } from './types'\n\n/**\n * Infer type from a value expression (example value)\n */\nexport function inferTypeFromValue(node: Expression): TypeDescriptor {\n switch (node.type) {\n case 'Literal': {\n const value = (node as any).value\n if (value === null) {\n return { kind: 'null' }\n }\n if (typeof value === 'string') {\n return { kind: 'string' }\n }\n if (typeof value === 'number') {\n // Distinguish float vs integer by checking if source contains '.'\n // 2.0 -> number (float), 42 -> integer\n const raw = (node as any).raw as string | undefined\n if (raw && raw.includes('.')) {\n return { kind: 'number' }\n }\n return { kind: 'integer' }\n }\n if (typeof value === 'boolean') {\n return { kind: 'boolean' }\n }\n return { kind: 'any' }\n }\n\n case 'ArrayExpression': {\n const elements = (node as any).elements as Expression[]\n if (elements.length === 0) {\n return { kind: 'array', items: { kind: 'any' } }\n }\n // Infer type from all elements \u2014 if homogeneous, use that type;\n // if heterogeneous, produce a union of distinct kinds\n const itemTypes = elements\n .filter((el) => el != null)\n .map((el) => inferTypeFromValue(el))\n if (itemTypes.length === 0) {\n return { kind: 'array', items: { kind: 'any' } }\n }\n // Deduplicate by structure\n const seen = new Map<string, TypeDescriptor>()\n for (const t of itemTypes) {\n const key = JSON.stringify(t)\n if (!seen.has(key)) seen.set(key, t)\n }\n const unique = [...seen.values()]\n const items =\n unique.length === 1\n ? unique[0]\n : { kind: 'union' as const, members: unique }\n return { kind: 'array', items }\n }\n\n case 'ObjectExpression': {\n const properties = (node as any).properties as any[]\n const shape: Record<string, TypeDescriptor> = {}\n\n for (const prop of properties) {\n if (prop.type === 'Property' && prop.key.type === 'Identifier') {\n const key = prop.key.name\n shape[key] = inferTypeFromValue(prop.value)\n }\n }\n\n return { kind: 'object', shape }\n }\n\n case 'LogicalExpression': {\n const { operator, left, right } = node as any\n\n if (operator === '||') {\n // || is JavaScript logical OR \u2014 infer type from left operand\n return inferTypeFromValue(left)\n }\n\n if (operator === '&&') {\n // null && type means required type (null is just a marker)\n const rightType = inferTypeFromValue(right)\n return rightType\n }\n\n if (operator === '??') {\n // Nullish coalescing: left ?? right - type is the right side (fallback)\n const rightType = inferTypeFromValue(right)\n return rightType\n }\n\n return { kind: 'any' }\n }\n\n case 'BinaryExpression': {\n const { operator, left, right } = node as any\n // | means union type (e.g., 0 | null, '' | undefined)\n if (operator === '|') {\n const leftType = inferTypeFromValue(left)\n const rightType = inferTypeFromValue(right)\n\n if (rightType.kind === 'null') {\n return { ...leftType, nullable: true }\n }\n if (leftType.kind === 'null') {\n return { ...rightType, nullable: true }\n }\n return {\n kind: 'union',\n members: [leftType, rightType],\n }\n }\n return { kind: 'any' }\n }\n\n case 'Identifier': {\n // Handle undefined as a type\n if ((node as any).name === 'undefined') {\n return { kind: 'undefined' }\n }\n // Other identifiers in type position aren't valid example types\n return { kind: 'any' }\n }\n\n case 'UnaryExpression': {\n const op = (node as any).operator\n const arg = (node as any).argument\n\n // +N means non-negative integer (e.g., +1, +3)\n if (op === '+' && arg.type === 'Literal') {\n const value = arg.value\n if (typeof value === 'number') {\n return { kind: 'non-negative-integer' }\n }\n }\n\n // -N means integer or float depending on source\n if (op === '-' && arg.type === 'Literal') {\n const value = arg.value\n if (typeof value === 'number') {\n const raw = arg.raw as string | undefined\n if (raw && raw.includes('.')) {\n return { kind: 'number' }\n }\n return { kind: 'integer' }\n }\n }\n return { kind: 'any' }\n }\n\n default:\n return { kind: 'any' }\n }\n}\n\n/**\n * Parse a parameter and extract its type and default value\n *\n * @param param - The AST node for the parameter\n * @param requiredParams - Optional set of parameter names that are required (from colon syntax)\n */\nexport function parseParameter(\n param: Pattern,\n requiredParams?: Set<string>\n): ParameterDescriptor {\n // Simple identifier: function foo(x) - required, any type\n if (param.type === 'Identifier') {\n return {\n name: (param as any).name,\n type: { kind: 'any' },\n required: true,\n }\n }\n\n // Assignment pattern: function foo(x = value)\n if (param.type === 'AssignmentPattern') {\n const { left, right } = param as any\n\n if (left.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple parameter names are supported',\n getLocation(param)\n )\n }\n\n const name = left.name\n\n // Check if this parameter was marked as required via colon syntax\n const isRequired = requiredParams?.has(name) ?? false\n\n // Infer type from the example value\n const type = inferTypeFromValue(right)\n const exampleValue = extractLiteralValue(right)\n\n return {\n name,\n type,\n required: isRequired,\n default: isRequired ? null : exampleValue,\n example: exampleValue,\n loc: { start: param.start, end: param.end },\n }\n }\n\n // Destructuring pattern: function foo({ a, b })\n if (param.type === 'ObjectPattern') {\n // For destructuring, we create a synthetic \"args\" parameter\n // The individual properties become fields with their own defaults\n const properties = (param as any).properties as any[]\n const shape: Record<string, TypeDescriptor> = {}\n // Store full parameter descriptors for destructured properties\n const destructuredParams: Record<string, ParameterDescriptor> = {}\n\n for (const prop of properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? prop.key.name\n : String(prop.key.value)\n\n if (prop.value.type === 'Identifier') {\n // { name } - required, any type\n shape[key] = { kind: 'any' }\n destructuredParams[key] = {\n name: key,\n type: { kind: 'any' },\n required: true,\n }\n } else if (prop.value.type === 'AssignmentPattern') {\n // { name = default } - check requiredParams to see if this was originally colon syntax\n const innerParam = parseParameter(prop.value, requiredParams)\n const isRequired = requiredParams?.has(key) ?? false\n shape[key] = innerParam.type\n destructuredParams[key] = {\n name: key,\n type: innerParam.type,\n required: isRequired,\n default: isRequired ? null : innerParam.example,\n example: innerParam.example,\n }\n }\n }\n }\n\n return {\n name: '__destructured__',\n type: { kind: 'object', shape, destructuredParams },\n required: true,\n }\n }\n\n throw new TranspileError(\n `Unsupported parameter pattern: ${param.type}`,\n getLocation(param)\n )\n}\n\n/**\n * Extract a literal value from an expression for default values\n */\nexport function extractLiteralValue(node: Expression): any {\n switch (node.type) {\n case 'Literal':\n return (node as any).value\n\n case 'ArrayExpression':\n return (node as any).elements.map((el: Expression) =>\n el ? extractLiteralValue(el) : null\n )\n\n case 'ObjectExpression': {\n const result: Record<string, any> = {}\n for (const prop of (node as any).properties) {\n if (prop.type === 'Property' && prop.key.type === 'Identifier') {\n result[prop.key.name] = extractLiteralValue(prop.value)\n }\n }\n return result\n }\n\n case 'UnaryExpression':\n if ((node as any).operator === '-') {\n const arg = extractLiteralValue((node as any).argument)\n return typeof arg === 'number' ? -arg : undefined\n }\n if ((node as any).operator === '+') {\n const arg = extractLiteralValue((node as any).argument)\n return typeof arg === 'number' ? +arg : undefined\n }\n return undefined\n\n case 'BinaryExpression': {\n const { operator, left } = node as any\n // | is union type \u2014 extract the left (primary) example value\n if (operator === '|') {\n return extractLiteralValue(left)\n }\n return undefined\n }\n\n case 'LogicalExpression': {\n const { operator, left, right } = node as any\n if (operator === '&&') {\n // null && type evaluates to null (falsy short-circuit)\n if (left.type === 'Literal' && left.value === null) {\n return null\n }\n }\n if (operator === '||') {\n // value || fallback - return left if truthy\n const leftVal = extractLiteralValue(left)\n return leftVal ?? extractLiteralValue(right)\n }\n if (operator === '??') {\n // value ?? fallback - return left if not null/undefined\n const leftVal = extractLiteralValue(left)\n return leftVal ?? extractLiteralValue(right)\n }\n return undefined\n }\n\n default:\n return undefined\n }\n}\n\n/**\n * Parse return type from a type annotation expression\n */\nexport function parseReturnType(typeExpr: string): TypeDescriptor {\n // Simple approach: parse as expression and infer type\n try {\n const ast = parseExpressionAt(typeExpr, 0, {\n ecmaVersion: 2022,\n })\n return inferTypeFromValue(ast)\n } catch {\n return { kind: 'any' }\n }\n}\n\n/**\n * Convert TypeDescriptor to a human-readable string\n */\nexport function typeToString(type: TypeDescriptor): string {\n switch (type.kind) {\n case 'string':\n return type.nullable ? 'string | null' : 'string'\n case 'number':\n return type.nullable ? 'number | null' : 'number'\n case 'integer':\n return type.nullable ? 'integer | null' : 'integer'\n case 'non-negative-integer':\n return type.nullable\n ? 'non-negative integer | null'\n : 'non-negative integer'\n case 'boolean':\n return type.nullable ? 'boolean | null' : 'boolean'\n case 'null':\n return 'null'\n case 'any':\n return 'any'\n case 'array': {\n const items = type.items ? typeToString(type.items) : 'any'\n return type.nullable ? `${items}[] | null` : `${items}[]`\n }\n case 'object': {\n if (!type.shape || Object.keys(type.shape).length === 0) {\n return type.nullable ? 'object | null' : 'object'\n }\n const props = Object.entries(type.shape)\n .map(([k, v]) => `${k}: ${typeToString(v)}`)\n .join(', ')\n return type.nullable ? `{ ${props} } | null` : `{ ${props} }`\n }\n case 'union':\n return type.members?.map(typeToString).join(' | ') || 'any'\n default:\n return 'any'\n }\n}\n\n/**\n * Check if a value matches a type descriptor\n */\nexport function checkType(value: any, type: TypeDescriptor): boolean {\n // Handle null\n if (value === null || value === undefined) {\n return type.nullable || type.kind === 'null' || type.kind === 'any'\n }\n\n switch (type.kind) {\n case 'any':\n return true\n case 'null':\n return value === null\n case 'string':\n return typeof value === 'string'\n case 'number':\n return typeof value === 'number'\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value)\n case 'non-negative-integer':\n return typeof value === 'number' && Number.isInteger(value) && value >= 0\n case 'boolean':\n return typeof value === 'boolean'\n case 'array':\n if (!Array.isArray(value)) return false\n if (!type.items) return true\n return value.every((item) => checkType(item, type.items!))\n case 'object':\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false\n }\n if (!type.shape) return true\n // Check that all required shape properties exist and match\n for (const [key, propType] of Object.entries(type.shape)) {\n if (!checkType(value[key], propType)) {\n return false\n }\n }\n return true\n case 'union':\n if (!type.members) return true\n return type.members.some((member) => checkType(value, member))\n default:\n return true\n }\n}\n", "/**\n * ESTree to Agent99 AST Transformer\n *\n * Converts parsed JavaScript into Agent99's JSON AST format.\n */\n\nimport type {\n Statement,\n Expression,\n FunctionDeclaration,\n BlockStatement,\n VariableDeclaration,\n ExpressionStatement,\n IfStatement,\n WhileStatement,\n ForOfStatement,\n TryStatement,\n ReturnStatement,\n CallExpression,\n AssignmentExpression,\n BinaryExpression,\n LogicalExpression,\n MemberExpression,\n Identifier,\n Literal,\n TemplateLiteral,\n ArrayExpression,\n ObjectExpression,\n} from 'acorn'\nimport type { BaseNode } from '../../builder'\nimport type { ExprNode } from '../../runtime'\nimport type {\n TransformContext,\n TranspileOptions,\n FunctionSignature,\n ParameterDescriptor,\n TypeDescriptor,\n TranspileWarning,\n} from '../types'\nimport { TranspileError, getLocation, createChildContext } from '../types'\nimport {\n parseParameter,\n inferTypeFromValue,\n parseReturnType,\n} from '../inference'\nimport { extractTDoc } from '../parser'\n\n/**\n * Convert TypeDescriptor to JSON Schema\n */\nfunction typeToJsonSchema(type: TypeDescriptor): any {\n switch (type.kind) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'null':\n // null as a default value means \"any type, defaults to null\"\n // In JSON Schema, empty object means any type is allowed\n return {}\n case 'undefined':\n return {} // JSON Schema doesn't have undefined, treat as any\n case 'any':\n return {} // No constraints\n case 'array':\n return {\n type: 'array',\n items: type.items ? typeToJsonSchema(type.items) : {},\n }\n case 'object':\n if (type.shape) {\n const properties: Record<string, any> = {}\n for (const [key, propType] of Object.entries(type.shape)) {\n properties[key] = typeToJsonSchema(propType)\n }\n return {\n type: 'object',\n properties,\n additionalProperties: false,\n }\n }\n return { type: 'object' }\n case 'union':\n if (type.members) {\n return { oneOf: type.members.map(typeToJsonSchema) }\n }\n return {}\n default:\n return {}\n }\n}\n\n/**\n * Convert function parameters to JSON Schema for input validation\n */\nfunction parametersToJsonSchema(\n parameters: Record<string, ParameterDescriptor>\n): any {\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [name, param] of Object.entries(parameters)) {\n properties[name] = typeToJsonSchema(param.type)\n if (param.required) {\n required.push(name)\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n additionalProperties: false,\n }\n}\n\n/**\n * Transform a function declaration into Agent99 AST\n */\nexport function transformFunction(\n func: FunctionDeclaration,\n source: string,\n returnTypeAnnotation: string | undefined,\n options: TranspileOptions = {},\n requiredParamsFromPreprocess?: Set<string>\n): {\n ast: BaseNode\n signature: FunctionSignature\n warnings: TranspileWarning[]\n} {\n // Extract TDoc (/*# ... */) comments\n const tdoc = extractTDoc(source, func)\n\n // Parse parameters\n const parameters = new Map<string, ParameterDescriptor>()\n\n for (const param of func.params) {\n const parsed = parseParameter(param, requiredParamsFromPreprocess)\n\n // Handle destructured parameters - expand into individual params\n if (\n parsed.name === '__destructured__' &&\n parsed.type.kind === 'object' &&\n parsed.type.destructuredParams\n ) {\n for (const [key, paramDesc] of Object.entries(\n parsed.type.destructuredParams\n )) {\n parameters.set(key, {\n ...(paramDesc as any),\n description: tdoc.params[key],\n })\n }\n } else {\n parsed.description = tdoc.params[parsed.name]\n parameters.set(parsed.name, parsed)\n }\n }\n\n // Parse return type\n let returnType: TypeDescriptor | undefined\n if (returnTypeAnnotation) {\n returnType = parseReturnType(returnTypeAnnotation)\n }\n\n // Create transform context\n const ctx: TransformContext = {\n depth: 0,\n locals: new Map(),\n parameters,\n atoms: new Set(Object.keys(options.atoms || {})),\n warnings: [],\n source,\n filename: options.filename || '<source>',\n options,\n }\n\n // Transform function body\n const bodySteps = transformBlock(func.body, ctx)\n\n // Handle parameters: varsImport for required, varSet with defaults for optional\n const steps: BaseNode[] = []\n const requiredParams: string[] = []\n const optionalParams: Array<{ name: string; defaultValue: any }> = []\n\n for (const [name, param] of parameters.entries()) {\n if (param.required) {\n requiredParams.push(name)\n } else if (param.default !== undefined) {\n optionalParams.push({ name, defaultValue: param.default })\n } else {\n // Optional without explicit default - still import from args\n requiredParams.push(name)\n }\n }\n\n // Import required params directly from args\n if (requiredParams.length > 0) {\n steps.push({\n op: 'varsImport',\n keys: requiredParams,\n })\n }\n\n // For optional params with defaults: import from args, then check and set default if null\n for (const { name, defaultValue } of optionalParams) {\n // Import from args (will be undefined if not provided)\n steps.push({\n op: 'varsImport',\n keys: [name],\n })\n // If null/undefined, set the default\n steps.push({\n op: 'if',\n condition: {\n $expr: 'binary',\n op: '==',\n left: { $expr: 'ident', name },\n right: { $expr: 'literal', value: null },\n },\n then: [\n {\n op: 'varSet',\n key: name,\n value: defaultValue,\n },\n ],\n })\n }\n\n steps.push(...bodySteps)\n\n // Build signature\n const signatureParams = Object.fromEntries(parameters)\n const signature: FunctionSignature = {\n name: func.id?.name || 'anonymous',\n description: tdoc.description,\n parameters: signatureParams,\n returns: returnType,\n }\n\n // Generate input schema for runtime validation\n const inputSchema = parametersToJsonSchema(signatureParams)\n\n return {\n ast: { op: 'seq', steps, inputSchema },\n signature,\n warnings: ctx.warnings,\n }\n}\n\n/**\n * Transform a block statement into a list of steps\n */\nexport function transformBlock(\n block: BlockStatement,\n ctx: TransformContext\n): BaseNode[] {\n const steps: BaseNode[] = []\n\n for (const stmt of block.body) {\n const transformed = transformStatement(stmt, ctx)\n if (transformed) {\n if (Array.isArray(transformed)) {\n steps.push(...transformed)\n } else {\n steps.push(transformed)\n }\n }\n }\n\n return steps\n}\n\n/**\n * Transform a statement\n */\nexport function transformStatement(\n stmt: Statement,\n ctx: TransformContext\n): BaseNode | BaseNode[] | null {\n switch (stmt.type) {\n case 'VariableDeclaration':\n return transformVariableDeclaration(stmt as VariableDeclaration, ctx)\n\n case 'ExpressionStatement':\n return transformExpressionStatement(stmt as ExpressionStatement, ctx)\n\n case 'IfStatement':\n return transformIfStatement(stmt as IfStatement, ctx)\n\n case 'WhileStatement':\n return transformWhileStatement(stmt as WhileStatement, ctx)\n\n case 'ForOfStatement':\n return transformForOfStatement(stmt as ForOfStatement, ctx)\n\n case 'TryStatement':\n return transformTryStatement(stmt as TryStatement, ctx)\n\n case 'ReturnStatement':\n return transformReturnStatement(stmt as ReturnStatement, ctx)\n\n case 'ThrowStatement':\n throw new TranspileError(\n `'throw' is not supported in AsyncJS. Use Error('message') to trigger error flow`,\n getLocation(stmt),\n ctx.source,\n ctx.filename\n )\n\n case 'BlockStatement':\n // Nested block creates a scope\n return {\n op: 'scope',\n steps: transformBlock(stmt as BlockStatement, createChildContext(ctx)),\n }\n\n case 'EmptyStatement':\n return null\n\n default:\n throw new TranspileError(\n `Unsupported statement type: ${stmt.type}`,\n getLocation(stmt),\n ctx.source,\n ctx.filename\n )\n }\n}\n\n/**\n * Transform variable declaration: let x = value or const x = value\n */\nfunction transformVariableDeclaration(\n decl: VariableDeclaration,\n ctx: TransformContext\n): BaseNode[] {\n const steps: BaseNode[] = []\n const isConst = decl.kind === 'const'\n const opName = isConst ? 'constSet' : 'varSet'\n\n for (const declarator of decl.declarations) {\n if (declarator.id.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable names are supported',\n getLocation(declarator),\n ctx.source,\n ctx.filename\n )\n }\n\n const name = (declarator.id as Identifier).name\n\n if (declarator.init) {\n // Transform the initializer\n const { step, resultVar } = transformExpressionToStep(\n declarator.init,\n ctx,\n name,\n isConst\n )\n\n if (step) {\n steps.push(step)\n } else if (resultVar !== name) {\n // Simple value assignment\n steps.push({\n op: opName,\n key: name,\n value: resultVar,\n })\n }\n\n // Track variable type\n const type = inferTypeFromValue(declarator.init as Expression)\n ctx.locals.set(name, type)\n } else {\n // Uninitialized variable (only valid for let, not const)\n if (isConst) {\n throw new TranspileError(\n 'const declarations must be initialized',\n getLocation(declarator),\n ctx.source,\n ctx.filename\n )\n }\n steps.push({\n op: 'varSet',\n key: name,\n value: null,\n })\n ctx.locals.set(name, { kind: 'any', nullable: true })\n }\n }\n\n return steps\n}\n\n/**\n * Transform expression statement (e.g., function call)\n */\nfunction transformExpressionStatement(\n stmt: ExpressionStatement,\n ctx: TransformContext\n): BaseNode | null {\n const expr = stmt.expression\n\n // Assignment expression: x = value\n if (expr.type === 'AssignmentExpression') {\n return transformAssignment(expr as AssignmentExpression, ctx)\n }\n\n // Function call (side effect)\n if (expr.type === 'CallExpression') {\n const { step, resultVar } = transformExpressionToStep(expr, ctx)\n if (step) {\n return step\n }\n // If no step but we got an expression (e.g., method call on builtin),\n // we still need to evaluate it for side effects (like s.add(x))\n if (resultVar) {\n return {\n op: 'varSet',\n key: '_',\n value: resultVar,\n }\n }\n return null\n }\n\n // Other expressions (e.g., just a value) - no-op\n ctx.warnings.push({\n message: 'Expression statement has no effect',\n line: getLocation(stmt).line,\n column: getLocation(stmt).column,\n })\n\n return null\n}\n\n/**\n * Transform assignment: x = value\n */\nfunction transformAssignment(\n expr: AssignmentExpression,\n ctx: TransformContext\n): BaseNode {\n if (expr.left.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable assignment is supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n const name = (expr.left as Identifier).name\n const { step, resultVar } = transformExpressionToStep(expr.right, ctx, name)\n\n if (step) {\n return step\n }\n\n return {\n op: 'varSet',\n key: name,\n value: resultVar,\n }\n}\n\n/**\n * Transform if statement\n */\nfunction transformIfStatement(\n stmt: IfStatement,\n ctx: TransformContext\n): BaseNode {\n // Convert condition to ExprNode\n const condition = expressionToExprNode(stmt.test, ctx)\n\n // Transform then branch\n const thenSteps =\n stmt.consequent.type === 'BlockStatement'\n ? transformBlock(\n stmt.consequent as BlockStatement,\n createChildContext(ctx)\n )\n : ([transformStatement(stmt.consequent, ctx)].filter(\n Boolean\n ) as BaseNode[])\n\n // Transform else branch if present\n let elseSteps: BaseNode[] | undefined\n if (stmt.alternate) {\n elseSteps =\n stmt.alternate.type === 'BlockStatement'\n ? transformBlock(\n stmt.alternate as BlockStatement,\n createChildContext(ctx)\n )\n : ([transformStatement(stmt.alternate, ctx)].filter(\n Boolean\n ) as BaseNode[])\n }\n\n return {\n op: 'if',\n condition,\n then: thenSteps,\n ...(elseSteps && { else: elseSteps }),\n }\n}\n\n/**\n * Transform while statement\n */\nfunction transformWhileStatement(\n stmt: WhileStatement,\n ctx: TransformContext\n): BaseNode {\n const condition = expressionToExprNode(stmt.test, ctx)\n\n const body =\n stmt.body.type === 'BlockStatement'\n ? transformBlock(stmt.body as BlockStatement, createChildContext(ctx))\n : ([transformStatement(stmt.body, ctx)].filter(Boolean) as BaseNode[])\n\n return {\n op: 'while',\n condition,\n body,\n }\n}\n\n/**\n * Transform for...of statement into map atom\n */\nfunction transformForOfStatement(\n stmt: ForOfStatement,\n ctx: TransformContext\n): BaseNode {\n // Get the loop variable name\n let varName: string\n if (stmt.left.type === 'VariableDeclaration') {\n const decl = stmt.left.declarations[0]\n if (decl.id.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable names are supported in for...of',\n getLocation(stmt.left),\n ctx.source,\n ctx.filename\n )\n }\n varName = (decl.id as Identifier).name\n } else if (stmt.left.type === 'Identifier') {\n varName = (stmt.left as Identifier).name\n } else {\n throw new TranspileError(\n 'Unsupported for...of left-hand side',\n getLocation(stmt.left),\n ctx.source,\n ctx.filename\n )\n }\n\n // Get the iterable\n const items = expressionToValue(stmt.right, ctx)\n\n // Create child context with loop variable\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(varName, { kind: 'any' })\n\n // Transform body\n const steps =\n stmt.body.type === 'BlockStatement'\n ? transformBlock(stmt.body as BlockStatement, childCtx)\n : ([transformStatement(stmt.body, childCtx)].filter(\n Boolean\n ) as BaseNode[])\n\n return {\n op: 'map',\n items,\n as: varName,\n steps,\n }\n}\n\n/**\n * Transform try/catch statement\n */\nfunction transformTryStatement(\n stmt: TryStatement,\n ctx: TransformContext\n): BaseNode {\n const trySteps = transformBlock(stmt.block, createChildContext(ctx))\n\n let catchSteps: BaseNode[] | undefined\n let catchParam: string | undefined\n if (stmt.handler) {\n const catchCtx = createChildContext(ctx)\n // Add error variable to scope if named\n if (stmt.handler.param?.type === 'Identifier') {\n catchParam = (stmt.handler.param as Identifier).name\n catchCtx.locals.set(catchParam, {\n kind: 'any',\n })\n }\n catchSteps = transformBlock(stmt.handler.body, catchCtx)\n }\n\n return {\n op: 'try',\n try: trySteps,\n ...(catchSteps && { catch: catchSteps }),\n ...(catchParam && { catchParam }),\n }\n}\n\n/**\n * Transform return statement\n */\nfunction transformReturnStatement(\n stmt: ReturnStatement,\n ctx: TransformContext\n): BaseNode | BaseNode[] {\n if (!stmt.argument) {\n return { op: 'return', value: {} }\n }\n\n // Check if the return expression requires a preceding step (e.g., atom call)\n const { step, resultVar } = transformExpressionToStep(\n stmt.argument,\n ctx,\n '__returnVal__'\n )\n\n // If there's a step (atom call), emit it first, then return the result variable\n if (step) {\n return [step, { op: 'return', value: resultVar }]\n }\n\n // Otherwise, convert expression directly to a value for return\n const value = expressionToValue(stmt.argument, ctx)\n return { op: 'return', value }\n}\n\n// Known builtins that should be evaluated as expressions, not atom calls\nconst BUILTIN_OBJECTS = new Set([\n 'Math',\n 'JSON',\n 'Array',\n 'Object',\n 'String',\n 'Number',\n 'console',\n 'Date', // Date factory with static methods like Date.now()\n 'Schema', // tosijs-schema fluent API for building JSON Schemas\n])\n\nconst BUILTIN_GLOBALS = new Set([\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'encodeURI',\n 'decodeURI',\n 'encodeURIComponent',\n 'decodeURIComponent',\n 'Set', // Factory function for set-like objects\n 'Date', // Factory function for date-like objects\n 'filter', // Schema-based object filtering\n])\n\nconst UNSUPPORTED_BUILTINS = new Set([\n 'RegExp',\n 'Promise',\n 'Map',\n 'WeakSet',\n 'WeakMap',\n 'Symbol',\n 'Proxy',\n 'Reflect',\n 'Function',\n 'eval',\n 'setTimeout',\n 'setInterval',\n 'fetch',\n 'require',\n 'import',\n 'process',\n 'window',\n 'document',\n 'global',\n 'globalThis',\n])\n\n// Instance methods that should be evaluated as expressions, not atom calls\n// These are methods on values (strings, arrays, etc.) that have native implementations\nconst INSTANCE_METHODS = new Set([\n // String methods\n 'toUpperCase',\n 'toLowerCase',\n 'trim',\n 'trimStart',\n 'trimEnd',\n 'charAt',\n 'charCodeAt',\n 'codePointAt',\n 'concat',\n 'includes',\n 'indexOf',\n 'lastIndexOf',\n 'startsWith',\n 'endsWith',\n 'slice',\n 'substring',\n 'substr',\n 'replace',\n 'replaceAll',\n 'match',\n 'search',\n 'padStart',\n 'padEnd',\n 'repeat',\n 'normalize',\n 'localeCompare',\n 'toString',\n 'valueOf',\n 'at',\n // Array methods (that don't need special atom handling)\n 'reverse',\n 'sort',\n 'fill',\n 'copyWithin',\n 'flat',\n 'flatMap',\n 'every',\n 'some',\n 'forEach',\n // Note: map, filter, find, reduce are handled specially as atoms for lambda support\n // Set methods (from Set() builtin)\n 'add',\n 'remove',\n 'has',\n 'clear',\n 'toArray',\n 'union',\n 'intersection',\n 'diff',\n // Date methods (from Date() builtin)\n 'format',\n 'isBefore',\n 'isAfter',\n // Note: Date.add and Date.diff are method calls that return new values\n])\n\n/**\n * Check if a CallExpression is a builtin call (Math.floor, JSON.parse, etc.)\n * or an instance method call (str.toUpperCase(), arr.includes(), etc.)\n */\nfunction isBuiltinCall(expr: CallExpression): boolean {\n // Check for global functions like parseInt()\n if (expr.callee.type === 'Identifier') {\n const name = (expr.callee as Identifier).name\n return BUILTIN_GLOBALS.has(name) || UNSUPPORTED_BUILTINS.has(name)\n }\n\n // Check for method calls\n if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n\n // Check for method calls on builtin objects like Math.floor()\n if (member.object.type === 'Identifier') {\n const objName = (member.object as Identifier).name\n if (BUILTIN_OBJECTS.has(objName) || UNSUPPORTED_BUILTINS.has(objName)) {\n return true\n }\n }\n\n // Check for instance method calls like str.toUpperCase()\n if (member.property.type === 'Identifier') {\n const methodName = (member.property as Identifier).name\n if (INSTANCE_METHODS.has(methodName)) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Check if a MemberExpression is accessing a builtin object (Math.PI, Number.MAX_VALUE, etc.)\n */\nfunction isBuiltinMemberAccess(expr: MemberExpression): boolean {\n if (expr.object.type === 'Identifier') {\n const objName = (expr.object as Identifier).name\n return BUILTIN_OBJECTS.has(objName) || UNSUPPORTED_BUILTINS.has(objName)\n }\n return false\n}\n\n// Error messages for unsupported builtins\nconst UNSUPPORTED_BUILTIN_MESSAGES: Record<string, string> = {\n RegExp: 'RegExp is not available. Use string methods or the regexMatch atom.',\n Promise: 'Promise is not needed. All operations are implicitly async.',\n Map: 'Map is not available. Use plain objects instead.',\n WeakSet: 'WeakSet is not available.',\n WeakMap: 'WeakMap is not available.',\n Symbol: 'Symbol is not available.',\n Proxy: 'Proxy is not available.',\n Reflect: 'Reflect is not available.',\n Function: 'Function constructor is not available. Define functions normally.',\n eval: 'eval is not available. Code is compiled, not evaluated.',\n setTimeout: 'setTimeout is not available. Use the delay atom.',\n setInterval: 'setInterval is not available. Use while loops with delay.',\n fetch: 'fetch is not available. Use the httpFetch atom.',\n require: 'require is not available. Atoms must be registered with the VM.',\n import: 'import is not available. Atoms must be registered with the VM.',\n process: 'process is not available. AsyncJS runs in a sandboxed environment.',\n window: 'window is not available. AsyncJS runs in a sandboxed environment.',\n document:\n 'document is not available. AsyncJS runs in a sandboxed environment.',\n global: 'global is not available. AsyncJS runs in a sandboxed environment.',\n globalThis: 'globalThis is not available. Use builtins directly.',\n}\n\n/**\n * Check if expression uses an unsupported builtin and return error message if so\n */\nfunction getUnsupportedBuiltinError(expr: CallExpression): string | null {\n if (expr.callee.type === 'Identifier') {\n const name = (expr.callee as Identifier).name\n if (UNSUPPORTED_BUILTINS.has(name)) {\n return (\n UNSUPPORTED_BUILTIN_MESSAGES[name] ||\n `${name} is not available in AsyncJS.`\n )\n }\n }\n\n if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n if (member.object.type === 'Identifier') {\n const objName = (member.object as Identifier).name\n if (UNSUPPORTED_BUILTINS.has(objName)) {\n return (\n UNSUPPORTED_BUILTIN_MESSAGES[objName] ||\n `${objName} is not available in AsyncJS.`\n )\n }\n }\n }\n\n return null\n}\n\n/**\n * Get helpful suggestion for 'new' expression alternatives\n */\nfunction getNewExpressionSuggestion(constructorName: string): string {\n const suggestions: Record<string, string> = {\n Date: \" Use Date() or Date('2024-01-15') instead - no 'new' needed.\",\n Set: \" Use Set([items]) instead - no 'new' needed.\",\n Map: ' Use plain objects instead of Map.',\n Array: ' Use array literals like [1, 2, 3] instead.',\n Object: ' Use object literals like { key: value } instead.',\n Error: \" Return an error object like { error: 'message' } instead.\",\n RegExp: ' Use string methods or the regexMatch atom.',\n Promise: ' Not needed - all operations are implicitly async.',\n WeakSet: ' WeakSet is not available.',\n WeakMap: ' WeakMap is not available.',\n }\n return (\n suggestions[constructorName] ||\n ' Use factory functions or object literals instead.'\n )\n}\n\n/**\n * Transform an expression, potentially into a step with a result variable\n */\nfunction transformExpressionToStep(\n expr: Expression,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode | null; resultVar: any } {\n const varOp = isConst ? 'constSet' : 'varSet'\n\n // Unwrap ChainExpression (optional chaining wrapper)\n if (expr.type === 'ChainExpression') {\n const chain = expr as any\n // The inner expression has optional: true on the relevant nodes\n // Just recurse with the unwrapped expression\n return transformExpressionToStep(\n chain.expression as Expression,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Check for 'new' keyword - not supported in AsyncJS\n if (expr.type === 'NewExpression') {\n const newExpr = expr as any\n let constructorName = 'constructor'\n if (newExpr.callee.type === 'Identifier') {\n constructorName = newExpr.callee.name\n }\n const suggestion = getNewExpressionSuggestion(constructorName)\n throw new TranspileError(\n `The 'new' keyword is not supported in AsyncJS.${suggestion}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n // Check for unsupported builtins first and give helpful error\n if (expr.type === 'CallExpression') {\n const unsupportedError = getUnsupportedBuiltinError(expr as CallExpression)\n if (unsupportedError) {\n throw new TranspileError(\n unsupportedError,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n }\n\n // Check if this is a builtin call (Math.floor, JSON.parse, parseInt, etc.)\n // Builtins are evaluated as expressions, not atom calls\n if (expr.type === 'CallExpression' && isBuiltinCall(expr as CallExpression)) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n return { step: null, resultVar: exprNode as any }\n }\n\n // Check if this is a builtin member access (Math.PI, Number.MAX_SAFE_INTEGER, etc.)\n if (\n expr.type === 'MemberExpression' &&\n isBuiltinMemberAccess(expr as MemberExpression)\n ) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n return { step: null, resultVar: exprNode as any }\n }\n\n // Function call -> atom invocation\n if (expr.type === 'CallExpression') {\n return transformCallExpression(\n expr as CallExpression,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Template literal -> template atom\n if (expr.type === 'TemplateLiteral') {\n return transformTemplateLiteral(\n expr as TemplateLiteral,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Binary/logical/unary expression - convert to ExprNode\n if (\n expr.type === 'BinaryExpression' ||\n expr.type === 'LogicalExpression' ||\n expr.type === 'UnaryExpression'\n ) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n // If we need to store the result, emit a varSet/constSet with the expression node as value\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n // No storage needed, just return the expression node as the result\n return { step: null, resultVar: exprNode as any }\n }\n\n // Simple value - no step needed\n const value = expressionToValue(expr, ctx)\n return { step: null, resultVar: value }\n}\n\n/**\n * Transform a function call expression\n */\nfunction transformCallExpression(\n expr: CallExpression,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n // Get the function name\n let funcName: string\n let isMethodCall = false\n let receiver: any\n\n if (expr.callee.type === 'Identifier') {\n funcName = (expr.callee as Identifier).name\n } else if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n if (member.property.type === 'Identifier') {\n funcName = (member.property as Identifier).name\n isMethodCall = true\n receiver = expressionToValue(member.object as Expression, ctx)\n } else {\n throw new TranspileError(\n 'Computed method names are not supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n } else {\n throw new TranspileError(\n 'Only named function calls are supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n // Handle built-in method calls\n if (isMethodCall) {\n return transformMethodCall(\n funcName,\n receiver,\n expr.arguments as Expression[],\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Handle console.log specially\n if (funcName === 'console' && expr.callee.type === 'MemberExpression') {\n // This would be caught above, but just in case\n }\n\n // Check if it's a known atom\n // For now, we assume any function call is an atom call\n // The VM will validate at runtime\n\n // Extract arguments\n const args = extractCallArguments(expr, ctx)\n\n return {\n step: {\n op: funcName,\n ...args,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Handle method calls like arr.map(), str.slice(), etc.\n */\nfunction transformMethodCall(\n method: string,\n receiver: any,\n args: Expression[],\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n switch (method) {\n case 'map':\n // arr.map(x => ...) -> map atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n let steps: BaseNode[]\n if (callback.body.type === 'BlockStatement') {\n steps = transformBlock(callback.body, childCtx)\n } else {\n // Expression body: x => x * 2\n const { step, resultVar: exprResult } = transformExpressionToStep(\n callback.body,\n childCtx,\n 'result'\n )\n steps = step\n ? [step]\n : [{ op: 'varSet', key: 'result', value: exprResult }]\n }\n\n return {\n step: {\n op: 'map',\n items: receiver,\n as: paramName,\n steps,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'filter':\n // arr.filter(x => condition) -> filter atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n // For filter, the callback should return a boolean expression\n // Convert the body to an ExprNode\n let condition: any\n if (callback.body.type === 'BlockStatement') {\n // Block body - look for return statement\n throw new TranspileError(\n 'filter callback must be an expression, not a block',\n getLocation(args[0]),\n ctx.source,\n ctx.filename\n )\n } else {\n // Expression body: x => x > 5\n condition = expressionToExprNode(callback.body, childCtx)\n }\n\n return {\n step: {\n op: 'filter',\n items: receiver,\n as: paramName,\n condition,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'find':\n // arr.find(x => condition) -> find atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n let condition: any\n if (callback.body.type === 'BlockStatement') {\n throw new TranspileError(\n 'find callback must be an expression, not a block',\n getLocation(args[0]),\n ctx.source,\n ctx.filename\n )\n } else {\n condition = expressionToExprNode(callback.body, childCtx)\n }\n\n return {\n step: {\n op: 'find',\n items: receiver,\n as: paramName,\n condition,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'reduce':\n // arr.reduce((acc, x) => expr, initial) -> reduce atom\n if (\n args.length >= 2 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const accParam = callback.params[0]\n const itemParam = callback.params[1]\n const accName = accParam?.type === 'Identifier' ? accParam.name : 'acc'\n const itemName =\n itemParam?.type === 'Identifier' ? itemParam.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(accName, { kind: 'any' })\n childCtx.locals.set(itemName, { kind: 'any' })\n\n let steps: BaseNode[]\n if (callback.body.type === 'BlockStatement') {\n steps = transformBlock(callback.body, childCtx)\n } else {\n // Expression body: (acc, x) => acc + x\n const { step, resultVar: exprResult } = transformExpressionToStep(\n callback.body,\n childCtx,\n 'result'\n )\n steps = step\n ? [step]\n : [{ op: 'varSet', key: 'result', value: exprResult }]\n }\n\n const initial = expressionToValue(args[1], ctx)\n\n return {\n step: {\n op: 'reduce',\n items: receiver,\n as: itemName,\n accumulator: accName,\n initial,\n steps,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'slice':\n // TODO: Could map to a slice atom\n break\n\n case 'push':\n return {\n step: {\n op: 'push',\n list: receiver,\n item: expressionToValue(args[0], ctx),\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n\n case 'join':\n return {\n step: {\n op: 'join',\n list: receiver,\n sep: args.length > 0 ? expressionToValue(args[0], ctx) : '',\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n\n case 'split':\n return {\n step: {\n op: 'split',\n str: receiver,\n sep: args.length > 0 ? expressionToValue(args[0], ctx) : '',\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n\n // Unknown method - emit warning and try as generic call\n ctx.warnings.push({\n message: `Unknown method '${method}' - treating as atom call`,\n line: 0,\n column: 0,\n })\n\n return {\n step: {\n op: method,\n receiver,\n args: args.map((a) => expressionToValue(a, ctx)),\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Transform template literal\n */\nfunction transformTemplateLiteral(\n expr: TemplateLiteral,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n // Build template string with {{var}} placeholders\n let tmpl = ''\n const vars: Record<string, any> = {}\n\n for (let i = 0; i < expr.quasis.length; i++) {\n tmpl += expr.quasis[i].value.cooked || expr.quasis[i].value.raw\n\n if (i < expr.expressions.length) {\n const exprNode = expr.expressions[i]\n const varName = `_${i}`\n vars[varName] = expressionToValue(exprNode as Expression, ctx)\n tmpl += `{{${varName}}}`\n }\n }\n\n return {\n step: {\n op: 'template',\n tmpl,\n vars,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Convert an Acorn expression to an ExprNode for direct VM evaluation.\n * This replaces the string-based condition system.\n */\nfunction expressionToExprNode(\n expr: Expression,\n ctx: TransformContext\n): ExprNode {\n switch (expr.type) {\n case 'Literal': {\n const lit = expr as Literal\n return { $expr: 'literal', value: lit.value }\n }\n\n case 'Identifier': {\n const id = expr as Identifier\n return { $expr: 'ident', name: id.name }\n }\n\n case 'MemberExpression': {\n const mem = expr as MemberExpression\n const obj = expressionToExprNode(mem.object as Expression, ctx)\n const isOptional = (mem as any).optional === true\n\n if (mem.computed) {\n // arr[0] or obj[key] - computed access\n // For now, only support literal indices\n const prop = mem.property as Expression\n if (prop.type === 'Literal') {\n return {\n $expr: 'member',\n object: obj,\n property: String((prop as Literal).value),\n computed: true,\n ...(isOptional && { optional: true }),\n }\n }\n // For computed with variable, we'd need more complex handling\n throw new TranspileError(\n 'Computed member access with variables not yet supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n const propName = (mem.property as Identifier).name\n return {\n $expr: 'member',\n object: obj,\n property: propName,\n ...(isOptional && { optional: true }),\n }\n }\n\n case 'ChainExpression': {\n // ChainExpression wraps optional chaining (?.)\n // Just unwrap to the inner expression which will have optional: true\n const chain = expr as any\n return expressionToExprNode(chain.expression as Expression, ctx)\n }\n\n case 'BinaryExpression': {\n const bin = expr as BinaryExpression\n return {\n $expr: 'binary',\n op: bin.operator,\n left: expressionToExprNode(bin.left as Expression, ctx),\n right: expressionToExprNode(bin.right as Expression, ctx),\n }\n }\n\n case 'LogicalExpression': {\n const log = expr as LogicalExpression\n return {\n $expr: 'logical',\n op: log.operator as '&&' | '||' | '??',\n left: expressionToExprNode(log.left as Expression, ctx),\n right: expressionToExprNode(log.right as Expression, ctx),\n }\n }\n\n case 'UnaryExpression': {\n const un = expr as any\n return {\n $expr: 'unary',\n op: un.operator,\n argument: expressionToExprNode(un.argument as Expression, ctx),\n }\n }\n\n case 'ConditionalExpression': {\n const cond = expr as any\n return {\n $expr: 'conditional',\n test: expressionToExprNode(cond.test as Expression, ctx),\n consequent: expressionToExprNode(cond.consequent as Expression, ctx),\n alternate: expressionToExprNode(cond.alternate as Expression, ctx),\n }\n }\n\n case 'ArrayExpression': {\n const arr = expr as ArrayExpression\n return {\n $expr: 'array',\n elements: arr.elements\n .filter((el): el is Expression => el !== null)\n .map((el) => expressionToExprNode(el, ctx)),\n }\n }\n\n case 'ObjectExpression': {\n const obj = expr as ObjectExpression\n const properties: { key: string; value: ExprNode }[] = []\n\n for (const prop of obj.properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n properties.push({\n key,\n value: expressionToExprNode(prop.value as Expression, ctx),\n })\n }\n }\n\n return { $expr: 'object', properties }\n }\n\n case 'CallExpression': {\n const call = expr as CallExpression\n\n // Handle method calls (e.g., Math.floor(x), str.toUpperCase(), arr.push(x))\n if (call.callee.type === 'MemberExpression') {\n const member = call.callee as MemberExpression\n const method =\n member.property.type === 'Identifier'\n ? (member.property as Identifier).name\n : String((member.property as Literal).value)\n\n // Check for optional chaining: obj?.method() or obj.method?.()\n const isOptional =\n (member as any).optional === true || (call as any).optional === true\n\n return {\n $expr: 'methodCall',\n object: expressionToExprNode(member.object as Expression, ctx),\n method,\n arguments: call.arguments.map((arg) =>\n expressionToExprNode(arg as Expression, ctx)\n ),\n ...(isOptional && { optional: true }),\n }\n }\n\n // Handle global function calls (e.g., parseInt(x), parseFloat(x))\n if (call.callee.type === 'Identifier') {\n const funcName = (call.callee as Identifier).name\n return {\n $expr: 'call',\n callee: funcName,\n arguments: call.arguments.map((arg) =>\n expressionToExprNode(arg as Expression, ctx)\n ),\n }\n }\n\n // Other call types not supported in expressions\n throw new TranspileError(\n 'Complex function calls in expressions should be lifted to statements',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n case 'NewExpression': {\n const newExpr = expr as any\n let constructorName = 'constructor'\n if (newExpr.callee.type === 'Identifier') {\n constructorName = newExpr.callee.name\n }\n const suggestion = getNewExpressionSuggestion(constructorName)\n throw new TranspileError(\n `The 'new' keyword is not supported in AsyncJS.${suggestion}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n case 'TemplateLiteral':\n throw new TranspileError(\n 'Template literals inside expressions are not supported. ' +\n 'Assign to a variable first: const msg = `hello ${name}`; then use msg',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n\n default:\n throw new TranspileError(\n `Unsupported expression type in condition: ${expr.type}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n}\n\n// Note: extractCondition, expressionToConditionString, and extractVariablesFromExpression\n// have been removed. Use expressionToExprNode instead - it converts Acorn AST directly\n// to ExprNode format, eliminating the need for JSEP string parsing at runtime.\n\n/**\n * Convert an expression to a runtime value (for varSet, etc.)\n */\nfunction expressionToValue(expr: Expression, ctx: TransformContext): any {\n switch (expr.type) {\n case 'Literal':\n return (expr as Literal).value\n\n case 'Identifier': {\n const name = (expr as Identifier).name\n // Parameters are imported into state via varsImport at function start,\n // so we reference them as state variables (just the name string)\n // No need for $kind: 'arg' since args are copied to state\n return name\n }\n\n case 'MemberExpression': {\n const mem = expr as MemberExpression\n const isOptional = (mem as any).optional === true\n\n // If optional chaining, we need an ExprNode for proper runtime handling\n if (isOptional) {\n return expressionToExprNode(expr, ctx)\n }\n\n const objValue = expressionToValue(mem.object as Expression, ctx)\n\n // If the object resolved to an ExprNode (e.g., from nested optional chaining),\n // we need to build an ExprNode for this access too\n if (objValue && typeof objValue === 'object' && objValue.$expr) {\n const prop = mem.computed\n ? String((mem.property as Literal).value)\n : (mem.property as Identifier).name\n return {\n $expr: 'member',\n object: objValue,\n property: prop,\n ...(mem.computed && { computed: true }),\n }\n }\n\n if (mem.computed) {\n // arr[0] - would need runtime evaluation\n return `${objValue}[${expressionToValue(\n mem.property as Expression,\n ctx\n )}]`\n }\n\n const prop = (mem.property as Identifier).name\n\n // If objValue is a string path, extend it\n if (typeof objValue === 'string') {\n return `${objValue}.${prop}`\n }\n\n // If objValue is an arg ref, extend the path\n if (objValue && objValue.$kind === 'arg') {\n return { $kind: 'arg', path: `${objValue.path}.${prop}` }\n }\n\n return `${objValue}.${prop}`\n }\n\n case 'ChainExpression': {\n // Unwrap ChainExpression and process the inner expression\n const chain = expr as any\n return expressionToValue(chain.expression as Expression, ctx)\n }\n\n case 'ArrayExpression':\n return (expr as ArrayExpression).elements.map((el) =>\n el ? expressionToValue(el as Expression, ctx) : null\n )\n\n case 'ObjectExpression': {\n const result: Record<string, any> = {}\n for (const prop of (expr as ObjectExpression).properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n result[key] = expressionToValue(prop.value as Expression, ctx)\n }\n }\n return result\n }\n\n case 'TemplateLiteral':\n // Template literals need runtime evaluation - convert to ExprNode\n // This will throw a helpful error explaining the limitation\n return expressionToExprNode(expr, ctx)\n\n case 'CallExpression':\n // Method calls like s.toArray() used as values need to be ExprNodes\n return expressionToExprNode(expr, ctx)\n\n case 'BinaryExpression':\n case 'LogicalExpression':\n case 'UnaryExpression':\n case 'ConditionalExpression':\n // Complex expressions need to be ExprNodes for runtime evaluation\n return expressionToExprNode(expr, ctx)\n\n default:\n return null\n }\n}\n\n/**\n * Extract call arguments from a call expression\n */\nfunction extractCallArguments(\n expr: CallExpression,\n ctx: TransformContext\n): Record<string, any> {\n // If single object argument, spread it\n if (\n expr.arguments.length === 1 &&\n expr.arguments[0].type === 'ObjectExpression'\n ) {\n const obj = expr.arguments[0] as ObjectExpression\n const result: Record<string, any> = {}\n\n for (const prop of obj.properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n result[key] = expressionToValue(prop.value as Expression, ctx)\n }\n }\n\n return result\n }\n\n // Otherwise, use positional args\n return {\n args: expr.arguments.map((arg) =>\n expressionToValue(arg as Expression, ctx)\n ),\n }\n}\n", "/**\n * TJS Core - Essential transpiler functions without TypeScript dependency\n *\n * This module provides the core AJS transpilation functions.\n * Import from here (not ./index) to avoid pulling in the TS compiler.\n */\n\nimport type { SeqNode } from '../builder'\nimport type {\n TranspileOptions,\n TranspileResult,\n FunctionSignature,\n TypeDescriptor,\n} from './types'\nimport { parse, validateSingleFunction } from './parser'\nimport { transformFunction } from './emitters/ast'\nimport {\n transpileToJS,\n type TJSTranspileResult,\n type TJSTranspileOptions,\n} from './emitters/js'\n\nexport * from './types'\nexport {\n parse,\n preprocess,\n extractTDoc,\n validateSingleFunction,\n} from './parser'\nexport { transformFunction } from './emitters/ast'\n\n/**\n * Transpile JavaScript source code to Agent99 AST\n */\nexport function transpile(\n source: string,\n options: TranspileOptions = {}\n): TranspileResult {\n const {\n ast: program,\n returnType,\n originalSource,\n requiredParams,\n } = parse(source, {\n filename: options.filename,\n colonShorthand: true,\n vmTarget: true,\n })\n\n const func = validateSingleFunction(program, options.filename)\n\n const { ast, signature, warnings } = transformFunction(\n func,\n originalSource,\n returnType,\n options,\n requiredParams\n )\n\n return {\n ast: ast as SeqNode,\n signature,\n warnings,\n }\n}\n\n/**\n * Transpile AsyncJS source and return just the AST\n */\nexport function ajs(strings: TemplateStringsArray, ...values: any[]): SeqNode\nexport function ajs(source: string): SeqNode\nexport function ajs(\n sourceOrStrings: string | TemplateStringsArray,\n ...values: any[]\n): SeqNode {\n if (typeof sourceOrStrings === 'string') {\n return transpile(sourceOrStrings).ast\n }\n const source = sourceOrStrings.reduce(\n (acc, str, i) =>\n acc + str + (values[i] !== undefined ? String(values[i]) : ''),\n ''\n )\n return transpile(source).ast\n}\n\n/**\n * Create a function with attached signature for introspection\n */\nexport function createAgent(\n source: string,\n vm: { run: (ast: any, args: any, options?: any) => Promise<any> },\n runOptions?: { fuel?: number; capabilities?: any }\n): ((args: Record<string, any>) => Promise<any>) & {\n signature: FunctionSignature\n ast: SeqNode\n} {\n const { ast, signature } = transpile(source)\n\n const agent = async (args: Record<string, any>) => {\n const result = await vm.run(ast, args, runOptions)\n return result.result\n }\n\n ;(agent as any).signature = signature\n ;(agent as any).ast = ast\n\n return agent as any\n}\n\n/**\n * Convert TypeDescriptor to JSON Schema\n */\nfunction typeDescriptorToJsonSchema(type: TypeDescriptor): any {\n switch (type.kind) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'null':\n return { type: 'null' }\n case 'array':\n return {\n type: 'array',\n items: type.items ? typeDescriptorToJsonSchema(type.items) : {},\n }\n case 'object':\n if (!type.shape) {\n return { type: 'object' }\n }\n return {\n type: 'object',\n properties: Object.fromEntries(\n Object.entries(type.shape).map(([k, v]) => [\n k,\n typeDescriptorToJsonSchema(v),\n ])\n ),\n }\n case 'union':\n if (!type.members) {\n return {}\n }\n return {\n anyOf: type.members.map(typeDescriptorToJsonSchema),\n }\n case 'any':\n default:\n return {}\n }\n}\n\n/**\n * Get tool definitions from a set of agent functions\n */\nexport function getToolDefinitions(\n agents: Record<string, { signature: FunctionSignature }>\n): Array<{\n type: 'function'\n function: {\n name: string\n description?: string\n parameters: {\n type: 'object'\n properties: Record<string, any>\n required: string[]\n }\n }\n}> {\n return Object.entries(agents).map(([name, agent]) => {\n const sig = agent.signature\n\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [paramName, param] of Object.entries(sig.parameters)) {\n properties[paramName] = typeDescriptorToJsonSchema(param.type)\n if (param.description) {\n properties[paramName].description = param.description\n }\n if (param.required) {\n required.push(paramName)\n }\n }\n\n return {\n type: 'function' as const,\n function: {\n name,\n description: sig.description,\n parameters: {\n type: 'object' as const,\n properties,\n required,\n },\n },\n }\n })\n}\n\n/**\n * Transpile TJS source to JavaScript with type metadata.\n * Works as both a function and a tagged template literal.\n */\nexport function tjs(\n strings: TemplateStringsArray,\n ...values: any[]\n): TJSTranspileResult\nexport function tjs(\n source: string,\n options?: TJSTranspileOptions\n): TJSTranspileResult\nexport function tjs(\n sourceOrStrings: string | TemplateStringsArray,\n optionsOrFirstValue?: TJSTranspileOptions | any,\n ...restValues: any[]\n): TJSTranspileResult {\n if (typeof sourceOrStrings === 'string') {\n return transpileToJS(\n sourceOrStrings,\n optionsOrFirstValue as TJSTranspileOptions\n )\n }\n // Tagged template literal\n const values =\n optionsOrFirstValue !== undefined\n ? [optionsOrFirstValue, ...restValues]\n : restValues\n const source = sourceOrStrings.reduce(\n (acc, str, i) =>\n acc + str + (values[i] !== undefined ? String(values[i]) : ''),\n ''\n )\n return transpileToJS(source)\n}\n", "/**\n * Safe Eval and SafeFunction - VM-backed dynamic code execution\n *\n * Import this module explicitly when you need to execute code dynamically.\n * This pulls in the AJS transpiler and VM (~50KB gzipped).\n *\n * For static code (pre-transpiled), use the lite runtime instead.\n */\n\nimport { AgentVM } from '../vm/vm'\nimport { transpile } from './core'\n\n// Singleton VM instance (lazy)\nlet _vm: AgentVM<Record<string, never>> | null = null\nconst getVM = () => (_vm ??= new AgentVM())\n\n/**\n * Walk an AST and wrap return values in { __result: value } objects.\n * This lets Eval/SafeFunction return arbitrary values through the VM,\n * which enforces strict object returns for agent composability.\n */\nfunction wrapReturnValues(node: any): void {\n if (!node || typeof node !== 'object') return\n if (Array.isArray(node)) {\n for (const child of node) wrapReturnValues(child)\n return\n }\n if (node.op === 'return' && 'value' in node) {\n node.value = { __result: node.value }\n }\n // Recurse into steps (seq), branches (if/else), etc.\n if (node.steps) wrapReturnValues(node.steps)\n if (node.then) wrapReturnValues(node.then)\n if (node.else) wrapReturnValues(node.else)\n if (node.body) wrapReturnValues(node.body)\n}\n\n/** Capabilities that can be injected into SafeFunction/Eval */\nexport interface SafeCapabilities {\n /** Fetch function for HTTP requests */\n fetch?: typeof globalThis.fetch\n /** Console for logging */\n console?: Pick<typeof console, 'log' | 'warn' | 'error'>\n /** Additional capabilities to expose */\n [key: string]: unknown\n}\n\n/** Options for Eval */\nexport interface EvalOptions {\n /** Code to evaluate (expression or statements with return) */\n code: string\n /** Context variables available to the code */\n context?: Record<string, unknown>\n /** Fuel budget (default: 1000) */\n fuel?: number\n /** Timeout in milliseconds (default: fuel * 10) */\n timeoutMs?: number\n /** Capabilities to inject (fetch, console, etc.) */\n capabilities?: SafeCapabilities\n}\n\n/**\n * Safely evaluate code in a sandboxed VM with fuel metering\n */\nexport async function Eval(options: EvalOptions): Promise<{\n result: unknown\n fuelUsed: number\n error?: { message: string }\n}> {\n const {\n code,\n context = {},\n fuel = 1000,\n timeoutMs,\n capabilities = {},\n } = options\n\n const vm = getVM()\n\n // Wrap code in a function - detect if it's an expression or has return\n const hasReturn = /\\breturn\\b/.test(code)\n const wrappedCode = hasReturn\n ? `function __eval() { ${code} }`\n : `function __eval() { return (${code}) }`\n\n try {\n const { ast } = transpile(wrappedCode)\n\n // Box return values in objects for VM strict-return compliance.\n // Walk AST and wrap each { op: 'return', value } into\n // { op: 'return', value: { __result: originalValue } }\n wrapReturnValues(ast)\n\n const vmResult = await vm.run(ast, context, {\n fuel,\n timeoutMs,\n capabilities,\n })\n\n // Unwrap the boxed result\n const raw = vmResult.result\n const result =\n raw && typeof raw === 'object' && '__result' in raw ? raw.__result : raw\n\n return {\n result,\n fuelUsed: vmResult.fuelUsed,\n error: vmResult.error\n ? { message: vmResult.error.message || String(vmResult.error) }\n : undefined,\n }\n } catch (err: any) {\n return {\n result: undefined,\n fuelUsed: fuel,\n error: { message: err.message || String(err) },\n }\n }\n}\n\n/** Options for SafeFunction */\nexport interface SafeFunctionOptions {\n /** Function body code */\n body: string\n /** Parameter names (in order) */\n params?: string[]\n /** Fuel budget per invocation (default: 1000) */\n fuel?: number\n /** Timeout in milliseconds (default: fuel * 10) */\n timeoutMs?: number\n /** Capabilities to inject (fetch, console, etc.) */\n capabilities?: SafeCapabilities\n}\n\n/**\n * Create a reusable sandboxed function with fuel metering\n */\nexport async function SafeFunction(options: SafeFunctionOptions): Promise<\n (...args: unknown[]) => Promise<{\n result: unknown\n fuelUsed: number\n error?: { message: string }\n }>\n> {\n const {\n body,\n params = [],\n fuel = 1000,\n timeoutMs,\n capabilities = {},\n } = options\n\n const vm = getVM()\n\n // Build function source with parameters\n const paramList = params.join(', ')\n const source = `function __safeFn(${paramList}) { ${body} }`\n\n // Pre-compile the AST (done once at creation time)\n const { ast } = transpile(source)\n\n // Box return values for VM strict-return compliance\n wrapReturnValues(ast)\n\n // Return a function that runs the pre-compiled AST\n return async (...args: unknown[]) => {\n const context: Record<string, unknown> = {}\n for (let i = 0; i < params.length; i++) {\n context[params[i]] = args[i]\n }\n\n try {\n const vmResult = await vm.run(ast, context, {\n fuel,\n timeoutMs,\n capabilities,\n })\n\n // Unwrap the boxed result\n const raw = vmResult.result\n const result =\n raw && typeof raw === 'object' && '__result' in raw ? raw.__result : raw\n\n return {\n result,\n fuelUsed: vmResult.fuelUsed,\n error: vmResult.error\n ? { message: vmResult.error.message || String(vmResult.error) }\n : undefined,\n }\n } catch (err: any) {\n return {\n result: undefined,\n fuelUsed: fuel,\n error: { message: err.message || String(err) },\n }\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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ACpB,MAAQT,EAAQS,EAAY,KAAKZ,CAAmB,KAAO,MACzDW,EAAS,IAAIR,EAAM,CAAC,CAAC,EAIvB,IAAMU,EACJ,+DACF,MAAQV,EAAQU,EAAW,KAAKb,CAAmB,KAAO,MACxDW,EAAS,IAAIR,EAAM,CAAC,CAAC,EAMvB,IAAMW,EAAW,IAAI,IAAI,CACvB,KACA,OACA,MACA,QACA,KACA,SACA,OACA,QACA,WACA,SACA,WACA,MACA,QACA,MACA,MACA,OACA,OACA,QACA,OACA,YACA,SACA,aACA,KACA,KACA,MACA,QACA,UACA,QACA,QACA,QACA,QACA,UACA,QACA,SACA,SACA,UACA,OACA,KACA,SACA,MACA,MACA,QAEA,UACA,OACA,QACA,SACA,SACA,SACA,UACA,OACA,OACA,UACA,MACA,MACA,UACA,UACA,eACA,eACA,YACA,aACA,aACA,aACA,cACA,cACA,gBACA,iBACA,cACA,WACA,QACA,YACA,aACA,SACA,OACA,MACA,QACA,UACA,QACA,SACA,MACA,SACA,SACA,UACA,OACA,YACA,UACA,WACA,aACA,SACA,WACA,WACA,MACA,QACA,WACA,WACA,aACA,YACA,YACA,OACA,YACF,CAAC,EAGK3B,EAAqB,CAAC,EAC5B,QAAW4B,KAAMV,EACX,CAACM,EAAS,IAAII,CAAE,GAAK,CAACD,EAAS,IAAIC,CAAE,GAAK,CAAChB,GAAgBgB,CAAE,GAC/D5B,EAAS,KAAK4B,CAAE,EAIpB,OAAO5B,EAAS,KAAK,CACvB,CAYA,SAASI,GACP7B,EACAsD,EACAC,EACoB,CAGpB,IAAMC,EAAcxD,EAAO,MAAM,EAAGsD,CAAc,EAI5CG,EAAc,uDACdhB,EAAQe,EAAY,MAAMC,CAAW,EAE3C,GAAI,CAAChB,EAAO,CAEV,IAAMiB,EACJ,kFACIC,EAAaH,EAAY,MAAME,CAAY,EACjD,OAAKC,EACEC,GAAsBD,EAAW,CAAC,EAAGJ,CAAS,EADpC,MAEnB,CAEA,OAAOK,GAAsBnB,EAAM,CAAC,EAAGc,CAAS,CAClD,CAKA,SAASK,GACPC,EACAN,EACoB,CAEpB,IAAMO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",
|
|
4
|
+
"sourcesContent": ["import { s, validate, filter as schemaFilter } from 'tosijs-schema'\n\n/** Well-known symbol for custom equality (matches src/lang/runtime.ts) */\nconst tjsEquals = Symbol.for('tjs.equals')\n\n/**\n * Structural equality for AJS expressions.\n * Mirrors the TJS Is() function: symbol \u2192 .Equals \u2192 structural.\n */\nfunction isStructurallyEqual(a: unknown, b: unknown): boolean {\n // Symbol protocol\n if (\n a !== null &&\n typeof a === 'object' &&\n typeof (a as any)[tjsEquals] === 'function'\n ) {\n return (a as any)[tjsEquals](b)\n }\n if (\n b !== null &&\n typeof b === 'object' &&\n typeof (b as any)[tjsEquals] === 'function'\n ) {\n return (b as any)[tjsEquals](a)\n }\n\n // .Equals method\n if (\n a !== null &&\n typeof a === 'object' &&\n typeof (a as any).Equals === 'function'\n ) {\n return (a as any).Equals(b)\n }\n if (\n b !== null &&\n typeof b === 'object' &&\n typeof (b as any).Equals === 'function'\n ) {\n return (b as any).Equals(a)\n }\n\n if (a === b) return true\n\n // Nullish equality (null == undefined)\n if ((a === null || a === undefined) && (b === null || b === undefined))\n return true\n\n if (a === null || a === undefined || b === null || b === undefined)\n return false\n\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return false\n\n // Arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => isStructurallyEqual(v, b[i]))\n }\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\n // Objects\n const keysA = Object.keys(a as object)\n const keysB = Object.keys(b as object)\n if (keysA.length !== keysB.length) return false\n return keysA.every((k) => isStructurallyEqual((a as any)[k], (b as any)[k]))\n}\n\n// --- Monadic Error Type ---\n\n/**\n * AgentError wraps errors as values for monadic error flow.\n * When an atom fails, it stores an AgentError instead of throwing.\n * Subsequent atoms check for errors and pass them through without executing.\n */\nexport class AgentError {\n readonly $error = true as const\n readonly message: string\n readonly op: string\n readonly cause?: Error\n\n constructor(message: string, op: string, cause?: Error) {\n this.message = message\n this.op = op\n this.cause = cause\n }\n\n toString(): string {\n return `AgentError[${this.op}]: ${this.message}`\n }\n\n toJSON(): { $error: true; message: string; op: string } {\n return { $error: true, message: this.message, op: this.op }\n }\n}\n\n/**\n * Check if a value is an AgentError\n */\nexport function isAgentError(value: any): value is AgentError {\n return value instanceof AgentError || (value && value.$error === true)\n}\n\n// --- Types ---\n\nexport type OpCode = string\n\nexport interface Capabilities {\n fetch?: (url: string, init?: any) => Promise<any>\n store?: {\n get: (key: string) => Promise<any>\n set: (key: string, value: any) => Promise<void>\n query?: (query: any) => Promise<any[]>\n vectorSearch?: (\n collection: string,\n vector: number[],\n k?: number,\n filter?: any\n ) => Promise<any[]>\n }\n llm?: {\n predict: (prompt: string, options?: any) => Promise<string>\n embed?: (text: string) => Promise<number[]>\n }\n agent?: {\n run: (agentId: string, input: any) => Promise<any>\n }\n xml?: {\n parse: (xml: string) => Promise<any>\n }\n code?: {\n /** Transpile AsyncJS source to AST */\n transpile: (source: string) => { op: string; steps: any[] }\n }\n [key: string]: any\n}\n\nexport interface TraceEvent {\n op: string\n input: any\n stateDiff: Record<string, any>\n result?: any\n error?: string\n fuelBefore: number\n fuelAfter: number\n timestamp: string\n}\n\n/** Cost override: static number or dynamic function */\nexport type CostOverride =\n | number\n | ((input: any, ctx: RuntimeContext) => number)\n\nexport interface RuntimeContext {\n fuel: { current: number }\n args: Record<string, any>\n state: Record<string, any> // Current scope state\n consts: Set<string> // Variables declared with const (immutable)\n capabilities: Capabilities\n resolver: (op: string) => Atom<any, any> | undefined\n output?: any\n error?: AgentError // Monadic error - when set, subsequent atoms are skipped\n memo?: Map<string, any>\n trace?: TraceEvent[]\n warnings?: string[] // Non-fatal warnings (e.g., console.warn)\n signal?: AbortSignal // External abort signal for timeout enforcement\n costOverrides?: Record<string, CostOverride> // Per-atom cost overrides\n context?: Record<string, any> // Immutable request-scoped metadata (auth, permissions, etc.)\n runCodeDepth?: number // Track nested runCode calls to prevent infinite recursion\n}\n\nexport type AtomExec = (step: any, ctx: RuntimeContext) => Promise<void>\n\nexport interface AtomDef {\n op: OpCode\n inputSchema: any\n outputSchema?: any\n exec: AtomExec\n docs?: string\n timeoutMs?: number\n cost?: number | ((input: any, ctx: RuntimeContext) => number)\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Atom<I, O> extends AtomDef {\n create(input: I): I & { op: string }\n}\n\nexport interface AtomOptions {\n docs?: string\n timeoutMs?: number\n cost?: number | ((input: any, ctx: RuntimeContext) => number)\n}\n\nexport interface RunResult {\n result: any\n error?: AgentError\n fuelUsed: number\n trace?: TraceEvent[]\n warnings?: string[] // Non-fatal warnings emitted during execution\n}\n\n// --- Procedure Store ---\n\n/**\n * Stored procedure entry with AST and expiry metadata\n */\nexport interface StoredProcedure {\n ast: any\n createdAt: number\n expiresAt: number\n}\n\n/**\n * Module-level procedure store. In production, replace with a proper cache.\n * Default TTL: 1 hour. Max AST size: 100KB.\n */\nexport const procedureStore = new Map<string, StoredProcedure>()\n\n/** Default TTL for stored procedures: 1 hour */\nexport const DEFAULT_PROCEDURE_TTL = 60 * 60 * 1000\n\n/** Default max AST size: 100KB */\nexport const DEFAULT_MAX_AST_SIZE = 100 * 1024\n\n/** Token prefix for identifying procedure tokens */\nexport const PROCEDURE_TOKEN_PREFIX = 'proc_'\n\n/**\n * Check if a string is a procedure token\n */\nexport function isProcedureToken(value: any): value is string {\n return typeof value === 'string' && value.startsWith(PROCEDURE_TOKEN_PREFIX)\n}\n\n/**\n * Resolve a procedure token to its AST.\n * Returns the AST or throws an error if expired/not found.\n */\nexport function resolveProcedureToken(token: string): any {\n const entry = procedureStore.get(token)\n if (!entry) {\n throw new Error(`Procedure not found: ${token}`)\n }\n if (Date.now() > entry.expiresAt) {\n procedureStore.delete(token) // Clean up expired entry\n throw new Error(`Procedure expired: ${token}`)\n }\n return entry.ast\n}\n\n/**\n * Generate a unique procedure token\n */\nfunction generateProcedureToken(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return PROCEDURE_TOKEN_PREFIX + crypto.randomUUID()\n }\n // Fallback\n return (\n PROCEDURE_TOKEN_PREFIX +\n Math.random().toString(36).slice(2) +\n Date.now().toString(36)\n )\n}\n\n// --- Security ---\n\n/**\n * Properties that are forbidden to access for security reasons.\n * Accessing these could allow prototype pollution or sandbox escape.\n */\nconst FORBIDDEN_PROPERTIES = new Set(['__proto__', 'constructor', 'prototype'])\n\n/**\n * Throws if the property name is forbidden for security reasons.\n */\nfunction assertSafeProperty(prop: string): void {\n if (FORBIDDEN_PROPERTIES.has(prop)) {\n throw new Error(`Security Error: Access to '${prop}' is forbidden`)\n }\n}\n\n/**\n * SSRF Protection: Block requests to private/internal addresses.\n * Only applies to default fetch; custom capabilities handle their own validation.\n */\nconst BLOCKED_HOSTS = new Set([\n 'localhost',\n '127.0.0.1',\n '0.0.0.0',\n '[::1]',\n 'metadata.google.internal',\n])\n\nfunction isBlockedUrl(urlString: string): boolean {\n try {\n const url = new URL(urlString)\n\n // Block non-http(s) protocols\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return true\n }\n\n const host = url.hostname.toLowerCase()\n\n // Block known dangerous hosts\n if (BLOCKED_HOSTS.has(host)) return true\n\n // Block internal suffixes\n if (host.endsWith('.internal') || host.endsWith('.local')) return true\n\n // Block AWS/cloud metadata IP\n if (host === '169.254.169.254') return true\n\n // Block private IP ranges\n if (\n /^10\\./.test(host) ||\n /^192\\.168\\./.test(host) ||\n /^172\\.(1[6-9]|2\\d|3[01])\\./.test(host)\n ) {\n return true\n }\n\n return false\n } catch {\n return true // Invalid URL = blocked\n }\n}\n\n/**\n * ReDoS Protection: Detect regex patterns likely to cause catastrophic backtracking.\n * Patterns with nested quantifiers on overlapping character classes are dangerous.\n */\nfunction isSuspiciousRegex(pattern: string): boolean {\n // Nested quantifiers: (a+)+ or (a*)* or (a+)*\n if (/\\([^)]*[+*][^)]*\\)[+*]/.test(pattern)) return true\n\n // Overlapping alternation with quantifiers: (a|a)+\n if (/\\(([^|)]+)\\|\\1\\)[+*]/.test(pattern)) return true\n\n // Common ReDoS patterns\n if (/\\(\\.\\*\\)\\+/.test(pattern)) return true // (.*)+\n if (/\\(\\.\\+\\)\\+/.test(pattern)) return true // (.+)+\n if (/\\(\\[.*\\]\\+\\)\\+/.test(pattern)) return true // ([...]+)+\n\n return false\n}\n\n// --- Helpers ---\n\n/**\n * Creates a child scope for the context.\n * Uses prototype inheritance so reads fall through to parent, but writes stay local.\n */\nexport function createChildScope(ctx: RuntimeContext): RuntimeContext {\n return {\n ...ctx,\n state: Object.create(ctx.state),\n }\n}\n\n/**\n * Computes a shallow diff between two objects, returning the changes.\n */\nfunction diffObjects(\n before: Record<string, any>,\n after: Record<string, any>\n): Record<string, any> {\n const diff: Record<string, any> = {}\n const allKeys = new Set([...Object.keys(before), ...Object.keys(after)])\n\n for (const key of allKeys) {\n const beforeVal = before[key]\n const afterVal = after[key]\n\n if (afterVal !== beforeVal) {\n // For simplicity in tracing, we'll just show the new value.\n // A more complex diff could show { before: ..., after: ... }.\n diff[key] = afterVal\n }\n }\n return diff\n}\n\nexport function resolveValue(val: any, ctx: RuntimeContext): any {\n if (val && typeof val === 'object' && val.$kind === 'arg') {\n return ctx.args[val.path]\n }\n // Expression nodes - evaluate directly\n if (val && typeof val === 'object' && val.$expr) {\n return evaluateExpr(val, ctx)\n }\n if (typeof val === 'string') {\n // Special case: args.foo looks up ctx.args['foo'] directly\n // BUT only if 'args' is not a state variable (which takes precedence)\n if (val.startsWith('args.') && !('args' in ctx.state)) {\n return ctx.args[val.replace('args.', '')]\n }\n // Dot notation support\n if (val.includes('.')) {\n const parts = val.split('.')\n // Security: check each property name for forbidden access\n for (const part of parts) {\n if (FORBIDDEN_PROPERTIES.has(part)) {\n throw new Error(`Security Error: Access to '${part}' is forbidden`)\n }\n }\n let current = ctx.state[parts[0]]\n // If root variable exists, try to traverse\n if (current !== undefined) {\n for (let i = 1; i < parts.length; i++) {\n current = current?.[parts[i]]\n }\n return current\n }\n }\n // Simple state lookup (not an expression, just key)\n // Check if the key exists in state (even if value is undefined)\n if (val in ctx.state) {\n return ctx.state[val]\n }\n // Key doesn't exist in state - return the literal string\n return val\n }\n // Recursively resolve plain object values (but not arrays or special objects)\n if (\n val &&\n typeof val === 'object' &&\n !Array.isArray(val) &&\n val.constructor === Object\n ) {\n const result: Record<string, any> = {}\n for (const key of Object.keys(val)) {\n result[key] = resolveValue(val[key], ctx)\n }\n return result\n }\n // Recursively resolve array elements\n if (Array.isArray(val)) {\n return val.map((item) => resolveValue(item, ctx))\n }\n return val\n}\n\n// --- Expression Node Types ---\n\nexport type ExprNode =\n | { $expr: 'literal'; value: any }\n | { $expr: 'ident'; name: string }\n | {\n $expr: 'member'\n object: ExprNode\n property: string\n computed?: boolean\n optional?: boolean\n }\n | { $expr: 'binary'; op: string; left: ExprNode; right: ExprNode }\n | { $expr: 'unary'; op: string; argument: ExprNode }\n | {\n $expr: 'logical'\n op: '&&' | '||' | '??'\n left: ExprNode\n right: ExprNode\n }\n | {\n $expr: 'conditional'\n test: ExprNode\n consequent: ExprNode\n alternate: ExprNode\n }\n | { $expr: 'array'; elements: ExprNode[] }\n | { $expr: 'object'; properties: { key: string; value: ExprNode }[] }\n | { $expr: 'call'; callee: string; arguments: ExprNode[] }\n | {\n $expr: 'methodCall'\n object: ExprNode\n method: string\n arguments: ExprNode[]\n optional?: boolean\n }\n\n// --- Built-in Objects (Proxy-based) ---\n\n/**\n * Create a proxy that provides helpful error messages for unsupported methods\n */\nfunction createBuiltinProxy(\n name: string,\n supported: Record<string, any>,\n alternatives?: Record<string, string>\n): any {\n return new Proxy(supported, {\n get(target, prop: string) {\n if (prop in target) {\n return target[prop]\n }\n const alt = alternatives?.[prop]\n if (alt) {\n throw new Error(`${name}.${prop} is not available. ${alt}`)\n }\n throw new Error(\n `${name}.${prop} is not supported in AsyncJS. Check docs for available ${name} methods.`\n )\n },\n })\n}\n\n/**\n * Convert an example-value schema (AsyncJS style) to JSON Schema.\n * Examples:\n * 'string' or 'hello' -> { type: 'string' }\n * 0 or 42 -> { type: 'number' }\n * true/false -> { type: 'boolean' }\n * ['string'] -> { type: 'array', items: { type: 'string' } }\n * { name: 'string', age: 0 } -> { type: 'object', properties: {...}, required: [...] }\n */\nfunction convertExampleToSchema(example: any): any {\n if (example === null) {\n return { type: 'null' }\n }\n\n if (example === undefined) {\n return {}\n }\n\n // Already a JSON Schema object (has 'type' property)\n if (\n typeof example === 'object' &&\n example !== null &&\n 'type' in example &&\n typeof example.type === 'string'\n ) {\n return example\n }\n\n // tosijs-schema builder object (has 'schema' property)\n if (\n typeof example === 'object' &&\n example !== null &&\n 'schema' in example &&\n typeof example.schema === 'object'\n ) {\n return example.schema\n }\n\n const type = typeof example\n\n if (type === 'string') {\n return { type: 'string' }\n }\n\n if (type === 'number') {\n return Number.isInteger(example) ? { type: 'integer' } : { type: 'number' }\n }\n\n if (type === 'boolean') {\n return { type: 'boolean' }\n }\n\n if (Array.isArray(example)) {\n if (example.length === 0) {\n return { type: 'array' }\n }\n // Use first element as item schema\n return {\n type: 'array',\n items: convertExampleToSchema(example[0]),\n }\n }\n\n if (type === 'object') {\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [key, value] of Object.entries(example)) {\n properties[key] = convertExampleToSchema(value)\n required.push(key)\n }\n\n return {\n type: 'object',\n properties,\n required,\n }\n }\n\n // Fallback - accept anything\n return {}\n}\n\n/**\n * Built-in objects available in expressions.\n * These are Proxy objects that provide JS-like APIs mapped to safe implementations.\n */\nexport const builtins: Record<string, any> = {\n // Math - most methods are safe pure functions\n Math: createBuiltinProxy('Math', {\n // Constants\n PI: Math.PI,\n E: Math.E,\n LN2: Math.LN2,\n LN10: Math.LN10,\n LOG2E: Math.LOG2E,\n LOG10E: Math.LOG10E,\n SQRT2: Math.SQRT2,\n SQRT1_2: Math.SQRT1_2,\n\n // Safe pure functions\n abs: Math.abs,\n ceil: Math.ceil,\n floor: Math.floor,\n round: Math.round,\n trunc: Math.trunc,\n sign: Math.sign,\n sqrt: Math.sqrt,\n cbrt: Math.cbrt,\n pow: Math.pow,\n exp: Math.exp,\n expm1: Math.expm1,\n log: Math.log,\n log2: Math.log2,\n log10: Math.log10,\n log1p: Math.log1p,\n sin: Math.sin,\n cos: Math.cos,\n tan: Math.tan,\n asin: Math.asin,\n acos: Math.acos,\n atan: Math.atan,\n atan2: Math.atan2,\n sinh: Math.sinh,\n cosh: Math.cosh,\n tanh: Math.tanh,\n asinh: Math.asinh,\n acosh: Math.acosh,\n atanh: Math.atanh,\n hypot: Math.hypot,\n min: Math.min,\n max: Math.max,\n clz32: Math.clz32,\n imul: Math.imul,\n fround: Math.fround,\n\n // Random - use crypto when available\n random: () => {\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const arr = new Uint32Array(1)\n crypto.getRandomValues(arr)\n return arr[0] / (0xffffffff + 1)\n }\n return Math.random()\n },\n }),\n\n // JSON - parse and stringify\n JSON: createBuiltinProxy('JSON', {\n parse: (text: string) => JSON.parse(text),\n stringify: (value: any, replacer?: any, space?: number) =>\n JSON.stringify(value, replacer, space),\n }),\n\n // console - maps to trace/logging\n console: createBuiltinProxy(\n 'console',\n {\n log: (..._args: any[]) => {\n // In expression context, we can't access trace easily\n // This is a no-op in expressions, but works in atom context\n // The transpiler should lift console.log to a trace atom call\n return undefined\n },\n warn: (..._args: any[]) => undefined,\n error: (..._args: any[]) => undefined,\n info: (..._args: any[]) => undefined,\n },\n {\n table: 'Use console.log with JSON.stringify for structured data.',\n dir: 'Use console.log instead.',\n trace: 'Stack traces are not available in AsyncJS.',\n }\n ),\n\n // Array static methods\n Array: createBuiltinProxy(\n 'Array',\n {\n isArray: (value: any) => Array.isArray(value),\n from: (iterable: any, mapFn?: any, thisArg?: any) =>\n Array.from(iterable, mapFn, thisArg),\n of: (...items: any[]) => Array.of(...items),\n },\n {\n prototype: 'Prototype access is not allowed.',\n }\n ),\n\n // Object static methods\n Object: createBuiltinProxy(\n 'Object',\n {\n keys: (obj: any) => Object.keys(obj),\n values: (obj: any) => Object.values(obj),\n entries: (obj: any) => Object.entries(obj),\n fromEntries: (entries: any) => Object.fromEntries(entries),\n assign: (target: any, ...sources: any[]) =>\n Object.assign({}, target, ...sources),\n hasOwn: (obj: any, prop: string) => Object.hasOwn(obj, prop),\n },\n {\n prototype: 'Prototype access is not allowed.',\n create: 'Use object literals instead.',\n defineProperty: 'Property descriptors are not supported.',\n getPrototypeOf: 'Prototype access is not allowed.',\n setPrototypeOf: 'Prototype modification is not allowed.',\n }\n ),\n\n // String static methods\n String: createBuiltinProxy('String', {\n fromCharCode: (...codes: number[]) => String.fromCharCode(...codes),\n fromCodePoint: (...codePoints: number[]) =>\n String.fromCodePoint(...codePoints),\n }),\n\n // Number static methods and constants\n Number: createBuiltinProxy('Number', {\n isNaN: Number.isNaN,\n isFinite: Number.isFinite,\n isInteger: Number.isInteger,\n isSafeInteger: Number.isSafeInteger,\n parseFloat: parseFloat,\n parseInt: parseInt,\n MAX_VALUE: Number.MAX_VALUE,\n MIN_VALUE: Number.MIN_VALUE,\n MAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER,\n MIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER,\n POSITIVE_INFINITY: Number.POSITIVE_INFINITY,\n NEGATIVE_INFINITY: Number.NEGATIVE_INFINITY,\n NaN: Number.NaN,\n EPSILON: Number.EPSILON,\n }),\n\n // Global functions\n parseInt: parseInt,\n parseFloat: parseFloat,\n isNaN: isNaN,\n isFinite: isFinite,\n encodeURI: encodeURI,\n decodeURI: decodeURI,\n encodeURIComponent: encodeURIComponent,\n decodeURIComponent: decodeURIComponent,\n\n // Constants\n undefined: undefined,\n null: null,\n NaN: NaN,\n Infinity: Infinity,\n\n // Schema-based filtering - strips extra properties, validates structure\n // Returns filtered data or throws on validation failure\n filter: (data: any, schema: any): any => {\n // Convert example-value schema to JSON Schema if needed\n const jsonSchema = convertExampleToSchema(schema)\n const result = schemaFilter(data, jsonSchema)\n if (result instanceof Error) {\n throw result\n }\n return result\n },\n\n // Schema builder - exposes tosijs-schema's fluent API for building JSON Schemas\n // Usage: Schema.object({ name: Schema.string, age: Schema.number.int.min(0) })\n // Usage: Schema.response('my_schema', Schema.object({ ... })) for LLM responseFormat\n Schema: {\n // Re-export all of tosijs-schema's `s` object\n ...s,\n\n // Convenience: wrap schema in OpenAI responseFormat structure\n // Accepts either a tosijs-schema builder or a plain example object\n response: (name: string, schemaOrExample: any) => {\n const jsonSchema =\n schemaOrExample?.schema != null\n ? schemaOrExample.schema\n : convertExampleToSchema(schemaOrExample)\n\n return {\n type: 'json_schema',\n json_schema: {\n name,\n strict: true,\n schema: jsonSchema,\n },\n }\n },\n\n // Convert example value to JSON Schema (for simple cases)\n fromExample: (example: any) => convertExampleToSchema(example),\n\n // Validation: returns boolean\n isValid: (data: any, schemaOrExample: any): boolean => {\n if (schemaOrExample?.schema != null) {\n return validate(data, schemaOrExample)\n }\n return validate(data, convertExampleToSchema(schemaOrExample))\n },\n },\n\n // Set factory - creates a set-like object backed by an array\n Set: (items: any[] = []) => {\n const data = [...new globalThis.Set(items)] // dedupe initial items\n return {\n // Mutable operations\n add(item: any) {\n if (!data.includes(item)) {\n data.push(item)\n }\n return this\n },\n remove(item: any) {\n const idx = data.indexOf(item)\n if (idx !== -1) {\n data.splice(idx, 1)\n }\n return this\n },\n clear() {\n data.length = 0\n return this\n },\n // Query operations\n has(item: any) {\n return data.includes(item)\n },\n get size() {\n return data.length\n },\n toArray() {\n return [...data]\n },\n // Set operations - return new sets\n union(other: any) {\n const otherItems = other?.toArray?.() ?? other ?? []\n return builtins.Set([...data, ...otherItems])\n },\n intersection(other: any) {\n const otherItems = other?.toArray?.() ?? other ?? []\n return builtins.Set(data.filter((x: any) => otherItems.includes(x)))\n },\n diff(other: any) {\n const otherItems = other?.toArray?.() ?? other ?? []\n return builtins.Set(data.filter((x: any) => !otherItems.includes(x)))\n },\n // Iteration\n forEach(fn: (item: any) => void) {\n data.forEach(fn)\n },\n map(fn: (item: any) => any) {\n return builtins.Set(data.map(fn))\n },\n filter(fn: (item: any) => boolean) {\n return builtins.Set(data.filter(fn))\n },\n // Serialization - Sets serialize to arrays\n toJSON() {\n return [...data]\n },\n }\n },\n\n // Date factory - creates a date-like object\n // Also supports Date.now() for compatibility\n Date: (() => {\n const createDate = (d: globalThis.Date): any => ({\n // Get the underlying value\n get value() {\n return d.toISOString()\n },\n get timestamp() {\n return d.getTime()\n },\n // Components\n get year() {\n return d.getFullYear()\n },\n get month() {\n return d.getMonth() + 1 // 1-indexed\n },\n get day() {\n return d.getDate()\n },\n get hours() {\n return d.getHours()\n },\n get minutes() {\n return d.getMinutes()\n },\n get seconds() {\n return d.getSeconds()\n },\n get dayOfWeek() {\n return d.getDay()\n },\n // Arithmetic - returns new Date\n add({\n years = 0,\n months = 0,\n days = 0,\n hours = 0,\n minutes = 0,\n seconds = 0,\n ms = 0,\n }: {\n years?: number\n months?: number\n days?: number\n hours?: number\n minutes?: number\n seconds?: number\n ms?: number\n } = {}) {\n const newDate = new globalThis.Date(d.getTime())\n if (years) newDate.setFullYear(newDate.getFullYear() + years)\n if (months) newDate.setMonth(newDate.getMonth() + months)\n if (days) newDate.setDate(newDate.getDate() + days)\n if (hours) newDate.setHours(newDate.getHours() + hours)\n if (minutes) newDate.setMinutes(newDate.getMinutes() + minutes)\n if (seconds) newDate.setSeconds(newDate.getSeconds() + seconds)\n if (ms) newDate.setMilliseconds(newDate.getMilliseconds() + ms)\n return createDate(newDate)\n },\n // Difference\n diff(\n other: any,\n unit: 'ms' | 'seconds' | 'minutes' | 'hours' | 'days' = 'ms'\n ) {\n const otherTime =\n typeof other === 'object' && other.timestamp\n ? other.timestamp\n : new globalThis.Date(other).getTime()\n const diffMs = d.getTime() - otherTime\n switch (unit) {\n case 'seconds':\n return diffMs / 1000\n case 'minutes':\n return diffMs / (1000 * 60)\n case 'hours':\n return diffMs / (1000 * 60 * 60)\n case 'days':\n return diffMs / (1000 * 60 * 60 * 24)\n default:\n return diffMs\n }\n },\n // Formatting\n format(fmt = 'ISO') {\n if (fmt === 'ISO') return d.toISOString()\n if (fmt === 'date') return d.toISOString().split('T')[0]\n if (fmt === 'time') return d.toISOString().split('T')[1].split('.')[0]\n // Simple format substitution\n return fmt\n .replace('YYYY', String(d.getFullYear()))\n .replace('MM', String(d.getMonth() + 1).padStart(2, '0'))\n .replace('DD', String(d.getDate()).padStart(2, '0'))\n .replace('HH', String(d.getHours()).padStart(2, '0'))\n .replace('mm', String(d.getMinutes()).padStart(2, '0'))\n .replace('ss', String(d.getSeconds()).padStart(2, '0'))\n },\n // Comparison\n isBefore(other: any) {\n const otherTime =\n typeof other === 'object' && other.timestamp\n ? other.timestamp\n : new globalThis.Date(other).getTime()\n return d.getTime() < otherTime\n },\n isAfter(other: any) {\n const otherTime =\n typeof other === 'object' && other.timestamp\n ? other.timestamp\n : new globalThis.Date(other).getTime()\n return d.getTime() > otherTime\n },\n // String representation\n toString() {\n return d.toISOString()\n },\n // Serialization - Dates serialize to ISO strings\n toJSON() {\n return d.toISOString()\n },\n })\n\n // The Date factory function\n const DateFactory = (init?: string | number) => {\n const date =\n init !== undefined ? new globalThis.Date(init) : new globalThis.Date()\n if (isNaN(date.getTime())) {\n throw new Error(`Invalid date: ${init}`)\n }\n return createDate(date)\n }\n\n // Static methods (for Date.now() compatibility)\n DateFactory.now = () => globalThis.Date.now()\n DateFactory.parse = (str: string) => createDate(new globalThis.Date(str))\n\n return DateFactory\n })(),\n}\n\n// Built-ins that are NOT available with helpful messages\nconst unsupportedBuiltins: Record<string, string> = {\n RegExp: 'RegExp is not available. Use string methods or the regexMatch atom.',\n Promise: 'Promise is not needed. All operations are implicitly async.',\n Map: 'Map is not available. Use plain objects instead.',\n WeakSet: 'WeakSet is not available.',\n WeakMap: 'WeakMap is not available.',\n Symbol: 'Symbol is not available.',\n Proxy: 'Proxy is not available.',\n Reflect: 'Reflect is not available.',\n Function: 'Function constructor is not available. Define functions normally.',\n eval: 'eval is not available. Code is compiled, not evaluated.',\n setTimeout: 'setTimeout is not available. Use the delay atom.',\n setInterval: 'setInterval is not available. Use while loops with delay.',\n fetch: 'fetch is not available. Use the httpFetch atom.',\n require: 'require is not available. Atoms must be registered with the VM.',\n import: 'import is not available. Atoms must be registered with the VM.',\n process: 'process is not available. AsyncJS runs in a sandboxed environment.',\n window: 'window is not available. AsyncJS runs in a sandboxed environment.',\n document:\n 'document is not available. AsyncJS runs in a sandboxed environment.',\n global: 'global is not available. AsyncJS runs in a sandboxed environment.',\n globalThis: 'globalThis is not available. Use builtins directly.',\n}\n\n/** Fuel cost per expression node evaluation */\nconst EXPR_FUEL_COST = 0.01\n\n/** Fuel cost per character for string operations (1 fuel per ~10KB) */\nconst STRING_FUEL_PER_CHAR = 0.0001\n\n/** Fuel cost per element for array allocation operations */\nconst ARRAY_FUEL_PER_ELEMENT = 0.001\n\n/** Methods that allocate new arrays/strings and need proportional charging */\nconst ALLOCATING_METHODS = new Set([\n // Array methods that create new arrays\n 'concat',\n 'slice',\n 'map',\n 'filter',\n 'flatMap',\n 'flat',\n 'toReversed',\n 'toSorted',\n 'toSpliced',\n // String methods that create new strings\n 'repeat',\n 'padStart',\n 'padEnd',\n 'split',\n 'join',\n 'replace',\n 'replaceAll',\n 'substring',\n 'substr',\n 'trim',\n 'trimStart',\n 'trimEnd',\n 'toLowerCase',\n 'toUpperCase',\n // Regex methods that allocate (match returns array, split/replace covered above)\n 'match',\n 'matchAll',\n // JSON parsing creates objects\n 'parse',\n 'stringify',\n])\n\n/**\n * Evaluates an expression node against the runtime context.\n * This replaces JSEP for new code - expressions are already parsed by Acorn.\n * Each node evaluation consumes a small amount of fuel to prevent runaway expressions.\n */\nexport function evaluateExpr(node: ExprNode, ctx: RuntimeContext): any {\n // Handle non-expression values (literals passed directly)\n if (node === null || node === undefined) {\n return node\n }\n if (typeof node !== 'object' || !('$expr' in node)) {\n // It's a literal value, not an expression node\n return node\n }\n\n // Consume fuel for each expression node evaluation\n if (ctx.fuel) {\n ctx.fuel.current -= EXPR_FUEL_COST\n if (ctx.fuel.current <= 0) {\n throw new Error('Out of Fuel')\n }\n }\n\n switch (node.$expr) {\n case 'literal':\n return node.value\n\n case 'ident': {\n // Look up in state first, then args, then builtins\n if (node.name in ctx.state) {\n return ctx.state[node.name]\n }\n if (node.name in ctx.args) {\n return ctx.args[node.name]\n }\n // Check builtins (Math, JSON, Array, etc.)\n if (node.name in builtins) {\n return builtins[node.name]\n }\n // Check for unsupported builtins and give helpful error\n if (node.name in unsupportedBuiltins) {\n throw new Error(unsupportedBuiltins[node.name])\n }\n return undefined\n }\n\n case 'member': {\n const obj = evaluateExpr(node.object, ctx)\n\n // Short-circuit for optional chaining\n if (node.optional && (obj === null || obj === undefined)) {\n return undefined\n }\n\n const prop = node.property\n assertSafeProperty(prop)\n\n return obj?.[prop]\n }\n\n case 'binary': {\n const left = evaluateExpr(node.left, ctx)\n const right = evaluateExpr(node.right, ctx)\n\n switch (node.op) {\n case '+': {\n const result = left + right\n // Charge fuel proportional to string length for concatenation\n if (typeof result === 'string' && ctx.fuel) {\n ctx.fuel.current -= result.length * STRING_FUEL_PER_CHAR\n if (ctx.fuel.current <= 0) {\n ctx.error = new AgentError('Out of Fuel', 'expr.concat')\n return undefined\n }\n }\n return result\n }\n case '-':\n return left - right\n case '*':\n return left * right\n case '/':\n return left / right\n case '%':\n return left % right\n case '**':\n return left ** right\n case '>':\n return left > right\n case '<':\n return left < right\n case '>=':\n return left >= right\n case '<=':\n return left <= right\n case '==':\n return isStructurallyEqual(left, right)\n case '!=':\n return !isStructurallyEqual(left, right)\n case '===':\n return left === right\n case '!==':\n return left !== right\n default:\n throw new Error(`Unknown binary operator: ${node.op}`)\n }\n }\n\n case 'unary': {\n const arg = evaluateExpr(node.argument, ctx)\n switch (node.op) {\n case '!':\n return !arg\n case '-':\n return -arg\n case '+':\n return +arg\n case 'typeof':\n return typeof arg\n default:\n throw new Error(`Unknown unary operator: ${node.op}`)\n }\n }\n\n case 'logical': {\n // Short-circuit evaluation\n const left = evaluateExpr(node.left, ctx)\n if (node.op === '&&') {\n return left ? evaluateExpr(node.right, ctx) : left\n } else if (node.op === '??') {\n // Nullish coalescing: only use right if left is null/undefined\n return left ?? evaluateExpr(node.right, ctx)\n } else {\n // || operator\n return left ? left : evaluateExpr(node.right, ctx)\n }\n }\n\n case 'conditional': {\n const test = evaluateExpr(node.test, ctx)\n return test\n ? evaluateExpr(node.consequent, ctx)\n : evaluateExpr(node.alternate, ctx)\n }\n\n case 'array':\n return node.elements.map((el) => evaluateExpr(el, ctx))\n\n case 'object': {\n const result: Record<string, any> = {}\n for (const prop of node.properties) {\n result[prop.key] = evaluateExpr(prop.value, ctx)\n }\n return result\n }\n\n case 'call': {\n // Special case: Error() triggers monadic error flow\n if (node.callee === 'Error') {\n const args = node.arguments.map((arg) => evaluateExpr(arg, ctx))\n const message = typeof args[0] === 'string' ? args[0] : 'Error'\n ctx.error = new AgentError(message, 'Error')\n return undefined // Error triggered, subsequent operations will be skipped\n }\n\n // Check if this is a builtin global function (parseInt, parseFloat, etc.)\n if (node.callee in builtins) {\n const fn = builtins[node.callee]\n if (typeof fn === 'function') {\n const args = node.arguments.map((arg) => evaluateExpr(arg, ctx))\n return fn(...args)\n }\n }\n // For atom calls within expressions\n const atom = ctx.resolver(node.callee)\n if (!atom) {\n // Check unsupported builtins\n if (node.callee in unsupportedBuiltins) {\n throw new Error(unsupportedBuiltins[node.callee])\n }\n throw new Error(`Unknown function: ${node.callee}`)\n }\n // This is synchronous evaluation - atom calls need special handling\n // For now, throw - atom calls should be lifted to statements\n throw new Error(\n `Atom calls in expressions not yet supported: ${node.callee}`\n )\n }\n\n case 'methodCall': {\n // Method call on an object (e.g., Math.floor(x), arr.length, str.toUpperCase())\n const obj = evaluateExpr(node.object, ctx)\n\n // Short-circuit for optional chaining\n if (node.optional && (obj === null || obj === undefined)) {\n return undefined\n }\n\n const method = node.method\n assertSafeProperty(method)\n\n if (obj === null || obj === undefined) {\n throw new Error(`Cannot call method '${method}' on ${obj}`)\n }\n\n const fn = obj[method]\n if (typeof fn !== 'function') {\n throw new Error(`'${method}' is not a function`)\n }\n\n const args = node.arguments.map((arg) => evaluateExpr(arg, ctx))\n const result = fn.apply(obj, args)\n\n // Charge fuel for allocating operations based on result size\n if (ctx.fuel && ALLOCATING_METHODS.has(method)) {\n let fuelCost = 0\n if (typeof result === 'string') {\n fuelCost = result.length * STRING_FUEL_PER_CHAR\n } else if (Array.isArray(result)) {\n fuelCost = result.length * ARRAY_FUEL_PER_ELEMENT\n } else if (typeof result === 'object' && result !== null) {\n // For JSON.parse and similar, estimate based on key count\n // This is a rough estimate but catches large objects\n const keys = Object.keys(result)\n fuelCost = keys.length * ARRAY_FUEL_PER_ELEMENT\n }\n ctx.fuel.current -= fuelCost\n if (ctx.fuel.current <= 0) {\n ctx.error = new AgentError('Out of Fuel', `expr.${method}`)\n return undefined\n }\n }\n\n return result\n }\n\n default:\n throw new Error(`Unknown expression type: ${(node as any).$expr}`)\n }\n}\n\n// --- Atom Factory ---\n\nexport function defineAtom<I extends Record<string, any>, O = any>(\n op: string,\n inputSchema: any, // s.Schema<I>\n outputSchema: any | undefined, // s.Schema<O>\n fn: (input: I, ctx: RuntimeContext) => Promise<O>,\n options: AtomOptions | string = {}\n): Atom<I, O> {\n const {\n docs = '',\n timeoutMs = 1000,\n cost = 1,\n } = typeof options === 'string' ? { docs: options } : options\n\n const exec: AtomExec = async (step: any, ctx: RuntimeContext) => {\n const { op: _op, result: _res, ...inputData } = step\n\n // Skip if already in error state (monadic flow)\n if (ctx.error) return\n\n // --- Tracing Start ---\n const stateBefore = ctx.trace ? { ...ctx.state } : null\n const fuelBefore = ctx.fuel.current\n let result: any\n let error: string | undefined\n\n try {\n // 2. Deduct Fuel (check for cost overrides first)\n const overrideCost = ctx.costOverrides?.[op]\n const baseCost = overrideCost !== undefined ? overrideCost : cost\n const currentCost =\n typeof baseCost === 'function' ? baseCost(inputData, ctx) : baseCost\n if ((ctx.fuel.current -= currentCost) <= 0) {\n ctx.error = new AgentError('Out of Fuel', op)\n return\n }\n\n // 3. Execution with Timeout\n let timer: any\n const execute = async () => fn(step as I, ctx)\n\n result =\n timeoutMs > 0\n ? await Promise.race([\n execute(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Atom '${op}' timed out`)),\n timeoutMs\n )\n }),\n ]).finally(() => clearTimeout(timer))\n : await execute()\n\n // 4. Result - always set if step.result is specified (even for undefined values)\n if (step.result) {\n if (ctx.consts.has(step.result)) {\n throw new Error(`Cannot reassign const variable '${step.result}'`)\n }\n // Validate output against schema (skip for undefined results)\n if (\n result !== undefined &&\n outputSchema &&\n !validate(result, outputSchema)\n ) {\n ctx.error = new AgentError(`Output validation failed for '${op}'`, op)\n return\n }\n ctx.state[step.result] = result\n // Mark as const if resultConst is set\n if (step.resultConst) {\n ctx.consts.add(step.result)\n }\n }\n } catch (e: any) {\n error = e.message || String(e)\n // Convert exception to monadic error\n ctx.error = new AgentError(error!, op, e)\n } finally {\n // --- Tracing End ---\n if (ctx.trace && stateBefore) {\n const stateDiff = diffObjects(stateBefore, ctx.state)\n ctx.trace.push({\n op,\n input: inputData,\n stateDiff,\n result,\n error,\n fuelBefore,\n fuelAfter: ctx.fuel.current,\n timestamp: new Date().toISOString(),\n })\n }\n }\n }\n\n return {\n op,\n inputSchema,\n outputSchema,\n exec,\n docs,\n timeoutMs,\n cost,\n create: (input: I) => ({ op, ...input }),\n }\n}\n\n// --- Core Atoms ---\n\n// 1. Flow (Low cost: 0.1)\n\n/*#\n## seq (Sequence)\n\nThe root atom for all agent programs. Executes steps in order.\n\n- Stops on `return` (when `ctx.output` is set)\n- Stops on error (monadic error flow)\n- Cost: 0.1\n\n```javascript\n// AsyncJS compiles to seq at the top level\nconst x = 1\nconst y = 2\nreturn { sum: x + y }\n```\n*/\nexport const seq = defineAtom(\n 'seq',\n s.object({ steps: s.array(s.any) }),\n undefined,\n async ({ steps }, ctx) => {\n for (const step of steps) {\n if (ctx.output !== undefined) return // Return check\n if (ctx.error) return // Monadic error - skip remaining steps\n const atom = ctx.resolver(step.op)\n if (!atom) throw new Error(`Unknown Atom: ${step.op}`)\n await atom.exec(step, ctx)\n }\n },\n { docs: 'Sequence', timeoutMs: 0, cost: 0.1 }\n)\n\n/*#\n## if (Conditional)\n\nConditional branching based on expression evaluation.\n\n```javascript\nif (count > 0) {\n console.log(\"Has items\")\n} else {\n console.log(\"Empty\")\n}\n```\n*/\nexport const iff = defineAtom(\n 'if',\n s.object({\n condition: s.any, // ExprNode\n then: s.array(s.any),\n else: s.array(s.any).optional,\n }),\n undefined,\n async (step, ctx) => {\n if (evaluateExpr(step.condition, ctx)) {\n await seq.exec({ op: 'seq', steps: step.then } as any, ctx)\n } else if (step.else) {\n await seq.exec({ op: 'seq', steps: step.else } as any, ctx)\n }\n },\n { docs: 'If/Else', timeoutMs: 0, cost: 0.1 }\n)\n\n/*#\n## while (Loop)\n\nRepeats body while condition is truthy. Consumes fuel each iteration.\n\n```javascript\nlet i = 0\nwhile (i < 10) {\n console.log(i)\n i = i + 1\n}\n```\n\n**Note:** No `break`/`continue`. Use condition variables instead.\n*/\nexport const whileLoop = defineAtom(\n 'while',\n s.object({\n condition: s.any, // ExprNode\n body: s.array(s.any),\n }),\n undefined,\n async (step, ctx) => {\n while (evaluateExpr(step.condition, ctx)) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n if ((ctx.fuel.current -= 0.1) <= 0) throw new Error('Out of Fuel')\n await seq.exec({ op: 'seq', steps: step.body } as any, ctx)\n if (ctx.output !== undefined) return\n }\n },\n { docs: 'While Loop', timeoutMs: 0, cost: 0.1 }\n)\n\n/*#\n## return\n\nEnds execution and returns values from state. The schema defines which\nstate variables to include in the output.\n\n```javascript\nconst result = compute()\nreturn { result } // Returns { result: <computed value> }\n```\n*/\nexport const ret = defineAtom(\n 'return',\n undefined,\n s.any,\n async (step: any, ctx) => {\n // If in error state, propagate the error as the output\n if (ctx.error) {\n ctx.output = ctx.error\n return ctx.error\n }\n\n // New style: return has explicit value\n if ('value' in step) {\n const res = resolveValue(step.value, ctx)\n\n // Enforce object returns \u2014 agents must return objects for composability\n if (\n res !== undefined &&\n res !== null &&\n !isAgentError(res) &&\n (typeof res !== 'object' || Array.isArray(res))\n ) {\n const err = new AgentError(\n `Agent must return an object, got ${\n Array.isArray(res) ? 'array' : typeof res\n }`,\n 'return'\n )\n ctx.error = err\n ctx.output = err\n return err\n }\n\n ctx.output = res\n return res\n }\n\n // Legacy style: extract from state based on schema keys\n let res: any = {}\n if (step.schema?.properties) {\n for (const key of Object.keys(step.schema.properties)) {\n res[key] = ctx.state[key]\n }\n\n // If schema has nested structure, filter to strip extra properties\n // This makes return types act as projections\n if (step.filter !== false) {\n const filterResult = schemaFilter(res, step.schema)\n if (!(filterResult instanceof Error)) {\n res = filterResult\n }\n // If filter fails, keep original result (validation already passed above)\n }\n }\n ctx.output = res\n return res\n },\n { docs: 'Return', cost: 0.1 }\n)\n\n/*#\n## try/catch\n\nError handling with monadic error flow. When an error occurs, subsequent\nsteps are skipped until caught.\n\n```javascript\ntry {\n const data = fetch(url)\n processData(data)\n} catch (err) {\n console.warn(\"Failed: \" + err)\n return { error: err }\n}\n```\n\nThe catch block receives:\n- `err` (or custom name): error message\n- `errorOp`: the atom that failed\n*/\nexport const tryCatch = defineAtom(\n 'try',\n s.object({\n try: s.array(s.any),\n catch: s.array(s.any).optional,\n catchParam: s.string.optional,\n }),\n undefined,\n async (step, ctx) => {\n // Execute try block\n await seq.exec({ op: 'seq', steps: step.try } as any, ctx)\n\n // If an error occurred and we have a catch block, handle it\n if (ctx.error && step.catch) {\n // Store error message in state for catch block to access\n // Use the catch parameter name if provided, otherwise 'error'\n const paramName = step.catchParam || 'error'\n ctx.state[paramName] = ctx.error.message\n ctx.state['errorOp'] = ctx.error.op\n // Clear the error - catch block handles it\n ctx.error = undefined\n // Execute catch block\n await seq.exec({ op: 'seq', steps: step.catch } as any, ctx)\n // If catch block didn't set a new error, we're recovered\n // If it did, that error propagates\n }\n },\n { docs: 'Try/Catch', timeoutMs: 0, cost: 0.1 }\n)\n\nexport const errorAtom = defineAtom(\n 'Error',\n s.object({ args: s.array(s.any).optional }),\n undefined,\n async (step, ctx) => {\n const message = step.args?.[0] ?? 'Error'\n ctx.error = new AgentError(String(message), 'Error')\n },\n { docs: 'Trigger error flow', cost: 0.1 }\n)\n\n// 2. State (Low cost: 0.1)\nexport const varSet = defineAtom(\n 'varSet',\n s.object({ key: s.string, value: s.any }),\n undefined,\n async ({ key, value }, ctx) => {\n if (ctx.consts.has(key)) {\n throw new Error(`Cannot reassign const variable '${key}'`)\n }\n ctx.state[key] = resolveValue(value, ctx)\n },\n { docs: 'Set Variable', cost: 0.1 }\n)\n\nexport const constSet = defineAtom(\n 'constSet',\n s.object({ key: s.string, value: s.any }),\n undefined,\n async ({ key, value }, ctx) => {\n if (ctx.consts.has(key)) {\n throw new Error(`Cannot reassign const variable '${key}'`)\n }\n if (key in ctx.state) {\n throw new Error(`Cannot redeclare variable '${key}' as const`)\n }\n ctx.state[key] = resolveValue(value, ctx)\n ctx.consts.add(key)\n },\n { docs: 'Set Const Variable (immutable)', cost: 0.1 }\n)\n\nexport const varGet = defineAtom(\n 'varGet',\n s.object({ key: s.string }),\n s.any,\n async ({ key }, ctx) => {\n return resolveValue(key, ctx)\n },\n { docs: 'Get Variable', cost: 0.1 }\n)\n\nexport const varsImport = defineAtom(\n 'varsImport',\n s.object({\n keys: s.union([s.array(s.string), s.record(s.string)]),\n }),\n undefined,\n async ({ keys }, ctx) => {\n if (Array.isArray(keys)) {\n for (const key of keys) {\n ctx.state[key] = resolveValue({ $kind: 'arg', path: key }, ctx)\n }\n } else {\n for (const [alias, path] of Object.entries(keys)) {\n ctx.state[alias] = resolveValue({ $kind: 'arg', path: path }, ctx)\n }\n }\n },\n {\n docs: 'Import variables from args into the current scope, with optional renaming.',\n cost: 0.2,\n }\n)\n\nexport const varsLet = defineAtom(\n 'varsLet',\n s.record(s.any),\n undefined,\n async (step, ctx) => {\n for (const key of Object.keys(step)) {\n if (key === 'op' || key === 'result') continue\n ctx.state[key] = resolveValue(step[key], ctx)\n }\n },\n {\n docs: 'Initialize a set of variables in the current scope from the step object properties.',\n cost: 0.1,\n }\n)\n\nexport const varsExport = defineAtom(\n 'varsExport',\n s.object({\n keys: s.union([s.array(s.string), s.record(s.string)]),\n }),\n s.record(s.any),\n async ({ keys }, ctx) => {\n const result: Record<string, any> = {}\n if (Array.isArray(keys)) {\n for (const key of keys) {\n result[key] = resolveValue(key, ctx)\n }\n } else {\n for (const [alias, path] of Object.entries(keys)) {\n result[alias] = resolveValue(path, ctx)\n }\n }\n return result\n },\n {\n docs: 'Export variables from the current scope, with optional renaming.',\n cost: 0.2,\n }\n)\n\nexport const scope = defineAtom(\n 'scope',\n s.object({ steps: s.array(s.any) }),\n undefined,\n async ({ steps }, ctx) => {\n const scopedCtx = createChildScope(ctx)\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n // Propagate output/return up\n if (scopedCtx.output !== undefined) ctx.output = scopedCtx.output\n },\n { docs: 'Create new scope', timeoutMs: 0, cost: 0.1 }\n)\n\n// 3. List (Cost 1)\n\n/*#\n## for...of / map\n\nTransforms each item in an array. The `result` variable in each iteration\nbecomes the new item value.\n\n```javascript\nconst doubled = items.map(x => x * 2)\n\n// Or with for...of:\nconst results = []\nfor (const item of items) {\n results.push(process(item))\n}\n```\n*/\nexport const map = defineAtom(\n 'map',\n s.object({ items: s.array(s.any), as: s.string, steps: s.array(s.any) }),\n s.array(s.any),\n async ({ items, as, steps }, ctx) => {\n const results = []\n const resolvedItems = resolveValue(items, ctx)\n if (!Array.isArray(resolvedItems))\n throw new Error('map: items is not an array')\n for (const item of resolvedItems) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n const scopedCtx = createChildScope(ctx)\n scopedCtx.state[as] = item\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n results.push(scopedCtx.state['result'] ?? null)\n }\n return results\n },\n { docs: 'Map Array', timeoutMs: 0, cost: 1 }\n)\n\n/*#\n## filter\n\nKeeps items that match a condition.\n\n```javascript\nconst adults = users.filter(u => u.age >= 18)\n```\n*/\nexport const filter = defineAtom(\n 'filter',\n s.object({\n items: s.array(s.any),\n as: s.string,\n condition: s.any, // ExprNode that evaluates to boolean\n }),\n s.array(s.any),\n async ({ items, as, condition }, ctx) => {\n const results = []\n const resolvedItems = resolveValue(items, ctx)\n if (!Array.isArray(resolvedItems))\n throw new Error('filter: items is not an array')\n for (const item of resolvedItems) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n const scopedCtx = createChildScope(ctx)\n scopedCtx.state[as] = item\n const passes = evaluateExpr(condition, scopedCtx)\n if (passes) {\n results.push(item)\n }\n }\n return results\n },\n { docs: 'Filter Array', timeoutMs: 0, cost: 1 }\n)\n\n/*#\n## reduce\n\nAccumulates a single value from an array.\n\n```javascript\nconst sum = numbers.reduce((acc, n) => acc + n, 0)\n```\n*/\nexport const reduce = defineAtom(\n 'reduce',\n s.object({\n items: s.array(s.any),\n as: s.string,\n accumulator: s.string,\n initial: s.any,\n steps: s.array(s.any),\n }),\n s.any,\n async ({ items, as, accumulator, initial, steps }, ctx) => {\n const resolvedItems = resolveValue(items, ctx)\n const resolvedInitial = resolveValue(initial, ctx)\n if (!Array.isArray(resolvedItems))\n throw new Error('reduce: items is not an array')\n\n let acc = resolvedInitial\n for (const item of resolvedItems) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n const scopedCtx = createChildScope(ctx)\n scopedCtx.state[as] = item\n scopedCtx.state[accumulator] = acc\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n acc = scopedCtx.state['result'] ?? acc\n }\n return acc\n },\n { docs: 'Reduce Array', timeoutMs: 0, cost: 1 }\n)\n\n/*#\n## find\n\nReturns first item matching condition, or null.\n\n```javascript\nconst admin = users.find(u => u.role === \"admin\")\n```\n*/\nexport const find = defineAtom(\n 'find',\n s.object({\n items: s.array(s.any),\n as: s.string,\n condition: s.any, // ExprNode that evaluates to boolean\n }),\n s.any,\n async ({ items, as, condition }, ctx) => {\n const resolvedItems = resolveValue(items, ctx)\n if (!Array.isArray(resolvedItems))\n throw new Error('find: items is not an array')\n for (const item of resolvedItems) {\n // Check abort signal for clean cancellation\n if (ctx.signal?.aborted) throw new Error('Execution aborted')\n const scopedCtx = createChildScope(ctx)\n scopedCtx.state[as] = item\n const matches = evaluateExpr(condition, scopedCtx)\n if (matches) {\n return item\n }\n }\n return null\n },\n { docs: 'Find in Array', timeoutMs: 0, cost: 1 }\n)\n\nexport const push = defineAtom(\n 'push',\n s.object({ list: s.array(s.any), item: s.any }),\n s.array(s.any),\n async ({ list, item }, ctx) => {\n const resolvedList = resolveValue(list, ctx)\n const resolvedItem = resolveValue(item, ctx)\n if (Array.isArray(resolvedList)) resolvedList.push(resolvedItem)\n return resolvedList\n },\n { docs: 'Push to Array', cost: 1 }\n)\n\nexport const len = defineAtom(\n 'len',\n s.object({ list: s.any }),\n s.number,\n async ({ list }, ctx) => {\n const val = resolveValue(list, ctx)\n return Array.isArray(val) || typeof val === 'string' ? val.length : 0\n },\n { docs: 'Length', cost: 1 }\n)\n\n// 6. String (Cost 1)\nexport const split = defineAtom(\n 'split',\n s.object({ str: s.string, sep: s.string }),\n s.array(s.string),\n async ({ str, sep }, ctx) =>\n resolveValue(str, ctx).split(resolveValue(sep, ctx)),\n { docs: 'Split String', cost: 1 }\n)\nexport const join = defineAtom(\n 'join',\n s.object({ list: s.array(s.string), sep: s.string }),\n s.string,\n async ({ list, sep }, ctx) =>\n resolveValue(list, ctx).join(resolveValue(sep, ctx)),\n { docs: 'Join String', cost: 1 }\n)\nexport const template = defineAtom(\n 'template',\n s.object({ tmpl: s.string, vars: s.record(s.any) }),\n s.string,\n async ({ tmpl, vars }: { tmpl: string; vars: Record<string, any> }, ctx) => {\n const resolvedTmpl = resolveValue(tmpl, ctx)\n return resolvedTmpl.replace(/\\{\\{(\\w+)\\}\\}/g, (_: string, key: string) =>\n String(resolveValue(vars[key], ctx) ?? '')\n )\n },\n { docs: 'String Template', cost: 1 }\n)\n\nexport const regexMatch = defineAtom(\n 'regexMatch',\n s.object({\n pattern: s.string,\n value: s.any,\n }),\n s.boolean,\n async ({ pattern, value }, ctx: RuntimeContext) => {\n // ReDoS protection: reject patterns likely to cause catastrophic backtracking\n if (isSuspiciousRegex(pattern)) {\n throw new Error(\n `Suspicious regex pattern rejected (potential ReDoS): ${pattern}`\n )\n }\n const resolvedValue = resolveValue(value, ctx)\n const p = new RegExp(pattern)\n return p.test(resolvedValue)\n },\n {\n docs: 'Returns true if the value matches the regex pattern.',\n cost: 2,\n }\n)\n\n// 7. Object (Cost 1)\nexport const pick = defineAtom(\n 'pick',\n s.object({ obj: s.record(s.any), keys: s.array(s.string) }),\n s.record(s.any),\n async ({ obj, keys }: { obj: Record<string, any>; keys: string[] }, ctx) => {\n const resolvedObj = resolveValue(obj, ctx)\n const resolvedKeys = resolveValue(keys, ctx)\n const res: any = {}\n if (resolvedObj && Array.isArray(resolvedKeys)) {\n resolvedKeys.forEach((k: string) => (res[k] = resolvedObj[k]))\n }\n return res\n },\n { docs: 'Pick Keys', cost: 1 }\n)\n\nexport const omit = defineAtom(\n 'omit',\n s.object({ obj: s.record(s.any), keys: s.array(s.string) }),\n s.record(s.any),\n async ({ obj, keys }: { obj: Record<string, any>; keys: string[] }, ctx) => {\n const resolvedObj = resolveValue(obj, ctx)\n const resolvedKeys = new Set(resolveValue(keys, ctx))\n const res: any = {}\n if (resolvedObj) {\n Object.keys(resolvedObj).forEach((k) => {\n if (!resolvedKeys.has(k)) res[k] = resolvedObj[k]\n })\n }\n return res\n },\n { docs: 'Omit Keys', cost: 1 }\n)\n\nexport const merge = defineAtom(\n 'merge',\n s.object({ a: s.record(s.any), b: s.record(s.any) }),\n s.record(s.any),\n async ({ a, b }, ctx) => ({\n ...resolveValue(a, ctx),\n ...resolveValue(b, ctx),\n }),\n { docs: 'Merge Objects', cost: 1 }\n)\nexport const keys = defineAtom(\n 'keys',\n s.object({ obj: s.record(s.any) }),\n s.array(s.string),\n async ({ obj }, ctx) => Object.keys(resolveValue(obj, ctx) ?? {}),\n { docs: 'Object Keys', cost: 1 }\n)\n\n// 8. IO (Cost 5)\n\n/*#\n## fetch\n\nHTTP requests. Requires `fetch` capability or uses global fetch with SSRF protection.\n\n```javascript\nconst data = fetch(\"https://api.example.com/data\")\nconst posted = fetch(\"https://api.example.com/items\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: { name: \"New Item\" }\n})\n```\n\nResponse types: `\"json\"` (default for JSON content-type), `\"text\"`, `\"dataUrl\"` (for images)\n\nSecurity:\n- Requires `ctx.context.allowedFetchDomains` allowlist OR restricts to localhost\n- Automatically adds `X-Agent-Depth` header to prevent recursive agent loops\n- Custom fetch capability can override all restrictions\n*/\n\n/** Maximum agent request depth to prevent recursive loops */\nconst MAX_AGENT_DEPTH = 10\n\n/** Header name for tracking agent request depth */\nconst AGENT_DEPTH_HEADER = 'X-Agent-Depth'\n\n/**\n * Check if a URL's domain is in the allowlist.\n * Supports exact matches and wildcard subdomains (*.example.com)\n */\nfunction isDomainAllowed(urlString: string, allowedDomains: string[]): boolean {\n try {\n const url = new URL(urlString)\n const host = url.hostname.toLowerCase()\n\n for (const pattern of allowedDomains) {\n const p = pattern.toLowerCase()\n if (p.startsWith('*.')) {\n // Wildcard: *.example.com matches sub.example.com and example.com\n const suffix = p.slice(1) // .example.com\n if (host.endsWith(suffix) || host === p.slice(2)) {\n return true\n }\n } else if (host === p) {\n return true\n }\n }\n return false\n } catch {\n return false\n }\n}\n\nexport const fetch = defineAtom(\n 'httpFetch',\n s.object({\n url: s.string,\n method: s.string.optional,\n headers: s.record(s.string).optional,\n body: s.any.optional,\n responseType: s.string.optional, // 'json' | 'text' | 'dataUrl'\n }),\n s.any,\n async (step, ctx) => {\n const url = resolveValue(step.url, ctx)\n const method = resolveValue(step.method, ctx)\n const headers = resolveValue(step.headers, ctx) || {}\n const body = resolveValue(step.body, ctx)\n const responseType = resolveValue(step.responseType, ctx)\n\n // Get current depth from context (set by receiving endpoint)\n const currentDepth: number = ctx.context?.requestDepth ?? 0\n\n // Check depth limit\n if (currentDepth >= MAX_AGENT_DEPTH) {\n throw new Error(\n `Agent request depth exceeded (max ${MAX_AGENT_DEPTH}). This prevents recursive agent loops.`\n )\n }\n\n if (ctx.capabilities.fetch) {\n // Custom fetch capability handles its own validation\n // Pass depth info so it can add the header\n return ctx.capabilities.fetch(url, {\n method,\n headers: {\n ...headers,\n [AGENT_DEPTH_HEADER]: String(currentDepth + 1),\n },\n body,\n signal: ctx.signal,\n responseType,\n })\n }\n\n // Check allowlist - if configured, it controls what's allowed\n const allowedDomains: string[] | undefined =\n ctx.context?.allowedFetchDomains\n if (allowedDomains) {\n // Allowlist mode: only allow domains in the list\n if (!isDomainAllowed(url, allowedDomains)) {\n throw new Error(\n `Fetch blocked: domain not in allowlist. Allowed: ${allowedDomains.join(\n ', '\n )}`\n )\n }\n // Domain is in allowlist - skip SSRF check (allowlist takes precedence)\n } else {\n // No allowlist configured - use SSRF protection + localhost-only\n if (isBlockedUrl(url)) {\n throw new Error(\n `Blocked URL: private/internal addresses not allowed in default fetch`\n )\n }\n\n // Additionally restrict to localhost when no allowlist\n try {\n const parsed = new URL(url)\n const host = parsed.hostname.toLowerCase()\n if (host !== 'localhost' && host !== '127.0.0.1' && host !== '[::1]') {\n throw new Error(\n `Fetch blocked: no allowedFetchDomains configured. ` +\n `Set ctx.context.allowedFetchDomains or provide a custom fetch capability.`\n )\n }\n } catch (e: any) {\n if (e.message.includes('allowedFetchDomains')) throw e\n throw new Error(`Invalid URL: ${url}`)\n }\n }\n\n // Default: global fetch with abort signal and depth header\n if (typeof globalThis.fetch === 'function') {\n const res = await globalThis.fetch(url, {\n method,\n headers: {\n ...headers,\n [AGENT_DEPTH_HEADER]: String(currentDepth + 1),\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: ctx.signal, // Pass abort signal for cancellation\n })\n\n // Handle dataUrl response type - converts binary to data URI\n if (responseType === 'dataUrl') {\n const buffer = await res.arrayBuffer()\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 const base64 = btoa(binary)\n const contentType =\n res.headers.get('content-type') || 'application/octet-stream'\n return `data:${contentType};base64,${base64}`\n }\n\n // Try to parse JSON if content-type says so, else text\n const contentType = res.headers.get('content-type')\n if (\n responseType === 'json' ||\n (contentType && contentType.includes('application/json'))\n ) {\n return res.json()\n }\n return res.text()\n }\n throw new Error(\"Capability 'fetch' missing and no global fetch available\")\n },\n { docs: 'HTTP Fetch', timeoutMs: 30000, cost: 5 }\n)\n\n// 9. Store\n\n/*#\n## storeGet / storeSet\n\nPersistent key-value storage. Requires `store` capability.\n\n```javascript\n// Save data\nstoreSet(\"user:123\", { name: \"Alice\", prefs: {} })\n\n// Retrieve later\nconst user = storeGet(\"user:123\")\n```\n\n**Warning:** Default in-memory store is not suitable for production.\n*/\nexport const storeGet = defineAtom(\n 'storeGet',\n s.object({ key: s.string }),\n s.any,\n async ({ key }, ctx) => {\n const k = resolveValue(key, ctx)\n return ctx.capabilities.store?.get(k)\n },\n { docs: 'Store Get', cost: 5 }\n)\n\nexport const storeSet = defineAtom(\n 'storeSet',\n s.object({ key: s.string, value: s.any }),\n undefined,\n async ({ key, value }, ctx) => {\n const k = resolveValue(key, ctx)\n const v = resolveValue(value, ctx)\n return ctx.capabilities.store?.set(k, v)\n },\n { docs: 'Store Set', cost: 5 }\n)\n\nexport const storeQuery = defineAtom(\n 'storeQuery',\n s.object({ query: s.any }),\n s.array(s.any),\n async ({ query }, ctx) =>\n ctx.capabilities.store?.query?.(resolveValue(query, ctx)) ?? [],\n { docs: 'Store Query', cost: 5 }\n)\nexport const vectorSearch = defineAtom(\n 'storeVectorSearch',\n s.object({\n collection: s.string.optional,\n vector: s.array(s.number),\n k: s.number.optional,\n }),\n s.array(s.any),\n async ({ collection, vector, k }, ctx) =>\n ctx.capabilities.store?.vectorSearch?.(\n resolveValue(collection, ctx),\n resolveValue(vector, ctx),\n resolveValue(k, ctx)\n ) ?? [],\n {\n docs: 'Vector Search',\n cost: (input, ctx) => 5 + (resolveValue(input.k, ctx) ?? 5),\n }\n)\n\n// 10. LLM\n\n/*#\n## llmPredict\n\nCall language model. Requires `llm` capability with `predict` method.\n\n```javascript\nconst response = llmPredict(\"Summarize this: \" + text)\n\n// With options\nconst structured = llmPredict(prompt, {\n model: \"gpt-4\",\n temperature: 0.7,\n responseFormat: { type: \"json_object\" }\n})\n```\n*/\nexport const llmPredict = defineAtom(\n 'llmPredict',\n s.object({ prompt: s.string, options: s.any.optional }),\n s.string,\n async ({ prompt, options }, ctx) => {\n if (!ctx.capabilities.llm?.predict)\n throw new Error(\"Capability 'llm.predict' missing\")\n return ctx.capabilities.llm.predict(\n resolveValue(prompt, ctx),\n resolveValue(options, ctx)\n )\n },\n { docs: 'LLM Predict', timeoutMs: 120000, cost: 100 }\n)\n\nexport const agentRun = defineAtom(\n 'agentRun',\n s.object({ agentId: s.any, input: s.any }), // agentId can be string token or AST object\n s.any,\n async ({ agentId, input }, ctx) => {\n const resolvedId = resolveValue(agentId, ctx)\n const rawInput = resolveValue(input, ctx)\n\n let resolvedInput = rawInput\n if (rawInput && typeof rawInput === 'object' && !Array.isArray(rawInput)) {\n resolvedInput = {}\n for (const k in rawInput) {\n resolvedInput[k] = resolveValue(rawInput[k], ctx)\n }\n }\n\n // Check if this is a procedure token\n if (isProcedureToken(resolvedId)) {\n // Resolve the token to AST and execute directly\n const ast = resolveProcedureToken(resolvedId)\n\n // Execute the AST using the seq atom (recursive execution)\n // Create a child context with the input as args\n const childCtx: RuntimeContext = {\n ...ctx,\n args: resolvedInput,\n state: {},\n consts: new Set(),\n output: undefined,\n error: undefined,\n }\n\n const seqAtom = ctx.resolver('seq')\n if (!seqAtom) throw new Error('seq atom not found')\n await seqAtom.exec(ast, childCtx)\n\n if (childCtx.error) {\n throw new Error(childCtx.error.message || 'Sub-agent failed')\n }\n\n return childCtx.output\n }\n\n // Check if resolvedId is an AST object (has 'op' property)\n if (resolvedId && typeof resolvedId === 'object' && 'op' in resolvedId) {\n // Execute the AST directly\n const childCtx: RuntimeContext = {\n ...ctx,\n args: resolvedInput,\n state: {},\n consts: new Set(),\n output: undefined,\n error: undefined,\n }\n\n const seqAtom = ctx.resolver('seq')\n if (!seqAtom) throw new Error('seq atom not found')\n await seqAtom.exec(resolvedId, childCtx)\n\n if (childCtx.error) {\n throw new Error(childCtx.error.message || 'Sub-agent failed')\n }\n\n return childCtx.output\n }\n\n // Fall back to capability-based agent lookup\n if (!ctx.capabilities.agent?.run)\n throw new Error(\"Capability 'agent.run' missing\")\n\n const result = await ctx.capabilities.agent.run(resolvedId, resolvedInput)\n\n // Check if this is a RunResult (has fuelUsed property) - unwrap it\n if (\n result &&\n typeof result === 'object' &&\n 'fuelUsed' in result &&\n typeof result.fuelUsed === 'number'\n ) {\n // It's a RunResult - check for error and propagate\n if (result.error) {\n throw new Error(result.error.message || 'Sub-agent failed')\n }\n return result.result\n }\n\n return result\n },\n { docs: 'Run Sub-Agent (accepts procedure token, AST, or agent ID)', cost: 1 }\n)\n\n/*#\n## transpileCode (Code to AST)\n\nTranspiles AsyncJS code to an AST without executing it.\nUseful for generating agents to send to other services via fetch.\n\n```javascript\n// Generate an agent and send it to a worker\nlet code = llmPredict({ prompt: 'Write an AsyncJS data processor' })\nlet ast = transpileCode({ code })\nlet result = httpFetch({\n url: 'https://worker.example.com/run',\n method: 'POST',\n body: JSON.stringify({ ast, args: { data: myData } })\n})\n```\n\nSecurity: Only available when the `code.transpile` capability is provided.\n*/\nexport const transpileCode = defineAtom(\n 'transpileCode',\n s.object({\n code: s.string,\n }),\n s.any,\n async ({ code }, ctx) => {\n if (!ctx.capabilities.code?.transpile) {\n throw new Error(\n \"Capability 'code.transpile' missing. Enable code transpilation by providing the code capability.\"\n )\n }\n\n const resolvedCode = resolveValue(code, ctx)\n\n try {\n return ctx.capabilities.code.transpile(resolvedCode)\n } catch (e: any) {\n throw new Error(`Code transpilation failed: ${e.message}`)\n }\n },\n { docs: 'Transpile AsyncJS code to AST', cost: 1 }\n)\n\n/*#\n## runCode (Dynamic Code Execution)\n\nTranspiles and executes AsyncJS code at runtime. The generated code\nruns in the same context, sharing fuel budget, capabilities, and trace.\n\nThis enables agents to write and execute code to solve problems.\n\n```javascript\n// Agent writes code to solve a problem\nlet code = llmPredict({ prompt: 'Write AsyncJS to calculate fibonacci(10)' })\nlet result = runCode({ code, args: {} })\nreturn { answer: result }\n```\n\nThe code must be a valid AsyncJS function. The function's return value\nbecomes the result of runCode.\n\nSecurity: Only available when the `code.transpile` capability is provided.\nThe transpiled code runs with the same permissions as the parent.\nRecursion depth is limited to prevent stack overflow.\n*/\n/** Maximum nesting depth for runCode to prevent infinite recursion */\nconst MAX_RUNCODE_DEPTH = 10\n\nexport const runCode = defineAtom(\n 'runCode',\n s.object({\n code: s.string,\n args: s.record(s.any).optional,\n }),\n s.any,\n async ({ code, args }, ctx) => {\n // Check recursion depth\n const currentDepth = ctx.runCodeDepth ?? 0\n if (currentDepth >= MAX_RUNCODE_DEPTH) {\n throw new Error(\n `runCode recursion limit exceeded (max ${MAX_RUNCODE_DEPTH}). ` +\n 'This prevents infinite loops from dynamically generated code calling runCode.'\n )\n }\n\n if (!ctx.capabilities.code?.transpile) {\n throw new Error(\n \"Capability 'code.transpile' missing. Enable dynamic code execution by providing the code capability.\"\n )\n }\n\n const resolvedCode = resolveValue(code, ctx)\n const resolvedArgs = args ? resolveValue(args, ctx) : {}\n\n // Transpile the code to AST\n let ast: { op: string; steps: any[] }\n try {\n ast = ctx.capabilities.code.transpile(resolvedCode)\n } catch (e: any) {\n throw new Error(`Code transpilation failed: ${e.message}`)\n }\n\n if (ast.op !== 'seq') {\n throw new Error('Transpiled code must be a seq node')\n }\n\n // Create a child scope for the dynamic code execution\n // This isolates its variables but shares fuel, capabilities, trace\n const childCtx = createChildScope(ctx)\n childCtx.args = resolvedArgs\n childCtx.output = undefined\n childCtx.runCodeDepth = currentDepth + 1 // Increment depth for nested calls\n\n // Execute the transpiled code in the child context\n await seq.exec(ast as any, childCtx)\n\n // Propagate any error from child to parent\n if (childCtx.error) {\n ctx.error = childCtx.error\n return\n }\n\n // Return the output from the dynamic code\n return childCtx.output\n },\n { docs: 'Run dynamically generated AsyncJS code', cost: 1 }\n)\n\n// 11. Parsing (Cost 1)\nexport const jsonParse = defineAtom(\n 'jsonParse',\n s.object({ str: s.string }),\n s.any,\n async ({ str }, ctx) => JSON.parse(resolveValue(str, ctx)),\n { docs: 'Parse JSON', cost: 1 }\n)\nexport const jsonStringify = defineAtom(\n 'jsonStringify',\n s.object({ value: s.any }),\n s.string,\n async ({ value }, ctx) => JSON.stringify(resolveValue(value, ctx)),\n { docs: 'Stringify JSON', cost: 1 }\n)\nexport const xmlParse = defineAtom(\n 'xmlParse',\n s.object({ str: s.string }),\n s.any,\n async ({ str }, ctx) => {\n if (!ctx.capabilities.xml?.parse)\n throw new Error(\"Capability 'xml.parse' missing\")\n return ctx.capabilities.xml.parse(resolveValue(str, ctx))\n },\n { docs: 'Parse XML', cost: 1 }\n)\n\n// 12. Optimization\n\n/*#\n## memoize\n\nIn-memory caching within a single execution. Same key returns cached result.\n\n```javascript\n// Expensive computation cached by key\nconst result = memoize(\"expensive-\" + id, () => {\n return heavyComputation(data)\n})\n```\n*/\nexport const memoize = defineAtom(\n 'memoize',\n s.object({ key: s.string.optional, steps: s.array(s.any) }),\n s.any,\n async ({ key, steps }, ctx) => {\n // In-memory memoization scoped to VM run\n if (!ctx.memo) ctx.memo = new Map()\n\n const k =\n resolveValue(key, ctx) ??\n (await hash.exec({ value: steps, algorithm: 'SHA-256' }, ctx))\n\n // Check if result exists\n if (ctx.memo.has(k)) {\n return ctx.memo.get(k)\n }\n\n // Execute steps in isolated scope\n const scopedCtx = createChildScope(ctx)\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n\n // Result is implicit from last step or explicit scope result variable?\n // Convention: result variable or last output\n const result = scopedCtx.output ?? scopedCtx.state['result']\n\n // Store\n ctx.memo.set(k, result)\n return result\n },\n { docs: 'Memoize steps result in memory', cost: 1 }\n)\n\n/*#\n## cache\n\nPersistent caching across executions using store capability.\n\n```javascript\n// Cache API result for 1 hour (3600000 ms)\nconst weather = cache(\"weather-\" + city, 3600000, () => {\n return fetch(\"https://api.weather.com/\" + city)\n})\n```\n*/\nexport const cache = defineAtom(\n 'cache',\n s.object({\n key: s.string.optional,\n steps: s.array(s.any),\n ttlMs: s.number.optional,\n }),\n s.any,\n async ({ key, steps, ttlMs }, ctx) => {\n if (!ctx.capabilities.store)\n throw new Error(\"Capability 'store' missing for caching\")\n\n const k =\n resolveValue(key, ctx) ??\n (await hash.exec({ value: steps, algorithm: 'SHA-256' }, ctx))\n\n // Check cache\n const cacheKey = `cache:${k}`\n const cached = await ctx.capabilities.store.get(cacheKey)\n\n if (cached) {\n // If object with timestamp?\n // For simple store, we might store { val, exp }\n // Let's assume we store { val, exp } if we manage TTL manually\n // or capabilities handle TTL?\n // Standard KV doesn't enforce TTL usually unless Redis.\n // We implement soft TTL logic wrapper here.\n if (typeof cached === 'object' && cached._exp) {\n if (Date.now() < cached._exp) return cached.val\n // Expired\n } else {\n // No expiry metadata, assume valid if exists (or legacy data)\n return cached\n }\n }\n\n // Execute\n const scopedCtx = createChildScope(ctx)\n await seq.exec({ op: 'seq', steps } as any, scopedCtx)\n const result = scopedCtx.output ?? scopedCtx.state['result']\n\n // Store with TTL\n const expiry = Date.now() + (ttlMs ?? 24 * 3600 * 1000)\n\n if ((ctx.fuel.current -= 5) <= 0) throw new Error('Out of Fuel')\n await ctx.capabilities.store.set(cacheKey, { val: result, _exp: expiry })\n\n return result\n },\n { docs: 'Cache steps result in store with TTL', cost: 5 }\n)\n\n// 13. Utils\nexport const random = defineAtom(\n 'random',\n s.object({\n min: s.number.optional,\n max: s.number.optional,\n format: s.string.optional,\n length: s.number.optional,\n }),\n s.any,\n async ({ min, max, format, length }, ctx) => {\n const f = resolveValue(format, ctx) ?? 'float'\n const len = resolveValue(length, ctx) ?? 10\n const mn = resolveValue(min, ctx) ?? 0\n const mx = resolveValue(max, ctx) ?? 1\n\n if (f === 'base36') {\n const chars = '0123456789abcdefghijklmnopqrstuvwxyz'\n let result = ''\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const values = new Uint8Array(len)\n crypto.getRandomValues(values)\n for (let i = 0; i < len; i++) {\n result += chars[values[i] % 36]\n }\n } else {\n for (let i = 0; i < len; i++) {\n result += chars.charAt(Math.floor(Math.random() * 36))\n }\n }\n return result\n }\n\n // Prefer cryptographically secure random when available\n let val: number\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const arr = new Uint32Array(1)\n crypto.getRandomValues(arr)\n val = arr[0] / (0xffffffff + 1)\n } else {\n val = Math.random()\n }\n\n const range = mx - mn\n const result = val * range + mn\n\n if (f === 'integer') {\n return Math.floor(result)\n }\n return result\n },\n { docs: 'Generate Random', cost: 1 }\n)\n\nexport const uuid = defineAtom(\n 'uuid',\n undefined,\n s.string,\n async () => {\n // Prefer crypto.randomUUID when available\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID()\n }\n // Fallback using crypto.getRandomValues if available\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const bytes = new Uint8Array(16)\n crypto.getRandomValues(bytes)\n bytes[6] = (bytes[6] & 0x0f) | 0x40 // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80 // variant 10\n const hex = Array.from(bytes, (b) =>\n b.toString(16).padStart(2, '0')\n ).join('')\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(\n 12,\n 16\n )}-${hex.slice(16, 20)}-${hex.slice(20)}`\n }\n // Last resort fallback (insecure, for legacy environments only)\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n },\n { docs: 'Generate UUID', cost: 1 }\n)\n\nexport const hash = defineAtom(\n 'hash',\n s.object({\n value: s.any,\n algorithm: s.string.optional, // e.g., 'SHA-256'\n }),\n s.string,\n async ({ value, algorithm }, ctx) => {\n const str =\n typeof value === 'string'\n ? value\n : JSON.stringify(resolveValue(value, ctx))\n const algo = resolveValue(algorithm, ctx) || 'SHA-256'\n\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const encoder = new TextEncoder()\n const data = encoder.encode(str)\n const hashBuffer = await crypto.subtle.digest(algo, data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n // Fallback for environments without crypto.subtle\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash |= 0 // Convert to 32bit integer\n }\n return String(hash)\n },\n { docs: 'Hash a value', cost: 1 }\n)\n\n// 14. Console (logging, warnings, errors)\n\n/*#\n## console.log / console.warn / console.error\n\nLogging utilities that integrate with trace and error flow.\n\n```javascript\nconsole.log(\"Debug info: \" + value) // Adds to trace\nconsole.warn(\"Potential issue\") // Adds to trace + warnings summary\nconsole.error(\"Fatal: \" + msg) // Triggers monadic error flow\n```\n\n- `log`: trace only (no side effects)\n- `warn`: trace + appears in `result.warnings`\n- `error`: stops execution, sets `result.error`\n*/\nexport const consoleLog = defineAtom(\n 'consoleLog',\n s.object({ message: s.any }),\n undefined,\n async ({ message }, ctx) => {\n const msg = resolveValue(message, ctx)\n if (ctx.trace) {\n ctx.trace.push({\n op: 'console.log',\n input: { message: msg },\n stateDiff: {},\n result: msg,\n fuelBefore: ctx.fuel.current,\n fuelAfter: ctx.fuel.current,\n timestamp: new Date().toISOString(),\n })\n }\n },\n { docs: 'Log to trace', cost: 0.1 }\n)\n\nexport const consoleWarn = defineAtom(\n 'consoleWarn',\n s.object({ message: s.any }),\n undefined,\n async ({ message }, ctx) => {\n const msg = resolveValue(message, ctx)\n const msgStr = typeof msg === 'string' ? msg : JSON.stringify(msg)\n // Add to warnings summary\n if (!ctx.warnings) ctx.warnings = []\n ctx.warnings.push(msgStr)\n // Add to trace for context\n if (ctx.trace) {\n ctx.trace.push({\n op: 'console.warn',\n input: { message: msg },\n stateDiff: {},\n result: msg,\n fuelBefore: ctx.fuel.current,\n fuelAfter: ctx.fuel.current,\n timestamp: new Date().toISOString(),\n })\n }\n },\n { docs: 'Add warning', cost: 0.1 }\n)\n\nexport const consoleError = defineAtom(\n 'consoleError',\n s.object({ message: s.any }),\n undefined,\n async ({ message }, ctx) => {\n const msg = resolveValue(message, ctx)\n const msgStr = typeof msg === 'string' ? msg : JSON.stringify(msg)\n ctx.error = new AgentError(msgStr, 'console.error')\n },\n { docs: 'Emit error and stop', cost: 0.1 }\n)\n\n// --- Stored Procedures ---\n\nexport const storeProcedure = defineAtom(\n 'storeProcedure',\n s.object({\n ast: s.any,\n ttl: s.number.optional,\n maxSize: s.number.optional,\n }),\n s.string,\n async ({ ast, ttl, maxSize }, ctx) => {\n const resolvedAst = resolveValue(ast, ctx)\n const resolvedTtl = ttl ? resolveValue(ttl, ctx) : DEFAULT_PROCEDURE_TTL\n const resolvedMaxSize = maxSize\n ? resolveValue(maxSize, ctx)\n : DEFAULT_MAX_AST_SIZE\n\n // Validate AST has an op\n if (!resolvedAst || typeof resolvedAst !== 'object' || !resolvedAst.op) {\n throw new Error('Invalid AST: must be an object with an \"op\" property')\n }\n\n // Check size\n const astJson = JSON.stringify(resolvedAst)\n if (astJson.length > resolvedMaxSize) {\n throw new Error(\n `AST too large: ${astJson.length} bytes exceeds limit of ${resolvedMaxSize} bytes. ` +\n `Consider reducing AST size or using a shorter TTL.`\n )\n }\n\n // Generate token and store\n const token = generateProcedureToken()\n const now = Date.now()\n procedureStore.set(token, {\n ast: resolvedAst,\n createdAt: now,\n expiresAt: now + resolvedTtl,\n })\n\n return token\n },\n { docs: 'Store an AST and return a token for later execution', cost: 1 }\n)\n\nexport const releaseProcedure = defineAtom(\n 'releaseProcedure',\n s.object({ token: s.string }),\n s.boolean,\n async ({ token }, ctx) => {\n const resolvedToken = resolveValue(token, ctx)\n return procedureStore.delete(resolvedToken)\n },\n { docs: 'Release a stored procedure by token', cost: 0.1 }\n)\n\nexport const clearExpiredProcedures = defineAtom(\n 'clearExpiredProcedures',\n undefined,\n s.number,\n async () => {\n const now = Date.now()\n let cleared = 0\n for (const [token, entry] of procedureStore) {\n if (now > entry.expiresAt) {\n procedureStore.delete(token)\n cleared++\n }\n }\n return cleared\n },\n { docs: 'Clear all expired procedures and return count', cost: 0.5 }\n)\n\n// --- Exports ---\n\nexport const coreAtoms = {\n seq,\n if: iff,\n while: whileLoop,\n return: ret,\n try: tryCatch,\n Error: errorAtom,\n varSet,\n constSet,\n varGet,\n varsImport,\n varsLet,\n varsExport,\n scope,\n map,\n filter,\n reduce,\n find,\n push,\n len,\n split,\n join,\n template,\n regexMatch,\n pick,\n omit,\n merge,\n keys,\n httpFetch: fetch,\n storeGet,\n storeSet,\n storeQuery,\n storeVectorSearch: vectorSearch,\n llmPredict,\n agentRun,\n transpileCode,\n runCode,\n jsonParse,\n jsonStringify,\n xmlParse,\n memoize,\n cache,\n random,\n uuid,\n hash,\n consoleLog,\n consoleWarn,\n consoleError,\n storeProcedure,\n releaseProcedure,\n clearExpiredProcedures,\n}\n", "import { coreAtoms, type Atom, type OpCode, type ExprNode } from './runtime'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype _AtomMap = typeof coreAtoms\n\n// --- Condition String Parser ---\n\n/**\n * Parse a simple condition string into an ExprNode.\n * Supports: identifiers, member access, binary/logical ops, literals\n * Uses the vars map to know which identifiers are state references.\n *\n * Unsupported syntax (will throw):\n * - Ternary: a ? b : c (use nested if atoms instead)\n * - Array index: a[0] (use ExprNode with computed member access)\n * - Function calls: fn(x) (use atoms)\n */\n// Reserved words that shouldn't be treated as variable references\nconst RESERVED_WORDS = new Set([\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'and',\n 'or',\n 'not', // sometimes used as aliases\n])\n\n/**\n * VarMapping maps condition variable names to state paths.\n * Keys are variable names used in the condition string,\n * values are state paths (e.g., { count: 'counter.value' }).\n */\ntype VarMapping = Record<string, string>\n\n/**\n * ItemsRef is a reference to an array in state (string path)\n * or a literal array value for iteration atoms.\n */\ntype ItemsRef = string | unknown[]\n\n/**\n * Warn if condition references identifiers not present in vars mapping.\n * This helps catch common mistakes when using the Builder API.\n */\nfunction warnMissingVars(condition: string, vars: VarMapping): void {\n // Remove string literals before scanning for identifiers\n const withoutStrings = condition\n .replace(/\"[^\"]*\"/g, '\"\"')\n .replace(/'[^']*'/g, \"''\")\n\n // Extract root identifiers only (not property accesses like obj.prop)\n // Match identifiers that are NOT preceded by a dot\n const identifiers: string[] = []\n const regex = /(?<![.])\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b/g\n let match\n while ((match = regex.exec(withoutStrings)) !== null) {\n identifiers.push(match[1])\n }\n const uniqueIds = [...new Set(identifiers)]\n\n const missing = uniqueIds.filter(\n (id) =>\n !RESERVED_WORDS.has(id) &&\n !(id in vars) &&\n // Ignore if it looks like a method call (followed by '(')\n !new RegExp(`\\\\b${id}\\\\s*\\\\(`).test(withoutStrings)\n )\n\n if (missing.length > 0) {\n console.warn(\n `[Agent99 Builder] Condition \"${condition}\" references variables not in vars mapping: ${missing.join(\n ', '\n )}. ` +\n `Add them to vars or use AsyncJS syntax (ajs\\`...\\`) which handles this automatically.`\n )\n }\n}\n\nfunction parseCondition(\n condition: string,\n vars: Record<string, any>\n): ExprNode {\n // Warn about potential missing variable mappings\n warnMissingVars(condition, vars)\n\n const tokens = tokenize(condition)\n const result = parseExpression(tokens, 0, vars)\n\n // Error if there are unconsumed tokens - indicates unsupported syntax\n if (result.pos < tokens.length) {\n const remaining = tokens.slice(result.pos).join(' ')\n throw new Error(\n `Unsupported condition syntax near '${remaining}' in: ${condition}\\n` +\n `Supported: comparisons, &&, ||, !, arithmetic, member access (a.b), literals`\n )\n }\n\n return result.node\n}\n\nfunction tokenize(expr: string): string[] {\n const tokens: string[] = []\n let i = 0\n while (i < expr.length) {\n // Skip whitespace\n while (i < expr.length && /\\s/.test(expr[i])) i++\n if (i >= expr.length) break\n\n // String literals (single or double quotes)\n if (expr[i] === '\"' || expr[i] === \"'\") {\n const quote = expr[i++]\n let str = ''\n while (i < expr.length && expr[i] !== quote) {\n if (expr[i] === '\\\\' && i + 1 < expr.length) {\n i++ // skip backslash\n str += expr[i++]\n } else {\n str += expr[i++]\n }\n }\n i++ // skip closing quote\n tokens.push(JSON.stringify(str)) // Store as JSON string for later parsing\n continue\n }\n\n // Multi-char operators\n if (expr.slice(i, i + 2).match(/^(&&|\\|\\||==|!=|>=|<=)$/)) {\n tokens.push(expr.slice(i, i + 2))\n i += 2\n continue\n }\n\n // Single-char operators (includes unsupported ?:[] for error reporting)\n if ('+-*/%><!().?:[]'.includes(expr[i])) {\n tokens.push(expr[i])\n i++\n continue\n }\n\n // Numbers\n if (/\\d/.test(expr[i])) {\n let num = ''\n while (i < expr.length && /[\\d.]/.test(expr[i])) {\n num += expr[i++]\n }\n tokens.push(num)\n continue\n }\n\n // Identifiers\n if (/[a-zA-Z_]/.test(expr[i])) {\n let id = ''\n while (i < expr.length && /[a-zA-Z0-9_]/.test(expr[i])) {\n id += expr[i++]\n }\n tokens.push(id)\n continue\n }\n\n i++\n }\n return tokens\n}\n\nfunction parseExpression(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n return parseLogicalOr(tokens, pos, vars)\n}\n\nfunction parseLogicalOr(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseLogicalAnd(tokens, pos, vars)\n\n while (tokens[newPos] === '||') {\n newPos++\n const { node: right, pos: rightPos } = parseLogicalAnd(tokens, newPos, vars)\n left = { $expr: 'logical', op: '||', left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseLogicalAnd(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseComparison(tokens, pos, vars)\n\n while (tokens[newPos] === '&&') {\n newPos++\n const { node: right, pos: rightPos } = parseComparison(tokens, newPos, vars)\n left = { $expr: 'logical', op: '&&', left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseComparison(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseAdditive(tokens, pos, vars)\n\n const compOps = ['==', '!=', '>', '<', '>=', '<=']\n while (compOps.includes(tokens[newPos])) {\n const op = tokens[newPos++]\n const { node: right, pos: rightPos } = parseAdditive(tokens, newPos, vars)\n left = { $expr: 'binary', op, left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseAdditive(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseMultiplicative(tokens, pos, vars)\n\n while (tokens[newPos] === '+' || tokens[newPos] === '-') {\n const op = tokens[newPos++]\n const { node: right, pos: rightPos } = parseMultiplicative(\n tokens,\n newPos,\n vars\n )\n left = { $expr: 'binary', op, left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseMultiplicative(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n let { node: left, pos: newPos } = parseUnary(tokens, pos, vars)\n\n while (\n tokens[newPos] === '*' ||\n tokens[newPos] === '/' ||\n tokens[newPos] === '%'\n ) {\n const op = tokens[newPos++]\n const { node: right, pos: rightPos } = parseUnary(tokens, newPos, vars)\n left = { $expr: 'binary', op, left, right }\n newPos = rightPos\n }\n\n return { node: left, pos: newPos }\n}\n\nfunction parseUnary(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n if (tokens[pos] === '!' || tokens[pos] === '-') {\n const op = tokens[pos++]\n const { node: argument, pos: newPos } = parseUnary(tokens, pos, vars)\n return { node: { $expr: 'unary', op, argument }, pos: newPos }\n }\n return parsePrimary(tokens, pos, vars)\n}\n\nfunction parsePrimary(\n tokens: string[],\n pos: number,\n vars: Record<string, any>\n): { node: ExprNode; pos: number } {\n const token = tokens[pos]\n\n // Parenthesized expression\n if (token === '(') {\n const { node, pos: newPos } = parseExpression(tokens, pos + 1, vars)\n // Skip closing paren\n return { node, pos: newPos + 1 }\n }\n\n // String literal (stored as JSON)\n if (token && token.startsWith('\"')) {\n return {\n node: { $expr: 'literal', value: JSON.parse(token) },\n pos: pos + 1,\n }\n }\n\n // Number literal\n if (token && /^\\d/.test(token)) {\n return {\n node: { $expr: 'literal', value: parseFloat(token) },\n pos: pos + 1,\n }\n }\n\n // Boolean/null literals\n if (token === 'true')\n return { node: { $expr: 'literal', value: true }, pos: pos + 1 }\n if (token === 'false')\n return { node: { $expr: 'literal', value: false }, pos: pos + 1 }\n if (token === 'null')\n return { node: { $expr: 'literal', value: null }, pos: pos + 1 }\n\n // Identifier (possibly with member access via dots in vars)\n if (token && /^[a-zA-Z_]/.test(token)) {\n // Check if this identifier is in vars - if so, it's a state reference\n let node: ExprNode = { $expr: 'ident', name: token }\n let newPos = pos + 1\n\n // Handle member access (token.prop.subprop)\n while (tokens[newPos] === '.') {\n newPos++ // skip dot\n const prop = tokens[newPos++]\n node = { $expr: 'member', object: node, property: prop }\n }\n\n return { node, pos: newPos }\n }\n\n // Fallback - shouldn't happen\n return { node: { $expr: 'literal', value: null }, pos: pos + 1 }\n}\n\n// --- AST Types ---\n\nexport interface BaseNode {\n op: OpCode\n [key: string]: any\n}\n\nexport interface SeqNode extends BaseNode {\n op: 'seq'\n steps: BaseNode[]\n}\n\n// --- Helpers ---\n\nexport interface ArgRef {\n $kind: 'arg'\n path: string\n}\n\n// --- Typed Builder ---\n\n// Helper to extract input type from Atom definition\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype AtomInput<T> = T extends Atom<infer I, any> ? I : never\n\n// The Builder instance type with dynamic methods inferred from AtomMap\ntype BuilderMethods<M extends Record<string, Atom<any, any>>> = {\n [K in keyof M as M[K]['op']]: (input: AtomInput<M[K]>) => BuilderType<M>\n}\n\n// Control Flow Extensions (Custom signatures)\ninterface ControlFlow<M extends Record<string, Atom<any, any>>> {\n varsImport(keys: string[] | Record<string, string>): BuilderType<M>\n varsExport(keys: string[] | Record<string, string>): BuilderType<M>\n\n /**\n * Conditional branch. Condition is a JS-like expression string.\n * @param condition - Expression like \"count > 0 && active\"\n * @param vars - Map condition vars to state paths: { count: 'state.count' }\n * @param thenBranch - Steps to run if condition is true\n * @param elseBranch - Optional steps if condition is false\n */\n if(\n condition: string,\n vars: VarMapping,\n thenBranch: (b: BuilderType<M>) => BuilderType<M>,\n elseBranch?: (b: BuilderType<M>) => BuilderType<M>\n ): BuilderType<M>\n\n /**\n * Loop while condition is true.\n * @param condition - Expression like \"count < 10\"\n * @param vars - Map condition vars to state paths\n * @param body - Steps to run each iteration\n */\n while(\n condition: string,\n vars: VarMapping,\n body: (b: BuilderType<M>) => BuilderType<M>\n ): BuilderType<M>\n\n scope(steps: (b: BuilderType<M>) => BuilderType<M>): BuilderType<M>\n\n /**\n * Transform each item in array.\n * @param items - State path to array or literal array\n * @param as - Variable name for current item in scope\n * @param steps - Transform steps (result is new item value)\n */\n map(\n items: ItemsRef,\n as: string,\n steps: (b: BuilderType<M>) => BuilderType<M>\n ): BuilderType<M>\n\n /**\n * Filter array to items matching condition.\n * @param items - State path to array or literal array\n * @param as - Variable name for current item\n * @param condition - Filter expression using 'as' variable\n * @param vars - Additional var mappings (optional)\n */\n filter(\n items: ItemsRef,\n as: string,\n condition: string,\n vars?: VarMapping\n ): BuilderType<M>\n\n /**\n * Find first item matching condition.\n * @param items - State path to array or literal array\n * @param as - Variable name for current item\n * @param condition - Search expression\n * @param vars - Additional var mappings (optional)\n */\n find(\n items: ItemsRef,\n as: string,\n condition: string,\n vars?: VarMapping\n ): BuilderType<M>\n\n /**\n * Reduce array to single value.\n * @param items - State path to array or literal array\n * @param as - Variable name for current item\n * @param accumulator - Variable name for running result\n * @param initial - Initial accumulator value\n * @param steps - Reduction steps (result becomes new accumulator)\n */\n reduce<T>(\n items: ItemsRef,\n as: string,\n accumulator: string,\n initial: T,\n steps: (b: BuilderType<M>) => BuilderType<M>\n ): BuilderType<M>\n\n memoize(\n steps: (b: BuilderType<M>) => BuilderType<M>,\n key?: string\n ): BuilderType<M>\n\n cache(\n steps: (b: BuilderType<M>) => BuilderType<M>,\n key?: string,\n ttlMs?: number\n ): BuilderType<M>\n\n try(branches: {\n try: (b: BuilderType<M>) => BuilderType<M>\n catch?: (b: BuilderType<M>) => BuilderType<M>\n }): BuilderType<M>\n}\n\nexport class TypedBuilder<M extends Record<string, Atom<any, any>>> {\n public steps: BaseNode[] = []\n private atoms: M\n private proxy: any\n\n constructor(atoms: M) {\n this.atoms = atoms\n\n // Proxy to handle dynamic atom calls\n this.proxy = new Proxy(this, {\n get: (target, prop: string | symbol, receiver) => {\n // 1. Check for class methods (as, step, toJSON, etc.)\n if (prop in target) return (target as any)[prop]\n\n // 2. Dynamic atom methods\n if (typeof prop === 'string' && prop in target.atoms) {\n return (input: any) => {\n const atom = target.atoms[prop]\n target.add(atom.create(input))\n return receiver\n }\n }\n\n return undefined\n },\n })\n\n return this.proxy\n }\n\n private add(step: BaseNode): BuilderType<M> {\n this.steps.push(step)\n return this.proxy\n }\n\n // --- Core Fluent API ---\n\n as(variableName: string): BuilderType<M> {\n if (this.steps.length === 0) throw new Error('No step to capture')\n const last = this.steps[this.steps.length - 1]\n last.result = variableName\n return this.proxy\n }\n\n step(node: BaseNode): BuilderType<M> {\n return this.add(node)\n }\n\n return(schema: any): BuilderType<M> {\n const atom = this.atoms['return']\n if (!atom) throw new Error(\"Atom 'return' not found\")\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _schema = schema.schema ?? schema\n return this.add(atom.create({ schema: _schema }))\n }\n\n toJSON(): SeqNode {\n return {\n op: 'seq',\n steps: [...this.steps],\n }\n }\n\n // --- Custom Overloads ---\n\n varsImport(keys: string[] | Record<string, string>) {\n return this.add(this.atoms['varsImport'].create({ keys }))\n }\n\n varsExport(keys: string[] | Record<string, string>) {\n return this.add(this.atoms['varsExport'].create({ keys }))\n }\n\n // --- Control Flow Helpers ---\n\n if(\n condition: string,\n vars: VarMapping,\n thenBranch: (b: BuilderType<M>) => BuilderType<M>,\n elseBranch?: (b: BuilderType<M>) => BuilderType<M>\n ) {\n const thenB = new TypedBuilder(this.atoms)\n thenBranch(thenB as any)\n\n let elseSteps\n if (elseBranch) {\n const elseB = new TypedBuilder(this.atoms)\n elseBranch(elseB as any)\n elseSteps = elseB.steps\n }\n\n // Parse condition string into ExprNode\n const conditionExpr = parseCondition(condition, vars)\n\n const ifAtom = this.atoms['if']\n return this.add(\n ifAtom.create({\n condition: conditionExpr,\n then: thenB.steps,\n else: elseSteps,\n })\n )\n }\n\n while(\n condition: string,\n vars: VarMapping,\n body: (b: BuilderType<M>) => BuilderType<M>\n ) {\n const bodyB = new TypedBuilder(this.atoms)\n body(bodyB as any)\n\n // Parse condition string into ExprNode\n const conditionExpr = parseCondition(condition, vars)\n\n const whileAtom = this.atoms['while']\n return this.add(\n whileAtom.create({\n condition: conditionExpr,\n body: bodyB.steps,\n })\n )\n }\n\n scope(steps: (b: BuilderType<M>) => BuilderType<M>) {\n const scopeB = new TypedBuilder(this.atoms)\n steps(scopeB as any)\n const scopeAtom = this.atoms['scope']\n return this.add(\n scopeAtom.create({\n steps: scopeB.steps,\n })\n )\n }\n\n map(\n items: ItemsRef,\n as: string,\n steps: (b: BuilderType<M>) => BuilderType<M>\n ) {\n const stepsB = new TypedBuilder(this.atoms)\n steps(stepsB as any)\n const mapAtom = this.atoms['map']\n return this.add(\n mapAtom.create({\n items,\n as,\n steps: stepsB.steps,\n })\n )\n }\n\n filter(\n items: ItemsRef,\n as: string,\n condition: string,\n vars: VarMapping = {}\n ) {\n const conditionExpr = parseCondition(condition, vars)\n const filterAtom = this.atoms['filter']\n return this.add(\n filterAtom.create({\n items,\n as,\n condition: conditionExpr,\n })\n )\n }\n\n find(items: ItemsRef, as: string, condition: string, vars: VarMapping = {}) {\n const conditionExpr = parseCondition(condition, vars)\n const findAtom = this.atoms['find']\n return this.add(\n findAtom.create({\n items,\n as,\n condition: conditionExpr,\n })\n )\n }\n\n reduce<T>(\n items: ItemsRef,\n as: string,\n accumulator: string,\n initial: T,\n steps: (b: BuilderType<M>) => BuilderType<M>\n ) {\n const stepsB = new TypedBuilder(this.atoms)\n steps(stepsB as any)\n const reduceAtom = this.atoms['reduce']\n return this.add(\n reduceAtom.create({\n items,\n as,\n accumulator,\n initial,\n steps: stepsB.steps,\n })\n )\n }\n\n memoize(steps: (b: BuilderType<M>) => BuilderType<M>, key?: string) {\n const stepsB = new TypedBuilder(this.atoms)\n steps(stepsB as any)\n const memoAtom = this.atoms['memoize']\n return this.add(\n memoAtom.create({\n key,\n steps: stepsB.steps,\n })\n )\n }\n\n cache(\n steps: (b: BuilderType<M>) => BuilderType<M>,\n key?: string,\n ttlMs?: number\n ) {\n const stepsB = new TypedBuilder(this.atoms)\n steps(stepsB as any)\n const cacheAtom = this.atoms['cache']\n return this.add(\n cacheAtom.create({\n key,\n steps: stepsB.steps,\n ttlMs,\n })\n )\n }\n\n try(branches: {\n try: (b: BuilderType<M>) => BuilderType<M>\n catch?: (b: BuilderType<M>) => BuilderType<M>\n }) {\n const tryB = new TypedBuilder(this.atoms)\n branches.try(tryB as any)\n\n let catchSteps\n if (branches.catch) {\n const catchB = new TypedBuilder(this.atoms)\n branches.catch(catchB as any)\n catchSteps = catchB.steps\n }\n\n const tryAtom = this.atoms['try']\n return this.add(\n tryAtom.create({\n try: tryB.steps,\n catch: catchSteps,\n })\n )\n }\n}\n\n// Combine dynamic atom methods with class methods\nexport type BuilderType<M extends Record<string, Atom<any, any>>> =\n TypedBuilder<M> & BuilderMethods<M> & ControlFlow<M>\n\n// --- API Surface ---\n\nexport const Agent = {\n // Create a builder with default core atoms\n take(_schema?: any): BuilderType<typeof coreAtoms> {\n return new TypedBuilder(coreAtoms) as any\n },\n\n // Create a customized builder\n custom<M extends Record<string, Atom<any, any>>>(atoms: M): BuilderType<M> {\n return new TypedBuilder(atoms) as any\n },\n\n args(path: string): ArgRef {\n return { $kind: 'arg', path }\n },\n\n val(path: string): string {\n return path\n },\n}\n\n/** @deprecated Use `Agent` instead */\nexport const A99 = Agent\n", "import {\n type Atom,\n type Capabilities,\n type RunResult,\n type RuntimeContext,\n type CostOverride,\n coreAtoms,\n AgentError,\n isProcedureToken,\n resolveProcedureToken,\n} from './runtime'\nimport { TypedBuilder, type BaseNode, type BuilderType } from '../builder'\nimport { validate } from 'tosijs-schema'\nimport { transpile } from '../lang/core'\n\n/** Default timeout multiplier: milliseconds per fuel unit */\nconst FUEL_TO_MS = 10 // 1000 fuel = 10 seconds\n\nexport class AgentVM<M extends Record<string, Atom<any, any>>> {\n readonly atoms: typeof coreAtoms & M\n\n constructor(customAtoms: M = {} as M) {\n this.atoms = { ...coreAtoms, ...customAtoms }\n }\n\n get builder(): BuilderType<typeof coreAtoms & M> {\n return new TypedBuilder(this.atoms) as any\n }\n\n // Typed helper for builder\n get Agent(): BuilderType<typeof coreAtoms & M> {\n return new TypedBuilder(this.atoms) as any\n }\n\n /** @deprecated Use `Agent` instead */\n get A99(): BuilderType<typeof coreAtoms & M> {\n return this.Agent\n }\n\n resolve(op: string) {\n return this.atoms[op]\n }\n\n getTools(filter: 'flow' | 'all' | string[] = 'all') {\n let targetAtoms = Object.values(this.atoms)\n\n if (Array.isArray(filter)) {\n targetAtoms = targetAtoms.filter((a) => filter.includes(a.op))\n } else if (filter === 'flow') {\n const flowOps = [\n 'seq',\n 'if',\n 'while',\n 'return',\n 'try',\n 'varSet',\n 'varGet',\n 'scope',\n ]\n targetAtoms = targetAtoms.filter((a) => flowOps.includes(a.op))\n }\n\n return targetAtoms.map((atom) => ({\n type: 'function',\n function: {\n name: atom.op,\n description: atom.docs,\n parameters: atom.inputSchema?.schema ?? {},\n },\n }))\n }\n\n async run(\n astOrToken: BaseNode | string,\n args: Record<string, any> = {},\n options: {\n fuel?: number\n capabilities?: Capabilities\n trace?: boolean\n timeoutMs?: number // Override automatic timeout (fuel * FUEL_TO_MS)\n signal?: AbortSignal // External abort signal (e.g., from caller)\n costOverrides?: Record<string, CostOverride> // Per-atom fuel cost overrides\n context?: Record<string, any> // Request-scoped metadata (auth, permissions, etc.)\n } = {}\n ): Promise<RunResult> {\n // Resolve string input to AST\n let ast: BaseNode\n if (typeof astOrToken === 'string') {\n if (isProcedureToken(astOrToken)) {\n // Procedure token - lookup stored AST\n ast = resolveProcedureToken(astOrToken) as BaseNode\n } else {\n // AJS source code - transpile to AST\n try {\n ast = transpile(astOrToken).ast as BaseNode\n } catch (e: any) {\n throw new Error(`AJS transpilation failed: ${e.message}`)\n }\n }\n } else {\n ast = astOrToken\n }\n\n const startFuel = options.fuel ?? 1000\n\n // Calculate timeout from fuel budget (generous: 10ms per fuel unit)\n // Can be overridden with explicit timeoutMs option\n const timeoutMs = options.timeoutMs ?? startFuel * FUEL_TO_MS\n\n // Default Capabilities\n const capabilities = options.capabilities ?? {}\n\n // Track warnings\n const warnings: string[] = []\n\n // Default In-Memory Store if none provided (with warning)\n if (!capabilities.store) {\n const memoryStore = new Map<string, any>()\n let warned = false\n capabilities.store = {\n get: async (key) => {\n if (!warned) {\n warned = true\n warnings.push(\n 'Using default in-memory store (not suitable for production)'\n )\n }\n return memoryStore.get(key)\n },\n set: async (key, value) => {\n if (!warned) {\n warned = true\n warnings.push(\n 'Using default in-memory store (not suitable for production)'\n )\n }\n memoryStore.set(key, value)\n },\n }\n }\n\n // Create abort controller for timeout enforcement\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), timeoutMs)\n\n // Link external signal if provided\n if (options.signal) {\n options.signal.addEventListener('abort', () => controller.abort())\n }\n\n const ctx: RuntimeContext = {\n fuel: { current: startFuel },\n args,\n state: {},\n consts: new Set(),\n capabilities,\n resolver: (op) => this.resolve(op),\n output: undefined,\n signal: controller.signal,\n costOverrides: options.costOverrides,\n context: options.context,\n warnings, // Shared warnings array\n }\n\n if (options.trace) {\n ctx.trace = []\n }\n\n if (ast.op !== 'seq')\n throw new Error(\n \"Root AST must be 'seq'. Ensure you're passing a transpiled agent (use ajs`...` or transpile()).\"\n )\n\n // Input validation: validate args against the agent's input schema\n const inputSchema = (ast as any).inputSchema\n if (inputSchema && !validate(args, inputSchema)) {\n const error = new AgentError(\n `Input validation failed: args do not match expected schema`,\n 'vm.run'\n )\n return {\n result: error,\n error,\n fuelUsed: 0,\n trace: ctx.trace,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n }\n\n try {\n // Race execution against timeout\n await Promise.race([\n this.resolve('seq')?.exec(ast, ctx),\n new Promise<never>((_, reject) => {\n controller.signal.addEventListener('abort', () => {\n reject(\n new Error(\n `Execution timeout after ${timeoutMs}ms (fuel: ${startFuel}). Consider increasing fuel or optimizing your agent.`\n )\n )\n })\n // If already aborted, reject immediately\n if (controller.signal.aborted) {\n reject(\n new Error(\n `Execution timeout after ${timeoutMs}ms (fuel: ${startFuel}). Consider increasing fuel or optimizing your agent.`\n )\n )\n }\n }),\n ])\n } catch (e: any) {\n // Convert timeout error to AgentError\n if (\n e.message?.includes('timeout') ||\n e.message?.includes('aborted') ||\n controller.signal.aborted\n ) {\n ctx.error = new AgentError(\n `Execution timeout after ${timeoutMs}ms (fuel: ${startFuel}). Consider increasing fuel or optimizing your agent.`,\n 'vm.run'\n )\n } else {\n // Re-throw non-timeout errors\n throw e\n }\n } finally {\n clearTimeout(timeout)\n }\n\n // If there's an error but no output was set, set the error as output\n if (ctx.error && ctx.output === undefined) {\n ctx.output = ctx.error\n }\n\n // Merge any warnings added via console.warn\n const allWarnings = [...warnings, ...(ctx.warnings ?? [])]\n\n return {\n result: ctx.output,\n error: ctx.error,\n fuelUsed: startFuel - ctx.fuel.current,\n trace: ctx.trace,\n warnings: allWarnings.length > 0 ? allWarnings : undefined,\n }\n }\n}\n", "/**\n * TJS Parser \u2014 Orchestration Layer\n *\n * This module contains the main entry points: preprocess() and parse().\n * Transform functions are in parser-transforms.ts, param processing in parser-params.ts.\n */\n\nimport * as acorn from 'acorn'\nimport type { Program, FunctionDeclaration } from 'acorn'\nimport { SyntaxError } from './types'\n\n// Re-export types so external callers don't need to change imports\nexport type {\n ParseOptions,\n WasmBlock,\n TestBlock,\n PreprocessOptions,\n TjsModes,\n} from './parser-types'\n\nimport type {\n ParseOptions,\n WasmBlock,\n TestBlock,\n PreprocessOptions,\n TjsModes,\n} from './parser-types'\n\nimport { transformParenExpressions } from './parser-params'\n\nimport {\n transformTryWithoutCatch,\n extractWasmBlocks,\n transformIsOperators,\n insertAsiProtection,\n transformEqualityToStructural,\n transformTypeDeclarations,\n transformGenericDeclarations,\n transformFunctionPredicateDeclarations,\n transformUnionDeclarations,\n transformEnumDeclarations,\n transformExtendDeclarations,\n transformPolymorphicFunctions,\n transformPolymorphicConstructors,\n wrapClassDeclarations,\n transformBareAssignments,\n extractAndRunTests,\n validateNoDate,\n validateNoEval,\n validateNoVar,\n transformConstBang,\n transformBangAccess,\n transformExtensionCalls,\n} from './parser-transforms'\n\n// Re-export transformExtensionCalls for js.ts\nexport { transformExtensionCalls } from './parser-transforms'\n\nexport function preprocess(\n source: string,\n options: PreprocessOptions = {}\n): {\n source: string\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n moduleSafety?: 'none' | 'inputs' | 'all'\n tjsModes: TjsModes\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n wasmBlocks: WasmBlock[]\n tests: TestBlock[]\n testErrors: string[]\n polymorphicNames: Set<string>\n extensions: Map<string, Set<string>>\n} {\n const originalSource = source\n let moduleSafety: 'none' | 'inputs' | 'all' | undefined\n const requiredParams = new Set<string>()\n const unsafeFunctions = new Set<string>()\n const safeFunctions = new Set<string>()\n\n // Detect whether this source was emitted by fromTS (TS-originated)\n // The /* tjs <- filename */ annotation is the signal\n const isFromTS = /\\/\\*\\s*tjs\\s*<-\\s*\\S+\\s*\\*\\//.test(source)\n\n // Native TJS: all modes ON by default (TJS is its own language)\n // TS-originated or VM target (AJS): all modes OFF, safety none (JS-compatible)\n const isCompat = isFromTS || options.vmTarget\n const tjsModes: TjsModes = isCompat\n ? {\n tjsEquals: false,\n tjsClass: false,\n tjsDate: false,\n tjsNoeval: false,\n tjsStandard: false,\n tjsSafeEval: false,\n tjsNoVar: false,\n }\n : {\n tjsEquals: true,\n tjsClass: true,\n tjsDate: true,\n tjsNoeval: true,\n tjsStandard: true,\n tjsSafeEval: false, // opt-in only (adds import)\n tjsNoVar: true,\n }\n\n // Safety: native TJS defaults to 'inputs' (runtime default),\n // TS-originated and VM targets default to 'none'\n if (isCompat) {\n moduleSafety = 'none'\n }\n\n // Handle module-level safety directive: safety none | safety inputs | safety all\n // Must be at the start of the file (possibly after comments/whitespace)\n // Explicit directive always overrides the default\n const safetyMatch = source.match(\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*safety\\s+(none|inputs|all)\\b/\n )\n if (safetyMatch) {\n moduleSafety = safetyMatch[2] as 'none' | 'inputs' | 'all'\n // Remove the directive from source\n source = source.replace(\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*safety\\s+(none|inputs|all)\\s*/,\n '$1'\n )\n }\n\n // Handle TJS mode directives (can appear in any order after safety)\n // TjsStrict enables all TJS modes (useful for TS-originated code opting in)\n // TjsCompat disables all TJS modes (useful for native TJS opting out)\n // Individual modes: TjsEquals, TjsClass, TjsDate, TjsNoeval, TjsStandard, TjsSafeEval\n const directivePattern =\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*(TjsStrict|TjsCompat|TjsEquals|TjsClass|TjsDate|TjsNoeval|TjsNoVar|TjsStandard|TjsSafeEval)\\b/\n\n let match\n while ((match = source.match(directivePattern))) {\n const directive = match[2]\n\n if (directive === 'TjsStrict') {\n // Enable all TJS modes\n tjsModes.tjsEquals = true\n tjsModes.tjsClass = true\n tjsModes.tjsDate = true\n tjsModes.tjsNoeval = true\n tjsModes.tjsNoVar = true\n tjsModes.tjsStandard = true\n } else if (directive === 'TjsCompat') {\n // Disable all TJS modes (JS-compatible)\n tjsModes.tjsEquals = false\n tjsModes.tjsClass = false\n tjsModes.tjsDate = false\n tjsModes.tjsNoeval = false\n tjsModes.tjsNoVar = false\n tjsModes.tjsStandard = false\n tjsModes.tjsSafeEval = false\n } else if (directive === 'TjsEquals') {\n tjsModes.tjsEquals = true\n } else if (directive === 'TjsClass') {\n tjsModes.tjsClass = true\n } else if (directive === 'TjsDate') {\n tjsModes.tjsDate = true\n } else if (directive === 'TjsNoeval') {\n tjsModes.tjsNoeval = true\n } else if (directive === 'TjsNoVar') {\n tjsModes.tjsNoVar = true\n } else if (directive === 'TjsStandard') {\n tjsModes.tjsStandard = true\n } else if (directive === 'TjsSafeEval') {\n tjsModes.tjsSafeEval = true\n }\n\n // Remove the directive from source\n source = source.replace(\n new RegExp(\n `^(\\\\s*(?:\\\\/\\\\/[^\\\\n]*\\\\n|\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/\\\\s*)*)\\\\s*${directive}\\\\s*`\n ),\n '$1'\n )\n }\n\n // TjsStandard mode: insert semicolons to prevent ASI footguns\n // Must happen early before other transformations modify line structure\n if (tjsModes.tjsStandard) {\n source = insertAsiProtection(source)\n }\n\n // Transform const! declarations \u2014 validate immutability and emit as const\n // Must happen before acorn parsing since const! is not valid JS\n source = transformConstBang(source)\n\n // Transform !. bang access to __tjs.bang() calls\n // Must happen before acorn parsing since !. is not valid JS\n source = transformBangAccess(source)\n\n // Transform Is/IsNot infix operators to function calls\n // a Is b -> Is(a, b)\n // a IsNot b -> IsNot(a, b)\n // These are always available for explicit structural equality\n source = transformIsOperators(source)\n\n // Transform == and != to structural equality (Is/IsNot)\n // Only when TjsEquals mode is enabled and not for VM targets\n // VM targets already handle == correctly at runtime\n if (tjsModes.tjsEquals && !options.vmTarget) {\n source = transformEqualityToStructural(source)\n }\n\n // Transform Type, Generic, Union, and Enum declarations\n // Type Foo { ... } -> const Foo = Type(...)\n // Generic Bar<T, U> { ... } -> const Bar = Generic(...)\n // Union Dir 'up' | 'down' -> const Dir = Union(...)\n // Enum Status { Pending, Active, Done } -> const Status = Enum(...)\n source = transformTypeDeclarations(source)\n source = transformGenericDeclarations(source)\n source = transformFunctionPredicateDeclarations(source)\n source = transformUnionDeclarations(source)\n source = transformEnumDeclarations(source)\n\n // Transform bare assignments to const declarations\n // Foo = ... -> const Foo = ...\n source = transformBareAssignments(source)\n\n // Unified paren expression transformer\n // Handles: function params, arrow params, return types, safe/unsafe markers\n // Model: open paren can be ( or (? or (!, close can be ) or )-> or )-? or )-!\n const {\n source: transformedSource,\n returnType,\n returnSafety,\n } = transformParenExpressions(source, {\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n })\n source = transformedSource\n\n // NOTE: unsafe {} blocks removed - they provided no performance benefit because\n // the wrapper decision is made at transpile time. Use (!) on functions instead.\n // See ideas parking lot for potential future approaches.\n\n // Transform extend blocks: extend TypeName { methods } -> __ext_TypeName object\n // Must happen after paren expressions so method params are already transformed\n const extResult = transformExtendDeclarations(source)\n source = extResult.source\n\n // Handle try-without-catch: try { ... } (no catch/finally) -> monadic error handling\n // This is the idiomatic TJS way to convert exceptions to AgentError\n source = transformTryWithoutCatch(source)\n\n // Transform polymorphic functions: multiple declarations with same name -> dispatcher\n // Must happen after param transformation but before class wrapping and test extraction\n const polyResult = transformPolymorphicFunctions(source, requiredParams)\n source = polyResult.source\n\n // Extract WASM blocks: wasm(args) { ... } fallback { ... }\n const wasmBlocks = extractWasmBlocks(source)\n source = wasmBlocks.source\n\n // Extract and run test blocks: test 'desc'? { body }\n // Tests run at transpile time and are stripped from output\n const testResult = extractAndRunTests(source, options.dangerouslySkipTests)\n source = testResult.source\n\n // Transform polymorphic constructors: multiple constructor() -> factory functions\n // Must happen before wrapClassDeclarations (which needs to know about poly ctors)\n const polyCtorResult = transformPolymorphicConstructors(\n source,\n requiredParams\n )\n source = polyCtorResult.source\n\n // Mark $dispatch functions as unsafe (internal Proxy trap params, not user-facing)\n for (const cls of polyCtorResult.polyCtorClasses) {\n unsafeFunctions.add(`${cls}$dispatch`)\n }\n\n // Wrap class declarations to make them callable without `new`\n // Only when TjsClass mode is enabled\n // class Foo { } -> let Foo = class Foo { }; Foo = globalThis.__tjs?.wrapClass?.(Foo) ?? Foo;\n if (tjsModes.tjsClass) {\n source = wrapClassDeclarations(source, polyCtorResult.polyCtorClasses)\n }\n\n // Validate TjsDate mode - check for Date usage\n if (tjsModes.tjsDate) {\n source = validateNoDate(source)\n }\n\n // Validate TjsNoeval mode - check for eval/Function usage\n if (tjsModes.tjsNoeval) {\n source = validateNoEval(source)\n }\n\n // Validate TjsNoVar mode - check for var declarations\n if (tjsModes.tjsNoVar) {\n source = validateNoVar(source)\n }\n\n // Rewrite extension method calls on known-type receivers\n // Must happen after all other transforms so literals are in final form\n source = transformExtensionCalls(source, extResult.extensions)\n\n return {\n source,\n returnType,\n returnSafety,\n moduleSafety,\n tjsModes,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks: wasmBlocks.blocks,\n tests: testResult.tests,\n testErrors: testResult.errors,\n polymorphicNames: polyResult.polymorphicNames,\n extensions: extResult.extensions,\n }\n}\n\n/**\n * Parse source code into an Acorn AST\n */\nexport function parse(\n source: string,\n options: ParseOptions = {}\n): {\n ast: Program\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n moduleSafety?: 'none' | 'inputs' | 'all'\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n wasmBlocks: WasmBlock[]\n tests: TestBlock[]\n testErrors: string[]\n} {\n const {\n filename = '<source>',\n colonShorthand = true,\n vmTarget = false,\n } = options\n\n // Preprocess for custom syntax\n const {\n source: processedSource,\n returnType,\n returnSafety,\n moduleSafety,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks,\n tests,\n testErrors,\n } = colonShorthand\n ? preprocess(source, { vmTarget })\n : {\n source,\n returnType: undefined,\n returnSafety: undefined,\n moduleSafety: undefined,\n originalSource: source,\n requiredParams: new Set<string>(),\n unsafeFunctions: new Set<string>(),\n safeFunctions: new Set<string>(),\n wasmBlocks: [] as WasmBlock[],\n tests: [] as TestBlock[],\n testErrors: [] as string[],\n }\n\n try {\n const ast = acorn.parse(processedSource, {\n ecmaVersion: 2022,\n sourceType: 'module',\n locations: true,\n allowReturnOutsideFunction: false,\n })\n\n return {\n ast,\n returnType,\n returnSafety,\n moduleSafety,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks,\n tests,\n testErrors,\n }\n } catch (e: any) {\n // Convert Acorn error to our error type\n const loc = e.loc || { line: 1, column: 0 }\n throw new SyntaxError(\n e.message.replace(/\\s*\\(\\d+:\\d+\\)$/, ''), // Remove acorn's location suffix\n loc,\n originalSource,\n filename\n )\n }\n}\n\n/**\n * Validate that the source contains exactly one function declaration\n */\nexport function validateSingleFunction(\n ast: Program,\n filename?: string\n): FunctionDeclaration {\n // Check for unsupported top-level constructs FIRST\n // This gives better error messages for things like classes\n for (const node of ast.body) {\n if (node.type === 'ImportDeclaration') {\n throw new SyntaxError(\n 'Imports are not supported. All atoms must be registered with the VM.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (\n node.type === 'ExportNamedDeclaration' ||\n node.type === 'ExportDefaultDeclaration'\n ) {\n throw new SyntaxError(\n 'Exports are not supported. The function is automatically exported.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (node.type === 'ClassDeclaration') {\n throw new SyntaxError(\n 'Classes are not supported. Agent99 uses functional composition.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n }\n\n const functions = ast.body.filter(\n (node): node is FunctionDeclaration => node.type === 'FunctionDeclaration'\n )\n\n if (functions.length === 0) {\n throw new SyntaxError(\n 'Source must contain a function declaration',\n { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (functions.length > 1) {\n const second = functions[1]\n throw new SyntaxError(\n 'Only a single function per agent is allowed',\n second.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n return functions[0]\n}\n\n/**\n * Extract TDoc comment from before a function\n *\n * TJS doc comments use /\\*# ... \\*\\/ syntax and preserve full markdown content.\n * Legacy JSDoc (/\\*\\* ... \\*\\/) is supported as a fallback.\n */\nexport function extractTDoc(\n source: string,\n func: FunctionDeclaration\n): {\n description?: string\n params: Record<string, string>\n} {\n const result: { description?: string; params: Record<string, string> } = {\n params: {},\n }\n\n if (!func.loc) return result\n\n const beforeFunc = source.substring(0, func.start)\n\n // First, check for TJS doc comment: /*# ... */\n // This preserves full markdown content\n // Find the LAST /*# ... */ block and verify it immediately precedes the function\n // (only whitespace and line comments allowed between)\n const allDocBlocks = [...beforeFunc.matchAll(/\\/\\*#([\\s\\S]*?)\\*\\//g)]\n if (allDocBlocks.length > 0) {\n const lastBlock = allDocBlocks[allDocBlocks.length - 1]\n const afterBlock = beforeFunc.substring(\n lastBlock.index! + lastBlock[0].length\n )\n\n // Only attach if nothing but whitespace and line comments between doc and function\n if (/^(?:\\s|\\/\\/[^\\n]*)*$/.test(afterBlock)) {\n // Extract content, trim leading/trailing whitespace, preserve internal formatting\n let content = lastBlock[1]\n\n // Remove common leading whitespace (like dedent)\n const lines = content.split('\\n')\n // Find minimum indentation (ignoring empty lines)\n const minIndent = lines\n .filter((line) => line.trim().length > 0)\n .reduce((min, line) => {\n const indent = line.match(/^(\\s*)/)?.[1].length || 0\n return Math.min(min, indent)\n }, Infinity)\n\n // Remove that indentation from all lines\n if (minIndent > 0 && minIndent < Infinity) {\n content = lines.map((line) => line.slice(minIndent)).join('\\n')\n }\n\n result.description = content.trim()\n return result\n }\n }\n\n // Fall back to JSDoc: /** ... */\n const jsdocMatch = beforeFunc.match(/\\/\\*\\*[\\s\\S]*?\\*\\/\\s*$/)\n if (!jsdocMatch) return result\n\n const jsdoc = jsdocMatch[0]\n\n // Extract description (first non-tag content)\n const descMatch = jsdoc.match(/\\/\\*\\*\\s*\\n?\\s*\\*?\\s*([^@\\n][^\\n]*)/m)\n if (descMatch) {\n result.description = descMatch[1].trim()\n }\n\n // Extract @param tags\n const paramRegex = /@param\\s+(?:\\{[^}]+\\}\\s+)?(\\w+)\\s*-?\\s*(.*)/g\n let match\n while ((match = paramRegex.exec(jsdoc)) !== null) {\n result.params[match[1]] = match[2].trim()\n }\n\n return result\n}\n", "/**\n * Type definitions for the Agent99 JavaScript transpiler\n */\n\nimport type { Node } from 'acorn'\nimport type { SeqNode } from '../builder'\n\n// ============================================================================\n// Type System Types\n// ============================================================================\n\n/** Represents a type extracted from value patterns */\nexport interface TypeDescriptor {\n kind:\n | 'string'\n | 'number'\n | 'integer'\n | 'non-negative-integer'\n | 'boolean'\n | 'null'\n | 'undefined'\n | 'array'\n | 'object'\n | 'union'\n | 'any'\n nullable?: boolean\n /** For arrays: the element type */\n items?: TypeDescriptor\n /** For objects: the shape */\n shape?: Record<string, TypeDescriptor>\n /** For unions: the member types */\n members?: TypeDescriptor[]\n /** For destructured parameters: full parameter descriptors */\n destructuredParams?: Record<string, ParameterDescriptor>\n}\n\n/** Describes a function parameter */\nexport interface ParameterDescriptor {\n name: string\n type: TypeDescriptor\n required: boolean\n default?: any\n /** The example value used to infer the type (for autocomplete) */\n example?: any\n description?: string\n /** Source location for error reporting */\n loc?: { start: number; end: number }\n}\n\n/** Describes a function's complete signature */\nexport interface FunctionSignature {\n name: string\n description?: string\n parameters: Record<string, ParameterDescriptor>\n returns?: TypeDescriptor\n}\n\n// ============================================================================\n// Transpiler Options and Results\n// ============================================================================\n\n/** Options for the transpile function */\nexport interface TranspileOptions {\n /** Include source locations in output AST */\n sourceMaps?: boolean\n /** Atom registry for validation (optional) */\n atoms?: Record<string, { op: string }>\n /** Filename for error messages */\n filename?: string\n /** Whether to use strict type checking */\n strict?: boolean\n}\n\n/** Result of transpilation */\nexport interface TranspileResult {\n /** The Agent99 AST */\n ast: SeqNode\n /** The function signature with types */\n signature: FunctionSignature\n /** Source map (if enabled) */\n sourceMap?: SourceMap\n /** Warnings (non-fatal issues) */\n warnings: TranspileWarning[]\n}\n\n/** A non-fatal warning during transpilation */\nexport interface TranspileWarning {\n message: string\n line: number\n column: number\n source?: string\n}\n\n/** Source map for debugging */\nexport interface SourceMap {\n version: 3\n file: string\n sources: string[]\n mappings: string\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/** Base class for transpiler errors with source location */\nexport class TranspileError extends Error {\n line: number\n column: number\n source?: string\n filename?: string\n\n constructor(\n message: string,\n location: { line: number; column: number },\n source?: string,\n filename?: string\n ) {\n const loc = `${filename || '<source>'}:${location.line}:${location.column}`\n super(`${message} at ${loc}`)\n this.name = 'TranspileError'\n this.line = location.line\n this.column = location.column\n this.source = source\n this.filename = filename\n }\n}\n\n/** Syntax error during parsing */\nexport class SyntaxError extends TranspileError {\n constructor(\n message: string,\n location: { line: number; column: number },\n source?: string,\n filename?: string\n ) {\n super(message, location, source, filename)\n this.name = 'SyntaxError'\n }\n\n /**\n * Format the error with source context for better debugging\n * Shows the problematic line with a caret pointing to the error location\n */\n formatWithContext(contextLines = 2): string {\n if (!this.source) return this.message\n\n const lines = this.source.split('\\n')\n const errorLine = this.line - 1 // 0-indexed\n const startLine = Math.max(0, errorLine - contextLines)\n const endLine = Math.min(lines.length - 1, errorLine + contextLines)\n\n const output: string[] = []\n const lineNumWidth = String(endLine + 1).length\n\n // Add context before\n for (let i = startLine; i <= endLine; i++) {\n const lineNum = String(i + 1).padStart(lineNumWidth)\n const marker = i === errorLine ? '>' : ' '\n output.push(`${marker} ${lineNum} | ${lines[i]}`)\n\n // Add caret pointing to error column\n if (i === errorLine) {\n const caretPadding = ' '.repeat(lineNumWidth + 4 + this.column)\n output.push(`${caretPadding}^ ${this.message.split(' at ')[0]}`)\n }\n }\n\n return output.join('\\n')\n }\n}\n\n/** Type error during transpilation or runtime */\nexport class TypeError extends TranspileError {\n expected?: string\n received?: string\n suggestion?: string\n\n constructor(\n message: string,\n location: { line: number; column: number },\n options?: {\n expected?: string\n received?: string\n suggestion?: string\n source?: string\n filename?: string\n }\n ) {\n super(message, location, options?.source, options?.filename)\n this.name = 'TypeError'\n this.expected = options?.expected\n this.received = options?.received\n this.suggestion = options?.suggestion\n }\n}\n\n// ============================================================================\n// Transform Context\n// ============================================================================\n\n/** Context passed through the transformer */\nexport interface TransformContext {\n /** Current scope depth */\n depth: number\n /** Variables declared in current scope with their types */\n locals: Map<string, TypeDescriptor>\n /** Parent scope's context (for scope chain) */\n parent?: TransformContext\n /** Function parameters */\n parameters: Map<string, ParameterDescriptor>\n /** Registered atom names */\n atoms: Set<string>\n /** Accumulated warnings */\n warnings: TranspileWarning[]\n /** Source code for error messages */\n source: string\n /** Filename */\n filename: string\n /** Options */\n options: TranspileOptions\n}\n\n/** Create a child context for nested scopes */\nexport function createChildContext(parent: TransformContext): TransformContext {\n return {\n depth: parent.depth + 1,\n locals: new Map(),\n parent,\n parameters: parent.parameters,\n atoms: parent.atoms,\n warnings: parent.warnings,\n source: parent.source,\n filename: parent.filename,\n options: parent.options,\n }\n}\n\n/** Look up a variable in the scope chain */\nexport function lookupVariable(\n name: string,\n ctx: TransformContext\n): TypeDescriptor | undefined {\n // Check locals first\n if (ctx.locals.has(name)) {\n return ctx.locals.get(name)\n }\n // Check parameters\n if (ctx.parameters.has(name)) {\n return ctx.parameters.get(name)?.type\n }\n // Check parent scope\n if (ctx.parent) {\n return lookupVariable(name, ctx.parent)\n }\n return undefined\n}\n\n// ============================================================================\n// AST Node Helpers\n// ============================================================================\n\n/** Extract location from an Acorn node */\nexport function getLocation(node: Node): { line: number; column: number } {\n if (node.loc) {\n return { line: node.loc.start.line, column: node.loc.start.column }\n }\n return { line: 1, column: 0 }\n}\n", "/**\n * Parser parameter and annotation processing\n *\n * Handles the unified paren expression transformer that converts TJS syntax\n * (colon defaults, return type annotations, safe/unsafe markers) into valid JS.\n */\n\nimport { SyntaxError } from './types'\nimport type {\n TokenizerState,\n StructuralContext,\n ContextFrame,\n TjsModes,\n} from './parser-types'\n\nexport function transformParenExpressions(\n source: string,\n ctx: {\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n }\n): {\n source: string\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n} {\n let result = ''\n let i = 0\n let firstReturnType: string | undefined\n let firstReturnSafety: 'safe' | 'unsafe' | undefined\n\n // State machine for tokenizing\n let state: TokenizerState = 'normal'\n // Stack for template string interpolation depth (each entry is brace depth within that interpolation)\n const templateStack: number[] = []\n\n // Structural context tracking - know if we're in a class body, function body, etc.\n const contextStack: ContextFrame[] = [{ type: 'top-level', braceDepth: 0 }]\n let braceDepth = 0\n\n // Helper to get current structural context (reserved for future use)\n const _currentContext = (): StructuralContext =>\n contextStack[contextStack.length - 1]?.type || 'top-level'\n\n // Helper to check if we're directly in a class body (not nested in a function/block inside it)\n const isInClassBody = (): boolean => {\n const frame = contextStack[contextStack.length - 1]\n return frame?.type === 'class-body' && braceDepth === frame.braceDepth + 1\n }\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n // Handle state transitions based on current state\n switch (state) {\n case 'single-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === \"'\") {\n state = 'normal'\n }\n i++\n continue\n\n case 'double-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '\"') {\n state = 'normal'\n }\n i++\n continue\n\n case 'template-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n // Enter template expression\n result += nextChar\n i += 2\n templateStack.push(1) // Start with brace depth 1\n state = 'normal' // Back to normal parsing inside ${}\n continue\n }\n if (char === '`') {\n state = 'normal'\n }\n i++\n continue\n\n case 'line-comment':\n result += char\n if (char === '\\n') {\n state = 'normal'\n }\n i++\n continue\n\n case 'block-comment':\n result += char\n if (char === '*' && nextChar === '/') {\n result += nextChar\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'regex':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '[') {\n // Character class - read until ]\n i++\n while (i < source.length && source[i] !== ']') {\n result += source[i]\n if (source[i] === '\\\\' && i + 1 < source.length) {\n result += source[i + 1]\n i += 2\n } else {\n i++\n }\n }\n if (i < source.length) {\n result += source[i]\n i++\n }\n continue\n }\n if (char === '/') {\n // End of regex, consume flags\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) {\n result += source[i]\n i++\n }\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'normal':\n // Handle template stack - track braces inside template expressions\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n // Exiting template expression, back to template string\n templateStack.pop()\n result += char\n i++\n state = 'template-string'\n continue\n }\n }\n }\n\n // Check for string/comment/regex start\n if (char === \"'\") {\n result += char\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n result += char\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n result += char\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n result += char + nextChar\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n result += char + nextChar\n i += 2\n state = 'block-comment'\n continue\n }\n\n // Check for regex literal\n if (char === '/') {\n const before = result.trimEnd()\n const lastChar = before[before.length - 1]\n const isRegexContext =\n !lastChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]$/.test(before) ||\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)\\s*$/.test(\n before\n )\n if (isRegexContext) {\n result += char\n i++\n state = 'regex'\n continue\n }\n }\n\n // Now handle TJS-specific transformations in normal state\n break\n }\n\n // We're in normal state - look for TJS patterns\n\n // Track braces for structural context\n if (char === '{') {\n braceDepth++\n result += char\n i++\n continue\n }\n if (char === '}') {\n braceDepth--\n // Pop context if we're exiting it\n const frame = contextStack[contextStack.length - 1]\n if (frame && braceDepth === frame.braceDepth) {\n contextStack.pop()\n }\n result += char\n i++\n continue\n }\n\n // Look for class declarations: class Name { or class Name extends Base {\n const classMatch = source\n .slice(i)\n .match(/^class\\s+\\w+(?:\\s+extends\\s+\\w+)?\\s*\\{/)\n if (classMatch) {\n // Output everything up to but not including the {\n const classHeader = classMatch[0].slice(0, -1)\n result += classHeader\n i += classHeader.length\n // Push class-body context (will be entered when we see the {)\n contextStack.push({ type: 'class-body', braceDepth })\n continue\n }\n\n // Look for function declarations: function name( or function name (\n const funcMatch = source.slice(i).match(/^function\\s+(\\w+)\\s*\\(/)\n if (funcMatch) {\n const funcName = funcMatch[1]\n const matchLen = funcMatch[0].length\n\n // Check for safety marker right after opening paren: (? or (!\n const afterParen = source[i + matchLen]\n let safetyMarker: '?' | '!' | null = null\n let paramStart = i + matchLen\n\n if (afterParen === '?' || afterParen === '!') {\n safetyMarker = afterParen\n paramStart++\n if (safetyMarker === '!') {\n ctx.unsafeFunctions.add(funcName)\n } else {\n ctx.safeFunctions.add(funcName)\n }\n }\n\n result += `function ${funcName}(`\n i = paramStart\n\n // Find matching ) using balanced counting\n const paramsResult = extractBalancedContent(source, i, '(', ')')\n if (!paramsResult) {\n // Unbalanced - just copy character and continue\n result += source[i]\n i++\n continue\n }\n\n const { content: params, endPos } = paramsResult\n i = endPos\n\n // Process the params (transform : to = for required params, handle nested arrows)\n const processedParams = processParamString(params, ctx, true)\n result += processedParams + ')'\n\n // Check what follows the closing paren: return type annotation (:, :?, :!)\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n let safety: 'safe' | 'unsafe' | undefined\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n safety = colonMarker === ':?' ? 'safe' : 'unsafe'\n } else {\n j += 1\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n if (firstReturnType === undefined) {\n firstReturnType = typeResult.type\n if (safety) firstReturnSafety = safety\n }\n i = typeResult.endPos\n }\n }\n continue\n }\n\n // Look for class method syntax: constructor(, methodName(, get name(, set name(\n // These appear inside class bodies and need param transformation\n // Only match if we're actually in a class body (proper context tracking)\n // Must NOT match function calls in expressions (div(), span(), etc.)\n const methodMatch = source\n .slice(i)\n .match(/^(constructor|(?:get|set)\\s+\\w+|async\\s+\\w+|\\w+)\\s*\\(/)\n // Check that the preceding non-whitespace character indicates this is a\n // declaration, not a function call in an expression.\n // Method declarations follow: newline, {, ;, or start of file\n // Function calls follow: = => , [ ( . operators etc.\n const prevNonWs = (() => {\n for (let k = result.length - 1; k >= 0; k--) {\n if (!/\\s/.test(result[k])) return result[k]\n }\n return '\\n' // start of input\n })()\n // Method declarations can follow almost anything (property, }, ;, etc.)\n // Function CALLS in expressions specifically follow: = => , [ (\n const isMethodDecl =\n prevNonWs !== '=' &&\n prevNonWs !== ',' &&\n prevNonWs !== '(' &&\n prevNonWs !== '[' &&\n prevNonWs !== '>' // catches =>\n if (methodMatch && isInClassBody() && !isMethodDecl) {\n // Not a method declaration (it's a function call in an expression).\n // Skip past the identifier to prevent re-matching a suffix\n // (e.g. 'div(' \u2192 skip 'div', don't let 'iv(' match next).\n const skipLen = methodMatch[1].length\n result += source.slice(i, i + skipLen)\n i += skipLen\n continue\n }\n if (methodMatch && isInClassBody() && isMethodDecl) {\n // We're actually in a class body - this is a method definition\n const methodPart = methodMatch[1]\n const matchLen = methodMatch[0].length\n const paramStart = i + matchLen\n\n result += methodPart + '('\n i = paramStart\n\n // Find matching )\n const paramsResult = extractBalancedContent(source, i, '(', ')')\n if (!paramsResult) {\n result += source[i]\n i++\n continue\n }\n\n const { content: params, endPos } = paramsResult\n i = endPos\n\n // Process the params (transform : to = for TJS types)\n const processedParams = processParamString(params, ctx, true)\n result += processedParams + ')'\n\n // Check for return type annotation: ): type, ):! type, ):? type\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n } else {\n j++\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n i = typeResult.endPos\n }\n }\n\n continue\n }\n\n // Look for arrow function params: (params) =>\n // We need to be careful to only transform when followed by =>\n if (source[i] === '(') {\n // First, find the matching ) without consuming any safety marker\n // We'll check for safety marker only if this is actually an arrow function\n const fullParamsResult = extractBalancedContent(source, i + 1, '(', ')')\n if (!fullParamsResult) {\n result += source[i]\n i++\n continue\n }\n\n const fullContent = fullParamsResult.content\n const endPos = fullParamsResult.endPos\n\n // Check what follows: whitespace then => (arrow function) or -> (return type on arrow)\n let j = endPos\n while (j < source.length && /\\s/.test(source[j])) j++\n\n // Check for return type annotation on arrow function: ): type =>\n let arrowReturnType: string | undefined\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n } else {\n j++\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n arrowReturnType = typeResult.type\n j = typeResult.endPos\n while (j < source.length && /\\s/.test(source[j])) j++\n }\n }\n\n if (source.slice(j, j + 2) === '=>') {\n // This IS an arrow function - now check for safety marker\n let safetyMarker: '?' | '!' | null = null\n let params = fullContent\n\n // Check if content starts with safety marker (? or !) followed by whitespace\n const trimmedContent = fullContent.trimStart()\n if (\n trimmedContent.startsWith('?') &&\n (trimmedContent.length === 1 || /\\s/.test(trimmedContent[1]))\n ) {\n safetyMarker = '?'\n params = trimmedContent.slice(1)\n } else if (\n trimmedContent.startsWith('!') &&\n (trimmedContent.length === 1 || /\\s/.test(trimmedContent[1]))\n ) {\n safetyMarker = '!'\n params = trimmedContent.slice(1)\n }\n\n // Process the params\n const processedParams = processParamString(params, ctx, false)\n // Add safety marker as comment for arrow functions (since we can't track them by name)\n const safetyComment =\n safetyMarker === '?'\n ? '/* safe */ '\n : safetyMarker === '!'\n ? '/* unsafe */ '\n : ''\n result += `(${safetyComment}${processedParams})`\n // Skip the return type annotation (we extracted it but don't emit it)\n i = endPos\n // Skip to just before the =>\n while (i < j && /\\s/.test(source[i])) {\n result += source[i]\n i++\n }\n // If there was a return type, we need to skip past it to =>\n if (arrowReturnType) {\n i = j\n }\n } else {\n // Not an arrow function - recursively transform the content for nested arrows\n // but don't process as param declarations (no colon-to-equals transform)\n const transformed = transformParenExpressions(fullContent, ctx)\n result += `(${transformed.source})`\n i = endPos\n }\n continue\n }\n\n result += source[i]\n i++\n }\n\n return {\n source: result,\n returnType: firstReturnType,\n returnSafety: firstReturnSafety,\n }\n}\n\n/**\n * Extract balanced content between delimiters\n * @param source The source string\n * @param start Position after the opening delimiter\n * @param open Opening delimiter character (for depth counting of nested structures)\n * @param close Closing delimiter character\n * @returns The content between delimiters and position after closing delimiter, or null if unbalanced\n */\nfunction extractBalancedContent(\n source: string,\n start: number,\n open: string,\n close: string\n): { content: string; endPos: number } | null {\n let depth = 1\n let i = start\n let inString = false\n let stringChar = ''\n\n while (i < source.length && depth > 0) {\n const char = source[i]\n\n // Handle string literals\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n } else if (inString && char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n } else if (!inString) {\n if (char === open) depth++\n else if (char === close) depth--\n }\n i++\n }\n\n if (depth !== 0) return null\n\n return {\n content: source.slice(start, i - 1),\n endPos: i,\n }\n}\n\n/**\n * Extract a JS value starting at a position in source.\n * Handles nested objects {}, arrays [], strings, numbers, booleans, null.\n * Uses state machine to properly track nesting.\n */\nexport function extractJSValue(\n source: string,\n start: number\n): { value: string; endPos: number } | null {\n let i = start\n\n // Skip leading whitespace\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i >= source.length) return null\n\n const valueStart = i\n const firstChar = source[i]\n\n // Handle objects and arrays with balanced parsing\n if (firstChar === '{' || firstChar === '[') {\n const close = firstChar === '{' ? '}' : ']'\n const result = extractBalancedContent(source, i + 1, firstChar, close)\n if (!result) return null\n return {\n value: source.slice(valueStart, result.endPos),\n endPos: result.endPos,\n }\n }\n\n // Handle strings\n if (firstChar === \"'\" || firstChar === '\"' || firstChar === '`') {\n i++\n while (i < source.length) {\n if (source[i] === firstChar && source[i - 1] !== '\\\\') {\n i++\n return { value: source.slice(valueStart, i), endPos: i }\n }\n i++\n }\n return null // Unterminated string\n }\n\n // Handle numbers (including negative and decimals)\n if (/[-+\\d]/.test(firstChar)) {\n while (i < source.length && /[\\d.eE+-]/.test(source[i])) i++\n return { value: source.slice(valueStart, i), endPos: i }\n }\n\n // Handle keywords: true, false, null, undefined\n const keywordMatch = source.slice(i).match(/^(true|false|null|undefined)\\b/)\n if (keywordMatch) {\n return {\n value: keywordMatch[1],\n endPos: i + keywordMatch[1].length,\n }\n }\n\n return null\n}\n\n/**\n * Normalize union syntax in type strings\n * Converts single | to || for TJS consistency (needed for JS parsing)\n */\nfunction normalizeUnionSyntax(type: string): string {\n // Replace single | (not ||) with || for proper JS parsing\n // Use negative lookbehind and lookahead to avoid matching ||\n return type.replace(/(?<!\\|)\\|(?!\\|)/g, ' || ')\n}\n\n/**\n * Extract a return type value starting at the given position\n * Handles: simple types ('', 0, null), objects ({ }), arrays ([ ]), unions (| or ||)\n */\nfunction extractReturnTypeValue(\n source: string,\n start: number\n): { type: string; endPos: number } | null {\n let i = start\n let depth = 0\n let inString = false\n let stringChar = ''\n let sawContent = false\n\n // Helper to create result with normalized type\n const makeResult = (endPos: number) => ({\n type: normalizeUnionSyntax(source.slice(start, endPos).trim()),\n endPos,\n })\n\n while (i < source.length) {\n const char = source[i]\n\n // Handle string literals\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n sawContent = true\n i++\n continue\n }\n if (inString) {\n if (char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n i++ // Move past closing quote\n // Just finished a string at depth 0\n if (depth === 0) {\n // Check if next non-ws is function body { or union |\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n if (source[j] === '{') {\n // Check if it's object type or function body\n const afterBrace = source.slice(j + 1).match(/^\\s*(\\w+)\\s*:/)\n if (!afterBrace) {\n // Function body - type ends here\n return makeResult(i)\n }\n }\n if (source[j] !== '|' && source[j] !== '&') {\n // No union - type ends here\n return makeResult(i)\n }\n }\n continue\n }\n i++\n continue\n }\n\n // Track bracket depth\n if (char === '{' || char === '[' || char === '(') {\n depth++\n sawContent = true\n i++\n continue\n }\n if (char === '}' || char === ']' || char === ')') {\n depth--\n if (depth === 0) {\n i++\n // Check for union after closing bracket\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n if (source[j] === '|' || source[j] === '&') {\n continue // More type content\n }\n return makeResult(i)\n }\n i++\n continue\n }\n\n // At depth 0, check for function body\n if (depth === 0 && char === '{') {\n if (sawContent) {\n return makeResult(i)\n }\n // First { - check if object type or function body\n const afterBrace = source.slice(i + 1).match(/^\\s*(\\w+)\\s*:/)\n if (afterBrace) {\n depth++\n sawContent = true\n i++\n continue\n }\n return makeResult(i)\n }\n\n // Handle union/intersection at depth 0\n if (depth === 0 && (char === '|' || char === '&')) {\n i++\n if (i < source.length && source[i] === '|') i++ // Skip second | for ||\n while (i < source.length && /\\s/.test(source[i])) i++\n continue\n }\n\n // Handle numbers (including decimals like 14.5, -3.14)\n if (\n depth === 0 &&\n (/\\d/.test(char) || (char === '-' && /\\d/.test(source[i + 1])))\n ) {\n let j = i\n if (source[j] === '-') j++ // Skip negative sign\n while (j < source.length && /\\d/.test(source[j])) j++\n // Handle decimal part\n if (j < source.length && source[j] === '.' && /\\d/.test(source[j + 1])) {\n j++ // Skip decimal point\n while (j < source.length && /\\d/.test(source[j])) j++\n }\n // Handle exponent (1e10, 1.5e-3)\n if (j < source.length && (source[j] === 'e' || source[j] === 'E')) {\n j++\n if (j < source.length && (source[j] === '+' || source[j] === '-')) j++\n while (j < source.length && /\\d/.test(source[j])) j++\n }\n sawContent = true\n i = j\n // Check what's next\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i < source.length && source[i] === '{') {\n // Function body - type ends here\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n if (source[i] !== '|' && source[i] !== '&') {\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n continue\n }\n\n // Handle identifiers (null, undefined, true, false, type names)\n if (depth === 0 && /[a-zA-Z_]/.test(char)) {\n let j = i\n while (j < source.length && /\\w/.test(source[j])) j++\n sawContent = true\n i = j\n // Check what's next\n while (i < source.length && /\\s/.test(source[i])) i++\n\n // Identifier followed by ( \u2014 constructor/function call as return type\n // e.g. FunctionPredicate('function', { params: ... })\n if (i < source.length && source[i] === '(') {\n depth++\n i++\n continue\n }\n\n if (i < source.length && source[i] === '{') {\n // Check if function body\n const afterBrace = source.slice(i + 1).match(/^\\s*(\\w+)\\s*:/)\n if (!afterBrace) {\n // Function body - type ends before whitespace\n let typeEnd = j\n while (typeEnd > start && /\\s/.test(source[typeEnd - 1])) typeEnd--\n return {\n type: normalizeUnionSyntax(source.slice(start, typeEnd).trim()),\n endPos: j,\n }\n }\n }\n if (source[i] !== '|' && source[i] !== '&') {\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n continue\n }\n\n i++\n }\n\n // Reached end of source\n if (sawContent) {\n return makeResult(i)\n }\n return null\n}\n\n/**\n * Split parameter string respecting nested braces/brackets\n */\nfunction splitParameters(params: string): string[] {\n const result: string[] = []\n let current = ''\n let depth = 0\n let inLineComment = false\n let inBlockComment = false\n let i = 0\n\n while (i < params.length) {\n const char = params[i]\n const nextChar = params[i + 1]\n\n // Handle line comments - preserve them in output\n if (!inBlockComment && char === '/' && nextChar === '/') {\n inLineComment = true\n current += '//'\n i += 2\n continue\n }\n\n // Handle block comments - preserve them in output\n if (!inLineComment && char === '/' && nextChar === '*') {\n inBlockComment = true\n current += '/*'\n i += 2\n continue\n }\n\n // End of line comment\n if (inLineComment && char === '\\n') {\n inLineComment = false\n current += char\n i++\n continue\n }\n\n // End of block comment - preserve closing\n if (inBlockComment && char === '*' && nextChar === '/') {\n inBlockComment = false\n current += '*/'\n i += 2\n continue\n }\n\n // Inside comments - preserve the content\n if (inLineComment || inBlockComment) {\n current += char\n i++\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n current += char\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n current += char\n } else if (char === ',' && depth === 0) {\n result.push(current)\n current = ''\n } else {\n current += char\n }\n i++\n }\n\n if (current.trim()) {\n result.push(current)\n }\n\n return result\n}\n\n/**\n * Process a parameter string, transforming : to = for required params\n * and recursively handling nested arrow functions\n */\nfunction processParamString(\n params: string,\n ctx: {\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n },\n trackRequired: boolean\n): string {\n // First recursively process any nested arrow functions\n const withArrows = transformParenExpressions(params, {\n originalSource: params,\n requiredParams: ctx.requiredParams,\n unsafeFunctions: ctx.unsafeFunctions,\n safeFunctions: ctx.safeFunctions,\n }).source\n\n // Now split and process each parameter\n const paramList = splitParameters(withArrows)\n let sawOptional = false\n const seenNames = new Set<string>()\n\n // Helper to check for duplicate names\n const checkDuplicate = (name: string) => {\n if (trackRequired && /^\\w+$/.test(name)) {\n if (seenNames.has(name)) {\n throw new Error(`Duplicate parameter name '${name}'`)\n }\n seenNames.add(name)\n }\n }\n\n const processed = paramList.map((param) => {\n const trimmed = param.trim()\n if (!trimmed) return param\n\n // Handle destructured object parameters: { name: 'Clara', age = 30 }\n // Transform colons to equals inside the braces (recursive)\n // Order doesn't matter for objects, so don't enforce required-before-optional\n // ONLY do this when trackRequired is true - i.e., actual function parameters\n if (trackRequired && trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const inner = trimmed.slice(1, -1)\n const processedInner = processDestructuredObjectParams(inner, ctx)\n return `{ ${processedInner} }`\n }\n\n // Handle destructured array parameters: [first: '', second: 0]\n // ONLY do this when trackRequired is true - i.e., actual function parameters\n if (trackRequired && trimmed.startsWith('[') && trimmed.endsWith(']')) {\n const inner = trimmed.slice(1, -1)\n const processedInner = processDestructuredObjectParams(inner, ctx)\n return `[ ${processedInner} ]`\n }\n\n // Handle rest parameters: ...args: [0] -> ...args (strip type, JS forbids defaults on rest)\n // The type annotation is still captured by extractFunctionTypeInfo for __tjs metadata\n if (trimmed.startsWith('...')) {\n const restColonPos = findTopLevelColon(trimmed)\n if (restColonPos !== -1) {\n const restName = trimmed.slice(0, restColonPos).trim()\n return restName\n }\n return param\n }\n\n // Handle optional param syntax: x?: type -> x = type (not required)\n const optionalMatch = trimmed.match(/^(\\w+)\\s*\\?\\s*:\\s*(.+)$/)\n if (optionalMatch) {\n const [, name, type] = optionalMatch\n checkDuplicate(name)\n sawOptional = true\n // Optional params are NOT tracked as required\n return `${name} = ${type}`\n }\n\n // Check if param already has a default value (x = value)\n if (!hasColonNotEquals(trimmed)) {\n // Has equals sign (default value) - this is optional\n // Extract name from \"name = value\" pattern\n const eqMatch = trimmed.match(/^(\\w+)\\s*=/)\n if (eqMatch) {\n checkDuplicate(eqMatch[1])\n }\n sawOptional = true\n return param\n }\n\n // Handle required param syntax: x: type -> x = type (tracked as required)\n const colonPos = findTopLevelColon(trimmed)\n if (colonPos !== -1) {\n const name = trimmed.slice(0, colonPos).trim()\n const type = trimmed.slice(colonPos + 1).trim()\n\n checkDuplicate(name)\n\n // Required param after optional \u2014 warn but allow.\n // TypeScript permits this, and the TS\u2192TJS converter can produce it\n // when earlier params degrade to 'any' (bare name, no : or =).\n if (sawOptional && trackRequired && /^\\w+$/.test(name)) {\n // Allow it \u2014 JavaScript handles this fine (caller passes undefined)\n }\n\n if (trackRequired && /^\\w+$/.test(name)) {\n ctx.requiredParams.add(name)\n }\n return `${name} = ${type}`\n }\n\n return param\n })\n\n return processed.join(',')\n}\n\n/**\n * Process destructured object/array parameters\n *\n * In TJS destructuring patterns:\n * - `name: 'Clara'` means required param with example (transforms to `name = 'Clara'`)\n * - `age = 30` means optional param with default (stays as `age = 30`)\n * - Nested objects like `address: { street: '9 High St', zip = '0000' }` are tricky:\n * the inner object is a value (object literal), not a pattern, so we transform it back\n *\n * Key insight: In destructuring, `foo: value` at top level is a required param,\n * but at nested levels within an object value, `:` is normal object literal syntax.\n *\n * Order does NOT matter in objects (unlike positional function params).\n */\nfunction processDestructuredObjectParams(\n inner: string,\n ctx: {\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n }\n): string {\n // Split on commas at the top level (respecting nested braces)\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Check for nested destructured object: name: { ... }\n // The inner { ... } is an object literal value, not a destructuring pattern\n const nestedObjectMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjectMatch) {\n const [, name, objectLiteral] = nestedObjectMatch\n ctx.requiredParams.add(name)\n // Process the inner object as an object literal (transform = to : for values)\n const processedLiteral = processObjectLiteralValue(objectLiteral)\n return `${name} = ${processedLiteral}`\n }\n\n // Check for nested destructured array: name: [ ... ]\n const nestedArrayMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrayMatch) {\n const [, name, arrayLiteral] = nestedArrayMatch\n ctx.requiredParams.add(name)\n // Process the inner array as an array literal\n const processedLiteral = processArrayLiteralValue(arrayLiteral)\n return `${name} = ${processedLiteral}`\n }\n\n // Handle simple colon syntax: name: 'value' -> name = 'value' (required)\n const colonMatch = trimmed.match(/^(\\w+)\\s*:\\s*([\\s\\S]+)$/)\n if (colonMatch) {\n const [, name, value] = colonMatch\n ctx.requiredParams.add(name)\n return `${name} = ${value}`\n }\n\n // Handle equals syntax: name = value (optional, already valid JS)\n // Just preserve it as-is\n return part\n })\n\n return processed.join(', ')\n}\n\n/**\n * Process an object literal value (nested inside destructuring)\n *\n * In object literals, TJS allows `=` for optional values:\n * { street: '9 High St', zip = '0000' }\n *\n * This must become valid JS object literal syntax:\n * { street: '9 High St', zip: '0000' }\n *\n * (The `=` is TJS shorthand indicating the value is optional/has default,\n * but in an object literal context it must use `:`)\n */\nfunction processObjectLiteralValue(literal: string): string {\n // Remove outer braces, process content, restore braces\n const inner = literal.slice(1, -1).trim()\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Handle nested objects: key: { ... } or key = { ... }\n const nestedObjColonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjColonMatch) {\n const [, key, nested] = nestedObjColonMatch\n return `${key}: ${processObjectLiteralValue(nested)}`\n }\n const nestedObjEqualsMatch = trimmed.match(/^(\\w+)\\s*=\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjEqualsMatch) {\n const [, key, nested] = nestedObjEqualsMatch\n return `${key}: ${processObjectLiteralValue(nested)}`\n }\n\n // Handle nested arrays: key: [ ... ] or key = [ ... ]\n const nestedArrColonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrColonMatch) {\n const [, key, nested] = nestedArrColonMatch\n return `${key}: ${processArrayLiteralValue(nested)}`\n }\n const nestedArrEqualsMatch = trimmed.match(/^(\\w+)\\s*=\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrEqualsMatch) {\n const [, key, nested] = nestedArrEqualsMatch\n return `${key}: ${processArrayLiteralValue(nested)}`\n }\n\n // Transform equals to colon for simple values: key = value -> key: value\n const equalsMatch = trimmed.match(/^(\\w+)\\s*=\\s*([\\s\\S]+)$/)\n if (equalsMatch) {\n const [, key, value] = equalsMatch\n return `${key}: ${value}`\n }\n\n // Colon syntax is already valid: key: value\n return part\n })\n\n return `{ ${processed.join(', ')} }`\n}\n\n/**\n * Process an array literal value (nested inside destructuring)\n * Similar to processObjectLiteralValue but for arrays\n */\nfunction processArrayLiteralValue(literal: string): string {\n // Remove outer brackets, process content, restore brackets\n const inner = literal.slice(1, -1).trim()\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Handle nested objects\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n return processObjectLiteralValue(trimmed)\n }\n\n // Handle nested arrays\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n return processArrayLiteralValue(trimmed)\n }\n\n // Array elements are just values, no transformation needed\n return part\n })\n\n return `[ ${processed.join(', ')} ]`\n}\n\n/**\n * Check if param has a top-level colon but no top-level equals\n * This distinguishes x: type from x = type and handles nested structures\n */\nfunction hasColonNotEquals(param: string): boolean {\n let depth = 0\n let hasColon = false\n let hasEquals = false\n let inString = false\n let stringChar = ''\n\n for (let i = 0; i < param.length; i++) {\n const char = param[i]\n\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n continue\n }\n if (inString) {\n if (char === stringChar && param[i - 1] !== '\\\\') inString = false\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n } else if (depth === 0) {\n if (char === ':') hasColon = true\n if (char === '=' && param[i + 1] !== '>') hasEquals = true // Ignore =>\n }\n }\n\n return hasColon && !hasEquals\n}\n\n/**\n * Find the position of the first top-level colon in a param\n */\nfunction findTopLevelColon(param: string): number {\n let depth = 0\n let inString = false\n let stringChar = ''\n\n for (let i = 0; i < param.length; i++) {\n const char = param[i]\n\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n continue\n }\n if (inString) {\n if (char === stringChar && param[i - 1] !== '\\\\') inString = false\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n } else if (depth === 0 && char === ':') {\n return i\n }\n }\n\n return -1\n}\n\n/**\n * Preprocess source to handle custom syntax extensions\n *\n * Transforms:\n * function foo(x: 'example') { }\n * Into:\n * function foo(x = 'example') { }\n * And tracks that 'x' is a required parameter.\n *\n * Also handles return type annotation:\n * function foo(x: 'example') -> { result: 'string' } { }\n */\n", "/**\n * Parser source transforms\n *\n * All source-to-source text transforms used by the preprocess pipeline.\n * These operate on raw source strings before Acorn parsing.\n */\n\nimport { SyntaxError } from './types'\n\n/**\n * Extract a brace-balanced value from source after a regex match.\n * Returns a match-like object with [1] being the balanced { ... } content,\n * or null if no match. Handles nested braces.\n */\nfunction extractBalancedValue(\n source: string,\n startRe: RegExp\n): RegExpMatchArray | null {\n const m = source.match(startRe)\n if (!m) return null\n\n const braceStart = m.index! + m[0].length - 1 // position of opening {\n let depth = 1\n let j = braceStart + 1\n while (j < source.length && depth > 0) {\n if (source[j] === '{') depth++\n else if (source[j] === '}') depth--\n j++\n }\n if (depth !== 0) return null\n\n const balanced = source.slice(braceStart, j) // includes { and }\n const result = [m[0].slice(0, -1) + balanced, balanced] as RegExpMatchArray\n result.index = m.index\n return result\n}\nimport type {\n WasmBlock,\n TestBlock,\n ExtensionInfo,\n PolyVariant,\n TokenizerState,\n} from './parser-types'\nimport { extractJSValue } from './parser-params'\n\nexport function transformTryWithoutCatch(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'try' keyword followed by '{'\n const tryMatch = source.slice(i).match(/^\\btry\\s*\\{/)\n if (tryMatch) {\n // Found 'try {', now find the matching closing brace\n const startBrace = i + tryMatch[0].length - 1\n const bodyStart = startBrace + 1\n let depth = 1\n let j = bodyStart\n\n while (j < source.length && depth > 0) {\n const char = source[j]\n if (char === '{') depth++\n else if (char === '}') depth--\n j++\n }\n\n if (depth !== 0) {\n // Unbalanced braces, let the parser handle the error\n result += source[i]\n i++\n continue\n }\n\n // Check what comes after the closing brace\n const afterTry = source.slice(j).match(/^\\s*(catch|finally)\\b/)\n\n if (afterTry) {\n // Has catch or finally - leave it alone, copy the try block as-is\n result += source.slice(i, j)\n i = j\n } else {\n // No catch or finally - add monadic error handler\n // Returns MonadicError to maintain monadic flow (propagates through function chains)\n const body = source.slice(bodyStart, j - 1)\n result += `try {${body}} catch (__try_err) { return new (__tjs?.MonadicError ?? Error)(__try_err?.message || String(__try_err), 'try', undefined, undefined, __tjs?.getStack?.()) }`\n i = j\n }\n } else {\n result += source[i]\n i++\n }\n }\n\n return result\n}\n\n/**\n * Extract WASM blocks from source and replace with runtime dispatch code\n *\n * Simple form (body used as both WASM source and JS fallback):\n * wasm {\n * for (let i = 0; i < arr.length; i++) { arr[i] *= 2 }\n * }\n *\n * With explicit fallback (when you need different JS code):\n * wasm {\n * // WASM-optimized version\n * } fallback {\n * // Different JS implementation\n * }\n *\n * Output:\n * (globalThis.__tjs_wasm_0\n * ? globalThis.__tjs_wasm_0(captures...)\n * : (() => { body })())\n *\n * Variables are auto-captured from the body.\n */\nexport function extractWasmBlocks(source: string): {\n source: string\n blocks: WasmBlock[]\n} {\n const blocks: WasmBlock[] = []\n let result = ''\n let i = 0\n let blockId = 0\n\n while (i < source.length) {\n // Look for 'wasm {' or 'wasm{' - simple block without params\n const wasmMatch = source.slice(i).match(/^\\bwasm\\s*\\{/)\n if (wasmMatch) {\n const matchStart = i\n\n // Find the body\n const bodyStart = i + wasmMatch[0].length\n let braceDepth = 1\n let j = bodyStart\n\n while (j < source.length && braceDepth > 0) {\n const char = source[j]\n if (char === '{') braceDepth++\n else if (char === '}') braceDepth--\n j++\n }\n\n if (braceDepth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const body = source.slice(bodyStart, j - 1)\n let fallbackBody: string | undefined\n let matchEnd = j\n\n // Check for optional 'fallback {' block\n const fallbackMatch = source.slice(j).match(/^\\s*fallback\\s*\\{/)\n if (fallbackMatch) {\n const fallbackStart = j + fallbackMatch[0].length\n braceDepth = 1\n let k = fallbackStart\n\n while (k < source.length && braceDepth > 0) {\n const char = source[k]\n if (char === '{') braceDepth++\n else if (char === '}') braceDepth--\n k++\n }\n\n if (braceDepth === 0) {\n fallbackBody = source.slice(fallbackStart, k - 1)\n matchEnd = k\n }\n }\n\n // Auto-detect captured variables from the body\n const captureNames = detectCaptures(body)\n\n // Try to find type annotations from enclosing function parameters\n // Look backwards from matchStart to find the function signature\n const captures = captureNames.map((name) => {\n const typeAnnotation = findParameterType(source, matchStart, name)\n return typeAnnotation ? `${name}: ${typeAnnotation}` : name\n })\n\n // Create the block record\n const block: WasmBlock = {\n id: `__tjs_wasm_${blockId}`,\n body,\n fallback: fallbackBody,\n captures,\n start: matchStart,\n end: matchEnd,\n }\n blocks.push(block)\n\n // Generate runtime dispatch code:\n // The fallback is the body itself (or explicit fallback if provided)\n const fallbackCode = fallbackBody ?? body\n // Strip type annotations from captures for runtime args (e.g., \"xs: Float32Array\" -> \"xs\")\n const captureArgNames = captures.map((c) => c.split(':')[0].trim())\n const captureArgs =\n captureArgNames.length > 0 ? captureArgNames.join(', ') : ''\n\n // For WASM: pass captures as arguments\n // For fallback: just run inline (captures are in scope)\n const wasmCall =\n captureArgNames.length > 0\n ? `globalThis.${block.id}(${captureArgs})`\n : `globalThis.${block.id}()`\n\n const dispatch = `(globalThis.${block.id} ? ${wasmCall} : (() => {${fallbackCode}})())`\n\n result += dispatch\n i = matchEnd\n blockId++\n } else {\n result += source[i]\n i++\n }\n }\n\n return { source: result, blocks }\n}\n\n/** Check if an identifier is a WASM SIMD intrinsic (not a captured variable) */\nfunction isWasmIntrinsic(name: string): boolean {\n return name.startsWith('f32x4_') || name.startsWith('v128_')\n}\n\n/**\n * Detect variables captured from enclosing scope\n *\n * Finds identifiers that are:\n * - Used in the body\n * - Not declared within the body (let, const, var, function params)\n *\n * This is a simple heuristic - a full implementation would use proper AST analysis\n */\nfunction detectCaptures(body: string): string[] {\n // Strip comments first to avoid extracting words from comments\n const bodyWithoutComments = body\n .replace(/\\/\\/[^\\n]*/g, '') // line comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // block comments\n\n // Collect identifiers that appear as property accesses (after a dot)\n const propertyOnly = new Set<string>()\n const propPattern = /\\.([a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g\n let match\n while ((match = propPattern.exec(bodyWithoutComments)) !== null) {\n propertyOnly.add(match[1])\n }\n\n // Find all identifiers used in the body (not after a dot)\n const identifierPattern = /(?<!\\.)(\\b[a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g\n const allIdentifiers = new Set<string>()\n while ((match = identifierPattern.exec(bodyWithoutComments)) !== null) {\n allIdentifiers.add(match[1])\n }\n\n // Remove identifiers that ONLY appear as property accesses\n for (const prop of propertyOnly) {\n if (!allIdentifiers.has(prop)) continue\n // Check if this identifier is also used standalone (not just as .prop)\n const standalonePattern = new RegExp(`(?<!\\\\.)\\\\b${prop}\\\\b`, 'g')\n const dotPattern = new RegExp(`\\\\.${prop}\\\\b`, 'g')\n const standaloneMatches =\n bodyWithoutComments.match(standalonePattern)?.length || 0\n const dotMatches = bodyWithoutComments.match(dotPattern)?.length || 0\n // If every occurrence is a property access, remove it\n if (standaloneMatches <= dotMatches) {\n allIdentifiers.delete(prop)\n }\n }\n\n // Find identifiers declared in the body\n const declared = new Set<string>()\n\n // let/const/var declarations\n const declPattern = /\\b(?:let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g\n while ((match = declPattern.exec(bodyWithoutComments)) !== null) {\n declared.add(match[1])\n }\n\n // for loop variables: for (let i = ...)\n const forPattern =\n /\\bfor\\s*\\(\\s*(?:let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g\n while ((match = forPattern.exec(bodyWithoutComments)) !== null) {\n declared.add(match[1])\n }\n\n // function declarations and parameters would go here for full impl\n\n // JS keywords and builtins to exclude\n const reserved = new Set([\n 'if',\n 'else',\n 'for',\n 'while',\n 'do',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'return',\n 'function',\n 'let',\n 'const',\n 'var',\n 'new',\n 'this',\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'typeof',\n 'instanceof',\n 'in',\n 'of',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'async',\n 'await',\n 'class',\n 'extends',\n 'super',\n 'import',\n 'export',\n 'default',\n 'from',\n 'as',\n 'static',\n 'get',\n 'set',\n 'yield',\n // Common globals\n 'console',\n 'Math',\n 'Array',\n 'Object',\n 'String',\n 'Number',\n 'Boolean',\n 'Date',\n 'JSON',\n 'Promise',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Float32Array',\n 'Float64Array',\n 'Int8Array',\n 'Int16Array',\n 'Int32Array',\n 'Uint8Array',\n 'Uint16Array',\n 'Uint32Array',\n 'BigInt64Array',\n 'BigUint64Array',\n 'ArrayBuffer',\n 'DataView',\n 'Error',\n 'TypeError',\n 'RangeError',\n 'length',\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'slice',\n 'splice',\n 'map',\n 'filter',\n 'reduce',\n 'forEach',\n 'find',\n 'findIndex',\n 'indexOf',\n 'includes',\n 'globalThis',\n 'window',\n 'document',\n 'Infinity',\n 'NaN',\n 'isNaN',\n 'isFinite',\n 'parseInt',\n 'parseFloat',\n 'encodeURI',\n 'decodeURI',\n 'eval',\n 'wasmBuffer',\n ])\n\n // Return identifiers that are used but not declared or reserved\n const captures: string[] = []\n for (const id of allIdentifiers) {\n if (!declared.has(id) && !reserved.has(id) && !isWasmIntrinsic(id)) {\n captures.push(id)\n }\n }\n\n return captures.sort()\n}\n\n/**\n * Find the type annotation for a parameter in the enclosing function\n *\n * Looks backwards from wasmBlockStart to find the function signature,\n * then extracts the type annotation for the given parameter name.\n *\n * Supports:\n * - TJS colon syntax: `param: Float32Array`\n * - TypeScript syntax: `param: Float32Array`\n */\nfunction findParameterType(\n source: string,\n wasmBlockStart: number,\n paramName: string\n): string | undefined {\n // Look backwards to find the function signature\n // Find the nearest 'function' keyword before the wasm block\n const beforeBlock = source.slice(0, wasmBlockStart)\n\n // Match function declaration with parameters\n // This regex finds function signatures and captures the parameter list\n const funcPattern = /function\\s+\\w+\\s*\\(([^)]*)\\)\\s*(?:->.*?)?\\s*\\{[^}]*$/\n const match = beforeBlock.match(funcPattern)\n\n if (!match) {\n // Try arrow function or method syntax\n const arrowPattern =\n /(?:const|let|var)?\\s*\\w+\\s*=\\s*(?:async\\s*)?\\(([^)]*)\\)\\s*(?:=>|->)?\\s*\\{[^}]*$/\n const arrowMatch = beforeBlock.match(arrowPattern)\n if (!arrowMatch) return undefined\n return extractTypeFromParams(arrowMatch[1], paramName)\n }\n\n return extractTypeFromParams(match[1], paramName)\n}\n\n/**\n * Extract the type annotation for a specific parameter from a parameter list string\n */\nfunction extractTypeFromParams(\n paramsStr: string,\n paramName: string\n): string | undefined {\n // Split by comma (handling nested structures)\n const params = paramsStr.split(',').map((p) => p.trim())\n\n for (const param of params) {\n // Match patterns like:\n // - `name: Float32Array`\n // - `name: number`\n // - `name = Float32Array` (TJS example syntax)\n const colonMatch = param.match(\n new RegExp(`^${paramName}\\\\s*:\\\\s*([A-Za-z][A-Za-z0-9]*)`)\n )\n if (colonMatch) {\n return colonMatch[1]\n }\n\n // Match TypeScript-style with equals (default value that's a type constructor)\n const equalsMatch = param.match(\n new RegExp(\n `^${paramName}\\\\s*=\\\\s*(Float32Array|Float64Array|Int32Array|Uint8Array|Int8Array|Int16Array|Uint16Array|Uint32Array)`\n )\n )\n if (equalsMatch) {\n return equalsMatch[1]\n }\n }\n\n return undefined\n}\n\n/**\n * Transform Is/IsNot infix operators to function calls\n *\n * Syntax:\n * a Is b -> Is(a, b)\n * a IsNot b -> IsNot(a, b)\n *\n * This enables structural equality with a clean syntax.\n */\nexport function transformIsOperators(source: string): string {\n // Match: (simpleExpr) IsNot (simpleExpr) - must check IsNot first (longer match)\n // simpleExpr = identifier chain with optional [], () OR literals\n const exprPat =\n '([\\\\w][\\\\w.\\\\[\\\\]()]*|null|undefined|true|false|\\\\d+(?:\\\\.\\\\d+)?|\\'[^\\']*\\'|\"[^\"]*\")'\n\n // Transform IsNot first (longer keyword)\n const isNotRegex = new RegExp(exprPat + '\\\\s+IsNot\\\\s+' + exprPat, 'g')\n source = source.replace(isNotRegex, 'IsNot($1, $2)')\n\n // Transform Is\n const isRegex = new RegExp(exprPat + '\\\\s+Is\\\\s+' + exprPat, 'g')\n source = source.replace(isRegex, 'Is($1, $2)')\n\n return source\n}\n\n/**\n * Insert semicolons to prevent ASI footguns (TjsStandard mode)\n *\n * JavaScript's ASI (Automatic Semicolon Insertion) has notorious footguns:\n *\n * foo // Intended: call foo, then IIFE\n * (() => {})() // Actual: foo(...)(...) - calls foo with IIFE as argument!\n *\n * TjsStandard prevents this by treating newlines as statement terminators\n * (like Go, Swift, Kotlin). When a line starts with a problematic character\n * that could continue the previous line, we insert a semicolon.\n *\n * Problematic line starts: ( [ / + - `\n *\n * We only insert when the previous line doesn't already end with:\n * - A semicolon\n * - An opening brace/bracket/paren (multi-line expression)\n * - A comma (array/object literal or params)\n * - An operator that clearly continues (+, -, *, /, =, etc.)\n * - A keyword that expects continuation (return, throw, etc. followed by value)\n */\nexport function insertAsiProtection(source: string): string {\n // Characters that can continue a previous expression (ASI footguns)\n // Only (, [, and ` \u2014 these are the real hazards where ASI causes bugs.\n // +, -, / at line start are continuations or literals, not footguns.\n const continuationStarts = /^[\\s]*[([`]/\n\n // Characters/patterns that indicate the previous line expects continuation\n // (don't insert semicolon after these)\n const expectsContinuation = /[{([,;:+\\-*/%=&|?<>!~^]\\s*$|^\\s*$/\n\n // Keywords that expect an expression to follow on same or next line\n const continueKeywords =\n /\\b(return|throw|yield|await|case|default|extends|new|typeof|void|delete|in|of|instanceof)\\s*$/\n\n const lines = source.split('\\n')\n const result: string[] = []\n let inBlockComment = false\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const prevLine = i > 0 ? lines[i - 1] : ''\n\n // Track block comment state\n if (inBlockComment) {\n result.push(line)\n if (line.includes('*/')) inBlockComment = false\n continue\n }\n\n // Check if this line opens a block comment\n const commentOpen = line.indexOf('/*')\n const commentClose = line.indexOf('*/')\n if (\n commentOpen !== -1 &&\n (commentClose === -1 || commentClose < commentOpen)\n ) {\n inBlockComment = true\n result.push(line)\n continue\n }\n\n // Check if this line starts with a problematic character\n if (i > 0 && continuationStarts.test(line)) {\n // Get the previous line without trailing comment\n const prevNoComment = prevLine\n .replace(/\\/\\/.*$/, '')\n .replace(/\\/\\*.*\\*\\/\\s*$/, '')\n\n // Don't insert if prev line clearly expects continuation\n if (\n !expectsContinuation.test(prevNoComment) &&\n !continueKeywords.test(prevNoComment)\n ) {\n // Insert semicolon at start of this line (preserving whitespace)\n const match = line.match(/^(\\s*)/)\n const indent = match ? match[1] : ''\n const rest = line.slice(indent.length)\n result.push(indent + ';' + rest)\n continue\n }\n }\n\n result.push(line)\n }\n\n return result.join('\\n')\n}\n\n/**\n * Transform == and != to Is() and IsNot() calls\n *\n * In TJS normal mode:\n * a == b -> Is(a, b) (structural equality)\n * a != b -> IsNot(a, b) (structural inequality)\n * a === b -> a === b (identity, unchanged)\n *\n * Uses a two-pass algorithm:\n * 1. Find all == and != positions (outside strings/comments/regex)\n * 2. Transform from end to start (so positions remain valid)\n */\nexport function transformEqualityToStructural(source: string): string {\n // Transform typeof to TypeOf() \u2014 fixes typeof null === 'object'\n source = source.replace(\n /\\btypeof\\s+([a-zA-Z_$][\\w$.]*(?:\\?\\.[\\w$]+)*)/g,\n 'TypeOf($1)'\n )\n\n // First pass: find all == and != positions (outside strings/comments/regex)\n const equalityOps: Array<{ pos: number; op: '==' | '!=' }> = []\n let i = 0\n let state: TokenizerState = 'normal'\n const templateStack: number[] = []\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n // Handle state transitions\n switch (state) {\n case 'single-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === \"'\") state = 'normal'\n i++\n continue\n\n case 'double-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '\"') state = 'normal'\n i++\n continue\n\n case 'template-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n i += 2\n templateStack.push(1)\n state = 'normal'\n continue\n }\n if (char === '`') state = 'normal'\n i++\n continue\n\n case 'line-comment':\n if (char === '\\n') state = 'normal'\n i++\n continue\n\n case 'block-comment':\n if (char === '*' && nextChar === '/') {\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'regex':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '[') {\n i++\n while (i < source.length && source[i] !== ']') {\n if (source[i] === '\\\\' && i + 1 < source.length) {\n i += 2\n } else {\n i++\n }\n }\n if (i < source.length) i++\n continue\n }\n if (char === '/') {\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) i++\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'normal':\n // Handle template stack\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n templateStack.pop()\n i++\n state = 'template-string'\n continue\n }\n }\n }\n\n // Check for string/comment/regex start\n if (char === \"'\") {\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n i += 2\n state = 'block-comment'\n continue\n }\n\n // Check for regex literal (simplified detection)\n if (char === '/') {\n let j = i - 1\n while (j >= 0 && /\\s/.test(source[j])) j--\n const beforeChar = j >= 0 ? source[j] : ''\n const isRegexContext =\n !beforeChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]/.test(beforeChar) ||\n (j >= 5 &&\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)$/.test(\n source.slice(Math.max(0, j - 10), j + 1)\n ))\n if (isRegexContext) {\n i++\n state = 'regex'\n continue\n }\n }\n\n // Look for == or != (but not === or !==)\n // For ==: check it's not part of !== (char before is !)\n // For !=: check it's not !== (third char is =)\n if (\n char === '=' &&\n nextChar === '=' &&\n source[i + 2] !== '=' &&\n source[i - 1] !== '!'\n ) {\n equalityOps.push({ pos: i, op: '==' })\n i += 2\n continue\n }\n if (char === '!' && nextChar === '=' && source[i + 2] !== '=') {\n equalityOps.push({ pos: i, op: '!=' })\n i += 2\n continue\n }\n break\n }\n\n i++\n }\n\n // If no equality operators found, return source unchanged\n if (equalityOps.length === 0) {\n return source\n }\n\n // Second pass: transform from end to start (so positions remain valid)\n let result = source\n for (let k = equalityOps.length - 1; k >= 0; k--) {\n const { pos, op } = equalityOps[k]\n const funcName = op === '==' ? 'Eq' : 'NotEq'\n\n // Find left operand boundary\n const leftBoundary = findLeftOperandBoundary(result, pos)\n // Find right operand boundary\n const rightBoundary = findRightOperandBoundary(result, pos + 2)\n\n const leftExpr = result.slice(leftBoundary, pos).trim()\n const rightExpr = result.slice(pos + 2, rightBoundary).trim()\n\n if (leftExpr && rightExpr) {\n // Build the replacement\n const before = result.slice(0, leftBoundary)\n const after = result.slice(rightBoundary)\n // Add space after keyword if needed (e.g., return, throw, typeof)\n const needsSpace = /[a-zA-Z0-9_$]$/.test(before)\n const spacer = needsSpace ? ' ' : ''\n result = `${before}${spacer}${funcName}(${leftExpr}, ${rightExpr})${after}`\n }\n }\n\n return result\n}\n\n/**\n * Find the start position of the left operand\n *\n * Scans backwards from the operator position to find where the left expression starts.\n * Respects operator precedence: == has lower precedence than arithmetic operators,\n * so `x % 2 == 0` has left operand `x % 2`.\n */\nfunction findLeftOperandBoundary(source: string, opPos: number): number {\n let i = opPos - 1\n\n // Skip whitespace before operator\n while (i >= 0 && /\\s/.test(source[i])) i--\n if (i < 0) return 0\n\n let depth = 0\n let inString = false\n let stringChar = ''\n\n while (i >= 0) {\n const char = source[i]\n const prevChar = i > 0 ? source[i - 1] : ''\n\n // Handle string literals (scan backwards through them)\n if (inString) {\n if (char === stringChar && prevChar !== '\\\\') {\n inString = false\n }\n i--\n continue\n }\n\n // Check for string end (we're scanning backwards, so end is opening quote)\n if ((char === '\"' || char === \"'\" || char === '`') && prevChar !== '\\\\') {\n inString = true\n stringChar = char\n i--\n continue\n }\n\n // Track depth of parens/brackets/braces (reversed since we're going backwards)\n if (char === ')' || char === ']' || char === '}') {\n depth++\n i--\n continue\n }\n if (char === '(' || char === '[') {\n if (depth > 0) {\n depth--\n i--\n continue\n }\n // Opening paren/bracket at depth 0 - this is a grouping/call paren\n // The expression starts AFTER it, not including it\n return i + 1\n }\n if (char === '{') {\n if (depth > 0) {\n depth--\n i--\n continue\n }\n // Opening brace at depth 0 \u2014 could be block statement boundary\n return i + 1\n }\n\n // Inside nested expression - keep scanning\n if (depth > 0) {\n i--\n continue\n }\n\n // At depth 0 - check for expression boundaries\n // Statement delimiters\n if (char === ';') {\n return i + 1\n }\n\n // Check for keywords that precede expressions (return, throw, etc.)\n // We need to look backwards for a word boundary and check if it's a keyword\n if (/[a-z]/.test(char)) {\n // Might be end of a keyword - scan backwards to get full word\n const wordEnd = i + 1\n let wordStart = i\n while (wordStart > 0 && /[a-z]/i.test(source[wordStart - 1])) {\n wordStart--\n }\n const word = source.slice(wordStart, wordEnd)\n // Check if preceded by word char (not a keyword then)\n const beforeWord = wordStart > 0 ? source[wordStart - 1] : ''\n if (!/[a-zA-Z0-9_$]/.test(beforeWord)) {\n // These keywords start an expression - stop after them\n if (\n [\n 'return',\n 'throw',\n 'case',\n 'typeof',\n 'void',\n 'delete',\n 'await',\n 'yield',\n ].includes(word)\n ) {\n return wordEnd\n }\n // 'new' is part of the operand (new Foo() == bar),\n // so include it by continuing the scan\n if (word === 'new') {\n return wordStart\n }\n }\n }\n\n // Arrow function - stop before =>\n if (char === '>' && prevChar === '=') {\n return i + 1\n }\n\n // Assignment operator (but not ==, !=, <=, >=)\n if (\n char === '=' &&\n prevChar !== '=' &&\n prevChar !== '!' &&\n prevChar !== '<' &&\n prevChar !== '>'\n ) {\n return i + 1\n }\n\n // Logical operators (lower precedence than ==)\n if (char === '&' && prevChar === '&') {\n return i + 1\n }\n if (char === '|' && prevChar === '|') {\n return i + 1\n }\n\n // Ternary operators\n if (char === '?' || char === ':') {\n return i + 1\n }\n\n // Comma\n if (char === ',') {\n return i + 1\n }\n\n i--\n }\n\n return 0\n}\n\n/**\n * Find the end position of the right operand\n *\n * Scans forward from after the operator to find where the right expression ends.\n */\nfunction findRightOperandBoundary(\n source: string,\n startAfterOp: number\n): number {\n let i = startAfterOp\n\n // Skip whitespace after operator\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i >= source.length) return source.length\n\n let depth = 0\n let inString = false\n let stringChar = ''\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = i + 1 < source.length ? source[i + 1] : ''\n\n // Handle string literals\n if (inString) {\n if (char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n }\n i++\n continue\n }\n\n if (\n (char === '\"' || char === \"'\" || char === '`') &&\n source[i - 1] !== '\\\\'\n ) {\n inString = true\n stringChar = char\n i++\n continue\n }\n\n // Track depth\n if (char === '(' || char === '[' || char === '{') {\n depth++\n i++\n continue\n }\n if (char === ')' || char === ']' || char === '}') {\n if (depth > 0) {\n depth--\n i++\n continue\n }\n // Closing paren at depth 0 - boundary\n return i\n }\n\n // Inside nested - keep scanning\n if (depth > 0) {\n i++\n continue\n }\n\n // At depth 0 - check for expression boundaries\n if (char === ';') {\n return i\n }\n\n // Logical operators - lower precedence than ==\n if (char === '&' && nextChar === '&') {\n return i\n }\n if (char === '|' && nextChar === '|') {\n return i\n }\n\n // Ternary\n if (char === '?') {\n return i\n }\n if (char === ':') {\n return i\n }\n\n // Comma\n if (char === ',') {\n return i\n }\n\n // Another == or != (chained equality - stop before it)\n if (\n (char === '=' || char === '!') &&\n nextChar === '=' &&\n source[i + 2] !== '='\n ) {\n return i\n }\n\n i++\n }\n\n return source.length\n}\n\n/**\n * Transform Type block declarations\n *\n * Syntax forms:\n * Type Foo 'example' -> const Foo = Type('Foo', 'example')\n * Type Foo { example: 'value' } -> const Foo = Type('Foo', 'value')\n * Type Foo 'description' { example: 'value' }\n * -> const Foo = Type('description', 'value')\n * Type Foo 'description' { example: 0, predicate(x) { return x > 0 } }\n * -> const Foo = Type('description', (x) => { ... }, 0)\n *\n * When predicate + example: auto-generate type guard from example\n */\nexport function transformTypeDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Type' keyword followed by identifier\n const typeMatch = source\n .slice(i)\n .match(/^\\bType\\s+([A-Z_][a-zA-Z0-9_]*)\\s*/)\n if (typeMatch) {\n const typeName = typeMatch[1]\n let j = i + typeMatch[0].length\n\n // Check for optional description string\n // Only treat as description if followed by = or {\n let description = typeName\n let descriptionWasExplicit = false\n const descStringMatch = source.slice(j).match(/^(['\"`])([^]*?)\\1\\s*/)\n if (descStringMatch) {\n const afterString = j + descStringMatch[0].length\n const nextChar = source[afterString]\n // Check if this looks like end of statement (not followed by = or {)\n // Note: the \\s* in the regex consumes trailing whitespace including newlines\n const isEndOfStatement =\n nextChar === undefined ||\n afterString >= source.length ||\n (nextChar !== '=' && nextChar !== '{')\n\n if (nextChar === '=' || nextChar === '{') {\n // It's a description followed by = or { block\n description = descStringMatch[2]\n descriptionWasExplicit = true\n j = afterString\n } else if (isEndOfStatement) {\n // Old simple form: Type Name 'value' - value is both example and default\n const value = descStringMatch[0].trim()\n // Preserve trailing whitespace (newlines) that was consumed by the regex\n const trailingWs = descStringMatch[0].slice(value.length)\n result += `const ${typeName} = Type('${typeName}', ${value})${trailingWs}`\n i = afterString\n continue\n }\n }\n\n // Check for = default value\n let defaultValue: string | undefined\n let posAfterDefault = j // Track position right after the default value\n const equalsMatch = source.slice(j).match(/^=\\s*/)\n if (equalsMatch) {\n j += equalsMatch[0].length\n // Parse the default value (handles +number, strings, objects, arrays, etc.)\n const valueMatch = source\n .slice(j)\n .match(\n /^(\\+?\\d+(?:\\.\\d+)?|['\"`][^'\"`]*['\"`]|\\{[^}]*\\}|\\[[^\\]]*\\]|true|false|null)/\n )\n if (valueMatch) {\n defaultValue = valueMatch[0]\n j += valueMatch[0].length\n posAfterDefault = j // Save position before consuming whitespace\n // Skip whitespace after default (only to check for block)\n const wsMatch = source.slice(j).match(/^\\s*/)\n if (wsMatch) j += wsMatch[0].length\n }\n }\n\n // Check for block { ... }\n if (source[j] === '{') {\n // Block form: Type Foo 'desc'? = default? { ... }\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n // Unbalanced - just copy and continue\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse block body for description (old syntax fallback), example, predicate\n const descInsideMatch = blockBody.match(\n /description\\s*:\\s*(['\"`])([^]*?)\\1/\n )\n if (descInsideMatch && !descriptionWasExplicit) {\n description = descInsideMatch[2]\n }\n\n // Extract example value using state machine for nested structures\n let example: string | undefined\n const exampleKeyword = blockBody.match(/example\\s*:\\s*/)\n if (exampleKeyword) {\n const valueStart = exampleKeyword.index! + exampleKeyword[0].length\n const extracted = extractJSValue(blockBody, valueStart)\n if (extracted) {\n example = extracted.value.trim()\n }\n }\n\n const predicateMatch = blockBody.match(\n /predicate\\s*\\(([^)]*)\\)\\s*\\{([^]*)\\}/\n )\n\n // Build Type() call with appropriate arguments\n // Type(description, predicateOrExample, example?, default?)\n if (predicateMatch && example) {\n // Predicate + example\n const params = predicateMatch[1].trim()\n const body = predicateMatch[2].trim()\n const defaultArg = defaultValue ? `, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', (${params}) => { if (!globalThis.__tjs?.validate(${params}, globalThis.__tjs?.infer(${example}))) return false; ${body} }, ${example}${defaultArg})`\n } else if (predicateMatch) {\n // Predicate only\n const params = predicateMatch[1].trim()\n const body = predicateMatch[2].trim()\n const defaultArg = defaultValue ? `, undefined, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', (${params}) => { ${body} }${defaultArg})`\n } else if (example) {\n // Example only (becomes validation schema)\n const defaultArg = defaultValue ? `, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', undefined, ${example}${defaultArg})`\n } else if (defaultValue) {\n // Default only (infer schema from default)\n result += `const ${typeName} = Type('${description}', ${defaultValue})`\n } else {\n // Empty block - error or description-only type\n result += `const ${typeName} = Type('${description}')`\n }\n\n i = blockEnd\n continue\n } else if (defaultValue) {\n // Simple form with default: Type Foo = 'value' or Type Foo 'desc' = 'value'\n result += `const ${typeName} = Type('${description}', ${defaultValue})`\n i = posAfterDefault // Use position before whitespace was consumed\n continue\n } else if (!descStringMatch) {\n // No description, no default, no block - look for old simple form: Type Foo 'value'\n const valueMatch = source\n .slice(j)\n .match(\n /^(['\"`][^]*?['\"`]|\\+?\\d+(?:\\.\\d+)?|true|false|null|\\{[^]*?\\}|\\[[^]*?\\])/\n )\n if (valueMatch) {\n const example = valueMatch[0]\n result += `const ${typeName} = Type('${typeName}', ${example})`\n i = j + valueMatch[0].length\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform FunctionPredicate declarations\n *\n * Block form:\n * FunctionPredicate Callback {\n * params: { x: 0, y: '' }\n * returns: false\n * }\n * \u2192 const Callback = FunctionPredicate('Callback', { params: { x: 0, y: '' }, returns: false })\n *\n * Generic block form:\n * FunctionPredicate Creator<T = {}> {\n * params: { contents: [null] }\n * returns: T\n * }\n * \u2192 const Creator = FunctionPredicate('Creator', [['T', {}]], (T) => ({ params: { contents: [null] }, returns: T }))\n *\n * Function form:\n * FunctionPredicate Handler(existingFn, 'description')\n * \u2192 const Handler = FunctionPredicate('description', existingFn)\n */\nexport function transformFunctionPredicateDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n const fpMatch = source\n .slice(i)\n .match(/^\\bFunctionPredicate\\s+([A-Z_][a-zA-Z0-9_]*)\\s*(?:<([^>]+)>)?\\s*/)\n if (fpMatch) {\n const fpName = fpMatch[1]\n const typeParamsStr = fpMatch[2] // undefined if no <...>\n const j = i + fpMatch[0].length\n\n // Check for block form: FunctionPredicate Name { ... } or FunctionPredicate Name<T> { ... }\n if (source[j] === '{') {\n // Find matching closing brace\n let depth = 1\n let k = j + 1\n while (k < source.length && depth > 0) {\n if (source[k] === '{') depth++\n else if (source[k] === '}') depth--\n k++\n }\n\n if (depth === 0) {\n const blockBody = source.slice(j + 1, k - 1).trim()\n\n // Extract params: { ... } (brace-balanced for nested objects like { el: {} })\n const paramsMatch = extractBalancedValue(blockBody, /params\\s*:\\s*\\{/)\n // Extract returns value\n const returnsMatch = blockBody.match(/returns\\s*:\\s*(.+?)(?:\\n|$)/)\n // Extract returnContract\n const contractMatch = blockBody.match(\n /returnContract\\s*:\\s*['\"](\\w+)['\"]/\n )\n // Extract description\n const descMatch = blockBody.match(/description\\s*:\\s*(['\"])([^]*?)\\1/)\n\n const spec: string[] = []\n if (paramsMatch) spec.push(`params: ${paramsMatch[1]}`)\n if (returnsMatch) spec.push(`returns: ${returnsMatch[1].trim()}`)\n if (contractMatch) {\n spec.push(`returnContract: '${contractMatch[1]}'`)\n }\n\n const desc = descMatch ? descMatch[2] : fpName\n\n if (typeParamsStr) {\n // Generic form \u2014 emit factory with type params\n const typeParams = typeParamsStr.split(',').map((p) => {\n const parts = p\n .trim()\n .split('=')\n .map((s) => s.trim())\n if (parts.length === 2) {\n const defaultVal =\n parts[1] === 'any' || parts[1] === 'undefined'\n ? 'null'\n : parts[1]\n return `['${parts[0]}', ${defaultVal}]`\n }\n return `'${parts[0]}'`\n })\n const paramNames = typeParamsStr\n .split(',')\n .map((p) => p.trim().split('=')[0].trim())\n result += `const ${fpName} = FunctionPredicate('${desc}', [${typeParams.join(\n ', '\n )}], (${paramNames.join(', ')}) => ({ ${spec.join(', ')} }))`\n } else {\n // Non-generic form\n result += `const ${fpName} = FunctionPredicate('${desc}', { ${spec.join(\n ', '\n )} })`\n }\n i = k\n continue\n }\n }\n\n // Check for function form: FunctionPredicate Name(fn, 'desc')\n if (source[j] === '(') {\n // Find matching closing paren\n let depth = 1\n let k = j + 1\n while (k < source.length && depth > 0) {\n if (source[k] === '(') depth++\n else if (source[k] === ')') depth--\n k++\n }\n\n if (depth === 0) {\n const args = source.slice(j + 1, k - 1).trim()\n // Split on comma: fn, 'description'\n const commaIdx = args.indexOf(',')\n if (commaIdx !== -1) {\n const fnRef = args.slice(0, commaIdx).trim()\n const desc = args.slice(commaIdx + 1).trim()\n result += `const ${fpName} = FunctionPredicate(${desc}, ${fnRef})`\n } else {\n // Just a function reference, name as description\n result += `const ${fpName} = FunctionPredicate('${fpName}', ${args})`\n }\n i = k\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform Generic block declarations\n *\n * Syntax:\n * Generic Pair<T, U> { description: '...', predicate(obj, T, U) { ... } }\n * Generic Container<T, U = ''> { ... } // U has default\n *\n * Transforms to:\n * const Pair = Generic(['T', 'U'], (obj, checkT, checkU) => { ... }, '...')\n * const Container = Generic(['T', ['U', '']], (obj, checkT, checkU) => { ... }, '...')\n */\nexport function transformGenericDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Generic' keyword followed by identifier and type params\n const genericMatch = source\n .slice(i)\n .match(/^\\bGeneric\\s+([A-Z][a-zA-Z0-9_]*)\\s*<([^>]+)>\\s*\\{/)\n if (genericMatch) {\n const genericName = genericMatch[1]\n const typeParamsStr = genericMatch[2]\n const blockStart = i + genericMatch[0].length - 1\n const bodyStart = blockStart + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n // Unbalanced - just copy and continue\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse type params: T, U = Default\n const typeParams = typeParamsStr.split(',').map((p) => {\n const parts = p\n .trim()\n .split('=')\n .map((s) => s.trim())\n if (parts.length === 2) {\n // 'any' and 'undefined' aren't valid JS values \u2014 use null\n const defaultVal =\n parts[1] === 'any' || parts[1] === 'undefined' ? 'null' : parts[1]\n return `['${parts[0]}', ${defaultVal}]`\n }\n return `'${parts[0]}'`\n })\n\n // Parse the block body\n // Strip declaration { ... } block before parsing (it's .d.ts metadata, not runtime)\n let parsedBody = blockBody\n const declIdx = parsedBody.search(/\\bdeclaration\\s*\\{/)\n if (declIdx !== -1) {\n // Find matching closing brace for the declaration block\n const declBraceStart = parsedBody.indexOf('{', declIdx)\n let dDepth = 1\n let dj = declBraceStart + 1\n while (dj < parsedBody.length && dDepth > 0) {\n if (parsedBody[dj] === '{') dDepth++\n else if (parsedBody[dj] === '}') dDepth--\n dj++\n }\n // Remove the declaration block\n parsedBody = parsedBody.slice(0, declIdx) + parsedBody.slice(dj)\n }\n\n const descMatch = parsedBody.match(/description\\s*:\\s*(['\"`])([^]*?)\\1/)\n const predicateMatch = parsedBody.match(\n /predicate\\s*\\(([^)]*)\\)\\s*\\{([^]*)\\}/\n )\n\n const description = descMatch ? descMatch[2] : genericName\n\n if (predicateMatch) {\n const params = predicateMatch[1]\n .trim()\n .split(',')\n .map((s) => s.trim())\n let body = predicateMatch[2].trim()\n\n // First param is the value, rest are type params\n const valueParam = params[0] || 'x'\n const typeParamNames = params.slice(1)\n const typeCheckParams = typeParamNames.map((p) => `check${p}`)\n\n // Replace type param names with check functions in body\n // e.g., T(x[0]) becomes checkT(x[0])\n typeParamNames.forEach((name, idx) => {\n body = body.replace(\n new RegExp(`\\\\b${name}\\\\s*\\\\(`, 'g'),\n `${typeCheckParams[idx]}(`\n )\n })\n\n result += `const ${genericName} = Generic([${typeParams.join(\n ', '\n )}], (${valueParam}, ${typeCheckParams.join(\n ', '\n )}) => { ${body} }, '${description}')`\n } else {\n // No predicate - create a generic that always passes\n result += `const ${genericName} = Generic([${typeParams.join(\n ', '\n )}], () => true, '${description}')`\n }\n\n i = blockEnd\n continue\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform Union declarations\n *\n * Syntax:\n * Union Direction 'cardinal direction' {\n * 'up' | 'down' | 'left' | 'right'\n * }\n *\n * Transforms to:\n * const Direction = Union('cardinal direction', ['up', 'down', 'left', 'right'])\n *\n * Also supports inline form:\n * Union Direction 'cardinal direction' 'up' | 'down' | 'left' | 'right'\n */\nexport function transformUnionDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Union' keyword followed by identifier and description\n const unionMatch = source\n .slice(i)\n .match(/^\\bUnion\\s+([A-Z][a-zA-Z0-9_]*)\\s+(['\"`])([^]*?)\\2\\s*/)\n if (unionMatch) {\n const unionName = unionMatch[1]\n const description = unionMatch[3]\n const j = i + unionMatch[0].length\n\n // Check what follows: block or inline values\n if (source[j] === '{') {\n // Block form: Union Foo 'desc' { ... }\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse values: 'a' | 'b' | 'c' or \"a\" | \"b\" or mixed\n const values = parseUnionValues(blockBody)\n result += `const ${unionName} = Union('${description}', [${values.join(\n ', '\n )}])`\n i = blockEnd\n continue\n } else {\n // Inline form: Union Foo 'desc' 'a' | 'b' | 'c'\n // Find the end of the line or statement\n let lineEnd = source.indexOf('\\n', j)\n if (lineEnd === -1) lineEnd = source.length\n const inlineValues = source.slice(j, lineEnd).trim()\n\n if (inlineValues) {\n const values = parseUnionValues(inlineValues)\n result += `const ${unionName} = Union('${description}', [${values.join(\n ', '\n )}])`\n i = lineEnd\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Parse union values from a string like: 'a' | 'b' | 123 | true\n * Returns array of value literals as strings\n */\nfunction parseUnionValues(input: string): string[] {\n const values: string[] = []\n // Split on | and trim, preserving quoted strings and literals\n const parts = input.split('|').map((p) => p.trim())\n\n for (const part of parts) {\n if (!part) continue\n // Keep the value as-is (already a valid JS literal)\n values.push(part)\n }\n\n return values\n}\n\n/**\n * Transform Enum declarations\n *\n * Syntax:\n * Enum Status 'task status' {\n * Pending\n * Active\n * Done\n * }\n *\n * Enum Color 'CSS color' {\n * Red = 'red'\n * Green = 'green'\n * Blue = 'blue'\n * }\n *\n * Transforms to:\n * const Status = Enum('task status', { Pending: 0, Active: 1, Done: 2 })\n * const Color = Enum('CSS color', { Red: 'red', Green: 'green', Blue: 'blue' })\n */\nexport function transformEnumDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Enum' keyword followed by identifier and description\n const enumMatch = source\n .slice(i)\n .match(/^\\bEnum\\s+([A-Z][a-zA-Z0-9_]*)\\s+(['\"`])([^]*?)\\2\\s*\\{/)\n if (enumMatch) {\n const enumName = enumMatch[1]\n const description = enumMatch[3]\n const blockStart = i + enumMatch[0].length - 1\n const bodyStart = blockStart + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse enum members\n const members = parseEnumMembers(blockBody)\n const membersStr = members\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ')\n\n result += `const ${enumName} = Enum('${description}', { ${membersStr} })`\n i = blockEnd\n continue\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Parse enum members from block body\n * Handles: Pending, Active = 5, Done, Name = 'value'\n * Returns array of [key, value] pairs\n */\nfunction parseEnumMembers(input: string): [string, string][] {\n const members: [string, string][] = []\n let currentNumericValue = 0\n\n // Split on newlines and commas, filter empty\n const lines = input\n .split(/[\\n,]/)\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith('//'))\n\n for (const line of lines) {\n // Match: Name or Name = value\n const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*(?:=\\s*(.+))?$/)\n if (match) {\n const key = match[1]\n const explicitValue = match[2]?.trim()\n\n if (explicitValue !== undefined) {\n members.push([key, explicitValue])\n // If it's a number, update the counter\n const numVal = Number(explicitValue)\n if (!isNaN(numVal)) {\n currentNumericValue = numVal + 1\n }\n } else {\n // Auto-increment numeric value\n members.push([key, String(currentNumericValue)])\n currentNumericValue++\n }\n }\n }\n\n return members\n}\n\n/**\n * Extension info for a single extend block\n */\n\nexport function transformExtendDeclarations(source: string): {\n source: string\n extensions: Map<string, Set<string>>\n} {\n const extensions = new Map<string, Set<string>>()\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'extend' keyword at statement boundary\n const remaining = source.slice(i)\n const extendMatch = remaining.match(/^(\\s*)extend\\s+([A-Z]\\w*)\\s*\\{/)\n\n if (!extendMatch) {\n // Check if we're at start of line or after semicolon/brace\n const lineStart =\n i === 0 ||\n source[i - 1] === '\\n' ||\n source[i - 1] === ';' ||\n source[i - 1] === '}'\n\n if (lineStart) {\n const afterWS = remaining.match(/^(\\s*)extend\\s+([A-Z]\\w*)\\s*\\{/)\n if (afterWS) {\n // Already handled above, fall through\n }\n }\n result += source[i]\n i++\n continue\n }\n\n const indent = extendMatch[1]\n const typeName = extendMatch[2]\n const blockStart = i + extendMatch[0].length - 1 // position of {\n\n // Find matching closing brace\n const blockEnd = findFunctionBodyEnd(source, blockStart)\n const blockBody = source.slice(blockStart + 1, blockEnd - 1).trim()\n\n // Parse methods from the block body\n // Match: methodName(params) { body } or async methodName(params) { body }\n const methods: { name: string; isAsync: boolean; fullText: string }[] = []\n let j = 0\n const bodySource = source.slice(blockStart + 1, blockEnd - 1)\n\n while (j < bodySource.length) {\n const methodRemaining = bodySource.slice(j)\n const methodMatch = methodRemaining.match(/^(\\s*)(async\\s+)?(\\w+)\\s*\\(/)\n\n if (!methodMatch) {\n j++\n continue\n }\n\n const methodIndent = methodMatch[1]\n const isAsync = !!methodMatch[2]\n const methodName = methodMatch[3]\n\n // Reject arrow functions \u2014 they don't bind `this`\n // We'll check after finding the body\n\n // Find the opening paren\n const parenStart = j + methodMatch[0].length - 1\n let parenDepth = 1\n let k = parenStart + 1\n while (k < bodySource.length && parenDepth > 0) {\n if (bodySource[k] === '(') parenDepth++\n if (bodySource[k] === ')') parenDepth--\n k++\n }\n const paramsStr = bodySource.slice(parenStart + 1, k - 1)\n\n // Skip whitespace to find { or =>\n let afterParams = k\n while (\n afterParams < bodySource.length &&\n /\\s/.test(bodySource[afterParams])\n ) {\n afterParams++\n }\n\n // Check for arrow function\n if (\n bodySource[afterParams] === '=' &&\n bodySource[afterParams + 1] === '>'\n ) {\n const loc = locAt(source, blockStart + 1 + j)\n throw new SyntaxError(\n `Arrow functions are not allowed in extend blocks (method '${methodName}' in extend ${typeName}). ` +\n `Use regular function syntax instead, as extension methods need 'this' binding.`,\n loc\n )\n }\n\n if (bodySource[afterParams] !== '{') {\n j++\n continue\n }\n\n // Find matching closing brace for the method body\n const methodBodyEnd = findFunctionBodyEnd(bodySource, afterParams)\n const fullMethodText = bodySource.slice(j, methodBodyEnd).trim()\n\n // Build: methodName: function(params) { body }\n // Transform TJS colon params (name: value) to JS defaults (name = value)\n const transformedParams = paramsStr\n .split(',')\n .map((p) => p.trim())\n .filter((p) => p.length > 0)\n .map((p) => {\n // name: value -> name = value (TJS colon shorthand)\n const colonMatch = p.match(/^(\\w+)\\s*:\\s*(.+)$/)\n if (colonMatch) return `${colonMatch[1]} = ${colonMatch[2]}`\n return p\n })\n .join(', ')\n const asyncPrefix = isAsync ? 'async ' : ''\n const methodBody = bodySource.slice(afterParams + 1, methodBodyEnd - 1)\n methods.push({\n name: methodName,\n isAsync,\n fullText: `${methodName}: ${asyncPrefix}function(${transformedParams}) {${methodBody}}`,\n })\n\n j = methodBodyEnd\n }\n\n // Track extensions\n const isFirstForType = !extensions.has(typeName)\n if (isFirstForType) {\n extensions.set(typeName, new Set())\n }\n const extSet = extensions.get(typeName)!\n for (const m of methods) {\n extSet.add(m.name)\n }\n\n // Generate the __ext object (or merge into existing)\n const methodEntries = methods.map((m) => ` ${m.fullText}`).join(',\\n')\n let replacement: string\n if (isFirstForType) {\n replacement = `${indent}const __ext_${typeName} = {\\n${methodEntries}\\n${indent}}\\n`\n } else {\n // Merge into existing: Object.assign(__ext_TypeName, { ... })\n replacement = `${indent}Object.assign(__ext_${typeName}, {\\n${methodEntries}\\n${indent}})\\n`\n }\n\n // Generate registration calls\n for (const m of methods) {\n replacement += `${indent}if (__tjs?.registerExtension) { __tjs.registerExtension('${typeName}', '${m.name}', __ext_${typeName}.${m.name}) }\\n`\n }\n\n result += replacement\n i = blockEnd\n }\n\n // Append any remaining source\n if (i <= source.length && result.length < source.length) {\n // Already handled character by character\n }\n\n return { source: result, extensions }\n}\n\n/**\n * Transform method calls on known-type receivers to use extension objects.\n *\n * For literals and typed variables where the type is known:\n * 'hello'.capitalize() -> __ext_String.capitalize.call('hello')\n * [1,2,3].last() -> __ext_Array.last.call([1,2,3])\n *\n * This is a best-effort source-level transform. For unknown types,\n * the runtime fallback (resolveExtension) handles it.\n */\nexport function transformExtensionCalls(\n source: string,\n extensions: Map<string, Set<string>>\n): string {\n if (extensions.size === 0) return source\n\n // Build a map of method names to possible type names for quick lookup\n const methodToTypes = new Map<string, string[]>()\n for (const [typeName, methods] of extensions) {\n for (const method of methods) {\n if (!methodToTypes.has(method)) {\n methodToTypes.set(method, [])\n }\n methodToTypes.get(method)!.push(typeName)\n }\n }\n\n let result = source\n\n // Rewrite calls on string literals: 'str'.method(...) or \"str\".method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('String')) continue\n\n // Match string literal followed by .method(\n // Single-quoted strings\n const singleQuotePattern = new RegExp(\n `('(?:[^'\\\\\\\\]|\\\\\\\\.)*')\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(singleQuotePattern, (_, str, meth, closeParen) => {\n return closeParen\n ? `__ext_String.${meth}.call(${str})`\n : `__ext_String.${meth}.call(${str}, `\n })\n\n // Double-quoted strings\n const doubleQuotePattern = new RegExp(\n `(\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\")\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(doubleQuotePattern, (_, str, meth, closeParen) => {\n return closeParen\n ? `__ext_String.${meth}.call(${str})`\n : `__ext_String.${meth}.call(${str}, `\n })\n\n // Template literals (backtick) \u2014 simple case only (no nested templates)\n const templatePattern = new RegExp(\n '(`(?:[^`\\\\\\\\]|\\\\\\\\.)*`)\\\\.' + method + '\\\\((\\\\))?',\n 'g'\n )\n result = result.replace(templatePattern, (_, str, closeParen) => {\n return closeParen\n ? `__ext_String.${method}.call(${str})`\n : `__ext_String.${method}.call(${str}, `\n })\n }\n\n // Rewrite calls on array literals: [1,2,3].method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('Array')) continue\n\n // Match array literal [...].method(\n // This is tricky \u2014 we need to find balanced brackets\n // Simple approach: find ].method( and walk backward to find matching [\n const methodDot = `].${method}(`\n let searchFrom = 0\n let idx: number\n while ((idx = result.indexOf(methodDot, searchFrom)) !== -1) {\n // Walk backward from idx to find matching [\n let bracketDepth = 1\n let k = idx - 1\n let inStr: string | false = false\n while (k >= 0 && bracketDepth > 0) {\n const ch = result[k]\n if (inStr) {\n if (ch === inStr && (k === 0 || result[k - 1] !== '\\\\')) {\n inStr = false\n }\n } else {\n if (ch === ']') bracketDepth++\n if (ch === '[') bracketDepth--\n if (ch === \"'\" || ch === '\"' || ch === '`') inStr = ch\n }\n k--\n }\n\n if (bracketDepth === 0) {\n const arrayLiteral = result.slice(k + 1, idx + 1)\n const before = result.slice(0, k + 1)\n const after = result.slice(idx + methodDot.length)\n // Check if no-args call: next char is )\n if (after[0] === ')') {\n result = `${before}__ext_Array.${method}.call(${arrayLiteral})${after.slice(\n 1\n )}`\n } else {\n result = `${before}__ext_Array.${method}.call(${arrayLiteral}, ${after}`\n }\n }\n\n searchFrom = idx + 1\n }\n }\n\n // Rewrite calls on number literals: (42).method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('Number')) continue\n\n const numPattern = new RegExp(\n `(\\\\d+(?:\\\\.\\\\d+)?)\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(numPattern, (_, num, meth, closeParen) => {\n return closeParen\n ? `__ext_Number.${meth}.call(${num})`\n : `__ext_Number.${meth}.call(${num}, `\n })\n }\n\n return result\n}\n\n/**\n * Compute {line, column} from a character offset in source.\n */\nexport function locAt(\n source: string,\n pos: number\n): { line: number; column: number } {\n let line = 1\n let column = 0\n for (let i = 0; i < pos && i < source.length; i++) {\n if (source[i] === '\\n') {\n line++\n column = 0\n } else {\n column++\n }\n }\n return { line, column }\n}\n\n/**\n * Info about a single function variant for polymorphic dispatch\n */\n\nfunction typeCheckForDefault(argExpr: string, defaultValue: string): string {\n const dv = defaultValue.trim()\n\n // String literal\n if (/^['\"`]/.test(dv)) return `typeof ${argExpr} === 'string'`\n\n // Boolean\n if (dv === 'true' || dv === 'false') return `typeof ${argExpr} === 'boolean'`\n\n // null\n if (dv === 'null') return `${argExpr} === null`\n\n // undefined\n if (dv === 'undefined') return `${argExpr} === undefined`\n\n // Array literal\n if (dv.startsWith('[')) return `Array.isArray(${argExpr})`\n\n // Object literal\n if (dv.startsWith('{'))\n return `(typeof ${argExpr} === 'object' && ${argExpr} !== null && !Array.isArray(${argExpr}))`\n\n // Non-negative integer: +N\n if (/^\\+\\d+/.test(dv))\n return `(typeof ${argExpr} === 'number' && Number.isInteger(${argExpr}) && ${argExpr} >= 0)`\n\n // Number with decimal \u2192 float\n if (/^-?\\d+\\.\\d+/.test(dv)) return `typeof ${argExpr} === 'number'`\n\n // Integer (whole number, possibly negative)\n if (/^-?\\d+$/.test(dv))\n return `(typeof ${argExpr} === 'number' && Number.isInteger(${argExpr}))`\n\n // Fallback: any\n return 'true'\n}\n\n/**\n * Get a type \"signature\" string from a default value for ambiguity checking.\n * Two params with the same signature at the same position are ambiguous.\n */\nfunction typeSignatureForDefault(defaultValue: string): string {\n const dv = defaultValue.trim()\n if (/^['\"`]/.test(dv)) return 'string'\n if (dv === 'true' || dv === 'false') return 'boolean'\n if (dv === 'null') return 'null'\n if (dv === 'undefined') return 'undefined'\n if (dv.startsWith('[')) return 'array'\n if (dv.startsWith('{')) return 'object'\n if (/^\\+\\d+/.test(dv)) return 'non-negative-integer'\n if (/^-?\\d+\\.\\d+/.test(dv)) return 'number'\n if (/^-?\\d+$/.test(dv)) return 'integer'\n return 'any'\n}\n\n/**\n * Parse a parameter string like \"a = 0, b = 'hello', c = { x: 0 }\"\n * into an array of { name, defaultValue, required } objects.\n * Handles nested braces/brackets/parens and template literals.\n */\nfunction parseParamList(\n paramStr: string,\n requiredParams: Set<string>\n): { name: string; defaultValue: string; required: boolean }[] {\n const params: { name: string; defaultValue: string; required: boolean }[] = []\n let depth = 0\n let current = ''\n let inString: string | false = false\n\n for (let i = 0; i < paramStr.length; i++) {\n const ch = paramStr[i]\n\n // Track string state\n if (!inString && (ch === \"'\" || ch === '\"' || ch === '`')) {\n inString = ch\n current += ch\n continue\n }\n if (inString) {\n current += ch\n if (ch === '\\\\') {\n i++\n if (i < paramStr.length) current += paramStr[i]\n continue\n }\n if (ch === inString) inString = false\n continue\n }\n\n // Track nesting\n if (ch === '(' || ch === '[' || ch === '{') {\n depth++\n current += ch\n continue\n }\n if (ch === ')' || ch === ']' || ch === '}') {\n depth--\n current += ch\n continue\n }\n\n // Split on comma at depth 0\n if (ch === ',' && depth === 0) {\n const param = parseOneParam(current.trim(), requiredParams)\n if (param) params.push(param)\n current = ''\n continue\n }\n\n current += ch\n }\n\n // Last param\n const trimmed = current.trim()\n if (trimmed) {\n const param = parseOneParam(trimmed, requiredParams)\n if (param) params.push(param)\n }\n\n return params\n}\n\n/**\n * Parse a single parameter like \"name = 'Alice'\" or \"/* unsafe * / x = 0\"\n */\nfunction parseOneParam(\n paramStr: string,\n requiredParams: Set<string>\n): { name: string; defaultValue: string; required: boolean } | null {\n // Strip leading /* unsafe */ comment\n const str = paramStr.replace(/^\\/\\*\\s*unsafe\\s*\\*\\/\\s*/, '')\n\n // Rest params not supported in polymorphic functions\n if (str.startsWith('...')) return null\n\n // Find = sign (the param has been transformed from : to = by transformParenExpressions)\n const eqIdx = str.indexOf('=')\n if (eqIdx === -1) {\n // No default value \u2014 untyped param\n return { name: str.trim(), defaultValue: '', required: true }\n }\n\n const name = str.slice(0, eqIdx).trim()\n const defaultValue = str.slice(eqIdx + 1).trim()\n return { name, defaultValue, required: requiredParams.has(name) }\n}\n\n/**\n * Find the end of a function body (matching closing brace).\n * Handles nested braces, strings, template literals, comments, and regex.\n * Returns the index AFTER the closing brace.\n */\nexport function findFunctionBodyEnd(\n source: string,\n openBracePos: number\n): number {\n let depth = 1\n let i = openBracePos + 1\n let inString: string | false = false\n let inLineComment = false\n let inBlockComment = false\n\n while (i < source.length && depth > 0) {\n const ch = source[i]\n const next = i + 1 < source.length ? source[i + 1] : ''\n\n // Line comment\n if (inLineComment) {\n if (ch === '\\n') inLineComment = false\n i++\n continue\n }\n\n // Block comment\n if (inBlockComment) {\n if (ch === '*' && next === '/') {\n inBlockComment = false\n i += 2\n continue\n }\n i++\n continue\n }\n\n // String tracking\n if (inString) {\n if (ch === '\\\\') {\n i += 2\n continue\n }\n if (ch === inString) inString = false\n i++\n continue\n }\n\n // Start comments\n if (ch === '/' && next === '/') {\n inLineComment = true\n i += 2\n continue\n }\n if (ch === '/' && next === '*') {\n inBlockComment = true\n i += 2\n continue\n }\n\n // Start strings\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n inString = ch\n i++\n continue\n }\n\n // Braces\n if (ch === '{') depth++\n if (ch === '}') depth--\n\n i++\n }\n\n return i\n}\n\n/**\n * Transform polymorphic functions: multiple function declarations with the\n * same name are merged into a single dispatcher function.\n *\n * Must be called AFTER transformParenExpressions (so params have = defaults)\n * but BEFORE wrapClassDeclarations.\n *\n * function greet(name = '') { ... }\n * function greet(first = '', last = '') { ... }\n *\n * becomes:\n *\n * function greet$1(name = '') { ... }\n * function greet$2(first = '', last = '') { ... }\n * function greet(...__args) {\n * if (__args.length === 1 && typeof __args[0] === 'string') return greet$1(__args[0])\n * if (__args.length === 2 && ...) return greet$2(__args[0], __args[1])\n * return __tjs.typeError('greet', 'no matching overload', __args)\n * }\n */\nexport function transformPolymorphicFunctions(\n source: string,\n requiredParams: Set<string>\n): { source: string; polymorphicNames: Set<string> } {\n const polymorphicNames = new Set<string>()\n\n // Phase 1: Find all function declarations and group by name\n // Match: optional \"export\" + optional \"async\" + \"function\" + name + \"(\"\n const funcPattern =\n /(?:^|(?<=[\\n;{}]))\\s*(export\\s+)?(async\\s+)?function\\s+(\\w+)\\s*\\(/gm\n const declarations = new Map<string, PolyVariant[]>()\n let match: RegExpExecArray | null\n\n // First pass: collect all function positions and names\n const allMatches: {\n name: string\n fullMatchStart: number\n funcKeywordStart: number\n exported: boolean\n isAsync: boolean\n }[] = []\n\n while ((match = funcPattern.exec(source)) !== null) {\n const exported = !!match[1]\n const isAsync = !!match[2]\n const name = match[3]\n const fullMatchStart = match.index\n // Find where \"function\" keyword starts (skip whitespace and export/async)\n let funcKeywordStart = fullMatchStart\n const prefix = match[0]\n const funcIdx = prefix.indexOf('function')\n if (funcIdx >= 0) funcKeywordStart = fullMatchStart + funcIdx\n\n allMatches.push({\n name,\n fullMatchStart,\n funcKeywordStart,\n exported,\n isAsync,\n })\n }\n\n // Group by name\n for (const m of allMatches) {\n if (!declarations.has(m.name)) {\n declarations.set(m.name, [])\n }\n }\n\n // Count occurrences \u2014 only process names that appear more than once\n const nameCounts = new Map<string, number>()\n for (const m of allMatches) {\n nameCounts.set(m.name, (nameCounts.get(m.name) || 0) + 1)\n }\n\n const polyNames = new Set<string>()\n for (const [name, count] of nameCounts) {\n if (count > 1) polyNames.add(name)\n }\n\n if (polyNames.size === 0) {\n return { source, polymorphicNames }\n }\n\n // Phase 2: For each polymorphic function, extract full details\n for (const m of allMatches) {\n if (!polyNames.has(m.name)) continue\n\n // Find the opening paren\n const afterFunc = source.indexOf('(', m.funcKeywordStart)\n if (afterFunc === -1) continue\n\n // Find matching closing paren\n let parenDepth = 1\n let j = afterFunc + 1\n while (j < source.length && parenDepth > 0) {\n if (source[j] === '(') parenDepth++\n if (source[j] === ')') parenDepth--\n j++\n }\n const closeParen = j - 1\n const paramStr = source.slice(afterFunc + 1, closeParen)\n\n // Find the opening brace of the function body\n let bodyStart = j\n while (bodyStart < source.length && source[bodyStart] !== '{') bodyStart++\n if (bodyStart >= source.length) continue\n\n // Find matching closing brace\n const bodyEnd = findFunctionBodyEnd(source, bodyStart)\n\n // Determine the real start (including leading whitespace, export, async)\n let realStart = m.fullMatchStart\n // Include leading whitespace on the same line\n while (realStart > 0 && source[realStart - 1] === ' ') realStart--\n\n const variants = declarations.get(m.name)!\n const params = parseParamList(paramStr, requiredParams)\n\n // Check for rest params\n const hasRestParam = paramStr.includes('...')\n if (hasRestParam) {\n const loc = locAt(source, m.funcKeywordStart)\n throw new SyntaxError(\n `Rest parameters are not supported in polymorphic function '${m.name}'. ` +\n `Use separate function names instead.`,\n loc\n )\n }\n\n variants.push({\n index: variants.length + 1,\n start: realStart,\n end: bodyEnd,\n text: source.slice(realStart, bodyEnd),\n exported: m.exported,\n isAsync: m.isAsync,\n params,\n })\n }\n\n // Phase 3: Validate \u2014 check for ambiguous variants\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n\n // Check async consistency\n const asyncCount = variants.filter((v) => v.isAsync).length\n if (asyncCount > 0 && asyncCount < variants.length) {\n const loc = locAt(source, variants[0].start)\n throw new SyntaxError(\n `Polymorphic function '${name}': all variants must be either sync or async, not mixed.`,\n loc\n )\n }\n\n // Check for ambiguous signatures (same types at same positions, differing only in required/optional)\n for (let i = 0; i < variants.length; i++) {\n for (let j = i + 1; j < variants.length; j++) {\n const a = variants[i]\n const b = variants[j]\n\n // Different max arity is fine\n if (a.params.length !== b.params.length) continue\n\n // Same arity \u2014 check if types are identical at every position\n let allSame = true\n for (let k = 0; k < a.params.length; k++) {\n const sigA = a.params[k].defaultValue\n ? typeSignatureForDefault(a.params[k].defaultValue)\n : 'any'\n const sigB = b.params[k].defaultValue\n ? typeSignatureForDefault(b.params[k].defaultValue)\n : 'any'\n if (sigA !== sigB) {\n allSame = false\n break\n }\n }\n\n if (allSame) {\n const loc = locAt(source, b.start)\n throw new SyntaxError(\n `Polymorphic function '${name}': variants ${i + 1} and ${\n j + 1\n } have ambiguous signatures ` +\n `(same parameter types at every position). Overloads must differ by arity or parameter types.`,\n loc\n )\n }\n }\n }\n }\n\n // Phase 4: Build the transformed source\n // Sort all variants by position (reverse order for safe replacement)\n const allVariants: { name: string; variant: PolyVariant }[] = []\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n for (const v of variants) {\n allVariants.push({ name, variant: v })\n }\n }\n allVariants.sort((a, b) => b.variant.start - a.variant.start)\n\n // Replace each variant in reverse order (preserves positions)\n let result = source\n for (const { name, variant } of allVariants) {\n const asyncPrefix = variant.isAsync ? 'async ' : ''\n // Rename: function greet(...) -> function greet$1(...)\n // Strip \"export\" from variants \u2014 only the dispatcher is exported\n // Use $$ in replacement to produce literal $ (avoid backreference interpretation)\n const renamed = variant.text.replace(\n new RegExp(\n `(?:export\\\\s+)?${\n asyncPrefix ? asyncPrefix.replace(/\\s+$/, '\\\\s+') : ''\n }function\\\\s+${name}\\\\s*\\\\(`\n ),\n `${asyncPrefix}function ${name}$$${variant.index}(`\n )\n result =\n result.slice(0, variant.start) + renamed + result.slice(variant.end)\n }\n\n // Phase 5: Append dispatcher functions\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n polymorphicNames.add(name)\n\n const isAsync = variants[0].isAsync\n const isExported = variants.some((v) => v.exported)\n const asyncPrefix = isAsync ? 'async ' : ''\n const exportPrefix = isExported ? 'export ' : ''\n\n // Sort variants by specificity for dispatch order:\n // 1. More params first (higher arity)\n // 2. More specific types first (integer before number, object before any)\n const sorted = [...variants].sort((a, b) => {\n // Different arity: more params = more specific (checked first within same arity group)\n if (a.params.length !== b.params.length) return 0 // arity groups handled in dispatch\n\n // Same arity: count specificity\n let specA = 0\n let specB = 0\n for (const p of a.params) {\n const sig = p.defaultValue\n ? typeSignatureForDefault(p.defaultValue)\n : 'any'\n if (sig === 'non-negative-integer') specA += 3\n else if (sig === 'integer') specA += 2\n else if (sig !== 'any') specA += 1\n }\n for (const p of b.params) {\n const sig = p.defaultValue\n ? typeSignatureForDefault(p.defaultValue)\n : 'any'\n if (sig === 'non-negative-integer') specB += 3\n else if (sig === 'integer') specB += 2\n else if (sig !== 'any') specB += 1\n }\n return specB - specA // More specific first\n })\n\n // Generate dispatch branches\n const branches: string[] = []\n for (const v of sorted) {\n const checks: string[] = [`__args.length === ${v.params.length}`]\n const args: string[] = []\n\n for (let k = 0; k < v.params.length; k++) {\n const p = v.params[k]\n args.push(`__args[${k}]`)\n if (p.defaultValue) {\n const check = typeCheckForDefault(`__args[${k}]`, p.defaultValue)\n if (check !== 'true') checks.push(check)\n }\n }\n\n branches.push(\n ` if (${checks.join(' && ')}) return ${name}$${v.index}(${args.join(\n ', '\n )})`\n )\n }\n\n const dispatcher = `\n${exportPrefix}${asyncPrefix}function ${name}(...__args) {\n${branches.join('\\n')}\n return __tjs.typeError('${name}', 'no matching overload', __args)\n}\n`\n result += dispatcher\n }\n\n return { source: result, polymorphicNames }\n}\n\n/**\n * Transform bare assignments to const declarations\n *\n * Foo = ... -> const Foo = ...\n *\n * Only transforms assignments at statement level (start of line or after semicolon/brace)\n * where the identifier starts with uppercase (to avoid breaking normal assignments)\n */\nexport function transformBareAssignments(source: string): string {\n // Match: start of line/statement, uppercase identifier, =, not ==\n // Negative lookbehind for const/let/var to avoid double-declaring\n return source.replace(\n /(?<=^|[;\\n{])\\s*([A-Z][a-zA-Z0-9_]*)\\s*=(?!=)/gm,\n (match, name) => {\n // Check if already has const/let/var before it\n return match.replace(name, `const ${name}`)\n }\n )\n}\n\n/**\n * Parse source code into an Acorn AST\n */\n\nexport function extractAndRunTests(\n source: string,\n skipTests = false\n): {\n source: string\n tests: TestBlock[]\n errors: string[]\n} {\n const tests: TestBlock[] = []\n const errors: string[] = []\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'test' keyword followed by optional string then {\n const testMatch = source.slice(i).match(/^\\btest\\s+/)\n if (testMatch) {\n const start = i\n let j = i + testMatch[0].length\n\n // Check for optional description string\n let description: string | undefined\n const descMatch = source.slice(j).match(/^(['\"`])([^]*?)\\1\\s*/)\n if (descMatch) {\n description = descMatch[2]\n j += descMatch[0].length\n }\n\n // Must have opening brace\n if (source[j] === '{') {\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth === 0) {\n const body = source.slice(bodyStart, k - 1).trim()\n const end = k\n\n const line = (source.slice(0, start).match(/\\n/g) || []).length + 1\n tests.push({ description, body, start, end, line })\n\n // Run the test unless skipped\n if (!skipTests) {\n try {\n // Execute test in isolated context\n // The test has access to the Types defined before it\n const testFn = new Function(body)\n testFn()\n } catch (err: any) {\n const desc = description || `test at line ${line}`\n errors.push(\n `Test failed: ${desc} (line ${line})\\n ${err.message || err}`\n )\n }\n }\n\n // Strip the test block from output (replace with whitespace to preserve line numbers)\n const removed = source.slice(start, end)\n const newlines = (removed.match(/\\n/g) || []).length\n result += '\\n'.repeat(newlines)\n i = end\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return { source: result, tests, errors }\n}\n\n/**\n * Wrap class declarations to make them callable without `new`\n *\n * Transforms:\n * class Foo { ... }\n * To:\n * let Foo = class Foo { ... };\n * Foo = new Proxy(Foo, { apply(t, _, a) { return Reflect.construct(t, a) } });\n *\n * This emits standalone JS with no runtime dependencies.\n */\n\n/**\n * Transform polymorphic constructors into static factory functions.\n *\n * When a class has multiple constructor() declarations, the first becomes\n * the real constructor and the rest become factory functions. The wrapClass\n * Proxy routes through a polymorphic dispatcher.\n *\n * class Point {\n * constructor(x: 0.0, y: 0.0) { this.x = x; this.y = y }\n * constructor(coords: { x: 0.0, y: 0.0 }) { this.x = coords.x; this.y = coords.y }\n * }\n *\n * becomes:\n *\n * class Point {\n * constructor(x = 0.0, y = 0.0) { this.x = x; this.y = y }\n * }\n * function Point$ctor$2(coords = { x: 0.0, y: 0.0 }) { return new Point(coords.x, coords.y) }\n * // wrapClass Proxy dispatches through polymorphic factory\n */\nexport function transformPolymorphicConstructors(\n source: string,\n requiredParams: Set<string>\n): { source: string; polyCtorClasses: Set<string> } {\n const polyCtorClasses = new Set<string>()\n\n // Find classes with multiple constructors\n const classRegex = /\\bclass\\s+(\\w+)(\\s+extends\\s+\\w+)?\\s*\\{/g\n let classMatch\n\n // Collect all class info first\n const classInfos: {\n className: string\n extendsClause: string\n bodyStart: number\n bodyEnd: number\n body: string\n }[] = []\n\n while ((classMatch = classRegex.exec(source)) !== null) {\n const className = classMatch[1]\n const extendsClause = classMatch[2]?.trim() || ''\n const bodyStart = classMatch.index + classMatch[0].length - 1\n\n const bodyEnd = findFunctionBodyEnd(source, bodyStart)\n const body = source.slice(bodyStart, bodyEnd)\n\n classInfos.push({ className, extendsClause, bodyStart, bodyEnd, body })\n }\n\n // Process in reverse order to preserve positions\n let result = source\n for (let ci = classInfos.length - 1; ci >= 0; ci--) {\n const { className, extendsClause, bodyStart, bodyEnd, body } =\n classInfos[ci]\n\n // Find all constructor declarations in the class body\n const ctorPattern = /\\bconstructor\\s*\\(/g\n let ctorMatch\n const ctorPositions: number[] = []\n\n while ((ctorMatch = ctorPattern.exec(body)) !== null) {\n ctorPositions.push(ctorMatch.index)\n }\n\n if (ctorPositions.length < 2) continue // Not polymorphic\n\n polyCtorClasses.add(className)\n\n // Parse each constructor\n interface CtorInfo {\n index: number\n paramStr: string\n bodyText: string\n fullStart: number // relative to class body\n fullEnd: number // relative to class body\n }\n const ctors: CtorInfo[] = []\n\n for (let i = 0; i < ctorPositions.length; i++) {\n const pos = ctorPositions[i]\n\n // Find opening paren\n const parenStart = body.indexOf('(', pos)\n let parenDepth = 1\n let j = parenStart + 1\n while (j < body.length && parenDepth > 0) {\n if (body[j] === '(') parenDepth++\n if (body[j] === ')') parenDepth--\n j++\n }\n const paramStr = body.slice(parenStart + 1, j - 1)\n\n // Find opening brace\n let braceStart = j\n while (braceStart < body.length && body[braceStart] !== '{') braceStart++\n\n // Find matching closing brace\n const ctorBodyEnd = findFunctionBodyEnd(body, braceStart)\n const bodyText = body.slice(braceStart + 1, ctorBodyEnd - 1)\n\n ctors.push({\n index: i + 1,\n paramStr,\n bodyText,\n fullStart: pos,\n fullEnd: ctorBodyEnd,\n })\n }\n\n // Keep the first constructor in the class, remove the rest\n // Build new class body with only the first constructor\n let newBody = body.slice(0, ctors[0].fullEnd)\n // Skip subsequent constructors\n const afterLastCtor = ctors[ctors.length - 1].fullEnd\n newBody += body.slice(afterLastCtor)\n\n // But we need to remove just the extra constructors, keeping other methods\n // Better approach: remove constructors 2..N from the body\n let cleanBody = body\n for (let i = ctors.length - 1; i >= 1; i--) {\n const ctor = ctors[i]\n // Find start of this constructor (including leading whitespace)\n let start = ctor.fullStart\n while (start > 0 && cleanBody[start - 1] === ' ') start--\n if (start > 0 && cleanBody[start - 1] === '\\n') start--\n\n cleanBody = cleanBody.slice(0, start) + cleanBody.slice(ctor.fullEnd)\n }\n\n // Generate factory functions for constructors 2..N\n let factories = ''\n for (let i = 1; i < ctors.length; i++) {\n const ctor = ctors[i]\n // Parse params for type checking in dispatcher\n const params = parseParamList(ctor.paramStr, requiredParams)\n const hasRest = ctor.paramStr.includes('...')\n if (hasRest) {\n const loc = locAt(source, bodyStart + ctor.fullStart)\n throw new SyntaxError(\n `Rest parameters are not supported in polymorphic constructors for '${className}'.`,\n loc\n )\n }\n\n // The factory function creates the object manually\n // For base classes: use Object.create + call constructor body\n // Simpler: just use new ClassName() with the first ctor's params mapped\n // Actually simplest: the factory body IS the constructor body but with\n // `this.x = ...` replaced by building an object... No, that doesn't work\n // for inheritance.\n //\n // Best approach: factory creates via new, then applies the extra ctor body\n factories += `\\nfunction ${className}$ctor$${ctor.index}(${ctor.paramStr}) {`\n factories += `\\n const __obj = Object.create(${className}.prototype)`\n if (extendsClause) {\n // For derived classes, we can't easily call super() outside constructor\n // Just call the constructor body and hope it sets fields\n // Actually \u2014 the factory can just do: new ClassName(defaultArgs) then overwrite\n // Let's use a simpler approach: the factory just does new + field assignment\n }\n factories += `\\n ;(function() {${ctor.bodyText}}).call(__obj)`\n factories += `\\n return __obj`\n factories += `\\n}\\n`\n }\n\n // Generate the polymorphic dispatcher for the Proxy's apply trap\n // First constructor variant uses Reflect.construct, rest use factories\n const dispatchBranches: string[] = []\n\n for (let i = 0; i < ctors.length; i++) {\n const ctor = ctors[i]\n const params = parseParamList(ctor.paramStr, requiredParams)\n const checks: string[] = [`a.length === ${params.length}`]\n\n for (let k = 0; k < params.length; k++) {\n const p = params[k]\n if (p.defaultValue) {\n const check = typeCheckForDefault(`a[${k}]`, p.defaultValue)\n if (check !== 'true') checks.push(check)\n }\n }\n\n if (i === 0) {\n // First constructor \u2014 use Reflect.construct\n dispatchBranches.push(\n ` if (${checks.join(' && ')}) return Reflect.construct(t, a)`\n )\n } else {\n // Factory function\n const args = params.map((_, k) => `a[${k}]`).join(', ')\n dispatchBranches.push(\n ` if (${checks.join(' && ')}) return ${className}$ctor$${\n ctor.index\n }(${args})`\n )\n }\n }\n\n // Generate the dispatcher function\n factories += `\\nfunction ${className}$dispatch(t, a) {\\n`\n factories += dispatchBranches.join('\\n') + '\\n'\n factories += ` return __tjs.typeError('${className}', 'no matching constructor', a)\\n`\n factories += `}\\n`\n\n // Replace the class body and append factories\n result = result.slice(0, bodyStart) + cleanBody + result.slice(bodyEnd)\n\n // Insert factories after the class\n const insertPos = bodyStart + cleanBody.length\n result = result.slice(0, insertPos) + factories + result.slice(insertPos)\n }\n\n return { source: result, polyCtorClasses }\n}\n\nexport function wrapClassDeclarations(\n source: string,\n polyCtorClasses: Set<string> = new Set()\n): string {\n // Match class declarations: class Name { or class Name extends Base {\n // Capture the class name and find the full class body\n const classRegex = /\\bclass\\s+(\\w+)(\\s+extends\\s+\\w+)?\\s*\\{/g\n let result = ''\n let lastIndex = 0\n let match\n\n while ((match = classRegex.exec(source)) !== null) {\n const className = match[1]\n const extendsClause = match[2] || ''\n const classStart = match.index\n const bodyStart = classStart + match[0].length - 1 // position of {\n\n // Find matching closing brace\n let depth = 1\n let i = bodyStart + 1\n while (i < source.length && depth > 0) {\n const char = source[i]\n if (char === '{') depth++\n else if (char === '}') depth--\n i++\n }\n\n if (depth === 0) {\n const classEnd = i\n const classBody = source.slice(bodyStart, classEnd)\n\n // Emit standalone JS - no runtime dependency\n result += source.slice(lastIndex, classStart)\n result += `let ${className} = class ${className}${extendsClause} ${classBody}; `\n\n if (polyCtorClasses.has(className)) {\n // Polymorphic constructor: use dispatcher function for apply trap\n result += `${className} = new Proxy(${className}, { apply(t, _, a) { return ${className}$dispatch(t, a) }, construct(t, a) { return ${className}$dispatch(t, a) } });`\n } else {\n result += `${className} = new Proxy(${className}, { apply(t, _, a) { return Reflect.construct(t, a) } });`\n }\n lastIndex = classEnd\n }\n }\n\n result += source.slice(lastIndex)\n return result\n}\n\n/**\n * Validate that Date is not used (TjsDate mode)\n * Throws an error if Date constructor or static methods are found\n */\nexport function validateNoDate(source: string): string {\n // Match Date usage: new Date, Date.now, Date.parse, Date.UTC\n const datePatterns = [\n {\n pattern: /\\bnew\\s+Date\\b/,\n message:\n 'new Date() is not allowed in TjsDate mode. Use Timestamp.now() or Timestamp.from()',\n },\n {\n pattern: /\\bDate\\.now\\b/,\n message: 'Date.now() is not allowed in TjsDate mode. Use Timestamp.now()',\n },\n {\n pattern: /\\bDate\\.parse\\b/,\n message:\n 'Date.parse() is not allowed in TjsDate mode. Use Timestamp.parse()',\n },\n {\n pattern: /\\bDate\\.UTC\\b/,\n message:\n 'Date.UTC() is not allowed in TjsDate mode. Use Timestamp.from()',\n },\n ]\n\n for (const { pattern, message } of datePatterns) {\n if (pattern.test(source)) {\n throw new Error(message)\n }\n }\n\n return source\n}\n\n/**\n * Validate that eval and Function constructor are not used (TjsNoeval mode)\n * Note: Eval and SafeFunction from TJS runtime are allowed\n */\n/**\n * Transform const! declarations to const and validate immutability\n *\n * const! declares compile-time immutable bindings. The object itself\n * is not frozen at runtime (performance trap), but the transpiler\n * rejects any code that attempts to mutate the binding's properties.\n *\n * const! config = { debug: false, port: 8080 }\n * config.debug = true // ERROR: Cannot mutate immutable binding 'config'\n * console.log(config.port) // OK: reads are fine\n *\n * Emits as plain `const` \u2014 semantics are enforced at transpile time.\n * When runtimes support records/tuples, const! can emit those instead.\n */\nexport function transformConstBang(source: string): string {\n // Find all const! declarations and collect binding names\n const immutableNames = new Set<string>()\n\n // Match: const! name = ... or const! { a, b } = ... or const! [a, b] = ...\n const constBangRe = /\\bconst!\\s+(\\w+)\\b/g\n let m\n while ((m = constBangRe.exec(source)) !== null) {\n immutableNames.add(m[1])\n }\n\n if (immutableNames.size === 0) return source\n\n // Replace const! with const\n source = source.replace(/\\bconst!\\s+/g, 'const ')\n\n // Strip comments before checking mutations (avoid false positives\n // from code examples in TDoc comments)\n const stripped = source\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // block comments\n .replace(/\\/\\/[^\\n]*/g, '') // line comments\n\n // Check for mutations to immutable bindings\n for (const name of immutableNames) {\n // Property assignment: name.prop = ..., name[key] = ...\n const assignRe = new RegExp(\n `\\\\b${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])\\\\s*(?:=(?!=)|\\\\+\\\\+|--|\\\\+=|-=|\\\\*=|\\\\/=|%=|&&=|\\\\|\\\\|=|\\\\?\\\\?=|<<=|>>=|>>>=|\\\\^=|&=|\\\\|=)`,\n 'g'\n )\n if (assignRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // Prefix increment/decrement: ++name.prop, --name.prop\n const prefixRe = new RegExp(\n `(?:\\\\+\\\\+|--)\\\\s*${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])`,\n 'g'\n )\n if (prefixRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // delete name.prop\n const deleteRe = new RegExp(\n `\\\\bdelete\\\\s+${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])`,\n 'g'\n )\n if (deleteRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // push/pop/splice/shift/unshift/sort/reverse/fill on the binding\n const mutatingMethods =\n 'push|pop|splice|shift|unshift|sort|reverse|fill|copyWithin|set'\n const methodRe = new RegExp(\n `\\\\b${name}\\\\s*\\\\.\\\\s*(?:${mutatingMethods})\\\\s*\\\\(`,\n 'g'\n )\n if (methodRe.test(stripped)) {\n throw new Error(\n `Cannot call mutating method on immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n }\n\n return source\n}\n\nexport function validateNoVar(source: string): string {\n // Match var declarations at statement level (not inside strings/comments)\n // Catches: var x, var x = ..., var {x} = ..., var [x] = ...\n const varPattern = /(?<![a-zA-Z_$])\\bvar\\s+/\n if (varPattern.test(source)) {\n throw new Error(\n 'var is not allowed in TjsNoVar mode. Use const or let instead.'\n )\n }\n return source\n}\n\nexport function validateNoEval(source: string): string {\n // Match eval() calls - but not Eval() (capital E)\n // Use negative lookbehind to avoid matching inside words\n const evalPattern = /(?<![A-Za-z_$])\\beval\\s*\\(/\n if (evalPattern.test(source)) {\n throw new Error(\n 'eval() is not allowed in TjsNoeval mode. Use Eval() from TJS runtime for safe evaluation.'\n )\n }\n\n // Match new Function() - but not SafeFunction or other *Function names\n const functionPattern = /\\bnew\\s+Function\\s*\\(/\n if (functionPattern.test(source)) {\n throw new Error(\n 'new Function() is not allowed in TjsNoeval mode. Use SafeFunction() from TJS runtime.'\n )\n }\n\n return source\n}\n\n/**\n * Transform bang access (!.) to __tjs.bang() calls.\n *\n * x!.foo \u2192 __tjs.bang(x,'foo')\n * x.y!.foo \u2192 __tjs.bang(x.y,'foo')\n * fn()!.foo \u2192 __tjs.bang(fn(),'foo')\n * arr[0]!.foo \u2192 __tjs.bang(arr[0],'foo')\n * x!.foo!.bar \u2192 __tjs.bang(__tjs.bang(x,'foo'),'bar')\n *\n * If the source is null/undefined, returns MonadicError.\n * If the source is a MonadicError, propagates it.\n * Otherwise, performs a bare property access (throws as usual).\n */\nexport function transformBangAccess(source: string): string {\n // Quick bail \u2014 no !. in source at all\n if (!source.includes('!.')) return source\n\n let result = ''\n let i = 0\n\n // State tracking for strings/comments\n type State =\n | 'normal'\n | 'string-single'\n | 'string-double'\n | 'string-template'\n | 'line-comment'\n | 'block-comment'\n let state: State = 'normal'\n let templateDepth = 0\n\n while (i < source.length) {\n const ch = source[i]\n const next = source[i + 1]\n\n // State transitions\n if (state === 'normal') {\n if (ch === '/' && next === '/') {\n state = 'line-comment'\n result += ch\n i++\n continue\n }\n if (ch === '/' && next === '*') {\n state = 'block-comment'\n result += ch\n i++\n continue\n }\n if (ch === \"'\") {\n state = 'string-single'\n result += ch\n i++\n continue\n }\n if (ch === '\"') {\n state = 'string-double'\n result += ch\n i++\n continue\n }\n if (ch === '`') {\n state = 'string-template'\n templateDepth++\n result += ch\n i++\n continue\n }\n\n // Detect bang access: ! followed by . followed by a word char (not digit)\n if (\n ch === '!' &&\n next === '.' &&\n i + 2 < source.length &&\n /[a-zA-Z_$]/.test(source[i + 2])\n ) {\n // Scan backward in `result` to find the expression start\n const exprEnd = result.length\n const exprStart = findExprStartBackward(result)\n\n if (exprStart < exprEnd) {\n const expr = result.slice(exprStart)\n result = result.slice(0, exprStart)\n\n // Scan forward to capture the property name after !.\n let j = i + 2\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n const prop = source.slice(i + 2, j)\n\n result += `__tjs.bang(${expr},'${prop}')`\n i = j\n continue\n }\n }\n\n result += ch\n i++\n } else if (state === 'line-comment') {\n result += ch\n if (ch === '\\n') state = 'normal'\n i++\n } else if (state === 'block-comment') {\n result += ch\n if (ch === '*' && next === '/') {\n result += next\n state = 'normal'\n i += 2\n } else {\n i++\n }\n } else if (state === 'string-single') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === \"'\") {\n state = 'normal'\n i++\n } else {\n i++\n }\n } else if (state === 'string-double') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === '\"') {\n state = 'normal'\n i++\n } else {\n i++\n }\n } else if (state === 'string-template') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === '`') {\n templateDepth--\n state = templateDepth > 0 ? 'string-template' : 'normal'\n i++\n } else if (ch === '$' && next === '{') {\n result += next\n i += 2\n state = 'normal'\n } else {\n i++\n }\n } else {\n result += ch\n i++\n }\n }\n\n return result\n}\n\n/**\n * Scan backward through `text` to find the start of the expression\n * that ends at the last character of `text`.\n *\n * Handles: identifiers, member chains (. and ?.), function calls (),\n * computed access [], and nested combinations.\n */\nfunction findExprStartBackward(text: string): number {\n let pos = text.length - 1\n\n // Skip trailing whitespace\n while (pos >= 0 && /\\s/.test(text[pos])) pos--\n if (pos < 0) return text.length\n\n // Walk backward consuming expression parts\n while (pos >= 0) {\n const ch = text[pos]\n\n if (/[\\w$]/.test(ch)) {\n // Identifier \u2014 consume word chars\n while (pos >= 0 && /[\\w$]/.test(text[pos])) pos--\n // Check if preceded by . or ?. (member chain continues)\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') {\n pos -= 2\n } else {\n pos--\n }\n continue\n }\n return pos + 1\n } else if (ch === ')') {\n pos = findMatchingOpen(text, pos, '(', ')')\n if (pos < 0) return 0\n pos--\n if (pos >= 0 && /[\\w$]/.test(text[pos])) continue\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') pos -= 2\n else pos--\n continue\n }\n return pos + 1\n } else if (ch === ']') {\n pos = findMatchingOpen(text, pos, '[', ']')\n if (pos < 0) return 0\n pos--\n if (pos >= 0 && /[\\w$]/.test(text[pos])) continue\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') pos -= 2\n else pos--\n continue\n }\n return pos + 1\n } else {\n return pos + 1\n }\n }\n\n return 0\n}\n\n/** Find the matching opening bracket/paren scanning backward from `pos`. */\nfunction findMatchingOpen(\n text: string,\n pos: number,\n open: string,\n close: string\n): number {\n let depth = 1\n pos--\n while (pos >= 0 && depth > 0) {\n if (text[pos] === close) depth++\n else if (text[pos] === open) depth--\n if (depth > 0) pos--\n }\n return pos\n}\n", "/**\n * Type inference from value patterns\n *\n * Extracts types from example values:\n * 'string' -> { kind: 'string' }\n * 10 -> { kind: 'number' }\n * ['string'] -> { kind: 'array', items: { kind: 'string' } }\n * { name: 'string' } -> { kind: 'object', shape: { name: { kind: 'string' } } }\n * 'string' | null -> { kind: 'string', nullable: true }\n * 'string' | 0 -> { kind: 'union', members: [{ kind: 'string' }, { kind: 'number' }] }\n */\n\nimport { parseExpressionAt } from 'acorn'\nimport type { Expression, Pattern } from 'acorn'\nimport type { TypeDescriptor, ParameterDescriptor } from './types'\nimport { getLocation, TranspileError } from './types'\n\n/**\n * Infer type from a value expression (example value)\n */\nexport function inferTypeFromValue(node: Expression): TypeDescriptor {\n switch (node.type) {\n case 'Literal': {\n const value = (node as any).value\n if (value === null) {\n return { kind: 'null' }\n }\n if (typeof value === 'string') {\n return { kind: 'string' }\n }\n if (typeof value === 'number') {\n // Distinguish float vs integer by checking if source contains '.'\n // 2.0 -> number (float), 42 -> integer\n const raw = (node as any).raw as string | undefined\n if (raw && raw.includes('.')) {\n return { kind: 'number' }\n }\n return { kind: 'integer' }\n }\n if (typeof value === 'boolean') {\n return { kind: 'boolean' }\n }\n return { kind: 'any' }\n }\n\n case 'ArrayExpression': {\n const elements = (node as any).elements as Expression[]\n if (elements.length === 0) {\n return { kind: 'array', items: { kind: 'any' } }\n }\n // Infer type from all elements \u2014 if homogeneous, use that type;\n // if heterogeneous, produce a union of distinct kinds\n const itemTypes = elements\n .filter((el) => el != null)\n .map((el) => inferTypeFromValue(el))\n if (itemTypes.length === 0) {\n return { kind: 'array', items: { kind: 'any' } }\n }\n // Deduplicate by structure\n const seen = new Map<string, TypeDescriptor>()\n for (const t of itemTypes) {\n const key = JSON.stringify(t)\n if (!seen.has(key)) seen.set(key, t)\n }\n const unique = [...seen.values()]\n const items =\n unique.length === 1\n ? unique[0]\n : { kind: 'union' as const, members: unique }\n return { kind: 'array', items }\n }\n\n case 'ObjectExpression': {\n const properties = (node as any).properties as any[]\n const shape: Record<string, TypeDescriptor> = {}\n\n for (const prop of properties) {\n if (prop.type === 'Property' && prop.key.type === 'Identifier') {\n const key = prop.key.name\n shape[key] = inferTypeFromValue(prop.value)\n }\n }\n\n return { kind: 'object', shape }\n }\n\n case 'LogicalExpression': {\n const { operator, left, right } = node as any\n\n if (operator === '||') {\n // || is JavaScript logical OR \u2014 infer type from left operand\n return inferTypeFromValue(left)\n }\n\n if (operator === '&&') {\n // null && type means required type (null is just a marker)\n const rightType = inferTypeFromValue(right)\n return rightType\n }\n\n if (operator === '??') {\n // Nullish coalescing: left ?? right - type is the right side (fallback)\n const rightType = inferTypeFromValue(right)\n return rightType\n }\n\n return { kind: 'any' }\n }\n\n case 'BinaryExpression': {\n const { operator, left, right } = node as any\n // | means union type (e.g., 0 | null, '' | undefined)\n if (operator === '|') {\n const leftType = inferTypeFromValue(left)\n const rightType = inferTypeFromValue(right)\n\n if (rightType.kind === 'null') {\n return { ...leftType, nullable: true }\n }\n if (leftType.kind === 'null') {\n return { ...rightType, nullable: true }\n }\n return {\n kind: 'union',\n members: [leftType, rightType],\n }\n }\n return { kind: 'any' }\n }\n\n case 'Identifier': {\n // Handle undefined as a type\n if ((node as any).name === 'undefined') {\n return { kind: 'undefined' }\n }\n // Other identifiers in type position aren't valid example types\n return { kind: 'any' }\n }\n\n case 'UnaryExpression': {\n const op = (node as any).operator\n const arg = (node as any).argument\n\n // +N means non-negative integer (e.g., +1, +3)\n if (op === '+' && arg.type === 'Literal') {\n const value = arg.value\n if (typeof value === 'number') {\n return { kind: 'non-negative-integer' }\n }\n }\n\n // -N means integer or float depending on source\n if (op === '-' && arg.type === 'Literal') {\n const value = arg.value\n if (typeof value === 'number') {\n const raw = arg.raw as string | undefined\n if (raw && raw.includes('.')) {\n return { kind: 'number' }\n }\n return { kind: 'integer' }\n }\n }\n return { kind: 'any' }\n }\n\n default:\n return { kind: 'any' }\n }\n}\n\n/**\n * Parse a parameter and extract its type and default value\n *\n * @param param - The AST node for the parameter\n * @param requiredParams - Optional set of parameter names that are required (from colon syntax)\n */\nexport function parseParameter(\n param: Pattern,\n requiredParams?: Set<string>\n): ParameterDescriptor {\n // Simple identifier: function foo(x) - required, any type\n if (param.type === 'Identifier') {\n return {\n name: (param as any).name,\n type: { kind: 'any' },\n required: true,\n }\n }\n\n // Assignment pattern: function foo(x = value)\n if (param.type === 'AssignmentPattern') {\n const { left, right } = param as any\n\n if (left.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple parameter names are supported',\n getLocation(param)\n )\n }\n\n const name = left.name\n\n // Check if this parameter was marked as required via colon syntax\n const isRequired = requiredParams?.has(name) ?? false\n\n // Infer type from the example value\n const type = inferTypeFromValue(right)\n const exampleValue = extractLiteralValue(right)\n\n return {\n name,\n type,\n required: isRequired,\n default: isRequired ? null : exampleValue,\n example: exampleValue,\n loc: { start: param.start, end: param.end },\n }\n }\n\n // Destructuring pattern: function foo({ a, b })\n if (param.type === 'ObjectPattern') {\n // For destructuring, we create a synthetic \"args\" parameter\n // The individual properties become fields with their own defaults\n const properties = (param as any).properties as any[]\n const shape: Record<string, TypeDescriptor> = {}\n // Store full parameter descriptors for destructured properties\n const destructuredParams: Record<string, ParameterDescriptor> = {}\n\n for (const prop of properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? prop.key.name\n : String(prop.key.value)\n\n if (prop.value.type === 'Identifier') {\n // { name } - required, any type\n shape[key] = { kind: 'any' }\n destructuredParams[key] = {\n name: key,\n type: { kind: 'any' },\n required: true,\n }\n } else if (prop.value.type === 'AssignmentPattern') {\n // { name = default } - check requiredParams to see if this was originally colon syntax\n const innerParam = parseParameter(prop.value, requiredParams)\n const isRequired = requiredParams?.has(key) ?? false\n shape[key] = innerParam.type\n destructuredParams[key] = {\n name: key,\n type: innerParam.type,\n required: isRequired,\n default: isRequired ? null : innerParam.example,\n example: innerParam.example,\n }\n }\n }\n }\n\n return {\n name: '__destructured__',\n type: { kind: 'object', shape, destructuredParams },\n required: true,\n }\n }\n\n throw new TranspileError(\n `Unsupported parameter pattern: ${param.type}`,\n getLocation(param)\n )\n}\n\n/**\n * Extract a literal value from an expression for default values\n */\nexport function extractLiteralValue(node: Expression): any {\n switch (node.type) {\n case 'Literal':\n return (node as any).value\n\n case 'ArrayExpression':\n return (node as any).elements.map((el: Expression) =>\n el ? extractLiteralValue(el) : null\n )\n\n case 'ObjectExpression': {\n const result: Record<string, any> = {}\n for (const prop of (node as any).properties) {\n if (prop.type === 'Property' && prop.key.type === 'Identifier') {\n result[prop.key.name] = extractLiteralValue(prop.value)\n }\n }\n return result\n }\n\n case 'UnaryExpression':\n if ((node as any).operator === '-') {\n const arg = extractLiteralValue((node as any).argument)\n return typeof arg === 'number' ? -arg : undefined\n }\n if ((node as any).operator === '+') {\n const arg = extractLiteralValue((node as any).argument)\n return typeof arg === 'number' ? +arg : undefined\n }\n return undefined\n\n case 'BinaryExpression': {\n const { operator, left } = node as any\n // | is union type \u2014 extract the left (primary) example value\n if (operator === '|') {\n return extractLiteralValue(left)\n }\n return undefined\n }\n\n case 'LogicalExpression': {\n const { operator, left, right } = node as any\n if (operator === '&&') {\n // null && type evaluates to null (falsy short-circuit)\n if (left.type === 'Literal' && left.value === null) {\n return null\n }\n }\n if (operator === '||') {\n // value || fallback - return left if truthy\n const leftVal = extractLiteralValue(left)\n return leftVal ?? extractLiteralValue(right)\n }\n if (operator === '??') {\n // value ?? fallback - return left if not null/undefined\n const leftVal = extractLiteralValue(left)\n return leftVal ?? extractLiteralValue(right)\n }\n return undefined\n }\n\n default:\n return undefined\n }\n}\n\n/**\n * Parse return type from a type annotation expression\n */\nexport function parseReturnType(typeExpr: string): TypeDescriptor {\n // Simple approach: parse as expression and infer type\n try {\n const ast = parseExpressionAt(typeExpr, 0, {\n ecmaVersion: 2022,\n })\n return inferTypeFromValue(ast)\n } catch {\n return { kind: 'any' }\n }\n}\n\n/**\n * Convert TypeDescriptor to a human-readable string\n */\nexport function typeToString(type: TypeDescriptor): string {\n switch (type.kind) {\n case 'string':\n return type.nullable ? 'string | null' : 'string'\n case 'number':\n return type.nullable ? 'number | null' : 'number'\n case 'integer':\n return type.nullable ? 'integer | null' : 'integer'\n case 'non-negative-integer':\n return type.nullable\n ? 'non-negative integer | null'\n : 'non-negative integer'\n case 'boolean':\n return type.nullable ? 'boolean | null' : 'boolean'\n case 'null':\n return 'null'\n case 'any':\n return 'any'\n case 'array': {\n const items = type.items ? typeToString(type.items) : 'any'\n return type.nullable ? `${items}[] | null` : `${items}[]`\n }\n case 'object': {\n if (!type.shape || Object.keys(type.shape).length === 0) {\n return type.nullable ? 'object | null' : 'object'\n }\n const props = Object.entries(type.shape)\n .map(([k, v]) => `${k}: ${typeToString(v)}`)\n .join(', ')\n return type.nullable ? `{ ${props} } | null` : `{ ${props} }`\n }\n case 'union':\n return type.members?.map(typeToString).join(' | ') || 'any'\n default:\n return 'any'\n }\n}\n\n/**\n * Check if a value matches a type descriptor\n */\nexport function checkType(value: any, type: TypeDescriptor): boolean {\n // Handle null\n if (value === null || value === undefined) {\n return type.nullable || type.kind === 'null' || type.kind === 'any'\n }\n\n switch (type.kind) {\n case 'any':\n return true\n case 'null':\n return value === null\n case 'string':\n return typeof value === 'string'\n case 'number':\n return typeof value === 'number'\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value)\n case 'non-negative-integer':\n return typeof value === 'number' && Number.isInteger(value) && value >= 0\n case 'boolean':\n return typeof value === 'boolean'\n case 'array':\n if (!Array.isArray(value)) return false\n if (!type.items) return true\n return value.every((item) => checkType(item, type.items!))\n case 'object':\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false\n }\n if (!type.shape) return true\n // Check that all required shape properties exist and match\n for (const [key, propType] of Object.entries(type.shape)) {\n if (!checkType(value[key], propType)) {\n return false\n }\n }\n return true\n case 'union':\n if (!type.members) return true\n return type.members.some((member) => checkType(value, member))\n default:\n return true\n }\n}\n", "/**\n * ESTree to Agent99 AST Transformer\n *\n * Converts parsed JavaScript into Agent99's JSON AST format.\n */\n\nimport type {\n Statement,\n Expression,\n FunctionDeclaration,\n BlockStatement,\n VariableDeclaration,\n ExpressionStatement,\n IfStatement,\n WhileStatement,\n ForOfStatement,\n TryStatement,\n ReturnStatement,\n CallExpression,\n AssignmentExpression,\n BinaryExpression,\n LogicalExpression,\n MemberExpression,\n Identifier,\n Literal,\n TemplateLiteral,\n ArrayExpression,\n ObjectExpression,\n} from 'acorn'\nimport type { BaseNode } from '../../builder'\nimport type { ExprNode } from '../../runtime'\nimport type {\n TransformContext,\n TranspileOptions,\n FunctionSignature,\n ParameterDescriptor,\n TypeDescriptor,\n TranspileWarning,\n} from '../types'\nimport { TranspileError, getLocation, createChildContext } from '../types'\nimport {\n parseParameter,\n inferTypeFromValue,\n parseReturnType,\n} from '../inference'\nimport { extractTDoc } from '../parser'\n\n/**\n * Convert TypeDescriptor to JSON Schema\n */\nfunction typeToJsonSchema(type: TypeDescriptor): any {\n switch (type.kind) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'null':\n // null as a default value means \"any type, defaults to null\"\n // In JSON Schema, empty object means any type is allowed\n return {}\n case 'undefined':\n return {} // JSON Schema doesn't have undefined, treat as any\n case 'any':\n return {} // No constraints\n case 'array':\n return {\n type: 'array',\n items: type.items ? typeToJsonSchema(type.items) : {},\n }\n case 'object':\n if (type.shape) {\n const properties: Record<string, any> = {}\n for (const [key, propType] of Object.entries(type.shape)) {\n properties[key] = typeToJsonSchema(propType)\n }\n return {\n type: 'object',\n properties,\n additionalProperties: false,\n }\n }\n return { type: 'object' }\n case 'union':\n if (type.members) {\n return { oneOf: type.members.map(typeToJsonSchema) }\n }\n return {}\n default:\n return {}\n }\n}\n\n/**\n * Convert function parameters to JSON Schema for input validation\n */\nfunction parametersToJsonSchema(\n parameters: Record<string, ParameterDescriptor>\n): any {\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [name, param] of Object.entries(parameters)) {\n properties[name] = typeToJsonSchema(param.type)\n if (param.required) {\n required.push(name)\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n additionalProperties: false,\n }\n}\n\n/**\n * Transform a function declaration into Agent99 AST\n */\nexport function transformFunction(\n func: FunctionDeclaration,\n source: string,\n returnTypeAnnotation: string | undefined,\n options: TranspileOptions = {},\n requiredParamsFromPreprocess?: Set<string>\n): {\n ast: BaseNode\n signature: FunctionSignature\n warnings: TranspileWarning[]\n} {\n // Extract TDoc (/*# ... */) comments\n const tdoc = extractTDoc(source, func)\n\n // Parse parameters\n const parameters = new Map<string, ParameterDescriptor>()\n\n for (const param of func.params) {\n const parsed = parseParameter(param, requiredParamsFromPreprocess)\n\n // Handle destructured parameters - expand into individual params\n if (\n parsed.name === '__destructured__' &&\n parsed.type.kind === 'object' &&\n parsed.type.destructuredParams\n ) {\n for (const [key, paramDesc] of Object.entries(\n parsed.type.destructuredParams\n )) {\n parameters.set(key, {\n ...(paramDesc as any),\n description: tdoc.params[key],\n })\n }\n } else {\n parsed.description = tdoc.params[parsed.name]\n parameters.set(parsed.name, parsed)\n }\n }\n\n // Parse return type\n let returnType: TypeDescriptor | undefined\n if (returnTypeAnnotation) {\n returnType = parseReturnType(returnTypeAnnotation)\n }\n\n // Create transform context\n const ctx: TransformContext = {\n depth: 0,\n locals: new Map(),\n parameters,\n atoms: new Set(Object.keys(options.atoms || {})),\n warnings: [],\n source,\n filename: options.filename || '<source>',\n options,\n }\n\n // Transform function body\n const bodySteps = transformBlock(func.body, ctx)\n\n // Handle parameters: varsImport for required, varSet with defaults for optional\n const steps: BaseNode[] = []\n const requiredParams: string[] = []\n const optionalParams: Array<{ name: string; defaultValue: any }> = []\n\n for (const [name, param] of parameters.entries()) {\n if (param.required) {\n requiredParams.push(name)\n } else if (param.default !== undefined) {\n optionalParams.push({ name, defaultValue: param.default })\n } else {\n // Optional without explicit default - still import from args\n requiredParams.push(name)\n }\n }\n\n // Import required params directly from args\n if (requiredParams.length > 0) {\n steps.push({\n op: 'varsImport',\n keys: requiredParams,\n })\n }\n\n // For optional params with defaults: import from args, then check and set default if null\n for (const { name, defaultValue } of optionalParams) {\n // Import from args (will be undefined if not provided)\n steps.push({\n op: 'varsImport',\n keys: [name],\n })\n // If null/undefined, set the default\n steps.push({\n op: 'if',\n condition: {\n $expr: 'binary',\n op: '==',\n left: { $expr: 'ident', name },\n right: { $expr: 'literal', value: null },\n },\n then: [\n {\n op: 'varSet',\n key: name,\n value: defaultValue,\n },\n ],\n })\n }\n\n steps.push(...bodySteps)\n\n // Build signature\n const signatureParams = Object.fromEntries(parameters)\n const signature: FunctionSignature = {\n name: func.id?.name || 'anonymous',\n description: tdoc.description,\n parameters: signatureParams,\n returns: returnType,\n }\n\n // Generate input schema for runtime validation\n const inputSchema = parametersToJsonSchema(signatureParams)\n\n return {\n ast: { op: 'seq', steps, inputSchema },\n signature,\n warnings: ctx.warnings,\n }\n}\n\n/**\n * Transform a block statement into a list of steps\n */\nexport function transformBlock(\n block: BlockStatement,\n ctx: TransformContext\n): BaseNode[] {\n const steps: BaseNode[] = []\n\n for (const stmt of block.body) {\n const transformed = transformStatement(stmt, ctx)\n if (transformed) {\n if (Array.isArray(transformed)) {\n steps.push(...transformed)\n } else {\n steps.push(transformed)\n }\n }\n }\n\n return steps\n}\n\n/**\n * Transform a statement\n */\nexport function transformStatement(\n stmt: Statement,\n ctx: TransformContext\n): BaseNode | BaseNode[] | null {\n switch (stmt.type) {\n case 'VariableDeclaration':\n return transformVariableDeclaration(stmt as VariableDeclaration, ctx)\n\n case 'ExpressionStatement':\n return transformExpressionStatement(stmt as ExpressionStatement, ctx)\n\n case 'IfStatement':\n return transformIfStatement(stmt as IfStatement, ctx)\n\n case 'WhileStatement':\n return transformWhileStatement(stmt as WhileStatement, ctx)\n\n case 'ForOfStatement':\n return transformForOfStatement(stmt as ForOfStatement, ctx)\n\n case 'TryStatement':\n return transformTryStatement(stmt as TryStatement, ctx)\n\n case 'ReturnStatement':\n return transformReturnStatement(stmt as ReturnStatement, ctx)\n\n case 'ThrowStatement':\n throw new TranspileError(\n `'throw' is not supported in AsyncJS. Use Error('message') to trigger error flow`,\n getLocation(stmt),\n ctx.source,\n ctx.filename\n )\n\n case 'BlockStatement':\n // Nested block creates a scope\n return {\n op: 'scope',\n steps: transformBlock(stmt as BlockStatement, createChildContext(ctx)),\n }\n\n case 'EmptyStatement':\n return null\n\n default:\n throw new TranspileError(\n `Unsupported statement type: ${stmt.type}`,\n getLocation(stmt),\n ctx.source,\n ctx.filename\n )\n }\n}\n\n/**\n * Transform variable declaration: let x = value or const x = value\n */\nfunction transformVariableDeclaration(\n decl: VariableDeclaration,\n ctx: TransformContext\n): BaseNode[] {\n const steps: BaseNode[] = []\n const isConst = decl.kind === 'const'\n const opName = isConst ? 'constSet' : 'varSet'\n\n for (const declarator of decl.declarations) {\n if (declarator.id.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable names are supported',\n getLocation(declarator),\n ctx.source,\n ctx.filename\n )\n }\n\n const name = (declarator.id as Identifier).name\n\n if (declarator.init) {\n // Transform the initializer\n const { step, resultVar } = transformExpressionToStep(\n declarator.init,\n ctx,\n name,\n isConst\n )\n\n if (step) {\n steps.push(step)\n } else if (resultVar !== name) {\n // Simple value assignment\n steps.push({\n op: opName,\n key: name,\n value: resultVar,\n })\n }\n\n // Track variable type\n const type = inferTypeFromValue(declarator.init as Expression)\n ctx.locals.set(name, type)\n } else {\n // Uninitialized variable (only valid for let, not const)\n if (isConst) {\n throw new TranspileError(\n 'const declarations must be initialized',\n getLocation(declarator),\n ctx.source,\n ctx.filename\n )\n }\n steps.push({\n op: 'varSet',\n key: name,\n value: null,\n })\n ctx.locals.set(name, { kind: 'any', nullable: true })\n }\n }\n\n return steps\n}\n\n/**\n * Transform expression statement (e.g., function call)\n */\nfunction transformExpressionStatement(\n stmt: ExpressionStatement,\n ctx: TransformContext\n): BaseNode | null {\n const expr = stmt.expression\n\n // Assignment expression: x = value\n if (expr.type === 'AssignmentExpression') {\n return transformAssignment(expr as AssignmentExpression, ctx)\n }\n\n // Function call (side effect)\n if (expr.type === 'CallExpression') {\n const { step, resultVar } = transformExpressionToStep(expr, ctx)\n if (step) {\n return step\n }\n // If no step but we got an expression (e.g., method call on builtin),\n // we still need to evaluate it for side effects (like s.add(x))\n if (resultVar) {\n return {\n op: 'varSet',\n key: '_',\n value: resultVar,\n }\n }\n return null\n }\n\n // Other expressions (e.g., just a value) - no-op\n ctx.warnings.push({\n message: 'Expression statement has no effect',\n line: getLocation(stmt).line,\n column: getLocation(stmt).column,\n })\n\n return null\n}\n\n/**\n * Transform assignment: x = value\n */\nfunction transformAssignment(\n expr: AssignmentExpression,\n ctx: TransformContext\n): BaseNode {\n if (expr.left.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable assignment is supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n const name = (expr.left as Identifier).name\n const { step, resultVar } = transformExpressionToStep(expr.right, ctx, name)\n\n if (step) {\n return step\n }\n\n return {\n op: 'varSet',\n key: name,\n value: resultVar,\n }\n}\n\n/**\n * Transform if statement\n */\nfunction transformIfStatement(\n stmt: IfStatement,\n ctx: TransformContext\n): BaseNode {\n // Convert condition to ExprNode\n const condition = expressionToExprNode(stmt.test, ctx)\n\n // Transform then branch\n const thenSteps =\n stmt.consequent.type === 'BlockStatement'\n ? transformBlock(\n stmt.consequent as BlockStatement,\n createChildContext(ctx)\n )\n : ([transformStatement(stmt.consequent, ctx)].filter(\n Boolean\n ) as BaseNode[])\n\n // Transform else branch if present\n let elseSteps: BaseNode[] | undefined\n if (stmt.alternate) {\n elseSteps =\n stmt.alternate.type === 'BlockStatement'\n ? transformBlock(\n stmt.alternate as BlockStatement,\n createChildContext(ctx)\n )\n : ([transformStatement(stmt.alternate, ctx)].filter(\n Boolean\n ) as BaseNode[])\n }\n\n return {\n op: 'if',\n condition,\n then: thenSteps,\n ...(elseSteps && { else: elseSteps }),\n }\n}\n\n/**\n * Transform while statement\n */\nfunction transformWhileStatement(\n stmt: WhileStatement,\n ctx: TransformContext\n): BaseNode {\n const condition = expressionToExprNode(stmt.test, ctx)\n\n const body =\n stmt.body.type === 'BlockStatement'\n ? transformBlock(stmt.body as BlockStatement, createChildContext(ctx))\n : ([transformStatement(stmt.body, ctx)].filter(Boolean) as BaseNode[])\n\n return {\n op: 'while',\n condition,\n body,\n }\n}\n\n/**\n * Transform for...of statement into map atom\n */\nfunction transformForOfStatement(\n stmt: ForOfStatement,\n ctx: TransformContext\n): BaseNode {\n // Get the loop variable name\n let varName: string\n if (stmt.left.type === 'VariableDeclaration') {\n const decl = stmt.left.declarations[0]\n if (decl.id.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable names are supported in for...of',\n getLocation(stmt.left),\n ctx.source,\n ctx.filename\n )\n }\n varName = (decl.id as Identifier).name\n } else if (stmt.left.type === 'Identifier') {\n varName = (stmt.left as Identifier).name\n } else {\n throw new TranspileError(\n 'Unsupported for...of left-hand side',\n getLocation(stmt.left),\n ctx.source,\n ctx.filename\n )\n }\n\n // Get the iterable\n const items = expressionToValue(stmt.right, ctx)\n\n // Create child context with loop variable\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(varName, { kind: 'any' })\n\n // Transform body\n const steps =\n stmt.body.type === 'BlockStatement'\n ? transformBlock(stmt.body as BlockStatement, childCtx)\n : ([transformStatement(stmt.body, childCtx)].filter(\n Boolean\n ) as BaseNode[])\n\n return {\n op: 'map',\n items,\n as: varName,\n steps,\n }\n}\n\n/**\n * Transform try/catch statement\n */\nfunction transformTryStatement(\n stmt: TryStatement,\n ctx: TransformContext\n): BaseNode {\n const trySteps = transformBlock(stmt.block, createChildContext(ctx))\n\n let catchSteps: BaseNode[] | undefined\n let catchParam: string | undefined\n if (stmt.handler) {\n const catchCtx = createChildContext(ctx)\n // Add error variable to scope if named\n if (stmt.handler.param?.type === 'Identifier') {\n catchParam = (stmt.handler.param as Identifier).name\n catchCtx.locals.set(catchParam, {\n kind: 'any',\n })\n }\n catchSteps = transformBlock(stmt.handler.body, catchCtx)\n }\n\n return {\n op: 'try',\n try: trySteps,\n ...(catchSteps && { catch: catchSteps }),\n ...(catchParam && { catchParam }),\n }\n}\n\n/**\n * Transform return statement\n */\nfunction transformReturnStatement(\n stmt: ReturnStatement,\n ctx: TransformContext\n): BaseNode | BaseNode[] {\n if (!stmt.argument) {\n return { op: 'return', value: {} }\n }\n\n // Check if the return expression requires a preceding step (e.g., atom call)\n const { step, resultVar } = transformExpressionToStep(\n stmt.argument,\n ctx,\n '__returnVal__'\n )\n\n // If there's a step (atom call), emit it first, then return the result variable\n if (step) {\n return [step, { op: 'return', value: resultVar }]\n }\n\n // Otherwise, convert expression directly to a value for return\n const value = expressionToValue(stmt.argument, ctx)\n return { op: 'return', value }\n}\n\n// Known builtins that should be evaluated as expressions, not atom calls\nconst BUILTIN_OBJECTS = new Set([\n 'Math',\n 'JSON',\n 'Array',\n 'Object',\n 'String',\n 'Number',\n 'console',\n 'Date', // Date factory with static methods like Date.now()\n 'Schema', // tosijs-schema fluent API for building JSON Schemas\n])\n\nconst BUILTIN_GLOBALS = new Set([\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'encodeURI',\n 'decodeURI',\n 'encodeURIComponent',\n 'decodeURIComponent',\n 'Set', // Factory function for set-like objects\n 'Date', // Factory function for date-like objects\n 'filter', // Schema-based object filtering\n])\n\nconst UNSUPPORTED_BUILTINS = new Set([\n 'RegExp',\n 'Promise',\n 'Map',\n 'WeakSet',\n 'WeakMap',\n 'Symbol',\n 'Proxy',\n 'Reflect',\n 'Function',\n 'eval',\n 'setTimeout',\n 'setInterval',\n 'fetch',\n 'require',\n 'import',\n 'process',\n 'window',\n 'document',\n 'global',\n 'globalThis',\n])\n\n// Instance methods that should be evaluated as expressions, not atom calls\n// These are methods on values (strings, arrays, etc.) that have native implementations\nconst INSTANCE_METHODS = new Set([\n // String methods\n 'toUpperCase',\n 'toLowerCase',\n 'trim',\n 'trimStart',\n 'trimEnd',\n 'charAt',\n 'charCodeAt',\n 'codePointAt',\n 'concat',\n 'includes',\n 'indexOf',\n 'lastIndexOf',\n 'startsWith',\n 'endsWith',\n 'slice',\n 'substring',\n 'substr',\n 'replace',\n 'replaceAll',\n 'match',\n 'search',\n 'padStart',\n 'padEnd',\n 'repeat',\n 'normalize',\n 'localeCompare',\n 'toString',\n 'valueOf',\n 'at',\n // Array methods (that don't need special atom handling)\n 'reverse',\n 'sort',\n 'fill',\n 'copyWithin',\n 'flat',\n 'flatMap',\n 'every',\n 'some',\n 'forEach',\n // Note: map, filter, find, reduce are handled specially as atoms for lambda support\n // Set methods (from Set() builtin)\n 'add',\n 'remove',\n 'has',\n 'clear',\n 'toArray',\n 'union',\n 'intersection',\n 'diff',\n // Date methods (from Date() builtin)\n 'format',\n 'isBefore',\n 'isAfter',\n // Note: Date.add and Date.diff are method calls that return new values\n])\n\n/**\n * Check if a CallExpression is a builtin call (Math.floor, JSON.parse, etc.)\n * or an instance method call (str.toUpperCase(), arr.includes(), etc.)\n */\nfunction isBuiltinCall(expr: CallExpression): boolean {\n // Check for global functions like parseInt()\n if (expr.callee.type === 'Identifier') {\n const name = (expr.callee as Identifier).name\n return BUILTIN_GLOBALS.has(name) || UNSUPPORTED_BUILTINS.has(name)\n }\n\n // Check for method calls\n if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n\n // Check for method calls on builtin objects like Math.floor()\n if (member.object.type === 'Identifier') {\n const objName = (member.object as Identifier).name\n if (BUILTIN_OBJECTS.has(objName) || UNSUPPORTED_BUILTINS.has(objName)) {\n return true\n }\n }\n\n // Check for instance method calls like str.toUpperCase()\n if (member.property.type === 'Identifier') {\n const methodName = (member.property as Identifier).name\n if (INSTANCE_METHODS.has(methodName)) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Check if a MemberExpression is accessing a builtin object (Math.PI, Number.MAX_VALUE, etc.)\n */\nfunction isBuiltinMemberAccess(expr: MemberExpression): boolean {\n if (expr.object.type === 'Identifier') {\n const objName = (expr.object as Identifier).name\n return BUILTIN_OBJECTS.has(objName) || UNSUPPORTED_BUILTINS.has(objName)\n }\n return false\n}\n\n// Error messages for unsupported builtins\nconst UNSUPPORTED_BUILTIN_MESSAGES: Record<string, string> = {\n RegExp: 'RegExp is not available. Use string methods or the regexMatch atom.',\n Promise: 'Promise is not needed. All operations are implicitly async.',\n Map: 'Map is not available. Use plain objects instead.',\n WeakSet: 'WeakSet is not available.',\n WeakMap: 'WeakMap is not available.',\n Symbol: 'Symbol is not available.',\n Proxy: 'Proxy is not available.',\n Reflect: 'Reflect is not available.',\n Function: 'Function constructor is not available. Define functions normally.',\n eval: 'eval is not available. Code is compiled, not evaluated.',\n setTimeout: 'setTimeout is not available. Use the delay atom.',\n setInterval: 'setInterval is not available. Use while loops with delay.',\n fetch: 'fetch is not available. Use the httpFetch atom.',\n require: 'require is not available. Atoms must be registered with the VM.',\n import: 'import is not available. Atoms must be registered with the VM.',\n process: 'process is not available. AsyncJS runs in a sandboxed environment.',\n window: 'window is not available. AsyncJS runs in a sandboxed environment.',\n document:\n 'document is not available. AsyncJS runs in a sandboxed environment.',\n global: 'global is not available. AsyncJS runs in a sandboxed environment.',\n globalThis: 'globalThis is not available. Use builtins directly.',\n}\n\n/**\n * Check if expression uses an unsupported builtin and return error message if so\n */\nfunction getUnsupportedBuiltinError(expr: CallExpression): string | null {\n if (expr.callee.type === 'Identifier') {\n const name = (expr.callee as Identifier).name\n if (UNSUPPORTED_BUILTINS.has(name)) {\n return (\n UNSUPPORTED_BUILTIN_MESSAGES[name] ||\n `${name} is not available in AsyncJS.`\n )\n }\n }\n\n if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n if (member.object.type === 'Identifier') {\n const objName = (member.object as Identifier).name\n if (UNSUPPORTED_BUILTINS.has(objName)) {\n return (\n UNSUPPORTED_BUILTIN_MESSAGES[objName] ||\n `${objName} is not available in AsyncJS.`\n )\n }\n }\n }\n\n return null\n}\n\n/**\n * Get helpful suggestion for 'new' expression alternatives\n */\nfunction getNewExpressionSuggestion(constructorName: string): string {\n const suggestions: Record<string, string> = {\n Date: \" Use Date() or Date('2024-01-15') instead - no 'new' needed.\",\n Set: \" Use Set([items]) instead - no 'new' needed.\",\n Map: ' Use plain objects instead of Map.',\n Array: ' Use array literals like [1, 2, 3] instead.',\n Object: ' Use object literals like { key: value } instead.',\n Error: \" Return an error object like { error: 'message' } instead.\",\n RegExp: ' Use string methods or the regexMatch atom.',\n Promise: ' Not needed - all operations are implicitly async.',\n WeakSet: ' WeakSet is not available.',\n WeakMap: ' WeakMap is not available.',\n }\n return (\n suggestions[constructorName] ||\n ' Use factory functions or object literals instead.'\n )\n}\n\n/**\n * Transform an expression, potentially into a step with a result variable\n */\nfunction transformExpressionToStep(\n expr: Expression,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode | null; resultVar: any } {\n const varOp = isConst ? 'constSet' : 'varSet'\n\n // Unwrap ChainExpression (optional chaining wrapper)\n if (expr.type === 'ChainExpression') {\n const chain = expr as any\n // The inner expression has optional: true on the relevant nodes\n // Just recurse with the unwrapped expression\n return transformExpressionToStep(\n chain.expression as Expression,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Check for 'new' keyword - not supported in AsyncJS\n if (expr.type === 'NewExpression') {\n const newExpr = expr as any\n let constructorName = 'constructor'\n if (newExpr.callee.type === 'Identifier') {\n constructorName = newExpr.callee.name\n }\n const suggestion = getNewExpressionSuggestion(constructorName)\n throw new TranspileError(\n `The 'new' keyword is not supported in AsyncJS.${suggestion}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n // Check for unsupported builtins first and give helpful error\n if (expr.type === 'CallExpression') {\n const unsupportedError = getUnsupportedBuiltinError(expr as CallExpression)\n if (unsupportedError) {\n throw new TranspileError(\n unsupportedError,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n }\n\n // Check if this is a builtin call (Math.floor, JSON.parse, parseInt, etc.)\n // Builtins are evaluated as expressions, not atom calls\n if (expr.type === 'CallExpression' && isBuiltinCall(expr as CallExpression)) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n return { step: null, resultVar: exprNode as any }\n }\n\n // Check if this is a builtin member access (Math.PI, Number.MAX_SAFE_INTEGER, etc.)\n if (\n expr.type === 'MemberExpression' &&\n isBuiltinMemberAccess(expr as MemberExpression)\n ) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n return { step: null, resultVar: exprNode as any }\n }\n\n // Function call -> atom invocation\n if (expr.type === 'CallExpression') {\n return transformCallExpression(\n expr as CallExpression,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Template literal -> template atom\n if (expr.type === 'TemplateLiteral') {\n return transformTemplateLiteral(\n expr as TemplateLiteral,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Binary/logical/unary expression - convert to ExprNode\n if (\n expr.type === 'BinaryExpression' ||\n expr.type === 'LogicalExpression' ||\n expr.type === 'UnaryExpression'\n ) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n // If we need to store the result, emit a varSet/constSet with the expression node as value\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n // No storage needed, just return the expression node as the result\n return { step: null, resultVar: exprNode as any }\n }\n\n // Simple value - no step needed\n const value = expressionToValue(expr, ctx)\n return { step: null, resultVar: value }\n}\n\n/**\n * Transform a function call expression\n */\nfunction transformCallExpression(\n expr: CallExpression,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n // Get the function name\n let funcName: string\n let isMethodCall = false\n let receiver: any\n\n if (expr.callee.type === 'Identifier') {\n funcName = (expr.callee as Identifier).name\n } else if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n if (member.property.type === 'Identifier') {\n funcName = (member.property as Identifier).name\n isMethodCall = true\n receiver = expressionToValue(member.object as Expression, ctx)\n } else {\n throw new TranspileError(\n 'Computed method names are not supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n } else {\n throw new TranspileError(\n 'Only named function calls are supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n // Handle built-in method calls\n if (isMethodCall) {\n return transformMethodCall(\n funcName,\n receiver,\n expr.arguments as Expression[],\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Handle console.log specially\n if (funcName === 'console' && expr.callee.type === 'MemberExpression') {\n // This would be caught above, but just in case\n }\n\n // Check if it's a known atom\n // For now, we assume any function call is an atom call\n // The VM will validate at runtime\n\n // Extract arguments\n const args = extractCallArguments(expr, ctx)\n\n return {\n step: {\n op: funcName,\n ...args,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Handle method calls like arr.map(), str.slice(), etc.\n */\nfunction transformMethodCall(\n method: string,\n receiver: any,\n args: Expression[],\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n switch (method) {\n case 'map':\n // arr.map(x => ...) -> map atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n let steps: BaseNode[]\n if (callback.body.type === 'BlockStatement') {\n steps = transformBlock(callback.body, childCtx)\n } else {\n // Expression body: x => x * 2\n const { step, resultVar: exprResult } = transformExpressionToStep(\n callback.body,\n childCtx,\n 'result'\n )\n steps = step\n ? [step]\n : [{ op: 'varSet', key: 'result', value: exprResult }]\n }\n\n return {\n step: {\n op: 'map',\n items: receiver,\n as: paramName,\n steps,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'filter':\n // arr.filter(x => condition) -> filter atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n // For filter, the callback should return a boolean expression\n // Convert the body to an ExprNode\n let condition: any\n if (callback.body.type === 'BlockStatement') {\n // Block body - look for return statement\n throw new TranspileError(\n 'filter callback must be an expression, not a block',\n getLocation(args[0]),\n ctx.source,\n ctx.filename\n )\n } else {\n // Expression body: x => x > 5\n condition = expressionToExprNode(callback.body, childCtx)\n }\n\n return {\n step: {\n op: 'filter',\n items: receiver,\n as: paramName,\n condition,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'find':\n // arr.find(x => condition) -> find atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n let condition: any\n if (callback.body.type === 'BlockStatement') {\n throw new TranspileError(\n 'find callback must be an expression, not a block',\n getLocation(args[0]),\n ctx.source,\n ctx.filename\n )\n } else {\n condition = expressionToExprNode(callback.body, childCtx)\n }\n\n return {\n step: {\n op: 'find',\n items: receiver,\n as: paramName,\n condition,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'reduce':\n // arr.reduce((acc, x) => expr, initial) -> reduce atom\n if (\n args.length >= 2 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const accParam = callback.params[0]\n const itemParam = callback.params[1]\n const accName = accParam?.type === 'Identifier' ? accParam.name : 'acc'\n const itemName =\n itemParam?.type === 'Identifier' ? itemParam.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(accName, { kind: 'any' })\n childCtx.locals.set(itemName, { kind: 'any' })\n\n let steps: BaseNode[]\n if (callback.body.type === 'BlockStatement') {\n steps = transformBlock(callback.body, childCtx)\n } else {\n // Expression body: (acc, x) => acc + x\n const { step, resultVar: exprResult } = transformExpressionToStep(\n callback.body,\n childCtx,\n 'result'\n )\n steps = step\n ? [step]\n : [{ op: 'varSet', key: 'result', value: exprResult }]\n }\n\n const initial = expressionToValue(args[1], ctx)\n\n return {\n step: {\n op: 'reduce',\n items: receiver,\n as: itemName,\n accumulator: accName,\n initial,\n steps,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'slice':\n // TODO: Could map to a slice atom\n break\n\n case 'push':\n return {\n step: {\n op: 'push',\n list: receiver,\n item: expressionToValue(args[0], ctx),\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n\n case 'join':\n return {\n step: {\n op: 'join',\n list: receiver,\n sep: args.length > 0 ? expressionToValue(args[0], ctx) : '',\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n\n case 'split':\n return {\n step: {\n op: 'split',\n str: receiver,\n sep: args.length > 0 ? expressionToValue(args[0], ctx) : '',\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n\n // Unknown method - emit warning and try as generic call\n ctx.warnings.push({\n message: `Unknown method '${method}' - treating as atom call`,\n line: 0,\n column: 0,\n })\n\n return {\n step: {\n op: method,\n receiver,\n args: args.map((a) => expressionToValue(a, ctx)),\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Transform template literal\n */\nfunction transformTemplateLiteral(\n expr: TemplateLiteral,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n // Build template string with {{var}} placeholders\n let tmpl = ''\n const vars: Record<string, any> = {}\n\n for (let i = 0; i < expr.quasis.length; i++) {\n tmpl += expr.quasis[i].value.cooked || expr.quasis[i].value.raw\n\n if (i < expr.expressions.length) {\n const exprNode = expr.expressions[i]\n const varName = `_${i}`\n vars[varName] = expressionToValue(exprNode as Expression, ctx)\n tmpl += `{{${varName}}}`\n }\n }\n\n return {\n step: {\n op: 'template',\n tmpl,\n vars,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Convert an Acorn expression to an ExprNode for direct VM evaluation.\n * This replaces the string-based condition system.\n */\nfunction expressionToExprNode(\n expr: Expression,\n ctx: TransformContext\n): ExprNode {\n switch (expr.type) {\n case 'Literal': {\n const lit = expr as Literal\n return { $expr: 'literal', value: lit.value }\n }\n\n case 'Identifier': {\n const id = expr as Identifier\n return { $expr: 'ident', name: id.name }\n }\n\n case 'MemberExpression': {\n const mem = expr as MemberExpression\n const obj = expressionToExprNode(mem.object as Expression, ctx)\n const isOptional = (mem as any).optional === true\n\n if (mem.computed) {\n // arr[0] or obj[key] - computed access\n // For now, only support literal indices\n const prop = mem.property as Expression\n if (prop.type === 'Literal') {\n return {\n $expr: 'member',\n object: obj,\n property: String((prop as Literal).value),\n computed: true,\n ...(isOptional && { optional: true }),\n }\n }\n // For computed with variable, we'd need more complex handling\n throw new TranspileError(\n 'Computed member access with variables not yet supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n const propName = (mem.property as Identifier).name\n return {\n $expr: 'member',\n object: obj,\n property: propName,\n ...(isOptional && { optional: true }),\n }\n }\n\n case 'ChainExpression': {\n // ChainExpression wraps optional chaining (?.)\n // Just unwrap to the inner expression which will have optional: true\n const chain = expr as any\n return expressionToExprNode(chain.expression as Expression, ctx)\n }\n\n case 'BinaryExpression': {\n const bin = expr as BinaryExpression\n return {\n $expr: 'binary',\n op: bin.operator,\n left: expressionToExprNode(bin.left as Expression, ctx),\n right: expressionToExprNode(bin.right as Expression, ctx),\n }\n }\n\n case 'LogicalExpression': {\n const log = expr as LogicalExpression\n return {\n $expr: 'logical',\n op: log.operator as '&&' | '||' | '??',\n left: expressionToExprNode(log.left as Expression, ctx),\n right: expressionToExprNode(log.right as Expression, ctx),\n }\n }\n\n case 'UnaryExpression': {\n const un = expr as any\n return {\n $expr: 'unary',\n op: un.operator,\n argument: expressionToExprNode(un.argument as Expression, ctx),\n }\n }\n\n case 'ConditionalExpression': {\n const cond = expr as any\n return {\n $expr: 'conditional',\n test: expressionToExprNode(cond.test as Expression, ctx),\n consequent: expressionToExprNode(cond.consequent as Expression, ctx),\n alternate: expressionToExprNode(cond.alternate as Expression, ctx),\n }\n }\n\n case 'ArrayExpression': {\n const arr = expr as ArrayExpression\n return {\n $expr: 'array',\n elements: arr.elements\n .filter((el): el is Expression => el !== null)\n .map((el) => expressionToExprNode(el, ctx)),\n }\n }\n\n case 'ObjectExpression': {\n const obj = expr as ObjectExpression\n const properties: { key: string; value: ExprNode }[] = []\n\n for (const prop of obj.properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n properties.push({\n key,\n value: expressionToExprNode(prop.value as Expression, ctx),\n })\n }\n }\n\n return { $expr: 'object', properties }\n }\n\n case 'CallExpression': {\n const call = expr as CallExpression\n\n // Handle method calls (e.g., Math.floor(x), str.toUpperCase(), arr.push(x))\n if (call.callee.type === 'MemberExpression') {\n const member = call.callee as MemberExpression\n const method =\n member.property.type === 'Identifier'\n ? (member.property as Identifier).name\n : String((member.property as Literal).value)\n\n // Check for optional chaining: obj?.method() or obj.method?.()\n const isOptional =\n (member as any).optional === true || (call as any).optional === true\n\n return {\n $expr: 'methodCall',\n object: expressionToExprNode(member.object as Expression, ctx),\n method,\n arguments: call.arguments.map((arg) =>\n expressionToExprNode(arg as Expression, ctx)\n ),\n ...(isOptional && { optional: true }),\n }\n }\n\n // Handle global function calls (e.g., parseInt(x), parseFloat(x))\n if (call.callee.type === 'Identifier') {\n const funcName = (call.callee as Identifier).name\n return {\n $expr: 'call',\n callee: funcName,\n arguments: call.arguments.map((arg) =>\n expressionToExprNode(arg as Expression, ctx)\n ),\n }\n }\n\n // Other call types not supported in expressions\n throw new TranspileError(\n 'Complex function calls in expressions should be lifted to statements',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n case 'NewExpression': {\n const newExpr = expr as any\n let constructorName = 'constructor'\n if (newExpr.callee.type === 'Identifier') {\n constructorName = newExpr.callee.name\n }\n const suggestion = getNewExpressionSuggestion(constructorName)\n throw new TranspileError(\n `The 'new' keyword is not supported in AsyncJS.${suggestion}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n case 'TemplateLiteral':\n throw new TranspileError(\n 'Template literals inside expressions are not supported. ' +\n 'Assign to a variable first: const msg = `hello ${name}`; then use msg',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n\n default:\n throw new TranspileError(\n `Unsupported expression type in condition: ${expr.type}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n}\n\n// Note: extractCondition, expressionToConditionString, and extractVariablesFromExpression\n// have been removed. Use expressionToExprNode instead - it converts Acorn AST directly\n// to ExprNode format, eliminating the need for JSEP string parsing at runtime.\n\n/**\n * Convert an expression to a runtime value (for varSet, etc.)\n */\nfunction expressionToValue(expr: Expression, ctx: TransformContext): any {\n switch (expr.type) {\n case 'Literal':\n return (expr as Literal).value\n\n case 'Identifier': {\n const name = (expr as Identifier).name\n // Parameters are imported into state via varsImport at function start,\n // so we reference them as state variables (just the name string)\n // No need for $kind: 'arg' since args are copied to state\n return name\n }\n\n case 'MemberExpression': {\n const mem = expr as MemberExpression\n const isOptional = (mem as any).optional === true\n\n // If optional chaining, we need an ExprNode for proper runtime handling\n if (isOptional) {\n return expressionToExprNode(expr, ctx)\n }\n\n const objValue = expressionToValue(mem.object as Expression, ctx)\n\n // If the object resolved to an ExprNode (e.g., from nested optional chaining),\n // we need to build an ExprNode for this access too\n if (objValue && typeof objValue === 'object' && objValue.$expr) {\n const prop = mem.computed\n ? String((mem.property as Literal).value)\n : (mem.property as Identifier).name\n return {\n $expr: 'member',\n object: objValue,\n property: prop,\n ...(mem.computed && { computed: true }),\n }\n }\n\n if (mem.computed) {\n // arr[0] - would need runtime evaluation\n return `${objValue}[${expressionToValue(\n mem.property as Expression,\n ctx\n )}]`\n }\n\n const prop = (mem.property as Identifier).name\n\n // If objValue is a string path, extend it\n if (typeof objValue === 'string') {\n return `${objValue}.${prop}`\n }\n\n // If objValue is an arg ref, extend the path\n if (objValue && objValue.$kind === 'arg') {\n return { $kind: 'arg', path: `${objValue.path}.${prop}` }\n }\n\n return `${objValue}.${prop}`\n }\n\n case 'ChainExpression': {\n // Unwrap ChainExpression and process the inner expression\n const chain = expr as any\n return expressionToValue(chain.expression as Expression, ctx)\n }\n\n case 'ArrayExpression':\n return (expr as ArrayExpression).elements.map((el) =>\n el ? expressionToValue(el as Expression, ctx) : null\n )\n\n case 'ObjectExpression': {\n const result: Record<string, any> = {}\n for (const prop of (expr as ObjectExpression).properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n result[key] = expressionToValue(prop.value as Expression, ctx)\n }\n }\n return result\n }\n\n case 'TemplateLiteral':\n // Template literals need runtime evaluation - convert to ExprNode\n // This will throw a helpful error explaining the limitation\n return expressionToExprNode(expr, ctx)\n\n case 'CallExpression':\n // Method calls like s.toArray() used as values need to be ExprNodes\n return expressionToExprNode(expr, ctx)\n\n case 'BinaryExpression':\n case 'LogicalExpression':\n case 'UnaryExpression':\n case 'ConditionalExpression':\n // Complex expressions need to be ExprNodes for runtime evaluation\n return expressionToExprNode(expr, ctx)\n\n default:\n return null\n }\n}\n\n/**\n * Extract call arguments from a call expression\n */\nfunction extractCallArguments(\n expr: CallExpression,\n ctx: TransformContext\n): Record<string, any> {\n // If single object argument, spread it\n if (\n expr.arguments.length === 1 &&\n expr.arguments[0].type === 'ObjectExpression'\n ) {\n const obj = expr.arguments[0] as ObjectExpression\n const result: Record<string, any> = {}\n\n for (const prop of obj.properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n result[key] = expressionToValue(prop.value as Expression, ctx)\n }\n }\n\n return result\n }\n\n // Otherwise, use positional args\n return {\n args: expr.arguments.map((arg) =>\n expressionToValue(arg as Expression, ctx)\n ),\n }\n}\n", "/**\n * TJS Core - Essential transpiler functions without TypeScript dependency\n *\n * This module provides the core AJS transpilation functions.\n * Import from here (not ./index) to avoid pulling in the TS compiler.\n */\n\nimport type { SeqNode } from '../builder'\nimport type {\n TranspileOptions,\n TranspileResult,\n FunctionSignature,\n TypeDescriptor,\n} from './types'\nimport { parse, validateSingleFunction } from './parser'\nimport { transformFunction } from './emitters/ast'\nimport {\n transpileToJS,\n type TJSTranspileResult,\n type TJSTranspileOptions,\n} from './emitters/js'\n\nexport * from './types'\nexport {\n parse,\n preprocess,\n extractTDoc,\n validateSingleFunction,\n} from './parser'\nexport { transformFunction } from './emitters/ast'\n\n/**\n * Transpile JavaScript source code to Agent99 AST\n */\nexport function transpile(\n source: string,\n options: TranspileOptions = {}\n): TranspileResult {\n const {\n ast: program,\n returnType,\n originalSource,\n requiredParams,\n } = parse(source, {\n filename: options.filename,\n colonShorthand: true,\n vmTarget: true,\n })\n\n const func = validateSingleFunction(program, options.filename)\n\n const { ast, signature, warnings } = transformFunction(\n func,\n originalSource,\n returnType,\n options,\n requiredParams\n )\n\n return {\n ast: ast as SeqNode,\n signature,\n warnings,\n }\n}\n\n/**\n * Transpile AsyncJS source and return just the AST\n */\nexport function ajs(strings: TemplateStringsArray, ...values: any[]): SeqNode\nexport function ajs(source: string): SeqNode\nexport function ajs(\n sourceOrStrings: string | TemplateStringsArray,\n ...values: any[]\n): SeqNode {\n if (typeof sourceOrStrings === 'string') {\n return transpile(sourceOrStrings).ast\n }\n const source = sourceOrStrings.reduce(\n (acc, str, i) =>\n acc + str + (values[i] !== undefined ? String(values[i]) : ''),\n ''\n )\n return transpile(source).ast\n}\n\n/**\n * Create a function with attached signature for introspection\n */\nexport function createAgent(\n source: string,\n vm: { run: (ast: any, args: any, options?: any) => Promise<any> },\n runOptions?: { fuel?: number; capabilities?: any }\n): ((args: Record<string, any>) => Promise<any>) & {\n signature: FunctionSignature\n ast: SeqNode\n} {\n const { ast, signature } = transpile(source)\n\n const agent = async (args: Record<string, any>) => {\n const result = await vm.run(ast, args, runOptions)\n return result.result\n }\n\n ;(agent as any).signature = signature\n ;(agent as any).ast = ast\n\n return agent as any\n}\n\n/**\n * Convert TypeDescriptor to JSON Schema\n */\nfunction typeDescriptorToJsonSchema(type: TypeDescriptor): any {\n switch (type.kind) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'null':\n return { type: 'null' }\n case 'array':\n return {\n type: 'array',\n items: type.items ? typeDescriptorToJsonSchema(type.items) : {},\n }\n case 'object':\n if (!type.shape) {\n return { type: 'object' }\n }\n return {\n type: 'object',\n properties: Object.fromEntries(\n Object.entries(type.shape).map(([k, v]) => [\n k,\n typeDescriptorToJsonSchema(v),\n ])\n ),\n }\n case 'union':\n if (!type.members) {\n return {}\n }\n return {\n anyOf: type.members.map(typeDescriptorToJsonSchema),\n }\n case 'any':\n default:\n return {}\n }\n}\n\n/**\n * Get tool definitions from a set of agent functions\n */\nexport function getToolDefinitions(\n agents: Record<string, { signature: FunctionSignature }>\n): Array<{\n type: 'function'\n function: {\n name: string\n description?: string\n parameters: {\n type: 'object'\n properties: Record<string, any>\n required: string[]\n }\n }\n}> {\n return Object.entries(agents).map(([name, agent]) => {\n const sig = agent.signature\n\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [paramName, param] of Object.entries(sig.parameters)) {\n properties[paramName] = typeDescriptorToJsonSchema(param.type)\n if (param.description) {\n properties[paramName].description = param.description\n }\n if (param.required) {\n required.push(paramName)\n }\n }\n\n return {\n type: 'function' as const,\n function: {\n name,\n description: sig.description,\n parameters: {\n type: 'object' as const,\n properties,\n required,\n },\n },\n }\n })\n}\n\n/**\n * Transpile TJS source to JavaScript with type metadata.\n * Works as both a function and a tagged template literal.\n */\nexport function tjs(\n strings: TemplateStringsArray,\n ...values: any[]\n): TJSTranspileResult\nexport function tjs(\n source: string,\n options?: TJSTranspileOptions\n): TJSTranspileResult\nexport function tjs(\n sourceOrStrings: string | TemplateStringsArray,\n optionsOrFirstValue?: TJSTranspileOptions | any,\n ...restValues: any[]\n): TJSTranspileResult {\n if (typeof sourceOrStrings === 'string') {\n return transpileToJS(\n sourceOrStrings,\n optionsOrFirstValue as TJSTranspileOptions\n )\n }\n // Tagged template literal\n const values =\n optionsOrFirstValue !== undefined\n ? [optionsOrFirstValue, ...restValues]\n : restValues\n const source = sourceOrStrings.reduce(\n (acc, str, i) =>\n acc + str + (values[i] !== undefined ? String(values[i]) : ''),\n ''\n )\n return transpileToJS(source)\n}\n", "/**\n * Safe Eval and SafeFunction - VM-backed dynamic code execution\n *\n * Import this module explicitly when you need to execute code dynamically.\n * This pulls in the AJS transpiler and VM (~50KB gzipped).\n *\n * For static code (pre-transpiled), use the lite runtime instead.\n */\n\nimport { AgentVM } from '../vm/vm'\nimport { transpile } from './core'\n\n// Singleton VM instance (lazy)\nlet _vm: AgentVM<Record<string, never>> | null = null\nconst getVM = () => (_vm ??= new AgentVM())\n\n/**\n * Walk an AST and wrap return values in { __result: value } objects.\n * This lets Eval/SafeFunction return arbitrary values through the VM,\n * which enforces strict object returns for agent composability.\n */\nfunction wrapReturnValues(node: any): void {\n if (!node || typeof node !== 'object') return\n if (Array.isArray(node)) {\n for (const child of node) wrapReturnValues(child)\n return\n }\n if (node.op === 'return' && 'value' in node) {\n node.value = { __result: node.value }\n }\n // Recurse into steps (seq), branches (if/else), etc.\n if (node.steps) wrapReturnValues(node.steps)\n if (node.then) wrapReturnValues(node.then)\n if (node.else) wrapReturnValues(node.else)\n if (node.body) wrapReturnValues(node.body)\n}\n\n/** Capabilities that can be injected into SafeFunction/Eval */\nexport interface SafeCapabilities {\n /** Fetch function for HTTP requests */\n fetch?: typeof globalThis.fetch\n /** Console for logging */\n console?: Pick<typeof console, 'log' | 'warn' | 'error'>\n /** Additional capabilities to expose */\n [key: string]: unknown\n}\n\n/** Options for Eval */\nexport interface EvalOptions {\n /** Code to evaluate (expression or statements with return) */\n code: string\n /** Context variables available to the code */\n context?: Record<string, unknown>\n /** Fuel budget (default: 1000) */\n fuel?: number\n /** Timeout in milliseconds (default: fuel * 10) */\n timeoutMs?: number\n /** Capabilities to inject (fetch, console, etc.) */\n capabilities?: SafeCapabilities\n}\n\n/**\n * Safely evaluate code in a sandboxed VM with fuel metering\n */\nexport async function Eval(options: EvalOptions): Promise<{\n result: unknown\n fuelUsed: number\n error?: { message: string }\n}> {\n const {\n code,\n context = {},\n fuel = 1000,\n timeoutMs,\n capabilities = {},\n } = options\n\n const vm = getVM()\n\n // Wrap code in a function - detect if it's an expression or has return\n const hasReturn = /\\breturn\\b/.test(code)\n const wrappedCode = hasReturn\n ? `function __eval() { ${code} }`\n : `function __eval() { return (${code}) }`\n\n try {\n const { ast } = transpile(wrappedCode)\n\n // Box return values in objects for VM strict-return compliance.\n // Walk AST and wrap each { op: 'return', value } into\n // { op: 'return', value: { __result: originalValue } }\n wrapReturnValues(ast)\n\n const vmResult = await vm.run(ast, context, {\n fuel,\n timeoutMs,\n capabilities,\n })\n\n // Unwrap the boxed result\n const raw = vmResult.result\n const result =\n raw && typeof raw === 'object' && '__result' in raw ? raw.__result : raw\n\n return {\n result,\n fuelUsed: vmResult.fuelUsed,\n error: vmResult.error\n ? { message: vmResult.error.message || String(vmResult.error) }\n : undefined,\n }\n } catch (err: any) {\n return {\n result: undefined,\n fuelUsed: fuel,\n error: { message: err.message || String(err) },\n }\n }\n}\n\n/** Options for SafeFunction */\nexport interface SafeFunctionOptions {\n /** Function body code */\n body: string\n /** Parameter names (in order) */\n params?: string[]\n /** Fuel budget per invocation (default: 1000) */\n fuel?: number\n /** Timeout in milliseconds (default: fuel * 10) */\n timeoutMs?: number\n /** Capabilities to inject (fetch, console, etc.) */\n capabilities?: SafeCapabilities\n}\n\n/**\n * Create a reusable sandboxed function with fuel metering\n */\nexport async function SafeFunction(options: SafeFunctionOptions): Promise<\n (...args: unknown[]) => Promise<{\n result: unknown\n fuelUsed: number\n error?: { message: string }\n }>\n> {\n const {\n body,\n params = [],\n fuel = 1000,\n timeoutMs,\n capabilities = {},\n } = options\n\n const vm = getVM()\n\n // Build function source with parameters\n const paramList = params.join(', ')\n const source = `function __safeFn(${paramList}) { ${body} }`\n\n // Pre-compile the AST (done once at creation time)\n const { ast } = transpile(source)\n\n // Box return values for VM strict-return compliance\n wrapReturnValues(ast)\n\n // Return a function that runs the pre-compiled AST\n return async (...args: unknown[]) => {\n const context: Record<string, unknown> = {}\n for (let i = 0; i < params.length; i++) {\n context[params[i]] = args[i]\n }\n\n try {\n const vmResult = await vm.run(ast, context, {\n fuel,\n timeoutMs,\n capabilities,\n })\n\n // Unwrap the boxed result\n const raw = vmResult.result\n const result =\n raw && typeof raw === 'object' && '__result' in raw ? raw.__result : raw\n\n return {\n result,\n fuelUsed: vmResult.fuelUsed,\n error: vmResult.error\n ? { message: vmResult.error.message || String(vmResult.error) }\n : undefined,\n }\n } catch (err: any) {\n return {\n result: undefined,\n fuelUsed: fuel,\n error: { message: err.message || String(err) },\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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ACpB,MAAQT,EAAQS,EAAY,KAAKZ,CAAmB,KAAO,MACzDW,EAAS,IAAIR,EAAM,CAAC,CAAC,EAIvB,IAAMU,EACJ,+DACF,MAAQV,EAAQU,EAAW,KAAKb,CAAmB,KAAO,MACxDW,EAAS,IAAIR,EAAM,CAAC,CAAC,EAMvB,IAAMW,EAAW,IAAI,IAAI,CACvB,KACA,OACA,MACA,QACA,KACA,SACA,OACA,QACA,WACA,SACA,WACA,MACA,QACA,MACA,MACA,OACA,OACA,QACA,OACA,YACA,SACA,aACA,KACA,KACA,MACA,QACA,UACA,QACA,QACA,QACA,QACA,UACA,QACA,SACA,SACA,UACA,OACA,KACA,SACA,MACA,MACA,QAEA,UACA,OACA,QACA,SACA,SACA,SACA,UACA,OACA,OACA,UACA,MACA,MACA,UACA,UACA,eACA,eACA,YACA,aACA,aACA,aACA,cACA,cACA,gBACA,iBACA,cACA,WACA,QACA,YACA,aACA,SACA,OACA,MACA,QACA,UACA,QACA,SACA,MACA,SACA,SACA,UACA,OACA,YACA,UACA,WACA,aACA,SACA,WACA,WACA,MACA,QACA,WACA,WACA,aACA,YACA,YACA,OACA,YACF,CAAC,EAGK3B,EAAqB,CAAC,EAC5B,QAAW4B,KAAMV,EACX,CAACM,EAAS,IAAII,CAAE,GAAK,CAACD,EAAS,IAAIC,CAAE,GAAK,CAAChB,GAAgBgB,CAAE,GAC/D5B,EAAS,KAAK4B,CAAE,EAIpB,OAAO5B,EAAS,KAAK,CACvB,CAYA,SAASI,GACP7B,EACAsD,EACAC,EACoB,CAGpB,IAAMC,EAAcxD,EAAO,MAAM,EAAGsD,CAAc,EAI5CG,EAAc,uDACdhB,EAAQe,EAAY,MAAMC,CAAW,EAE3C,GAAI,CAAChB,EAAO,CAEV,IAAMiB,EACJ,kFACIC,EAAaH,EAAY,MAAME,CAAY,EACjD,OAAKC,EACEC,GAAsBD,EAAW,CAAC,EAAGJ,CAAS,EADpC,MAEnB,CAEA,OAAOK,GAAsBnB,EAAM,CAAC,EAAGc,CAAS,CAClD,CAKA,SAASK,GACPC,EACAN,EACoB,CAEpB,IAAMO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",
|
|
6
6
|
"names": ["s", "validate", "schemaFilter", "tjsEquals", "isStructurallyEqual", "a", "b", "v", "keysA", "keysB", "k", "AgentError", "message", "op", "cause", "isAgentError", "value", "procedureStore", "DEFAULT_PROCEDURE_TTL", "DEFAULT_MAX_AST_SIZE", "PROCEDURE_TOKEN_PREFIX", "isProcedureToken", "resolveProcedureToken", "token", "entry", "generateProcedureToken", "FORBIDDEN_PROPERTIES", "assertSafeProperty", "prop", "BLOCKED_HOSTS", "isBlockedUrl", "urlString", "url", "host", "isSuspiciousRegex", "pattern", "createChildScope", "ctx", "diffObjects", "before", "after", "diff", "allKeys", "key", "beforeVal", "afterVal", "resolveValue", "val", "evaluateExpr", "parts", "part", "current", "i", "result", "item", "createBuiltinProxy", "name", "supported", "alternatives", "target", "alt", "convertExampleToSchema", "example", "type", "properties", "required", "builtins", "arr", "text", "replacer", "space", "_args", "iterable", "mapFn", "thisArg", "items", "obj", "entries", "sources", "codes", "codePoints", "data", "schema", "jsonSchema", "schemaOrExample", "idx", "other", "otherItems", "x", "fn", "createDate", "d", "years", "months", "days", "hours", "minutes", "seconds", "ms", "newDate", "unit", "otherTime", "diffMs", "fmt", "DateFactory", "init", "date", "str", "unsupportedBuiltins", "EXPR_FUEL_COST", "STRING_FUEL_PER_CHAR", "ARRAY_FUEL_PER_ELEMENT", "ALLOCATING_METHODS", "node", "left", "right", "arg", "test", "el", "args", "method", "fuelCost", "defineAtom", "inputSchema", "outputSchema", "options", "docs", "timeoutMs", "cost", "step", "_op", "_res", "inputData", "stateBefore", "fuelBefore", "error", "overrideCost", "baseCost", "currentCost", "timer", "execute", "_", "reject", "e", "stateDiff", "input", "seq", "steps", "atom", "iff", "whileLoop", "ret", "res", "err", "filterResult", "tryCatch", "paramName", "errorAtom", "varSet", "constSet", "varGet", "varsImport", "keys", "alias", "path", "varsLet", "varsExport", "scope", "scopedCtx", "map", "as", "results", "resolvedItems", "filter", "condition", "reduce", "accumulator", "initial", "resolvedInitial", "acc", "find", "push", "list", "resolvedList", "resolvedItem", "len", "split", "sep", "join", "template", "tmpl", "vars", "regexMatch", "resolvedValue", "pick", "resolvedObj", "resolvedKeys", "omit", "merge", "MAX_AGENT_DEPTH", "AGENT_DEPTH_HEADER", "isDomainAllowed", "allowedDomains", "p", "suffix", "fetch", "headers", "body", "responseType", "currentDepth", "buffer", "bytes", "binary", "base64", "contentType", "storeGet", "storeSet", "storeQuery", "query", "vectorSearch", "collection", "vector", "llmPredict", "prompt", "agentRun", "agentId", "resolvedId", "rawInput", "resolvedInput", "ast", "childCtx", "seqAtom", "transpileCode", "code", "resolvedCode", "MAX_RUNCODE_DEPTH", "runCode", "resolvedArgs", "jsonParse", "jsonStringify", "xmlParse", "memoize", "hash", "cache", "ttlMs", "cacheKey", "cached", "expiry", "random", "min", "max", "format", "length", "f", "mn", "mx", "chars", "values", "range", "uuid", "hex", "c", "r", "algorithm", "algo", "hashBuffer", "char", "consoleLog", "msg", "consoleWarn", "msgStr", "consoleError", "storeProcedure", "ttl", "maxSize", "resolvedAst", "resolvedTtl", "resolvedMaxSize", "astJson", "now", "releaseProcedure", "resolvedToken", "clearExpiredProcedures", "cleared", "coreAtoms", "RESERVED_WORDS", "warnMissingVars", "condition", "vars", "withoutStrings", "identifiers", "regex", "match", "missing", "id", "parseCondition", "tokens", "tokenize", "result", "parseExpression", "remaining", "expr", "i", "quote", "str", "num", "pos", "parseLogicalOr", "left", "newPos", "parseLogicalAnd", "right", "rightPos", "parseComparison", "parseAdditive", "compOps", "op", "parseMultiplicative", "parseUnary", "argument", "parsePrimary", "token", "node", "prop", "TypedBuilder", "_TypedBuilder", "atoms", "target", "receiver", "input", "atom", "step", "variableName", "last", "schema", "_schema", "keys", "thenBranch", "elseBranch", "thenB", "elseSteps", "elseB", "conditionExpr", "ifAtom", "body", "bodyB", "whileAtom", "steps", "scopeB", "scopeAtom", "items", "as", "stepsB", "mapAtom", "filterAtom", "findAtom", "accumulator", "initial", "reduceAtom", "key", "memoAtom", "ttlMs", "cacheAtom", "branches", "tryB", "catchSteps", "catchB", "tryAtom", "validate", "acorn", "TranspileError", "message", "location", "source", "filename", "loc", "SyntaxError", "contextLines", "lines", "errorLine", "startLine", "endLine", "output", "lineNumWidth", "i", "lineNum", "marker", "caretPadding", "createChildContext", "parent", "getLocation", "node", "transformParenExpressions", "source", "ctx", "result", "i", "firstReturnType", "firstReturnSafety", "state", "templateStack", "contextStack", "braceDepth", "_currentContext", "isInClassBody", "frame", "char", "nextChar", "before", "classMatch", "classHeader", "funcMatch", "funcName", "matchLen", "afterParen", "safetyMarker", "paramStart", "paramsResult", "extractBalancedContent", "params", "endPos", "processedParams", "processParamString", "j", "colonMarker", "safety", "typeResult", "extractReturnTypeValue", "methodMatch", "prevNonWs", "k", "isMethodDecl", "skipLen", "methodPart", "fullParamsResult", "fullContent", "arrowReturnType", "trimmedContent", "transformed", "start", "open", "close", "depth", "inString", "stringChar", "extractJSValue", "valueStart", "firstChar", "keywordMatch", "normalizeUnionSyntax", "type", "sawContent", "makeResult", "typeEnd", "splitParameters", "current", "inLineComment", "inBlockComment", "trackRequired", "withArrows", "paramList", "sawOptional", "seenNames", "checkDuplicate", "name", "param", "trimmed", "inner", "processDestructuredObjectParams", "restColonPos", "findTopLevelColon", "optionalMatch", "hasColonNotEquals", "eqMatch", "colonPos", "part", "nestedObjectMatch", "objectLiteral", "processedLiteral", "processObjectLiteralValue", "nestedArrayMatch", "arrayLiteral", "processArrayLiteralValue", "colonMatch", "value", "literal", "nestedObjColonMatch", "key", "nested", "nestedObjEqualsMatch", "nestedArrColonMatch", "nestedArrEqualsMatch", "equalsMatch", "hasColon", "hasEquals", "extractBalancedValue", "source", "startRe", "m", "braceStart", "depth", "j", "balanced", "result", "transformTryWithoutCatch", "i", "tryMatch", "bodyStart", "char", "body", "extractWasmBlocks", "blocks", "blockId", "wasmMatch", "matchStart", "braceDepth", "fallbackBody", "matchEnd", "fallbackMatch", "fallbackStart", "k", "captures", "detectCaptures", "name", "typeAnnotation", "findParameterType", "block", "fallbackCode", "captureArgNames", "c", "captureArgs", "wasmCall", "dispatch", "isWasmIntrinsic", "bodyWithoutComments", "propertyOnly", "propPattern", "match", "identifierPattern", "allIdentifiers", "prop", "standalonePattern", "dotPattern", "standaloneMatches", "dotMatches", "declared", "declPattern", "forPattern", "reserved", "id", "wasmBlockStart", "paramName", "beforeBlock", "funcPattern", "arrowPattern", "arrowMatch", "extractTypeFromParams", "paramsStr", "params", "p", "param", "colonMatch", "equalsMatch", "transformIsOperators", "exprPat", "isNotRegex", "isRegex", "insertAsiProtection", "continuationStarts", "expectsContinuation", "continueKeywords", "lines", "inBlockComment", "line", "prevLine", "commentOpen", "commentClose", "prevNoComment", "indent", "rest", "transformEqualityToStructural", "equalityOps", "state", "templateStack", "nextChar", "beforeChar", "pos", "op", "funcName", "leftBoundary", "findLeftOperandBoundary", "rightBoundary", "findRightOperandBoundary", "leftExpr", "rightExpr", "before", "after", "spacer", "opPos", "inString", "stringChar", "prevChar", "wordEnd", "wordStart", "word", "beforeWord", "startAfterOp", "transformTypeDeclarations", "typeMatch", "typeName", "description", "descriptionWasExplicit", "descStringMatch", "afterString", "isEndOfStatement", "value", "trailingWs", "defaultValue", "posAfterDefault", "valueMatch", "wsMatch", "blockBody", "blockEnd", "descInsideMatch", "example", "exampleKeyword", "valueStart", "extracted", "extractJSValue", "predicateMatch", "defaultArg", "transformFunctionPredicateDeclarations", "fpMatch", "fpName", "typeParamsStr", "paramsMatch", "returnsMatch", "contractMatch", "descMatch", "spec", "desc", "typeParams", "parts", "s", "defaultVal", "paramNames", "args", "commaIdx", "fnRef", "transformGenericDeclarations", "genericMatch", "genericName", "parsedBody", "declIdx", "declBraceStart", "dDepth", "dj", "valueParam", "typeParamNames", "typeCheckParams", "idx", "transformUnionDeclarations", "unionMatch", "unionName", "values", "parseUnionValues", "lineEnd", "inlineValues", "input", "part", "transformEnumDeclarations", "enumMatch", "enumName", "membersStr", "parseEnumMembers", "key", "members", "currentNumericValue", "l", "explicitValue", "numVal", "transformExtendDeclarations", "extensions", "remaining", "extendMatch", "afterWS", "blockStart", "findFunctionBodyEnd", "methods", "bodySource", "methodMatch", "methodIndent", "isAsync", "methodName", "parenStart", "parenDepth", "afterParams", "loc", "locAt", "SyntaxError", "methodBodyEnd", "fullMethodText", "transformedParams", "asyncPrefix", "methodBody", "isFirstForType", "extSet", "methodEntries", "replacement", "transformExtensionCalls", "methodToTypes", "method", "typeNames", "singleQuotePattern", "_", "str", "meth", "closeParen", "doubleQuotePattern", "templatePattern", "methodDot", "searchFrom", "bracketDepth", "inStr", "ch", "arrayLiteral", "numPattern", "num", "column", "typeCheckForDefault", "argExpr", "dv", "typeSignatureForDefault", "parseParamList", "paramStr", "requiredParams", "current", "parseOneParam", "trimmed", "eqIdx", "openBracePos", "inLineComment", "next", "transformPolymorphicFunctions", "polymorphicNames", "declarations", "allMatches", "exported", "fullMatchStart", "funcKeywordStart", "funcIdx", "nameCounts", "polyNames", "count", "afterFunc", "bodyEnd", "realStart", "variants", "asyncCount", "v", "a", "b", "allSame", "sigA", "sigB", "allVariants", "variant", "renamed", "isExported", "exportPrefix", "sorted", "specA", "specB", "sig", "branches", "checks", "check", "dispatcher", "transformBareAssignments", "extractAndRunTests", "skipTests", "tests", "errors", "testMatch", "start", "end", "err", "newlines", "transformPolymorphicConstructors", "polyCtorClasses", "classRegex", "classMatch", "classInfos", "className", "extendsClause", "ci", "ctorPattern", "ctorMatch", "ctorPositions", "ctors", "ctorBodyEnd", "bodyText", "newBody", "afterLastCtor", "cleanBody", "ctor", "factories", "dispatchBranches", "insertPos", "wrapClassDeclarations", "lastIndex", "classStart", "classEnd", "classBody", "validateNoDate", "datePatterns", "pattern", "message", "transformConstBang", "immutableNames", "constBangRe", "stripped", "mutatingMethods", "validateNoVar", "validateNoEval", "transformBangAccess", "templateDepth", "exprEnd", "exprStart", "findExprStartBackward", "expr", "text", "findMatchingOpen", "open", "close", "preprocess", "source", "options", "originalSource", "moduleSafety", "requiredParams", "unsafeFunctions", "safeFunctions", "isCompat", "tjsModes", "safetyMatch", "directivePattern", "match", "directive", "insertAsiProtection", "transformConstBang", "transformBangAccess", "transformIsOperators", "transformEqualityToStructural", "transformTypeDeclarations", "transformGenericDeclarations", "transformFunctionPredicateDeclarations", "transformUnionDeclarations", "transformEnumDeclarations", "transformBareAssignments", "transformedSource", "returnType", "returnSafety", "transformParenExpressions", "extResult", "transformExtendDeclarations", "transformTryWithoutCatch", "polyResult", "transformPolymorphicFunctions", "wasmBlocks", "extractWasmBlocks", "testResult", "extractAndRunTests", "polyCtorResult", "transformPolymorphicConstructors", "cls", "wrapClassDeclarations", "validateNoDate", "validateNoEval", "validateNoVar", "transformExtensionCalls", "parse", "filename", "colonShorthand", "vmTarget", "processedSource", "tests", "testErrors", "e", "loc", "SyntaxError", "validateSingleFunction", "ast", "node", "functions", "second", "extractTDoc", "func", "result", "beforeFunc", "allDocBlocks", "lastBlock", "afterBlock", "content", "lines", "minIndent", "line", "min", "indent", "jsdocMatch", "jsdoc", "descMatch", "paramRegex", "parseExpressionAt", "inferTypeFromValue", "node", "value", "raw", "elements", "itemTypes", "el", "seen", "t", "key", "unique", "properties", "shape", "prop", "operator", "left", "right", "leftType", "rightType", "op", "arg", "parseParameter", "param", "requiredParams", "TranspileError", "getLocation", "name", "isRequired", "type", "exampleValue", "extractLiteralValue", "destructuredParams", "innerParam", "result", "parseReturnType", "typeExpr", "ast", "parseExpressionAt", "typeToJsonSchema", "type", "properties", "key", "propType", "parametersToJsonSchema", "parameters", "required", "name", "param", "transformFunction", "func", "source", "returnTypeAnnotation", "options", "requiredParamsFromPreprocess", "tdoc", "extractTDoc", "parsed", "parseParameter", "paramDesc", "returnType", "parseReturnType", "ctx", "bodySteps", "transformBlock", "steps", "requiredParams", "optionalParams", "defaultValue", "signatureParams", "signature", "inputSchema", "block", "stmt", "transformed", "transformStatement", "transformVariableDeclaration", "transformExpressionStatement", "transformIfStatement", "transformWhileStatement", "transformForOfStatement", "transformTryStatement", "transformReturnStatement", "TranspileError", "getLocation", "createChildContext", "decl", "isConst", "opName", "declarator", "step", "resultVar", "transformExpressionToStep", "inferTypeFromValue", "expr", "transformAssignment", "condition", "expressionToExprNode", "thenSteps", "elseSteps", "body", "varName", "items", "expressionToValue", "childCtx", "trySteps", "catchSteps", "catchParam", "catchCtx", "BUILTIN_OBJECTS", "BUILTIN_GLOBALS", "UNSUPPORTED_BUILTINS", "INSTANCE_METHODS", "isBuiltinCall", "member", "objName", "methodName", "isBuiltinMemberAccess", "UNSUPPORTED_BUILTIN_MESSAGES", "getUnsupportedBuiltinError", "getNewExpressionSuggestion", "constructorName", "varOp", "newExpr", "suggestion", "unsupportedError", "exprNode", "transformCallExpression", "transformTemplateLiteral", "funcName", "isMethodCall", "receiver", "transformMethodCall", "args", "extractCallArguments", "method", "callback", "paramName", "exprResult", "accParam", "itemParam", "accName", "itemName", "initial", "a", "tmpl", "vars", "i", "mem", "obj", "isOptional", "prop", "propName", "bin", "log", "un", "cond", "el", "call", "arg", "objValue", "result", "transpile", "source", "options", "program", "returnType", "originalSource", "requiredParams", "parse", "func", "validateSingleFunction", "ast", "signature", "warnings", "transformFunction", "FUEL_TO_MS", "AgentVM", "customAtoms", "coreAtoms", "TypedBuilder", "op", "filter", "targetAtoms", "a", "flowOps", "atom", "astOrToken", "args", "options", "ast", "isProcedureToken", "resolveProcedureToken", "transpile", "e", "startFuel", "timeoutMs", "capabilities", "warnings", "memoryStore", "warned", "key", "value", "controller", "timeout", "ctx", "inputSchema", "validate", "error", "AgentError", "_", "reject", "allWarnings", "_vm", "getVM", "AgentVM", "wrapReturnValues", "node", "child", "Eval", "options", "code", "context", "fuel", "timeoutMs", "capabilities", "vm", "wrappedCode", "ast", "transpile", "vmResult", "raw", "err", "SafeFunction", "body", "params", "source", "args", "i"]
|
|
7
7
|
}
|