chainlesschain 0.166.38 → 0.166.39
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/package.json +6 -1
- package/scripts/governed-learning-local-attestor-service.mjs +222 -0
- package/scripts/governed-learning-local-attestor-trust-approval-service.mjs +338 -0
- package/scripts/governed-learning-local-attestor-trust-operations-service.mjs +575 -0
- package/scripts/governed-learning-windows-secure-pipe-broker.ps1 +375 -0
- package/src/assets/web-panel/assets/{AIOps-DBbcVPqB.js → AIOps-qWUdiFr5.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-D5vETPOk.js → ActionButton-B_f7go3E.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-WVhas3Fw.js → Analytics-hSGFlSkB.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CSTRI93Q.js → AppLayout-CCYGgj71.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BZT8FOoE.js → Artifacts-BdS1H9gq.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CT2-Tsby.js → Audit-Cck9IebC.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BWA5LNBe.js → BackgroundAgents-DZzoM_QS.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B-zEbldA.js → Backup-D8H_QtGu.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BAEwtdNT.js → BaseInput-CTsNF_pu.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BT1-y6t1.js → Chat-CcEiTYY8.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BVijMHeO.js → ChatBubbleRenderer-9BY1DPuc.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-B8IJYZsD.js → Checkbox-BPB9NNJx.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DEt453nL.js → Codegen-CKKMf7jD.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DWuVSmZv.js → Col-DpSSB4Uu.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CcoNuU33.js → Community-CfR6ikoH.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BKtuIYWA.js → Compact-CqnkGGjK.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-bHzxGq3P.js → Compliance-9IzhdVQb.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BY2Kb15t.js → Cowork-eXsgH33N.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DC-j0jvp.js → Cron-DvkzHFRi.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CzEuAHQz.js → Crosschain--az9d9f7.js} +1 -1
- package/src/assets/web-panel/assets/{DID-7QUNq6Fz.js → DID-_Eb4kpnJ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CT6RiEFl.js → Dashboard-aDVisdXj.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CW8IPY7r.js → Dropdown-oQ54XzS9.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Zt8WOLuN.js → EmailListRenderer-BUPdMau1.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-B6aymxi7.js → FamilyGuardDashboard-DtQTOCQI.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BiuFrRq0.js → Federation-Cpnb3Moe.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DaiOAkHa.js → FormItemContext-DmsrJkeU.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D1KbDpXs.js → GenericCardRenderer-CpFDYnh3.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BILl0huA.js → Git-HFG17p7Q.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CLyhrPrh.js → Governance-D5Z5c7N8.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DyNhiIpK.js → Inference-DH159h74.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Bor_ye4m.js → KnowledgeGraph-DuL1pcJD.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-ZDqbu8kg.js → Logs-Gqn8hFsM.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-NHJaejHI.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-DbDi29dH.js → Marketplace-BArcWifg.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DfU8dWbV.js → McpTools-Q1BfBSnd.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DeAz-2-6.js → Memory-Cz8nRL7N.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-ws3TJXal.js → MobileBridge-CRuxLRJw.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CGwVfeTv.js → MobileProjects-B1CQIAGp.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BtJjJJpl.js → Mtc-CFhXZbPk.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BNZwipXs.js → MtcAudit-C69LqcZ5.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-9mSOrKWA.js → Multisig-y7yZeTTG.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-gz1lEDED.js → NLProgramming-DgjhoWea.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BeufuOVX.js → Notes-DRc2WTDh.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CbFyi9jZ.js → NotificationSettings-CLPx24yn.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CMSNA4CO.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DKBKNViH.js → Organization-Dm6LIyhZ.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-CvPfKE1x.js → Overflow-DP4DOYd-.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DjL2q8og.js → P2P-HFwvtFI1.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-D9gPfKRM.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-BUoNho3w.js → Permissions-Bdtxniwh.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C4Iu2Pic.js → PersonalDataHub-Dgl2AbES.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-BiDrIlwr.js → Pipeline-DpZrzYwK.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BnvU6vGp.js → Privacy-EQ551c0t.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DDzoyhnH.js → ProjectInit-xUSeczsM.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CV6b43H0.js → ProjectSettings-B66Sr_t8.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-B0k1907g.js → Projects-B4zikj95.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DaeuFo-x.js → Providers-DjLbqQPh.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C03Bll1h.js → QrScannerModal-KVsAQCd_.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Cn9nLaen.js → QuickAsk-C4noJXu8.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BXfkC8Ts.js → Recommend-Cn15clqY.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DNj6D_LI.js → RemoteSession-DdonMFwH.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DDDIwiUI.js → Reputation-Bqe3NwWN.js} +1 -1
- package/src/assets/web-panel/assets/{Row-JukNm-id.js → Row-CnxBgjkD.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B1AhzL2z.js → RssFeed-CSRrgZyK.js} +2 -2
- package/src/assets/web-panel/assets/{Search-B5y6_DVm.js → Search-DTUYUfFx.js} +1 -1
- package/src/assets/web-panel/assets/{Security-C2pvv32x.js → Security-BHExHVIm.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DBka7ppY.js → Services-B_IWqPes.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DfPwNTSh.js → Skeleton-C_oAtzmX.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Cs4ntp-l.js → Skills-maJNokSL.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CrUJ0guM.js → Sla-CMM_ZsLH.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BFbokLV1.js → SpeechSettings-D7w_oNwK.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CSnh1o3D.js → SyncSettings-D0Zl3NIr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CQZppIPo.js → Tasks-Bs0H0ctR.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BqLeHq7Z.js → Templates-C6T6oCpR.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CkzPA-ri.js → Tenant-ByL-kAYO.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D5IRhnu6.js → Terminal-6JXNhc3b.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-ICdiYzgz.js → TimelineRenderer-KiuUtCsl.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-89CaZBwe.js → Tokens-C0TWTIER.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Di251qR1.js → Trigger-DpC5aaJu.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-M4sC3Mv6.js → Trust-lqqflCwv.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BL7EUWxj.js → UkeySign-BYSlVfBc.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BV5Se5il.js → VideoEditing-DX08oo_R.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-IoY13rov.js → Wallet-CcIFPvzL.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DKFPq0uV.js → WebAuthn-D8DfxfVT.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-oizkYeQD.js → WorkflowEditor-Csadpaln.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Du6ZthE5.js → chat-CewHWc_T.js} +1 -1
- package/src/assets/web-panel/assets/{colors-I2ie73HS.js → colors-B8at89r3.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-C-02XOOx.js → compact-item-v_gxtF5-.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DgP09zg2.js → createContext-BOwFpJqA.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DenB_kSS.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-kWDasRib.js → hasIn-DjHUzt7E.js} +1 -1
- package/src/assets/web-panel/assets/{index-HH3Zccc0.js → index-1Tfwr_GA.js} +1 -1
- package/src/assets/web-panel/assets/{index-M9mzJo6V.js → index-5qmLo1us.js} +1 -1
- package/src/assets/web-panel/assets/index-B8bNwM9U.js +1 -0
- package/src/assets/web-panel/assets/{index-CDM6OO4D.js → index-BC20EQ7h.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cokjvq67.js → index-BGrmPk8T.js} +1 -1
- package/src/assets/web-panel/assets/{index-5Ll5Fdqb.js → index-BPJ7uL2Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-H_31JkaZ.js → index-BRNyE3Kb.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9HwtJX5.js → index-BVPsegMN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bpz5RnQy.js → index-B_egGFcR.js} +3 -3
- package/src/assets/web-panel/assets/{index-CjuJ1FYZ.js → index-BdZLA7k9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx5dAdFu.js → index-Bk_Te9OR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHSghc3j.js → index-Bz8C8VXx.js} +1 -1
- package/src/assets/web-panel/assets/{index-RwcHDSqP.js → index-C7MHbmwn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtbMRqD-.js → index-CFL1Hewx.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0EQSoEb.js → index-CV1SgaBd.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3D5NSjS.js → index-CXIPAeAB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZ6bWk4x.js → index-Ca8YZU2B.js} +1 -1
- package/src/assets/web-panel/assets/{index-AtAiEmjM.js → index-Caf9UjhG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKJ-d5F1.js → index-Cb1uNDOv.js} +1 -1
- package/src/assets/web-panel/assets/{index-mF8UmKqp.js → index-CquUCUzS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpOQeTac.js → index-CwHoF-TP.js} +1 -1
- package/src/assets/web-panel/assets/{index-Na5QA1LE.js → index-Cxk0mCoQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUvpjPMv.js → index-D3o-pacB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZcdP3id.js → index-DA3n0Y28.js} +1 -1
- package/src/assets/web-panel/assets/index-DC0cpgIP.js +1 -0
- package/src/assets/web-panel/assets/{index-LLQQqj9B.js → index-DRRK_8Eg.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5LV04FO.js → index-DUMvVGyf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkcCllZ7.js → index-DdHdbXpy.js} +1 -1
- package/src/assets/web-panel/assets/{index-OYyn8GoU.js → index-Ddw05Myq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgogPjKJ.js → index-Dfrb3Prv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbHEQTU6.js → index-DiKaYIdo.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQCdk4dn.js → index-DmZLZsyC.js} +1 -1
- package/src/assets/web-panel/assets/{index-uHI8QHu4.js → index-FgUrhq_H.js} +1 -1
- package/src/assets/web-panel/assets/{index-I4A_y2Ee.js → index-Khw7wzVk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSlTGxUJ.js → index-San3zacc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYxia8nl.js → index-coOi37of.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkP2DW3a.js → index-hyeBuocp.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ryflob2W.js → index-uk59xr0W.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcVj7YJB.js → index-wjvn8-9F.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BPHGo-UX.js → initDefaultProps-Id2dFdjh.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BBr8JvWc.js → motion-DRxtwxng.js} +1 -1
- package/src/assets/web-panel/assets/{move-CdKWToz7.js → move-BDYvdTb6.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B8tkkKBs.js → mtc-parser-cz8LGI8Z.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DN4aP33H.js → omit-DHJeh6tH.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CoHRkRJq.js → pickAttrs-XJEQIp7e.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DpGGGAPa.js → placementArrow-AFcf8lEn.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BabRsZo5.js → responsiveObserve-CDEeBxs1.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DJjyrwqK.js → slide-CvbVfi6T.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BaRVkO5S.js → statusUtils-DtCyuEnq.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-HcMYUjTR.js → styleChecker--UgmTsGY.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-c3IBzp2l.js → useFlexGapSupport-D9i1as-Y.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DD7igwyF.js → useFs-CJx3zw01.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-GEF0hhnd.js → usePersonalDataHub-ZsIKYdZv.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D51u7zqF.js → vnode-B2RGEQG4.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-tXG23Lc9.js → zoom-ob-0px2z.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/evolution-attestor-trust.js +113 -0
- package/src/commands/evolution.js +2 -0
- package/src/commands/learning.js +34 -5
- package/src/data/changelog.json +13 -0
- package/src/lib/evolution/evolution-artifact-ports.js +21 -0
- package/src/lib/evolution/evolution-deployment-loader.js +56 -0
- package/src/lib/evolution/evolution-immutable-ledger-segment-store.js +812 -0
- package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +218 -0
- package/src/lib/evolution/evolution-ledger-manifest-catalog.js +472 -0
- package/src/lib/evolution/evolution-ledger-manifest-chain.js +997 -0
- package/src/lib/evolution/evolution-ledger-manifest-head-store.js +408 -0
- package/src/lib/evolution/evolution-ledger-manifest-witness-adapter.js +554 -0
- package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +460 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-ipc-endpoint.js +94 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-approval-client.js +485 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ipc-capability.js +200 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-ledger.js +1222 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-cli-host.js +802 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations-client.js +445 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operations.js +1082 -0
- package/src/lib/evolution/governed-skill-synthesis-attestor-trust-operator-registry.js +1453 -0
- package/src/lib/evolution/governed-skill-synthesis-candidate-evaluator.js +147 -0
- package/src/lib/evolution/governed-skill-synthesis-cli-host.js +115 -0
- package/src/lib/evolution/governed-skill-synthesis-evaluation-ledger-adapter.js +715 -0
- package/src/lib/evolution/governed-skill-synthesis-external-attestor.js +499 -0
- package/src/lib/evolution/governed-skill-synthesis-model-evaluator.js +514 -0
- package/src/lib/evolution/governed-skill-synthesis-process-attestor-worker.mjs +208 -0
- package/src/lib/evolution/governed-skill-synthesis-process-attestor.js +557 -0
- package/src/lib/evolution/governed-skill-synthesis-process-grader-worker.mjs +143 -0
- package/src/lib/evolution/governed-skill-synthesis-process-grader.js +444 -0
- package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +220 -0
- package/src/lib/evolution/governed-skill-synthesis-windows-secure-pipe-host.js +236 -0
- package/src/lib/hook-audit-store.js +68 -2
- package/src/lib/hooks-v2-runtime.js +52 -26
- package/src/lib/learning/skill-synthesizer.js +66 -5
- package/src/lib/remote-read-loop-guard.js +30 -3
- package/src/assets/web-panel/assets/MarkdownRenderer-DnSfkf98.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CFbhBT44.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-Cv9PLMWJ.js +0 -7
- package/src/assets/web-panel/assets/devWarning-CxKkOIjh.js +0 -1
- package/src/assets/web-panel/assets/index-b5a6l3Uu.js +0 -1
- package/src/assets/web-panel/assets/index-xt-BOyp_.js +0 -1
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
|
|
6
|
+
const READY_SCHEMA = "chainlesschain.windows-secure-pipe-broker-ready/v1";
|
|
7
|
+
const REQUEST_SCHEMA = "chainlesschain.windows-secure-pipe-broker-request/v1";
|
|
8
|
+
const RESPONSE_SCHEMA = "chainlesschain.windows-secure-pipe-broker-response/v1";
|
|
9
|
+
const SECURITY_KEYS = new Set([
|
|
10
|
+
"acl",
|
|
11
|
+
"aclDigest",
|
|
12
|
+
"peerIdentity",
|
|
13
|
+
"principalDigest",
|
|
14
|
+
"remoteClients",
|
|
15
|
+
]);
|
|
16
|
+
const PIPE_PREFIX = "\\\\.\\pipe\\";
|
|
17
|
+
const PIPE_NAME =
|
|
18
|
+
/^cc-evolution-attestor-trust-(?:approval|ops)-[a-f0-9]{16,64}$/u;
|
|
19
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
20
|
+
|
|
21
|
+
function exact(value, keys) {
|
|
22
|
+
return (
|
|
23
|
+
value &&
|
|
24
|
+
typeof value === "object" &&
|
|
25
|
+
!Array.isArray(value) &&
|
|
26
|
+
Object.getPrototypeOf(value) === Object.prototype &&
|
|
27
|
+
Reflect.ownKeys(value).length === keys.size &&
|
|
28
|
+
Reflect.ownKeys(value).every(
|
|
29
|
+
(key) => typeof key === "string" && keys.has(key),
|
|
30
|
+
)
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function normalizeSecurity(value) {
|
|
35
|
+
if (
|
|
36
|
+
!exact(value, SECURITY_KEYS) ||
|
|
37
|
+
value.acl !== "protected-current-logon-dacl" ||
|
|
38
|
+
value.peerIdentity !== "client-process-token-user-and-logon-sid" ||
|
|
39
|
+
value.remoteClients !== false ||
|
|
40
|
+
!DIGEST.test(value.aclDigest ?? "") ||
|
|
41
|
+
!DIGEST.test(value.principalDigest ?? "")
|
|
42
|
+
) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
"Windows secure pipe broker security descriptor is invalid",
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
return Object.freeze({ ...value });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function powershellPath() {
|
|
51
|
+
const windowsRoot = process.env.SystemRoot || process.env.WINDIR;
|
|
52
|
+
if (typeof windowsRoot !== "string" || windowsRoot.length < 3) {
|
|
53
|
+
throw new Error("Windows secure pipe broker cannot locate PowerShell");
|
|
54
|
+
}
|
|
55
|
+
return path.join(
|
|
56
|
+
windowsRoot,
|
|
57
|
+
"System32",
|
|
58
|
+
"WindowsPowerShell",
|
|
59
|
+
"v1.0",
|
|
60
|
+
"powershell.exe",
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function createGovernedSkillSynthesisWindowsSecurePipeHost({
|
|
65
|
+
endpoint,
|
|
66
|
+
maxFrameBytes,
|
|
67
|
+
onRequest,
|
|
68
|
+
}) {
|
|
69
|
+
if (process.platform !== "win32") {
|
|
70
|
+
throw new Error("Windows secure pipe host is only available on Windows");
|
|
71
|
+
}
|
|
72
|
+
const pipeName = endpoint.startsWith(PIPE_PREFIX)
|
|
73
|
+
? endpoint.slice(PIPE_PREFIX.length)
|
|
74
|
+
: "";
|
|
75
|
+
if (
|
|
76
|
+
!PIPE_NAME.test(pipeName) ||
|
|
77
|
+
!Number.isSafeInteger(maxFrameBytes) ||
|
|
78
|
+
maxFrameBytes < 1024 ||
|
|
79
|
+
maxFrameBytes > 1024 * 1024 ||
|
|
80
|
+
typeof onRequest !== "function"
|
|
81
|
+
) {
|
|
82
|
+
throw new TypeError("Windows secure pipe host configuration is invalid");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const scriptPath = fileURLToPath(
|
|
86
|
+
new URL(
|
|
87
|
+
"../../../scripts/governed-learning-windows-secure-pipe-broker.ps1",
|
|
88
|
+
import.meta.url,
|
|
89
|
+
),
|
|
90
|
+
);
|
|
91
|
+
const child = spawn(
|
|
92
|
+
powershellPath(),
|
|
93
|
+
[
|
|
94
|
+
"-NoLogo",
|
|
95
|
+
"-NoProfile",
|
|
96
|
+
"-NonInteractive",
|
|
97
|
+
"-ExecutionPolicy",
|
|
98
|
+
"Bypass",
|
|
99
|
+
"-File",
|
|
100
|
+
scriptPath,
|
|
101
|
+
"-PipeName",
|
|
102
|
+
pipeName,
|
|
103
|
+
"-MaxFrameBytes",
|
|
104
|
+
String(maxFrameBytes),
|
|
105
|
+
],
|
|
106
|
+
{
|
|
107
|
+
windowsHide: true,
|
|
108
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
109
|
+
},
|
|
110
|
+
);
|
|
111
|
+
child.stdin.setDefaultEncoding("utf8");
|
|
112
|
+
let stderr = "";
|
|
113
|
+
child.stderr.on("data", (chunk) => {
|
|
114
|
+
if (stderr.length < 32 * 1024) stderr += chunk.toString("utf8");
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
let ready = false;
|
|
118
|
+
let settled = false;
|
|
119
|
+
let resolveReady;
|
|
120
|
+
let rejectReady;
|
|
121
|
+
const readyPromise = new Promise((resolve, reject) => {
|
|
122
|
+
resolveReady = resolve;
|
|
123
|
+
rejectReady = reject;
|
|
124
|
+
});
|
|
125
|
+
const lines = createInterface({ input: child.stdout, crlfDelay: Infinity });
|
|
126
|
+
|
|
127
|
+
const failReady = (error) => {
|
|
128
|
+
if (settled) return;
|
|
129
|
+
settled = true;
|
|
130
|
+
rejectReady(error);
|
|
131
|
+
};
|
|
132
|
+
child.once("error", failReady);
|
|
133
|
+
child.once("exit", (code, signal) => {
|
|
134
|
+
if (!ready) {
|
|
135
|
+
failReady(
|
|
136
|
+
new Error(
|
|
137
|
+
`Windows secure pipe broker exited before ready (${code ?? signal ?? "unknown"}): ${stderr.trim()}`,
|
|
138
|
+
),
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
lines.on("line", async (line) => {
|
|
143
|
+
let message;
|
|
144
|
+
try {
|
|
145
|
+
message = JSON.parse(line);
|
|
146
|
+
} catch {
|
|
147
|
+
failReady(new Error("Windows secure pipe broker returned invalid JSON"));
|
|
148
|
+
child.kill();
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (!ready) {
|
|
152
|
+
try {
|
|
153
|
+
if (
|
|
154
|
+
!exact(message, new Set(["ok", "schema", "security"])) ||
|
|
155
|
+
message.schema !== READY_SCHEMA ||
|
|
156
|
+
message.ok !== true
|
|
157
|
+
) {
|
|
158
|
+
throw new Error("Windows secure pipe broker readiness is invalid");
|
|
159
|
+
}
|
|
160
|
+
const security = normalizeSecurity(message.security);
|
|
161
|
+
ready = true;
|
|
162
|
+
settled = true;
|
|
163
|
+
resolveReady(security);
|
|
164
|
+
} catch (error) {
|
|
165
|
+
failReady(error);
|
|
166
|
+
child.kill();
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
let response;
|
|
171
|
+
try {
|
|
172
|
+
if (
|
|
173
|
+
!exact(
|
|
174
|
+
message,
|
|
175
|
+
new Set([
|
|
176
|
+
"clientPrincipalDigest",
|
|
177
|
+
"clientProcessId",
|
|
178
|
+
"connectionId",
|
|
179
|
+
"frame",
|
|
180
|
+
"schema",
|
|
181
|
+
]),
|
|
182
|
+
) ||
|
|
183
|
+
message.schema !== REQUEST_SCHEMA ||
|
|
184
|
+
!/^[a-f0-9]{32}$/u.test(message.connectionId ?? "") ||
|
|
185
|
+
!Number.isSafeInteger(message.clientProcessId) ||
|
|
186
|
+
message.clientProcessId < 1 ||
|
|
187
|
+
!DIGEST.test(message.clientPrincipalDigest ?? "") ||
|
|
188
|
+
typeof message.frame !== "string" ||
|
|
189
|
+
Buffer.byteLength(message.frame, "utf8") > maxFrameBytes
|
|
190
|
+
) {
|
|
191
|
+
throw new Error("Windows secure pipe broker request is invalid");
|
|
192
|
+
}
|
|
193
|
+
response = await onRequest({
|
|
194
|
+
frame: message.frame,
|
|
195
|
+
peer: Object.freeze({
|
|
196
|
+
processId: message.clientProcessId,
|
|
197
|
+
principalDigest: message.clientPrincipalDigest,
|
|
198
|
+
}),
|
|
199
|
+
});
|
|
200
|
+
} catch {
|
|
201
|
+
response = { ok: false, requestId: null, code: "request_denied" };
|
|
202
|
+
}
|
|
203
|
+
if (!child.stdin.destroyed) {
|
|
204
|
+
child.stdin.write(
|
|
205
|
+
`${JSON.stringify({
|
|
206
|
+
schema: RESPONSE_SCHEMA,
|
|
207
|
+
connectionId: message.connectionId,
|
|
208
|
+
frame: `${JSON.stringify(response)}\n`,
|
|
209
|
+
})}\n`,
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
const security = await readyPromise;
|
|
215
|
+
return Object.freeze({
|
|
216
|
+
security,
|
|
217
|
+
close() {
|
|
218
|
+
return new Promise((resolve) => {
|
|
219
|
+
if (child.exitCode !== null || child.signalCode !== null) {
|
|
220
|
+
resolve();
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const timer = setTimeout(() => {
|
|
224
|
+
child.kill();
|
|
225
|
+
resolve();
|
|
226
|
+
}, 2_000);
|
|
227
|
+
timer.unref?.();
|
|
228
|
+
child.once("exit", () => {
|
|
229
|
+
clearTimeout(timer);
|
|
230
|
+
resolve();
|
|
231
|
+
});
|
|
232
|
+
child.kill();
|
|
233
|
+
});
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
}
|
|
@@ -35,7 +35,7 @@ function digestToken(value) {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
function normalizeRecord(record = {}) {
|
|
38
|
-
|
|
38
|
+
const normalized = {
|
|
39
39
|
schema: HOOK_AUDIT_RECORD_SCHEMA,
|
|
40
40
|
timestamp: safeToken(record.timestamp || new Date().toISOString(), 64),
|
|
41
41
|
phase: safeToken(record.phase, 32),
|
|
@@ -58,6 +58,23 @@ function normalizeRecord(record = {}) {
|
|
|
58
58
|
: null,
|
|
59
59
|
errorCode: safeToken(record.errorCode, 96),
|
|
60
60
|
};
|
|
61
|
+
if (record.phase === "no-hooks") {
|
|
62
|
+
normalized.firstTimestamp = safeToken(
|
|
63
|
+
record.firstTimestamp || normalized.timestamp,
|
|
64
|
+
64,
|
|
65
|
+
);
|
|
66
|
+
normalized.occurrences = Math.max(
|
|
67
|
+
1,
|
|
68
|
+
Math.min(
|
|
69
|
+
Number.MAX_SAFE_INTEGER,
|
|
70
|
+
Number.isSafeInteger(Number(record.occurrences))
|
|
71
|
+
? Number(record.occurrences)
|
|
72
|
+
: 1,
|
|
73
|
+
),
|
|
74
|
+
);
|
|
75
|
+
normalized.eventDigest = digestToken(record.eventDigest || record.eventId);
|
|
76
|
+
}
|
|
77
|
+
return normalized;
|
|
61
78
|
}
|
|
62
79
|
|
|
63
80
|
function hashRecord(prevHash, record) {
|
|
@@ -67,6 +84,13 @@ function hashRecord(prevHash, record) {
|
|
|
67
84
|
);
|
|
68
85
|
}
|
|
69
86
|
|
|
87
|
+
function extendNoHookEventDigest(current, eventId) {
|
|
88
|
+
return sha256(
|
|
89
|
+
"chainlesschain.hook-audit-no-hooks.v1",
|
|
90
|
+
`${current || "genesis"}\n${eventId || "unknown"}`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
70
94
|
function validateStore(store) {
|
|
71
95
|
if (Object.keys(store).length === 0) {
|
|
72
96
|
return {
|
|
@@ -103,13 +127,55 @@ export class HookAuditStore {
|
|
|
103
127
|
}
|
|
104
128
|
|
|
105
129
|
append(record) {
|
|
106
|
-
|
|
130
|
+
let normalized = normalizeRecord({
|
|
107
131
|
...record,
|
|
108
132
|
timestamp: record?.timestamp || this.now(),
|
|
109
133
|
});
|
|
134
|
+
if (normalized.phase === "no-hooks") {
|
|
135
|
+
normalized = {
|
|
136
|
+
...normalized,
|
|
137
|
+
eventDigest: extendNoHookEventDigest(null, normalized.eventId),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
110
140
|
return mutateSecurityStore(this.filePath, "Hook runtime audit", (draft) => {
|
|
111
141
|
const store = validateStore(draft);
|
|
112
142
|
if (Object.keys(draft).length === 0) Object.assign(draft, store);
|
|
143
|
+
const last = draft.records.at(-1);
|
|
144
|
+
if (
|
|
145
|
+
normalized.phase === "no-hooks" &&
|
|
146
|
+
last?.record?.phase === "no-hooks" &&
|
|
147
|
+
last.record.event === normalized.event &&
|
|
148
|
+
last.record.status === normalized.status &&
|
|
149
|
+
last.record.decision === normalized.decision
|
|
150
|
+
) {
|
|
151
|
+
const coalesced = {
|
|
152
|
+
...normalized,
|
|
153
|
+
firstTimestamp:
|
|
154
|
+
last.record.firstTimestamp ||
|
|
155
|
+
last.record.timestamp ||
|
|
156
|
+
normalized.timestamp,
|
|
157
|
+
occurrences: Math.min(
|
|
158
|
+
Number.MAX_SAFE_INTEGER,
|
|
159
|
+
Math.max(1, Number(last.record.occurrences) || 1) + 1,
|
|
160
|
+
),
|
|
161
|
+
eventDigest: extendNoHookEventDigest(
|
|
162
|
+
last.record.eventDigest,
|
|
163
|
+
normalized.eventId,
|
|
164
|
+
),
|
|
165
|
+
};
|
|
166
|
+
const hash = hashRecord(last.prevHash || null, coalesced);
|
|
167
|
+
draft.records[draft.records.length - 1] = {
|
|
168
|
+
record: coalesced,
|
|
169
|
+
prevHash: last.prevHash || null,
|
|
170
|
+
hash,
|
|
171
|
+
};
|
|
172
|
+
draft.headHash = hash;
|
|
173
|
+
return Object.freeze({
|
|
174
|
+
...coalesced,
|
|
175
|
+
prevHash: last.prevHash || null,
|
|
176
|
+
hash,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
113
179
|
const prevHash = draft.headHash || draft.anchorHash || null;
|
|
114
180
|
const hash = hashRecord(prevHash, normalized);
|
|
115
181
|
draft.records.push({ record: normalized, prevHash, hash });
|
|
@@ -611,16 +611,6 @@ class HooksV2Runtime extends EventEmitter {
|
|
|
611
611
|
const contract = validateHookEvent(eventName, context);
|
|
612
612
|
const eventId = context.event_id || context.eventId || crypto.randomUUID();
|
|
613
613
|
const auditRequired = options.auditRequired === true || this.requireAudit;
|
|
614
|
-
this._appendAudit(
|
|
615
|
-
{
|
|
616
|
-
phase: "dispatch",
|
|
617
|
-
event: eventName,
|
|
618
|
-
eventId,
|
|
619
|
-
status: "accepted",
|
|
620
|
-
decision: "continue",
|
|
621
|
-
},
|
|
622
|
-
{ required: auditRequired && contract.decisionCapable },
|
|
623
|
-
);
|
|
624
614
|
const suppliedHooks = Array.isArray(options.additionalHooks)
|
|
625
615
|
? options.additionalHooks.map((hook) => normalizeHookDefinition(hook))
|
|
626
616
|
: [];
|
|
@@ -631,6 +621,56 @@ class HooksV2Runtime extends EventEmitter {
|
|
|
631
621
|
(hook) =>
|
|
632
622
|
eventName !== "FileChanged" || fileChangedHookMatches(hook, context),
|
|
633
623
|
);
|
|
624
|
+
// Resolve and de-duplicate candidates before writing the audit boundary.
|
|
625
|
+
// A lifecycle event with no executable hook is still fail-closed audited
|
|
626
|
+
// at decision gates, but adjacent no-op events are represented by one
|
|
627
|
+
// authenticated aggregate in HookAuditStore instead of two ever-growing
|
|
628
|
+
// records per turn. This keeps repeated no-hook lifecycle events bounded
|
|
629
|
+
// in long-lived IDE/stream sessions without hiding an actual execution.
|
|
630
|
+
const uniqueHooks = [];
|
|
631
|
+
const seen = new Set();
|
|
632
|
+
for (const hook of hooks) {
|
|
633
|
+
if (seen.has(hook.id)) continue;
|
|
634
|
+
seen.add(hook.id);
|
|
635
|
+
uniqueHooks.push(hook);
|
|
636
|
+
}
|
|
637
|
+
uniqueHooks.sort(
|
|
638
|
+
(left, right) =>
|
|
639
|
+
normalizeHookPriority(left.priority) -
|
|
640
|
+
normalizeHookPriority(right.priority) ||
|
|
641
|
+
String(left.id).localeCompare(String(right.id)),
|
|
642
|
+
);
|
|
643
|
+
if (uniqueHooks.length === 0) {
|
|
644
|
+
this._appendAudit(
|
|
645
|
+
{
|
|
646
|
+
phase: "no-hooks",
|
|
647
|
+
event: eventName,
|
|
648
|
+
eventId,
|
|
649
|
+
status: "success",
|
|
650
|
+
decision: "continue",
|
|
651
|
+
},
|
|
652
|
+
{ required: auditRequired && contract.decisionCapable },
|
|
653
|
+
);
|
|
654
|
+
return {
|
|
655
|
+
success: true,
|
|
656
|
+
results: [],
|
|
657
|
+
blocked: false,
|
|
658
|
+
requiresApproval: false,
|
|
659
|
+
decision: "continue",
|
|
660
|
+
blockingResult: null,
|
|
661
|
+
schemaVersion: HOOK_EVENT_SCHEMA_VERSION,
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
this._appendAudit(
|
|
665
|
+
{
|
|
666
|
+
phase: "dispatch",
|
|
667
|
+
event: eventName,
|
|
668
|
+
eventId,
|
|
669
|
+
status: "accepted",
|
|
670
|
+
decision: "continue",
|
|
671
|
+
},
|
|
672
|
+
{ required: auditRequired && contract.decisionCapable },
|
|
673
|
+
);
|
|
634
674
|
// Reserve the durable record for the inline producer before executing any
|
|
635
675
|
// hook. A process-level EventRuntimeHost may observe the same store, but it
|
|
636
676
|
// cannot reclaim this record until the longest declared hook timeout plus
|
|
@@ -682,22 +722,8 @@ class HooksV2Runtime extends EventEmitter {
|
|
|
682
722
|
pending: true,
|
|
683
723
|
};
|
|
684
724
|
}
|
|
685
|
-
// Hooks are parallel by default.
|
|
686
|
-
//
|
|
687
|
-
// deterministic compatibility mode for callers that require ordering.
|
|
688
|
-
const uniqueHooks = [];
|
|
689
|
-
const seen = new Set();
|
|
690
|
-
for (const hook of hooks) {
|
|
691
|
-
if (seen.has(hook.id)) continue;
|
|
692
|
-
seen.add(hook.id);
|
|
693
|
-
uniqueHooks.push(hook);
|
|
694
|
-
}
|
|
695
|
-
uniqueHooks.sort(
|
|
696
|
-
(left, right) =>
|
|
697
|
-
normalizeHookPriority(left.priority) -
|
|
698
|
-
normalizeHookPriority(right.priority) ||
|
|
699
|
-
String(left.id).localeCompare(String(right.id)),
|
|
700
|
-
);
|
|
725
|
+
// Hooks are parallel by default. `parallel:false` remains a deterministic
|
|
726
|
+
// compatibility mode for callers that require ordering.
|
|
701
727
|
const runOne = async (
|
|
702
728
|
hook,
|
|
703
729
|
{ forceObserveOnly = false, dispatcher = null } = {},
|
|
@@ -16,15 +16,20 @@
|
|
|
16
16
|
* 5. Persist the accepted candidate to an isolated candidate registry
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
19
20
|
import fs from "fs";
|
|
20
21
|
import { firstBalancedJson } from "../json-schema-output.js";
|
|
21
22
|
import path from "path";
|
|
23
|
+
import { isGovernedSkillSynthesisEvaluationReceipt } from "../evolution/governed-skill-synthesis-model-evaluator.js";
|
|
24
|
+
import { isGovernedSkillSynthesisEvaluationPersistenceReceipt } from "../evolution/governed-skill-synthesis-evaluation-ledger-adapter.js";
|
|
22
25
|
|
|
23
26
|
// ── _deps for test injection ────────────────────────────
|
|
24
27
|
|
|
25
28
|
const _deps = { fs, path };
|
|
26
29
|
|
|
27
30
|
export const SYNTHESIS_UNAVAILABLE_CODE = "LEARNING_SYNTHESIS_UNAVAILABLE";
|
|
31
|
+
export const SYNTHESIS_EVALUATION_DOCUMENT_SCHEMA =
|
|
32
|
+
"chainlesschain.learning-synthesis-evaluation-document/v1";
|
|
28
33
|
|
|
29
34
|
// ── Helpers ─────────────────────────────────────────────
|
|
30
35
|
|
|
@@ -145,6 +150,7 @@ Output ONLY valid JSON with these fields:
|
|
|
145
150
|
"verification": "How to confirm success",
|
|
146
151
|
"tools": ["tool_name_1", "tool_name_2"]
|
|
147
152
|
}
|
|
153
|
+
Every value in "tools" MUST be copied exactly from a tool name present in the trajectory.
|
|
148
154
|
If the trajectory is too specific or not reusable, respond with: {"not_applicable": true}`,
|
|
149
155
|
},
|
|
150
156
|
{
|
|
@@ -362,7 +368,7 @@ export class SkillSynthesizer {
|
|
|
362
368
|
continue;
|
|
363
369
|
}
|
|
364
370
|
|
|
365
|
-
await this._persistSkill(skillName, content);
|
|
371
|
+
await this._persistSkill(skillName, content, evaluation);
|
|
366
372
|
|
|
367
373
|
// Only durable, evaluated candidates count as synthesized.
|
|
368
374
|
this.trajectoryStore.markSynthesized(traj.id, skillName);
|
|
@@ -436,9 +442,10 @@ export class SkillSynthesizer {
|
|
|
436
442
|
* Write SKILL.md to the isolated candidate output registry.
|
|
437
443
|
* @param {string} skillName
|
|
438
444
|
* @param {string} content
|
|
439
|
-
* @
|
|
445
|
+
* @param {object|boolean} evaluation
|
|
446
|
+
* @returns {Promise<{skillDir:string, skillFile:string,evaluationFile:string|null}>}
|
|
440
447
|
*/
|
|
441
|
-
async _persistSkill(skillName, content) {
|
|
448
|
+
async _persistSkill(skillName, content, evaluation = null) {
|
|
442
449
|
if (!this.candidateOutputDir) {
|
|
443
450
|
throw new Error("candidate output registry is unavailable");
|
|
444
451
|
}
|
|
@@ -468,14 +475,68 @@ export class SkillSynthesizer {
|
|
|
468
475
|
const skillDir = _deps.path.join(canonicalSkillNamespace, "1.0.0");
|
|
469
476
|
const canonicalSkillDir = await this._ensurePrivateDirectory(skillDir);
|
|
470
477
|
this._assertPathWithinCandidateRoot(candidateRoot, canonicalSkillDir);
|
|
471
|
-
|
|
478
|
+
let evaluationFile = null;
|
|
479
|
+
if (
|
|
480
|
+
evaluation &&
|
|
481
|
+
typeof evaluation === "object" &&
|
|
482
|
+
evaluation.receipt !== undefined
|
|
483
|
+
) {
|
|
484
|
+
if (!isGovernedSkillSynthesisEvaluationReceipt(evaluation.receipt)) {
|
|
485
|
+
throw new Error("candidate evaluation receipt is not governed");
|
|
486
|
+
}
|
|
487
|
+
const contentDigest = `sha256:${createHash("sha256")
|
|
488
|
+
.update(content, "utf8")
|
|
489
|
+
.digest("hex")}`;
|
|
490
|
+
if (
|
|
491
|
+
evaluation.receipt.skillName !== skillName ||
|
|
492
|
+
evaluation.receipt.candidateDigest !== contentDigest
|
|
493
|
+
) {
|
|
494
|
+
throw new Error(
|
|
495
|
+
"candidate evaluation receipt does not bind the persisted candidate",
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
if (
|
|
499
|
+
!isGovernedSkillSynthesisEvaluationPersistenceReceipt(
|
|
500
|
+
evaluation.persistence,
|
|
501
|
+
) ||
|
|
502
|
+
evaluation.persistence.authenticated !== true ||
|
|
503
|
+
evaluation.persistence.durable !== true ||
|
|
504
|
+
evaluation.persistence.persisted !== true ||
|
|
505
|
+
evaluation.persistence.receiptDigest !==
|
|
506
|
+
evaluation.receipt.receiptDigest ||
|
|
507
|
+
evaluation.persistence.candidateDigest !==
|
|
508
|
+
evaluation.receipt.candidateDigest
|
|
509
|
+
) {
|
|
510
|
+
throw new Error(
|
|
511
|
+
"candidate evaluation receipt is not durably persisted",
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
const serialized = JSON.stringify(
|
|
515
|
+
{
|
|
516
|
+
schema: SYNTHESIS_EVALUATION_DOCUMENT_SCHEMA,
|
|
517
|
+
receipt: evaluation.receipt,
|
|
518
|
+
persistence: evaluation.persistence,
|
|
519
|
+
},
|
|
520
|
+
null,
|
|
521
|
+
2,
|
|
522
|
+
);
|
|
523
|
+
if (!serialized || Buffer.byteLength(serialized, "utf8") > 128 * 1024) {
|
|
524
|
+
throw new Error("candidate evaluation receipt is invalid or oversized");
|
|
525
|
+
}
|
|
526
|
+
evaluationFile = _deps.path.join(canonicalSkillDir, "EVALUATION.json");
|
|
527
|
+
await _deps.fs.promises.writeFile(evaluationFile, `${serialized}\n`, {
|
|
528
|
+
encoding: "utf-8",
|
|
529
|
+
flag: "wx",
|
|
530
|
+
});
|
|
531
|
+
}
|
|
472
532
|
|
|
533
|
+
const skillFile = _deps.path.join(canonicalSkillDir, "SKILL.md");
|
|
473
534
|
await _deps.fs.promises.writeFile(skillFile, content, {
|
|
474
535
|
encoding: "utf-8",
|
|
475
536
|
flag: "wx",
|
|
476
537
|
});
|
|
477
538
|
|
|
478
|
-
return { skillDir: canonicalSkillDir, skillFile };
|
|
539
|
+
return { skillDir: canonicalSkillDir, skillFile, evaluationFile };
|
|
479
540
|
}
|
|
480
541
|
|
|
481
542
|
_assertCandidateFilesystemSupport() {
|
|
@@ -48,6 +48,28 @@ function urlTarget(value) {
|
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
function localCiLogTarget(command) {
|
|
52
|
+
if (
|
|
53
|
+
!/(?:^|[\s;&|])(?:findstr(?:\.exe)?|grep|rg|select-string)\b/iu.test(
|
|
54
|
+
command,
|
|
55
|
+
)
|
|
56
|
+
)
|
|
57
|
+
return null;
|
|
58
|
+
const matches = [
|
|
59
|
+
...command.matchAll(
|
|
60
|
+
/[%$()A-Za-z0-9_:.\\/-]*(?:gh|github|action|ci)[A-Za-z0-9_.-]*\.(?:log|txt|xml)\b/giu,
|
|
61
|
+
),
|
|
62
|
+
];
|
|
63
|
+
const file = matches.at(-1)?.[0];
|
|
64
|
+
if (!file) return null;
|
|
65
|
+
const normalized = file.replaceAll("\\", "/").toLowerCase();
|
|
66
|
+
return {
|
|
67
|
+
key: `local-ci-log:${createHash("sha256").update(normalized).digest("hex")}`,
|
|
68
|
+
github: true,
|
|
69
|
+
localLog: true,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
51
73
|
/** Classification only; never parse, rewrite, cache or authorize shell execution. */
|
|
52
74
|
export function remoteReadTarget(tool, args = {}) {
|
|
53
75
|
if (tool === "web_search")
|
|
@@ -97,7 +119,7 @@ export function remoteReadTarget(tool, args = {}) {
|
|
|
97
119
|
);
|
|
98
120
|
if (api) return githubTarget(api[1], api[2], api[3], api[4]);
|
|
99
121
|
}
|
|
100
|
-
return
|
|
122
|
+
return localCiLogTarget(command);
|
|
101
123
|
}
|
|
102
124
|
|
|
103
125
|
function failedResult(result) {
|
|
@@ -107,7 +129,8 @@ function failedResult(result) {
|
|
|
107
129
|
result.success === false ||
|
|
108
130
|
result.isError === true ||
|
|
109
131
|
result.statusCode >= 400 ||
|
|
110
|
-
(Number.isInteger(result.exitCode) && result.exitCode !== 0)
|
|
132
|
+
(Number.isInteger(result.exitCode) && result.exitCode !== 0) ||
|
|
133
|
+
(Number.isInteger(result.exit_code) && result.exit_code !== 0)
|
|
111
134
|
);
|
|
112
135
|
}
|
|
113
136
|
|
|
@@ -234,6 +257,7 @@ export class RemoteReadLoopGuard {
|
|
|
234
257
|
return (
|
|
235
258
|
"Remote-read loop recovery: repeated failures or unchanged GitHub Actions logs detected. " +
|
|
236
259
|
"Stop repeating the same download, including switching between web_fetch, gh run view and gh api for the same run/job. " +
|
|
260
|
+
"Repeated findstr, grep, rg or Select-String misses against the same saved CI log are also one stalled read: exit code 1 means no match, not a new CI failure. " +
|
|
237
261
|
"Use the retained evidence for the user's task. For implementation, inspect/fix the relevant local files; for research/review, synthesize the findings without making unsolicited edits. For a missing CI detail, use one authenticated gh run view <run-id> --job <job-id> --log-failed --repo <owner/repo>, save the result once and search that local log. " +
|
|
238
262
|
"If the overall run is still active but the required job has completed, fetch that job's log directly with gh api repos/<owner>/<repo>/actions/jobs/<job-id>/logs; gh run view may withhold logs until the whole run finishes. " +
|
|
239
263
|
"Check auth, rate limits or command errors before another attempt. If access remains unavailable, report the exact blocker and useful findings; the task is not complete. " +
|
|
@@ -262,9 +286,12 @@ export class RemoteReadLoopGuard {
|
|
|
262
286
|
evidence,
|
|
263
287
|
lastSuccess,
|
|
264
288
|
page,
|
|
289
|
+
localLog,
|
|
265
290
|
}) => ({
|
|
266
291
|
source: github
|
|
267
|
-
?
|
|
292
|
+
? localLog
|
|
293
|
+
? "saved GitHub Actions log"
|
|
294
|
+
: "GitHub Actions logs"
|
|
268
295
|
: tool === "web_search"
|
|
269
296
|
? "web_search"
|
|
270
297
|
: "web_fetch",
|
|
@@ -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-Bpz5RnQy.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 u(t,o,e,r,n,m){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",u],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-ReJu1o/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as o}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-Bpz5RnQy.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),b=o(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},R={class:"row"},V={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},J={key:1,class:"row"};function M(p,r,a,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",R,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",V,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",J,[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 K=S(k,[["render",M],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-ReJu1o/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{K as default};
|