chainlesschain 0.166.87 → 0.166.88

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 (167) hide show
  1. package/README.md +26 -15
  2. package/package.json +1 -1
  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-DdQjhXg9.js → AIOps-QzeGep9J.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-CuwA3hPA.js → ActionButton-Dfc5bx7S.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-DTVXJSAC.js → Analytics-tn-_ZG2E.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-j06JBfEQ.js → AppLayout-Deg3WAK8.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-BFAK8LEW.js → Artifacts-KU05t0a6.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-BiGxRpOf.js → Audit-CkSZf54T.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-B6uHaPkZ.js → BackgroundAgents-i7ivfXF0.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-BNAesB8q.js → Backup-QcVUKtf0.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-BOuetfCd.js → BaseInput-B3h5ZJ0g.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-cVzo3m_D.js → Chat-D7AVz0xi.js} +5 -5
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DZ2Ys-CI.js → ChatBubbleRenderer-B0-euPW7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-BaCTS-H8.js → Checkbox-H0p0TMlD.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-CBE8NiYh.js → Codegen-B6HOmAY3.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-C9wLiUTN.js → Col-n_64Fog2.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-jdClBSIp.js → Community-CX0JGgj0.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-BIjauIlM.js → Compact-C4JWUZlx.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-CZ-AoaNj.js → Compliance-DKyTZakB.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-BbTKtDS4.js → Cowork-C0joBMci.js} +3 -3
  23. package/src/assets/web-panel/assets/{Cron-ImKdtwNi.js → Cron-D6VkYpxK.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-B54GSHf5.js → Crosschain-7b6Uu8jc.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-BQt5WUzs.js → DID-C8YPKqzY.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard--gNOffif.js → Dashboard-DJsOiEry.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-342A5YJw.js → Dropdown-CyStFY-4.js} +1 -1
  28. package/src/assets/web-panel/assets/EmailListRenderer-COrIx2Rg.js +1 -0
  29. package/src/assets/web-panel/assets/{EvolutionSettings-CyZPoTio.js → EvolutionSettings-DpxORusH.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B1MCkFEu.js → FamilyGuardDashboard-5BYZdMG0.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-DZWoERUy.js → Federation-s1kS0ekU.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-Onmb0mp3.js → FormItemContext-CmgoH9HV.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-u1qhNNc7.js → GenericCardRenderer-DSRWrvcL.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BEowR1C5.js → Git-Cz3EgnS1.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-BiYd3AAg.js → Governance-De4atTe7.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-CsC4Vjh5.js → Inference-DoitBBxJ.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-BXA7ikPM.js → KnowledgeGraph-CIdmJ1pH.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-C9WoplQm.js → Logs-Coa_qNhU.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-DecEsXsy.js → MarkdownRenderer-CeT_RocE.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-CCoJBfRL.js → Marketplace-C6kbAQoM.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-CzaOWBoA.js → McpTools-C2TZn8D-.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-BPwh7u1-.js → Memory-DYdEKDuB.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-Bk47v6z2.js → MobileBridge-pKLeVviZ.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-D4bWcHA_.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-ExVyAGlW.js → Mtc-IEoVRV29.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-Rrw10csE.js → MtcAudit-Cov-yYTY.js} +5 -5
  47. package/src/assets/web-panel/assets/{Multisig-8TxxwxZZ.js → Multisig--Jr7OCmp.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-CNckjtnY.js → NLProgramming-D2gXnYAA.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-C4j6cZTu.js → Notes-hk8pMyve.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-CchU8rWd.js → NotificationSettings-D26Nc7MU.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-DmzHMEOa.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-F0Je7EdZ.js → Organization-Cn-o6mHT.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-B2k-JA3u.js → Overflow-DP6xpDak.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-yui9Xxe6.js → P2P-C9WAjG-I.js} +2 -2
  55. package/src/assets/web-panel/assets/PdhVaultBrowser-DxZb0Ux8.js +7 -0
  56. package/src/assets/web-panel/assets/{Permissions-CSFL0uvh.js → Permissions-BFBN4-IL.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-BrMcd-vr.js → PersonalDataHub-BEDvoAiz.js} +6 -6
  58. package/src/assets/web-panel/assets/{Pipeline-fzrliaVP.js → Pipeline-Co2Ze_rR.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-BrkUjJ_g.js → Privacy-BOTn1EId.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CF_QCsW9.js → ProjectInit-CObyrZYm.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-Duwrd8aC.js → ProjectSettings-DVTN31rd.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-B0dLVXzU.js → Projects-DQSEaVjE.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-Db8iS1xQ.js → Providers-BRIKWIdQ.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-CHbNzEQs.js → QrScannerModal-3nxaEXxN.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-CIESMfeR.js → QuickAsk-iwZJEE9z.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BTMbCMtR.js → Recommend-D2_EEbvc.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-DavyK6J-.js → RemoteSession-S4w2mUfq.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-BFKtMelA.js → Reputation-CstUvfTC.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-BI9AZUvw.js → Row-DEGHFpxz.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-1nwXt8NY.js → RssFeed-DGdZtJQl.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-Ck8PDYbk.js → Search-DhfXi99U.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-BgDqpCbq.js → Security-BbzISrgX.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-DF8anXm4.js → Services-CFjP2sQ3.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CoHyY4ZX.js → Skeleton-CFn5wbvm.js} +1 -1
  75. package/src/assets/web-panel/assets/Skills-fVbT8RcW.js +1 -0
  76. package/src/assets/web-panel/assets/{Sla-XuOawvQY.js → Sla-D6OtC0MT.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-DFJ7nAiu.js → SpeechSettings-D0kteBjU.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-B2xYj-Pi.js → SyncSettings-BGEWCtPh.js} +2 -2
  79. package/src/assets/web-panel/assets/Tasks-B1xZUG4D.js +1 -0
  80. package/src/assets/web-panel/assets/{Templates-BXFmKh7W.js → Templates-COlorjqb.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CRg2AXbd.js → Tenant-yLkwfuo3.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-DQgxnuep.js → Terminal-CAmkq1wf.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-BrPQhQVc.js → TimelineRenderer-CcKYq1Ue.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-RByy4USy.js → Tokens-9hIqn_LE.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-pE3y8u73.js → Trigger-Dsdkb74C.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-DhID9C33.js → Trust-DC4GuE3C.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CPxEPNBH.js → UkeySign-CSlh00wf.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-ZD8DUxeQ.js → VideoEditing-QEWLo3QY.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-Br9JREEd.js → Wallet-BkPNQgmg.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-Cn-YacJg.js → WebAuthn-7---jCBl.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-BTu0oqMp.js → WorkflowEditor-Dq6Yiu8E.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CEjws_QF.js → chat-CTYIMpWD.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-Bv2RNebW.js → colors-C8JtYlDN.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-gSc3EofP.js → compact-item-spXpnsNC.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-kyFDaqWC.js → createContext-D04ewPuL.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-3-s4adfp.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-BuMWcjhx.js → hasIn-DZblOKXx.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DYcPWVN9.js → index-749P1pkM.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-D3m3EXbL.js → index-B-cKXztT.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DbkyTMj-.js → index-B57W1RB6.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BCS5j4SQ.js → index-B7RA974g.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-U-ytt84A.js → index-BKfR2eSQ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-C56Drzol.js → index-BLv-KSGc.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DYKSuD02.js → index-BOuUUW2U.js} +3 -3
  105. package/src/assets/web-panel/assets/{index-CMS3Mk93.js → index-BSO33_O2.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-nLemnBZ2.js → index-B_65aY6c.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-sJ1F5Txa.js → index-BjMY3Y_L.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BUOCcXou.js → index-Bm0z1M6s.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CNt2X-aK.js → index-Bw-3CtK2.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-OjZUHz5z.js → index-CE3TYhl0.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Cj4RA7oA.js → index-CHtwoTKX.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Bg5jis0q.js → index-CLkua5sJ.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-q65c1kp8.js → index-COvZnoIg.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Cm8K8Evn.js → index-CZmBlh5P.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BSSIJ-rv.js → index-Cfk4o9eI.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CvSuM_CB.js → index-Cgztj1JO.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-jmMAqBAm.js → index-Cz0gkRz_.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DR561Sqc.js → index-DHOV24VR.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-NQ0c4hJ1.js → index-DLUHbPl3.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-EpxWlmip.js → index-DSoyEHi2.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CF3TjDNz.js → index-D_Md0Jhp.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CkfvP2dN.js → index-Dcd-qZ68.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DRa4R7vv.js → index-DcjouIsi.js} +1 -1
  124. package/src/assets/web-panel/assets/{index--nrQmk8X.js → index-DdC0OsNh.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C-LPpwe9.js → index-DruABY-g.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Dej4AGOz.js → index-Dssnz_1x.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C7Jo20JB.js → index-DtSzmzFF.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-42PTBO7a.js → index-DwIEfKo7.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Czo_hw97.js → index-EM4_wLPi.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DbVUA5l3.js → index-IFEbaISP.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-C9U9SjcT.js → index-KIoJ2eCK.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-_0bfDTDu.js → index-Mxj-qi1G.js} +1 -1
  133. package/src/assets/web-panel/assets/index-ZMf_BGlO.js +1 -0
  134. package/src/assets/web-panel/assets/index-jvp8bJBF.js +1 -0
  135. package/src/assets/web-panel/assets/{index-GpvWtvw3.js → index-rU6_An6N.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-xfS_WO9b.js → index-rVEqWa0_.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-B-wqiSu7.js → initDefaultProps-Dl0wiMxn.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BK4_B4MD.js → motion-BFmZYrGO.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-BU2TgDDO.js → move-Cjs64yWq.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-DA3E4_EX.js → mtc-parser-NeQsnBuP.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-CaHz1e_q.js → omit-4Rs-rfs9.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-NXZ19amf.js → pickAttrs-CUhx2rDY.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-BCXI9AHO.js → placementArrow-DbIM_OB2.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-DdlZ9tLk.js → responsiveObserve-B_TGx9AN.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-DCZm_Vc4.js → slide-C46cEP5t.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-CuEULKQr.js → statusUtils-DqeksICX.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-Bo_UXG8x.js → styleChecker-2rrypo5u.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-B9PaTcFH.js → useFlexGapSupport-RRe1Edsg.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-DwSTGdVR.js → useFs-CB0oxU1U.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-FswSxnDC.js → usePersonalDataHub-B98WdlUE.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-EUztvYTj.js → vnode-CY8AoD95.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-D41MAgV-.js → zoom-BnT-0MbP.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/commands/eval.js +3 -54
  155. package/src/data/changelog.json +13 -0
  156. package/src/lib/eval/stream-terminal.js +51 -0
  157. package/src/lib/eval/verify01-execution.js +7 -1
  158. package/src/lib/eval/verify01-host-evidence.js +604 -0
  159. package/src/assets/web-panel/assets/EmailListRenderer-CtIZ3ZHd.js +0 -1
  160. package/src/assets/web-panel/assets/MobileProjects-D-CY--Sb.js +0 -1
  161. package/src/assets/web-panel/assets/OrderTableRenderer-ZJBoyJ16.js +0 -1
  162. package/src/assets/web-panel/assets/PdhVaultBrowser-CegM7hT6.js +0 -7
  163. package/src/assets/web-panel/assets/Skills-dOaD4Ztl.js +0 -1
  164. package/src/assets/web-panel/assets/Tasks-D_SzNTLi.js +0 -1
  165. package/src/assets/web-panel/assets/devWarning-Dcc8pILJ.js +0 -1
  166. package/src/assets/web-panel/assets/index-05NB95_V.js +0 -1
  167. package/src/assets/web-panel/assets/index-Cb6q8wlI.js +0 -1
@@ -0,0 +1,51 @@
1
+ /** Parse raw agent NDJSON. A declaration of success is never terminal evidence. */
2
+ export function verifyAgentTerminal(output) {
3
+ try {
4
+ const events = output
5
+ .split(/\r?\n/u)
6
+ .filter((line) => line.trim())
7
+ .map((line) => JSON.parse(line));
8
+ const results = events.filter((event) => event?.type === "result");
9
+ const terminal = results[0];
10
+ const usage = terminal?.usage;
11
+ const normalizedUsage =
12
+ usage &&
13
+ [
14
+ usage.input_tokens,
15
+ usage.output_tokens,
16
+ usage.cache_read_input_tokens,
17
+ usage.cache_creation_input_tokens,
18
+ ].every((value) => Number.isSafeInteger(value) && value >= 0)
19
+ ? {
20
+ inputTokens: usage.input_tokens,
21
+ outputTokens: usage.output_tokens,
22
+ cacheReadInputTokens: usage.cache_read_input_tokens,
23
+ cacheCreationInputTokens: usage.cache_creation_input_tokens,
24
+ }
25
+ : null;
26
+ return {
27
+ terminalVerified:
28
+ results.length === 1 &&
29
+ events.at(-1) === terminal &&
30
+ terminal.subtype === "success" &&
31
+ terminal.is_error === false &&
32
+ !events.some((event) => event?.type === "error"),
33
+ observedFallback: events.some((event) =>
34
+ ["provider_fallback", "model_fallback"].includes(event?.subtype),
35
+ ),
36
+ usage: normalizedUsage,
37
+ totalCostUsd:
38
+ Number.isFinite(terminal?.total_cost_usd) &&
39
+ terminal.total_cost_usd >= 0
40
+ ? terminal.total_cost_usd
41
+ : null,
42
+ };
43
+ } catch {
44
+ return {
45
+ terminalVerified: false,
46
+ observedFallback: null,
47
+ usage: null,
48
+ totalCostUsd: null,
49
+ };
50
+ }
51
+ }
@@ -328,7 +328,13 @@ function reviewedProcess(bytes, directory, reviewRoot, kind, timeout) {
328
328
  // operator code; their digest is not an independent-review attestation.
329
329
  const result = executionBroker.spawnSync(
330
330
  process.execPath,
331
- ["--input-type=module", "--eval", bytes.toString("utf8"), directory],
331
+ [
332
+ "--input-type=module",
333
+ "--eval",
334
+ bytes.toString("utf8"),
335
+ directory,
336
+ String(Date.now() + timeout),
337
+ ],
332
338
  {
333
339
  cwd: reviewRoot,
334
340
  encoding: "utf8",
@@ -0,0 +1,604 @@
1
+ import {
2
+ createEvalHistoryRecord,
3
+ evalDigest,
4
+ EVAL_EXECUTION_PROTOCOL,
5
+ } from "./evidence.js";
6
+ import { outcomeDigest } from "./outcomes.js";
7
+ import { verifyAgentTerminal } from "./stream-terminal.js";
8
+ import {
9
+ relativeFile,
10
+ requireValue,
11
+ validateVerify01Review,
12
+ validateVerify01Collection,
13
+ } from "./verify01-contracts.js";
14
+
15
+ const HOST_SCHEMA = "chainlesschain.verify01-host-capture/v1";
16
+ const RECORD_SCHEMA = "chainlesschain.ide-protocol-record/v1";
17
+ const STAGES = ["install", "configure", "authenticate", "tool", "artifact"];
18
+ const epoch = (value) => Date.parse(value);
19
+ const count = (value) => Number.isSafeInteger(value) && value >= 0;
20
+
21
+ function artifact(descriptor, readArtifact) {
22
+ relativeFile(descriptor?.path);
23
+ const bytes = readArtifact(descriptor.path);
24
+ requireValue(
25
+ Buffer.isBuffer(bytes) &&
26
+ bytes.length <= 16 * 1024 * 1024 &&
27
+ evalDigest(bytes) === descriptor.digest,
28
+ "host artifact digest mismatch or size limit exceeded",
29
+ );
30
+ return bytes;
31
+ }
32
+
33
+ /** One freshly started IDE session per task. Sequence gaps, interleaved user
34
+ * turns, stale receipts and undrained exits remain unverified, never replayed.
35
+ */
36
+ export function inspectIdeProtocol(records, { prompt, comparison } = {}) {
37
+ requireValue(
38
+ Array.isArray(records) && records.length >= 4,
39
+ "IDE protocol capture is incomplete",
40
+ );
41
+ const generation = records[0]?.generation;
42
+ let previousTime = -Infinity;
43
+ for (const [index, record] of records.entries()) {
44
+ const at = epoch(record?.at);
45
+ requireValue(
46
+ record?.schema === RECORD_SCHEMA &&
47
+ typeof generation === "string" &&
48
+ generation.length > 0 &&
49
+ record.generation === generation &&
50
+ record.sequence === index + 1 &&
51
+ Number.isFinite(at) &&
52
+ at >= previousTime &&
53
+ ["input", "output", "exit"].includes(record.direction) &&
54
+ record.event &&
55
+ typeof record.event === "object",
56
+ "IDE protocol generation, sequence or timestamp is inconsistent",
57
+ );
58
+ previousTime = at;
59
+ }
60
+ const exits = records.filter((record) => record.direction === "exit");
61
+ requireValue(
62
+ exits.length === 1 &&
63
+ records.at(-1) === exits[0] &&
64
+ exits[0].event.stdoutDrained === true &&
65
+ Number.isInteger(exits[0].event.code),
66
+ "IDE capture lacks a drained process exit",
67
+ );
68
+ const inputs = records.filter((record) => record.direction === "input");
69
+ // Control or second-turn input makes correlation ambiguous because older
70
+ // result envelopes do not echo client_message_id. Use a fresh session.
71
+ requireValue(
72
+ inputs.length === 1 &&
73
+ inputs[0].event.type === "user" &&
74
+ inputs[0].event.text === prompt &&
75
+ typeof inputs[0].event.client_message_id === "string" &&
76
+ inputs[0].event.client_message_id.length > 0,
77
+ "IDE sample requires exactly its frozen user prompt and client identity",
78
+ );
79
+ requireValue(
80
+ inputs[0].event.llm == null &&
81
+ inputs[0].event.worklog_session_id == null &&
82
+ (inputs[0].event.images === undefined ||
83
+ (Array.isArray(inputs[0].event.images) &&
84
+ inputs[0].event.images.length === 0)),
85
+ "frozen IDE sample cannot add per-turn model overrides, historical context or attachments",
86
+ );
87
+ const outputs = records.filter((record) => record.direction === "output");
88
+ const initializations = outputs.filter(
89
+ (record) =>
90
+ record.event.type === "system" && record.event.subtype === "init",
91
+ );
92
+ requireValue(
93
+ initializations.length === 1,
94
+ "IDE sample requires one actual initialization",
95
+ );
96
+ const init = initializations[0];
97
+ requireValue(
98
+ init.sequence < inputs[0].sequence &&
99
+ init.event.model === comparison.model &&
100
+ init.event.provider === comparison.provider &&
101
+ init.event.permission_mode === comparison.permissionMode &&
102
+ typeof init.event.session_id === "string" &&
103
+ init.event.session_id.length > 0,
104
+ "actual IDE initialization differs from the frozen provider/model/mode",
105
+ );
106
+ const sessionId = init.event.session_id;
107
+ requireValue(
108
+ outputs.every(
109
+ (record) =>
110
+ !record.event.session_id || record.event.session_id === sessionId,
111
+ ),
112
+ "IDE capture contains a foreign session",
113
+ );
114
+ const accepted = outputs.filter(
115
+ (record) =>
116
+ record.event.type === "system" &&
117
+ record.event.subtype === "input_accepted",
118
+ );
119
+ requireValue(
120
+ init.event.input_receipts?.version === 1 &&
121
+ accepted.length === 1 &&
122
+ accepted[0].sequence > inputs[0].sequence &&
123
+ accepted[0].event.client_message_id ===
124
+ inputs[0].event.client_message_id &&
125
+ accepted[0].event.receipt?.duplicate === false &&
126
+ accepted[0].event.receipt?.sessionId === sessionId &&
127
+ accepted[0].event.receipt?.clientMessageId ===
128
+ inputs[0].event.client_message_id &&
129
+ /^[a-f0-9]{64}$/u.test(accepted[0].event.receipt?.eventHash || "") &&
130
+ accepted[0].event.receipt?.inputDigest ===
131
+ evalDigest(
132
+ Buffer.from(
133
+ JSON.stringify({
134
+ text: prompt,
135
+ images: [],
136
+ llm: null,
137
+ worklogSessionId: null,
138
+ }),
139
+ ),
140
+ ).slice(7),
141
+ "IDE input acceptance is missing, stale or duplicated",
142
+ );
143
+ const resultRecords = outputs.filter(
144
+ (record) => record.event.type === "result",
145
+ );
146
+ requireValue(
147
+ resultRecords.length === 1 &&
148
+ resultRecords[0].sequence > accepted[0].sequence &&
149
+ resultRecords[0].event.session_id === sessionId,
150
+ "IDE terminal is missing or ambiguous",
151
+ );
152
+ const parsed = verifyAgentTerminal(
153
+ outputs.map((record) => JSON.stringify(record.event)).join("\n"),
154
+ );
155
+ const terminal = resultRecords[0].event;
156
+ // A complete explicit failure is an observation. It never becomes success.
157
+ const knownFailure =
158
+ outputs.at(-1) === resultRecords[0] &&
159
+ terminal.is_error === true &&
160
+ typeof terminal.subtype === "string" &&
161
+ terminal.subtype.length > 0 &&
162
+ terminal.subtype !== "success";
163
+ const exit = exits[0].event;
164
+ const succeeded =
165
+ parsed.terminalVerified &&
166
+ exit.code === 0 &&
167
+ (exit.signal ?? null) === null;
168
+ return {
169
+ ...parsed,
170
+ generation,
171
+ sessionId,
172
+ result:
173
+ knownFailure && typeof terminal.error === "string"
174
+ ? terminal.error
175
+ : terminal.result,
176
+ terminalFailure: knownFailure,
177
+ startedAt: records[0].at,
178
+ inputAt: inputs[0].at,
179
+ terminalAt: resultRecords[0].at,
180
+ finishedAt: exits[0].at,
181
+ elapsedMs: epoch(exits[0].at) - epoch(records[0].at),
182
+ executionSucceeded: succeeded,
183
+ executionEvidence: {
184
+ protocol: EVAL_EXECUTION_PROTOCOL,
185
+ exitCode: exit.code,
186
+ signal: exit.signal ?? null,
187
+ terminalVerified: parsed.terminalVerified || knownFailure,
188
+ observedFallback: parsed.observedFallback,
189
+ },
190
+ };
191
+ }
192
+
193
+ function capturedDiff(changes, allowed, declaredChangedFiles) {
194
+ requireValue(Array.isArray(changes), "captured full diff must be an array");
195
+ const paths = new Set();
196
+ for (const change of changes) {
197
+ const file = relativeFile(change?.path);
198
+ requireValue(
199
+ !paths.has(file) && allowed.includes(file),
200
+ "full diff has a duplicate or unreviewed path",
201
+ );
202
+ paths.add(file);
203
+ requireValue(
204
+ change.before || change.after,
205
+ "full diff cannot contain an empty change",
206
+ );
207
+ for (const side of [change.before, change.after]) {
208
+ if (side === null) continue;
209
+ requireValue(
210
+ side?.type === "file" &&
211
+ side.dependency === false &&
212
+ count(side.mode) &&
213
+ side.mode <= 0o777 &&
214
+ count(side.bytes) &&
215
+ typeof side.bytesBase64 === "string",
216
+ "full diff is incomplete or contains a link/dependency",
217
+ );
218
+ const bytes = Buffer.from(side.bytesBase64, "base64");
219
+ requireValue(
220
+ bytes.toString("base64") === side.bytesBase64 &&
221
+ bytes.length === side.bytes &&
222
+ evalDigest(bytes) === side.digest,
223
+ "captured diff body, byte length or digest differs",
224
+ );
225
+ }
226
+ requireValue(
227
+ change.before?.digest !== change.after?.digest ||
228
+ change.before?.mode !== change.after?.mode,
229
+ "full diff falsely declares an unchanged file",
230
+ );
231
+ }
232
+ requireValue(
233
+ paths.size === declaredChangedFiles.length &&
234
+ declaredChangedFiles.every((file) => paths.has(file)),
235
+ "full diff differs from the declared changed-file inventory",
236
+ );
237
+ return changes;
238
+ }
239
+
240
+ function validateUi(actions, protocol, sampleId, observedAt, elapsedMs) {
241
+ const required = [
242
+ "submit",
243
+ "background-tab",
244
+ "return-tab",
245
+ "final-result",
246
+ "reload",
247
+ "restored-result",
248
+ ];
249
+ requireValue(
250
+ Array.isArray(actions) &&
251
+ (protocol.terminalFailure
252
+ ? actions.length > 0 && actions.length <= required.length
253
+ : actions.length === required.length),
254
+ "actual IDE tab/reload journey is incomplete",
255
+ );
256
+ // Submission may be what starts a cold session, before its first init event.
257
+ let previous = epoch(observedAt) - elapsedMs;
258
+ for (const [index, action] of actions.entries()) {
259
+ const at = epoch(action.at);
260
+ requireValue(
261
+ action.action === required[index] &&
262
+ action.sampleId === sampleId &&
263
+ action.sessionId === protocol.sessionId &&
264
+ Number.isFinite(at) &&
265
+ at >= previous &&
266
+ at <= epoch(observedAt),
267
+ "IDE UI action order, session or time differs",
268
+ );
269
+ previous = at;
270
+ if (action.action === "submit")
271
+ requireValue(
272
+ at <= epoch(protocol.inputAt),
273
+ "UI submission follows the protocol input",
274
+ );
275
+ if (["final-result", "restored-result"].includes(action.action))
276
+ requireValue(
277
+ at >= epoch(protocol.terminalAt) &&
278
+ typeof protocol.result === "string" &&
279
+ action.resultDigest === evalDigest(Buffer.from(protocol.result)),
280
+ "IDE visible/restored result differs from the actual terminal",
281
+ );
282
+ }
283
+ }
284
+
285
+ /** Import existing captured artifacts into the established Eval/outcome schema.
286
+ * Byte bindings and raw terminals are checked, but local declarations cannot
287
+ * attest a marketplace install, machine identity, provider account or billing.
288
+ */
289
+ export function importVerify01HostCapture(
290
+ bundle,
291
+ preparation,
292
+ {
293
+ manifest,
294
+ expectedManifestDigest,
295
+ readArtifact,
296
+ sourceCommit,
297
+ now = Date.now(),
298
+ },
299
+ ) {
300
+ const { samples, tasks, reviewed } = validateVerify01Review(
301
+ bundle,
302
+ preparation,
303
+ );
304
+ requireValue(
305
+ manifest?.schema === HOST_SCHEMA &&
306
+ outcomeDigest(manifest) === expectedManifestDigest,
307
+ "externally pinned host capture digest mismatch",
308
+ );
309
+ const sample = samples.get(manifest.sampleId);
310
+ requireValue(
311
+ sample &&
312
+ manifest.planDigest === bundle.expectedPlanDigest &&
313
+ manifest.reviewDigest === preparation.expectedReviewDigest &&
314
+ manifest.projectCommit === bundle.catalog.projectCommit &&
315
+ manifest.sourceCommit === sourceCommit,
316
+ "host capture frozen/source/review identity differs",
317
+ );
318
+ const target = bundle.bindings.matrix.find((entry) =>
319
+ sample.stratum.startsWith(`${entry.id}-`),
320
+ );
321
+ requireValue(
322
+ target &&
323
+ manifest.entry === target.entry &&
324
+ manifest.platform === target.platform &&
325
+ manifest.arch === target.arch &&
326
+ manifest.node === target.node &&
327
+ manifest.host === target.host &&
328
+ manifest.os === target.os,
329
+ "actual host/runtime declaration differs from frozen matrix; CLI cannot impersonate an IDE",
330
+ );
331
+ requireValue(
332
+ sample.kind === "first-run" ||
333
+ ["vscode", "jetbrains"].includes(manifest.entry),
334
+ "ordinary CLI tasks use the frozen CLI executor",
335
+ );
336
+ requireValue(
337
+ count(manifest.retries) &&
338
+ manifest.retries <= 1 &&
339
+ count(manifest.manualRepairs),
340
+ "invalid retry or repair count",
341
+ );
342
+ const comparison = bundle.bindings.comparisons[sample.stratum];
343
+ const task = tasks.get(sample.taskId);
344
+ const observation = {
345
+ sampleId: sample.id,
346
+ runId: null,
347
+ observedAt: manifest.observedAt,
348
+ cost: null,
349
+ elapsedMs: manifest.elapsedMs,
350
+ retries: manifest.retries,
351
+ manualRepairs: manifest.manualRepairs,
352
+ failureCause: manifest.failureCause ?? "unknown",
353
+ };
354
+ const receiptDigests = [];
355
+ if (sample.kind === "first-run") {
356
+ requireValue(
357
+ typeof manifest.firstRun?.cleanEnvironment === "boolean",
358
+ "fresh profile evidence declaration is required",
359
+ );
360
+ observation.firstRun = {
361
+ cleanEnvironment: manifest.firstRun.cleanEnvironment,
362
+ stages: {},
363
+ };
364
+ let stopped = false;
365
+ for (const stage of STAGES) {
366
+ const entry = manifest.firstRun.stages?.[stage];
367
+ requireValue(
368
+ typeof entry?.passed === "boolean" &&
369
+ (!stopped || entry.passed === false),
370
+ "first-install stages cannot succeed after a failed prerequisite",
371
+ );
372
+ const bytes = artifact(entry.receipt, readArtifact);
373
+ requireValue(
374
+ bytes.length > 0,
375
+ "first-install stage receipt cannot be empty",
376
+ );
377
+ observation.firstRun.stages[stage] = {
378
+ passed: entry.passed,
379
+ receipt: entry.receipt.digest,
380
+ };
381
+ receiptDigests.push(entry.receipt.digest);
382
+ stopped ||= !entry.passed;
383
+ }
384
+ }
385
+ const earlyStop =
386
+ sample.kind === "first-run" &&
387
+ observation.firstRun.stages.tool.passed === false;
388
+ let run = null;
389
+ if (earlyStop) {
390
+ requireValue(
391
+ !manifest.protocol &&
392
+ !manifest.stream &&
393
+ !manifest.check &&
394
+ !manifest.ui &&
395
+ !manifest.exit &&
396
+ !manifest.diff &&
397
+ !manifest.invocation,
398
+ "first-install early stop cannot claim a task terminal or artifact check",
399
+ );
400
+ requireValue(
401
+ manifest.cost === null ||
402
+ (Number.isFinite(manifest.cost) && manifest.cost >= 0),
403
+ "invalid early-stop cost declaration",
404
+ );
405
+ observation.cost = manifest.cost;
406
+ } else {
407
+ requireValue(
408
+ typeof manifest.runId === "string" && manifest.runId.trim().length > 0,
409
+ "completed host capture requires its actual run identity",
410
+ );
411
+ let protocol;
412
+ if (manifest.entry === "cli") {
413
+ const raw = artifact(manifest.stream, readArtifact).toString("utf8");
414
+ const parsed = verifyAgentTerminal(raw);
415
+ const exit = JSON.parse(
416
+ artifact(manifest.exit, readArtifact).toString("utf8"),
417
+ );
418
+ requireValue(
419
+ Number.isInteger(exit.code) &&
420
+ (exit.signal === null || typeof exit.signal === "string"),
421
+ "invalid CLI exit capture",
422
+ );
423
+ const invocation = JSON.parse(
424
+ artifact(manifest.invocation, readArtifact).toString("utf8"),
425
+ );
426
+ requireValue(
427
+ invocation.taskId === task.id &&
428
+ invocation.prompt === task.prompt &&
429
+ invocation.provider === comparison.provider &&
430
+ invocation.model === comparison.model &&
431
+ invocation.permissionMode === comparison.permissionMode &&
432
+ invocation.projectCommit === bundle.catalog.projectCommit &&
433
+ invocation.sourceCommit === sourceCommit &&
434
+ Number.isFinite(epoch(invocation.startedAt)) &&
435
+ Number.isFinite(epoch(exit.finishedAt)) &&
436
+ epoch(exit.finishedAt) >= epoch(invocation.startedAt),
437
+ "CLI first-run invocation differs from the frozen task or runtime identity",
438
+ );
439
+ // CLI first-run capture still needs the actual init identity.
440
+ const events = raw
441
+ .split(/\r?\n/u)
442
+ .filter((line) => line.trim())
443
+ .map((line) => JSON.parse(line));
444
+ const inits = events.filter(
445
+ (event) => event.type === "system" && event.subtype === "init",
446
+ );
447
+ const init = inits[0];
448
+ requireValue(
449
+ inits.length === 1 &&
450
+ typeof init.session_id === "string" &&
451
+ init.session_id.length > 0 &&
452
+ init?.provider === comparison.provider &&
453
+ init?.model === comparison.model &&
454
+ init?.permission_mode === comparison.permissionMode &&
455
+ events.every(
456
+ (event) =>
457
+ !event.session_id || event.session_id === init.session_id,
458
+ ),
459
+ "CLI first-run initialized a different model, mode or session",
460
+ );
461
+ const terminals = events.filter((event) => event.type === "result");
462
+ const terminal = terminals[0];
463
+ const knownFailure =
464
+ terminals.length === 1 &&
465
+ events.at(-1) === terminal &&
466
+ terminal.is_error === true &&
467
+ typeof terminal.subtype === "string" &&
468
+ terminal.subtype.length > 0 &&
469
+ terminal.subtype !== "success";
470
+ protocol = {
471
+ ...parsed,
472
+ executionSucceeded:
473
+ parsed.terminalVerified && exit.code === 0 && exit.signal === null,
474
+ executionEvidence: {
475
+ protocol: EVAL_EXECUTION_PROTOCOL,
476
+ exitCode: exit.code,
477
+ signal: exit.signal,
478
+ terminalVerified: parsed.terminalVerified || knownFailure,
479
+ observedFallback: parsed.observedFallback,
480
+ },
481
+ startedAt: invocation.startedAt,
482
+ elapsedMs: epoch(exit.finishedAt) - epoch(invocation.startedAt),
483
+ };
484
+ } else {
485
+ protocol = inspectIdeProtocol(
486
+ JSON.parse(artifact(manifest.protocol, readArtifact).toString("utf8")),
487
+ {
488
+ prompt: task.prompt,
489
+ comparison,
490
+ },
491
+ );
492
+ validateUi(
493
+ JSON.parse(artifact(manifest.ui, readArtifact).toString("utf8")),
494
+ protocol,
495
+ sample.id,
496
+ manifest.observedAt,
497
+ manifest.elapsedMs,
498
+ );
499
+ }
500
+ const check = JSON.parse(
501
+ artifact(manifest.check, readArtifact).toString("utf8"),
502
+ );
503
+ requireValue(
504
+ check.taskId === task.id &&
505
+ check.reviewDigest === preparation.expectedReviewDigest &&
506
+ typeof check.pass === "boolean" &&
507
+ Array.isArray(check.changedFiles) &&
508
+ Array.isArray(check.unrelatedChanges) &&
509
+ check.unrelatedChanges.length === 0 &&
510
+ check.changedFiles.every((file) =>
511
+ reviewed
512
+ .get(task.id)
513
+ .allowedChangedPaths.includes(relativeFile(file)),
514
+ ),
515
+ "independent artifact check is unbound or contains unreviewed edits",
516
+ );
517
+ requireValue(
518
+ !check.pass ||
519
+ task.expectedFiles.every((file) => check.changedFiles.includes(file)),
520
+ "independent check omits required deliverables",
521
+ );
522
+ requireValue(
523
+ check.process?.sourceDigest === reviewed.get(task.id).check.digest &&
524
+ check.process.exitCode === 0 &&
525
+ check.process.signal === null &&
526
+ check.process.error === null,
527
+ "independent artifact check lacks its pinned process receipt",
528
+ );
529
+ const verdict = JSON.parse(check.process.stdout);
530
+ requireValue(
531
+ verdict.pass === check.pass && typeof verdict.detail === "string",
532
+ "check verdict differs from raw process output",
533
+ );
534
+ capturedDiff(
535
+ JSON.parse(artifact(manifest.diff, readArtifact).toString("utf8")),
536
+ reviewed.get(task.id).allowedChangedPaths,
537
+ check.changedFiles,
538
+ );
539
+ requireValue(
540
+ manifest.elapsedMs >= protocol.elapsedMs &&
541
+ epoch(manifest.observedAt) >=
542
+ epoch(protocol.startedAt) + protocol.elapsedMs,
543
+ "host observation precedes protocol completion",
544
+ );
545
+ const result = {
546
+ id: task.id,
547
+ artifactCheckPassed: check.pass,
548
+ executionSucceeded: protocol.executionSucceeded,
549
+ agentOk: protocol.executionSucceeded,
550
+ pass: check.pass && protocol.executionSucceeded,
551
+ error: protocol.executionSucceeded
552
+ ? null
553
+ : "captured agent execution did not succeed",
554
+ detail: String(
555
+ check.detail || "Captured independent artifact acceptance",
556
+ ),
557
+ ms: protocol.elapsedMs,
558
+ usage: protocol.usage,
559
+ totalCostUsd: protocol.totalCostUsd,
560
+ executionEvidence: protocol.executionEvidence,
561
+ changedFiles: check.changedFiles,
562
+ unrelatedChanges: check.unrelatedChanges,
563
+ };
564
+ run = createEvalHistoryRecord(
565
+ {
566
+ results: [result],
567
+ passed: result.pass ? 1 : 0,
568
+ failed: result.pass ? 0 : 1,
569
+ total: 1,
570
+ passRate: result.pass ? 1 : 0,
571
+ unrelatedChangeRate: 0,
572
+ },
573
+ {
574
+ comparison,
575
+ runId: manifest.runId,
576
+ ranAt: protocol.startedAt,
577
+ label: sourceCommit,
578
+ },
579
+ );
580
+ observation.runId = run.runId;
581
+ observation.cost = protocol.totalCostUsd;
582
+ }
583
+ const history = { runs: run ? [run] : [], issues: [] };
584
+ const observations = [observation];
585
+ const report = validateVerify01Collection(bundle, preparation, {
586
+ sampleIds: [sample.id],
587
+ history,
588
+ observations,
589
+ sourceCommit,
590
+ now,
591
+ });
592
+ return {
593
+ scope: "verify01-existing-host-evidence-import",
594
+ productionAttested: false,
595
+ identityVerified: false,
596
+ installationVerified: false,
597
+ billingVerified: false,
598
+ captureDigest: expectedManifestDigest,
599
+ stageReceiptDigests: receiptDigests,
600
+ history,
601
+ observations,
602
+ report,
603
+ };
604
+ }
@@ -1 +0,0 @@
1
- import{I as C,P as c,J as f,U as r,c as h,_ as k,R as n,V as l,K as d,Q as u,S as g,b as t}from"./vendor-Bn1JzzAn.js";import{_ as w}from"./index-DYKSuD02.js";import{aH as j}from"./icons-DG5UD-6K.js";const E={__name:"EmailListRenderer",props:{event:{type:Object,required:!0}},setup(_,{expose:m}){m();const a=_,e=t(()=>a.event.content||{}),i=t(()=>a.event.extra||{}),p=t(()=>e.value.from||e.value.sender||e.value.fromName||a.event.actor||"(未知发件人)"),s=t(()=>e.value.subject||e.value.title||"(无主题)"),y=t(()=>e.value.snippet||e.value.preview||e.value.body?.slice(0,100)||null),b=t(()=>Array.isArray(e.value.attachments)?e.value.attachments.length:typeof e.value.attachmentCount=="number"?e.value.attachmentCount:0),x=t(()=>i.value.category||e.value.category),S=t(()=>e.value.unread===!0),T=t(()=>{if(!a.event.occurredAt)return"";const o=new Date(a.event.occurredAt);return`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")} ${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`}),v={props:a,c:e,e:i,fromText:p,subjectText:s,snippetText:y,attachmentCount:b,category:x,isUnread:S,formattedTime:T,computed:t,get MailOutlined(){return j}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}},M={class:"email-row"},N={class:"left"},O={class:"body"},R={class:"head"},V={class:"from"},A={class:"time"},B={class:"subject"},D={key:0,class:"snippet"},L={class:"meta"};function U(_,m,a,e,i,p){const s=C("a-tag");return c(),f("div",M,[r("div",N,[h(e.MailOutlined,{class:k(["icon",{unread:e.isUnread}])},null,8,["class"])]),r("div",O,[r("div",R,[r("span",V,n(e.fromText),1),r("span",A,n(e.formattedTime),1)]),r("div",B,n(e.subjectText),1),e.snippetText?(c(),f("div",D,n(e.snippetText),1)):l("v-if",!0),r("div",L,[h(s,{color:"blue",class:"src"},{default:d(()=>[u(n(a.event.source.adapter),1)]),_:1}),e.attachmentCount>0?(c(),g(s,{key:0,color:"orange"},{default:d(()=>[u(" 📎 "+n(e.attachmentCount),1)]),_:1})):l("v-if",!0),e.category?(c(),g(s,{key:1},{default:d(()=>[u(n(e.category),1)]),_:1})):l("v-if",!0)])])])}const P=w(E,[["render",U],["__scopeId","data-v-e4ddf632"],["__file","/tmp/cc-web-panel-oQwzER/repo/packages/web-panel/src/components/pdh/renderers/EmailListRenderer.vue"]]);export{P as default};
@@ -1 +0,0 @@
1
- import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-Bn1JzzAn.js";import{_ as v,b as m}from"./index-DYKSuD02.js";import{a8 as y,M}from"./icons-DG5UD-6K.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return M},get FolderOutlined(){return y}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},w={class:"subtitle"},k={class:"explainer"};function T(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",w,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",k,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(B,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-oQwzER/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
@@ -1 +0,0 @@
1
- import{I as h,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as o}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-DYKSuD02.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),w=o(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),b=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:w,formattedTime:b,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},R={class:"row"},V={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},E={class:"val mono"},F={key:1,class:"row"};function M(p,r,a,e,d,m){const c=h("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",R,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",V,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",E,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",F,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const H=S(k,[["render",M],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-oQwzER/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{H as default};