@xenosystem/agent-sdk 0.8.12

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 (175) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +511 -0
  3. package/dist/agents/index.cjs +17 -0
  4. package/dist/agents/index.d.cts +244 -0
  5. package/dist/agents/index.d.ts +244 -0
  6. package/dist/agents/index.js +17 -0
  7. package/dist/agents/metafile-cjs.json +1 -0
  8. package/dist/agents/metafile-esm.json +1 -0
  9. package/dist/artifacts/browser.cjs +1 -0
  10. package/dist/artifacts/browser.d.cts +8 -0
  11. package/dist/artifacts/browser.d.ts +8 -0
  12. package/dist/artifacts/browser.js +1 -0
  13. package/dist/artifacts/diff-artifact-C2tQZWcs.d.cts +354 -0
  14. package/dist/artifacts/diff-artifact-C2tQZWcs.d.ts +354 -0
  15. package/dist/artifacts/index.cjs +10 -0
  16. package/dist/artifacts/index.d.cts +588 -0
  17. package/dist/artifacts/index.d.ts +588 -0
  18. package/dist/artifacts/index.js +10 -0
  19. package/dist/artifacts/metafile-cjs.json +1 -0
  20. package/dist/artifacts/metafile-esm.json +1 -0
  21. package/dist/automation/index.cjs +438 -0
  22. package/dist/automation/index.d.cts +878 -0
  23. package/dist/automation/index.d.ts +878 -0
  24. package/dist/automation/index.js +438 -0
  25. package/dist/automation/metafile-cjs.json +1 -0
  26. package/dist/automation/metafile-esm.json +1 -0
  27. package/dist/control-plane/index.cjs +7 -0
  28. package/dist/control-plane/index.d.cts +403 -0
  29. package/dist/control-plane/index.d.ts +403 -0
  30. package/dist/control-plane/index.js +7 -0
  31. package/dist/control-plane/metafile-cjs.json +1 -0
  32. package/dist/control-plane/metafile-esm.json +1 -0
  33. package/dist/control-room/index.cjs +1 -0
  34. package/dist/control-room/index.d.cts +216 -0
  35. package/dist/control-room/index.d.ts +216 -0
  36. package/dist/control-room/index.js +1 -0
  37. package/dist/control-room/metafile-cjs.json +1 -0
  38. package/dist/control-room/metafile-esm.json +1 -0
  39. package/dist/electron/index.cjs +1476 -0
  40. package/dist/electron/index.d.cts +1583 -0
  41. package/dist/electron/index.d.ts +1583 -0
  42. package/dist/electron/index.js +1476 -0
  43. package/dist/electron/metafile-cjs.json +1 -0
  44. package/dist/electron/metafile-esm.json +1 -0
  45. package/dist/governance/index.cjs +33 -0
  46. package/dist/governance/index.d.cts +397 -0
  47. package/dist/governance/index.d.ts +397 -0
  48. package/dist/governance/index.js +33 -0
  49. package/dist/governance/metafile-cjs.json +1 -0
  50. package/dist/governance/metafile-esm.json +1 -0
  51. package/dist/hooks/index.cjs +9 -0
  52. package/dist/hooks/index.d.cts +198 -0
  53. package/dist/hooks/index.d.ts +198 -0
  54. package/dist/hooks/index.js +9 -0
  55. package/dist/hooks/metafile-cjs.json +1 -0
  56. package/dist/hooks/metafile-esm.json +1 -0
  57. package/dist/hosted/index.cjs +1 -0
  58. package/dist/hosted/index.d.cts +490 -0
  59. package/dist/hosted/index.d.ts +490 -0
  60. package/dist/hosted/index.js +1 -0
  61. package/dist/hosted/metafile-cjs.json +1 -0
  62. package/dist/hosted/metafile-esm.json +1 -0
  63. package/dist/index.cjs +2161 -0
  64. package/dist/index.d.cts +12259 -0
  65. package/dist/index.d.ts +12259 -0
  66. package/dist/index.js +2161 -0
  67. package/dist/intelligence/index.cjs +10 -0
  68. package/dist/intelligence/index.d.cts +220 -0
  69. package/dist/intelligence/index.d.ts +220 -0
  70. package/dist/intelligence/index.js +10 -0
  71. package/dist/intelligence/metafile-cjs.json +1 -0
  72. package/dist/intelligence/metafile-esm.json +1 -0
  73. package/dist/mcp/index.cjs +28 -0
  74. package/dist/mcp/index.d.cts +960 -0
  75. package/dist/mcp/index.d.ts +960 -0
  76. package/dist/mcp/index.js +28 -0
  77. package/dist/mcp/metafile-cjs.json +1 -0
  78. package/dist/mcp/metafile-esm.json +1 -0
  79. package/dist/metafile-cjs.json +1 -0
  80. package/dist/metafile-esm.json +1 -0
  81. package/dist/oracle/index.cjs +1 -0
  82. package/dist/oracle/index.d.cts +310 -0
  83. package/dist/oracle/index.d.ts +310 -0
  84. package/dist/oracle/index.js +1 -0
  85. package/dist/oracle/metafile-cjs.json +1 -0
  86. package/dist/oracle/metafile-esm.json +1 -0
  87. package/dist/providers/index.cjs +11 -0
  88. package/dist/providers/index.d.cts +462 -0
  89. package/dist/providers/index.d.ts +462 -0
  90. package/dist/providers/index.js +11 -0
  91. package/dist/providers/metafile-cjs.json +1 -0
  92. package/dist/providers/metafile-esm.json +1 -0
  93. package/dist/recipes/index.cjs +2 -0
  94. package/dist/recipes/index.d.cts +86 -0
  95. package/dist/recipes/index.d.ts +86 -0
  96. package/dist/recipes/index.js +2 -0
  97. package/dist/recipes/metafile-cjs.json +1 -0
  98. package/dist/recipes/metafile-esm.json +1 -0
  99. package/dist/research/index.cjs +3 -0
  100. package/dist/research/index.d.cts +285 -0
  101. package/dist/research/index.d.ts +285 -0
  102. package/dist/research/index.js +3 -0
  103. package/dist/research/metafile-cjs.json +1 -0
  104. package/dist/research/metafile-esm.json +1 -0
  105. package/dist/session/index.cjs +56 -0
  106. package/dist/session/index.d.cts +523 -0
  107. package/dist/session/index.d.ts +523 -0
  108. package/dist/session/index.js +56 -0
  109. package/dist/session/metafile-cjs.json +1 -0
  110. package/dist/session/metafile-esm.json +1 -0
  111. package/dist/sharing/index.cjs +4 -0
  112. package/dist/sharing/index.d.cts +272 -0
  113. package/dist/sharing/index.d.ts +272 -0
  114. package/dist/sharing/index.js +4 -0
  115. package/dist/sharing/metafile-cjs.json +1 -0
  116. package/dist/sharing/metafile-esm.json +1 -0
  117. package/dist/skills/index.cjs +6 -0
  118. package/dist/skills/index.d.cts +277 -0
  119. package/dist/skills/index.d.ts +277 -0
  120. package/dist/skills/index.js +6 -0
  121. package/dist/skills/metafile-cjs.json +1 -0
  122. package/dist/skills/metafile-esm.json +1 -0
  123. package/dist/soul/index.cjs +32 -0
  124. package/dist/soul/index.d.cts +138 -0
  125. package/dist/soul/index.d.ts +138 -0
  126. package/dist/soul/index.js +32 -0
  127. package/dist/soul/metafile-cjs.json +1 -0
  128. package/dist/soul/metafile-esm.json +1 -0
  129. package/dist/terminal/index.cjs +4 -0
  130. package/dist/terminal/index.d.cts +55 -0
  131. package/dist/terminal/index.d.ts +55 -0
  132. package/dist/terminal/index.js +4 -0
  133. package/dist/terminal/metafile-cjs.json +1 -0
  134. package/dist/terminal/metafile-esm.json +1 -0
  135. package/dist/ui/index.cjs +35 -0
  136. package/dist/ui/index.d.cts +298 -0
  137. package/dist/ui/index.d.ts +298 -0
  138. package/dist/ui/index.js +35 -0
  139. package/dist/ui/metafile-cjs.json +1 -0
  140. package/dist/ui/metafile-esm.json +1 -0
  141. package/dist/utils/index.cjs +23 -0
  142. package/dist/utils/index.d.cts +245 -0
  143. package/dist/utils/index.d.ts +245 -0
  144. package/dist/utils/index.js +23 -0
  145. package/dist/utils/metafile-cjs.json +1 -0
  146. package/dist/utils/metafile-esm.json +1 -0
  147. package/native/mxc/LICENSE.microsoft-mxc-sdk.md +21 -0
  148. package/native/mxc/README.md +25 -0
  149. package/native/mxc/bin/arm64/lxc-exec +0 -0
  150. package/native/mxc/bin/arm64/mxc-exec-mac +0 -0
  151. package/native/mxc/bin/arm64/wxc-exec.exe +0 -0
  152. package/native/mxc/bin/arm64/wxc-host-prep.exe +0 -0
  153. package/native/mxc/bin/x64/lxc-exec +0 -0
  154. package/native/mxc/bin/x64/wxc-exec.exe +0 -0
  155. package/native/mxc/bin/x64/wxc-host-prep.exe +0 -0
  156. package/native/mxc/package.json +58 -0
  157. package/ownership/CLEAN_ROOM_CONTRIBUTOR_GUIDE.md +63 -0
  158. package/ownership/audit.mjs +727 -0
  159. package/ownership/evidence/PROPRIETARY-COMMAND-1/implementation-record.md +77 -0
  160. package/ownership/evidence/PROPRIETARY-COMMAND-1/provenance-review.md +51 -0
  161. package/ownership/evidence/PROPRIETARY-MEDIA-1/implementation-record.md +131 -0
  162. package/ownership/evidence/PROPRIETARY-MEDIA-1/provenance-review.md +50 -0
  163. package/ownership/evidence/PROPRIETARY-PTY-1/implementation-record.md +86 -0
  164. package/ownership/evidence/PROPRIETARY-PTY-1/provenance-review.md +52 -0
  165. package/ownership/evidence/PROPRIETARY-RUNTIME-1/implementation-record.md +68 -0
  166. package/ownership/evidence/PROPRIETARY-RUNTIME-1/provenance-review.md +32 -0
  167. package/ownership/evidence/PROPRIETARY-TOOLCHAIN-1/implementation-record.md +53 -0
  168. package/ownership/evidence/PROPRIETARY-TOOLCHAIN-1/provenance-review.md +32 -0
  169. package/ownership/evidence/PROPRIETARY-UI-1/implementation-record.md +96 -0
  170. package/ownership/evidence/PROPRIETARY-UI-1/provenance-review.md +46 -0
  171. package/ownership/ownership-policy.json +232 -0
  172. package/ownership/ownership-policy.schema.json +192 -0
  173. package/ownership/templates/clean-room-implementation-record.md +70 -0
  174. package/ownership/templates/provenance-review.md +51 -0
  175. package/package.json +209 -0
@@ -0,0 +1,7 @@
1
+ "use strict";var W=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var ve=Object.prototype.hasOwnProperty;var ke=(n,e)=>{for(var t in e)W(n,t,{get:e[t],enumerable:!0})},Ae=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of we(e))!ve.call(n,o)&&o!==t&&W(n,o,{get:()=>e[o],enumerable:!(r=Re(e,o))||r.enumerable});return n};var ye=n=>Ae(W({},"__esModule",{value:!0}),n);var qe={};ke(qe,{AGENT_DAEMON_PROTOCOL_VERSION:()=>A,AgentDaemonClient:()=>H,AgentDaemonServer:()=>q,AgentEventStore:()=>x,AgentRunController:()=>J,AgentRunStore:()=>I,MonitorManager:()=>Q,MonitorStopTool:()=>Z,MonitorTool:()=>X,OtelExporter:()=>Y,UsageAccumulator:()=>M,UsageLedger:()=>K,WorkflowPlanner:()=>y,WorkflowRuntime:()=>G,WorkflowStore:()=>U,acquireControlPlaneLock:()=>D,createAgentRunId:()=>ce,getAgentRunDir:()=>Fe,getAgentRunStoreDir:()=>Le});module.exports=ye(qe);var ue=require("node:crypto"),d=require("node:fs"),de=require("node:os"),u=require("node:path");var E="0.8.11";var h=require("node:fs"),$=require("node:os"),re=require("node:path");function Se(){return new Date().toISOString()}function Ee(){return new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString()}function ne(n){try{return JSON.parse((0,h.readFileSync)(n,"utf8"))}catch{return null}}function De(n){if(!n||n<=0)return!1;try{return process.kill(n,0),!0}catch{return!1}}function xe(n){return n.hostname!==(0,$.hostname)()?!0:De(n.pid)}function te(n,e){(0,h.mkdirSync)((0,re.dirname)(n),{recursive:!0}),(0,h.writeFileSync)(n,JSON.stringify(e,null,2)+`
2
+ `,{encoding:"utf8",flag:"wx"})}function Ie(n,e){let t=ne(n);t?.pid!==e.pid||t.hostname!==e.hostname||(0,h.rmSync)(n,{force:!0})}function D(n,e,t){let r=Se(),o={schemaVersion:1,name:e,pid:process.pid,hostname:(0,$.hostname)(),processStartedAt:Ee(),version:t,acquiredAt:r,updatedAt:r};try{te(n,o)}catch(i){if(i.code!=="EEXIST")throw i;let a=ne(n);if(a&&xe(a))throw new Error(`${e} is already locked by PID ${a.pid} on ${a.hostname}.`);(0,h.rmSync)(n,{force:!0}),te(n,o)}return{record:o,release:()=>{Ie(n,o)}}}var ie=require("node:crypto"),R=require("node:fs"),k=require("node:path");function oe(n){return(0,k.basename)(n).replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,96)}function se(n){return(0,R.existsSync)(n)?(0,R.readFileSync)(n,"utf8").split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var x=class{constructor(e){this.runsDir=e;(0,R.mkdirSync)(this.runsDir,{recursive:!0})}runsDir;pathFor(e){return(0,k.join)(this.runsDir,oe(e),"events.jsonl")}append(e,t,r={},o=new Date().toISOString()){let i=this.pathFor(e);(0,R.mkdirSync)((0,k.dirname)(i),{recursive:!0});let s=D(`${i}.lock`,`events:${oe(e)}`,E);try{let a=se(i).reduce((N,m,P)=>Math.max(N,m.sequence??P),-1)+1,f={schemaVersion:1,eventId:`event_${(0,ie.randomUUID)()}`,sequence:a,runId:e,type:t,timestamp:o,payload:r};return(0,R.appendFileSync)(i,`${JSON.stringify(f)}
3
+ `,"utf8"),f}finally{s.release()}}read(e){return se(this.pathFor(e))}tail(e,t=100){let r=Math.max(0,Math.min(1e4,Math.trunc(t)));return r===0?[]:this.read(e).slice(-r)}};var Te=1,Pe=(0,u.join)((0,de.homedir)(),".xeno-agent"),be=(0,u.join)(process.env.XENO_AGENT_HOME??Pe,"daemon"),F=(0,u.join)(be,"runs");function p(){return new Date().toISOString()}function Oe(n=new Date){return n.toISOString().replace(/[^0-9]/g,"").slice(0,14)}function L(n){return n.replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,80)}function j(n){return(0,u.resolve)(n)}function O(n){return j(n).toLowerCase()}function ae(n,e){let t=O(n),r=O(e);return t===r||t.startsWith(`${r}\\`)||t.startsWith(`${r}/`)}function _e(n,e){return!!(O(n.cwd)===O(e)||n.git?.root&&ae(e,n.git.root)||n.git?.worktree&&ae(e,n.git.worktree))}function Ce(n){return L(Buffer.from(j(n)).toString("base64url"))}function Ue(){return{input:0,output:0,total:0}}function b(n){try{return JSON.parse((0,d.readFileSync)(n,"utf8"))}catch{return null}}function Me(n){return n instanceof Error&&/\balready locked by PID\b/.test(n.message)}function Ne(n,e){(0,d.mkdirSync)((0,u.dirname)(n),{recursive:!0});let t=`${n}.${process.pid}.${Date.now()}.tmp`;(0,d.writeFileSync)(t,JSON.stringify(e,null,2)+`
4
+ `,"utf8"),(0,d.renameSync)(t,n)}function Ve(n){if(!n||n<=0)return!1;try{return process.kill(n,0),!0}catch{return!1}}function We(n){return n==="completed"||n==="failed"||n==="cancelled"||n==="interrupted"}function $e(n,e){return n.pinned!==e.pinned?n.pinned?-1:1:Date.parse(e.updatedAt)-Date.parse(n.updatedAt)}function Le(){return F}function Fe(n){return(0,u.join)(F,n)}function ce(n=new Date){return`run_${Oe(n)}_${(0,ue.randomUUID)().slice(0,8)}`}var I=class{constructor(e=F){this.runsDir=e;(0,d.mkdirSync)(this.runsDir,{recursive:!0}),this.eventStore=new x(this.runsDir)}runsDir;eventStore;create(e){let t=ce(),r=(0,u.join)(this.runsDir,t);(0,d.mkdirSync)(r,{recursive:!0});let o=p(),i=(0,u.join)(r,"events.jsonl"),s={schemaVersion:Te,runId:t,sessionId:t,rootRunId:t,cwd:j(e.cwd),workspaceId:Ce(e.cwd),prompt:e.prompt,...e.title?{title:e.title}:{},status:"starting",model:e.model,...e.effort?{effort:e.effort}:{},...e.agent?{agent:e.agent}:{},...e.git?{git:e.git}:{},permissionMode:e.permissionMode,...e.cliVersion?{createdByCliVersion:e.cliVersion}:{},createdBySdkVersion:e.sdkVersion??E,createdAt:o,updatedAt:o,lastActivityAt:o,pinned:!!e.pinned,attachedClients:0,...e.cliVersion?{cliVersion:e.cliVersion}:{},...e.sdkVersion?{sdkVersion:e.sdkVersion}:{},stdoutPath:(0,u.join)(r,"stdout.log"),stderrPath:(0,u.join)(r,"stderr.log"),eventsPath:i,usage:Ue(),children:[],tags:[]};return(0,d.writeFileSync)(s.stdoutPath,"","utf8"),(0,d.writeFileSync)(s.stderrPath,"","utf8"),(0,d.writeFileSync)(s.eventsPath,"","utf8"),this.write(s),this.appendEvent(t,"run_created",{cwd:s.cwd,model:s.model,...s.agent?{agent:s.agent}:{},...s.git?{git:s.git}:{},permissionMode:s.permissionMode,pinned:s.pinned}),s}get(e){let t=b(this.recordPath(e));return t?this.refreshRecordStatus(t):null}list(e={}){if(!(0,d.existsSync)(this.runsDir))return[];let t=(0,d.readdirSync)(this.runsDir,{withFileTypes:!0}).filter(r=>r.isDirectory()).map(r=>{try{return this.get(r.name)}catch(o){if(Me(o))return b(this.recordPath(r.name));throw o}}).filter(r=>r!==null).filter(r=>e.all||!e.cwd||_e(r,e.cwd)).filter(r=>!e.status||e.status.includes(r.status)).sort($e);return typeof e.limit=="number"&&e.limit>0?t.slice(0,e.limit):t}markSpawned(e,t,r){return this.update(e,o=>({...o,status:"running",workerPid:t,...r?{workerVersion:r}:{},startedAt:o.startedAt??p(),lastActivityAt:p()}))}markStarted(e,t){return this.update(e,r=>({...r,status:"running",workerPid:t.pid,...t.workerVersion?{workerVersion:t.workerVersion}:{},...t.model?{model:t.model}:{},...t.effort?{effort:t.effort}:{},startedAt:r.startedAt??p(),lastActivityAt:p()}))}markCompleted(e,t){return this.update(e,r=>({...r,status:t.status,...t.statusReason?{statusReason:t.statusReason}:{},exitCode:t.exitCode??null,usage:t.usage??r.usage,endedAt:p(),lastActivityAt:p()}))}markCancelled(e,t){return this.update(e,r=>({...r,status:"cancelled",statusReason:t,endedAt:p(),lastActivityAt:p()}))}markPaused(e,t="Paused by user."){let r=this.update(e,o=>({...o,status:"paused",statusReason:t,lastActivityAt:p()}));return r&&this.appendEvent(e,"run_paused",{reason:t}),r}markResumed(e,t="Resumed by user."){let r=this.update(e,o=>{let i={...o,status:"running",statusReason:t,lastActivityAt:p()};return delete i.endedAt,delete i.exitCode,i});return r&&this.appendEvent(e,"run_resumed",{reason:t}),r}setPinned(e,t){let r=this.update(e,o=>({...o,pinned:t,lastActivityAt:p()}));return r&&this.appendEvent(e,t?"run_pinned":"run_unpinned",{pinned:t}),r}appendEvent(e,t,r={}){let o=b(this.recordPath(e)),i=this.eventStore.append(e,t,r);o&&this.update(e,s=>({...s,lastActivityAt:i.timestamp}))}readEvents(e){return this.get(e)?this.eventStore.read(e):[]}delete(e){(0,d.rmSync)((0,u.join)(this.runsDir,e),{recursive:!0,force:!0})}refreshRecordStatus(e){if(We(e.status))return e;if(e.workerPid&&!Ve(e.workerPid)){let t={...e,status:"failed",statusReason:"Worker process is no longer running and did not record a terminal status.",endedAt:e.endedAt??p(),updatedAt:p()};return this.write(t),t}return e}update(e,t){let r=b(this.recordPath(e));if(!r)return null;let o=t(r);return o.updatedAt=p(),this.write(o),o}write(e){let t=D((0,u.join)(this.runDir(e.runId),"run.lock"),`run:${e.runId}`,E);try{Ne(this.recordPath(e.runId),e)}finally{t.release()}}recordPath(e){return(0,u.join)(this.runsDir,L((0,u.basename)(e)),"run.json")}runDir(e){return(0,u.join)(this.runsDir,L((0,u.basename)(e)))}};function le(n){return n==="completed"||n==="failed"||n==="cancelled"||n==="interrupted"}var J=class{constructor(e={}){this.options=e;this.store=e.store??new I}options;store;create(e){return this.store.create(e)}async start(e){let t=this.create(e);if(!this.options.spawn)return t;try{let r=await this.options.spawn(t),o=this.store.markSpawned(t.runId,r.pid,r.workerVersion);if(!o)throw new Error(`Run disappeared during spawn: ${t.runId}`);return this.store.appendEvent(t.runId,"run_started",{pid:r.pid}),o}catch(r){let o=r instanceof Error?r.message:String(r);throw this.store.markCompleted(t.runId,{status:"failed",statusReason:o,exitCode:null}),this.store.appendEvent(t.runId,"run_start_failed",{reason:o}),r}}get(e){return this.store.get(e)}list(e={}){return this.store.list(e)}events(e,t){let r=this.store.readEvents(e);return t===void 0?r:r.slice(-Math.max(0,Math.trunc(t)))}async stop(e,t="Stopped by user."){let r=this.store.get(e);if(!r||le(r.status))return r;await this.options.stop?.(r,t);let o=this.store.markCancelled(e,t);return o&&this.store.appendEvent(e,"run_cancelled",{reason:t}),o}async pause(e,t="Paused by user."){let r=this.store.get(e);return!r||le(r.status)||r.status==="paused"?r:(await this.options.pause?.(r,t),this.store.markPaused(e,t))}async resume(e,t="Resumed by user."){let r=this.store.get(e);return!r||r.status!=="paused"?r:(await this.options.resume?.(r,t),this.store.markResumed(e,t))}complete(e,t,r={}){let o=this.store.markCompleted(e,{status:t,...r.reason?{statusReason:r.reason}:{},...r.exitCode!==void 0?{exitCode:r.exitCode}:{},...r.usage?{usage:r.usage}:{}});return o&&this.store.appendEvent(e,`run_${t}`,{...r.reason?{reason:r.reason}:{}}),o}};var _=require("node:crypto"),A=1;function je(n,e){if(!n)return!1;let t=Buffer.from(n),r=Buffer.from(e);return t.length===r.length&&(0,_.timingSafeEqual)(t,r)}var q=class{constructor(e={}){this.options=e}options;handlers=new Map;register(e,t){let r=e.trim();if(!r)throw new Error("Daemon method name cannot be empty.");if(this.handlers.has(r))throw new Error(`Daemon method already registered: ${r}`);return this.handlers.set(r,t),this}registerController(e){return this.register("runs.start",t=>e.start(t)).register("runs.get",t=>e.get(t.runId)).register("runs.list",t=>e.list(t??{})).register("runs.events",t=>{let r=t;return e.events(r.runId,r.limit)}).register("runs.stop",t=>{let r=t;return e.stop(r.runId,r.reason)}).register("runs.pause",t=>{let r=t;return e.pause(r.runId,r.reason)}).register("runs.resume",t=>{let r=t;return e.resume(r.runId,r.reason)})}async handle(e){if(e.protocolVersion!==A)return this.error(e.id,"PROTOCOL_MISMATCH",`Unsupported protocol version: ${e.protocolVersion}`);if(this.options.authToken&&!je(e.authToken,this.options.authToken))return this.error(e.id,"UNAUTHORIZED","Daemon authentication failed.");let t=this.handlers.get(e.method);if(!t)return this.error(e.id,"METHOD_NOT_FOUND",`Unknown daemon method: ${e.method}`);try{return{protocolVersion:A,id:e.id,result:await t(e.params,e)}}catch(r){return this.error(e.id,"INTERNAL_ERROR",r instanceof Error?r.message:String(r))}}error(e,t,r){return{protocolVersion:A,id:e,error:{code:t,message:r}}}},H=class{constructor(e,t={}){this.transport=e;this.options=t}transport;options;async request(e,t){let r={protocolVersion:A,id:`request_${(0,_.randomUUID)()}`,method:e,params:t,...this.options.authToken?{authToken:this.options.authToken}:{}},o=await this.transport(r);if(o.protocolVersion!==A||o.id!==r.id)throw new Error("Invalid daemon response identity.");if("error"in o){let i=new Error(o.error.message);throw i.code=o.error.code,i}return o.result}};var B=require("node:crypto"),c=require("node:fs"),ge=require("node:os"),g=require("node:path");function C(n){return(0,g.basename)(n).replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,96)}function z(n){try{return JSON.parse((0,c.readFileSync)(n,"utf8"))}catch{return null}}function pe(n,e){(0,c.mkdirSync)((0,g.dirname)(n),{recursive:!0});let t=`${n}.${process.pid}.${Date.now()}.tmp`;(0,c.writeFileSync)(t,`${JSON.stringify(e,null,2)}
5
+ `,"utf8"),(0,c.renameSync)(t,n)}var y=class{plan(e){if(e.schemaVersion!==1)throw new Error("Unsupported workflow schema version.");if(!e.id.trim()||!e.name.trim())throw new Error("Workflow id and name are required.");let t=new Map;for(let s of e.nodes){if(!s.id.trim())throw new Error("Workflow node id cannot be empty.");if(t.has(s.id))throw new Error(`Duplicate workflow node: ${s.id}`);t.set(s.id,s)}for(let s of e.nodes)for(let a of s.dependsOn??[]){if(!t.has(a))throw new Error(`Workflow node ${s.id} depends on unknown node ${a}.`);if(a===s.id)throw new Error(`Workflow node ${s.id} cannot depend on itself.`)}let r=new Set(t.keys()),o=new Set,i=[];for(;r.size>0;){let s=[...r].filter(a=>(t.get(a)?.dependsOn??[]).every(f=>o.has(f))).sort();if(s.length===0)throw new Error("Workflow dependency graph contains a cycle.");i.push(s);for(let a of s)r.delete(a),o.add(a)}return{workflowId:e.id,waves:i}}},U=class{constructor(e=(0,g.join)(process.env.XENO_AGENT_HOME??(0,g.join)((0,ge.homedir)(),".xeno-agent"),"workflows")){this.rootDir=e;(0,c.mkdirSync)(this.definitionsDir(),{recursive:!0}),(0,c.mkdirSync)(this.runsDir(),{recursive:!0})}rootDir;saveDefinition(e){return new y().plan(e),pe((0,g.join)(this.definitionsDir(),`${C(e.id)}.json`),e),e}getDefinition(e){return z((0,g.join)(this.definitionsDir(),`${C(e)}.json`))}listDefinitions(){return(0,c.readdirSync)(this.definitionsDir(),{withFileTypes:!0}).filter(e=>e.isFile()&&e.name.endsWith(".json")).map(e=>z((0,g.join)(this.definitionsDir(),e.name))).filter(e=>e!==null)}createRun(e){new y().plan(e);let t=new Date().toISOString(),r={schemaVersion:1,runId:`workflow_run_${(0,B.randomUUID)()}`,workflowId:e.id,status:"queued",createdAt:t,updatedAt:t,nodes:Object.fromEntries(e.nodes.map(o=>[o.id,{status:"pending"}]))};return this.writeRun(r),this.appendEvent(r.runId,"workflow_created",{}),r}getRun(e){return z(this.runPath(e))}updateRun(e,t){let r=this.getRun(e);if(!r)throw new Error(`Workflow run not found: ${e}`);let o=t(r);return o.updatedAt=new Date().toISOString(),this.writeRun(o),o}appendEvent(e,t,r,o){let i={schemaVersion:1,eventId:`workflow_event_${(0,B.randomUUID)()}`,runId:e,type:t,timestamp:new Date().toISOString(),...o?{nodeId:o}:{},payload:r},s=this.eventsPath(e);return(0,c.mkdirSync)((0,g.dirname)(s),{recursive:!0}),(0,c.appendFileSync)(s,`${JSON.stringify(i)}
6
+ `,"utf8"),i}readEvents(e){let t=this.eventsPath(e);return(0,c.existsSync)(t)?(0,c.readFileSync)(t,"utf8").split(/\r?\n/).filter(Boolean).flatMap(r=>{try{return[JSON.parse(r)]}catch{return[]}}):[]}writeRun(e){pe(this.runPath(e.runId),e)}definitionsDir(){return(0,g.join)(this.rootDir,"definitions")}runsDir(){return(0,g.join)(this.rootDir,"runs")}runPath(e){return(0,g.join)(this.runsDir(),C(e),"run.json")}eventsPath(e){return(0,g.join)(this.runsDir(),C(e),"events.jsonl")}},G=class{constructor(e=new U,t=new y){this.store=e;this.planner=t}store;planner;async run(e,t){let r=this.planner.plan(e),o=this.store.createRun(e);o=this.store.updateRun(o.runId,a=>({...a,status:"running"})),this.store.appendEvent(o.runId,"workflow_started",{waves:r.waves.length});let i=Math.max(1,Math.trunc(e.maxConcurrency??4)),s=!1;for(let a of r.waves)for(let f=0;f<a.length;f+=i){let N=a.slice(f,f+i);await Promise.all(N.map(async m=>{let P=e.nodes.find(l=>l.id===m);if((P.dependsOn??[]).some(l=>this.store.getRun(o.runId)?.nodes[l]?.status!=="completed")||s&&e.failFast!==!1){this.store.updateRun(o.runId,l=>({...l,nodes:{...l.nodes,[m]:{status:"skipped",completedAt:new Date().toISOString()}}})),this.store.appendEvent(o.runId,"node_skipped",{},m);return}let V=new Date().toISOString();o=this.store.updateRun(o.runId,l=>({...l,nodes:{...l.nodes,[m]:{status:"running",startedAt:V}}})),this.store.appendEvent(o.runId,"node_started",{},m);try{let l=await t(P,{run:o,definition:e});this.store.updateRun(o.runId,S=>({...S,nodes:{...S.nodes,[m]:{status:"completed",startedAt:V,completedAt:new Date().toISOString(),output:l}}})),this.store.appendEvent(o.runId,"node_completed",{},m)}catch(l){s=!0;let S=l instanceof Error?l.message:String(l);this.store.updateRun(o.runId,ee=>({...ee,nodes:{...ee.nodes,[m]:{status:"failed",startedAt:V,completedAt:new Date().toISOString(),error:S}}})),this.store.appendEvent(o.runId,"node_failed",{error:S},m)}}))}return o=this.store.updateRun(o.runId,a=>({...a,status:s?"failed":"completed",completedAt:new Date().toISOString()})),this.store.appendEvent(o.runId,s?"workflow_failed":"workflow_completed",{}),o}};var me=require("node:crypto"),Q=class{constructor(e=1e4){this.maxEvents=e;if(!Number.isInteger(e)||e<1)throw new Error("maxEvents must be a positive integer.")}maxEvents;sources=new Map;events=[];register(e){if(!e.id.trim())throw new Error("Monitor source id cannot be empty.");if(this.sources.has(e.id))throw new Error(`Monitor source already registered: ${e.id}`);return this.sources.set(e.id,{source:e,running:!1}),this}async start(e,t=1e3){let r=this.require(e);if(r.running)return this.snapshot(e);await r.source.start?.(),r.running=!0,await this.poll(e);let o=Math.max(25,Math.trunc(t));return r.timer=setInterval(()=>{this.poll(e).catch(()=>{})},o),r.timer.unref?.(),this.snapshot(e)}async poll(e){let o=(await this.require(e).source.poll()).map(i=>({schemaVersion:1,eventId:`monitor_event_${(0,me.randomUUID)()}`,sourceId:e,type:i.type,timestamp:i.timestamp??new Date().toISOString(),payload:i.payload}));return this.events.push(...o),this.events.length>this.maxEvents&&this.events.splice(0,this.events.length-this.maxEvents),o}async stop(e){let t=this.require(e);return t.timer&&clearInterval(t.timer),t.timer=void 0,t.running&&await t.source.stop?.(),t.running=!1,this.snapshot(e)}async stopAll(){await Promise.all([...this.sources.keys()].map(e=>this.stop(e)))}snapshot(e,t=100){let r=this.require(e);return{sourceId:e,running:r.running,events:this.events.filter(o=>o.sourceId===e).slice(-Math.max(0,Math.trunc(t)))}}list(){return[...this.sources].map(([e,t])=>({sourceId:e,running:t.running}))}require(e){let t=this.sources.get(e);if(!t)throw new Error(`Monitor source not found: ${e}`);return t}},X=class{constructor(e){this.manager=e}manager;execute(e){return this.manager.start(e.sourceId,e.intervalMs)}},Z=class{constructor(e){this.manager=e}manager;execute(e){return this.manager.stop(e.sourceId)}};var fe=require("node:crypto"),v=require("node:fs"),he=require("node:os"),T=require("node:path");function w(n){return Number.isFinite(n)?Math.max(0,n??0):0}var M=class{totalsValue={inputTokens:0,outputTokens:0,totalTokens:0,cachedInputTokens:0,estimatedCostUsd:0,events:0};add(e){let t=w(e.inputTokens),r=w(e.outputTokens);return this.totalsValue.inputTokens+=t,this.totalsValue.outputTokens+=r,this.totalsValue.totalTokens+=t+r,this.totalsValue.cachedInputTokens+=w(e.cachedInputTokens),this.totalsValue.estimatedCostUsd+=w(e.estimatedCostUsd),this.totalsValue.events+=1,this}snapshot(){return{...this.totalsValue}}};function Je(n,e){if(["runId","sessionId","workflowRunId","agentId","provider","model"].some(o=>e[o]!==void 0&&n[o]!==e[o]))return!1;let r=Date.parse(n.timestamp);return!(e.from&&r<Date.parse(e.from)||e.to&&r>Date.parse(e.to))}var K=class{path;constructor(e=(0,T.join)(process.env.XENO_AGENT_HOME??(0,T.join)((0,he.homedir)(),".xeno-agent"),"usage","events.jsonl")){this.path=e,(0,v.mkdirSync)((0,T.dirname)(e),{recursive:!0})}append(e){let t={...e,schemaVersion:1,eventId:`usage_${(0,fe.randomUUID)()}`,timestamp:e.timestamp??new Date().toISOString(),inputTokens:w(e.inputTokens),outputTokens:w(e.outputTokens),...e.cachedInputTokens!==void 0?{cachedInputTokens:w(e.cachedInputTokens)}:{},...e.estimatedCostUsd!==void 0?{estimatedCostUsd:w(e.estimatedCostUsd)}:{}};return(0,v.appendFileSync)(this.path,`${JSON.stringify(t)}
7
+ `,"utf8"),t}query(e={}){return(0,v.existsSync)(this.path)?(0,v.readFileSync)(this.path,"utf8").split(/\r?\n/).filter(Boolean).flatMap(t=>{try{let r=JSON.parse(t);return Je(r,e)?[r]:[]}catch{return[]}}):[]}summarize(e={}){let t=new M;for(let r of this.query(e))t.add(r);return t.snapshot()}},Y=class{constructor(e){this.adapter=e}adapter;export(e){for(let t of e){let r={...t.provider?{provider:t.provider}:{},...t.model?{model:t.model}:{}};this.adapter.addCounter("xeno.usage.input_tokens",t.inputTokens,r),this.adapter.addCounter("xeno.usage.output_tokens",t.outputTokens,r),t.cachedInputTokens&&this.adapter.addCounter("xeno.usage.cached_input_tokens",t.cachedInputTokens,r),t.estimatedCostUsd&&this.adapter.addCounter("xeno.usage.estimated_cost_usd",t.estimatedCostUsd,r),this.adapter.recordEvent?.("xeno.usage.recorded",r)}}};0&&(module.exports={AGENT_DAEMON_PROTOCOL_VERSION,AgentDaemonClient,AgentDaemonServer,AgentEventStore,AgentRunController,AgentRunStore,MonitorManager,MonitorStopTool,MonitorTool,OtelExporter,UsageAccumulator,UsageLedger,WorkflowPlanner,WorkflowRuntime,WorkflowStore,acquireControlPlaneLock,createAgentRunId,getAgentRunDir,getAgentRunStoreDir});
@@ -0,0 +1,403 @@
1
+ type AgentRunStatus = "queued" | "starting" | "running" | "blocked" | "waiting_for_user" | "waiting_for_tool" | "waiting_for_hook" | "waiting_for_permission" | "paused" | "completed" | "failed" | "cancelled" | "interrupted" | "detached";
2
+ interface AgentRunUsage {
3
+ input: number;
4
+ output: number;
5
+ total: number;
6
+ estimatedCostUsd?: number;
7
+ }
8
+ interface AgentRunAgentDefinitionRef {
9
+ name: string;
10
+ scope: "project" | "user" | "plugin" | "built-in";
11
+ path: string;
12
+ description?: string;
13
+ model?: string;
14
+ }
15
+ interface AgentRunRecord {
16
+ schemaVersion: 1;
17
+ runId: string;
18
+ sessionId: string;
19
+ rootRunId: string;
20
+ parentRunId?: string;
21
+ cwd: string;
22
+ workspaceId: string;
23
+ prompt: string;
24
+ title?: string;
25
+ status: AgentRunStatus;
26
+ statusReason?: string;
27
+ blockedReason?: string;
28
+ model: string;
29
+ effort?: "low" | "medium" | "high" | "xhigh" | "max";
30
+ agent?: AgentRunAgentDefinitionRef;
31
+ permissionMode: "default" | "plan" | "acceptEdits" | "auto" | "dontAsk" | "bypassPermissions";
32
+ createdByCliVersion?: string;
33
+ createdBySdkVersion?: string;
34
+ createdAt: string;
35
+ updatedAt: string;
36
+ startedAt?: string;
37
+ endedAt?: string;
38
+ lastActivityAt?: string;
39
+ pinned: boolean;
40
+ attachedClients: number;
41
+ workerPid?: number;
42
+ workerVersion?: string;
43
+ cliVersion?: string;
44
+ sdkVersion?: string;
45
+ stdoutPath: string;
46
+ stderrPath: string;
47
+ eventsPath: string;
48
+ exitCode?: number | null;
49
+ git?: {
50
+ root?: string;
51
+ originBranch?: string;
52
+ originCommit?: string;
53
+ branch?: string;
54
+ baseRef?: string;
55
+ commit?: string;
56
+ worktree?: string;
57
+ };
58
+ usage: AgentRunUsage;
59
+ children: string[];
60
+ tags: string[];
61
+ }
62
+ interface AgentRunEvent {
63
+ schemaVersion: 1;
64
+ eventId?: string;
65
+ sequence?: number;
66
+ runId: string;
67
+ type: string;
68
+ timestamp: string;
69
+ payload: Record<string, unknown>;
70
+ }
71
+ interface AgentRunListOptions {
72
+ cwd?: string;
73
+ all?: boolean;
74
+ status?: AgentRunStatus[];
75
+ limit?: number;
76
+ }
77
+ interface AgentRunCreateInput {
78
+ prompt: string;
79
+ cwd: string;
80
+ model: string;
81
+ effort?: AgentRunRecord["effort"];
82
+ agent?: AgentRunAgentDefinitionRef;
83
+ permissionMode: AgentRunRecord["permissionMode"];
84
+ title?: string;
85
+ pinned?: boolean;
86
+ git?: AgentRunRecord["git"];
87
+ cliVersion?: string;
88
+ sdkVersion?: string;
89
+ }
90
+ declare function getAgentRunStoreDir(): string;
91
+ declare function getAgentRunDir(runId: string): string;
92
+ declare function createAgentRunId(date?: Date): string;
93
+ declare class AgentRunStore {
94
+ private readonly runsDir;
95
+ private readonly eventStore;
96
+ constructor(runsDir?: string);
97
+ create(input: AgentRunCreateInput): AgentRunRecord;
98
+ get(runId: string): AgentRunRecord | null;
99
+ list(options?: AgentRunListOptions): AgentRunRecord[];
100
+ markSpawned(runId: string, pid: number, workerVersion?: string): AgentRunRecord | null;
101
+ markStarted(runId: string, input: {
102
+ pid: number;
103
+ workerVersion?: string;
104
+ model?: string;
105
+ effort?: AgentRunRecord["effort"];
106
+ }): AgentRunRecord | null;
107
+ markCompleted(runId: string, input: {
108
+ status: AgentRunStatus;
109
+ statusReason?: string;
110
+ exitCode?: number | null;
111
+ usage?: AgentRunUsage;
112
+ }): AgentRunRecord | null;
113
+ markCancelled(runId: string, reason: string): AgentRunRecord | null;
114
+ markPaused(runId: string, reason?: string): AgentRunRecord | null;
115
+ markResumed(runId: string, reason?: string): AgentRunRecord | null;
116
+ setPinned(runId: string, pinned: boolean): AgentRunRecord | null;
117
+ appendEvent(runId: string, type: string, payload?: Record<string, unknown>): void;
118
+ readEvents(runId: string): AgentRunEvent[];
119
+ delete(runId: string): void;
120
+ refreshRecordStatus(record: AgentRunRecord): AgentRunRecord;
121
+ private update;
122
+ private write;
123
+ private recordPath;
124
+ private runDir;
125
+ }
126
+ declare class AgentEventStore {
127
+ private readonly runsDir;
128
+ constructor(runsDir: string);
129
+ pathFor(runId: string): string;
130
+ append(runId: string, type: string, payload?: Record<string, unknown>, timestamp?: string): AgentRunEvent;
131
+ read(runId: string): AgentRunEvent[];
132
+ tail(runId: string, limit?: number): AgentRunEvent[];
133
+ }
134
+ interface AgentRunSpawnResult {
135
+ pid: number;
136
+ workerVersion?: string;
137
+ }
138
+ interface AgentRunControllerOptions {
139
+ store?: AgentRunStore;
140
+ spawn?: (record: AgentRunRecord) => AgentRunSpawnResult | Promise<AgentRunSpawnResult>;
141
+ stop?: (record: AgentRunRecord, reason: string) => void | Promise<void>;
142
+ pause?: (record: AgentRunRecord, reason: string) => void | Promise<void>;
143
+ resume?: (record: AgentRunRecord, reason: string) => void | Promise<void>;
144
+ }
145
+ declare class AgentRunController {
146
+ private readonly options;
147
+ readonly store: AgentRunStore;
148
+ constructor(options?: AgentRunControllerOptions);
149
+ create(input: AgentRunCreateInput): AgentRunRecord;
150
+ start(input: AgentRunCreateInput): Promise<AgentRunRecord>;
151
+ get(runId: string): AgentRunRecord | null;
152
+ list(options?: AgentRunListOptions): AgentRunRecord[];
153
+ events(runId: string, limit?: number): AgentRunEvent[];
154
+ stop(runId: string, reason?: string): Promise<AgentRunRecord | null>;
155
+ pause(runId: string, reason?: string): Promise<AgentRunRecord | null>;
156
+ resume(runId: string, reason?: string): Promise<AgentRunRecord | null>;
157
+ complete(runId: string, status: Extract<AgentRunStatus, "completed" | "failed" | "interrupted">, options?: {
158
+ reason?: string;
159
+ exitCode?: number | null;
160
+ usage?: AgentRunUsage;
161
+ }): AgentRunRecord | null;
162
+ }
163
+ declare const AGENT_DAEMON_PROTOCOL_VERSION: 1;
164
+ interface AgentDaemonRequest<T = unknown> {
165
+ protocolVersion: typeof AGENT_DAEMON_PROTOCOL_VERSION;
166
+ id: string;
167
+ method: string;
168
+ params: T;
169
+ authToken?: string;
170
+ }
171
+ interface AgentDaemonError {
172
+ code: string;
173
+ message: string;
174
+ }
175
+ type AgentDaemonResponse<T = unknown> = {
176
+ protocolVersion: 1;
177
+ id: string;
178
+ result: T;
179
+ } | {
180
+ protocolVersion: 1;
181
+ id: string;
182
+ error: AgentDaemonError;
183
+ };
184
+ type AgentDaemonHandler = (params: unknown, request: AgentDaemonRequest) => unknown | Promise<unknown>;
185
+ type AgentDaemonTransport = (request: AgentDaemonRequest) => AgentDaemonResponse | Promise<AgentDaemonResponse>;
186
+ declare class AgentDaemonServer {
187
+ private readonly options;
188
+ private readonly handlers;
189
+ constructor(options?: {
190
+ authToken?: string;
191
+ });
192
+ register(method: string, handler: AgentDaemonHandler): this;
193
+ registerController(controller: AgentRunController): this;
194
+ handle(request: AgentDaemonRequest): Promise<AgentDaemonResponse>;
195
+ private error;
196
+ }
197
+ declare class AgentDaemonClient {
198
+ private readonly transport;
199
+ private readonly options;
200
+ constructor(transport: AgentDaemonTransport, options?: {
201
+ authToken?: string;
202
+ });
203
+ request<TResult = unknown, TParams = unknown>(method: string, params: TParams): Promise<TResult>;
204
+ }
205
+ interface WorkflowNodeDefinition {
206
+ id: string;
207
+ dependsOn?: string[];
208
+ input?: unknown;
209
+ }
210
+ interface WorkflowDefinition {
211
+ schemaVersion: 1;
212
+ id: string;
213
+ name: string;
214
+ nodes: WorkflowNodeDefinition[];
215
+ maxConcurrency?: number;
216
+ failFast?: boolean;
217
+ }
218
+ type WorkflowNodeStatus = "pending" | "running" | "completed" | "failed" | "skipped";
219
+ type WorkflowRunStatus = "queued" | "running" | "completed" | "failed" | "cancelled";
220
+ interface WorkflowRunNodeRecord {
221
+ status: WorkflowNodeStatus;
222
+ startedAt?: string;
223
+ completedAt?: string;
224
+ output?: unknown;
225
+ error?: string;
226
+ }
227
+ interface WorkflowRunRecord {
228
+ schemaVersion: 1;
229
+ runId: string;
230
+ workflowId: string;
231
+ status: WorkflowRunStatus;
232
+ createdAt: string;
233
+ updatedAt: string;
234
+ completedAt?: string;
235
+ nodes: Record<string, WorkflowRunNodeRecord>;
236
+ }
237
+ interface WorkflowEvent {
238
+ schemaVersion: 1;
239
+ eventId: string;
240
+ runId: string;
241
+ type: string;
242
+ timestamp: string;
243
+ nodeId?: string;
244
+ payload: Record<string, unknown>;
245
+ }
246
+ interface WorkflowPlan {
247
+ workflowId: string;
248
+ waves: string[][];
249
+ }
250
+ declare class WorkflowPlanner {
251
+ plan(definition: WorkflowDefinition): WorkflowPlan;
252
+ }
253
+ declare class WorkflowStore {
254
+ private readonly rootDir;
255
+ constructor(rootDir?: string);
256
+ saveDefinition(definition: WorkflowDefinition): WorkflowDefinition;
257
+ getDefinition(id: string): WorkflowDefinition | null;
258
+ listDefinitions(): WorkflowDefinition[];
259
+ createRun(definition: WorkflowDefinition): WorkflowRunRecord;
260
+ getRun(runId: string): WorkflowRunRecord | null;
261
+ updateRun(runId: string, updater: (record: WorkflowRunRecord) => WorkflowRunRecord): WorkflowRunRecord;
262
+ appendEvent(runId: string, type: string, payload: Record<string, unknown>, nodeId?: string): WorkflowEvent;
263
+ readEvents(runId: string): WorkflowEvent[];
264
+ private writeRun;
265
+ private definitionsDir;
266
+ private runsDir;
267
+ private runPath;
268
+ private eventsPath;
269
+ }
270
+ type WorkflowNodeExecutor = (node: WorkflowNodeDefinition, context: {
271
+ run: WorkflowRunRecord;
272
+ definition: WorkflowDefinition;
273
+ }) => unknown | Promise<unknown>;
274
+ declare class WorkflowRuntime {
275
+ private readonly store;
276
+ private readonly planner;
277
+ constructor(store?: WorkflowStore, planner?: WorkflowPlanner);
278
+ run(definition: WorkflowDefinition, executor: WorkflowNodeExecutor): Promise<WorkflowRunRecord>;
279
+ }
280
+ interface MonitorEvent {
281
+ schemaVersion: 1;
282
+ eventId: string;
283
+ sourceId: string;
284
+ type: string;
285
+ timestamp: string;
286
+ payload: Record<string, unknown>;
287
+ }
288
+ interface MonitorSource {
289
+ id: string;
290
+ start?(): void | Promise<void>;
291
+ poll(): Array<Omit<MonitorEvent, "schemaVersion" | "eventId" | "sourceId" | "timestamp"> & {
292
+ timestamp?: string;
293
+ }> | Promise<Array<Omit<MonitorEvent, "schemaVersion" | "eventId" | "sourceId" | "timestamp"> & {
294
+ timestamp?: string;
295
+ }>>;
296
+ stop?(): void | Promise<void>;
297
+ }
298
+ interface MonitorSnapshot {
299
+ sourceId: string;
300
+ running: boolean;
301
+ events: MonitorEvent[];
302
+ }
303
+ declare class MonitorManager {
304
+ private readonly maxEvents;
305
+ private readonly sources;
306
+ private readonly events;
307
+ constructor(maxEvents?: number);
308
+ register(source: MonitorSource): this;
309
+ start(sourceId: string, intervalMs?: number): Promise<MonitorSnapshot>;
310
+ poll(sourceId: string): Promise<MonitorEvent[]>;
311
+ stop(sourceId: string): Promise<MonitorSnapshot>;
312
+ stopAll(): Promise<void>;
313
+ snapshot(sourceId: string, limit?: number): MonitorSnapshot;
314
+ list(): Array<{
315
+ sourceId: string;
316
+ running: boolean;
317
+ }>;
318
+ private require;
319
+ }
320
+ declare class MonitorTool {
321
+ private readonly manager;
322
+ constructor(manager: MonitorManager);
323
+ execute(input: {
324
+ sourceId: string;
325
+ intervalMs?: number;
326
+ }): Promise<MonitorSnapshot>;
327
+ }
328
+ declare class MonitorStopTool {
329
+ private readonly manager;
330
+ constructor(manager: MonitorManager);
331
+ execute(input: {
332
+ sourceId: string;
333
+ }): Promise<MonitorSnapshot>;
334
+ }
335
+ interface UsageAttribution {
336
+ runId?: string;
337
+ sessionId?: string;
338
+ workflowRunId?: string;
339
+ agentId?: string;
340
+ provider?: string;
341
+ model?: string;
342
+ }
343
+ interface UsageEvent extends UsageAttribution {
344
+ schemaVersion: 1;
345
+ eventId: string;
346
+ timestamp: string;
347
+ inputTokens: number;
348
+ outputTokens: number;
349
+ cachedInputTokens?: number;
350
+ estimatedCostUsd?: number;
351
+ metadata?: Record<string, string | number | boolean>;
352
+ }
353
+ interface UsageQuery extends UsageAttribution {
354
+ from?: string;
355
+ to?: string;
356
+ }
357
+ interface UsageTotals {
358
+ inputTokens: number;
359
+ outputTokens: number;
360
+ totalTokens: number;
361
+ cachedInputTokens: number;
362
+ estimatedCostUsd: number;
363
+ events: number;
364
+ }
365
+ declare class UsageAccumulator {
366
+ private totalsValue;
367
+ add(event: Pick<UsageEvent, "inputTokens" | "outputTokens" | "cachedInputTokens" | "estimatedCostUsd">): this;
368
+ snapshot(): UsageTotals;
369
+ }
370
+ declare class UsageLedger {
371
+ private readonly path;
372
+ constructor(path?: string);
373
+ append(input: Omit<UsageEvent, "schemaVersion" | "eventId" | "timestamp"> & {
374
+ timestamp?: string;
375
+ }): UsageEvent;
376
+ query(query?: UsageQuery): UsageEvent[];
377
+ summarize(query?: UsageQuery): UsageTotals;
378
+ }
379
+ interface OtelUsageAdapter {
380
+ addCounter(name: string, value: number, attributes: Readonly<Record<string, string>>): void;
381
+ recordEvent?(name: string, attributes: Readonly<Record<string, string>>): void;
382
+ }
383
+ declare class OtelExporter {
384
+ private readonly adapter;
385
+ constructor(adapter: OtelUsageAdapter);
386
+ export(events: readonly UsageEvent[]): void;
387
+ }
388
+ interface ControlPlaneLockRecord {
389
+ schemaVersion: 1;
390
+ name: string;
391
+ pid: number;
392
+ hostname: string;
393
+ processStartedAt: string;
394
+ version: string;
395
+ acquiredAt: string;
396
+ updatedAt: string;
397
+ }
398
+ interface ControlPlaneLockHandle {
399
+ record: ControlPlaneLockRecord;
400
+ release: () => void;
401
+ }
402
+ declare function acquireControlPlaneLock(path: string, name: string, version: string): ControlPlaneLockHandle;
403
+ export { AGENT_DAEMON_PROTOCOL_VERSION, AgentDaemonClient, type AgentDaemonError, type AgentDaemonHandler, type AgentDaemonRequest, type AgentDaemonResponse, AgentDaemonServer, type AgentDaemonTransport, AgentEventStore, type AgentRunAgentDefinitionRef, AgentRunController, type AgentRunControllerOptions, type AgentRunCreateInput, type AgentRunEvent, type AgentRunListOptions, type AgentRunRecord, type AgentRunSpawnResult, type AgentRunStatus, AgentRunStore, type AgentRunUsage, type ControlPlaneLockHandle, type ControlPlaneLockRecord, type MonitorEvent, MonitorManager, type MonitorSnapshot, type MonitorSource, MonitorStopTool, MonitorTool, OtelExporter, type OtelUsageAdapter, UsageAccumulator, type UsageAttribution, type UsageEvent, UsageLedger, type UsageQuery, type UsageTotals, type WorkflowDefinition, type WorkflowEvent, type WorkflowNodeDefinition, type WorkflowNodeExecutor, type WorkflowNodeStatus, type WorkflowPlan, WorkflowPlanner, type WorkflowRunNodeRecord, type WorkflowRunRecord, type WorkflowRunStatus, WorkflowRuntime, WorkflowStore, acquireControlPlaneLock, createAgentRunId, getAgentRunDir, getAgentRunStoreDir };