adam-agent-server 1.15.0 → 1.16.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 (153) hide show
  1. package/dist/App-Z2GJAMX3.js +14 -0
  2. package/dist/approval-handler-6NPN24UN.js +1 -0
  3. package/dist/artifacts-S2KD6W76.js +1 -0
  4. package/dist/audit-diagnostics-2MDM3IQT.js +1 -0
  5. package/dist/audit-manager-QG7CMBV2.js +1 -0
  6. package/dist/bree-engine-3QSLZF3W.js +1 -0
  7. package/dist/channels-S4AAOOTN.js +1 -0
  8. package/dist/channels-TYXSSI7D.js +1 -0
  9. package/dist/{chat-tool-calls-KARPW7PE.js → chat-tool-calls-2C7O4B2X.js} +1 -1
  10. package/dist/chunk-32LOJEHE.js +32 -0
  11. package/dist/{chunk-VNXTBIPI.js → chunk-3UR2PN5N.js} +1 -1
  12. package/dist/{chunk-D3SPXZZY.js → chunk-3UZIEE2D.js} +1 -1
  13. package/dist/chunk-4234WJJD.js +178 -0
  14. package/dist/{chunk-2N4EOZZ4.js → chunk-52FETPCI.js} +1 -1
  15. package/dist/{chunk-3KNR2F6H.js → chunk-6Y2DN2UH.js} +1 -1
  16. package/dist/{chunk-NWGRLNUM.js → chunk-AG5SADAI.js} +1 -1
  17. package/dist/chunk-AQAHVNNG.js +34 -0
  18. package/dist/{chunk-FD4IKMXV.js → chunk-C2XFPUFV.js} +1 -1
  19. package/dist/chunk-EWYXVBOG.js +61 -0
  20. package/dist/{chunk-ISKCTUI7.js → chunk-FHESRUJY.js} +1 -1
  21. package/dist/{chunk-BKNXRSJU.js → chunk-FYULPPFR.js} +1 -1
  22. package/dist/{chunk-GXWB47NF.js → chunk-H4MMEULK.js} +4 -4
  23. package/dist/chunk-HC34HJFF.js +1 -0
  24. package/dist/{chunk-XF7YHFVR.js → chunk-HJICGOD4.js} +1 -1
  25. package/dist/{chunk-F6U5TMM3.js → chunk-HXDS4NWI.js} +1 -1
  26. package/dist/{chunk-3BRHWRZ5.js → chunk-I44JKROJ.js} +1 -1
  27. package/dist/chunk-K2TZW4DU.js +132 -0
  28. package/dist/{chunk-RBJPQYV3.js → chunk-K4IE6DPX.js} +1 -1
  29. package/dist/{chunk-NPGZRSGL.js → chunk-LQVBWVLE.js} +1 -1
  30. package/dist/chunk-LVHLUAZW.js +22 -0
  31. package/dist/{chunk-ICAM2GUU.js → chunk-MNSZE3NV.js} +1 -1
  32. package/dist/{chunk-KJNAORKM.js → chunk-MTQI6B7T.js} +1 -1
  33. package/dist/chunk-NS6WVZMS.js +1 -0
  34. package/dist/{chunk-IRUR4DVD.js → chunk-OGY42NUN.js} +1 -1
  35. package/dist/{chunk-OQ3JOTPK.js → chunk-OXGWWSKT.js} +1 -1
  36. package/dist/{chunk-I7LJ4432.js → chunk-P5Q2UINT.js} +1 -1
  37. package/dist/{chunk-BPXS4QEO.js → chunk-QL2ZOLMC.js} +88 -21
  38. package/dist/{chunk-TZCMK3UG.js → chunk-R24YRJRG.js} +1 -1
  39. package/dist/{chunk-42V6ZPCS.js → chunk-SCUPWMI5.js} +1 -1
  40. package/dist/{chunk-J3VYLSJI.js → chunk-TCBGUVVU.js} +1 -1
  41. package/dist/{chunk-XIVFVKMB.js → chunk-TJTH7LHX.js} +1 -1
  42. package/dist/chunk-VVQ532U2.js +6 -0
  43. package/dist/chunk-WVHN54MA.js +14 -0
  44. package/dist/{chunk-XZEBYOFR.js → chunk-YNS5LQX5.js} +10 -10
  45. package/dist/cli.js +2 -2
  46. package/dist/{config-XO7TGH27.js → config-HDAAV5FV.js} +1 -1
  47. package/dist/{db-WCTOLFAZ.js → db-HFBXO2O5.js} +1 -1
  48. package/dist/{delivery-log-ML4RJOBM.js → delivery-log-3O3OHKY4.js} +1 -1
  49. package/dist/engine-J43ECCH7.js +1 -0
  50. package/dist/{evolution-audit-HLU7LQL6.js → evolution-audit-BSGPFGFK.js} +1 -1
  51. package/dist/execution-tools-HHUPWLCF.js +1 -0
  52. package/dist/index.js +41 -41
  53. package/dist/{learner-NJXX2RUL.js → learner-TQQZKRSB.js} +1 -1
  54. package/dist/{memories-JDTQM3UN.js → memories-2DY5G6ZN.js} +1 -1
  55. package/dist/{memory-extractor-5PTMCSOX.js → memory-extractor-TUOOFST2.js} +1 -1
  56. package/dist/memory-gc-MRO53MEY.js +1 -0
  57. package/dist/memory-service-23WVAW7T.js +1 -0
  58. package/dist/outbound-gateway-VXODXSQR.js +1 -0
  59. package/dist/presets-KJV6SNNB.js +1 -0
  60. package/dist/{reflection-job-ST4ANCGB.js → reflection-job-EFFW3WOR.js} +3 -3
  61. package/dist/role-presets-PHHL3OEN.js +1 -0
  62. package/dist/role-workspace-USY47ZPQ.js +1 -0
  63. package/dist/{roles-F6AEM6B5.js → roles-3JXNHL7K.js} +1 -1
  64. package/dist/{session-manager-JTQRJI7R.js → session-manager-PI3JEINK.js} +1 -1
  65. package/dist/skill-registry-ROGU2WED.js +1 -0
  66. package/dist/{task-templates-6G46OVYT.js → task-templates-4YPKFFKG.js} +1 -1
  67. package/dist/template-dispatch-46TN534D.js +1 -0
  68. package/package.json +1 -1
  69. package/web/dist/assets/ArtifactDetail-9DJdEqCz.js +66 -0
  70. package/web/dist/assets/Artifacts-CQ6SAemH.js +1 -0
  71. package/web/dist/assets/{Button-fLMsJd5o.js → Button-xVc-P0vm.js} +1 -1
  72. package/web/dist/assets/{Card-cy-gHU0O.js → Card-WUD1cwG6.js} +1 -1
  73. package/web/dist/assets/ChannelDetail-B21nBQwi.js +1 -0
  74. package/web/dist/assets/{Channels-DMutLV9r.js → Channels-CAeGE1r7.js} +2 -2
  75. package/web/dist/assets/Chat-KpFWchPp.js +2 -0
  76. package/web/dist/assets/{Dashboard-CoatfhW8.js → Dashboard-DkRwHNmr.js} +1 -1
  77. package/web/dist/assets/{EmptyState-C5kVDHc7.js → EmptyState-BLB33cKG.js} +1 -1
  78. package/web/dist/assets/{EnvVarEditor-BvRsHayG.js → EnvVarEditor-BchUNrmz.js} +1 -1
  79. package/web/dist/assets/{EventDefDetail-zuJydp12.js → EventDefDetail-DnBwWWfT.js} +1 -1
  80. package/web/dist/assets/Events-ByIzPIs2.js +1 -0
  81. package/web/dist/assets/{Evolution-Br41g99g.js → Evolution-Vh9RKdma.js} +1 -1
  82. package/web/dist/assets/{ExtensionDetail-BXlphIkn.js → ExtensionDetail-0CtJh5rF.js} +1 -1
  83. package/web/dist/assets/Extensions--O1ulwlC.js +1 -0
  84. package/web/dist/assets/{FeatureRequests-oaXQNu43.js → FeatureRequests-XhQbGg_q.js} +1 -1
  85. package/web/dist/assets/GoalDetail-DIOxf7ES.js +1 -0
  86. package/web/dist/assets/Goals-CZnHu9qC.js +1 -0
  87. package/web/dist/assets/{Logs-BZKxhdnb.js → Logs-DdeG3GiY.js} +1 -1
  88. package/web/dist/assets/{Memories-DhJJk-KB.js → Memories-D-EAODUg.js} +1 -1
  89. package/web/dist/assets/{Mistakes-DxThj9as.js → Mistakes-wW78K3cP.js} +1 -1
  90. package/web/dist/assets/{NotFound-buXr2gl7.js → NotFound-BsxIP-Xm.js} +1 -1
  91. package/web/dist/assets/{PageHeader-BgNbz3JV.js → PageHeader-D8pqg_wk.js} +1 -1
  92. package/web/dist/assets/Plugins-DDUdX51_.js +1 -0
  93. package/web/dist/assets/{RoleDetail-rClUsHwS.js → RoleDetail-CU3G9j_q.js} +4 -4
  94. package/web/dist/assets/Roles-BCoSzDBg.js +1 -0
  95. package/web/dist/assets/{SectionHeader-CwX6m1f6.js → SectionHeader-DZo4QVWr.js} +1 -1
  96. package/web/dist/assets/{Settings-My2lOEWv.js → Settings-K3usfV-2.js} +1 -1
  97. package/web/dist/assets/{Strategies-YLMryJlG.js → Strategies-Bg4qlLei.js} +1 -1
  98. package/web/dist/assets/{Switch-PNpjNoGn.js → Switch-WWPXnSOG.js} +1 -1
  99. package/web/dist/assets/{Table-BrERwl-F.js → Table-XjSmrOyn.js} +1 -1
  100. package/web/dist/assets/{Tabs-CGHmpUAD.js → Tabs-CSbcG_5T.js} +1 -1
  101. package/web/dist/assets/TaskDetail-C5roukcV.js +2 -0
  102. package/web/dist/assets/Work-DGTWSgtc.js +1 -0
  103. package/web/dist/assets/{es2015-JqLIWAgH.js → es2015-BgPT8VkR.js} +1 -1
  104. package/web/dist/assets/index-KNUbHDLy.css +2 -0
  105. package/web/dist/assets/index-iD-HOtIu.js +12 -0
  106. package/web/dist/assets/{useIsMobileLayout-Blj4Mk4K.js → useIsMobileLayout-DF2fEEM9.js} +1 -1
  107. package/web/dist/assets/{usePluginsWithUsage-Ch9WCFTb.js → usePluginsWithUsage-CjU8Lkdn.js} +1 -1
  108. package/web/dist/assets/vendor-icons-H7p0EuQJ.js +1 -0
  109. package/web/dist/assets/{vendor-react-Bp_V-Hsf.js → vendor-react-C1yKjxEP.js} +1 -1
  110. package/web/dist/assets/{vendor-state-Zjl_6-V3.js → vendor-state-D0TNAbOY.js} +1 -1
  111. package/web/dist/index.html +7 -7
  112. package/dist/App-6TRGTNZ7.js +0 -13
  113. package/dist/approval-handler-YLO3V75T.js +0 -1
  114. package/dist/audit-diagnostics-MASYIEGZ.js +0 -1
  115. package/dist/audit-manager-LYBXP7U4.js +0 -1
  116. package/dist/bree-engine-AA7EVKTG.js +0 -1
  117. package/dist/channels-2IL6USWL.js +0 -1
  118. package/dist/channels-6BEGHNOK.js +0 -1
  119. package/dist/chunk-6NWIZ3BH.js +0 -220
  120. package/dist/chunk-APAOIZN4.js +0 -114
  121. package/dist/chunk-CLNYHWZ6.js +0 -5
  122. package/dist/chunk-EVUZ5LH2.js +0 -1
  123. package/dist/chunk-L47LZYVG.js +0 -21
  124. package/dist/chunk-LU3D53ZV.js +0 -34
  125. package/dist/chunk-SVUP3F4V.js +0 -14
  126. package/dist/chunk-TLP4ZMJB.js +0 -19
  127. package/dist/chunk-UFWMUBFH.js +0 -25
  128. package/dist/engine-XLH4VL6Y.js +0 -1
  129. package/dist/execution-tools-SYP3GR6T.js +0 -1
  130. package/dist/memory-gc-BCHTOSXK.js +0 -1
  131. package/dist/memory-service-66EMRJXO.js +0 -1
  132. package/dist/outbound-gateway-3INYZDOR.js +0 -1
  133. package/dist/presets-DT3J2ON4.js +0 -1
  134. package/dist/role-presets-3IQKCSVQ.js +0 -1
  135. package/dist/role-workspace-SIHNI6HO.js +0 -1
  136. package/dist/skill-registry-4JT62GEF.js +0 -1
  137. package/dist/template-dispatch-2K7KV7YS.js +0 -1
  138. package/dist/template-execution-artifacts-NEPSVD2B.js +0 -1
  139. package/web/dist/assets/ChannelDetail-CsKBPHkT.js +0 -1
  140. package/web/dist/assets/Chat-DWTs-iOw.js +0 -2
  141. package/web/dist/assets/Events-nCImjXyr.js +0 -1
  142. package/web/dist/assets/Extensions-3lhbw0A2.js +0 -1
  143. package/web/dist/assets/GoalDetail-DRDg1JDv.js +0 -1
  144. package/web/dist/assets/Goals-DGmKvtGA.js +0 -1
  145. package/web/dist/assets/Plugins-BXrsGsXs.js +0 -1
  146. package/web/dist/assets/Roles-DH9cRv8h.js +0 -1
  147. package/web/dist/assets/TaskDetail-Bkaq0NwW.js +0 -2
  148. package/web/dist/assets/Work-4OcGMu_a.js +0 -1
  149. package/web/dist/assets/index-C-e-qpXc.js +0 -12
  150. package/web/dist/assets/index-DGTVc0qD.css +0 -2
  151. package/web/dist/assets/vendor-icons-U4igmrUq.js +0 -1
  152. /package/web/dist/assets/{format-BUYXZqDw.js → format-ZWN4JNj-.js} +0 -0
  153. /package/web/dist/assets/{ui-CerQw0jA.js → ui-D1crlGpt.js} +0 -0
@@ -1,8 +1,8 @@
1
- import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"./chunk-BLCNUT53.js";import{c as M}from"./chunk-FCV2DPZQ.js";import{constants as re,cpSync as te,copyFileSync as W,existsSync as u,lstatSync as se,mkdirSync as Y,readdirSync as ie,realpathSync as D,rmSync as K,statSync as h,unlinkSync as j}from"fs";import{dirname as $,extname as Ee,isAbsolute as Te,join as L,sep as O}from"path";function q(){return process.env.ADAM_TEST_DIR||P}function ne(){return L(q(),["work","flows"].join(""))}function x(){return L(q(),"template-executions")}function V(e){return L(x(),e,"artifacts")}function oe(e){let a=V(e);return Y(a,{recursive:!0}),a}function ve(e,a,m){if(!Te(e))throw new Error(`path must be absolute: ${e}`);let _=D(a),d=_.endsWith(O)?_:_+O;if(m){let l=D(e),A=l.endsWith(O)?l:l+O;if(A===d||A.startsWith(d))return;throw new Error(`path escapes workspace: ${e} (resolved=${l}, root=${_})`)}if(u(e))throw se(e).isSymbolicLink()?new Error(`destination already exists and is a symlink: ${e}`):new Error(`destination already exists: ${e}`);let N=D($(e)),I=N.endsWith(O)?N:N+O;if(!(I===d||I.startsWith(d)))throw new Error(`destination escapes workspace: ${e} (parent resolved=${N}, root=${_})`)}function fe(e){let a=oe(e.executionId),m=L(a,`${e.artifactId}.bin`);return W(e.sourcePath,m),{blobPath:m,sizeBytes:h(m).size}}function ge(e){j(e)}function Se(e){if(!u(e.blobPath))throw new Error(`blob file missing on disk: ${e.blobPath}`);return W(e.blobPath,e.destPath,re.COPYFILE_EXCL),{sizeBytes:h(e.destPath).size}}function J(e){try{j(e)}catch(a){v.warn({err:a,blobPath:e},"Failed to remove TemplateExecution artifact blob")}}function Ce(e){try{K(L(x(),e),{recursive:!0,force:!0})}catch(a){v.warn({err:a,executionId:e},"Failed to remove TemplateExecution artifacts directory")}}function Ue(e,a,m){let _=V(e);if(!u(_))return 0;let d=0;for(let N of ie(_)){if(Ee(N)!==".bin")continue;let I=N.slice(0,-4);if(a.has(I))continue;let l=L(_,N),A=h(l);Date.now()-A.mtimeMs<m||(J(l),d++)}return d}async function De(e,a){let{deleteArtifactsByExecutionAndStep:m}=await import("./template-execution-artifacts-NEPSVD2B.js"),_=m(e,a),d=0;for(let N of _)N.blobPath&&u(N.blobPath)&&(J(N.blobPath),d++);return v.debug({executionId:e,stepId:a,deletedRows:_.length,deletedFiles:d},"cleanSlatePriorAttempt: done"),{deletedRows:_.length,deletedFiles:d}}function z(e){let a=ne();if(!u(a)||!e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='template_execution_artifacts'").get())return;let _=e.prepare(`
1
+ import{d as B,e as W,h as Y}from"./chunk-WBAPIPST.js";import{c as g,h as K}from"./chunk-BLCNUT53.js";import{c as H}from"./chunk-FCV2DPZQ.js";import{constants as te,cpSync as se,copyFileSync as y,existsSync as I,lstatSync as ie,mkdirSync as F,readdirSync as Ee,realpathSync as S,rmSync as j,statSync as C,unlinkSync as $}from"fs";import{dirname as q,extname as ne,isAbsolute as V,join as m,sep as R}from"path";function D(){return process.env.ADAM_TEST_DIR||B}function Te(){return m(D(),["work","flows"].join(""))}function k(){return m(D(),"template-executions")}function z(e){return m(k(),e,"artifacts")}function oe(e){let _=z(e);return F(_,{recursive:!0}),_}function ve(e,_,N){if(!V(e))throw new Error(`path must be absolute: ${e}`);let a=S(_),d=a.endsWith(R)?a:a+R;if(N){let l=S(e),u=l.endsWith(R)?l:l+R;if(u===d||u.startsWith(d))return;throw new Error(`path escapes workspace: ${e} (resolved=${l}, root=${a})`)}if(I(e))throw ie(e).isSymbolicLink()?new Error(`destination already exists and is a symlink: ${e}`):new Error(`destination already exists: ${e}`);let p=S(q(e)),O=p.endsWith(R)?p:p+R;if(!(O===d||O.startsWith(d)))throw new Error(`destination escapes workspace: ${e} (parent resolved=${p}, root=${a})`)}function Se(e){let _=oe(e.executionId),N=m(_,`${e.artifactId}.bin`);return y(e.sourcePath,N),{blobPath:N,sizeBytes:C(N).size}}function ge(e){$(e)}function Ce(e){if(!I(e.blobPath))throw new Error(`blob file missing on disk: ${e.blobPath}`);return y(e.blobPath,e.destPath,te.COPYFILE_EXCL),{sizeBytes:C(e.destPath).size}}function J(e){try{$(e)}catch(_){f.warn({err:_,blobPath:e},"Failed to remove TemplateExecution artifact blob")}}function De(e){try{j(m(k(),e),{recursive:!0,force:!0})}catch(_){f.warn({err:_,executionId:e},"Failed to remove TemplateExecution artifacts directory")}}function Ue(e,_,N){let a=z(e);if(!I(a))return 0;let d=0;for(let p of Ee(a)){if(ne(p)!==".bin")continue;let O=p.slice(0,-4);if(_.has(O))continue;let l=m(a,p),u=C(l);Date.now()-u.mtimeMs<N||(J(l),d++)}return d}async function he(e,_){let{deleteArtifactsByExecutionAndStep:N}=await import("./artifacts-S2KD6W76.js"),a=N(e,_),d=0;for(let p of a)p.blobPath&&I(p.blobPath)&&(J(p.blobPath),d++);return f.debug({executionId:e,stepId:_,deletedRows:a.length,deletedFiles:d},"cleanSlatePriorAttempt: done"),{deletedRows:a.length,deletedFiles:d}}function _e(e,_){let N=D();if(e==="template"){if(!_)throw new Error("template kind requires executionId");return m(N,"template-executions",_,"artifacts")}return m(N,"artifacts",e)}function xe(e){let _=_e(e.kind,e.executionId);F(_,{recursive:!0});let N=m(_,`${e.artifactId}.bin`);return y(e.sourcePath,N),{blobPath:N,sizeBytes:C(N).size}}function ye(e){try{if(!V(e))return!1;let _=S(e),N=S(D()),a=N.endsWith(R)?N:N+R,d=_.endsWith(R)?_:_+R;return d===a||d.startsWith(a)}catch{return!1}}function Q(e){let _=Te();if(!I(_)||!e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='template_execution_artifacts'").get())return;let a=e.prepare(`
2
2
  SELECT id, execution_id, blob_path
3
3
  FROM template_execution_artifacts
4
4
  WHERE blob_path IS NOT NULL
5
- `).all(),d=a.endsWith(O)?a:a+O,N=x(),I=new Set;for(let l of _){if(!l.blob_path.startsWith(d))continue;let A=L(a,l.execution_id),X=L(N,l.execution_id),U=L(N,l.blob_path.slice(d.length));try{if(u(A)&&!u(X)&&(Y($(X),{recursive:!0}),te(A,X,{recursive:!0,dereference:!1,force:!1})),!u(U)){v.warn({artifactId:l.id,blobPath:l.blob_path},"TemplateExecution artifact migration skipped missing copied blob");continue}e.prepare("UPDATE template_execution_artifacts SET blob_path = ? WHERE id = ?").run(U,l.id),I.add(l.execution_id)}catch(F){v.warn({err:F,artifactId:l.id,executionId:l.execution_id},"TemplateExecution artifact migration failed")}}for(let l of I){let A=L(N,l);if(u(A))try{K(L(a,l),{recursive:!0,force:!0})}catch(X){v.warn({err:X,executionId:l},"Failed to remove migrated legacy artifact directory")}}}var v,Q=M(()=>{"use strict";H();B();v=g("watchdog")});import _e from"better-sqlite3";import{existsSync as ae,mkdirSync as ce}from"fs";import{dirname as le}from"path";function pe(e){e.exec(`
5
+ `).all(),d=_.endsWith(R)?_:_+R,p=k(),O=new Set;for(let l of a){if(!l.blob_path.startsWith(d))continue;let u=m(_,l.execution_id),X=m(p,l.execution_id),x=m(p,l.blob_path.slice(d.length));try{if(I(u)&&!I(X)&&(F(q(X),{recursive:!0}),se(u,X,{recursive:!0,dereference:!1,force:!1})),!I(x)){f.warn({artifactId:l.id,blobPath:l.blob_path},"TemplateExecution artifact migration skipped missing copied blob");continue}e.prepare("UPDATE template_execution_artifacts SET blob_path = ? WHERE id = ?").run(x,l.id),O.add(l.execution_id)}catch(M){f.warn({err:M,artifactId:l.id,executionId:l.execution_id},"TemplateExecution artifact migration failed")}}for(let l of O){let u=m(p,l);if(I(u))try{j(m(_,l),{recursive:!0,force:!0})}catch(X){f.warn({err:X,executionId:l},"Failed to remove migrated legacy artifact directory")}}}var f,Z=H(()=>{"use strict";Y();K();f=g("watchdog")});import ae from"better-sqlite3";import{existsSync as ce,mkdirSync as le}from"fs";import{dirname as Ne}from"path";function me(e){e.exec(`
6
6
  CREATE TABLE IF NOT EXISTS server_state (
7
7
  id INTEGER PRIMARY KEY CHECK(id = 1),
8
8
  sdk_session_id TEXT,
@@ -12,7 +12,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
12
12
  created_at INTEGER NOT NULL DEFAULT (unixepoch('now') * 1000),
13
13
  last_active_at INTEGER
14
14
  );
15
- `),e.prepare("PRAGMA table_info(server_state)").all().some(s=>s.name==="schema_version")||e.exec("ALTER TABLE server_state ADD COLUMN schema_version INTEGER DEFAULT 0");let _=e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0;if(_<2){let s=["delivery_log","delivery_rules","manager_decisions","skill_scores","approval_rules","task_plans","calibration_history","task_plugins","marketplaces","plugins","trials","strategies","metric_tree","goals","chat_messages","chat_sessions","channels","evolution_audit","step_logs","task_templates","memories","tasks","config","memories_fts","memories_fts_config","memories_fts_data","memories_fts_docsize","memories_fts_idx"];for(let t of s)try{e.exec(`DROP TABLE IF EXISTS ${t}`)}catch{}for(let t of["memories_fts_insert","memories_fts_delete","memories_fts_update"])try{e.exec(`DROP TRIGGER IF EXISTS ${t}`)}catch{}}if(e.exec(`
15
+ `),e.prepare("PRAGMA table_info(server_state)").all().some(s=>s.name==="schema_version")||e.exec("ALTER TABLE server_state ADD COLUMN schema_version INTEGER DEFAULT 0");let a=e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0;if(a<2){let s=["delivery_log","delivery_rules","manager_decisions","skill_scores","approval_rules","task_plans","calibration_history","task_plugins","marketplaces","plugins","trials","strategies","metric_tree","goals","chat_messages","chat_sessions","channels","evolution_audit","step_logs","task_templates","memories","tasks","config","memories_fts","memories_fts_config","memories_fts_data","memories_fts_docsize","memories_fts_idx"];for(let t of s)try{e.exec(`DROP TABLE IF EXISTS ${t}`)}catch{}for(let t of["memories_fts_insert","memories_fts_delete","memories_fts_update"])try{e.exec(`DROP TRIGGER IF EXISTS ${t}`)}catch{}}if(e.exec(`
16
16
  CREATE TABLE IF NOT EXISTS tasks (
17
17
  id TEXT PRIMARY KEY,
18
18
  parent_id TEXT,
@@ -373,7 +373,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
373
373
 
374
374
  CREATE INDEX IF NOT EXISTS idx_calibration_goal ON calibration_history(goal_id);
375
375
  CREATE INDEX IF NOT EXISTS idx_calibration_computed ON calibration_history(computed_at);
376
- `),_<2&&e.exec("UPDATE server_state SET schema_version = 2 WHERE id = 1"),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<4&&(e.exec(`
376
+ `),a<2&&e.exec("UPDATE server_state SET schema_version = 2 WHERE id = 1"),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<4&&(e.exec(`
377
377
  CREATE TABLE IF NOT EXISTS roles (
378
378
  id TEXT PRIMARY KEY,
379
379
  name TEXT NOT NULL UNIQUE,
@@ -572,7 +572,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
572
572
  bound_at INTEGER NOT NULL,
573
573
  PRIMARY KEY (role_id, plugin_id)
574
574
  );
575
- `),e.exec("UPDATE server_state SET schema_version = 10 WHERE id = 1"),e.exec("PRAGMA foreign_keys = ON")}if(_<11){try{e.exec("ALTER TABLE task_templates RENAME COLUMN skill_preference TO role_preference")}catch(s){let t=e.prepare("PRAGMA table_info(task_templates)").all(),r=t.some(E=>E.name==="role_preference"),i=t.some(E=>E.name==="skill_preference");if(!r&&i)throw s}e.exec("UPDATE server_state SET schema_version = 11 WHERE id = 1")}if(_<12&&(e.prepare("PRAGMA table_info(server_state)").all().some(t=>t.name==="tools_fingerprint")||e.exec("ALTER TABLE server_state ADD COLUMN tools_fingerprint TEXT"),e.exec("UPDATE server_state SET schema_version = 12 WHERE id = 1")),_<13&&(e.prepare("PRAGMA table_info(roles)").all().some(t=>t.name==="additional_directories")||e.exec("ALTER TABLE roles ADD COLUMN additional_directories TEXT"),e.exec("UPDATE server_state SET schema_version = 13 WHERE id = 1")),_<14){let s=e.prepare("PRAGMA table_info(roles)").all();s.some(i=>i.name==="allowed_channels")||e.exec("ALTER TABLE roles ADD COLUMN allowed_channels TEXT"),s.some(i=>i.name==="mcp_servers")||e.exec("ALTER TABLE roles ADD COLUMN mcp_servers TEXT");let t=e.prepare("PRAGMA table_info(tasks)").all();t.some(i=>i.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),t.some(i=>i.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT"),e.prepare("PRAGMA table_info(goals)").all().some(i=>i.name==="deliver_to")||e.exec("ALTER TABLE goals ADD COLUMN deliver_to TEXT"),e.exec("UPDATE server_state SET schema_version = 14 WHERE id = 1")}if(_<15&&(e.prepare("PRAGMA table_info(roles)").all().some(t=>t.name==="inherit_user_settings")||e.exec("ALTER TABLE roles ADD COLUMN inherit_user_settings INTEGER DEFAULT 0"),e.exec("UPDATE server_state SET schema_version = 15 WHERE id = 1")),_<16&&(e.prepare("PRAGMA table_info(task_templates)").all().some(t=>t.name==="deliver_to")||e.exec("ALTER TABLE task_templates ADD COLUMN deliver_to TEXT"),e.exec("UPDATE server_state SET schema_version = 16 WHERE id = 1")),_<17){e.exec("PRAGMA foreign_keys = OFF"),e.exec("DROP TABLE IF EXISTS plugins"),e.exec("DROP TABLE IF EXISTS role_plugins"),e.exec("DROP TABLE IF EXISTS marketplaces"),e.exec("DROP INDEX IF EXISTS idx_plugins_source"),e.exec("DROP INDEX IF EXISTS idx_plugins_enabled");try{let r=e.prepare("SELECT id, additional_directories FROM roles WHERE additional_directories IS NOT NULL").all();for(let i of r)try{let E=JSON.parse(i.additional_directories);if(E.length>0&&typeof E[0]=="object"&&E[0]!==null&&"path"in E[0])continue;let T=E.map(n=>typeof n=="string"?{path:n}:n);e.prepare("UPDATE roles SET additional_directories = ? WHERE id = ?").run(JSON.stringify(T),i.id)}catch{}}catch{}let s=e.prepare("PRAGMA table_info(tasks)").all();s.some(r=>r.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),s.some(r=>r.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT");let t=e.prepare("PRAGMA table_info(strategies)").all();t.some(r=>r.name==="role")&&!t.some(r=>r.name==="role_id")&&(e.exec("ALTER TABLE strategies RENAME COLUMN role TO role_id"),e.exec("DROP INDEX IF EXISTS idx_strategies_role_task_type"),e.exec("DROP INDEX IF EXISTS idx_strategies_role"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_strategies_role_task_type ON strategies(role_id, task_type, name)"),e.exec("CREATE INDEX IF NOT EXISTS idx_strategies_role ON strategies(role_id)")),e.exec("UPDATE server_state SET schema_version = 17 WHERE id = 1"),e.exec("PRAGMA foreign_keys = ON")}if(_<18){let s=e.prepare("PRAGMA table_info(tasks)").all();s.some(r=>r.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),s.some(r=>r.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT");let t=e.prepare("PRAGMA table_info(strategies)").all();t.some(r=>r.name==="role")&&!t.some(r=>r.name==="role_id")&&(e.exec("ALTER TABLE strategies RENAME COLUMN role TO role_id"),e.exec("DROP INDEX IF EXISTS idx_strategies_role_task_type"),e.exec("DROP INDEX IF EXISTS idx_strategies_role"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_strategies_role_task_type ON strategies(role_id, task_type, name)"),e.exec("CREATE INDEX IF NOT EXISTS idx_strategies_role ON strategies(role_id)")),e.exec("UPDATE server_state SET schema_version = 18 WHERE id = 1")}e.prepare("PRAGMA table_info(delivery_log)").all().some(s=>s.name==="source")||(e.exec(`
575
+ `),e.exec("UPDATE server_state SET schema_version = 10 WHERE id = 1"),e.exec("PRAGMA foreign_keys = ON")}if(a<11){try{e.exec("ALTER TABLE task_templates RENAME COLUMN skill_preference TO role_preference")}catch(s){let t=e.prepare("PRAGMA table_info(task_templates)").all(),r=t.some(E=>E.name==="role_preference"),i=t.some(E=>E.name==="skill_preference");if(!r&&i)throw s}e.exec("UPDATE server_state SET schema_version = 11 WHERE id = 1")}if(a<12&&(e.prepare("PRAGMA table_info(server_state)").all().some(t=>t.name==="tools_fingerprint")||e.exec("ALTER TABLE server_state ADD COLUMN tools_fingerprint TEXT"),e.exec("UPDATE server_state SET schema_version = 12 WHERE id = 1")),a<13&&(e.prepare("PRAGMA table_info(roles)").all().some(t=>t.name==="additional_directories")||e.exec("ALTER TABLE roles ADD COLUMN additional_directories TEXT"),e.exec("UPDATE server_state SET schema_version = 13 WHERE id = 1")),a<14){let s=e.prepare("PRAGMA table_info(roles)").all();s.some(i=>i.name==="allowed_channels")||e.exec("ALTER TABLE roles ADD COLUMN allowed_channels TEXT"),s.some(i=>i.name==="mcp_servers")||e.exec("ALTER TABLE roles ADD COLUMN mcp_servers TEXT");let t=e.prepare("PRAGMA table_info(tasks)").all();t.some(i=>i.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),t.some(i=>i.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT"),e.prepare("PRAGMA table_info(goals)").all().some(i=>i.name==="deliver_to")||e.exec("ALTER TABLE goals ADD COLUMN deliver_to TEXT"),e.exec("UPDATE server_state SET schema_version = 14 WHERE id = 1")}if(a<15&&(e.prepare("PRAGMA table_info(roles)").all().some(t=>t.name==="inherit_user_settings")||e.exec("ALTER TABLE roles ADD COLUMN inherit_user_settings INTEGER DEFAULT 0"),e.exec("UPDATE server_state SET schema_version = 15 WHERE id = 1")),a<16&&(e.prepare("PRAGMA table_info(task_templates)").all().some(t=>t.name==="deliver_to")||e.exec("ALTER TABLE task_templates ADD COLUMN deliver_to TEXT"),e.exec("UPDATE server_state SET schema_version = 16 WHERE id = 1")),a<17){e.exec("PRAGMA foreign_keys = OFF"),e.exec("DROP TABLE IF EXISTS plugins"),e.exec("DROP TABLE IF EXISTS role_plugins"),e.exec("DROP TABLE IF EXISTS marketplaces"),e.exec("DROP INDEX IF EXISTS idx_plugins_source"),e.exec("DROP INDEX IF EXISTS idx_plugins_enabled");try{let r=e.prepare("SELECT id, additional_directories FROM roles WHERE additional_directories IS NOT NULL").all();for(let i of r)try{let E=JSON.parse(i.additional_directories);if(E.length>0&&typeof E[0]=="object"&&E[0]!==null&&"path"in E[0])continue;let n=E.map(T=>typeof T=="string"?{path:T}:T);e.prepare("UPDATE roles SET additional_directories = ? WHERE id = ?").run(JSON.stringify(n),i.id)}catch{}}catch{}let s=e.prepare("PRAGMA table_info(tasks)").all();s.some(r=>r.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),s.some(r=>r.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT");let t=e.prepare("PRAGMA table_info(strategies)").all();t.some(r=>r.name==="role")&&!t.some(r=>r.name==="role_id")&&(e.exec("ALTER TABLE strategies RENAME COLUMN role TO role_id"),e.exec("DROP INDEX IF EXISTS idx_strategies_role_task_type"),e.exec("DROP INDEX IF EXISTS idx_strategies_role"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_strategies_role_task_type ON strategies(role_id, task_type, name)"),e.exec("CREATE INDEX IF NOT EXISTS idx_strategies_role ON strategies(role_id)")),e.exec("UPDATE server_state SET schema_version = 17 WHERE id = 1"),e.exec("PRAGMA foreign_keys = ON")}if(a<18){let s=e.prepare("PRAGMA table_info(tasks)").all();s.some(r=>r.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),s.some(r=>r.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT");let t=e.prepare("PRAGMA table_info(strategies)").all();t.some(r=>r.name==="role")&&!t.some(r=>r.name==="role_id")&&(e.exec("ALTER TABLE strategies RENAME COLUMN role TO role_id"),e.exec("DROP INDEX IF EXISTS idx_strategies_role_task_type"),e.exec("DROP INDEX IF EXISTS idx_strategies_role"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_strategies_role_task_type ON strategies(role_id, task_type, name)"),e.exec("CREATE INDEX IF NOT EXISTS idx_strategies_role ON strategies(role_id)")),e.exec("UPDATE server_state SET schema_version = 18 WHERE id = 1")}e.prepare("PRAGMA table_info(delivery_log)").all().some(s=>s.name==="source")||(e.exec(`
576
576
  CREATE TABLE IF NOT EXISTS delivery_log_new (
577
577
  id TEXT PRIMARY KEY,
578
578
  rule_id TEXT REFERENCES delivery_rules(id),
@@ -589,7 +589,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
589
589
  message_type TEXT
590
590
  )
591
591
  `),e.exec(`INSERT INTO delivery_log_new (id, rule_id, task_id, status, target, content, attempts, error, created_at, delivered_at, expires_at)
592
- SELECT id, rule_id, task_id, status, target, content, attempts, error, created_at, delivered_at, expires_at FROM delivery_log`),e.exec("DROP TABLE delivery_log"),e.exec("ALTER TABLE delivery_log_new RENAME TO delivery_log"),e.exec("CREATE INDEX IF NOT EXISTS idx_delivery_log_rule ON delivery_log(rule_id)"),e.exec("CREATE INDEX IF NOT EXISTS idx_delivery_log_task ON delivery_log(task_id)")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<20&&(e.prepare("PRAGMA table_info(goals)").all().some(r=>r.name==="report_to")||e.exec("ALTER TABLE goals ADD COLUMN report_to TEXT"),e.prepare("PRAGMA table_info(task_templates)").all().some(r=>r.name==="report_to")||e.exec("ALTER TABLE task_templates ADD COLUMN report_to TEXT"),e.exec("UPDATE goals SET report_to = notify_targets WHERE notify_targets IS NOT NULL"),e.exec("UPDATE task_templates SET report_to = notify_targets WHERE notify_targets IS NOT NULL"),e.exec("UPDATE server_state SET schema_version = 20 WHERE id = 1")),e.prepare("PRAGMA table_info(config)").all().some(s=>s.name==="updated_at")||(e.exec("ALTER TABLE config ADD COLUMN updated_at INTEGER NOT NULL DEFAULT 0"),e.exec("UPDATE server_state SET schema_version = 21 WHERE id = 1"));let k=e.prepare("PRAGMA table_info(memories)").all();k.some(s=>s.name==="tier")||(e.exec("ALTER TABLE memories ADD COLUMN tier TEXT NOT NULL DEFAULT 'episodic'"),e.exec("CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier)")),k.some(s=>s.name==="superseded_by")||(e.exec("ALTER TABLE memories ADD COLUMN superseded_by TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_memories_superseded ON memories(superseded_by)"));let w=e.prepare("PRAGMA table_info(memories)").all();w.some(s=>s.name==="tier")&&w.some(s=>s.name==="superseded_by")&&(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<22&&e.exec("UPDATE server_state SET schema_version = 22 WHERE id = 1");{let s=e.prepare("PRAGMA table_info(roles)").all();s.some(r=>r.name==="permission_mode")||e.exec("ALTER TABLE roles ADD COLUMN permission_mode TEXT DEFAULT NULL"),s.some(r=>r.name==="allowed_bash_patterns")||e.exec("ALTER TABLE roles ADD COLUMN allowed_bash_patterns TEXT DEFAULT NULL"),s.some(r=>r.name==="denied_bash_patterns")||e.exec("ALTER TABLE roles ADD COLUMN denied_bash_patterns TEXT DEFAULT NULL"),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<23&&e.exec("UPDATE server_state SET schema_version = 23 WHERE id = 1")}if(e.prepare("PRAGMA table_info(roles)").all().some(r=>r.name==="env_vars")||e.prepare("ALTER TABLE roles ADD COLUMN env_vars TEXT DEFAULT NULL").run(),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<24&&e.prepare("UPDATE server_state SET schema_version = 24 WHERE id = 1").run(),_<25&&(e.exec(`
592
+ SELECT id, rule_id, task_id, status, target, content, attempts, error, created_at, delivered_at, expires_at FROM delivery_log`),e.exec("DROP TABLE delivery_log"),e.exec("ALTER TABLE delivery_log_new RENAME TO delivery_log"),e.exec("CREATE INDEX IF NOT EXISTS idx_delivery_log_rule ON delivery_log(rule_id)"),e.exec("CREATE INDEX IF NOT EXISTS idx_delivery_log_task ON delivery_log(task_id)")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<20&&(e.prepare("PRAGMA table_info(goals)").all().some(r=>r.name==="report_to")||e.exec("ALTER TABLE goals ADD COLUMN report_to TEXT"),e.prepare("PRAGMA table_info(task_templates)").all().some(r=>r.name==="report_to")||e.exec("ALTER TABLE task_templates ADD COLUMN report_to TEXT"),e.exec("UPDATE goals SET report_to = notify_targets WHERE notify_targets IS NOT NULL"),e.exec("UPDATE task_templates SET report_to = notify_targets WHERE notify_targets IS NOT NULL"),e.exec("UPDATE server_state SET schema_version = 20 WHERE id = 1")),e.prepare("PRAGMA table_info(config)").all().some(s=>s.name==="updated_at")||(e.exec("ALTER TABLE config ADD COLUMN updated_at INTEGER NOT NULL DEFAULT 0"),e.exec("UPDATE server_state SET schema_version = 21 WHERE id = 1"));let P=e.prepare("PRAGMA table_info(memories)").all();P.some(s=>s.name==="tier")||(e.exec("ALTER TABLE memories ADD COLUMN tier TEXT NOT NULL DEFAULT 'episodic'"),e.exec("CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier)")),P.some(s=>s.name==="superseded_by")||(e.exec("ALTER TABLE memories ADD COLUMN superseded_by TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_memories_superseded ON memories(superseded_by)"));let G=e.prepare("PRAGMA table_info(memories)").all();G.some(s=>s.name==="tier")&&G.some(s=>s.name==="superseded_by")&&(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<22&&e.exec("UPDATE server_state SET schema_version = 22 WHERE id = 1");{let s=e.prepare("PRAGMA table_info(roles)").all();s.some(r=>r.name==="permission_mode")||e.exec("ALTER TABLE roles ADD COLUMN permission_mode TEXT DEFAULT NULL"),s.some(r=>r.name==="allowed_bash_patterns")||e.exec("ALTER TABLE roles ADD COLUMN allowed_bash_patterns TEXT DEFAULT NULL"),s.some(r=>r.name==="denied_bash_patterns")||e.exec("ALTER TABLE roles ADD COLUMN denied_bash_patterns TEXT DEFAULT NULL"),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<23&&e.exec("UPDATE server_state SET schema_version = 23 WHERE id = 1")}if(e.prepare("PRAGMA table_info(roles)").all().some(r=>r.name==="env_vars")||e.prepare("ALTER TABLE roles ADD COLUMN env_vars TEXT DEFAULT NULL").run(),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<24&&e.prepare("UPDATE server_state SET schema_version = 24 WHERE id = 1").run(),a<25&&(e.exec(`
593
593
  CREATE TABLE IF NOT EXISTS template_executions (
594
594
  id TEXT PRIMARY KEY,
595
595
  template_id TEXT NOT NULL,
@@ -600,7 +600,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
600
600
  error TEXT,
601
601
  FOREIGN KEY (template_id) REFERENCES task_templates(id)
602
602
  )
603
- `),e.exec("UPDATE server_state SET schema_version = 25 WHERE id = 1")),_<26){let s=`
603
+ `),e.exec("UPDATE server_state SET schema_version = 25 WHERE id = 1")),a<26){let s=`
604
604
  CREATE TABLE IF NOT EXISTS template_execution_artifacts (
605
605
  id TEXT PRIMARY KEY,
606
606
  execution_id TEXT NOT NULL,
@@ -638,12 +638,12 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
638
638
  ON artifact_access_log (execution_id, timestamp);
639
639
  CREATE INDEX IF NOT EXISTS idx_artifact_access_log_role
640
640
  ON artifact_access_log (role_id, timestamp);
641
- `;e.exec(s),e.exec(t),e.prepare("PRAGMA table_info(tasks)").all().some(i=>i.name==="step_id")||e.prepare("ALTER TABLE tasks ADD COLUMN step_id TEXT").run(),e.exec("UPDATE server_state SET schema_version = 26 WHERE id = 1")}e.prepare("PRAGMA table_info(roles)").all().some(r=>r.name==="os_capabilities")||e.prepare("ALTER TABLE roles ADD COLUMN os_capabilities TEXT DEFAULT NULL").run(),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<27&&e.prepare("UPDATE server_state SET schema_version = 27 WHERE id = 1").run();{let s=e.prepare("PRAGMA table_info(manager_decisions)").all();s.some(r=>r.name==="requirements_json")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN requirements_json TEXT").run(),s.some(r=>r.name==="fit_score")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN fit_score REAL").run(),s.some(r=>r.name==="candidates_json")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN candidates_json TEXT").run(),s.some(r=>r.name==="tie_break_reason")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN tie_break_reason TEXT").run(),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<28&&e.prepare("UPDATE server_state SET schema_version = 28 WHERE id = 1").run()}{let s=[[/\brm -rf\b/,["rm -rf *"]],[/^git push/,["git push*"]],[/^git reset/,["git reset*"]],[/\bcurl.*POST\b/i,["curl * -X POST*","curl * --request POST*"]]],t=e.prepare("SELECT key, value FROM config WHERE key = 'defaults.approvalRequired'").all();for(let r of t)try{let i=JSON.parse(r.value),E=[];for(let n of i){let c=!1;for(let[p,o]of s)if(p.test(n)){E.push(...o),c=!0,S.info({from:n,to:o},"Config: migrated approvalRequired pattern from regex to glob");break}c||(/[.+?^${}()|[\]\\]/.test(n)&&S.warn({pattern:n},"Config: approvalRequired pattern contains regex metacharacters that won't work with glob matching; update to glob syntax (use * for wildcards)"),E.push(n))}let T=[...new Set(E)];e.prepare("UPDATE config SET value = ?, updated_at = ? WHERE key = ?").run(JSON.stringify(T),Date.now(),r.key)}catch{}}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<31){let t=e.prepare("SELECT count(*) AS n FROM task_templates WHERE trigger_type IN ('event', 'task_complete')").get();t.n>0&&S.info({legacyCount:t.n},"normalizing legacy template trigger types"),e.prepare(`
641
+ `;e.exec(s),e.exec(t),e.prepare("PRAGMA table_info(tasks)").all().some(i=>i.name==="step_id")||e.prepare("ALTER TABLE tasks ADD COLUMN step_id TEXT").run(),e.exec("UPDATE server_state SET schema_version = 26 WHERE id = 1")}e.prepare("PRAGMA table_info(roles)").all().some(r=>r.name==="os_capabilities")||e.prepare("ALTER TABLE roles ADD COLUMN os_capabilities TEXT DEFAULT NULL").run(),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<27&&e.prepare("UPDATE server_state SET schema_version = 27 WHERE id = 1").run();{let s=e.prepare("PRAGMA table_info(manager_decisions)").all();s.some(r=>r.name==="requirements_json")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN requirements_json TEXT").run(),s.some(r=>r.name==="fit_score")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN fit_score REAL").run(),s.some(r=>r.name==="candidates_json")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN candidates_json TEXT").run(),s.some(r=>r.name==="tie_break_reason")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN tie_break_reason TEXT").run(),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<28&&e.prepare("UPDATE server_state SET schema_version = 28 WHERE id = 1").run()}{let s=[[/\brm -rf\b/,["rm -rf *"]],[/^git push/,["git push*"]],[/^git reset/,["git reset*"]],[/\bcurl.*POST\b/i,["curl * -X POST*","curl * --request POST*"]]],t=e.prepare("SELECT key, value FROM config WHERE key = 'defaults.approvalRequired'").all();for(let r of t)try{let i=JSON.parse(r.value),E=[];for(let T of i){let c=!1;for(let[L,o]of s)if(L.test(T)){E.push(...o),c=!0,U.info({from:T,to:o},"Config: migrated approvalRequired pattern from regex to glob");break}c||(/[.+?^${}()|[\]\\]/.test(T)&&U.warn({pattern:T},"Config: approvalRequired pattern contains regex metacharacters that won't work with glob matching; update to glob syntax (use * for wildcards)"),E.push(T))}let n=[...new Set(E)];e.prepare("UPDATE config SET value = ?, updated_at = ? WHERE key = ?").run(JSON.stringify(n),Date.now(),r.key)}catch{}}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<31){let t=e.prepare("SELECT count(*) AS n FROM task_templates WHERE trigger_type IN ('event', 'task_complete')").get();t.n>0&&U.info({legacyCount:t.n},"normalizing legacy template trigger types"),e.prepare(`
642
642
  UPDATE task_templates
643
643
  SET trigger_type='template_complete',
644
644
  trigger_event=REPLACE(trigger_event, ?, 'template_complete:')
645
645
  WHERE trigger_type='event' AND trigger_event LIKE ?
646
- `).run(C,`${C}%`),e.prepare("UPDATE task_templates SET trigger_type='template_complete' WHERE trigger_type='event'").run(),e.prepare("UPDATE task_templates SET trigger_type='manual' WHERE trigger_type='task_complete'").run();let r=e.prepare("SELECT count(*) AS n FROM task_templates WHERE trigger_type IN ('event', 'task_complete')").get();r.n>0&&S.warn({orphan:r.n},"migration left orphan legacy trigger_type rows; manual inspection required"),e.prepare("UPDATE server_state SET schema_version = 31 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<32&&(e.exec(`
646
+ `).run(h,`${h}%`),e.prepare("UPDATE task_templates SET trigger_type='template_complete' WHERE trigger_type='event'").run(),e.prepare("UPDATE task_templates SET trigger_type='manual' WHERE trigger_type='task_complete'").run();let r=e.prepare("SELECT count(*) AS n FROM task_templates WHERE trigger_type IN ('event', 'task_complete')").get();r.n>0&&U.warn({orphan:r.n},"migration left orphan legacy trigger_type rows; manual inspection required"),e.prepare("UPDATE server_state SET schema_version = 31 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<32&&(e.exec(`
647
647
  CREATE TABLE IF NOT EXISTS event_defs (
648
648
  id TEXT PRIMARY KEY, name TEXT NOT NULL, source_type TEXT NOT NULL,
649
649
  source_config TEXT NOT NULL, enabled INTEGER NOT NULL DEFAULT 1,
@@ -667,7 +667,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
667
667
  WHERE type='table' AND name IN ('template_executions', ?)
668
668
  ORDER BY CASE name WHEN 'template_executions' THEN 0 ELSE 1 END
669
669
  LIMIT 1
670
- `).get(y);if(t){let r=t.name;e.prepare(`PRAGMA table_info(${r})`).all().some(n=>n.name==="event_id")||e.prepare(`ALTER TABLE ${r} ADD COLUMN event_id TEXT`).run();let T=r==="template_executions"?"idx_template_executions_event_id":b;e.prepare(`CREATE INDEX IF NOT EXISTS ${T} ON ${r}(event_id)`).run()}e.prepare("UPDATE server_state SET schema_version = 33 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<34&&(e.prepare("PRAGMA table_info(tasks)").all().some(i=>i.name==="block_reason_json")||e.prepare("ALTER TABLE tasks ADD COLUMN block_reason_json TEXT").run(),e.prepare("UPDATE server_state SET schema_version = 34 WHERE id = 1").run()),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<35){e.prepare("PRAGMA table_info(roles)").all().some(i=>i.name==="preset_id")||e.prepare("ALTER TABLE roles ADD COLUMN preset_id TEXT").run();let r=e.prepare("PRAGMA table_info(task_templates)").all();r.some(i=>i.name==="is_preset")||e.prepare("ALTER TABLE task_templates ADD COLUMN is_preset INTEGER NOT NULL DEFAULT 0").run(),r.some(i=>i.name==="preset_id")||e.prepare("ALTER TABLE task_templates ADD COLUMN preset_id TEXT").run(),e.prepare("UPDATE server_state SET schema_version = 35 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<36){let t=[["Engineer","engineer"],["Reviewer","reviewer"],["Researcher","researcher"],["Writer","writer"],["Chat Manager","chat-manager"],["adam-automator","adam-automator"]];for(let[r,i]of t)e.prepare("UPDATE roles SET preset_id = ? WHERE name = ? AND preset_id IS NULL").run(i,r);e.prepare("UPDATE server_state SET schema_version = 36 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<37&&(e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='feature_requests'").all().length===0&&(e.exec(`
670
+ `).get(w);if(t){let r=t.name;e.prepare(`PRAGMA table_info(${r})`).all().some(T=>T.name==="event_id")||e.prepare(`ALTER TABLE ${r} ADD COLUMN event_id TEXT`).run();let n=r==="template_executions"?"idx_template_executions_event_id":ee;e.prepare(`CREATE INDEX IF NOT EXISTS ${n} ON ${r}(event_id)`).run()}e.prepare("UPDATE server_state SET schema_version = 33 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<34&&(e.prepare("PRAGMA table_info(tasks)").all().some(i=>i.name==="block_reason_json")||e.prepare("ALTER TABLE tasks ADD COLUMN block_reason_json TEXT").run(),e.prepare("UPDATE server_state SET schema_version = 34 WHERE id = 1").run()),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<35){e.prepare("PRAGMA table_info(roles)").all().some(i=>i.name==="preset_id")||e.prepare("ALTER TABLE roles ADD COLUMN preset_id TEXT").run();let r=e.prepare("PRAGMA table_info(task_templates)").all();r.some(i=>i.name==="is_preset")||e.prepare("ALTER TABLE task_templates ADD COLUMN is_preset INTEGER NOT NULL DEFAULT 0").run(),r.some(i=>i.name==="preset_id")||e.prepare("ALTER TABLE task_templates ADD COLUMN preset_id TEXT").run(),e.prepare("UPDATE server_state SET schema_version = 35 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<36){let t=[["Engineer","engineer"],["Reviewer","reviewer"],["Researcher","researcher"],["Writer","writer"],["Chat Manager","chat-manager"],["adam-automator","adam-automator"]];for(let[r,i]of t)e.prepare("UPDATE roles SET preset_id = ? WHERE name = ? AND preset_id IS NULL").run(i,r);e.prepare("UPDATE server_state SET schema_version = 36 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<37&&(e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='feature_requests'").all().length===0&&(e.exec(`
671
671
  CREATE TABLE feature_requests (
672
672
  id TEXT PRIMARY KEY,
673
673
  source_session_id TEXT,
@@ -696,15 +696,15 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
696
696
  created_at INTEGER NOT NULL,
697
697
  updated_at INTEGER NOT NULL
698
698
  )
699
- `),e.exec("CREATE INDEX IF NOT EXISTS idx_mistake_patterns_status ON mistake_patterns(status)"),e.exec("CREATE INDEX IF NOT EXISTS idx_mistake_patterns_last_seen ON mistake_patterns(last_seen)"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_mistake_patterns_dim ON mistake_patterns(dimension_type, dimension_value)")),e.prepare("UPDATE server_state SET schema_version = 38 WHERE id = 1").run()),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<39){let t=e.prepare("SELECT source_task_id, COUNT(*) as cnt FROM memories WHERE source_task_id IS NOT NULL AND type = 'thought' GROUP BY source_task_id HAVING cnt > 1").all();if(t.length>0){console.info(`[db migration v39] dedupe ${t.length} (source_task_id, type='thought') groups before adding unique index`);for(let r of t){let i=e.prepare("SELECT id, length(content) as len FROM memories WHERE source_task_id = ? AND type = 'thought' ORDER BY len DESC, created_at ASC").all(r.source_task_id),E=i[0].id,T=i.slice(1).map(c=>c.id),n=T.map(()=>"?").join(",");e.prepare(`DELETE FROM memories WHERE id IN (${n})`).run(...T),console.info(`[db migration v39] group source_task_id=${r.source_task_id}: kept ${E} (len ${i[0].len}), deleted ${T.length}`)}}e.prepare("CREATE UNIQUE INDEX IF NOT EXISTS idx_memories_thought_per_task ON memories(source_task_id) WHERE source_task_id IS NOT NULL AND type = 'thought'").run(),e.prepare("UPDATE server_state SET schema_version = 39 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<40){let t=["tasks","step_logs","delivery_log","evolution_audit","chat_messages"];for(let r of t)e.prepare(`PRAGMA table_info(${r})`).all().some(E=>E.name==="trace_id")||(e.prepare(`ALTER TABLE ${r} ADD COLUMN trace_id TEXT`).run(),e.prepare(`CREATE INDEX IF NOT EXISTS idx_${r}_trace_id ON ${r}(trace_id) WHERE trace_id IS NOT NULL`).run(),console.info(`[db migration v40] added trace_id to ${r}`));e.prepare("UPDATE server_state SET schema_version = 40 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<41&&(e.prepare(`
699
+ `),e.exec("CREATE INDEX IF NOT EXISTS idx_mistake_patterns_status ON mistake_patterns(status)"),e.exec("CREATE INDEX IF NOT EXISTS idx_mistake_patterns_last_seen ON mistake_patterns(last_seen)"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_mistake_patterns_dim ON mistake_patterns(dimension_type, dimension_value)")),e.prepare("UPDATE server_state SET schema_version = 38 WHERE id = 1").run()),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<39){let t=e.prepare("SELECT source_task_id, COUNT(*) as cnt FROM memories WHERE source_task_id IS NOT NULL AND type = 'thought' GROUP BY source_task_id HAVING cnt > 1").all();if(t.length>0){console.info(`[db migration v39] dedupe ${t.length} (source_task_id, type='thought') groups before adding unique index`);for(let r of t){let i=e.prepare("SELECT id, length(content) as len FROM memories WHERE source_task_id = ? AND type = 'thought' ORDER BY len DESC, created_at ASC").all(r.source_task_id),E=i[0].id,n=i.slice(1).map(c=>c.id),T=n.map(()=>"?").join(",");e.prepare(`DELETE FROM memories WHERE id IN (${T})`).run(...n),console.info(`[db migration v39] group source_task_id=${r.source_task_id}: kept ${E} (len ${i[0].len}), deleted ${n.length}`)}}e.prepare("CREATE UNIQUE INDEX IF NOT EXISTS idx_memories_thought_per_task ON memories(source_task_id) WHERE source_task_id IS NOT NULL AND type = 'thought'").run(),e.prepare("UPDATE server_state SET schema_version = 39 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<40){let t=["tasks","step_logs","delivery_log","evolution_audit","chat_messages"];for(let r of t)e.prepare(`PRAGMA table_info(${r})`).all().some(E=>E.name==="trace_id")||(e.prepare(`ALTER TABLE ${r} ADD COLUMN trace_id TEXT`).run(),e.prepare(`CREATE INDEX IF NOT EXISTS idx_${r}_trace_id ON ${r}(trace_id) WHERE trace_id IS NOT NULL`).run(),console.info(`[db migration v40] added trace_id to ${r}`));e.prepare("UPDATE server_state SET schema_version = 40 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<41&&(e.prepare(`
700
700
  UPDATE task_templates
701
701
  SET trigger_type = 'template_complete'
702
702
  WHERE trigger_type = ?
703
- `).run(ee),e.prepare(`
703
+ `).run(re),e.prepare(`
704
704
  UPDATE task_templates
705
705
  SET trigger_event = REPLACE(trigger_event, ?, 'template_complete:')
706
706
  WHERE trigger_event LIKE ?
707
- `).run(C,`${C}%`),e.prepare("UPDATE server_state SET schema_version = 41 WHERE id = 1").run()),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<42){let t=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(y),r=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='template_executions'").get();t&&!r&&e.prepare(`ALTER TABLE ${y} RENAME TO template_executions`).run(),e.exec(`
707
+ `).run(h,`${h}%`),e.prepare("UPDATE server_state SET schema_version = 41 WHERE id = 1").run()),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<42){let t=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(w),r=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='template_executions'").get();t&&!r&&e.prepare(`ALTER TABLE ${w} RENAME TO template_executions`).run(),e.exec(`
708
708
  CREATE TABLE IF NOT EXISTS template_executions (
709
709
  id TEXT PRIMARY KEY,
710
710
  template_id TEXT NOT NULL,
@@ -716,7 +716,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
716
716
  event_id TEXT,
717
717
  FOREIGN KEY (template_id) REFERENCES task_templates(id)
718
718
  )
719
- `),e.prepare("PRAGMA table_info(template_executions)").all().some(E=>E.name==="event_id")||e.prepare("ALTER TABLE template_executions ADD COLUMN event_id TEXT").run(),e.prepare(`DROP INDEX IF EXISTS ${b}`).run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_template_executions_event_id ON template_executions(event_id)").run(),e.prepare("UPDATE server_state SET schema_version = 42 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<43){let t=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(Z),r=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='template_execution_artifacts'").get();t&&!r&&e.prepare(`ALTER TABLE ${Z} RENAME TO template_execution_artifacts`).run(),e.exec(`
719
+ `),e.prepare("PRAGMA table_info(template_executions)").all().some(E=>E.name==="event_id")||e.prepare("ALTER TABLE template_executions ADD COLUMN event_id TEXT").run(),e.prepare(`DROP INDEX IF EXISTS ${ee}`).run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_template_executions_event_id ON template_executions(event_id)").run(),e.prepare("UPDATE server_state SET schema_version = 42 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<43){let t=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(b),r=e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='template_execution_artifacts'").get();t&&!r&&e.prepare(`ALTER TABLE ${b} RENAME TO template_execution_artifacts`).run(),e.exec(`
720
720
  CREATE TABLE IF NOT EXISTS template_execution_artifacts (
721
721
  id TEXT PRIMARY KEY,
722
722
  execution_id TEXT NOT NULL,
@@ -731,7 +731,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
731
731
  UNIQUE(execution_id, step_id, key),
732
732
  FOREIGN KEY (execution_id) REFERENCES template_executions(id) ON DELETE CASCADE
733
733
  )
734
- `),e.prepare(`DROP INDEX IF EXISTS ${Ne}`).run(),e.prepare(`DROP INDEX IF EXISTS ${de}`).run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_template_execution_artifacts_execution ON template_execution_artifacts(execution_id)").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_template_execution_artifacts_step ON template_execution_artifacts(execution_id, step_id)").run(),z(e),e.prepare("UPDATE server_state SET schema_version = 43 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<44&&(e.prepare("PRAGMA table_info(tasks)").all().some(r=>r.name==="error_category")||e.prepare("ALTER TABLE tasks ADD COLUMN error_category TEXT").run(),e.prepare("UPDATE server_state SET schema_version = 44 WHERE id = 1").run()),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<45&&(e.prepare("PRAGMA table_info(tasks)").all().some(r=>r.name==="retry_count")||e.prepare("ALTER TABLE tasks ADD COLUMN retry_count INTEGER NOT NULL DEFAULT 0").run(),e.exec(`
734
+ `),e.prepare(`DROP INDEX IF EXISTS ${de}`).run(),e.prepare(`DROP INDEX IF EXISTS ${pe}`).run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_template_execution_artifacts_execution ON template_execution_artifacts(execution_id)").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_template_execution_artifacts_step ON template_execution_artifacts(execution_id, step_id)").run(),Q(e),e.prepare("UPDATE server_state SET schema_version = 43 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<44&&(e.prepare("PRAGMA table_info(tasks)").all().some(r=>r.name==="error_category")||e.prepare("ALTER TABLE tasks ADD COLUMN error_category TEXT").run(),e.prepare("UPDATE server_state SET schema_version = 44 WHERE id = 1").run()),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<45&&(e.prepare("PRAGMA table_info(tasks)").all().some(r=>r.name==="retry_count")||e.prepare("ALTER TABLE tasks ADD COLUMN retry_count INTEGER NOT NULL DEFAULT 0").run(),e.exec(`
735
735
  CREATE TABLE IF NOT EXISTS delayed_retries (
736
736
  id TEXT PRIMARY KEY,
737
737
  task_id TEXT NOT NULL,
@@ -754,7 +754,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
754
754
  resolved_value TEXT,
755
755
  expired_reason TEXT
756
756
  )
757
- `),e.exec("CREATE INDEX IF NOT EXISTS idx_pending_prompts_session_open ON pending_prompts(session_id, expires_at) WHERE resolved_at IS NULL"),e.exec("CREATE INDEX IF NOT EXISTS idx_pending_prompts_task ON pending_prompts(task_id) WHERE task_id IS NOT NULL"),e.prepare("UPDATE server_state SET schema_version = 49 WHERE id = 1").run(),console.info("[db migration v49] pending_prompts: created table + 2 indexes")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<50){let t=e.prepare("PRAGMA table_info(template_execution_artifacts)").all(),r=i=>t.some(E=>E.name===i);r("locator")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN locator TEXT").run(),r("content_hash")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN content_hash TEXT").run(),r("retention_hint")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN retention_hint TEXT").run(),r("encryption_class")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN encryption_class TEXT").run(),r("purpose")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN purpose TEXT").run(),r("replaces")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN replaces TEXT").run(),r("produced_by_role")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN produced_by_role TEXT").run(),r("access")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN access TEXT").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON template_execution_artifacts(content_hash) WHERE content_hash IS NOT NULL").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_replaces ON template_execution_artifacts(replaces) WHERE replaces IS NOT NULL").run(),e.prepare("UPDATE server_state SET schema_version = 50 WHERE id = 1").run(),console.info("[db migration v50] template_execution_artifacts: added 8 storage-hook columns + 2 indexes")}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<51){let t=e.prepare("PRAGMA table_info(chat_messages)").all();t.some(r=>r.name==="source_channel_id")||e.exec("ALTER TABLE chat_messages ADD COLUMN source_channel_id TEXT"),t.some(r=>r.name==="source_chat_id")||e.exec("ALTER TABLE chat_messages ADD COLUMN source_chat_id TEXT"),e.prepare("UPDATE server_state SET schema_version = 51 WHERE id = 1").run(),console.info("[db migration v51] chat_messages: added source_channel_id + source_chat_id columns")}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<52&&(e.exec(`
757
+ `),e.exec("CREATE INDEX IF NOT EXISTS idx_pending_prompts_session_open ON pending_prompts(session_id, expires_at) WHERE resolved_at IS NULL"),e.exec("CREATE INDEX IF NOT EXISTS idx_pending_prompts_task ON pending_prompts(task_id) WHERE task_id IS NOT NULL"),e.prepare("UPDATE server_state SET schema_version = 49 WHERE id = 1").run(),console.info("[db migration v49] pending_prompts: created table + 2 indexes")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<50){if(e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='template_execution_artifacts'").get()){let r=e.prepare("PRAGMA table_info(template_execution_artifacts)").all(),i=E=>r.some(n=>n.name===E);i("locator")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN locator TEXT").run(),i("content_hash")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN content_hash TEXT").run(),i("retention_hint")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN retention_hint TEXT").run(),i("encryption_class")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN encryption_class TEXT").run(),i("purpose")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN purpose TEXT").run(),i("replaces")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN replaces TEXT").run(),i("produced_by_role")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN produced_by_role TEXT").run(),i("access")||e.prepare("ALTER TABLE template_execution_artifacts ADD COLUMN access TEXT").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON template_execution_artifacts(content_hash) WHERE content_hash IS NOT NULL").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_replaces ON template_execution_artifacts(replaces) WHERE replaces IS NOT NULL").run(),console.info("[db migration v50] template_execution_artifacts: added 8 storage-hook columns + 2 indexes")}else console.info("[db migration v50] skipped \u2014 template_execution_artifacts already renamed to artifacts in v72");e.prepare("UPDATE server_state SET schema_version = 50 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<51){let t=e.prepare("PRAGMA table_info(chat_messages)").all();t.some(r=>r.name==="source_channel_id")||e.exec("ALTER TABLE chat_messages ADD COLUMN source_channel_id TEXT"),t.some(r=>r.name==="source_chat_id")||e.exec("ALTER TABLE chat_messages ADD COLUMN source_chat_id TEXT"),e.prepare("UPDATE server_state SET schema_version = 51 WHERE id = 1").run(),console.info("[db migration v51] chat_messages: added source_channel_id + source_chat_id columns")}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<52&&(e.exec(`
758
758
  CREATE TABLE IF NOT EXISTS audit_violations (
759
759
  id TEXT PRIMARY KEY,
760
760
  step_task_id TEXT NOT NULL,
@@ -770,7 +770,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
770
770
  CREATE INDEX IF NOT EXISTS idx_audit_violations_role ON audit_violations(role_id, created_at DESC);
771
771
  CREATE INDEX IF NOT EXISTS idx_audit_violations_task ON audit_violations(step_task_id);
772
772
  CREATE INDEX IF NOT EXISTS idx_audit_violations_execution ON audit_violations(execution_id, created_at DESC);
773
- `),e.prepare("UPDATE server_state SET schema_version = 52 WHERE id = 1").run(),console.info("[db migration v52] audit_violations: added contract-violation audit table + 3 indexes")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<53){let t=e.prepare("SELECT id, learned_rules FROM roles").all(),r=e.prepare("UPDATE roles SET learned_rules = ? WHERE id = ?"),i=0;for(let E of t){if(!E.learned_rules)continue;let T;try{T=JSON.parse(E.learned_rules)}catch{continue}if(Array.isArray(T)){let n={stylePreferences:T.filter(c=>typeof c=="string"),avoidedActions:[],pinnedParameters:[]};r.run(JSON.stringify(n),E.id),i+=1}}e.prepare("UPDATE server_state SET schema_version = 53 WHERE id = 1").run(),console.info(`[db migration v53] learned_rules: wrapped ${i} legacy string[] rows into structured form`)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<54){e.exec(`
773
+ `),e.prepare("UPDATE server_state SET schema_version = 52 WHERE id = 1").run(),console.info("[db migration v52] audit_violations: added contract-violation audit table + 3 indexes")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<53){let t=e.prepare("SELECT id, learned_rules FROM roles").all(),r=e.prepare("UPDATE roles SET learned_rules = ? WHERE id = ?"),i=0;for(let E of t){if(!E.learned_rules)continue;let n;try{n=JSON.parse(E.learned_rules)}catch{continue}if(Array.isArray(n)){let T={stylePreferences:n.filter(c=>typeof c=="string"),avoidedActions:[],pinnedParameters:[]};r.run(JSON.stringify(T),E.id),i+=1}}e.prepare("UPDATE server_state SET schema_version = 53 WHERE id = 1").run(),console.info(`[db migration v53] learned_rules: wrapped ${i} legacy string[] rows into structured form`)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<54){e.exec(`
774
774
  CREATE TABLE IF NOT EXISTS user_visible_events (
775
775
  id TEXT PRIMARY KEY,
776
776
  event_key TEXT NOT NULL UNIQUE,
@@ -796,7 +796,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
796
796
  ON user_visible_events(viewer_key, source_id);
797
797
  CREATE INDEX IF NOT EXISTS idx_user_visible_events_trace_id
798
798
  ON user_visible_events(trace_id) WHERE trace_id IS NOT NULL;
799
- `);let t="local-owner",r=e.prepare("SELECT value FROM config WHERE key = 'identity.ownerViewerKey'").get();if(r)try{let T=JSON.parse(r.value);typeof T=="string"&&T.trim().length>0&&(t=T)}catch{r.value.trim().length>0&&(t=r.value)}let i=e.prepare("SELECT id, config FROM channels").all(),E=e.prepare("UPDATE channels SET config = ?, updated_at = ? WHERE id = ?");for(let T of i)try{let n=JSON.parse(T.config);(typeof n.viewerKey!="string"||n.viewerKey.trim().length===0)&&(n.viewerKey=t,E.run(JSON.stringify(n),Date.now(),T.id))}catch{}e.prepare("UPDATE server_state SET schema_version = 54 WHERE id = 1").run(),console.info("[db migration v54] user_visible_events: created delivery ledger and backfilled channel viewerKey")}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<55&&(e.exec(`
799
+ `);let t="local-owner",r=e.prepare("SELECT value FROM config WHERE key = 'identity.ownerViewerKey'").get();if(r)try{let n=JSON.parse(r.value);typeof n=="string"&&n.trim().length>0&&(t=n)}catch{r.value.trim().length>0&&(t=r.value)}let i=e.prepare("SELECT id, config FROM channels").all(),E=e.prepare("UPDATE channels SET config = ?, updated_at = ? WHERE id = ?");for(let n of i)try{let T=JSON.parse(n.config);(typeof T.viewerKey!="string"||T.viewerKey.trim().length===0)&&(T.viewerKey=t,E.run(JSON.stringify(T),Date.now(),n.id))}catch{}e.prepare("UPDATE server_state SET schema_version = 54 WHERE id = 1").run(),console.info("[db migration v54] user_visible_events: created delivery ledger and backfilled channel viewerKey")}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<55&&(e.exec(`
800
800
  CREATE TABLE IF NOT EXISTS audit_diagnostics (
801
801
  id TEXT PRIMARY KEY,
802
802
  source TEXT NOT NULL,
@@ -871,7 +871,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
871
871
  ON assistant_delivery_commitments(session_id, created_at);
872
872
  CREATE INDEX IF NOT EXISTS idx_assistant_delivery_commitments_source_message
873
873
  ON assistant_delivery_commitments(source_message_id) WHERE source_message_id IS NOT NULL;
874
- `),e.prepare("UPDATE server_state SET schema_version = 57 WHERE id = 1").run(),console.info("[db migration v57] assistant_delivery_commitments: added ChatManager delivery commitment table")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<58){e.prepare("PRAGMA table_info(channels)").all().some(n=>n.name==="viewer_key")||e.exec("ALTER TABLE channels ADD COLUMN viewer_key TEXT");let r="local-owner",i=e.prepare("SELECT value FROM config WHERE key = 'identity.ownerViewerKey'").get();if(i)try{let n=JSON.parse(i.value);typeof n=="string"&&n.trim().length>0&&(r=n)}catch{i.value.trim().length>0&&(r=i.value)}let E=e.prepare("SELECT id, config FROM channels").all(),T=e.prepare("UPDATE channels SET config = ?, viewer_key = ?, updated_at = ? WHERE id = ?");for(let n of E)try{let c=JSON.parse(n.config),p=typeof c.viewerKey=="string"&&c.viewerKey.trim().length>0?c.viewerKey:r;delete c.viewerKey,T.run(JSON.stringify(c),p,Date.now(),n.id)}catch{e.prepare("UPDATE channels SET viewer_key = ?, updated_at = ? WHERE id = ?").run(r,Date.now(),n.id)}e.prepare("UPDATE server_state SET schema_version = 58 WHERE id = 1").run(),console.info("[db migration v58] channels: extracted viewerKey from config into viewer_key column")}{let s=["^Task assigned to role [A-Z]$","^List files in the current directory\\.?$","^ping role payload$"];try{let r=e.prepare("SELECT id FROM delivery_rules WHERE created_by = 'system' AND target LIKE '%_default_block_%'").all();for(let i of r)e.prepare("DELETE FROM delivery_rules WHERE id = ?").run(i.id),console.info(`[db v59 repair] removed legacy bad rule ${i.id}`);e.prepare("DELETE FROM config WHERE key = 'delivery.defaultExcludePromptPatterns' AND value LIKE '%E2E_TEST_MODE%'").run()}catch(r){console.warn("[db v59 repair] cleanup of legacy seed failed (non-fatal):",r)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<59){let r=e.prepare("SELECT id, match_criteria FROM delivery_rules WHERE event_type = 'task_complete'").all(),i=0;for(let E of r)try{let T=E.match_criteria?JSON.parse(E.match_criteria):{};if(!(!T.templateId&&!T.roleId&&!T.promptPattern&&!T.taskStatus))continue;let c=Array.isArray(T.excludePromptPatterns)?T.excludePromptPatterns:[],p=[...new Set([...c,...s])],o={...T,excludePromptPatterns:p};e.prepare("UPDATE delivery_rules SET match_criteria = ? WHERE id = ?").run(JSON.stringify(o),E.id),i++}catch{}e.prepare("UPDATE server_state SET schema_version = 59 WHERE id = 1").run(),console.info(`[db migration v59] delivery: seeded excludePromptPatterns on ${i} catch-all rule(s)`)}try{let r=e.prepare("SELECT id, match_criteria FROM delivery_rules WHERE event_type = 'task_complete'").all();for(let i of r)try{let E=i.match_criteria?JSON.parse(i.match_criteria):{};if(!(!E.templateId&&!E.roleId&&!E.promptPattern&&!E.taskStatus))continue;let n=Array.isArray(E.excludePromptPatterns)?E.excludePromptPatterns:[],c=s.filter(f=>!n.includes(f));if(c.length===0)continue;let p=[...n,...c],o={...E,excludePromptPatterns:p};e.prepare("UPDATE delivery_rules SET match_criteria = ? WHERE id = ?").run(JSON.stringify(o),i.id),console.info(`[db v59 reconcile] added ${c.length} default exclude pattern(s) to rule ${i.id}`)}catch{}}catch(r){console.warn("[db v59 reconcile] post-migration repair failed (non-fatal):",r)}}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<60){if(e.prepare("PRAGMA table_info(delivery_log)").all().some(r=>r.name==="execution_id")||(e.prepare("ALTER TABLE delivery_log ADD COLUMN execution_id TEXT").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_delivery_log_execution_id ON delivery_log (execution_id)").run()),!e.prepare("SELECT id FROM delivery_rules WHERE event_type = ?").get("template_execution_failed")){let r=e.prepare("SELECT id, target, match_criteria FROM delivery_rules WHERE event_type = 'task_complete' AND enabled = 1").all(),i=null;for(let c of r)try{let p=c.match_criteria?JSON.parse(c.match_criteria):{};if(!p.templateId&&!p.roleId&&!p.promptPattern&&!p.taskStatus){let f=JSON.parse(c.target);if(f?.type==="channel"&&typeof f.channelId=="string"){i=f.channelId;break}}}catch{}let E=`tpl-fail-${Date.now()}`,T=i?{type:"channel",channelId:i}:{type:"channel",channelId:"REPLACE_ME"},n=i?1:0;e.prepare("INSERT INTO delivery_rules (id, event_type, match_criteria, target, max_per_minute, skip_origin_channel, enabled, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(E,"template_execution_failed","{}",JSON.stringify(T),3,0,n,Date.now()),i?console.info(`[db migration v60] seeded template_execution_failed delivery rule targeting channel ${i}`):console.warn("[db migration v60] no primary channel found for template_execution_failed rule; created as disabled (channelId=REPLACE_ME)")}e.prepare("UPDATE server_state SET schema_version = 60 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<61&&(e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='effect_receipts'").get()||(e.prepare(`
874
+ `),e.prepare("UPDATE server_state SET schema_version = 57 WHERE id = 1").run(),console.info("[db migration v57] assistant_delivery_commitments: added ChatManager delivery commitment table")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<58){e.prepare("PRAGMA table_info(channels)").all().some(T=>T.name==="viewer_key")||e.exec("ALTER TABLE channels ADD COLUMN viewer_key TEXT");let r="local-owner",i=e.prepare("SELECT value FROM config WHERE key = 'identity.ownerViewerKey'").get();if(i)try{let T=JSON.parse(i.value);typeof T=="string"&&T.trim().length>0&&(r=T)}catch{i.value.trim().length>0&&(r=i.value)}let E=e.prepare("SELECT id, config FROM channels").all(),n=e.prepare("UPDATE channels SET config = ?, viewer_key = ?, updated_at = ? WHERE id = ?");for(let T of E)try{let c=JSON.parse(T.config),L=typeof c.viewerKey=="string"&&c.viewerKey.trim().length>0?c.viewerKey:r;delete c.viewerKey,n.run(JSON.stringify(c),L,Date.now(),T.id)}catch{e.prepare("UPDATE channels SET viewer_key = ?, updated_at = ? WHERE id = ?").run(r,Date.now(),T.id)}e.prepare("UPDATE server_state SET schema_version = 58 WHERE id = 1").run(),console.info("[db migration v58] channels: extracted viewerKey from config into viewer_key column")}{let s=["^Task assigned to role [A-Z]$","^List files in the current directory\\.?$","^ping role payload$"];try{let r=e.prepare("SELECT id FROM delivery_rules WHERE created_by = 'system' AND target LIKE '%_default_block_%'").all();for(let i of r)e.prepare("DELETE FROM delivery_rules WHERE id = ?").run(i.id),console.info(`[db v59 repair] removed legacy bad rule ${i.id}`);e.prepare("DELETE FROM config WHERE key = 'delivery.defaultExcludePromptPatterns' AND value LIKE '%E2E_TEST_MODE%'").run()}catch(r){console.warn("[db v59 repair] cleanup of legacy seed failed (non-fatal):",r)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<59){let r=e.prepare("SELECT id, match_criteria FROM delivery_rules WHERE event_type = 'task_complete'").all(),i=0;for(let E of r)try{let n=E.match_criteria?JSON.parse(E.match_criteria):{};if(!(!n.templateId&&!n.roleId&&!n.promptPattern&&!n.taskStatus))continue;let c=Array.isArray(n.excludePromptPatterns)?n.excludePromptPatterns:[],L=[...new Set([...c,...s])],o={...n,excludePromptPatterns:L};e.prepare("UPDATE delivery_rules SET match_criteria = ? WHERE id = ?").run(JSON.stringify(o),E.id),i++}catch{}e.prepare("UPDATE server_state SET schema_version = 59 WHERE id = 1").run(),console.info(`[db migration v59] delivery: seeded excludePromptPatterns on ${i} catch-all rule(s)`)}try{let r=e.prepare("SELECT id, match_criteria FROM delivery_rules WHERE event_type = 'task_complete'").all();for(let i of r)try{let E=i.match_criteria?JSON.parse(i.match_criteria):{};if(!(!E.templateId&&!E.roleId&&!E.promptPattern&&!E.taskStatus))continue;let T=Array.isArray(E.excludePromptPatterns)?E.excludePromptPatterns:[],c=s.filter(v=>!T.includes(v));if(c.length===0)continue;let L=[...T,...c],o={...E,excludePromptPatterns:L};e.prepare("UPDATE delivery_rules SET match_criteria = ? WHERE id = ?").run(JSON.stringify(o),i.id),console.info(`[db v59 reconcile] added ${c.length} default exclude pattern(s) to rule ${i.id}`)}catch{}}catch(r){console.warn("[db v59 reconcile] post-migration repair failed (non-fatal):",r)}}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<60){if(e.prepare("PRAGMA table_info(delivery_log)").all().some(r=>r.name==="execution_id")||(e.prepare("ALTER TABLE delivery_log ADD COLUMN execution_id TEXT").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_delivery_log_execution_id ON delivery_log (execution_id)").run()),!e.prepare("SELECT id FROM delivery_rules WHERE event_type = ?").get("template_execution_failed")){let r=e.prepare("SELECT id, target, match_criteria FROM delivery_rules WHERE event_type = 'task_complete' AND enabled = 1").all(),i=null;for(let c of r)try{let L=c.match_criteria?JSON.parse(c.match_criteria):{};if(!L.templateId&&!L.roleId&&!L.promptPattern&&!L.taskStatus){let v=JSON.parse(c.target);if(v?.type==="channel"&&typeof v.channelId=="string"){i=v.channelId;break}}}catch{}let E=`tpl-fail-${Date.now()}`,n=i?{type:"channel",channelId:i}:{type:"channel",channelId:"REPLACE_ME"},T=i?1:0;e.prepare("INSERT INTO delivery_rules (id, event_type, match_criteria, target, max_per_minute, skip_origin_channel, enabled, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(E,"template_execution_failed","{}",JSON.stringify(n),3,0,T,Date.now()),i?console.info(`[db migration v60] seeded template_execution_failed delivery rule targeting channel ${i}`):console.warn("[db migration v60] no primary channel found for template_execution_failed rule; created as disabled (channelId=REPLACE_ME)")}e.prepare("UPDATE server_state SET schema_version = 60 WHERE id = 1").run()}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<61&&(e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='effect_receipts'").get()||(e.prepare(`
875
875
  CREATE TABLE effect_receipts (
876
876
  id TEXT PRIMARY KEY,
877
877
  trace_id TEXT NOT NULL,
@@ -945,7 +945,7 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
945
945
  CREATE INDEX idx_chat_tool_calls_trace ON chat_tool_calls(trace_id, called_at)
946
946
  `),e.exec(`
947
947
  CREATE INDEX idx_chat_tool_calls_session ON chat_tool_calls(session_id, called_at) WHERE session_id IS NOT NULL
948
- `)),e.prepare("UPDATE server_state SET schema_version = 67 WHERE id = 1").run()}catch(t){throw new Error(`Schema v67 migration failed: ${t}`)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<68)try{e.prepare("PRAGMA table_info(memories)").all().some(T=>T.name==="kind")||e.exec("ALTER TABLE memories ADD COLUMN kind TEXT NOT NULL DEFAULT 'observation'"),e.prepare("PRAGMA table_info(roles)").all().some(T=>T.name==="last_reflection_at")||e.exec("ALTER TABLE roles ADD COLUMN last_reflection_at INTEGER"),e.prepare("PRAGMA table_info(server_state)").all().some(T=>T.name==="last_memory_gc_at")||e.exec("ALTER TABLE server_state ADD COLUMN last_memory_gc_at INTEGER"),e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='beliefs'").get()||(e.exec(`
948
+ `)),e.prepare("UPDATE server_state SET schema_version = 67 WHERE id = 1").run()}catch(t){throw new Error(`Schema v67 migration failed: ${t}`)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<68)try{e.prepare("PRAGMA table_info(memories)").all().some(n=>n.name==="kind")||e.exec("ALTER TABLE memories ADD COLUMN kind TEXT NOT NULL DEFAULT 'observation'"),e.prepare("PRAGMA table_info(roles)").all().some(n=>n.name==="last_reflection_at")||e.exec("ALTER TABLE roles ADD COLUMN last_reflection_at INTEGER"),e.prepare("PRAGMA table_info(server_state)").all().some(n=>n.name==="last_memory_gc_at")||e.exec("ALTER TABLE server_state ADD COLUMN last_memory_gc_at INTEGER"),e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='beliefs'").get()||(e.exec(`
949
949
  CREATE TABLE beliefs (
950
950
  id TEXT PRIMARY KEY,
951
951
  role_id TEXT NOT NULL,
@@ -1003,4 +1003,71 @@ import{d as P,e as G,h as H}from"./chunk-WBAPIPST.js";import{c as g,h as B}from"
1003
1003
  last_error TEXT,
1004
1004
  last_role_id TEXT,
1005
1005
  last_task_id TEXT
1006
- )`).run(),e.prepare("UPDATE server_state SET schema_version = 71 WHERE id = 1").run()}catch(t){throw new Error(`Schema v71 migration failed: ${t}`)}try{let s=e.prepare("SELECT id, name, steps, role_preference FROM task_templates WHERE enabled = 1").all(),t=0;for(let r of s){if(r.role_preference)continue;let i;try{i=JSON.parse(r.steps)}catch{continue}if(!Array.isArray(i))continue;let E=!1;for(let T of i){let n=typeof T.roleId=="string"&&T.roleId.length>0,c=T.autoSelectRole===!0;!n&&!c&&(T.autoSelectRole=!0,T.requirements===void 0&&(T.requirements={}),E=!0)}E&&(e.prepare("UPDATE task_templates SET steps = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(i),Date.now(),r.id),t+=1,console.info(`[db migration] template auto-repaired: id=${r.id} name=${r.name}`))}t>0&&console.info(`[db migration] auto-repaired ${t} enabled template(s) with missing role config`)}catch(s){console.error("[db migration] template auto-repair failed:",s)}}function Pe(){if(R)return R;let e=process.env.ADAM_DB_PATH||G,a=le(e);return ae(a)||ce(a,{recursive:!0}),R=new _e(e),R.pragma("journal_mode = WAL"),R.pragma("foreign_keys = ON"),R.pragma("trusted_schema = ON"),pe(R),R}function Ge(){R&&(R.close(),R=null)}var S,ee,C,y,Z,b,Ne,de,R,me=M(()=>{H();B();Q();S=g("store"),ee=["work","flow_complete"].join(""),C=`${ee}:`,y=["work","flow_executions"].join(""),Z=["work","flow_artifacts"].join(""),b=["idx","work","flow_executions_event_id"].join("_"),Ne=["idx","work","flow_artifacts_execution"].join("_"),de=["idx","work","flow_artifacts_step"].join("_"),R=null});export{oe as a,ve as b,fe as c,ge as d,Se as e,J as f,Ce as g,Ue as h,De as i,Q as j,pe as k,Pe as l,Ge as m,me as n};
1006
+ )`).run(),e.prepare("UPDATE server_state SET schema_version = 71 WHERE id = 1").run()}catch(t){throw new Error(`Schema v71 migration failed: ${t}`)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<72)try{if(e.exec(`
1007
+ CREATE TABLE IF NOT EXISTS artifacts (
1008
+ id TEXT PRIMARY KEY,
1009
+ source_kind TEXT NOT NULL CHECK (source_kind IN ('template_step', 'task_published', 'chat_sent')),
1010
+ execution_id TEXT REFERENCES template_executions(id) ON DELETE CASCADE,
1011
+ task_id TEXT REFERENCES tasks(id) ON DELETE CASCADE,
1012
+ chat_session_id TEXT REFERENCES chat_sessions(id) ON DELETE CASCADE,
1013
+ step_id TEXT,
1014
+ role_id TEXT,
1015
+ key TEXT,
1016
+ kind TEXT NOT NULL CHECK(kind IN ('json', 'file')),
1017
+ value_json TEXT,
1018
+ blob_path TEXT,
1019
+ mime TEXT,
1020
+ original_filename TEXT,
1021
+ size_bytes INTEGER NOT NULL,
1022
+ created_at INTEGER NOT NULL,
1023
+ locator TEXT,
1024
+ content_hash TEXT,
1025
+ retention_hint TEXT,
1026
+ encryption_class TEXT,
1027
+ purpose TEXT,
1028
+ replaces TEXT,
1029
+ produced_by_role TEXT,
1030
+ access TEXT,
1031
+ CHECK (
1032
+ (source_kind = 'template_step' AND execution_id IS NOT NULL AND task_id IS NULL AND chat_session_id IS NULL AND step_id IS NOT NULL)
1033
+ OR (source_kind = 'task_published' AND task_id IS NOT NULL AND execution_id IS NULL AND chat_session_id IS NULL)
1034
+ OR (source_kind = 'chat_sent' AND chat_session_id IS NOT NULL AND task_id IS NULL AND execution_id IS NULL)
1035
+ )
1036
+ )
1037
+ `),e.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='template_execution_artifacts'").get()){let r=e.prepare("SELECT COUNT(*) AS n FROM template_execution_artifacts").get().n;e.exec(`
1038
+ INSERT INTO artifacts (
1039
+ id, source_kind, execution_id, task_id, chat_session_id, step_id, role_id,
1040
+ key, kind, value_json, blob_path, mime, original_filename, size_bytes, created_at,
1041
+ locator, content_hash, retention_hint, encryption_class, purpose, replaces, produced_by_role, access
1042
+ )
1043
+ SELECT
1044
+ id,
1045
+ 'template_step' AS source_kind,
1046
+ execution_id,
1047
+ NULL AS task_id,
1048
+ NULL AS chat_session_id,
1049
+ step_id,
1050
+ produced_by_role AS role_id,
1051
+ key, kind, value_json, blob_path, mime, original_filename, size_bytes, created_at,
1052
+ locator, content_hash, retention_hint, encryption_class, purpose, replaces, produced_by_role, access
1053
+ FROM template_execution_artifacts
1054
+ `);let i=e.prepare("SELECT COUNT(*) AS n FROM artifacts WHERE source_kind = 'template_step'").get().n;if(i!==r)throw new Error(`v72 migration row-count mismatch: legacy=${r}, migrated=${i}`);e.exec("DROP TABLE template_execution_artifacts")}e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_execution_id ON artifacts(execution_id) WHERE execution_id IS NOT NULL").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_task_id ON artifacts(task_id) WHERE task_id IS NOT NULL").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_chat_session_id ON artifacts(chat_session_id) WHERE chat_session_id IS NOT NULL").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_role_id ON artifacts(role_id) WHERE role_id IS NOT NULL").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_created_at ON artifacts(created_at DESC)").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_source_kind ON artifacts(source_kind)").run(),e.prepare("CREATE UNIQUE INDEX IF NOT EXISTS idx_artifacts_template_step_key ON artifacts(execution_id, step_id, key) WHERE source_kind = 'template_step'").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_replaces ON artifacts(replaces) WHERE replaces IS NOT NULL").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_artifacts_content_hash ON artifacts(content_hash) WHERE content_hash IS NOT NULL").run(),e.prepare("UPDATE server_state SET schema_version = 72 WHERE id = 1").run()}catch(t){throw new Error(`Schema v72 migration failed: ${t}`)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<73)try{e.prepare("PRAGMA table_info(artifacts)").all().some(i=>i.name==="priority")||e.prepare("ALTER TABLE artifacts ADD COLUMN priority INTEGER").run(),e.prepare("UPDATE server_state SET schema_version = 73 WHERE id = 1").run()}catch(t){throw new Error(`Schema v73 migration failed: ${t}`)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<74)try{let t=e.prepare("PRAGMA table_info(channels)").all(),r=t.some(E=>E.name==="recipient_cap_map_json"),i=t.some(E=>E.name==="default_recipient_cap_bytes");r||e.prepare("ALTER TABLE channels ADD COLUMN recipient_cap_map_json TEXT").run(),i||e.prepare("ALTER TABLE channels ADD COLUMN default_recipient_cap_bytes INTEGER").run(),e.prepare("UPDATE server_state SET schema_version = 74 WHERE id = 1").run()}catch(t){throw new Error(`Schema v74 migration failed: ${t}`)}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<75)try{e.prepare("PRAGMA table_info(audit_violations)").all().length>0&&((e.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'audit_violations'").get()?.sql.includes("'A', 'B', 'C'")??!1)||(e.prepare(`
1055
+ CREATE TABLE audit_violations_new (
1056
+ id TEXT PRIMARY KEY,
1057
+ step_task_id TEXT NOT NULL,
1058
+ execution_id TEXT,
1059
+ role_id TEXT NOT NULL,
1060
+ contract_field TEXT NOT NULL,
1061
+ layer TEXT NOT NULL CHECK(layer IN ('A', 'B', 'C')),
1062
+ severity TEXT NOT NULL CHECK(severity IN ('error', 'warning')),
1063
+ message TEXT NOT NULL,
1064
+ metadata_json TEXT,
1065
+ created_at INTEGER NOT NULL
1066
+ )
1067
+ `).run(),e.prepare(`
1068
+ INSERT INTO audit_violations_new
1069
+ (id, step_task_id, execution_id, role_id, contract_field, layer, severity, message, metadata_json, created_at)
1070
+ SELECT
1071
+ id, step_task_id, execution_id, role_id, contract_field, layer, severity, message, metadata_json, created_at
1072
+ FROM audit_violations
1073
+ `).run(),e.prepare("DROP TABLE audit_violations").run(),e.prepare("ALTER TABLE audit_violations_new RENAME TO audit_violations").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_audit_violations_role ON audit_violations(role_id, created_at DESC)").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_audit_violations_task ON audit_violations(step_task_id)").run(),e.prepare("CREATE INDEX IF NOT EXISTS idx_audit_violations_execution ON audit_violations(execution_id, created_at DESC)").run())),e.prepare("UPDATE server_state SET schema_version = 75 WHERE id = 1").run(),console.info("[db migration v75] audit_violations.layer CHECK extended to include 'C' for Phase 1 customAssertions")}catch(t){throw new Error(`Schema v75 migration failed: ${t}`)}try{let s=e.prepare("SELECT id, name, steps, role_preference FROM task_templates WHERE enabled = 1").all(),t=0;for(let r of s){if(r.role_preference)continue;let i;try{i=JSON.parse(r.steps)}catch{continue}if(!Array.isArray(i))continue;let E=!1;for(let n of i){let T=typeof n.roleId=="string"&&n.roleId.length>0,c=n.autoSelectRole===!0;!T&&!c&&(n.autoSelectRole=!0,n.requirements===void 0&&(n.requirements={}),E=!0)}E&&(e.prepare("UPDATE task_templates SET steps = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(i),Date.now(),r.id),t+=1,console.info(`[db migration] template auto-repaired: id=${r.id} name=${r.name}`))}t>0&&console.info(`[db migration] auto-repaired ${t} enabled template(s) with missing role config`)}catch(s){console.error("[db migration] template auto-repair failed:",s)}}function Be(){if(A)return A;let e=process.env.ADAM_DB_PATH||W,_=Ne(e);return ce(_)||le(_,{recursive:!0}),A=new ae(e),A.pragma("journal_mode = WAL"),A.pragma("foreign_keys = ON"),A.pragma("trusted_schema = ON"),me(A),A}function We(){A&&(A.close(),A=null)}var U,re,h,w,b,ee,de,pe,A,Le=H(()=>{Y();K();Z();U=g("store"),re=["work","flow_complete"].join(""),h=`${re}:`,w=["work","flow_executions"].join(""),b=["work","flow_artifacts"].join(""),ee=["idx","work","flow_executions_event_id"].join("_"),de=["idx","work","flow_artifacts_execution"].join("_"),pe=["idx","work","flow_artifacts_step"].join("_"),A=null});export{oe as a,ve as b,Se as c,ge as d,Ce as e,J as f,De as g,Ue as h,he as i,xe as j,ye as k,Z as l,me as m,Be as n,We as o,Le as p};
@@ -1,4 +1,4 @@
1
- import{l as o,n as a}from"./chunk-BPXS4QEO.js";import{c as u,e as c}from"./chunk-245WE5AF.js";a();c();import{v4 as p}from"uuid";function R(t){o().prepare(`
1
+ import{n as o,p as a}from"./chunk-QL2ZOLMC.js";import{c as u,e as c}from"./chunk-245WE5AF.js";a();c();import{v4 as p}from"uuid";function R(t){o().prepare(`
2
2
  INSERT INTO evolution_audit (id, timestamp, old_rules, new_rules, diff, trigger_task_id, role_id, source, trace_id)
3
3
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
4
4
  `).run(p(),t.timestamp,t.oldRules,t.newRules,t.diff,t.triggerTaskId??null,t.roleId??null,t.source??"reflection",t.traceId??u()??null)}function _(t=100,e=0){return o().prepare(`
@@ -1,4 +1,4 @@
1
- import{e as y}from"./chunk-UFWMUBFH.js";import{b as m}from"./chunk-CLNYHWZ6.js";import{c as h,h as w}from"./chunk-BLCNUT53.js";w();var v="",I=Buffer.alloc(0);function O(o){v=o,I=Buffer.from(o)}function g(){return v}function C(){return I}var p=h("channels"),u=new Map,x=3e5,$=new Set(["telegram"]);function T(o){let e=o.trim().toLowerCase().match(/^(yes|y|是|允许|no|n|否|拒绝)\s+(\S+)$/);if(!e)return null;let[,c,l]=e,r=["yes","y","\u662F","\u5141\u8BB8"].includes(c);return{requestId:l,decision:r?"allow":"deny"}}function P(o){let n=m(o);return n?$.has(n.platform):!1}var b={low:"\u{1F7E2}",medium:"\u{1F7E1}",high:"\u{1F534}"},k={low:"\u4F4E",medium:"\u4E2D",high:"\u9AD8"};function _(o){let n=["\u{1F512} \u9700\u8981\u5BA1\u6279",""];for(let e of o.steps){if(e.description.startsWith("Execute task without OS sandbox"))n.push("\u26A0\uFE0F \u65E0\u6C99\u7BB1\u6267\u884C \u2014 \u6587\u4EF6\u7CFB\u7EDF\u9694\u79BB\u672A\u542F\u7528");else{let r=e.description.indexOf(": "),s=r>0?e.description.slice(0,r):"Operation";if(n.push(`\u64CD\u4F5C: ${s}`),s==="Bash"&&r>0)try{let t=JSON.parse(e.description.slice(r+2));if(t.command){let i=String(t.command).trim();n.push(`\u547D\u4EE4: ${i.length>120?i.slice(0,117)+"...":i}`)}}catch{let t=e.description.slice(r+2,r+122);n.push(`\u8BE6\u60C5: ${t}${e.description.length>r+122?"...":""}`)}else if(r>0){let t=e.description.slice(r+2,r+122);n.push(`\u8BE6\u60C5: ${t}${e.description.length>r+122?"...":""}`)}}let c=b[e.riskLevel]??"\u{1F7E1}",l=k[e.riskLevel]??e.riskLevel;n.push(`\u98CE\u9669: ${c} ${l}`),n.push("")}return n.join(`
1
+ import{g as y}from"./chunk-32LOJEHE.js";import{c as m}from"./chunk-VVQ532U2.js";import{c as h,h as w}from"./chunk-BLCNUT53.js";w();var v="",I=Buffer.alloc(0);function O(o){v=o,I=Buffer.from(o)}function g(){return v}function C(){return I}var p=h("channels"),u=new Map,x=3e5,$=new Set(["telegram"]);function T(o){let e=o.trim().toLowerCase().match(/^(yes|y|是|允许|no|n|否|拒绝)\s+(\S+)$/);if(!e)return null;let[,c,l]=e,r=["yes","y","\u662F","\u5141\u8BB8"].includes(c);return{requestId:l,decision:r?"allow":"deny"}}function P(o){let n=m(o);return n?$.has(n.platform):!1}var b={low:"\u{1F7E2}",medium:"\u{1F7E1}",high:"\u{1F534}"},k={low:"\u4F4E",medium:"\u4E2D",high:"\u9AD8"};function _(o){let n=["\u{1F512} \u9700\u8981\u5BA1\u6279",""];for(let e of o.steps){if(e.description.startsWith("Execute task without OS sandbox"))n.push("\u26A0\uFE0F \u65E0\u6C99\u7BB1\u6267\u884C \u2014 \u6587\u4EF6\u7CFB\u7EDF\u9694\u79BB\u672A\u542F\u7528");else{let r=e.description.indexOf(": "),s=r>0?e.description.slice(0,r):"Operation";if(n.push(`\u64CD\u4F5C: ${s}`),s==="Bash"&&r>0)try{let t=JSON.parse(e.description.slice(r+2));if(t.command){let i=String(t.command).trim();n.push(`\u547D\u4EE4: ${i.length>120?i.slice(0,117)+"...":i}`)}}catch{let t=e.description.slice(r+2,r+122);n.push(`\u8BE6\u60C5: ${t}${e.description.length>r+122?"...":""}`)}else if(r>0){let t=e.description.slice(r+2,r+122);n.push(`\u8BE6\u60C5: ${t}${e.description.length>r+122?"...":""}`)}}let c=b[e.riskLevel]??"\u{1F7E1}",l=k[e.riskLevel]??e.riskLevel;n.push(`\u98CE\u9669: ${c} ${l}`),n.push("")}return n.join(`
2
2
  `).trimEnd()}async function q(o,n,e,c,l,r=x){let s=e,t=s.slice(0,8);u.set(t,{planId:e,taskId:c,channelId:o,chatId:n,requestId:s,timestamp:Date.now(),timeoutMs:r});let i=y(),d=P(o);if(d){let a=`${l}
3
3
 
4
4
  `;await i.send({channelId:o,chatId:n,content:a,messageType:"approval",replyMarkup:{inlineKeyboard:[[{text:"\u2705 Allow",callbackData:`yes ${t}`},{text:"\u274C Deny",callbackData:`no ${t}`}]]}})}else{let a=[l,"",`Reply 'yes ${t}' or 'no ${t}'`].join(`
@@ -1,4 +1,4 @@
1
- import{l as t,n as d}from"./chunk-BPXS4QEO.js";d();function s(e){return{id:e.id,taskId:e.task_id,roleId:void 0,plan:JSON.parse(e.plan_json),status:e.status,approvalType:e.approval_type??void 0,deviationReport:e.deviation_report_json?JSON.parse(e.deviation_report_json):void 0,learnedRules:e.learned_rules_json?JSON.parse(e.learned_rules_json):void 0,createdAt:e.created_at,approvedAt:e.approved_at??void 0,reviewedAt:e.reviewed_at??void 0}}function p(e){t().prepare(`
1
+ import{n as t,p as d}from"./chunk-QL2ZOLMC.js";d();function s(e){return{id:e.id,taskId:e.task_id,roleId:void 0,plan:JSON.parse(e.plan_json),status:e.status,approvalType:e.approval_type??void 0,deviationReport:e.deviation_report_json?JSON.parse(e.deviation_report_json):void 0,learnedRules:e.learned_rules_json?JSON.parse(e.learned_rules_json):void 0,createdAt:e.created_at,approvedAt:e.approved_at??void 0,reviewedAt:e.reviewed_at??void 0}}function p(e){t().prepare(`
2
2
  INSERT INTO task_plans (id, task_id, plan_json, status, approval_type,
3
3
  deviation_report_json, learned_rules_json, created_at, approved_at, reviewed_at)
4
4
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -1,4 +1,4 @@
1
- import{C as M,I as D}from"./chunk-KJNAORKM.js";import{l as u,n as O}from"./chunk-BPXS4QEO.js";O();D();function E(e){return{id:e.id,roleId:e.role_id,type:e.type,content:e.content,embedding:e.embedding?new Float32Array(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength/4):void 0,keywords:e.keywords?JSON.parse(e.keywords):[],importance:e.importance,sourceType:e.source_type,sourceTaskId:e.source_task_id??void 0,evidence:e.evidence?JSON.parse(e.evidence):void 0,createdAt:e.created_at,lastAccessed:e.last_accessed,retrievedCount:e.retrieved_count,tier:e.tier,supersededBy:e.superseded_by??void 0}}function _(e){return Buffer.from(e.buffer,e.byteOffset,e.byteLength)}function I(e){u().prepare(`
1
+ import{C as M,I as D}from"./chunk-MTQI6B7T.js";import{n as u,p as O}from"./chunk-QL2ZOLMC.js";O();D();function E(e){return{id:e.id,roleId:e.role_id,type:e.type,content:e.content,embedding:e.embedding?new Float32Array(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength/4):void 0,keywords:e.keywords?JSON.parse(e.keywords):[],importance:e.importance,sourceType:e.source_type,sourceTaskId:e.source_task_id??void 0,evidence:e.evidence?JSON.parse(e.evidence):void 0,createdAt:e.created_at,lastAccessed:e.last_accessed,retrievedCount:e.retrieved_count,tier:e.tier,supersededBy:e.superseded_by??void 0}}function _(e){return Buffer.from(e.buffer,e.byteOffset,e.byteLength)}function I(e){u().prepare(`
2
2
  INSERT INTO memories (id, role_id, type, content, embedding, keywords,
3
3
  importance, source_type, source_task_id, evidence,
4
4
  created_at, last_accessed, retrieved_count, tier, superseded_by)
@@ -0,0 +1,6 @@
1
+ import{n as s,p as m}from"./chunk-QL2ZOLMC.js";import{c as d,h as f}from"./chunk-BLCNUT53.js";m();f();var p=/^[a-z0-9.-]+$/;var u=d("store");function r(e){let n;if(e.recipient_cap_map_json)try{n=JSON.parse(e.recipient_cap_map_json)}catch(i){u.warn({channelId:e.id,err:i},"Malformed recipient_cap_map_json; using empty map"),n=void 0}return{id:e.id,name:e.name,platform:e.platform,enabled:e.enabled===1,status:e.status,config:JSON.parse(e.config),linkedRoleId:e.linked_role_id??void 0,allowedChatIds:e.allowed_chat_ids?JSON.parse(e.allowed_chat_ids):void 0,viewerKey:e.viewer_key??void 0,createdAt:e.created_at,updatedAt:e.updated_at??void 0,lastMessageAt:e.last_message_at??void 0,messageCount:e.message_count,recipientCapMap:n,defaultRecipientCapBytes:e.default_recipient_cap_bytes??void 0}}function R(e){s().prepare(`
2
+ INSERT INTO channels (id, name, platform, enabled, status, config, linked_role_id,
3
+ allowed_chat_ids, viewer_key, created_at, updated_at, last_message_at, message_count,
4
+ recipient_cap_map_json, default_recipient_cap_bytes)
5
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
6
+ `).run(e.id,e.name,e.platform,e.enabled?1:0,e.status,JSON.stringify(e.config),e.linkedRoleId??null,e.allowedChatIds?JSON.stringify(e.allowedChatIds):null,e.viewerKey??null,e.createdAt,e.updatedAt??null,e.lastMessageAt??null,e.messageCount,e.recipientCapMap?JSON.stringify(e.recipientCapMap):null,e.defaultRecipientCapBytes??null)}function b(e){let i=s().prepare("SELECT * FROM channels WHERE id = ?").get(e);return i?r(i):void 0}function A(e,n){let i=s(),t=[],a=[];n.name!==void 0&&(t.push("name = ?"),a.push(n.name)),n.enabled!==void 0&&(t.push("enabled = ?"),a.push(n.enabled?1:0)),n.status!==void 0&&(t.push("status = ?"),a.push(n.status)),n.config!==void 0&&(t.push("config = ?"),a.push(JSON.stringify(n.config))),n.linkedRoleId!==void 0&&(t.push("linked_role_id = ?"),a.push(n.linkedRoleId)),n.allowedChatIds!==void 0&&(t.push("allowed_chat_ids = ?"),a.push(JSON.stringify(n.allowedChatIds))),n.viewerKey!==void 0&&(t.push("viewer_key = ?"),a.push(n.viewerKey)),n.lastMessageAt!==void 0&&(t.push("last_message_at = ?"),a.push(n.lastMessageAt)),n.messageCount!==void 0&&(t.push("message_count = ?"),a.push(n.messageCount)),n.recipientCapMap!==void 0&&(t.push("recipient_cap_map_json = ?"),a.push(JSON.stringify(n.recipientCapMap))),n.defaultRecipientCapBytes!==void 0&&(t.push("default_recipient_cap_bytes = ?"),a.push(n.defaultRecipientCapBytes)),t.length!==0&&(t.push("updated_at = ?"),a.push(Date.now()),a.push(e),i.prepare(`UPDATE channels SET ${t.join(", ")} WHERE id = ?`).run(...a))}function S(e){let n=s();return e!==void 0?n.prepare("SELECT * FROM channels WHERE enabled = ? ORDER BY created_at DESC").all(e?1:0).map(r):n.prepare("SELECT * FROM channels ORDER BY created_at DESC").all().map(r)}function y(e){s().prepare("DELETE FROM channels WHERE id = ?").run(e)}function M(e,n){s().prepare("UPDATE channels SET status = ?, updated_at = ? WHERE id = ?").run(n,Date.now(),e)}function w(e,n){let t=s().prepare("SELECT recipient_cap_map_json, default_recipient_cap_bytes FROM channels WHERE id = ?").get(e);if(!t)return 20971520;let a={};if(t.recipient_cap_map_json)try{a=JSON.parse(t.recipient_cap_map_json)}catch(c){u.warn({channelId:e,err:c},"Malformed recipient_cap_map_json; using empty map")}return a[n]??t.default_recipient_cap_bytes??20971520}function O(e,n,i){if(!p.test(n))throw new RangeError(`invalid recipient domain: ${n}`);if(i<1048576||i>209715200)throw new RangeError(`cap ${i} outside [${1048576}, ${209715200}]`);s().prepare("UPDATE channels SET recipient_cap_map_json = json_set(coalesce(recipient_cap_map_json, '{}'), ?, ?), updated_at = ? WHERE id = ?").run(`$."${n}"`,i,Date.now(),e)}export{p as a,R as b,b as c,A as d,S as e,y as f,M as g,w as h,O as i};
@@ -0,0 +1,14 @@
1
+ import{a as O}from"./chunk-C2XFPUFV.js";import{a as Ee}from"./chunk-HXDS4NWI.js";import{b as re}from"./chunk-AQAHVNNG.js";import{e as Ae,i as ot}from"./chunk-3UR2PN5N.js";import{b as le,k as ue,m as ee,s as te}from"./chunk-K4IE6DPX.js";import{a as Se}from"./chunk-L7JP7DUO.js";import{a as Ne}from"./chunk-3UZIEE2D.js";import{a as Oe}from"./chunk-DRO3DG7X.js";import{a as Ce,b as pe,c as Te,k as Re}from"./chunk-TJTH7LHX.js";import{C as de,I as rt,b as L,c as ve,o as tt}from"./chunk-MTQI6B7T.js";import{a as W,b as Q,d as ye,j as ne,l as Ie,n as _e,o as be,r as Qe}from"./chunk-LVHLUAZW.js";import{b as Z,c as ge,d as se,e as ke,f as ae,j as xe,l as Ze,n as z,p as ce}from"./chunk-QL2ZOLMC.js";import{c as G,h as he}from"./chunk-BLCNUT53.js";import{c as we,e as et}from"./chunk-245WE5AF.js";rt();ot();tt();import{createSdkMcpServer as Bt,tool as D}from"@anthropic-ai/claude-agent-sdk";import{z as d}from"zod";import{v4 as me}from"uuid";Qe();he();ce();var it=G("audit");function I(t){try{z().prepare(`
2
+ INSERT INTO artifact_access_log (
3
+ timestamp, task_id, role_id, execution_id, step_id, tool, artifact_key, artifact_id,
4
+ size_bytes, outcome, error_reason
5
+ )
6
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
7
+ `).run(t.timestamp,t.taskId??null,t.roleId??null,t.executionId,t.stepId??null,t.tool,t.artifactKey??null,t.artifactId??null,t.sizeBytes??null,t.outcome,t.errorReason??null)}catch(e){it.error({err:e,entry:t},"Failed to write artifact access log")}}Ze();import{tool as q}from"@anthropic-ai/claude-agent-sdk";import{z as k}from"zod";import{v4 as nt}from"uuid";function P(t){return{content:[{type:"text",text:JSON.stringify(t)}]}}var st={query:k.string().describe("Search query for memory retrieval"),roleId:le.optional().describe("Role ID to scope search (omit for cross-role)"),topK:k.number().optional().describe("Max results to return (default 5)")},at={query:k.string().describe("Search query for memory retrieval"),topK:k.number().optional().describe("Max results to return (default 5)")},ct={id:k.string().optional().describe("Memory ID to update. Omit to create new."),roleId:le.describe("Role ID to save memory under"),content:k.string().describe("Memory content text"),type:k.enum(["event","thought","reflection"]).optional().describe("Memory type (default: thought)"),keywords:k.array(k.string()).optional().describe("Keywords for BM25 search"),importance:k.number().min(1).max(5).optional().describe("Importance 1-5 (default: 3)"),tier:k.enum(["working","episodic","semantic"]).optional().describe("Memory tier (default: episodic)")},dt={id:k.string().optional().describe("Memory ID to update. Omit to create new."),content:k.string().describe("Memory content text"),type:k.enum(["event","thought","reflection"]).optional().describe("Memory type (default: thought)"),keywords:k.array(k.string()).optional().describe("Keywords for BM25 search"),importance:k.number().min(1).max(5).optional().describe("Importance 1-5 (default: 3)"),tier:k.enum(["working","episodic","semantic"]).optional().describe("Memory tier (default: episodic)")},De={id:k.string().describe("Memory ID to delete")};async function Me(t,e){let r=t??e.roleId,n=e.topK??5,a=await Ne(r,e.query,{topK:n});return P({results:a.map(c=>({id:c.id,type:c.type,content:c.content,keywords:c.keywords,importance:c.importance,score:c.score}))})}async function Pe(t,e){let r=t??e.roleId;if(!r)return P({error:"roleId is required"});let n,a=!0;try{n=await Oe(e.content)}catch{a=!1}if(e.id){let y=pe(e.id);if(!y)return P({error:`Memory ${e.id} not found`});let v=Te(e.id,{content:e.content,embedding:n,keywords:e.keywords,importance:e.importance,type:e.type});return O({toolName:"save_memory",entityType:"memory",verb:"update",entityId:e.id,fieldChanges:[{path:"content",op:"set",before:y.content,after:e.content}],roleId:r}),P({id:e.id,action:"updated",success:v,embeddingUpdated:a})}let c=`mem-${nt().slice(0,8)}`,m=Date.now();return Ce({id:c,roleId:r,type:e.type??"thought",content:e.content,embedding:n,keywords:e.keywords??[],importance:e.importance??3,sourceType:"manual",createdAt:m,lastAccessed:m,retrievedCount:0,tier:e.tier??"episodic"}),O({toolName:"save_memory",entityType:"memory",verb:"create",entityId:c,fieldChanges:[{path:"_entity",op:"set",before:null,after:{id:c,roleId:r,type:e.type??"thought",content:e.content.length>200?`${e.content.slice(0,200)}\u2026`:e.content,tier:e.tier??"episodic"}}],roleId:r}),P({id:c,action:"created",success:!0,embeddingUpdated:a})}async function $e(t,e){let r=pe(e.id);if(t){if(!r)return P({error:`Memory ${e.id} not found`});if(r.roleId!==t)return P({error:`Memory ${e.id} does not belong to this role`})}return Re(e.id),O({toolName:"delete_memory",entityType:"memory",verb:"delete",entityId:e.id,fieldChanges:[{path:"_entity",op:"set",before:r?{id:r.id,roleId:r.roleId,content:r.content.length>200?`${r.content.slice(0,200)}\u2026`:r.content}:null,after:null}],roleId:t??r?.roleId}),P({id:e.id,deleted:!0})}function Be(t){return t?[q("search_memories","Search agent memory using hybrid vector + keyword search. Returns scored memories ranked by relevance, recency, and importance.",at,async e=>Me(t,e)),q("save_memory","Create a new memory or update an existing one. Provide 'id' to update, omit to create. Embedding is auto-generated from content.",dt,async e=>Pe(t,e)),q("delete_memory","Delete a memory by ID.",De,async e=>$e(t,e))]:[q("search_memories","Search agent memory using hybrid vector + keyword search. Returns scored memories ranked by relevance, recency, and importance.",st,async e=>Me(void 0,e)),q("save_memory","Create a new memory or update an existing one. Provide 'id' to update, omit to create. Embedding is auto-generated from content.",ct,async e=>Pe(void 0,e)),q("delete_memory","Delete a memory by ID.",De,async e=>$e(void 0,e))]}he();import{basename as X}from"path";ce();import{v4 as lt}from"uuid";function ze(t){let e=[];if(t.verb||e.push("verb is required"),t.entityType||e.push("entityType is required"),!t.expected)return e.push("expected is required"),{valid:!1,errors:e};let r=t.expected;if(r.kind==="outbound")r.target?.channelId||e.push("expected.target.channelId is required for outbound"),r.attachmentCount!==void 0&&(typeof r.attachmentCount!="number"||r.attachmentCount<0)&&e.push("expected.attachmentCount must be a non-negative number");else if(r.kind==="field_change")r.entityId||e.push("expected.entityId is required for field_change"),r.fieldPath||e.push("expected.fieldPath is required for field_change"),r.op!=="set"&&r.op!=="list_add"&&r.op!=="list_remove"&&e.push("expected.op must be 'set', 'list_add', or 'list_remove'"),r.op==="set"&&(r.after===void 0&&e.push("expected.after is required when op='set'"),(r.added!==void 0||r.removed!==void 0)&&e.push("expected.added/removed must be absent when op='set'")),r.op==="list_add"&&((!Array.isArray(r.added)||r.added.length===0)&&e.push("expected.added (non-empty array) is required when op='list_add'"),(r.after!==void 0||r.removed!==void 0)&&e.push("expected.after/removed must be absent when op='list_add'")),r.op==="list_remove"&&((!Array.isArray(r.removed)||r.removed.length===0)&&e.push("expected.removed (non-empty array) is required when op='list_remove'"),(r.after!==void 0||r.added!==void 0)&&e.push("expected.after/added must be absent when op='list_remove'"));else if(r.kind==="batch"){r.entityType||e.push("expected.entityType is required for batch");let n=Array.isArray(r.entityIds)&&r.entityIds.length>0,a=!!r.scope&&typeof r.scope.expectedCount=="number"&&r.scope.expectedCount>=0&&!!r.scope.filter;!n&&!a&&e.push("batch claims require entityIds (non-empty) or scope (with filter + non-negative expectedCount)")}else e.push(`expected.kind must be 'outbound', 'field_change', or 'batch'; got '${r.kind}'`);return{valid:e.length===0,errors:e}}var j=class extends Error{constructor(r){super(`Invalid claim spec: ${r.join("; ")}`);this.errors=r;this.name="InvalidClaimError"}errors};function Fe(t){if(!t.traceId)throw new j(["traceId is required"]);if(!Array.isArray(t.claims)||t.claims.length===0)throw new j(["claims must be a non-empty array"]);for(let[r,n]of t.claims.entries()){let a=ze(n);if(!a.valid)throw new j([`claims[${r}]: ${a.errors.join("; ")}`])}let e={id:t.id??lt(),traceId:t.traceId,sessionId:t.sessionId,taskId:t.taskId,sourceMessageId:t.sourceMessageId,claims:t.claims,declaredAt:t.declaredAt??Date.now()};return z().prepare(`
8
+ INSERT INTO assistant_claims (
9
+ id, trace_id, session_id, task_id, source_message_id, claims_json, declared_at
10
+ )
11
+ VALUES (?, ?, ?, ?, ?, ?, ?)
12
+ `).run(e.id,e.traceId,e.sessionId??null,e.taskId??null,e.sourceMessageId??null,JSON.stringify(e.claims),e.declaredAt),e}function nr(t){return z().prepare(`
13
+ SELECT * FROM assistant_claims WHERE trace_id = ? ORDER BY declared_at ASC
14
+ `).all(t).map(ut)}function ut(t){return{id:t.id,traceId:t.trace_id,sessionId:t.session_id??void 0,taskId:t.task_id??void 0,sourceMessageId:t.source_message_id??void 0,claims:JSON.parse(t.claims_json),declaredAt:t.declared_at}}et();import{execFile as Tt}from"child_process";import{promisify as Rt}from"util";import{isAbsolute as Ot,basename as Nt}from"path";import Ue from"vm";import{isAbsolute as pt}from"path";var N=class extends Error{constructor(e,r){super(`DSL parse error in "${e}": ${r}`),this.name="DslParseError"}},mt=/^[a-z][a-z0-9_.]*$/i,ft=/\.\./;function J(t){if(!mt.test(t))throw new N(t,`invalid handler key format "${t}" \u2014 must match [a-z][a-z0-9_.]*`);if(ft.test(t))throw new N(t,'handler key must not contain ".."')}function Ke(t){let e=t.trim();try{let n=JSON.parse(e);if(typeof n=="number"||typeof n=="string"||typeof n=="boolean")return n}catch{}let r=parseFloat(e);return Number.isNaN(r)?e:r}var ht=/^([a-z][a-z0-9_.]*)\s+matches\s+\/(.+)\/([gimsuy]*)$/i,yt=/^([a-z][a-z0-9_.]*)\s*(<=|>=|==|!=)\s*(.+)$/i,It=/^([a-z][a-z0-9_.]*)\s*(<|>)\s*(.+)$/i,_t=/^([a-z][a-z0-9_.]*)\s+between\s+(-?\d+(?:\.\d+)?)\s+and\s+(-?\d+(?:\.\d+)?)$/i,bt=/^([a-z][a-z0-9_.]*)\s+in\s+\[([^\]]+)\]$/i;function Le(t){if(typeof t=="object"&&t!==null&&"script"in t){let r=String(t.script);if(!pt(r))throw new N(`{script: "${r}"}`,"script path must be absolute");return{kind:"script",scriptPath:r}}if(typeof t!="string")throw new N(String(t),"assertion must be a string or {script: string} object");let e=t.trim();if(!e)throw new N(e,"empty assertion string");{let r=ht.exec(e);if(r){let n=r[1];return J(n),{kind:"matches",key:n,regexSource:r[2],regexFlags:r[3]??""}}}{let r=_t.exec(e);if(r){let n=r[1];return J(n),{kind:"between",key:n,min:parseFloat(r[2]),max:parseFloat(r[3])}}}{let r=bt.exec(e);if(r){let n=r[1];J(n);let a=r[2],c=[];for(let m of a.split(",")){let y=m.trim();if(y)try{let v=JSON.parse(y);typeof v=="number"||typeof v=="string"||typeof v=="boolean"?c.push(v):c.push(y)}catch{c.push(y)}}return{kind:"in",key:n,values:c}}}{let r=yt.exec(e);if(r){let n=r[1];return J(n),{kind:"comparison",key:n,op:r[2],value:Ke(r[3])}}}{let r=It.exec(e);if(r){let n=r[1];return J(n),{kind:"comparison",key:n,op:r[2],value:Ke(r[3])}}}throw new N(e,"unrecognized assertion syntax \u2014 expected key <op> value, between, in [...], matches /.../, or {script: ...}")}import{execFile as kt,spawn as xt}from"child_process";import{promisify as wt}from"util";import{readFile as V}from"fs/promises";import{existsSync as vt}from"fs";import{createHash as Et}from"crypto";function gt(t){return typeof t=="number"?Number.isInteger(t)?t.toString():t.toFixed(4):JSON.stringify(t)}var F=class extends Error{constructor(r){super(`NO_HANDLER: ${r}, install relevant capability or remove assertion`);this.handlerKey=r;this.name="NoHandlerError"}handlerKey},T=class extends Error{constructor(r,n,a){super(`ASSERTION_FAILED: ${r}=${gt(n)}, expected ${a}`);this.handlerKey=r;this.measured=n;this.expected=a;this.name="AssertionFailedError"}handlerKey;measured;expected},b=class extends Error{constructor(r,n){super(`HANDLER_RUNTIME_ERROR: ${r}: ${n}`);this.handlerKey=r;this.detail=n;this.name="HandlerRuntimeError"}handlerKey;detail};var At=wt(kt);function $(t,e){if(!vt(e))throw new b(t,`file not found: ${e}`)}async function St(t){try{return await At("ffprobe",t,{maxBuffer:10*1024*1024})}catch(e){throw e.code==="ENOENT"?new b("audio.*","ffprobe not found on PATH \u2014 install ffmpeg/ffprobe"):new b("audio.*",`ffprobe failed: ${e.message}`)}}async function qe(t,e){return new Promise((r,n)=>{let a=[],c=xt("ffmpeg",["-v","error","-i",t,"-f","s16le","-ar",String(e),"-ac","1","-"]);c.stdout.on("data",y=>a.push(y));let m="";c.stderr.on("data",y=>{m+=y.toString()}),c.on("error",y=>{y.code==="ENOENT"?n(new b("audio.*","ffmpeg not found on PATH \u2014 install ffmpeg/ffprobe")):n(new b("audio.*",`ffmpeg failed: ${y.message}`))}),c.on("close",y=>{y!==0?n(new b("audio.*",`ffmpeg exit ${y}: ${m.trim()}`)):r(Buffer.concat(a))})})}var je=new Map;async function Ct(t){let e=JSON.stringify(t);if(/"\$ref"\s*:\s*"https?:\/\//.test(e))throw new b("json.schema_valid","remote $ref not supported in schema");let r=Et("sha256").update(e).digest("hex"),n=je.get(r);if(n)return n;let a=(await import("ajv")).default,m=new a({strict:!1,allErrors:!1}).compile(t);return je.set(r,m),m}var He={"audio.duration_s":async t=>{$("audio.duration_s",t);let{stdout:e}=await St(["-v","error","-show_entries","format=duration","-of","default=noprint_wrappers=1:nokey=1",t]),r=parseFloat(e.trim());if(!Number.isFinite(r))throw new b("audio.duration_s",`ffprobe returned non-numeric duration: ${e.trim()}`);return r},"audio.zc_rate_per_s":async t=>{$("audio.zc_rate_per_s",t);let e=24e3,r=await qe(t,e),n=new Int16Array(r.buffer,r.byteOffset,r.byteLength/2),a=0;for(let m=1;m<n.length;m++)n[m-1]>=0!=n[m]>=0&&a++;let c=n.length/e;return c>0?a/c:0},"audio.rms":async t=>{$("audio.rms",t);let r=await qe(t,24e3),n=new Int16Array(r.buffer,r.byteOffset,r.byteLength/2),a=0;for(let c=0;c<n.length;c++){let m=n[c]/32768;a+=m*m}return n.length>0?Math.sqrt(a/n.length):0},"markdown.word_count":async t=>{$("markdown.word_count",t);let e=await V(t,"utf-8");return e.trim().length===0?0:e.trim().split(/\s+/).length},"image.width_px":async t=>{$("image.width_px",t);let{imageSize:e}=await import("image-size"),r=await V(t),n=e(r);if(typeof n.width!="number")throw new b("image.width_px","could not determine image width");return n.width},"image.height_px":async t=>{$("image.height_px",t);let{imageSize:e}=await import("image-size"),r=await V(t),n=e(r);if(typeof n.height!="number")throw new b("image.height_px","could not determine image height");return n.height},"pdf.page_count":async t=>{$("pdf.page_count",t);let{PDFDocument:e}=await import("pdf-lib"),r=await V(t);return(await e.load(r,{ignoreEncryption:!0})).getPageCount()},"json.schema_valid":async(t,e)=>{if($("json.schema_valid",t),!e||typeof e!="object"||!("schema"in e))throw new b("json.schema_valid","missing schema arg");let r=await Ct(e.schema),n=await V(t,"utf-8"),a;try{a=JSON.parse(n)}catch(c){throw new b("json.schema_valid",`file is not valid JSON: ${c.message}`)}return r(a)===!0}};var Dt=Rt(Tt);async function We(t,e,r={}){let n=r.handlerRegistry??He;for(let a=0;a<e.length;a++){let c=e[a],m=Le(c);if(m.kind==="script"){await Pt(m.scriptPath,t);continue}let y=n[m.key];if(!y)throw new F(m.key);let v=r.handlerArgsByIndex?.[a],i=await y(t,v);Mt(m,i)}}function Mt(t,e){switch(t.kind){case"comparison":{let{key:r,op:n,value:a}=t,c=!1;if(n==="<"?c=e<a:n===">"?c=e>a:n==="<="?c=e<=a:n===">="?c=e>=a:n==="=="?c=e==a:n==="!="&&(c=e!=a),!c)throw new T(r,e,`${n} ${a}`);break}case"between":{let{key:r,min:n,max:a}=t;if(e<n||e>a)throw new T(r,e,`between ${n} and ${a}`);break}case"in":{let{key:r,values:n}=t;if(!n.includes(e))throw new T(r,e,`in [${n.join(", ")}]`);break}case"matches":{let{key:r,regexSource:n,regexFlags:a}=t;if(!$t(String(e),n,a,100))throw new T(r,e,`matches /${n}/${a}`);break}}}async function Pt(t,e){if(!Ot(t))throw new b("script",`script path must be absolute: ${t}`);try{await Dt(t,[e],{timeout:6e4,maxBuffer:1024*1024})}catch(r){let n=r;if(n.code==="ENOENT")throw new b("script",`script not found: ${t}`);let a=n.exitCode;throw new T("script:"+Nt(t),a??"error",n.stderr?.trim()??n.message)}}function $t(t,e,r,n){let a={value:t,regex:new RegExp(e,r),result:!1};Ue.createContext(a);try{return Ue.runInContext("result = regex.test(value)",a,{timeout:n}),a.result}catch(c){throw new b("matches",`regex evaluation timeout or error: ${c.message}`)}}ce();var zt="execution-tools",Rr="mcp__execution-tools__",Or=["mcp__execution-tools__write_artifact","mcp__execution-tools__publish_artifact_file","mcp__execution-tools__send_to_channel","mcp__execution-tools__report_blocked","mcp__execution-tools__commit_claim","mcp__execution-tools__save_memory","mcp__execution-tools__delete_memory"],Nr=["mcp__execution-tools__list_channels","mcp__execution-tools__read_artifact","mcp__execution-tools__fetch_artifact_file","mcp__execution-tools__list_artifacts","mcp__execution-tools__search_memories"],Dr=["mcp__execution-tools__write_artifact","mcp__execution-tools__publish_artifact_file","mcp__execution-tools__send_to_channel","mcp__execution-tools__report_blocked","mcp__execution-tools__commit_claim","mcp__execution-tools__save_memory","mcp__execution-tools__delete_memory","mcp__execution-tools__list_channels","mcp__execution-tools__read_artifact","mcp__execution-tools__fetch_artifact_file","mcp__execution-tools__list_artifacts","mcp__execution-tools__search_memories"],H=G("execution"),Ft=/^[\p{L}0-9._-]{1,256}$/u,Kt=/^[\p{L}0-9._-]{1,128}$/u,Je=256*1024,Ve=/^[a-z]+\/[a-z0-9.+-]+$/;async function Lt(t){let{listChannels:e}=await import("./channels-TYXSSI7D.js"),r=e(),{listSessions:n}=await import("./session-manager-PI3JEINK.js"),a=[...n("active"),...n("archived")],{getDefaultChatIdForChannel:c}=await import("./target-resolution-PSSBM4LX.js"),m=r.find(v=>v.name.toLowerCase().includes(t.toLowerCase()));if(!m)return null;let y=c(m,a)??"";return{channelId:m.id,chatId:y}}function l(t){return{content:[{type:"text",text:JSON.stringify(t)}]}}function oe(t){return Ft.test(t)?null:"Invalid artifact key. Use only letters, numbers, dot, underscore, or dash (1-256 chars)."}function fe(t){return Kt.test(t)?null:"Invalid stepId format. Use only letters, numbers, dot, underscore, or dash (1-128 chars)."}function Xe(t,e,r){return t!==e?t:X(r)}function Ye(t,e){let r=re(t);if(!r)return null;let n=te(r.templateId);return n?n.steps.find(m=>m.id===e)?.outputAs??null:null}var qt=t=>{if(!t)return!1;let e=L(t);return!!(e?.parentId&&e.templateId&&e.stepId)};function to(t,e,r){let n=t?de(t):void 0,a=r??(()=>{}),c=async()=>{if(!e)return{error:"artifact tools require a task context"};let i=L(e);if(!i)return{error:`task not found: ${e}`};let o=i.roleId??t;if(!o)return{error:"this template execution task has no role context"};let p=de(o);return p?{taskId:e,roleId:o,roleWorkspacePath:Ae(p.name)}:{error:`role not found: ${o}`}},m=async()=>{let i=await c();if("error"in i)return i;let o=L(i.taskId);return o.parentId?o.stepId?{executionId:o.parentId,stepId:o.stepId,roleId:i.roleId,roleWorkspacePath:i.roleWorkspacePath,taskId:i.taskId}:{error:"this task is not a TemplateExecution step (no step_id)"}:{error:"this task is not a TemplateExecution step (no execution context)"}},y=[...Be(t),D("list_channels","List all available channels. Use this to discover what channels can be used with send_to_channel.",{},async()=>{let{listChannels:i}=await import("./channels-TYXSSI7D.js"),o=i();return l({channels:o.map(p=>({id:p.id,name:p.name,enabled:p.enabled,type:p.config?.type??"unknown"}))})}),D("send_to_channel","Send a message to a connected channel by name. This role can only send to channels in its allowedChannels list (if configured).",{channelName:d.string().describe("The channel name, e.g., 'WeChat on iPad' or 'Client Mail'"),message:d.string().describe("The message content to send")},async i=>{if(n?.allowedChannels!==void 0){if(n.allowedChannels.length===0)return l({error:"This role is not allowed to send to any channels"});if(!n.allowedChannels.some(u=>u.toLowerCase()===i.channelName.toLowerCase()))return l({error:`Channel "${i.channelName}" is not in the allowed channels list for this role`})}let o=await Lt(i.channelName);if(!o)return l({error:`Channel "${i.channelName}" not found or has no chatId available`});let{getOutboundGateway:p}=await import("./outbound-gateway-VXODXSQR.js"),s=await p().send({channelId:o.channelId,chatId:o.chatId,content:i.message,messageType:"reply"});return l({success:s.success,channelName:i.channelName})}),D("write_artifact","Persist a small structured value (JSON <= 256KB) for downstream TemplateExecution steps to read. USE THIS for: extracted fields, status flags, URL lists, summaries, structured key-value data. Do NOT use for: files (audio, video, reports). For files use publish_artifact_file instead.",{key:d.string().describe("Artifact key \u2014 a unique identifier for this value within the template execution."),value:d.unknown().describe("The JSON value to persist (must be <= 256KB serialized)."),priority:d.number().int().min(0).max(1e3).optional().describe("Lower = higher priority for delivery packing. Use 10 for primary deliverables (audio/video), 50 for text/markdown, 100 for images. Omit to use server-side heuristic.")},async i=>{let o=await m();if("error"in o)return l({error:o.error});if(i.priority!==void 0&&(i.priority<0||i.priority>1e3||!Number.isInteger(i.priority)))return l({error:`Invalid priority: ${i.priority}. Must be an integer between 0 and 1000.`});let p=oe(i.key);if(p)return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"write_artifact",artifactKey:i.key,outcome:"denied",errorReason:p}),l({error:p});let x=Ye(o.executionId,o.stepId),s=re(o.executionId),h=s?te(s.templateId):null,u=h?h.steps.some(g=>g.id===o.stepId):!1,w=i.key,R,ie=h!=null&&h.steps.some(g=>!!g.outputAs);if(x===null&&u&&ie){let g=`Step "${o.stepId}" in template "${s.templateId}" has no outputAs declared. This template must be migrated before its steps can publish artifacts. Operator action required: run \`pnpm tsx scripts/migrate-all-templates-outputAs.ts --apply\` from the project root, or have the operator ask ChatManager in chat to upgrade the template.`;return H.warn({taskId:o.taskId,stepId:o.stepId,templateId:s.templateId},"write_artifact: step has no outputAs in migrated template"),I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"write_artifact",artifactKey:i.key,outcome:"denied",errorReason:g}),l({error:g})}x&&i.key!==x&&(w=x,R=`key '${i.key}' replaced with step.outputAs '${x}'`,H.warn({taskId:o.taskId,llmKey:i.key,outputAs:x},"write_artifact: server key override"));try{let g=JSON.stringify(i.value),E=Buffer.byteLength(g,"utf8");if(E>Je){let A=`Artifact JSON exceeds ${Je} bytes`;return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"write_artifact",artifactKey:i.key,sizeBytes:E,outcome:"denied",errorReason:A}),l({error:A})}let M=me();return W({id:M,sourceKind:"template_step",executionId:o.executionId,stepId:o.stepId,key:w,kind:"json",value:i.value,sizeBytes:E,createdAt:Date.now(),roleId:o.roleId,priority:i.priority}),O({toolName:"write_artifact",entityType:"artifact",verb:"create",entityId:M,fieldChanges:[{path:"_entity",op:"set",before:null,after:{artifactId:M,key:w,kind:"json",taskId:o.taskId}}],taskId:o.taskId,roleId:o.roleId}),I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"write_artifact",artifactKey:w,artifactId:M,sizeBytes:E,outcome:"success"}),l({success:!0,artifactId:M,sizeBytes:E,...R?{note:R}:{}})}catch(g){let E=g instanceof Error?g.message:String(g);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"write_artifact",artifactKey:i.key,outcome:"error",errorReason:E}),l({error:E})}}),D("read_artifact","Read a structured value previously written by an upstream step's write_artifact. Returns the JSON value. For files, use fetch_artifact_file instead.",{stepId:ee.describe("TemplateExecution step ID of the artifact's source step."),key:d.string().describe("Artifact key \u2014 a unique identifier for this value within the template execution.")},async i=>{let o=await m();if("error"in o)return l({error:o.error});let p=fe(i.stepId),x=oe(i.key),s=p??x;if(s)return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"read_artifact",artifactKey:i.key,outcome:"denied",errorReason:s}),l({error:s});let h=Q(o.executionId,i.stepId,i.key);if(!h){let u=`no artifact at ${i.stepId}/${i.key}`;return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"read_artifact",artifactKey:i.key,outcome:"error",errorReason:u}),l({error:u})}if(h.kind!=="json"){let u="artifact is a file; use fetch_artifact_file";return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"read_artifact",artifactKey:i.key,artifactId:h.id,sizeBytes:h.sizeBytes,outcome:"denied",errorReason:u}),l({error:u})}return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"read_artifact",artifactKey:i.key,artifactId:h.id,sizeBytes:h.sizeBytes,outcome:"success"}),l({value:h.value,sizeBytes:h.sizeBytes})}),D("publish_artifact_file","Publish a file from your workspace as a TemplateExecution artifact. The file is COPIED to the template execution's shared storage. USE THIS for: generated audio, video, reports, images, or large outputs. Do NOT use for: small structured values; use write_artifact instead. If you publish with cleanup=true, this step will not be retryable through publish; only choose cleanup=true when you do not need the source file again.",{key:d.string().describe("Artifact key \u2014 a unique identifier for this value within the template execution."),sourcePath:ue.describe("Source file path in the Role workspace to publish as a TemplateExecution artifact."),mime:d.string().optional().describe("MIME type of the file (e.g., 'image/png', 'audio/mp3'). Auto-detected if omitted."),cleanup:d.boolean().optional().describe("If true, delete the source file after publishing. Only use when the source file is no longer needed."),priority:d.number().int().min(0).max(1e3).optional().describe("Lower = higher priority for delivery packing. Use 10 for primary deliverables (audio/video), 50 for text/markdown, 100 for images. Omit to use server-side heuristic.")},async i=>{let o=await c();if("error"in o)return l({error:o.error});if(i.priority!==void 0&&(i.priority<0||i.priority>1e3||!Number.isInteger(i.priority)))return l({error:`Invalid priority: ${i.priority}. Must be an integer between 0 and 1000.`});let p=L(o.taskId);if(!!!(p.parentId&&p.templateId&&p.stepId)){if(i.mime&&!Ve.test(i.mime))return l({error:`Invalid MIME type: ${i.mime}`});try{Z(i.sourcePath,o.roleWorkspacePath,!0)}catch(_){return l({error:_ instanceof Error?_.message:String(_)})}let f=me(),S=null,K=!1;try{let _=xe({kind:"task",artifactId:f,sourcePath:i.sourcePath});S=_.blobPath;let C={id:f,sourceKind:"task_published",taskId:o.taskId,roleId:o.roleId,kind:"file",blobPath:S,mime:i.mime,originalFilename:X(i.sourcePath),sizeBytes:_.sizeBytes,createdAt:Date.now(),priority:i.priority};return W(C),K=!0,i.cleanup===!0&&se(i.sourcePath),O({toolName:"publish_artifact_file",entityType:"artifact",verb:"create",entityId:f,fieldChanges:[{path:"_entity",op:"set",before:null,after:{artifactId:f,kind:"file",filename:X(i.sourcePath),taskId:o.taskId,sourceKind:"task_published"}}],taskId:o.taskId,roleId:o.roleId}),H.info({taskId:o.taskId,roleId:o.roleId,artifactId:f,sizeBytes:_.sizeBytes},"publish_artifact_file task_published: success"),l({success:!0,artifactId:f,sizeBytes:_.sizeBytes})}catch(_){if(K)try{ne(f)}catch{}if(S)try{ae(S)}catch{}let C=_ instanceof Error?_.message:String(_);return H.warn({taskId:o.taskId,roleId:o.roleId,artifactId:f,err:_},"publish_artifact_file task_published: failed"),l({error:C})}}let s={executionId:p.parentId,stepId:p.stepId,roleId:o.roleId,roleWorkspacePath:o.roleWorkspacePath,taskId:o.taskId},h=oe(i.key);if(h)return I({timestamp:Date.now(),taskId:s.taskId,roleId:s.roleId,executionId:s.executionId,stepId:s.stepId,tool:"publish_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:h}),l({error:h});if(i.mime&&!Ve.test(i.mime)){let f=`Invalid MIME type: ${i.mime}`;return I({timestamp:Date.now(),taskId:s.taskId,roleId:s.roleId,executionId:s.executionId,stepId:s.stepId,tool:"publish_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:f}),l({error:f})}let u=Ye(s.executionId,s.stepId),w=re(s.executionId),R=w?te(w.templateId):null,ie=R?R.steps.some(f=>f.id===s.stepId):!1,g=i.key,E,M=R!=null&&R.steps.some(f=>!!f.outputAs);if(u===null&&ie&&M){let f=`Step "${s.stepId}" in template "${w.templateId}" has no outputAs declared. This template must be migrated before its steps can publish artifacts. Operator action required: run \`pnpm tsx scripts/migrate-all-templates-outputAs.ts --apply\` from the project root, or have the operator ask ChatManager in chat to upgrade the template.`;return H.warn({taskId:s.taskId,stepId:s.stepId,templateId:w.templateId},"publish_artifact_file: step has no outputAs in migrated template"),I({timestamp:Date.now(),taskId:s.taskId,roleId:s.roleId,executionId:s.executionId,stepId:s.stepId,tool:"publish_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:f}),l({error:f})}u&&i.key!==u&&(g=u,E=`key '${i.key}' replaced with step.outputAs '${u}'`,H.warn({taskId:s.taskId,llmKey:i.key,outputAs:u},"publish_artifact_file: server key override"));try{Z(i.sourcePath,s.roleWorkspacePath,!0)}catch(f){let S=f instanceof Error?f.message:String(f);return I({timestamp:Date.now(),taskId:s.taskId,roleId:s.roleId,executionId:s.executionId,stepId:s.stepId,tool:"publish_artifact_file",artifactKey:g,outcome:"denied",errorReason:S}),l({error:S})}let A=me(),U=null,Y=!1,B=null;try{let f=ge({executionId:s.executionId,artifactId:A,sourcePath:i.sourcePath});U=f.blobPath;let K=(R?.steps?.find?.(C=>C.id===s.stepId)??null)?.assertions??[];K.length>0&&await We(U,K);let _={id:A,sourceKind:"template_step",executionId:s.executionId,stepId:s.stepId,key:g,kind:"file",blobPath:U,mime:i.mime,originalFilename:X(i.sourcePath),sizeBytes:f.sizeBytes,createdAt:Date.now(),roleId:s.roleId,priority:i.priority};if(u&&M){let C=Q(s.executionId,s.stepId,u);if(!C)W(_),Y=!0,B=_;else if(C.kind==="file")B=be(s.executionId,s.stepId,u,C,{..._,key:Xe(i.key,u,i.sourcePath)}).childArtifact;else if(C.kind==="json"&&Ie(C.value))B=_e(s.executionId,s.stepId,u,{..._,key:Xe(i.key,u,i.sourcePath)}).childArtifact;else throw new Error(`Artifact key "${u}" already contains a non-collection JSON artifact`)}else W(_),Y=!0,B=_;return i.cleanup===!0&&se(i.sourcePath),O({toolName:"publish_artifact_file",entityType:"artifact",verb:"create",entityId:A,fieldChanges:[{path:"_entity",op:"set",before:null,after:{artifactId:A,key:B?.key??g,kind:"file",filename:X(i.sourcePath),taskId:s.taskId}}],taskId:s.taskId,roleId:s.roleId}),I({timestamp:Date.now(),taskId:s.taskId,roleId:s.roleId,executionId:s.executionId,stepId:s.stepId,tool:"publish_artifact_file",artifactKey:B?.key??g,artifactId:A,sizeBytes:f.sizeBytes,outcome:"success"}),l({success:!0,artifactId:A,sizeBytes:f.sizeBytes,...E?{note:E}:{}})}catch(f){if(Y)try{ne(A)}catch{}if(U&&(!B||Y))try{ae(U)}catch{}let S=f instanceof Error?f.message:String(f);if(I({timestamp:Date.now(),taskId:s.taskId,roleId:s.roleId,executionId:s.executionId,stepId:s.stepId,tool:"publish_artifact_file",artifactKey:g,artifactId:A,outcome:"error",errorReason:S}),f instanceof T||f instanceof F)try{let _=(z().prepare("SELECT COUNT(*) as n FROM step_logs WHERE task_id = ?").get(s.taskId)?.n??0)+1;Ee({id:`step-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,taskId:s.taskId,index:_,type:"validator_error",content:f.message,toolName:"publish_artifact_file",timestamp:Date.now()})}catch{}return l({error:S})}}),D("fetch_artifact_file","Copy an upstream step's published file into your current Role workspace. Use this when an earlier step published audio, video, reports, or other files you need to process.",{stepId:ee.describe("TemplateExecution step ID of the artifact's source step."),key:d.string().describe("Artifact key \u2014 a unique identifier for this value within the template execution."),destPath:ue.describe("Destination path in the Role workspace where the file will be copied.")},async i=>{let o=await m();if("error"in o)return l({error:o.error});let p=fe(i.stepId),x=oe(i.key),s=p??x;if(s)return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:s}),l({error:s});try{Z(i.destPath,o.roleWorkspacePath,!1)}catch(u){let w=u instanceof Error?u.message:String(u);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:w}),l({error:w})}let h=Q(o.executionId,i.stepId,i.key);if(!h){let u=`no artifact at ${i.stepId}/${i.key}`;return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:i.key,outcome:"error",errorReason:u}),l({error:u})}if(h.kind!=="file"||!h.blobPath){let u="artifact is not a file";return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:i.key,artifactId:h.id,outcome:"denied",errorReason:u}),l({error:u})}try{let u=ke({blobPath:h.blobPath,destPath:i.destPath});return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:i.key,artifactId:h.id,sizeBytes:u.sizeBytes,outcome:"success"}),l({success:!0,sizeBytes:u.sizeBytes,mime:h.mime,destPath:i.destPath})}catch(u){let w=u instanceof Error?u.message:String(u);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:i.key,artifactId:h.id,outcome:"error",errorReason:w}),l({error:w})}}),D("list_artifacts","Discover artifacts published by upstream steps in this template execution. Returns step_id, key, kind ('json' or 'file'), size, mime. Use this to learn what is available before calling read_artifact or fetch_artifact_file.",{stepId:ee.optional().describe("Filter to a specific TemplateExecution step (omit to list all artifacts in the execution).")},async i=>{let o=await m();if("error"in o)return l({error:o.error});let p=i.stepId?fe(i.stepId):null;if(p)return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"list_artifacts",outcome:"denied",errorReason:p}),l({error:p});let x=ye(o.executionId,i.stepId);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"list_artifacts",sizeBytes:x.length,outcome:"success"}),l({artifacts:x.map(s=>({id:s.id,stepId:s.stepId,key:s.key,kind:s.kind,sizeBytes:s.sizeBytes,mime:s.mime,createdAt:s.createdAt}))})}),D("report_blocked","Report that the task cannot proceed due to a missing prerequisite (e.g., missing credential, missing input, missing target). This sets the task status to 'blocked', stores the reason for the UI to display, and aborts the execution loop.",{reason:d.string().describe("Short reason, e.g. 'missing_credential', 'missing_target', 'missing_input'"),missingPrereqs:d.array(d.string()).optional().describe("Specific keys/IDs that are missing, e.g. ['MINIMAX_API_KEY']"),resumeHint:d.string().optional().describe("How the user can unblock, e.g. 'set MINIMAX_API_KEY in role env'")},async i=>{if(!e)return l({error:"report_blocked requires a task context (taskId not available)"});let o=L(e);if(!o)return l({error:`task not found: ${e}`});let p={reason:i.reason,missingPrereqs:i.missingPrereqs,resumeHint:i.resumeHint};return ve(e,{status:"blocked",blockReason:p,completedAt:Date.now()}),Se.emit({type:"task_status_change",taskId:e,oldStatus:o.status,newStatus:"blocked"}),O({toolName:"report_blocked",entityType:"task",verb:"update",entityId:e,fieldChanges:[{path:"status",op:"set",before:o.status,after:"blocked"},{path:"blockReason",op:"set",before:void 0,after:i.reason},{path:"completedAt",op:"set",before:void 0,after:Date.now()}],taskId:e,roleId:o.roleId}),a(),l({success:!0,blocked:!0,reason:i.reason})}),D("commit_claim","Declare structured claims about what this worker task just did so the audit engine can verify against effect receipts. Call this in the SAME task turn before reporting completion text. Mirror of the ChatManager tool \u2014 workers may also need to declare claims for actions taken inside template execution steps.",{claims:d.array(d.object({verb:d.string().min(1).describe("What was done: 'send', 'update', 'create', 'delete', 'cancel', 'enable', 'disable', 'bind', 'unbind', etc."),entityType:d.string().min(1).describe("What kind of thing was affected: 'channel_message', 'task_template', 'task', 'goal', 'role', 'delivery_rule', 'plugin', 'mcp_binding', 'config_field', etc."),expected:d.discriminatedUnion("kind",[d.object({kind:d.literal("outbound").describe("Used when verb='send' \u2014 declares a channel message was sent."),target:d.object({channelId:d.string().min(1).describe("Channel that received the message."),chatId:d.string().min(1).optional().describe("Specific chat within the channel; omit for any chat.")}).describe("Where the message went."),attachmentCount:d.number().int().min(0).optional().describe("How many attachments were sent. Verifier requires receipt.attachmentCount >= this."),textPresent:d.boolean().optional().describe("Whether the message body had non-empty text. Verifier requires receipt.textChars > 0 when true.")}),d.object({kind:d.literal("field_change").describe("Used for single-entity updates \u2014 declares a specific field on a specific entity changed."),entityId:d.string().min(1).describe("Identifier of the entity that was changed."),fieldPath:d.string().min(1).describe("Dotted path to the field that changed, e.g. 'deliverTo', 'cron', 'config.timeout'."),op:d.enum(["set","list_add","list_remove"]).describe("How the field changed: scalar set, list append, or list removal."),added:d.array(d.unknown()).min(1).optional().describe("Items appended when op='list_add'. Verifier accepts a superset (receipt may have appended more items)."),removed:d.array(d.unknown()).min(1).optional().describe("Items removed when op='list_remove'. Verifier accepts a superset."),after:d.unknown().optional().describe("New value when op='set'. Verifier requires deep-equal match.")}),d.object({kind:d.literal("batch").describe("Used for batch operations like cancel-many or delete-many."),entityType:d.string().min(1).describe("Restrict matching to this entity type."),entityIds:d.array(d.string()).min(1).optional().describe("Specific entity IDs affected. Verifier checks receipt.entityIds is a superset."),scope:d.object({filter:d.string().min(1).describe("Free-text description of the filter applied (e.g., 'status=running AND role_id=role-x'). Verifier ignores this; human-readable only."),expectedCount:d.number().int().min(0).describe("Minimum number of entities expected to have been affected. Verifier requires receipt.scope.matchedCount >= this.")}).optional().describe("Filter+count for scope-based batches when individual IDs aren't enumerated.")})]).describe("Structured expectation matched against effect_receipts. Pick the kind that fits the action."),note:d.string().optional().describe("Free-text human note kept in the audit log only. Verifier ignores this.")})).min(1).max(20).describe("One or more claims declaring exactly what just happened. Each claim is verified independently against receipts.")},async i=>{let o=we();if(!o)return l({error:"commit_claim requires an active trace context"});try{let p=Fe({traceId:o,taskId:e,claims:i.claims});return l({claimRowId:p.id,claimsCount:p.claims.length,declaredAt:p.declaredAt})}catch(p){let x=p instanceof Error?p.message:String(p);return l({error:x})}})],v=qt(e)?y.filter(i=>i.name!=="list_channels"&&i.name!=="send_to_channel"):y;return Bt({name:zt,version:"1.0.0",tools:v})}export{Be as a,Fe as b,nr as c,zt as d,Rr as e,Or as f,Nr as g,Dr as h,Ft as i,to as j};