chainlesschain 0.166.15 → 0.166.17
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 +3 -3
- package/completions/_cc +1 -1
- package/completions/cc.bash +1 -1
- package/completions/cc.fish +1 -1
- package/completions/cc.ps1 +1 -1
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-To-6rimH.js → AIOps-CVW2n2rh.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CpdCnTv3.js → ActionButton-DtuM163O.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DK7VNES_.js → Analytics-BXvl_qHu.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-NZ5FvhCx.js → AppLayout-VDBTFKOp.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-NXceQPmN.js → Artifacts-BNz2xCiG.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-B2d64DH2.js → Audit-DTu9Hn9P.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-ByYgvEVY.js → BackgroundAgents-D2OCPzLe.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BXvQLDvN.js → Backup-C9M-vG7G.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C4GZk-As.js → BaseInput-BUkCNiUQ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CvPuohL8.js → Chat-OJ2ajF7l.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DTftcclX.js → ChatBubbleRenderer-BdZt76Ab.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-C8dQGIqD.js → Checkbox-C1gXKDsc.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DRM6S1W4.js → Codegen-BXbznLg7.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BDM8l-r5.js → Col-CbCq5N0i.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Bvmfi1fX.js → Community-V8Ks6Yun.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DGQTCima.js → Compact-DkeHQTpQ.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-D_0C-2P6.js → Compliance-JeLKwn4Q.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-3C_q99ok.js → Cowork-azfetcBz.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CIiMQ1Hl.js → Cron-Q691i_Gp.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-peebGnES.js → Crosschain-BLjDRbr_.js} +1 -1
- package/src/assets/web-panel/assets/{DID-OkX4KB9T.js → DID-D8ptXplK.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-D9lm0Wxa.js → Dashboard-Ctj2VVZL.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CitActXx.js → Dropdown-D8VgkMJ8.js} +1 -1
- package/src/assets/web-panel/assets/EmailListRenderer-CQPe5S6q.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CBWAi8XL.js → FamilyGuardDashboard-ySA-7SiN.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-afj8jDcp.js → Federation-1PMD-fBf.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Dabt59KY.js → FormItemContext-C_jr6U4Q.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BQpXA9kj.js → GenericCardRenderer-Bu3bKf2B.js} +1 -1
- package/src/assets/web-panel/assets/{Git-D2p2Moo1.js → Git-Dv4Fa_T5.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DkFfPykv.js → Governance-DOEy1n1k.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-C1DKpeN2.js → Inference-DkvqzWcJ.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CjfVg4oQ.js → KnowledgeGraph-DdUJK949.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D-zMvdSf.js → Logs-CRelcdUZ.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-jzEpGkbc.js → MarkdownRenderer-0AHbbTA4.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DfAjJLyS.js → Marketplace-BuuBKsev.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BGDHQES1.js → McpTools-DlgpEmA1.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BYqrGAPS.js → Memory-DTfdqUGy.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CQ6FEtty.js → MobileBridge-CXLE5ZFO.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BpMvh5JW.js → MobileProjects-Dz25OB0n.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CWH25SrU.js → Mtc-kEL0fhgD.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-D6DiLmei.js → MtcAudit-BE4UvFJU.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BSxRN4jD.js → Multisig-CSApSn8c.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-C0FDPKT4.js → NLProgramming-D11FpKWx.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-VKR78bH-.js → Notes-CDL-D2CS.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DLSklSZB.js → NotificationSettings-C0Q6lO-c.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-ZRE0OKbj.js +1 -0
- package/src/assets/web-panel/assets/{Organization-BB3pB27e.js → Organization-Dc-maVAq.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Cr7bzwcs.js → Overflow-B5mUpSvi.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D1fkMMzI.js → P2P-TjXV53wq.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DvV2btIr.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-c3Ijv0v4.js → Permissions-DKRzQ2O6.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BJwbh3P2.js → PersonalDataHub-Dx2eqft8.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-C4fhXafB.js → Pipeline-CnYZMB5p.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DzSx3CD-.js → Privacy-BonKpPnp.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-D9fL5fED.js → ProjectInit-DWO0Du3J.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CB5FVrOR.js → ProjectSettings-C9jqyYRv.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DWhwdgfY.js → Projects-CYpKwXbz.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-B9ZH4faS.js → Providers-CW-fkwJq.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BLKDHT8_.js → QrScannerModal-Cw0J3Zud.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-D1oYUcSY.js → QuickAsk-BH4A4IpR.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CC2nmrOD.js → Recommend-CDwMwJus.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-qW9QF4-r.js → RemoteSession-DKIPwzTf.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BDWqfzcr.js → Reputation-CklDj7qS.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BBV2iCjT.js → Row-DJWZKsH0.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CcwrNwZB.js → RssFeed-BfSLCewo.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Dr6fZ0D_.js → Search-B0IST--x.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BPzaoCU6.js → Security-h1sYNWtt.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BoKUU1I_.js → Services-Gh0-oxI_.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-C8lT8GUg.js → Skeleton-CNDV_jOs.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DPpWeicz.js → Skills-ByCLTh1n.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-UiijzpMU.js → Sla-BfyrJTJz.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DoofrLwS.js → SpeechSettings-BQzo9kNX.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DXnyfTDw.js → SyncSettings-B6fS6z_1.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-g_WHjKeg.js → Tasks-C-uKCP-l.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DRuCh9g2.js → Templates-D6oDy7wL.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-QHIq1pH1.js → Tenant-D3LT2wNQ.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-G0fuI216.js → Terminal-BteLcv_O.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-4MT7SpGk.js → TimelineRenderer-DHHuxfqH.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-B5xT5umA.js → Tokens-BRQeykXw.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-D7HPbNgc.js → Trigger-p2XaFWEu.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CxH69dU5.js → Trust-BxadBMft.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CPPosveH.js → UkeySign-DRBP7LDk.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Du5lGwAt.js → VideoEditing-CZ3NZkh7.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BBIGNESK.js → Wallet-C3NTBN7G.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Cc3HSGmv.js → WebAuthn-C7LVgMlb.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DBoVPNCh.js → WorkflowEditor-0_Iveog7.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DHcjgiem.js → chat-DzzluYo3.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DrRrvJIV.js → colors-DSMYXpaj.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BuY_sAoN.js → compact-item-W76u1VSV.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CepH1Fha.js → createContext-otsESjb5.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BztaXF84.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Dh80Ot6o.js → hasIn-3sNLrvug.js} +1 -1
- package/src/assets/web-panel/assets/index-4jP_hG_4.js +1 -0
- package/src/assets/web-panel/assets/{index-LBkSOwky.js → index-B1I1AYJs.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0rvJjId.js → index-B5LOYdYm.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6tOVlq-.js → index-B9X_jqXe.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7lstbTh.js → index-BA8mZxd-.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPDEOOlA.js → index-BDlDO2px.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuSUCH7h.js → index-BJsQio5O.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEfVkKIY.js → index-BRsD1PT2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYydOga6.js → index-BXLx9HfA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DkZP_QaB.js → index-BcGJtmHM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnVIvc15.js → index-BdtmEKat.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuRYBWrj.js → index-BpcQYzP7.js} +1 -1
- package/src/assets/web-panel/assets/{index-By0qqC3S.js → index-C2aht9-M.js} +1 -1
- package/src/assets/web-panel/assets/{index-C10033eO.js → index-CE7tSow-.js} +1 -1
- package/src/assets/web-panel/assets/{index-9crgJ3Id.js → index-CENWwjef.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNQK9DIr.js → index-CKoFyHYQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUNyTmkS.js → index-Cg86EzNp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnRK8_Dd.js → index-ClOFeZ-t.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW9Pycxh.js → index-CtFOt5x1.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5_K3GKu.js → index-D7A5U2IH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRy3_beb.js → index-DH4cl52p.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWANFMlq.js → index-DLDh1OW3.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5vhNRqS.js → index-DMmdIpLA.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ca5d64IH.js → index-DS9WYDMf.js} +1 -1
- package/src/assets/web-panel/assets/{index-zGH9zH3w.js → index-DTA8Iavv.js} +3 -3
- package/src/assets/web-panel/assets/{index-BoRy2yup.js → index-DZKAzEge.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx21_p3m.js → index-DdU7IkKX.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9Gh-SOn.js → index-Ddd4mird.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiUx-tkV.js → index-DmpaC2yk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYN49m7k.js → index-GlIOE4ja.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUnd5hyp.js → index-MhQQ3h8q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CW_23-gU.js → index-NaO9AE-F.js} +1 -1
- package/src/assets/web-panel/assets/{index-0TYLnd11.js → index-UUHCwfNq.js} +1 -1
- package/src/assets/web-panel/assets/{index-NS9dW1F1.js → index-pVm_iUre.js} +1 -1
- package/src/assets/web-panel/assets/{index-hYaigdGm.js → index-q7ftLqNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-A5lVwYVq.js → index-uSCkbpZH.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtqigRzf.js → index-vBKPcmAP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiZQooWK.js → index-vUmYkqmu.js} +1 -1
- package/src/assets/web-panel/assets/index-zxwuAXL5.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-nI_X3wKl.js → initDefaultProps-DF6llUXV.js} +1 -1
- package/src/assets/web-panel/assets/{motion-LUHbQu_R.js → motion-vtDV8_5K.js} +1 -1
- package/src/assets/web-panel/assets/{move-DHI_KvJt.js → move-B6c0bdy2.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-AYdL_7Mo.js → mtc-parser-DlLYWuBK.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CtV3HRKa.js → omit-BH0zOxLN.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CcJLTOu4.js → pickAttrs-D9di8_In.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DHbiLUps.js → placementArrow-BDSngufM.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BC2DGkWP.js → responsiveObserve-C_EawMvP.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B4ga4pPY.js → slide-B_4wShxA.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-hzphgKfH.js → statusUtils-CbQu6qJ-.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-IfN9Bxoi.js → styleChecker-CvXJWYXb.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-pcGKJ4pT.js → useFlexGapSupport-jjY1XknO.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-COXhQpTG.js → useFs-CMXBdsK_.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-xp9F9szv.js → usePersonalDataHub-YbAhhPXx.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BdSQy1Ve.js → vnode-BFCTKc0H.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CHCt5P55.js → zoom-CY9aBl5O.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/command-manifest.json +2 -2
- package/src/commands/evolution.js +30 -17
- package/src/commands/learning.js +95 -9
- package/src/commands/team.js +5 -0
- package/src/data/changelog.json +28 -2
- package/src/lib/agent-team/task-lease.js +12 -1
- package/src/lib/capability-manifest.js +212 -1
- package/src/lib/evolution/bounded-skill-improvement-pilot.js +498 -0
- package/src/lib/evolution/evolution-artifact-ports.js +3277 -0
- package/src/lib/evolution/evolution-eval-gate.js +6442 -0
- package/src/lib/evolution/evolution-evidence-projector.js +3786 -0
- package/src/lib/evolution/evolution-ledger-ports.js +2689 -0
- package/src/lib/evolution/evolution-ledger.js +4280 -0
- package/src/lib/evolution/evolution-run-runtime-adapter.js +5 -0
- package/src/lib/evolution/skill-candidate-registry.js +2258 -0
- package/src/lib/evolution/skill-evaluated-promotion-durability.js +899 -0
- package/src/lib/evolution/skill-evaluated-promotion.js +481 -0
- package/src/lib/evolution/skill-execution-manifest.js +942 -0
- package/src/lib/evolution/skill-mutation-authority.js +1677 -0
- package/src/lib/evolution/skill-promotion-controller.js +618 -0
- package/src/lib/evolution/skill-release-registry.js +3277 -0
- package/src/lib/evolution/skill-target-matrix-eval.js +3233 -0
- package/src/lib/evolution/skill-writer-inventory-manifest.js +998 -0
- package/src/lib/evolution/skill-writer-inventory-validator.js +816 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +343 -0
- package/src/lib/formal-quality-eval-runtime.js +100 -0
- package/src/lib/graph-kernel/cutover-contract.js +7 -0
- package/src/lib/graph-kernel/cutover-ledger.js +8 -7
- package/src/lib/graph-kernel/evidence-digest.js +47 -0
- package/src/lib/graph-kernel/evolution-run-runtime-adapter.js +5 -0
- package/src/lib/graph-kernel/graph-runtime-surfaces.json +8 -1
- package/src/lib/graph-kernel/production-cutover-evidence.js +342 -15
- package/src/lib/graph-kernel/production-source-evidence.js +1599 -0
- package/src/lib/graph-kernel/retirement-evidence.js +15 -5
- package/src/lib/graph-kernel/runtime-surface-manifest.js +67 -2
- package/src/lib/headless-manifest.js +3 -1
- package/src/lib/hooks-v2-runtime.js +20 -0
- package/src/lib/learning/skill-improver.js +311 -43
- package/src/lib/learning/skill-synthesizer.js +236 -16
- package/src/lib/secure-fs.js +20 -0
- package/src/runtime/agent-core.js +68 -0
- package/src/assets/web-panel/assets/EmailListRenderer-DSmFkNKV.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Dpj7D6tC.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-BiDEbLNA.js +0 -7
- package/src/assets/web-panel/assets/devWarning-DIb8j04q.js +0 -1
- package/src/assets/web-panel/assets/index-BJc3t4PC.js +0 -1
- package/src/assets/web-panel/assets/index-CkksSUnI.js +0 -1
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
* 1. Find eligible trajectories
|
|
13
13
|
* 2. Check for duplicates (tool chain fingerprint)
|
|
14
14
|
* 3. Send to LLM for pattern extraction
|
|
15
|
-
* 4. Generate SKILL.md
|
|
16
|
-
* 5.
|
|
15
|
+
* 4. Generate and evaluate a candidate SKILL.md
|
|
16
|
+
* 5. Persist the accepted candidate to an isolated candidate registry
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import fs from "fs";
|
|
@@ -24,6 +24,8 @@ import path from "path";
|
|
|
24
24
|
|
|
25
25
|
const _deps = { fs, path };
|
|
26
26
|
|
|
27
|
+
export const SYNTHESIS_UNAVAILABLE_CODE = "LEARNING_SYNTHESIS_UNAVAILABLE";
|
|
28
|
+
|
|
27
29
|
// ── Helpers ─────────────────────────────────────────────
|
|
28
30
|
|
|
29
31
|
/**
|
|
@@ -79,6 +81,42 @@ export function generateSkillName(userIntent) {
|
|
|
79
81
|
);
|
|
80
82
|
}
|
|
81
83
|
|
|
84
|
+
/**
|
|
85
|
+
* Skill names become path segments in the candidate registry. Keep the
|
|
86
|
+
* accepted grammar deliberately small so an LLM response cannot escape the
|
|
87
|
+
* configured registry root.
|
|
88
|
+
* @param {string} skillName
|
|
89
|
+
* @returns {boolean}
|
|
90
|
+
*/
|
|
91
|
+
export function isSafeSkillName(skillName) {
|
|
92
|
+
return (
|
|
93
|
+
typeof skillName === "string" &&
|
|
94
|
+
/^[\p{L}\p{N}][\p{L}\p{N}._-]{0,127}$/u.test(skillName) &&
|
|
95
|
+
skillName !== "." &&
|
|
96
|
+
skillName !== ".." &&
|
|
97
|
+
!skillName.includes("..")
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function rootContains(parentRoot, childRoot) {
|
|
102
|
+
if (!parentRoot || !childRoot) return false;
|
|
103
|
+
const parent = path.resolve(parentRoot);
|
|
104
|
+
const child = path.resolve(childRoot);
|
|
105
|
+
const relative = path.relative(parent, child);
|
|
106
|
+
return (
|
|
107
|
+
relative === "" ||
|
|
108
|
+
(relative !== ".." &&
|
|
109
|
+
!relative.startsWith(`..${path.sep}`) &&
|
|
110
|
+
!path.isAbsolute(relative))
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function rootsOverlap(firstRoot, secondRoot) {
|
|
115
|
+
return (
|
|
116
|
+
rootContains(firstRoot, secondRoot) || rootContains(secondRoot, firstRoot)
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
82
120
|
// ── LLM prompt template ─────────────────────────────────
|
|
83
121
|
|
|
84
122
|
/**
|
|
@@ -167,7 +205,7 @@ export class SkillSynthesizer {
|
|
|
167
205
|
* @param {import("better-sqlite3").Database} db
|
|
168
206
|
* @param {function} llmChat — async (messages) => string (LLM response)
|
|
169
207
|
* @param {import("./trajectory-store.js").TrajectoryStore} trajectoryStore
|
|
170
|
-
* @param {{minToolCount?:number, minScore?:number, minSimilar?:number,
|
|
208
|
+
* @param {{minToolCount?:number, minScore?:number, minSimilar?:number, candidateOutputDir?:string, activeSkillsDirs?:string[], evaluateCandidate?:function}} [config]
|
|
171
209
|
*/
|
|
172
210
|
constructor(db, llmChat, trajectoryStore, config = {}) {
|
|
173
211
|
this.db = db;
|
|
@@ -176,14 +214,80 @@ export class SkillSynthesizer {
|
|
|
176
214
|
this.minToolCount = config.minToolCount ?? 5;
|
|
177
215
|
this.minScore = config.minScore ?? 0.7;
|
|
178
216
|
this.minSimilar = config.minSimilar ?? 2;
|
|
179
|
-
this.
|
|
217
|
+
this.candidateOutputDir = config.candidateOutputDir || null;
|
|
218
|
+
const configuredActiveSkillsDirs = Array.isArray(config.activeSkillsDirs)
|
|
219
|
+
? config.activeSkillsDirs
|
|
220
|
+
: [];
|
|
221
|
+
this.activeSkillsDirs = configuredActiveSkillsDirs.filter(
|
|
222
|
+
(root) => typeof root === "string" && root.trim().length > 0,
|
|
223
|
+
);
|
|
224
|
+
this.activeSkillsDirsInvalid =
|
|
225
|
+
configuredActiveSkillsDirs.length !== this.activeSkillsDirs.length;
|
|
226
|
+
this.evaluateCandidate =
|
|
227
|
+
typeof config.evaluateCandidate === "function"
|
|
228
|
+
? config.evaluateCandidate
|
|
229
|
+
: null;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Report whether this instance can truthfully create persisted candidates.
|
|
234
|
+
* No trajectory is queried or mutated while the synthesizer is unavailable.
|
|
235
|
+
* @returns {{available:boolean, missingDependencies:string[], blockers:string[]}}
|
|
236
|
+
*/
|
|
237
|
+
getAvailability() {
|
|
238
|
+
const missingDependencies = [];
|
|
239
|
+
const blockers = [];
|
|
240
|
+
if (typeof this.llmChat !== "function") missingDependencies.push("llm");
|
|
241
|
+
if (!this.candidateOutputDir) {
|
|
242
|
+
missingDependencies.push("candidate-output-registry");
|
|
243
|
+
}
|
|
244
|
+
if (typeof this.evaluateCandidate !== "function") {
|
|
245
|
+
missingDependencies.push("candidate-evaluator");
|
|
246
|
+
}
|
|
247
|
+
if (this.activeSkillsDirs.length === 0) {
|
|
248
|
+
missingDependencies.push("active-skill-registry-roots");
|
|
249
|
+
}
|
|
250
|
+
if (this.activeSkillsDirsInvalid) {
|
|
251
|
+
blockers.push("active-skill-registry-roots-invalid");
|
|
252
|
+
}
|
|
253
|
+
if (
|
|
254
|
+
this.candidateOutputDir &&
|
|
255
|
+
this.activeSkillsDirs.some((activeRoot) =>
|
|
256
|
+
rootsOverlap(activeRoot, this.candidateOutputDir),
|
|
257
|
+
)
|
|
258
|
+
) {
|
|
259
|
+
blockers.push("candidate-output-overlaps-active-skill-tree");
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
available: missingDependencies.length === 0 && blockers.length === 0,
|
|
263
|
+
missingDependencies,
|
|
264
|
+
blockers,
|
|
265
|
+
};
|
|
180
266
|
}
|
|
181
267
|
|
|
182
268
|
/**
|
|
183
269
|
* Scan for eligible trajectories and synthesize skills.
|
|
184
|
-
* @returns {Promise<{created: string[], skipped: string[]}>}
|
|
270
|
+
* @returns {Promise<{status:string, created: string[], skipped: string[], errors?:string[], code?:string, reason?:string, missingDependencies?:string[], blockers?:string[]}>}
|
|
185
271
|
*/
|
|
186
272
|
async synthesize() {
|
|
273
|
+
const availability = this.getAvailability();
|
|
274
|
+
if (!availability.available) {
|
|
275
|
+
const issues = [
|
|
276
|
+
...availability.missingDependencies.map((item) => `missing ${item}`),
|
|
277
|
+
...availability.blockers,
|
|
278
|
+
];
|
|
279
|
+
const reason = `Synthesis unavailable: ${issues.join(", ")}`;
|
|
280
|
+
return {
|
|
281
|
+
status: "unavailable",
|
|
282
|
+
code: SYNTHESIS_UNAVAILABLE_CODE,
|
|
283
|
+
reason,
|
|
284
|
+
missingDependencies: availability.missingDependencies,
|
|
285
|
+
blockers: availability.blockers,
|
|
286
|
+
created: [],
|
|
287
|
+
skipped: [],
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
187
291
|
const candidates = this.trajectoryStore.findComplexUnprocessed({
|
|
188
292
|
minToolCount: this.minToolCount,
|
|
189
293
|
minScore: this.minScore,
|
|
@@ -192,6 +296,7 @@ export class SkillSynthesizer {
|
|
|
192
296
|
|
|
193
297
|
const created = [];
|
|
194
298
|
const skipped = [];
|
|
299
|
+
const errors = [];
|
|
195
300
|
|
|
196
301
|
for (const traj of candidates) {
|
|
197
302
|
try {
|
|
@@ -225,25 +330,56 @@ export class SkillSynthesizer {
|
|
|
225
330
|
|
|
226
331
|
// Generate and persist
|
|
227
332
|
const skillName = pattern.name || generateSkillName(traj.userIntent);
|
|
333
|
+
if (!isSafeSkillName(skillName)) {
|
|
334
|
+
skipped.push(`${traj.id}: invalid candidate skill name`);
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
228
337
|
const content = generateSkillMd(
|
|
229
338
|
pattern,
|
|
230
339
|
traj.id,
|
|
231
340
|
traj.outcomeScore || 0.7,
|
|
232
341
|
);
|
|
233
342
|
|
|
234
|
-
|
|
235
|
-
|
|
343
|
+
const evaluation = await this.evaluateCandidate({
|
|
344
|
+
skillName,
|
|
345
|
+
content,
|
|
346
|
+
pattern,
|
|
347
|
+
trajectory: traj,
|
|
348
|
+
});
|
|
349
|
+
const accepted =
|
|
350
|
+
evaluation === true ||
|
|
351
|
+
(evaluation &&
|
|
352
|
+
typeof evaluation === "object" &&
|
|
353
|
+
evaluation.accepted === true);
|
|
354
|
+
if (!accepted) {
|
|
355
|
+
const evaluationReason =
|
|
356
|
+
evaluation && typeof evaluation === "object"
|
|
357
|
+
? evaluation.reason
|
|
358
|
+
: null;
|
|
359
|
+
skipped.push(
|
|
360
|
+
`${traj.id}: evaluator rejected candidate${evaluationReason ? ` - ${evaluationReason}` : ""}`,
|
|
361
|
+
);
|
|
362
|
+
continue;
|
|
236
363
|
}
|
|
237
364
|
|
|
238
|
-
|
|
365
|
+
await this._persistSkill(skillName, content);
|
|
366
|
+
|
|
367
|
+
// Only durable, evaluated candidates count as synthesized.
|
|
239
368
|
this.trajectoryStore.markSynthesized(traj.id, skillName);
|
|
240
369
|
created.push(skillName);
|
|
241
370
|
} catch (err) {
|
|
242
|
-
|
|
371
|
+
const message = `${traj.id}: error - ${err.message}`;
|
|
372
|
+
skipped.push(message);
|
|
373
|
+
errors.push(message);
|
|
243
374
|
}
|
|
244
375
|
}
|
|
245
376
|
|
|
246
|
-
return {
|
|
377
|
+
return {
|
|
378
|
+
status: errors.length > 0 ? "error" : "completed",
|
|
379
|
+
created,
|
|
380
|
+
skipped,
|
|
381
|
+
errors,
|
|
382
|
+
};
|
|
247
383
|
}
|
|
248
384
|
|
|
249
385
|
/**
|
|
@@ -297,19 +433,103 @@ export class SkillSynthesizer {
|
|
|
297
433
|
}
|
|
298
434
|
|
|
299
435
|
/**
|
|
300
|
-
* Write SKILL.md to the output
|
|
436
|
+
* Write SKILL.md to the isolated candidate output registry.
|
|
301
437
|
* @param {string} skillName
|
|
302
438
|
* @param {string} content
|
|
303
439
|
* @returns {Promise<{skillDir:string, skillFile:string}>}
|
|
304
440
|
*/
|
|
305
441
|
async _persistSkill(skillName, content) {
|
|
306
|
-
|
|
307
|
-
|
|
442
|
+
if (!this.candidateOutputDir) {
|
|
443
|
+
throw new Error("candidate output registry is unavailable");
|
|
444
|
+
}
|
|
445
|
+
if (!isSafeSkillName(skillName)) {
|
|
446
|
+
throw new Error("invalid candidate skill name");
|
|
447
|
+
}
|
|
448
|
+
const availability = this.getAvailability();
|
|
449
|
+
if (!availability.available) {
|
|
450
|
+
throw new Error(
|
|
451
|
+
`candidate output boundary unavailable: ${[
|
|
452
|
+
...availability.missingDependencies,
|
|
453
|
+
...availability.blockers,
|
|
454
|
+
].join(", ")}`,
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
this._assertCandidateFilesystemSupport();
|
|
458
|
+
const candidateRoot = await this._ensurePrivateDirectory(
|
|
459
|
+
this.candidateOutputDir,
|
|
460
|
+
{ recursive: true },
|
|
461
|
+
);
|
|
462
|
+
await this._assertRealpathIsolation(candidateRoot);
|
|
463
|
+
|
|
464
|
+
const skillNamespace = _deps.path.join(this.candidateOutputDir, skillName);
|
|
465
|
+
const canonicalSkillNamespace =
|
|
466
|
+
await this._ensurePrivateDirectory(skillNamespace);
|
|
467
|
+
this._assertPathWithinCandidateRoot(candidateRoot, canonicalSkillNamespace);
|
|
468
|
+
const skillDir = _deps.path.join(canonicalSkillNamespace, "1.0.0");
|
|
469
|
+
const canonicalSkillDir = await this._ensurePrivateDirectory(skillDir);
|
|
470
|
+
this._assertPathWithinCandidateRoot(candidateRoot, canonicalSkillDir);
|
|
471
|
+
const skillFile = _deps.path.join(canonicalSkillDir, "SKILL.md");
|
|
472
|
+
|
|
473
|
+
await _deps.fs.promises.writeFile(skillFile, content, {
|
|
474
|
+
encoding: "utf-8",
|
|
475
|
+
flag: "wx",
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
return { skillDir: canonicalSkillDir, skillFile };
|
|
479
|
+
}
|
|
308
480
|
|
|
309
|
-
|
|
310
|
-
|
|
481
|
+
_assertCandidateFilesystemSupport() {
|
|
482
|
+
if (
|
|
483
|
+
typeof _deps.fs.promises.realpath !== "function" ||
|
|
484
|
+
typeof _deps.fs.promises.lstat !== "function"
|
|
485
|
+
) {
|
|
486
|
+
throw new Error(
|
|
487
|
+
"candidate filesystem identity support unavailable; refusing write",
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
async _ensurePrivateDirectory(directory, options = {}) {
|
|
493
|
+
let stat;
|
|
494
|
+
try {
|
|
495
|
+
stat = await _deps.fs.promises.lstat(directory);
|
|
496
|
+
} catch (error) {
|
|
497
|
+
if (error?.code !== "ENOENT") throw error;
|
|
498
|
+
try {
|
|
499
|
+
await _deps.fs.promises.mkdir(directory, {
|
|
500
|
+
recursive: options.recursive === true,
|
|
501
|
+
mode: 0o700,
|
|
502
|
+
});
|
|
503
|
+
} catch (mkdirError) {
|
|
504
|
+
if (mkdirError?.code !== "EEXIST") throw mkdirError;
|
|
505
|
+
}
|
|
506
|
+
stat = await _deps.fs.promises.lstat(directory);
|
|
507
|
+
}
|
|
508
|
+
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
509
|
+
throw new Error(
|
|
510
|
+
`candidate directory is not a trusted directory: ${directory}`,
|
|
511
|
+
);
|
|
512
|
+
}
|
|
513
|
+
return _deps.fs.promises.realpath(directory);
|
|
514
|
+
}
|
|
311
515
|
|
|
312
|
-
|
|
516
|
+
async _assertRealpathIsolation(candidateRoot) {
|
|
517
|
+
const activeRoots = await Promise.all(
|
|
518
|
+
this.activeSkillsDirs.map((root) => _deps.fs.promises.realpath(root)),
|
|
519
|
+
);
|
|
520
|
+
if (activeRoots.some((root) => rootsOverlap(root, candidateRoot))) {
|
|
521
|
+
throw new Error(
|
|
522
|
+
"candidate output resolves into an active skill tree; refusing write",
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
_assertPathWithinCandidateRoot(candidateRoot, candidatePath) {
|
|
528
|
+
if (!rootContains(candidateRoot, candidatePath)) {
|
|
529
|
+
throw new Error(
|
|
530
|
+
"candidate parent resolves outside the candidate root; refusing write",
|
|
531
|
+
);
|
|
532
|
+
}
|
|
313
533
|
}
|
|
314
534
|
}
|
|
315
535
|
|
package/src/lib/secure-fs.js
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
win32,
|
|
10
10
|
posix,
|
|
11
11
|
} from "node:path";
|
|
12
|
+
import { isFormalQualityHermeticRuntime } from "./formal-quality-eval-runtime.js";
|
|
12
13
|
|
|
13
14
|
export const PRIVATE_DIRECTORY_MODE = 0o700;
|
|
14
15
|
export const PRIVATE_FILE_MODE = 0o600;
|
|
@@ -608,6 +609,21 @@ const WINDOWS_ACL_BATCH_SIZE = 500;
|
|
|
608
609
|
const WINDOWS_ACL_TIMEOUT_ENV = "CC_SECURE_FS_WINDOWS_ACL_TIMEOUT_MS";
|
|
609
610
|
const MAX_WINDOWS_ACL_TIMEOUT_MS = 5 * 60_000;
|
|
610
611
|
|
|
612
|
+
export function _windowsAclWorkingDirectory(
|
|
613
|
+
environment = process.env,
|
|
614
|
+
filesystem = fs,
|
|
615
|
+
) {
|
|
616
|
+
if (!isFormalQualityHermeticRuntime(environment)) return null;
|
|
617
|
+
const configuredHome = resolve(String(environment.CHAINLESSCHAIN_HOME));
|
|
618
|
+
try {
|
|
619
|
+
const entry = filesystem.lstatSync(configuredHome);
|
|
620
|
+
if (!entry.isDirectory() || entry.isSymbolicLink()) return null;
|
|
621
|
+
} catch {
|
|
622
|
+
return null;
|
|
623
|
+
}
|
|
624
|
+
return configuredHome;
|
|
625
|
+
}
|
|
626
|
+
|
|
611
627
|
// Windows hosted runners can need more than the normal 15/30 second allowance
|
|
612
628
|
// to cold-start PowerShell and load the access-control types. A trusted harness
|
|
613
629
|
// may raise (but never lower) that allowance; the cap prevents an inherited
|
|
@@ -636,6 +652,7 @@ function repairWindowsAclOnce(target, deps, options) {
|
|
|
636
652
|
}
|
|
637
653
|
|
|
638
654
|
function windowsAcl(target, operation, deps) {
|
|
655
|
+
const workingDirectory = _windowsAclWorkingDirectory(process.env, deps.fs);
|
|
639
656
|
const result = deps.spawnSync(
|
|
640
657
|
"powershell.exe",
|
|
641
658
|
[
|
|
@@ -653,6 +670,7 @@ function windowsAcl(target, operation, deps) {
|
|
|
653
670
|
encoding: "utf8",
|
|
654
671
|
windowsHide: true,
|
|
655
672
|
timeout: _resolveWindowsAclTimeout(15_000),
|
|
673
|
+
...(workingDirectory ? { cwd: workingDirectory } : {}),
|
|
656
674
|
},
|
|
657
675
|
);
|
|
658
676
|
let details = null;
|
|
@@ -679,6 +697,7 @@ function windowsAcl(target, operation, deps) {
|
|
|
679
697
|
|
|
680
698
|
function windowsAclBatch(targets, operation, deps, expectedKind = null) {
|
|
681
699
|
if (targets.length === 0) return [];
|
|
700
|
+
const workingDirectory = _windowsAclWorkingDirectory(process.env, deps.fs);
|
|
682
701
|
const result = deps.spawnSync(
|
|
683
702
|
"powershell.exe",
|
|
684
703
|
[
|
|
@@ -700,6 +719,7 @@ function windowsAclBatch(targets, operation, deps, expectedKind = null) {
|
|
|
700
719
|
windowsHide: true,
|
|
701
720
|
timeout: _resolveWindowsAclTimeout(30_000),
|
|
702
721
|
maxBuffer: 4 * 1024 * 1024,
|
|
722
|
+
...(workingDirectory ? { cwd: workingDirectory } : {}),
|
|
703
723
|
},
|
|
704
724
|
);
|
|
705
725
|
let details = [];
|
|
@@ -19,7 +19,10 @@ import path from "path";
|
|
|
19
19
|
import broker from "../lib/process-execution-broker/index.js";
|
|
20
20
|
import os from "os";
|
|
21
21
|
import { createHash, randomUUID } from "node:crypto";
|
|
22
|
+
import skillInvocationReceipt from "@chainlesschain/session-core/skill-invocation-receipt";
|
|
22
23
|
import { isProxy } from "node:util/types";
|
|
24
|
+
|
|
25
|
+
const { startSkillInvocation, settleSkillInvocation } = skillInvocationReceipt;
|
|
23
26
|
import sharedCodingAgentPolicy from "./coding-agent-policy.cjs";
|
|
24
27
|
import sharedShellPolicy from "./coding-agent-shell-policy.cjs";
|
|
25
28
|
import sharedPermissionRules from "../lib/permission-rules.cjs";
|
|
@@ -3570,6 +3573,8 @@ export async function executeTool(name, args, context = {}) {
|
|
|
3570
3573
|
onProviderReceipt: context.onProviderReceipt || null,
|
|
3571
3574
|
onToolCallBoundary: context.onToolCallBoundary || null,
|
|
3572
3575
|
onToolCallSettlement: context.onToolCallSettlement || null,
|
|
3576
|
+
hookTraceId: context.hookTraceId || null,
|
|
3577
|
+
skillLifecycleMode: context.skillLifecycleMode || "active",
|
|
3573
3578
|
backgroundUsageFailureState: context.backgroundUsageFailureState || null,
|
|
3574
3579
|
planManager,
|
|
3575
3580
|
permissionRules: context.permissionRules || null,
|
|
@@ -3707,6 +3712,7 @@ export async function executeTool(name, args, context = {}) {
|
|
|
3707
3712
|
{ cwd, broker },
|
|
3708
3713
|
)
|
|
3709
3714
|
: null,
|
|
3715
|
+
skipAsyncWithoutDispatcher: true,
|
|
3710
3716
|
},
|
|
3711
3717
|
);
|
|
3712
3718
|
for (const hookResult of outcome.results || []) {
|
|
@@ -5151,6 +5157,7 @@ async function executeToolInner(
|
|
|
5151
5157
|
// Hook-envelope tracing: this run's trace id, threaded into child loops
|
|
5152
5158
|
// (spawn_sub_agent / isolated run_skill) as their parent_id.
|
|
5153
5159
|
hookTraceId = null,
|
|
5160
|
+
skillLifecycleMode = "active",
|
|
5154
5161
|
},
|
|
5155
5162
|
) {
|
|
5156
5163
|
const localToolDescriptor =
|
|
@@ -7866,6 +7873,63 @@ async function executeToolInner(
|
|
|
7866
7873
|
});
|
|
7867
7874
|
}
|
|
7868
7875
|
|
|
7876
|
+
const selectedSkillDigest =
|
|
7877
|
+
match.executionIdentity?.contentDigest ||
|
|
7878
|
+
`sha256:${createHash("sha256").update(admittedSkillBody).digest("hex")}`;
|
|
7879
|
+
const toolSetDigest = `sha256:${createHash("sha256")
|
|
7880
|
+
.update(
|
|
7881
|
+
JSON.stringify(
|
|
7882
|
+
[...(effectiveAllowedToolNames || [])].map(String).sort(),
|
|
7883
|
+
),
|
|
7884
|
+
)
|
|
7885
|
+
.digest("hex")}`;
|
|
7886
|
+
const policyDigest = `sha256:${createHash("sha256")
|
|
7887
|
+
.update(
|
|
7888
|
+
JSON.stringify({
|
|
7889
|
+
hasApprovalGate: Boolean(approvalGate),
|
|
7890
|
+
hasPermissionRules: Boolean(permissionRules),
|
|
7891
|
+
hasSandbox: Boolean(sandbox),
|
|
7892
|
+
hermeticExecution: hermeticExecution === true,
|
|
7893
|
+
}),
|
|
7894
|
+
)
|
|
7895
|
+
.digest("hex")}`;
|
|
7896
|
+
const invocationStartedAt = Date.now();
|
|
7897
|
+
const invocationStart = startSkillInvocation({
|
|
7898
|
+
attributionRequired: ["automatic-candidate", "canary"].includes(
|
|
7899
|
+
skillLifecycleMode,
|
|
7900
|
+
),
|
|
7901
|
+
evolutionRunId: workflowEffectId || sessionId,
|
|
7902
|
+
traceId: hookTraceId || sessionId,
|
|
7903
|
+
trajectorySegmentId: turnId || toolCallId,
|
|
7904
|
+
selectedSkillDigest,
|
|
7905
|
+
routerCandidates: [
|
|
7906
|
+
{
|
|
7907
|
+
digest: selectedSkillDigest,
|
|
7908
|
+
score: 1,
|
|
7909
|
+
reason: "explicit-run_skill",
|
|
7910
|
+
},
|
|
7911
|
+
],
|
|
7912
|
+
providerModelVersion:
|
|
7913
|
+
llmOptions?.provider && llmOptions?.model
|
|
7914
|
+
? `${llmOptions.provider}:${llmOptions.model}`
|
|
7915
|
+
: null,
|
|
7916
|
+
toolSetDigest,
|
|
7917
|
+
osSandboxPermissionPolicyDigest: policyDigest,
|
|
7918
|
+
taskCohort: "cli:run_skill",
|
|
7919
|
+
});
|
|
7920
|
+
const settleInvocation = (executionStatus, result = {}) =>
|
|
7921
|
+
settleSkillInvocation(invocationStart, {
|
|
7922
|
+
executionStatus,
|
|
7923
|
+
graderReceipts: result.graderReceipts || [],
|
|
7924
|
+
userCorrectionRef: result.userCorrectionRef || null,
|
|
7925
|
+
tokensInput:
|
|
7926
|
+
result.usage?.inputTokens || result.usage?.tokensInput || 0,
|
|
7927
|
+
tokensOutput:
|
|
7928
|
+
result.usage?.outputTokens || result.usage?.tokensOutput || 0,
|
|
7929
|
+
costUsd: result.usage?.costUsd || result.costUsd || 0,
|
|
7930
|
+
latencyMs: Date.now() - invocationStartedAt,
|
|
7931
|
+
});
|
|
7932
|
+
|
|
7869
7933
|
// Check if skill requests isolation (via SKILL.md frontmatter)
|
|
7870
7934
|
const skillIsolation = match.isolation === true;
|
|
7871
7935
|
if (skillIsolation) {
|
|
@@ -8066,6 +8130,7 @@ async function executeToolInner(
|
|
|
8066
8130
|
success: false,
|
|
8067
8131
|
isolated: true,
|
|
8068
8132
|
skill: args.skill_name,
|
|
8133
|
+
invocationReceipt: settleInvocation("failed", result),
|
|
8069
8134
|
code: result?.code || "CC_SKILL_ISOLATED_EXECUTION_FAILED",
|
|
8070
8135
|
error: `Isolated skill execution failed: ${failureDetail}`,
|
|
8071
8136
|
...(result?.summary ? { summary: result.summary } : {}),
|
|
@@ -8075,6 +8140,7 @@ async function executeToolInner(
|
|
|
8075
8140
|
success: true,
|
|
8076
8141
|
isolated: true,
|
|
8077
8142
|
skill: args.skill_name,
|
|
8143
|
+
invocationReceipt: settleInvocation("completed", result),
|
|
8078
8144
|
summary: result.summary,
|
|
8079
8145
|
toolsUsed: result.toolsUsed,
|
|
8080
8146
|
});
|
|
@@ -8096,6 +8162,7 @@ async function executeToolInner(
|
|
|
8096
8162
|
success: false,
|
|
8097
8163
|
isolated: true,
|
|
8098
8164
|
skill: args.skill_name,
|
|
8165
|
+
invocationReceipt: settleInvocation("failed"),
|
|
8099
8166
|
code: err?.code || "CC_SKILL_ISOLATED_EXECUTION_FAILED",
|
|
8100
8167
|
error: `Isolated skill execution failed: ${err.message}`,
|
|
8101
8168
|
});
|
|
@@ -8112,6 +8179,7 @@ async function executeToolInner(
|
|
|
8112
8179
|
return attachDescriptor({
|
|
8113
8180
|
error: `Skill "${args.skill_name}" cannot execute handler.js directly. Add isolation: true and use the controlled agent-tool path.`,
|
|
8114
8181
|
code: "CC_SKILL_DIRECT_HANDLER_BLOCKED",
|
|
8182
|
+
invocationReceipt: settleInvocation("blocked"),
|
|
8115
8183
|
policy: { decision: "blocked", via: "skill-execution-boundary" },
|
|
8116
8184
|
});
|
|
8117
8185
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as C,P as c,J as f,U as r,c as g,_ as k,R as n,V as l,K as d,Q as u,S as h,b as t}from"./vendor-Bn1JzzAn.js";import{_ as j}from"./index-zGH9zH3w.js";import{aH as w}from"./icons-DG5UD-6K.js";const M={__name:"EmailListRenderer",props:{event:{type:Object,required:!0}},setup(_,{expose:m}){m();const a=_,e=t(()=>a.event.content||{}),i=t(()=>a.event.extra||{}),p=t(()=>e.value.from||e.value.sender||e.value.fromName||a.event.actor||"(未知发件人)"),s=t(()=>e.value.subject||e.value.title||"(无主题)"),y=t(()=>e.value.snippet||e.value.preview||e.value.body?.slice(0,100)||null),b=t(()=>Array.isArray(e.value.attachments)?e.value.attachments.length:typeof e.value.attachmentCount=="number"?e.value.attachmentCount:0),x=t(()=>i.value.category||e.value.category),S=t(()=>e.value.unread===!0),T=t(()=>{if(!a.event.occurredAt)return"";const o=new Date(a.event.occurredAt);return`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")} ${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`}),v={props:a,c:e,e:i,fromText:p,subjectText:s,snippetText:y,attachmentCount:b,category:x,isUnread:S,formattedTime:T,computed:t,get MailOutlined(){return w}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}},N={class:"email-row"},O={class:"left"},V={class:"body"},A={class:"head"},B={class:"from"},D={class:"time"},E={class:"subject"},L={key:0,class:"snippet"},R={class:"meta"};function U(_,m,a,e,i,p){const s=C("a-tag");return c(),f("div",N,[r("div",O,[g(e.MailOutlined,{class:k(["icon",{unread:e.isUnread}])},null,8,["class"])]),r("div",V,[r("div",A,[r("span",B,n(e.fromText),1),r("span",D,n(e.formattedTime),1)]),r("div",E,n(e.subjectText),1),e.snippetText?(c(),f("div",L,n(e.snippetText),1)):l("v-if",!0),r("div",R,[g(s,{color:"blue",class:"src"},{default:d(()=>[u(n(a.event.source.adapter),1)]),_:1}),e.attachmentCount>0?(c(),h(s,{key:0,color:"orange"},{default:d(()=>[u(" 📎 "+n(e.attachmentCount),1)]),_:1})):l("v-if",!0),e.category?(c(),h(s,{key:1},{default:d(()=>[u(n(e.category),1)]),_:1})):l("v-if",!0)])])])}const P=j(M,[["render",U],["__scopeId","data-v-e4ddf632"],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/components/pdh/renderers/EmailListRenderer.vue"]]);export{P as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as k,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as a}from"./vendor-Bn1JzzAn.js";import{_ as w}from"./index-zGH9zH3w.js";import"./icons-DG5UD-6K.js";const S={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),d=a(()=>o.event.extra||{}),m=a(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),b=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},D={class:"val"},R={class:"row"},B={class:"val"},I={class:"row amount-row"},j={class:"val amount"},q={key:0,class:"row"},A={class:"val mono"},F={key:1,class:"row"};function L(p,r,o,e,d,m){const c=k("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",D,n(e.merchantText),1)]),s("div",R,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",B,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",q,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",A,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",F,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const J=w(S,[["render",L],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{J as default};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-DTftcclX.js","./vendor-Bn1JzzAn.js","./index-zGH9zH3w.js","./icons-DG5UD-6K.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-Dpj7D6tC.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-4MT7SpGk.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-DSmFkNKV.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-BQpXA9kj.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{E as ue,r as R,b as w,I as y,P as u,J as O,U as v,c,S as C,V as E,_ as M,F as V,Z as se,a0 as ae,R as L,K as m,Q as b,W as j,o as J}from"./vendor-Bn1JzzAn.js";import{u as U}from"./usePersonalDataHub-xp9F9szv.js";import{_ as F,e as A,d as q}from"./index-zGH9zH3w.js";import{aa as P,ag as Q,M as z,aI as G,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 ge,R as _e}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=R({...I}),t=R([]),n=R(null),e=R(!1),o=R(!1),a=R(null),l=R(null),s=R(!1),i=R({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,g=null;const x=w(()=>t.value.length>0),D=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 _(){const S=++d;e.value=!0,a.value=null;const p=U();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=U();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},g&&clearTimeout(g),g=setTimeout(()=>{g=null,_()},Z)}function ie(S){return r.value={...I,...S},g&&(clearTimeout(g),g=null),_()}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:x,canLoadMore:D,search:_,loadMore:k,setFilter:le,setFilters:ie,reset:ce,PAGE_SIZE:B,SEARCH_DEBOUNCE_MS:Z}}),ye=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:G,system:z,"ai-chat":Q,other:P};function a(i){return o[i]||P}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 P},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return K},get ShoppingOutlined(){return H},get CarOutlined(){return G},get MobileOutlined(){return z},get RobotOutlined(){return Q},get CATEGORIES(){return ye},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=y("a-badge");return u(),O("div",Se,[t[2]||(t[2]=v("div",{class:"sidebar-title"},"数据类型",-1)),v("div",{class:M(["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"])):E("v-if",!0)],2),(u(!0),O(V,null,se(e.CATEGORIES,s=>(u(),O("div",{key:s,class:M(["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,L(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"])):E("v-if",!0)],10,Oe))),128))])}const ke=F(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),Ee={__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((_,k)=>k[1]-_[1]).map(([_,k])=>({value:_,label:`${_} (${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 g(h){o("set-filter","q",h||"")}function x(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[_,k]=h;o("set-filter","since",_?+_:null),o("set-filter","until",k?+k:null)}const D={props:e,emit:o,placeholderText:a,adapterOptions:l,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:g,onDateChange:x,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(D,"__isScriptSetup",{enumerable:!1,value:!0}),D}},Re={class:"pdh-filter-bar"},Le={key:1,class:"hint"},xe={key:2,class:"hint"};function De(r,t,n,e,o,a){const l=y("a-input-search"),s=y("a-select"),i=y("a-range-picker"),d=y("a-button");return u(),O("div",Re,[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]=g=>r.$emit("set-filter","adapter",g||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]=g=>r.$emit("reset"))},{icon:m(()=>[c(e.CloseCircleOutlined)]),default:m(()=>[t[2]||(t[2]=b(" 清空筛选 ",-1))]),_:1})):E("v-if",!0),n.shortQuery?(u(),O("span",Le,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),O("span",xe,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):E("v-if",!0)])}const je=F(Ee,[["render",De],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Ae={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=j(()=>A(()=>import("./ChatBubbleRenderer-DTftcclX.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=j(()=>A(()=>import("./OrderTableRenderer-Dpj7D6tC.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=j(()=>A(()=>import("./TimelineRenderer-4MT7SpGk.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),a=j(()=>A(()=>import("./EmailListRenderer-DSmFkNKV.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),l=j(()=>A(()=>import("./GenericCardRenderer-BQpXA9kj.js"),__vite__mapDeps([12,1,2,3,4,13]),import.meta.url));function s(d){const g=d&&d.source&&d.source.adapter;switch($(g)){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:j,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function Fe(r,t,n,e,o,a){return u(),C(ae(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=F(Ae,[["render",Fe],["__file","/tmp/cc-web-panel-LDgqkb/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 qe={__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),g=oe(i,n.category);re(d,g,o[i]),q.success(`已导出 ${n.events.length} 条到 ${g}`)}catch(d){q.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:a,onClick:l,computed:w,get DownloadOutlined(){return ge},get DownOutlined(){return me},get message(){return q},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 Pe(r,t,n,e,o,a){const l=y("a-button"),s=y("a-menu-item"),i=y("a-menu"),d=y("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(" 导出 ("+L(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const Be=F(qe,[["render",Pe],["__file","/tmp/cc-web-panel-LDgqkb/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)}J(()=>{!n.hasResults&&!n.isLoading&&n.search()});const l={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:a,onMounted:J,computed:w,get ReloadOutlined(){return _e},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:ke,SearchFilterBar:je,RendererDispatcher:Te,ExportDropdown:Be};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}},Ne={class:"pdh-browser-page"},Me={class:"page-header"},Je={class:"main-pane"},Ue={class:"results-summary"},Qe={key:0},ze={key:0},Ge={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=y("a-tag"),s=y("a-button"),i=y("a-space"),d=y("a-col"),g=y("a-spin"),x=y("a-alert"),D=y("a-empty"),h=y("a-row");return u(),O("div",Ne,[v("div",Me,[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})):E("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]=_=>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",Je,[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]=_=>{e.store.reset(),e.store.search()})},null,8,["filters","facets","is-loading","mode","short-query"]),v("div",Ue,[e.store.isLoading&&e.store.results.length===0?(u(),O("span",Qe,[c(g,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),O(V,{key:1},[v("strong",null,L(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),O("span",ze,[t[8]||(t[8]=b(" / 当前类目 ",-1)),v("strong",null,L(e.categoryLabel(e.store.filters.category)),1),v("strong",null,L(e.store.facets.byCategory[e.store.filters.category]||0),1)])):E("v-if",!0),e.store.filters.q?(u(),O("span",Ge,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,L(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):E("v-if",!0),v("span",He," / 已显示 "+L(e.store.results.length),1)],64))]),e.store.error?(u(),C(x,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):E("v-if",!0),!e.store.isLoading&&e.store.results.length===0&&!e.store.error?(u(),C(D,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):E("v-if",!0),v("div",Ke,[(u(!0),O(V,null,se(e.store.results,(_,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${_.id}`,event:_},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),O("div",We,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=_=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):E("v-if",!0)])]),_:1})]),_:1})])}const nt=F(Ve,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-LDgqkb/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{nt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-zGH9zH3w.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-BBV2iCjT.js";import{a0 as t}from"./index-zGH9zH3w.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-BC2DGkWP.js";import"./useFlexGapSupport-pcGKJ4pT.js";import"./styleChecker-IfN9Bxoi.js";import"./index-B9Gh-SOn.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-BDM8l-r5.js";import{a0 as t}from"./index-zGH9zH3w.js";import"./vendor-Bn1JzzAn.js";import"./index-B9Gh-SOn.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|