chainlesschain 0.166.126 → 0.166.128
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 +31 -3
- package/package.json +1 -1
- 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-C6HzxpS_.js → AIOps-BmGA5zXX.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Ba2WP_mo.js → ActionButton-B7WXwoF0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-MEZ-eSYO.js → Analytics-IvJG43B5.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-B1F4dMJl.js → AppLayout-DWY017_e.js} +5 -5
- package/src/assets/web-panel/assets/Artifacts-BOyohM_-.js +1 -0
- package/src/assets/web-panel/assets/{Audit-GzrP6OYx.js → Audit-CD9sTnBN.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-PJ3RWIS5.js → BackgroundAgents-J6gg5z0U.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DV0wK73Y.js → Backup-D7ik3lse.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BqWPlsK1.js → BaseInput-MrDd5zcz.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-D0yNPOid.js → Chat-DbxRqGiK.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-D0De01yM.js → ChatBubbleRenderer-DbeJAwMg.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-GOdS6Fpz.js → Checkbox-CditB77B.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CcvPMAwP.js → Codegen-Ds0UZWZG.js} +1 -1
- package/src/assets/web-panel/assets/{Col-07yH3vgP.js → Col-CZlj1XI2.js} +1 -1
- package/src/assets/web-panel/assets/{Community-cZI0W7u_.js → Community-j4B2SoT6.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BP6fwhXB.js → Compact-BuKQutaO.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BvwQCjXA.js → Compliance-DAgDyS-p.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-yhhvyKZU.js → Cowork-DX2-I6V3.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Bpji2uez.js → Cron-dJpc-FxX.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BZ7XwkuS.js → Crosschain-7m8euM3v.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BJ-Fw-Uk.js → DID-CLoYoCe1.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-3FbsaKoR.js → Dashboard-DR1rRMb7.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DP8yuWyM.js → Dropdown-BsKhCfvH.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Co3i-4ca.js → EmailListRenderer-BAGexzJu.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BqYYmC01.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CPjecSCb.js → FamilyGuardDashboard-BIpueefy.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CJkZPulM.js → Federation-BluNep6d.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CU0YWiAZ.js → FormItemContext-CerdM3am.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-kTxvvpiU.js → GenericCardRenderer-DXh4tOjU.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Cs6SFvMq.js → Git-CEE0cGmf.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CSs_8thn.js → Governance-Bc-XNDhM.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-D7yCromD.js → Inference-CiBzXyZ-.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-C6BcMDRm.js → KnowledgeGraph-CV2IiyuN.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Cz20G07I.js → Logs-fbQYKuSz.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-B73ZyMRI.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BZIopTsG.js → Marketplace-C5utdpxZ.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-OHaHium7.js → McpTools-CPE4SaF3.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DBNBmoM9.js → Memory-DTFDszzk.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BH-ajP-j.js → MobileBridge-DxqPmTzP.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DwiFGqpp.js → MobileProjects-CwcK8l2y.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BmT_VyZL.js → Mtc-DrjECLGO.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-D24wmjmR.js → MtcAudit-4IURCa-3.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-DwWj1F8f.js → Multisig-CggLV1Cp.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DXBRBwhU.js → NLProgramming-DkOQJT73.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-C1QG3x5c.js → Notes-Dodcva6s.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BnlSMFBJ.js → NotificationSettings-CQ3HeTs6.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-uuW0wQc0.js → OrderTableRenderer-pT2nzmIO.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CXGC9RYr.js → Organization-B6HFsIfU.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C3RxcBqQ.js → Overflow-G9dju55N.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DTh-AqFm.js → P2P-C1BCE155.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-IX0sEKne.js → PdhVaultBrowser-BFAxXn5D.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CpcyEP_G.js → Permissions-DWg7cw9Q.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-I5zN_SIn.js → PersonalDataHub-BQxuOQOO.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-CVg3gNFN.js → Pipeline-C3Gse9Ne.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Dffk2pq9.js → Privacy-Dcsjx6Oi.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B8Y3VsbN.js → ProjectInit-DeYlnXJQ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Ds_4fCFG.js → ProjectSettings-D7kbZ_K7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BlyQuiCs.js → Projects-C5m3NGzM.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CI9tKh8S.js → Providers-oT6jy83z.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DOrmL6X3.js → QrScannerModal-NZ11GEBa.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CSSlopeF.js → QuickAsk-CtQU4Tx0.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-fKDWVJgw.js → Recommend-3CoXYu3O.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BKlbq1C0.js → RemoteSession-C2d4LzBM.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DhOFTKRG.js → Reputation-WZQHrGwl.js} +1 -1
- package/src/assets/web-panel/assets/{Row-ckVQk62z.js → Row-ChiqY7Hg.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CShivptZ.js → RssFeed-Cjwl2Kum.js} +2 -2
- package/src/assets/web-panel/assets/{Search-PJpI8T9h.js → Search-DRDMZxTF.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CVQPej3p.js → Security-D0y4LlQ4.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CWJj07ru.js → Services-ChpkqWm0.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CNxdd41V.js → Skeleton-D3WGZ8yO.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-AD-xWT2V.js → Skills-Bv_7HaUW.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BuDuN1ak.js → Sla-crZMKyX0.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-WYryugQK.js → SpeechSettings-ByWn5XDZ.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dxz8z_yO.js → SyncSettings--R55vxvj.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BCQFGo6S.js → Tasks-BZA_Via_.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CNU1xhuV.js → Templates-9eJ9yY8Q.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CFsqv744.js → Tenant-CfWX2jqj.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal--7FxkXMc.js → Terminal-CUXUF4kL.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Cqtg4CN-.js → TimelineRenderer-77y9bkYN.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DQD8oVJ3.js → Tokens-CvyrdLH6.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BujLIIRO.js → Trigger-MNRl_YNr.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-_3yRNM57.js → Trust-BHOXK-Mp.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C_QKp9Ig.js → UkeySign-Bz1oZNyQ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BkgP1c6L.js → VideoEditing-DlqmXyZv.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CTHaNBha.js → Wallet-Dg1rnqEG.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CbXcDn_T.js → WebAuthn-DJtGeaOk.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BUOyHiTN.js → WorkflowEditor-DJPubjX5.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DTG5Geyv.js → chat-BWweDuIV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BAdqWSlv.js → colors-BX5ViADF.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DYh7YdLa.js → compact-item-Df8MLbXp.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-mPOA80GV.js → createContext-C0FDTwdV.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BgM5vq1s.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Gzp3HIXP.js → hasIn-PpL6GdNk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLuIQO9d.js → index-7VyVOEf7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BL46pkYn.js → index-B3K1uZ7R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFXlLyEF.js → index-B4UxFB2N.js} +1 -1
- package/src/assets/web-panel/assets/{index-Diwevwx7.js → index-B8-pSyP7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Brr8ALy2.js → index-B982oUKN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsgxUKpZ.js → index-BF0ERucU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BjRl7Jhc.js → index-BMIEWinN.js} +1 -1
- package/src/assets/web-panel/assets/{index-X1iyU-gh.js → index-BWSCphaT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYbMpkmP.js → index-BeFhy4BX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGQfiMVc.js → index-Beh1kLwx.js} +1 -1
- package/src/assets/web-panel/assets/index-Bl-HTXWn.js +1 -0
- package/src/assets/web-panel/assets/{index-CR3ZvuY6.js → index-C0PqPK-8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzkgWUAt.js → index-C2JU-gdS.js} +1 -1
- package/src/assets/web-panel/assets/{index-z3FnuAKK.js → index-C8wl7Ica.js} +1 -1
- package/src/assets/web-panel/assets/{index-og41WNLX.js → index-C9FOwTgX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQZVcznI.js → index-C9N1u8jV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqSb5LAk.js → index-Cf86RSQk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxpX3q8j.js → index-ChV82mzs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdleQSUU.js → index-Cj00JSqq.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByUjSWIg.js → index-Cm7vZvA3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbdMPF9D.js → index-CmMzB4C-.js} +3 -3
- package/src/assets/web-panel/assets/{index-Ch0qsp2p.js → index-CxY_U5RT.js} +1 -1
- package/src/assets/web-panel/assets/index-Cxf0YfM5.js +1 -0
- package/src/assets/web-panel/assets/{index-BYE61P6D.js → index-D5Ei75Wt.js} +1 -1
- package/src/assets/web-panel/assets/{index-OkiNUps8.js → index-DBzaRg4E.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKYYncej.js → index-DFtzEEYe.js} +1 -1
- package/src/assets/web-panel/assets/{index-C52u0SKj.js → index-DGLbojjx.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_65ERlZ.js → index-D_6XIMVV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Byln7kVS.js → index-DddQd0_V.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcZz24sL.js → index-DwZkBGXd.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5MHbkbK.js → index-DxJqyIP8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMScSzoi.js → index-Dy8K2laU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BH067bfd.js → index-FAZH69my.js} +1 -1
- package/src/assets/web-panel/assets/{index-y-TWtPEX.js → index-NdEUFm32.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfsFQ-DX.js → index-P1ERNJla.js} +1 -1
- package/src/assets/web-panel/assets/{index-CchNIYmQ.js → index-R0LQ3fgq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCw8rGv8.js → index-UXM5vpt4.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1UsX4Hx.js → index-iif2A1eL.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9uyUX6z.js → index-itNn6pW1.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DmksOjaL.js → initDefaultProps-DeMthvi4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cb3y_Vsi.js → motion-_7kbkzE0.js} +1 -1
- package/src/assets/web-panel/assets/{move-DP-3qcfq.js → move-gCI04pLw.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BCDUfUEO.js → mtc-parser-D5UWHv2U.js} +1 -1
- package/src/assets/web-panel/assets/{omit-MH-O2PY6.js → omit-CDCZcqeS.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BaZORqPr.js → pickAttrs-DGMDLi3S.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Dkp_5tvw.js → placementArrow-C-3vC1Vh.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DBJSmMkS.js → responsiveObserve-vdoYucvi.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Cc6qGIgj.js → slide-B62FhgyZ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-FundADw-.js → statusUtils-DCLlfnym.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-qOO9jMdb.js → styleChecker-CGvQ4LRR.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BYbRYwok.js → useFlexGapSupport-BqkGoKwe.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-D6PqFBtt.js → useFs-Bkr_nU3q.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-mJpur_zt.js → usePersonalDataHub-CYxMIUEq.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-ZFVHKenK.js → vnode-sAbcY1FX.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Ca_KBv2o.js → zoom-Dm2pLrXi.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 +29 -0
- package/src/commands/ask.js +23 -23
- package/src/commands/chat.js +1 -5
- package/src/commands/session.js +92 -61
- package/src/commands/setup.js +35 -10
- package/src/commands/ui.js +18 -5
- package/src/constants.js +18 -89
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/action-protocol.js +22 -14
- package/src/gateways/ws/chat-intent-protocol.js +7 -3
- package/src/gateways/ws/llm-chat-protocol.js +9 -2
- package/src/gateways/ws/ws-server.js +24 -12
- package/src/lib/bm25-search.js +6 -3
- package/src/lib/chat-intent-service.js +28 -4
- package/src/lib/coding-task-guidance.js +6 -1
- package/src/lib/config-manager.js +49 -16
- package/src/lib/config-schema.js +5 -0
- package/src/lib/context-memory-kernel/memory-query-index.js +35 -17
- package/src/lib/evolution/evolution-deployment-config.js +48 -5
- package/src/lib/evolution/evolution-deployment-loader.js +26 -11
- package/src/lib/evolution/evolution-enabled.js +27 -0
- package/src/lib/evolution/governed-model-turn.js +4 -1
- package/src/lib/evolution/optional-ui-model-turn.js +26 -0
- package/src/lib/goal-check-evidence.js +159 -0
- package/src/lib/goal-condition-engine.js +24 -2
- package/src/lib/llm-connection-probe.js +48 -4
- package/src/lib/llm-onboarding-catalog.json +131 -0
- package/src/lib/paths.js +2 -2
- package/src/lib/skill-retrieval-router.js +2 -1
- package/src/lib/skill-search-tokenizer.js +143 -0
- package/src/repl/agent-repl.js +8 -4
- package/src/repl/chat-repl.js +15 -9
- package/src/runtime/agent-core.js +87 -7
- package/src/runtime/agent-runtime.js +18 -6
- package/src/runtime/headless-runner.js +138 -66
- package/src/runtime/headless-stream.js +1 -0
- package/src/runtime/mcp-tool-search-ranking.js +142 -0
- package/src/runtime/mcp-tool-search.js +198 -60
- package/src/assets/web-panel/assets/Artifacts-D50kNasl.js +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BKWKDok5.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-vialawkx.js +0 -1
- package/src/assets/web-panel/assets/devWarning-ChcomtaV.js +0 -1
- package/src/assets/web-panel/assets/index-CXxCC-4V.js +0 -1
- package/src/assets/web-panel/assets/index-CZYLUp6g.js +0 -1
package/src/commands/ask.js
CHANGED
|
@@ -143,23 +143,21 @@ export async function queryLLM(
|
|
|
143
143
|
options = {},
|
|
144
144
|
evolutionIngress = null,
|
|
145
145
|
) {
|
|
146
|
-
if (evolutionIngress === null) {
|
|
147
|
-
const error = new Error(
|
|
148
|
-
"Model egress requires an authenticated evolution ingress",
|
|
149
|
-
);
|
|
150
|
-
error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
|
|
151
|
-
throw error;
|
|
152
|
-
}
|
|
153
146
|
const provider = options.provider || "ollama";
|
|
154
147
|
const model =
|
|
155
148
|
options.model || BUILT_IN_PROVIDERS[provider]?.models?.[0] || "qwen2:7b";
|
|
156
149
|
const messages = [{ role: "user", content: question }];
|
|
157
|
-
const providerMessages =
|
|
158
|
-
|
|
159
|
-
messages
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
150
|
+
const providerMessages =
|
|
151
|
+
evolutionIngress === null
|
|
152
|
+
? messages
|
|
153
|
+
: (
|
|
154
|
+
await captureAgentEvolutionIngress(
|
|
155
|
+
evolutionIngress,
|
|
156
|
+
).prepareModelRequest({
|
|
157
|
+
messages,
|
|
158
|
+
tools: [],
|
|
159
|
+
})
|
|
160
|
+
).messages;
|
|
163
161
|
|
|
164
162
|
// Claude-Code 2.1.183 parity: warn (stderr only, so --json/stdout stays
|
|
165
163
|
// clean) if the requested model is a provider-retired snapshot. Suppressed
|
|
@@ -265,7 +263,9 @@ export async function queryLLM(
|
|
|
265
263
|
},
|
|
266
264
|
);
|
|
267
265
|
if (!response.ok) {
|
|
268
|
-
throw new Error(
|
|
266
|
+
throw new Error(
|
|
267
|
+
`gemini error: ${response.status} ${response.statusText}`,
|
|
268
|
+
);
|
|
269
269
|
}
|
|
270
270
|
const data = await response.json();
|
|
271
271
|
return geminiResponseText(data);
|
|
@@ -274,15 +274,15 @@ export async function queryLLM(
|
|
|
274
274
|
const response = await providerFetch(
|
|
275
275
|
`${openAICompatibleBaseUrl(provider, apiBase)}/chat/completions`,
|
|
276
276
|
{
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
277
|
+
method: "POST",
|
|
278
|
+
headers: {
|
|
279
|
+
"Content-Type": "application/json",
|
|
280
|
+
Authorization: `Bearer ${apiKey}`,
|
|
281
|
+
},
|
|
282
|
+
body: JSON.stringify({
|
|
283
|
+
model: model || providerDef.models[0],
|
|
284
|
+
messages: providerMessages,
|
|
285
|
+
}),
|
|
286
286
|
},
|
|
287
287
|
);
|
|
288
288
|
|
package/src/commands/chat.js
CHANGED
|
@@ -42,11 +42,7 @@ export async function resolveChatCommandEvolutionComposition(
|
|
|
42
42
|
{ agent = false } = {},
|
|
43
43
|
) {
|
|
44
44
|
if (evolutionCompositionFactory === null) {
|
|
45
|
-
|
|
46
|
-
"Chat model egress requires an authenticated evolution composition factory",
|
|
47
|
-
);
|
|
48
|
-
error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
|
|
49
|
-
throw error;
|
|
45
|
+
return null;
|
|
50
46
|
}
|
|
51
47
|
const mode = agent ? "chat-agent" : "chat";
|
|
52
48
|
const runId = `${mode}-${randomUUID()}`;
|
package/src/commands/session.js
CHANGED
|
@@ -106,8 +106,9 @@ function _sessionEpoch(ts) {
|
|
|
106
106
|
* @returns {{statusBar:string, autoMerge:{allow:boolean,reason:string,unmet:string[]}, lines:string[]}}
|
|
107
107
|
*/
|
|
108
108
|
export async function renderPrStatus(signals = {}, opts = {}) {
|
|
109
|
-
const { strictAutoMergeDecision, describePrStatusBar } =
|
|
110
|
-
|
|
109
|
+
const { strictAutoMergeDecision, describePrStatusBar } = await import(
|
|
110
|
+
"../lib/pr-automation-policy.js"
|
|
111
|
+
);
|
|
111
112
|
const autoMerge = strictAutoMergeDecision({
|
|
112
113
|
enabled: opts.enabled === true,
|
|
113
114
|
hasOpenPr: signals.hasOpenPr,
|
|
@@ -356,22 +357,25 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
356
357
|
sourceErrors.local = error?.message || String(error);
|
|
357
358
|
}
|
|
358
359
|
try {
|
|
359
|
-
const { listBackgroundAgents } =
|
|
360
|
-
|
|
360
|
+
const { listBackgroundAgents } = await import(
|
|
361
|
+
"../lib/background-agent-supervisor.js"
|
|
362
|
+
);
|
|
361
363
|
background = listBackgroundAgents({ all: true });
|
|
362
364
|
} catch (error) {
|
|
363
365
|
sourceErrors.background = error?.message || String(error);
|
|
364
366
|
}
|
|
365
367
|
try {
|
|
366
|
-
const { readRemoteControlStates } =
|
|
367
|
-
|
|
368
|
+
const { readRemoteControlStates } = await import(
|
|
369
|
+
"../lib/remote-control.js"
|
|
370
|
+
);
|
|
368
371
|
remote = readRemoteControlStates();
|
|
369
372
|
} catch (error) {
|
|
370
373
|
sourceErrors.remote = error?.message || String(error);
|
|
371
374
|
}
|
|
372
375
|
try {
|
|
373
|
-
const { listCollaborationRuns } =
|
|
374
|
-
|
|
376
|
+
const { listCollaborationRuns } = await import(
|
|
377
|
+
"../lib/collaboration-run-store.js"
|
|
378
|
+
);
|
|
375
379
|
team = listCollaborationRuns({ limit }).filter(
|
|
376
380
|
(run) => run?.kind === "team",
|
|
377
381
|
);
|
|
@@ -392,8 +396,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
392
396
|
sourceErrors.workflow = error?.message || String(error);
|
|
393
397
|
}
|
|
394
398
|
try {
|
|
395
|
-
const { listDynamicWorkflowWorkbenchStates } =
|
|
396
|
-
|
|
399
|
+
const { listDynamicWorkflowWorkbenchStates } = await import(
|
|
400
|
+
"../lib/dynamic-workflow-runtime.js"
|
|
401
|
+
);
|
|
397
402
|
const discovered = listDynamicWorkflowWorkbenchStates(projectRoot, {
|
|
398
403
|
limit,
|
|
399
404
|
});
|
|
@@ -412,8 +417,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
412
417
|
// engine proves that the exact worktree is supported. Copy-mode
|
|
413
418
|
// checkpoints need explicit paths and therefore cannot truthfully be
|
|
414
419
|
// offered as a one-click session action.
|
|
415
|
-
const { isCheckpointAvailable } =
|
|
416
|
-
|
|
420
|
+
const { isCheckpointAvailable } = await import(
|
|
421
|
+
"../lib/checkpoint-store.js"
|
|
422
|
+
);
|
|
417
423
|
const capability = new Map();
|
|
418
424
|
const decorate = (items, pathFor, sessionFor) =>
|
|
419
425
|
items.map((item) => {
|
|
@@ -456,8 +462,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
456
462
|
// checkpoint action unavailable with its explicit reason.
|
|
457
463
|
}
|
|
458
464
|
try {
|
|
459
|
-
const { ArtifactStore, publicArtifactMetadata } =
|
|
460
|
-
|
|
465
|
+
const { ArtifactStore, publicArtifactMetadata } = await import(
|
|
466
|
+
"../lib/artifact-store.js"
|
|
467
|
+
);
|
|
461
468
|
artifacts = new ArtifactStore().list().map(publicArtifactMetadata);
|
|
462
469
|
} catch {
|
|
463
470
|
// Summaries are optional; absence never removes a session.
|
|
@@ -469,22 +476,25 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
469
476
|
// Summaries are optional; absence never removes a session.
|
|
470
477
|
}
|
|
471
478
|
try {
|
|
472
|
-
const { SessionMessageFabric } =
|
|
473
|
-
|
|
479
|
+
const { SessionMessageFabric } = await import(
|
|
480
|
+
"../lib/session-message-fabric.js"
|
|
481
|
+
);
|
|
474
482
|
sessionMessageFabric = new SessionMessageFabric().projection();
|
|
475
483
|
} catch (error) {
|
|
476
484
|
sourceErrors.sessionMessageFabric = error?.message || String(error);
|
|
477
485
|
}
|
|
478
486
|
try {
|
|
479
|
-
const { SessionWorkbenchStore } =
|
|
480
|
-
|
|
487
|
+
const { SessionWorkbenchStore } = await import(
|
|
488
|
+
"../lib/session-workbench-store.js"
|
|
489
|
+
);
|
|
481
490
|
sessionWorkbench = new SessionWorkbenchStore().projection();
|
|
482
491
|
} catch (error) {
|
|
483
492
|
sourceErrors.sessionWorkbench = error?.message || String(error);
|
|
484
493
|
}
|
|
485
494
|
|
|
486
|
-
const { buildSessionProjection } =
|
|
487
|
-
|
|
495
|
+
const { buildSessionProjection } = await import(
|
|
496
|
+
"../lib/session-projection.js"
|
|
497
|
+
);
|
|
488
498
|
const projection = buildSessionProjection({
|
|
489
499
|
local,
|
|
490
500
|
background,
|
|
@@ -511,8 +521,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
511
521
|
}
|
|
512
522
|
}
|
|
513
523
|
} catch (error) {
|
|
514
|
-
const { disconnectedSessionProjection } =
|
|
515
|
-
|
|
524
|
+
const { disconnectedSessionProjection } = await import(
|
|
525
|
+
"../lib/session-projection.js"
|
|
526
|
+
);
|
|
516
527
|
if (options.json) {
|
|
517
528
|
jsonPayload = JSON.stringify(
|
|
518
529
|
disconnectedSessionProjection(error?.message || String(error)),
|
|
@@ -562,8 +573,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
562
573
|
} else {
|
|
563
574
|
// Live path: resolve the session's linked PR and fetch via gh.
|
|
564
575
|
const { getPrLinks } = await import("../lib/pr-link-ledger.js");
|
|
565
|
-
const { getLastSessionId } =
|
|
566
|
-
|
|
576
|
+
const { getLastSessionId } = await import(
|
|
577
|
+
"../harness/jsonl-session-store.js"
|
|
578
|
+
);
|
|
567
579
|
const sid = !id || id === "last" ? getLastSessionId() : id;
|
|
568
580
|
const links = sid ? getPrLinks(sid) : [];
|
|
569
581
|
if (links.length === 0) {
|
|
@@ -641,8 +653,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
641
653
|
// (single / non-TTY / Ctrl-C). Same helper as `cc agent --resume`.
|
|
642
654
|
if (!id) {
|
|
643
655
|
ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
644
|
-
const { pickRecentSession } =
|
|
645
|
-
|
|
656
|
+
const { pickRecentSession } = await import(
|
|
657
|
+
"../lib/session-picker.js"
|
|
658
|
+
);
|
|
646
659
|
const picked = await pickRecentSession(ctx);
|
|
647
660
|
if (!picked.id) {
|
|
648
661
|
logger.error(
|
|
@@ -672,8 +685,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
672
685
|
if (jsonlId) {
|
|
673
686
|
// Tamper gate: a broken hash chain means the transcript was edited
|
|
674
687
|
// outside the store — never silently rebuild it as trusted context.
|
|
675
|
-
const { verifySession } =
|
|
676
|
-
|
|
688
|
+
const { verifySession } = await import(
|
|
689
|
+
"../harness/jsonl-session-store.js"
|
|
690
|
+
);
|
|
677
691
|
const trust = verifySession(jsonlId);
|
|
678
692
|
if (["missing", "conflict"].includes(trust.status)) {
|
|
679
693
|
logger.error(
|
|
@@ -741,12 +755,15 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
741
755
|
resolveChatCommandEvolutionComposition,
|
|
742
756
|
assertChatSessionUsageAdmission,
|
|
743
757
|
} = await import("./chat.js");
|
|
744
|
-
const { readEvolutionCompositionFactory } =
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
758
|
+
const { readEvolutionCompositionFactory } = await import(
|
|
759
|
+
"../lib/evolution/governed-model-turn.js"
|
|
760
|
+
);
|
|
761
|
+
const { loadEvolutionDeploymentCommandDependencies } = await import(
|
|
762
|
+
"../lib/evolution/evolution-deployment-loader.js"
|
|
763
|
+
);
|
|
764
|
+
const { waitForAgentEvolutionSession } = await import(
|
|
765
|
+
"../lib/evolution/agent-evolution-session-lifecycle.js"
|
|
766
|
+
);
|
|
750
767
|
assertChatSessionUsageAdmission(sess.id);
|
|
751
768
|
// Resume is a chat entrypoint. Use the target's authenticated chat
|
|
752
769
|
// deployment, loaded only here so read-only session commands need none.
|
|
@@ -757,8 +774,8 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
757
774
|
);
|
|
758
775
|
const composition =
|
|
759
776
|
await resolveChatCommandEvolutionComposition(factory);
|
|
760
|
-
const ingress = composition
|
|
761
|
-
await ingress.start();
|
|
777
|
+
const ingress = composition?.evolutionIngress ?? null;
|
|
778
|
+
if (ingress !== null) await ingress.start();
|
|
762
779
|
const lifecycle = await startChatRepl({
|
|
763
780
|
model: options.model || sess.model,
|
|
764
781
|
provider: options.provider || sess.provider || "ollama",
|
|
@@ -767,7 +784,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
767
784
|
sessionId: sess.id,
|
|
768
785
|
evolutionIngress: ingress,
|
|
769
786
|
});
|
|
770
|
-
|
|
787
|
+
if (ingress !== null)
|
|
788
|
+
await waitForAgentEvolutionSession(lifecycle, ingress);
|
|
789
|
+
else await lifecycle.finished;
|
|
771
790
|
} catch (err) {
|
|
772
791
|
logger.error(`Failed: ${err.message}`);
|
|
773
792
|
process.exitCode = 1;
|
|
@@ -810,8 +829,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
810
829
|
);
|
|
811
830
|
}
|
|
812
831
|
if (sid) {
|
|
813
|
-
const { renderAgentSessionMarkdown } =
|
|
814
|
-
|
|
832
|
+
const { renderAgentSessionMarkdown } = await import(
|
|
833
|
+
"../lib/agent-session-export.js"
|
|
834
|
+
);
|
|
815
835
|
markdown = renderAgentSessionMarkdown(sid, store.readEvents(sid), {
|
|
816
836
|
exportedAt: new Date().toISOString(),
|
|
817
837
|
});
|
|
@@ -1064,8 +1084,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
1064
1084
|
}
|
|
1065
1085
|
let result;
|
|
1066
1086
|
if (jsonlId) {
|
|
1067
|
-
const { renameSession } =
|
|
1068
|
-
|
|
1087
|
+
const { renameSession } = await import(
|
|
1088
|
+
"../harness/jsonl-session-store.js"
|
|
1089
|
+
);
|
|
1069
1090
|
result = renameSession(jsonlId, normalized);
|
|
1070
1091
|
} else {
|
|
1071
1092
|
ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
@@ -1104,8 +1125,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
1104
1125
|
.option("--json", "Output as JSON")
|
|
1105
1126
|
.action(async (options) => {
|
|
1106
1127
|
try {
|
|
1107
|
-
const { pruneJsonlSessions } =
|
|
1108
|
-
|
|
1128
|
+
const { pruneJsonlSessions } = await import(
|
|
1129
|
+
"../harness/jsonl-session-store.js"
|
|
1130
|
+
);
|
|
1109
1131
|
const result = pruneJsonlSessions({
|
|
1110
1132
|
olderThanDays: Number(options.olderThan),
|
|
1111
1133
|
keep: options.keep != null ? Number(options.keep) : undefined,
|
|
@@ -1483,8 +1505,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
1483
1505
|
.option("--json", "Output as JSON")
|
|
1484
1506
|
.action(async (id, options) => {
|
|
1485
1507
|
try {
|
|
1486
|
-
const { getApprovalGate } =
|
|
1487
|
-
|
|
1508
|
+
const { getApprovalGate } = await import(
|
|
1509
|
+
"../lib/session-core-singletons.js"
|
|
1510
|
+
);
|
|
1488
1511
|
const gate = await getApprovalGate();
|
|
1489
1512
|
if (options.set) {
|
|
1490
1513
|
await gate.setSessionPolicy(id, options.set);
|
|
@@ -1519,8 +1542,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
1519
1542
|
.option("--json", "Output as JSON")
|
|
1520
1543
|
.action(async (options) => {
|
|
1521
1544
|
try {
|
|
1522
|
-
const { getSessionManager } =
|
|
1523
|
-
|
|
1545
|
+
const { getSessionManager } = await import(
|
|
1546
|
+
"../lib/session-core-singletons.js"
|
|
1547
|
+
);
|
|
1524
1548
|
const mgr = getSessionManager();
|
|
1525
1549
|
const live = mgr.list({
|
|
1526
1550
|
agentId: options.agent,
|
|
@@ -1564,8 +1588,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
1564
1588
|
.argument("<id>", "Session ID")
|
|
1565
1589
|
.action(async (id) => {
|
|
1566
1590
|
try {
|
|
1567
|
-
const { getSessionManager } =
|
|
1568
|
-
|
|
1591
|
+
const { getSessionManager } = await import(
|
|
1592
|
+
"../lib/session-core-singletons.js"
|
|
1593
|
+
);
|
|
1569
1594
|
const mgr = getSessionManager();
|
|
1570
1595
|
if (!mgr.has(id)) {
|
|
1571
1596
|
logger.error(`Session ${id} is not active in this process`);
|
|
@@ -1590,8 +1615,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
1590
1615
|
.argument("<id>", "Session ID")
|
|
1591
1616
|
.action(async (id) => {
|
|
1592
1617
|
try {
|
|
1593
|
-
const { getSessionManager } =
|
|
1594
|
-
|
|
1618
|
+
const { getSessionManager } = await import(
|
|
1619
|
+
"../lib/session-core-singletons.js"
|
|
1620
|
+
);
|
|
1595
1621
|
const mgr = getSessionManager();
|
|
1596
1622
|
const ok = await mgr.resume(id);
|
|
1597
1623
|
if (!ok) {
|
|
@@ -1620,12 +1646,14 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
1620
1646
|
.option("--agent-id <id>", "Agent id for scope=agent")
|
|
1621
1647
|
.action(async (id, options) => {
|
|
1622
1648
|
try {
|
|
1623
|
-
const { getSessionManager } =
|
|
1624
|
-
|
|
1649
|
+
const { getSessionManager } = await import(
|
|
1650
|
+
"../lib/session-core-singletons.js"
|
|
1651
|
+
);
|
|
1625
1652
|
if (options.consolidate) {
|
|
1626
1653
|
try {
|
|
1627
|
-
const { consolidateJsonlSession } =
|
|
1628
|
-
|
|
1654
|
+
const { consolidateJsonlSession } = await import(
|
|
1655
|
+
"../lib/session-consolidator.js"
|
|
1656
|
+
);
|
|
1629
1657
|
const res = await consolidateJsonlSession(id, {
|
|
1630
1658
|
scope: options.scope,
|
|
1631
1659
|
scopeId: options.scopeId || null,
|
|
@@ -1844,8 +1872,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
1844
1872
|
);
|
|
1845
1873
|
process.exit(1);
|
|
1846
1874
|
}
|
|
1847
|
-
const { sessionUsage, allSessionsUsage } =
|
|
1848
|
-
|
|
1875
|
+
const { sessionUsage, allSessionsUsage } = await import(
|
|
1876
|
+
"../lib/session-usage.js"
|
|
1877
|
+
);
|
|
1849
1878
|
const result = id
|
|
1850
1879
|
? sessionUsage(id)
|
|
1851
1880
|
: allSessionsUsage({ limit: parseInt(options.limit, 10) || 1000 });
|
|
@@ -1918,8 +1947,9 @@ export function registerSessionCommand(program, dependencies = {}) {
|
|
|
1918
1947
|
.option("--json", "Machine-readable JSON output")
|
|
1919
1948
|
.action(async (id) => {
|
|
1920
1949
|
try {
|
|
1921
|
-
const { getVerifiedSessionObservabilityAuthority } =
|
|
1922
|
-
|
|
1950
|
+
const { getVerifiedSessionObservabilityAuthority } = await import(
|
|
1951
|
+
"../harness/jsonl-session-store.js"
|
|
1952
|
+
);
|
|
1923
1953
|
const authority = getVerifiedSessionObservabilityAuthority(id);
|
|
1924
1954
|
console.log(
|
|
1925
1955
|
JSON.stringify(
|
|
@@ -2357,8 +2387,9 @@ async function mirrorPruneSessions() {
|
|
|
2357
2387
|
* (`session.mirror.encryption`). Requires both to be configured.
|
|
2358
2388
|
*/
|
|
2359
2389
|
async function mirrorRotateKey() {
|
|
2360
|
-
const { createMirror, createMirrorCipher, rotateMirrorKey } =
|
|
2361
|
-
|
|
2390
|
+
const { createMirror, createMirrorCipher, rotateMirrorKey } = await import(
|
|
2391
|
+
"../harness/session-mirror.js"
|
|
2392
|
+
);
|
|
2362
2393
|
const { cfg } = await loadConfiguredMirror();
|
|
2363
2394
|
if (!cfg || !cfg.kind || cfg.kind === "none") {
|
|
2364
2395
|
return { target: null };
|
package/src/commands/setup.js
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
} from "../constants.js";
|
|
10
10
|
import { ensureHomeDir, getConfigPath } from "../lib/paths.js";
|
|
11
11
|
import {
|
|
12
|
+
loadConfig,
|
|
12
13
|
setSecretConfigValue,
|
|
13
14
|
updateConfigAtomically,
|
|
14
15
|
} from "../lib/config-manager.js";
|
|
@@ -59,6 +60,26 @@ export function assertRequiredProviderCredential(providerInfo, apiKey) {
|
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
|
|
63
|
+
export function resolveSetupLlmDefaults(provider, existing = {}) {
|
|
64
|
+
const preset = LLM_PROVIDERS[provider];
|
|
65
|
+
if (!preset) throw new Error("Unknown setup provider");
|
|
66
|
+
const sameProvider = existing?.provider === provider;
|
|
67
|
+
return {
|
|
68
|
+
baseUrl:
|
|
69
|
+
sameProvider &&
|
|
70
|
+
typeof existing.baseUrl === "string" &&
|
|
71
|
+
existing.baseUrl.trim()
|
|
72
|
+
? existing.baseUrl
|
|
73
|
+
: preset.defaultBaseUrl,
|
|
74
|
+
model:
|
|
75
|
+
sameProvider &&
|
|
76
|
+
typeof existing.model === "string" &&
|
|
77
|
+
existing.model.trim()
|
|
78
|
+
? existing.model
|
|
79
|
+
: preset.defaultModel,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
62
83
|
async function runSetup(options) {
|
|
63
84
|
logger.log(chalk.bold("\n ChainlessChain Setup Wizard\n"));
|
|
64
85
|
logger.log(` Version: ${VERSION}`);
|
|
@@ -104,6 +125,17 @@ async function runSetup(options) {
|
|
|
104
125
|
]);
|
|
105
126
|
|
|
106
127
|
// Step 5: Configure LLM
|
|
128
|
+
let existingLlm;
|
|
129
|
+
try {
|
|
130
|
+
existingLlm = loadConfig({
|
|
131
|
+
resolveSecrets: false,
|
|
132
|
+
failIfUnavailable: true,
|
|
133
|
+
}).llm;
|
|
134
|
+
} catch {
|
|
135
|
+
throw new Error(
|
|
136
|
+
"Could not read existing LLM configuration; repair it before running setup",
|
|
137
|
+
);
|
|
138
|
+
}
|
|
107
139
|
const providerChoices = Object.entries(LLM_PROVIDERS).map(([key, info]) => ({
|
|
108
140
|
name: info.name,
|
|
109
141
|
value: key,
|
|
@@ -112,8 +144,7 @@ async function runSetup(options) {
|
|
|
112
144
|
const providerInfo = LLM_PROVIDERS[provider];
|
|
113
145
|
|
|
114
146
|
let apiKey = null;
|
|
115
|
-
let baseUrl =
|
|
116
|
-
let model = providerInfo.defaultModel;
|
|
147
|
+
let { baseUrl, model } = resolveSetupLlmDefaults(provider, existingLlm);
|
|
117
148
|
|
|
118
149
|
if (providerInfo.requiresApiKey) {
|
|
119
150
|
apiKey = await askPassword(`Enter ${providerInfo.name} API key:`);
|
|
@@ -123,14 +154,8 @@ async function runSetup(options) {
|
|
|
123
154
|
}
|
|
124
155
|
|
|
125
156
|
if (provider === "custom" || providerInfo.isProxy) {
|
|
126
|
-
baseUrl = await askInput(
|
|
127
|
-
|
|
128
|
-
providerInfo.defaultBaseUrl || "",
|
|
129
|
-
);
|
|
130
|
-
model = await askInput(
|
|
131
|
-
"Enter model name:",
|
|
132
|
-
providerInfo.defaultModel || "",
|
|
133
|
-
);
|
|
157
|
+
baseUrl = await askInput("Enter API base URL:", baseUrl || "");
|
|
158
|
+
model = await askInput("Enter model name:", model || "");
|
|
134
159
|
} else {
|
|
135
160
|
const customizeModel = await askConfirm(
|
|
136
161
|
`Use default model (${model})?`,
|
package/src/commands/ui.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { logger } from "../lib/logger.js";
|
|
2
2
|
import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
|
|
3
3
|
import { readEvolutionCompositionFactory } from "../lib/evolution/governed-model-turn.js";
|
|
4
|
+
import {
|
|
5
|
+
prepareConfiguredUiModelTurn,
|
|
6
|
+
loadConfiguredUiEvolutionFactory,
|
|
7
|
+
} from "../lib/evolution/optional-ui-model-turn.js";
|
|
4
8
|
import { loadEvolutionDeploymentCommandDependencies } from "../lib/evolution/evolution-deployment-loader.js";
|
|
5
9
|
import { getEvolutionDeploymentStatus } from "../lib/evolution/evolution-deployment-config.js";
|
|
6
10
|
|
|
@@ -36,7 +40,7 @@ export function registerUiCommand(program, dependencies = {}) {
|
|
|
36
40
|
try {
|
|
37
41
|
deploymentDependencies =
|
|
38
42
|
await loadEvolutionDeploymentCommandDependencies("ui", {
|
|
39
|
-
initializeDefaultLocalUi:
|
|
43
|
+
initializeDefaultLocalUi: false,
|
|
40
44
|
});
|
|
41
45
|
} catch (error) {
|
|
42
46
|
localTrustSetupError = error;
|
|
@@ -44,7 +48,10 @@ export function registerUiCommand(program, dependencies = {}) {
|
|
|
44
48
|
activeEvolutionCompositionFactory = readEvolutionCompositionFactory(
|
|
45
49
|
deploymentDependencies || {},
|
|
46
50
|
);
|
|
47
|
-
if (
|
|
51
|
+
if (
|
|
52
|
+
activeEvolutionCompositionFactory === null &&
|
|
53
|
+
localTrustSetupError
|
|
54
|
+
) {
|
|
48
55
|
const status = await getEvolutionDeploymentStatus();
|
|
49
56
|
const readiness = status.readiness.ui;
|
|
50
57
|
logger.warn(
|
|
@@ -71,13 +78,19 @@ export function registerUiCommand(program, dependencies = {}) {
|
|
|
71
78
|
10,
|
|
72
79
|
);
|
|
73
80
|
const runtime = createAgentRuntimeFactory({
|
|
74
|
-
deps:
|
|
75
|
-
activeEvolutionCompositionFactory === null
|
|
81
|
+
deps: {
|
|
82
|
+
...(activeEvolutionCompositionFactory === null
|
|
76
83
|
? {}
|
|
77
84
|
: {
|
|
78
85
|
evolutionCompositionFactory:
|
|
79
86
|
activeEvolutionCompositionFactory,
|
|
80
|
-
},
|
|
87
|
+
}),
|
|
88
|
+
// Re-read the shared setting at each new Quick Ask request so the
|
|
89
|
+
// GUI and config-file switches also work in an already running UI.
|
|
90
|
+
prepareUiModelTurn: prepareConfiguredUiModelTurn,
|
|
91
|
+
resolveEvolutionCompositionFactory:
|
|
92
|
+
loadConfiguredUiEvolutionFactory,
|
|
93
|
+
},
|
|
81
94
|
}).createUiRuntime({
|
|
82
95
|
port,
|
|
83
96
|
wsPort: parseInt(opts.wsPort, 10),
|
package/src/constants.js
CHANGED
|
@@ -26,95 +26,21 @@ export const DEFAULT_PORTS = {
|
|
|
26
26
|
wsServer: 18800,
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
defaultBaseUrl: "https://api.anthropic.com/v1",
|
|
45
|
-
defaultModel: "claude-sonnet-4-6",
|
|
46
|
-
requiresApiKey: true,
|
|
47
|
-
},
|
|
48
|
-
deepseek: {
|
|
49
|
-
name: "DeepSeek",
|
|
50
|
-
defaultBaseUrl: "https://api.deepseek.com/v1",
|
|
51
|
-
defaultModel: "deepseek-chat",
|
|
52
|
-
requiresApiKey: true,
|
|
53
|
-
},
|
|
54
|
-
dashscope: {
|
|
55
|
-
name: "DashScope (阿里通义)",
|
|
56
|
-
defaultBaseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
57
|
-
defaultModel: "qwen-max",
|
|
58
|
-
requiresApiKey: true,
|
|
59
|
-
},
|
|
60
|
-
gemini: {
|
|
61
|
-
name: "Google Gemini",
|
|
62
|
-
defaultBaseUrl: "https://generativelanguage.googleapis.com/v1beta",
|
|
63
|
-
defaultModel: "gemini-2.0-flash",
|
|
64
|
-
requiresApiKey: true,
|
|
65
|
-
},
|
|
66
|
-
kimi: {
|
|
67
|
-
name: "Kimi (月之暗面)",
|
|
68
|
-
defaultBaseUrl: "https://api.moonshot.cn/v1",
|
|
69
|
-
defaultModel: "moonshot-v1-auto",
|
|
70
|
-
requiresApiKey: true,
|
|
71
|
-
},
|
|
72
|
-
minimax: {
|
|
73
|
-
name: "MiniMax (海螺AI)",
|
|
74
|
-
defaultBaseUrl: "https://api.minimax.chat/v1",
|
|
75
|
-
defaultModel: "MiniMax-Text-01",
|
|
76
|
-
requiresApiKey: true,
|
|
77
|
-
},
|
|
78
|
-
mistral: {
|
|
79
|
-
name: "Mistral AI",
|
|
80
|
-
defaultBaseUrl: "https://api.mistral.ai/v1",
|
|
81
|
-
defaultModel: "mistral-large-latest",
|
|
82
|
-
requiresApiKey: true,
|
|
83
|
-
},
|
|
84
|
-
ollama: {
|
|
85
|
-
name: "Ollama (本地部署)",
|
|
86
|
-
defaultBaseUrl: "http://localhost:11434",
|
|
87
|
-
defaultModel: "qwen2:7b",
|
|
88
|
-
requiresApiKey: false,
|
|
89
|
-
},
|
|
90
|
-
"openai-proxy": {
|
|
91
|
-
name: "OpenAI 中转站 (API2D/CloseAI等)",
|
|
92
|
-
defaultBaseUrl: "",
|
|
93
|
-
defaultModel: "gpt-4o",
|
|
94
|
-
requiresApiKey: true,
|
|
95
|
-
isProxy: true,
|
|
96
|
-
},
|
|
97
|
-
"anthropic-proxy": {
|
|
98
|
-
name: "Anthropic 中转站 (Claude代理)",
|
|
99
|
-
defaultBaseUrl: "",
|
|
100
|
-
defaultModel: "claude-sonnet-4-6",
|
|
101
|
-
requiresApiKey: true,
|
|
102
|
-
isProxy: true,
|
|
103
|
-
},
|
|
104
|
-
"gemini-proxy": {
|
|
105
|
-
name: "Gemini 中转站 (Google代理)",
|
|
106
|
-
defaultBaseUrl: "",
|
|
107
|
-
defaultModel: "gemini-2.0-flash",
|
|
108
|
-
requiresApiKey: true,
|
|
109
|
-
isProxy: true,
|
|
110
|
-
},
|
|
111
|
-
custom: {
|
|
112
|
-
name: "自定义 Provider (自建服务/vLLM/TGI等)",
|
|
113
|
-
defaultBaseUrl: "",
|
|
114
|
-
defaultModel: "",
|
|
115
|
-
requiresApiKey: true,
|
|
116
|
-
},
|
|
117
|
-
};
|
|
29
|
+
// New-connection suggestions are shared with both IDEs. Runtime fallbacks and
|
|
30
|
+
// existing persisted models are deliberately independent of this catalog.
|
|
31
|
+
const onboardingCatalog = require("./lib/llm-onboarding-catalog.json");
|
|
32
|
+
export const LLM_PROVIDERS = Object.fromEntries(
|
|
33
|
+
onboardingCatalog.providers.map((preset) => [
|
|
34
|
+
preset.id,
|
|
35
|
+
{
|
|
36
|
+
name: preset.cliLabel || preset.label,
|
|
37
|
+
defaultBaseUrl: preset.baseUrl,
|
|
38
|
+
defaultModel: preset.defaultModel,
|
|
39
|
+
requiresApiKey: preset.needsKey,
|
|
40
|
+
...(preset.isProxy ? { isProxy: true } : {}),
|
|
41
|
+
},
|
|
42
|
+
]),
|
|
43
|
+
);
|
|
118
44
|
|
|
119
45
|
export const EDITIONS = {
|
|
120
46
|
personal: {
|
|
@@ -136,6 +62,9 @@ export const DEFAULT_CONFIG = {
|
|
|
136
62
|
completedAt: null,
|
|
137
63
|
edition: "personal",
|
|
138
64
|
features: {},
|
|
65
|
+
evolution: {
|
|
66
|
+
enabled: false,
|
|
67
|
+
},
|
|
139
68
|
paths: {
|
|
140
69
|
projectRoot: null,
|
|
141
70
|
database: null,
|