chainlesschain 0.166.109 → 0.166.114
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 +14 -6
- package/package.json +3 -2
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-DkrNbDzS.js → AIOps-CVac3rIN.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DJjFXDhv.js → ActionButton-ChM9GxMl.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DyUbagRn.js → Analytics-CV5399Js.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-p7kJWSvn.js → AppLayout-CuonVXhg.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-C3rVh4Ak.js → Artifacts-D9qKfgb6.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bch_L_YO.js → Audit-DUvLysQc.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BNHy8zP6.js → BackgroundAgents-DfKohQeT.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BUaye_Ys.js → Backup-CohoEI8R.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D49mzAVz.js → BaseInput-BwdoA3xv.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-2MDzM_us.js → Chat-DRkuz1d2.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-v3pzeHNC.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-5p1T_KEq.js → Checkbox-B-GNGpKv.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-TKtiLaoZ.js → Codegen-Bs2lAsoZ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BVCMG9mS.js → Col-Bk1mJKDZ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D09-QczH.js → Community-B_FDSCOo.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-QuRMCnj7.js → Compact-No1qSLLH.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CN0PV7fk.js → Compliance-CcrG43-d.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-5N2zhAty.js → Cowork-DLkj2ywK.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BxT8UZ0S.js → Cron-sQHELVEz.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dp-noQl4.js → Crosschain-CRTZ3GZg.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B7MZFkjG.js → DID-Ds2bjvxE.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DulJ3rKV.js → Dashboard-DOONG2NX.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DV4ov4zF.js → Dropdown-Br3PNA2L.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DB2-ooz6.js → EmailListRenderer-DT6UUqjZ.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-B1Rb6p7q.js → EvolutionSettings-BSLuEjlT.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-U8aHayx-.js → FamilyGuardDashboard-2aEM9avE.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BkQULBHY.js → Federation-D3B0tlQU.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CtviG260.js → FormItemContext-DTVkVVQP.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DnPirB24.js → GenericCardRenderer-BgFEgP4y.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CK57Oro6.js → Git-3t71m6Xd.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DbI-LB8-.js → Governance-DS7WvlaX.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-sEG4T1Jg.js → Inference-CeT-xWrI.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-9SLJR3h9.js → KnowledgeGraph-BQzMncp5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BIZYcISQ.js → Logs-CC5DOKhV.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-9nfWupWP.js → MarkdownRenderer-5jYM4kYG.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CRmLLwAE.js → Marketplace-CpYDyy3o.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DkOFkSO1.js → McpTools-DRdAZPMr.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-M29Kd9TU.js → Memory-CBLRr-l8.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Tl6JvPw_.js → MobileBridge-Bnj9veNN.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Bq-FPDzS.js → MobileProjects-lYFPD24p.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DkUjX1F5.js → Mtc-BMU_C9vD.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BCqr1I4q.js → MtcAudit-DQV-zumU.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-DmoqYGQ5.js → Multisig-LpqpqV1d.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DNRQeRke.js → NLProgramming-C4OMklSO.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CQSBeiY6.js → Notes-Cg0QCinP.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-gNY9bbH6.js → NotificationSettings-amoZoMna.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DW0CNjh8.js → OrderTableRenderer-CxNvhf5n.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CthnbKag.js → Organization-BetJmyX5.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-_GQ3sbXu.js → Overflow-DbeoPtVD.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BTr7ea6W.js → P2P-B5sitQWT.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-AP9SG2ic.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-DMny2Cjs.js → Permissions-Bc7fgNKx.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CyYlMSoI.js → PersonalDataHub-BwdGMcWZ.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-FASu2Oc4.js → Pipeline-DVuJA9BA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-9bC5FnsJ.js → Privacy-BGzwOYRG.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BOYZwB5G.js → ProjectInit-BpHcC5br.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-45DViNG-.js → ProjectSettings-BI5G5gsc.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-C2fZzMZc.js → Projects-Ce92-l1V.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BgjvZx9F.js → Providers-CRHCcLFS.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Brw-3csB.js → QrScannerModal-qSeg5xag.js} +1 -1
- package/src/assets/web-panel/assets/QuickAsk-CA8oSceR.js +1 -0
- package/src/assets/web-panel/assets/{Recommend-DuQGxjIR.js → Recommend-DMvPodNo.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-T1cdSSRL.js → RemoteSession-BWsapEyN.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-9FT2dI4G.js → Reputation-BZJETVmC.js} +1 -1
- package/src/assets/web-panel/assets/{Row-yNIbNftX.js → Row-CUE1OSMp.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BIchNoPd.js → RssFeed-DvMazcUD.js} +2 -2
- package/src/assets/web-panel/assets/{Search-msDJ8UTZ.js → Search-e1c-NXWv.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DE46oBYT.js → Security-Dc9GZsx2.js} +3 -3
- package/src/assets/web-panel/assets/{Services-Dori7vc3.js → Services-AFz6ke-4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D3O3sUFz.js → Skeleton-gow6MYcY.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BV0ct8SO.js → Skills-h6AxYjUP.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DflIVOrh.js → Sla-Cr4CkJ0O.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Cpbv2Zz6.js → SpeechSettings-Bd5yuBtH.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dgg6-wbe.js → SyncSettings-1t4QZMLW.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Cb6e4Klx.js → Tasks-u-DrjLRM.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-GfdAATGz.js → Templates-C0yLUC9b.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-D0gecLXl.js → Tenant-ds1YT5iS.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BFRPJt-0.js → Terminal-BoIskW2m.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BobtChxX.js → TimelineRenderer-BkdVK24X.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CifeZtHV.js → Tokens-djyDgmfk.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BHBvbBCf.js → Trigger-CYefDS3H.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-6lvqjKYp.js → Trust-CE_dbep_.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CqzMc-G5.js → UkeySign-DwVs_fey.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-OIiRG582.js → VideoEditing-BTUqMHAV.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-4MeKq0q_.js → Wallet-Bu_E7Rrc.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-eHBRjGQG.js → WebAuthn-DTbre5AB.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DlzYdEqW.js → WorkflowEditor-BsBzd3gt.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CBcjOzkX.js → chat-tdifQQvu.js} +1 -1
- package/src/assets/web-panel/assets/{colors-zgwsYQSa.js → colors-D3SNW2Vx.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Dcd9H5Bn.js → compact-item-UBlCjrAW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DR1tO-8r.js → createContext-DKsnEnFt.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BBnVfJHh.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CtfbUH_p.js → hasIn-BkeySXWe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXfGHUz_.js → index-6Nvzgytx.js} +1 -1
- package/src/assets/web-panel/assets/index-B2w_3mtS.js +1 -0
- package/src/assets/web-panel/assets/{index-DYPMJ5Mb.js → index-BEiHKah0.js} +25 -25
- package/src/assets/web-panel/assets/{index-LN7Hkl1C.js → index-BIeFLaMV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DA2-Bhy8.js → index-BV2zQteq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CwHgaYVH.js → index-BVvz3ntc.js} +1 -1
- package/src/assets/web-panel/assets/index-BoHurydC.js +1 -0
- package/src/assets/web-panel/assets/{index-DVpp9YSQ.js → index-Bw0k3VgD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaGNqkY0.js → index-C-KTHSUE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWuCGhHa.js → index-C9ImNw5O.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTx4FyLU.js → index-CG_b1xyX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cur8LNNn.js → index-CUjyL0ZS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfzOYmOj.js → index-CXkn77ZN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cdhy5ckh.js → index-CZ6JUooI.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1GxtY-h.js → index-Cuz2QCFT.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0kP88Pb.js → index-D5Umd_Z-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHEiuvhA.js → index-D6es7MSG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPLLgPxA.js → index-D93iSDUw.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3QUK1ks.js → index-D9m1HQzl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWG98orp.js → index-D9um0YVl.js} +1 -1
- package/src/assets/web-panel/assets/{index-hTcre7U9.js → index-DD6dD3LV.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5XGvJb0.js → index-DFMrIEIt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvPOpvvH.js → index-DSCiZJXb.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8WPohye.js → index-DSe_7MSy.js} +1 -1
- package/src/assets/web-panel/assets/{index-JSfldpw4.js → index-DYFjOyTH.js} +1 -1
- package/src/assets/web-panel/assets/{index-5XaB_Tjg.js → index-DdyTv6yc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoxowMYS.js → index-DfrW-iVs.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSvcz0RO.js → index-Dg8-Duze.js} +1 -1
- package/src/assets/web-panel/assets/{index-J-ORW1i6.js → index-DiDgwRty.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT7zIkqP.js → index-DlEIp1gJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7ZOiIKb.js → index-DlO6HdD9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeAi4CNt.js → index-DtxUSZSS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmVIM-m2.js → index-DugZRCiI.js} +1 -1
- package/src/assets/web-panel/assets/{index-oWOlF7CM.js → index-P-ailFQY.js} +1 -1
- package/src/assets/web-panel/assets/{index-dvF6C39V.js → index-PWScrdlX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSQCHpDo.js → index-SpQ26gD6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmzQzTY5.js → index-TLBpgN30.js} +1 -1
- package/src/assets/web-panel/assets/{index-z8lrkcb-.js → index-bOIcWW8F.js} +1 -1
- package/src/assets/web-panel/assets/{index-BndPtS9D.js → index-pgGKNvmm.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CVMtDrWZ.js → initDefaultProps-CVCXG2Hv.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Dye3IU8k.js → motion-Dv00jw87.js} +1 -1
- package/src/assets/web-panel/assets/{move-C251Zo34.js → move-BFz51iHf.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BDiOORoQ.js → mtc-parser-BK2woIDE.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DTDA_RHv.js → omit-D2X_Gwoo.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CqEUTPcT.js → pickAttrs-CLmFyJ1q.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BOB8QWH3.js → placementArrow-CCzPddQm.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CZDXP1d9.js → responsiveObserve-hcm_Zlxd.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DPaRw3E9.js → slide-BxfZEFVp.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Ba9d7XZ7.js → statusUtils-kzB9pT-t.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-mZKU3lvW.js → styleChecker-CDFd7YCI.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-VcauLq0M.js → useFlexGapSupport-Czl7NNhS.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Cal9KRcx.js → useFs-y0SAzirG.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DISoRyQB.js → usePersonalDataHub-BvdPznrA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B58C6w6B.js → vnode-D8mNbyZ7.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BPlBAMKB.js → zoom-_hun6w9W.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +12 -5
- package/src/commands/ask.js +96 -21
- package/src/commands/complete.js +14 -10
- package/src/commands/llm.js +23 -41
- package/src/commands/session.js +2 -2
- package/src/commands/stream.js +9 -5
- package/src/commands/ui.js +30 -2
- package/src/data/changelog.json +65 -0
- package/src/gateways/ws/llm-chat-protocol.js +131 -40
- package/src/gateways/ws/llm-creds.js +29 -79
- package/src/gateways/ws/message-dispatcher.js +2 -0
- package/src/gateways/ws/ws-agent-handler.js +1 -1
- package/src/gateways/ws/ws-session-gateway.js +26 -12
- package/src/lib/__tests__/provider-stream.test.js +70 -4
- package/src/lib/chat-core.js +186 -24
- package/src/lib/cowork-adapter.js +29 -15
- package/src/lib/evolution/agent-evolution-runtime-composition.js +10 -7
- package/src/lib/evolution/evolution-deployment-config.js +36 -4
- package/src/lib/evolution/evolution-deployment-loader.js +117 -4
- package/src/lib/evolution/evolution-deployment-profile.js +2 -2
- package/src/lib/evolution/evolution-evidence-projector.js +18 -3
- package/src/lib/evolution/evolution-file-witness.js +10 -0
- package/src/lib/evolution/evolution-ledger.js +237 -28
- package/src/lib/evolution/evolution-windows-directory-durability.js +322 -0
- package/src/lib/evolution/governed-hub-llm.js +2 -1
- package/src/lib/evolution/governed-model-turn.js +4 -1
- package/src/lib/evolution/local-ui-evolution-deployment.js +768 -0
- package/src/lib/evolution/local-ui-evolution-host.mjs +44 -0
- package/src/lib/evolution/local-ui-evolution-runtime.js +624 -0
- package/src/lib/evolution/opaque-hex-id.js +28 -0
- package/src/lib/hub-llm-client.js +22 -14
- package/src/lib/image-input.js +19 -3
- package/src/lib/llm-config-defaults.js +19 -30
- package/src/lib/llm-connection-config.js +4 -0
- package/src/lib/llm-connection-probe.js +5 -1
- package/src/lib/llm-connection-resolution.js +94 -0
- package/src/lib/llm-providers.js +33 -11
- package/src/lib/ollama-base-url.js +14 -0
- package/src/lib/provider-protocol.js +104 -0
- package/src/lib/provider-stream.js +163 -4
- package/src/lib/runnable-provider.js +1 -0
- package/src/repl/chat-repl.js +58 -11
- package/src/runtime/agent-core.js +26 -43
- package/src/runtime/headless-runner.js +11 -4
- package/src/runtime/headless-stream.js +10 -4
- package/src/runtime/policies/agent-policy.js +17 -11
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DOX3Y5EJ.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-D9McHF9I.js +0 -7
- package/src/assets/web-panel/assets/QuickAsk-DWG-A5zB.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DYhpRtve.js +0 -1
- package/src/assets/web-panel/assets/index-DPJXFIY7.js +0 -1
- package/src/assets/web-panel/assets/index-DjBhR5M_.js +0 -1
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const DIRECTORY_ATTRIBUTE = 0x10;
|
|
7
|
+
const REPARSE_POINT_ATTRIBUTE = 0x400;
|
|
8
|
+
const GENERIC_READ_WRITE = 0xc0000000;
|
|
9
|
+
const FILE_SHARE_ALL = 0x7;
|
|
10
|
+
const OPEN_EXISTING = 3;
|
|
11
|
+
const FILE_FLAG_BACKUP_SEMANTICS = 0x02000000;
|
|
12
|
+
const FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000;
|
|
13
|
+
const DRIVE_FIXED = 3;
|
|
14
|
+
let windowsApi = null;
|
|
15
|
+
const localUiEvolutionFileSystems = new WeakSet();
|
|
16
|
+
|
|
17
|
+
function loadWindowsApi() {
|
|
18
|
+
if (windowsApi !== null) return windowsApi;
|
|
19
|
+
const koffi = require("koffi");
|
|
20
|
+
const kernel32 = koffi.load("kernel32.dll");
|
|
21
|
+
const HANDLE = koffi.pointer(
|
|
22
|
+
"ChainlessChainEvolutionDirectoryHandle",
|
|
23
|
+
koffi.opaque(),
|
|
24
|
+
);
|
|
25
|
+
const FILETIME = koffi.struct("ChainlessChainEvolutionFileTime", {
|
|
26
|
+
lowDateTime: "uint32_t",
|
|
27
|
+
highDateTime: "uint32_t",
|
|
28
|
+
});
|
|
29
|
+
const BY_HANDLE_FILE_INFORMATION = koffi.struct(
|
|
30
|
+
"ChainlessChainEvolutionDirectoryInformation",
|
|
31
|
+
{
|
|
32
|
+
fileAttributes: "uint32_t",
|
|
33
|
+
creationTime: FILETIME,
|
|
34
|
+
lastAccessTime: FILETIME,
|
|
35
|
+
lastWriteTime: FILETIME,
|
|
36
|
+
volumeSerialNumber: "uint32_t",
|
|
37
|
+
fileSizeHigh: "uint32_t",
|
|
38
|
+
fileSizeLow: "uint32_t",
|
|
39
|
+
numberOfLinks: "uint32_t",
|
|
40
|
+
fileIndexHigh: "uint32_t",
|
|
41
|
+
fileIndexLow: "uint32_t",
|
|
42
|
+
},
|
|
43
|
+
);
|
|
44
|
+
windowsApi = Object.freeze({
|
|
45
|
+
koffi,
|
|
46
|
+
HANDLE,
|
|
47
|
+
CreateFileW: kernel32.func(
|
|
48
|
+
"ChainlessChainEvolutionDirectoryHandle __stdcall CreateFileW(str16 fileName, uint32_t desiredAccess, uint32_t shareMode, void *securityAttributes, uint32_t creationDisposition, uint32_t flagsAndAttributes, void *templateFile)",
|
|
49
|
+
),
|
|
50
|
+
FlushFileBuffers: kernel32.func(
|
|
51
|
+
"bool __stdcall FlushFileBuffers(ChainlessChainEvolutionDirectoryHandle handle)",
|
|
52
|
+
),
|
|
53
|
+
GetDriveTypeW: kernel32.func(
|
|
54
|
+
"uint32_t __stdcall GetDriveTypeW(str16 rootPathName)",
|
|
55
|
+
),
|
|
56
|
+
GetFileInformationByHandle: kernel32.func(
|
|
57
|
+
"bool __stdcall GetFileInformationByHandle(ChainlessChainEvolutionDirectoryHandle handle, _Out_ ChainlessChainEvolutionDirectoryInformation *information)",
|
|
58
|
+
),
|
|
59
|
+
GetLastError: kernel32.func("uint32_t __stdcall GetLastError()"),
|
|
60
|
+
GetVolumeInformationW: kernel32.func(
|
|
61
|
+
"bool __stdcall GetVolumeInformationW(str16 rootPathName, _Out_ uint16_t *volumeName, uint32_t volumeNameSize, _Out_ uint32_t *volumeSerialNumber, _Out_ uint32_t *maximumComponentLength, _Out_ uint32_t *fileSystemFlags, _Out_ uint16_t *fileSystemName, uint32_t fileSystemNameSize)",
|
|
62
|
+
),
|
|
63
|
+
GetVolumePathNameW: kernel32.func(
|
|
64
|
+
"bool __stdcall GetVolumePathNameW(str16 fileName, _Out_ uint16_t *volumePathName, uint32_t bufferLength)",
|
|
65
|
+
),
|
|
66
|
+
CloseHandle: kernel32.func(
|
|
67
|
+
"bool __stdcall CloseHandle(ChainlessChainEvolutionDirectoryHandle handle)",
|
|
68
|
+
),
|
|
69
|
+
BY_HANDLE_FILE_INFORMATION,
|
|
70
|
+
});
|
|
71
|
+
return windowsApi;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function win32Path(value) {
|
|
75
|
+
let resolved = path.win32.resolve(value);
|
|
76
|
+
if (resolved.startsWith("\\\\?\\")) return resolved;
|
|
77
|
+
if (resolved.startsWith("\\\\")) {
|
|
78
|
+
return `\\\\?\\UNC\\${resolved.slice(2)}`;
|
|
79
|
+
}
|
|
80
|
+
return `\\\\?\\${resolved}`;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function normalizedWindowsPath(value) {
|
|
84
|
+
return path.win32
|
|
85
|
+
.resolve(value)
|
|
86
|
+
.replace(/^\\\\\?\\/u, "")
|
|
87
|
+
.replace(/[\\/]+$/u, "")
|
|
88
|
+
.replaceAll("/", "\\")
|
|
89
|
+
.toLowerCase();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function readWideString(buffer) {
|
|
93
|
+
return buffer.toString("utf16le").replace(/\u0000.*$/su, "");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function windowsError(api, code) {
|
|
97
|
+
return new Error(
|
|
98
|
+
`Windows local UI directory durability unavailable: ${api} failed (Win32 ${code})`,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function requireWindowsSuccess(api, ok) {
|
|
103
|
+
if (ok) return;
|
|
104
|
+
const errorCode = api.GetLastError();
|
|
105
|
+
throw windowsError("Windows directory operation", errorCode);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function pathIdentity(fsImpl, directory) {
|
|
109
|
+
const resolvedPath = path.win32.resolve(directory);
|
|
110
|
+
let realPath;
|
|
111
|
+
let stat;
|
|
112
|
+
try {
|
|
113
|
+
realPath = path.win32.resolve(fsImpl.realpathSync(resolvedPath));
|
|
114
|
+
stat = fsImpl.lstatSync(resolvedPath, { bigint: true });
|
|
115
|
+
} catch (cause) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
"Windows local UI durability path could not be safely resolved",
|
|
118
|
+
{ cause },
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
if (
|
|
122
|
+
normalizedWindowsPath(realPath) !== normalizedWindowsPath(resolvedPath) ||
|
|
123
|
+
!stat.isDirectory() ||
|
|
124
|
+
stat.isSymbolicLink()
|
|
125
|
+
) {
|
|
126
|
+
throw new Error(
|
|
127
|
+
"Windows local UI durability requires the same non-reparse directory path",
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
return Object.freeze({ resolvedPath, stat });
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function fileId(information) {
|
|
134
|
+
return (
|
|
135
|
+
(BigInt(information.fileIndexHigh) << 32n) |
|
|
136
|
+
BigInt(information.fileIndexLow)
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function assertDirectoryHandleIdentity(api, handle, fsImpl, directory, expected) {
|
|
141
|
+
const information = {};
|
|
142
|
+
requireWindowsSuccess(
|
|
143
|
+
api,
|
|
144
|
+
api.GetFileInformationByHandle(handle, information),
|
|
145
|
+
);
|
|
146
|
+
const attributes = Number(information.fileAttributes);
|
|
147
|
+
if (
|
|
148
|
+
(attributes & DIRECTORY_ATTRIBUTE) === 0 ||
|
|
149
|
+
(attributes & REPARSE_POINT_ATTRIBUTE) !== 0 ||
|
|
150
|
+
BigInt(information.volumeSerialNumber) !== BigInt(expected.stat.dev) ||
|
|
151
|
+
fileId(information) !== BigInt(expected.stat.ino)
|
|
152
|
+
) {
|
|
153
|
+
throw new Error(
|
|
154
|
+
"Windows local UI durability handle does not match the requested directory",
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
const current = pathIdentity(fsImpl, directory);
|
|
158
|
+
if (
|
|
159
|
+
BigInt(current.stat.dev) !== BigInt(expected.stat.dev) ||
|
|
160
|
+
BigInt(current.stat.ino) !== BigInt(expected.stat.ino)
|
|
161
|
+
) {
|
|
162
|
+
throw new Error(
|
|
163
|
+
"Windows local UI durability directory changed during flush",
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
return information;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Flush one verified directory on a local NTFS volume using a write handle. */
|
|
170
|
+
export function flushWindowsLocalNtfsDirectory(
|
|
171
|
+
directory,
|
|
172
|
+
{ fsImpl = fs } = {},
|
|
173
|
+
) {
|
|
174
|
+
if (process.platform !== "win32") {
|
|
175
|
+
throw new Error("Windows directory flush is only available on Windows");
|
|
176
|
+
}
|
|
177
|
+
const api = loadWindowsApi();
|
|
178
|
+
const before = pathIdentity(fsImpl, directory);
|
|
179
|
+
const volumePath = Buffer.alloc(520);
|
|
180
|
+
requireWindowsSuccess(
|
|
181
|
+
api,
|
|
182
|
+
api.GetVolumePathNameW(before.resolvedPath, volumePath, 260),
|
|
183
|
+
);
|
|
184
|
+
const volumeRoot = readWideString(volumePath);
|
|
185
|
+
const driveType = api.GetDriveTypeW(volumeRoot);
|
|
186
|
+
const fileSystemName = Buffer.alloc(128);
|
|
187
|
+
const volumeName = Buffer.alloc(512);
|
|
188
|
+
const volumeSerialNumber = [0];
|
|
189
|
+
const maximumComponentLength = [0];
|
|
190
|
+
const fileSystemFlags = [0];
|
|
191
|
+
requireWindowsSuccess(
|
|
192
|
+
api,
|
|
193
|
+
api.GetVolumeInformationW(
|
|
194
|
+
volumeRoot,
|
|
195
|
+
volumeName,
|
|
196
|
+
256,
|
|
197
|
+
volumeSerialNumber,
|
|
198
|
+
maximumComponentLength,
|
|
199
|
+
fileSystemFlags,
|
|
200
|
+
fileSystemName,
|
|
201
|
+
64,
|
|
202
|
+
),
|
|
203
|
+
);
|
|
204
|
+
if (
|
|
205
|
+
driveType !== DRIVE_FIXED ||
|
|
206
|
+
readWideString(fileSystemName).toLowerCase() !== "ntfs" ||
|
|
207
|
+
BigInt(volumeSerialNumber[0]) !== BigInt(before.stat.dev)
|
|
208
|
+
) {
|
|
209
|
+
throw new Error(
|
|
210
|
+
"Windows local UI durable storage requires a local NTFS directory",
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const invalidHandle = BigInt.asUintN(
|
|
215
|
+
api.koffi.sizeof("intptr_t") * 8,
|
|
216
|
+
-1n,
|
|
217
|
+
);
|
|
218
|
+
const handle = api.CreateFileW(
|
|
219
|
+
win32Path(before.resolvedPath),
|
|
220
|
+
GENERIC_READ_WRITE,
|
|
221
|
+
FILE_SHARE_ALL,
|
|
222
|
+
null,
|
|
223
|
+
OPEN_EXISTING,
|
|
224
|
+
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
|
|
225
|
+
null,
|
|
226
|
+
);
|
|
227
|
+
if (api.koffi.address(handle) === invalidHandle) {
|
|
228
|
+
const errorCode = api.GetLastError();
|
|
229
|
+
throw windowsError("CreateFileW", errorCode);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
let operationError = null;
|
|
233
|
+
try {
|
|
234
|
+
assertDirectoryHandleIdentity(
|
|
235
|
+
api,
|
|
236
|
+
handle,
|
|
237
|
+
fsImpl,
|
|
238
|
+
directory,
|
|
239
|
+
before,
|
|
240
|
+
);
|
|
241
|
+
const flushed = api.FlushFileBuffers(handle);
|
|
242
|
+
if (!flushed) {
|
|
243
|
+
const errorCode = api.GetLastError();
|
|
244
|
+
throw windowsError("FlushFileBuffers", errorCode);
|
|
245
|
+
}
|
|
246
|
+
assertDirectoryHandleIdentity(
|
|
247
|
+
api,
|
|
248
|
+
handle,
|
|
249
|
+
fsImpl,
|
|
250
|
+
directory,
|
|
251
|
+
before,
|
|
252
|
+
);
|
|
253
|
+
} catch (error) {
|
|
254
|
+
operationError = error;
|
|
255
|
+
throw error;
|
|
256
|
+
} finally {
|
|
257
|
+
const closed = api.CloseHandle(handle);
|
|
258
|
+
if (!closed && operationError === null) {
|
|
259
|
+
const errorCode = api.GetLastError();
|
|
260
|
+
throw windowsError("CloseHandle", errorCode);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return "windows-directory-flush";
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export function createLocalUiEvolutionFileSystem() {
|
|
267
|
+
if (process.platform !== "win32") return fs;
|
|
268
|
+
const localFs = Object.create(fs);
|
|
269
|
+
Object.defineProperty(localFs, "syncDirectorySync", {
|
|
270
|
+
enumerable: true,
|
|
271
|
+
value: (directory) => flushWindowsLocalNtfsDirectory(directory),
|
|
272
|
+
});
|
|
273
|
+
localUiEvolutionFileSystems.add(localFs);
|
|
274
|
+
return localFs;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export function isLocalUiEvolutionFileSystem(fsImpl) {
|
|
278
|
+
return (
|
|
279
|
+
fsImpl !== null &&
|
|
280
|
+
(typeof fsImpl === "object" || typeof fsImpl === "function") &&
|
|
281
|
+
localUiEvolutionFileSystems.has(fsImpl)
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
export function ensureDirectoryTreeDurable(fsImpl, directory) {
|
|
286
|
+
if (typeof fsImpl?.syncDirectorySync !== "function") {
|
|
287
|
+
fsImpl.mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
const target = path.resolve(directory);
|
|
291
|
+
const missing = [];
|
|
292
|
+
let cursor = target;
|
|
293
|
+
for (;;) {
|
|
294
|
+
try {
|
|
295
|
+
const stat = fsImpl.lstatSync(cursor);
|
|
296
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
297
|
+
throw new Error("Local UI state path contains a reparse point");
|
|
298
|
+
}
|
|
299
|
+
break;
|
|
300
|
+
} catch (error) {
|
|
301
|
+
if (error?.code !== "ENOENT") throw error;
|
|
302
|
+
missing.push(cursor);
|
|
303
|
+
const parent = path.dirname(cursor);
|
|
304
|
+
if (parent === cursor) {
|
|
305
|
+
throw new Error("Local UI state path has no existing directory root");
|
|
306
|
+
}
|
|
307
|
+
cursor = parent;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
for (const candidate of missing.reverse()) {
|
|
311
|
+
try {
|
|
312
|
+
fsImpl.mkdirSync(candidate, { mode: 0o700 });
|
|
313
|
+
} catch (error) {
|
|
314
|
+
if (error?.code !== "EEXIST") throw error;
|
|
315
|
+
}
|
|
316
|
+
const stat = fsImpl.lstatSync(candidate);
|
|
317
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
318
|
+
throw new Error("Local UI state path changed during creation");
|
|
319
|
+
}
|
|
320
|
+
fsImpl.syncDirectorySync(path.dirname(candidate));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
providerFetch,
|
|
6
6
|
requireUnscopedModelTransport,
|
|
7
7
|
} from "../formal-budget-provider-scope.js";
|
|
8
|
+
import { normalizeOllamaBaseUrl } from "../ollama-base-url.js";
|
|
8
9
|
|
|
9
10
|
const { createAuthenticatedEvolutionModelClient } = createRequire(
|
|
10
11
|
import.meta.url,
|
|
@@ -102,7 +103,7 @@ function captureHubTransport(llm, sdk) {
|
|
|
102
103
|
? AbortSignal.any([controller.signal, options.signal])
|
|
103
104
|
: controller.signal;
|
|
104
105
|
const response = await providerFetch(
|
|
105
|
-
`${baseUrl}/api/chat`,
|
|
106
|
+
`${normalizeOllamaBaseUrl(baseUrl)}/api/chat`,
|
|
106
107
|
{
|
|
107
108
|
method: "POST",
|
|
108
109
|
headers: { "Content-Type": "application/json" },
|
|
@@ -2,6 +2,7 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import { types } from "node:util";
|
|
3
3
|
import { captureAgentEvolutionRuntimeComposition } from "./agent-evolution-runtime-composition-brand.js";
|
|
4
4
|
import { captureAgentEvolutionIngress } from "./agent-evolution-ingress.js";
|
|
5
|
+
import { formatOpaqueHexId } from "./opaque-hex-id.js";
|
|
5
6
|
|
|
6
7
|
export function readEvolutionCompositionFactory(dependencies = {}) {
|
|
7
8
|
if (
|
|
@@ -43,7 +44,9 @@ export async function prepareGovernedModelTurn(
|
|
|
43
44
|
}
|
|
44
45
|
if (typeof factory !== "function")
|
|
45
46
|
throw new TypeError("Invalid evolution composition factory");
|
|
46
|
-
const runId = `${mode}-${
|
|
47
|
+
const runId = `${mode}-${formatOpaqueHexId(
|
|
48
|
+
randomUUID().replaceAll("-", ""),
|
|
49
|
+
)}`;
|
|
47
50
|
const composition = captureAgentEvolutionRuntimeComposition(
|
|
48
51
|
await factory(
|
|
49
52
|
Object.freeze({ mode, runId, taskId: runId, cwd: process.cwd() }),
|