chainlesschain 0.166.48 → 0.166.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BLGEffkh.js → AIOps-CBFnwYRX.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Cz1z2VGD.js → ActionButton-Sl4eXWpR.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C3j9cf6q.js → Analytics-DB0lD9Kb.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BR9ERuCA.js → AppLayout-j77EmkRK.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-CozJCm4y.js → Artifacts-CU3izCW9.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DC5g9Ra2.js → Audit-C44fSibb.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-B1zrQ0dW.js → BackgroundAgents-pM_NnJW3.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-ChVnfjpm.js → Backup-AOHXqhxN.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-8_vLQsLf.js → BaseInput-DaYc8oA_.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Dct9bm6L.js → Chat-CmlCAXxW.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BvoSsCKh.js → ChatBubbleRenderer-CkCSkJDJ.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DZQIsCIC.js → Checkbox-DISI7iaA.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CdzHxmnq.js → Codegen-BYpeKUpf.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DdAN8LeW.js → Col-Dk6VwWGq.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CNgjT9MA.js → Community-BDyTedMu.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BtQiX6G-.js → Compact-CTNlGM9X.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-OGX5ma3j.js → Compliance-C_tw3IdT.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CgugQnGM.js → Cowork-cduHWEmo.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Bpg7cPFD.js → Cron-Dqotjv-s.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D1hsuswf.js → Crosschain-ByW7RsJQ.js} +1 -1
- package/src/assets/web-panel/assets/{DID-miDRsMBw.js → DID-BI-lafPj.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CGcl8htP.js → Dashboard-8m50TRZL.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BFaxTdVE.js → Dropdown-CN3hmRTc.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BQdGLZIO.js → EmailListRenderer-t0lzxsDT.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-DabpA3cQ.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-c1WVC_--.js → FamilyGuardDashboard-BYN4UshY.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DyAcFrQY.js → Federation-n44OtIXp.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CfwpfD2B.js → FormItemContext-B-WXDu_I.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DkJcbBpS.js → GenericCardRenderer-Bm7v-mTf.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DgYIrPJh.js → Git-BMIS6sbo.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BF1tYPJ6.js → Governance-B1EhHobE.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BFkwRIrU.js → Inference-Dy_HJWHo.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DpCoqhBa.js → KnowledgeGraph-BVdfUbZy.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DU2qAJmD.js → Logs-Dph_oLQk.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-CNHYqcxm.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Dz9NUrfo.js → Marketplace-Bw4HWORj.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-B67I3d5v.js → McpTools-Be6DPfA1.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-crkElJSy.js → Memory-DlvLafC9.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BO20VbdX.js → MobileBridge-Upc_Jwlt.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Ba-3gZZd.js → MobileProjects-I17jrUbY.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BAHZM084.js → Mtc-DyBzY0GH.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CL3DzajL.js → MtcAudit-2-7xAwEo.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BSWWzvWH.js → Multisig-DtUZpFmZ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-fnxqXM_3.js → NLProgramming-iInH7jBr.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-qUZPIQXT.js → Notes-BO3Z3vaS.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-x9Xrixqu.js → NotificationSettings-ClX_0jFE.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BtMtQUt7.js → OrderTableRenderer-Czw742w4.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-C946Hzna.js → Organization-BATEx24i.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BYf8KIts.js → Overflow-B_PXMNia.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Cbqf5dnv.js → P2P-BSiE8PqT.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-BbklUgZY.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-CZBw45EW.js → Permissions-B7bpflT_.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-BKwUAt43.js → PersonalDataHub-BWZS4BLy.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DmFD2QW4.js → Pipeline-DP2YSs6H.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-KpuwWvt5.js → Privacy-DB9ptoH0.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bt8UheX6.js → ProjectInit-BAfePyYk.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-2ZeAn9CP.js → ProjectSettings-BEXn4Cm3.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-zBuet8Zs.js → Projects-BzSs0rzn.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DcEAnw6L.js → Providers-CRX9TdRO.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-qF7liYG9.js → QrScannerModal-DUWcSY5L.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-qiESlVBJ.js → QuickAsk-Cgo3Z_hs.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Bk-cQyi9.js → Recommend-Dcinx0IW.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-CwrekErS.js → RemoteSession-BMZzTnAN.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Bmw_UQtW.js → Reputation-BdZzpOp9.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CPdqZIUX.js → Row-DqM8GVcx.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-D_W-xxvS.js → RssFeed-Soj_QBK3.js} +2 -2
- package/src/assets/web-panel/assets/{Search-Hu0oDFj_.js → Search-Cn2es0-v.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DeRxUwmq.js → Security-t7C4hz3n.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CsNmHFkf.js → Services-ChF-e_Uf.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-gv_Vz0tN.js → Skeleton-BiPIyK-2.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Dgg-_rCB.js → Skills-HgkKJenJ.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Bpu-bsEJ.js → Sla-BSfluv_k.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CrhleHuF.js → SpeechSettings-Sm0Gz9tM.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-JHjUN6I9.js → SyncSettings-DlhBMnfU.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DKRWKkl9.js → Tasks-C7OUvsnp.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-leiWntLq.js → Templates-CrMtw87y.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant--1bYulvn.js → Tenant-DSNSB6j5.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-C0y6FvSS.js → Terminal-Cmh78FQg.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CQK4PVv4.js → TimelineRenderer-BE8b8lHR.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DbIvF-DV.js → Tokens-BrtgdIvJ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CkXJ2vuq.js → Trigger-HCmaoKDp.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B02WXJPw.js → Trust-GASQ4F-2.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-VPMkfzmw.js → UkeySign-B8kSzWGr.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C5ezUnah.js → VideoEditing-Nn-clhv5.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CYfvYRrY.js → Wallet-DdYMKTYk.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DtKl-kpr.js → WebAuthn-xJXUr_eK.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DACITF-u.js → WorkflowEditor-CbSa87av.js} +1 -1
- package/src/assets/web-panel/assets/{chat-qnygfnLi.js → chat-CVrNLGUV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D4mISLBD.js → colors-e2veLfIA.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BBPfxYGL.js → compact-item-CNd7nhUq.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Byx4ndHp.js → createContext-DEudTVqv.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DW7he-SA.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CGjLkkn3.js → hasIn-BlSAFZa3.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8UpadHC.js → index-0y7tHZdT.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9jH-h4X.js → index-4ZT0vIJt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DboTeuPF.js → index-7-7rr4Mf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxQF1wCU.js → index-B1C1wS5c.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dzni_5Qw.js → index-BG-VNepa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNe2lCk6.js → index-BMIhGZUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFMWjuav.js → index-BRNCKg4q.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN7_TSgU.js → index-B_UNX_xq.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dmfe0L2Z.js → index-BmVFeSEq.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_g9mA1N.js → index-Bp4Gcn9u.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZjNamSU.js → index-BpH6T1gA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BklGH3YI.js → index-BptI9bLu.js} +1 -1
- package/src/assets/web-panel/assets/{index-xzRKTy0R.js → index-Bqeb4jnC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Y7el_3WS.js → index-Bwtt-0CQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByA1NyFP.js → index-C4h_Bvd2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsVuQsY1.js → index-C6zGNZ5H.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMj8qmpX.js → index-CHMrAZiR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVUJjQAT.js → index-CK6Rb66R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWhI8G14.js → index-CU4Y4VVN.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3abGsSW.js → index-CWuv47z0.js} +1 -1
- package/src/assets/web-panel/assets/{index-J5JkStvY.js → index-CYNoXhxl.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9tcHs46.js → index-CgVwz2jD.js} +1 -1
- package/src/assets/web-panel/assets/{index-lKJWAmd4.js → index-ClROBPWd.js} +1 -1
- package/src/assets/web-panel/assets/{index-O09jXbir.js → index-D7yJceTZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-c_tBkIlU.js → index-DFv-nsIT.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_fHPZ8E.js → index-DFzvcZ3Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CydHMjwc.js → index-DJ5gsewX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CoA8WsVr.js → index-DVORJydf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmKYaaGP.js → index-D_D7lcnQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BzeBBAl5.js → index-DtrqgNBl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DH6iC5b2.js → index-DwjWRUTf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CD5Btq6p.js → index-DyFZ7gDd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfgpKd64.js → index-Ec6VBiV-.js} +1 -1
- package/src/assets/web-panel/assets/index-IkoHuWRe.js +1 -0
- package/src/assets/web-panel/assets/{index-Ne8UGllV.js → index-Jk99aZIr.js} +3 -3
- package/src/assets/web-panel/assets/{index-DZXhKAk9.js → index-Lm9pm1zm.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmHE-lY_.js → index-MuTb62K6.js} +1 -1
- package/src/assets/web-panel/assets/index-MwqsDbb1.js +1 -0
- package/src/assets/web-panel/assets/{index-Cpg3AWRy.js → index-hzUfIn4u.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-XuhfEIhB.js → initDefaultProps-C6fpNcA5.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cbxh6AxO.js → motion-Bjh9Come.js} +1 -1
- package/src/assets/web-panel/assets/{move-C7IEnFly.js → move-DFa4ul-_.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-lLADx4LL.js → mtc-parser-KoYqA_e5.js} +1 -1
- package/src/assets/web-panel/assets/{omit-mIbic_k-.js → omit-ByTjP-wG.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-_xIYEqu3.js → pickAttrs-CG_rmTxx.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-ClB-E0ny.js → placementArrow-LDePZ8V9.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D36Bg2ut.js → responsiveObserve-DZFzH4RR.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CUuO08Bl.js → slide-DfXQyTvD.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BKahwLbv.js → statusUtils-CuhqsJfO.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-2pT-T8vy.js → styleChecker-qqVjJw5u.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DyH5g7Rg.js → useFlexGapSupport-BPxnCxcb.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CTOauB3X.js → useFs-D11NLCjV.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-B02JYIMe.js → usePersonalDataHub-HbZVcaCX.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Do22wQrc.js → vnode-CZHQlfTu.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BfnL7rit.js → zoom-CV3rUknJ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/context.js +31 -11
- package/src/commands/evolution-deployment.js +70 -0
- package/src/data/changelog.json +65 -0
- package/src/gateways/ws/evolution-deployment-topic-handlers.js +20 -0
- package/src/harness/prompt-compressor.js +12 -4
- package/src/lib/evolution/evolution-deployment-config.js +16 -1
- package/src/lib/evolution/evolution-deployment-profile.js +102 -58
- package/src/lib/evolution/evolution-test-deployment.js +386 -0
- package/src/lib/model-context-window.js +3 -2
- package/src/lib/runtime-usage-ledger.js +5 -0
- package/src/repl/agent-repl.js +19 -4
- package/src/runtime/agent-core.js +13 -0
- package/src/runtime/headless-runner.js +4 -0
- package/src/runtime/headless-stream.js +9 -1
- package/src/assets/web-panel/assets/EvolutionSettings-bMvgBk6r.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-QWv7UJLq.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-rmxp0cuF.js +0 -7
- package/src/assets/web-panel/assets/devWarning-DBy6gsuI.js +0 -1
- package/src/assets/web-panel/assets/index-BfEDXk_E.js +0 -1
- package/src/assets/web-panel/assets/index-CrxUwNM8.js +0 -1
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createPrivateKey,
|
|
3
|
+
createPublicKey,
|
|
4
|
+
generateKeyPairSync,
|
|
5
|
+
randomUUID,
|
|
6
|
+
sign as signBytes,
|
|
7
|
+
} from "node:crypto";
|
|
8
|
+
import {
|
|
9
|
+
existsSync,
|
|
10
|
+
mkdirSync,
|
|
11
|
+
readFileSync,
|
|
12
|
+
renameSync,
|
|
13
|
+
unlinkSync,
|
|
14
|
+
writeFileSync,
|
|
15
|
+
} from "node:fs";
|
|
16
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
17
|
+
import { configureEvolutionDeployment } from "./evolution-deployment-config.js";
|
|
18
|
+
import {
|
|
19
|
+
EVOLUTION_DEPLOYMENT_DESCRIPTOR_SCHEMA,
|
|
20
|
+
computeEvolutionDeploymentDigest,
|
|
21
|
+
serializeEvolutionDeploymentDescriptorPayload,
|
|
22
|
+
verifyEvolutionDeployment,
|
|
23
|
+
} from "./evolution-deployment-loader.js";
|
|
24
|
+
import {
|
|
25
|
+
getEvolutionDeploymentProfilePath,
|
|
26
|
+
readEvolutionDeploymentProfile,
|
|
27
|
+
} from "./evolution-deployment-profile.js";
|
|
28
|
+
import {
|
|
29
|
+
EVOLUTION_DEPLOYMENT_ROOT_ROTATION_SCHEMA,
|
|
30
|
+
serializeEvolutionDeploymentRootRotationPayload,
|
|
31
|
+
} from "./evolution-deployment-root-rotation.js";
|
|
32
|
+
import {
|
|
33
|
+
PRIVATE_FILE_MODE,
|
|
34
|
+
ensurePrivateDirectory,
|
|
35
|
+
ensurePrivateFile,
|
|
36
|
+
} from "../secure-fs.js";
|
|
37
|
+
|
|
38
|
+
export const EVOLUTION_TEST_DEPLOYMENT_COMMANDS = Object.freeze([
|
|
39
|
+
"agent",
|
|
40
|
+
"ask",
|
|
41
|
+
"chat",
|
|
42
|
+
"compact",
|
|
43
|
+
"complete",
|
|
44
|
+
"cowork",
|
|
45
|
+
"desktop",
|
|
46
|
+
"evolution",
|
|
47
|
+
"hub",
|
|
48
|
+
"learning",
|
|
49
|
+
"marketplace",
|
|
50
|
+
"orchestrate",
|
|
51
|
+
"serve",
|
|
52
|
+
"skill",
|
|
53
|
+
"stream",
|
|
54
|
+
"ui",
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
const TEST_PRIVATE_KEY_FILE = "test-signing-private.pem";
|
|
58
|
+
const TEST_TRUST_ROOT_FILE = "test-signing-public.pem";
|
|
59
|
+
const TEST_DESCRIPTOR_FILE = "test-deployment.json";
|
|
60
|
+
const TEST_README_FILE = "README-TEST-ONLY.txt";
|
|
61
|
+
const MAX_MODULE_BYTES = 4 * 1024 * 1024;
|
|
62
|
+
|
|
63
|
+
function writePrivateAtomic(filePath, value) {
|
|
64
|
+
ensurePrivateDirectory(dirname(filePath));
|
|
65
|
+
const temporaryPath = join(
|
|
66
|
+
dirname(filePath),
|
|
67
|
+
`.${filePath.split(/[\\/]/u).at(-1)}.${randomUUID()}.tmp`,
|
|
68
|
+
);
|
|
69
|
+
try {
|
|
70
|
+
writeFileSync(temporaryPath, value, {
|
|
71
|
+
flag: "wx",
|
|
72
|
+
mode: PRIVATE_FILE_MODE,
|
|
73
|
+
});
|
|
74
|
+
ensurePrivateFile(temporaryPath);
|
|
75
|
+
renameSync(temporaryPath, filePath);
|
|
76
|
+
ensurePrivateFile(filePath);
|
|
77
|
+
} catch (error) {
|
|
78
|
+
try {
|
|
79
|
+
unlinkSync(temporaryPath);
|
|
80
|
+
} catch {
|
|
81
|
+
// The temporary file was not created or has already been renamed.
|
|
82
|
+
}
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function assertNoEnvironmentOverride(env) {
|
|
88
|
+
if (
|
|
89
|
+
env.CHAINLESSCHAIN_EVOLUTION_DEPLOYMENT_DESCRIPTOR ||
|
|
90
|
+
env.CHAINLESSCHAIN_EVOLUTION_DEPLOYMENT_TRUST_ROOT
|
|
91
|
+
) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
"test deployment setup requires the Evolution deployment environment overrides to be unset",
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function normalizeCommands(commands) {
|
|
99
|
+
const value =
|
|
100
|
+
commands === undefined
|
|
101
|
+
? [...EVOLUTION_TEST_DEPLOYMENT_COMMANDS]
|
|
102
|
+
: typeof commands === "string"
|
|
103
|
+
? commands
|
|
104
|
+
.split(",")
|
|
105
|
+
.map((command) => command.trim())
|
|
106
|
+
.filter(Boolean)
|
|
107
|
+
: Array.isArray(commands)
|
|
108
|
+
? [...commands]
|
|
109
|
+
: null;
|
|
110
|
+
if (!value || value.length === 0 || new Set(value).size !== value.length)
|
|
111
|
+
throw new TypeError(
|
|
112
|
+
"test deployment commands must be a non-empty unique list",
|
|
113
|
+
);
|
|
114
|
+
return value.sort();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function readRevision(descriptorPath) {
|
|
118
|
+
if (!existsSync(descriptorPath)) return 0;
|
|
119
|
+
try {
|
|
120
|
+
const descriptor = JSON.parse(readFileSync(descriptorPath, "utf8"));
|
|
121
|
+
if (!Number.isSafeInteger(descriptor.revision) || descriptor.revision < 1)
|
|
122
|
+
throw new Error("revision is invalid");
|
|
123
|
+
return descriptor.revision;
|
|
124
|
+
} catch (error) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
"existing test deployment descriptor cannot be refreshed",
|
|
127
|
+
error instanceof Error ? { cause: error } : undefined,
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function assertSigningPair(privateKeyBytes, trustRootBytes) {
|
|
133
|
+
let privateKey;
|
|
134
|
+
let actualPublic;
|
|
135
|
+
let expectedPublic;
|
|
136
|
+
try {
|
|
137
|
+
privateKey = createPrivateKey(privateKeyBytes);
|
|
138
|
+
actualPublic = createPublicKey(privateKey).export({
|
|
139
|
+
type: "spki",
|
|
140
|
+
format: "der",
|
|
141
|
+
});
|
|
142
|
+
expectedPublic = createPublicKey(trustRootBytes).export({
|
|
143
|
+
type: "spki",
|
|
144
|
+
format: "der",
|
|
145
|
+
});
|
|
146
|
+
} catch {
|
|
147
|
+
throw new Error("test deployment signing key pair is invalid");
|
|
148
|
+
}
|
|
149
|
+
if (!Buffer.from(actualPublic).equals(Buffer.from(expectedPublic)))
|
|
150
|
+
throw new Error(
|
|
151
|
+
"test deployment signing key does not match its trust root",
|
|
152
|
+
);
|
|
153
|
+
return privateKey;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function claimFreshTestRoot(profilePath) {
|
|
157
|
+
const parent = dirname(profilePath);
|
|
158
|
+
const preferred = join(parent, "test-deployment");
|
|
159
|
+
ensurePrivateDirectory(parent);
|
|
160
|
+
for (const candidate of [
|
|
161
|
+
preferred,
|
|
162
|
+
join(parent, `test-deployment-${randomUUID()}`),
|
|
163
|
+
]) {
|
|
164
|
+
try {
|
|
165
|
+
mkdirSync(candidate, { mode: 0o700 });
|
|
166
|
+
ensurePrivateDirectory(candidate);
|
|
167
|
+
return candidate;
|
|
168
|
+
} catch (error) {
|
|
169
|
+
if (error?.code !== "EEXIST") throw error;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
throw new Error("could not allocate a private test deployment directory");
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function testReadme({ modulePath, descriptorPath, trustRootPath }) {
|
|
176
|
+
return `ChainlessChain Skill evolution development environment / 仅限测试开发
|
|
177
|
+
|
|
178
|
+
This directory contains an automatically generated Ed25519 TEST key. It is not
|
|
179
|
+
a production certificate, HSM/KMS identity, reviewer identity, or production
|
|
180
|
+
approval. Automatic active promotion remains HOLD.
|
|
181
|
+
|
|
182
|
+
本目录包含自动生成的 Ed25519 测试密钥,只用于正式部署前联调。它不属于生产证书、
|
|
183
|
+
HSM/KMS 身份或审核身份,也不会解除人工审核和 automatic active promotion HOLD。
|
|
184
|
+
|
|
185
|
+
Deployment host: ${modulePath}
|
|
186
|
+
Signed descriptor: ${descriptorPath}
|
|
187
|
+
Test trust root: ${trustRootPath}
|
|
188
|
+
|
|
189
|
+
Re-run "cc evolution deployment init-test --module <absolute-path>" after the
|
|
190
|
+
host module changes. When the managed descriptor and trust root are available,
|
|
191
|
+
run "cc evolution deployment replace-test --descriptor <path> --trust-root <path>".
|
|
192
|
+
|
|
193
|
+
部署宿主模块变更后请重新执行 init-test 刷新摘要和签名。正式 descriptor 与 trust
|
|
194
|
+
root 到位后执行 replace-test;CLI 会用测试根签发一次根轮换证明并切换到正式配置。
|
|
195
|
+
`;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Generate or refresh a local-only Ed25519 deployment wrapper for an existing
|
|
200
|
+
* development host. The ordinary descriptor verifier and profile writer remain
|
|
201
|
+
* the only activation path; this helper never bypasses deployment admission.
|
|
202
|
+
*/
|
|
203
|
+
export async function initializeEvolutionTestDeployment(
|
|
204
|
+
{ modulePath, commands, enabled = true },
|
|
205
|
+
options = {},
|
|
206
|
+
) {
|
|
207
|
+
const env = options.env || process.env;
|
|
208
|
+
const resolveRealPath =
|
|
209
|
+
options.resolveRealPath ||
|
|
210
|
+
(async (value) => {
|
|
211
|
+
const { realpath } = await import("node:fs/promises");
|
|
212
|
+
return realpath(value);
|
|
213
|
+
});
|
|
214
|
+
assertNoEnvironmentOverride(env);
|
|
215
|
+
if (typeof modulePath !== "string" || !modulePath.trim())
|
|
216
|
+
throw new TypeError(
|
|
217
|
+
"an absolute test deployment host module path is required",
|
|
218
|
+
);
|
|
219
|
+
const requestedModulePath = modulePath.trim();
|
|
220
|
+
if (!isAbsolute(requestedModulePath))
|
|
221
|
+
throw new TypeError("test deployment host module path must be absolute");
|
|
222
|
+
const realModulePath = await resolveRealPath(requestedModulePath);
|
|
223
|
+
const moduleBytes = readFileSync(realModulePath);
|
|
224
|
+
if (moduleBytes.byteLength === 0 || moduleBytes.byteLength > MAX_MODULE_BYTES)
|
|
225
|
+
throw new Error("test deployment host module size is invalid");
|
|
226
|
+
|
|
227
|
+
const saved = await readEvolutionDeploymentProfile(options);
|
|
228
|
+
if (saved.error) throw new Error(saved.error);
|
|
229
|
+
if (saved.profile && saved.profile.deploymentMode !== "test") {
|
|
230
|
+
const error = new Error(
|
|
231
|
+
"a managed Evolution deployment profile already exists; test setup will not replace it",
|
|
232
|
+
);
|
|
233
|
+
error.code = "EVOLUTION_TEST_DEPLOYMENT_MANAGED_PROFILE_EXISTS";
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const requestedTestRoot = saved.profile
|
|
238
|
+
? dirname(saved.profile.descriptorPath)
|
|
239
|
+
: claimFreshTestRoot(
|
|
240
|
+
options.filePath || getEvolutionDeploymentProfilePath(options),
|
|
241
|
+
);
|
|
242
|
+
ensurePrivateDirectory(requestedTestRoot);
|
|
243
|
+
// macOS exposes /var through the /private/var real path. Persist and compare
|
|
244
|
+
// the physical path so a refresh does not mistake those aliases for two
|
|
245
|
+
// different credential directories.
|
|
246
|
+
const testRoot = await resolveRealPath(requestedTestRoot);
|
|
247
|
+
const privateKeyPath = join(testRoot, TEST_PRIVATE_KEY_FILE);
|
|
248
|
+
const trustRootPath = join(testRoot, TEST_TRUST_ROOT_FILE);
|
|
249
|
+
const descriptorPath = join(testRoot, TEST_DESCRIPTOR_FILE);
|
|
250
|
+
let privateKeyBytes;
|
|
251
|
+
let trustRootBytes;
|
|
252
|
+
let generated = false;
|
|
253
|
+
if (saved.profile) {
|
|
254
|
+
const [savedDescriptorPath, savedTrustRootPath, savedPrivateKeyPath] =
|
|
255
|
+
await Promise.all([
|
|
256
|
+
resolveRealPath(saved.profile.descriptorPath),
|
|
257
|
+
resolveRealPath(saved.profile.trustRootPath),
|
|
258
|
+
resolveRealPath(saved.profile.testPrivateKeyPath),
|
|
259
|
+
]);
|
|
260
|
+
if (
|
|
261
|
+
resolve(savedDescriptorPath) !== resolve(descriptorPath) ||
|
|
262
|
+
resolve(savedTrustRootPath) !== resolve(trustRootPath) ||
|
|
263
|
+
resolve(savedPrivateKeyPath) !== resolve(privateKeyPath)
|
|
264
|
+
) {
|
|
265
|
+
throw new Error("saved test deployment paths are inconsistent");
|
|
266
|
+
}
|
|
267
|
+
ensurePrivateFile(privateKeyPath);
|
|
268
|
+
ensurePrivateFile(trustRootPath);
|
|
269
|
+
privateKeyBytes = readFileSync(privateKeyPath);
|
|
270
|
+
trustRootBytes = readFileSync(trustRootPath);
|
|
271
|
+
} else {
|
|
272
|
+
const { privateKey, publicKey } = generateKeyPairSync("ed25519");
|
|
273
|
+
privateKeyBytes = privateKey.export({ type: "pkcs8", format: "pem" });
|
|
274
|
+
trustRootBytes = publicKey.export({ type: "spki", format: "pem" });
|
|
275
|
+
writePrivateAtomic(privateKeyPath, privateKeyBytes);
|
|
276
|
+
writePrivateAtomic(trustRootPath, trustRootBytes);
|
|
277
|
+
generated = true;
|
|
278
|
+
}
|
|
279
|
+
const privateKey = assertSigningPair(privateKeyBytes, trustRootBytes);
|
|
280
|
+
const descriptor = {
|
|
281
|
+
schema: EVOLUTION_DEPLOYMENT_DESCRIPTOR_SCHEMA,
|
|
282
|
+
revision: readRevision(descriptorPath) + 1,
|
|
283
|
+
modulePath: realModulePath,
|
|
284
|
+
moduleDigest: computeEvolutionDeploymentDigest(moduleBytes),
|
|
285
|
+
trustRootDigest: computeEvolutionDeploymentDigest(trustRootBytes),
|
|
286
|
+
commands: normalizeCommands(commands),
|
|
287
|
+
};
|
|
288
|
+
descriptor.signature = signBytes(
|
|
289
|
+
null,
|
|
290
|
+
Buffer.from(serializeEvolutionDeploymentDescriptorPayload(descriptor)),
|
|
291
|
+
privateKey,
|
|
292
|
+
).toString("base64");
|
|
293
|
+
writePrivateAtomic(
|
|
294
|
+
descriptorPath,
|
|
295
|
+
`${JSON.stringify(descriptor, null, 2)}\n`,
|
|
296
|
+
);
|
|
297
|
+
writePrivateAtomic(
|
|
298
|
+
join(testRoot, TEST_README_FILE),
|
|
299
|
+
testReadme({ modulePath: realModulePath, descriptorPath, trustRootPath }),
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
const status = await configureEvolutionDeployment(
|
|
303
|
+
{
|
|
304
|
+
descriptorPath,
|
|
305
|
+
trustRootPath,
|
|
306
|
+
enabled,
|
|
307
|
+
deploymentMode: "test",
|
|
308
|
+
testPrivateKeyPath: privateKeyPath,
|
|
309
|
+
},
|
|
310
|
+
options,
|
|
311
|
+
);
|
|
312
|
+
return Object.freeze({
|
|
313
|
+
...status,
|
|
314
|
+
generated,
|
|
315
|
+
testRootPath: testRoot,
|
|
316
|
+
warning:
|
|
317
|
+
"TEST ONLY: local development credentials; automatic active promotion remains HOLD",
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** Replace an active generated test root with an operator-signed deployment. */
|
|
322
|
+
export async function replaceEvolutionTestDeployment(
|
|
323
|
+
{ descriptorPath, trustRootPath },
|
|
324
|
+
options = {},
|
|
325
|
+
) {
|
|
326
|
+
const env = options.env || process.env;
|
|
327
|
+
assertNoEnvironmentOverride(env);
|
|
328
|
+
const saved = await readEvolutionDeploymentProfile(options);
|
|
329
|
+
if (saved.error) throw new Error(saved.error);
|
|
330
|
+
if (saved.profile?.deploymentMode !== "test") {
|
|
331
|
+
const error = new Error(
|
|
332
|
+
"the saved Evolution deployment is not a generated test deployment",
|
|
333
|
+
);
|
|
334
|
+
error.code = "EVOLUTION_TEST_DEPLOYMENT_NOT_ACTIVE";
|
|
335
|
+
throw error;
|
|
336
|
+
}
|
|
337
|
+
const destination = await verifyEvolutionDeployment(
|
|
338
|
+
{ descriptorPath, trustRootPath },
|
|
339
|
+
options,
|
|
340
|
+
);
|
|
341
|
+
ensurePrivateFile(saved.profile.testPrivateKeyPath);
|
|
342
|
+
ensurePrivateFile(saved.profile.trustRootPath);
|
|
343
|
+
const privateKeyBytes = readFileSync(saved.profile.testPrivateKeyPath);
|
|
344
|
+
const fromTrustRootBytes = readFileSync(saved.profile.trustRootPath);
|
|
345
|
+
const privateKey = assertSigningPair(privateKeyBytes, fromTrustRootBytes);
|
|
346
|
+
if (
|
|
347
|
+
computeEvolutionDeploymentDigest(fromTrustRootBytes) !==
|
|
348
|
+
saved.profile.activeTrustRootDigest
|
|
349
|
+
) {
|
|
350
|
+
throw new Error(
|
|
351
|
+
"generated test trust root does not match the active profile",
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
const rotation = {
|
|
355
|
+
schema: EVOLUTION_DEPLOYMENT_ROOT_ROTATION_SCHEMA,
|
|
356
|
+
fromTrustRootDigest: saved.profile.activeTrustRootDigest,
|
|
357
|
+
toTrustRootDigest: destination.descriptor.trustRootDigest,
|
|
358
|
+
minimumDescriptorRevision: destination.descriptor.revision,
|
|
359
|
+
};
|
|
360
|
+
rotation.signature = signBytes(
|
|
361
|
+
null,
|
|
362
|
+
Buffer.from(serializeEvolutionDeploymentRootRotationPayload(rotation)),
|
|
363
|
+
privateKey,
|
|
364
|
+
).toString("base64");
|
|
365
|
+
const rotationPath = join(
|
|
366
|
+
dirname(saved.profile.descriptorPath),
|
|
367
|
+
"managed-root-rotation.json",
|
|
368
|
+
);
|
|
369
|
+
writePrivateAtomic(rotationPath, `${JSON.stringify(rotation, null, 2)}\n`);
|
|
370
|
+
const status = await configureEvolutionDeployment(
|
|
371
|
+
{
|
|
372
|
+
descriptorPath,
|
|
373
|
+
trustRootPath,
|
|
374
|
+
rootRotationPath: rotationPath,
|
|
375
|
+
enabled: true,
|
|
376
|
+
deploymentMode: "managed",
|
|
377
|
+
testPrivateKeyPath: null,
|
|
378
|
+
},
|
|
379
|
+
options,
|
|
380
|
+
);
|
|
381
|
+
return Object.freeze({
|
|
382
|
+
...status,
|
|
383
|
+
replacedTestDeployment: true,
|
|
384
|
+
rootRotationPath: rotationPath,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
@@ -2,6 +2,7 @@ import { resolveModelCapabilityProfile } from "./model-capabilities.js";
|
|
|
2
2
|
|
|
3
3
|
export { CONTEXT_WINDOWS } from "./model-context-catalog.js";
|
|
4
4
|
|
|
5
|
-
export function getContextWindow(model, provider) {
|
|
6
|
-
return resolveModelCapabilityProfile({ model, provider })
|
|
5
|
+
export function getContextWindow(model, provider, options = {}) {
|
|
6
|
+
return resolveModelCapabilityProfile({ ...options, model, provider })
|
|
7
|
+
.contextWindowTokens;
|
|
7
8
|
}
|
|
@@ -162,6 +162,11 @@ export function projectRuntimeTokenUsage(event = {}) {
|
|
|
162
162
|
...(projectedOperationId ? { operationId: projectedOperationId } : {}),
|
|
163
163
|
...(event.source ? { source: source(event.source) } : {}),
|
|
164
164
|
...(attribution ? { attribution } : {}),
|
|
165
|
+
...(Number.isSafeInteger(event.contextWindow) &&
|
|
166
|
+
event.contextWindow >= 1024 &&
|
|
167
|
+
event.contextWindow <= 16777216
|
|
168
|
+
? { contextWindow: event.contextWindow }
|
|
169
|
+
: {}),
|
|
165
170
|
};
|
|
166
171
|
}
|
|
167
172
|
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -5579,6 +5579,7 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
5579
5579
|
let _customStatus = false; // true when a settings.json command is configured
|
|
5580
5580
|
let _curModel = model; // tracks the per-turn active model for the readout
|
|
5581
5581
|
let _ctxUsedTokens = 0;
|
|
5582
|
+
let _ctxRequestWindow = null;
|
|
5582
5583
|
let _turnCount = 0;
|
|
5583
5584
|
const _costStore = newCostStore(); // running token spend for `/cost`
|
|
5584
5585
|
let _renderStatus = null;
|
|
@@ -5598,7 +5599,8 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
5598
5599
|
provider,
|
|
5599
5600
|
cwd: process.cwd(),
|
|
5600
5601
|
usedTokens: _ctxUsedTokens,
|
|
5601
|
-
contextWindow:
|
|
5602
|
+
contextWindow:
|
|
5603
|
+
_ctxRequestWindow ?? getContextWindow(_curModel, provider, options),
|
|
5602
5604
|
turn: _turnCount,
|
|
5603
5605
|
});
|
|
5604
5606
|
// Custom command wins; otherwise the built-in context-usage render.
|
|
@@ -7190,7 +7192,9 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
7190
7192
|
messages,
|
|
7191
7193
|
estimateTokens,
|
|
7192
7194
|
);
|
|
7193
|
-
const window =
|
|
7195
|
+
const window =
|
|
7196
|
+
_ctxRequestWindow ??
|
|
7197
|
+
(getContextWindow(model, provider, options) || 0);
|
|
7194
7198
|
logger.log(chalk.bold("\nContext usage (live session):"));
|
|
7195
7199
|
const rows = [
|
|
7196
7200
|
["system", buckets.system, counts.system],
|
|
@@ -9756,8 +9760,19 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
9756
9760
|
_curModel = activeModel;
|
|
9757
9761
|
_turnCount += 1;
|
|
9758
9762
|
if (usageEvents?.length) {
|
|
9759
|
-
const
|
|
9760
|
-
|
|
9763
|
+
const lastCall = [...usageEvents]
|
|
9764
|
+
.reverse()
|
|
9765
|
+
.find(
|
|
9766
|
+
(event) =>
|
|
9767
|
+
!event.attribution && (!event.source || event.source === "model"),
|
|
9768
|
+
);
|
|
9769
|
+
_ctxRequestWindow = lastCall?.contextWindow ?? null;
|
|
9770
|
+
const last = lastCall?.usage || {};
|
|
9771
|
+
const used =
|
|
9772
|
+
(last.input_tokens || 0) +
|
|
9773
|
+
(last.output_tokens || 0) +
|
|
9774
|
+
(last.cache_read_input_tokens || 0) +
|
|
9775
|
+
(last.cache_creation_input_tokens || 0);
|
|
9761
9776
|
if (used > 0) _ctxUsedTokens = used;
|
|
9762
9777
|
}
|
|
9763
9778
|
|
|
@@ -13497,6 +13497,8 @@ async function _getAutoCompactor(options) {
|
|
|
13497
13497
|
compressor = new PromptCompressor({
|
|
13498
13498
|
model: options.model,
|
|
13499
13499
|
provider: options.provider,
|
|
13500
|
+
baseUrl: options.baseUrl,
|
|
13501
|
+
contextMemoryModelWindowTokens: options.contextMemoryModelWindowTokens,
|
|
13500
13502
|
llmQuery,
|
|
13501
13503
|
summaryInputMaxChars: options.compactionInputMaxChars,
|
|
13502
13504
|
});
|
|
@@ -15154,6 +15156,16 @@ export async function* agentLoop(messages, options) {
|
|
|
15154
15156
|
}
|
|
15155
15157
|
: {}),
|
|
15156
15158
|
};
|
|
15159
|
+
// Resolve before dispatch, including compatibility/skip-planning runs.
|
|
15160
|
+
// The panel and persisted transcript use this same request configuration.
|
|
15161
|
+
const requestContextWindow =
|
|
15162
|
+
canonicalProviderContext?.modelCapabilities?.contextWindowTokens ??
|
|
15163
|
+
resolveModelCapabilityProfile({
|
|
15164
|
+
provider: options.provider || "ollama",
|
|
15165
|
+
model: options.model,
|
|
15166
|
+
baseUrl: options.baseUrl,
|
|
15167
|
+
contextMemoryModelWindowTokens: options.contextMemoryModelWindowTokens,
|
|
15168
|
+
}).contextWindowTokens;
|
|
15157
15169
|
// The consumer receives this boundary before `.next()` resumes into the
|
|
15158
15170
|
// provider call, so a durable append failure can prevent spend.
|
|
15159
15171
|
yield modelUsageCall;
|
|
@@ -15281,6 +15293,7 @@ export async function* agentLoop(messages, options) {
|
|
|
15281
15293
|
provider: modelUsageCall.provider,
|
|
15282
15294
|
model: modelUsageCall.model,
|
|
15283
15295
|
usage: result.usage,
|
|
15296
|
+
contextWindow: requestContextWindow,
|
|
15284
15297
|
};
|
|
15285
15298
|
} else {
|
|
15286
15299
|
yield {
|
|
@@ -3406,6 +3406,10 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3406
3406
|
provider: event.provider,
|
|
3407
3407
|
model: event.model,
|
|
3408
3408
|
usage: event.usage,
|
|
3409
|
+
...(event.contextWindow
|
|
3410
|
+
? { contextWindow: event.contextWindow }
|
|
3411
|
+
: {}),
|
|
3412
|
+
...(event.attribution ? { attribution: event.attribution } : {}),
|
|
3409
3413
|
...(event.source ? { source: event.source } : {}),
|
|
3410
3414
|
});
|
|
3411
3415
|
if (costBudget) {
|
|
@@ -1140,6 +1140,10 @@ async function runTurn(
|
|
|
1140
1140
|
provider: event.provider,
|
|
1141
1141
|
model: event.model,
|
|
1142
1142
|
usage: event.usage,
|
|
1143
|
+
...(event.contextWindow
|
|
1144
|
+
? { contextWindow: event.contextWindow }
|
|
1145
|
+
: {}),
|
|
1146
|
+
...(event.attribution ? { attribution: event.attribution } : {}),
|
|
1143
1147
|
...(event.source ? { source: event.source } : {}),
|
|
1144
1148
|
});
|
|
1145
1149
|
if (costBudget) {
|
|
@@ -4252,7 +4256,11 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4252
4256
|
event,
|
|
4253
4257
|
"headless semantic compaction usage settlement",
|
|
4254
4258
|
);
|
|
4255
|
-
emit({
|
|
4259
|
+
emit({
|
|
4260
|
+
type: "token_usage",
|
|
4261
|
+
...usageEvent,
|
|
4262
|
+
source: "semantic-compaction",
|
|
4263
|
+
});
|
|
4256
4264
|
if (costBudget) {
|
|
4257
4265
|
costBudget.add(usageEvent);
|
|
4258
4266
|
costExceeded = costBudget.exceeded();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as l,J as x,U as i,c as a,K as o,o as D,r as k,a as L,b as O,P as S,Q as _,R as u,F as B,Z as q,V as I,S as H}from"./vendor-Bn1JzzAn.js";import{_ as J,u as V,d as y}from"./index-Ne8UGllV.js";import{R as U}from"./icons-DG5UD-6K.js";function N(p){return["ask","agent"].map(t=>{const s=p?.readiness?.[t],e=s?.state==="admitted",d=s?.scope==="deployment-admission"&&s.runtimeVerification==="not_checked"&&Array.isArray(s.requiredCommands)&&s.requiredCommands.includes(t)&&(e?s.ready===!0&&s.taskReady===null:["not_configured","disabled","invalid","command_not_allowed"].includes(s.state)&&s.ready===!1&&s.taskReady===!1);return{command:t,state:d?s.state:"unknown",summary:d?e?"部署准入通过":"部署准入被阻断":"未提供准入诊断",detail:d&&typeof s.detail=="string"?s.detail:"当前 CLI 未提供可识别的部署准入诊断,请更新 CLI。",remediation:d&&typeof s.remediation=="string"?s.remediation:""}})}function j(p,t){for(const s of Object.keys(p))delete p[s];Object.assign(p,{source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[],readiness:null},t||{})}const W={__name:"EvolutionSettings",setup(p,{expose:t}){t();const s=V(),e=k(!1),d=k(!1),w=k(!1),m=k(""),g=k(""),c=L({source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[]}),h=O(()=>e.value||d.value||w.value),C=O(()=>N(c));function b(r){j(c,r),m.value=c.descriptorPath||"",g.value=c.trustRootPath||""}async function v(r,n=3e4){return await s.waitConnected(8e3),(await s.sendRaw(r,n)).result}async function R(){e.value=!0;try{b(await v({type:"evolution.deployment.status"}))}catch(r){y.error("读取配置失败:"+r.message)}finally{e.value=!1}}async function E(){if(!m.value.trim()||!g.value.trim()){y.warning("请填写描述符和信任根公钥的绝对路径");return}d.value=!0;try{b(await v({type:"evolution.deployment.configure",descriptorPath:m.value.trim(),trustRootPath:g.value.trim()},6e4)),y.success("签名校验通过,配置已保存并启用;自动发布仍为 HOLD")}catch(r){y.error("配置失败:"+r.message)}finally{d.value=!1}}async function f(){w.value=!0;try{b(await v({type:"evolution.deployment.set-enabled",enabled:!c.profileEnabled})),y.success(c.profileEnabled?"已启用":"已停用")}catch(r){y.error("更新失败:"+r.message)}finally{w.value=!1}}D(R);const P={ws:s,loading:e,saving:d,toggling:w,descriptorPath:m,trustRootPath:g,status:c,busy:h,readinessRows:C,apply:b,request:v,loadStatus:R,save:E,toggle:f,computed:O,onMounted:D,reactive:L,ref:k,get ReloadOutlined(){return U},get message(){return y},get useWsStore(){return V},get deploymentReadinessRows(){return N},get replaceDeploymentStatus(){return j}};return Object.defineProperty(P,"__isScriptSetup",{enumerable:!1,value:!0}),P}},z={class:"page-head"},A={class:"mono"},F={class:"mono"},G={class:"admission-status","aria-live":"polite"},K=["data-admission-command"],M={class:"mono"},Q={key:0,class:"mono"};function T(p,t,s,e,d,w){const m=l("a-button"),g=l("a-alert"),c=l("a-input"),h=l("a-form-item"),C=l("a-space"),b=l("a-form"),v=l("a-card"),R=l("a-col"),E=l("a-tag"),f=l("a-descriptions-item"),P=l("a-descriptions"),r=l("a-row");return S(),x("div",null,[i("div",z,[t[3]||(t[3]=i("div",null,[i("h2",{class:"page-title"},"Skill 自进化配置"),i("p",{class:"page-sub"},"统一配置受治理部署;CLI、IDE 插件与 cc ui 共享。")],-1)),a(m,{loading:e.loading,onClick:e.loadStatus},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[2]||(t[2]=_("刷新 ",-1))]),_:1},8,["loading"])]),a(g,{message:"不会开启自动发布",description:"此开关只启用经过签名的 Skill 自进化运行时。候选项进入 active 前仍需人工审核,自动发布始终保持 HOLD。",type:"warning","show-icon":"",class:"notice"}),a(r,{gutter:16},{default:o(()=>[a(R,{xs:24,xl:15},{default:o(()=>[a(v,{title:"签名部署",class:"panel-card"},{default:o(()=>[a(b,{layout:"vertical"},{default:o(()=>[a(h,{label:"签名部署描述符"},{extra:o(()=>[...t[4]||(t[4]=[_("Web 页面不能读取本机文件选择器,请填写运行 cc ui 的机器上的绝对路径。",-1)])]),default:o(()=>[a(c,{value:e.descriptorPath,"onUpdate:value":t[0]||(t[0]=n=>e.descriptorPath=n),disabled:e.busy,placeholder:"deployment descriptor JSON 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(h,{label:"Ed25519 信任根公钥"},{default:o(()=>[a(c,{value:e.trustRootPath,"onUpdate:value":t[1]||(t[1]=n=>e.trustRootPath=n),disabled:e.busy,placeholder:"信任根 public key 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(C,null,{default:o(()=>[a(m,{type:"primary",loading:e.saving,onClick:e.save},{default:o(()=>[...t[5]||(t[5]=[_("校验、保存并启用",-1)])]),_:1},8,["loading"]),a(m,{danger:e.status.profileEnabled,disabled:!e.status.descriptorPath,loading:e.toggling,onClick:e.toggle},{default:o(()=>[_(u(e.status.profileEnabled?"停用":"启用"),1)]),_:1},8,["danger","disabled","loading"])]),_:1})]),_:1})]),_:1})]),_:1}),a(R,{xs:24,xl:9},{default:o(()=>[a(v,{title:"治理状态",class:"panel-card status-card"},{default:o(()=>[a(P,{column:1,size:"small"},{default:o(()=>[a(f,{label:"生效状态"},{default:o(()=>[a(E,{color:e.status.effectiveEnabled?"green":"default"},{default:o(()=>[_(u(e.status.effectiveEnabled?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),a(f,{label:"生效来源"},{default:o(()=>[_(u(e.status.source||"none"),1)]),_:1}),a(f,{label:"签名校验"},{default:o(()=>[a(E,{color:e.status.verified?"green":"red"},{default:o(()=>[_(u(e.status.verified?"已通过":"未通过"),1)]),_:1},8,["color"])]),_:1}),a(f,{label:"自动发布"},{default:o(()=>[a(E,{color:"orange"},{default:o(()=>[...t[6]||(t[6]=[_("HOLD",-1)])]),_:1})]),_:1}),a(f,{label:"配置文件"},{default:o(()=>[i("span",A,u(e.status.profilePath||"—"),1)]),_:1}),a(f,{label:"允许命令"},{default:o(()=>[i("span",F,u((e.status.commands||[]).join(", ")||"—"),1)]),_:1})]),_:1}),i("section",G,[t[7]||(t[7]=i("h3",null,"模型命令部署准入",-1)),t[8]||(t[8]=i("p",null,"这里只检查部署准入,实际任务运行尚未验证。",-1)),(S(!0),x(B,null,q(e.readinessRows,n=>(S(),x("div",{key:n.command,"data-admission-command":n.command},[i("strong",null,u(n.command)+":"+u(n.summary),1),i("p",M,u(n.detail),1),n.remediation?(S(),x("p",Q,u(n.remediation),1)):I("v-if",!0)],8,K))),128))]),e.status.error?(S(),H(g,{key:0,message:e.status.error,type:"error","show-icon":"",class:"error"},null,8,["message"])):I("v-if",!0)]),_:1})]),_:1})]),_:1})])}const ee=J(W,[["render",T],["__scopeId","data-v-5a42105e"],["__file","/tmp/cc-web-panel-Jx0izG/repo/packages/web-panel/src/views/EvolutionSettings.vue"]]);export{ee as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-Ne8UGllV.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-Jx0izG/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-BvoSsCKh.js","./vendor-Bn1JzzAn.js","./index-Ne8UGllV.js","./icons-DG5UD-6K.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-BtMtQUt7.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-CQK4PVv4.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-BQdGLZIO.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-DkJcbBpS.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{E as ue,r as E,b as w,I as g,P as u,J as O,U as v,c,S as C,V as x,_ as J,F as V,Z as se,a0 as ae,R,K as m,Q as b,W as L,o as M}from"./vendor-Bn1JzzAn.js";import{u as z}from"./usePersonalDataHub-B02JYIMe.js";import{_ as D,e as F,d as P}from"./index-Ne8UGllV.js";import{aa as q,ag as G,M as U,aI as Q,v as H,aH as K,aq as W,ac as Y,e as de,d as fe,k as pe,ai as me,aA as _e,R as ye}from"./icons-DG5UD-6K.js";import"./useShellMode-CgR0wCYM.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),B=50,Z=300,X=ue("pdhBrowser",()=>{const r=E({...I}),t=E([]),n=E(null),e=E(!1),o=E(!1),a=E(null),l=E(null),s=E(!1),i=E({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,_=null;const j=w(()=>t.value.length>0),A=w(()=>n.value!=null);function h(S={}){const p={},f=r.value;return f.q&&f.q.trim()&&(p.q=f.q.trim()),f.category&&(p.category=f.category),f.adapter&&(p.adapter=f.adapter),f.subtype&&(p.subtype=f.subtype),Number.isFinite(f.since)&&(p.since=f.since),Number.isFinite(f.until)&&(p.until=f.until),{...p,...S}}async function y(){const S=++d;e.value=!0,a.value=null;const p=z();try{const[f,T]=await Promise.all([p.searchEvents(h({limit:B})),p.facetCounts({...r.value.q&&r.value.q.trim()?{q:r.value.q.trim()}:{},...Number.isFinite(r.value.since)?{since:r.value.since}:{},...Number.isFinite(r.value.until)?{until:r.value.until}:{}})]);if(S!==d)return;t.value=f.rows||[],n.value=f.nextCursor||null,l.value=f.mode||"like",s.value=!!f.shortQuery,i.value={byCategory:T.byCategory||{},byAdapter:T.byAdapter||{},bySubtype:T.bySubtype||{},total:T.total||0}}catch(f){if(S!==d)return;a.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{S===d&&(e.value=!1)}}async function k(){if(!n.value||o.value)return;o.value=!0,a.value=null;const S=z();try{const p=await S.searchEvents(h({cursor:n.value,limit:B}));t.value=t.value.concat(p.rows||[]),n.value=p.nextCursor||null,l.value=p.mode||l.value}catch(p){a.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function le(S,p){if(!(S in I))throw new Error(`pdhBrowser.setFilter: unknown key "${S}"`);r.value={...r.value,[S]:p},_&&clearTimeout(_),_=setTimeout(()=>{_=null,y()},Z)}function ie(S){return r.value={...I,...S},_&&(clearTimeout(_),_=null),y()}function ce(){r.value={...I},t.value=[],n.value=null,a.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:a,mode:l,shortQuery:s,facets:i,hasResults:j,canLoadMore:A,search:y,loadMore:k,setFilter:le,setFilters:ie,reset:ce,PAGE_SIZE:B,SEARCH_DEBOUNCE_MS:Z}}),ge=Object.freeze(["chat","social","email","shopping","travel","system","ai-chat","other"]),ve=Object.freeze({chat:"社交聊天",social:"内容平台",email:"邮件",shopping:"支付订单",travel:"出行",system:"系统数据","ai-chat":"AI 对话",other:"其他"});function N(r){return ve[r]||r||"未知"}const be=Object.freeze([["wechat","chat"],["messaging-","chat"],["social-","social"],["email-","email"],["shopping-","shopping"],["alipay-","shopping"],["travel-","travel"],["system-data","system"],["browser-","system"],["meeting-","system"],["vscode","system"],["vscodium","system"],["jetbrains-ide","system"],["win-recent","system"],["git-activity","system"],["shell-history","system"],["hbuilderx","system"],["local-files","system"],["cursor","ai-chat"],["claude-code","ai-chat"],["ai-chat-","ai-chat"]]);function $(r){if(typeof r!="string"||r.length===0)return"other";for(const[t,n]of be)if(t.endsWith("-")||t==="system-data"){if(r.startsWith(t))return n}else if(r===t)return n;return"other"}const he={__name:"CategorySidebar",props:{selected:{type:String,default:null},facets:{type:Object,default:()=>({byCategory:{},total:0})}},emits:["select"],setup(r,{expose:t}){t();const n=r,e=w(()=>n.facets.total||0),o={chat:Y,social:W,email:K,shopping:H,travel:Q,system:U,"ai-chat":G,other:q};function a(i){return o[i]||q}function l(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:a,badgeStyle:l,computed:w,get AppstoreOutlined(){return q},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return K},get ShoppingOutlined(){return H},get CarOutlined(){return Q},get MobileOutlined(){return U},get RobotOutlined(){return G},get CATEGORIES(){return ge},get categoryLabel(){return N}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},Se={class:"pdh-sidebar"},Oe=["onClick"],we={class:"label"};function Ce(r,t,n,e,o,a){const l=g("a-badge");return u(),O("div",Se,[t[2]||(t[2]=v("div",{class:"sidebar-title"},"数据类型",-1)),v("div",{class:J(["cat-item",{active:n.selected===null}]),onClick:t[0]||(t[0]=s=>r.$emit("select",null))},[c(e.AppstoreOutlined,{class:"icon"}),t[1]||(t[1]=v("span",{class:"label"},"全部",-1)),e.total>0?(u(),C(l,{key:0,count:e.total,"number-style":e.badgeStyle(n.selected===null),"overflow-count":9999},null,8,["count","number-style"])):x("v-if",!0)],2),(u(!0),O(V,null,se(e.CATEGORIES,s=>(u(),O("div",{key:s,class:J(["cat-item",{active:n.selected===s,dim:!n.facets.byCategory[s]}]),onClick:i=>r.$emit("select",s)},[(u(),C(ae(e.iconFor(s)),{class:"icon"})),v("span",we,R(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(l,{key:0,count:n.facets.byCategory[s],"number-style":e.badgeStyle(n.selected===s),"overflow-count":9999},null,8,["count","number-style"])):x("v-if",!0)],10,Oe))),128))])}const ke=D(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-Jx0izG/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),xe={__name:"SearchFilterBar",props:{filters:{type:Object,required:!0},facets:{type:Object,default:()=>({byAdapter:{}})},isLoading:{type:Boolean,default:!1},mode:{type:String,default:null},shortQuery:{type:Boolean,default:!1}},emits:["set-filter","reset"],setup(r,{expose:t,emit:n}){t();const e=r,o=n,a=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),l=w(()=>Object.entries(e.facets.byAdapter||{}).sort((y,k)=>k[1]-y[1]).map(([y,k])=>({value:y,label:`${y} (${k})`}))),s=w(()=>!e.filters.since&&!e.filters.until?null:[e.filters.since?new Date(e.filters.since):null,e.filters.until?new Date(e.filters.until):null]),i=w(()=>!!(e.filters.q||e.filters.adapter||e.filters.subtype||e.filters.since||e.filters.until));function d(h){o("set-filter","q",h||"")}function _(h){o("set-filter","q",h||"")}function j(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[y,k]=h;o("set-filter","since",y?+y:null),o("set-filter","until",k?+k:null)}const A={props:e,emit:o,placeholderText:a,adapterOptions:l,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:_,onDateChange:j,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(A,"__isScriptSetup",{enumerable:!1,value:!0}),A}},Ee={class:"pdh-filter-bar"},Re={key:1,class:"hint"},je={key:2,class:"hint"};function Ae(r,t,n,e,o,a){const l=g("a-input-search"),s=g("a-select"),i=g("a-range-picker"),d=g("a-button");return u(),O("div",Ee,[c(l,{value:n.filters.q,placeholder:e.placeholderText,"enter-button":"搜索","allow-clear":"",loading:n.isLoading,style:{flex:"1","max-width":"480px"},"onUpdate:value":e.onQInput,onSearch:e.onSearch},{prefix:m(()=>[c(e.SearchOutlined)]),_:1},8,["value","placeholder","loading"]),c(s,{value:n.filters.adapter,placeholder:"所有 adapter","allow-clear":"",options:e.adapterOptions,style:{width:"200px"},"onUpdate:value":t[0]||(t[0]=_=>r.$emit("set-filter","adapter",_||null))},null,8,["value","options"]),c(i,{value:e.dateRangeValue,placeholder:["开始日期","结束日期"],style:{width:"280px"},"onUpdate:value":e.onDateChange},null,8,["value"]),e.hasActiveFilters?(u(),C(d,{key:0,type:"link",danger:"",onClick:t[1]||(t[1]=_=>r.$emit("reset"))},{icon:m(()=>[c(e.CloseCircleOutlined)]),default:m(()=>[t[2]||(t[2]=b(" 清空筛选 ",-1))]),_:1})):x("v-if",!0),n.shortQuery?(u(),O("span",Re,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),O("span",je,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):x("v-if",!0)])}const Le=D(xe,[["render",Ae],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-Jx0izG/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Fe={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=L(()=>F(()=>import("./ChatBubbleRenderer-BvoSsCKh.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=L(()=>F(()=>import("./OrderTableRenderer-BtMtQUt7.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=L(()=>F(()=>import("./TimelineRenderer-CQK4PVv4.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),a=L(()=>F(()=>import("./EmailListRenderer-BQdGLZIO.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),l=L(()=>F(()=>import("./GenericCardRenderer-DkJcbBpS.js"),__vite__mapDeps([12,1,2,3,4,13]),import.meta.url));function s(d){const _=d&&d.source&&d.source.adapter;switch($(_)){case"chat":case"ai-chat":return n;case"shopping":return e;case"travel":return o;case"email":return a;default:return l}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:a,GenericCardRenderer:l,rendererFor:s,defineAsyncComponent:L,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function De(r,t,n,e,o,a){return u(),C(ae(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=D(Fe,[["render",De],["__file","/tmp/cc-web-panel-Jx0izG/repo/packages/web-panel/src/components/pdh/renderers/RendererDispatcher.vue"]]);function ee(r){return JSON.stringify(r,null,2)}function te(r){return r.map(t=>JSON.stringify(t)).join(`
|
|
3
|
-
`)+`
|
|
4
|
-
`}function ne(r){const n=["id","subtype","occurredAt","occurredAtIso","actor","place","adapter","summary","contentJson","extraJson"].join(","),e=r.map(o=>{const a=Number.isFinite(o.occurredAt)?o.occurredAt:null,l=a?new Date(a).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",a!=null?String(a):"",l,o.actor||"",o.place||"",s,i,o.content?JSON.stringify(o.content):"",o.extra?JSON.stringify(o.extra):""].map(Ie).join(",")});return[n,...e].join(`
|
|
5
|
-
`)+`
|
|
6
|
-
`}function Ie(r){const t=String(r??"");return t.includes(",")||t.includes('"')||t.includes(`
|
|
7
|
-
`)||t.includes("\r")?'"'+t.replace(/"/g,'""')+'"':t}function re(r,t,n="application/octet-stream"){if(typeof window>"u"||typeof document>"u")return t;const e=new Blob([r],{type:n}),o=URL.createObjectURL(e),a=document.createElement("a");return a.href=o,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),setTimeout(()=>URL.revokeObjectURL(o),1e3),t}function oe(r,t=null){const n=new Date,e=n.getFullYear(),o=String(n.getMonth()+1).padStart(2,"0"),a=String(n.getDate()).padStart(2,"0"),l=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${a}${s}.${l}`}const Pe={__name:"ExportDropdown",props:{events:{type:Array,required:!0},category:{type:String,default:null}},setup(r,{expose:t}){t();const n=r,e=w(()=>n.events.length>0),o={json:"application/json;charset=utf-8",ndjson:"application/x-ndjson;charset=utf-8",csv:"text/csv;charset=utf-8"};function a(i){switch(i){case"json":return ee(n.events);case"ndjson":return te(n.events);case"csv":return ne(n.events);default:throw new Error(`unknown format: ${i}`)}}function l({key:i}){try{const d=a(i),_=oe(i,n.category);re(d,_,o[i]),P.success(`已导出 ${n.events.length} 条到 ${_}`)}catch(d){P.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:a,onClick:l,computed:w,get DownloadOutlined(){return _e},get DownOutlined(){return me},get message(){return P},get eventsToJson(){return ee},get eventsToNdjson(){return te},get eventsToCsv(){return ne},get downloadAs(){return re},get suggestFilename(){return oe}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}};function qe(r,t,n,e,o,a){const l=g("a-button"),s=g("a-menu-item"),i=g("a-menu"),d=g("a-dropdown");return u(),C(d,{disabled:!e.hasResults},{overlay:m(()=>[c(i,{onClick:e.onClick},{default:m(()=>[c(s,{key:"json"},{default:m(()=>[...t[0]||(t[0]=[b("JSON (.json)",-1)])]),_:1}),c(s,{key:"ndjson"},{default:m(()=>[...t[1]||(t[1]=[b("NDJSON (.ndjson)",-1)])]),_:1}),c(s,{key:"csv"},{default:m(()=>[...t[2]||(t[2]=[b("CSV (.csv)",-1)])]),_:1})]),_:1})]),default:m(()=>[c(l,{disabled:!e.hasResults},{icon:m(()=>[c(e.DownloadOutlined)]),default:m(()=>[b(" 导出 ("+R(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const Be=D(Pe,[["render",qe],["__file","/tmp/cc-web-panel-Jx0izG/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Ve={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${N(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function a(s,i){n.setFilter(s,i)}M(()=>{!n.hasResults&&!n.isLoading&&n.search()});const l={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:a,onMounted:M,computed:w,get ReloadOutlined(){return ye},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:ke,SearchFilterBar:Le,RendererDispatcher:Te,ExportDropdown:Be};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}},Ne={class:"pdh-browser-page"},Je={class:"page-header"},Me={class:"main-pane"},ze={class:"results-summary"},Ge={key:0},Ue={key:0},Qe={key:1},He={class:"loaded-of"},Ke={class:"results-list"},We={key:2,class:"load-more"};function Ye(r,t,n,e,o,a){const l=g("a-tag"),s=g("a-button"),i=g("a-space"),d=g("a-col"),_=g("a-spin"),j=g("a-alert"),A=g("a-empty"),h=g("a-row");return u(),O("div",Ne,[v("div",Je,[t[6]||(t[6]=v("div",null,[v("h2",{class:"page-title"},"数据浏览器"),v("p",{class:"page-sub"}," Vault 里所有已采集的数据,按类目浏览 / 全文检索 / 时间窗口筛选。 完全离线,不外传。 ")],-1)),c(i,null,{default:m(()=>[e.store.mode==="fts5"?(u(),C(l,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(l,{key:1,color:"orange"},{default:m(()=>[...t[4]||(t[4]=[b("LIKE 兜底",-1)])]),_:1})):x("v-if",!0),c(e.ExportDropdown,{events:e.store.results,category:e.store.filters.category},null,8,["events","category"]),c(s,{onClick:t[0]||(t[0]=y=>e.store.search()),loading:e.store.isLoading},{icon:m(()=>[c(e.ReloadOutlined)]),default:m(()=>[t[5]||(t[5]=b(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),c(h,{gutter:16,class:"browser-layout"},{default:m(()=>[c(d,{xs:24,sm:24,md:6,lg:5,xl:4},{default:m(()=>[c(e.CategorySidebar,{selected:e.store.filters.category,facets:e.store.facets,onSelect:e.onCategorySelect},null,8,["selected","facets"])]),_:1}),c(d,{xs:24,sm:24,md:18,lg:19,xl:20},{default:m(()=>[v("div",Me,[c(e.SearchFilterBar,{filters:e.store.filters,facets:e.store.facets,"is-loading":e.store.isLoading,mode:e.store.mode,"short-query":e.store.shortQuery,onSetFilter:e.onSetFilter,onReset:t[1]||(t[1]=y=>{e.store.reset(),e.store.search()})},null,8,["filters","facets","is-loading","mode","short-query"]),v("div",ze,[e.store.isLoading&&e.store.results.length===0?(u(),O("span",Ge,[c(_,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),O(V,{key:1},[v("strong",null,R(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),O("span",Ue,[t[8]||(t[8]=b(" / 当前类目 ",-1)),v("strong",null,R(e.categoryLabel(e.store.filters.category)),1),v("strong",null,R(e.store.facets.byCategory[e.store.filters.category]||0),1)])):x("v-if",!0),e.store.filters.q?(u(),O("span",Qe,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,R(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):x("v-if",!0),v("span",He," / 已显示 "+R(e.store.results.length),1)],64))]),e.store.error?(u(),C(j,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):x("v-if",!0),!e.store.isLoading&&e.store.results.length===0&&!e.store.error?(u(),C(A,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):x("v-if",!0),v("div",Ke,[(u(!0),O(V,null,se(e.store.results,(y,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${y.id}`,event:y},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),O("div",We,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=y=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):x("v-if",!0)])]),_:1})]),_:1})])}const nt=D(Ve,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-Jx0izG/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{nt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-Ne8UGllV.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-CPdqZIUX.js";import{a0 as t}from"./index-Ne8UGllV.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-D36Bg2ut.js";import"./useFlexGapSupport-DyH5g7Rg.js";import"./styleChecker-2pT-T8vy.js";import"./index-BNe2lCk6.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DdAN8LeW.js";import{a0 as t}from"./index-Ne8UGllV.js";import"./vendor-Bn1JzzAn.js";import"./index-BNe2lCk6.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|