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
package/dist/tjs-vm.js ADDED
@@ -0,0 +1,4 @@
1
+ import{s as Y,validate as f,filter as r}from"tosijs-schema";class _{$error=!0;message;op;cause;constructor(J,Q,$){this.message=J,this.op=Q,this.cause=$}toString(){return`AgentError[${this.op}]: ${this.message}`}toJSON(){return{$error:!0,message:this.message,op:this.op}}}function SJ(J){return J instanceof _||J&&J.$error===!0}var V=new Map,N3=3600000,U3=102400,k="proc_";function h(J){return typeof J==="string"&&J.startsWith(k)}function v(J){let Q=V.get(J);if(!Q)throw Error(`Procedure not found: ${J}`);if(Date.now()>Q.expiresAt)throw V.delete(J),Error(`Procedure expired: ${J}`);return Q.ast}function q3(){if(typeof crypto<"u"&&crypto.randomUUID)return k+crypto.randomUUID();return k+Math.random().toString(36).slice(2)+Date.now().toString(36)}var o=new Set(["__proto__","constructor","prototype"]);function p(J){if(o.has(J))throw Error(`Security Error: Access to '${J}' is forbidden`)}var L3=new Set(["localhost","127.0.0.1","0.0.0.0","[::1]","metadata.google.internal"]);function M3(J){try{let Q=new URL(J);if(Q.protocol!=="http:"&&Q.protocol!=="https:")return!0;let $=Q.hostname.toLowerCase();if(L3.has($))return!0;if($.endsWith(".internal")||$.endsWith(".local"))return!0;if($==="169.254.169.254")return!0;if(/^10\./.test($)||/^192\.168\./.test($)||/^172\.(1[6-9]|2\d|3[01])\./.test($))return!0;return!1}catch{return!0}}function F3(J){if(/\([^)]*[+*][^)]*\)[+*]/.test(J))return!0;if(/\(([^|)]+)\|\1\)[+*]/.test(J))return!0;if(/\(\.\*\)\+/.test(J))return!0;if(/\(\.\+\)\+/.test(J))return!0;if(/\(\[.*\]\+\)\+/.test(J))return!0;return!1}function T(J){return{...J,state:Object.create(J.state)}}function j3(J,Q){let $={},Z=new Set([...Object.keys(J),...Object.keys(Q)]);for(let W of Z){let z=J[W],K=Q[W];if(K!==z)$[W]=K}return $}function X(J,Q){if(J&&typeof J==="object"&&J.$kind==="arg")return Q.args[J.path];if(J&&typeof J==="object"&&J.$expr)return F(J,Q);if(typeof J==="string"){if(J.startsWith("args.")&&!("args"in Q.state))return Q.args[J.replace("args.","")];if(J.includes(".")){let $=J.split(".");for(let W of $)if(o.has(W))throw Error(`Security Error: Access to '${W}' is forbidden`);let Z=Q.state[$[0]];if(Z!==void 0){for(let W=1;W<$.length;W++)Z=Z?.[$[W]];return Z}}if(J in Q.state)return Q.state[J];return J}if(J&&typeof J==="object"&&!Array.isArray(J)&&J.constructor===Object){let $={};for(let Z of Object.keys(J))$[Z]=X(J[Z],Q);return $}if(Array.isArray(J))return J.map(($)=>X($,Q));return J}function C(J,Q,$){return new Proxy(Q,{get(Z,W){if(W in Z)return Z[W];let z=$?.[W];if(z)throw Error(`${J}.${W} is not available. ${z}`);throw Error(`${J}.${W} is not supported in AsyncJS. Check docs for available ${J} methods.`)}})}function w(J){if(J===null)return{type:"null"};if(J===void 0)return{};if(typeof J==="object"&&J!==null&&"type"in J&&typeof J.type==="string")return J;if(typeof J==="object"&&J!==null&&"schema"in J&&typeof J.schema==="object")return J.schema;let Q=typeof J;if(Q==="string")return{type:"string"};if(Q==="number")return Number.isInteger(J)?{type:"integer"}:{type:"number"};if(Q==="boolean")return{type:"boolean"};if(Array.isArray(J)){if(J.length===0)return{type:"array"};return{type:"array",items:w(J[0])}}if(Q==="object"){let $={},Z=[];for(let[W,z]of Object.entries(J))$[W]=w(z),Z.push(W);return{type:"object",properties:$,required:Z}}return{}}var S={Math:C("Math",{PI:Math.PI,E:Math.E,LN2:Math.LN2,LN10:Math.LN10,LOG2E:Math.LOG2E,LOG10E:Math.LOG10E,SQRT2:Math.SQRT2,SQRT1_2:Math.SQRT1_2,abs:Math.abs,ceil:Math.ceil,floor:Math.floor,round:Math.round,trunc:Math.trunc,sign:Math.sign,sqrt:Math.sqrt,cbrt:Math.cbrt,pow:Math.pow,exp:Math.exp,expm1:Math.expm1,log:Math.log,log2:Math.log2,log10:Math.log10,log1p:Math.log1p,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,atan2:Math.atan2,sinh:Math.sinh,cosh:Math.cosh,tanh:Math.tanh,asinh:Math.asinh,acosh:Math.acosh,atanh:Math.atanh,hypot:Math.hypot,min:Math.min,max:Math.max,clz32:Math.clz32,imul:Math.imul,fround:Math.fround,random:()=>{if(typeof crypto<"u"&&crypto.getRandomValues){let J=new Uint32Array(1);return crypto.getRandomValues(J),J[0]/4294967296}return Math.random()}}),JSON:C("JSON",{parse:(J)=>JSON.parse(J),stringify:(J,Q,$)=>JSON.stringify(J,Q,$)}),console:C("console",{log:(...J)=>{return},warn:(...J)=>{return},error:(...J)=>{return},info:(...J)=>{return}},{table:"Use console.log with JSON.stringify for structured data.",dir:"Use console.log instead.",trace:"Stack traces are not available in AsyncJS."}),Array:C("Array",{isArray:(J)=>Array.isArray(J),from:(J,Q,$)=>Array.from(J,Q,$),of:(...J)=>Array.of(...J)},{prototype:"Prototype access is not allowed."}),Object:C("Object",{keys:(J)=>Object.keys(J),values:(J)=>Object.values(J),entries:(J)=>Object.entries(J),fromEntries:(J)=>Object.fromEntries(J),assign:(J,...Q)=>Object.assign({},J,...Q),hasOwn:(J,Q)=>Object.hasOwn(J,Q)},{prototype:"Prototype access is not allowed.",create:"Use object literals instead.",defineProperty:"Property descriptors are not supported.",getPrototypeOf:"Prototype access is not allowed.",setPrototypeOf:"Prototype modification is not allowed."}),String:C("String",{fromCharCode:(...J)=>String.fromCharCode(...J),fromCodePoint:(...J)=>String.fromCodePoint(...J)}),Number:C("Number",{isNaN:Number.isNaN,isFinite:Number.isFinite,isInteger:Number.isInteger,isSafeInteger:Number.isSafeInteger,parseFloat,parseInt,MAX_VALUE:Number.MAX_VALUE,MIN_VALUE:Number.MIN_VALUE,MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER,MIN_SAFE_INTEGER:Number.MIN_SAFE_INTEGER,POSITIVE_INFINITY:Number.POSITIVE_INFINITY,NEGATIVE_INFINITY:Number.NEGATIVE_INFINITY,NaN:Number.NaN,EPSILON:Number.EPSILON}),parseInt,parseFloat,isNaN,isFinite,encodeURI,decodeURI,encodeURIComponent,decodeURIComponent,undefined:void 0,null:null,NaN:NaN,Infinity:1/0,filter:(J,Q)=>{let $=w(Q),Z=r(J,$);if(Z instanceof Error)throw Z;return Z},Schema:{...Y,response:(J,Q)=>{let $=Q?.schema!=null?Q.schema:w(Q);return{type:"json_schema",json_schema:{name:J,strict:!0,schema:$}}},fromExample:(J)=>w(J),isValid:(J,Q)=>{if(Q?.schema!=null)return f(J,Q);return f(J,w(Q))}},Set:(J=[])=>{let Q=[...new globalThis.Set(J)];return{add($){if(!Q.includes($))Q.push($);return this},remove($){let Z=Q.indexOf($);if(Z!==-1)Q.splice(Z,1);return this},clear(){return Q.length=0,this},has($){return Q.includes($)},get size(){return Q.length},toArray(){return[...Q]},union($){let Z=$?.toArray?.()??$??[];return S.Set([...Q,...Z])},intersection($){let Z=$?.toArray?.()??$??[];return S.Set(Q.filter((W)=>Z.includes(W)))},diff($){let Z=$?.toArray?.()??$??[];return S.Set(Q.filter((W)=>!Z.includes(W)))},forEach($){Q.forEach($)},map($){return S.Set(Q.map($))},filter($){return S.Set(Q.filter($))},toJSON(){return[...Q]}}},Date:(()=>{let J=($)=>({get value(){return $.toISOString()},get timestamp(){return $.getTime()},get year(){return $.getFullYear()},get month(){return $.getMonth()+1},get day(){return $.getDate()},get hours(){return $.getHours()},get minutes(){return $.getMinutes()},get seconds(){return $.getSeconds()},get dayOfWeek(){return $.getDay()},add({years:Z=0,months:W=0,days:z=0,hours:K=0,minutes:G=0,seconds:N=0,ms:q=0}={}){let H=new globalThis.Date($.getTime());if(Z)H.setFullYear(H.getFullYear()+Z);if(W)H.setMonth(H.getMonth()+W);if(z)H.setDate(H.getDate()+z);if(K)H.setHours(H.getHours()+K);if(G)H.setMinutes(H.getMinutes()+G);if(N)H.setSeconds(H.getSeconds()+N);if(q)H.setMilliseconds(H.getMilliseconds()+q);return J(H)},diff(Z,W="ms"){let z=typeof Z==="object"&&Z.timestamp?Z.timestamp:new globalThis.Date(Z).getTime(),K=$.getTime()-z;switch(W){case"seconds":return K/1000;case"minutes":return K/60000;case"hours":return K/3600000;case"days":return K/86400000;default:return K}},format(Z="ISO"){if(Z==="ISO")return $.toISOString();if(Z==="date")return $.toISOString().split("T")[0];if(Z==="time")return $.toISOString().split("T")[1].split(".")[0];return Z.replace("YYYY",String($.getFullYear())).replace("MM",String($.getMonth()+1).padStart(2,"0")).replace("DD",String($.getDate()).padStart(2,"0")).replace("HH",String($.getHours()).padStart(2,"0")).replace("mm",String($.getMinutes()).padStart(2,"0")).replace("ss",String($.getSeconds()).padStart(2,"0"))},isBefore(Z){let W=typeof Z==="object"&&Z.timestamp?Z.timestamp:new globalThis.Date(Z).getTime();return $.getTime()<W},isAfter(Z){let W=typeof Z==="object"&&Z.timestamp?Z.timestamp:new globalThis.Date(Z).getTime();return $.getTime()>W},toString(){return $.toISOString()},toJSON(){return $.toISOString()}}),Q=($)=>{let Z=$!==void 0?new globalThis.Date($):new globalThis.Date;if(isNaN(Z.getTime()))throw Error(`Invalid date: ${$}`);return J(Z)};return Q.now=()=>globalThis.Date.now(),Q.parse=($)=>J(new globalThis.Date($)),Q})()},E={RegExp:"RegExp is not available. Use string methods or the regexMatch atom.",Promise:"Promise is not needed. All operations are implicitly async.",Map:"Map is not available. Use plain objects instead.",WeakSet:"WeakSet is not available.",WeakMap:"WeakMap is not available.",Symbol:"Symbol is not available.",Proxy:"Proxy is not available.",Reflect:"Reflect is not available.",Function:"Function constructor is not available. Define functions normally.",eval:"eval is not available. Code is compiled, not evaluated.",setTimeout:"setTimeout is not available. Use the delay atom.",setInterval:"setInterval is not available. Use while loops with delay.",fetch:"fetch is not available. Use the httpFetch atom.",require:"require is not available. Atoms must be registered with the VM.",import:"import is not available. Atoms must be registered with the VM.",process:"process is not available. AsyncJS runs in a sandboxed environment.",window:"window is not available. AsyncJS runs in a sandboxed environment.",document:"document is not available. AsyncJS runs in a sandboxed environment.",global:"global is not available. AsyncJS runs in a sandboxed environment.",globalThis:"globalThis is not available. Use builtins directly."},R3=0.01,x=0.0001,n=0.001,_3=new Set(["concat","slice","map","filter","flatMap","flat","toReversed","toSorted","toSpliced","repeat","padStart","padEnd","split","join","replace","replaceAll","substring","substr","trim","trimStart","trimEnd","toLowerCase","toUpperCase","match","matchAll","parse","stringify"]);function F(J,Q){if(J===null||J===void 0)return J;if(typeof J!=="object"||!("$expr"in J))return J;if(Q.fuel){if(Q.fuel.current-=R3,Q.fuel.current<=0)throw Error("Out of Fuel")}switch(J.$expr){case"literal":return J.value;case"ident":{if(J.name in Q.state)return Q.state[J.name];if(J.name in Q.args)return Q.args[J.name];if(J.name in S)return S[J.name];if(J.name in E)throw Error(E[J.name]);return}case"member":{let $=F(J.object,Q);if(J.optional&&($===null||$===void 0))return;let Z=J.property;return p(Z),$?.[Z]}case"binary":{let $=F(J.left,Q),Z=F(J.right,Q);switch(J.op){case"+":{let W=$+Z;if(typeof W==="string"&&Q.fuel){if(Q.fuel.current-=W.length*x,Q.fuel.current<=0){Q.error=new _("Out of Fuel","expr.concat");return}}return W}case"-":return $-Z;case"*":return $*Z;case"/":return $/Z;case"%":return $%Z;case"**":return $**Z;case">":return $>Z;case"<":return $<Z;case">=":return $>=Z;case"<=":return $<=Z;case"==":return $==Z;case"!=":return $!=Z;case"===":return $===Z;case"!==":return $!==Z;default:throw Error(`Unknown binary operator: ${J.op}`)}}case"unary":{let $=F(J.argument,Q);switch(J.op){case"!":return!$;case"-":return-$;case"+":return+$;case"typeof":return typeof $;default:throw Error(`Unknown unary operator: ${J.op}`)}}case"logical":{let $=F(J.left,Q);if(J.op==="&&")return $?F(J.right,Q):$;else if(J.op==="??")return $??F(J.right,Q);else return $?$:F(J.right,Q)}case"conditional":return F(J.test,Q)?F(J.consequent,Q):F(J.alternate,Q);case"array":return J.elements.map(($)=>F($,Q));case"object":{let $={};for(let Z of J.properties)$[Z.key]=F(Z.value,Q);return $}case"call":{if(J.callee==="Error"){let Z=J.arguments.map((z)=>F(z,Q)),W=typeof Z[0]==="string"?Z[0]:"Error";Q.error=new _(W,"Error");return}if(J.callee in S){let Z=S[J.callee];if(typeof Z==="function"){let W=J.arguments.map((z)=>F(z,Q));return Z(...W)}}if(!Q.resolver(J.callee)){if(J.callee in E)throw Error(E[J.callee]);throw Error(`Unknown function: ${J.callee}`)}throw Error(`Atom calls in expressions not yet supported: ${J.callee}`)}case"methodCall":{let $=F(J.object,Q);if(J.optional&&($===null||$===void 0))return;let Z=J.method;if(p(Z),$===null||$===void 0)throw Error(`Cannot call method '${Z}' on ${$}`);let W=$[Z];if(typeof W!=="function")throw Error(`'${Z}' is not a function`);let z=J.arguments.map((G)=>F(G,Q)),K=W.apply($,z);if(Q.fuel&&_3.has(Z)){let G=0;if(typeof K==="string")G=K.length*x;else if(Array.isArray(K))G=K.length*n;else if(typeof K==="object"&&K!==null)G=Object.keys(K).length*n;if(Q.fuel.current-=G,Q.fuel.current<=0){Q.error=new _("Out of Fuel",`expr.${Z}`);return}}return K}default:throw Error(`Unknown expression type: ${J.$expr}`)}}function U(J,Q,$,Z,W={}){let{docs:z="",timeoutMs:K=1000,cost:G=1}=typeof W==="string"?{docs:W}:W;return{op:J,inputSchema:Q,outputSchema:$,exec:async(q,H)=>{let{op:b,result:D,...M}=q;if(H.error)return;let j=H.trace?{...H.state}:null,B=H.fuel.current,O,g;try{let P=H.costOverrides?.[J],y=P!==void 0?P:G,G3=typeof y==="function"?y(M,H):y;if((H.fuel.current-=G3)<=0){H.error=new _("Out of Fuel",J);return}let d,i=async()=>Z(q,H);if(O=K>0?await Promise.race([i(),new Promise((DJ,H3)=>{d=setTimeout(()=>H3(Error(`Atom '${J}' timed out`)),K)})]).finally(()=>clearTimeout(d)):await i(),q.result){if(H.consts.has(q.result))throw Error(`Cannot reassign const variable '${q.result}'`);if(O!==void 0&&$&&!f(O,$)){H.error=new _(`Output validation failed for '${J}'`,J);return}if(H.state[q.result]=O,q.resultConst)H.consts.add(q.result)}}catch(P){g=P.message||String(P),H.error=new _(g,J,P)}finally{if(H.trace&&j){let P=j3(j,H.state);H.trace.push({op:J,input:M,stateDiff:P,result:O,error:g,fuelBefore:B,fuelAfter:H.fuel.current,timestamp:new Date().toISOString()})}}},docs:z,timeoutMs:K,cost:G,create:(q)=>({op:J,...q})}}var I=U("seq",Y.object({steps:Y.array(Y.any)}),void 0,async({steps:J},Q)=>{for(let $ of J){if(Q.output!==void 0)return;if(Q.error)return;let Z=Q.resolver($.op);if(!Z)throw Error(`Unknown Atom: ${$.op}`);await Z.exec($,Q)}},{docs:"Sequence",timeoutMs:0,cost:0.1}),I3=U("if",Y.object({condition:Y.any,then:Y.array(Y.any),else:Y.array(Y.any).optional}),void 0,async(J,Q)=>{if(F(J.condition,Q))await I.exec({op:"seq",steps:J.then},Q);else if(J.else)await I.exec({op:"seq",steps:J.else},Q)},{docs:"If/Else",timeoutMs:0,cost:0.1}),O3=U("while",Y.object({condition:Y.any,body:Y.array(Y.any)}),void 0,async(J,Q)=>{while(F(J.condition,Q)){if(Q.signal?.aborted)throw Error("Execution aborted");if((Q.fuel.current-=0.1)<=0)throw Error("Out of Fuel");if(await I.exec({op:"seq",steps:J.body},Q),Q.output!==void 0)return}},{docs:"While Loop",timeoutMs:0,cost:0.1}),D3=U("return",void 0,Y.any,async(J,Q)=>{if(Q.error)return Q.output=Q.error,Q.error;if("value"in J){let Z=X(J.value,Q);return Q.output=Z,Z}let $={};if(J.schema?.properties){for(let Z of Object.keys(J.schema.properties))$[Z]=Q.state[Z];if(J.filter!==!1){let Z=r($,J.schema);if(!(Z instanceof Error))$=Z}}return Q.output=$,$},{docs:"Return",cost:0.1}),B3=U("try",Y.object({try:Y.array(Y.any),catch:Y.array(Y.any).optional,catchParam:Y.string.optional}),void 0,async(J,Q)=>{if(await I.exec({op:"seq",steps:J.try},Q),Q.error&&J.catch){let $=J.catchParam||"error";Q.state[$]=Q.error.message,Q.state.errorOp=Q.error.op,Q.error=void 0,await I.exec({op:"seq",steps:J.catch},Q)}},{docs:"Try/Catch",timeoutMs:0,cost:0.1}),S3=U("Error",Y.object({args:Y.array(Y.any).optional}),void 0,async(J,Q)=>{let $=J.args?.[0]??"Error";Q.error=new _(String($),"Error")},{docs:"Trigger error flow",cost:0.1}),b3=U("varSet",Y.object({key:Y.string,value:Y.any}),void 0,async({key:J,value:Q},$)=>{if($.consts.has(J))throw Error(`Cannot reassign const variable '${J}'`);$.state[J]=X(Q,$)},{docs:"Set Variable",cost:0.1}),P3=U("constSet",Y.object({key:Y.string,value:Y.any}),void 0,async({key:J,value:Q},$)=>{if($.consts.has(J))throw Error(`Cannot reassign const variable '${J}'`);if(J in $.state)throw Error(`Cannot redeclare variable '${J}' as const`);$.state[J]=X(Q,$),$.consts.add(J)},{docs:"Set Const Variable (immutable)",cost:0.1}),T3=U("varGet",Y.object({key:Y.string}),Y.any,async({key:J},Q)=>{return X(J,Q)},{docs:"Get Variable",cost:0.1}),C3=U("varsImport",Y.object({keys:Y.union([Y.array(Y.string),Y.record(Y.string)])}),void 0,async({keys:J},Q)=>{if(Array.isArray(J))for(let $ of J)Q.state[$]=X({$kind:"arg",path:$},Q);else for(let[$,Z]of Object.entries(J))Q.state[$]=X({$kind:"arg",path:Z},Q)},{docs:"Import variables from args into the current scope, with optional renaming.",cost:0.2}),w3=U("varsLet",Y.record(Y.any),void 0,async(J,Q)=>{for(let $ of Object.keys(J)){if($==="op"||$==="result")continue;Q.state[$]=X(J[$],Q)}},{docs:"Initialize a set of variables in the current scope from the step object properties.",cost:0.1}),V3=U("varsExport",Y.object({keys:Y.union([Y.array(Y.string),Y.record(Y.string)])}),Y.record(Y.any),async({keys:J},Q)=>{let $={};if(Array.isArray(J))for(let Z of J)$[Z]=X(Z,Q);else for(let[Z,W]of Object.entries(J))$[Z]=X(W,Q);return $},{docs:"Export variables from the current scope, with optional renaming.",cost:0.2}),E3=U("scope",Y.object({steps:Y.array(Y.any)}),void 0,async({steps:J},Q)=>{let $=T(Q);if(await I.exec({op:"seq",steps:J},$),$.output!==void 0)Q.output=$.output},{docs:"Create new scope",timeoutMs:0,cost:0.1}),A3=U("map",Y.object({items:Y.array(Y.any),as:Y.string,steps:Y.array(Y.any)}),Y.array(Y.any),async({items:J,as:Q,steps:$},Z)=>{let W=[],z=X(J,Z);if(!Array.isArray(z))throw Error("map: items is not an array");for(let K of z){if(Z.signal?.aborted)throw Error("Execution aborted");let G=T(Z);G.state[Q]=K,await I.exec({op:"seq",steps:$},G),W.push(G.state.result??null)}return W},{docs:"Map Array",timeoutMs:0,cost:1}),g3=U("filter",Y.object({items:Y.array(Y.any),as:Y.string,condition:Y.any}),Y.array(Y.any),async({items:J,as:Q,condition:$},Z)=>{let W=[],z=X(J,Z);if(!Array.isArray(z))throw Error("filter: items is not an array");for(let K of z){if(Z.signal?.aborted)throw Error("Execution aborted");let G=T(Z);if(G.state[Q]=K,F($,G))W.push(K)}return W},{docs:"Filter Array",timeoutMs:0,cost:1}),y3=U("reduce",Y.object({items:Y.array(Y.any),as:Y.string,accumulator:Y.string,initial:Y.any,steps:Y.array(Y.any)}),Y.any,async({items:J,as:Q,accumulator:$,initial:Z,steps:W},z)=>{let K=X(J,z),G=X(Z,z);if(!Array.isArray(K))throw Error("reduce: items is not an array");let N=G;for(let q of K){if(z.signal?.aborted)throw Error("Execution aborted");let H=T(z);H.state[Q]=q,H.state[$]=N,await I.exec({op:"seq",steps:W},H),N=H.state.result??N}return N},{docs:"Reduce Array",timeoutMs:0,cost:1}),f3=U("find",Y.object({items:Y.array(Y.any),as:Y.string,condition:Y.any}),Y.any,async({items:J,as:Q,condition:$},Z)=>{let W=X(J,Z);if(!Array.isArray(W))throw Error("find: items is not an array");for(let z of W){if(Z.signal?.aborted)throw Error("Execution aborted");let K=T(Z);if(K.state[Q]=z,F($,K))return z}return null},{docs:"Find in Array",timeoutMs:0,cost:1}),k3=U("push",Y.object({list:Y.array(Y.any),item:Y.any}),Y.array(Y.any),async({list:J,item:Q},$)=>{let Z=X(J,$),W=X(Q,$);if(Array.isArray(Z))Z.push(W);return Z},{docs:"Push to Array",cost:1}),h3=U("len",Y.object({list:Y.any}),Y.number,async({list:J},Q)=>{let $=X(J,Q);return Array.isArray($)||typeof $==="string"?$.length:0},{docs:"Length",cost:1}),v3=U("split",Y.object({str:Y.string,sep:Y.string}),Y.array(Y.string),async({str:J,sep:Q},$)=>X(J,$).split(X(Q,$)),{docs:"Split String",cost:1}),m3=U("join",Y.object({list:Y.array(Y.string),sep:Y.string}),Y.string,async({list:J,sep:Q},$)=>X(J,$).join(X(Q,$)),{docs:"Join String",cost:1}),u3=U("template",Y.object({tmpl:Y.string,vars:Y.record(Y.any)}),Y.string,async({tmpl:J,vars:Q},$)=>{return X(J,$).replace(/\{\{(\w+)\}\}/g,(W,z)=>String(X(Q[z],$)??""))},{docs:"String Template",cost:1}),d3=U("regexMatch",Y.object({pattern:Y.string,value:Y.any}),Y.boolean,async({pattern:J,value:Q},$)=>{if(F3(J))throw Error(`Suspicious regex pattern rejected (potential ReDoS): ${J}`);let Z=X(Q,$);return new RegExp(J).test(Z)},{docs:"Returns true if the value matches the regex pattern.",cost:2}),i3=U("pick",Y.object({obj:Y.record(Y.any),keys:Y.array(Y.string)}),Y.record(Y.any),async({obj:J,keys:Q},$)=>{let Z=X(J,$),W=X(Q,$),z={};if(Z&&Array.isArray(W))W.forEach((K)=>z[K]=Z[K]);return z},{docs:"Pick Keys",cost:1}),p3=U("merge",Y.object({a:Y.record(Y.any),b:Y.record(Y.any)}),Y.record(Y.any),async({a:J,b:Q},$)=>({...X(J,$),...X(Q,$)}),{docs:"Merge Objects",cost:1}),x3=U("keys",Y.object({obj:Y.record(Y.any)}),Y.array(Y.string),async({obj:J},Q)=>Object.keys(X(J,Q)??{}),{docs:"Object Keys",cost:1}),l=10,c="X-Agent-Depth";function n3(J,Q){try{let Z=new URL(J).hostname.toLowerCase();for(let W of Q){let z=W.toLowerCase();if(z.startsWith("*.")){let K=z.slice(1);if(Z.endsWith(K)||Z===z.slice(2))return!0}else if(Z===z)return!0}return!1}catch{return!1}}var l3=U("httpFetch",Y.object({url:Y.string,method:Y.string.optional,headers:Y.record(Y.string).optional,body:Y.any.optional,responseType:Y.string.optional}),Y.any,async(J,Q)=>{let $=X(J.url,Q),Z=X(J.method,Q),W=X(J.headers,Q)||{},z=X(J.body,Q),K=X(J.responseType,Q),G=Q.context?.requestDepth??0;if(G>=l)throw Error(`Agent request depth exceeded (max ${l}). This prevents recursive agent loops.`);if(Q.capabilities.fetch)return Q.capabilities.fetch($,{method:Z,headers:{...W,[c]:String(G+1)},body:z,signal:Q.signal,responseType:K});let N=Q.context?.allowedFetchDomains;if(N){if(!n3($,N))throw Error(`Fetch blocked: domain not in allowlist. Allowed: ${N.join(", ")}`)}else{if(M3($))throw Error("Blocked URL: private/internal addresses not allowed in default fetch");try{let H=new URL($).hostname.toLowerCase();if(H!=="localhost"&&H!=="127.0.0.1"&&H!=="[::1]")throw Error("Fetch blocked: no allowedFetchDomains configured. Set ctx.context.allowedFetchDomains or provide a custom fetch capability.")}catch(q){if(q.message.includes("allowedFetchDomains"))throw q;throw Error(`Invalid URL: ${$}`)}}if(typeof globalThis.fetch==="function"){let q=await globalThis.fetch($,{method:Z,headers:{...W,[c]:String(G+1)},body:z?JSON.stringify(z):void 0,signal:Q.signal});if(K==="dataUrl"){let b=await q.arrayBuffer(),D=new Uint8Array(b),M="";for(let O=0;O<D.length;O++)M+=String.fromCharCode(D[O]);let j=btoa(M);return`data:${q.headers.get("content-type")||"application/octet-stream"};base64,${j}`}let H=q.headers.get("content-type");if(K==="json"||H&&H.includes("application/json"))return q.json();return q.text()}throw Error("Capability 'fetch' missing and no global fetch available")},{docs:"HTTP Fetch",timeoutMs:30000,cost:5}),c3=U("storeGet",Y.object({key:Y.string}),Y.any,async({key:J},Q)=>{let $=X(J,Q);return Q.capabilities.store?.get($)},{docs:"Store Get",cost:5}),a3=U("storeSet",Y.object({key:Y.string,value:Y.any}),void 0,async({key:J,value:Q},$)=>{let Z=X(J,$),W=X(Q,$);return $.capabilities.store?.set(Z,W)},{docs:"Store Set",cost:5}),r3=U("storeQuery",Y.object({query:Y.any}),Y.array(Y.any),async({query:J},Q)=>Q.capabilities.store?.query?.(X(J,Q))??[],{docs:"Store Query",cost:5}),o3=U("storeVectorSearch",Y.object({collection:Y.string.optional,vector:Y.array(Y.number),k:Y.number.optional}),Y.array(Y.any),async({collection:J,vector:Q,k:$},Z)=>Z.capabilities.store?.vectorSearch?.(X(J,Z),X(Q,Z),X($,Z))??[],{docs:"Vector Search",cost:(J,Q)=>5+(X(J.k,Q)??5)}),s3=U("llmPredict",Y.object({prompt:Y.string,options:Y.any.optional}),Y.string,async({prompt:J,options:Q},$)=>{if(!$.capabilities.llm?.predict)throw Error("Capability 'llm.predict' missing");return $.capabilities.llm.predict(X(J,$),X(Q,$))},{docs:"LLM Predict",timeoutMs:120000,cost:1}),t3=U("agentRun",Y.object({agentId:Y.any,input:Y.any}),Y.any,async({agentId:J,input:Q},$)=>{let Z=X(J,$),W=X(Q,$),z=W;if(W&&typeof W==="object"&&!Array.isArray(W)){z={};for(let G in W)z[G]=X(W[G],$)}if(h(Z)){let G=v(Z),N={...$,args:z,state:{},consts:new Set,output:void 0,error:void 0},q=$.resolver("seq");if(!q)throw Error("seq atom not found");if(await q.exec(G,N),N.error)throw Error(N.error.message||"Sub-agent failed");return N.output}if(Z&&typeof Z==="object"&&"op"in Z){let G={...$,args:z,state:{},consts:new Set,output:void 0,error:void 0},N=$.resolver("seq");if(!N)throw Error("seq atom not found");if(await N.exec(Z,G),G.error)throw Error(G.error.message||"Sub-agent failed");return G.output}if(!$.capabilities.agent?.run)throw Error("Capability 'agent.run' missing");let K=await $.capabilities.agent.run(Z,z);if(K&&typeof K==="object"&&"fuelUsed"in K&&typeof K.fuelUsed==="number"){if(K.error)throw Error(K.error.message||"Sub-agent failed");return K.result}return K},{docs:"Run Sub-Agent (accepts procedure token, AST, or agent ID)",cost:1}),e3=U("transpileCode",Y.object({code:Y.string}),Y.any,async({code:J},Q)=>{if(!Q.capabilities.code?.transpile)throw Error("Capability 'code.transpile' missing. Enable code transpilation by providing the code capability.");let $=X(J,Q);try{return Q.capabilities.code.transpile($)}catch(Z){throw Error(`Code transpilation failed: ${Z.message}`)}},{docs:"Transpile AsyncJS code to AST",cost:1}),a=10,JJ=U("runCode",Y.object({code:Y.string,args:Y.record(Y.any).optional}),Y.any,async({code:J,args:Q},$)=>{let Z=$.runCodeDepth??0;if(Z>=a)throw Error(`runCode recursion limit exceeded (max ${a}). This prevents infinite loops from dynamically generated code calling runCode.`);if(!$.capabilities.code?.transpile)throw Error("Capability 'code.transpile' missing. Enable dynamic code execution by providing the code capability.");let W=X(J,$),z=Q?X(Q,$):{},K;try{K=$.capabilities.code.transpile(W)}catch(N){throw Error(`Code transpilation failed: ${N.message}`)}if(K.op!=="seq")throw Error("Transpiled code must be a seq node");let G=T($);if(G.args=z,G.output=void 0,G.runCodeDepth=Z+1,await I.exec(K,G),G.error){$.error=G.error;return}return G.output},{docs:"Run dynamically generated AsyncJS code",cost:1}),$J=U("jsonParse",Y.object({str:Y.string}),Y.any,async({str:J},Q)=>JSON.parse(X(J,Q)),{docs:"Parse JSON",cost:1}),QJ=U("jsonStringify",Y.object({value:Y.any}),Y.string,async({value:J},Q)=>JSON.stringify(X(J,Q)),{docs:"Stringify JSON",cost:1}),ZJ=U("xmlParse",Y.object({str:Y.string}),Y.any,async({str:J},Q)=>{if(!Q.capabilities.xml?.parse)throw Error("Capability 'xml.parse' missing");return Q.capabilities.xml.parse(X(J,Q))},{docs:"Parse XML",cost:1}),YJ=U("memoize",Y.object({key:Y.string.optional,steps:Y.array(Y.any)}),Y.any,async({key:J,steps:Q},$)=>{if(!$.memo)$.memo=new Map;let Z=X(J,$)??await m.exec({value:Q,algorithm:"SHA-256"},$);if($.memo.has(Z))return $.memo.get(Z);let W=T($);await I.exec({op:"seq",steps:Q},W);let z=W.output??W.state.result;return $.memo.set(Z,z),z},{docs:"Memoize steps result in memory",cost:1}),WJ=U("cache",Y.object({key:Y.string.optional,steps:Y.array(Y.any),ttlMs:Y.number.optional}),Y.any,async({key:J,steps:Q,ttlMs:$},Z)=>{if(!Z.capabilities.store)throw Error("Capability 'store' missing for caching");let z=`cache:${X(J,Z)??await m.exec({value:Q,algorithm:"SHA-256"},Z)}`,K=await Z.capabilities.store.get(z);if(K)if(typeof K==="object"&&K._exp){if(Date.now()<K._exp)return K.val}else return K;let G=T(Z);await I.exec({op:"seq",steps:Q},G);let N=G.output??G.state.result,q=Date.now()+($??86400000);if((Z.fuel.current-=5)<=0)throw Error("Out of Fuel");return await Z.capabilities.store.set(z,{val:N,_exp:q}),N},{docs:"Cache steps result in store with TTL",cost:5}),zJ=U("random",Y.object({min:Y.number.optional,max:Y.number.optional,format:Y.string.optional,length:Y.number.optional}),Y.any,async({min:J,max:Q,format:$,length:Z},W)=>{let z=X($,W)??"float",K=X(Z,W)??10,G=X(J,W)??0,N=X(Q,W)??1;if(z==="base36"){let M="";if(typeof crypto<"u"&&crypto.getRandomValues){let j=new Uint8Array(K);crypto.getRandomValues(j);for(let B=0;B<K;B++)M+="0123456789abcdefghijklmnopqrstuvwxyz"[j[B]%36]}else for(let j=0;j<K;j++)M+="0123456789abcdefghijklmnopqrstuvwxyz".charAt(Math.floor(Math.random()*36));return M}let q;if(typeof crypto<"u"&&crypto.getRandomValues){let D=new Uint32Array(1);crypto.getRandomValues(D),q=D[0]/4294967296}else q=Math.random();let H=N-G,b=q*H+G;if(z==="integer")return Math.floor(b);return b},{docs:"Generate Random",cost:1}),KJ=U("uuid",void 0,Y.string,async()=>{if(typeof crypto<"u"&&crypto.randomUUID)return crypto.randomUUID();if(typeof crypto<"u"&&crypto.getRandomValues){let J=new Uint8Array(16);crypto.getRandomValues(J),J[6]=J[6]&15|64,J[8]=J[8]&63|128;let Q=Array.from(J,($)=>$.toString(16).padStart(2,"0")).join("");return`${Q.slice(0,8)}-${Q.slice(8,12)}-${Q.slice(12,16)}-${Q.slice(16,20)}-${Q.slice(20)}`}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(J)=>{let Q=Math.random()*16|0;return(J==="x"?Q:Q&3|8).toString(16)})},{docs:"Generate UUID",cost:1}),m=U("hash",Y.object({value:Y.any,algorithm:Y.string.optional}),Y.string,async({value:J,algorithm:Q},$)=>{let Z=typeof J==="string"?J:JSON.stringify(X(J,$)),W=X(Q,$)||"SHA-256";if(typeof crypto<"u"&&crypto.subtle){let G=new TextEncoder().encode(Z),N=await crypto.subtle.digest(W,G);return Array.from(new Uint8Array(N)).map((H)=>H.toString(16).padStart(2,"0")).join("")}let z=0;for(let K=0;K<Z.length;K++){let G=Z.charCodeAt(K);z=(z<<5)-z+G,z|=0}return String(z)},{docs:"Hash a value",cost:1}),XJ=U("consoleLog",Y.object({message:Y.any}),void 0,async({message:J},Q)=>{let $=X(J,Q);if(Q.trace)Q.trace.push({op:"console.log",input:{message:$},stateDiff:{},result:$,fuelBefore:Q.fuel.current,fuelAfter:Q.fuel.current,timestamp:new Date().toISOString()})},{docs:"Log to trace",cost:0.1}),GJ=U("consoleWarn",Y.object({message:Y.any}),void 0,async({message:J},Q)=>{let $=X(J,Q),Z=typeof $==="string"?$:JSON.stringify($);if(!Q.warnings)Q.warnings=[];if(Q.warnings.push(Z),Q.trace)Q.trace.push({op:"console.warn",input:{message:$},stateDiff:{},result:$,fuelBefore:Q.fuel.current,fuelAfter:Q.fuel.current,timestamp:new Date().toISOString()})},{docs:"Add warning",cost:0.1}),HJ=U("consoleError",Y.object({message:Y.any}),void 0,async({message:J},Q)=>{let $=X(J,Q),Z=typeof $==="string"?$:JSON.stringify($);Q.error=new _(Z,"console.error")},{docs:"Emit error and stop",cost:0.1}),NJ=U("storeProcedure",Y.object({ast:Y.any,ttl:Y.number.optional,maxSize:Y.number.optional}),Y.string,async({ast:J,ttl:Q,maxSize:$},Z)=>{let W=X(J,Z),z=Q?X(Q,Z):N3,K=$?X($,Z):U3;if(!W||typeof W!=="object"||!W.op)throw Error('Invalid AST: must be an object with an "op" property');let G=JSON.stringify(W);if(G.length>K)throw Error(`AST too large: ${G.length} bytes exceeds limit of ${K} bytes. Consider reducing AST size or using a shorter TTL.`);let N=q3(),q=Date.now();return V.set(N,{ast:W,createdAt:q,expiresAt:q+z}),N},{docs:"Store an AST and return a token for later execution",cost:1}),UJ=U("releaseProcedure",Y.object({token:Y.string}),Y.boolean,async({token:J},Q)=>{let $=X(J,Q);return V.delete($)},{docs:"Release a stored procedure by token",cost:0.1}),qJ=U("clearExpiredProcedures",void 0,Y.number,async()=>{let J=Date.now(),Q=0;for(let[$,Z]of V)if(J>Z.expiresAt)V.delete($),Q++;return Q},{docs:"Clear all expired procedures and return count",cost:0.5}),s={seq:I,if:I3,while:O3,return:D3,try:B3,Error:S3,varSet:b3,constSet:P3,varGet:T3,varsImport:C3,varsLet:w3,varsExport:V3,scope:E3,map:A3,filter:g3,reduce:y3,find:f3,push:k3,len:h3,split:v3,join:m3,template:u3,regexMatch:d3,pick:i3,merge:p3,keys:x3,httpFetch:l3,storeGet:c3,storeSet:a3,storeQuery:r3,storeVectorSearch:o3,llmPredict:s3,agentRun:t3,transpileCode:e3,runCode:JJ,jsonParse:$J,jsonStringify:QJ,xmlParse:ZJ,memoize:YJ,cache:WJ,random:zJ,uuid:KJ,hash:m,consoleLog:XJ,consoleWarn:GJ,consoleError:HJ,storeProcedure:NJ,releaseProcedure:UJ,clearExpiredProcedures:qJ};var LJ=new Set(["true","false","null","undefined","and","or","not"]);function MJ(J,Q){let $=J.replace(/"[^"]*"/g,'""').replace(/'[^']*'/g,"''"),Z=[],W=/(?<![.])\b([a-zA-Z_][a-zA-Z0-9_]*)\b/g,z;while((z=W.exec($))!==null)Z.push(z[1]);let G=[...new Set(Z)].filter((N)=>!LJ.has(N)&&!(N in Q)&&!new RegExp(`\\b${N}\\s*\\(`).test($));if(G.length>0)console.warn(`[Agent99 Builder] Condition "${J}" references variables not in vars mapping: ${G.join(", ")}. Add them to vars or use AsyncJS syntax (ajs\`...\`) which handles this automatically.`)}function A(J,Q){MJ(J,Q);let $=FJ(J),Z=Q3($,0,Q);if(Z.pos<$.length){let W=$.slice(Z.pos).join(" ");throw Error(`Unsupported condition syntax near '${W}' in: ${J}
2
+ Supported: comparisons, &&, ||, !, arithmetic, member access (a.b), literals`)}return Z.node}function FJ(J){let Q=[],$=0;while($<J.length){while($<J.length&&/\s/.test(J[$]))$++;if($>=J.length)break;if(J[$]==='"'||J[$]==="'"){let Z=J[$++],W="";while($<J.length&&J[$]!==Z)if(J[$]==="\\"&&$+1<J.length)$++,W+=J[$++];else W+=J[$++];$++,Q.push(JSON.stringify(W));continue}if(J.slice($,$+2).match(/^(&&|\|\||==|!=|>=|<=)$/)){Q.push(J.slice($,$+2)),$+=2;continue}if("+-*/%><!().?:[]".includes(J[$])){Q.push(J[$]),$++;continue}if(/\d/.test(J[$])){let Z="";while($<J.length&&/[\d.]/.test(J[$]))Z+=J[$++];Q.push(Z);continue}if(/[a-zA-Z_]/.test(J[$])){let Z="";while($<J.length&&/[a-zA-Z0-9_]/.test(J[$]))Z+=J[$++];Q.push(Z);continue}$++}return Q}function Q3(J,Q,$){return jJ(J,Q,$)}function jJ(J,Q,$){let{node:Z,pos:W}=t(J,Q,$);while(J[W]==="||"){W++;let{node:z,pos:K}=t(J,W,$);Z={$expr:"logical",op:"||",left:Z,right:z},W=K}return{node:Z,pos:W}}function t(J,Q,$){let{node:Z,pos:W}=e(J,Q,$);while(J[W]==="&&"){W++;let{node:z,pos:K}=e(J,W,$);Z={$expr:"logical",op:"&&",left:Z,right:z},W=K}return{node:Z,pos:W}}function e(J,Q,$){let{node:Z,pos:W}=J3(J,Q,$),z=["==","!=",">","<",">=","<="];while(z.includes(J[W])){let K=J[W++],{node:G,pos:N}=J3(J,W,$);Z={$expr:"binary",op:K,left:Z,right:G},W=N}return{node:Z,pos:W}}function J3(J,Q,$){let{node:Z,pos:W}=$3(J,Q,$);while(J[W]==="+"||J[W]==="-"){let z=J[W++],{node:K,pos:G}=$3(J,W,$);Z={$expr:"binary",op:z,left:Z,right:K},W=G}return{node:Z,pos:W}}function $3(J,Q,$){let{node:Z,pos:W}=u(J,Q,$);while(J[W]==="*"||J[W]==="/"||J[W]==="%"){let z=J[W++],{node:K,pos:G}=u(J,W,$);Z={$expr:"binary",op:z,left:Z,right:K},W=G}return{node:Z,pos:W}}function u(J,Q,$){if(J[Q]==="!"||J[Q]==="-"){let Z=J[Q++],{node:W,pos:z}=u(J,Q,$);return{node:{$expr:"unary",op:Z,argument:W},pos:z}}return RJ(J,Q,$)}function RJ(J,Q,$){let Z=J[Q];if(Z==="("){let{node:W,pos:z}=Q3(J,Q+1,$);return{node:W,pos:z+1}}if(Z&&Z.startsWith('"'))return{node:{$expr:"literal",value:JSON.parse(Z)},pos:Q+1};if(Z&&/^\d/.test(Z))return{node:{$expr:"literal",value:parseFloat(Z)},pos:Q+1};if(Z==="true")return{node:{$expr:"literal",value:!0},pos:Q+1};if(Z==="false")return{node:{$expr:"literal",value:!1},pos:Q+1};if(Z==="null")return{node:{$expr:"literal",value:null},pos:Q+1};if(Z&&/^[a-zA-Z_]/.test(Z)){let W={$expr:"ident",name:Z},z=Q+1;while(J[z]==="."){z++;let K=J[z++];W={$expr:"member",object:W,property:K}}return{node:W,pos:z}}return{node:{$expr:"literal",value:null},pos:Q+1}}class R{steps=[];atoms;proxy;constructor(J){return this.atoms=J,this.proxy=new Proxy(this,{get:(Q,$,Z)=>{if($ in Q)return Q[$];if(typeof $==="string"&&$ in Q.atoms)return(W)=>{let z=Q.atoms[$];return Q.add(z.create(W)),Z};return}}),this.proxy}add(J){return this.steps.push(J),this.proxy}as(J){if(this.steps.length===0)throw Error("No step to capture");let Q=this.steps[this.steps.length-1];return Q.result=J,this.proxy}step(J){return this.add(J)}return(J){let Q=this.atoms.return;if(!Q)throw Error("Atom 'return' not found");let $=J.schema??J;return this.add(Q.create({schema:$}))}toJSON(){return{op:"seq",steps:[...this.steps]}}varsImport(J){return this.add(this.atoms.varsImport.create({keys:J}))}varsExport(J){return this.add(this.atoms.varsExport.create({keys:J}))}if(J,Q,$,Z){let W=new R(this.atoms);$(W);let z;if(Z){let N=new R(this.atoms);Z(N),z=N.steps}let K=A(J,Q),G=this.atoms.if;return this.add(G.create({condition:K,then:W.steps,else:z}))}while(J,Q,$){let Z=new R(this.atoms);$(Z);let W=A(J,Q),z=this.atoms.while;return this.add(z.create({condition:W,body:Z.steps}))}scope(J){let Q=new R(this.atoms);J(Q);let $=this.atoms.scope;return this.add($.create({steps:Q.steps}))}map(J,Q,$){let Z=new R(this.atoms);$(Z);let W=this.atoms.map;return this.add(W.create({items:J,as:Q,steps:Z.steps}))}filter(J,Q,$,Z={}){let W=A($,Z),z=this.atoms.filter;return this.add(z.create({items:J,as:Q,condition:W}))}find(J,Q,$,Z={}){let W=A($,Z),z=this.atoms.find;return this.add(z.create({items:J,as:Q,condition:W}))}reduce(J,Q,$,Z,W){let z=new R(this.atoms);W(z);let K=this.atoms.reduce;return this.add(K.create({items:J,as:Q,accumulator:$,initial:Z,steps:z.steps}))}memoize(J,Q){let $=new R(this.atoms);J($);let Z=this.atoms.memoize;return this.add(Z.create({key:Q,steps:$.steps}))}cache(J,Q,$){let Z=new R(this.atoms);J(Z);let W=this.atoms.cache;return this.add(W.create({key:Q,steps:Z.steps,ttlMs:$}))}try(J){let Q=new R(this.atoms);J.try(Q);let $;if(J.catch){let W=new R(this.atoms);J.catch(W),$=W.steps}let Z=this.atoms.try;return this.add(Z.create({try:Q.steps,catch:$}))}}import{validate as _J}from"tosijs-schema";var IJ=10;class OJ{atoms;constructor(J={}){this.atoms={...s,...J}}get builder(){return new R(this.atoms)}get Agent(){return new R(this.atoms)}get A99(){return this.Agent}resolve(J){return this.atoms[J]}getTools(J="all"){let Q=Object.values(this.atoms);if(Array.isArray(J))Q=Q.filter(($)=>J.includes($.op));else if(J==="flow"){let $=["seq","if","while","return","try","varSet","varGet","scope"];Q=Q.filter((Z)=>$.includes(Z.op))}return Q.map(($)=>({type:"function",function:{name:$.op,description:$.docs,parameters:$.inputSchema?.schema??{}}}))}async run(J,Q={},$={}){let Z;if(typeof J==="string")if(h(J))Z=v(J);else throw Error(`Invalid argument: expected AST or procedure token (starting with 'proc_'), got string: ${J}`);else Z=J;let W=$.fuel??1000,z=$.timeoutMs??W*IJ,K=$.capabilities??{},G=[];if(!K.store){let M=new Map,j=!1;K.store={get:async(B)=>{if(!j)j=!0,G.push("Using default in-memory store (not suitable for production)");return M.get(B)},set:async(B,O)=>{if(!j)j=!0,G.push("Using default in-memory store (not suitable for production)");M.set(B,O)}}}let N=new AbortController,q=setTimeout(()=>N.abort(),z);if($.signal)$.signal.addEventListener("abort",()=>N.abort());let H={fuel:{current:W},args:Q,state:{},consts:new Set,capabilities:K,resolver:(M)=>this.resolve(M),output:void 0,signal:N.signal,costOverrides:$.costOverrides,context:$.context,warnings:G};if($.trace)H.trace=[];if(Z.op!=="seq")throw Error("Root AST must be 'seq'. Ensure you're passing a transpiled agent (use ajs`...` or transpile()).");let b=Z.inputSchema;if(b&&!_J(Q,b)){let M=new _("Input validation failed: args do not match expected schema","vm.run");return{result:M,error:M,fuelUsed:0,trace:H.trace,warnings:G.length>0?G:void 0}}try{await Promise.race([this.resolve("seq")?.exec(Z,H),new Promise((M,j)=>{if(N.signal.addEventListener("abort",()=>{j(Error(`Execution timeout after ${z}ms (fuel: ${W}). Consider increasing fuel or optimizing your agent.`))}),N.signal.aborted)j(Error(`Execution timeout after ${z}ms (fuel: ${W}). Consider increasing fuel or optimizing your agent.`))})])}catch(M){if(M.message?.includes("timeout")||M.message?.includes("aborted")||N.signal.aborted)H.error=new _(`Execution timeout after ${z}ms (fuel: ${W}). Consider increasing fuel or optimizing your agent.`,"vm.run");else throw M}finally{clearTimeout(q)}if(H.error&&H.output===void 0)H.output=H.error;let D=[...G,...H.warnings??[]];return{result:H.output,error:H.error,fuelUsed:W-H.fuel.current,trace:H.trace,warnings:D.length>0?D:void 0}}}import{s as L}from"tosijs-schema";var Z3=U("storeVectorize",L.object({text:L.string,model:L.string.optional}),L.array(L.number),async({text:J},Q)=>{let $=Q.capabilities.vector;if(!$)throw Error("Capability 'vector' missing. Ensure vector battery is loaded.");let Z=X(J,Q);return $.embed(Z)},{docs:"Generate embeddings using vector battery",cost:20}),Y3=U("storeCreateCollection",L.object({collection:L.string,dimension:L.number.optional}),void 0,async({collection:J,dimension:Q},$)=>{let Z=$.capabilities.store;if(!Z?.createCollection)throw Error("Capability 'store' missing or does not support createCollection.");let W=X(J,$),z=X(Q,$);return Z.createCollection(W,void 0,z)},{docs:"Create a vector store collection",cost:5}),W3=U("storeVectorAdd",L.object({collection:L.string,doc:L.any}),void 0,async({collection:J,doc:Q},$)=>{let Z=$.capabilities.store;if(!Z?.vectorAdd)throw Error("Capability 'store' missing or does not support vectorAdd.");let W=X(J,$),z=X(Q,$);return Z.vectorAdd(W,z)},{docs:"Add a document to a vector store collection",cost:5}),z3=U("storeSearch",L.object({collection:L.string,queryVector:L.array(L.number),k:L.number.optional,filter:L.record(L.any).optional}),L.array(L.any),async({collection:J,queryVector:Q,k:$,filter:Z},W)=>{let z=W.capabilities.store;if(!z?.vectorSearch)throw Error("Capability 'store' missing or does not support vectorSearch.");let K=X(J,W),G=X(Q,W),N=X($,W)??5,q=X(Z,W);return z.vectorSearch(K,G,N,q)},{docs:"Search vector store",cost:(J,Q)=>5+(X(J.k,Q)??5)}),K3=U("llmPredictBattery",L.object({system:L.string.optional,user:L.string,tools:L.array(L.any).optional,responseFormat:L.any.optional}),L.object({content:L.string.optional,tool_calls:L.array(L.any).optional}),async({system:J,user:Q,tools:$,responseFormat:Z},W)=>{let z=W.capabilities.llmBattery;if(!z?.predict)throw Error("Capability 'llmBattery' missing or invalid.");let K=X(J,W)??"You are a helpful agent.",G=X(Q,W),N=X($,W),q=X(Z,W);return z.predict(K,G,N,q)},{docs:"Generate completion using LLM battery",cost:100}),X3=U("llmVision",L.object({system:L.string.optional,prompt:L.string,images:L.array(L.string),responseFormat:L.any.optional}),L.object({content:L.string.optional,tool_calls:L.array(L.any).optional}),async({system:J,prompt:Q,images:$,responseFormat:Z},W)=>{let z=W.capabilities.llmBattery;if(!z?.predict)throw Error("Capability 'llmBattery' missing or invalid.");let K=X(J,W)??"You analyze images accurately and concisely.",G=X(Q,W),N=X($,W)??[],q=X(Z,W);return z.predict(K,{text:G,images:N},void 0,q)},{docs:"Analyze images using a vision model",timeoutMs:120000,cost:150});var fJ={storeCreateCollection:Y3,storeSearch:z3,storeVectorAdd:W3,storeVectorize:Z3,llmPredictBattery:K3,llmVision:X3};export{ZJ as xmlParse,O3 as whileLoop,o3 as vectorSearch,w3 as varsLet,C3 as varsImport,V3 as varsExport,b3 as varSet,T3 as varGet,KJ as uuid,B3 as tryCatch,e3 as transpileCode,u3 as template,a3 as storeSet,r3 as storeQuery,NJ as storeProcedure,c3 as storeGet,v3 as split,I as seq,E3 as scope,JJ as runCode,D3 as ret,X as resolveValue,v as resolveProcedureToken,UJ as releaseProcedure,d3 as regexMatch,y3 as reduce,zJ as random,k3 as push,V as procedureStore,i3 as pick,p3 as merge,YJ as memoize,A3 as map,s3 as llmPredict,h3 as len,x3 as keys,QJ as jsonStringify,$J as jsonParse,m3 as join,h as isProcedureToken,SJ as isAgentError,I3 as iff,m as hash,f3 as find,g3 as filter,l3 as fetch,F as evaluateExpr,S3 as errorAtom,U as defineAtom,T as createChildScope,s as coreAtoms,P3 as constSet,GJ as consoleWarn,XJ as consoleLog,HJ as consoleError,qJ as clearExpiredProcedures,WJ as cache,S as builtins,fJ as batteryAtoms,t3 as agentRun,k as PROCEDURE_TOKEN_PREFIX,N3 as DEFAULT_PROCEDURE_TTL,U3 as DEFAULT_MAX_AST_SIZE,OJ as AgentVM,_ as AgentError};
3
+
4
+ //# debugId=9176936A02F81E7664756E2164756E21
@@ -0,0 +1,14 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/vm/runtime.ts", "../src/builder.ts", "../src/vm/vm.ts", "../src/vm/atoms/batteries.ts", "../src/vm/atoms/index.ts"],
4
+ "sourcesContent": [
5
+ "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",
6
+ "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",
7
+ "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",
8
+ "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",
9
+ "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"
10
+ ],
11
+ "mappings": "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",
12
+ "debugId": "9176936A02F81E7664756E2164756E21",
13
+ "names": []
14
+ }
package/docs/CNAME ADDED
@@ -0,0 +1 @@
1
+ agent.tosijs.net
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg x="0pt" y="0pt" width="48pt" height="48pt" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!--Generated by AMDN-->
4
+ <g id="Layer_1">
5
+ <g id="Layer_1-1">
6
+ <g id="Layer_1_1">
7
+ <g id="Group">
8
+ <path id="Path" style="fill:#ff1c24;fill-opacity:1;fill-rule:evenodd;opacity:1;stroke:none;" d="M1,9 C1,4.58172,4.58172,1,9,1 C9,1,39,1,39,1 C43.4183,1,47,4.58172,47,9 C47,9,47,39,47,39 C47,43.4183,43.4183,47,39,47 C39,47,9,47,9,47 C4.58172,47,1,43.4183,1,39 C1,39,1,9,1,9 z"/>
9
+ <g id="Group_1">
10
+ <path id="Path_1" style="fill:#9e9e9e;fill-opacity:1;fill-rule:nonzero;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M16,29 C16,29,10,31,10,35 C10,39,16,39,16,39"/>
11
+ <path id="Path_Copy" style="fill:#9e9e9e;fill-opacity:1;fill-rule:nonzero;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M32.0002,29 C32.0002,29,38.0002,31,38.0002,35 C38.0002,39,32.0002,39,32.0002,39"/>
12
+ <path id="Path_2" style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M9,10.1818 C9,7.87226,10.7909,6,13,6 C13,6,35,6,35,6 C37.2091,6,39,7.87226,39,10.1818 C39,10.1818,39,24.8182,39,24.8182 C39,27.1277,37.2091,29,35,29 C35,29,13,29,13,29 C10.7909,29,9,27.1277,9,24.8182 C9,24.8182,9,10.1818,9,10.1818 z"/>
13
+ <path id="Path_3" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M24,11 C24,11,24,23,24,23"/>
14
+ <path id="Path_4" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M28,15 C28,15,28,17,28,17"/>
15
+ <path id="Path_Copy_1" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M20,15 C20,15,20,17,20,17"/>
16
+ <path id="Path_5" style="fill:none;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M32,43 C32,43,30,41,30,41 C30,41,28,43,28,43"/>
17
+ <path id="Path_Copy_2" style="fill:none;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M20,43 C20,43,18,41,18,41 C18,41,16,43,16,43"/>
18
+ <path id="Path_6" style="fill:#e4e4e4;fill-opacity:1;fill-rule:evenodd;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M16,29 C16,29,32,29,32,29 C32,29,32,39,32,39 C32,39,16,39,16,39 C16,39,16,29,16,29 z"/>
19
+ </g>
20
+ </g>
21
+ </g>
22
+ </g>
23
+ <path id="Path-1" style="fill:#006736;fill-opacity:1;fill-rule:evenodd;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M27,16 C27,16,34,16,34,16 C34,16,34,21,34,21 C34,21,27,21,27,21 C27,21,27,16,27,16 z"/>
24
+ <path id="Path-2" style="fill:none;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M21,18 C21,18,21,18,21,18 C21,16.8954,21.8954,16,23,16 C23,16,25,16,25,16 C26.1046,16,27,16.8954,27,18 C27,18,27,18,27,18"/>
25
+ <path id="Path_Copy-1" style="fill:#006736;fill-opacity:1;fill-rule:evenodd;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M14,16 C14,16,21,16,21,16 C21,16,21,21,21,21 C21,21,14,21,14,21 C14,21,14,16,14,16 z"/>
26
+ <path id="Path_Copy-2" style="fill:#8e7f6d;fill-opacity:1;fill-rule:nonzero;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M7,17 C7,17,12,16,12,16 C12,16,13,21,13,21 C13,21,16,20,16,20 C16,20,25,27,25,27 C25,27,25,39,25,39 C25,39,23,41,23,41 C23,41,6,41,6,41 C6,41,6,23,6,23 C6,23,8,22,8,22 C8,22,7,17,7,17 z"/>
27
+ <path id="Compound_Group" style="fill:#c6b199;fill-opacity:1;fill-rule:evenodd;opacity:1;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M21.7198,23.9799 C21.7198,23.9799,30.1325,25.1948,30.1325,25.1948 C30.9524,25.3132,31.5211,26.0738,31.4027,26.8938 C31.4027,26.8938,29.9734,36.7911,29.9734,36.7911 C29.855,37.611,29.0944,38.1797,28.2744,38.0613 C28.2744,38.0613,12.4387,35.7744,12.4387,35.7744 C11.6188,35.656,11.0501,34.8954,11.1685,34.0754 C11.1685,34.0754,12.7407,23.1884,12.7407,23.1884 C12.7407,23.1884,13.0266,21.2089,13.0266,21.2089 C13.145,20.389,13.9056,19.8203,14.7256,19.9387 C14.7256,19.9387,20.664,20.7963,20.664,20.7963 C21.4839,20.9147,22.0526,21.6754,21.9342,22.4953 C21.9342,22.4953,21.7198,23.9799,21.7198,23.9799 z"/>
28
+ <path id="Path-3" style="fill:#8e7f6d;fill-opacity:1;fill-rule:nonzero;opacity:1;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-width:2;" d="M41,17 C41,17,36,16,36,16 C36,16,35,21,35,21 C35,21,32,20,32,20 C32,20,23,27,23,27 C23,27,23,39,23,39 C23,39,25,41,25,41 C25,41,42,41,42,41 C42,41,42,23,42,23 C42,23,40,22,40,22 C40,22,41,17,41,17 z"/>
29
+ </g>
30
+ </svg>