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.
- package/README.md +101 -14
- package/package.json +3 -3
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-QzeGep9J.js → AIOps-CZzXRe1-.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Dfc5bx7S.js → ActionButton-_AZfbW1Q.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-tn-_ZG2E.js → Analytics-CzaUx_wv.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Deg3WAK8.js → AppLayout-xHEeeD-m.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-KU05t0a6.js → Artifacts-DmTbtudE.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CkSZf54T.js → Audit-Cn4ng4fo.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-i7ivfXF0.js → BackgroundAgents-DLUY1VD2.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-QcVUKtf0.js → Backup-B2v--wB6.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B3h5ZJ0g.js → BaseInput-Bgih7yAv.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-D7AVz0xi.js → Chat-1MiiA3yA.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-B0-euPW7.js → ChatBubbleRenderer-CPLynmbb.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-H0p0TMlD.js → Checkbox-DsyBa_NO.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B6HOmAY3.js → Codegen-B7WCFx9H.js} +1 -1
- package/src/assets/web-panel/assets/{Col-n_64Fog2.js → Col-D2x4GBGm.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CX0JGgj0.js → Community-Rnwg9nea.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-C4JWUZlx.js → Compact-BPczlrRh.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DKyTZakB.js → Compliance-Br1L_wGU.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-C0joBMci.js → Cowork-DlsWB_oS.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-D6VkYpxK.js → Cron-BWo_KGpG.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-7b6Uu8jc.js → Crosschain-Cug7N8ge.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C8YPKqzY.js → DID-CMbyOZJN.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DJsOiEry.js → Dashboard-C4dl_UaE.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CyStFY-4.js → Dropdown-CBrC7M-9.js} +1 -1
- package/src/assets/web-panel/assets/EmailListRenderer-DTq7tU4b.js +1 -0
- package/src/assets/web-panel/assets/{EvolutionSettings-DpxORusH.js → EvolutionSettings-DWP3csxS.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-5BYZdMG0.js → FamilyGuardDashboard-DZl7zuv_.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-s1kS0ekU.js → Federation-W-GSlVK5.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CmgoH9HV.js → FormItemContext-DMB7xYFV.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DSRWrvcL.js → GenericCardRenderer-DNv8GEoq.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Cz3EgnS1.js → Git-BZ0Bbzw6.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-De4atTe7.js → Governance-BNEdcOM5.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DoitBBxJ.js → Inference-C8249gIz.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CIdmJ1pH.js → KnowledgeGraph-ngzebU3e.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Coa_qNhU.js → Logs-CP15th-f.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CW3B3JDq.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-C6kbAQoM.js → Marketplace-CaH59OsY.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C2TZn8D-.js → McpTools-C07vnJev.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DYdEKDuB.js → Memory-CqAOkVAS.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-pKLeVviZ.js → MobileBridge-qp7mZimq.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-DKhbqvTw.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-IEoVRV29.js → Mtc-CRYCnWXv.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-Cov-yYTY.js → MtcAudit-Z08IrKws.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig--Jr7OCmp.js → Multisig-BWdatUnH.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-D2gXnYAA.js → NLProgramming-BKWiCZ_m.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-hk8pMyve.js → Notes-Bgpzk3sm.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-D26Nc7MU.js → NotificationSettings-DvtZEktR.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DmzHMEOa.js → OrderTableRenderer-CBcy0szc.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Cn-o6mHT.js → Organization-DRRL6vW1.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DP6xpDak.js → Overflow-COmfB8Ns.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-C9WAjG-I.js → P2P-BqMq_DSa.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-BX7iNvle.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-BFBN4-IL.js → Permissions-DzYkjmV_.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BEDvoAiz.js → PersonalDataHub-BBTcxBbN.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-Co2Ze_rR.js → Pipeline-eRkYFSbO.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BOTn1EId.js → Privacy-Ch7IFKBh.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CObyrZYm.js → ProjectInit-Ci8EcBYg.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DVTN31rd.js → ProjectSettings-B4lYHFbI.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DQSEaVjE.js → Projects-zkE5cCo_.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BRIKWIdQ.js → Providers-BKDVD3_e.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-3nxaEXxN.js → QrScannerModal-BromrHlf.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-iwZJEE9z.js → QuickAsk-CCgoY1gR.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-D2_EEbvc.js → Recommend-DCPZvpq7.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-S4w2mUfq.js → RemoteSession-DPnFP8HU.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-CstUvfTC.js → Reputation-l6r8ytAs.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DEGHFpxz.js → Row-ke9Mk1cx.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DGdZtJQl.js → RssFeed-DQOEzUEn.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DhfXi99U.js → Search-BqgA0aUz.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BbzISrgX.js → Security-FeGD_jqV.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CFjP2sQ3.js → Services-4kiYYAjZ.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CFn5wbvm.js → Skeleton-BbU8Xegs.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-fVbT8RcW.js → Skills-Dl2bUMUL.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-D6OtC0MT.js → Sla-xRGALeaZ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-D0kteBjU.js → SpeechSettings-DZfd4RDm.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BGEWCtPh.js → SyncSettings-BRtCV9Ga.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-B1xZUG4D.js → Tasks-DVRQklfG.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-COlorjqb.js → Templates-BbhE5jt5.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-yLkwfuo3.js → Tenant-qXPDNKbK.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CAmkq1wf.js → Terminal-CV48Ks7E.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CcKYq1Ue.js → TimelineRenderer-BLGfJIDr.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-9hIqn_LE.js → Tokens-7G9H6Hrt.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dsdkb74C.js → Trigger--F64N11F.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DC4GuE3C.js → Trust-Cq1r-D_y.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CSlh00wf.js → UkeySign-Dqyu4RVh.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-QEWLo3QY.js → VideoEditing-DuFmWH_B.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BkPNQgmg.js → Wallet-C3mg7EWP.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-7---jCBl.js → WebAuthn-CDK-Aj_X.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Dq6Yiu8E.js → WorkflowEditor--K7K-T1F.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CTYIMpWD.js → chat-BQDcS6VP.js} +1 -1
- package/src/assets/web-panel/assets/{colors-C8JtYlDN.js → colors-BKxJL2-T.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-spXpnsNC.js → compact-item-CFjQAMbY.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D04ewPuL.js → createContext-DbgCsdQd.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DlIv9Mbc.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DZblOKXx.js → hasIn-BhkaOBNv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdC0OsNh.js → index-3YutaXnp.js} +1 -1
- package/src/assets/web-panel/assets/{index-rVEqWa0_.js → index-3djsY75k.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSoyEHi2.js → index-3uR0ThJO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLUHbPl3.js → index-7BY44UEv.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7RA974g.js → index-B4LlAJqc.js} +1 -1
- package/src/assets/web-panel/assets/index-BC972Grv.js +1 -0
- package/src/assets/web-panel/assets/{index-BKfR2eSQ.js → index-BNjYPJNU.js} +1 -1
- package/src/assets/web-panel/assets/{index-KIoJ2eCK.js → index-BRqlCTrz.js} +1 -1
- package/src/assets/web-panel/assets/{index-rU6_An6N.js → index-BfGGsAU7.js} +1 -1
- package/src/assets/web-panel/assets/{index-B57W1RB6.js → index-BuWPqSGT.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLv-KSGc.js → index-C0DzhUOX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHOV24VR.js → index-CB4oHynY.js} +1 -1
- package/src/assets/web-panel/assets/{index-IFEbaISP.js → index-CE506mgj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cgztj1JO.js → index-CJoXgJ2N.js} +1 -1
- package/src/assets/web-panel/assets/{index-DruABY-g.js → index-COGy6wXn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLkua5sJ.js → index-CRtUDiXx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSO33_O2.js → index-CSUDlsIr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHtwoTKX.js → index-CUs7XpUO.js} +1 -1
- package/src/assets/web-panel/assets/index-CVifyQqL.js +1 -0
- package/src/assets/web-panel/assets/{index-DtSzmzFF.js → index-CoOu7sdP.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-cKXztT.js → index-D-Yh3-1z.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_65aY6c.js → index-D2Zb-Kd1.js} +1 -1
- package/src/assets/web-panel/assets/{index-749P1pkM.js → index-D9sVcw6v.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw-3CtK2.js → index-DEwHywz9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dssnz_1x.js → index-DFt48Z-x.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOuUUW2U.js → index-DJ2OiRvh.js} +3 -3
- package/src/assets/web-panel/assets/{index-D_Md0Jhp.js → index-DP1NrM9J.js} +1 -1
- package/src/assets/web-panel/assets/{index-BjMY3Y_L.js → index-DdcrixaQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-EM4_wLPi.js → index-De7daEnc.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz0gkRz_.js → index-Dhfa_BIl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZmBlh5P.js → index-DjmVlpap.js} +1 -1
- package/src/assets/web-panel/assets/{index-DwIEfKo7.js → index-DmYK9Tqt.js} +1 -1
- package/src/assets/web-panel/assets/{index-COvZnoIg.js → index-Dn2QSsuI.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bm0z1M6s.js → index-Du_SxxBY.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cfk4o9eI.js → index-DvWWFJHJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Mxj-qi1G.js → index-T9ka3Xj3.js} +1 -1
- package/src/assets/web-panel/assets/{index-CE3TYhl0.js → index-aPdVzagA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcjouIsi.js → index-bMX8BBLE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dcd-qZ68.js → index-sKfUUldY.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Dl0wiMxn.js → initDefaultProps-wrqabmui.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BFmZYrGO.js → motion-BoyB3ilP.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cjs64yWq.js → move-Cq31cSFE.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-NeQsnBuP.js → mtc-parser-BkxNt-8H.js} +1 -1
- package/src/assets/web-panel/assets/{omit-4Rs-rfs9.js → omit-DofGni53.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CUhx2rDY.js → pickAttrs-BnluLL16.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DbIM_OB2.js → placementArrow-C-yegJSP.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B_TGx9AN.js → responsiveObserve-CD3ziNhu.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C46cEP5t.js → slide-ToZO4gQ1.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DqeksICX.js → statusUtils-DFVmDmVl.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-2rrypo5u.js → styleChecker-De0Y8g1O.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-RRe1Edsg.js → useFlexGapSupport-wBKIYFKX.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CB0oxU1U.js → useFs-CP9nmUMJ.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-B98WdlUE.js → usePersonalDataHub-vFGrVDyp.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CY8AoD95.js → vnode-BcBIjvjH.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BnT-0MbP.js → zoom-DnXDAQxA.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +5 -5
- package/src/commands/agent-controlled-host.js +220 -0
- package/src/commands/agent.js +3 -1
- package/src/commands/automation.js +35 -8
- package/src/commands/hub.js +147 -0
- package/src/commands/project.js +162 -0
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/personal-data-hub-protocol.js +54 -8
- package/src/lib/audit-logger.js +16 -29
- package/src/lib/audit-sanitizer.js +279 -0
- package/src/lib/automation-center.js +14 -4
- package/src/lib/automation-engine.js +151 -39
- package/src/lib/eval/verify01-execution.js +9 -0
- package/src/lib/eval/verify01-host-capture.js +430 -0
- package/src/lib/knowledge-graph.js +27 -0
- package/src/lib/personal-data-hub-wiring.js +44 -1
- package/src/lib/scheduler-kernel/automation-adapter.js +15 -3
- package/src/lib/scheduler-kernel/automation-event-adapter.js +15 -3
- package/src/assets/web-panel/assets/EmailListRenderer-COrIx2Rg.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-CeT_RocE.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-D4bWcHA_.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-DxZb0Ux8.js +0 -7
- package/src/assets/web-panel/assets/devWarning-3-s4adfp.js +0 -1
- package/src/assets/web-panel/assets/index-ZMf_BGlO.js +0 -1
- 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) => ({
|
|
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
|
|
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
|
|
471
|
-
status
|
|
472
|
-
|
|
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, {
|
|
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, {
|
|
1268
|
+
return _resolveExistingExecution(concurrent, {
|
|
1269
|
+
flowId,
|
|
1270
|
+
triggerType,
|
|
1271
|
+
testMode,
|
|
1272
|
+
});
|
|
1214
1273
|
}
|
|
1215
1274
|
|
|
1216
1275
|
const stepsLog = [];
|
|
1217
|
-
let finalStatus =
|
|
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:
|
|
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(
|
|
1393
|
-
|
|
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
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
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
|
|
1556
|
+
`SELECT * FROM auto_executions${where} ORDER BY started_at DESC LIMIT ?`,
|
|
1465
1557
|
)
|
|
1466
|
-
.all(
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
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
|
|
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.
|
|
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.
|
|
1490
|
-
|
|
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.
|
|
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",
|