chainlesschain 0.166.89 → 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 (171) hide show
  1. package/README.md +87 -3
  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-C8AkN9R5.js → AIOps-CZzXRe1-.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-BrAzSQor.js → ActionButton-_AZfbW1Q.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-Cu56X8Oh.js → Analytics-CzaUx_wv.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-BP1Riofl.js → AppLayout-xHEeeD-m.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-CIW-nNAz.js → Artifacts-DmTbtudE.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-CJtDabk-.js → Audit-Cn4ng4fo.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-DYIHeQ_P.js → BackgroundAgents-DLUY1VD2.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-B4CsFzj7.js → Backup-B2v--wB6.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-3eoJ5kfb.js → BaseInput-Bgih7yAv.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-BBhX2L_E.js → Chat-1MiiA3yA.js} +4 -4
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-CPLynmbb.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-5UvmwHVk.js → Checkbox-DsyBa_NO.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-BFy8zsBN.js → Codegen-B7WCFx9H.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-4M6bKRRO.js → Col-D2x4GBGm.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-D6LC0j7_.js → Community-Rnwg9nea.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-Dd48xMcv.js → Compact-BPczlrRh.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-Ba85ggmy.js → Compliance-Br1L_wGU.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-D1BXlkuK.js → Cowork-DlsWB_oS.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-Ca2Uy7Ia.js → Cron-BWo_KGpG.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-C2bDRXZg.js → Crosschain-Cug7N8ge.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-DySZKAJf.js → DID-CMbyOZJN.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-DDpYf-TT.js → Dashboard-C4dl_UaE.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-DGjROfPv.js → Dropdown-CBrC7M-9.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-DxX9QYiB.js → EmailListRenderer-DTq7tU4b.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-TBCZyrSJ.js → EvolutionSettings-DWP3csxS.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BeqwTXBa.js → FamilyGuardDashboard-DZl7zuv_.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-CiCpKJQ1.js → Federation-W-GSlVK5.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-CdTmbLkU.js → FormItemContext-DMB7xYFV.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-BwbkEY-5.js → GenericCardRenderer-DNv8GEoq.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-VnAga2vv.js → Git-BZ0Bbzw6.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-i-4Ebs-H.js → Governance-BNEdcOM5.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-CirjTgNw.js → Inference-C8249gIz.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-CunS7vhA.js → KnowledgeGraph-ngzebU3e.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-DBuTF0c6.js → Logs-CP15th-f.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-B-iE-tt_.js → MarkdownRenderer-CW3B3JDq.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-BK6ZivTS.js → Marketplace-CaH59OsY.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-CUnCRnd3.js → McpTools-C07vnJev.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-CBGGr8Gy.js → Memory-CqAOkVAS.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-reB6iaWD.js → MobileBridge-qp7mZimq.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-o1YdVB7i.js → MobileProjects-DKhbqvTw.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-if5OE3GH.js → Mtc-CRYCnWXv.js} +4 -4
  46. package/src/assets/web-panel/assets/{MtcAudit-BTZWpq0j.js → MtcAudit-Z08IrKws.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-8cvMAYFL.js → Multisig-BWdatUnH.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-BMvUXAWo.js → NLProgramming-BKWiCZ_m.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BWWjColh.js → Notes-Bgpzk3sm.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-Ccr4lIhS.js → NotificationSettings-DvtZEktR.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-DhksGy6D.js → OrderTableRenderer-CBcy0szc.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-DciXQfdY.js → Organization-DRRL6vW1.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-8DR7uMSx.js → Overflow-COmfB8Ns.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-DE6euHYl.js → P2P-BqMq_DSa.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-ByuWoauq.js → PdhVaultBrowser-BX7iNvle.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-DkjM87ac.js → Permissions-DzYkjmV_.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-2DLp0KTL.js → PersonalDataHub-BBTcxBbN.js} +3 -3
  58. package/src/assets/web-panel/assets/{Pipeline-Ci2Qlkfr.js → Pipeline-eRkYFSbO.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-DlwDnDVA.js → Privacy-Ch7IFKBh.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CmMifW39.js → ProjectInit-Ci8EcBYg.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-DJVFIh-6.js → ProjectSettings-B4lYHFbI.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-P2nWBS70.js → Projects-zkE5cCo_.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-B2cxaGCU.js → Providers-BKDVD3_e.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-CpO77kcE.js → QrScannerModal-BromrHlf.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-BDQl1hb0.js → QuickAsk-CCgoY1gR.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DTD2f3IN.js → Recommend-DCPZvpq7.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-DGZAnwvs.js → RemoteSession-DPnFP8HU.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-B_R4vitb.js → Reputation-l6r8ytAs.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-4Jj6JyXN.js → Row-ke9Mk1cx.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-D1t1MCZ-.js → RssFeed-DQOEzUEn.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-CyOUlIn7.js → Search-BqgA0aUz.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-BmknPT5Q.js → Security-FeGD_jqV.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-DkEK8mpa.js → Services-4kiYYAjZ.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-Bvo5bpuk.js → Skeleton-BbU8Xegs.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-AMmG8fim.js → Skills-Dl2bUMUL.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-Dl7-OKOV.js → Sla-xRGALeaZ.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-DtiGKu0E.js → SpeechSettings-DZfd4RDm.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-Ch7mp3ES.js → SyncSettings-BRtCV9Ga.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-Ck-sEgj-.js → Tasks-DVRQklfG.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-BlV22Il8.js → Templates-BbhE5jt5.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CaaAu0mX.js → Tenant-qXPDNKbK.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-lA9g3FtJ.js → Terminal-CV48Ks7E.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-CG26IFC3.js → TimelineRenderer-BLGfJIDr.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-iaJUBLBm.js → Tokens-7G9H6Hrt.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DWQJtLK3.js → Trigger--F64N11F.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-CTjmUwqp.js → Trust-Cq1r-D_y.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CMnxufgD.js → UkeySign-Dqyu4RVh.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-diCFSWJw.js → VideoEditing-DuFmWH_B.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-Ba1oND1K.js → Wallet-C3mg7EWP.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DZDqPS-S.js → WebAuthn-CDK-Aj_X.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-CfN8fPMe.js → WorkflowEditor--K7K-T1F.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-BiqMsO_i.js → chat-BQDcS6VP.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-By8LkjqH.js → colors-BKxJL2-T.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-B0mxvRe3.js → compact-item-CFjQAMbY.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-Li2ub348.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-DYbHPkbl.js → hasIn-BhkaOBNv.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-b4O_YBVR.js → index-3YutaXnp.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BcOJEgBE.js → index-3djsY75k.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-C5Se6Lnv.js → index-3uR0ThJO.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-ByqFKMWL.js → index-7BY44UEv.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BRzewWeE.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-Czt7WAtA.js → index-BNjYPJNU.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-1lVoRUrQ.js → index-BRqlCTrz.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CGZzexNa.js → index-BfGGsAU7.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-D6qL3QBU.js → index-BuWPqSGT.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DAOpBv3C.js → index-C0DzhUOX.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CTVPeUh3.js → index-CB4oHynY.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-KqfqSdAC.js → index-CE506mgj.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DPRgnazi.js → index-CJoXgJ2N.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-beDji-cB.js → index-COGy6wXn.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CMh3VxgO.js → index-CRtUDiXx.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Bm2P2Kgp.js → index-CSUDlsIr.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Cpfn4YbT.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-CYv3JIzl.js → index-CoOu7sdP.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CVZNYRzM.js → index-D-Yh3-1z.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-KWt8Owo8.js → index-D2Zb-Kd1.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CgyrklzQ.js → index-D9sVcw6v.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BFhksbXp.js → index-DEwHywz9.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CEp_3fKJ.js → index-DFt48Z-x.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-ClsJN8sW.js → index-DJ2OiRvh.js} +3 -3
  124. package/src/assets/web-panel/assets/{index-DB4DCzqU.js → index-DP1NrM9J.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DIImi0cd.js → index-DdcrixaQ.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Bd5znvCV.js → index-De7daEnc.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CA0AOURT.js → index-Dhfa_BIl.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-hw3sCYAz.js → index-DjmVlpap.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BSk0xuXP.js → index-DmYK9Tqt.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Bc6bxU24.js → index-Dn2QSsuI.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B0D0HkkM.js → index-Du_SxxBY.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DgMFnBOv.js → index-DvWWFJHJ.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-zSzXsF9b.js → index-T9ka3Xj3.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CHgiSV6R.js → index-aPdVzagA.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-BZqTG7fP.js → index-bMX8BBLE.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-C-RE3mFh.js → index-sKfUUldY.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-TgDL_7OY.js → initDefaultProps-wrqabmui.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-fHosyV5c.js → motion-BoyB3ilP.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-C_QfW5qg.js → move-Cq31cSFE.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-u7ywDVOg.js → mtc-parser-BkxNt-8H.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-BEJdUgE9.js → omit-DofGni53.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-DGkQFAJ5.js → pickAttrs-BnluLL16.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DUyZXAjt.js → placementArrow-C-yegJSP.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-B4xDxO7Q.js → responsiveObserve-CD3ziNhu.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-B8WuJtst.js → slide-ToZO4gQ1.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-DLUqy7JO.js → statusUtils-DFVmDmVl.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-BYOJOyqL.js → styleChecker-De0Y8g1O.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-WChWQURv.js → useFlexGapSupport-wBKIYFKX.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-vLNpm3dv.js → useFs-CP9nmUMJ.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-DSZ8unoU.js → usePersonalDataHub-vFGrVDyp.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-C4Xf7Kg1.js → vnode-BcBIjvjH.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-BulmeAGy.js → zoom-DnXDAQxA.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +4 -4
  155. package/src/commands/automation.js +35 -8
  156. package/src/commands/hub.js +147 -0
  157. package/src/commands/project.js +162 -0
  158. package/src/data/changelog.json +13 -0
  159. package/src/gateways/ws/personal-data-hub-protocol.js +54 -8
  160. package/src/lib/audit-logger.js +16 -29
  161. package/src/lib/audit-sanitizer.js +279 -0
  162. package/src/lib/automation-center.js +14 -4
  163. package/src/lib/automation-engine.js +151 -39
  164. package/src/lib/knowledge-graph.js +27 -0
  165. package/src/lib/personal-data-hub-wiring.js +44 -1
  166. package/src/lib/scheduler-kernel/automation-adapter.js +15 -3
  167. package/src/lib/scheduler-kernel/automation-event-adapter.js +15 -3
  168. package/src/assets/web-panel/assets/ChatBubbleRenderer-RN8cbv7w.js +0 -1
  169. package/src/assets/web-panel/assets/devWarning-D90arbUg.js +0 -1
  170. package/src/assets/web-panel/assets/index-CeP1oROI.js +0 -1
  171. package/src/assets/web-panel/assets/index-Cu9gkyRc.js +0 -1
@@ -18,6 +18,7 @@ import {
18
18
  buildAutomationCenterRuntimeProjection,
19
19
  } from "./automation-center-runtime.js";
20
20
  import {
21
+ AUTOMATION_EXECUTION_CAPABILITY,
21
22
  EXECUTION_STATUS,
22
23
  FLOW_STATUS,
23
24
  TRIGGER_TYPE,
@@ -117,6 +118,7 @@ function projectExecution(execution) {
117
118
  return {
118
119
  id: execution.id,
119
120
  status: execution.status,
121
+ mode: execution.mode,
120
122
  triggerType: execution.triggerType || null,
121
123
  durationMs: Number(execution.durationMs) || 0,
122
124
  startedAt: execution.startedAt || null,
@@ -213,6 +215,7 @@ function projectFlow(db, flow, { historyLimit, now }) {
213
215
  history,
214
216
  incidents,
215
217
  security,
218
+ executionCapability: AUTOMATION_EXECUTION_CAPABILITY,
216
219
  };
217
220
  const revision = digest(content);
218
221
  const active = flow.status === FLOW_STATUS.ACTIVE;
@@ -225,21 +228,28 @@ function projectFlow(db, flow, { historyLimit, now }) {
225
228
  actions: [
226
229
  action(
227
230
  "run_now",
228
- active && security.ready,
231
+ active && security.ready && AUTOMATION_EXECUTION_CAPABILITY.live,
229
232
  !active
230
233
  ? "flow is not active"
231
- : "permission or budget preflight denied",
234
+ : !security.ready
235
+ ? "permission or budget preflight denied"
236
+ : AUTOMATION_EXECUTION_CAPABILITY.reason,
232
237
  flow.id,
233
238
  revision,
234
239
  ),
235
240
  action(
236
241
  "retry_failed",
237
- active && latestFailed && security.ready,
242
+ active &&
243
+ latestFailed &&
244
+ security.ready &&
245
+ AUTOMATION_EXECUTION_CAPABILITY.live,
238
246
  !active
239
247
  ? "flow is not active"
240
248
  : !latestFailed
241
249
  ? "latest run did not fail"
242
- : "permission or budget preflight denied",
250
+ : !security.ready
251
+ ? "permission or budget preflight denied"
252
+ : AUTOMATION_EXECUTION_CAPABILITY.reason,
243
253
  flow.id,
244
254
  revision,
245
255
  ),
@@ -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),
@@ -239,6 +239,33 @@ export function getEntity(id) {
239
239
  return e ? _strip(e) : null;
240
240
  }
241
241
 
242
+ /** Replace supplied entity fields while preserving identity and relationships. */
243
+ export function updateEntity(db, id, config = {}) {
244
+ const current = _entities.get(id);
245
+ if (!current) throw new Error(`Entity not found: ${id}`);
246
+ const name = String(config.name ?? current.name).trim();
247
+ const type = String(config.type ?? current.type).trim();
248
+ if (!name) throw new Error("entity name is required");
249
+ if (!type) throw new Error("entity type is required");
250
+ const entity = {
251
+ ...current,
252
+ name,
253
+ type,
254
+ properties: Object.hasOwn(config, "properties")
255
+ ? config.properties
256
+ : current.properties,
257
+ tags: Object.hasOwn(config, "tags")
258
+ ? Array.isArray(config.tags)
259
+ ? [...config.tags]
260
+ : null
261
+ : current.tags,
262
+ updatedAt: Number(config.now ?? Date.now()),
263
+ };
264
+ _persistEntity(db, entity);
265
+ _entities.set(id, entity);
266
+ return _strip(entity);
267
+ }
268
+
242
269
  export function listEntities(opts = {}) {
243
270
  let rows = [..._entities.values()];
244
271
  if (opts.type) {
@@ -368,6 +368,17 @@ async function loadBm25() {
368
368
  let _hub = null;
369
369
  let _initPromise = null;
370
370
  let _bm25 = null;
371
+ let _processExitHook = null;
372
+
373
+ function installProcessExitHook() {
374
+ if (_processExitHook) return;
375
+ _processExitHook = (code) => {
376
+ // exit callbacks are synchronous. Nonzero exits keep the generation active;
377
+ // exit(0) still has to pass the registry's in-flight operation guard.
378
+ close({ retireConsumer: code === 0 });
379
+ };
380
+ process.once("exit", _processExitHook);
381
+ }
371
382
 
372
383
  // LLM override — see file header. Default cli-side hub uses a direct
373
384
  // OllamaClient; when the desktop main process embeds this wiring via
@@ -453,6 +464,11 @@ async function initHub() {
453
464
  kgSink = new CcKgSink({
454
465
  addEntity: kgMod.addEntity,
455
466
  addRelation: kgMod.addRelation,
467
+ updateEntity: kgMod.updateEntity,
468
+ getEntity: kgMod.getEntity,
469
+ removeEntity: kgMod.removeEntity,
470
+ listRelations: kgMod.listRelations,
471
+ removeRelation: kgMod.removeRelation,
456
472
  db: null,
457
473
  });
458
474
  }
@@ -550,6 +566,8 @@ async function initHub() {
550
566
  vault,
551
567
  kgSink: kgSink ? kgSink.write.bind(kgSink) : null,
552
568
  ragSink: ragSink ? ragSink.write.bind(ragSink) : null,
569
+ kgRemove: kgSink?.remove?.bind(kgSink) || null,
570
+ ragRemove: ragSink?.remove?.bind(ragSink) || null,
553
571
  entityResolver,
554
572
  adbReadiness: {
555
573
  probe: adbReadinessProbe,
@@ -557,6 +575,20 @@ async function initHub() {
557
575
  },
558
576
  });
559
577
 
578
+ // Both projections are in memory. A fresh registry consumer must rebuild
579
+ // from durable desired state before serving retrieval; leave failures
580
+ // visible and explicitly retryable instead of blocking startup forever.
581
+ if (typeof registry.retryDerivations === "function") {
582
+ for (let page = 0; page < 100; page += 1) {
583
+ const result = await registry.retryDerivations({ limit: 1000 });
584
+ if (!result.remaining) break;
585
+ // A referenced KG endpoint can occur on a later page. Visit fresh
586
+ // work before concluding that a failed dependency is unrecoverable.
587
+ if (result.summary?.pending > 0) continue;
588
+ if (!result.succeeded || result.unsupported || result.blocked) break;
589
+ }
590
+ }
591
+
560
592
  const engine = new AnalysisEngine({
561
593
  vault,
562
594
  llm,
@@ -2106,6 +2138,7 @@ export async function getHub() {
2106
2138
  _initPromise = initHub()
2107
2139
  .then((h) => {
2108
2140
  _hub = h;
2141
+ installProcessExitHook();
2109
2142
  return h;
2110
2143
  })
2111
2144
  .catch((err) => {
@@ -2226,6 +2259,7 @@ export async function getHubMinimal() {
2226
2259
  _hubMinimalInitPromise = initHubMinimal()
2227
2260
  .then((h) => {
2228
2261
  _hubMinimal = h;
2262
+ installProcessExitHook();
2229
2263
  return h;
2230
2264
  })
2231
2265
  .catch((err) => {
@@ -2236,7 +2270,11 @@ export async function getHubMinimal() {
2236
2270
  return _hubMinimalInitPromise;
2237
2271
  }
2238
2272
 
2239
- export function close() {
2273
+ export function close({ retireConsumer = true } = {}) {
2274
+ if (_processExitHook) {
2275
+ process.removeListener("exit", _processExitHook);
2276
+ _processExitHook = null;
2277
+ }
2240
2278
  if (_hub && _hub.aichatHealthChecker) {
2241
2279
  try {
2242
2280
  _hub.aichatHealthChecker.stop();
@@ -2245,6 +2283,11 @@ export function close() {
2245
2283
  }
2246
2284
  }
2247
2285
  if (_hub && _hub.vault) {
2286
+ try {
2287
+ if (retireConsumer) _hub.registry?.retireDerivationConsumer?.();
2288
+ } catch {
2289
+ // Busy/unknown generations retain their receipts for explicit recovery.
2290
+ }
2248
2291
  try {
2249
2292
  _hub.vault.close();
2250
2293
  } catch {
@@ -779,7 +779,7 @@ function existingExecutionResult(db, occurrence, expected, now) {
779
779
  }
780
780
  if (execution.status !== EXECUTION_STATUS.SUCCESS) {
781
781
  throw automationError(
782
- "AUTOMATION_SCHEDULER_EXECUTION_FAILED",
782
+ executionFailureCode(execution.status),
783
783
  `Automation execution did not succeed: ${execution.id}`,
784
784
  { executionId: execution.id, status: execution.status },
785
785
  );
@@ -790,6 +790,14 @@ function existingExecutionResult(db, occurrence, expected, now) {
790
790
  return execution;
791
791
  }
792
792
 
793
+ function executionFailureCode(status) {
794
+ if (status === EXECUTION_STATUS.UNSUPPORTED)
795
+ return "AUTOMATION_EXECUTION_UNSUPPORTED";
796
+ if (status === EXECUTION_STATUS.SIMULATED)
797
+ return "AUTOMATION_EXECUTION_SIMULATED";
798
+ return "AUTOMATION_SCHEDULER_EXECUTION_FAILED";
799
+ }
800
+
793
801
  export function createAutomationSchedulerAdapter({ db, now = Date.now } = {}) {
794
802
  if (!db || typeof db.prepare !== "function") {
795
803
  throw automationError(
@@ -930,9 +938,13 @@ export function createAutomationSchedulerAdapter({ db, now = Date.now } = {}) {
930
938
  }
931
939
  if (execution.status !== EXECUTION_STATUS.SUCCESS) {
932
940
  throw automationError(
933
- "AUTOMATION_SCHEDULER_EXECUTION_FAILED",
941
+ executionFailureCode(execution.status),
934
942
  `Automation execution failed: ${execution.id}`,
935
- { executionId: execution.id, error: execution.error },
943
+ {
944
+ executionId: execution.id,
945
+ status: execution.status,
946
+ error: execution.error,
947
+ },
936
948
  );
937
949
  }
938
950
  resolveAutomationExecutionIncidentsForSucceededRun(db, execution.id, {
@@ -576,7 +576,7 @@ function existingExecutionResult(db, occurrence, expectedFlow, now) {
576
576
  }
577
577
  if (execution.status !== EXECUTION_STATUS.SUCCESS) {
578
578
  throw eventError(
579
- "AUTOMATION_EVENT_EXECUTION_FAILED",
579
+ executionFailureCode(execution.status),
580
580
  `automation event execution did not succeed: ${execution.id}`,
581
581
  { executionId: execution.id, status: execution.status },
582
582
  );
@@ -587,6 +587,14 @@ function existingExecutionResult(db, occurrence, expectedFlow, now) {
587
587
  return execution;
588
588
  }
589
589
 
590
+ function executionFailureCode(status) {
591
+ if (status === EXECUTION_STATUS.UNSUPPORTED)
592
+ return "AUTOMATION_EXECUTION_UNSUPPORTED";
593
+ if (status === EXECUTION_STATUS.SIMULATED)
594
+ return "AUTOMATION_EXECUTION_SIMULATED";
595
+ return "AUTOMATION_EVENT_EXECUTION_FAILED";
596
+ }
597
+
590
598
  export function createAutomationEventAdapter({ db, now = Date.now } = {}) {
591
599
  if (!db || typeof db.prepare !== "function") {
592
600
  throw eventError(
@@ -729,9 +737,13 @@ export function createAutomationEventAdapter({ db, now = Date.now } = {}) {
729
737
  }
730
738
  if (execution.status !== EXECUTION_STATUS.SUCCESS) {
731
739
  throw eventError(
732
- "AUTOMATION_EVENT_EXECUTION_FAILED",
740
+ executionFailureCode(execution.status),
733
741
  `automation event execution failed: ${execution.id}`,
734
- { executionId: execution.id, error: execution.error },
742
+ {
743
+ executionId: execution.id,
744
+ status: execution.status,
745
+ error: execution.error,
746
+ },
735
747
  );
736
748
  }
737
749
  resolveAutomationExecutionIncidentsForSucceededRun(db, execution.id, {
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as S,U as s,R as a,S as y,K as C,Q as x,V as w,_ as B,b as n}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-ClsJN8sW.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=n(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=n(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=n(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=n(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=n(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:n};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[s("div",T,[s("div",M,[s("span",R,a(r.actorLabel),1),s("span",V,a(r.formattedTime),1)]),s("div",q,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const j=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-l7nzSP/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{j as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-ClsJN8sW.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-4Jj6JyXN.js";import{a0 as t}from"./index-ClsJN8sW.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-B4xDxO7Q.js";import"./useFlexGapSupport-WChWQURv.js";import"./styleChecker-BYOJOyqL.js";import"./index-KWt8Owo8.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-4M6bKRRO.js";import{a0 as t}from"./index-ClsJN8sW.js";import"./vendor-Bn1JzzAn.js";import"./index-KWt8Owo8.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};