tjs-lang 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CONTEXT.md +594 -0
  2. package/LICENSE +190 -0
  3. package/README.md +220 -0
  4. package/bin/benchmarks.ts +351 -0
  5. package/bin/dev.ts +205 -0
  6. package/bin/docs.js +170 -0
  7. package/bin/install-cursor.sh +71 -0
  8. package/bin/install-vscode.sh +71 -0
  9. package/bin/select-local-models.d.ts +1 -0
  10. package/bin/select-local-models.js +28 -0
  11. package/bin/select-local-models.ts +31 -0
  12. package/demo/autocomplete.test.ts +232 -0
  13. package/demo/docs.json +186 -0
  14. package/demo/examples.test.ts +598 -0
  15. package/demo/index.html +91 -0
  16. package/demo/src/autocomplete.ts +482 -0
  17. package/demo/src/capabilities.ts +859 -0
  18. package/demo/src/demo-nav.ts +2097 -0
  19. package/demo/src/examples.test.ts +161 -0
  20. package/demo/src/examples.ts +476 -0
  21. package/demo/src/imports.test.ts +196 -0
  22. package/demo/src/imports.ts +421 -0
  23. package/demo/src/index.ts +639 -0
  24. package/demo/src/module-store.ts +635 -0
  25. package/demo/src/module-sw.ts +132 -0
  26. package/demo/src/playground.ts +949 -0
  27. package/demo/src/service-host.ts +389 -0
  28. package/demo/src/settings.ts +440 -0
  29. package/demo/src/style.ts +280 -0
  30. package/demo/src/tjs-playground.ts +1605 -0
  31. package/demo/src/ts-examples.ts +478 -0
  32. package/demo/src/ts-playground.ts +1092 -0
  33. package/demo/static/favicon.svg +30 -0
  34. package/demo/static/photo-1.jpg +0 -0
  35. package/demo/static/photo-2.jpg +0 -0
  36. package/demo/static/texts/ai-history.txt +9 -0
  37. package/demo/static/texts/coffee-origins.txt +9 -0
  38. package/demo/static/texts/renewable-energy.txt +9 -0
  39. package/dist/index.js +256 -0
  40. package/dist/index.js.map +37 -0
  41. package/dist/tjs-batteries.js +4 -0
  42. package/dist/tjs-batteries.js.map +15 -0
  43. package/dist/tjs-full.js +256 -0
  44. package/dist/tjs-full.js.map +37 -0
  45. package/dist/tjs-transpiler.js +220 -0
  46. package/dist/tjs-transpiler.js.map +21 -0
  47. package/dist/tjs-vm.js +4 -0
  48. package/dist/tjs-vm.js.map +14 -0
  49. package/docs/CNAME +1 -0
  50. package/docs/favicon.svg +30 -0
  51. package/docs/index.html +91 -0
  52. package/docs/index.js +10468 -0
  53. package/docs/index.js.map +92 -0
  54. package/docs/photo-1.jpg +0 -0
  55. package/docs/photo-1.webp +0 -0
  56. package/docs/photo-2.jpg +0 -0
  57. package/docs/photo-2.webp +0 -0
  58. package/docs/texts/ai-history.txt +9 -0
  59. package/docs/texts/coffee-origins.txt +9 -0
  60. package/docs/texts/renewable-energy.txt +9 -0
  61. package/docs/tjs-lang.svg +31 -0
  62. package/docs/tosijs-agent.svg +31 -0
  63. package/editors/README.md +325 -0
  64. package/editors/ace/ajs-mode.js +328 -0
  65. package/editors/ace/ajs-mode.ts +269 -0
  66. package/editors/ajs-syntax.ts +212 -0
  67. package/editors/build-grammars.ts +510 -0
  68. package/editors/codemirror/ajs-language.js +287 -0
  69. package/editors/codemirror/ajs-language.ts +1447 -0
  70. package/editors/codemirror/autocomplete.test.ts +531 -0
  71. package/editors/codemirror/component.ts +404 -0
  72. package/editors/monaco/ajs-monarch.js +243 -0
  73. package/editors/monaco/ajs-monarch.ts +225 -0
  74. package/editors/tjs-syntax.ts +115 -0
  75. package/editors/vscode/language-configuration.json +37 -0
  76. package/editors/vscode/package.json +65 -0
  77. package/editors/vscode/syntaxes/ajs-injection.tmLanguage.json +107 -0
  78. package/editors/vscode/syntaxes/ajs.tmLanguage.json +252 -0
  79. package/editors/vscode/syntaxes/tjs.tmLanguage.json +333 -0
  80. package/package.json +83 -0
  81. package/src/cli/commands/check.ts +41 -0
  82. package/src/cli/commands/convert.ts +133 -0
  83. package/src/cli/commands/emit.ts +260 -0
  84. package/src/cli/commands/run.ts +68 -0
  85. package/src/cli/commands/test.ts +194 -0
  86. package/src/cli/commands/types.ts +20 -0
  87. package/src/cli/create-app.ts +236 -0
  88. package/src/cli/playground.ts +250 -0
  89. package/src/cli/tjs.ts +166 -0
  90. package/src/cli/tjsx.ts +160 -0
  91. package/tjs-lang.svg +31 -0
@@ -0,0 +1,37 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["node:path", "../src/lang/parser.ts", "../src/lang/types.ts", "../src/lang/inference.ts", "../src/lang/emitters/ast.ts", "../src/lang/emitters/js.ts", "../src/lang/tests.ts", "../src/lang/emitters/from-ts.ts", "../src/lang/runtime.ts", "../src/types/Type.ts", "../src/lang/schema.ts", "../node_modules/acorn-walk/dist/walk.mjs", "../src/lang/linter.ts", "../src/lang/wasm.ts", "../src/lang/metadata-cache.ts", "../src/lang/index.ts", "../src/vm/runtime.ts", "../src/builder.ts", "../src/vm/vm.ts", "../src/vm/atoms/batteries.ts", "../src/vm/atoms/index.ts", "../src/batteries/store.ts", "../src/batteries/llm.ts", "../src/batteries/audit.ts", "../src/batteries/models.ts", "../src/batteries/index.ts", "../src/types/Timestamp.ts", "../src/types/LegalDate.ts"],
4
+ "sourcesContent": [
5
+ "function assertPath(path){if(typeof path!==\"string\")throw TypeError(\"Path must be a string. Received \"+JSON.stringify(path))}function normalizeStringPosix(path,allowAboveRoot){var res=\"\",lastSegmentLength=0,lastSlash=-1,dots=0,code;for(var i=0;i<=path.length;++i){if(i<path.length)code=path.charCodeAt(i);else if(code===47)break;else code=47;if(code===47){if(lastSlash===i-1||dots===1);else if(lastSlash!==i-1&&dots===2){if(res.length<2||lastSegmentLength!==2||res.charCodeAt(res.length-1)!==46||res.charCodeAt(res.length-2)!==46){if(res.length>2){var lastSlashIndex=res.lastIndexOf(\"/\");if(lastSlashIndex!==res.length-1){if(lastSlashIndex===-1)res=\"\",lastSegmentLength=0;else res=res.slice(0,lastSlashIndex),lastSegmentLength=res.length-1-res.lastIndexOf(\"/\");lastSlash=i,dots=0;continue}}else if(res.length===2||res.length===1){res=\"\",lastSegmentLength=0,lastSlash=i,dots=0;continue}}if(allowAboveRoot){if(res.length>0)res+=\"/..\";else res=\"..\";lastSegmentLength=2}}else{if(res.length>0)res+=\"/\"+path.slice(lastSlash+1,i);else res=path.slice(lastSlash+1,i);lastSegmentLength=i-lastSlash-1}lastSlash=i,dots=0}else if(code===46&&dots!==-1)++dots;else dots=-1}return res}function _format(sep,pathObject){var dir=pathObject.dir||pathObject.root,base=pathObject.base||(pathObject.name||\"\")+(pathObject.ext||\"\");if(!dir)return base;if(dir===pathObject.root)return dir+base;return dir+sep+base}function resolve(){var resolvedPath=\"\",resolvedAbsolute=!1,cwd;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path;if(i>=0)path=arguments[i];else{if(cwd===void 0)cwd=process.cwd();path=cwd}if(assertPath(path),path.length===0)continue;resolvedPath=path+\"/\"+resolvedPath,resolvedAbsolute=path.charCodeAt(0)===47}if(resolvedPath=normalizeStringPosix(resolvedPath,!resolvedAbsolute),resolvedAbsolute)if(resolvedPath.length>0)return\"/\"+resolvedPath;else return\"/\";else if(resolvedPath.length>0)return resolvedPath;else return\".\"}function normalize(path){if(assertPath(path),path.length===0)return\".\";var isAbsolute=path.charCodeAt(0)===47,trailingSeparator=path.charCodeAt(path.length-1)===47;if(path=normalizeStringPosix(path,!isAbsolute),path.length===0&&!isAbsolute)path=\".\";if(path.length>0&&trailingSeparator)path+=\"/\";if(isAbsolute)return\"/\"+path;return path}function isAbsolute(path){return assertPath(path),path.length>0&&path.charCodeAt(0)===47}function join(){if(arguments.length===0)return\".\";var joined;for(var i=0;i<arguments.length;++i){var arg=arguments[i];if(assertPath(arg),arg.length>0)if(joined===void 0)joined=arg;else joined+=\"/\"+arg}if(joined===void 0)return\".\";return normalize(joined)}function relative(from,to){if(assertPath(from),assertPath(to),from===to)return\"\";if(from=resolve(from),to=resolve(to),from===to)return\"\";var fromStart=1;for(;fromStart<from.length;++fromStart)if(from.charCodeAt(fromStart)!==47)break;var fromEnd=from.length,fromLen=fromEnd-fromStart,toStart=1;for(;toStart<to.length;++toStart)if(to.charCodeAt(toStart)!==47)break;var toEnd=to.length,toLen=toEnd-toStart,length=fromLen<toLen?fromLen:toLen,lastCommonSep=-1,i=0;for(;i<=length;++i){if(i===length){if(toLen>length){if(to.charCodeAt(toStart+i)===47)return to.slice(toStart+i+1);else if(i===0)return to.slice(toStart+i)}else if(fromLen>length){if(from.charCodeAt(fromStart+i)===47)lastCommonSep=i;else if(i===0)lastCommonSep=0}break}var fromCode=from.charCodeAt(fromStart+i),toCode=to.charCodeAt(toStart+i);if(fromCode!==toCode)break;else if(fromCode===47)lastCommonSep=i}var out=\"\";for(i=fromStart+lastCommonSep+1;i<=fromEnd;++i)if(i===fromEnd||from.charCodeAt(i)===47)if(out.length===0)out+=\"..\";else out+=\"/..\";if(out.length>0)return out+to.slice(toStart+lastCommonSep);else{if(toStart+=lastCommonSep,to.charCodeAt(toStart)===47)++toStart;return to.slice(toStart)}}function _makeLong(path){return path}function dirname(path){if(assertPath(path),path.length===0)return\".\";var code=path.charCodeAt(0),hasRoot=code===47,end=-1,matchedSlash=!0;for(var i=path.length-1;i>=1;--i)if(code=path.charCodeAt(i),code===47){if(!matchedSlash){end=i;break}}else matchedSlash=!1;if(end===-1)return hasRoot?\"/\":\".\";if(hasRoot&&end===1)return\"//\";return path.slice(0,end)}function basename(path,ext){if(ext!==void 0&&typeof ext!==\"string\")throw TypeError('\"ext\" argument must be a string');assertPath(path);var start=0,end=-1,matchedSlash=!0,i;if(ext!==void 0&&ext.length>0&&ext.length<=path.length){if(ext.length===path.length&&ext===path)return\"\";var extIdx=ext.length-1,firstNonSlashEnd=-1;for(i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){start=i+1;break}}else{if(firstNonSlashEnd===-1)matchedSlash=!1,firstNonSlashEnd=i+1;if(extIdx>=0)if(code===ext.charCodeAt(extIdx)){if(--extIdx===-1)end=i}else extIdx=-1,end=firstNonSlashEnd}}if(start===end)end=firstNonSlashEnd;else if(end===-1)end=path.length;return path.slice(start,end)}else{for(i=path.length-1;i>=0;--i)if(path.charCodeAt(i)===47){if(!matchedSlash){start=i+1;break}}else if(end===-1)matchedSlash=!1,end=i+1;if(end===-1)return\"\";return path.slice(start,end)}}function extname(path){assertPath(path);var startDot=-1,startPart=0,end=-1,matchedSlash=!0,preDotState=0;for(var i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1)matchedSlash=!1,end=i+1;if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1)preDotState=-1}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1)return\"\";return path.slice(startDot,end)}function format(pathObject){if(pathObject===null||typeof pathObject!==\"object\")throw TypeError('The \"pathObject\" argument must be of type Object. Received type '+typeof pathObject);return _format(\"/\",pathObject)}function parse(path){assertPath(path);var ret={root:\"\",dir:\"\",base:\"\",ext:\"\",name:\"\"};if(path.length===0)return ret;var code=path.charCodeAt(0),isAbsolute2=code===47,start;if(isAbsolute2)ret.root=\"/\",start=1;else start=0;var startDot=-1,startPart=0,end=-1,matchedSlash=!0,i=path.length-1,preDotState=0;for(;i>=start;--i){if(code=path.charCodeAt(i),code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1)matchedSlash=!1,end=i+1;if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1)preDotState=-1}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1){if(end!==-1)if(startPart===0&&isAbsolute2)ret.base=ret.name=path.slice(1,end);else ret.base=ret.name=path.slice(startPart,end)}else{if(startPart===0&&isAbsolute2)ret.name=path.slice(1,startDot),ret.base=path.slice(1,end);else ret.name=path.slice(startPart,startDot),ret.base=path.slice(startPart,end);ret.ext=path.slice(startDot,end)}if(startPart>0)ret.dir=path.slice(0,startPart-1);else if(isAbsolute2)ret.dir=\"/\";return ret}var sep=\"/\",delimiter=\":\",posix=((p)=>(p.posix=p,p))({resolve,normalize,isAbsolute,join,relative,_makeLong,dirname,basename,extname,format,parse,sep,delimiter,win32:null,posix:null});var path_default=posix;export{sep,resolve,relative,posix,parse,normalize,join,isAbsolute,format,extname,dirname,delimiter,path_default as default,basename,_makeLong};",
6
+ "/**\n * Acorn parser wrapper for Agent99 JavaScript\n *\n * Handles parsing of \"Better JavaScript\" including custom syntax extensions\n * like the colon shorthand for required parameters.\n */\n\nimport * as acorn from 'acorn'\nimport type { Program, FunctionDeclaration } from 'acorn'\nimport { SyntaxError } from './types'\n\n/** Parser options */\nexport interface ParseOptions {\n /** Filename for error messages */\n filename?: string\n /** Enable colon shorthand syntax preprocessing */\n colonShorthand?: boolean\n /**\n * Target is the VM (AJS code).\n * When true, skips == to Is() transformation since the VM handles == correctly.\n */\n vmTarget?: boolean\n}\n\n/**\n * A WASM block extracted from source\n *\n * Simple form (body is 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 WASM and JS need different code):\n * wasm {\n * // WASM-optimized path\n * } fallback {\n * // JS fallback using different approach\n * }\n *\n * Variables are captured from scope automatically.\n */\nexport interface WasmBlock {\n /** Unique ID for this block */\n id: string\n /** The body (JS subset that compiles to WASM, also used as fallback) */\n body: string\n /** Explicit fallback body (only if different from body) */\n fallback?: string\n /** Variables captured from enclosing scope (auto-detected) */\n captures: string[]\n /** Start position in original source */\n start: number\n /** End position in original source */\n end: number\n}\n\n/**\n * A test block extracted from source\n *\n * Syntax:\n * test { body }\n * test 'description' { body }\n *\n * Tests run at transpile time and are stripped from output.\n */\nexport interface TestBlock {\n /** Optional description */\n description?: string\n /** The test body code */\n body: string\n /** Start position in original source */\n start: number\n /** End position in original source */\n end: number\n}\n\n/**\n * Preprocess options\n */\nexport interface PreprocessOptions {\n /** Skip test execution (tests still stripped from output) */\n dangerouslySkipTests?: boolean\n /**\n * Skip == to Is() transformation.\n * Set to true for AJS code that runs in the VM, which already handles == correctly.\n * Default: false (transform == to Is() for TJS code running in regular JS)\n */\n vmTarget?: boolean\n}\n\n/**\n * Tokenizer state for tracking context during source transformation\n */\ntype TokenizerState =\n | 'normal'\n | 'single-string'\n | 'double-string'\n | 'template-string'\n | 'line-comment'\n | 'block-comment'\n | 'regex'\n\n/**\n * Structural context for tracking where we are in the code\n * This enables proper handling of class methods vs function calls\n */\ntype StructuralContext = 'top-level' | 'class-body' | 'function-body' | 'block'\n\ninterface ContextFrame {\n type: StructuralContext\n braceDepth: number // The brace depth when we entered this context\n}\n\n/**\n * Unified paren expression transformer using state machine tokenizer\n *\n * Model: opening paren can be ( or (? or (!, closing can be ) or )->type or )-?type or )-!type\n *\n * This unifies handling of:\n * - Function declaration params: function foo(x: type) -> returnType { }\n * - Arrow function params: (x: type) => expr\n * - Safe/unsafe markers: function foo(?) or function foo(!)\n * - Return type annotations: ) -> type or ) -? type or ) -! type\n *\n * @param source The source code to transform\n * @param ctx Context for tracking required params, safe/unsafe functions, etc.\n * @returns Transformed source and extracted metadata\n */\nfunction 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: whitespace then -> or -? or -! (return type)\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n const returnArrow = source.slice(j, j + 2)\n if (\n returnArrow === '->' ||\n returnArrow === '-?' ||\n returnArrow === '-!'\n ) {\n // Extract return type\n j += 2\n // Skip whitespace after arrow\n while (j < source.length && /\\s/.test(source[j])) j++\n\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n const { type, endPos: typeEnd } = typeResult\n // Record first return type for metadata\n if (firstReturnType === undefined) {\n firstReturnType = type\n if (returnArrow === '-?') {\n firstReturnSafety = 'safe'\n } else if (returnArrow === '-!') {\n firstReturnSafety = 'unsafe'\n }\n }\n i = typeEnd\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 const methodMatch = source\n .slice(i)\n .match(/^(constructor|(?:get|set)\\s+\\w+|async\\s+\\w+|\\w+)\\s*\\(/)\n if (methodMatch && isInClassBody()) {\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 or ): type\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n // Handle -> return type (TJS style)\n const returnArrow = source.slice(j, j + 2)\n if (returnArrow === '->') {\n j += 2\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 // Handle : return type (TS style) - just strip it\n else if (source[j] === ':') {\n j++\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 const returnArrow = source.slice(j, j + 2)\n if (\n returnArrow === '->' ||\n returnArrow === '-?' ||\n returnArrow === '-!'\n ) {\n j += 2\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 */\nfunction 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 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 * 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 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 // Check for required param after optional - this is an error\n if (sawOptional && trackRequired && /^\\w+$/.test(name)) {\n throw new Error(\n `Required parameter '${name}' cannot follow optional parameter`\n )\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/** TJS mode flags for opt-in language improvements */\nexport interface TjsModes {\n /** TjsEquals: == and != use structural equality */\n tjsEquals: boolean\n /** TjsClass: classes callable without new, explicit new is banned */\n tjsClass: boolean\n /** TjsDate: Date is banned, use Timestamp/LegalDate */\n tjsDate: boolean\n /** TjsNoeval: eval() and new Function() are banned */\n tjsNoeval: boolean\n /** TjsStandard: newlines as statement terminators (prevents ASI footguns) */\n tjsStandard: boolean\n}\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} {\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 // TJS modes - all default to false (JS-compatible by default)\n const tjsModes: TjsModes = {\n tjsEquals: false,\n tjsClass: false,\n tjsDate: false,\n tjsNoeval: false,\n tjsStandard: false,\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 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\n // Individual modes: TjsEquals, TjsClass, TjsDate, TjsNoeval, TjsStandard\n const directivePattern =\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*(TjsStrict|TjsEquals|TjsClass|TjsDate|TjsNoeval|TjsStandard|LegacyEquals)\\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.tjsStandard = true\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 === 'TjsStandard') {\n tjsModes.tjsStandard = true\n } else if (directive === 'LegacyEquals') {\n // DEPRECATED: LegacyEquals is now the default behavior\n // Kept for backwards compatibility - just ignore it\n console.warn(\n 'LegacyEquals is deprecated: JS equality is now the default. Use TjsEquals to enable structural equality.'\n )\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 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 = 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 // 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 // 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 // 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)\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 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 }\n}\n\n/**\n * Transform try blocks without catch/finally into monadic error handling\n * try { ... } (alone) -> try { ... } catch (__err) { return AgentError }\n *\n * Note: try-without-catch only makes sense inside functions (for monadic return).\n * Using it at top level will result in \"'return' outside of function\" error,\n * which is the correct behavior - monadic error flow requires a function context.\n */\nfunction 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 with call stack\n // In debug mode, __tjs.getStack() returns the call stack for diagnostics\n const body = source.slice(bodyStart, j - 1)\n result += `try {${body}} catch (__try_err) { return { $error: true, message: __try_err?.message || String(__try_err), op: 'try', cause: __try_err, stack: globalThis.__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 */\nfunction 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 captures = detectCaptures(body)\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 const captureArgs = captures.length > 0 ? captures.join(', ') : ''\n\n // For WASM: pass captures as arguments\n // For fallback: just run inline (captures are in scope)\n const wasmCall =\n captures.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/**\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 // Find all identifiers used in the body\n const identifierPattern = /\\b([a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g\n const allIdentifiers = new Set<string>()\n let match\n while ((match = identifierPattern.exec(body)) !== null) {\n allIdentifiers.add(match[1])\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(body)) !== 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(body)) !== 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 ])\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)) {\n captures.push(id)\n }\n }\n\n return captures.sort()\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 * 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 * In LegacyEquals mode, these are the explicit operators for structural equality.\n */\nfunction 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 */\nfunction 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\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const prevLine = i > 0 ? lines[i - 1] : ''\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 */\nfunction transformEqualityToStructural(source: string): string {\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 === '==' ? 'Is' : 'IsNot'\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 (reversed since we're going backwards)\n if (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\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 === ';' || char === '{' || 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 'new',\n ].includes(word)\n ) {\n return wordEnd\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 */\nfunction 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.slice(i).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 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 */\nfunction 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 return `['${parts[0]}', ${parts[1]}]`\n }\n return `'${parts[0]}'`\n })\n\n // Parse the block body\n const descMatch = blockBody.match(/description\\s*:\\s*(['\"`])([^]*?)\\1/)\n const predicateMatch = blockBody.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 */\nfunction 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 */\nfunction 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 * 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 */\nfunction 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 */\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/**\n * Extract and run test blocks from source\n *\n * Syntax:\n * test { body }\n * test 'description' { body }\n *\n * Tests are executed at transpile time and stripped from output.\n * If any test fails, the error is collected (transpilation continues).\n */\nfunction 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 tests.push({ description, body, start, end })\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 position ${start}`\n errors.push(`Test failed: ${desc}\\n ${err.message || err}`)\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 */\nfunction wrapClassDeclarations(source: string): 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 result += `${className} = new Proxy(${className}, { apply(t, _, a) { return Reflect.construct(t, a) } });`\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 */\nfunction 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 */\nfunction 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",
7
+ "/**\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 | '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",
8
+ "/**\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 return { kind: 'number' }\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 // Use first element as the item type\n const itemType = inferTypeFromValue(elements[0])\n return { kind: 'array', items: itemType }\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 const leftType = inferTypeFromValue(left)\n const rightType = inferTypeFromValue(right)\n\n // type || null means nullable type\n if (rightType.kind === 'null') {\n return { ...leftType, nullable: true }\n }\n\n // null || type means nullable type (reverse)\n if (leftType.kind === 'null') {\n return { ...rightType, nullable: true }\n }\n\n // type1 || type2 means union\n return {\n kind: 'union',\n members: [leftType, rightType],\n }\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 '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 // Handle negative numbers: -1\n if (\n (node as any).operator === '-' &&\n (node as any).argument.type === 'Literal'\n ) {\n const value = (node as any).argument.value\n if (typeof value === 'number') {\n return { kind: 'number' }\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 return undefined\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 '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 '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",
9
+ "/**\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",
10
+ "/**\n * TJS to JavaScript Emitter\n *\n * Transforms TJS source into standard JavaScript with runtime type metadata.\n * Unlike the AST emitter (for AgentJS), this outputs executable JS code.\n *\n * Input:\n * function greet(name: 'world') -> '' {\n * return `Hello, ${name}!`\n * }\n *\n * Output:\n * function greet(name = 'world') {\n * return `Hello, ${name}!`\n * }\n * greet.__tjs = {\n * params: { name: { type: 'string', required: true, example: 'world' } },\n * returns: { type: 'string' }\n * }\n */\n\nimport type { FunctionDeclaration, Program } from 'acorn'\nimport { parseExpressionAt } from 'acorn'\nimport { parse, extractTDoc, preprocess } from '../parser'\nimport type { TypeDescriptor, ParameterDescriptor } from '../types'\nimport { inferTypeFromValue, parseParameter } from '../inference'\nimport { extractTests } from '../tests'\n\nexport interface TJSTranspileOptions {\n /** Filename for error messages */\n filename?: string\n /** Include source map comment */\n sourceMap?: boolean\n /** Mode: 'dev' | 'strict' | 'production' */\n mode?: 'dev' | 'strict' | 'production'\n /**\n * Test execution mode:\n * - true (default): run tests at transpile time, throw on failure\n * - false: skip tests entirely (production build)\n * - 'only': only run tests, don't emit code (CI/test runner)\n * - 'report': run tests, report results in testResults, don't throw\n * (caller decides whether to use the code based on results)\n */\n runTests?: boolean | 'only' | 'report'\n /**\n * Debug mode: include source locations in __tjs metadata\n * Enables better error messages with file:line:column info\n */\n debug?: boolean\n /**\n * Pre-resolved import code for test execution.\n * Map of import specifier to compiled JavaScript code.\n * Used when tests depend on imported modules.\n */\n resolvedImports?: Record<string, string>\n}\n\n/** Result of running tests at transpile time */\nexport interface TestResult {\n /** Test description */\n description: string\n /** Whether the test passed */\n passed: boolean\n /** Error message if failed */\n error?: string\n /** Whether this was an implicit signature test */\n isSignatureTest?: boolean\n /** Source line number (1-indexed) where the test or error occurred */\n line?: number\n /** Source column number (1-indexed) */\n column?: number\n}\n\nexport interface TJSTranspileResult {\n /** The transpiled JavaScript code */\n code: string\n /** Type information for the function(s) - Record of function name to type info */\n types: Record<string, TJSTypeInfo>\n /** Function metadata (alias for types, used by runtime) */\n metadata: Record<string, TJSTypeInfo>\n /** Any warnings during transpilation */\n warnings?: string[]\n /** Generated test runner code (if tests were present) - DEPRECATED, tests now run at transpile time */\n testRunner?: string\n /** Number of tests extracted */\n testCount?: number\n /** Test results (when runTests is true or 'only') */\n testResults?: TestResult[]\n}\n\nexport interface TJSTypeInfo {\n /** Function name */\n name: string\n /** Parameter types */\n params: Record<string, ParameterDescriptor>\n /** Return type */\n returns?: TypeDescriptor\n /** TDoc description */\n description?: string\n /** True if function uses destructured object param (the fast path) */\n isDestructuredParam?: boolean\n /** The shape of the destructured param (for inline validation) */\n destructuredShape?: Record<string, TypeDescriptor>\n /** Which fields in destructuredShape are required */\n destructuredRequired?: Set<string>\n}\n\n/**\n * Extract type info for a single function declaration\n */\nfunction extractFunctionTypeInfo(\n func: FunctionDeclaration,\n originalSource: string,\n requiredParams: Set<string>,\n returnTypeStr: string | null\n): { types: TJSTypeInfo; warnings: string[] } {\n const warnings: string[] = []\n\n // Extract TDoc (/*# ... */) comments\n const tdoc = extractTDoc(originalSource, func)\n\n // Build parameter type info\n const params: Record<string, ParameterDescriptor> = {}\n let isDestructuredParam = false\n let destructuredShape: Record<string, TypeDescriptor> | undefined\n let destructuredRequired: Set<string> | undefined\n\n // Check if this is a single destructured object param (the fast path)\n if (\n func.params.length === 1 &&\n (func.params[0].type === 'ObjectPattern' ||\n (func.params[0].type === 'AssignmentPattern' &&\n func.params[0].left.type === 'ObjectPattern'))\n ) {\n isDestructuredParam = true\n const param = func.params[0]\n const objectPattern =\n param.type === 'ObjectPattern' ? param : (param as any).left\n\n const paramInfo = parseParameter(objectPattern, requiredParams)\n if (paramInfo.type.kind === 'object' && paramInfo.type.destructuredParams) {\n destructuredShape = {}\n destructuredRequired = new Set()\n\n // Build shape and track required fields\n for (const [key, descriptor] of Object.entries(\n paramInfo.type.destructuredParams\n )) {\n params[key] = {\n ...descriptor,\n description: tdoc.params[key],\n }\n destructuredShape[key] = descriptor.type\n if (descriptor.required) {\n destructuredRequired.add(key)\n }\n }\n }\n } else {\n // Traditional param handling (multiple params or non-destructured)\n for (const param of func.params) {\n if (param.type === 'Identifier') {\n const paramInfo = parseParameter(param, requiredParams)\n params[param.name] = {\n ...paramInfo,\n required: requiredParams.has(param.name),\n description: tdoc.params[param.name],\n }\n } else if (\n param.type === 'AssignmentPattern' &&\n param.left.type === 'Identifier'\n ) {\n const paramInfo = parseParameter(param, requiredParams)\n params[param.left.name] = {\n ...paramInfo,\n required: requiredParams.has(param.left.name),\n description: tdoc.params[param.left.name],\n }\n } else if (param.type === 'ObjectPattern') {\n // Handle destructured object parameters (non-single case)\n const paramInfo = parseParameter(param, requiredParams)\n if (\n paramInfo.type.kind === 'object' &&\n paramInfo.type.destructuredParams\n ) {\n for (const [key, descriptor] of Object.entries(\n paramInfo.type.destructuredParams\n )) {\n params[key] = {\n ...descriptor,\n description: tdoc.params[key],\n }\n }\n }\n }\n }\n }\n\n // Parse return type if present\n let returns: TypeDescriptor | undefined\n if (returnTypeStr) {\n try {\n const returnExpr = parseExpressionAt(returnTypeStr, 0, {\n ecmaVersion: 2022,\n })\n returns = inferTypeFromValue(returnExpr as any)\n } catch {\n // If we can't parse the return type, just store it as-is\n returns = { kind: 'any' }\n warnings.push(`Could not parse return type: ${returnTypeStr}`)\n }\n }\n\n // Build type info object\n const types: TJSTypeInfo = {\n name: func.id?.name || 'anonymous',\n params,\n returns,\n description: tdoc.description,\n isDestructuredParam,\n destructuredShape,\n destructuredRequired,\n }\n\n return { types, warnings }\n}\n\n/**\n * Generate inline validation code to be inserted at the start of a function body\n *\n * Implements proper monadic error handling:\n * 1. Check if any param is an Error - if so, pass it through (no work)\n * 2. Check types with fast inline typeof checks\n * 3. On type mismatch, call __tjs.typeError() (only on error path)\n *\n * @param funcName - Function name for error paths\n * @param types - Type information for the function\n * @param source - Source location (e.g., \"src/utils.ts:42\") for error reporting\n */\nfunction generateInlineValidationCode(\n funcName: string,\n types: TJSTypeInfo,\n source?: string\n): string | null {\n const lines: string[] = []\n // Include source in path if available: \"src/file.ts:42:funcName.param\"\n const pathPrefix = source ? `${source}:` : ''\n const stackEntry = source ? `${source}:${funcName}` : funcName\n\n // Push onto call stack for debug mode (only runs if debug enabled)\n lines.push(`__tjs.pushStack('${stackEntry}');`)\n\n // Destructured params: validate each field of the input object\n if (types.isDestructuredParam && types.destructuredShape) {\n const shape = types.destructuredShape\n const requiredFields = types.destructuredRequired || new Set()\n const fieldNames = Object.keys(shape)\n\n if (fieldNames.length === 0) return null\n\n // 1. Error pass-through: check if any field is an Error\n for (const fieldName of fieldNames) {\n lines.push(`if (${fieldName} instanceof Error) return ${fieldName};`)\n }\n\n // 2. Type checks with proper error emission\n for (const [fieldName, fieldType] of Object.entries(shape)) {\n const isRequired = requiredFields.has(fieldName)\n const path = `${pathPrefix}${funcName}.${fieldName}`\n const typeCheck = generateTypeCheckExpr(fieldName, fieldType)\n\n if (typeCheck) {\n const expectedType = fieldType.kind\n if (isRequired) {\n lines.push(\n `if (${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${fieldName});`\n )\n } else {\n lines.push(\n `if (${fieldName} !== undefined && ${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${fieldName});`\n )\n }\n }\n }\n\n return lines.length > 0 ? lines.join('\\n ') : null\n }\n\n // Positional params: validate each param\n const params = Object.entries(types.params)\n if (params.length === 0) return null\n\n // 1. Error pass-through: check if any param is an Error\n for (const [paramName] of params) {\n lines.push(`if (${paramName} instanceof Error) return ${paramName};`)\n }\n\n // 2. Type checks with proper error emission\n for (const [paramName, param] of params) {\n const path = `${pathPrefix}${funcName}.${paramName}`\n const typeCheck = generateTypeCheckExpr(paramName, param.type)\n\n if (typeCheck) {\n const expectedType = param.type.kind\n if (param.required) {\n lines.push(\n `if (${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n } else {\n lines.push(\n `if (${paramName} !== undefined && ${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n }\n }\n }\n\n return lines.length > 0 ? lines.join('\\n ') : null\n}\n\n/**\n * Extract the return type string for a specific function from source\n * Returns null if no return type found\n */\nfunction extractFunctionReturnType(\n source: string,\n funcName: string\n): string | null {\n // Match: function funcName(params) -> returnExample {\n // or: function funcName(params) -? returnExample {\n // or: function funcName(params) -! returnExample {\n const regex = new RegExp(\n `function\\\\s+${funcName}\\\\s*\\\\([^)]*\\\\)\\\\s*(-[>?!])\\\\s*`,\n 'g'\n )\n const match = regex.exec(source)\n if (!match) return null\n\n const afterMarker = source.slice(match.index + match[0].length)\n return extractReturnExampleFromSource(afterMarker)\n}\n\n/**\n * Extract return safety marker for a specific function from source\n * Returns 'safe' for -?, 'unsafe' for -!, undefined for -> or no marker\n */\nfunction extractFunctionReturnSafety(\n source: string,\n funcName: string\n): 'safe' | 'unsafe' | undefined {\n // Match: function funcName(params) -X where X is >, ?, or !\n const regex = new RegExp(\n `function\\\\s+${funcName}\\\\s*\\\\([^)]*\\\\)\\\\s*-([>?!])`,\n 'g'\n )\n const match = regex.exec(source)\n if (!match) return undefined\n\n const marker = match[1]\n if (marker === '?') return 'safe'\n if (marker === '!') return 'unsafe'\n return undefined // -> is the default, no special safety flag\n}\n\n/**\n * Extract source file annotation from TJS source\n * Looks for: /★ tjs <- path/to/file.ts ★/ at the start (★ = *)\n */\nfunction extractSourceFileAnnotation(source: string): string | undefined {\n const match = source.match(/^\\/\\*\\s*tjs\\s*<-\\s*([^*]+?)\\s*\\*\\//)\n return match ? match[1].trim() : undefined\n}\n\n/**\n * Extract line number annotation for a specific function\n * Looks for: /★ line N ★/ immediately before the function declaration\n */\nfunction extractLineAnnotation(\n source: string,\n funcName: string\n): number | undefined {\n // Match: /* line N */ followed by function declaration\n // Allow for async, whitespace variations\n const regex = new RegExp(\n `\\\\/\\\\*\\\\s*line\\\\s+(\\\\d+)\\\\s*\\\\*\\\\/\\\\s*(?:async\\\\s+)?function\\\\s+${funcName}\\\\s*\\\\(`,\n 'm'\n )\n const match = source.match(regex)\n return match ? parseInt(match[1], 10) : undefined\n}\n\n/**\n * Transpile TJS source to JavaScript\n *\n * This function handles:\n * - Files with no functions (just statements/tests)\n * - Files with multiple functions\n * - Inline validation (no wrappers)\n * - __tjs metadata inserted immediately after each function\n */\nexport function transpileToJS(\n source: string,\n options: TJSTranspileOptions = {}\n): TJSTranspileResult {\n const {\n filename = '<source>',\n runTests = true,\n debug = false,\n resolvedImports = {},\n } = options\n const warnings: string[] = []\n\n // Extract source file annotation if present (from TS transpilation)\n const sourceFileAnnotation = extractSourceFileAnnotation(source)\n const effectiveFilename = sourceFileAnnotation || filename\n\n // Extract test/mock blocks before parsing (they're not valid JS)\n const { code: cleanSource, tests, mocks, testRunner } = extractTests(source)\n\n // Parse the cleaned source (handles TJS syntax like x: 'type' and -> ReturnType)\n const {\n ast: program,\n originalSource,\n requiredParams,\n unsafeFunctions,\n } = parse(cleanSource, {\n filename,\n colonShorthand: true,\n })\n\n // Find ALL functions in the program\n const functions = findAllFunctions(program)\n\n // Preprocess source (handles TJS syntax transformations)\n const preprocessed = preprocess(cleanSource)\n\n // Build types map for all functions\n const allTypes: Record<string, TJSTypeInfo> = {}\n\n // Collect insertions: { position, text } to be applied in reverse order\n const insertions: { position: number; text: string }[] = []\n\n // Process each function\n for (const func of functions) {\n const funcName = func.id?.name || 'anonymous'\n\n // Extract return type for this specific function from original source\n const returnTypeStr = extractFunctionReturnType(cleanSource, funcName)\n\n // Extract type info for this function\n const { types, warnings: funcWarnings } = extractFunctionTypeInfo(\n func,\n originalSource,\n requiredParams,\n returnTypeStr\n )\n warnings.push(...funcWarnings)\n allTypes[funcName] = types\n\n // Determine safety options\n // Module-level \"safety none\" makes ALL functions unsafe (no validation)\n const isUnsafe =\n preprocessed.moduleSafety === 'none' || unsafeFunctions.has(funcName)\n const isSafe = preprocessed.safeFunctions.has(funcName)\n // Extract return safety per-function from original source\n const returnSafety = extractFunctionReturnSafety(cleanSource, funcName)\n\n // Get source location - prefer line annotation from TS transpilation\n const annotatedLine = extractLineAnnotation(source, funcName)\n const funcLoc = {\n file: effectiveFilename,\n line: annotatedLine ?? func.loc?.start.line ?? 0,\n column: func.loc?.start.column ?? 0,\n }\n\n const safetyOptions = {\n unsafe: isUnsafe,\n safe: isSafe,\n returnSafety,\n }\n\n // Generate __tjs metadata (to insert after function)\n const typeMetadata = generateTypeMetadata(funcName, types, safetyOptions, {\n debug,\n source: funcLoc,\n })\n\n // Queue insertion of __tjs after function closing brace\n insertions.push({\n position: func.end,\n text: `\\n${typeMetadata}`,\n })\n\n // Generate inline validation (to insert at start of function body)\n // Skip for unsafe functions\n if (!isUnsafe) {\n const sourceStr = `${funcLoc.file}:${funcLoc.line}`\n const validationCode = generateInlineValidationCode(\n funcName,\n types,\n sourceStr\n )\n if (validationCode && func.body && func.body.start !== undefined) {\n // Insert right after the opening brace\n insertions.push({\n position: func.body.start + 1,\n text: `\\n ${validationCode}\\n`,\n })\n }\n }\n }\n\n // Apply insertions in reverse position order (to maintain correct offsets)\n insertions.sort((a, b) => b.position - a.position)\n\n let code = preprocessed.source\n for (const { position, text } of insertions) {\n code = code.slice(0, position) + text + code.slice(position)\n }\n\n // Add __tjs reference for monadic error handling and structural equality\n // Use createRuntime() for isolated state per-module\n const needsTypeError = code.includes('__tjs.typeError(')\n const needsIs = code.includes('Is(')\n const needsIsNot = code.includes('IsNot(')\n\n if (needsTypeError || needsIs || needsIsNot) {\n // Create isolated runtime instance for this module\n // Falls back to shared global if createRuntime not available\n let preamble =\n 'const __tjs = globalThis.__tjs?.createRuntime?.() ?? globalThis.__tjs;\\n'\n\n // Add destructured imports for Is/IsNot if used\n if (needsIs || needsIsNot) {\n const imports = [needsIs && 'Is', needsIsNot && 'IsNot']\n .filter(Boolean)\n .join(', ')\n preamble += `const { ${imports} } = __tjs ?? {};\\n`\n }\n\n code = preamble + code\n }\n\n // Run tests at transpile time if enabled\n let testResults: TestResult[] | undefined\n\n if (runTests) {\n testResults = []\n\n // Run explicit test blocks\n if (tests.length > 0) {\n const blockResults = runTestBlocks(tests, mocks, code, resolvedImports)\n testResults.push(...blockResults)\n }\n\n // Run signature tests for ALL functions with -> return types\n // Extract from original source since parser only tracks the first one\n const sigTests = runAllSignatureTests(source, code, resolvedImports)\n testResults.push(...sigTests)\n\n // Check for failures and throw only if runTests === true (strict mode)\n // 'only' and 'report' modes return results without throwing\n const failures = testResults.filter((r) => !r.passed)\n if (failures.length > 0 && runTests === true) {\n const errorLines = failures.map((f) => {\n if (f.isSignatureTest) {\n return ` Function signature example is inconsistent:\\n ${f.error}`\n }\n return ` Test '${f.description}' failed:\\n ${f.error}`\n })\n throw new Error(`Transpile-time test failures:\\n${errorLines.join('\\n')}`)\n }\n }\n\n // If runTests === 'only', return minimal result\n if (runTests === 'only') {\n return {\n code: '',\n types: allTypes,\n metadata: allTypes,\n testResults,\n testCount: testResults?.length,\n }\n }\n\n return {\n code,\n types: allTypes,\n metadata: allTypes, // alias for runtime compatibility\n warnings: warnings.length > 0 ? warnings : undefined,\n testRunner: tests.length > 0 ? testRunner : undefined,\n testCount: tests.length > 0 ? tests.length : undefined,\n testResults,\n }\n}\n\n/**\n * Find ALL function declarations in the AST\n * Includes functions inside export declarations\n */\nfunction findAllFunctions(program: Program): FunctionDeclaration[] {\n const functions: FunctionDeclaration[] = []\n\n for (const node of program.body) {\n if (node.type === 'FunctionDeclaration') {\n functions.push(node)\n } else if (\n node.type === 'ExportNamedDeclaration' &&\n node.declaration?.type === 'FunctionDeclaration'\n ) {\n functions.push(node.declaration as FunctionDeclaration)\n } else if (\n node.type === 'ExportDefaultDeclaration' &&\n node.declaration?.type === 'FunctionDeclaration'\n ) {\n functions.push(node.declaration as FunctionDeclaration)\n }\n }\n\n return functions\n}\n\n/**\n * Serialize a TypeDescriptor to JSON-compatible object\n * Preserves full type structure (shape, items, members)\n */\nfunction serializeType(t: TypeDescriptor): any {\n const result: any = { kind: t.kind }\n if (t.nullable) result.nullable = true\n if (t.items) result.items = serializeType(t.items)\n if (t.shape) {\n result.shape = Object.fromEntries(\n Object.entries(t.shape).map(([k, v]) => [k, serializeType(v)])\n )\n }\n if (t.members) result.members = t.members.map(serializeType)\n return result\n}\n\n/**\n * Safety options for metadata generation\n */\ninterface SafetyOptions {\n /** Function marked with (!) - never validate inputs */\n unsafe?: boolean\n /** Function marked with (?) - always validate inputs */\n safe?: boolean\n /** Return type safety: 'safe' (-?) or 'unsafe' (-!) */\n returnSafety?: 'safe' | 'unsafe'\n}\n\n/**\n * Debug options for metadata generation\n */\ninterface DebugOptions {\n /** Include source locations in metadata */\n debug?: boolean\n /** Source location of the function */\n source?: {\n file: string\n line: number\n column: number\n }\n}\n\n/**\n * Generate type metadata code\n *\n * @param funcName - Function name\n * @param types - Type information\n * @param safety - Safety flags for the function\n * @param debugOpts - Debug options (source locations)\n */\nfunction generateTypeMetadata(\n funcName: string,\n types: TJSTypeInfo,\n safety: SafetyOptions = {},\n debugOpts: DebugOptions = {}\n): string {\n const paramsObj: Record<string, any> = {}\n\n for (const [name, param] of Object.entries(types.params)) {\n paramsObj[name] = {\n type: serializeType(param.type),\n required: param.required,\n }\n if (param.default !== undefined) {\n paramsObj[name].default = param.default\n }\n if (param.description) {\n paramsObj[name].description = param.description\n }\n }\n\n const metadata: any = {\n params: paramsObj,\n }\n\n if (types.returns) {\n metadata.returns = {\n type: serializeType(types.returns),\n }\n // Add return safety flags\n if (safety.returnSafety === 'safe') {\n metadata.safeReturn = true // -? forces output validation\n } else if (safety.returnSafety === 'unsafe') {\n metadata.unsafeReturn = true // -! skips output validation\n }\n }\n\n if (types.description) {\n metadata.description = types.description\n }\n\n // Mark unsafe functions - they skip runtime input validation\n if (safety.unsafe) {\n metadata.unsafe = true\n }\n\n // Mark safe functions - they force runtime input validation\n if (safety.safe) {\n metadata.safe = true\n }\n\n // Always include source location for error reporting\n if (debugOpts.source) {\n const { file, line } = debugOpts.source\n metadata.source = `${file}:${line}`\n }\n\n return `${funcName}.__tjs = ${JSON.stringify(metadata, null, 2)}`\n}\n\n/**\n * Check if this function can use inline validation (the fast path)\n *\n * Two patterns qualify:\n * 1. Single destructured object param: function foo({ x: 0, y: '' }) { ... }\n * 2. Single named object param: function foo(input: { x: 0, y: '' }) { ... }\n *\n * These can be validated with fast inline checks instead of schema interpretation.\n */\nfunction canUseInlineValidation(types: TJSTypeInfo): boolean {\n // Destructured params always qualify\n if (types.isDestructuredParam && types.destructuredShape) {\n return true\n }\n\n // Any function with params can use inline validation\n // (we generate typeof checks for primitives too)\n return Object.keys(types.params).length > 0\n}\n\n/**\n * Generate inline validation code for single-arg object types\n *\n * This is ~20x faster than schema-based validation because:\n * 1. No schema interpretation at runtime\n * 2. No object iteration\n * 3. JIT can inline the checks\n *\n * Generated code looks like:\n * if (typeof input !== 'object' || input === null ||\n * typeof input.x !== 'number' ||\n * typeof input.y !== 'number') {\n * return { $error: true, message: '...', path: 'funcName.input' }\n * }\n */\nexport function generateInlineValidation(\n funcName: string,\n paramName: string,\n shape: Record<string, TypeDescriptor>,\n requiredFields: Set<string>\n): string {\n const checks: string[] = []\n const path = `${funcName}.${paramName}`\n\n // Check it's an object\n checks.push(`typeof ${paramName} !== 'object'`)\n checks.push(`${paramName} === null`)\n\n // Check each field\n for (const [fieldName, fieldType] of Object.entries(shape)) {\n const fieldPath = `${paramName}.${fieldName}`\n const isRequired = requiredFields.has(fieldName)\n\n const typeCheck = generateTypeCheck(fieldPath, fieldType)\n if (typeCheck) {\n if (isRequired) {\n // Required: must exist and have correct type\n checks.push(typeCheck)\n } else {\n // Optional: only check type if defined\n checks.push(`(${fieldPath} !== undefined && ${typeCheck})`)\n }\n }\n }\n\n if (checks.length === 0) return ''\n\n return `if (${checks.join(' || ')}) {\n return { $error: true, message: 'Invalid ${paramName}', path: '${path}' }\n}`\n}\n\n/**\n * Generate a type check expression for a single field\n * Returns null if no check needed (e.g., 'any' type)\n */\n/**\n * Generate a type check expression for a single field\n * Returns an expression that evaluates to true when type is INVALID\n * Returns null if no check needed (e.g., 'any' type)\n */\nfunction generateTypeCheckExpr(\n fieldPath: string,\n type: TypeDescriptor\n): string | null {\n switch (type.kind) {\n case 'string':\n return `typeof ${fieldPath} !== 'string'`\n case 'number':\n return `typeof ${fieldPath} !== 'number'`\n case 'boolean':\n return `typeof ${fieldPath} !== 'boolean'`\n case 'null':\n return `${fieldPath} !== null`\n case 'undefined':\n return `${fieldPath} !== undefined`\n case 'array':\n return `!Array.isArray(${fieldPath})`\n case 'object':\n // For nested objects, just check it's an object (deep validation is separate)\n return `(typeof ${fieldPath} !== 'object' || ${fieldPath} === null || Array.isArray(${fieldPath}))`\n case 'any':\n return null // No check needed\n default:\n return null\n }\n}\n\n// Alias for backward compatibility with other functions that use this\nconst generateTypeCheck = generateTypeCheckExpr\n\n/**\n * Generate the complete function wrapper with inline validation\n *\n * For destructured object params, this generates:\n *\n * const _original_funcName = funcName\n * funcName = function(__input) {\n * if (typeof __input !== 'object' || __input === null || ...) {\n * return { $error: true, message: '...', path: '...' }\n * }\n * return _original_funcName.call(this, __input)\n * }\n *\n * For single named object params, same pattern with the actual param name.\n */\nexport function generateInlineWrapper(\n funcName: string,\n types: TJSTypeInfo,\n safety: SafetyOptions = {}\n): string | null {\n // Check if we can use inline validation\n if (!canUseInlineValidation(types)) return null\n\n // Unsafe functions don't need wrappers\n if (safety.unsafe) return null\n\n // Destructured params: use __input as the wrapper param name\n if (types.isDestructuredParam && types.destructuredShape) {\n const paramName = '__input'\n const shape = types.destructuredShape\n const requiredFields = types.destructuredRequired || new Set()\n\n const validation = generateInlineValidation(\n funcName,\n paramName,\n shape,\n requiredFields\n )\n if (!validation) return null\n\n return `\nconst _original_${funcName} = ${funcName}\n${funcName} = function(${paramName}) {\n ${validation}\n return _original_${funcName}.call(this, ${paramName})\n}\n`.trim()\n }\n\n // Positional params path (primitives or single object param)\n const params = Object.entries(types.params)\n\n // Check if it's a single object param with shape\n if (params.length === 1) {\n const [paramName, param] = params[0]\n if (param.type.kind === 'object' && param.type.shape) {\n // Single named object param\n const shape = param.type.shape\n const requiredFields = new Set<string>()\n for (const [fieldName] of Object.entries(shape)) {\n requiredFields.add(fieldName)\n }\n\n const validation = generateInlineValidation(\n funcName,\n paramName,\n shape,\n requiredFields\n )\n if (!validation) return null\n\n return `\nconst _original_${funcName} = ${funcName}\n${funcName} = function(${paramName}) {\n ${validation}\n return _original_${funcName}.call(this, ${paramName})\n}\n`.trim()\n }\n }\n\n // Generate validation for positional primitive params\n const validation = generatePositionalValidation(funcName, params)\n if (!validation) return null\n\n const paramNames = params.map(([name]) => name).join(', ')\n return `\nconst _original_${funcName} = ${funcName}\n${funcName} = function(${paramNames}) {\n ${validation}\n return _original_${funcName}.call(this, ${paramNames})\n}\n`.trim()\n}\n\n/**\n * Generate validation for positional (primitive) params\n */\nfunction generatePositionalValidation(\n funcName: string,\n params: [string, ParameterDescriptor][]\n): string | null {\n const checks: string[] = []\n\n for (const [paramName, param] of params) {\n const typeCheck = generateTypeCheck(paramName, param.type)\n if (typeCheck) {\n if (param.required) {\n // Required: must have correct type\n checks.push(typeCheck)\n } else {\n // Optional: only check if defined\n checks.push(`(${paramName} !== undefined && ${typeCheck})`)\n }\n }\n }\n\n if (checks.length === 0) return null\n\n return `if (${checks.join(' || ')}) {\n return { $error: true, message: 'Invalid arguments', path: '${funcName}' }\n }`\n}\n\n// =============================================================================\n// Transpile-time Test Execution\n// =============================================================================\n\n/**\n * Fuzzy comparison for floating point numbers\n */\nfunction fuzzyEqual(a: unknown, b: unknown, epsilon = 1e-9): boolean {\n if (a === b) return true\n if (typeof a === 'number' && typeof b === 'number') {\n // Check if either is non-integer (float)\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n const diff = Math.abs(a - b)\n const maxAbs = Math.max(Math.abs(a), Math.abs(b), 1)\n return diff / maxAbs < epsilon\n }\n }\n return false\n}\n\n/**\n * Deep equality check with fuzzy float comparison\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (fuzzyEqual(a, b)) return true\n if (a === null || b === null) return a === b\n if (a === undefined || b === undefined) return a === b\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return false\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => deepEqual(v, b[i]))\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\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) => deepEqual((a as any)[k], (b as any)[k]))\n}\n\n/**\n * Check if a value matches an expected type pattern (from example value)\n * Unlike deepEqual, this checks TYPE compatibility, not value equality.\n *\n * Example patterns:\n * 0 matches any number\n * \"\" matches any string\n * true matches any boolean\n * null matches null\n * [] matches any array\n * [0] matches array of numbers\n * {name: \"\", age: 0} matches object with string name and number age\n */\nfunction typeMatches(\n actual: unknown,\n pattern: unknown,\n path = ''\n): { matches: boolean; error?: string } {\n // null pattern matches null\n if (pattern === null) {\n if (actual === null) return { matches: true }\n return {\n matches: false,\n error: `Expected null at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n // undefined pattern matches undefined\n if (pattern === undefined) {\n if (actual === undefined) return { matches: true }\n return {\n matches: false,\n error: `Expected undefined at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n // Primitive types - check type, not value\n if (typeof pattern === 'number') {\n if (typeof actual === 'number') return { matches: true }\n return {\n matches: false,\n error: `Expected number at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n if (typeof pattern === 'string') {\n if (typeof actual === 'string') return { matches: true }\n return {\n matches: false,\n error: `Expected string at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n if (typeof pattern === 'boolean') {\n if (typeof actual === 'boolean') return { matches: true }\n return {\n matches: false,\n error: `Expected boolean at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n // Arrays\n if (Array.isArray(pattern)) {\n if (!Array.isArray(actual)) {\n return {\n matches: false,\n error: `Expected array at '${path}', got ${typeOf(actual)}`,\n }\n }\n // Empty array pattern matches any array\n if (pattern.length === 0) return { matches: true }\n // Non-empty array pattern: check each element against first pattern element\n const elementPattern = pattern[0]\n for (let i = 0; i < actual.length; i++) {\n const result = typeMatches(actual[i], elementPattern, `${path}[${i}]`)\n if (!result.matches) return result\n }\n return { matches: true }\n }\n\n // Objects\n if (typeof pattern === 'object' && pattern !== null) {\n if (\n typeof actual !== 'object' ||\n actual === null ||\n Array.isArray(actual)\n ) {\n return {\n matches: false,\n error: `Expected object at '${path}', got ${typeOf(actual)}`,\n }\n }\n // Check all pattern keys exist and match types\n for (const key of Object.keys(pattern)) {\n const keyPath = path ? `${path}.${key}` : key\n if (!(key in actual)) {\n return { matches: false, error: `Missing property '${keyPath}'` }\n }\n const result = typeMatches(\n (actual as any)[key],\n (pattern as any)[key],\n keyPath\n )\n if (!result.matches) return result\n }\n return { matches: true }\n }\n\n // Fallback: exact equality\n if (actual === pattern) return { matches: true }\n return { matches: false, error: `Type mismatch at '${path}'` }\n}\n\n/**\n * Get a human-readable type description\n */\nfunction typeOf(v: unknown): string {\n if (v === null) return 'null'\n if (v === undefined) return 'undefined'\n if (Array.isArray(v)) return 'array'\n return typeof v\n}\n\n/**\n * Format a value for error messages - uses cleaner object notation\n * Multi-line for objects with 3+ properties\n */\nfunction formatValue(v: unknown, indent = 0): string {\n if (v === null) return 'null'\n if (v === undefined) return 'undefined'\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'number') return String(v)\n if (typeof v === 'boolean') return String(v)\n if (Array.isArray(v)) {\n if (v.length === 0) return '[]'\n if (v.length <= 3)\n return `[${v.map((x) => formatValue(x, indent)).join(', ')}]`\n return `[${v\n .slice(0, 3)\n .map((x) => formatValue(x, indent))\n .join(', ')}, ...]`\n }\n if (typeof v === 'object') {\n const entries = Object.entries(v)\n if (entries.length === 0) return '{}'\n\n const formatKey = (k: string) =>\n /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k) ? k : JSON.stringify(k)\n\n // Single line for 1-2 properties\n if (entries.length <= 2) {\n const formatted = entries\n .map(([k, val]) => `${formatKey(k)}: ${formatValue(val, indent)}`)\n .join(', ')\n return `{${formatted}}`\n }\n\n // Multi-line for 3+ properties\n const pad = ' '.repeat(indent + 1)\n const closePad = ' '.repeat(indent)\n const formatted = entries\n .slice(0, 8)\n .map(\n ([k, val]) => `${pad}${formatKey(k)}: ${formatValue(val, indent + 1)}`\n )\n .join(',\\n')\n const suffix = entries.length > 8 ? `,\\n${pad}...` : ''\n return `{\\n${formatted}${suffix}\\n${closePad}}`\n }\n return String(v)\n}\n\nimport type { ExtractedTest, ExtractedMock } from '../tests'\n\n/**\n * Strip comments from source code\n * Used to avoid matching code patterns inside comments\n */\nfunction stripComments(code: string): string {\n // Replace block comments with equivalent whitespace (preserve line numbers)\n let result = code.replace(/\\/\\*[\\s\\S]*?\\*\\//g, (match) => {\n // Replace with same number of newlines to preserve line numbers\n const newlines = match.split('\\n').length - 1\n return '\\n'.repeat(newlines)\n })\n\n // Replace line comments\n result = result.replace(/\\/\\/[^\\n]*/g, '')\n\n return result\n}\n\n/**\n * Strip import/export syntax for test execution context\n * Tests run in new Function() which doesn't support ES modules\n *\n * Useful for:\n * - Running tests in new Function() context\n * - CLI test runners\n * - Bundler plugins that need to extract module code\n */\nexport function stripModuleSyntax(code: string): string {\n // Remove import statements (entire line)\n let result = code.replace(/^import\\s+.*?from\\s+['\"][^'\"]+['\"];?\\s*$/gm, '')\n result = result.replace(/^import\\s+['\"][^'\"]+['\"];?\\s*$/gm, '')\n\n // Remove 'export ' keyword but keep the declaration\n result = result.replace(/^export\\s+default\\s+/gm, '')\n result = result.replace(/^export\\s+/gm, '')\n\n return result\n}\n\n/**\n * Strip the __tjs runtime preamble from transpiled code\n * This is needed when injecting resolved imports into a test context\n * that already has its own __tjs stub\n *\n * Useful for:\n * - Combining multiple TJS modules into a single execution context\n * - Test runners that provide their own __tjs runtime\n * - Bundlers that need to deduplicate runtime setup\n */\nexport function stripTjsPreamble(code: string): string {\n // Remove the __tjs runtime setup lines:\n // const __tjs = globalThis.__tjs?.createRuntime?.() ?? globalThis.__tjs;\n // const { Is, IsNot } = __tjs ?? {};\n let result = code.replace(\n /^const __tjs = globalThis\\.__tjs\\?\\.createRuntime\\?\\.\\(\\) \\?\\? globalThis\\.__tjs;\\n?/m,\n ''\n )\n result = result.replace(\n /^const \\{ (?:Is|IsNot|Is, IsNot) \\} = __tjs \\?\\? \\{\\};\\n?/m,\n ''\n )\n return result\n}\n\n/**\n * Build code to inject resolved imports into test execution context\n *\n * Takes a map of module specifier -> compiled code and returns code that\n * makes those exports available in the test scope.\n *\n * For example, if resolvedImports contains:\n * { 'mymath': 'function add(a, b) { return a + b }\\nadd.__tjs = {...}' }\n *\n * This will return code that evaluates that module and makes `add` available.\n */\nfunction buildResolvedImportsCode(\n resolvedImports: Record<string, string>\n): string {\n if (Object.keys(resolvedImports).length === 0) {\n return ''\n }\n\n const lines: string[] = []\n\n for (const [specifier, moduleCode] of Object.entries(resolvedImports)) {\n // Strip module syntax from the imported code too (it may have exports)\n let cleanCode = stripModuleSyntax(moduleCode)\n // Strip __tjs preamble to avoid duplicate declarations\n // (test execution context provides its own __tjs stub)\n cleanCode = stripTjsPreamble(cleanCode)\n\n lines.push(`// Resolved import: ${specifier}`)\n lines.push(cleanCode)\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Run extracted test blocks at transpile time\n */\nfunction runTestBlocks(\n tests: ExtractedTest[],\n mocks: ExtractedMock[],\n transpiledCode: string,\n resolvedImports: Record<string, string> = {}\n): TestResult[] {\n const results: TestResult[] = []\n\n // Strip import/export for test execution (can't use modules in new Function)\n let executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n executableCode = stripTjsPreamble(executableCode)\n\n // Build resolved imports code - inject imported module code into execution context\n const importedCode = buildResolvedImportsCode(resolvedImports)\n\n // Build execution context with the transpiled function\n const mockSetup = mocks.map((m) => m.body).join('\\n')\n\n for (const test of tests) {\n try {\n // Create a function that runs the test\n // Always provide a clean __tjs stub for isolated test execution\n // Save and restore globalThis.__tjs to prevent pollution\n const tjsStub = `\n const __saved_tjs = globalThis.__tjs;\n const __stub_tjs = { version: '0.0.0', pushStack: () => {}, typeError: (path, expected, value) => new Error(\\`Type error at \\${path}: expected \\${expected}\\`), createRuntime: function() { return this; } };\n globalThis.__tjs = __stub_tjs;\n `\n const tjsRestore = `globalThis.__tjs = __saved_tjs;`\n const testCode = `\n ${tjsStub}\n try {\n // Inject resolved imports first (they may be dependencies)\n ${importedCode}\n ${executableCode}\n ${mockSetup}\n\n // Test assertions\n function assert(condition, message) {\n if (!condition) throw new Error(message || 'Assertion failed')\n }\n\n function expect(actual) {\n return {\n toBe(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n },\n toEqual(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n }\n }\n }\n\n // Run the test body\n ${test.body}\n } finally {\n ${tjsRestore}\n }\n `\n\n // Execute the test\n const fn = new Function('__deepEqual', '__format', testCode)\n fn(deepEqual, formatValue)\n\n results.push({\n description: test.description,\n passed: true,\n line: test.line,\n })\n } catch (e: any) {\n results.push({\n description: test.description,\n passed: false,\n error: e.message || String(e),\n line: test.line,\n })\n }\n }\n\n return results\n}\n\n/**\n * Evaluate an ObjectExpression AST node to a plain object\n */\nfunction evalObjectExpression(node: any): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const prop of node.properties) {\n if (prop.type === 'Property' && prop.key) {\n const key =\n prop.key.type === 'Identifier' ? prop.key.name : prop.key.value\n if (prop.value.type === 'Literal') {\n result[key] = prop.value.value\n } else if (prop.value.type === 'ObjectExpression') {\n result[key] = evalObjectExpression(prop.value)\n } else if (prop.value.type === 'ArrayExpression') {\n result[key] = evalArrayExpression(prop.value)\n } else {\n throw new Error('Unsupported value type')\n }\n }\n }\n return result\n}\n\n/**\n * Evaluate an ArrayExpression AST node to an array\n */\nfunction evalArrayExpression(node: any): unknown[] {\n const result: unknown[] = []\n for (const elem of node.elements) {\n if (elem.type === 'Literal') {\n result.push(elem.value)\n } else if (elem.type === 'ObjectExpression') {\n result.push(evalObjectExpression(elem))\n } else if (elem.type === 'ArrayExpression') {\n result.push(evalArrayExpression(elem))\n } else {\n throw new Error('Unsupported element type')\n }\n }\n return result\n}\n\n/**\n * Extract and run signature tests for ALL functions with -> return types\n * Parses the original source to find function signatures\n *\n * Current limitations (future work):\n * - Only tests top-level `function` declarations (not arrow functions yet)\n * - Nested functions (inside other functions/blocks) are not excluded yet\n * and will fail if tested since they're not in global scope\n * - Arrow functions like `Foo = (x: 5) -> 10 => {}` not yet supported\n */\nfunction runAllSignatureTests(\n originalSource: string,\n transpiledCode: string,\n resolvedImports: Record<string, string> = {}\n): TestResult[] {\n const results: TestResult[] = []\n\n // Strip comments to avoid matching functions inside doc comments/code examples\n const sourceWithoutComments = stripComments(originalSource)\n\n // Match function declarations with return type marker (-> or -?)\n // Skip -! which means \"don't test\"\n // Pattern: function name(params) -> returnExample {\n const funcRegex = /function\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*(-[>?])\\s*/g\n\n let match\n while ((match = funcRegex.exec(sourceWithoutComments)) !== null) {\n const funcName = match[1]\n const paramsStr = match[2]\n const returnMarker = match[3]\n\n // Calculate line number from match position in stripped source\n const lineNumber = sourceWithoutComments\n .slice(0, match.index)\n .split('\\n').length\n\n // -! means skip test\n if (returnMarker === '-!') continue\n\n // Extract return example - handle nested braces/brackets\n // Use stripped source since match.index is from that\n const afterMarker = sourceWithoutComments.slice(\n match.index + match[0].length\n )\n const returnExample = extractReturnExampleFromSource(afterMarker)\n if (!returnExample) continue\n\n // Extract parameter examples\n const paramExamples = extractParamExamples(paramsStr)\n if (paramsStr.trim() && paramExamples.length === 0) continue\n\n // Run the signature test\n try {\n const expectedStr = returnExample\n\n // Parse expected value\n const expected = new Function(`return ${expectedStr}`)()\n\n // Parse args\n const args = paramExamples.map((p) => new Function(`return ${p}`)())\n\n const result = runSignatureTest(\n funcName,\n transpiledCode,\n args,\n expected,\n resolvedImports\n )\n result.line = lineNumber\n results.push(result)\n } catch (e: any) {\n results.push({\n description: `${funcName} signature example`,\n passed: false,\n error: `Failed to parse signature: ${e.message}`,\n isSignatureTest: true,\n line: lineNumber,\n })\n }\n }\n\n return results\n}\n\n/**\n * Extract return type example from source, handling nested braces\n */\nfunction extractReturnExampleFromSource(source: string): string | null {\n let result = ''\n let depth = 0\n let hasContent = false\n\n for (let i = 0; i < source.length; i++) {\n const char = source[i]\n\n if (char === '{' || char === '[' || char === '(') {\n if (char === '{' && depth === 0 && hasContent) {\n // Found the function body opening brace\n break\n }\n depth++\n result += char\n hasContent = true\n } else if (char === '}' || char === ']' || char === ')') {\n depth--\n result += char\n } else if (!/\\s/.test(char)) {\n result += char\n hasContent = true\n } else {\n result += char\n }\n }\n\n const trimmed = result.trim()\n return trimmed || null\n}\n\n/**\n * Extract parameter example values from params string\n */\nfunction extractParamExamples(paramsStr: string): string[] {\n if (!paramsStr.trim()) return []\n\n const examples: string[] = []\n const params = splitParams(paramsStr)\n\n for (const param of params) {\n // Match: name: example or name = example (with optional safety markers)\n // Handle: (? name: example) or (! name: example)\n const match = param.match(/(?:\\(\\s*[?!]\\s*)?(\\w+)\\s*[:=]\\s*(.+?)(?:\\))?$/)\n if (match) {\n examples.push(match[2].trim())\n } else {\n // No example value - can't run signature test\n return []\n }\n }\n\n return examples\n}\n\n/**\n * Split parameter string on commas, respecting nested structures\n */\nfunction splitParams(paramsStr: string): string[] {\n const params: string[] = []\n let current = ''\n let depth = 0\n\n for (const char of paramsStr) {\n if (char === '(' || char === '[' || char === '{') depth++\n else if (char === ')' || char === ']' || char === '}') depth--\n else if (char === ',' && depth === 0) {\n params.push(current.trim())\n current = ''\n continue\n }\n current += char\n }\n\n if (current.trim()) params.push(current.trim())\n return params\n}\n\n/**\n * Run signature example test\n */\nfunction runSignatureTest(\n funcName: string,\n transpiledCode: string,\n args: unknown[],\n expected: unknown,\n resolvedImports: Record<string, string> = {}\n): TestResult {\n const description = `${funcName} signature example`\n\n // Strip import/export for test execution (can't use modules in new Function)\n let executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n executableCode = stripTjsPreamble(executableCode)\n\n // Build resolved imports code - inject imported module code into execution context\n const importedCode = buildResolvedImportsCode(resolvedImports)\n\n try {\n // Execute the function with example args\n // Provide a minimal __tjs stub for pushStack/typeError (used by inline validation)\n // Only define if not already in the transpiled code\n // Always provide a clean __tjs stub for isolated test execution\n // Save and restore globalThis.__tjs to prevent pollution\n const tjsStub = `\n const __saved_tjs = globalThis.__tjs;\n const __stub_tjs = { version: '0.0.0', pushStack: () => {}, typeError: (path, expected, value) => new Error(\\`Type error at \\${path}: expected \\${expected}\\`), createRuntime: function() { return this; } };\n globalThis.__tjs = __stub_tjs;\n `\n const tjsRestore = `globalThis.__tjs = __saved_tjs;`\n const testCode = `\n ${tjsStub}\n try {\n // Inject resolved imports first (they may be dependencies)\n ${importedCode}\n ${executableCode}\n return ${funcName}(${args.map((a) => JSON.stringify(a)).join(', ')})\n } finally {\n ${tjsRestore}\n }\n `\n const fn = new Function(testCode)\n const actual = fn()\n\n // Use type matching, not value equality\n // The expected value is a TYPE PATTERN (example), not the exact expected result\n const result = typeMatches(actual, expected, funcName)\n if (!result.matches) {\n return {\n description,\n passed: false,\n error: result.error || `Type mismatch: got ${formatValue(actual)}`,\n isSignatureTest: true,\n }\n }\n\n return { description, passed: true, isSignatureTest: true }\n } catch (e: any) {\n return {\n description,\n passed: false,\n error: e.message || String(e),\n isSignatureTest: true,\n }\n }\n}\n",
11
+ "/**\n * TJS Inline Tests\n *\n * Extracts test blocks from TJS source and generates test runners.\n *\n * Syntax (TJS):\n * test 'description' {\n * assert(condition)\n * expect(a).toBe(b)\n * }\n *\n * test {\n * // Anonymous test\n * }\n *\n * mock {\n * // Setup code that runs before each test\n * }\n *\n * Syntax (TypeScript - embedded in comments):\n * /*test 'description' {\n * expect(add(2, 3)).toBe(5)\n * }* /\n *\n * This syntax survives TypeScript compilation, enabling literate\n * programming for TypeScript: tests live alongside the code they\n * verify, extracted and executed at runtime by TJS.\n *\n * For TS developers who don't care about TJS: you still get inline\n * tests that live with your code, literate development, and faster\n * debug loops. Set `safety none` and keep living in your world.\n *\n * Output:\n * - code: Clean source with tests stripped\n * - tests: Array of extracted test definitions\n * - testRunner: Generated code to execute tests\n */\n\n// Note: parser could be used for more robust test extraction in future\n\nexport interface ExtractedTest {\n description: string\n body: string\n line?: number\n}\n\nexport interface ExtractedMock {\n body: string\n line?: number\n}\n\nexport interface TestExtractionResult {\n /** Source code with tests and mocks removed */\n code: string\n /** Extracted test definitions */\n tests: ExtractedTest[]\n /** Extracted mock/setup blocks */\n mocks: ExtractedMock[]\n /** Generated test runner code */\n testRunner: string\n}\n\n/**\n * Check if a position in source is inside a comment\n */\nfunction isInsideComment(source: string, pos: number): boolean {\n // Check for line comment - scan backwards to start of line\n let lineStart = pos\n while (lineStart > 0 && source[lineStart - 1] !== '\\n') {\n lineStart--\n }\n const lineBeforePos = source.slice(lineStart, pos)\n if (lineBeforePos.includes('//')) {\n return true\n }\n\n // Check for block comment - find last /* and */ before pos\n let i = 0\n let inBlockComment = false\n while (i < pos) {\n if (!inBlockComment && source.slice(i, i + 2) === '/*') {\n inBlockComment = true\n i += 2\n } else if (inBlockComment && source.slice(i, i + 2) === '*/') {\n inBlockComment = false\n i += 2\n } else {\n i++\n }\n }\n return inBlockComment\n}\n\n/**\n * Extract embedded tests from block comments\n *\n * Syntax:\n * /*test 'description' {\n * assert(condition)\n * }* /\n *\n * This allows tests to be embedded in TypeScript files that would\n * otherwise strip out `test {}` blocks during TS compilation.\n */\nfunction extractEmbeddedTests(source: string): ExtractedTest[] {\n const tests: ExtractedTest[] = []\n\n // Match: /*test 'description' { ... }*/ or /*test { ... }*/\n const embeddedRegex =\n /\\/\\*test\\s+(['\"`])([^'\"`]*)\\1\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\/|\\/\\*test\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\//g\n\n let match\n while ((match = embeddedRegex.exec(source)) !== null) {\n // Group 2 = description for quoted, group 3 = body for quoted\n // Group 4 = body for anonymous\n const desc = match[2] || `embedded test ${tests.length + 1}`\n const body = (match[3] || match[4] || '').trim()\n\n tests.push({\n description: desc,\n body,\n line: getLineNumber(source, match.index),\n })\n }\n\n return tests\n}\n\n/**\n * Extract inline tests from TJS source\n *\n * Note: Signature tests (from -> return types) are handled separately by the\n * transpiler in js.ts. This function only extracts explicit test blocks.\n */\nexport function extractTests(source: string): TestExtractionResult {\n const tests: ExtractedTest[] = []\n const mocks: ExtractedMock[] = []\n\n // First, extract embedded tests from block comments (for TS compatibility)\n // These use syntax: /*test 'description' { ... }*/\n const embeddedTests = extractEmbeddedTests(source)\n tests.push(...embeddedTests)\n\n // Regex to match test blocks - three syntaxes supported:\n // test { ... } (anonymous test)\n // test 'description' { ... } (canonical TJS)\n // test('description') { ... } (also valid - parenthesized string is still a string)\n const testRegex =\n /test\\s+(['\"`])([^'\"`]*)\\1\\s*\\{|test\\s*\\(\\s*(['\"`])([^'\"`]*)\\3\\s*\\)\\s*\\{|test\\s*\\{/g\n const mockRegex = /mock\\s*\\{/g\n\n let cleanCode = source\n let match\n\n // Extract test blocks\n // We need to find matching braces for each test\n const testMatches: Array<{ start: number; end: number; desc: string }> = []\n\n while ((match = testRegex.exec(source)) !== null) {\n const start = match.index\n\n // Skip matches inside comments (but embedded tests were already extracted above)\n if (isInsideComment(source, start)) {\n continue\n }\n\n // Description is in group 2 for `test 'desc'`, group 4 for `test('desc')`, or undefined for `test {`\n const desc = match[2] || match[4] || `test ${tests.length + 1}`\n const bodyStart = match.index + match[0].length\n\n // Find matching closing brace\n const end = findMatchingBrace(source, bodyStart - 1)\n if (end === -1) continue\n\n const body = source.slice(bodyStart, end).trim()\n\n tests.push({\n description: desc,\n body,\n line: getLineNumber(source, start),\n })\n\n testMatches.push({ start, end: end + 1, desc })\n }\n\n // Extract mock blocks\n const mockMatches: Array<{ start: number; end: number }> = []\n\n while ((match = mockRegex.exec(source)) !== null) {\n const start = match.index\n const bodyStart = match.index + match[0].length\n\n const end = findMatchingBrace(source, bodyStart - 1)\n if (end === -1) continue\n\n const body = source.slice(bodyStart, end).trim()\n\n mocks.push({\n body,\n line: getLineNumber(source, start),\n })\n\n mockMatches.push({ start, end: end + 1 })\n }\n\n // Remove test and mock blocks from source (in reverse order to preserve indices)\n const allMatches = [...testMatches, ...mockMatches].sort(\n (a, b) => b.start - a.start\n )\n\n for (const m of allMatches) {\n cleanCode = cleanCode.slice(0, m.start) + cleanCode.slice(m.end)\n }\n\n // Clean up extra whitespace\n cleanCode = cleanCode.replace(/\\n\\s*\\n\\s*\\n/g, '\\n\\n').trim()\n\n // Generate test runner\n const testRunner = generateTestRunner(tests, mocks)\n\n return {\n code: cleanCode,\n tests,\n mocks,\n testRunner,\n }\n}\n\n/**\n * Find the matching closing brace\n */\nfunction findMatchingBrace(source: string, start: number): number {\n let depth = 0\n let inString: string | null = null\n let escaped = false\n\n for (let i = start; i < source.length; i++) {\n const char = source[i]\n\n if (escaped) {\n escaped = false\n continue\n }\n\n if (char === '\\\\') {\n escaped = true\n continue\n }\n\n // Track string state\n if (!inString && (char === '\"' || char === \"'\" || char === '`')) {\n inString = char\n continue\n }\n if (inString === char) {\n inString = null\n continue\n }\n if (inString) continue\n\n // Track braces\n if (char === '{') depth++\n if (char === '}') {\n depth--\n if (depth === 0) return i\n }\n }\n\n return -1\n}\n\n/**\n * Get line number for a position in source\n */\nfunction getLineNumber(source: string, pos: number): number {\n return source.slice(0, pos).split('\\n').length\n}\n\n/**\n * Generate test runner code\n */\nfunction generateTestRunner(\n tests: ExtractedTest[],\n mocks: ExtractedMock[]\n): string {\n if (tests.length === 0) {\n return '// No tests defined'\n }\n\n const mockSetup = mocks.map((m) => m.body).join('\\n')\n\n const testCases = tests\n .map(\n (t, i) => `\n // Test ${i + 1}: ${t.description}\n try {\n ${mockSetup}\n await (async () => {\n ${t.body}\n })()\n __results.push({ description: ${JSON.stringify(\n t.description\n )}, passed: true })\n } catch (__e) {\n __results.push({ description: ${JSON.stringify(\n t.description\n )}, passed: false, error: __e.message })\n }`\n )\n .join('\\n')\n\n // Note: No comment before IIFE - ASI would break `return (async...)` if comment is between\n return `(async () => {\nconst __results = []\n\n${testCases}\n\n// Report results\nconst __passed = __results.filter(r => r.passed).length\nconst __failed = __results.filter(r => !r.passed).length\nconsole.log(\\`Tests: \\${__passed} passed, \\${__failed} failed\\`)\n__results.filter(r => !r.passed).forEach(r => {\n console.log(\\` ✗ \\${r.description}: \\${r.error}\\`)\n})\n\n// Return summary\nreturn { passed: __passed, failed: __failed, results: __results }\n})()`.trim()\n}\n\n/**\n * Test utilities - assert and expect\n * Include this in the runtime or inject it\n */\nexport const assertFunction = `\nfunction assert(condition, message) {\n if (!condition) {\n throw new Error(message || 'Assertion failed')\n }\n}\n`\n\n/**\n * Expect API for richer test assertions\n * Uses deep equality, handles null/undefined correctly\n */\nexport const expectFunction = `\nfunction expect(actual) {\n const deepEqual = (a, b) => {\n if (a === b) return true\n if (a === null || b === null) return a === b\n if (a === undefined || b === undefined) return a === undefined && b === undefined\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return a === b\n if (Array.isArray(a) !== Array.isArray(b)) return false\n if (Array.isArray(a)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => deepEqual(v, b[i]))\n }\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n return keysA.every(k => deepEqual(a[k], b[k]))\n }\n\n const format = (v) => {\n if (v === null) return 'null'\n if (v === undefined) return 'undefined'\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'object') return JSON.stringify(v)\n return String(v)\n }\n\n return {\n toBe(expected) {\n if (!deepEqual(actual, expected)) {\n throw new Error(\\`Expected \\${format(expected)} but got \\${format(actual)}\\`)\n }\n },\n toEqual(expected) {\n if (!deepEqual(actual, expected)) {\n throw new Error(\\`Expected \\${format(expected)} but got \\${format(actual)}\\`)\n }\n },\n toContain(item) {\n if (!Array.isArray(actual) || !actual.some(v => deepEqual(v, item))) {\n throw new Error(\\`Expected \\${format(actual)} to contain \\${format(item)}\\`)\n }\n },\n toThrow(message) {\n let threw = false\n let thrownMessage = ''\n try {\n if (typeof actual === 'function') actual()\n } catch (e) {\n threw = true\n thrownMessage = e.message || String(e)\n }\n if (!threw) {\n throw new Error('Expected function to throw but it did not')\n }\n if (message && !thrownMessage.includes(message)) {\n throw new Error(\\`Expected error containing \"\\${message}\" but got \"\\${thrownMessage}\"\\`)\n }\n },\n toBeTruthy() {\n if (!actual) {\n throw new Error(\\`Expected \\${format(actual)} to be truthy\\`)\n }\n },\n toBeFalsy() {\n if (actual) {\n throw new Error(\\`Expected \\${format(actual)} to be falsy\\`)\n }\n },\n toBeNull() {\n if (actual !== null) {\n throw new Error(\\`Expected null but got \\${format(actual)}\\`)\n }\n },\n toBeUndefined() {\n if (actual !== undefined) {\n throw new Error(\\`Expected undefined but got \\${format(actual)}\\`)\n }\n },\n toBeGreaterThan(n) {\n if (!(actual > n)) {\n throw new Error(\\`Expected \\${format(actual)} to be greater than \\${n}\\`)\n }\n },\n toBeLessThan(n) {\n if (!(actual < n)) {\n throw new Error(\\`Expected \\${format(actual)} to be less than \\${n}\\`)\n }\n }\n }\n}\n`\n\n/**\n * Combined test utilities (assert + expect)\n */\nexport const testUtils = assertFunction + '\\n' + expectFunction\n\n/**\n * Questions/Notes:\n *\n * Q1: Should mocks be scoped per-test or shared?\n * Current: Each test runs all mocks before executing\n *\n * Q2: Should we support test.only / test.skip?\n * Easy to add with syntax: test.only('...') { } or test.skip('...') { }\n *\n * Q3: Integration with playground?\n * Playground could run extractTests() and show test results in a panel\n *\n * Q4: DOM tests - test.browser('desc') { }?\n * SHELVED: Plan is to run tests in actual browser (playground)\n * Happy-DOM is ~1MB packed, too heavy to bundle\n * If needed later: lazy-load happy-dom only for Node/Bun DOM tests\n */\n",
12
+ "/**\n * TypeScript to TJS Transpiler\n *\n * Converts TypeScript source to TJS (or directly to JS + metadata).\n *\n * Two modes:\n * 1. TS → TJS (for inspection/migration)\n * 2. TS → JS + __tjs metadata (for production)\n *\n * @example\n * ```typescript\n * // Input TypeScript:\n * function greet(name: string, age?: number): string {\n * return `Hello, ${name}!`\n * }\n *\n * // Output TJS:\n * function greet(name: '', age = 0) -> '' {\n * return `Hello, ${name}!`\n * }\n *\n * // Output JS + metadata:\n * function greet(name, age) {\n * return `Hello, ${name}!`\n * }\n * greet.__tjs = {\n * params: { name: { type: 'string', required: true }, age: { type: 'number', required: false } },\n * returns: { type: 'string' }\n * }\n * ```\n */\n\nimport ts from 'typescript'\nimport { emitClassWrapper } from '../runtime'\n\nexport interface FromTSOptions {\n /** Emit TJS intermediate instead of JS + metadata */\n emitTJS?: boolean\n /** Include sourcemap */\n sourceMap?: boolean\n /** Filename for error messages */\n filename?: string\n}\n\nexport interface FromTSResult {\n /** The transpiled code (TJS or JS depending on options) */\n code: string\n /** Function type metadata (only when emitting JS) */\n types?: Record<string, FunctionTypeInfo>\n /** Class type metadata (only when emitting JS) */\n classes?: Record<string, ClassTypeInfo>\n /** Any warnings during transpilation */\n warnings?: string[]\n}\n\nexport interface TypeParamInfo {\n /** Constraint schema (from `extends`) - example-based */\n constraint?: string | Record<string, any>\n /** Default schema (from `= Type`) - example-based */\n default?: string | Record<string, any>\n}\n\nexport interface FunctionTypeInfo {\n name: string\n params: Record<string, ParamTypeInfo>\n returns?: TypeInfo\n description?: string\n /** Generic type parameters with constraints/defaults */\n typeParams?: Record<string, TypeParamInfo>\n}\n\nexport interface ClassTypeInfo {\n name: string\n /** Constructor parameters - also serves as the type shape */\n constructor?: {\n params: Record<string, ParamTypeInfo>\n }\n /** Instance methods */\n methods: Record<string, FunctionTypeInfo>\n /** Static methods */\n staticMethods: Record<string, FunctionTypeInfo>\n /** Generic type parameters */\n typeParams?: Record<string, TypeParamInfo>\n}\n\nexport interface ParamTypeInfo {\n type: TypeInfo\n required: boolean\n default?: any\n description?: string\n}\n\nexport interface TypeInfo {\n kind:\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'undefined'\n | 'array'\n | 'tuple'\n | 'object'\n | 'union'\n | 'any'\n items?: TypeInfo\n /** For tuples: element types in order */\n elements?: TypeInfo[]\n shape?: Record<string, TypeInfo>\n members?: TypeInfo[]\n nullable?: boolean\n}\n\n/** Context for type resolution */\ninterface TypeResolutionContext {\n typeAliases?: Map<string, ts.TypeNode>\n interfaces?: Map<string, ts.InterfaceDeclaration>\n sourceFile?: ts.SourceFile\n warnings?: string[]\n /** Track visited types to prevent infinite recursion */\n visited?: Set<string>\n}\n\n/**\n * Convert a TypeScript type node to a TJS example value string\n *\n * @param warnings - Optional array to collect warnings about generic types\n */\nfunction typeToExample(\n type: ts.TypeNode | undefined,\n checker?: ts.TypeChecker,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): string {\n if (!type) return 'undefined'\n\n switch (type.kind) {\n case ts.SyntaxKind.StringKeyword:\n return \"''\"\n case ts.SyntaxKind.NumberKeyword:\n return '0'\n case ts.SyntaxKind.BooleanKeyword:\n return 'true'\n case ts.SyntaxKind.NullKeyword:\n return 'null'\n case ts.SyntaxKind.UndefinedKeyword:\n return 'undefined'\n case ts.SyntaxKind.VoidKeyword:\n return 'undefined'\n case ts.SyntaxKind.AnyKeyword:\n // For function params we use 'any', for object props we use 'null'\n return 'any'\n case ts.SyntaxKind.UnknownKeyword:\n return 'any'\n case ts.SyntaxKind.NeverKeyword:\n return 'null'\n\n case ts.SyntaxKind.ArrayType: {\n const arrayType = type as ts.ArrayTypeNode\n let itemExample = typeToExample(arrayType.elementType, checker)\n // 'any' is not a valid literal value - use null for array items\n if (itemExample === 'any') itemExample = 'null'\n return `[${itemExample}]`\n }\n\n case ts.SyntaxKind.TypeReference: {\n const typeRef = type as ts.TypeReferenceNode\n const typeName = typeRef.typeName.getText()\n\n // Handle common generic types\n if (typeName === 'Array' && typeRef.typeArguments?.length) {\n const itemExample = typeToExample(\n typeRef.typeArguments[0],\n checker,\n warnings,\n ctx\n )\n return `[${itemExample}]`\n }\n if (typeName === 'Promise') {\n // Unwrap Promise type\n if (typeRef.typeArguments?.length) {\n return typeToExample(typeRef.typeArguments[0], checker, warnings, ctx)\n }\n return 'undefined'\n }\n if (typeName === 'Record') {\n return '{}'\n }\n if (typeName === 'Map') {\n return 'new Map()'\n }\n if (typeName === 'Set') {\n return 'new Set()'\n }\n\n // Resolve type aliases\n if (ctx?.typeAliases?.has(typeName)) {\n // Prevent infinite recursion\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n warnings?.push(`Circular type reference '${typeName}' - using 'any'`)\n return 'any'\n }\n visited.add(typeName)\n const resolvedType = ctx.typeAliases.get(typeName)!\n return typeToExample(resolvedType, checker, warnings, {\n ...ctx,\n visited,\n })\n }\n\n // Resolve interfaces\n if (ctx?.interfaces?.has(typeName)) {\n // Prevent infinite recursion\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n warnings?.push(`Circular type reference '${typeName}' - using 'any'`)\n return 'any'\n }\n visited.add(typeName)\n const iface = ctx.interfaces.get(typeName)!\n // Build example object from interface members\n const props: string[] = []\n for (const member of iface.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(ctx.sourceFile)\n const propExample = typeToExample(member.type, checker, warnings, {\n ...ctx,\n visited,\n })\n const isOptional = !!member.questionToken\n if (isOptional) {\n props.push(`${propName} = ${propExample}`)\n } else {\n props.push(`${propName}: ${propExample}`)\n }\n }\n }\n return `{ ${props.join(', ')} }`\n }\n\n // Type parameters (generics like T, K, V) - treat as any\n // Single uppercase letter or common generic names\n if (\n /^[A-Z]$/.test(typeName) ||\n ['T', 'K', 'V', 'U', 'TKey', 'TValue', 'TItem', 'TResult'].includes(\n typeName\n )\n ) {\n warnings?.push(\n `Generic type parameter '${typeName}' converted to 'any' - consider specializing`\n )\n return 'any'\n }\n // Unknown type reference - treat as any\n warnings?.push(\n `Unknown type '${typeName}' converted to 'any' - may need manual review`\n )\n return 'any'\n }\n\n case ts.SyntaxKind.TypeLiteral: {\n const typeLiteral = type as ts.TypeLiteralNode\n const props: string[] = []\n for (const member of typeLiteral.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText()\n let propType = typeToExample(member.type, checker)\n // 'any' is not a valid literal value - use null for object properties\n if (propType === 'any') propType = 'null'\n // In object literals, always use : syntax (= is for function params only)\n props.push(`${propName}: ${propType}`)\n }\n }\n return `{ ${props.join(', ')} }`\n }\n\n case ts.SyntaxKind.UnionType: {\n const unionType = type as ts.UnionTypeNode\n\n // Helper to check if a type is null or undefined\n const isNullType = (t: ts.TypeNode) =>\n t.kind === ts.SyntaxKind.NullKeyword ||\n (ts.isLiteralTypeNode(t) &&\n t.literal.kind === ts.SyntaxKind.NullKeyword)\n const isUndefinedType = (t: ts.TypeNode) =>\n t.kind === ts.SyntaxKind.UndefinedKeyword ||\n (ts.isLiteralTypeNode(t) &&\n t.literal.kind === ts.SyntaxKind.UndefinedKeyword)\n\n // Check for nullable: T | null or T | undefined\n const nonNullTypes = unionType.types.filter(\n (t) => !isNullType(t) && !isUndefinedType(t)\n )\n const hasNull = unionType.types.some(isNullType)\n const hasUndefined = unionType.types.some(isUndefinedType)\n\n if (nonNullTypes.length === 1 && (hasNull || hasUndefined)) {\n // Nullable type: T | null -> T || null\n const baseExample = typeToExample(nonNullTypes[0], checker)\n if (hasNull) return `${baseExample} || null`\n if (hasUndefined) return `${baseExample} || undefined`\n }\n\n // General union: use first type as example\n if (unionType.types.length > 0) {\n return typeToExample(unionType.types[0], checker)\n }\n return 'undefined'\n }\n\n case ts.SyntaxKind.LiteralType: {\n const literalType = type as ts.LiteralTypeNode\n if (ts.isStringLiteral(literalType.literal)) {\n return `'${literalType.literal.text}'`\n }\n if (ts.isNumericLiteral(literalType.literal)) {\n return literalType.literal.text\n }\n if (literalType.literal.kind === ts.SyntaxKind.TrueKeyword) {\n return 'true'\n }\n if (literalType.literal.kind === ts.SyntaxKind.FalseKeyword) {\n return 'false'\n }\n if (literalType.literal.kind === ts.SyntaxKind.NullKeyword) {\n return 'null'\n }\n return 'undefined'\n }\n\n case ts.SyntaxKind.ParenthesizedType: {\n const parenType = type as ts.ParenthesizedTypeNode\n return typeToExample(parenType.type, checker)\n }\n\n case ts.SyntaxKind.FunctionType:\n // Functions become undefined (can't really express as example)\n return 'undefined'\n\n case ts.SyntaxKind.TupleType: {\n const tupleType = type as ts.TupleTypeNode\n const elements = tupleType.elements.map((e) => {\n if (ts.isNamedTupleMember(e)) {\n return typeToExample(e.type, checker)\n }\n return typeToExample(e as ts.TypeNode, checker)\n })\n return `[${elements.join(', ')}]`\n }\n\n default:\n return 'undefined'\n }\n}\n\n/**\n * Convert TypeScript type to TypeInfo for metadata\n */\nfunction typeToInfo(\n type: ts.TypeNode | undefined,\n ctx?: TypeResolutionContext\n): TypeInfo {\n if (!type) return { kind: 'any' }\n\n switch (type.kind) {\n case ts.SyntaxKind.StringKeyword:\n return { kind: 'string' }\n case ts.SyntaxKind.NumberKeyword:\n return { kind: 'number' }\n case ts.SyntaxKind.BooleanKeyword:\n return { kind: 'boolean' }\n case ts.SyntaxKind.NullKeyword:\n return { kind: 'null' }\n case ts.SyntaxKind.UndefinedKeyword:\n case ts.SyntaxKind.VoidKeyword:\n return { kind: 'undefined' }\n\n case ts.SyntaxKind.ArrayType: {\n const arrayType = type as ts.ArrayTypeNode\n return { kind: 'array', items: typeToInfo(arrayType.elementType, ctx) }\n }\n\n case ts.SyntaxKind.TypeLiteral: {\n const typeLiteral = type as ts.TypeLiteralNode\n const shape: Record<string, TypeInfo> = {}\n for (const member of typeLiteral.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText()\n shape[propName] = typeToInfo(member.type, ctx)\n }\n }\n return { kind: 'object', shape }\n }\n\n case ts.SyntaxKind.UnionType: {\n const unionType = type as ts.UnionTypeNode\n const nonNullTypes = unionType.types.filter(\n (t) =>\n t.kind !== ts.SyntaxKind.NullKeyword &&\n t.kind !== ts.SyntaxKind.UndefinedKeyword\n )\n const hasNull = unionType.types.some(\n (t) => t.kind === ts.SyntaxKind.NullKeyword\n )\n\n if (nonNullTypes.length === 1 && hasNull) {\n return { ...typeToInfo(nonNullTypes[0], ctx), nullable: true }\n }\n\n return {\n kind: 'union',\n members: unionType.types.map((t) => typeToInfo(t, ctx)),\n }\n }\n\n case ts.SyntaxKind.IntersectionType: {\n const intersectionType = type as ts.IntersectionTypeNode\n // Flatten intersection into merged object shape\n const mergedShape: Record<string, TypeInfo> = {}\n for (const member of intersectionType.types) {\n const memberInfo = typeToInfo(member, ctx)\n if (memberInfo.kind === 'object' && memberInfo.shape) {\n Object.assign(mergedShape, memberInfo.shape)\n }\n }\n if (Object.keys(mergedShape).length > 0) {\n return { kind: 'object', shape: mergedShape }\n }\n // If no object shapes found, treat as any\n return { kind: 'any' }\n }\n\n case ts.SyntaxKind.TupleType: {\n const tupleType = type as ts.TupleTypeNode\n const elements: TypeInfo[] = []\n for (const element of tupleType.elements) {\n // Handle named tuple members: [x: number, y: string]\n if (ts.isNamedTupleMember(element)) {\n elements.push(typeToInfo(element.type, ctx))\n } else {\n elements.push(typeToInfo(element as ts.TypeNode, ctx))\n }\n }\n return { kind: 'tuple', elements }\n }\n\n case ts.SyntaxKind.TypeReference: {\n const typeRef = type as ts.TypeReferenceNode\n const typeName = typeRef.typeName.getText()\n if (typeName === 'Array' && typeRef.typeArguments?.length) {\n return {\n kind: 'array',\n items: typeToInfo(typeRef.typeArguments[0], ctx),\n }\n }\n if (typeName === 'Promise' && typeRef.typeArguments?.length) {\n return typeToInfo(typeRef.typeArguments[0], ctx)\n }\n\n // Handle utility types\n if (typeRef.typeArguments?.length) {\n const innerType = typeToInfo(typeRef.typeArguments[0], ctx)\n\n // Partial<T> - all properties become optional (we just return the shape)\n if (typeName === 'Partial') {\n return innerType\n }\n\n // Required<T> - all properties become required (we just return the shape)\n if (typeName === 'Required') {\n return innerType\n }\n\n // Readonly<T> - same shape, readonly is a compile-time concept\n if (typeName === 'Readonly') {\n return innerType\n }\n\n // Record<K, V> - object with string keys and V values\n if (typeName === 'Record' && typeRef.typeArguments.length >= 2) {\n const valueType = typeToInfo(typeRef.typeArguments[1], ctx)\n // Record is essentially an object with dynamic keys\n return { kind: 'object', shape: { '[key]': valueType } }\n }\n\n // Pick<T, K> and Omit<T, K> - just return the base type for now\n // Full implementation would need to filter properties\n if (typeName === 'Pick' || typeName === 'Omit') {\n return innerType\n }\n\n // NonNullable<T> - remove null/undefined\n if (typeName === 'NonNullable') {\n if (innerType.nullable) {\n return { ...innerType, nullable: false }\n }\n return innerType\n }\n\n // ReturnType<T>, Parameters<T>, etc. - complex, return any\n if (\n ['ReturnType', 'Parameters', 'ConstructorParameters'].includes(\n typeName\n )\n ) {\n return { kind: 'any' }\n }\n }\n\n // Resolve type aliases\n if (ctx?.typeAliases?.has(typeName)) {\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n return { kind: 'any' } // Circular reference\n }\n visited.add(typeName)\n const resolvedType = ctx.typeAliases.get(typeName)!\n return typeToInfo(resolvedType, { ...ctx, visited })\n }\n\n // Resolve interfaces\n if (ctx?.interfaces?.has(typeName)) {\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n return { kind: 'any' } // Circular reference\n }\n visited.add(typeName)\n const iface = ctx.interfaces.get(typeName)!\n const shape: Record<string, TypeInfo> = {}\n\n // Handle extends clauses - merge in base interface properties\n if (iface.heritageClauses) {\n for (const clause of iface.heritageClauses) {\n if (clause.token === ts.SyntaxKind.ExtendsKeyword) {\n for (const baseType of clause.types) {\n const baseName = baseType.expression.getText(ctx.sourceFile)\n // Look up the base interface and recursively resolve it\n if (ctx.interfaces?.has(baseName) && !visited.has(baseName)) {\n // Create a synthetic type reference node to look up the base\n const syntheticRef = {\n kind: ts.SyntaxKind.TypeReference,\n typeName: { getText: () => baseName },\n } as unknown as ts.TypeReferenceNode\n const baseInfo = typeToInfo(syntheticRef, { ...ctx, visited })\n if (baseInfo.kind === 'object' && baseInfo.shape) {\n Object.assign(shape, baseInfo.shape)\n }\n }\n }\n }\n }\n }\n\n // Add own members (may override base)\n for (const member of iface.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(ctx.sourceFile)\n shape[propName] = typeToInfo(member.type, { ...ctx, visited })\n }\n }\n return { kind: 'object', shape }\n }\n\n // Generics and unknown types become 'any'\n return { kind: 'any' }\n }\n\n default:\n return { kind: 'any' }\n }\n}\n\n/**\n * Extract type parameter info (generics) from a function\n */\nfunction extractTypeParams(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n warnings?: string[]\n): Record<string, TypeParamInfo> | undefined {\n if (!node.typeParameters || node.typeParameters.length === 0) {\n return undefined\n }\n\n const typeParams: Record<string, TypeParamInfo> = {}\n\n for (const param of node.typeParameters) {\n const name = param.name.getText()\n const info: TypeParamInfo = {}\n\n // Extract constraint: T extends Foo\n if (param.constraint) {\n const constraintExample = typeToExample(\n param.constraint,\n undefined,\n warnings\n )\n // Try to parse as object/value for richer schema\n if (constraintExample.startsWith('{')) {\n try {\n // This is a rough parse - in production we'd use proper AST\n info.constraint = constraintExample\n } catch {\n info.constraint = constraintExample\n }\n } else {\n info.constraint = constraintExample\n }\n }\n\n // Extract default: T = Foo\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n info.default = defaultExample\n }\n\n typeParams[name] = info\n }\n\n return Object.keys(typeParams).length > 0 ? typeParams : undefined\n}\n\n/**\n * Transform a TypeScript function to TJS syntax\n */\n/**\n * Transform a TypeScript interface to TJS Type declaration\n *\n * interface User { name: string; age: number }\n * ->\n * Type User { example: { name: '', age: 0 } }\n */\nfunction transformInterfaceToType(\n node: ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string | null {\n const typeName = node.name.getText(sourceFile)\n\n // Check for generics\n if (node.typeParameters && node.typeParameters.length > 0) {\n return transformGenericInterfaceToGeneric(node, sourceFile, warnings)\n }\n\n // Build example object from members\n const props: string[] = []\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n let propExample = typeToExample(member.type, undefined, warnings)\n // 'any' is not a valid literal value - use null for object properties\n if (propExample === 'any') propExample = 'null'\n props.push(`${propName}: ${propExample}`)\n }\n }\n\n if (props.length === 0) {\n return `Type ${typeName} {}`\n }\n\n return `Type ${typeName} {\n example: { ${props.join(', ')} }\n}`\n}\n\n/**\n * Transform a generic TypeScript interface to TJS Generic declaration\n *\n * interface Box<T> { value: T }\n * ->\n * Generic Box<T> {\n * description: 'Box'\n * predicate(x, T) { return typeof x === 'object' && x !== null && 'value' in x && T(x.value) }\n * }\n */\nfunction transformGenericInterfaceToGeneric(\n node: ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string {\n const typeName = node.name.getText(sourceFile)\n const typeParams: string[] = []\n\n // Extract type parameters with constraints/defaults\n for (const param of node.typeParameters || []) {\n const paramName = param.name.getText(sourceFile)\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n typeParams.push(`${paramName} = ${defaultExample}`)\n } else {\n typeParams.push(paramName)\n }\n }\n\n // Build predicate checks for each property that uses a type parameter\n const typeParamNames = (node.typeParameters || []).map((p) =>\n p.name.getText(sourceFile)\n )\n const checks: string[] = [\"typeof x === 'object'\", 'x !== null']\n\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n checks.push(`'${propName}' in x`)\n\n // If property type is a type parameter, add check\n if (member.type && ts.isTypeReferenceNode(member.type)) {\n const refName = member.type.typeName.getText(sourceFile)\n if (typeParamNames.includes(refName)) {\n checks.push(`${refName}(x.${propName})`)\n }\n }\n }\n }\n\n const predicateParams = ['x', ...typeParamNames].join(', ')\n\n return `Generic ${typeName}<${typeParams.join(', ')}> {\n description: '${typeName}'\n predicate(${predicateParams}) { return ${checks.join(' && ')} }\n}`\n}\n\n/**\n * Check if a TypeScript union type is a literal union (e.g., 'up' | 'down' | 'left')\n * Returns the literal values if it is, null otherwise\n */\nfunction extractLiteralUnionValues(\n type: ts.TypeNode,\n _sourceFile: ts.SourceFile\n): string[] | null {\n if (!ts.isUnionTypeNode(type)) return null\n\n const values: string[] = []\n for (const member of type.types) {\n if (ts.isLiteralTypeNode(member)) {\n if (ts.isStringLiteral(member.literal)) {\n values.push(`'${member.literal.text}'`)\n } else if (ts.isNumericLiteral(member.literal)) {\n values.push(member.literal.text)\n } else if (member.literal.kind === ts.SyntaxKind.TrueKeyword) {\n values.push('true')\n } else if (member.literal.kind === ts.SyntaxKind.FalseKeyword) {\n values.push('false')\n } else if (member.literal.kind === ts.SyntaxKind.NullKeyword) {\n values.push('null')\n } else {\n // Not a literal we can handle\n return null\n }\n } else if (member.kind === ts.SyntaxKind.NullKeyword) {\n values.push('null')\n } else if (member.kind === ts.SyntaxKind.UndefinedKeyword) {\n values.push('undefined')\n } else {\n // Not a literal union (has complex types)\n return null\n }\n }\n\n return values.length > 0 ? values : null\n}\n\n/**\n * Transform a TypeScript enum to TJS Enum declaration\n *\n * enum Status { Pending, Active, Done }\n * ->\n * Enum Status 'Status' {\n * Pending\n * Active\n * Done\n * }\n *\n * enum Color { Red = 'red', Green = 'green', Blue = 'blue' }\n * ->\n * Enum Color 'Color' {\n * Red = 'red'\n * Green = 'green'\n * Blue = 'blue'\n * }\n */\nfunction transformEnumToTJS(\n node: ts.EnumDeclaration,\n sourceFile: ts.SourceFile,\n _warnings?: string[]\n): string | null {\n const enumName = node.name.getText(sourceFile)\n const members: string[] = []\n\n let nextValue = 0\n for (const member of node.members) {\n const memberName = member.name.getText(sourceFile)\n\n if (member.initializer) {\n // Has explicit value\n if (ts.isStringLiteral(member.initializer)) {\n members.push(` ${memberName} = '${member.initializer.text}'`)\n } else if (ts.isNumericLiteral(member.initializer)) {\n const numValue = parseInt(member.initializer.text, 10)\n members.push(` ${memberName} = ${numValue}`)\n nextValue = numValue + 1\n } else if (\n ts.isPrefixUnaryExpression(member.initializer) &&\n member.initializer.operator === ts.SyntaxKind.MinusToken\n ) {\n // Negative number\n const operand = member.initializer.operand\n if (ts.isNumericLiteral(operand)) {\n const numValue = -parseInt(operand.text, 10)\n members.push(` ${memberName} = ${numValue}`)\n nextValue = numValue + 1\n }\n } else {\n // Expression or other complex initializer - use the text directly\n members.push(\n ` ${memberName} = ${member.initializer.getText(sourceFile)}`\n )\n }\n } else {\n // Auto-increment numeric value\n members.push(` ${memberName} = ${nextValue}`)\n nextValue++\n }\n }\n\n return `Enum ${enumName} '${enumName}' {\n${members.join('\\n')}\n}`\n}\n\n/**\n * Transform a TypeScript type alias to TJS Type declaration\n *\n * type User = { name: string; age: number }\n * ->\n * Type User { example: { name: '', age: 0 } }\n *\n * type Direction = 'up' | 'down' | 'left' | 'right'\n * ->\n * Union Direction 'Direction' 'up' | 'down' | 'left' | 'right'\n */\nfunction transformTypeAliasToType(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string | null {\n const typeName = node.name.getText(sourceFile)\n\n // Check for generics\n if (node.typeParameters && node.typeParameters.length > 0) {\n return transformGenericTypeAliasToGeneric(node, sourceFile, warnings)\n }\n\n // Check for literal union type → emit Union syntax\n const literalValues = extractLiteralUnionValues(node.type, sourceFile)\n if (literalValues) {\n return `Union ${typeName} '${typeName}' ${literalValues.join(' | ')}`\n }\n\n const example = typeToExample(node.type, undefined, warnings)\n\n // For simple primitive types, use short form\n if (\n example === \"''\" ||\n example === '0' ||\n example === 'true' ||\n example === 'null'\n ) {\n return `Type ${typeName} ${example}`\n }\n\n return `Type ${typeName} {\n example: ${example}\n}`\n}\n\n/**\n * Transform a generic type alias to TJS Generic declaration\n */\nfunction transformGenericTypeAliasToGeneric(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string {\n const typeName = node.name.getText(sourceFile)\n const typeParams: string[] = []\n\n // Extract type parameters\n for (const param of node.typeParameters || []) {\n const paramName = param.name.getText(sourceFile)\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n typeParams.push(`${paramName} = ${defaultExample}`)\n } else {\n typeParams.push(paramName)\n }\n }\n\n const typeParamNames = (node.typeParameters || []).map((p) =>\n p.name.getText(sourceFile)\n )\n const predicateParams = ['x', ...typeParamNames].join(', ')\n\n // Simple fallback - more sophisticated analysis could be added\n return `Generic ${typeName}<${typeParams.join(', ')}> {\n description: '${typeName}'\n predicate(${predicateParams}) { return true }\n}`\n}\n\nfunction transformFunctionToTJS(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n sourceFile: ts.SourceFile,\n explicitName?: string,\n warnings?: string[],\n includeLineNumber?: boolean\n): string {\n const params: string[] = []\n\n // Get line number (1-indexed) for source mapping\n const { line } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile)\n )\n const lineComment = includeLineNumber ? `/* line ${line + 1} */\\n` : ''\n\n for (const param of node.parameters) {\n const name = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n const typeExample = typeToExample(param.type, undefined, warnings)\n\n if (param.initializer) {\n // Has default value - use it directly\n const defaultText = param.initializer.getText(sourceFile)\n params.push(`${name} = ${defaultText}`)\n } else if (typeExample === 'any' || typeExample === 'undefined') {\n // any/undefined type - no annotation in TJS (bare name means any)\n params.push(name)\n } else if (isOptional) {\n // Optional without default - use = for optional\n params.push(`${name} = ${typeExample}`)\n } else {\n // Required - use : for required\n params.push(`${name}: ${typeExample}`)\n }\n }\n\n const funcName =\n explicitName ||\n (ts.isFunctionDeclaration(node) && node.name\n ? node.name.getText(sourceFile)\n : '')\n const returnExample = node.type\n ? typeToExample(node.type, undefined, warnings)\n : ''\n // Use -! to skip signature tests - TS types are compile-time only,\n // the example values won't necessarily match runtime behavior\n const returnAnnotation =\n returnExample && returnExample !== 'undefined' && returnExample !== 'any'\n ? ` -! ${returnExample}`\n : ''\n\n // Get function body and strip TypeScript syntax using ts.transpileModule\n let body = ''\n if (node.body) {\n const bodyText = ts.isBlock(node.body)\n ? node.body.getText(sourceFile)\n : `{ return ${node.body.getText(sourceFile)} }`\n\n // Use TypeScript's transpiler to strip all type syntax\n const transpiled = ts.transpileModule(bodyText, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = transpiled.outputText.trim()\n } else {\n body = '{ }'\n }\n\n // Check for async modifier\n const isAsync = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n const asyncPrefix = isAsync ? 'async ' : ''\n\n return `${lineComment}${asyncPrefix}function ${funcName}(${params.join(\n ', '\n )})${returnAnnotation} ${body}`\n}\n\n/**\n * Transform TypeScript class to TJS class\n * Converts TS type annotations to TJS example-based annotations\n */\nfunction transformClassToTJS(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string {\n const className = node.name?.getText(sourceFile) || 'Anonymous'\n const extendsClause = node.heritageClauses\n ?.find((h) => h.token === ts.SyntaxKind.ExtendsKeyword)\n ?.types[0]?.getText(sourceFile)\n\n // First pass: collect private field mappings (TS private -> JS #)\n const privateFieldMap = new Map<string, string>()\n for (const member of node.members) {\n if (ts.isPropertyDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const isPrivate = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.PrivateKeyword\n )\n if (isPrivate && !propName.startsWith('#')) {\n privateFieldMap.set(propName, `#${propName}`)\n }\n }\n }\n\n // Helper to replace private field references in transpiled code\n const replacePrivateRefs = (code: string): string => {\n let result = code\n for (const [tsName, jsName] of privateFieldMap) {\n // Replace this.propName with this.#propName\n result = result.replace(\n new RegExp(`this\\\\.${tsName}\\\\b`, 'g'),\n `this.${jsName}`\n )\n }\n return result\n }\n\n const members: string[] = []\n\n for (const member of node.members) {\n // Constructor\n if (ts.isConstructorDeclaration(member)) {\n const params = transformParams(member.parameters, sourceFile, warnings)\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n members.push(` constructor(${params.join(', ')}) ${body}`)\n }\n\n // Regular methods\n if (ts.isMethodDeclaration(member) && member.name) {\n const methodName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const isAsync = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n\n const params = transformParams(member.parameters, sourceFile, warnings)\n const returnExample = member.type\n ? typeToExample(member.type, undefined, warnings)\n : ''\n // Use -! to skip signature tests for TS-transpiled code\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any'\n ? ` -! ${returnExample}`\n : ''\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n const staticPrefix = isStatic ? 'static ' : ''\n const asyncPrefix = isAsync ? 'async ' : ''\n members.push(\n ` ${staticPrefix}${asyncPrefix}${methodName}(${params.join(\n ', '\n )})${returnAnnotation} ${body}`\n )\n }\n\n // Getters\n if (ts.isGetAccessorDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const returnExample = member.type\n ? typeToExample(member.type, undefined, warnings)\n : ''\n // Use -! to skip signature tests for TS-transpiled code\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any'\n ? ` -! ${returnExample}`\n : ''\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n members.push(` get ${propName}()${returnAnnotation} ${body}`)\n }\n\n // Setters\n if (ts.isSetAccessorDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const params = transformParams(member.parameters, sourceFile, warnings)\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n members.push(` set ${propName}(${params.join(', ')}) ${body}`)\n }\n\n // Properties with initializers (private fields, regular properties)\n if (ts.isPropertyDeclaration(member) && member.name) {\n const origName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const staticPrefix = isStatic ? 'static ' : ''\n\n // Use mapped name (# for private) or original\n const propName = privateFieldMap.get(origName) || origName\n\n if (member.initializer) {\n const transpiled = ts.transpileModule(\n member.initializer.getText(sourceFile),\n {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n }\n )\n members.push(\n ` ${staticPrefix}${propName} = ${transpiled.outputText.trim()}`\n )\n } else {\n // Property without initializer - just declare it\n members.push(` ${staticPrefix}${propName}`)\n }\n }\n }\n\n const extendsStr = extendsClause ? ` extends ${extendsClause}` : ''\n return `class ${className}${extendsStr} {\\n${members.join('\\n')}\\n}`\n}\n\n/**\n * Helper to transform parameters to TJS format\n */\nfunction transformParams(\n parameters: ts.NodeArray<ts.ParameterDeclaration>,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string[] {\n const params: string[] = []\n\n for (const param of parameters) {\n const name = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n const typeExample = typeToExample(param.type, undefined, warnings)\n\n if (param.initializer) {\n // Has default value - use it directly\n const defaultText = param.initializer.getText(sourceFile)\n params.push(`${name} = ${defaultText}`)\n } else if (typeExample === 'any' || typeExample === 'undefined') {\n // any/undefined type - no annotation in TJS (bare name means any)\n params.push(name)\n } else if (isOptional) {\n // Optional without default - use = for optional\n params.push(`${name} = ${typeExample}`)\n } else {\n // Required - use : for required\n params.push(`${name}: ${typeExample}`)\n }\n }\n\n return params\n}\n\n/**\n * Extract type metadata from a TypeScript function\n */\nfunction extractFunctionMetadata(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): FunctionTypeInfo {\n const name =\n ts.isFunctionDeclaration(node) && node.name\n ? node.name.getText(sourceFile)\n : 'anonymous'\n const params: Record<string, ParamTypeInfo> = {}\n\n for (const param of node.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n // Try to extract literal default value\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, ctx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n\n const result: FunctionTypeInfo = {\n name,\n params,\n returns: node.type ? typeToInfo(node.type, ctx) : undefined,\n }\n\n // Extract generic type parameters\n const typeParams = extractTypeParams(node, warnings)\n if (typeParams) {\n result.typeParams = typeParams\n }\n\n return result\n}\n\n/**\n * Extract type metadata from a TypeScript class\n */\nfunction extractClassMetadata(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): ClassTypeInfo {\n const name = node.name?.getText(sourceFile) || 'anonymous'\n const methods: Record<string, FunctionTypeInfo> = {}\n const staticMethods: Record<string, FunctionTypeInfo> = {}\n let constructorInfo: { params: Record<string, ParamTypeInfo> } | undefined\n\n for (const member of node.members) {\n // Constructor\n if (ts.isConstructorDeclaration(member)) {\n const params: Record<string, ParamTypeInfo> = {}\n for (const param of member.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, ctx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n constructorInfo = { params }\n }\n\n // Methods (instance and static)\n if (ts.isMethodDeclaration(member) && member.name) {\n const methodName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n\n const params: Record<string, ParamTypeInfo> = {}\n for (const param of member.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, ctx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n\n const methodInfo: FunctionTypeInfo = {\n name: methodName,\n params,\n returns: member.type ? typeToInfo(member.type, ctx) : undefined,\n }\n\n if (isStatic) {\n staticMethods[methodName] = methodInfo\n } else {\n methods[methodName] = methodInfo\n }\n }\n }\n\n const result: ClassTypeInfo = {\n name,\n methods,\n staticMethods,\n }\n\n if (constructorInfo) {\n result.constructor = constructorInfo\n }\n\n // Extract class-level generic type parameters\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParams: Record<string, TypeParamInfo> = {}\n for (const param of node.typeParameters) {\n const paramName = param.name.getText(sourceFile)\n const info: TypeParamInfo = {}\n if (param.constraint) {\n info.constraint = typeToExample(\n param.constraint,\n undefined,\n warnings,\n ctx\n )\n }\n if (param.default) {\n info.default = typeToExample(param.default, undefined, warnings, ctx)\n }\n typeParams[paramName] = info\n }\n result.typeParams = typeParams\n }\n\n return result\n}\n\n/**\n * Transpile TypeScript source to TJS or JS + metadata\n */\n/**\n * Extract embedded test comments from source\n * These use syntax: /*test 'description' { ... }* / (without space before /)\n * They survive TS compilation and should be preserved in TJS output\n */\nfunction extractEmbeddedTestComments(source: string): string[] {\n const tests: string[] = []\n // Match: /*test 'description' { ... }*/ or /*test { ... }*/\n const embeddedRegex =\n /\\/\\*test\\s+(['\"`])([^'\"`]*)\\1\\s*\\{[\\s\\S]*?\\}\\s*\\*\\/|\\/\\*test\\s*\\{[\\s\\S]*?\\}\\s*\\*\\//g\n\n let match\n while ((match = embeddedRegex.exec(source)) !== null) {\n tests.push(match[0])\n }\n return tests\n}\n\nexport function fromTS(\n source: string,\n options: FromTSOptions = {}\n): FromTSResult {\n const { emitTJS = false, filename = 'input.ts' } = options\n const warnings: string[] = []\n\n // Extract embedded test comments before TS parsing (they need to be preserved)\n const embeddedTests = extractEmbeddedTestComments(source)\n\n // Parse TypeScript\n const sourceFile = ts.createSourceFile(\n filename,\n source,\n ts.ScriptTarget.Latest,\n true\n )\n\n const tjsFunctions: string[] = []\n const seenTypeNames = new Set<string>() // Track emitted type names to avoid duplicates\n const metadata: Record<string, FunctionTypeInfo> = {}\n const classMetadata: Record<string, ClassTypeInfo> = {}\n\n // Build type alias and interface maps first (first pass)\n const typeAliases = new Map<string, ts.TypeNode>()\n const interfaces = new Map<string, ts.InterfaceDeclaration>()\n\n function collectTypes(node: ts.Node) {\n if (ts.isTypeAliasDeclaration(node)) {\n typeAliases.set(node.name.getText(sourceFile), node.type)\n }\n if (ts.isInterfaceDeclaration(node)) {\n interfaces.set(node.name.getText(sourceFile), node)\n }\n ts.forEachChild(node, collectTypes)\n }\n collectTypes(sourceFile)\n\n // Create resolution context\n const resolutionCtx: TypeResolutionContext = {\n typeAliases,\n interfaces,\n sourceFile,\n warnings,\n }\n\n // Walk top-level statements only (don't recurse into function bodies)\n for (const statement of sourceFile.statements) {\n let handled = false\n\n // Handle: function foo() {}\n if (ts.isFunctionDeclaration(statement) && statement.name) {\n const funcName = statement.name.getText(sourceFile)\n handled = true\n\n if (emitTJS) {\n tjsFunctions.push(\n transformFunctionToTJS(\n statement,\n sourceFile,\n undefined,\n warnings,\n true\n )\n )\n } else {\n metadata[funcName] = extractFunctionMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n }\n }\n\n // Handle: const foo = () => {} or const foo = function() {}\n // Also handle: const x = ..., let x = ..., var x = ... (non-function)\n if (ts.isVariableStatement(statement)) {\n let hasFunctionDecl = false\n\n for (const decl of statement.declarationList.declarations) {\n if (\n ts.isIdentifier(decl.name) &&\n decl.initializer &&\n (ts.isArrowFunction(decl.initializer) ||\n ts.isFunctionExpression(decl.initializer))\n ) {\n hasFunctionDecl = true\n const funcName = decl.name.getText(sourceFile)\n const funcNode = decl.initializer\n\n if (emitTJS) {\n tjsFunctions.push(\n transformFunctionToTJS(\n funcNode,\n sourceFile,\n funcName,\n warnings,\n true\n )\n )\n } else {\n const info = extractFunctionMetadata(\n funcNode,\n sourceFile,\n warnings,\n resolutionCtx\n )\n info.name = funcName\n metadata[funcName] = info\n }\n }\n }\n\n // If this variable statement doesn't contain function declarations,\n // transpile and preserve it (strips type annotations)\n if (!hasFunctionDecl && emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n tjsFunctions.push(transpiled.outputText.trim())\n }\n\n handled = true\n }\n\n // Handle: interface Foo { ... }\n if (ts.isInterfaceDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const typeName = statement.name.getText(sourceFile)\n if (!seenTypeNames.has(typeName)) {\n seenTypeNames.add(typeName)\n const typeDecl = transformInterfaceToType(\n statement,\n sourceFile,\n warnings\n )\n if (typeDecl) {\n tjsFunctions.push(typeDecl)\n }\n }\n }\n }\n\n // Handle: type Foo = { ... }\n if (ts.isTypeAliasDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const typeName = statement.name.getText(sourceFile)\n if (!seenTypeNames.has(typeName)) {\n seenTypeNames.add(typeName)\n const typeDecl = transformTypeAliasToType(\n statement,\n sourceFile,\n warnings\n )\n if (typeDecl) {\n tjsFunctions.push(typeDecl)\n }\n }\n }\n }\n\n // Handle: enum Status { Pending, Active, Done }\n if (ts.isEnumDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const enumName = statement.name.getText(sourceFile)\n if (!seenTypeNames.has(enumName)) {\n seenTypeNames.add(enumName)\n const enumDecl = transformEnumToTJS(statement, sourceFile, warnings)\n if (enumDecl) {\n tjsFunctions.push(enumDecl)\n }\n }\n }\n }\n\n // Handle: class Foo { ... }\n if (ts.isClassDeclaration(statement) && statement.name) {\n const className = statement.name.getText(sourceFile)\n handled = true\n if (emitTJS) {\n const classDecl = transformClassToTJS(statement, sourceFile, warnings)\n tjsFunctions.push(classDecl)\n } else {\n classMetadata[className] = extractClassMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n }\n }\n\n // Handle: import statements (strip type-only imports, keep value imports)\n if (ts.isImportDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n // Check if it's a type-only import\n const isTypeOnly =\n statement.importClause?.isTypeOnly ||\n (statement.importClause?.namedBindings &&\n ts.isNamedImports(statement.importClause.namedBindings) &&\n statement.importClause.namedBindings.elements.every(\n (e) => e.isTypeOnly\n ))\n\n if (!isTypeOnly) {\n // Keep value imports - just strip any type annotations\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n const trimmed = transpiled.outputText.trim()\n if (trimmed) {\n tjsFunctions.push(trimmed)\n }\n }\n }\n }\n\n // Handle: export statements\n if (ts.isExportDeclaration(statement) || ts.isExportAssignment(statement)) {\n handled = true\n if (emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n const trimmed = transpiled.outputText.trim()\n if (trimmed) {\n tjsFunctions.push(trimmed)\n }\n }\n }\n\n // Handle: expression statements (console.log(...), foo(), etc.)\n // and any other unhandled statements\n if (!handled && emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n const trimmed = transpiled.outputText.trim()\n if (trimmed) {\n tjsFunctions.push(trimmed)\n }\n }\n }\n\n if (emitTJS) {\n // Include source file annotation for error reporting\n // JS equality semantics are now the default (no LegacyEquals needed)\n const sourceFileName = filename || 'unknown'\n const header = `/* tjs <- ${sourceFileName} */\\n\\n`\n\n // Append embedded test comments (they were extracted from original source)\n const testsSection =\n embeddedTests.length > 0 ? '\\n\\n' + embeddedTests.join('\\n\\n') : ''\n\n return {\n code: header + tjsFunctions.join('\\n\\n') + testsSection,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n }\n\n // For JS output, strip types and add metadata\n const jsOutput = ts.transpileModule(source, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n\n // Append __tjs metadata for each function\n let code = jsOutput.outputText\n for (const [funcName, info] of Object.entries(metadata)) {\n const metadataObj: Record<string, any> = {\n params: Object.fromEntries(\n Object.entries(info.params).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required, default: v.default },\n ])\n ),\n returns: info.returns ? { type: info.returns.kind } : undefined,\n }\n\n // Include type parameters (generics) if present\n if (info.typeParams) {\n metadataObj.typeParams = info.typeParams\n }\n\n const metadataStr = JSON.stringify(metadataObj, null, 2)\n code += `\\n${funcName}.__tjs = ${metadataStr};\\n`\n }\n\n // Append __tjs metadata for each class\n for (const [className, info] of Object.entries(classMetadata)) {\n const metadataObj: Record<string, any> = {\n constructor: info.constructor\n ? {\n params: Object.fromEntries(\n Object.entries(info.constructor.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required, default: v.default },\n ])\n ),\n }\n : undefined,\n methods: Object.fromEntries(\n Object.entries(info.methods ?? {}).map(([name, m]) => [\n name,\n {\n params: Object.fromEntries(\n Object.entries(m.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required },\n ])\n ),\n returns: m.returns ? { type: m.returns.kind } : undefined,\n },\n ])\n ),\n staticMethods: Object.fromEntries(\n Object.entries(info.staticMethods ?? {}).map(([name, m]) => [\n name,\n {\n params: Object.fromEntries(\n Object.entries(m.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required },\n ])\n ),\n returns: m.returns ? { type: m.returns.kind } : undefined,\n },\n ])\n ),\n }\n\n if (info.typeParams) {\n metadataObj.typeParams = info.typeParams\n }\n\n const metadataStr = JSON.stringify(metadataObj, null, 2)\n code += `\\n${className}.__tjs = ${metadataStr};\\n`\n\n // Wrap class to make it callable without `new`\n code += `\\n${emitClassWrapper(className)}\\n`\n }\n\n return {\n code,\n types: metadata,\n classes: Object.keys(classMetadata).length > 0 ? classMetadata : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n}\n",
13
+ "/**\n * TJS Runtime\n *\n * Monadic type checking at runtime:\n * - Functions validate inputs against __tjs metadata\n * - If any input is an error, pass it through (no work)\n * - Type mismatches return error objects\n * - Errors propagate through call chains\n *\n * This runtime is attached to globalThis.__tjs and shared across modules.\n */\n\nimport { validate, s } from 'tosijs-schema'\nimport {\n Type,\n isRuntimeType,\n Union,\n Generic,\n Enum,\n Nullable,\n Optional,\n TArray,\n // Built-in types\n TString,\n TNumber,\n TBoolean,\n TInteger,\n TPositiveInt,\n TNonEmptyString,\n TEmail,\n TUrl,\n TUuid,\n Timestamp,\n LegalDate,\n // Built-in generics\n TPair,\n TRecord,\n // Portable predicate helpers (future AJS builtins)\n isValidUrl,\n isValidTimestamp,\n isValidLegalDate,\n} from '../types/Type'\n\n// Re-export Type utilities for consumers\nexport {\n Type,\n isRuntimeType,\n Union,\n Generic,\n Enum,\n Nullable,\n Optional,\n TArray,\n TString,\n TNumber,\n TBoolean,\n TInteger,\n TPositiveInt,\n TNonEmptyString,\n TEmail,\n TUrl,\n TUuid,\n Timestamp,\n LegalDate,\n TPair,\n TRecord,\n isValidUrl,\n isValidTimestamp,\n isValidLegalDate,\n}\n\n// Version from package.json - injected at build time or imported\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst pkg = require('../../package.json') as { version: string }\n\nexport const TJS_VERSION: string = pkg.version\n\n/**\n * Parse semver version string into components\n */\nfunction parseVersion(version: string): {\n major: number\n minor: number\n patch: number\n} {\n const [major = 0, minor = 0, patch = 0] = version.split('.').map(Number)\n return { major, minor, patch }\n}\n\n/**\n * Compare two version strings\n * Returns: -1 if a < b, 0 if equal, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): -1 | 0 | 1 {\n const va = parseVersion(a)\n const vb = parseVersion(b)\n\n if (va.major !== vb.major) return va.major < vb.major ? -1 : 1\n if (va.minor !== vb.minor) return va.minor < vb.minor ? -1 : 1\n if (va.patch !== vb.patch) return va.patch < vb.patch ? -1 : 1\n return 0\n}\n\n/**\n * Check if two versions are compatible (same major version)\n */\nexport function versionsCompatible(a: string, b: string): boolean {\n const va = parseVersion(a)\n const vb = parseVersion(b)\n return va.major === vb.major\n}\n\n/**\n * MonadicError - Internal error type for monadic error propagation\n *\n * This extends Error so:\n * 1. It's a real Error with proper stack traces\n * 2. User code can't accidentally process it as data (unlike { $error: true })\n * 3. It flows through function calls via instanceof checks\n *\n * NOT exported to user code - they just see Error instances.\n */\nexport class MonadicError extends Error {\n /** Path where the error occurred, e.g., \"src/file.ts:42:greet.name\" */\n readonly path: string\n /** Expected type */\n readonly expected?: string\n /** Actual type received */\n readonly actual?: string\n /** TJS call stack (only in debug mode) - shows source locations */\n readonly callStack?: string[]\n\n constructor(\n message: string,\n path: string,\n expected?: string,\n actual?: string,\n callStack?: string[]\n ) {\n super(message)\n this.name = 'MonadicError'\n this.path = path\n this.expected = expected\n this.actual = actual\n this.callStack = callStack\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, MonadicError)\n }\n }\n}\n\n/**\n * Create a type error for inline validation\n *\n * Called ONLY when a type check fails - no overhead on happy path.\n * Returns a MonadicError that propagates through the call chain.\n * In debug mode, captures the TJS call stack with source locations.\n *\n * @param path - Location of the error, e.g., \"src/file.ts:42:greet.name\"\n * @param expected - Expected type, e.g., \"string\"\n * @param value - The actual value that failed the check\n */\nexport function typeError(\n path: string,\n expected: string,\n value: unknown\n): MonadicError {\n const actual = value === null ? 'null' : typeof value\n // Capture call stack in debug mode (getStack returns [] if not in debug mode)\n const stack = config.debug ? getStack() : undefined\n return new MonadicError(\n `Expected ${expected} for '${path}', got ${actual}`,\n path,\n expected,\n actual,\n stack\n )\n}\n\n/**\n * Check if a value is a MonadicError (for internal use)\n */\nexport function isMonadicError(value: unknown): value is MonadicError {\n return value instanceof MonadicError\n}\n\n/**\n * Error marker - identifies TJS error objects\n * @deprecated Use MonadicError instead. This interface is kept for backward compatibility.\n */\nexport interface TJSError {\n $error: true\n message: string\n /** Failure location - e.g., \"greet.name\" */\n path?: string\n /** Call stack in debug mode - e.g., [\"main\", \"processUser\", \"greet.name\"] */\n stack?: string[]\n expected?: string\n actual?: string\n cause?: Error | TJSError\n /** Source location for error reporting */\n loc?: { start: number; end: number }\n /** Multiple errors (when composing parameter errors) */\n errors?: TJSError[]\n}\n\n/**\n * Safety levels for runtime validation\n * - 'none': No validation unless explicitly forced with (?) or -?\n * - 'inputs': Validate inputs only (default) - outputs only with explicit -> or -?\n * - 'all': Validate both inputs and outputs unless explicitly skipped with (!) or -!\n */\nexport type SafetyLevel = 'none' | 'inputs' | 'all'\n\n/**\n * Runtime configuration\n */\nexport interface TJSConfig {\n /** Enable debug mode - captures call stacks in errors */\n debug?: boolean\n /** Safety level for validation (default: 'inputs') */\n safety?: SafetyLevel\n /** Require explicit return types (error if -> not specified) */\n requireReturnTypes?: boolean\n /** Maximum call stack size to prevent memory issues (default: 100) */\n maxStackSize?: number\n}\n\n/** Default configuration values */\nconst DEFAULT_CONFIG: TJSConfig = {\n debug: false,\n safety: 'inputs',\n requireReturnTypes: false,\n maxStackSize: 100,\n}\n\n/** Current runtime configuration */\nlet config: TJSConfig = { ...DEFAULT_CONFIG }\n\n/** Current call stack (only tracked in debug mode) */\nconst callStack: string[] = []\n\n/** Unsafe mode depth - when > 0, skip validation in wrap() */\nlet unsafeDepth = 0\n\n/**\n * Enter unsafe mode - disables validation for all wrapped function calls\n * Can be nested (uses depth counter)\n */\nexport function enterUnsafe(): void {\n unsafeDepth++\n}\n\n/**\n * Exit unsafe mode - re-enables validation when depth returns to 0\n */\nexport function exitUnsafe(): void {\n if (unsafeDepth > 0) unsafeDepth--\n}\n\n/**\n * Check if currently in unsafe mode\n */\nexport function isUnsafeMode(): boolean {\n return unsafeDepth > 0\n}\n\n/**\n * Configure TJS runtime\n */\nexport function configure(options: TJSConfig): void {\n config = { ...config, ...options }\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): TJSConfig {\n return { ...config }\n}\n\n/**\n * Push a function onto the call stack (debug mode only)\n * Respects maxStackSize to prevent unbounded memory growth\n */\nexport function pushStack(name: string): void {\n if (config.debug && name) {\n callStack.push(name)\n // Enforce max stack size by removing oldest entries\n const maxSize = config.maxStackSize ?? 100\n while (callStack.length > maxSize) {\n callStack.shift()\n }\n }\n}\n\n/**\n * Pop a function from the call stack (debug mode only)\n */\nexport function popStack(): void {\n if (config.debug) {\n callStack.pop()\n }\n}\n\n/**\n * Get current call stack snapshot\n */\nexport function getStack(): string[] {\n return [...callStack]\n}\n\n/**\n * Reset runtime state to defaults\n *\n * Resets: config, callStack, unsafeDepth\n * Use this in test teardown to prevent state leaking between tests.\n */\nexport function resetRuntime(): void {\n config = { ...DEFAULT_CONFIG }\n callStack.length = 0\n unsafeDepth = 0\n}\n\n/**\n * Structural equality - the == that works\n *\n * Rules:\n * 1. If left has .Equals, call left.Equals(right)\n * 2. If right has .Equals, call right.Equals(left)\n * 3. Arrays/objects: recursive structural comparison\n * 4. Primitives: strict equality (no coercion)\n *\n * Usage: `a Is b` transforms to `Is(a, b)`\n */\nexport function Is(a: unknown, b: unknown): boolean {\n // Check for .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 // Identical references or primitives\n if (a === b) return true\n\n // null and undefined are equal to each other (nullish equality)\n // This preserves the useful JS pattern: x == null checks for both\n if ((a === null || a === undefined) && (b === null || b === undefined)) {\n return true\n }\n\n // If only one is nullish, not equal\n if (a === null || a === undefined || b === null || b === undefined) {\n return false\n }\n\n // Different types - not equal (no coercion)\n if (typeof a !== typeof b) return false\n\n // Primitives that aren't === are not equal\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) => Is(v, b[i]))\n }\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\n // Objects - structural comparison\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) => Is((a as any)[k], (b as any)[k]))\n}\n\n/**\n * Structural inequality - the != that works\n *\n * Usage: `a IsNot b` transforms to `IsNot(a, b)`\n */\nexport function IsNot(a: unknown, b: unknown): boolean {\n return !Is(a, b)\n}\n\n/**\n * Check if a value is a TJS error\n */\nexport function isError(value: unknown): value is TJSError {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as any).$error === true\n )\n}\n\n/**\n * Create a TJS error\n * In debug mode, captures the current call stack\n */\nexport function error(\n message: string,\n details?: Partial<Omit<TJSError, '$error' | 'message'>>\n): TJSError {\n const err: TJSError = {\n $error: true,\n message,\n ...details,\n }\n\n // In debug mode, capture the call stack\n if (config.debug && callStack.length > 0) {\n // Add the path to the stack if it exists\n const fullStack = details?.path\n ? [...callStack, details.path]\n : [...callStack]\n err.stack = fullStack\n }\n\n return err\n}\n\n/**\n * Compose multiple errors into a single error\n * Used when multiple parameters have errors\n */\nexport function composeErrors(errors: TJSError[], funcName?: string): TJSError {\n if (errors.length === 0) {\n return error('Unknown error')\n }\n if (errors.length === 1) {\n return errors[0]\n }\n\n // Build a message listing all failed parameters\n const paramNames = errors\n .map((e) => {\n // Extract param name from path (e.g., \"func.paramName\" -> \"paramName\")\n if (e.path) {\n const parts = e.path.split('.')\n return parts[parts.length - 1]\n }\n return 'unknown'\n })\n .join(', ')\n\n const message = `Multiple parameter errors in ${\n funcName || 'function'\n }: ${paramNames}`\n\n return error(message, {\n path: funcName,\n errors,\n })\n}\n\n/**\n * Get the type of a value\n *\n * Enhanced typeof that handles:\n * - null (returns 'null' not 'object')\n * - undefined (returns 'undefined')\n * - arrays (returns 'array' not 'object')\n * - native/platform types (returns constructor name for objects)\n *\n * For objects, returns the constructor name which enables pragmatic\n * native type checking (e.g., 'HTMLElement', 'Buffer', 'Event')\n */\nexport function typeOf(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (Array.isArray(value)) return 'array'\n\n const t = typeof value\n if (t !== 'object') return t\n\n // For objects, return constructor name for pragmatic native type checking\n // This enables checking for HTMLElement, Buffer, Event, etc.\n const constructorName = (value as object).constructor?.name\n if (constructorName && constructorName !== 'Object') {\n return constructorName\n }\n\n return 'object'\n}\n\n/**\n * Check if a value is an instance of a native/platform type by constructor name\n *\n * This enables pragmatic native type checking without shipping type definitions:\n * - isNativeType(el, 'HTMLElement') - DOM element check\n * - isNativeType(buf, 'Buffer') - Node.js Buffer check\n * - isNativeType(evt, 'Event') - DOM Event check\n * - isNativeType(map, 'Map') - Map instance check\n *\n * @param value - The value to check\n * @param typeName - The constructor name to match (e.g., 'HTMLElement', 'Buffer')\n * @returns true if value's constructor.name matches or is in prototype chain\n */\nexport function isNativeType(value: unknown, typeName: string): boolean {\n if (value === null || value === undefined) return false\n if (typeof value !== 'object' && typeof value !== 'function') return false\n\n // Check constructor name\n let proto = value\n while (proto !== null) {\n const constructorName = (proto as object).constructor?.name\n if (constructorName === typeName) return true\n proto = Object.getPrototypeOf(proto)\n }\n\n return false\n}\n\n/**\n * Check if a value matches an expected type\n *\n * @param value - The value to check\n * @param expected - Either a string type name ('string', 'number', etc.)\n * or a RuntimeType instance with .check() method\n * @param path - Optional path for error messages\n */\nexport function checkType(\n value: unknown,\n expected: string | { check: (v: unknown) => boolean; description: string },\n path?: string\n): TJSError | null {\n // If value is already an error, propagate it\n if (isError(value)) return value\n\n // Handle RuntimeType instances (Type() results)\n if (\n typeof expected === 'object' &&\n expected !== null &&\n 'check' in expected\n ) {\n if (expected.check(value)) return null\n return error(`Expected ${expected.description} but got ${typeOf(value)}`, {\n path,\n expected: expected.description,\n actual: typeOf(value),\n })\n }\n\n const actual = typeOf(value)\n\n // Handle special cases\n if (expected === 'any') return null\n if (expected === actual) return null\n\n // Number accepts both number types\n if (expected === 'number' && actual === 'number') return null\n if (expected === 'integer' && actual === 'number' && Number.isInteger(value))\n return null\n\n // Object matching (basic)\n if (expected === 'object' && actual === 'object') return null\n\n return error(`Expected ${expected} but got ${actual}`, {\n path,\n expected,\n actual,\n })\n}\n\n/** Type specifier - either a string name or a RuntimeType */\ntype TypeSpec = string | { check: (v: unknown) => boolean; description: string }\n\n/** Parameter metadata with optional location */\ninterface ParamMeta {\n type: TypeSpec\n required: boolean\n default?: unknown\n loc?: { start: number; end: number }\n}\n\n/**\n * Validate function arguments against __tjs metadata\n * Returns first error found, or null if all valid\n */\nexport function validateArgs(\n args: Record<string, unknown>,\n meta: {\n params: Record<string, ParamMeta>\n },\n funcName?: string\n): TJSError | null {\n for (const [name, param] of Object.entries(meta.params)) {\n const value = args[name]\n\n // Check if any arg is already an error - propagate first one\n if (isError(value)) return value\n\n // Check required\n if (param.required && value === undefined) {\n const expectedDesc =\n typeof param.type === 'string' ? param.type : param.type.description\n return error(`Missing required parameter '${name}'`, {\n path: funcName ? `${funcName}.${name}` : name,\n expected: expectedDesc,\n actual: 'undefined',\n loc: param.loc,\n })\n }\n\n // Skip type check for undefined optional params\n if (value === undefined) continue\n\n // Type check\n const typeError = checkType(\n value,\n param.type,\n funcName ? `${funcName}.${name}` : name\n )\n if (typeError) {\n // Add location info if available\n if (param.loc) {\n typeError.loc = param.loc\n }\n return typeError\n }\n }\n\n return null\n}\n\n/**\n * Function metadata with safety flags\n */\nexport interface FunctionMeta {\n params: Record<string, any>\n returns?: { type: any; safe?: boolean }\n /** Function marked with (!) - never validate inputs */\n unsafe?: boolean\n /** Function marked with (?) - always validate inputs */\n safe?: boolean\n /** Return type marked with -! - never validate output */\n unsafeReturn?: boolean\n /** Return type marked with -? - always validate output */\n safeReturn?: boolean\n /** Explicit function name for stack tracking (used when fn.name is empty) */\n name?: string\n}\n\n/**\n * Determine if we should validate inputs for this call\n * Reserved for future use with runtime validation modes\n */\nfunction _shouldValidateInputs(meta: FunctionMeta): boolean {\n // Per-function flags take precedence\n if (meta.unsafe) return false\n if (meta.safe) return true\n\n // Block-level override\n if (unsafeDepth > 0) return false\n\n // Global safety level\n return config.safety !== 'none'\n}\n\n/**\n * Determine if we should validate outputs for this call\n * Reserved for future use with runtime validation modes\n */\nfunction _shouldValidateOutputs(meta: FunctionMeta): boolean {\n // No return type declared = no validation\n if (!meta.returns) return false\n\n // Per-function return flags take precedence\n if (meta.unsafeReturn) return false\n if (meta.safeReturn) return true\n\n // Block-level override\n if (unsafeDepth > 0) return false\n\n // Global safety level: 'all' validates outputs, others don't by default\n return config.safety === 'all'\n}\n\n/**\n * Wrap a function with monadic type checking\n *\n * @param fn - The original function\n * @param meta - The __tjs metadata\n * @returns Wrapped function that validates inputs and propagates errors\n */\nexport function wrap<T extends (...args: any[]) => any>(\n fn: T,\n meta: FunctionMeta\n): T {\n // Always attach metadata for introspection/autocomplete\n (fn as any).__tjs = meta\n\n // Determine if we need a wrapper at all\n const needsWrapper =\n // Has forced safety that requires validation\n meta.safe ||\n meta.safeReturn ||\n // Global safety requires validation (and not explicitly unsafe)\n (config.safety !== 'none' && !meta.unsafe) ||\n // Has return type that might need validation\n (meta.returns && config.safety === 'all' && !meta.unsafeReturn)\n\n if (!needsWrapper) {\n return fn\n }\n\n // Pre-compute flags at wrap time\n const hasReturns = !!meta.returns\n const metaUnsafe = !!meta.unsafe\n const metaSafe = !!meta.safe\n const metaUnsafeReturn = !!meta.unsafeReturn\n const metaSafeReturn = !!meta.safeReturn\n const paramEntries = Object.entries(meta.params)\n const paramCount = paramEntries.length\n // Use meta.name as fallback when fn.name is empty (anonymous functions)\n const funcName = fn.name || meta.name || 'anonymous'\n\n const wrapped = function (this: any, ...args: Parameters<T>): ReturnType<T> {\n // Fast path: inside unsafe block, skip all validation\n if (unsafeDepth > 0) {\n return fn.apply(this, args)\n }\n\n // Compute validation flags\n const validateInputs = metaSafe || (!metaUnsafe && config.safety !== 'none')\n const validateOutputs =\n hasReturns &&\n (metaSafeReturn || (!metaUnsafeReturn && config.safety === 'all'))\n\n // Fast path: no validation needed\n if (!validateInputs && !validateOutputs) {\n return fn.apply(this, args)\n }\n\n // Fast path: check for error as first arg\n if (args.length > 0 && isError(args[0])) {\n return args[0] as ReturnType<T>\n }\n\n // Input validation\n if (validateInputs) {\n // Detect if single object arg (named params) vs positional\n const isNamedCall =\n args.length === 1 &&\n typeof args[0] === 'object' &&\n args[0] !== null &&\n !Array.isArray(args[0])\n\n // Collect all errors to compose them\n const collectedErrors: TJSError[] = []\n\n // Fast positional validation (avoids object allocation)\n if (!isNamedCall) {\n for (let i = 0; i < paramCount; i++) {\n const [name, param] = paramEntries[i]\n const value = args[i]\n\n // Check for error propagation (passed-in errors)\n if (isError(value)) {\n collectedErrors.push(value)\n continue\n }\n\n // Check required\n if (param.required && value === undefined) {\n collectedErrors.push(\n error(`Missing required parameter '${name}'`, {\n path: `${funcName}.${name}`,\n expected:\n typeof param.type === 'string'\n ? param.type\n : param.type?.description || 'value',\n actual: 'undefined',\n loc: param.loc,\n })\n )\n continue\n }\n\n // Type check (skip undefined optional)\n if (value !== undefined) {\n const typeErr = checkType(value, param.type, `${funcName}.${name}`)\n if (typeErr) {\n if (param.loc) typeErr.loc = param.loc\n collectedErrors.push(typeErr)\n }\n }\n }\n } else {\n // Named args path (slower, but supports object destructuring)\n const namedArgs = args[0] as Record<string, unknown>\n for (let i = 0; i < paramCount; i++) {\n const [name, param] = paramEntries[i]\n const value = namedArgs[name]\n\n if (isError(value)) {\n collectedErrors.push(value)\n continue\n }\n\n if (param.required && value === undefined) {\n collectedErrors.push(\n error(`Missing required parameter '${name}'`, {\n path: `${funcName}.${name}`,\n expected:\n typeof param.type === 'string'\n ? param.type\n : param.type?.description || 'value',\n actual: 'undefined',\n loc: param.loc,\n })\n )\n continue\n }\n\n if (value !== undefined) {\n const typeErr = checkType(value, param.type, `${funcName}.${name}`)\n if (typeErr) {\n if (param.loc) typeErr.loc = param.loc\n collectedErrors.push(typeErr)\n }\n }\n }\n }\n\n // If we collected any errors, compose and return them\n if (collectedErrors.length > 0) {\n return composeErrors(collectedErrors, funcName) as ReturnType<T>\n }\n }\n\n // Push onto call stack in debug mode\n pushStack(funcName)\n\n try {\n // Execute function\n const result = fn.apply(this, args)\n\n // Output validation\n if (validateOutputs && meta.returns && !isError(result)) {\n const returnError = checkType(\n result,\n meta.returns.type,\n `${funcName}()`\n )\n if (returnError) {\n popStack()\n return returnError as ReturnType<T>\n }\n }\n\n popStack()\n return result\n } catch (e) {\n popStack()\n // Convert thrown errors to TJS errors\n return error((e as Error).message || String(e), {\n path: funcName,\n cause: e as Error,\n }) as ReturnType<T>\n }\n }\n\n // Preserve function name and metadata\n Object.defineProperty(wrapped, 'name', { value: fn.name })\n ;(wrapped as any).__tjs = meta\n\n return wrapped as T\n}\n\n/**\n * Wrap a class to make it callable without `new`\n *\n * In TJS, classes can be instantiated without the `new` keyword:\n * const obj = MyClass(args) // equivalent to new MyClass(args)\n *\n * This eliminates a common source of errors where developers forget `new`.\n * Using explicit `new` still works but should be flagged by the linter.\n */\nexport function wrapClass<T extends new (...args: any[]) => any>(\n cls: T\n): T & ((...args: ConstructorParameters<T>) => InstanceType<T>) {\n // Use a Proxy to intercept both `new Wrapper()` and `Wrapper()` calls\n const wrapped = new Proxy(cls, {\n // Called when using `new Wrapper(...)`\n construct(target, args, newTarget) {\n return Reflect.construct(target, args, newTarget)\n },\n // Called when using `Wrapper(...)` without new\n apply(target, _thisArg, args) {\n return Reflect.construct(target, args)\n },\n })\n\n // Preserve class name\n Object.defineProperty(wrapped, 'name', { value: cls.name })\n\n // Copy static properties and methods\n for (const key of Object.getOwnPropertyNames(cls)) {\n if (key !== 'length' && key !== 'name' && key !== 'prototype') {\n Object.defineProperty(\n wrapped,\n key,\n Object.getOwnPropertyDescriptor(cls, key)!\n )\n }\n }\n\n return wrapped as T & ((...args: ConstructorParameters<T>) => InstanceType<T>)\n}\n\n// ============================================================================\n// SafeFunction and Eval - moved to ./eval.ts\n// ============================================================================\n//\n// Eval and SafeFunction are in a separate module to keep the runtime lite.\n// Import from 'tjs-lang/eval' when you need dynamic code execution.\n//\n// Runtime (this file): ~5KB gzipped - type checking, Is/IsNot, wrap, etc.\n// Eval module: ~27KB gzipped - adds transpiler + VM for dynamic code\n// ============================================================================\n\n/**\n * Create an isolated TJS runtime instance\n *\n * Each call returns a fresh runtime with its own:\n * - config (debug, safety, etc.)\n * - callStack\n * - unsafeDepth\n *\n * The new instance inherits the current global config at creation time,\n * but subsequent changes are isolated.\n *\n * Use this to prevent state leaking between transpiled modules.\n */\nexport function createRuntime() {\n // Per-instance state - inherit current global config\n let instanceConfig: TJSConfig = { ...config }\n const instanceCallStack: string[] = []\n let instanceUnsafeDepth = 0\n\n // Per-instance stateful functions\n function instanceConfigure(options: TJSConfig): void {\n instanceConfig = { ...instanceConfig, ...options }\n }\n\n function instanceGetConfig(): TJSConfig {\n return { ...instanceConfig }\n }\n\n function instancePushStack(name: string): void {\n if (instanceConfig.debug && name) {\n instanceCallStack.push(name)\n const maxSize = instanceConfig.maxStackSize ?? 100\n while (instanceCallStack.length > maxSize) {\n instanceCallStack.shift()\n }\n }\n }\n\n function instancePopStack(): void {\n if (instanceConfig.debug) {\n instanceCallStack.pop()\n }\n }\n\n function instanceGetStack(): string[] {\n return [...instanceCallStack]\n }\n\n function instanceResetRuntime(): void {\n instanceConfig = { ...DEFAULT_CONFIG }\n instanceCallStack.length = 0\n instanceUnsafeDepth = 0\n }\n\n function instanceEnterUnsafe(): void {\n instanceUnsafeDepth++\n }\n\n function instanceExitUnsafe(): void {\n if (instanceUnsafeDepth > 0) instanceUnsafeDepth--\n }\n\n function instanceIsUnsafeMode(): boolean {\n return instanceUnsafeDepth > 0\n }\n\n function instanceTypeError(\n path: string,\n expected: string,\n value: unknown\n ): MonadicError {\n const actual = value === null ? 'null' : typeof value\n const stack = instanceConfig.debug ? instanceGetStack() : undefined\n return new MonadicError(\n `Expected ${expected} for '${path}', got ${actual}`,\n path,\n expected,\n actual,\n stack\n )\n }\n\n function instanceError(\n message: string,\n details?: Partial<Omit<TJSError, '$error' | 'message'>>\n ): TJSError {\n const err: TJSError = {\n $error: true,\n message,\n ...details,\n }\n if (instanceConfig.debug && instanceCallStack.length > 0) {\n const fullStack = details?.path\n ? [...instanceCallStack, details.path]\n : [...instanceCallStack]\n err.stack = fullStack\n }\n return err\n }\n\n return {\n version: TJS_VERSION,\n // Monadic error handling\n MonadicError,\n typeError: instanceTypeError,\n isMonadicError,\n // Legacy error handling\n isError,\n error: instanceError,\n composeErrors,\n typeOf,\n isNativeType,\n checkType,\n validateArgs,\n wrap,\n wrapClass,\n compareVersions,\n versionsCompatible,\n // Debug mode (instance-specific)\n configure: instanceConfigure,\n getConfig: instanceGetConfig,\n pushStack: instancePushStack,\n popStack: instancePopStack,\n getStack: instanceGetStack,\n resetRuntime: instanceResetRuntime,\n // Unsafe mode (instance-specific)\n enterUnsafe: instanceEnterUnsafe,\n exitUnsafe: instanceExitUnsafe,\n isUnsafeMode: instanceIsUnsafeMode,\n // Type system\n validate,\n infer: s.infer.bind(s),\n Type,\n isRuntimeType,\n Union,\n Generic,\n Enum,\n Nullable,\n Optional,\n TArray,\n TString,\n TNumber,\n TBoolean,\n TInteger,\n TPositiveInt,\n TNonEmptyString,\n TEmail,\n TUrl,\n TUuid,\n TPair,\n TRecord,\n // Structural equality\n Is,\n IsNot,\n }\n}\n\n/** Type for runtime instances */\nexport type TJSRuntime = ReturnType<typeof createRuntime>\n\n/**\n * TJS Runtime object - attached to globalThis.__tjs\n *\n * NOTE: This is a shared global instance. For isolated execution,\n * use createRuntime() instead.\n */\nexport const runtime = {\n version: TJS_VERSION,\n // Monadic error handling (new)\n MonadicError,\n typeError,\n isMonadicError,\n // Legacy error handling (deprecated)\n isError,\n error,\n composeErrors,\n typeOf,\n isNativeType,\n checkType,\n validateArgs,\n wrap,\n wrapClass,\n compareVersions,\n versionsCompatible,\n // Debug mode\n configure,\n getConfig,\n pushStack,\n popStack,\n getStack,\n resetRuntime,\n // Unsafe mode\n enterUnsafe,\n exitUnsafe,\n isUnsafeMode,\n // Factory for isolated instances\n createRuntime,\n // Type system (used by transpiled Type declarations)\n validate,\n infer: s.infer.bind(s),\n Type,\n isRuntimeType,\n Union,\n Generic,\n Enum,\n Nullable,\n Optional,\n TArray,\n // Built-in types\n TString,\n TNumber,\n TBoolean,\n TInteger,\n TPositiveInt,\n TNonEmptyString,\n TEmail,\n TUrl,\n TUuid,\n Timestamp,\n LegalDate,\n TPair,\n TRecord,\n // Structural equality (used by == and != in TJS)\n Is,\n IsNot,\n}\n\n/**\n * Install runtime globally (idempotent, version-checked)\n *\n * Version handling:\n * - Same version: reuse existing (no warning)\n * - Compatible (same major): reuse existing, log info\n * - Incompatible (different major): warn, use newer version\n */\nexport function installRuntime(): typeof runtime {\n const g = globalThis as any\n\n if (g.__tjs) {\n const existingVersion = g.__tjs.version\n\n // Guard against polluted __tjs without proper version\n if (typeof existingVersion !== 'string') {\n g.__tjs = runtime\n return runtime\n }\n\n const comparison = compareVersions(TJS_VERSION, existingVersion)\n\n if (comparison === 0) {\n // Exact same version - just reuse\n return g.__tjs\n }\n\n if (versionsCompatible(TJS_VERSION, existingVersion)) {\n // Same major version - compatible, use newer\n if (comparison > 0) {\n console.info(\n `TJS runtime: upgrading ${existingVersion} → ${TJS_VERSION}`\n )\n g.__tjs = runtime\n } else {\n console.info(\n `TJS runtime: keeping ${existingVersion} (newer than ${TJS_VERSION})`\n )\n }\n } else {\n // Different major version - breaking change potential\n console.warn(\n `TJS runtime version conflict: ${existingVersion} vs ${TJS_VERSION} (major version mismatch)`\n )\n // Use the newer one but warn about potential issues\n if (comparison > 0) {\n console.warn(`Upgrading to ${TJS_VERSION} - check for breaking changes`)\n g.__tjs = runtime\n }\n }\n\n return g.__tjs\n }\n\n g.__tjs = runtime\n return runtime\n}\n\n/**\n * Generate runtime wrapper code for emitted JS\n * Skips wrapping for unsafe functions (marked with !)\n */\nexport function emitRuntimeWrapper(funcName: string): string {\n return `\n// TJS runtime wrapper (skips unsafe functions)\nif (typeof ${funcName}.__tjs === 'object' && !${funcName}.__tjs.unsafe && typeof globalThis.__tjs?.wrap === 'function') {\n ${funcName} = globalThis.__tjs.wrap(${funcName}, ${funcName}.__tjs)\n}\n`.trim()\n}\n\n/**\n * Generate class wrapper code for emitted JS\n * Makes classes callable without `new` keyword\n * Emits standalone JS - no runtime dependency\n */\nexport function emitClassWrapper(className: string): string {\n return `\n// TJS: callable without new\n${className} = new Proxy(${className}, { apply(t, _, a) { return Reflect.construct(t, a) } });\n`.trim()\n}\n\n/**\n * Questions/Notes:\n *\n * Q1: Should wrap() be automatic or opt-in?\n * Current: Must be explicitly wrapped\n * Could: Auto-wrap all functions with __tjs metadata\n *\n * Q2: Performance overhead of validation?\n * Need benchmarks comparing wrapped vs unwrapped\n * Could have 'production' mode that skips validation\n *\n * Q3: Async function handling?\n * wrap() should detect async and handle Promise returns\n *\n * Q4: Deep object validation?\n * Currently only checks top-level type\n * Could recursively validate object shapes\n */\n",
14
+ "/**\n * Type() - Runtime type definitions with descriptions and validation\n *\n * Forms:\n * Type(description, predicate) - full form with custom validation\n * Type(description, schema) - schema-based validation\n * Type(schema) - schema only, self-documenting\n *\n * Usage:\n * const ZipCode = Type('5-digit US zip code', (s) => /^\\d{5}$/.test(s))\n * const Email = Type('valid email', s.string.email)\n * const Age = Type(s.number.min(0).max(150))\n *\n * ZipCode.check('12345') // true\n * ZipCode.check('abc') // false\n * ZipCode.description // '5-digit US zip code'\n */\n\nimport { validate, s, type Base, type JSONSchema } from 'tosijs-schema'\n\n/** Schema can be a tosijs-schema builder or a raw JSON Schema object */\ntype Schema = Base<any> | JSONSchema\n\n/** A runtime type with description and validation */\nexport interface RuntimeType<T = unknown> {\n /** Human-readable description of the type */\n readonly description: string\n /** Check if a value matches this type */\n check(value: unknown): value is T\n /** The underlying schema (if schema-based) */\n readonly schema?: Schema\n /** The predicate function (if predicate-based) */\n readonly predicate?: (value: unknown) => boolean\n /** Example value (for documentation and implicit testing) */\n readonly example?: T\n /** Default value (for instantiation) */\n readonly default?: T\n /** Brand for type identification */\n readonly __runtimeType: true\n}\n\n/** Check if a value is a RuntimeType */\nexport function isRuntimeType(value: unknown): value is RuntimeType {\n return (\n value !== null &&\n typeof value === 'object' &&\n '__runtimeType' in value &&\n (value as any).__runtimeType === true\n )\n}\n\n/**\n * Create a runtime type with description and validation\n *\n * @overload Type(description, predicate) - custom validation function\n * @overload Type(description, schema) - schema-based validation\n * @overload Type(schema) - schema only\n */\n/**\n * Check if a value is a tosijs-schema builder (has .schema property)\n */\nfunction isSchemaBuilder(value: unknown): value is Base<any> {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'schema' in value &&\n typeof (value as any).schema === 'object'\n )\n}\n\n/**\n * Check if a value looks like a raw JSON Schema object\n */\nfunction isJSONSchema(value: unknown): value is JSONSchema {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'type' in value &&\n typeof (value as any).type === 'string'\n )\n}\n\nexport function Type<T = unknown>(\n descriptionOrSchema: string | Schema,\n predicateOrSchemaOrExample?:\n | ((value: unknown) => boolean)\n | Schema\n | T\n | undefined,\n exampleArg?: T,\n defaultArg?: T\n): RuntimeType<T> {\n // Parse arguments\n let description: string\n let predicate: ((value: unknown) => boolean) | undefined\n let schema: Schema | undefined\n let example: T | undefined = exampleArg\n let defaultValue: T | undefined = defaultArg\n\n if (typeof descriptionOrSchema === 'string') {\n // Form: Type(description, predicate/schema/example, example?, default?)\n description = descriptionOrSchema\n\n if (typeof predicateOrSchemaOrExample === 'function') {\n // Type(description, predicate, example?, default?)\n predicate = predicateOrSchemaOrExample\n // If we have example, infer schema from it for the type guard in predicate\n if (example !== undefined) {\n schema = s.infer(example)\n }\n } else if (\n predicateOrSchemaOrExample === undefined &&\n example !== undefined\n ) {\n // Type(description, undefined, example, default?) - example provides schema\n schema = s.infer(example)\n } else if (isSchemaBuilder(predicateOrSchemaOrExample)) {\n // Type(description, schemaBuilder)\n schema = predicateOrSchemaOrExample\n } else if (isJSONSchema(predicateOrSchemaOrExample)) {\n // Type(description, jsonSchema)\n schema = predicateOrSchemaOrExample\n } else if (predicateOrSchemaOrExample !== undefined) {\n // Type(description, example) - second arg is the example/default, infer schema\n // This is the simple form: Type('Name', 'Alice')\n example = predicateOrSchemaOrExample as T\n defaultValue = example // In simple form, example IS the default\n schema = s.infer(example)\n } else {\n throw new Error(\n 'Type(description) requires a predicate, schema, or example'\n )\n }\n } else {\n // Form: Type(schema) or Type(schemaBuilder)\n if (isSchemaBuilder(descriptionOrSchema)) {\n schema = descriptionOrSchema\n } else {\n schema = descriptionOrSchema as Schema\n }\n description = schemaToDescription(schema)\n }\n\n // Build the check function\n const check = (value: unknown): value is T => {\n if (predicate) {\n return predicate(value)\n }\n if (schema) {\n return validate(value, schema)\n }\n return false\n }\n\n return {\n description,\n check,\n schema,\n predicate,\n example,\n default: defaultValue,\n __runtimeType: true as const,\n }\n}\n\n/**\n * Generate a description from a schema\n */\nfunction schemaToDescription(schema: Schema): string {\n // tosijs-schema wraps JSON schema in .schema property\n const jsonSchema = (schema as any)?.schema ?? schema\n\n // Handle schema objects with type property\n if (jsonSchema && typeof jsonSchema === 'object' && 'type' in jsonSchema) {\n const s = jsonSchema as any\n switch (s.type) {\n case 'string':\n if (s.format) return `string (${s.format})`\n if (s.pattern) return `string matching ${s.pattern}`\n if (s.minLength !== undefined && s.maxLength !== undefined)\n return `string (${s.minLength}-${s.maxLength} chars)`\n return 'string'\n case 'number':\n case 'integer':\n if (s.minimum !== undefined && s.maximum !== undefined)\n return `${s.type} (${s.minimum}-${s.maximum})`\n if (s.minimum !== undefined) return `${s.type} >= ${s.minimum}`\n if (s.maximum !== undefined) return `${s.type} <= ${s.maximum}`\n return s.type\n case 'boolean':\n return 'boolean'\n case 'array':\n return 'array'\n case 'object':\n return 'object'\n case 'null':\n return 'null'\n }\n }\n\n // Fallback\n return 'value'\n}\n\n// ============================================================================\n// Built-in Types\n// ============================================================================\n\n/** String type */\nexport const TString = Type<string>('string', (v) => typeof v === 'string')\n\n/** Number type */\nexport const TNumber = Type<number>('number', (v) => typeof v === 'number')\n\n/** Boolean type */\nexport const TBoolean = Type<boolean>('boolean', (v) => typeof v === 'boolean')\n\n/** Integer type */\nexport const TInteger = Type<number>(\n 'integer',\n (v) => typeof v === 'number' && Number.isInteger(v)\n)\n\n/** Positive integer type */\nexport const TPositiveInt = Type<number>(\n 'positive integer',\n (v) => typeof v === 'number' && Number.isInteger(v) && v > 0\n)\n\n/** Non-empty string type */\nexport const TNonEmptyString = Type<string>(\n 'non-empty string',\n (v) => typeof v === 'string' && v.length > 0\n)\n\n/** Email type (basic validation) */\nexport const TEmail = Type<string>(\n 'email address',\n (v) => typeof v === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v)\n)\n\n/**\n * Check if a string is a valid URL (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidUrl = (v: string): boolean => {\n try {\n new URL(v)\n return true\n } catch {\n return false\n }\n}\n\n/** URL type */\nexport const TUrl = Type<string>(\n 'URL',\n (v) => typeof v === 'string' && isValidUrl(v)\n)\n\n/** UUID type */\nexport const TUuid = Type<string>(\n 'UUID',\n (v) =>\n typeof v === 'string' &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v)\n)\n\n/**\n * Check if a string is a valid ISO 8601 timestamp (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidTimestamp = (v: string): boolean => {\n const d = new Date(v)\n return !isNaN(d.getTime()) && v.includes('T')\n}\n\n/**\n * Check if a string is a valid YYYY-MM-DD date (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidLegalDate = (v: string): boolean => {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false\n const d = new Date(v + 'T00:00:00Z')\n return !isNaN(d.getTime())\n}\n\n/** ISO 8601 timestamp string (e.g., \"2024-01-15T10:30:00Z\") */\nexport const Timestamp = Type<string>(\n 'ISO 8601 timestamp',\n (v) => typeof v === 'string' && isValidTimestamp(v)\n)\n\n/** Legal date string in YYYY-MM-DD format */\nexport const LegalDate = Type<string>(\n 'date (YYYY-MM-DD)',\n (v) => typeof v === 'string' && isValidLegalDate(v)\n)\n\n// ============================================================================\n// Type Combinators\n// ============================================================================\n\n/** Create a nullable version of a type */\nexport function Nullable<T>(type: RuntimeType<T>): RuntimeType<T | null> {\n return Type<T | null>(\n `${type.description} or null`,\n (v) => v === null || type.check(v)\n )\n}\n\n/** Create an optional version of a type (nullable + undefined) */\nexport function Optional<T>(\n type: RuntimeType<T>\n): RuntimeType<T | null | undefined> {\n return Type<T | null | undefined>(\n `${type.description} (optional)`,\n (v) => v === null || v === undefined || type.check(v)\n )\n}\n\n/**\n * Create a union type\n *\n * Two forms:\n * Union(...types: RuntimeType[]) - combine existing types\n * Union(description, values) - create literal union from values\n *\n * @example\n * // From RuntimeTypes\n * const StringOrNumber = Union(TString, TNumber)\n *\n * // From literal values (used by TJS syntax)\n * const Direction = Union('cardinal direction', ['up', 'down', 'left', 'right'])\n */\nexport function Union<T extends unknown[]>(\n descriptionOrType: string | RuntimeType,\n valuesOrType?: T | RuntimeType,\n ...restTypes: RuntimeType[]\n): RuntimeType {\n // New form: Union(description, values[])\n if (typeof descriptionOrType === 'string' && Array.isArray(valuesOrType)) {\n const description = descriptionOrType\n const values = valuesOrType as unknown[]\n const valueSet = new Set(values)\n\n const result: RuntimeType & { values: unknown[] } = {\n description,\n check: (v: unknown): v is T[number] => valueSet.has(v),\n __runtimeType: true as const,\n values, // Expose values for introspection\n }\n return result\n }\n\n // Old form: Union(...types: RuntimeType[])\n const types: RuntimeType[] = []\n if (isRuntimeType(descriptionOrType)) {\n types.push(descriptionOrType)\n }\n if (isRuntimeType(valuesOrType)) {\n types.push(valuesOrType as RuntimeType)\n }\n types.push(...restTypes)\n\n const description = types.map((t) => t.description).join(' | ')\n return Type(description, (v) => types.some((t) => t.check(v)))\n}\n\n/** Create an array type */\nexport function TArray<T>(itemType: RuntimeType<T>): RuntimeType<T[]> {\n return Type<T[]>(\n `array of ${itemType.description}`,\n (v) => Array.isArray(v) && v.every((item) => itemType.check(item))\n )\n}\n\n// ============================================================================\n// Generic Types\n// ============================================================================\n\n/** Type parameter - can be a RuntimeType, schema, or example value */\nexport type TypeParam = RuntimeType | Base<any> | JSONSchema | unknown\n\n/** Generic type factory */\nexport interface GenericType<TParams extends string[] = string[]> {\n /** Instantiate the generic with concrete type arguments */\n (...typeArgs: TypeParam[]): RuntimeType\n /** The type parameter names */\n readonly params: TParams\n /** Description template */\n readonly description: string\n}\n\n/**\n * Convert a type param to a check function\n */\nfunction typeParamToCheck(param: TypeParam): (value: unknown) => boolean {\n if (isRuntimeType(param)) {\n return (v) => param.check(v)\n }\n // Check if it's a schema builder (has .schema property)\n if (param && typeof param === 'object' && 'schema' in param) {\n return (v) => validate(v, param as Base<any>)\n }\n // It's an example value - infer schema using s.infer\n const schema = s.infer(param)\n return (v) => validate(v, schema)\n}\n\n/**\n * Create a generic (parameterized) type factory\n *\n * @param params Array of type parameter names, with optional defaults: ['T', ['U', defaultSchema]]\n * @param predicate Function receiving (value, ...typeChecks) where typeChecks are validation functions\n * @param description Human-readable description template (type params will be substituted)\n *\n * @example\n * // Pair<T, U>\n * const Pair = Generic(\n * ['T', 'U'],\n * (x, checkT, checkU) =>\n * Array.isArray(x) && x.length === 2 && checkT(x[0]) && checkU(x[1]),\n * 'Pair<T, U>'\n * )\n *\n * // Usage: Pair(TString, TNumber) creates a type for [string, number]\n * // Or with examples: Pair('', 0)\n */\nexport function Generic<TParams extends string[]>(\n params: (string | [string, TypeParam])[],\n predicate: (\n value: unknown,\n ...typeChecks: Array<(v: unknown) => boolean>\n ) => boolean,\n description: string\n): GenericType<TParams> {\n // Extract param names and defaults\n const paramNames: string[] = []\n const defaults: (TypeParam | undefined)[] = []\n\n for (const p of params) {\n if (typeof p === 'string') {\n paramNames.push(p)\n defaults.push(undefined)\n } else {\n paramNames.push(p[0])\n defaults.push(p[1])\n }\n }\n\n // The factory function\n const factory = (...typeArgs: TypeParam[]): RuntimeType => {\n // Resolve type arguments, using defaults where not provided\n const checks = paramNames.map((_, i) => {\n const arg = i < typeArgs.length ? typeArgs[i] : defaults[i]\n if (arg === undefined) {\n // No arg and no default - accept anything\n return () => true\n }\n return typeParamToCheck(arg)\n })\n\n // Build description with substituted types\n let desc = description\n paramNames.forEach((name, i) => {\n const arg = i < typeArgs.length ? typeArgs[i] : defaults[i]\n let typeStr = 'any'\n if (isRuntimeType(arg)) {\n typeStr = arg.description\n } else if (arg !== undefined) {\n typeStr = typeof arg === 'string' ? 'string' : JSON.stringify(arg)\n }\n desc = desc.replace(new RegExp(`\\\\b${name}\\\\b`, 'g'), typeStr)\n })\n\n return Type(desc, (value) => predicate(value, ...checks))\n }\n\n ;(factory as any).params = paramNames as TParams\n ;(factory as any).description = description\n\n return factory as GenericType<TParams>\n}\n\n// ============================================================================\n// Built-in Generic Types\n// ============================================================================\n\n/** Pair<T, U> - 2-element tuple */\nexport const TPair = Generic(\n ['T', 'U'],\n (x, checkT, checkU) =>\n Array.isArray(x) && x.length === 2 && checkT(x[0]) && checkU(x[1]),\n 'Pair<T, U>'\n)\n\n/** Record<V> - object with string keys and values of type V */\nexport const TRecord = Generic(\n ['V'],\n (x, checkV) =>\n typeof x === 'object' &&\n x !== null &&\n !Array.isArray(x) &&\n Object.values(x).every(checkV),\n 'Record<string, V>'\n)\n\n// ============================================================================\n// Enum Types\n// ============================================================================\n\n/** Enum type with bidirectional lookup */\nexport interface EnumType<\n T extends Record<string, string | number> = Record<string, string | number>\n> extends RuntimeType<T[keyof T]> {\n /** The enum members as { Name: value } */\n readonly members: T\n /** Reverse lookup: value -> name */\n readonly names: Record<string | number, string>\n /** Get all valid values */\n readonly values: Array<T[keyof T]>\n /** Get all member names */\n readonly keys: Array<keyof T>\n}\n\n/**\n * Create an enum type with bidirectional lookup\n *\n * @param description Human-readable description\n * @param members Object mapping names to values { Pending: 0, Active: 1 }\n *\n * @example\n * const Status = Enum('task status', { Pending: 0, Active: 1, Done: 2 })\n * Status.check(0) // true\n * Status.check('done') // false\n * Status.members.Pending // 0\n * Status.names[0] // 'Pending'\n * Status.values // [0, 1, 2]\n * Status.keys // ['Pending', 'Active', 'Done']\n *\n * const Color = Enum('CSS color', { Red: 'red', Green: 'green', Blue: 'blue' })\n * Color.check('red') // true\n * Color.members.Red // 'red'\n */\nexport function Enum<T extends Record<string, string | number>>(\n description: string,\n members: T\n): EnumType<T> {\n const values = Object.values(members) as Array<T[keyof T]>\n const valueSet = new Set(values)\n const keys = Object.keys(members) as Array<keyof T>\n\n // Build reverse lookup\n const names: Record<string | number, string> = {}\n for (const [key, value] of Object.entries(members)) {\n names[value] = key\n }\n\n const enumType: EnumType<T> = {\n description,\n check: (v: unknown): v is T[keyof T] => valueSet.has(v as T[keyof T]),\n __runtimeType: true as const,\n members,\n names,\n values,\n keys,\n }\n\n return enumType\n}\n",
15
+ "/**\n * TJS Schema - Runtime type system for Typed JavaScript\n *\n * Builds on tosijs-schema to provide:\n * - Schema(x) callable for inference by example\n * - Schema.type(x) for \"fixed typeof\" (null returns 'null', not 'object')\n * - All tosijs-schema methods (string, number, object, array, etc.)\n *\n * Usage:\n * Schema('hello') // Schema matching string\n * Schema(42) // Schema matching number (integer)\n * Schema(null) // Schema matching null\n * Schema(undefined) // Schema matching undefined\n * Schema([1, 2, 3]) // Schema matching array of integers\n * Schema({name: 'Anne'}) // Schema matching object with name: string\n *\n * Schema.type(null) // 'null' (not 'object' like typeof)\n * Schema.type(undefined) // 'undefined'\n * Schema.type([]) // 'array' (not 'object' like typeof)\n *\n * Schema.null.validate(x) // true if x is null\n * Schema.undefined.validate(x) // true if x is undefined\n */\n\nimport { s, type Base } from 'tosijs-schema'\n\n/**\n * Get the \"fixed\" type of a value - unlike typeof, correctly handles null and arrays\n */\nfunction getType(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (Array.isArray(value)) return 'array'\n return typeof value\n}\n\n/**\n * Infer a schema from an example value\n * This wraps tosijs-schema's s.infer() for consistency\n */\nfunction infer(value: unknown): Base<unknown> {\n return s.infer(value)\n}\n\n// The base callable function\nfunction schemaCallable(value: unknown): Base<unknown> {\n return infer(value)\n}\n\n// Add our custom methods\nschemaCallable.type = getType\nschemaCallable.infer = infer\n\n// Create the Schema callable that proxies to s for all other properties\ntype SchemaCallable = {\n (value: unknown): Base<unknown>\n type: (value: unknown) => string\n infer: (value: unknown) => Base<unknown>\n} & typeof s\n\n/**\n * Schema - callable for inference, with all tosijs-schema methods attached\n * Uses a Proxy to delegate property access to tosijs-schema's s object\n */\nexport const Schema: SchemaCallable = new Proxy(schemaCallable as any, {\n get(target, prop) {\n // Our custom methods take precedence\n if (prop === 'type') return getType\n if (prop === 'infer') return infer\n // Delegate everything else to tosijs-schema's s\n return (s as any)[prop]\n },\n apply(target, thisArg, args) {\n // Make it callable - Schema(value) infers schema\n return infer(args[0])\n },\n})\n\n// Re-export useful types from tosijs-schema\nexport type { Base, Infer } from 'tosijs-schema'\n",
16
+ "// AST walker module for ESTree compatible trees\n\n// A simple walk is one where you simply specify callbacks to be\n// called on specific nodes. The last two arguments are optional. A\n// simple use would be\n//\n// walk.simple(myTree, {\n// Expression: function(node) { ... }\n// });\n//\n// to do something with all expressions. All ESTree node types\n// can be used to identify node types, as well as Expression and\n// Statement, which denote categories of nodes.\n//\n// The base argument can be used to pass a custom (recursive)\n// walker, and state can be used to give this walked an initial\n// state.\n\nfunction simple(node, visitors, baseVisitor, state, override) {\n if (!baseVisitor) { baseVisitor = base\n ; }(function c(node, st, override) {\n var type = override || node.type;\n baseVisitor[type](node, st, c);\n if (visitors[type]) { visitors[type](node, st); }\n })(node, state, override);\n}\n\n// An ancestor walk keeps an array of ancestor nodes (including the\n// current node) and passes them to the callback as third parameter\n// (and also as state parameter when no other state is present).\nfunction ancestor(node, visitors, baseVisitor, state, override) {\n var ancestors = [];\n if (!baseVisitor) { baseVisitor = base\n ; }(function c(node, st, override) {\n var type = override || node.type;\n var isNew = node !== ancestors[ancestors.length - 1];\n if (isNew) { ancestors.push(node); }\n baseVisitor[type](node, st, c);\n if (visitors[type]) { visitors[type](node, st || ancestors, ancestors); }\n if (isNew) { ancestors.pop(); }\n })(node, state, override);\n}\n\n// A recursive walk is one where your functions override the default\n// walkers. They can modify and replace the state parameter that's\n// threaded through the walk, and can opt how and whether to walk\n// their child nodes (by calling their third argument on these\n// nodes).\nfunction recursive(node, state, funcs, baseVisitor, override) {\n var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor\n ;(function c(node, st, override) {\n visitor[override || node.type](node, st, c);\n })(node, state, override);\n}\n\nfunction makeTest(test) {\n if (typeof test === \"string\")\n { return function (type) { return type === test; } }\n else if (!test)\n { return function () { return true; } }\n else\n { return test }\n}\n\nvar Found = function Found(node, state) { this.node = node; this.state = state; };\n\n// A full walk triggers the callback on each node\nfunction full(node, callback, baseVisitor, state, override) {\n if (!baseVisitor) { baseVisitor = base; }\n var last\n ;(function c(node, st, override) {\n var type = override || node.type;\n baseVisitor[type](node, st, c);\n if (last !== node) {\n callback(node, st, type);\n last = node;\n }\n })(node, state, override);\n}\n\n// An fullAncestor walk is like an ancestor walk, but triggers\n// the callback on each node\nfunction fullAncestor(node, callback, baseVisitor, state) {\n if (!baseVisitor) { baseVisitor = base; }\n var ancestors = [], last\n ;(function c(node, st, override) {\n var type = override || node.type;\n var isNew = node !== ancestors[ancestors.length - 1];\n if (isNew) { ancestors.push(node); }\n baseVisitor[type](node, st, c);\n if (last !== node) {\n callback(node, st || ancestors, ancestors, type);\n last = node;\n }\n if (isNew) { ancestors.pop(); }\n })(node, state);\n}\n\n// Find a node with a given start, end, and type (all are optional,\n// null can be used as wildcard). Returns a {node, state} object, or\n// undefined when it doesn't find a matching node.\nfunction findNodeAt(node, start, end, test, baseVisitor, state) {\n if (!baseVisitor) { baseVisitor = base; }\n test = makeTest(test);\n try {\n (function c(node, st, override) {\n var type = override || node.type;\n if ((start == null || node.start <= start) &&\n (end == null || node.end >= end))\n { baseVisitor[type](node, st, c); }\n if ((start == null || node.start === start) &&\n (end == null || node.end === end) &&\n test(type, node))\n { throw new Found(node, st) }\n })(node, state);\n } catch (e) {\n if (e instanceof Found) { return e }\n throw e\n }\n}\n\n// Find the innermost node of a given type that contains the given\n// position. Interface similar to findNodeAt.\nfunction findNodeAround(node, pos, test, baseVisitor, state) {\n test = makeTest(test);\n if (!baseVisitor) { baseVisitor = base; }\n try {\n (function c(node, st, override) {\n var type = override || node.type;\n if (node.start > pos || node.end < pos) { return }\n baseVisitor[type](node, st, c);\n if (test(type, node)) { throw new Found(node, st) }\n })(node, state);\n } catch (e) {\n if (e instanceof Found) { return e }\n throw e\n }\n}\n\n// Find the outermost matching node after a given position.\nfunction findNodeAfter(node, pos, test, baseVisitor, state) {\n test = makeTest(test);\n if (!baseVisitor) { baseVisitor = base; }\n try {\n (function c(node, st, override) {\n if (node.end < pos) { return }\n var type = override || node.type;\n if (node.start >= pos && test(type, node)) { throw new Found(node, st) }\n baseVisitor[type](node, st, c);\n })(node, state);\n } catch (e) {\n if (e instanceof Found) { return e }\n throw e\n }\n}\n\n// Find the outermost matching node before a given position.\nfunction findNodeBefore(node, pos, test, baseVisitor, state) {\n test = makeTest(test);\n if (!baseVisitor) { baseVisitor = base; }\n var max\n ;(function c(node, st, override) {\n if (node.start > pos) { return }\n var type = override || node.type;\n if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node))\n { max = new Found(node, st); }\n baseVisitor[type](node, st, c);\n })(node, state);\n return max\n}\n\n// Used to create a custom walker. Will fill in all missing node\n// type properties with the defaults.\nfunction make(funcs, baseVisitor) {\n var visitor = Object.create(baseVisitor || base);\n for (var type in funcs) { visitor[type] = funcs[type]; }\n return visitor\n}\n\nfunction skipThrough(node, st, c) { c(node, st); }\nfunction ignore(_node, _st, _c) {}\n\n// Node walkers.\n\nvar base = {};\n\nbase.Program = base.BlockStatement = base.StaticBlock = function (node, st, c) {\n for (var i = 0, list = node.body; i < list.length; i += 1)\n {\n var stmt = list[i];\n\n c(stmt, st, \"Statement\");\n }\n};\nbase.Statement = skipThrough;\nbase.EmptyStatement = ignore;\nbase.ExpressionStatement = base.ParenthesizedExpression = base.ChainExpression =\n function (node, st, c) { return c(node.expression, st, \"Expression\"); };\nbase.IfStatement = function (node, st, c) {\n c(node.test, st, \"Expression\");\n c(node.consequent, st, \"Statement\");\n if (node.alternate) { c(node.alternate, st, \"Statement\"); }\n};\nbase.LabeledStatement = function (node, st, c) { return c(node.body, st, \"Statement\"); };\nbase.BreakStatement = base.ContinueStatement = ignore;\nbase.WithStatement = function (node, st, c) {\n c(node.object, st, \"Expression\");\n c(node.body, st, \"Statement\");\n};\nbase.SwitchStatement = function (node, st, c) {\n c(node.discriminant, st, \"Expression\");\n for (var i = 0, list = node.cases; i < list.length; i += 1) {\n var cs = list[i];\n\n c(cs, st);\n }\n};\nbase.SwitchCase = function (node, st, c) {\n if (node.test) { c(node.test, st, \"Expression\"); }\n for (var i = 0, list = node.consequent; i < list.length; i += 1)\n {\n var cons = list[i];\n\n c(cons, st, \"Statement\");\n }\n};\nbase.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) {\n if (node.argument) { c(node.argument, st, \"Expression\"); }\n};\nbase.ThrowStatement = base.SpreadElement =\n function (node, st, c) { return c(node.argument, st, \"Expression\"); };\nbase.TryStatement = function (node, st, c) {\n c(node.block, st, \"Statement\");\n if (node.handler) { c(node.handler, st); }\n if (node.finalizer) { c(node.finalizer, st, \"Statement\"); }\n};\nbase.CatchClause = function (node, st, c) {\n if (node.param) { c(node.param, st, \"Pattern\"); }\n c(node.body, st, \"Statement\");\n};\nbase.WhileStatement = base.DoWhileStatement = function (node, st, c) {\n c(node.test, st, \"Expression\");\n c(node.body, st, \"Statement\");\n};\nbase.ForStatement = function (node, st, c) {\n if (node.init) { c(node.init, st, \"ForInit\"); }\n if (node.test) { c(node.test, st, \"Expression\"); }\n if (node.update) { c(node.update, st, \"Expression\"); }\n c(node.body, st, \"Statement\");\n};\nbase.ForInStatement = base.ForOfStatement = function (node, st, c) {\n c(node.left, st, \"ForInit\");\n c(node.right, st, \"Expression\");\n c(node.body, st, \"Statement\");\n};\nbase.ForInit = function (node, st, c) {\n if (node.type === \"VariableDeclaration\") { c(node, st); }\n else { c(node, st, \"Expression\"); }\n};\nbase.DebuggerStatement = ignore;\n\nbase.FunctionDeclaration = function (node, st, c) { return c(node, st, \"Function\"); };\nbase.VariableDeclaration = function (node, st, c) {\n for (var i = 0, list = node.declarations; i < list.length; i += 1)\n {\n var decl = list[i];\n\n c(decl, st);\n }\n};\nbase.VariableDeclarator = function (node, st, c) {\n c(node.id, st, \"Pattern\");\n if (node.init) { c(node.init, st, \"Expression\"); }\n};\n\nbase.Function = function (node, st, c) {\n if (node.id) { c(node.id, st, \"Pattern\"); }\n for (var i = 0, list = node.params; i < list.length; i += 1)\n {\n var param = list[i];\n\n c(param, st, \"Pattern\");\n }\n c(node.body, st, node.expression ? \"Expression\" : \"Statement\");\n};\n\nbase.Pattern = function (node, st, c) {\n if (node.type === \"Identifier\")\n { c(node, st, \"VariablePattern\"); }\n else if (node.type === \"MemberExpression\")\n { c(node, st, \"MemberPattern\"); }\n else\n { c(node, st); }\n};\nbase.VariablePattern = ignore;\nbase.MemberPattern = skipThrough;\nbase.RestElement = function (node, st, c) { return c(node.argument, st, \"Pattern\"); };\nbase.ArrayPattern = function (node, st, c) {\n for (var i = 0, list = node.elements; i < list.length; i += 1) {\n var elt = list[i];\n\n if (elt) { c(elt, st, \"Pattern\"); }\n }\n};\nbase.ObjectPattern = function (node, st, c) {\n for (var i = 0, list = node.properties; i < list.length; i += 1) {\n var prop = list[i];\n\n if (prop.type === \"Property\") {\n if (prop.computed) { c(prop.key, st, \"Expression\"); }\n c(prop.value, st, \"Pattern\");\n } else if (prop.type === \"RestElement\") {\n c(prop.argument, st, \"Pattern\");\n }\n }\n};\n\nbase.Expression = skipThrough;\nbase.ThisExpression = base.Super = base.MetaProperty = ignore;\nbase.ArrayExpression = function (node, st, c) {\n for (var i = 0, list = node.elements; i < list.length; i += 1) {\n var elt = list[i];\n\n if (elt) { c(elt, st, \"Expression\"); }\n }\n};\nbase.ObjectExpression = function (node, st, c) {\n for (var i = 0, list = node.properties; i < list.length; i += 1)\n {\n var prop = list[i];\n\n c(prop, st);\n }\n};\nbase.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration;\nbase.SequenceExpression = function (node, st, c) {\n for (var i = 0, list = node.expressions; i < list.length; i += 1)\n {\n var expr = list[i];\n\n c(expr, st, \"Expression\");\n }\n};\nbase.TemplateLiteral = function (node, st, c) {\n for (var i = 0, list = node.quasis; i < list.length; i += 1)\n {\n var quasi = list[i];\n\n c(quasi, st);\n }\n\n for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1)\n {\n var expr = list$1[i$1];\n\n c(expr, st, \"Expression\");\n }\n};\nbase.TemplateElement = ignore;\nbase.UnaryExpression = base.UpdateExpression = function (node, st, c) {\n c(node.argument, st, \"Expression\");\n};\nbase.BinaryExpression = base.LogicalExpression = function (node, st, c) {\n c(node.left, st, \"Expression\");\n c(node.right, st, \"Expression\");\n};\nbase.AssignmentExpression = base.AssignmentPattern = function (node, st, c) {\n c(node.left, st, \"Pattern\");\n c(node.right, st, \"Expression\");\n};\nbase.ConditionalExpression = function (node, st, c) {\n c(node.test, st, \"Expression\");\n c(node.consequent, st, \"Expression\");\n c(node.alternate, st, \"Expression\");\n};\nbase.NewExpression = base.CallExpression = function (node, st, c) {\n c(node.callee, st, \"Expression\");\n if (node.arguments)\n { for (var i = 0, list = node.arguments; i < list.length; i += 1)\n {\n var arg = list[i];\n\n c(arg, st, \"Expression\");\n } }\n};\nbase.MemberExpression = function (node, st, c) {\n c(node.object, st, \"Expression\");\n if (node.computed) { c(node.property, st, \"Expression\"); }\n};\nbase.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) {\n if (node.declaration)\n { c(node.declaration, st, node.type === \"ExportNamedDeclaration\" || node.declaration.id ? \"Statement\" : \"Expression\"); }\n if (node.source) { c(node.source, st, \"Expression\"); }\n};\nbase.ExportAllDeclaration = function (node, st, c) {\n if (node.exported)\n { c(node.exported, st); }\n c(node.source, st, \"Expression\");\n};\nbase.ImportDeclaration = function (node, st, c) {\n for (var i = 0, list = node.specifiers; i < list.length; i += 1)\n {\n var spec = list[i];\n\n c(spec, st);\n }\n c(node.source, st, \"Expression\");\n};\nbase.ImportExpression = function (node, st, c) {\n c(node.source, st, \"Expression\");\n};\nbase.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.PrivateIdentifier = base.Literal = ignore;\n\nbase.TaggedTemplateExpression = function (node, st, c) {\n c(node.tag, st, \"Expression\");\n c(node.quasi, st, \"Expression\");\n};\nbase.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, \"Class\"); };\nbase.Class = function (node, st, c) {\n if (node.id) { c(node.id, st, \"Pattern\"); }\n if (node.superClass) { c(node.superClass, st, \"Expression\"); }\n c(node.body, st);\n};\nbase.ClassBody = function (node, st, c) {\n for (var i = 0, list = node.body; i < list.length; i += 1)\n {\n var elt = list[i];\n\n c(elt, st);\n }\n};\nbase.MethodDefinition = base.PropertyDefinition = base.Property = function (node, st, c) {\n if (node.computed) { c(node.key, st, \"Expression\"); }\n if (node.value) { c(node.value, st, \"Expression\"); }\n};\n\nexport { ancestor, base, findNodeAfter, findNodeAround, findNodeAt, findNodeBefore, full, fullAncestor, make, recursive, simple };\n",
17
+ "/**\n * TJS Linter\n *\n * Static analysis for TJS code:\n * - Unused variables\n * - Undefined variables\n * - Type mismatches (when __tjs metadata available)\n * - Unreachable code\n *\n * POC: Focus on variable usage first, then type checking.\n */\n\nimport type { Program, Node, Identifier, VariableDeclaration } from 'acorn'\nimport { parse } from './parser'\nimport * as walk from 'acorn-walk'\n\nexport interface LintDiagnostic {\n severity: 'error' | 'warning' | 'info'\n message: string\n line?: number\n column?: number\n rule: string\n}\n\nexport interface LintResult {\n diagnostics: LintDiagnostic[]\n valid: boolean\n}\n\nexport interface LintOptions {\n /** Check for unused variables */\n unusedVariables?: boolean\n /** Check for undefined variables */\n undefinedVariables?: boolean\n /** Check for unreachable code */\n unreachableCode?: boolean\n /** Warn about explicit `new` keyword usage (TJS makes classes callable without new) */\n noExplicitNew?: boolean\n /** Filename for error messages */\n filename?: string\n}\n\nconst DEFAULT_OPTIONS: LintOptions = {\n unusedVariables: true,\n undefinedVariables: true,\n unreachableCode: true,\n noExplicitNew: true,\n}\n\n/**\n * Lint TJS source code\n */\nexport function lint(source: string, options: LintOptions = {}): LintResult {\n const opts = { ...DEFAULT_OPTIONS, ...options }\n const diagnostics: LintDiagnostic[] = []\n\n // Parse the source\n let program: Program\n try {\n const result = parse(source, {\n filename: opts.filename,\n colonShorthand: true,\n })\n program = result.ast\n } catch (error: any) {\n return {\n diagnostics: [\n {\n severity: 'error',\n message: error.message,\n line: error.loc?.line,\n column: error.loc?.column,\n rule: 'parse-error',\n },\n ],\n valid: false,\n }\n }\n\n // Track variable declarations and usages per scope\n const scopes: Scope[] = [createScope()] // Global scope\n\n // First pass: collect all declarations\n walk.ancestor(program, {\n FunctionDeclaration(node: any, _state: any, _ancestors: any) {\n // Function creates new scope\n const scope = createScope()\n scopes.push(scope)\n\n // Add parameters to scope\n for (const param of node.params) {\n addDeclaration(scope, param, 'parameter')\n }\n\n // Function name is in parent scope\n if (node.id) {\n const parentScope = scopes[scopes.length - 2] || scopes[0]\n parentScope.declarations.set(node.id.name, {\n node: node.id,\n kind: 'function',\n used: false,\n })\n }\n },\n\n VariableDeclaration(node: VariableDeclaration) {\n const scope = scopes[scopes.length - 1]\n for (const decl of node.declarations) {\n if (decl.id.type === 'Identifier') {\n scope.declarations.set(decl.id.name, {\n node: decl.id,\n kind: node.kind as 'let' | 'const' | 'var',\n used: false,\n })\n }\n // TODO: handle destructuring patterns\n }\n },\n })\n\n // Second pass: check usages\n walk.simple(program, {\n Identifier(node: Identifier) {\n // Skip declaration sites (handled above)\n // This is a simplified check - just mark as used\n for (let i = scopes.length - 1; i >= 0; i--) {\n const decl = scopes[i].declarations.get(node.name)\n if (decl) {\n decl.used = true\n break\n }\n }\n },\n })\n\n // Report unused variables\n if (opts.unusedVariables) {\n for (const scope of scopes) {\n for (const [name, decl] of scope.declarations) {\n // Skip parameters starting with _ (intentionally unused)\n if (name.startsWith('_')) continue\n\n if (!decl.used && decl.kind !== 'function') {\n diagnostics.push({\n severity: 'warning',\n message: `'${name}' is declared but never used`,\n line: (decl.node as any).loc?.start?.line,\n column: (decl.node as any).loc?.start?.column,\n rule: 'no-unused-vars',\n })\n }\n }\n }\n }\n\n // Check for unreachable code\n if (opts.unreachableCode) {\n walk.simple(program, {\n BlockStatement(node: any) {\n let foundReturn = false\n for (const stmt of node.body) {\n if (foundReturn) {\n diagnostics.push({\n severity: 'warning',\n message: 'Unreachable code after return statement',\n line: stmt.loc?.start?.line,\n column: stmt.loc?.start?.column,\n rule: 'no-unreachable',\n })\n break // Only report once per block\n }\n if (stmt.type === 'ReturnStatement') {\n foundReturn = true\n }\n }\n },\n })\n }\n\n // Check for explicit `new` keyword usage\n // In TJS, classes are callable without `new`, so using `new` is unnecessary\n if (opts.noExplicitNew) {\n walk.simple(program, {\n NewExpression(node: any) {\n // Get the callee name\n let calleeName = 'class'\n if (node.callee.type === 'Identifier') {\n calleeName = node.callee.name\n } else if (node.callee.type === 'MemberExpression') {\n // e.g., new foo.Bar()\n if (node.callee.property.type === 'Identifier') {\n calleeName = node.callee.property.name\n }\n }\n\n diagnostics.push({\n severity: 'warning',\n message: `Unnecessary 'new' keyword. In TJS, classes are callable without 'new': ${calleeName}(...) instead of new ${calleeName}(...)`,\n line: node.loc?.start?.line,\n column: node.loc?.start?.column,\n rule: 'no-explicit-new',\n })\n },\n })\n }\n\n return {\n diagnostics,\n valid: diagnostics.filter((d) => d.severity === 'error').length === 0,\n }\n}\n\n// --- Internal types and helpers ---\n\ninterface Scope {\n declarations: Map<string, Declaration>\n}\n\ninterface Declaration {\n node: Node\n kind: 'let' | 'const' | 'var' | 'parameter' | 'function'\n used: boolean\n}\n\nfunction createScope(): Scope {\n return { declarations: new Map() }\n}\n\nfunction addDeclaration(scope: Scope, node: Node, kind: Declaration['kind']) {\n if (node.type === 'Identifier') {\n scope.declarations.set((node as Identifier).name, {\n node,\n kind,\n used: false,\n })\n } else if (\n node.type === 'AssignmentPattern' &&\n (node as any).left.type === 'Identifier'\n ) {\n scope.declarations.set((node as any).left.name, {\n node: (node as any).left,\n kind,\n used: false,\n })\n }\n // TODO: handle destructuring\n}\n\n/**\n * Questions/Notes for future:\n *\n * Q1: Should we integrate with __tjs metadata for cross-file type checking?\n * - Would need to load metadata from imported modules\n * - Could check function call arguments against declared parameter types\n *\n * Q2: How strict should undefined variable checking be?\n * - Currently relies on JS globals being available\n * - Could have a whitelist of known globals (console, Math, etc.)\n *\n * Q3: Should linting be incremental / cacheable?\n * - For large projects, re-linting everything is slow\n * - Could hash files and skip unchanged ones\n */\n",
18
+ "/**\n * TJS to WebAssembly Compiler (Proof of Concept)\n *\n * Compiles a subset of TJS to WebAssembly for performance-critical code.\n *\n * Supported subset:\n * - Numeric operations (+, -, *, /, %)\n * - Typed arrays (Float32Array, Float64Array, Int32Array, etc.)\n * - For loops with numeric bounds\n * - Basic conditionals\n *\n * The goal is to show that TJS can target WASM for hot paths while\n * maintaining the same source code with a JS fallback.\n */\n\nimport type { WasmBlock } from './parser'\n\n/**\n * WASM type codes\n */\nconst WasmType = {\n i32: 0x7f,\n i64: 0x7e,\n f32: 0x7d,\n f64: 0x7c,\n funcref: 0x70,\n externref: 0x6f,\n} as const\n\n/**\n * WASM section codes\n */\nconst Section = {\n custom: 0,\n type: 1,\n import: 2,\n function: 3,\n table: 4,\n memory: 5,\n global: 6,\n export: 7,\n start: 8,\n element: 9,\n code: 10,\n data: 11,\n} as const\n\n/**\n * WASM opcodes (subset we use)\n */\nconst Op = {\n // Control\n unreachable: 0x00,\n nop: 0x01,\n block: 0x02,\n loop: 0x03,\n if: 0x04,\n else: 0x05,\n end: 0x0b,\n br: 0x0c,\n br_if: 0x0d,\n return: 0x0f,\n call: 0x10,\n\n // Variable\n local_get: 0x20,\n local_set: 0x21,\n local_tee: 0x22,\n\n // Memory\n i32_load: 0x28,\n f32_load: 0x2a,\n f64_load: 0x2b,\n i32_store: 0x36,\n f32_store: 0x38,\n f64_store: 0x39,\n\n // Constants\n i32_const: 0x41,\n i64_const: 0x42,\n f32_const: 0x43,\n f64_const: 0x44,\n\n // Comparison\n i32_eqz: 0x45,\n i32_eq: 0x46,\n i32_ne: 0x47,\n i32_lt_s: 0x48,\n i32_lt_u: 0x49,\n i32_gt_s: 0x4a,\n i32_gt_u: 0x4b,\n i32_le_s: 0x4c,\n i32_le_u: 0x4d,\n i32_ge_s: 0x4e,\n i32_ge_u: 0x4f,\n\n f64_eq: 0x61,\n f64_ne: 0x62,\n f64_lt: 0x63,\n f64_gt: 0x64,\n f64_le: 0x65,\n f64_ge: 0x66,\n\n // Numeric i32\n i32_add: 0x6a,\n i32_sub: 0x6b,\n i32_mul: 0x6c,\n i32_div_s: 0x6d,\n i32_div_u: 0x6e,\n i32_rem_s: 0x6f,\n i32_rem_u: 0x70,\n\n // Numeric f64\n f64_add: 0xa0,\n f64_sub: 0xa1,\n f64_mul: 0xa2,\n f64_div: 0xa3,\n\n // Conversions\n i32_trunc_f64_s: 0xaa,\n f64_convert_i32_s: 0xb7,\n} as const\n\n/**\n * Encode an unsigned LEB128 integer\n */\nfunction encodeULEB128(value: number): number[] {\n const result: number[] = []\n do {\n let byte = value & 0x7f\n value >>>= 7\n if (value !== 0) byte |= 0x80\n result.push(byte)\n } while (value !== 0)\n return result\n}\n\n/**\n * Encode a signed LEB128 integer\n * Reserved for future use with signed WASM values\n */\nfunction _encodeSLEB128(value: number): number[] {\n const result: number[] = []\n let more = true\n while (more) {\n let byte = value & 0x7f\n value >>= 7\n if (\n (value === 0 && (byte & 0x40) === 0) ||\n (value === -1 && (byte & 0x40) !== 0)\n ) {\n more = false\n } else {\n byte |= 0x80\n }\n result.push(byte)\n }\n return result\n}\n\n/**\n * Encode a string as UTF-8 with length prefix\n */\nfunction encodeString(s: string): number[] {\n const bytes = new TextEncoder().encode(s)\n return [...encodeULEB128(bytes.length), ...bytes]\n}\n\n/**\n * Encode a vector (length-prefixed array)\n * Reserved for future use with WASM vectors\n */\nfunction _encodeVector(items: number[][]): number[] {\n return [...encodeULEB128(items.length), ...items.flat()]\n}\n\n/**\n * Encode a section\n */\nfunction encodeSection(id: number, contents: number[]): number[] {\n return [id, ...encodeULEB128(contents.length), ...contents]\n}\n\n/**\n * Compile result\n */\nexport interface WasmCompileResult {\n /** The compiled WebAssembly module bytes */\n bytes: Uint8Array\n /** Any warnings during compilation */\n warnings: string[]\n /** Whether compilation succeeded */\n success: boolean\n /** Error message if compilation failed */\n error?: string\n}\n\n/**\n * Compile a WASM block to WebAssembly\n *\n * The block's body is analyzed and compiled to WASM if possible.\n * Captured variables become function parameters.\n *\n * Currently supports:\n * - Numeric expressions with +, -, *, /\n * - Variable references (captured from scope)\n * - Return statements\n *\n * Future: loops, conditionals, typed array access\n */\nexport function compileToWasm(block: WasmBlock): WasmCompileResult {\n const warnings: string[] = []\n\n try {\n const body = block.body.trim()\n\n // For POC: match simple return <expr> pattern\n const returnMatch = body.match(/return\\s+(.+)/)\n if (!returnMatch) {\n return {\n bytes: new Uint8Array(),\n warnings: ['WASM block must have a return statement (for now)'],\n success: false,\n error: 'No return statement found',\n }\n }\n\n const expr = returnMatch[1].trim()\n\n // Use captured variables as parameters\n const params = block.captures.join(', ')\n\n // Build the WASM module\n const moduleBytes = buildWasmModule(params, expr, warnings)\n\n return {\n bytes: new Uint8Array(moduleBytes),\n warnings,\n success: true,\n }\n } catch (e: any) {\n return {\n bytes: new Uint8Array(),\n warnings,\n success: false,\n error: e.message,\n }\n }\n}\n\n/**\n * Build a complete WASM module for a simple numeric function\n */\nfunction buildWasmModule(\n params: string,\n expr: string,\n warnings: string[]\n): number[] {\n // Parse parameter names\n const paramNames = params\n .split(',')\n .map((p) => p.trim().split(':')[0].trim())\n .filter(Boolean)\n const numParams = paramNames.length\n\n // For POC: assume all params are f64 (doubles)\n // A real implementation would use type annotations\n\n // Compile the expression to WASM instructions\n const exprCode = compileExpression(expr, paramNames, warnings)\n\n // Magic number and version\n const header = [0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]\n\n // Type section: (f64, f64, ...) -> f64\n const paramTypes = new Array(numParams).fill(WasmType.f64)\n const typeSection = encodeSection(Section.type, [\n 0x01, // one type\n 0x60, // func type\n ...encodeULEB128(numParams),\n ...paramTypes,\n 0x01,\n WasmType.f64, // one f64 return\n ])\n\n // Function section: function 0 has type 0\n const funcSection = encodeSection(Section.function, [\n 0x01, // one function\n 0x00, // type index 0\n ])\n\n // Export section: export function as \"compute\"\n const exportSection = encodeSection(Section.export, [\n 0x01, // one export\n ...encodeString('compute'),\n 0x00, // export kind: function\n 0x00, // function index 0\n ])\n\n // Code section\n const funcBody = [\n 0x00, // no locals\n ...exprCode,\n Op.end,\n ]\n const codeSection = encodeSection(Section.code, [\n 0x01, // one function\n ...encodeULEB128(funcBody.length),\n ...funcBody,\n ])\n\n return [\n ...header,\n ...typeSection,\n ...funcSection,\n ...exportSection,\n ...codeSection,\n ]\n}\n\n/**\n * Compile a simple expression to WASM instructions\n *\n * Supports: +, -, *, /, identifiers, numbers\n */\nfunction compileExpression(\n expr: string,\n params: string[],\n warnings: string[]\n): number[] {\n expr = expr.trim()\n\n // Try to parse as a number\n const num = parseFloat(expr)\n if (!isNaN(num) && /^-?\\d+(\\.\\d+)?$/.test(expr)) {\n // f64.const\n const buffer = new ArrayBuffer(8)\n new Float64Array(buffer)[0] = num\n return [Op.f64_const, ...new Uint8Array(buffer)]\n }\n\n // Try to parse as an identifier (parameter reference)\n if (/^\\w+$/.test(expr)) {\n const idx = params.indexOf(expr)\n if (idx >= 0) {\n return [Op.local_get, ...encodeULEB128(idx)]\n }\n warnings.push(`Unknown identifier: ${expr}`)\n return [Op.f64_const, 0, 0, 0, 0, 0, 0, 0, 0] // 0.0\n }\n\n // Try to parse binary operations (simple left-to-right for POC)\n // Find the last +/- at depth 0 (lowest precedence)\n let depth = 0\n let lastOp = -1\n let lastOpChar = ''\n\n for (let i = expr.length - 1; i >= 0; i--) {\n const c = expr[i]\n if (c === ')') depth++\n else if (c === '(') depth--\n else if (depth === 0 && (c === '+' || c === '-') && i > 0) {\n // Make sure it's not a unary minus - check previous non-whitespace char\n let prevIdx = i - 1\n while (prevIdx >= 0 && /\\s/.test(expr[prevIdx])) prevIdx--\n const prevChar = prevIdx >= 0 ? expr[prevIdx] : ''\n // It's binary if previous is alphanumeric or closing paren\n if (prevChar && /[\\w)]/.test(prevChar)) {\n lastOp = i\n lastOpChar = c\n break\n }\n }\n }\n\n // If no +/-, look for * or /\n if (lastOp === -1) {\n depth = 0\n for (let i = expr.length - 1; i >= 0; i--) {\n const c = expr[i]\n if (c === ')') depth++\n else if (c === '(') depth--\n else if (depth === 0 && (c === '*' || c === '/')) {\n lastOp = i\n lastOpChar = c\n break\n }\n }\n }\n\n if (lastOp > 0) {\n const left = expr.slice(0, lastOp).trim()\n const right = expr.slice(lastOp + 1).trim()\n\n const leftCode = compileExpression(left, params, warnings)\n const rightCode = compileExpression(right, params, warnings)\n\n let opcode: number\n switch (lastOpChar) {\n case '+':\n opcode = Op.f64_add\n break\n case '-':\n opcode = Op.f64_sub\n break\n case '*':\n opcode = Op.f64_mul\n break\n case '/':\n opcode = Op.f64_div\n break\n default:\n opcode = Op.f64_add\n }\n\n return [...leftCode, ...rightCode, opcode]\n }\n\n // Handle parentheses\n if (expr.startsWith('(') && expr.endsWith(')')) {\n return compileExpression(expr.slice(1, -1), params, warnings)\n }\n\n warnings.push(`Could not compile expression: ${expr}`)\n return [Op.f64_const, 0, 0, 0, 0, 0, 0, 0, 0] // 0.0\n}\n\n/**\n * Instantiate a compiled WASM module\n */\nexport async function instantiateWasm(\n bytes: Uint8Array\n): Promise<WebAssembly.Instance> {\n const module = await WebAssembly.compile(bytes)\n return WebAssembly.instantiate(module)\n}\n\n/**\n * Compile and register a WASM block globally\n *\n * This is the main entry point for runtime WASM compilation.\n * Call this during module initialization to enable WASM acceleration.\n */\nexport async function registerWasmBlock(block: WasmBlock): Promise<boolean> {\n const result = compileToWasm(block)\n\n if (!result.success) {\n console.warn(`WASM compilation failed for ${block.id}:`, result.error)\n return false\n }\n\n try {\n const instance = await instantiateWasm(result.bytes)\n const compute = instance.exports.compute as (...args: number[]) => number\n\n // Register globally so the dispatch code can find it\n ;(globalThis as any)[block.id] = compute\n\n return true\n } catch (e) {\n console.warn(`WASM instantiation failed for ${block.id}:`, e)\n return false\n }\n}\n\n/**\n * Compile all WASM blocks from a preprocessed source\n */\nexport async function compileWasmBlocks(blocks: WasmBlock[]): Promise<{\n compiled: number\n failed: number\n errors: string[]\n}> {\n let compiled = 0\n let failed = 0\n const errors: string[] = []\n\n for (const block of blocks) {\n const success = await registerWasmBlock(block)\n if (success) {\n compiled++\n } else {\n failed++\n errors.push(`Failed to compile ${block.id}`)\n }\n }\n\n return { compiled, failed, errors }\n}\n",
19
+ "/**\n * IndexedDB-based cache for module metadata\n *\n * Caches transpilation results (AST, signatures, type info) to avoid\n * re-parsing unchanged source code. Particularly useful for:\n * - Playground editors (instant feedback on unchanged code)\n * - Autocomplete metadata retrieval\n * - Development workflows with rapid iteration\n *\n * @example\n * ```typescript\n * const cache = new MetadataCache()\n * await cache.open()\n *\n * // Check cache before transpiling\n * const cached = await cache.get(source)\n * if (cached) {\n * return cached // Skip transpilation\n * }\n *\n * // Transpile and cache\n * const result = transpile(source)\n * await cache.set(source, result)\n * ```\n */\n\nimport type { SeqNode } from '../builder'\nimport type { FunctionSignature, TranspileWarning } from './types'\nimport type { TJSTypeInfo } from './emitters/js'\nimport { TJS_VERSION } from './runtime'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Cached entry for AsyncJS transpilation (ajs/transpile) */\nexport interface CachedTranspileResult {\n ast: SeqNode\n signature: FunctionSignature\n warnings: TranspileWarning[]\n}\n\n/** Cached entry for TJS transpilation (tjs/transpileToJS) */\nexport interface CachedTJSResult {\n code: string\n types: TJSTypeInfo\n testRunner?: string\n testCount?: number\n warnings?: string[]\n}\n\n/** Full cache entry stored in IndexedDB */\nexport interface CacheEntry {\n /** SHA-256 hash of source + version */\n hash: string\n /** TJS version used during transpilation */\n version: string\n /** Timestamp when cached */\n timestamp: number\n /** AsyncJS transpilation result */\n transpile?: CachedTranspileResult\n /** TJS transpilation result */\n tjs?: CachedTJSResult\n}\n\n/** Cache statistics */\nexport interface CacheStats {\n /** Number of entries in cache */\n entries: number\n /** Total bytes used (approximate) */\n bytes: number\n /** Cache hit count this session */\n hits: number\n /** Cache miss count this session */\n misses: number\n /** Hit rate (hits / (hits + misses)) */\n hitRate: number\n}\n\n// ============================================================================\n// Hash utilities\n// ============================================================================\n\n/**\n * Compute SHA-256 hash of source code + version\n * Falls back to simple hash if crypto.subtle unavailable\n */\nexport async function hashSource(source: string): Promise<string> {\n const input = `${TJS_VERSION}:${source}`\n\n // Try crypto.subtle (available in browsers and Node 15+)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const encoder = new TextEncoder()\n const data = encoder.encode(input)\n const hashBuffer = await crypto.subtle.digest('SHA-256', 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: simple djb2 hash (good enough for cache keys)\n let hash = 5381\n for (let i = 0; i < input.length; i++) {\n hash = ((hash << 5) + hash + input.charCodeAt(i)) >>> 0\n }\n return hash.toString(16)\n}\n\n/**\n * Synchronous hash for environments without async support\n * Uses djb2 algorithm\n */\nexport function hashSourceSync(source: string): string {\n const input = `${TJS_VERSION}:${source}`\n let hash = 5381\n for (let i = 0; i < input.length; i++) {\n hash = ((hash << 5) + hash + input.charCodeAt(i)) >>> 0\n }\n return hash.toString(16)\n}\n\n// ============================================================================\n// MetadataCache class\n// ============================================================================\n\nconst DB_NAME = 'tjs-metadata-cache'\nconst DB_VERSION = 1\nconst STORE_NAME = 'modules'\n\n/**\n * IndexedDB-based metadata cache\n *\n * Thread-safe and persistent across browser sessions.\n * Automatically handles versioning - entries from old TJS versions\n * are ignored (stale data won't cause issues).\n */\nexport class MetadataCache {\n private db: IDBDatabase | null = null\n private stats = { hits: 0, misses: 0 }\n private pendingOpen: Promise<void> | null = null\n\n /**\n * Open the cache database\n * Safe to call multiple times - will reuse existing connection\n */\n async open(): Promise<void> {\n if (this.db) return\n\n // Prevent multiple simultaneous opens\n if (this.pendingOpen) {\n return this.pendingOpen\n }\n\n this.pendingOpen = this._open()\n await this.pendingOpen\n this.pendingOpen = null\n }\n\n private async _open(): Promise<void> {\n return new Promise((resolve, _reject) => {\n if (typeof indexedDB === 'undefined') {\n // IndexedDB not available (Node.js without polyfill, etc.)\n resolve()\n return\n }\n\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n\n request.onerror = () => {\n // Don't fail hard - cache is optional\n console.warn('MetadataCache: Failed to open IndexedDB', request.error)\n resolve()\n }\n\n request.onsuccess = () => {\n this.db = request.result\n resolve()\n }\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n\n // Create modules store with hash as key\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'hash' })\n store.createIndex('timestamp', 'timestamp')\n store.createIndex('version', 'version')\n }\n }\n })\n }\n\n /**\n * Get cached entry by source code\n * Returns undefined if not cached or version mismatch\n */\n async get(source: string): Promise<CacheEntry | undefined> {\n if (!this.db) {\n this.stats.misses++\n return undefined\n }\n\n const hash = await hashSource(source)\n\n return new Promise((resolve) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.get(hash)\n\n request.onerror = () => {\n this.stats.misses++\n resolve(undefined)\n }\n\n request.onsuccess = () => {\n const entry = request.result as CacheEntry | undefined\n\n // Validate version\n if (entry && entry.version !== TJS_VERSION) {\n this.stats.misses++\n resolve(undefined)\n return\n }\n\n if (entry) {\n this.stats.hits++\n } else {\n this.stats.misses++\n }\n resolve(entry)\n }\n })\n }\n\n /**\n * Get cached transpile result (AsyncJS -> AST)\n */\n async getTranspile(\n source: string\n ): Promise<CachedTranspileResult | undefined> {\n const entry = await this.get(source)\n return entry?.transpile\n }\n\n /**\n * Get cached TJS result (TJS -> JS)\n */\n async getTJS(source: string): Promise<CachedTJSResult | undefined> {\n const entry = await this.get(source)\n return entry?.tjs\n }\n\n /**\n * Store transpile result\n */\n async setTranspile(\n source: string,\n result: CachedTranspileResult\n ): Promise<void> {\n await this._set(source, { transpile: result })\n }\n\n /**\n * Store TJS result\n */\n async setTJS(source: string, result: CachedTJSResult): Promise<void> {\n await this._set(source, { tjs: result })\n }\n\n /**\n * Store or update cache entry\n */\n private async _set(\n source: string,\n data: { transpile?: CachedTranspileResult; tjs?: CachedTJSResult }\n ): Promise<void> {\n if (!this.db) return\n\n const hash = await hashSource(source)\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n\n // Get existing entry to merge\n const getRequest = store.get(hash)\n\n getRequest.onsuccess = () => {\n const existing = getRequest.result as CacheEntry | undefined\n\n const entry: CacheEntry = {\n hash,\n version: TJS_VERSION,\n timestamp: Date.now(),\n transpile: data.transpile ?? existing?.transpile,\n tjs: data.tjs ?? existing?.tjs,\n }\n\n const putRequest = store.put(entry)\n putRequest.onerror = () => reject(putRequest.error)\n putRequest.onsuccess = () => resolve()\n }\n\n getRequest.onerror = () => reject(getRequest.error)\n })\n }\n\n /**\n * Delete a specific entry\n */\n async delete(source: string): Promise<void> {\n if (!this.db) return\n\n const hash = await hashSource(source)\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.delete(hash)\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => resolve()\n })\n }\n\n /**\n * Clear all cached entries\n */\n async clear(): Promise<void> {\n if (!this.db) return\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.clear()\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => {\n this.stats = { hits: 0, misses: 0 }\n resolve()\n }\n })\n }\n\n /**\n * Remove entries older than maxAge milliseconds\n * Returns count of entries removed\n */\n async prune(maxAge: number): Promise<number> {\n if (!this.db) return 0\n\n const cutoff = Date.now() - maxAge\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const index = store.index('timestamp')\n const range = IDBKeyRange.upperBound(cutoff)\n\n let count = 0\n const request = index.openCursor(range)\n\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n cursor.delete()\n count++\n cursor.continue()\n } else {\n resolve(count)\n }\n }\n\n request.onerror = () => reject(request.error)\n })\n }\n\n /**\n * Remove entries from old TJS versions\n * Returns count of entries removed\n */\n async pruneOldVersions(): Promise<number> {\n if (!this.db) return 0\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n\n let count = 0\n const request = store.openCursor()\n\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n const entry = cursor.value as CacheEntry\n if (entry.version !== TJS_VERSION) {\n cursor.delete()\n count++\n }\n cursor.continue()\n } else {\n resolve(count)\n }\n }\n\n request.onerror = () => reject(request.error)\n })\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const entries = await this.count()\n const bytes = await this.estimateSize()\n\n const total = this.stats.hits + this.stats.misses\n const hitRate = total > 0 ? this.stats.hits / total : 0\n\n return {\n entries,\n bytes,\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n }\n }\n\n /**\n * Count entries in cache\n */\n async count(): Promise<number> {\n if (!this.db) return 0\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.count()\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => resolve(request.result)\n })\n }\n\n /**\n * Estimate storage size in bytes\n */\n async estimateSize(): Promise<number> {\n if (!this.db) return 0\n\n // Use Storage API if available\n if (typeof navigator !== 'undefined' && navigator.storage?.estimate) {\n try {\n const estimate = await navigator.storage.estimate()\n return estimate.usage ?? 0\n } catch {\n // Fall through to manual estimation\n }\n }\n\n // Manual estimation by iterating entries\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n\n let totalSize = 0\n const request = store.openCursor()\n\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n // Rough estimate: JSON string length * 2 (UTF-16)\n totalSize += JSON.stringify(cursor.value).length * 2\n cursor.continue()\n } else {\n resolve(totalSize)\n }\n }\n\n request.onerror = () => reject(request.error)\n })\n }\n\n /**\n * Close the database connection\n */\n close(): void {\n if (this.db) {\n this.db.close()\n this.db = null\n }\n }\n\n /**\n * Check if cache is available (IndexedDB accessible)\n */\n isAvailable(): boolean {\n return this.db !== null\n }\n\n /**\n * Reset session statistics\n */\n resetStats(): void {\n this.stats = { hits: 0, misses: 0 }\n }\n}\n\n// ============================================================================\n// Global cache instance\n// ============================================================================\n\nlet globalCache: MetadataCache | null = null\n\n/**\n * Get or create the global cache instance\n * Automatically opens the database on first call\n */\nexport async function getGlobalCache(): Promise<MetadataCache> {\n if (!globalCache) {\n globalCache = new MetadataCache()\n await globalCache.open()\n }\n return globalCache\n}\n\n/**\n * Set a custom global cache instance (for testing)\n */\nexport function setGlobalCache(cache: MetadataCache | null): void {\n globalCache = cache\n}\n",
20
+ "/**\n * AsyncJS Transpiler\n *\n * Transforms AsyncJS (\"Better JavaScript\") into tjs-lang AST.\n *\n * @example\n * ```typescript\n * import { ajs, transpile } from 'tjs-lang'\n *\n * // Simple function\n * const ast = ajs(`\n * function greet({ name }) {\n * let msg = template({ tmpl: 'Hello {{name}}', vars: { name } })\n * return { msg }\n * }\n * `)\n *\n * // Execute\n * const vm = new AgentVM()\n * await vm.run(ast, { name: 'World' })\n * ```\n */\n\nimport type { SeqNode } from '../builder'\nimport type {\n TranspileOptions,\n TranspileResult,\n FunctionSignature,\n} from './types'\nimport { parse, validateSingleFunction } from './parser'\nimport { transformFunction } from './emitters/ast'\n\nexport * from './types'\nexport { parse, preprocess, extractTDoc } from './parser'\nexport { transformFunction } from './emitters/ast'\nexport {\n transpileToJS,\n stripModuleSyntax,\n stripTjsPreamble,\n type TJSTranspileOptions,\n type TJSTranspileResult,\n type TJSTypeInfo,\n} from './emitters/js'\nexport {\n fromTS,\n type FromTSOptions,\n type FromTSResult,\n} from './emitters/from-ts'\nexport * from './inference'\nexport { Schema } from './schema'\nexport {\n lint,\n type LintResult,\n type LintDiagnostic,\n type LintOptions,\n} from './linter'\nexport {\n extractTests,\n assertFunction,\n expectFunction,\n testUtils,\n type ExtractedTest,\n type ExtractedMock,\n type TestExtractionResult,\n} from './tests'\nexport {\n runtime,\n installRuntime,\n isError,\n error,\n typeOf,\n checkType,\n validateArgs,\n wrap,\n emitRuntimeWrapper,\n TJS_VERSION,\n type TJSError,\n} from './runtime'\nexport {\n compileToWasm,\n instantiateWasm,\n registerWasmBlock,\n compileWasmBlocks,\n type WasmCompileResult,\n} from './wasm'\nexport type { WasmBlock } from './parser'\nexport {\n MetadataCache,\n getGlobalCache,\n setGlobalCache,\n hashSource,\n hashSourceSync,\n type CacheEntry,\n type CachedTranspileResult,\n type CachedTJSResult,\n type CacheStats,\n} from './metadata-cache'\n\n/**\n * Transpile JavaScript source code to Agent99 AST\n *\n * @param source - JavaScript source code containing a single function\n * @param options - Transpilation options\n * @returns The AST, signature, and any warnings\n *\n * @example\n * ```typescript\n * const result = transpile(`\n * function search(query: 'string', limit = 10) {\n * let results = storeSearch({ query, limit })\n * return { results }\n * }\n * `)\n *\n * console.log(result.signature)\n * // {\n * // name: 'search',\n * // parameters: {\n * // query: { type: 'string', required: true },\n * // limit: { type: 'number', required: false, default: 10 }\n * // }\n * // }\n * ```\n */\nexport function transpile(\n source: string,\n options: TranspileOptions = {}\n): TranspileResult {\n // Parse the source\n // vmTarget: true because AJS runs in the VM which handles == correctly\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 // Validate structure\n const func = validateSingleFunction(program, options.filename)\n\n // Transform to Agent99 AST\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 * Works as both a function and a tagged template literal.\n *\n * @example\n * ```typescript\n * // As a function\n * const ast = ajs(`\n * function agent({ topic }) {\n * let results = search({ query: topic })\n * return { results }\n * }\n * `)\n *\n * // As a tagged template literal\n * const ast2 = ajs`\n * function greet({ name }) {\n * let msg = template({ tmpl: 'Hello {{name}}', vars: { name } })\n * return { msg }\n * }\n * `\n * ```\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 // Tagged template literal\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 * Transpile TJS source to JavaScript with type metadata.\n * Works as both a function and a tagged template literal.\n *\n * @example\n * ```typescript\n * // As a function\n * const result = tjs(`\n * function greet(name: 'world') -> '' {\n * return \\`Hello, \\${name}!\\`\n * }\n * `)\n * console.log(result.code)\n * // function greet(name = 'world') { return \\`Hello, \\${name}!\\` }\n * // greet.__tjs = { params: { name: { type: 'string', required: true } }, returns: { type: 'string' } }\n *\n * // As a tagged template literal\n * const result2 = tjs`\n * function add(a: 0, b: 0) -> 0 {\n * return a + b\n * }\n * `\n * ```\n */\nimport {\n transpileToJS,\n type TJSTranspileResult,\n type TJSTranspileOptions,\n} from './emitters/js'\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// ============================================================================\n// Cached transpilation functions\n// ============================================================================\n\n/**\n * Transpile with caching support\n *\n * Uses IndexedDB to cache transpilation results. On cache hit,\n * returns immediately without re-parsing. Particularly useful for\n * playground editors and development workflows.\n *\n * @example\n * ```typescript\n * const cache = new MetadataCache()\n * await cache.open()\n *\n * // First call: parses and caches\n * const result1 = await transpileWithCache(source, {}, cache)\n *\n * // Second call: returns from cache\n * const result2 = await transpileWithCache(source, {}, cache)\n * ```\n */\nexport async function transpileWithCache(\n source: string,\n options: TranspileOptions = {},\n cache?: MetadataCache\n): Promise<TranspileResult> {\n const effectiveCache = cache ?? (await getGlobalCache())\n\n // Try cache first\n const cached = await effectiveCache.getTranspile(source)\n if (cached) {\n return {\n ast: cached.ast,\n signature: cached.signature,\n warnings: cached.warnings,\n }\n }\n\n // Cache miss - transpile\n const result = transpile(source, options)\n\n // Store in cache (don't await - fire and forget)\n effectiveCache.setTranspile(source, {\n ast: result.ast,\n signature: result.signature,\n warnings: result.warnings,\n })\n\n return result\n}\n\n/**\n * Transpile TJS to JavaScript with caching support\n *\n * @example\n * ```typescript\n * const cache = new MetadataCache()\n * await cache.open()\n *\n * // First call: transpiles and caches\n * const result1 = await tjsWithCache(source, {}, cache)\n *\n * // Second call: returns from cache\n * const result2 = await tjsWithCache(source, {}, cache)\n * ```\n */\nexport async function tjsWithCache(\n source: string,\n options: import('./emitters/js').TJSTranspileOptions = {},\n cache?: MetadataCache\n): Promise<import('./emitters/js').TJSTranspileResult> {\n const effectiveCache = cache ?? (await getGlobalCache())\n\n // Try cache first\n const cached = await effectiveCache.getTJS(source)\n if (cached) {\n return {\n code: cached.code,\n types: cached.types,\n metadata: cached.types, // alias\n testRunner: cached.testRunner,\n testCount: cached.testCount,\n warnings: cached.warnings,\n }\n }\n\n // Cache miss - transpile\n const result = transpileToJS(source, options)\n\n // Store in cache (don't await - fire and forget)\n effectiveCache.setTJS(source, {\n code: result.code,\n types: result.types,\n testRunner: result.testRunner,\n testCount: result.testCount,\n warnings: result.warnings,\n })\n\n return result\n}\n\n/**\n * Create a function with attached signature for introspection\n *\n * This wraps the transpiled AST in a callable that includes\n * the .signature property for self-documentation.\n *\n * @example\n * ```typescript\n * const search = createAgent(`\n * function search(query: 'string', limit = 10) {\n * let results = storeSearch({ query, limit })\n * return { results }\n * }\n * `, vm)\n *\n * // Introspect\n * console.log(search.signature.parameters)\n *\n * // Execute\n * const result = await search({ query: 'hello' })\n * ```\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 // Attach metadata\n ;(agent as any).signature = signature\n ;(agent as any).ast = ast\n\n return agent as any\n}\n\n/**\n * Get tool definitions from a set of agent functions\n *\n * This converts function signatures to OpenAI-compatible tool definitions.\n *\n * @example\n * ```typescript\n * const search = createAgent(searchSource, vm)\n * const summarize = createAgent(summarizeSource, vm)\n *\n * const tools = getToolDefinitions({ search, summarize })\n * // Ready to pass to LLM API\n * ```\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: sig.name || name,\n description: sig.description,\n parameters: {\n type: 'object' as const,\n properties,\n required,\n },\n },\n }\n })\n}\n\n/**\n * Convert TypeDescriptor to JSON Schema\n */\nfunction typeDescriptorToJsonSchema(\n type: import('./types').TypeDescriptor\n): 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",
21
+ "import { s, validate, filter as schemaFilter } from 'tosijs-schema'\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 left == right\n case '!=':\n return 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 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 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: 1 }\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 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",
22
+ "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",
23
+ "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'\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 procedure token to AST if needed\n let ast: BaseNode\n if (typeof astOrToken === 'string') {\n if (isProcedureToken(astOrToken)) {\n ast = resolveProcedureToken(astOrToken) as BaseNode\n } else {\n throw new Error(\n `Invalid argument: expected AST or procedure token (starting with 'proc_'), got string: ${astOrToken}`\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",
24
+ "import { s } from 'tosijs-schema'\nimport { defineAtom, resolveValue } from '../runtime'\n\n// --- Interfaces ---\n\ninterface VectorBattery {\n embed(text: string): Promise<number[]>\n}\n\ninterface StoreBattery {\n createCollection(\n name: string,\n schema?: any,\n dimension?: number\n ): Promise<void>\n vectorAdd(collection: string, doc: any): Promise<void>\n vectorSearch(\n collection: string,\n vector: number[],\n k?: number,\n filter?: any\n ): Promise<any[]>\n}\n\ninterface LLMBattery {\n predict(\n system: string,\n user: string,\n tools?: any[],\n responseFormat?: any\n ): Promise<any>\n}\n\n// --- Atoms ---\n\n// store.vectorize\nexport const storeVectorize = defineAtom(\n 'storeVectorize',\n s.object({\n text: s.string,\n model: s.string.optional,\n }),\n s.array(s.number),\n async ({ text }, ctx) => {\n const vectorCap = ctx.capabilities.vector as VectorBattery\n if (!vectorCap)\n throw new Error(\n \"Capability 'vector' missing. Ensure vector battery is loaded.\"\n )\n\n const resolvedText = resolveValue(text, ctx)\n return vectorCap.embed(resolvedText)\n },\n { docs: 'Generate embeddings using vector battery', cost: 20 }\n)\n\n// store.createCollection\nexport const storeCreateCollection = defineAtom(\n 'storeCreateCollection',\n s.object({\n collection: s.string,\n dimension: s.number.optional,\n }),\n undefined,\n async ({ collection, dimension }, ctx) => {\n const storeCap = ctx.capabilities.store as unknown as StoreBattery\n if (!storeCap?.createCollection)\n throw new Error(\n \"Capability 'store' missing or does not support createCollection.\"\n )\n\n const resolvedColl = resolveValue(collection, ctx)\n const resolvedDim = resolveValue(dimension, ctx)\n\n return storeCap.createCollection(resolvedColl, undefined, resolvedDim)\n },\n { docs: 'Create a vector store collection', cost: 5 }\n)\n\n// store.vectorAdd\nexport const storeVectorAdd = defineAtom(\n 'storeVectorAdd',\n s.object({\n collection: s.string,\n doc: s.any,\n }),\n undefined,\n async ({ collection, doc }, ctx) => {\n const storeCap = ctx.capabilities.store as unknown as StoreBattery\n if (!storeCap?.vectorAdd)\n throw new Error(\n \"Capability 'store' missing or does not support vectorAdd.\"\n )\n\n const resolvedColl = resolveValue(collection, ctx)\n const resolvedDoc = resolveValue(doc, ctx)\n\n return storeCap.vectorAdd(resolvedColl, resolvedDoc)\n },\n { docs: 'Add a document to a vector store collection', cost: 5 }\n)\n\n// store.search (Vector Search)\nexport const storeSearch = defineAtom(\n 'storeSearch',\n s.object({\n collection: s.string,\n queryVector: s.array(s.number),\n k: s.number.optional,\n filter: s.record(s.any).optional,\n }),\n s.array(s.any),\n async ({ collection, queryVector, k, filter }, ctx) => {\n const storeCap = ctx.capabilities.store as unknown as StoreBattery\n if (!storeCap?.vectorSearch)\n throw new Error(\n \"Capability 'store' missing or does not support vectorSearch.\"\n )\n\n const resolvedColl = resolveValue(collection, ctx)\n const resolvedVec = resolveValue(queryVector, ctx)\n const resolvedK = resolveValue(k, ctx) ?? 5\n const resolvedFilter = resolveValue(filter, ctx)\n\n return storeCap.vectorSearch(\n resolvedColl,\n resolvedVec,\n resolvedK,\n resolvedFilter\n )\n },\n {\n docs: 'Search vector store',\n cost: (input, ctx) => 5 + (resolveValue(input.k, ctx) ?? 5),\n }\n)\n\n// llm.predict (Enhanced with system prompt support for battery)\nexport const llmPredictBattery = defineAtom(\n 'llmPredictBattery',\n s.object({\n system: s.string.optional,\n user: s.string,\n tools: s.array(s.any).optional,\n responseFormat: s.any.optional,\n }),\n s.object({\n content: s.string.optional,\n tool_calls: s.array(s.any).optional,\n }),\n async ({ system, user, tools, responseFormat }, ctx) => {\n const llmCap = ctx.capabilities.llmBattery as unknown as LLMBattery\n if (!llmCap?.predict)\n throw new Error(\"Capability 'llmBattery' missing or invalid.\")\n\n const resolvedSystem =\n resolveValue(system, ctx) ?? 'You are a helpful agent.'\n const resolvedUser = resolveValue(user, ctx)\n const resolvedTools = resolveValue(tools, ctx)\n const resolvedFormat = resolveValue(responseFormat, ctx)\n\n return llmCap.predict(\n resolvedSystem,\n resolvedUser,\n resolvedTools,\n resolvedFormat\n )\n },\n { docs: 'Generate completion using LLM battery', cost: 100 }\n)\n\n// Vision battery interface (multimodal)\ninterface VisionBattery {\n predict(\n system: string,\n user: { text: string; images?: string[] },\n tools?: any[],\n responseFormat?: any\n ): Promise<any>\n}\n\n// llm.vision - Analyze images using a vision-capable model\nexport const llmVision = defineAtom(\n 'llmVision',\n s.object({\n system: s.string.optional,\n prompt: s.string,\n images: s.array(s.string), // URLs or data URIs (data:image/...;base64,...)\n responseFormat: s.any.optional,\n }),\n s.object({\n content: s.string.optional,\n tool_calls: s.array(s.any).optional,\n }),\n async ({ system, prompt, images, responseFormat }, ctx) => {\n const llmCap = ctx.capabilities.llmBattery as unknown as VisionBattery\n if (!llmCap?.predict)\n throw new Error(\"Capability 'llmBattery' missing or invalid.\")\n\n const resolvedSystem =\n resolveValue(system, ctx) ??\n 'You analyze images accurately and concisely.'\n const resolvedPrompt = resolveValue(prompt, ctx)\n const resolvedImages = resolveValue(images, ctx) ?? []\n const resolvedFormat = resolveValue(responseFormat, ctx)\n\n return llmCap.predict(\n resolvedSystem,\n { text: resolvedPrompt, images: resolvedImages },\n undefined,\n resolvedFormat\n )\n },\n { docs: 'Analyze images using a vision model', timeoutMs: 120000, cost: 150 }\n)\n",
25
+ "import {\n storeCreateCollection,\n storeSearch,\n storeVectorAdd,\n storeVectorize,\n llmPredictBattery,\n llmVision,\n} from './batteries'\nimport { coreAtoms } from '../runtime'\n\nexport const batteryAtoms = {\n storeCreateCollection,\n storeSearch,\n storeVectorAdd,\n storeVectorize,\n llmPredictBattery,\n llmVision,\n}\n\nexport { coreAtoms }\n",
26
+ "/**\n * Store Capability Battery\n * Provides Key-Value storage and lightweight in-memory Vector Search.\n */\n\nexport interface StoreCapability {\n get(key: string): Promise<any>\n set(key: string, val: any): Promise<void>\n createCollection(\n name: string,\n schema?: any,\n dimension?: number\n ): Promise<void>\n vectorAdd(collection: string, doc: any): Promise<void>\n vectorSearch(collection: string, vector: number[], k?: number): Promise<any[]>\n}\n\n// In-memory KV store fallback\nconst kvStore = new Map<string, any>()\n// In-memory Vector store fallback\nconst collections = new Map<string, any[]>()\n\nexport function cosineSimilarity(vecA: number[], vecB: number[]): number {\n if (vecA.length !== vecB.length) {\n throw new Error('Vectors must have the same length for cosine similarity.')\n }\n let dotProduct = 0\n let magA = 0\n let magB = 0\n for (let i = 0; i < vecA.length; i++) {\n dotProduct += vecA[i] * vecB[i]\n magA += vecA[i] * vecA[i]\n magB += vecB[i] * vecB[i]\n }\n magA = Math.sqrt(magA)\n magB = Math.sqrt(magB)\n if (magA === 0 || magB === 0) {\n return 0\n }\n return dotProduct / (magA * magB)\n}\n\nexport function getStoreCapability(): StoreCapability {\n return {\n async get(key: string) {\n return kvStore.get(key)\n },\n\n async set(key: string, val: any) {\n kvStore.set(key, val)\n },\n\n async createCollection(name: string, _schema?: any, _dimension?: number) {\n if (collections.has(name)) {\n console.warn(`Collection '${name}' already exists. Overwriting.`)\n }\n collections.set(name, [])\n },\n\n async vectorAdd(collection: string, doc: any) {\n const db = collections.get(collection)\n if (!db)\n throw new Error(\n `Collection '${collection}' not found. Create it first.`\n )\n if (!doc.embedding || !Array.isArray(doc.embedding)) {\n throw new Error(\n \"Document must have an 'embedding' property that is an array of numbers.\"\n )\n }\n db.push(doc)\n },\n\n async vectorSearch(collection: string, vector: number[], k = 5) {\n const db = collections.get(collection)\n if (!db)\n throw new Error(\n `Collection '${collection}' not found. Create it first.`\n )\n\n const scoredDocs = db.map((doc) => ({\n doc,\n score: cosineSimilarity(vector, doc.embedding),\n }))\n\n scoredDocs.sort((a, b) => b.score - a.score)\n\n return scoredDocs.slice(0, k).map((item) => item.doc)\n },\n }\n}\n",
27
+ "import { LocalModels } from './models'\n\n/**\n * LLM Capability Battery\n * Bridges to local LM Studio instance via HTTP.\n */\n\n/**\n * User content can be a simple string or multimodal with images.\n * Images should be URLs or data URIs (data:image/...;base64,...)\n */\nexport type UserContent = string | { text: string; images?: string[] }\n\nexport interface LLMCapability {\n predict(\n system: string,\n user: UserContent,\n tools?: any[],\n responseFormat?: any\n ): Promise<any>\n embed(text: string): Promise<number[]>\n}\n\n/**\n * Build user message content - supports text-only or multimodal (text + images)\n */\nfunction buildUserMessage(user: UserContent): { role: string; content: any } {\n if (typeof user === 'string') {\n return { role: 'user', content: user }\n }\n\n // Multimodal: array of content blocks (OpenAI vision format)\n const content: any[] = [{ type: 'text', text: user.text }]\n\n for (const img of user.images || []) {\n content.push({\n type: 'image_url',\n image_url: {\n url: img, // Can be URL or data:image/...;base64,...\n },\n })\n }\n\n return { role: 'user', content }\n}\n\nconst DEFAULT_BASE_URL = 'http://localhost:1234/v1'\n\nexport function getLLMCapability(\n models: LocalModels,\n baseUrl = DEFAULT_BASE_URL\n): LLMCapability {\n return {\n async predict(\n system: string,\n user: UserContent,\n tools?: any[],\n responseFormat?: any\n ): Promise<any> {\n try {\n const model = responseFormat\n ? models.getStructuredLLM()\n : models.getLLM()\n const messages = [\n { role: 'system', content: system },\n buildUserMessage(user),\n ]\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: model.id,\n messages,\n temperature: 0.7,\n tools,\n response_format: responseFormat,\n }),\n })\n\n if (!response.ok) {\n throw new Error(\n `LLM Error: ${response.status} ${response.statusText}`\n )\n }\n\n const data = await response.json()\n return data.choices[0]?.message ?? { content: '' }\n } catch (e: any) {\n if (e.cause?.code === 'ECONNREFUSED') {\n throw new Error(\n 'No LLM provider configured. Please start LM Studio or provide an API key.'\n )\n }\n throw e\n }\n },\n\n async embed(text: string): Promise<number[]> {\n try {\n const model = models.getEmbedding()\n const response = await fetch(`${baseUrl}/embeddings`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: model.id,\n input: text,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Embedding Error: ${response.status}`)\n }\n\n const data = await response.json()\n return data.data[0]?.embedding ?? []\n } catch (e: any) {\n if (e.cause?.code === 'ECONNREFUSED') {\n throw new Error(\n 'No LLM provider configured. Please start LM Studio or provide an API key.'\n )\n }\n throw e\n }\n },\n }\n}\n",
28
+ "const TIMEOUT_MS = 60000\nconst CACHE_FILE = '.models.cache.json'\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000 // 24 hours\n\nexport interface ModelAudit {\n id: string\n type: 'LLM' | 'Embedding' | 'Unknown'\n structuredOutput: boolean\n vision: boolean\n dimension?: number\n status: string\n}\n\ninterface CacheData {\n timestamp: number\n baseUrl: string\n models: ModelAudit[]\n}\n\nconst isBrowser =\n typeof window !== 'undefined' && typeof window.localStorage !== 'undefined'\n\nasync function readCache(baseUrl: string): Promise<ModelAudit[] | null> {\n try {\n if (isBrowser) {\n const cached = window.localStorage.getItem(CACHE_FILE)\n if (!cached) return null\n const data: CacheData = JSON.parse(cached)\n // Check TTL and baseUrl match\n if (data.baseUrl !== baseUrl) return null\n if (Date.now() - data.timestamp > CACHE_TTL_MS) return null\n return data.models\n } else {\n // Node.js: read from file\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const cacheFile = path.join(process.cwd(), CACHE_FILE)\n try {\n const content = await fs.readFile(cacheFile, 'utf-8')\n const data: CacheData = JSON.parse(content)\n // Check TTL and baseUrl match\n if (data.baseUrl !== baseUrl) return null\n if (Date.now() - data.timestamp > CACHE_TTL_MS) return null\n return data.models\n } catch {\n return null // File doesn't exist or can't be read\n }\n }\n } catch (e) {\n console.warn('⚠️ Error reading model cache:', e)\n return null\n }\n}\n\nasync function writeCache(\n baseUrl: string,\n models: ModelAudit[]\n): Promise<void> {\n const data: CacheData = {\n timestamp: Date.now(),\n baseUrl,\n models,\n }\n try {\n if (isBrowser) {\n window.localStorage.setItem(CACHE_FILE, JSON.stringify(data))\n } else {\n // Node.js: write to file\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const cacheFile = path.join(process.cwd(), CACHE_FILE)\n await fs.writeFile(cacheFile, JSON.stringify(data, null, 2))\n }\n } catch (e) {\n console.error('❌ Error writing model cache:', e)\n }\n}\n\n// ... (fetchWithTimeout, checkStructured, etc. remain the same)\nconst fetchWithTimeout = async (url: string, options: RequestInit) => {\n const controller = new AbortController()\n const id = setTimeout(() => controller.abort(), TIMEOUT_MS)\n try {\n const res = await fetch(url, { ...options, signal: controller.signal })\n clearTimeout(id)\n return res\n } catch (error) {\n clearTimeout(id)\n throw error\n }\n}\n\nasync function checkStructured(\n baseUrl: string,\n modelId: string\n): Promise<{ ok: boolean; msg?: string }> {\n try {\n const schemaPayload = {\n type: 'json_schema',\n json_schema: {\n name: 'test',\n strict: false,\n schema: {\n type: 'object',\n properties: { status: { type: 'string' } },\n },\n },\n }\n const res = await fetchWithTimeout(`${baseUrl}/chat/completions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: modelId,\n messages: [\n { role: 'system', content: 'You respond in JSON.' },\n { role: 'user', content: 'Return JSON: {\"status\": \"ok\"}' },\n ],\n response_format: schemaPayload,\n max_tokens: 20,\n }),\n })\n if (!res.ok) {\n if (res.status === 400) {\n return checkStructuredLegacy(baseUrl, modelId)\n }\n return { ok: false, msg: `HTTP ${res.status}` }\n }\n const data = await res.json()\n JSON.parse(data.choices[0].message.content)\n return { ok: true, msg: 'OK (Schema)' }\n } catch (e: any) {\n return { ok: false, msg: e.message || 'Error' }\n }\n}\n\nasync function checkStructuredLegacy(\n baseUrl: string,\n modelId: string\n): Promise<{ ok: boolean; msg?: string }> {\n try {\n const res = await fetchWithTimeout(`${baseUrl}/chat/completions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: modelId,\n messages: [{ role: 'user', content: 'JSON: {\"a\":1}' }],\n response_format: { type: 'json_object' },\n max_tokens: 10,\n }),\n })\n if (res.ok) return { ok: true, msg: 'OK (Legacy Mode)' }\n return { ok: false, msg: 'Not Supported' }\n } catch {\n return { ok: false, msg: 'Legacy Fail' }\n }\n}\n\nasync function checkLLM(baseUrl: string, modelId: string): Promise<boolean> {\n try {\n const res = await fetchWithTimeout(`${baseUrl}/chat/completions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: modelId,\n messages: [{ role: 'user', content: 'hi' }],\n max_tokens: 1,\n }),\n })\n return res.ok\n } catch {\n return false\n }\n}\n\nasync function checkEmbedding(\n baseUrl: string,\n modelId: string\n): Promise<number | null> {\n try {\n const res = await fetchWithTimeout(`${baseUrl}/embeddings`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: modelId, input: 'test' }),\n })\n if (!res.ok) return null\n const data = await res.json()\n return data.data[0]?.embedding?.length ?? null\n } catch {\n return null\n }\n}\n\n// Tiny 1x1 red PNG as base64 for vision testing\nconst TINY_TEST_IMAGE =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg=='\n\nasync function checkVision(baseUrl: string, modelId: string): Promise<boolean> {\n try {\n const res = await fetchWithTimeout(`${baseUrl}/chat/completions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: modelId,\n messages: [\n {\n role: 'user',\n content: [\n { type: 'text', text: 'What color is this?' },\n { type: 'image_url', image_url: { url: TINY_TEST_IMAGE } },\n ],\n },\n ],\n max_tokens: 10,\n }),\n })\n // If the model accepts the multimodal format without error, it supports vision\n return res.ok\n } catch {\n return false\n }\n}\n\nexport async function auditModels(baseUrl: string): Promise<ModelAudit[]> {\n // 1. Try to load from cache first (file-based with 24h TTL)\n const cachedData = await readCache(baseUrl)\n\n // 2. Get current model list from server\n let serverModelIds: string[] = []\n try {\n const res = await fetch(`${baseUrl}/models`)\n if (!res.ok) throw new Error('Could not connect')\n const data = (await res.json()) as { data: { id: string }[] }\n serverModelIds = data.data.map((m) => m.id).sort()\n } catch (e) {\n // If we have cache and server is unavailable, use cache\n if (cachedData) {\n console.log('⚠️ LM Studio unavailable, using cached model audit.')\n return cachedData\n }\n console.error('❌ Failed to connect to LM Studio.')\n return []\n }\n\n // 3. Check if cache is still valid (same models)\n if (cachedData) {\n const cachedModelIds = cachedData.map((m) => m.id).sort()\n if (JSON.stringify(serverModelIds) === JSON.stringify(cachedModelIds)) {\n console.log('✅ Using cached model audit.')\n return cachedData\n }\n console.log('🔍 Model list changed. Re-running audit...')\n }\n\n // 4. Run full audit\n console.log('🔍 Scanning models (this may take a moment)...')\n const results: ModelAudit[] = []\n const modelList = serverModelIds.map((id) => ({ id }))\n\n let readline: typeof import('node:readline') | undefined\n if (!isBrowser) {\n readline = await import('node:readline')\n }\n\n for (const model of modelList) {\n if (!isBrowser && readline) {\n readline.cursorTo(process.stdout, 0)\n process.stdout.write(`👉 Testing: ${model.id}...`)\n readline.clearLine(process.stdout, 1)\n }\n let type: ModelAudit['type'] = 'Unknown'\n let structured = false\n let vision = false\n let statusMsg = ''\n let dimension: number | undefined = undefined\n\n const isLLM = await checkLLM(baseUrl, model.id)\n const dim = await checkEmbedding(baseUrl, model.id)\n\n if (dim) {\n dimension = dim\n }\n\n if (isLLM) {\n type = 'LLM'\n const structRes = await checkStructured(baseUrl, model.id)\n structured = structRes.ok\n vision = await checkVision(baseUrl, model.id)\n statusMsg = structured ? structRes.msg! : `Fail: ${structRes.msg}`\n if (vision) statusMsg += ' +Vision'\n } else if (dim) {\n type = 'Embedding'\n statusMsg = `OK (Dim: ${dim})`\n } else {\n statusMsg = 'LLM Fail'\n }\n\n results.push({\n id: model.id,\n type,\n structuredOutput: structured,\n vision,\n dimension,\n status: statusMsg,\n })\n }\n if (!isBrowser && readline) {\n readline.cursorTo(process.stdout, 0)\n readline.clearLine(process.stdout, 0)\n }\n\n console.log('\\n')\n console.table(results)\n\n // 5. Save to cache\n await writeCache(baseUrl, results)\n console.log(`📝 Audit results saved to cache.`)\n\n return results\n}\n",
29
+ "import { auditModels, type ModelAudit } from './audit'\n\nconst DEFAULT_BASE_URL = 'http://localhost:1234/v1'\n\nexport class LocalModels {\n private models: ModelAudit[] = []\n private defaultLLM: ModelAudit | null = null\n private defaultEmbedding: ModelAudit | null = null\n private defaultStructuredLLM: ModelAudit | null = null\n\n constructor(private baseUrl = DEFAULT_BASE_URL) {}\n\n async audit() {\n this.models = await auditModels(this.baseUrl)\n this.selectDefaults()\n }\n\n private selectDefaults() {\n this.defaultEmbedding =\n this.models.find((m) => m.type === 'Embedding') || null\n this.defaultLLM = this.models.find((m) => m.type === 'LLM') || null\n this.defaultStructuredLLM =\n this.models.find((m) => m.type === 'LLM' && m.structuredOutput) || null\n\n if (!this.defaultEmbedding) {\n console.warn('⚠️ No embedding model found.')\n }\n if (!this.defaultLLM) {\n console.warn('⚠️ No LLM found.')\n }\n if (!this.defaultStructuredLLM) {\n console.warn('⚠️ No LLM with structured output support found.')\n }\n }\n\n getModels() {\n return this.models\n }\n\n private _setDefaultModel(\n modelId: string,\n property: 'defaultLLM' | 'defaultEmbedding' | 'defaultStructuredLLM',\n predicate: (model: ModelAudit) => boolean,\n errorType: string\n ) {\n const model = this.models.find((m) => m.id === modelId && predicate(m))\n if (!model) {\n throw new Error(`Model '${modelId}' not found or is not ${errorType}.`)\n }\n this[property] = model\n }\n\n setDefaultLLM(modelId: string) {\n this._setDefaultModel(\n modelId,\n 'defaultLLM',\n (m) => m.type === 'LLM',\n 'an LLM'\n )\n }\n\n setDefaultEmbedding(modelId: string) {\n this._setDefaultModel(\n modelId,\n 'defaultEmbedding',\n (m) => m.dimension !== undefined,\n 'an embedding model'\n )\n }\n\n setDefaultStructuredLLM(modelId: string) {\n this._setDefaultModel(\n modelId,\n 'defaultStructuredLLM',\n (m) => m.type === 'LLM' && m.structuredOutput,\n 'a structured-output LLM'\n )\n }\n\n getLLM() {\n if (!this.defaultLLM) {\n throw new Error('No LLM available.')\n }\n return this.defaultLLM\n }\n\n getEmbedding() {\n if (!this.defaultEmbedding) {\n throw new Error('No embedding model available.')\n }\n return this.defaultEmbedding\n }\n\n getStructuredLLM() {\n if (!this.defaultStructuredLLM) {\n throw new Error('No structured-output LLM available.')\n }\n return this.defaultStructuredLLM\n }\n}\n",
30
+ "import { getStoreCapability as getStoreCapabilityDefault } from './store'\nimport { getLLMCapability } from './llm'\nimport { LocalModels } from './models'\n\n// Check if we're in a browser on HTTPS (can't connect to local HTTP endpoints)\nconst isBrowser = typeof window !== 'undefined'\nconst isHttps = isBrowser && window.location.protocol === 'https:'\n\n// Lazy initialization - don't audit on import\nlet localModels: LocalModels | null = null\nlet llm: ReturnType<typeof getLLMCapability> | null = null\nlet initializationAttempted = false\n\nasync function ensureInitialized() {\n if (initializationAttempted) {\n return { localModels, llm }\n }\n initializationAttempted = true\n\n // Skip local LLM initialization on HTTPS (mixed content would block it anyway)\n if (isHttps) {\n console.log(\n '📡 HTTPS detected - local LLM endpoints disabled. Use HTTP for local LLM support.'\n )\n return { localModels: null, llm: null }\n }\n\n try {\n localModels = new LocalModels()\n await localModels.audit()\n llm = getLLMCapability(localModels)\n } catch (e) {\n console.warn('⚠️ Could not connect to local LLM:', e)\n }\n return { localModels, llm }\n}\n\nexport async function getBatteries() {\n const { localModels, llm } = await ensureInitialized()\n return {\n vector: llm ? { embed: llm.embed } : undefined,\n store: getStoreCapabilityDefault(),\n llmBattery: llm,\n models: localModels,\n }\n}\n\nexport async function getStandardCapabilities() {\n return getBatteries()\n}\n\n// For non-async access (after initialization)\nexport { LocalModels, getLLMCapability, getStoreCapabilityDefault }\n\n// Synchronous batteries object for tests and simple use cases\nexport const batteries = {\n store: getStoreCapabilityDefault(),\n llmBattery: null as ReturnType<typeof getLLMCapability> | null,\n vector: undefined as\n | { embed: (text: string) => Promise<number[]> }\n | undefined,\n models: null as LocalModels | null,\n}\n",
31
+ "/**\n * Timestamp - Pure functions for ISO 8601 timestamp strings\n *\n * No Date warts:\n * - Months are 1-based (January = 1)\n * - All functions are pure (string in, string out)\n * - No mutable objects\n * - UTC by default, explicit timezone for display\n */\n\n/**\n * ISO 8601 timestamp string type\n * e.g., \"2024-01-15T10:30:00.000Z\"\n */\nexport type TimestampString = string\n\n/**\n * Validate that a string is a valid ISO 8601 timestamp\n */\nexport function isValid(ts: string): ts is TimestampString {\n if (typeof ts !== 'string') return false\n const d = new Date(ts)\n return !isNaN(d.getTime()) && ts.includes('T')\n}\n\n/**\n * Get the current timestamp as ISO string\n */\nexport function now(): TimestampString {\n return new Date().toISOString()\n}\n\n/**\n * Create a timestamp from components\n * IMPORTANT: month is 1-based (1 = January, 12 = December)\n */\nexport function from(\n year: number,\n month: number,\n day: number,\n hour = 0,\n minute = 0,\n second = 0,\n ms = 0\n): TimestampString {\n // Convert 1-based month to 0-based for Date\n const d = new Date(Date.UTC(year, month - 1, day, hour, minute, second, ms))\n return d.toISOString()\n}\n\n/**\n * Parse a flexible date string into ISO timestamp\n * Handles various formats and normalizes to UTC\n */\nexport function parse(input: string): TimestampString {\n const d = new Date(input)\n if (isNaN(d.getTime())) {\n throw new Error(`Invalid date string: ${input}`)\n }\n return d.toISOString()\n}\n\n/**\n * Try to parse a date string, returning null on failure\n */\nexport function tryParse(input: string): TimestampString | null {\n try {\n return parse(input)\n } catch {\n return null\n }\n}\n\n// ============================================================================\n// Arithmetic\n// ============================================================================\n\n/**\n * Add milliseconds to a timestamp\n */\nexport function addMilliseconds(\n ts: TimestampString,\n ms: number\n): TimestampString {\n const d = new Date(ts)\n d.setTime(d.getTime() + ms)\n return d.toISOString()\n}\n\n/**\n * Add seconds to a timestamp\n */\nexport function addSeconds(\n ts: TimestampString,\n seconds: number\n): TimestampString {\n return addMilliseconds(ts, seconds * 1000)\n}\n\n/**\n * Add minutes to a timestamp\n */\nexport function addMinutes(\n ts: TimestampString,\n minutes: number\n): TimestampString {\n return addMilliseconds(ts, minutes * 60 * 1000)\n}\n\n/**\n * Add hours to a timestamp\n */\nexport function addHours(ts: TimestampString, hours: number): TimestampString {\n return addMilliseconds(ts, hours * 60 * 60 * 1000)\n}\n\n/**\n * Add days to a timestamp\n */\nexport function addDays(ts: TimestampString, days: number): TimestampString {\n return addMilliseconds(ts, days * 24 * 60 * 60 * 1000)\n}\n\n/**\n * Add weeks to a timestamp\n */\nexport function addWeeks(ts: TimestampString, weeks: number): TimestampString {\n return addDays(ts, weeks * 7)\n}\n\n/**\n * Add months to a timestamp\n * Handles month overflow correctly (e.g., Jan 31 + 1 month = Feb 28/29)\n */\nexport function addMonths(\n ts: TimestampString,\n months: number\n): TimestampString {\n const d = new Date(ts)\n const targetMonth = d.getUTCMonth() + months\n d.setUTCMonth(targetMonth)\n\n // Handle overflow (e.g., Jan 31 + 1 month shouldn't become Mar 3)\n // If the day changed, we overflowed - go back to last day of target month\n if (d.getUTCMonth() !== ((targetMonth % 12) + 12) % 12) {\n d.setUTCDate(0) // Last day of previous month\n }\n\n return d.toISOString()\n}\n\n/**\n * Add years to a timestamp\n * Handles leap years correctly (Feb 29 + 1 year = Feb 28)\n */\nexport function addYears(ts: TimestampString, years: number): TimestampString {\n const d = new Date(ts)\n const originalDay = d.getUTCDate()\n d.setUTCFullYear(d.getUTCFullYear() + years)\n\n // Handle Feb 29 -> Feb 28 in non-leap years\n if (d.getUTCDate() !== originalDay) {\n d.setUTCDate(0) // Last day of previous month\n }\n\n return d.toISOString()\n}\n\n// ============================================================================\n// Difference\n// ============================================================================\n\n/**\n * Get the difference between two timestamps in milliseconds\n * Returns a - b (positive if a is after b)\n */\nexport function diff(a: TimestampString, b: TimestampString): number {\n return new Date(a).getTime() - new Date(b).getTime()\n}\n\n/**\n * Get the difference in seconds\n */\nexport function diffSeconds(a: TimestampString, b: TimestampString): number {\n return Math.floor(diff(a, b) / 1000)\n}\n\n/**\n * Get the difference in minutes\n */\nexport function diffMinutes(a: TimestampString, b: TimestampString): number {\n return Math.floor(diff(a, b) / (60 * 1000))\n}\n\n/**\n * Get the difference in hours\n */\nexport function diffHours(a: TimestampString, b: TimestampString): number {\n return Math.floor(diff(a, b) / (60 * 60 * 1000))\n}\n\n/**\n * Get the difference in days\n */\nexport function diffDays(a: TimestampString, b: TimestampString): number {\n return Math.floor(diff(a, b) / (24 * 60 * 60 * 1000))\n}\n\n// ============================================================================\n// Extractors (all return 1-based month)\n// ============================================================================\n\n/**\n * Get the year component\n */\nexport function year(ts: TimestampString): number {\n return new Date(ts).getUTCFullYear()\n}\n\n/**\n * Get the month component (1-based: 1 = January, 12 = December)\n */\nexport function month(ts: TimestampString): number {\n return new Date(ts).getUTCMonth() + 1\n}\n\n/**\n * Get the day of month component (1-31)\n */\nexport function day(ts: TimestampString): number {\n return new Date(ts).getUTCDate()\n}\n\n/**\n * Get the hour component (0-23)\n */\nexport function hour(ts: TimestampString): number {\n return new Date(ts).getUTCHours()\n}\n\n/**\n * Get the minute component (0-59)\n */\nexport function minute(ts: TimestampString): number {\n return new Date(ts).getUTCMinutes()\n}\n\n/**\n * Get the second component (0-59)\n */\nexport function second(ts: TimestampString): number {\n return new Date(ts).getUTCSeconds()\n}\n\n/**\n * Get the millisecond component (0-999)\n */\nexport function millisecond(ts: TimestampString): number {\n return new Date(ts).getUTCMilliseconds()\n}\n\n/**\n * Get the day of week (1 = Monday, 7 = Sunday) - ISO 8601 convention\n */\nexport function dayOfWeek(ts: TimestampString): number {\n const d = new Date(ts).getUTCDay()\n return d === 0 ? 7 : d // Convert Sunday from 0 to 7\n}\n\n// ============================================================================\n// Formatting\n// ============================================================================\n\n/**\n * Format a timestamp for local display\n * Uses Intl.DateTimeFormat for timezone-aware formatting\n */\nexport function toLocal(\n ts: TimestampString,\n timezone?: string,\n options?: Intl.DateTimeFormatOptions\n): string {\n const d = new Date(ts)\n const formatOptions: Intl.DateTimeFormatOptions = {\n timeZone: timezone,\n ...options,\n }\n return new Intl.DateTimeFormat(undefined, formatOptions).format(d)\n}\n\n/**\n * Format as a readable date/time string\n */\nexport function format(ts: TimestampString, timezone?: string): string {\n return toLocal(ts, timezone, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n}\n\n/**\n * Format as date only (no time)\n */\nexport function formatDate(ts: TimestampString, timezone?: string): string {\n return toLocal(ts, timezone, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })\n}\n\n/**\n * Format as time only (no date)\n */\nexport function formatTime(ts: TimestampString, timezone?: string): string {\n return toLocal(ts, timezone, {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n}\n\n/**\n * Extract just the date portion as YYYY-MM-DD (LegalDate format)\n */\nexport function toDate(ts: TimestampString): string {\n return ts.slice(0, 10)\n}\n\n// ============================================================================\n// Comparison\n// ============================================================================\n\n/**\n * Check if a is before b\n */\nexport function isBefore(a: TimestampString, b: TimestampString): boolean {\n return diff(a, b) < 0\n}\n\n/**\n * Check if a is after b\n */\nexport function isAfter(a: TimestampString, b: TimestampString): boolean {\n return diff(a, b) > 0\n}\n\n/**\n * Check if two timestamps are equal\n */\nexport function isEqual(a: TimestampString, b: TimestampString): boolean {\n return diff(a, b) === 0\n}\n\n/**\n * Get the earlier of two timestamps\n */\nexport function min(a: TimestampString, b: TimestampString): TimestampString {\n return isBefore(a, b) ? a : b\n}\n\n/**\n * Get the later of two timestamps\n */\nexport function max(a: TimestampString, b: TimestampString): TimestampString {\n return isAfter(a, b) ? a : b\n}\n\n// ============================================================================\n// Boundaries\n// ============================================================================\n\n/**\n * Get the start of the day (00:00:00.000 UTC)\n */\nexport function startOfDay(ts: TimestampString): TimestampString {\n return from(year(ts), month(ts), day(ts))\n}\n\n/**\n * Get the end of the day (23:59:59.999 UTC)\n */\nexport function endOfDay(ts: TimestampString): TimestampString {\n return from(year(ts), month(ts), day(ts), 23, 59, 59, 999)\n}\n\n/**\n * Get the start of the month\n */\nexport function startOfMonth(ts: TimestampString): TimestampString {\n return from(year(ts), month(ts), 1)\n}\n\n/**\n * Get the end of the month\n */\nexport function endOfMonth(ts: TimestampString): TimestampString {\n const d = new Date(ts)\n d.setUTCMonth(d.getUTCMonth() + 1, 0) // Day 0 of next month = last day of this month\n d.setUTCHours(23, 59, 59, 999)\n return d.toISOString()\n}\n\n/**\n * Get the start of the year\n */\nexport function startOfYear(ts: TimestampString): TimestampString {\n return from(year(ts), 1, 1)\n}\n\n/**\n * Get the end of the year\n */\nexport function endOfYear(ts: TimestampString): TimestampString {\n return from(year(ts), 12, 31, 23, 59, 59, 999)\n}\n\n// ============================================================================\n// Default export as namespace\n// ============================================================================\n\nexport const Timestamp = {\n isValid,\n now,\n from,\n parse,\n tryParse,\n // Arithmetic\n addMilliseconds,\n addSeconds,\n addMinutes,\n addHours,\n addDays,\n addWeeks,\n addMonths,\n addYears,\n // Difference\n diff,\n diffSeconds,\n diffMinutes,\n diffHours,\n diffDays,\n // Extractors\n year,\n month,\n day,\n hour,\n minute,\n second,\n millisecond,\n dayOfWeek,\n // Formatting\n toLocal,\n format,\n formatDate,\n formatTime,\n toDate,\n // Comparison\n isBefore,\n isAfter,\n isEqual,\n min,\n max,\n // Boundaries\n startOfDay,\n endOfDay,\n startOfMonth,\n endOfMonth,\n startOfYear,\n endOfYear,\n}\n\nexport default Timestamp\n",
32
+ "/**\n * LegalDate - Pure functions for YYYY-MM-DD date strings\n *\n * A \"legal date\" is a calendar date without time - the kind you see on\n * contracts, birth certificates, and legal documents. It represents a\n * civil date, not a point in time.\n *\n * No Date warts:\n * - Months are 1-based (January = 1)\n * - All functions are pure (string in, string out)\n * - No mutable objects\n * - No timezone confusion (it's just a date)\n */\n\nimport { Timestamp } from './Timestamp'\n\n/**\n * Legal date string type: YYYY-MM-DD\n * e.g., \"2024-01-15\"\n */\nexport type LegalDateString = string\n\n/**\n * Validate that a string is a valid YYYY-MM-DD date\n */\nexport function isValid(date: string): date is LegalDateString {\n if (typeof date !== 'string') return false\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) return false\n\n // Parse components\n const y = parseInt(date.slice(0, 4), 10)\n const m = parseInt(date.slice(5, 7), 10)\n const d = parseInt(date.slice(8, 10), 10)\n\n // Validate ranges\n if (m < 1 || m > 12) return false\n if (d < 1) return false\n\n // Check day against actual days in month\n const daysInM = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n const maxDay =\n m === 2 && ((y % 4 === 0 && y % 100 !== 0) || y % 400 === 0)\n ? 29\n : daysInM[m - 1]\n\n return d <= maxDay\n}\n\n/**\n * Get today's date as YYYY-MM-DD (in UTC)\n */\nexport function today(): LegalDateString {\n return Timestamp.toDate(Timestamp.now())\n}\n\n/**\n * Get today's date in a specific timezone\n */\nexport function todayIn(timezone: string): LegalDateString {\n const now = new Date()\n const formatter = new Intl.DateTimeFormat('en-CA', {\n timeZone: timezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n })\n return formatter.format(now)\n}\n\n/**\n * Create a date from components\n * IMPORTANT: month is 1-based (1 = January, 12 = December)\n */\nexport function from(\n year: number,\n month: number,\n day: number\n): LegalDateString {\n const y = String(year).padStart(4, '0')\n const m = String(month).padStart(2, '0')\n const d = String(day).padStart(2, '0')\n const result = `${y}-${m}-${d}`\n\n // Validate it's a real date\n if (!isValid(result)) {\n throw new Error(`Invalid date: ${year}-${month}-${day}`)\n }\n\n return result\n}\n\n/**\n * Parse a flexible date string into YYYY-MM-DD format\n */\nexport function parse(input: string): LegalDateString {\n // If already in correct format, validate and return\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(input)) {\n if (!isValid(input)) {\n throw new Error(`Invalid date: ${input}`)\n }\n return input\n }\n\n // Otherwise, try to parse it\n const d = new Date(input)\n if (isNaN(d.getTime())) {\n throw new Error(`Invalid date string: ${input}`)\n }\n\n // Extract date components in UTC\n const year = d.getUTCFullYear()\n const month = d.getUTCMonth() + 1\n const day = d.getUTCDate()\n\n return from(year, month, day)\n}\n\n/**\n * Try to parse a date string, returning null on failure\n */\nexport function tryParse(input: string): LegalDateString | null {\n try {\n return parse(input)\n } catch {\n return null\n }\n}\n\n// ============================================================================\n// Arithmetic\n// ============================================================================\n\n/**\n * Add days to a date\n */\nexport function addDays(date: LegalDateString, days: number): LegalDateString {\n const ts = toTimestamp(date)\n return Timestamp.toDate(Timestamp.addDays(ts, days))\n}\n\n/**\n * Add weeks to a date\n */\nexport function addWeeks(\n date: LegalDateString,\n weeks: number\n): LegalDateString {\n return addDays(date, weeks * 7)\n}\n\n/**\n * Add months to a date\n * Handles month overflow correctly (e.g., Jan 31 + 1 month = Feb 28/29)\n */\nexport function addMonths(\n date: LegalDateString,\n months: number\n): LegalDateString {\n const y = year(date)\n const m = month(date)\n const d = day(date)\n\n // Calculate target month\n const totalMonths = y * 12 + (m - 1) + months\n const targetYear = Math.floor(totalMonths / 12)\n const targetMonth = (totalMonths % 12) + 1\n\n // Get last day of target month\n const lastDay = daysInMonth(targetYear, targetMonth)\n const targetDay = Math.min(d, lastDay)\n\n return from(targetYear, targetMonth, targetDay)\n}\n\n/**\n * Add years to a date\n * Handles leap years correctly (Feb 29 + 1 year = Feb 28)\n */\nexport function addYears(\n date: LegalDateString,\n years: number\n): LegalDateString {\n const y = year(date)\n const m = month(date)\n const d = day(date)\n\n const targetYear = y + years\n const lastDay = daysInMonth(targetYear, m)\n const targetDay = Math.min(d, lastDay)\n\n return from(targetYear, m, targetDay)\n}\n\n// ============================================================================\n// Difference\n// ============================================================================\n\n/**\n * Get the difference between two dates in days\n * Returns a - b (positive if a is after b)\n */\nexport function diff(a: LegalDateString, b: LegalDateString): number {\n const msPerDay = 24 * 60 * 60 * 1000\n const aMs = new Date(a + 'T00:00:00Z').getTime()\n const bMs = new Date(b + 'T00:00:00Z').getTime()\n return Math.round((aMs - bMs) / msPerDay)\n}\n\n/**\n * Get the difference in complete months\n */\nexport function diffMonths(a: LegalDateString, b: LegalDateString): number {\n const aYear = year(a)\n const aMonth = month(a)\n const bYear = year(b)\n const bMonth = month(b)\n\n return (aYear - bYear) * 12 + (aMonth - bMonth)\n}\n\n/**\n * Get the difference in complete years\n */\nexport function diffYears(a: LegalDateString, b: LegalDateString): number {\n return year(a) - year(b)\n}\n\n// ============================================================================\n// Extractors (all return 1-based month)\n// ============================================================================\n\n/**\n * Get the year component\n */\nexport function year(date: LegalDateString): number {\n return parseInt(date.slice(0, 4), 10)\n}\n\n/**\n * Get the month component (1-based: 1 = January, 12 = December)\n */\nexport function month(date: LegalDateString): number {\n return parseInt(date.slice(5, 7), 10)\n}\n\n/**\n * Get the day of month component (1-31)\n */\nexport function day(date: LegalDateString): number {\n return parseInt(date.slice(8, 10), 10)\n}\n\n/**\n * Get the day of week (1 = Monday, 7 = Sunday) - ISO 8601 convention\n */\nexport function dayOfWeek(date: LegalDateString): number {\n const d = new Date(date + 'T00:00:00Z').getUTCDay()\n return d === 0 ? 7 : d // Convert Sunday from 0 to 7\n}\n\n/**\n * Get the ISO week number (1-53)\n */\nexport function weekOfYear(date: LegalDateString): number {\n const d = new Date(date + 'T00:00:00Z')\n const dayNum = d.getUTCDay() || 7\n d.setUTCDate(d.getUTCDate() + 4 - dayNum)\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1))\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7)\n}\n\n/**\n * Get the day of year (1-366)\n */\nexport function dayOfYear(date: LegalDateString): number {\n const start = from(year(date), 1, 1)\n return diff(date, start) + 1\n}\n\n/**\n * Get the quarter (1-4)\n */\nexport function quarter(date: LegalDateString): number {\n return Math.ceil(month(date) / 3)\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Check if a year is a leap year\n */\nexport function isLeapYear(y: number): boolean {\n return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0\n}\n\n/**\n * Get the number of days in a month\n * Month is 1-based (1 = January)\n */\nexport function daysInMonth(y: number, m: number): number {\n const days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n if (m === 2 && isLeapYear(y)) return 29\n return days[m - 1]\n}\n\n/**\n * Get the number of days in a year\n */\nexport function daysInYear(y: number): number {\n return isLeapYear(y) ? 366 : 365\n}\n\n// ============================================================================\n// Conversion\n// ============================================================================\n\n/**\n * Convert to ISO timestamp (midnight UTC)\n */\nexport function toTimestamp(date: LegalDateString): string {\n return date + 'T00:00:00.000Z'\n}\n\n/**\n * Convert to Unix timestamp (seconds since epoch, midnight UTC)\n */\nexport function toUnix(date: LegalDateString): number {\n return Math.floor(new Date(date + 'T00:00:00Z').getTime() / 1000)\n}\n\n/**\n * Create from Unix timestamp (seconds since epoch)\n */\nexport function fromUnix(unix: number): LegalDateString {\n const d = new Date(unix * 1000)\n return from(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate())\n}\n\n// ============================================================================\n// Formatting\n// ============================================================================\n\n/**\n * Format a date for display\n */\nexport function format(\n date: LegalDateString,\n options?: Intl.DateTimeFormatOptions\n): string {\n const d = new Date(date + 'T00:00:00Z')\n const formatOptions: Intl.DateTimeFormatOptions = {\n timeZone: 'UTC',\n ...options,\n }\n return new Intl.DateTimeFormat(undefined, formatOptions).format(d)\n}\n\n/**\n * Format as a readable date string\n */\nexport function formatLong(date: LegalDateString): string {\n return format(date, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })\n}\n\n/**\n * Format as a short date string\n */\nexport function formatShort(date: LegalDateString): string {\n return format(date, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })\n}\n\n// ============================================================================\n// Comparison\n// ============================================================================\n\n/**\n * Check if a is before b\n */\nexport function isBefore(a: LegalDateString, b: LegalDateString): boolean {\n return a < b\n}\n\n/**\n * Check if a is after b\n */\nexport function isAfter(a: LegalDateString, b: LegalDateString): boolean {\n return a > b\n}\n\n/**\n * Check if two dates are equal\n */\nexport function isEqual(a: LegalDateString, b: LegalDateString): boolean {\n return a === b\n}\n\n/**\n * Get the earlier of two dates\n */\nexport function min(a: LegalDateString, b: LegalDateString): LegalDateString {\n return a < b ? a : b\n}\n\n/**\n * Get the later of two dates\n */\nexport function max(a: LegalDateString, b: LegalDateString): LegalDateString {\n return a > b ? a : b\n}\n\n/**\n * Check if a date is between two other dates (inclusive)\n */\nexport function isBetween(\n date: LegalDateString,\n start: LegalDateString,\n end: LegalDateString\n): boolean {\n return date >= start && date <= end\n}\n\n// ============================================================================\n// Boundaries\n// ============================================================================\n\n/**\n * Get the first day of the month\n */\nexport function startOfMonth(date: LegalDateString): LegalDateString {\n return from(year(date), month(date), 1)\n}\n\n/**\n * Get the last day of the month\n */\nexport function endOfMonth(date: LegalDateString): LegalDateString {\n const y = year(date)\n const m = month(date)\n return from(y, m, daysInMonth(y, m))\n}\n\n/**\n * Get the first day of the quarter\n */\nexport function startOfQuarter(date: LegalDateString): LegalDateString {\n const q = quarter(date)\n const m = (q - 1) * 3 + 1\n return from(year(date), m, 1)\n}\n\n/**\n * Get the last day of the quarter\n */\nexport function endOfQuarter(date: LegalDateString): LegalDateString {\n const q = quarter(date)\n const m = q * 3\n return from(year(date), m, daysInMonth(year(date), m))\n}\n\n/**\n * Get the first day of the year\n */\nexport function startOfYear(date: LegalDateString): LegalDateString {\n return from(year(date), 1, 1)\n}\n\n/**\n * Get the last day of the year\n */\nexport function endOfYear(date: LegalDateString): LegalDateString {\n return from(year(date), 12, 31)\n}\n\n/**\n * Get the first day of the week (Monday)\n */\nexport function startOfWeek(date: LegalDateString): LegalDateString {\n const dow = dayOfWeek(date)\n return addDays(date, -(dow - 1))\n}\n\n/**\n * Get the last day of the week (Sunday)\n */\nexport function endOfWeek(date: LegalDateString): LegalDateString {\n const dow = dayOfWeek(date)\n return addDays(date, 7 - dow)\n}\n\n// ============================================================================\n// Default export as namespace\n// ============================================================================\n\nexport const LegalDate = {\n isValid,\n today,\n todayIn,\n from,\n parse,\n tryParse,\n // Arithmetic\n addDays,\n addWeeks,\n addMonths,\n addYears,\n // Difference\n diff,\n diffMonths,\n diffYears,\n // Extractors\n year,\n month,\n day,\n dayOfWeek,\n weekOfYear,\n dayOfYear,\n quarter,\n // Utilities\n isLeapYear,\n daysInMonth,\n daysInYear,\n // Conversion\n toTimestamp,\n toUnix,\n fromUnix,\n // Formatting\n format,\n formatLong,\n formatShort,\n // Comparison\n isBefore,\n isAfter,\n isEqual,\n min,\n max,\n isBetween,\n // Boundaries\n startOfMonth,\n endOfMonth,\n startOfQuarter,\n endOfQuarter,\n startOfYear,\n endOfYear,\n startOfWeek,\n endOfWeek,\n}\n\nexport default LegalDate\n"
33
+ ],
34
+ "mappings": "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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,MACF,CAAC,EAGK,EAAqB,CAAC,EAC5B,QAAW,KAAM,EACf,GAAI,CAAC,EAAS,IAAI,CAAE,GAAK,CAAC,EAAS,IAAI,CAAE,EACvC,EAAS,KAAK,CAAE,EAIpB,OAAO,EAAS,KAAK,EAMvB,SAAS,EAAe,CAAC,EAA0B,CACjD,IAAM,EAAmB,CAAC,EACtB,EAAU,GACV,EAAQ,EACR,EAAgB,GAChB,EAAiB,GACjB,EAAI,EAER,MAAO,EAAI,EAAO,OAAQ,CACxB,IAAM,EAAO,EAAO,GACd,EAAW,EAAO,EAAI,GAG5B,GAAI,CAAC,GAAkB,IAAS,KAAO,IAAa,IAAK,CACvD,EAAgB,GAChB,GAAW,KACX,GAAK,EACL,SAIF,GAAI,CAAC,GAAiB,IAAS,KAAO,IAAa,IAAK,CACtD,EAAiB,GACjB,GAAW,KACX,GAAK,EACL,SAIF,GAAI,GAAiB,IAAS;AAAA,EAAM,CAClC,EAAgB,GAChB,GAAW,EACX,IACA,SAIF,GAAI,GAAkB,IAAS,KAAO,IAAa,IAAK,CACtD,EAAiB,GACjB,GAAW,KACX,GAAK,EACL,SAIF,GAAI,GAAiB,EAAgB,CACnC,GAAW,EACX,IACA,SAGF,GAAI,IAAS,KAAO,IAAS,KAAO,IAAS,IAC3C,IACA,GAAW,EACN,QAAI,IAAS,KAAO,IAAS,KAAO,IAAS,IAClD,IACA,GAAW,EACN,QA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",
35
+ "debugId": "954B8DA2D58716F264756E2164756E21",
36
+ "names": []
37
+ }