chainlesschain 0.166.88 → 0.166.90

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 (178) hide show
  1. package/README.md +101 -14
  2. package/package.json +3 -3
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-QzeGep9J.js → AIOps-CZzXRe1-.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-Dfc5bx7S.js → ActionButton-_AZfbW1Q.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-tn-_ZG2E.js → Analytics-CzaUx_wv.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-Deg3WAK8.js → AppLayout-xHEeeD-m.js} +4 -4
  9. package/src/assets/web-panel/assets/{Artifacts-KU05t0a6.js → Artifacts-DmTbtudE.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-CkSZf54T.js → Audit-Cn4ng4fo.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-i7ivfXF0.js → BackgroundAgents-DLUY1VD2.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-QcVUKtf0.js → Backup-B2v--wB6.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-B3h5ZJ0g.js → BaseInput-Bgih7yAv.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-D7AVz0xi.js → Chat-1MiiA3yA.js} +5 -5
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-B0-euPW7.js → ChatBubbleRenderer-CPLynmbb.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-H0p0TMlD.js → Checkbox-DsyBa_NO.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-B6HOmAY3.js → Codegen-B7WCFx9H.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-n_64Fog2.js → Col-D2x4GBGm.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-CX0JGgj0.js → Community-Rnwg9nea.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-C4JWUZlx.js → Compact-BPczlrRh.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-DKyTZakB.js → Compliance-Br1L_wGU.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-C0joBMci.js → Cowork-DlsWB_oS.js} +3 -3
  23. package/src/assets/web-panel/assets/{Cron-D6VkYpxK.js → Cron-BWo_KGpG.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-7b6Uu8jc.js → Crosschain-Cug7N8ge.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-C8YPKqzY.js → DID-CMbyOZJN.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-DJsOiEry.js → Dashboard-C4dl_UaE.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-CyStFY-4.js → Dropdown-CBrC7M-9.js} +1 -1
  28. package/src/assets/web-panel/assets/EmailListRenderer-DTq7tU4b.js +1 -0
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DpxORusH.js → EvolutionSettings-DWP3csxS.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-5BYZdMG0.js → FamilyGuardDashboard-DZl7zuv_.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-s1kS0ekU.js → Federation-W-GSlVK5.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-CmgoH9HV.js → FormItemContext-DMB7xYFV.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DSRWrvcL.js → GenericCardRenderer-DNv8GEoq.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-Cz3EgnS1.js → Git-BZ0Bbzw6.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-De4atTe7.js → Governance-BNEdcOM5.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DoitBBxJ.js → Inference-C8249gIz.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-CIdmJ1pH.js → KnowledgeGraph-ngzebU3e.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-Coa_qNhU.js → Logs-CP15th-f.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-CW3B3JDq.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-C6kbAQoM.js → Marketplace-CaH59OsY.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-C2TZn8D-.js → McpTools-C07vnJev.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-DYdEKDuB.js → Memory-CqAOkVAS.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-pKLeVviZ.js → MobileBridge-qp7mZimq.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-DKhbqvTw.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-IEoVRV29.js → Mtc-CRYCnWXv.js} +4 -4
  46. package/src/assets/web-panel/assets/{MtcAudit-Cov-yYTY.js → MtcAudit-Z08IrKws.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig--Jr7OCmp.js → Multisig-BWdatUnH.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-D2gXnYAA.js → NLProgramming-BKWiCZ_m.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-hk8pMyve.js → Notes-Bgpzk3sm.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-D26Nc7MU.js → NotificationSettings-DvtZEktR.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-DmzHMEOa.js → OrderTableRenderer-CBcy0szc.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-Cn-o6mHT.js → Organization-DRRL6vW1.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-DP6xpDak.js → Overflow-COmfB8Ns.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-C9WAjG-I.js → P2P-BqMq_DSa.js} +2 -2
  55. package/src/assets/web-panel/assets/PdhVaultBrowser-BX7iNvle.js +7 -0
  56. package/src/assets/web-panel/assets/{Permissions-BFBN4-IL.js → Permissions-DzYkjmV_.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-BEDvoAiz.js → PersonalDataHub-BBTcxBbN.js} +3 -3
  58. package/src/assets/web-panel/assets/{Pipeline-Co2Ze_rR.js → Pipeline-eRkYFSbO.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-BOTn1EId.js → Privacy-Ch7IFKBh.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CObyrZYm.js → ProjectInit-Ci8EcBYg.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-DVTN31rd.js → ProjectSettings-B4lYHFbI.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-DQSEaVjE.js → Projects-zkE5cCo_.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-BRIKWIdQ.js → Providers-BKDVD3_e.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-3nxaEXxN.js → QrScannerModal-BromrHlf.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-iwZJEE9z.js → QuickAsk-CCgoY1gR.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-D2_EEbvc.js → Recommend-DCPZvpq7.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-S4w2mUfq.js → RemoteSession-DPnFP8HU.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-CstUvfTC.js → Reputation-l6r8ytAs.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-DEGHFpxz.js → Row-ke9Mk1cx.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-DGdZtJQl.js → RssFeed-DQOEzUEn.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-DhfXi99U.js → Search-BqgA0aUz.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-BbzISrgX.js → Security-FeGD_jqV.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-CFjP2sQ3.js → Services-4kiYYAjZ.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CFn5wbvm.js → Skeleton-BbU8Xegs.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-fVbT8RcW.js → Skills-Dl2bUMUL.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-D6OtC0MT.js → Sla-xRGALeaZ.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-D0kteBjU.js → SpeechSettings-DZfd4RDm.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BGEWCtPh.js → SyncSettings-BRtCV9Ga.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-B1xZUG4D.js → Tasks-DVRQklfG.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-COlorjqb.js → Templates-BbhE5jt5.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-yLkwfuo3.js → Tenant-qXPDNKbK.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-CAmkq1wf.js → Terminal-CV48Ks7E.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-CcKYq1Ue.js → TimelineRenderer-BLGfJIDr.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-9hIqn_LE.js → Tokens-7G9H6Hrt.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-Dsdkb74C.js → Trigger--F64N11F.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-DC4GuE3C.js → Trust-Cq1r-D_y.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CSlh00wf.js → UkeySign-Dqyu4RVh.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-QEWLo3QY.js → VideoEditing-DuFmWH_B.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-BkPNQgmg.js → Wallet-C3mg7EWP.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-7---jCBl.js → WebAuthn-CDK-Aj_X.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-Dq6Yiu8E.js → WorkflowEditor--K7K-T1F.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CTYIMpWD.js → chat-BQDcS6VP.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-C8JtYlDN.js → colors-BKxJL2-T.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-spXpnsNC.js → compact-item-CFjQAMbY.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-D04ewPuL.js → createContext-DbgCsdQd.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-DlIv9Mbc.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-DZblOKXx.js → hasIn-BhkaOBNv.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DdC0OsNh.js → index-3YutaXnp.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-rVEqWa0_.js → index-3djsY75k.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DSoyEHi2.js → index-3uR0ThJO.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DLUHbPl3.js → index-7BY44UEv.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-B7RA974g.js → index-B4LlAJqc.js} +1 -1
  103. package/src/assets/web-panel/assets/index-BC972Grv.js +1 -0
  104. package/src/assets/web-panel/assets/{index-BKfR2eSQ.js → index-BNjYPJNU.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-KIoJ2eCK.js → index-BRqlCTrz.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-rU6_An6N.js → index-BfGGsAU7.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-B57W1RB6.js → index-BuWPqSGT.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BLv-KSGc.js → index-C0DzhUOX.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DHOV24VR.js → index-CB4oHynY.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-IFEbaISP.js → index-CE506mgj.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Cgztj1JO.js → index-CJoXgJ2N.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DruABY-g.js → index-COGy6wXn.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CLkua5sJ.js → index-CRtUDiXx.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BSO33_O2.js → index-CSUDlsIr.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CHtwoTKX.js → index-CUs7XpUO.js} +1 -1
  116. package/src/assets/web-panel/assets/index-CVifyQqL.js +1 -0
  117. package/src/assets/web-panel/assets/{index-DtSzmzFF.js → index-CoOu7sdP.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B-cKXztT.js → index-D-Yh3-1z.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B_65aY6c.js → index-D2Zb-Kd1.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-749P1pkM.js → index-D9sVcw6v.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Bw-3CtK2.js → index-DEwHywz9.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Dssnz_1x.js → index-DFt48Z-x.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BOuUUW2U.js → index-DJ2OiRvh.js} +3 -3
  124. package/src/assets/web-panel/assets/{index-D_Md0Jhp.js → index-DP1NrM9J.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BjMY3Y_L.js → index-DdcrixaQ.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-EM4_wLPi.js → index-De7daEnc.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Cz0gkRz_.js → index-Dhfa_BIl.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CZmBlh5P.js → index-DjmVlpap.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DwIEfKo7.js → index-DmYK9Tqt.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-COvZnoIg.js → index-Dn2QSsuI.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Bm0z1M6s.js → index-Du_SxxBY.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Cfk4o9eI.js → index-DvWWFJHJ.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Mxj-qi1G.js → index-T9ka3Xj3.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CE3TYhl0.js → index-aPdVzagA.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DcjouIsi.js → index-bMX8BBLE.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-Dcd-qZ68.js → index-sKfUUldY.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-Dl0wiMxn.js → initDefaultProps-wrqabmui.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BFmZYrGO.js → motion-BoyB3ilP.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-Cjs64yWq.js → move-Cq31cSFE.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-NeQsnBuP.js → mtc-parser-BkxNt-8H.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-4Rs-rfs9.js → omit-DofGni53.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CUhx2rDY.js → pickAttrs-BnluLL16.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DbIM_OB2.js → placementArrow-C-yegJSP.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-B_TGx9AN.js → responsiveObserve-CD3ziNhu.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-C46cEP5t.js → slide-ToZO4gQ1.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-DqeksICX.js → statusUtils-DFVmDmVl.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-2rrypo5u.js → styleChecker-De0Y8g1O.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-RRe1Edsg.js → useFlexGapSupport-wBKIYFKX.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-CB0oxU1U.js → useFs-CP9nmUMJ.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-B98WdlUE.js → usePersonalDataHub-vFGrVDyp.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-CY8AoD95.js → vnode-BcBIjvjH.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-BnT-0MbP.js → zoom-DnXDAQxA.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +5 -5
  155. package/src/commands/agent-controlled-host.js +220 -0
  156. package/src/commands/agent.js +3 -1
  157. package/src/commands/automation.js +35 -8
  158. package/src/commands/hub.js +147 -0
  159. package/src/commands/project.js +162 -0
  160. package/src/data/changelog.json +26 -0
  161. package/src/gateways/ws/personal-data-hub-protocol.js +54 -8
  162. package/src/lib/audit-logger.js +16 -29
  163. package/src/lib/audit-sanitizer.js +279 -0
  164. package/src/lib/automation-center.js +14 -4
  165. package/src/lib/automation-engine.js +151 -39
  166. package/src/lib/eval/verify01-execution.js +9 -0
  167. package/src/lib/eval/verify01-host-capture.js +430 -0
  168. package/src/lib/knowledge-graph.js +27 -0
  169. package/src/lib/personal-data-hub-wiring.js +44 -1
  170. package/src/lib/scheduler-kernel/automation-adapter.js +15 -3
  171. package/src/lib/scheduler-kernel/automation-event-adapter.js +15 -3
  172. package/src/assets/web-panel/assets/EmailListRenderer-COrIx2Rg.js +0 -1
  173. package/src/assets/web-panel/assets/MarkdownRenderer-CeT_RocE.js +0 -1
  174. package/src/assets/web-panel/assets/MobileProjects-D4bWcHA_.js +0 -1
  175. package/src/assets/web-panel/assets/PdhVaultBrowser-DxZb0Ux8.js +0 -7
  176. package/src/assets/web-panel/assets/devWarning-3-s4adfp.js +0 -1
  177. package/src/assets/web-panel/assets/index-ZMf_BGlO.js +0 -1
  178. package/src/assets/web-panel/assets/index-jvp8bJBF.js +0 -1
@@ -27,6 +27,16 @@ export const EXECUTION_STATUS = Object.freeze({
27
27
  SUCCESS: "success",
28
28
  FAILED: "failed",
29
29
  CANCELLED: "cancelled",
30
+ SIMULATED: "simulated",
31
+ UNSUPPORTED: "unsupported",
32
+ UNVERIFIED: "legacy-unverified",
33
+ });
34
+
35
+ export const AUTOMATION_EXECUTION_CAPABILITY = Object.freeze({
36
+ live: false,
37
+ simulation: true,
38
+ reason:
39
+ "Connector catalog only; live automation execution is not implemented",
30
40
  });
31
41
 
32
42
  export const TRIGGER_TYPE = Object.freeze({
@@ -125,12 +135,22 @@ export const CONNECTOR_CATALOG = Object.freeze([
125
135
  const CONNECTOR_INDEX = new Map(CONNECTOR_CATALOG.map((c) => [c.id, c]));
126
136
 
127
137
  export function listConnectors() {
128
- return CONNECTOR_CATALOG.map((c) => ({ ...c, actions: [...c.actions] }));
138
+ return CONNECTOR_CATALOG.map((c) => ({
139
+ ...c,
140
+ actions: [...c.actions],
141
+ executionCapability: AUTOMATION_EXECUTION_CAPABILITY,
142
+ }));
129
143
  }
130
144
 
131
145
  export function getConnector(id) {
132
146
  const c = CONNECTOR_INDEX.get(id);
133
- return c ? { ...c, actions: [...c.actions] } : null;
147
+ return c
148
+ ? {
149
+ ...c,
150
+ actions: [...c.actions],
151
+ executionCapability: AUTOMATION_EXECUTION_CAPABILITY,
152
+ }
153
+ : null;
134
154
  }
135
155
 
136
156
  /* ── Built-in flow templates ───────────────────────────────── */
@@ -462,14 +482,42 @@ function _rowToFlow(row) {
462
482
 
463
483
  function _rowToExecution(row) {
464
484
  if (!row) return null;
485
+ const outputData = _parseJSON(row.output_data, null);
486
+ const stepsLog = _parseJSON(row.steps_log, []);
487
+ const simulated =
488
+ row.test_mode === 1 ||
489
+ outputData?.simulated === true ||
490
+ stepsLog.some((step) => step.output?.simulated === true);
491
+ const adjudication = _parseJSON(row.error, null);
492
+ const confirmedApplied =
493
+ adjudication?.authority === "scheduler-adjudication" &&
494
+ adjudication?.decision === "confirmed_applied";
495
+ const legacyControlOnly =
496
+ row.status === EXECUTION_STATUS.SUCCESS &&
497
+ !confirmedApplied &&
498
+ stepsLog.every((step) => step.nodeType && step.nodeType !== "action") &&
499
+ (outputData == null ||
500
+ outputData.parallel === true ||
501
+ outputData.loop === true ||
502
+ (typeof outputData.branch === "string" && "expression" in outputData));
503
+ // Old releases persisted simulator results as success. Do not recover those
504
+ // rows as evidence that an external action was applied.
505
+ const status =
506
+ row.status === EXECUTION_STATUS.SUCCESS && simulated
507
+ ? EXECUTION_STATUS.SIMULATED
508
+ : legacyControlOnly
509
+ ? EXECUTION_STATUS.UNVERIFIED
510
+ : row.status;
465
511
  return {
466
512
  id: row.id,
467
513
  flowId: row.flow_id,
468
514
  triggerType: row.trigger_type,
469
515
  inputData: _parseJSON(row.input_data, null),
470
- outputData: _parseJSON(row.output_data, null),
471
- status: row.status,
472
- stepsLog: _parseJSON(row.steps_log, []),
516
+ outputData,
517
+ status,
518
+ ...(status !== row.status ? { recordedStatus: row.status } : {}),
519
+ mode: simulated ? "simulation" : legacyControlOnly ? "unverified" : "live",
520
+ stepsLog,
473
521
  durationMs: row.duration_ms || 0,
474
522
  error: row.error || null,
475
523
  testMode: row.test_mode === 1,
@@ -1161,13 +1209,20 @@ export function executeFlow(db, flowId, options = {}) {
1161
1209
  executionAuthority = null,
1162
1210
  assertRuntimeBoundary = null,
1163
1211
  } = options;
1212
+ if (typeof testMode !== "boolean") {
1213
+ throw new TypeError("testMode must be a boolean");
1214
+ }
1164
1215
  const execId =
1165
1216
  executionId === undefined
1166
1217
  ? _genId("exec")
1167
1218
  : _normalizeExecutionId(executionId);
1168
1219
  const existing = getExecution(db, execId);
1169
1220
  if (existing) {
1170
- return _resolveExistingExecution(existing, { flowId, triggerType });
1221
+ return _resolveExistingExecution(existing, {
1222
+ flowId,
1223
+ triggerType,
1224
+ testMode,
1225
+ });
1171
1226
  }
1172
1227
  // Validate every declared action boundary before creating an execution row
1173
1228
  // or invoking the first effect. The per-node assertion below remains as the
@@ -1210,20 +1265,34 @@ export function executeFlow(db, flowId, options = {}) {
1210
1265
  // the winner from durable evidence instead of running the flow twice.
1211
1266
  const concurrent = getExecution(db, execId);
1212
1267
  if (!concurrent) throw error;
1213
- return _resolveExistingExecution(concurrent, { flowId, triggerType });
1268
+ return _resolveExistingExecution(concurrent, {
1269
+ flowId,
1270
+ triggerType,
1271
+ testMode,
1272
+ });
1214
1273
  }
1215
1274
 
1216
1275
  const stepsLog = [];
1217
- let finalStatus = EXECUTION_STATUS.SUCCESS;
1276
+ let finalStatus = testMode
1277
+ ? EXECUTION_STATUS.SIMULATED
1278
+ : EXECUTION_STATUS.UNSUPPORTED;
1218
1279
  let finalError = null;
1219
1280
  let outputData = null;
1220
1281
 
1221
1282
  try {
1222
1283
  const ordered = _topoOrder(flow.nodes, flow.edges);
1284
+ if (!testMode) {
1285
+ finalError = AUTOMATION_EXECUTION_CAPABILITY.reason;
1286
+ outputData = {
1287
+ executed: false,
1288
+ code: "AUTOMATION_EXECUTION_UNSUPPORTED",
1289
+ capability: AUTOMATION_EXECUTION_CAPABILITY,
1290
+ };
1291
+ }
1223
1292
  const stepInputs = new Map();
1224
1293
  stepInputs.set("__initial__", inputData);
1225
1294
 
1226
- for (const node of ordered) {
1295
+ for (const node of testMode ? ordered : []) {
1227
1296
  const stepStart = Date.now();
1228
1297
  const parentEdges = flow.edges.filter((e) => e.to === node.id);
1229
1298
  let merged;
@@ -1251,7 +1320,7 @@ export function executeFlow(db, flowId, options = {}) {
1251
1320
  nodeType: node.type || "action",
1252
1321
  connector: node.connector || null,
1253
1322
  action: node.action || null,
1254
- status: "success",
1323
+ status: EXECUTION_STATUS.SIMULATED,
1255
1324
  durationMs: Date.now() - stepStart,
1256
1325
  output,
1257
1326
  });
@@ -1389,8 +1458,15 @@ function _normalizeExecutionId(value) {
1389
1458
  return value;
1390
1459
  }
1391
1460
 
1392
- function _resolveExistingExecution(existing, { flowId, triggerType }) {
1393
- if (existing.flowId !== flowId || existing.triggerType !== triggerType) {
1461
+ function _resolveExistingExecution(
1462
+ existing,
1463
+ { flowId, triggerType, testMode },
1464
+ ) {
1465
+ if (
1466
+ existing.flowId !== flowId ||
1467
+ existing.triggerType !== triggerType ||
1468
+ existing.testMode !== testMode
1469
+ ) {
1394
1470
  const error = new Error(
1395
1471
  `Execution id is already bound to another automation request: ${existing.id}`,
1396
1472
  );
@@ -1407,7 +1483,7 @@ function _resolveExistingExecution(existing, { flowId, triggerType }) {
1407
1483
  return existing;
1408
1484
  }
1409
1485
 
1410
- export function fireTrigger(db, triggerId, inputData = {}) {
1486
+ export function fireTrigger(db, triggerId, inputData = {}, options = {}) {
1411
1487
  const trig = getTrigger(db, triggerId);
1412
1488
  if (!trig) throw new Error(`Trigger not found: ${triggerId}`);
1413
1489
  if (!trig.enabled) throw new Error(`Trigger disabled: ${triggerId}`);
@@ -1434,6 +1510,7 @@ export function fireTrigger(db, triggerId, inputData = {}) {
1434
1510
  return executeFlow(db, trig.flowId, {
1435
1511
  inputData,
1436
1512
  triggerType: trig.type,
1513
+ testMode: options.testMode ?? false,
1437
1514
  });
1438
1515
  }
1439
1516
 
@@ -1445,31 +1522,64 @@ export function getExecution(db, execId) {
1445
1522
 
1446
1523
  export function listExecutions(db, filters = {}) {
1447
1524
  const { flowId, status, limit = 50 } = filters;
1448
- let rows;
1449
- if (flowId && status) {
1450
- rows = db
1451
- .prepare(
1452
- `SELECT * FROM auto_executions WHERE flow_id = ? AND status = ? ORDER BY started_at DESC LIMIT ?`,
1453
- )
1454
- .all(flowId, status, limit);
1455
- } else if (flowId) {
1456
- rows = db
1457
- .prepare(
1458
- `SELECT * FROM auto_executions WHERE flow_id = ? ORDER BY started_at DESC LIMIT ?`,
1459
- )
1460
- .all(flowId, limit);
1461
- } else if (status) {
1462
- rows = db
1525
+ if (!Number.isSafeInteger(limit) || limit < 0) {
1526
+ throw new RangeError(
1527
+ "Execution history limit must be a non-negative integer",
1528
+ );
1529
+ }
1530
+ if (limit === 0) return [];
1531
+
1532
+ const clauses = [];
1533
+ const params = [];
1534
+ if (flowId) {
1535
+ clauses.push("flow_id = ?");
1536
+ params.push(flowId);
1537
+ }
1538
+ const needsLegacyProjection = [
1539
+ EXECUTION_STATUS.SUCCESS,
1540
+ EXECUTION_STATUS.SIMULATED,
1541
+ EXECUTION_STATUS.UNVERIFIED,
1542
+ ].includes(status);
1543
+ if (status) {
1544
+ if (needsLegacyProjection && status !== EXECUTION_STATUS.SUCCESS) {
1545
+ clauses.push("status IN (?, ?)");
1546
+ params.push(status, EXECUTION_STATUS.SUCCESS);
1547
+ } else {
1548
+ clauses.push("status = ?");
1549
+ params.push(status);
1550
+ }
1551
+ }
1552
+ const where = clauses.length > 0 ? ` WHERE ${clauses.join(" AND ")}` : "";
1553
+ if (!needsLegacyProjection) {
1554
+ return db
1463
1555
  .prepare(
1464
- `SELECT * FROM auto_executions WHERE status = ? ORDER BY started_at DESC LIMIT ?`,
1556
+ `SELECT * FROM auto_executions${where} ORDER BY started_at DESC LIMIT ?`,
1465
1557
  )
1466
- .all(status, limit);
1467
- } else {
1468
- rows = db
1469
- .prepare(`SELECT * FROM auto_executions ORDER BY started_at DESC LIMIT ?`)
1470
- .all(limit);
1558
+ .all(...params, limit)
1559
+ .map(_rowToExecution);
1560
+ }
1561
+
1562
+ // A stored success can project to simulated/unverified. Scan only candidate
1563
+ // statuses in bounded pages and stop once the caller's normalized limit is
1564
+ // met, instead of loading all execution payloads into memory. The id tie
1565
+ // breaker keeps page boundaries stable when timestamps are identical.
1566
+ const pageSize = 128;
1567
+ const statement = db.prepare(
1568
+ `SELECT * FROM auto_executions${where} ORDER BY started_at DESC, id DESC LIMIT ? OFFSET ?`,
1569
+ );
1570
+ const executions = [];
1571
+ let offset = 0;
1572
+ while (executions.length < limit) {
1573
+ const rows = statement.all(...params, pageSize, offset);
1574
+ for (const row of rows) {
1575
+ const execution = _rowToExecution(row);
1576
+ if (execution.status === status) executions.push(execution);
1577
+ if (executions.length === limit) return executions;
1578
+ }
1579
+ if (rows.length < pageSize) break;
1580
+ offset += rows.length;
1471
1581
  }
1472
- return rows.map(_rowToExecution);
1582
+ return executions;
1473
1583
  }
1474
1584
 
1475
1585
  /* ── Stats ─────────────────────────────────────────────────── */
@@ -1477,7 +1587,7 @@ export function listExecutions(db, filters = {}) {
1477
1587
  export function getStats(db) {
1478
1588
  const flowsByStatus = {};
1479
1589
  for (const status of Object.values(FLOW_STATUS)) flowsByStatus[status] = 0;
1480
- for (const row of db.data?.get("auto_flows") || []) {
1590
+ for (const row of db.prepare("SELECT * FROM auto_flows").all()) {
1481
1591
  flowsByStatus[row.status] = (flowsByStatus[row.status] || 0) + 1;
1482
1592
  }
1483
1593
 
@@ -1486,15 +1596,16 @@ export function getStats(db) {
1486
1596
  execByStatus[status] = 0;
1487
1597
  let totalDuration = 0;
1488
1598
  let execCount = 0;
1489
- for (const row of db.data?.get("auto_executions") || []) {
1490
- execByStatus[row.status] = (execByStatus[row.status] || 0) + 1;
1599
+ for (const row of db.prepare("SELECT * FROM auto_executions").all()) {
1600
+ const { status } = _rowToExecution(row);
1601
+ execByStatus[status] = (execByStatus[status] || 0) + 1;
1491
1602
  totalDuration += row.duration_ms || 0;
1492
1603
  execCount++;
1493
1604
  }
1494
1605
 
1495
1606
  const triggersByType = {};
1496
1607
  for (const type of Object.values(TRIGGER_TYPE)) triggersByType[type] = 0;
1497
- for (const row of db.data?.get("auto_triggers") || []) {
1608
+ for (const row of db.prepare("SELECT * FROM auto_triggers").all()) {
1498
1609
  triggersByType[row.type] = (triggersByType[row.type] || 0) + 1;
1499
1610
  }
1500
1611
 
@@ -1528,6 +1639,7 @@ export function getStats(db) {
1528
1639
 
1529
1640
  export function getConfig() {
1530
1641
  return {
1642
+ executionCapability: AUTOMATION_EXECUTION_CAPABILITY,
1531
1643
  connectors: CONNECTOR_CATALOG.length,
1532
1644
  templates: FLOW_TEMPLATES.length,
1533
1645
  flowStatuses: Object.values(FLOW_STATUS),
@@ -19,6 +19,15 @@ export const VERIFY01_SUITES = [
19
19
  const MAX_SNAPSHOT_BYTES = 512 * 1024 * 1024;
20
20
  const MAX_DIFF_BYTES = 32 * 1024 * 1024;
21
21
 
22
+ // Host drivers use the same checkout, complete scan, dependency boundary and
23
+ // pinned evaluator processes as the CLI executor; no second diff contract.
24
+ export {
25
+ materializeCheckout as materializeVerify01Checkout,
26
+ snapshot as snapshotVerify01Workspace,
27
+ diff as diffVerify01Workspace,
28
+ reviewedProcess as runVerify01ReviewedProcess,
29
+ };
30
+
22
31
  function git(directory, args, options = {}) {
23
32
  return executionBroker.execFileSync("git", ["-C", directory, ...args], {
24
33
  encoding: "utf8",