chainlesschain 0.166.69 → 0.166.71

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 (168) hide show
  1. package/README.md +42 -5
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-FhevRfL6.js → AIOps-6n6RPfD2.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-rOeOykx5.js → ActionButton-BRlz1g77.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BK_wYlfz.js → Analytics-BFx6_nNR.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-_2cCtZKV.js → AppLayout-CcbKe_m4.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-D5MSvVzk.js → Artifacts-DlBMxBaf.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-yd-Ah-A3.js → Audit-aqQRi1IW.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-yCaw_Gu_.js → BackgroundAgents-tzAQeiAS.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-G3ADD4N-.js → Backup-C3sLPZvj.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-ByDhkLbF.js → BaseInput-BdqG7xax.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-BMrc7qjz.js → Chat-DXjdkR-r.js} +6 -6
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-B-3SVP-4.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-BHYgyZWA.js → Checkbox-CACOSDhS.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-DJfcy0jC.js → Codegen-ZY0zbHvS.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-C27zROxc.js → Col-C511kzpa.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-CuS5tq_1.js → Community-CIM5EtmR.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BrYJNe7Q.js → Compact-DpTxu8E7.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-8hfahYHT.js → Compliance-Cu42ksf-.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-DdE0n2lp.js → Cowork-BqUbCW9U.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-CUq3aSiX.js → Cron-OXYE4gRs.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BM4XSPWG.js → Crosschain-DPqmhSi6.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-CdaBY57N.js → DID-CPp_yj85.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-Cwtd52So.js → Dashboard-pki3T5PE.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BvlObh6U.js → Dropdown-IyL1RsjP.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-e3fLhjnX.js → EmailListRenderer-6Kbwb4Ux.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-CTtk1Zo8.js → EvolutionSettings-DGBMs24I.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BpPJUnCU.js → FamilyGuardDashboard-CLz3KJvw.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-vzjZ6_nQ.js → Federation-gMDCbNjS.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-DEDNLhkE.js → FormItemContext-bSzQnHE6.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DEl2Te5f.js → GenericCardRenderer-DCyBnm6B.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-BzsYQnCq.js → Git-BKqZtZMD.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-zxJs6Y8s.js → Governance-nZDU4Gz2.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-5JUsrmF1.js → Inference-VodzHgdz.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-Br8b5Htz.js → KnowledgeGraph-DHjlnyh4.js} +1 -1
  36. package/src/assets/web-panel/assets/Logs-CPsAssGM.js +2 -0
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-In4itZX2.js → MarkdownRenderer-ChogLgLv.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-s8MmWkS9.js → Marketplace-Df7Cr8cW.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-Wu-WRg4M.js → McpTools-Dy_V6M2q.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-B_i-eX9w.js → Memory-DjYWvH5O.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-Ca64kjVx.js → MobileBridge-qYw4QwQh.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-DDA7pzJd.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-DKvGmG3y.js → Mtc-BQ2fg2aQ.js} +6 -6
  44. package/src/assets/web-panel/assets/{MtcAudit-BVvWx8pF.js → MtcAudit-CaBVA8Cu.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-wqeJ2O9x.js → Multisig-DsTt5nuM.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-DX87ysYu.js → NLProgramming-CqpsGgiz.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-ChenGdu0.js → Notes-DpRTGRs9.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-BZRa68-x.js → NotificationSettings-CmHeyjUS.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-DZ6xG1M6.js → OrderTableRenderer-D-JBdzGf.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-BWJp4VPX.js → Organization-QL01Gu7d.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-BoM4bYt5.js → Overflow-DjUeTZ69.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-Cvi8YV09.js → P2P-DuM6UaEh.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CNVC1NIj.js → PdhVaultBrowser-BsL5CbMs.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-DNd1MRjW.js → Permissions-Cfu4vMf9.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-DGSBYZ5-.js → PersonalDataHub-HvEGAMl5.js} +5 -5
  56. package/src/assets/web-panel/assets/{Pipeline-DkcoGMBo.js → Pipeline-_CZIYXJs.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DltwvMAW.js → Privacy-C6bTNjwi.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-ChYbpHg8.js → ProjectInit-D64UJRfZ.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-B8FWiHTJ.js → ProjectSettings-CSTAzKVe.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-DuyhtSm4.js → Projects-BudNMgcm.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-Bo18Tx_6.js → Providers-C7ddN75H.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-6W85KlsG.js → QrScannerModal-CtsMC0eH.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DznRUedP.js → QuickAsk-iE7xKI4P.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-CQDN3_p-.js → Recommend-5FCqoy3g.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-CiJgokEj.js → RemoteSession-DtX0VARB.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-DexzGH7E.js → Reputation-Hd4dH5ci.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-BgZOIvSi.js → Row-CnLRjeGC.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-BWIZJ_Jr.js → RssFeed-Ds43ubF9.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-B376EwWJ.js → Search-BmXOdvpt.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-92mUR5OD.js → Security--yQqv9yt.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-ClSEAOHk.js → Services-CNNPxlyA.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DVhLbv99.js → Skeleton-DPmZAdDN.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-JTcXs_xI.js → Skills-Va_WxW7s.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DnKY9zy9.js → Sla-BZoRsy3v.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-GO1JefAH.js → SpeechSettings-XgRV95VE.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-jX5tB2St.js → SyncSettings-Dr7NXCEw.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-BxRBzhUc.js → Tasks-j-xRo5_-.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-CAVkbTG1.js → Templates-BJSqGQuB.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-5Y7sHBkz.js → Tenant-zuVl_JY7.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-CbbLShYb.js → Terminal-B-xNbgfG.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-2HptWihL.js → TimelineRenderer-BtZQpa0b.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-B-jGxzHl.js → Tokens-CXGqGXWd.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-9DGa90DT.js → Trigger-CtDmejyH.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BSJEkEOO.js → Trust-BfDvBu2B.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-C807So5R.js → UkeySign-CgHq72xW.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-ByiieAv-.js → VideoEditing-pRBMqiGT.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-BixbIOUv.js → Wallet-DHhZSHFo.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-z7akhor4.js → WebAuthn-C-PDGO1-.js} +4 -4
  89. package/src/assets/web-panel/assets/{WorkflowEditor-KvijuUuR.js → WorkflowEditor-Dqrh4ooE.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-BYKoh0YG.js → chat-Du4rhkgo.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-CLT8IYBt.js → colors-CVVon0Yw.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-DlBIyYHF.js → compact-item-zcQv_R_9.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-5XmAnNLr.js → createContext-UfW2PpZM.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-CoA1apwL.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-rPdRhm7K.js → hasIn-Dko6kq4D.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-ChlzaTV3.js → index-0d3V2fKV.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-8un-eUDI.js → index-4YoVVwaY.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DZiSMYoD.js → index-5UfwyzQV.js} +3 -3
  99. package/src/assets/web-panel/assets/{index-Bve7Wsgf.js → index-7aNfa1q3.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-B1VfBUPB.js → index-B8nu6_LV.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DI_tYFBe.js → index-BEOOJevs.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-kx6zDWew.js → index-BHq5RTAk.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DIVrVGvf.js → index-BPE8w-x1.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DW8vozBS.js → index-BPTQ-SUp.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DPS4mWnI.js → index-BR5eNU_w.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DZjGcIGU.js → index-BXqsNksk.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-b-rQCMkx.js → index-BoQJIWkq.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-D3-NL-x-.js → index-BolCTH1Q.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-akwXS-FF.js → index-BwcE8uKT.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BIRl2Ii5.js → index-CJ72HeXg.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Djd7uqwM.js → index-CPqtDZE1.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C2sFDVb_.js → index-CV8kORgq.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Bzd0sFkp.js → index-CoXowCMA.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-rRuCGdKW.js → index-CrURt95p.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CY6TMc2m.js → index-CrbxgYRx.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DuvweiCz.js → index-Cs4qAz6z.js} +1 -1
  117. package/src/assets/web-panel/assets/index-CsR4S29Z.js +1 -0
  118. package/src/assets/web-panel/assets/{index-eHbr3f5I.js → index-D4-E1s34.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-LKT-Ol0A.js → index-DIFh_pNy.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BgevTkUv.js → index-DKAB6MRs.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BDtlwjSr.js → index-DMdBtncl.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DzExCCLS.js → index-DMxhURG4.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-D3f9Jzx2.js → index-Dgu3vko5.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BBt2CSAx.js → index-Dh1USRx7.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DqZU4_7J.js → index-DhYE_jVw.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Dea32nOK.js → index-Dkc1L9vQ.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CsnbOKdI.js → index-DqQhty7h.js} +1 -1
  128. package/src/assets/web-panel/assets/index-DvcAyRFh.js +1 -0
  129. package/src/assets/web-panel/assets/{index-DTslLzPJ.js → index-Dviw8PsD.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Dntid6oj.js → index-DwXm_6Df.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CM_a9spK.js → index-UzXoeYbz.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-B-0nAxf5.js → index-ija7mc1b.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DCDSycWo.js → index-jjgfplWj.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CErvHCDe.js → index-ubMuGX5r.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-a8411LiK.js → initDefaultProps-DvSMOW2m.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-oVcQdpCm.js → motion-C7PjuFda.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-B-eyzzzL.js → move-qsgDmMqu.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-BCYIxuG7.js → mtc-parser-D7qHulCC.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-DuFtWiYh.js → omit-g_tGmcIM.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-CVAoJhGu.js → pickAttrs-DGs-br4p.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-Y2iub2bO.js → placementArrow-A1KZT5yH.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BHenWIVD.js → responsiveObserve-B98U6Yi5.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-CKrMaL29.js → slide-Y5Q6ixV9.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-w8eb_1da.js → statusUtils-CVC7D579.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CCVi_Ww3.js → styleChecker-CDWAgZKa.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-BsmR_q0r.js → useFlexGapSupport-C0UFofSm.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-a8GMBjnc.js → useFs-BHEf6SSo.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BMUYSPn-.js → usePersonalDataHub-Bb2M_BPj.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-DL2pI31V.js → vnode-DENyLaXR.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-Cbi8fISi.js → zoom-BUOUP8-I.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/agent.js +97 -0
  154. package/src/data/changelog.json +26 -0
  155. package/src/lib/decision-layer/benchmark.js +164 -0
  156. package/src/lib/decision-layer/contracts.js +377 -0
  157. package/src/lib/decision-layer/provider-authority.js +44 -0
  158. package/src/lib/decision-layer/providers.js +150 -0
  159. package/src/lib/decision-layer/runtime.js +238 -0
  160. package/src/lib/decision-layer/typesafe-provider.js +16 -0
  161. package/src/runtime/agent-core.js +49 -0
  162. package/src/runtime/headless-runner.js +88 -0
  163. package/src/assets/web-panel/assets/ChatBubbleRenderer-nA7n0I6S.js +0 -1
  164. package/src/assets/web-panel/assets/Logs-D-tubDMJ.js +0 -2
  165. package/src/assets/web-panel/assets/MobileProjects-Cq9AFiO4.js +0 -1
  166. package/src/assets/web-panel/assets/devWarning-BmcCIHwY.js +0 -1
  167. package/src/assets/web-panel/assets/index-DY8rmd6x.js +0 -1
  168. package/src/assets/web-panel/assets/index-sbwcUeRS.js +0 -1
@@ -0,0 +1,238 @@
1
+ import { randomUUID } from "node:crypto";
2
+
3
+ import { runMeteredDirectModelCall } from "../direct-model-usage.js";
4
+ import { isTerminalModelFailure } from "../model-failure-policy.js";
5
+ import { markRuntimeLedgerPersistenceError } from "../runtime-usage-ledger.js";
6
+ import {
7
+ createSkillDecisionRequest,
8
+ decisionDigest,
9
+ normalizeDecisionMode,
10
+ normalizeSkillDecisionProviderResult,
11
+ resolveSkillDecision,
12
+ SKILL_DECISION_OBSERVATION_SCHEMA,
13
+ } from "./contracts.js";
14
+ import { captureDecisionProviderAuthority } from "./provider-authority.js";
15
+
16
+ export const SKILL_DECISION_RUNTIME_SCHEMA =
17
+ "chainlesschain.skill-decision-runtime/v1";
18
+
19
+ const RUNTIMES = new WeakSet();
20
+ const DEFAULT_TIMEOUT_MS = 800;
21
+
22
+ function requiredText(value, label, maximum = 256) {
23
+ if (
24
+ typeof value !== "string" ||
25
+ value.trim() === "" ||
26
+ value.length > maximum ||
27
+ /\p{Cc}/u.test(value)
28
+ ) {
29
+ throw new TypeError(`${label} is required and bounded`);
30
+ }
31
+ return value.trim();
32
+ }
33
+
34
+ function timeoutSignal(signal, timeoutMs) {
35
+ const deadline = AbortSignal.timeout(timeoutMs);
36
+ return signal ? AbortSignal.any([signal, deadline]) : deadline;
37
+ }
38
+
39
+ function projectUnavailable(error) {
40
+ if (error?.name === "TimeoutError") return "provider-timeout";
41
+ if (error?.code === "CC_DECISION_PROVIDER_HTTP_ERROR") {
42
+ return "provider-http-error";
43
+ }
44
+ return "provider-unavailable";
45
+ }
46
+
47
+ function asPersistenceError(error) {
48
+ if (error?.runtimeLedgerPersistence === true) return error;
49
+ try {
50
+ return markRuntimeLedgerPersistenceError(error);
51
+ } catch {
52
+ return markRuntimeLedgerPersistenceError(
53
+ new Error("decision observation persistence failed", { cause: error }),
54
+ );
55
+ }
56
+ }
57
+
58
+ export function createSkillDecisionRuntime({
59
+ mode = "off",
60
+ tenantId = null,
61
+ sessionId = null,
62
+ provider = null,
63
+ persist = null,
64
+ observe = null,
65
+ sessionBudget = null,
66
+ thresholds = {},
67
+ timeoutMs = DEFAULT_TIMEOUT_MS,
68
+ idGenerator = () => randomUUID(),
69
+ now = () => new Date(),
70
+ } = {}) {
71
+ const normalizedMode = normalizeDecisionMode(mode);
72
+ if (
73
+ !Number.isSafeInteger(timeoutMs) ||
74
+ timeoutMs < 50 ||
75
+ timeoutMs > 30_000
76
+ ) {
77
+ throw new TypeError(
78
+ "decision timeout must be an integer from 50 to 30000 ms",
79
+ );
80
+ }
81
+ if (typeof idGenerator !== "function" || typeof now !== "function") {
82
+ throw new TypeError("decision runtime generators must be functions");
83
+ }
84
+ let providerAuthority = null;
85
+ let boundTenantId = null;
86
+ let boundSessionId = null;
87
+ if (normalizedMode !== "off") {
88
+ providerAuthority = captureDecisionProviderAuthority(provider);
89
+ boundTenantId = requiredText(tenantId, "tenantId");
90
+ boundSessionId = requiredText(sessionId, "sessionId");
91
+ if (typeof persist !== "function" || typeof observe !== "function") {
92
+ throw new TypeError(
93
+ "enabled decision runtime requires usage and observation persistence",
94
+ );
95
+ }
96
+ }
97
+
98
+ const writeObservation = async (observation) => {
99
+ if (normalizedMode === "off") return;
100
+ try {
101
+ await observe(observation);
102
+ } catch (error) {
103
+ throw asPersistenceError(error);
104
+ }
105
+ };
106
+
107
+ const runtime = Object.freeze({
108
+ schema: SKILL_DECISION_RUNTIME_SCHEMA,
109
+ mode: normalizedMode,
110
+ tenantId: boundTenantId,
111
+ sessionId: boundSessionId,
112
+ suggest: async ({
113
+ query,
114
+ candidates,
115
+ turnId,
116
+ contextRevision,
117
+ signal,
118
+ } = {}) => {
119
+ if (normalizedMode === "off") {
120
+ return Object.freeze({
121
+ schema: SKILL_DECISION_OBSERVATION_SCHEMA,
122
+ mode: normalizedMode,
123
+ status: "disabled",
124
+ visible: false,
125
+ });
126
+ }
127
+ if (signal?.aborted) throw signal.reason;
128
+ const decisionId = `skill-${requiredText(idGenerator(), "decisionId")}`;
129
+ const request = createSkillDecisionRequest({
130
+ decisionId,
131
+ tenantId: boundTenantId,
132
+ sessionId: boundSessionId,
133
+ turnId,
134
+ query,
135
+ candidates,
136
+ contextRevision,
137
+ });
138
+ const startedAt = now();
139
+ if (
140
+ !(startedAt instanceof Date) ||
141
+ !Number.isFinite(startedAt.getTime())
142
+ ) {
143
+ throw new TypeError("decision runtime clock returned an invalid date");
144
+ }
145
+ let outcome;
146
+ try {
147
+ const raw = await runMeteredDirectModelCall({
148
+ sessionId: boundSessionId,
149
+ persist,
150
+ provider: providerAuthority.provider,
151
+ model: providerAuthority.model,
152
+ source: "model",
153
+ operationId: `decision:${decisionId}`,
154
+ sessionBudget,
155
+ call: () =>
156
+ providerAuthority.decide(request, {
157
+ signal: timeoutSignal(signal, timeoutMs),
158
+ }),
159
+ });
160
+ const normalized = normalizeSkillDecisionProviderResult(request, raw);
161
+ const resolved = resolveSkillDecision(request, normalized, thresholds);
162
+ outcome = {
163
+ status: resolved.status,
164
+ reasonCode: resolved.reasonCode,
165
+ selectedCandidateId: resolved.selectedCandidateId,
166
+ selectedDigest: resolved.selectedDigest,
167
+ selectedSkillId: resolved.selectedSkillId,
168
+ needsSkillProbability: resolved.needsSkillProbability,
169
+ choiceConfidence: resolved.choiceConfidence,
170
+ resultDigest: resolved.resultDigest,
171
+ };
172
+ } catch (error) {
173
+ if (signal?.aborted || isTerminalModelFailure(error)) throw error;
174
+ outcome = {
175
+ status: "unavailable",
176
+ reasonCode: projectUnavailable(error),
177
+ selectedCandidateId: null,
178
+ selectedDigest: null,
179
+ selectedSkillId: null,
180
+ needsSkillProbability: null,
181
+ choiceConfidence: null,
182
+ resultDigest: null,
183
+ };
184
+ }
185
+ const finishedAt = now();
186
+ if (
187
+ !(finishedAt instanceof Date) ||
188
+ !Number.isFinite(finishedAt.getTime())
189
+ ) {
190
+ throw new TypeError("decision runtime clock returned an invalid date");
191
+ }
192
+ const observationCore = {
193
+ schema: SKILL_DECISION_OBSERVATION_SCHEMA,
194
+ decisionId,
195
+ mode: normalizedMode,
196
+ tenantId: boundTenantId,
197
+ sessionId: boundSessionId,
198
+ turnId: request.binding.turnId,
199
+ requestDigest: request.requestDigest,
200
+ candidateSetDigest: request.candidateSetDigest,
201
+ provider: providerAuthority.provider,
202
+ model: providerAuthority.model,
203
+ status: outcome.status,
204
+ reasonCode: outcome.reasonCode,
205
+ selectedDigest: outcome.selectedDigest,
206
+ resultDigest: outcome.resultDigest,
207
+ startedAt: startedAt.toISOString(),
208
+ finishedAt: finishedAt.toISOString(),
209
+ latencyMs: Math.max(0, finishedAt.getTime() - startedAt.getTime()),
210
+ };
211
+ const observation = Object.freeze({
212
+ ...observationCore,
213
+ observationDigest: decisionDigest(
214
+ SKILL_DECISION_OBSERVATION_SCHEMA,
215
+ observationCore,
216
+ ),
217
+ });
218
+ await writeObservation(observation);
219
+ return Object.freeze({
220
+ schema: SKILL_DECISION_OBSERVATION_SCHEMA,
221
+ decisionId,
222
+ mode: normalizedMode,
223
+ visible: normalizedMode === "suggest",
224
+ receiptRef: observation.observationDigest,
225
+ ...outcome,
226
+ });
227
+ },
228
+ });
229
+ RUNTIMES.add(runtime);
230
+ return runtime;
231
+ }
232
+
233
+ export function captureSkillDecisionRuntime(value) {
234
+ if (!RUNTIMES.has(value)) {
235
+ throw new TypeError("a branded Skill decision runtime is required");
236
+ }
237
+ return value;
238
+ }
@@ -0,0 +1,16 @@
1
+ import { createDecisionProvider } from "./providers.js";
2
+
3
+ export function createTypeSafeDecisionProvider({
4
+ apiKey,
5
+ baseUrl,
6
+ model,
7
+ fetchImpl,
8
+ } = {}) {
9
+ return createDecisionProvider({
10
+ provider: "typesafe",
11
+ apiKey,
12
+ baseUrl,
13
+ model,
14
+ fetchImpl,
15
+ });
16
+ }
@@ -86,6 +86,7 @@ import {
86
86
  import { getPlanModeManager } from "../lib/plan-mode.js";
87
87
  import { CLISkillLoader } from "../lib/skill-loader.js";
88
88
  import { routeSkillDescriptors } from "../lib/skill-retrieval-router.js";
89
+ import { captureSkillDecisionRuntime } from "../lib/decision-layer/runtime.js";
89
90
  import { resolveSkillOutcomeAuthority } from "../lib/skill-outcome-authority.js";
90
91
  import {
91
92
  captureSkillVectorAuthority,
@@ -3629,6 +3630,7 @@ export async function executeTool(name, args, context = {}) {
3629
3630
  skillAllowlist: context.skillAllowlist ?? null,
3630
3631
  skillOutcomeIndex: context.skillOutcomeIndex,
3631
3632
  skillVectorAuthority: context.skillVectorAuthority,
3633
+ skillDecisionRuntime: context.skillDecisionRuntime,
3632
3634
  skillRuntimeAdmission: context.skillRuntimeAdmission,
3633
3635
  skillRuntimeAdmissionRequired: context.skillRuntimeAdmissionRequired,
3634
3636
  skillRetrievalRevocationReader: context.skillRetrievalRevocationReader,
@@ -5184,6 +5186,7 @@ async function executeToolInner(
5184
5186
  skillAllowlist = null,
5185
5187
  skillOutcomeIndex,
5186
5188
  skillVectorAuthority,
5189
+ skillDecisionRuntime,
5187
5190
  skillRuntimeAdmission,
5188
5191
  skillRuntimeAdmissionRequired = false,
5189
5192
  skillRetrievalRevocationReader,
@@ -8622,6 +8625,45 @@ async function executeToolInner(
8622
8625
  skills = routing.candidates
8623
8626
  .map(({ digest }) => byDigest.get(digest))
8624
8627
  .filter(Boolean);
8628
+ const decisionRuntime =
8629
+ skillDecisionRuntime == null
8630
+ ? null
8631
+ : captureSkillDecisionRuntime(skillDecisionRuntime);
8632
+ if (decisionRuntime !== null && routing.candidates.length > 0) {
8633
+ const decision = await decisionRuntime.suggest({
8634
+ query: args.query,
8635
+ candidates: routing.candidates.slice(0, 5).map((candidate) => {
8636
+ const descriptor = byDigest.get(candidate.digest);
8637
+ return {
8638
+ id: candidate.id,
8639
+ displayName: candidate.displayName,
8640
+ description: descriptor?.description || candidate.displayName,
8641
+ category: candidate.category,
8642
+ digest: candidate.digest,
8643
+ tags: Array.isArray(descriptor?.tags) ? descriptor.tags : [],
8644
+ };
8645
+ }),
8646
+ turnId: turnId || toolCallId || "list-skills",
8647
+ contextRevision: "skill-routing-v1",
8648
+ signal,
8649
+ });
8650
+ if (decision.visible) {
8651
+ routing = Object.freeze({
8652
+ ...routing,
8653
+ decisionSuggestion: Object.freeze({
8654
+ schema: decision.schema,
8655
+ decisionId: decision.decisionId,
8656
+ status: decision.status,
8657
+ reasonCode: decision.reasonCode,
8658
+ selectedDigest: decision.selectedDigest,
8659
+ selectedSkillId: decision.selectedSkillId,
8660
+ needsSkillProbability: decision.needsSkillProbability,
8661
+ choiceConfidence: decision.choiceConfidence,
8662
+ receiptRef: decision.receiptRef,
8663
+ }),
8664
+ });
8665
+ }
8666
+ }
8625
8667
  }
8626
8668
  skillLoader.recordDescriptorUse?.(skills, {
8627
8669
  sessionId,
@@ -8641,6 +8683,9 @@ async function executeToolInner(
8641
8683
  vectorAuthority:
8642
8684
  vector?.evidence ?? unavailableSkillVectorEvidence(),
8643
8685
  outcomeAuthority: outcomeAuthority.evidence,
8686
+ ...(routing.decisionSuggestion
8687
+ ? { decisionSuggestion: routing.decisionSuggestion }
8688
+ : {}),
8644
8689
  },
8645
8690
  }
8646
8691
  : {}),
@@ -14029,6 +14074,10 @@ export async function* agentLoop(messages, options) {
14029
14074
  : _defaultSkillLoader),
14030
14075
  skillOutcomeIndex: options.skillOutcomeIndex,
14031
14076
  skillVectorAuthority: options.skillVectorAuthority,
14077
+ skillDecisionRuntime:
14078
+ options.skillDecisionRuntime == null
14079
+ ? null
14080
+ : captureSkillDecisionRuntime(options.skillDecisionRuntime),
14032
14081
  skillRuntimeAdmission: options.skillRuntimeAdmission,
14033
14082
  skillRuntimeAdmissionRequired: options.skillRuntimeAdmissionRequired,
14034
14083
  skillRetrievalRevocationReader: options.skillRetrievalRevocationReader,
@@ -217,6 +217,12 @@ import {
217
217
  } from "../lib/runtime-usage-ledger.js";
218
218
  import { runMeteredDirectModelCall } from "../lib/direct-model-usage.js";
219
219
  import { resolveTeamMessageToolBundle } from "../lib/agent-team/team-message-tools.js";
220
+ import { normalizeDecisionMode } from "../lib/decision-layer/contracts.js";
221
+ import { createSkillDecisionRuntime } from "../lib/decision-layer/runtime.js";
222
+ import {
223
+ createDecisionProvider,
224
+ resolveDecisionProviderOptions,
225
+ } from "../lib/decision-layer/providers.js";
220
226
 
221
227
  /**
222
228
  * Normalize a public --permission-mode spelling to the canonical internal mode.
@@ -248,6 +254,37 @@ export function validateHeadlessInvocationOptions(options = {}) {
248
254
  );
249
255
  }
250
256
  normalizePermissionMode(options.permissionMode);
257
+ resolveHeadlessSkillDecisionOptions(options);
258
+ }
259
+
260
+ /** Normalize the opt-in typed Skill-routing experiment without acquiring egress. */
261
+ export function resolveHeadlessSkillDecisionOptions(options = {}) {
262
+ let mode;
263
+ try {
264
+ mode = normalizeDecisionMode(options.decisionMode || "off");
265
+ } catch {
266
+ throw new Error(
267
+ `Invalid --decision-mode "${options.decisionMode}". Expected one of: off, shadow, suggest`,
268
+ );
269
+ }
270
+ const timeoutMs =
271
+ options.decisionTimeoutMs === undefined
272
+ ? 800
273
+ : Number(options.decisionTimeoutMs);
274
+ if (
275
+ !Number.isSafeInteger(timeoutMs) ||
276
+ timeoutMs < 50 ||
277
+ timeoutMs > 30_000
278
+ ) {
279
+ throw new Error(
280
+ "Invalid --decision-timeout-ms. Expected an integer from 50 to 30000",
281
+ );
282
+ }
283
+ return Object.freeze({
284
+ mode,
285
+ ...resolveDecisionProviderOptions(options),
286
+ timeoutMs,
287
+ });
251
288
  }
252
289
 
253
290
  /**
@@ -488,6 +525,7 @@ async function withHeadlessSessionHostLease(options, deps, task) {
488
525
  `Invalid --output-format "${outputFormat}". Expected one of: ${VALID_OUTPUT_FORMATS.join(", ")}`,
489
526
  );
490
527
  }
528
+ const skillDecision = resolveHeadlessSkillDecisionOptions(options);
491
529
  let resolution = null;
492
530
  let lease = null;
493
531
  let budgetRoot = null;
@@ -518,6 +556,22 @@ async function withHeadlessSessionHostLease(options, deps, task) {
518
556
  },
519
557
  `headless-${Date.now()}-${process.pid}`,
520
558
  );
559
+ if (skillDecision.mode !== "off" && !resolution.persist) {
560
+ throw new Error(
561
+ "--decision-mode shadow/suggest requires a durable session; use --session/--resume/--continue and do not use --ephemeral",
562
+ );
563
+ }
564
+ if (
565
+ skillDecision.mode !== "off" &&
566
+ skillDecision.provider === "typesafe" &&
567
+ !deps.decisionProvider &&
568
+ !options.decisionApiKey &&
569
+ !process.env.TYPESAFE_API_KEY
570
+ ) {
571
+ throw new Error(
572
+ "TYPESAFE_API_KEY is required when --decision-mode is shadow or suggest",
573
+ );
574
+ }
521
575
  const authoritySessionId =
522
576
  resolution.resumeId ||
523
577
  (resolution.persist ? resolution.sessionId : null);
@@ -2386,6 +2440,39 @@ async function runAgentHeadlessInWorkspace(
2386
2440
  }
2387
2441
  };
2388
2442
 
2443
+ const skillDecisionOptions = resolveHeadlessSkillDecisionOptions(options);
2444
+ let skillDecisionRuntime = null;
2445
+ if (skillDecisionOptions.mode !== "off") {
2446
+ const decisionProvider =
2447
+ deps.decisionProvider ||
2448
+ createDecisionProvider({
2449
+ provider: skillDecisionOptions.provider,
2450
+ apiKey:
2451
+ options.decisionApiKey ||
2452
+ (skillDecisionOptions.provider === "typesafe"
2453
+ ? process.env.TYPESAFE_API_KEY
2454
+ : process.env.DECISION_API_KEY) ||
2455
+ undefined,
2456
+ baseUrl: skillDecisionOptions.baseUrl,
2457
+ model: skillDecisionOptions.model,
2458
+ ...(deps.decisionFetch ? { fetchImpl: deps.decisionFetch } : {}),
2459
+ });
2460
+ const persistDecisionEvent = (type, data) =>
2461
+ persistRuntimeLedgerWrite(() => store.appendEvent(sessionId, type, data));
2462
+ skillDecisionRuntime = createSkillDecisionRuntime({
2463
+ mode: skillDecisionOptions.mode,
2464
+ tenantId:
2465
+ options.decisionTenantId || evolutionIngress?.tenantId || "cli-local",
2466
+ sessionId,
2467
+ provider: decisionProvider,
2468
+ persist: persistDecisionEvent,
2469
+ observe: (observation) =>
2470
+ persistDecisionEvent("skill_decision_observation", observation),
2471
+ sessionBudget: options.sessionBudget || null,
2472
+ timeoutMs: skillDecisionOptions.timeoutMs,
2473
+ });
2474
+ }
2475
+
2389
2476
  // Subagent internals may contain prompts and tool results. The public
2390
2477
  // stream exposes only stable lifecycle/progress metadata, and only with the
2391
2478
  // explicit --include-hook-events opt-in.
@@ -2513,6 +2600,7 @@ async function runAgentHeadlessInWorkspace(
2513
2600
  apiKey,
2514
2601
  cwd,
2515
2602
  skillLoader: _runtimeSkillLoader,
2603
+ ...(skillDecisionRuntime === null ? {} : { skillDecisionRuntime }),
2516
2604
  ...captureSkillRuntimeDependencies(options, evolutionIngress?.tenantId),
2517
2605
  ...(skillOutcomeIndex === null ? {} : { skillOutcomeIndex }),
2518
2606
  ...(skillVectorAuthority === null ? {} : { skillVectorAuthority }),
@@ -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-DZiSMYoD.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(),g=String(e.getMonth()+1).padStart(2,"0"),f=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${g}-${f} ${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"},q={class:"meta"},D={class:"actor"},M={class:"time"},R={class:"body"};function V(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",q,[s("span",D,a(r.actorLabel),1),s("span",M,a(r.formattedTime),1)]),s("div",R,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 z=k(N,[["render",V],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-Dnqztg/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{z as default};
@@ -1,2 +0,0 @@
1
- import{I as s,J as g,U as d,c as o,K as _,V as k,S as W,R as S,F as K,Z as Q,w as M,n as C,o as R,b as T,r,P as p,Q as O,_ as U}from"./vendor-Bn1JzzAn.js";import{_ as q,u as N}from"./index-DZiSMYoD.js";import{R as z}from"./icons-DG5UD-6K.js";const D={__name:"Logs",setup(V,{expose:a}){a();const x=N(),e=r("status"),y=r(!1),v=r(""),i=r(""),c=r(""),f=r(!0),n=r(null),h={status:"status",doctor:"doctor","skill-sources":"skill sources","llm-providers":"llm providers"},m=T(()=>i.value.split(`
2
- `)),b=T(()=>{if(!c.value)return m.value;const t=c.value.toLowerCase();return m.value.filter(u=>u.toLowerCase().includes(t))});function L(t){return t.includes("✖")||t.includes("error")||t.includes("Error")||t.includes("failed")?"line-error":t.includes("✔")||t.includes("✓")||t.includes("success")||t.includes("running")?"line-success":t.includes("warn")||t.includes("Warn")||t.includes("○")?"line-warn":t.startsWith(" ")||t.startsWith(" ")?"line-indent":""}function l(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function w(t){if(!c.value)return t;const u=c.value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return t.replace(new RegExp(`(${u})`,"gi"),"<mark>$1</mark>")}async function B(){y.value=!0,v.value="",i.value="";const t=h[e.value]||"status";try{const{output:u}=await x.execute(t,3e4);i.value=u,f.value&&(await C(),n.value&&(n.value.scrollTop=n.value.scrollHeight))}catch(u){v.value=`执行失败: ${u.message}`,i.value=v.value}finally{y.value=!1}}M(b,async()=>{f.value&&(await C(),n.value&&(n.value.scrollTop=n.value.scrollHeight))}),R(B);const H={ws:x,activeTab:e,loading:y,error:v,rawOutput:i,searchQuery:c,autoScroll:f,logContainer:n,TAB_COMMANDS:h,allLines:m,filteredLines:b,lineClass:L,escapeHtml:l,highlightSearch:w,loadLog:B,ref:r,computed:T,watch:M,nextTick:C,onMounted:R,get ReloadOutlined(){return z},get useWsStore(){return N}};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}},E={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},j={style:{display:"flex",gap:"10px",margin:"12px 0"}},A={ref:"logContainer",class:"log-box"},F={key:0,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},I={key:1,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},P={key:2},J=["innerHTML"];function Z(V,a,x,e,y,v){const i=s("a-checkbox"),c=s("a-button"),f=s("a-space"),n=s("a-tab-pane"),h=s("a-tabs"),m=s("a-input-search"),b=s("a-tag"),L=s("a-spin");return p(),g("div",null,[d("div",E,[a[5]||(a[5]=d("div",null,[d("h2",{class:"page-title"},"日志查看"),d("p",{class:"page-sub"},"系统运行日志与诊断输出")],-1)),o(f,null,{default:_(()=>[o(i,{checked:e.autoScroll,"onUpdate:checked":a[0]||(a[0]=l=>e.autoScroll=l)},{default:_(()=>[...a[3]||(a[3]=[O("自动滚动",-1)])]),_:1},8,["checked"]),o(c,{type:"primary",ghost:"",loading:e.loading,onClick:e.loadLog},{icon:_(()=>[o(e.ReloadOutlined)]),default:_(()=>[a[4]||(a[4]=O(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),k(" Tab Selector "),o(h,{activeKey:e.activeTab,"onUpdate:activeKey":a[1]||(a[1]=l=>e.activeTab=l),onChange:e.loadLog,style:{"margin-bottom":"0"}},{default:_(()=>[o(n,{key:"status",tab:"系统状态"}),o(n,{key:"doctor",tab:"环境诊断"}),o(n,{key:"skill-sources",tab:"技能来源"}),o(n,{key:"llm-providers",tab:"LLM 提供商"})]),_:1},8,["activeKey"]),k(" Search Bar "),d("div",j,[o(m,{value:e.searchQuery,"onUpdate:value":a[2]||(a[2]=l=>e.searchQuery=l),placeholder:"搜索日志内容...","allow-clear":"",style:{flex:"1"}},null,8,["value"]),e.filteredLines.length!==e.allLines.length?(p(),W(b,{key:0,color:"blue"},{default:_(()=>[O(S(e.filteredLines.length)+" / "+S(e.allLines.length)+" 行 ",1)]),_:1})):k("v-if",!0)]),k(" Log Output "),d("div",A,[e.loading?(p(),g("div",F,[o(L,{size:"large"}),a[6]||(a[6]=d("div",{style:{"margin-top":"10px"}},"加载中...",-1))])):e.filteredLines.length?(p(),g("div",P,[(p(!0),g(K,null,Q(e.filteredLines,(l,w)=>(p(),g("div",{key:w,class:U(["log-line",e.lineClass(l)]),innerHTML:e.highlightSearch(e.escapeHtml(l))},null,10,J))),128))])):(p(),g("div",I,S(e.error||"暂无日志内容,点击刷新加载"),1))],512)])}const $=q(D,[["render",Z],["__scopeId","data-v-8c2906e0"],["__file","/tmp/cc-web-panel-Dnqztg/repo/packages/web-panel/src/views/Logs.vue"]]);export{$ 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-DZiSMYoD.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"},k={class:"subtitle"},w={class:"explainer"};function D(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",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[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",D],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-Dnqztg/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-DZiSMYoD.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-BgZOIvSi.js";import{a0 as t}from"./index-DZiSMYoD.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-BHenWIVD.js";import"./useFlexGapSupport-BsmR_q0r.js";import"./styleChecker-CCVi_Ww3.js";import"./index-DuvweiCz.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-C27zROxc.js";import{a0 as t}from"./index-DZiSMYoD.js";import"./vendor-Bn1JzzAn.js";import"./index-DuvweiCz.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};