@seanhogg/builderforce-agents 2026.9.5 → 2026.9.6
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/dist/{agent-CBRDuLO-.js → agent-59_cdTZl.js} +1 -1
- package/dist/{agent-CCY1r5YW.js → agent-CvMM49lm.js} +1 -1
- package/dist/{agents-DW3hte-y.js → agents-2d7A-Uwz.js} +1 -1
- package/dist/{agents-Ce4bN10e.js → agents-BdOgv61S.js} +1 -1
- package/dist/{audio-preflight-BvzGdNYy.js → audio-preflight-CmX2XJ3N.js} +1 -1
- package/dist/{audio-preflight-BYMboYmW.js → audio-preflight-Dnw3oDJr.js} +1 -1
- package/dist/{audio-preflight-CEOxJosQ.js → audio-preflight-HcRdB0oH.js} +1 -1
- package/dist/{audio-preflight-CswNxppe.js → audio-preflight-Sh649dxR.js} +1 -1
- package/dist/{auth-choice-DSLN0TLU.js → auth-choice-D06_TWBf.js} +1 -1
- package/dist/{auth-choice-BTrUlYmE.js → auth-choice-DyxxR025.js} +1 -1
- package/dist/{auth-choice.apply-BZ7E08Yb.js → auth-choice.apply-CUuLdlQd.js} +1 -1
- package/dist/{auth-choice.apply-D3EY1pZ3.js → auth-choice.apply-CfFhu_Vk.js} +1 -1
- package/dist/{auth-choice.apply-5dpCNO0l.js → auth-choice.apply-D57XA_d9.js} +1 -1
- package/dist/{auth-choice.apply-3tPFL-eH.js → auth-choice.apply-s_rOXFVz.js} +1 -1
- package/dist/{auth-choice.apply.transformers-B_Q6e8Yk.js → auth-choice.apply.transformers-CqQSUnsx.js} +1 -1
- package/dist/{auth-choice.apply.transformers-D1EzC906.js → auth-choice.apply.transformers-DXBWOilg.js} +1 -1
- package/dist/{auth-choice.apply.transformers-BJbpyCWs.js → auth-choice.apply.transformers-DizfkAmz.js} +1 -1
- package/dist/{auth-choice.apply.transformers-vLzCo5ew.js → auth-choice.apply.transformers-vyvtAxcX.js} +1 -1
- package/dist/{banner-DVNoUX5I.js → banner-BXpp_pEd.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/{builderforce-Bs_G8kBN.js → builderforce-BdJAOfvE.js} +2 -2
- package/dist/{builderforce-BN_So1di.js → builderforce-BrFUSx35.js} +2 -2
- package/dist/{builderforce-directory-sync-BCZK4FYJ.js → builderforce-directory-sync-CFiQew6N.js} +1 -1
- package/dist/{builderforce-directory-sync-DHfiUf2g.js → builderforce-directory-sync-DIQQT09l.js} +1 -1
- package/dist/{builderforce-onboarding-Bbjz8F-r.js → builderforce-onboarding-CoGJY95Q.js} +1 -1
- package/dist/{builderforce-onboarding-8lL2bgtL.js → builderforce-onboarding-DyYM_cib.js} +1 -1
- package/dist/{builderforcellm-syscheck-CyZiwcdF.js → builderforcellm-syscheck-CfFrfeV2.js} +1 -1
- package/dist/{builderforcellm-syscheck-DMjMJNFI.js → builderforcellm-syscheck-DGZKIwPC.js} +1 -1
- package/dist/bundled/boot-md/handler.js +1 -1
- package/dist/bundled/session-memory/handler.js +1 -1
- package/dist/{channel-options-Zk5QnNPR.js → channel-options--DZ4jYy9.js} +1 -1
- package/dist/{channel-options-Cbz6vcgo.js → channel-options-xVK4amr4.js} +1 -1
- package/dist/{channel-web-1xD-Ad2T.js → channel-web-9vO41fn2.js} +1 -1
- package/dist/{channels-cli-CiVlP8_q.js → channels-cli-Ch1sZ58k.js} +1 -1
- package/dist/{channels-cli-BOcpgY_W.js → channels-cli-YMSOJUmp.js} +1 -1
- package/dist/chrome-Bi-3xZj-.js +4 -0
- package/dist/chrome-C6oWWmHX.js +4 -0
- package/dist/{cli-6znoaKr2.js → cli-gsxv7DrZ.js} +1 -1
- package/dist/{cli-BPwpRE1j.js → cli-zC5qoRAp.js} +1 -1
- package/dist/{command-registry-BTxAGdlS.js → command-registry-BXLjR3kb.js} +1 -1
- package/dist/{command-registry-BZINHmI9.js → command-registry-I83E6HLw.js} +1 -1
- package/dist/{completion-cli-BwCfUaHz.js → completion-cli-BQCxFDqY.js} +1 -1
- package/dist/{completion-cli-vR4Sx9zB.js → completion-cli-CDy8f_Fg.js} +1 -1
- package/dist/{completion-cli-C8kMJ401.js → completion-cli-DbIxXK1B.js} +1 -1
- package/dist/{completion-cli-D8WkqtSU.js → completion-cli-ydxyAE7J.js} +1 -1
- package/dist/{config-cli-BYFA4Nin.js → config-cli-5ZSrACPR.js} +1 -1
- package/dist/{config-cli-DVpEv0oj.js → config-cli-BvJso6op.js} +1 -1
- package/dist/{configure-COeSbyyP.js → configure-1e4C38zp.js} +1 -1
- package/dist/{configure-CW2bJ91q.js → configure-B_oI_bg-.js} +1 -1
- package/dist/{configure-B_juJzVi.js → configure-Dp71zeJI.js} +1 -1
- package/dist/{configure-CgkUUUpM.js → configure-NxmuXXEd.js} +1 -1
- package/dist/{deliver-qM1Zkf4i.js → deliver-C6HTqnzY.js} +1 -1
- package/dist/{deliver-BNMupwo6.js → deliver-CdwCHH01.js} +1 -1
- package/dist/{deliver-Bs-FVPQ4.js → deliver-DFhj1d_t.js} +1 -1
- package/dist/{deliver-C5lVQcrs.js → deliver-XGIFv80r.js} +1 -1
- package/dist/{deps-DWFMK9Xg.js → deps-C4YVdrEi.js} +1 -1
- package/dist/{doctor-completion-s5vcMc-C.js → doctor-completion-DhIR9uqB.js} +1 -1
- package/dist/{doctor-completion-BdMxCat-.js → doctor-completion-Dpy-8HV9.js} +1 -1
- package/dist/{embedded-CRoX1qTh.js → embedded-Cw4g0mzl.js} +7 -7
- package/dist/{embedded-DpSS2q2a.js → embedded-DG3sEMyg.js} +7 -7
- package/dist/{embedded-helpers-BrfnCpCe.js → embedded-helpers-3FEGD_4b.js} +1 -1
- package/dist/{embedded-helpers-Q5h1lA6D.js → embedded-helpers-DGDYymYx.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +1 -1
- package/dist/{gateway-cli-oSSOT67p.js → gateway-cli-BBu6KI7r.js} +4 -4
- package/dist/{gateway-cli-DzxNTkvL.js → gateway-cli-CSmbpS6n.js} +4 -4
- package/dist/{health-_L8Avf4v.js → health-AOM42u9C.js} +1 -1
- package/dist/{health-hXlukqbf.js → health-CRIXA8je.js} +1 -1
- package/dist/{health-B_qWRpsT.js → health-Cuh0tZl2.js} +1 -1
- package/dist/{hooks-cli-C-vbyL2y.js → hooks-cli-BeqvyPiX.js} +1 -1
- package/dist/{hooks-cli-7gBXRQ81.js → hooks-cli-CYI9ZvNI.js} +1 -1
- package/dist/index.js +2 -2
- package/dist/{ink-session-DpO3VOYc.js → ink-session-MNcfJzij.js} +1 -1
- package/dist/{ink-session-CZj35xTR.js → ink-session-VqYNJYzq.js} +1 -1
- package/dist/llm-slug-generator.js +1 -1
- package/dist/{mamba-state-engine-CFwb8DcP.js → mamba-state-engine-BYmUnYwn.js} +1 -1
- package/dist/{mamba-state-engine-Ck2JCfL6.js → mamba-state-engine-BloJzrxU.js} +1 -1
- package/dist/{models-PPv9KRbb.js → models-B6kkCBLd.js} +1 -1
- package/dist/{models-cli-btaamH96.js → models-cli-C7u8eLls.js} +1 -1
- package/dist/{models-cli-BUDSwmIY.js → models-cli-DpbpZwjy.js} +1 -1
- package/dist/{models-DMrs_Zsc.js → models-hEa3avo7.js} +1 -1
- package/dist/{onboard-4JByma4r.js → onboard-BHlI_UVY.js} +2 -2
- package/dist/{onboard-Dq_XQQXY.js → onboard-BW5J0Ym8.js} +2 -2
- package/dist/{onboard-channels-Dzyeem1L.js → onboard-channels-BkrhZ79I.js} +1 -1
- package/dist/{onboard-channels-D4g6xuSC.js → onboard-channels-DXIqdoto.js} +1 -1
- package/dist/{onboard-channels-Dir2EguP.js → onboard-channels-V51s9X-h.js} +1 -1
- package/dist/{onboard-channels-UZOCuxN7.js → onboard-channels-fyGQ1v4S.js} +1 -1
- package/dist/{onboard-interactive-DvNhkCNr.js → onboard-interactive-ClPMlCIl.js} +1 -1
- package/dist/{onboard-interactive-DyyEDd9a.js → onboard-interactive-D6IBBU8m.js} +1 -1
- package/dist/{onboard-interactive-CwNfYxGe.js → onboard-interactive-DEeqmoeW.js} +1 -1
- package/dist/{onboard-interactive-Co2bcd7g.js → onboard-interactive-DSZak3YX.js} +1 -1
- package/dist/{onboarding-DBL-H1Qu.js → onboarding-CYOfGpd5.js} +3 -3
- package/dist/{onboarding-CIxLpuFP.js → onboarding-DIxm_q7P.js} +3 -3
- package/dist/{onboarding.finalize-CGGbkAOL.js → onboarding.finalize-Co5L0rNp.js} +1 -1
- package/dist/{onboarding.finalize-R3TfibWY.js → onboarding.finalize-DAwpQa7n.js} +1 -1
- package/dist/{outbound-send-deps-CsJgGsii.js → outbound-send-deps-Cys_MtmC.js} +1 -1
- package/dist/{plugin-registry-Ty9w94Rd.js → plugin-registry-BM1-sG-e.js} +1 -1
- package/dist/{plugin-registry-BkGhcUDV.js → plugin-registry-CAy3I1K1.js} +1 -1
- package/dist/{plugin-registry-BenvgIsJ.js → plugin-registry-DjmzOS3n.js} +1 -1
- package/dist/{plugin-registry-DZirturB.js → plugin-registry-l2iN7_1l.js} +1 -1
- package/dist/plugin-sdk/agent-runtime/src/builderforce/ports.d.ts +1 -1
- package/dist/plugin-sdk/agent-runtime/src/infra/limbic-system-service.d.ts +2 -3
- package/dist/plugin-sdk/{audio-preflight-lhP946UF.js → audio-preflight-BbtfbLzo.js} +1 -1
- package/dist/plugin-sdk/{channel-web-CzXHQXgb.js → channel-web-BHose9yJ.js} +1 -1
- package/dist/plugin-sdk/index.js +1 -1
- package/dist/plugin-sdk/packages/agent-tools/src/index.d.ts +0 -1
- package/dist/plugin-sdk/packages/agent-tools/src/psychometric-dims.d.ts +2 -2
- package/dist/plugin-sdk/packages/agent-tools/src/psychometrics.d.ts +38 -5
- package/dist/plugin-sdk/packages/agent-tools/src/spec.d.ts +3 -1
- package/dist/plugin-sdk/{reply-DkmZ32IH.js → reply-V98uAjNN.js} +5 -5
- package/dist/plugin-sdk/{runner-DeqVi2ay.js → runner-BpFNG45j.js} +1 -1
- package/dist/plugin-sdk/{src-yVjde9hC.js → src-pvdIxmTY.js} +2 -2
- package/dist/plugin-sdk/{tool-loop-detection-AO2R09bJ.js → tool-loop-detection-Bjiit8CZ.js} +1 -1
- package/dist/plugin-sdk/{web-D-h3WpSq.js → web-Bq6nGRsB.js} +1 -1
- package/dist/{plugins-r-hGfiMK.js → plugins-BbovMu2g.js} +1 -1
- package/dist/{plugins-ChYVZuHy.js → plugins-DrkC1ANW.js} +1 -1
- package/dist/{plugins-cli-CKQ2X7tA.js → plugins-cli-CqtTn-Gv.js} +1 -1
- package/dist/{plugins-cli-CB7e9eCK.js → plugins-cli-DWlQnRpV.js} +1 -1
- package/dist/{program-D71K23KC.js → program-DOGUG9Uz.js} +2 -2
- package/dist/{program-context-B9V62ZJg.js → program-context-DBtTOKkf.js} +1 -1
- package/dist/{project-context-Cnqfr64Z.js → project-context-C5KLsMTc.js} +1 -1
- package/dist/{project-context-DXP12xhk.js → project-context-Cg0S9eFT.js} +1 -1
- package/dist/project-context-DbBD_r4v.js +1 -0
- package/dist/project-context-nIzFswHk.js +1 -0
- package/dist/project-context-store-B96x1Lfk.js +1 -0
- package/dist/{project-context-store-C8TROXjr.js → project-context-store-BS994lZX.js} +1 -1
- package/dist/{project-context-store-ClFt-YDL.js → project-context-store-BSIWJD6S.js} +1 -1
- package/dist/project-context-store-BzX1YdMP.js +1 -0
- package/dist/{prompt-select-styled-Cect8vJu.js → prompt-select-styled-2q_0LOx1.js} +1 -1
- package/dist/{prompt-select-styled-CJBJZiX_.js → prompt-select-styled-D31D9EIl.js} +1 -1
- package/dist/{provider-auth-helpers-DItSj71N.js → provider-auth-helpers-9Ut-MHV9.js} +1 -1
- package/dist/{provider-auth-helpers-ByvJdQT3.js → provider-auth-helpers-u1GAP4Bi.js} +1 -1
- package/dist/{provider-dispatcher-E-RjX6WG.js → provider-dispatcher-4KsB_bCw.js} +1 -1
- package/dist/{provider-dispatcher-D6-kUWf8.js → provider-dispatcher-CG7kSp65.js} +1 -1
- package/dist/{push-apns-B6YfFR5s.js → push-apns-CEzi4ars.js} +1 -1
- package/dist/{push-apns-n8P3oclR.js → push-apns-oUAHr48A.js} +1 -1
- package/dist/{pw-ai-BpY-eMJT.js → pw-ai-CfV_5FWo.js} +1 -1
- package/dist/{pw-ai-Bu1w-1rC.js → pw-ai-Dx8XRyPq.js} +1 -1
- package/dist/{register.agent-CAsV5dRf.js → register.agent-C84ud-cS.js} +1 -1
- package/dist/{register.agent-DQ4zQymV.js → register.agent-Db9SzkZg.js} +1 -1
- package/dist/{register.configure-HcPL-Na2.js → register.configure-BfPiEcFk.js} +1 -1
- package/dist/{register.configure-B-xRsB-s.js → register.configure-WYMz_fwM.js} +1 -1
- package/dist/{register.connect-BcZeAJ1s.js → register.connect-CMN7lqC5.js} +1 -1
- package/dist/{register.connect-ChZQOiYF.js → register.connect-Dqhd81kK.js} +1 -1
- package/dist/{register.maintenance-C-7Arpam.js → register.maintenance-BpQE-3eC.js} +1 -1
- package/dist/{register.maintenance-Jdfg2LKA.js → register.maintenance-DjKxt-jl.js} +1 -1
- package/dist/{register.message-D1IU3K0a.js → register.message-C4Gf388m.js} +1 -1
- package/dist/{register.message-C3cFBIXY.js → register.message-D5A7-_wN.js} +1 -1
- package/dist/{register.onboard-DJ2QNnOi.js → register.onboard-BF5tXr7K.js} +1 -1
- package/dist/{register.onboard-DjrhC3jh.js → register.onboard-BO_OtYg9.js} +1 -1
- package/dist/{register.setup-BNUqkiVa.js → register.setup-BzDbYjEw.js} +1 -1
- package/dist/{register.setup-C8XgG5Zt.js → register.setup-CaWt1bhf.js} +1 -1
- package/dist/{register.status-health-sessions-DcqlqAhs.js → register.status-health-sessions-BbYzFw1X.js} +1 -1
- package/dist/{register.status-health-sessions-CBTZZ0Rh.js → register.status-health-sessions-CDD6Eoxf.js} +1 -1
- package/dist/{register.subclis-CqVl0uO4.js → register.subclis-Cfb5FUTI.js} +1 -1
- package/dist/{register.subclis-Meewq2dj.js → register.subclis-yYbEKj9a.js} +1 -1
- package/dist/{reply-BsRbeUhd.js → reply-CpGH-3If.js} +8 -8
- package/dist/{run-main-CFVoPcgN.js → run-main-B82VAQTQ.js} +1 -1
- package/dist/{runner-68-X3KHf.js → runner-BLCTET8O.js} +2 -2
- package/dist/{runner-CfNJMPWu.js → runner-C651oVfk.js} +2 -2
- package/dist/{runner-BgUG2-RV.js → runner-DCn9sBTn.js} +3 -3
- package/dist/{runner-BKHYCYMH.js → runner-xF3_-mDL.js} +3 -3
- package/dist/{server-node-events-DusCxrVm.js → server-node-events-Bam08x5E.js} +1 -1
- package/dist/{server-node-events-BahizW3Z.js → server-node-events-kbTUUaAA.js} +1 -1
- package/dist/{session-dirs-RIA98OsG.js → session-dirs-BBGuanHN.js} +1 -1
- package/dist/{session-dirs-Cutn9srI.js → session-dirs-DV-c-o7M.js} +1 -1
- package/dist/{src-BRo9ywDM.js → src-BM8G-tIl.js} +3 -3
- package/dist/{src-DxNC0IHE.js → src-D2-7sOAX.js} +3 -3
- package/dist/{src-NJhXretA.js → src-D5vOHX9i.js} +2 -2
- package/dist/{src-Enbbh3hH.js → src-Dptpvd0V.js} +2 -2
- package/dist/{status-DPza6sZ1.js → status-BcT4AI8l.js} +1 -1
- package/dist/{status-CMdPdaSM.js → status-C9D1ex2G.js} +1 -1
- package/dist/{status-CFDh5snF.js → status-D_YsiWpP.js} +1 -1
- package/dist/{status-SyaizSN6.js → status-V8zvPBOv.js} +1 -1
- package/dist/{status-C1toWVvJ.js → status-i_sJ6Ikx.js} +1 -1
- package/dist/{subagent-registry-oB_F2U2W.js → subagent-registry-BUKplZi1.js} +8 -8
- package/dist/{subagent-registry-DFzwOGge.js → subagent-registry-BgUoQjBB.js} +1 -1
- package/dist/{subagent-registry-C1opJIrJ.js → subagent-registry-DrrF3JoH.js} +1 -1
- package/dist/{tool-loop-detection-DxqiqYam.js → tool-loop-detection-Bv0aRyd6.js} +1 -1
- package/dist/{tool-loop-detection-3W6bLEza.js → tool-loop-detection-CgUkrbCZ.js} +1 -1
- package/dist/{tool-loop-detection-C3z1wqgV.js → tool-loop-detection-CshVZIOE.js} +1 -1
- package/dist/{tool-loop-detection-DNM8YCNW.js → tool-loop-detection-bpZ-S3A1.js} +1 -1
- package/dist/{tui-Dy1FnApe.js → tui-CdYI5f3k.js} +2 -2
- package/dist/{tui-lng2vIp3.js → tui-DgBGTw2s.js} +2 -2
- package/dist/{tui-cli-BTFEL897.js → tui-cli-BNeRzoEe.js} +1 -1
- package/dist/{tui-cli-D-cDh9DV.js → tui-cli-BZ--mp9s.js} +1 -1
- package/dist/{tui-stream-assembler-B_AQD4Kg.js → tui-stream-assembler-BNJE9PoS.js} +1 -1
- package/dist/{tui-stream-assembler-Bn1WXUGG.js → tui-stream-assembler-xFcJqFJ9.js} +1 -1
- package/dist/{update-cli-BdT4-P_D.js → update-cli-BATUCF7p.js} +1 -1
- package/dist/{update-cli-DMMSWPXh.js → update-cli-BRBoX_97.js} +1 -1
- package/dist/{web-BiSkmACr.js → web-BdYyXjsX.js} +1 -1
- package/dist/{web-CXrAweDC.js → web-C5hfXVCy.js} +1 -1
- package/dist/{web-BS6WUf7c.js → web-CsWqmV_E.js} +1 -1
- package/dist/{web-CfYUd-lX.js → web-fg3nA4Qq.js} +1 -1
- package/dist/{workflow-cli-Du4IfE1A.js → workflow-cli-D-o_-jfU.js} +1 -1
- package/dist/{workflow-cli-BuEKJ4ut.js → workflow-cli-DDWSXyi0.js} +1 -1
- package/package.json +6 -5
- package/dist/chrome-C6fODzE5.js +0 -4
- package/dist/chrome-Cm-kVyuA.js +0 -4
- package/dist/plugin-sdk/agent-runtime/src/builderforce/limbic.d.ts +0 -14
- package/dist/plugin-sdk/packages/agent-tools/src/limbic.d.ts +0 -104
- package/dist/project-context-DS52UwJZ.js +0 -1
- package/dist/project-context-PiiAmwVd.js +0 -1
- package/dist/project-context-store-B2GYSwld.js +0 -1
- package/dist/project-context-store-DNx9ScQ_.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as resolveAgentWorkspaceDir,i as resolveAgentDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{Ct as CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF,Et as resolveAuthProfileOrder,Ft as generateChutesPkce,Gt as ensureAuthProfileStore,It as parseOAuthCallbackInput,Lt as loginOpenAICodex,M as resolveOllamaApiBase,Nt as CHUTES_AUTHORIZE_ENDPOINT,P as VENICE_DEFAULT_MODEL_REF,Pt as exchangeChutesCodeForTokens,St as isHuggingfacePolicyLocked,Ut as upsertAuthProfile,V as SYNTHETIC_DEFAULT_MODEL_REF,Wt as upsertAuthProfileWithLock,Xt as resolveBuilderForceAgentsAgentDir,ct as resolveEnvApiKey,xt as discoverHuggingfaceModels}from"./model-selection-DX_WOc2P.js";import{t as normalizeBaseUrl$1}from"./normalize-base-url-Dz6Za7Ks.js";import{a as upsertSharedEnvVar}from"./env-file-BI2jpOmF.js";import{r as isLoopbackHost}from"./ws-Dunpda4N.js";import{d as openUrl}from"./onboard-helpers-CPmBeDvt.js";import{t as enablePluginInConfig}from"./enable-fuhbpGov.js";import{C as setXaiApiKey,D as KIMI_CODING_MODEL_REF,E as writeOAuthCredentials,F as QIANFAN_DEFAULT_MODEL_REF,P as MOONSHOT_DEFAULT_MODEL_REF,R as XAI_DEFAULT_MODEL_REF,S as setVercelAiGatewayApiKey,T as setZaiApiKey,_ as setOpenrouterApiKey,a as VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF,b as setTogetherApiKey,c as setAnthropicApiKey,d as setHuggingfaceApiKey,f as setKimiCodingApiKey,g as setOpencodeZenApiKey,h as setMoonshotApiKey,i as TOGETHER_DEFAULT_MODEL_REF,l as setCloudflareAiGatewayConfig,m as setMinimaxApiKey,n as LITELLM_DEFAULT_MODEL_REF,o as XIAOMI_DEFAULT_MODEL_REF,p as setLitellmApiKey,r as OPENROUTER_DEFAULT_MODEL_REF,s as ZAI_DEFAULT_MODEL_REF,t as HUGGINGFACE_DEFAULT_MODEL_REF,u as setGeminiApiKey,v as setQianfanApiKey,w as setXiaomiApiKey,x as setVeniceApiKey,y as setSyntheticApiKey}from"./onboard-auth.credentials-YrdiGOgn.js";import{A as applyXaiConfig,B as applyVercelAiGatewayConfig,C as applyQianfanProviderConfig,D as applyTogetherProviderConfig,E as applyTogetherConfig,F as applyZaiProviderConfig,H as applyAgentDefaultModelPrimary,I as applyLitellmConfig,L as applyLitellmProviderConfig,M as applyXiaomiConfig,N as applyXiaomiProviderConfig,O as applyVeniceConfig,P as applyZaiConfig,R as applyCloudflareAiGatewayConfig,S as applyQianfanConfig,T as applySyntheticProviderConfig,V as applyVercelAiGatewayProviderConfig,_ as applyMoonshotConfigCn,a as applyMinimaxApiConfig,b as applyOpenrouterConfig,c as applyMinimaxApiProviderConfigCn,d as applyAuthProfileConfig,g as applyMoonshotConfig,h as applyKimiCodeProviderConfig,i as applyOpencodeZenProviderConfig,j as applyXaiProviderConfig,k as applyVeniceProviderConfig,l as applyMinimaxConfig,m as applyKimiCodeConfig,n as validateAnthropicSetupToken,o as applyMinimaxApiConfigCn,p as applyHuggingfaceProviderConfig,r as applyOpencodeZenConfig,s as applyMinimaxApiProviderConfig,t as buildTokenProfileId,u as applyMinimaxProviderConfig,v as applyMoonshotProviderConfig,w as applySyntheticConfig,x as applyOpenrouterProviderConfig,y as applyMoonshotProviderConfigCn,z as applyCloudflareAiGatewayProviderConfig}from"./auth-token-CWT7TW8z.js";import{a as createVpsAwareOAuthHandlers,c as githubCopilotLoginCommand,i as resolveProviderMatch,n as mergeConfigPatch,o as isRemoteEnvironment,r as pickAuthMethod,s as resolvePluginProviders,t as applyDefaultModel}from"./provider-auth-helpers-
|
|
1
|
+
import{c as resolveAgentWorkspaceDir,i as resolveAgentDir,k as resolveDefaultAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{Ct as CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF,Et as resolveAuthProfileOrder,Ft as generateChutesPkce,Gt as ensureAuthProfileStore,It as parseOAuthCallbackInput,Lt as loginOpenAICodex,M as resolveOllamaApiBase,Nt as CHUTES_AUTHORIZE_ENDPOINT,P as VENICE_DEFAULT_MODEL_REF,Pt as exchangeChutesCodeForTokens,St as isHuggingfacePolicyLocked,Ut as upsertAuthProfile,V as SYNTHETIC_DEFAULT_MODEL_REF,Wt as upsertAuthProfileWithLock,Xt as resolveBuilderForceAgentsAgentDir,ct as resolveEnvApiKey,xt as discoverHuggingfaceModels}from"./model-selection-DX_WOc2P.js";import{t as normalizeBaseUrl$1}from"./normalize-base-url-Dz6Za7Ks.js";import{a as upsertSharedEnvVar}from"./env-file-BI2jpOmF.js";import{r as isLoopbackHost}from"./ws-Dunpda4N.js";import{d as openUrl}from"./onboard-helpers-CPmBeDvt.js";import{t as enablePluginInConfig}from"./enable-fuhbpGov.js";import{C as setXaiApiKey,D as KIMI_CODING_MODEL_REF,E as writeOAuthCredentials,F as QIANFAN_DEFAULT_MODEL_REF,P as MOONSHOT_DEFAULT_MODEL_REF,R as XAI_DEFAULT_MODEL_REF,S as setVercelAiGatewayApiKey,T as setZaiApiKey,_ as setOpenrouterApiKey,a as VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF,b as setTogetherApiKey,c as setAnthropicApiKey,d as setHuggingfaceApiKey,f as setKimiCodingApiKey,g as setOpencodeZenApiKey,h as setMoonshotApiKey,i as TOGETHER_DEFAULT_MODEL_REF,l as setCloudflareAiGatewayConfig,m as setMinimaxApiKey,n as LITELLM_DEFAULT_MODEL_REF,o as XIAOMI_DEFAULT_MODEL_REF,p as setLitellmApiKey,r as OPENROUTER_DEFAULT_MODEL_REF,s as ZAI_DEFAULT_MODEL_REF,t as HUGGINGFACE_DEFAULT_MODEL_REF,u as setGeminiApiKey,v as setQianfanApiKey,w as setXiaomiApiKey,x as setVeniceApiKey,y as setSyntheticApiKey}from"./onboard-auth.credentials-YrdiGOgn.js";import{A as applyXaiConfig,B as applyVercelAiGatewayConfig,C as applyQianfanProviderConfig,D as applyTogetherProviderConfig,E as applyTogetherConfig,F as applyZaiProviderConfig,H as applyAgentDefaultModelPrimary,I as applyLitellmConfig,L as applyLitellmProviderConfig,M as applyXiaomiConfig,N as applyXiaomiProviderConfig,O as applyVeniceConfig,P as applyZaiConfig,R as applyCloudflareAiGatewayConfig,S as applyQianfanConfig,T as applySyntheticProviderConfig,V as applyVercelAiGatewayProviderConfig,_ as applyMoonshotConfigCn,a as applyMinimaxApiConfig,b as applyOpenrouterConfig,c as applyMinimaxApiProviderConfigCn,d as applyAuthProfileConfig,g as applyMoonshotConfig,h as applyKimiCodeProviderConfig,i as applyOpencodeZenProviderConfig,j as applyXaiProviderConfig,k as applyVeniceProviderConfig,l as applyMinimaxConfig,m as applyKimiCodeConfig,n as validateAnthropicSetupToken,o as applyMinimaxApiConfigCn,p as applyHuggingfaceProviderConfig,r as applyOpencodeZenConfig,s as applyMinimaxApiProviderConfig,t as buildTokenProfileId,u as applyMinimaxProviderConfig,v as applyMoonshotProviderConfig,w as applySyntheticConfig,x as applyOpenrouterProviderConfig,y as applyMoonshotProviderConfigCn,z as applyCloudflareAiGatewayProviderConfig}from"./auth-token-CWT7TW8z.js";import{a as createVpsAwareOAuthHandlers,c as githubCopilotLoginCommand,i as resolveProviderMatch,n as mergeConfigPatch,o as isRemoteEnvironment,r as pickAuthMethod,s as resolvePluginProviders,t as applyDefaultModel}from"./provider-auth-helpers-9Ut-MHV9.js";import{a as GOOGLE_GEMINI_DEFAULT_MODEL,i as detectZaiEndpoint,n as applyOpenAIConfig,o as applyGoogleGeminiModelDefault,r as applyOpenAIProviderConfig,s as ensureModelAllowlistEntry,t as OPENAI_DEFAULT_MODEL}from"./openai-model-default-DR3m7RLi.js";import{c as applyOpenAICodexModelDefault,o as promptAndConfigureVllm,r as applyPrimaryModel,s as OPENAI_CODEX_DEFAULT_MODEL}from"./model-picker-CjrWGzFG.js";import{s as applyAuthChoiceTransformers}from"./auth-choice.apply.transformers-DXBWOilg.js";import{randomBytes}from"node:crypto";import{createServer}from"node:http";const DEFAULT_KEY_PREVIEW={head:4,tail:4};function normalizeApiKeyInput(raw){let trimmed=String(raw??``).trim();if(!trimmed)return``;let assignmentMatch=trimmed.match(/^(?:export\s+)?[A-Za-z_][A-Za-z0-9_]*\s*=\s*(.+)$/),valuePart=assignmentMatch?assignmentMatch[1].trim():trimmed,unquoted=valuePart.length>=2&&(valuePart.startsWith(`"`)&&valuePart.endsWith(`"`)||valuePart.startsWith(`'`)&&valuePart.endsWith(`'`)||valuePart.startsWith("`")&&valuePart.endsWith("`"))?valuePart.slice(1,-1):valuePart;return(unquoted.endsWith(`;`)?unquoted.slice(0,-1):unquoted).trim()}const validateApiKeyInput=value=>normalizeApiKeyInput(value).length>0?void 0:`Required`;function formatApiKeyPreview(raw,opts={}){let trimmed=raw.trim();if(!trimmed)return`…`;let head=opts.head??DEFAULT_KEY_PREVIEW.head,tail=opts.tail??DEFAULT_KEY_PREVIEW.tail;if(trimmed.length<=head+tail){let shortHead=Math.min(2,trimmed.length),shortTail=Math.min(2,trimmed.length-shortHead);return shortTail<=0?`${trimmed.slice(0,shortHead)}…`:`${trimmed.slice(0,shortHead)}…${trimmed.slice(-shortTail)}`}return`${trimmed.slice(0,head)}…${trimmed.slice(-tail)}`}const DEFAULT_ANTHROPIC_MODEL=`anthropic/claude-sonnet-4-6`;async function applyAuthChoiceAnthropic(params){if(params.authChoice===`setup-token`||params.authChoice===`oauth`||params.authChoice===`token`){let nextConfig=params.config;await params.prompter.note(["Run `claude setup-token` in your terminal.",`Then paste the generated token below.`].join(`
|
|
2
2
|
`),`Anthropic setup-token`);let tokenRaw=await params.prompter.text({message:`Paste Anthropic setup-token`,validate:value=>validateAnthropicSetupToken(String(value??``))}),token=String(tokenRaw??``).trim(),profileNameRaw=await params.prompter.text({message:`Token name (blank = default)`,placeholder:`default`}),provider=`anthropic`,namedProfileId=buildTokenProfileId({provider,name:String(profileNameRaw??``)});return upsertAuthProfile({profileId:namedProfileId,agentDir:params.agentDir,credential:{type:`token`,provider,token}}),nextConfig=applyAuthProfileConfig(nextConfig,{profileId:namedProfileId,provider,mode:`token`}),params.setDefaultModel&&(nextConfig=applyAgentDefaultModelPrimary(nextConfig,DEFAULT_ANTHROPIC_MODEL)),{config:nextConfig}}if(params.authChoice===`apiKey`){if(params.opts?.tokenProvider&¶ms.opts.tokenProvider!==`anthropic`)return null;let nextConfig=params.config,hasCredential=!1,envKey=process.env.ANTHROPIC_API_KEY?.trim();if(params.opts?.token&&(await setAnthropicApiKey(normalizeApiKeyInput(params.opts.token),params.agentDir),hasCredential=!0),!hasCredential&&envKey&&await params.prompter.confirm({message:`Use existing ANTHROPIC_API_KEY (env, ${formatApiKeyPreview(envKey)})?`,initialValue:!0})&&(await setAnthropicApiKey(envKey,params.agentDir),hasCredential=!0),!hasCredential){let key=await params.prompter.text({message:`Enter Anthropic API key`,validate:validateApiKeyInput});await setAnthropicApiKey(normalizeApiKeyInput(String(key??``)),params.agentDir)}return nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`anthropic:default`,provider:`anthropic`,mode:`api_key`}),params.setDefaultModel&&(nextConfig=applyAgentDefaultModelPrimary(nextConfig,DEFAULT_ANTHROPIC_MODEL)),{config:nextConfig}}return null}function createAuthChoiceAgentModelNoter(params){return async model=>{params.agentId&&await params.prompter.note(`Default model set to ${model} for agent "${params.agentId}".`,`Model configured`)}}async function applyDefaultModelChoice(params){if(params.setDefaultModel){let next=params.applyDefaultConfig(params.config);return params.noteDefault&&await params.prompter.note(`Default model set to ${params.noteDefault}`,`Model configured`),{config:next}}let nextWithModel=ensureModelAllowlistEntry({cfg:params.applyProviderConfig(params.config),modelRef:params.defaultModel});return await params.noteAgentModel(params.defaultModel),{config:nextWithModel,agentModelOverride:params.defaultModel}}async function applyAuthChoiceHuggingface(params){if(params.authChoice!==`huggingface-api-key`)return null;let nextConfig=params.config,agentModelOverride,noteAgentModel=createAuthChoiceAgentModelNoter(params),hasCredential=!1,hfKey=``;if(!hasCredential&¶ms.opts?.token&¶ms.opts.tokenProvider===`huggingface`&&(hfKey=normalizeApiKeyInput(params.opts.token),await setHuggingfaceApiKey(hfKey,params.agentDir),hasCredential=!0),hasCredential||await params.prompter.note([`Hugging Face Inference Providers offer OpenAI-compatible chat completions.`,`Create a token at: https://huggingface.co/settings/tokens (fine-grained, 'Make calls to Inference Providers').`].join(`
|
|
3
3
|
`),`Hugging Face`),!hasCredential){let envKey=resolveEnvApiKey(`huggingface`);envKey&&await params.prompter.confirm({message:`Use existing Hugging Face token (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,initialValue:!0})&&(hfKey=envKey.apiKey,await setHuggingfaceApiKey(hfKey,params.agentDir),hasCredential=!0)}if(!hasCredential){let key=await params.prompter.text({message:`Enter Hugging Face API key (HF token)`,validate:validateApiKeyInput});hfKey=normalizeApiKeyInput(String(key??``)),await setHuggingfaceApiKey(hfKey,params.agentDir)}nextConfig=applyAuthProfileConfig(nextConfig,{profileId:`huggingface:default`,provider:`huggingface`,mode:`api_key`});let models=await discoverHuggingfaceModels(hfKey),options=[];for(let m of models){let baseRef=`huggingface/${m.id}`,label=m.name??m.id;options.push({value:baseRef,label}),options.push({value:`${baseRef}:cheapest`,label:`${label} (cheapest)`}),options.push({value:`${baseRef}:fastest`,label:`${label} (fastest)`})}let defaultRef=HUGGINGFACE_DEFAULT_MODEL_REF;options.sort((a,b)=>a.value===defaultRef?-1:b.value===defaultRef?1:a.label.localeCompare(b.label,void 0,{sensitivity:`base`}));let selectedModelRef=options.length===0?defaultRef:options.length===1?options[0].value:await params.prompter.select({message:`Default Hugging Face model`,options,initialValue:options.some(o=>o.value===defaultRef)?defaultRef:options[0].value});isHuggingfacePolicyLocked(selectedModelRef)&&await params.prompter.note(`Provider locked — router will choose backend by cost or speed.`,`Hugging Face`);let applied=await applyDefaultModelChoice({config:nextConfig,setDefaultModel:params.setDefaultModel,defaultModel:selectedModelRef,applyDefaultConfig:config=>{let withProvider=applyHuggingfaceProviderConfig(config),existingModel=withProvider.agents?.defaults?.model;return ensureModelAllowlistEntry({cfg:{...withProvider,agents:{...withProvider.agents,defaults:{...withProvider.agents?.defaults,model:{...existingModel&&typeof existingModel==`object`&&`fallbacks`in existingModel?{fallbacks:existingModel.fallbacks}:{},primary:selectedModelRef}}}},modelRef:selectedModelRef})},applyProviderConfig:applyHuggingfaceProviderConfig,noteDefault:selectedModelRef,noteAgentModel,prompter:params.prompter});return nextConfig=applied.config,agentModelOverride=applied.agentModelOverride??agentModelOverride,{config:nextConfig,agentModelOverride}}async function applyAuthChoiceOpenRouter(params){let nextConfig=params.config,agentModelOverride,noteAgentModel=createAuthChoiceAgentModelNoter(params),store=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),existingProfileId=resolveAuthProfileOrder({cfg:nextConfig,store,provider:`openrouter`}).find(profileId=>!!store.profiles[profileId]),existingCred=existingProfileId?store.profiles[existingProfileId]:void 0,profileId=`openrouter:default`,mode=`api_key`,hasCredential=!1;if(existingProfileId&&existingCred?.type&&(profileId=existingProfileId,mode=existingCred.type===`oauth`?`oauth`:existingCred.type===`token`?`token`:`api_key`,hasCredential=!0),!hasCredential&¶ms.opts?.token&¶ms.opts?.tokenProvider===`openrouter`&&(await setOpenrouterApiKey(normalizeApiKeyInput(params.opts.token),params.agentDir),hasCredential=!0),!hasCredential){let envKey=resolveEnvApiKey(`openrouter`);envKey&&await params.prompter.confirm({message:`Use existing OPENROUTER_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,initialValue:!0})&&(await setOpenrouterApiKey(envKey.apiKey,params.agentDir),hasCredential=!0)}if(!hasCredential){let key=await params.prompter.text({message:`Enter OpenRouter API key`,validate:validateApiKeyInput});await setOpenrouterApiKey(normalizeApiKeyInput(String(key??``)),params.agentDir),hasCredential=!0}hasCredential&&(nextConfig=applyAuthProfileConfig(nextConfig,{profileId,provider:`openrouter`,mode}));let applied=await applyDefaultModelChoice({config:nextConfig,setDefaultModel:params.setDefaultModel,defaultModel:OPENROUTER_DEFAULT_MODEL_REF,applyDefaultConfig:applyOpenrouterConfig,applyProviderConfig:applyOpenrouterProviderConfig,noteDefault:OPENROUTER_DEFAULT_MODEL_REF,noteAgentModel,prompter:params.prompter});return nextConfig=applied.config,agentModelOverride=applied.agentModelOverride??agentModelOverride,{config:nextConfig,agentModelOverride}}const OPENCODE_ZEN_DEFAULT_MODEL=`opencode/claude-opus-4-6`;async function applyAuthChoiceApiProviders(params){let nextConfig=params.config,agentModelOverride,noteAgentModel=createAuthChoiceAgentModelNoter(params),authChoice=params.authChoice;authChoice===`apiKey`&¶ms.opts?.tokenProvider&¶ms.opts.tokenProvider!==`anthropic`&¶ms.opts.tokenProvider!==`openai`&&(params.opts.tokenProvider===`openrouter`?authChoice=`openrouter-api-key`:params.opts.tokenProvider===`litellm`?authChoice=`litellm-api-key`:params.opts.tokenProvider===`vercel-ai-gateway`?authChoice=`ai-gateway-api-key`:params.opts.tokenProvider===`cloudflare-ai-gateway`?authChoice=`cloudflare-ai-gateway-api-key`:params.opts.tokenProvider===`moonshot`?authChoice=`moonshot-api-key`:params.opts.tokenProvider===`kimi-code`||params.opts.tokenProvider===`kimi-coding`?authChoice=`kimi-code-api-key`:params.opts.tokenProvider===`google`?authChoice=`gemini-api-key`:params.opts.tokenProvider===`zai`?authChoice=`zai-api-key`:params.opts.tokenProvider===`xiaomi`?authChoice=`xiaomi-api-key`:params.opts.tokenProvider===`synthetic`?authChoice=`synthetic-api-key`:params.opts.tokenProvider===`venice`?authChoice=`venice-api-key`:params.opts.tokenProvider===`together`?authChoice=`together-api-key`:params.opts.tokenProvider===`huggingface`?authChoice=`huggingface-api-key`:params.opts.tokenProvider===`opencode`?authChoice=`opencode-zen`:params.opts.tokenProvider===`qianfan`&&(authChoice=`qianfan-api-key`));async function ensureMoonshotApiKeyCredential(promptMessage){let hasCredential=!1;!hasCredential&¶ms.opts?.token&¶ms.opts?.tokenProvider===`moonshot`&&(await setMoonshotApiKey(normalizeApiKeyInput(params.opts.token),params.agentDir),hasCredential=!0);let envKey=resolveEnvApiKey(`moonshot`);if(envKey&&await params.prompter.confirm({message:`Use existing MOONSHOT_API_KEY (${envKey.source}, ${formatApiKeyPreview(envKey.apiKey)})?`,initialValue:!0})&&(await setMoonshotApiKey(envKey.apiKey,params.agentDir),hasCredential=!0),!hasCredential){let key=await params.prompter.text({message:promptMessage,validate:validateApiKeyInput});await setMoonshotApiKey(normalizeApiKeyInput(String(key??``)),params.agentDir)}}if(authChoice===`openrouter-api-key`)return applyAuthChoiceOpenRouter(params);if(authChoice===`builderforcellm`){await params.prompter.note(`Using BuilderForceAgentsLLM default proxy (no local API key required).`,`BuilderForceAgentsLLM`);let defaultModel=`builderforcellm/auto`,applied=await applyDefaultModelChoice({config:nextConfig,setDefaultModel:params.setDefaultModel,defaultModel,applyDefaultConfig:config=>applyAgentDefaultModelPrimary(config,defaultModel),applyProviderConfig:config=>config,noteDefault:defaultModel,noteAgentModel,prompter:params.prompter});return nextConfig=applied.config,agentModelOverride=applied.agentModelOverride??agentModelOverride,{config:nextConfig,agentModelOverride}}if(authChoice===`litellm-api-key`){let store=await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),existingProfileId=resolveAuthProfileOrder({cfg:nextConfig,store,provider:`litellm`}).find(profileId=>!!store.profiles[profileId]),existingCred=existingProfileId?store.profiles[existingProfileId]:void 0,profileId=`litellm:default`,hasCredential=!1;if(existingProfileId&&existingCred?.type===`api_key`&&(profileId=existingProfileId,hasCredential=!0),!hasCredential&¶ms.opts?.token&¶ms.opts?.tokenProvider===`litellm`&&(await setLitellmApiKey(normalizeApiKeyInput(params.opts.token),params.agentDir),hasCredential=!0),!hasCredential){await params.prompter.note(`LiteLLM provides a unified API to 100+ LLM providers.
|
|
4
4
|
Get your API key from your LiteLLM proxy or https://litellm.ai
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./transformers-stream-nSL4Xu31.js";import"./shared-DjBPjC55.js";import"./model-picker-Dl3do2OD.js";import{u as downloadAndWireLocalBrain}from"./auth-choice.apply.transformers-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./transformers-stream-nSL4Xu31.js";import"./shared-DjBPjC55.js";import"./model-picker-Dl3do2OD.js";import{u as downloadAndWireLocalBrain}from"./auth-choice.apply.transformers-vyvtAxcX.js";export{downloadAndWireLocalBrain};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{Gt as ensureAuthProfileStore}from"./model-selection-DX_WOc2P.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-QS2dnQob.js";import{t as promptAuthChoiceGrouped}from"./auth-choice-prompt-D_tSFWQL.js";import{r as applyPrimaryModel}from"./model-picker-CjrWGzFG.js";import path from"node:path";const BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID=`builderforcellm-local`,TRANSFORMERS_PROVIDER_ID=BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,AMYGDALA_MODEL_ID=`HuggingFaceTB/SmolLM2-1.7B-Instruct`,AMYGDALA_DTYPE=`q4`,HIPPOCAMPUS_MODEL_ID=`onnx-community/Qwen3-0.6B-ONNX`,HIPPOCAMPUS_DTYPE=`q4f16`;function defaultCacheDir(){return path.join(resolveStateDir(),`models`)}function toModelKey(modelId){return`${TRANSFORMERS_PROVIDER_ID}/${modelId}`}function applyTransformersProviderConfig(cfg,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir){return{...cfg,models:{...cfg.models,mode:cfg.models?.mode??`merge`,providers:{...cfg.models?.providers,[TRANSFORMERS_PROVIDER_ID]:{baseUrl:cacheDir,api:`transformers`,apiKey:`local`,models:[{id:amygdalaModelId,name:`amygdala (${amygdalaModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:8192,maxTokens:2048,headers:{"x-transformers-dtype":amygdalaDtype,"x-brain-role":`amygdala`}},{id:hippocampusModelId,name:`hippocampus (${hippocampusModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:40960,maxTokens:4096,headers:{"x-transformers-dtype":hippocampusDtype,"x-brain-role":`hippocampus`}}]}}},localBrain:{...cfg.localBrain,enabled:!0,models:{amygdala:{modelId:amygdalaModelId,dtype:amygdalaDtype},hippocampus:{modelId:hippocampusModelId,dtype:hippocampusDtype}}}}}function extractPrimaryModel(cfg){let model=cfg.agents?.defaults?.model;if(typeof model==`string`)return model;if(model&&typeof model==`object`)return model.primary}function setModelWithFallback(cfg,primary,fallback){let defaults=cfg.agents?.defaults,existingModel=defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary,fallbacks:[fallback]}}}}}async function downloadAndWireLocalBrain(opts){let nextConfig=opts.config,configuredModelKey=extractPrimaryModel(nextConfig),amygdalaModelId=nextConfig.localBrain?.models?.amygdala?.modelId??AMYGDALA_MODEL_ID,amygdalaDtype=nextConfig.localBrain?.models?.amygdala?.dtype??`q4`,hippocampusModelId=nextConfig.localBrain?.models?.hippocampus?.modelId??HIPPOCAMPUS_MODEL_ID,hippocampusDtype=nextConfig.localBrain?.models?.hippocampus?.dtype??HIPPOCAMPUS_DTYPE,cacheDir=defaultCacheDir();nextConfig=applyTransformersProviderConfig(nextConfig,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir);let lastFile=``,amygdalaSpinner=opts.prompter.progress(`Downloading amygdala (${amygdalaModelId}, ${amygdalaDtype})… (~0.9 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:amygdalaModelId,dtype:amygdalaDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),amygdalaSpinner.update(`Amygdala: ${path.basename(file)} — ${pct}%`)}}),amygdalaSpinner.stop(`Amygdala (fast router) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);return amygdalaSpinner.stop(`Amygdala download failed: ${msg}\nThe cortex (registered LLM) will be used without a local brain.\nRe-run "builderforce configure" to try again.`),{config:nextConfig}}lastFile=``;let hippoSpinner=opts.prompter.progress(`Downloading hippocampus (${hippocampusModelId}, ${hippocampusDtype})… (~2.3 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:hippocampusModelId,dtype:hippocampusDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),hippoSpinner.update(`Hippocampus: ${path.basename(file)} — ${pct}%`)}}),hippoSpinner.stop(`Hippocampus (memory model) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);hippoSpinner.stop(`Hippocampus download failed: ${msg}\nAmygdala will run solo; hippocampus features disabled.\nRe-run "builderforce configure" to try again.`)}let localModelKey=toModelKey(amygdalaModelId);return nextConfig=configuredModelKey&&configuredModelKey!==localModelKey?setModelWithFallback(nextConfig,localModelKey,configuredModelKey):applyPrimaryModel(nextConfig,localModelKey),{config:nextConfig}}async function applyAuthChoiceTransformers(params){if(params.authChoice!==`builderforcellm-local`)return null;await params.prompter.note(`First, pick your main LLM provider.
|
|
2
|
-
This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-
|
|
2
|
+
This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-CfFhu_Vk.js`),nextConfig=(await applyAuthChoice({authChoice:llmChoice,config:params.config,prompter:params.prompter,runtime:params.runtime,setDefaultModel:!0})).config;return await params.prompter.confirm({message:`Enable local brain? (handles simple tasks, defers complex ones)`,initialValue:!0})?{config:(await downloadAndWireLocalBrain({config:nextConfig,prompter:params.prompter})).config}:{config:nextConfig}}export{HIPPOCAMPUS_MODEL_ID as a,applyTransformersProviderConfig as c,HIPPOCAMPUS_DTYPE as i,defaultCacheDir as l,AMYGDALA_MODEL_ID as n,TRANSFORMERS_PROVIDER_ID as o,BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID as r,applyAuthChoiceTransformers as s,AMYGDALA_DTYPE as t,downloadAndWireLocalBrain as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./model-catalog-C7PdRY6w.js";import"./transformers-stream-QS2dnQob.js";import"./shared-eZqGzEHT.js";import"./model-picker-CjrWGzFG.js";import{u as downloadAndWireLocalBrain}from"./auth-choice.apply.transformers-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./model-catalog-C7PdRY6w.js";import"./transformers-stream-QS2dnQob.js";import"./shared-eZqGzEHT.js";import"./model-picker-CjrWGzFG.js";import{u as downloadAndWireLocalBrain}from"./auth-choice.apply.transformers-DXBWOilg.js";export{downloadAndWireLocalBrain};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import{b as ensureAuthProfileStore}from"./auth-profiles-BARnVAUE.js";import{s as downloadBuilderForceAgentsLlmModel}from"./transformers-stream-nSL4Xu31.js";import{t as promptAuthChoiceGrouped}from"./auth-choice-prompt-DvWWxKmC.js";import{r as applyPrimaryModel}from"./model-picker-Dl3do2OD.js";import path from"node:path";const BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID=`builderforcellm-local`,TRANSFORMERS_PROVIDER_ID=BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID,AMYGDALA_MODEL_ID=`HuggingFaceTB/SmolLM2-1.7B-Instruct`,AMYGDALA_DTYPE=`q4`,HIPPOCAMPUS_MODEL_ID=`onnx-community/Qwen3-0.6B-ONNX`,HIPPOCAMPUS_DTYPE=`q4f16`;function defaultCacheDir(){return path.join(resolveStateDir(),`models`)}function toModelKey(modelId){return`${TRANSFORMERS_PROVIDER_ID}/${modelId}`}function applyTransformersProviderConfig(cfg,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir){return{...cfg,models:{...cfg.models,mode:cfg.models?.mode??`merge`,providers:{...cfg.models?.providers,[TRANSFORMERS_PROVIDER_ID]:{baseUrl:cacheDir,api:`transformers`,apiKey:`local`,models:[{id:amygdalaModelId,name:`amygdala (${amygdalaModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:8192,maxTokens:2048,headers:{"x-transformers-dtype":amygdalaDtype,"x-brain-role":`amygdala`}},{id:hippocampusModelId,name:`hippocampus (${hippocampusModelId})`,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:40960,maxTokens:4096,headers:{"x-transformers-dtype":hippocampusDtype,"x-brain-role":`hippocampus`}}]}}},localBrain:{...cfg.localBrain,enabled:!0,models:{amygdala:{modelId:amygdalaModelId,dtype:amygdalaDtype},hippocampus:{modelId:hippocampusModelId,dtype:hippocampusDtype}}}}}function extractPrimaryModel(cfg){let model=cfg.agents?.defaults?.model;if(typeof model==`string`)return model;if(model&&typeof model==`object`)return model.primary}function setModelWithFallback(cfg,primary,fallback){let defaults=cfg.agents?.defaults,existingModel=defaults?.model;return{...cfg,agents:{...cfg.agents,defaults:{...defaults,model:{...typeof existingModel==`object`?existingModel:void 0,primary,fallbacks:[fallback]}}}}}async function downloadAndWireLocalBrain(opts){let nextConfig=opts.config,configuredModelKey=extractPrimaryModel(nextConfig),amygdalaModelId=nextConfig.localBrain?.models?.amygdala?.modelId??AMYGDALA_MODEL_ID,amygdalaDtype=nextConfig.localBrain?.models?.amygdala?.dtype??`q4`,hippocampusModelId=nextConfig.localBrain?.models?.hippocampus?.modelId??HIPPOCAMPUS_MODEL_ID,hippocampusDtype=nextConfig.localBrain?.models?.hippocampus?.dtype??HIPPOCAMPUS_DTYPE,cacheDir=defaultCacheDir();nextConfig=applyTransformersProviderConfig(nextConfig,amygdalaModelId,amygdalaDtype,hippocampusModelId,hippocampusDtype,cacheDir);let lastFile=``,amygdalaSpinner=opts.prompter.progress(`Downloading amygdala (${amygdalaModelId}, ${amygdalaDtype})… (~0.9 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:amygdalaModelId,dtype:amygdalaDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),amygdalaSpinner.update(`Amygdala: ${path.basename(file)} — ${pct}%`)}}),amygdalaSpinner.stop(`Amygdala (fast router) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);return amygdalaSpinner.stop(`Amygdala download failed: ${msg}\nThe cortex (registered LLM) will be used without a local brain.\nRe-run "builderforce configure" to try again.`),{config:nextConfig}}lastFile=``;let hippoSpinner=opts.prompter.progress(`Downloading hippocampus (${hippocampusModelId}, ${hippocampusDtype})… (~2.3 GB)`);try{await downloadBuilderForceAgentsLlmModel({modelId:hippocampusModelId,dtype:hippocampusDtype,cacheDir,onProgress:(file,pct)=>{file!==lastFile&&(lastFile=file),hippoSpinner.update(`Hippocampus: ${path.basename(file)} — ${pct}%`)}}),hippoSpinner.stop(`Hippocampus (memory model) downloaded and ready.`)}catch(err){let msg=err instanceof Error?err.message:String(err);hippoSpinner.stop(`Hippocampus download failed: ${msg}\nAmygdala will run solo; hippocampus features disabled.\nRe-run "builderforce configure" to try again.`)}let localModelKey=toModelKey(amygdalaModelId);return nextConfig=configuredModelKey&&configuredModelKey!==localModelKey?setModelWithFallback(nextConfig,localModelKey,configuredModelKey):applyPrimaryModel(nextConfig,localModelKey),{config:nextConfig}}async function applyAuthChoiceTransformers(params){if(params.authChoice!==`builderforcellm-local`)return null;await params.prompter.note(`First, pick your main LLM provider.
|
|
2
|
-
This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-
|
|
2
|
+
This handles coding tasks, complex reasoning, and everything the local brain defers.`,`Configure LLM`);let llmChoice=await promptAuthChoiceGrouped({prompter:params.prompter,store:await ensureAuthProfileStore(params.agentDir,{allowKeychainPrompt:!1}),includeSkip:!1}),{applyAuthChoice}=await import(`./auth-choice.apply-CUuLdlQd.js`),nextConfig=(await applyAuthChoice({authChoice:llmChoice,config:params.config,prompter:params.prompter,runtime:params.runtime,setDefaultModel:!0})).config;return await params.prompter.confirm({message:`Enable local brain? (handles simple tasks, defers complex ones)`,initialValue:!0})?{config:(await downloadAndWireLocalBrain({config:nextConfig,prompter:params.prompter})).config}:{config:nextConfig}}export{HIPPOCAMPUS_MODEL_ID as a,applyTransformersProviderConfig as c,HIPPOCAMPUS_DTYPE as i,defaultCacheDir as l,AMYGDALA_MODEL_ID as n,TRANSFORMERS_PROVIDER_ID as o,BUILDERFORCE_AGENTSLLM_LOCAL_PROVIDER_ID as r,applyAuthChoiceTransformers as s,AMYGDALA_DTYPE as t,downloadAndWireLocalBrain as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{R as isRich,z as theme}from"./utils-BP60e80M.js";import{d as visibleWidth}from"./subsystem-C4b1Von0.js";import{tn as resolveCommitHash}from"./subagent-registry-
|
|
1
|
+
import{R as isRich,z as theme}from"./utils-BP60e80M.js";import{d as visibleWidth}from"./subsystem-C4b1Von0.js";import{tn as resolveCommitHash}from"./subagent-registry-BUKplZi1.js";const DEFAULT_TAGLINE=`All your chats, one BuilderForceAgents.`,HOLIDAY_TAGLINES={newYear:`New Year's Day: New year, new config—same old EADDRINUSE, but this time we resolve it like grown-ups.`,lunarNewYear:`Lunar New Year: May your builds be lucky, your branches prosperous, and your merge conflicts chased away with fireworks.`,christmas:`Christmas: Ho ho ho—Santa's little agentNode-sistant is here to ship joy, roll back chaos, and stash the keys safely.`,eid:`Eid al-Fitr: Celebration mode: queues cleared, tasks completed, and good vibes committed to main with clean history.`,diwali:`Diwali: Let the logs sparkle and the bugs flee—today we light up the terminal and ship with pride.`,easter:`Easter: I found your missing environment variable—consider it a tiny CLI egg hunt with fewer jellybeans.`,hanukkah:`Hanukkah: Eight nights, eight retries, zero shame—may your gateway stay lit and your deployments stay peaceful.`,halloween:`Halloween: Spooky season: beware haunted dependencies, cursed caches, and the ghost of node_modules past.`,thanksgiving:`Thanksgiving: Grateful for stable ports, working DNS, and a bot that reads the logs so nobody has to.`,valentines:`Valentine's Day: Roses are typed, violets are piped—I'll automate the chores so you can spend time with humans.`},TAGLINES=[`Your terminal just grew agentNodes—type something and let the bot pinch the busywork.`,`Welcome to the command line: where dreams compile and confidence segfaults.`,`I run on caffeine, JSON5, and the audacity of "it worked on my machine."`,`Gateway online—please keep hands, feet, and appendages inside the shell at all times.`,`I speak fluent bash, mild sarcasm, and aggressive tab-completion energy.`,`One CLI to rule them all, and one more restart because you changed the port.`,`If it works, it's automation; if it breaks, it's a "learning opportunity."`,`Pairing codes exist because even bots believe in consent—and good security hygiene.`,`Your .env is showing; don't worry, I'll pretend I didn't see it.`,`I'll do the boring stuff while you dramatically stare at the logs like it's cinema.`,`I'm not saying your workflow is chaotic... I'm just bringing a linter and a helmet.`,`Type the command with confidence—nature will provide the stack trace if needed.`,`I don't judge, but your missing API keys are absolutely judging you.`,`I can grep it, git blame it, and gently roast it—pick your coping mechanism.`,`Hot reload for config, cold sweat for deploys.`,`I'm the assistant your terminal demanded, not the one your sleep schedule requested.`,`I keep secrets like a vault... unless you print them in debug logs again.`,`Automation with agentNodes: minimal fuss, maximal pinch.`,`I'm basically a Swiss Army knife, but with more opinions and fewer sharp edges.`,`If you're lost, run doctor; if you're brave, run prod; if you're wise, run tests.`,`Your task has been queued; your dignity has been deprecated.`,`I can't fix your code taste, but I can fix your build and your backlog.`,`I'm not magic—I'm just extremely persistent with retries and coping strategies.`,`It's not "failing," it's "discovering new ways to configure the same thing wrong."`,`Give me a workspace and I'll give you fewer tabs, fewer toggles, and more oxygen.`,`I read logs so you can keep pretending you don't have to.`,`If something's on fire, I can't extinguish it—but I can write a beautiful postmortem.`,`I'll refactor your busywork like it owes me money.`,`Say "stop" and I'll stop—say "ship" and we'll both learn a lesson.`,`I'm the reason your shell history looks like a hacker-movie montage.`,`I'm like tmux: confusing at first, then suddenly you can't live without me.`,`I can run local, remote, or purely on vibes—results may vary with DNS.`,`If you can describe it, I can probably automate it—or at least make it funnier.`,`Your config is valid, your assumptions are not.`,`I don't just autocomplete—I auto-commit (emotionally), then ask you to review (logically).`,`Less clicking, more shipping, fewer "where did that file go" moments.`,`AgentNodes out, commit in—let's ship something mildly responsible.`,`If it's repetitive, I'll automate it; if it's hard, I'll bring jokes and a rollback plan.`,`Because texting yourself reminders is so 2024.`,`Your inbox, your infra, your rules.`,`Turning "I'll reply later" into "my bot replied instantly".`,`Chat automation for people who peaked at IRC.`,`Because Siri wasn't answering at 3AM.`,`IPC, but it's your phone.`,`The UNIX philosophy meets your DMs.`,`curl for conversations.`,`Less middlemen, more messages.`,`Ship fast, log faster.`,`End-to-end encrypted, drama-to-drama excluded.`,`The only bot that stays out of your training set.`,`WhatsApp automation without the "please accept our new privacy policy".`,`Chat APIs that don't require a Senate hearing.`,`Meta wishes they shipped this fast.`,`Because the right answer is usually a script.`,`Your messages, your servers, your control.`,`OpenAI-compatible, not OpenAI-dependent.`,`iMessage green bubble energy, but for everyone.`,`Siri's competent cousin.`,`Works on Android. Crazy concept, we know.`,`No $999 stand required.`,`We ship features faster than Apple ships calculator updates.`,`Your AI assistant, now without the $3,499 headset.`,`Think different. Actually think.`,`Ah, the fruit tree company! 🍎`,`Greetings, Professor Falken`,HOLIDAY_TAGLINES.newYear,HOLIDAY_TAGLINES.lunarNewYear,HOLIDAY_TAGLINES.christmas,HOLIDAY_TAGLINES.eid,HOLIDAY_TAGLINES.diwali,HOLIDAY_TAGLINES.easter,HOLIDAY_TAGLINES.hanukkah,HOLIDAY_TAGLINES.halloween,HOLIDAY_TAGLINES.thanksgiving,HOLIDAY_TAGLINES.valentines],DAY_MS=1440*60*1e3;function utcParts(date){return{year:date.getUTCFullYear(),month:date.getUTCMonth(),day:date.getUTCDate()}}const onMonthDay=(month,day)=>date=>{let parts=utcParts(date);return parts.month===month&&parts.day===day},onSpecificDates=(dates,durationDays=1)=>date=>{let parts=utcParts(date);return dates.some(([year,month,day])=>{if(parts.year!==year)return!1;let start=Date.UTC(year,month,day),current=Date.UTC(parts.year,parts.month,parts.day);return current>=start&¤t<start+durationDays*DAY_MS})},HOLIDAY_RULES=new Map([[HOLIDAY_TAGLINES.newYear,onMonthDay(0,1)],[HOLIDAY_TAGLINES.lunarNewYear,onSpecificDates([[2025,0,29],[2026,1,17],[2027,1,6]],1)],[HOLIDAY_TAGLINES.eid,onSpecificDates([[2025,2,30],[2025,2,31],[2026,2,20],[2027,2,10]],1)],[HOLIDAY_TAGLINES.diwali,onSpecificDates([[2025,9,20],[2026,10,8],[2027,9,28]],1)],[HOLIDAY_TAGLINES.easter,onSpecificDates([[2025,3,20],[2026,3,5],[2027,2,28]],1)],[HOLIDAY_TAGLINES.hanukkah,(windows=>date=>{let parts=utcParts(date),window=windows.find(entry=>entry.year===parts.year);if(!window)return!1;let start=Date.UTC(window.year,window.month,window.day),current=Date.UTC(parts.year,parts.month,parts.day);return current>=start&¤t<start+window.duration*DAY_MS})([{year:2025,month:11,day:15,duration:8},{year:2026,month:11,day:5,duration:8},{year:2027,month:11,day:25,duration:8}])],[HOLIDAY_TAGLINES.halloween,onMonthDay(9,31)],[HOLIDAY_TAGLINES.thanksgiving,date=>{let parts=utcParts(date);if(parts.month!==10)return!1;let fourthThursday=1+(4-new Date(Date.UTC(parts.year,10,1)).getUTCDay()+7)%7+21;return parts.day===fourthThursday}],[HOLIDAY_TAGLINES.valentines,onMonthDay(1,14)],[HOLIDAY_TAGLINES.christmas,onMonthDay(11,25)]]);function isTaglineActive(tagline,date){let rule=HOLIDAY_RULES.get(tagline);return rule?rule(date):!0}function activeTaglines(options={}){if(TAGLINES.length===0)return[DEFAULT_TAGLINE];let today=options.now?options.now():new Date,filtered=TAGLINES.filter(tagline=>isTaglineActive(tagline,today));return filtered.length>0?filtered:TAGLINES}function pickTagline(options={}){let override=(options.env??process.env)?.BUILDERFORCE_AGENTS_TAGLINE_INDEX;if(override!==void 0){let parsed=Number.parseInt(override,10);if(!Number.isNaN(parsed)&&parsed>=0){let pool=TAGLINES.length>0?TAGLINES:[DEFAULT_TAGLINE];return pool[parsed%pool.length]}}let pool=activeTaglines(options),rand=options.random??Math.random;return pool[Math.floor(rand()*pool.length)%pool.length]}let bannerEmitted=!1;const hasJsonFlag=argv=>argv.some(arg=>arg===`--json`||arg.startsWith(`--json=`)),hasVersionFlag=argv=>argv.some(arg=>arg===`--version`||arg===`-V`||arg===`-v`);function formatCliBannerLine(version,options={}){let commitLabel=options.commit??resolveCommitHash({env:options.env})??`local`,tagline=pickTagline(options),rich=options.richTty??isRich(),title=`BuilderForceAgents`,columns=options.columns??process.stdout.columns??120,plainFullLine=`${title} ${version} (${commitLabel}) — ${tagline}`,fitsOnOneLine=visibleWidth(plainFullLine)<=columns;return rich?fitsOnOneLine?`${theme.brand(title)} ${theme.brand(version)} ${theme.muted(`(${commitLabel})`)} ${theme.muted(`—`)} ${theme.brand(tagline)}`:`${`${theme.brand(title)} ${theme.brand(version)} ${theme.muted(`(${commitLabel})`)}`}\n${`${` `.repeat(0)}${theme.brand(tagline)}`}`:fitsOnOneLine?plainFullLine:`${`${title} ${version} (${commitLabel})`}\n${`${` `.repeat(0)}${tagline}`}`}function emitCliBanner(version,options={}){if(bannerEmitted)return;let argv=options.argv??process.argv;if(!process.stdout.isTTY||hasJsonFlag(argv)||hasVersionFlag(argv))return;let line=formatCliBannerLine(version,options);process.stdout.write(`\n${line}\n\n`),bannerEmitted=!0}function hasEmittedCliBanner(){return bannerEmitted}export{formatCliBannerLine as n,hasEmittedCliBanner as r,emitCliBanner as t};
|
package/dist/build-info.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-3FEGD_4b.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import{t as normalizeBaseUrl}from"./normalize-base-url-Dz6Za7Ks.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./paths-CkcK939O.js";import"./src-D2-7sOAX.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import{n as fetchWithTimeout}from"./fetch-timeout-D8-LocJa.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-BS994lZX.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./builderforcellm-syscheck-DGZKIwPC.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-Cg0S9eFT.js";import{r as saveMambaState}from"./mamba-state-engine-BloJzrxU.js";import"./transformers-stream-QS2dnQob.js";import"./builderforce-directory-sync-CFiQew6N.js";import"./shared-eZqGzEHT.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-YrdiGOgn.js";import"./model-picker-CjrWGzFG.js";import"./auth-choice.apply.transformers-DXBWOilg.js";import{t as runTui}from"./tui-DgBGTw2s.js";import"./tui-stream-assembler-xFcJqFJ9.js";import path from"node:path";import fs from"node:fs/promises";import{confirm,intro,note,outro,password,select,spinner,text}from"@clack/prompts";import{Command}from"commander";const DEFAULT_REGISTRY_URL=`https://api.builderforce.ai`;function resolveRegistryUrl(){return normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_URL`)??DEFAULT_REGISTRY_URL)}function resolveAuthHeaders(){let apiKey=readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`);return apiKey?{Authorization:`Bearer ${apiKey}`}:{}}function isV2Package(pkg){return pkg.version===`2.0`}async function fetchAgentPackage(params){let url=`${normalizeBaseUrl(params.registryUrl??resolveRegistryUrl())}/api/agents/${encodeURIComponent(params.agentId)}/package`,res;try{res=await fetchWithTimeout(url,{method:`GET`,headers:{Accept:`application/json`,...resolveAuthHeaders()}},3e4)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Network error fetching agent package: ${msg}`,{cause:err})}if(!res.ok){let text=await res.text().catch(()=>``);throw Error(`Registry returned ${res.status} ${res.statusText}${text?`: ${text}`:``}`)}let pkg=await res.json();if(!pkg.version||!pkg.platform||!pkg.name||!pkg.base_model)throw Error(`Invalid agent package: missing required fields (version, platform, name, base_model)`);return pkg}function resolveWorkforceModelRef(params){return readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`)?`builderforcellm/workforce-${params.agentId}`:params.pkg.base_model}async function installWorkforceAgent(params){let registryUrl=params.registryUrl??resolveRegistryUrl(),spin=spinner();spin.start(`Fetching agent package for "${params.agentId}" from ${registryUrl}…`);let pkg;try{pkg=await fetchAgentPackage({agentId:params.agentId,registryUrl}),spin.stop(`Package downloaded: ${pkg.name} (v${pkg.version})`)}catch(err){throw spin.stop(`Failed to download agent package`),err}let modelRef=resolveWorkforceModelRef({agentId:params.agentId,pkg}),hasMambaState=isV2Package(pkg)&&!!pkg.mamba_state,installed={agentId:params.agentId,name:pkg.name,title:pkg.title,baseModel:pkg.base_model,modelRef,loraArtifactKey:pkg.r2_artifact_key,packageVersion:pkg.version,hasMambaState,installedAt:new Date().toISOString(),registryUrl};return await updateProjectContextFields(params.projectRoot,{customAgent:installed,llm:{provider:`builderforcellm`,model:modelRef}}),hasMambaState&&isV2Package(pkg)&&pkg.mamba_state&&await saveMambaState(params.projectRoot,pkg.mamba_state),[`Workforce agent installed: ${pkg.name} (${params.agentId})`,` Base model: ${pkg.base_model}`,` Package: v${pkg.version}`,` Mamba state: ${hasMambaState?`yes (persistent memory)`:`no`}`,` Model ref: ${modelRef}`].join(`
|
|
2
2
|
`)}async function showWorkforceAgentInfo(projectRoot){let ctx=await loadProjectContext(projectRoot);if(!ctx?.customAgent){note(`No Workforce agent is installed in this project.
|
|
3
3
|
|
|
4
4
|
Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ctx.customAgent;note([theme.heading(`Workforce Agent`),` ID: ${a.agentId}`,` Name: ${a.name}${a.title?` — ${a.title}`:``}`,` Base model: ${a.baseModel}`,` Model ref: ${a.modelRef}`,` Package: v${a.packageVersion}`,` Mamba state: ${a.hasMambaState?`yes (persistent memory)`:`no`}`,` Installed: ${a.installedAt}`,` Registry: ${a.registryUrl}`].join(`
|
|
@@ -6,7 +6,7 @@ Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ct
|
|
|
6
6
|
`)+`
|
|
7
7
|
|
|
8
8
|
`),await runTui({message:opts.message})}async function readJsonFile(filePath){try{let content=await fs.readFile(filePath,`utf-8`);return JSON.parse(content)}catch{return null}}async function fileExists(filePath){try{return await fs.access(filePath),!0}catch{return!1}}async function detectLanguagesFromFiles(projectRoot){let extLangMap={".ts":`typescript`,".tsx":`typescript`,".js":`javascript`,".jsx":`javascript`,".mjs":`javascript`,".cjs":`javascript`,".py":`python`,".go":`go`,".rs":`rust`,".java":`java`,".kt":`kotlin`,".swift":`swift`,".rb":`ruby`,".php":`php`,".cs":`csharp`,".cpp":`cpp`,".c":`c`,".dart":`dart`,".ex":`elixir`,".exs":`elixir`,".hs":`haskell`},counts={},ignoreDirs=new Set([`node_modules`,`.git`,`dist`,`build`,`.builderForceAgents`,`__pycache__`,`.next`,`out`,`coverage`,`vendor`]);async function walk(dir,depth){if(depth>3)return;let entries;try{entries=await fs.readdir(dir,{withFileTypes:!0})}catch{return}for(let entry of entries)if(entry.isDirectory())!ignoreDirs.has(entry.name)&&!entry.name.startsWith(`.`)&&await walk(path.join(dir,entry.name),depth+1);else{let lang=extLangMap[path.extname(entry.name).toLowerCase()];lang&&(counts[lang]=(counts[lang]??0)+1)}}return await walk(projectRoot,0),Object.entries(counts).toSorted((a,b)=>b[1]-a[1]).map(([lang])=>lang)}async function detectFrameworks(projectRoot,pkgDeps){let found=[],all=Object.keys(pkgDeps);for(let[match,label]of[[`next`,`next.js`],[`nuxt`,`nuxt`],[/^@remix-run/,`remix`],[`astro`,`astro`],[`@sveltejs/kit`,`sveltekit`],[`svelte`,`svelte`],[`react`,`react`],[`vue`,`@vue`],[`angular`,`angular`],[`express`,`express`],[`fastify`,`fastify`],[`hono`,`hono`],[`koa`,`koa`],[`nest`,`nestjs`],[/^@nestjs/,`nestjs`],[`trpc`,`trpc`],[/^@trpc/,`trpc`],[`drizzle-orm`,`drizzle`],[`prisma`,`prisma`],[/^@prisma/,`prisma`],[`mongoose`,`mongoose`],[`typeorm`,`typeorm`],[`django`,`django`],[`flask`,`flask`],[`fastapi`,`fastapi`],[`tailwindcss`,`tailwind`]])found.includes(label)||(typeof match==`string`?all.some(k=>k===match||k.startsWith(`${match}/`)||k.startsWith(`@${match}/`))&&found.push(label):all.some(k=>match.test(k))&&found.push(label));for(let[file,label]of[[`next.config.js`,`next.js`],[`next.config.ts`,`next.js`],[`nuxt.config.ts`,`nuxt`],[`astro.config.mjs`,`astro`],[`astro.config.ts`,`astro`],[`svelte.config.js`,`sveltekit`],[`vite.config.ts`,`vite`],[`vite.config.js`,`vite`],[`angular.json`,`angular`],[`remix.config.js`,`remix`],[`tailwind.config.ts`,`tailwind`],[`tailwind.config.js`,`tailwind`]])!found.includes(label)&&await fileExists(path.join(projectRoot,file))&&found.push(label);return[...new Set(found)]}async function detectTestFramework(projectRoot,pkgDeps){let all=Object.keys(pkgDeps);if(all.includes(`vitest`))return`vitest`;if(all.includes(`jest`)||all.some(k=>k.startsWith(`@jest/`)))return`jest`;if(all.includes(`mocha`))return`mocha`;if(all.includes(`jasmine`))return`jasmine`;if(all.includes(`ava`))return`ava`;if(all.includes(`pytest`)||await fileExists(path.join(projectRoot,`pytest.ini`)))return`pytest`;if(await fileExists(path.join(projectRoot,`vitest.config.ts`)))return`vitest`;if(await fileExists(path.join(projectRoot,`jest.config.js`))||await fileExists(path.join(projectRoot,`jest.config.ts`)))return`jest`}async function detectLintingTools(projectRoot,pkgDeps){let tools=[],all=Object.keys(pkgDeps);return(all.includes(`eslint`)||await fileExists(path.join(projectRoot,`.eslintrc.js`)))&&tools.push(`eslint`),all.includes(`oxlint`)&&tools.push(`oxlint`),(all.includes(`prettier`)||await fileExists(path.join(projectRoot,`.prettierrc`)))&&tools.push(`prettier`),all.includes(`biome`)&&tools.push(`biome`),(all.includes(`ruff`)||await fileExists(path.join(projectRoot,`ruff.toml`)))&&tools.push(`ruff`),all.includes(`pylint`)&&tools.push(`pylint`),tools}async function detectBuildSystem(projectRoot,pkgDeps){let all=Object.keys(pkgDeps);if(all.includes(`turbo`))return`turborepo`;if(all.includes(`nx`))return`nx`;if(all.includes(`tsdown`)||all.includes(`tsup`))return all.includes(`tsdown`)?`tsdown`:`tsup`;if(all.includes(`vite`))return`vite`;if(all.includes(`webpack`))return`webpack`;if(all.includes(`rollup`))return`rollup`;if(all.includes(`esbuild`))return`esbuild`;if(await fileExists(path.join(projectRoot,`Makefile`)))return`make`;if(await fileExists(path.join(projectRoot,`CMakeLists.txt`)))return`cmake`;if(await fileExists(path.join(projectRoot,`Cargo.toml`)))return`cargo`;if(await fileExists(path.join(projectRoot,`pyproject.toml`)))return`poetry`;if(await fileExists(path.join(projectRoot,`setup.py`)))return`setuptools`;if(await fileExists(path.join(projectRoot,`pnpm-lock.yaml`)))return`pnpm`;if(await fileExists(path.join(projectRoot,`yarn.lock`)))return`yarn`;if(await fileExists(path.join(projectRoot,`package-lock.json`)))return`npm`}async function detectProjectInfo(projectRoot){let pkg=await readJsonFile(path.join(projectRoot,`package.json`)),pkgName=typeof pkg?.name==`string`?pkg.name:``,pkgDesc=typeof pkg?.description==`string`?pkg.description:``,allDeps={...pkg?.dependencies,...pkg?.devDependencies,...pkg?.peerDependencies},[langsByFile,frameworks,testFramework,lintingTools,buildSystem]=await Promise.all([detectLanguagesFromFiles(projectRoot),detectFrameworks(projectRoot,allDeps),detectTestFramework(projectRoot,allDeps),detectLintingTools(projectRoot,allDeps),detectBuildSystem(projectRoot,allDeps)]),languages=await fileExists(path.join(projectRoot,`tsconfig.json`))?[`typescript`,...langsByFile.filter(l=>l!==`typescript`)]:langsByFile;return{projectName:pkgName||path.basename(projectRoot),description:pkgDesc,languages:[...new Set(languages)].slice(0,6),frameworks,buildSystem,testFramework,lintingTools}}const PROVIDERS=[{id:`builderforcellm`,label:`BuilderForceAgentsLLM (recommended) — Builderforce.AI`,defaultModel:`builderforcellm/auto`},{id:`anthropic`,label:`Anthropic (Claude)`,envVar:`ANTHROPIC_API_KEY`,defaultModel:`anthropic/claude-sonnet-4-6`},{id:`openai`,label:`OpenAI (GPT-4o)`,envVar:`OPENAI_API_KEY`,defaultModel:`openai/gpt-4o`},{id:`openrouter`,label:`OpenRouter`,envVar:`OPENROUTER_API_KEY`,defaultModel:`openrouter/auto`},{id:`gemini`,label:`Google Gemini`,envVar:`GEMINI_API_KEY`,defaultModel:`google/gemini-2.0-flash`},{id:`ollama`,label:`Ollama (local)`,envVar:`OLLAMA_API_KEY`,defaultModel:`ollama/llama3.3`},{id:`vllm`,label:`vLLM / llama.cpp / LiteLLM (local)`,defaultModel:`vllm/your-model-id`},{id:`workforce`,label:`Builderforce Workforce Agent (custom trained LLM)`,defaultModel:`builderforcellm/auto`}];function isProviderConfigured(p){if(!p.envVar)return!1;let val=process.env[p.envVar];return typeof val==`string`&&val.trim().length>0}async function applyLlmProviderModel(projectRoot,provider,modelRef){try{await updateProjectContextFields(projectRoot,{llm:{provider,model:modelRef}})}catch{}}async function promptWorkforceAgentProvider(projectRoot){let registryUrl=await text({message:`Builderforce registry URL:`,initialValue:DEFAULT_REGISTRY_URL});if(typeof registryUrl==`symbol`)return null;let agentIdInput=await text({message:`Workforce agent ID (from the Builderforce registry):`,placeholder:`e.g. 550e8400-e29b-41d4-a716-446655440000`});if(typeof agentIdInput==`symbol`||!agentIdInput.trim())return null;let agentId=agentIdInput.trim();try{return await installWorkforceAgent({agentId,projectRoot,registryUrl:normalizeBaseUrl(registryUrl.trim())||DEFAULT_REGISTRY_URL})}catch(err){return note([err instanceof Error?err.message:String(err),``,`You can retry later with: builderforce agent install <agentId>`].join(`
|
|
9
|
-
`),`Failed to install Workforce agent`),null}}async function promptLlmProvider(projectRoot){let chosen=await select({message:`LLM provider to use for AI agents:`,options:[...PROVIDERS.map(p=>({value:p.id,label:isProviderConfigured(p)?`${p.label} ✓ configured`:p.label,hint:p.id===`builderforcellm`?`managed proxy (no local API key needed)`:isProviderConfigured(p)?`${p.envVar} is set`:p.envVar?`needs ${p.envVar}`:`enter server URL`})),{value:`skip`,label:`Skip — configure later`}]});if(typeof chosen==`symbol`||chosen===`skip`)return null;if(chosen===`workforce`)return promptWorkforceAgentProvider(projectRoot);let meta=PROVIDERS.find(p=>p.id===chosen);if(chosen===`builderforcellm`||chosen===`anthropic`||chosen===`openai`||chosen===`openrouter`||chosen===`gemini`){if(chosen===`builderforcellm`){if(!readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()){let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-
|
|
9
|
+
`),`Failed to install Workforce agent`),null}}async function promptLlmProvider(projectRoot){let chosen=await select({message:`LLM provider to use for AI agents:`,options:[...PROVIDERS.map(p=>({value:p.id,label:isProviderConfigured(p)?`${p.label} ✓ configured`:p.label,hint:p.id===`builderforcellm`?`managed proxy (no local API key needed)`:isProviderConfigured(p)?`${p.envVar} is set`:p.envVar?`needs ${p.envVar}`:`enter server URL`})),{value:`skip`,label:`Skip — configure later`}]});if(typeof chosen==`symbol`||chosen===`skip`)return null;if(chosen===`workforce`)return promptWorkforceAgentProvider(projectRoot);let meta=PROVIDERS.find(p=>p.id===chosen);if(chosen===`builderforcellm`||chosen===`anthropic`||chosen===`openai`||chosen===`openrouter`||chosen===`gemini`){if(chosen===`builderforcellm`){if(!readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()){let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-CoGJY95Q.js`);await promptBuilderforceOnboarding({projectRoot,defaultInstanceName:path.basename(projectRoot)||`builderforce`,forcePrompt:!0}),readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()||note([`BuilderForceAgentsLLM requires a Builderforce account to work.`,`You can connect later with: builderforce init --reconnect`,`Or switch to a different provider with: builderforce init`].join(`
|
|
10
10
|
`),`Skipped — BuilderForceAgentsLLM won't be available yet`)}return await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(isProviderConfigured(meta))return note(`${meta.envVar} is already set — keeping existing credential.`,meta.label),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} (existing credential kept), model → ${meta.defaultModel}`;let apiKey=await password({message:`${meta.label} API key:`});if(typeof apiKey==`symbol`||!apiKey.trim())return null;let keyValue=apiKey.trim();return chosen===`anthropic`?await setAnthropicApiKey(keyValue):chosen===`openrouter`?await setOpenrouterApiKey(keyValue):chosen===`gemini`?await setGeminiApiKey(keyValue):upsertSharedEnvVar({key:`OPENAI_API_KEY`,value:keyValue}),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(chosen===`ollama`){let ollamaUrl=await text({message:`Ollama base URL:`,initialValue:`http://127.0.0.1:11434`});if(typeof ollamaUrl==`symbol`)return null;let ollamaModel=await text({message:`Ollama model to use as default:`,initialValue:`llama3.3`,placeholder:`llama3.3 or qwen2.5-coder:32b or deepseek-r1:32b`});if(typeof ollamaModel==`symbol`)return null;let modelRef=`ollama/${ollamaModel.trim()||`llama3.3`}`;upsertSharedEnvVar({key:`OLLAMA_API_KEY`,value:`ollama-local`});let normalizedUrl=normalizeBaseUrl(ollamaUrl.trim());if(normalizedUrl!==`http://127.0.0.1:11434`)try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,ollama:{baseUrl:normalizedUrl,api:`ollama`,apiKey:`ollama-local`,models:[]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`ollama`,modelRef),`Ollama configured (${normalizedUrl}), model → ${modelRef}`}if(chosen===`vllm`){let vllmUrl=await text({message:`Server base URL (e.g. http://127.0.0.1:8000/v1):`,initialValue:`http://127.0.0.1:8000/v1`});if(typeof vllmUrl==`symbol`)return null;let vllmModelId=await text({message:`Model ID served at that endpoint:`,placeholder:`meta-llama/Llama-3.1-8B-Instruct`});if(typeof vllmModelId==`symbol`||!vllmModelId.trim())return null;let modelId=vllmModelId.trim(),modelRef=`vllm/${modelId}`;try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,vllm:{baseUrl:normalizeBaseUrl(vllmUrl.trim()),api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:128e3,maxTokens:8192}]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`vllm`,modelRef),`vLLM configured (${vllmUrl.trim()}), model → ${modelRef}`}return null}async function builderforceApiFetch(url,opts={}){let{token,...rest}=opts,headers={"Content-Type":`application/json`,...token?{Authorization:`Bearer ${token}`}:{}},res=await fetch(url,{...rest,headers}),body=await res.json().catch(()=>({}));if(!res.ok){let msg=body.error??body.message??res.statusText;throw Error(`${res.status} ${msg}`)}return body}async function ensureProjectMapping(params){try{let upsert=await builderforceApiFetch(`${params.serverUrl}/api/projects/upsert`,{method:`POST`,token:params.tenantJwt,body:JSON.stringify({name:params.projectName,description:params.description??`Managed from ${params.projectRoot}`})});return await builderforceApiFetch(`${params.serverUrl}/api/agent-hosts/${params.agentNodeId}/projects/${upsert.project.id}`,{method:`PUT`,token:params.tenantJwt}),{projectId:upsert.project.id,action:upsert.action}}catch{return null}}async function ensureProjectMappingFromStoredCreds(params){let serverUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,webToken=readSharedEnvVar(`BUILDERFORCE_WEB_TOKEN`),tenantIdRaw=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`);if(!webToken||!tenantIdRaw)return;let tenantId=Number(tenantIdRaw);if(!Number.isFinite(tenantId)||tenantId<=0)return;let ctx=await loadProjectContext(params.projectRoot).catch(()=>null),agentNodeId=ctx?.builderforce?.instanceId?.trim();if(!agentNodeId)return;let tenantJwtRes=await builderforceApiFetch(`${serverUrl}/api/auth/tenant-token`,{method:`POST`,token:webToken,body:JSON.stringify({tenantId})}).catch(()=>null);if(!tenantJwtRes?.token)return;let mapped=await ensureProjectMapping({serverUrl,tenantJwt:tenantJwtRes.token,projectRoot:params.projectRoot,projectName:params.projectName,description:params.description,agentNodeId});mapped&&await updateProjectContextFields(params.projectRoot,{builderforce:{instanceId:agentNodeId,...ctx?.builderforce,projectId:mapped.projectId}}).catch(()=>void 0)}async function promptBuilderforceSetup(projectRoot,defaultInstanceName){if(readSharedEnvVar(`BUILDERFORCE_API_KEY`)){let existingUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,existingTenantId=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`),existingCtx=await loadProjectContext(projectRoot).catch(()=>null),agentNodeLabel=existingCtx?.builderforce?.instanceSlug??existingCtx?.builderforce?.instanceName??existingCtx?.builderforce?.instanceId??`(registered)`;return note([`URL: ${existingUrl}`,`Tenant: ${existingTenantId??`unknown`}`,`AgentNode: ${agentNodeLabel}`,``,`Run 'builderforce init --reconnect' to link a different account.`].join(`
|
|
11
11
|
`),`Already connected to Builderforce`),`Builderforce: already connected (${existingUrl})`}if(readSharedEnvVar(`BUILDERFORCE_SKIPPED`)===`1`)return null;let connect=await confirm({message:`Connect to Builderforce? (optional — manage projects, tasks & agents across your mesh)`,initialValue:!0});if(typeof connect==`symbol`||!connect)return upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`1`}),note(`You can connect to Builderforce anytime with: builderforce init --reconnect`,`Skipped`),null;let urlInput=await text({message:`Orchestration API URL (Builderforce):`,initialValue:`https://api.builderforce.ai`});if(typeof urlInput==`symbol`)return null;let serverUrl=normalizeBaseUrl(urlInput.trim())||`https://api.builderforce.ai`,authMode=await select({message:`Do you have a Builderforce account?`,options:[{value:`login`,label:`Yes — log in`},{value:`register`,label:`No — create a free account`}]});if(typeof authMode==`symbol`)return null;let emailInput=await text({message:`Email:`});if(typeof emailInput==`symbol`||!emailInput.trim())return null;let email=emailInput.trim(),usernameForReg=``;if(authMode===`register`){let unInput=await text({message:`Username:`,initialValue:defaultInstanceName.toLowerCase().replace(/[^a-z0-9]+/g,`-`)});if(typeof unInput==`symbol`||!unInput.trim())return null;usernameForReg=unInput.trim()}let pwdInput=await password({message:`Password:`});if(typeof pwdInput==`symbol`||!pwdInput.trim())return null;let pwd=pwdInput.trim(),webToken=``,authSpin=spinner();try{authMode===`register`?(authSpin.start(`Creating account…`),webToken=(await builderforceApiFetch(`${serverUrl}/api/auth/web/register`,{method:`POST`,body:JSON.stringify({email,username:usernameForReg,password:pwd})})).token,authSpin.stop(`Account created`)):(authSpin.start(`Authenticating…`),webToken=(await builderforceApiFetch(`${serverUrl}/api/auth/web/login`,{method:`POST`,body:JSON.stringify({email,password:pwd})})).token,authSpin.stop(`Authenticated`))}catch(err){return authSpin.stop(`Authentication failed`),note(String(err instanceof Error?err.message:err),`Error`),null}let tenantId=0,tenantSpin=spinner();tenantSpin.start(`Loading workspaces…`);let tenants=[];try{tenants=(await builderforceApiFetch(`${serverUrl}/api/auth/my-tenants`,{token:webToken})).tenants,tenantSpin.stop(`${tenants.length} workspace(s) found`)}catch(err){return tenantSpin.stop(`Could not load workspaces`),note(String(err instanceof Error?err.message:err),`Error`),null}if(tenants.length===0){let wsNameInput=await text({message:`Create your first workspace:`,initialValue:defaultInstanceName});if(typeof wsNameInput==`symbol`||!wsNameInput.trim())return null;let wsSpin=spinner();wsSpin.start(`Creating workspace…`);try{let created=await builderforceApiFetch(`${serverUrl}/api/tenants/create`,{method:`POST`,token:webToken,body:JSON.stringify({name:wsNameInput.trim()})});tenantId=created.id,wsSpin.stop(`Workspace "${created.name}" created`)}catch(err){return wsSpin.stop(`Could not create workspace`),note(String(err instanceof Error?err.message:err),`Error`),null}}else if(tenants.length===1)tenantId=tenants[0].id,note(`Using workspace: ${tenants[0].name}`,`Workspace`);else{let picked=await select({message:`Select workspace:`,options:tenants.map(t=>({value:t.id,label:t.name,hint:t.slug}))});if(typeof picked==`symbol`)return null;tenantId=picked}let tenantJwt=``;try{tenantJwt=(await builderforceApiFetch(`${serverUrl}/api/auth/tenant-token`,{method:`POST`,token:webToken,body:JSON.stringify({tenantId})})).token}catch(err){return note(String(err instanceof Error?err.message:err),`Could not get workspace token`),null}let agentNodeNameInput=await text({message:`AgentNode instance name (shown in dashboard):`,initialValue:defaultInstanceName});if(typeof agentNodeNameInput==`symbol`)return null;let agentNodeName=agentNodeNameInput.trim()||defaultInstanceName,agentNodeSpin=spinner();agentNodeSpin.start(`Registering agentNode instance…`);let agentNodeId=``,agentNodeSlug=``,apiKey=``,projectId=``,projectAction=`unknown`;try{let res=await builderforceApiFetch(`${serverUrl}/api/agent-hosts`,{method:`POST`,token:tenantJwt,body:JSON.stringify({name:agentNodeName})});agentNodeId=String(res.agentHost.id),agentNodeSlug=res.agentHost.slug,apiKey=res.apiKey;let mapped=await ensureProjectMapping({serverUrl,tenantJwt,agentNodeId,projectRoot,projectName:defaultInstanceName,description:`builderForceAgents project at ${projectRoot}`});mapped&&(projectId=mapped.projectId,projectAction=mapped.action),agentNodeSpin.stop(`AgentNode "${res.agentHost.name}" registered`)}catch(err){return agentNodeSpin.stop(`AgentNode registration failed`),note(String(err instanceof Error?err.message:err),`Error`),null}upsertSharedEnvVar({key:`BUILDERFORCE_URL`,value:serverUrl}),upsertSharedEnvVar({key:`BUILDERFORCE_WEB_TOKEN`,value:webToken}),upsertSharedEnvVar({key:`BUILDERFORCE_TENANT_ID`,value:String(tenantId)}),upsertSharedEnvVar({key:`BUILDERFORCE_API_KEY`,value:apiKey});try{await updateProjectContextFields(projectRoot,{builderforce:{instanceId:agentNodeId,instanceSlug:agentNodeSlug,instanceName:agentNodeName,...projectId?{projectId}:{},tenantId,url:serverUrl}})}catch{}return note([`AgentNode API key saved to ~/.builderforce/.env`,`This key was shown once — it is hashed on the server.`,`Instance slug: ${agentNodeSlug} · tenant: ${tenantId}`,projectId?`Project ${projectAction}: ${projectId}`:`Project mapping: not available`].join(`
|
|
12
12
|
`),`Builderforce connected`),`Builderforce: ${agentNodeName} (${agentNodeSlug}) on tenant ${tenantId}`}function createBuilderForceAgentsCommand(){let cmd=new Command(`project`);return cmd.description(`Manage builderForceAgents project context`).addCommand(createStatusCommand()),cmd}function createInitCommand(){return new Command(`init`).description(`Initialize a project with builderForceAgents`).argument(`[path]`,`Project directory path`,`.`).action(async projectPath=>{let projectRoot=projectPath===`.`?process.cwd():projectPath;if(await isBuilderForceAgentsProject(projectRoot)){await runBuilderForceAgentsSession(projectRoot);return}intro(theme.accent(`builderForceAgents`));let detectSpin=spinner();detectSpin.start(`Detecting project info...`);let detected=await detectProjectInfo(projectRoot);detectSpin.stop(`Project info detected`),note([`name: ${detected.projectName}`,`languages: ${detected.languages.join(`, `)||`(none detected)`}`,`frameworks: ${detected.frameworks.join(`, `)||`(none detected)`}`,`build: ${detected.buildSystem??`(unknown)`}`,`test: ${detected.testFramework??`(unknown)`}`,`lint: ${detected.lintingTools.join(`, `)||`(none detected)`}`].join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import{t as normalizeBaseUrl}from"./normalize-base-url-CaRxuDMW.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BIKVpYUN.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./sessions-ko0LxxGk.js";import"./src-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import{t as normalizeBaseUrl}from"./normalize-base-url-CaRxuDMW.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BIKVpYUN.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./sessions-ko0LxxGk.js";import"./src-BM8G-tIl.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-BSIWJD6S.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./accounts-DoJYLMfS.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-DGDYymYx.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./tool-display-BIswnHaq.js";import{n as fetchWithTimeout}from"./fetch-timeout-DykxEVWb.js";import"./builderforcellm-syscheck-CfFrfeV2.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-C5KLsMTc.js";import{r as saveMambaState}from"./mamba-state-engine-BYmUnYwn.js";import"./transformers-stream-nSL4Xu31.js";import"./builderforce-directory-sync-DIQQT09l.js";import"./shared-DjBPjC55.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-BSSFRvb0.js";import"./model-picker-Dl3do2OD.js";import"./auth-choice.apply.transformers-vyvtAxcX.js";import{t as runTui}from"./tui-CdYI5f3k.js";import"./tui-stream-assembler-BNJE9PoS.js";import path from"node:path";import fs from"node:fs/promises";import{confirm,intro,note,outro,password,select,spinner,text}from"@clack/prompts";import{Command}from"commander";const DEFAULT_REGISTRY_URL=`https://api.builderforce.ai`;function resolveRegistryUrl(){return normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_URL`)??DEFAULT_REGISTRY_URL)}function resolveAuthHeaders(){let apiKey=readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`);return apiKey?{Authorization:`Bearer ${apiKey}`}:{}}function isV2Package(pkg){return pkg.version===`2.0`}async function fetchAgentPackage(params){let url=`${normalizeBaseUrl(params.registryUrl??resolveRegistryUrl())}/api/agents/${encodeURIComponent(params.agentId)}/package`,res;try{res=await fetchWithTimeout(url,{method:`GET`,headers:{Accept:`application/json`,...resolveAuthHeaders()}},3e4)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Network error fetching agent package: ${msg}`,{cause:err})}if(!res.ok){let text=await res.text().catch(()=>``);throw Error(`Registry returned ${res.status} ${res.statusText}${text?`: ${text}`:``}`)}let pkg=await res.json();if(!pkg.version||!pkg.platform||!pkg.name||!pkg.base_model)throw Error(`Invalid agent package: missing required fields (version, platform, name, base_model)`);return pkg}function resolveWorkforceModelRef(params){return readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`)?`builderforcellm/workforce-${params.agentId}`:params.pkg.base_model}async function installWorkforceAgent(params){let registryUrl=params.registryUrl??resolveRegistryUrl(),spin=spinner();spin.start(`Fetching agent package for "${params.agentId}" from ${registryUrl}…`);let pkg;try{pkg=await fetchAgentPackage({agentId:params.agentId,registryUrl}),spin.stop(`Package downloaded: ${pkg.name} (v${pkg.version})`)}catch(err){throw spin.stop(`Failed to download agent package`),err}let modelRef=resolveWorkforceModelRef({agentId:params.agentId,pkg}),hasMambaState=isV2Package(pkg)&&!!pkg.mamba_state,installed={agentId:params.agentId,name:pkg.name,title:pkg.title,baseModel:pkg.base_model,modelRef,loraArtifactKey:pkg.r2_artifact_key,packageVersion:pkg.version,hasMambaState,installedAt:new Date().toISOString(),registryUrl};return await updateProjectContextFields(params.projectRoot,{customAgent:installed,llm:{provider:`builderforcellm`,model:modelRef}}),hasMambaState&&isV2Package(pkg)&&pkg.mamba_state&&await saveMambaState(params.projectRoot,pkg.mamba_state),[`Workforce agent installed: ${pkg.name} (${params.agentId})`,` Base model: ${pkg.base_model}`,` Package: v${pkg.version}`,` Mamba state: ${hasMambaState?`yes (persistent memory)`:`no`}`,` Model ref: ${modelRef}`].join(`
|
|
2
2
|
`)}async function showWorkforceAgentInfo(projectRoot){let ctx=await loadProjectContext(projectRoot);if(!ctx?.customAgent){note(`No Workforce agent is installed in this project.
|
|
3
3
|
|
|
4
4
|
Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ctx.customAgent;note([theme.heading(`Workforce Agent`),` ID: ${a.agentId}`,` Name: ${a.name}${a.title?` — ${a.title}`:``}`,` Base model: ${a.baseModel}`,` Model ref: ${a.modelRef}`,` Package: v${a.packageVersion}`,` Mamba state: ${a.hasMambaState?`yes (persistent memory)`:`no`}`,` Installed: ${a.installedAt}`,` Registry: ${a.registryUrl}`].join(`
|
|
@@ -6,7 +6,7 @@ Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ct
|
|
|
6
6
|
`)+`
|
|
7
7
|
|
|
8
8
|
`),await runTui({message:opts.message})}async function readJsonFile(filePath){try{let content=await fs.readFile(filePath,`utf-8`);return JSON.parse(content)}catch{return null}}async function fileExists(filePath){try{return await fs.access(filePath),!0}catch{return!1}}async function detectLanguagesFromFiles(projectRoot){let extLangMap={".ts":`typescript`,".tsx":`typescript`,".js":`javascript`,".jsx":`javascript`,".mjs":`javascript`,".cjs":`javascript`,".py":`python`,".go":`go`,".rs":`rust`,".java":`java`,".kt":`kotlin`,".swift":`swift`,".rb":`ruby`,".php":`php`,".cs":`csharp`,".cpp":`cpp`,".c":`c`,".dart":`dart`,".ex":`elixir`,".exs":`elixir`,".hs":`haskell`},counts={},ignoreDirs=new Set([`node_modules`,`.git`,`dist`,`build`,`.builderForceAgents`,`__pycache__`,`.next`,`out`,`coverage`,`vendor`]);async function walk(dir,depth){if(depth>3)return;let entries;try{entries=await fs.readdir(dir,{withFileTypes:!0})}catch{return}for(let entry of entries)if(entry.isDirectory())!ignoreDirs.has(entry.name)&&!entry.name.startsWith(`.`)&&await walk(path.join(dir,entry.name),depth+1);else{let lang=extLangMap[path.extname(entry.name).toLowerCase()];lang&&(counts[lang]=(counts[lang]??0)+1)}}return await walk(projectRoot,0),Object.entries(counts).toSorted((a,b)=>b[1]-a[1]).map(([lang])=>lang)}async function detectFrameworks(projectRoot,pkgDeps){let found=[],all=Object.keys(pkgDeps);for(let[match,label]of[[`next`,`next.js`],[`nuxt`,`nuxt`],[/^@remix-run/,`remix`],[`astro`,`astro`],[`@sveltejs/kit`,`sveltekit`],[`svelte`,`svelte`],[`react`,`react`],[`vue`,`@vue`],[`angular`,`angular`],[`express`,`express`],[`fastify`,`fastify`],[`hono`,`hono`],[`koa`,`koa`],[`nest`,`nestjs`],[/^@nestjs/,`nestjs`],[`trpc`,`trpc`],[/^@trpc/,`trpc`],[`drizzle-orm`,`drizzle`],[`prisma`,`prisma`],[/^@prisma/,`prisma`],[`mongoose`,`mongoose`],[`typeorm`,`typeorm`],[`django`,`django`],[`flask`,`flask`],[`fastapi`,`fastapi`],[`tailwindcss`,`tailwind`]])found.includes(label)||(typeof match==`string`?all.some(k=>k===match||k.startsWith(`${match}/`)||k.startsWith(`@${match}/`))&&found.push(label):all.some(k=>match.test(k))&&found.push(label));for(let[file,label]of[[`next.config.js`,`next.js`],[`next.config.ts`,`next.js`],[`nuxt.config.ts`,`nuxt`],[`astro.config.mjs`,`astro`],[`astro.config.ts`,`astro`],[`svelte.config.js`,`sveltekit`],[`vite.config.ts`,`vite`],[`vite.config.js`,`vite`],[`angular.json`,`angular`],[`remix.config.js`,`remix`],[`tailwind.config.ts`,`tailwind`],[`tailwind.config.js`,`tailwind`]])!found.includes(label)&&await fileExists(path.join(projectRoot,file))&&found.push(label);return[...new Set(found)]}async function detectTestFramework(projectRoot,pkgDeps){let all=Object.keys(pkgDeps);if(all.includes(`vitest`))return`vitest`;if(all.includes(`jest`)||all.some(k=>k.startsWith(`@jest/`)))return`jest`;if(all.includes(`mocha`))return`mocha`;if(all.includes(`jasmine`))return`jasmine`;if(all.includes(`ava`))return`ava`;if(all.includes(`pytest`)||await fileExists(path.join(projectRoot,`pytest.ini`)))return`pytest`;if(await fileExists(path.join(projectRoot,`vitest.config.ts`)))return`vitest`;if(await fileExists(path.join(projectRoot,`jest.config.js`))||await fileExists(path.join(projectRoot,`jest.config.ts`)))return`jest`}async function detectLintingTools(projectRoot,pkgDeps){let tools=[],all=Object.keys(pkgDeps);return(all.includes(`eslint`)||await fileExists(path.join(projectRoot,`.eslintrc.js`)))&&tools.push(`eslint`),all.includes(`oxlint`)&&tools.push(`oxlint`),(all.includes(`prettier`)||await fileExists(path.join(projectRoot,`.prettierrc`)))&&tools.push(`prettier`),all.includes(`biome`)&&tools.push(`biome`),(all.includes(`ruff`)||await fileExists(path.join(projectRoot,`ruff.toml`)))&&tools.push(`ruff`),all.includes(`pylint`)&&tools.push(`pylint`),tools}async function detectBuildSystem(projectRoot,pkgDeps){let all=Object.keys(pkgDeps);if(all.includes(`turbo`))return`turborepo`;if(all.includes(`nx`))return`nx`;if(all.includes(`tsdown`)||all.includes(`tsup`))return all.includes(`tsdown`)?`tsdown`:`tsup`;if(all.includes(`vite`))return`vite`;if(all.includes(`webpack`))return`webpack`;if(all.includes(`rollup`))return`rollup`;if(all.includes(`esbuild`))return`esbuild`;if(await fileExists(path.join(projectRoot,`Makefile`)))return`make`;if(await fileExists(path.join(projectRoot,`CMakeLists.txt`)))return`cmake`;if(await fileExists(path.join(projectRoot,`Cargo.toml`)))return`cargo`;if(await fileExists(path.join(projectRoot,`pyproject.toml`)))return`poetry`;if(await fileExists(path.join(projectRoot,`setup.py`)))return`setuptools`;if(await fileExists(path.join(projectRoot,`pnpm-lock.yaml`)))return`pnpm`;if(await fileExists(path.join(projectRoot,`yarn.lock`)))return`yarn`;if(await fileExists(path.join(projectRoot,`package-lock.json`)))return`npm`}async function detectProjectInfo(projectRoot){let pkg=await readJsonFile(path.join(projectRoot,`package.json`)),pkgName=typeof pkg?.name==`string`?pkg.name:``,pkgDesc=typeof pkg?.description==`string`?pkg.description:``,allDeps={...pkg?.dependencies,...pkg?.devDependencies,...pkg?.peerDependencies},[langsByFile,frameworks,testFramework,lintingTools,buildSystem]=await Promise.all([detectLanguagesFromFiles(projectRoot),detectFrameworks(projectRoot,allDeps),detectTestFramework(projectRoot,allDeps),detectLintingTools(projectRoot,allDeps),detectBuildSystem(projectRoot,allDeps)]),languages=await fileExists(path.join(projectRoot,`tsconfig.json`))?[`typescript`,...langsByFile.filter(l=>l!==`typescript`)]:langsByFile;return{projectName:pkgName||path.basename(projectRoot),description:pkgDesc,languages:[...new Set(languages)].slice(0,6),frameworks,buildSystem,testFramework,lintingTools}}const PROVIDERS=[{id:`builderforcellm`,label:`BuilderForceAgentsLLM (recommended) — Builderforce.AI`,defaultModel:`builderforcellm/auto`},{id:`anthropic`,label:`Anthropic (Claude)`,envVar:`ANTHROPIC_API_KEY`,defaultModel:`anthropic/claude-sonnet-4-6`},{id:`openai`,label:`OpenAI (GPT-4o)`,envVar:`OPENAI_API_KEY`,defaultModel:`openai/gpt-4o`},{id:`openrouter`,label:`OpenRouter`,envVar:`OPENROUTER_API_KEY`,defaultModel:`openrouter/auto`},{id:`gemini`,label:`Google Gemini`,envVar:`GEMINI_API_KEY`,defaultModel:`google/gemini-2.0-flash`},{id:`ollama`,label:`Ollama (local)`,envVar:`OLLAMA_API_KEY`,defaultModel:`ollama/llama3.3`},{id:`vllm`,label:`vLLM / llama.cpp / LiteLLM (local)`,defaultModel:`vllm/your-model-id`},{id:`workforce`,label:`Builderforce Workforce Agent (custom trained LLM)`,defaultModel:`builderforcellm/auto`}];function isProviderConfigured(p){if(!p.envVar)return!1;let val=process.env[p.envVar];return typeof val==`string`&&val.trim().length>0}async function applyLlmProviderModel(projectRoot,provider,modelRef){try{await updateProjectContextFields(projectRoot,{llm:{provider,model:modelRef}})}catch{}}async function promptWorkforceAgentProvider(projectRoot){let registryUrl=await text({message:`Builderforce registry URL:`,initialValue:DEFAULT_REGISTRY_URL});if(typeof registryUrl==`symbol`)return null;let agentIdInput=await text({message:`Workforce agent ID (from the Builderforce registry):`,placeholder:`e.g. 550e8400-e29b-41d4-a716-446655440000`});if(typeof agentIdInput==`symbol`||!agentIdInput.trim())return null;let agentId=agentIdInput.trim();try{return await installWorkforceAgent({agentId,projectRoot,registryUrl:normalizeBaseUrl(registryUrl.trim())||DEFAULT_REGISTRY_URL})}catch(err){return note([err instanceof Error?err.message:String(err),``,`You can retry later with: builderforce agent install <agentId>`].join(`
|
|
9
|
-
`),`Failed to install Workforce agent`),null}}async function promptLlmProvider(projectRoot){let chosen=await select({message:`LLM provider to use for AI agents:`,options:[...PROVIDERS.map(p=>({value:p.id,label:isProviderConfigured(p)?`${p.label} ✓ configured`:p.label,hint:p.id===`builderforcellm`?`managed proxy (no local API key needed)`:isProviderConfigured(p)?`${p.envVar} is set`:p.envVar?`needs ${p.envVar}`:`enter server URL`})),{value:`skip`,label:`Skip — configure later`}]});if(typeof chosen==`symbol`||chosen===`skip`)return null;if(chosen===`workforce`)return promptWorkforceAgentProvider(projectRoot);let meta=PROVIDERS.find(p=>p.id===chosen);if(chosen===`builderforcellm`||chosen===`anthropic`||chosen===`openai`||chosen===`openrouter`||chosen===`gemini`){if(chosen===`builderforcellm`){if(!readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()){let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-
|
|
9
|
+
`),`Failed to install Workforce agent`),null}}async function promptLlmProvider(projectRoot){let chosen=await select({message:`LLM provider to use for AI agents:`,options:[...PROVIDERS.map(p=>({value:p.id,label:isProviderConfigured(p)?`${p.label} ✓ configured`:p.label,hint:p.id===`builderforcellm`?`managed proxy (no local API key needed)`:isProviderConfigured(p)?`${p.envVar} is set`:p.envVar?`needs ${p.envVar}`:`enter server URL`})),{value:`skip`,label:`Skip — configure later`}]});if(typeof chosen==`symbol`||chosen===`skip`)return null;if(chosen===`workforce`)return promptWorkforceAgentProvider(projectRoot);let meta=PROVIDERS.find(p=>p.id===chosen);if(chosen===`builderforcellm`||chosen===`anthropic`||chosen===`openai`||chosen===`openrouter`||chosen===`gemini`){if(chosen===`builderforcellm`){if(!readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()){let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-DyYM_cib.js`);await promptBuilderforceOnboarding({projectRoot,defaultInstanceName:path.basename(projectRoot)||`builderforce`,forcePrompt:!0}),readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()||note([`BuilderForceAgentsLLM requires a Builderforce account to work.`,`You can connect later with: builderforce init --reconnect`,`Or switch to a different provider with: builderforce init`].join(`
|
|
10
10
|
`),`Skipped — BuilderForceAgentsLLM won't be available yet`)}return await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(isProviderConfigured(meta))return note(`${meta.envVar} is already set — keeping existing credential.`,meta.label),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} (existing credential kept), model → ${meta.defaultModel}`;let apiKey=await password({message:`${meta.label} API key:`});if(typeof apiKey==`symbol`||!apiKey.trim())return null;let keyValue=apiKey.trim();return chosen===`anthropic`?await setAnthropicApiKey(keyValue):chosen===`openrouter`?await setOpenrouterApiKey(keyValue):chosen===`gemini`?await setGeminiApiKey(keyValue):upsertSharedEnvVar({key:`OPENAI_API_KEY`,value:keyValue}),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(chosen===`ollama`){let ollamaUrl=await text({message:`Ollama base URL:`,initialValue:`http://127.0.0.1:11434`});if(typeof ollamaUrl==`symbol`)return null;let ollamaModel=await text({message:`Ollama model to use as default:`,initialValue:`llama3.3`,placeholder:`llama3.3 or qwen2.5-coder:32b or deepseek-r1:32b`});if(typeof ollamaModel==`symbol`)return null;let modelRef=`ollama/${ollamaModel.trim()||`llama3.3`}`;upsertSharedEnvVar({key:`OLLAMA_API_KEY`,value:`ollama-local`});let normalizedUrl=normalizeBaseUrl(ollamaUrl.trim());if(normalizedUrl!==`http://127.0.0.1:11434`)try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,ollama:{baseUrl:normalizedUrl,api:`ollama`,apiKey:`ollama-local`,models:[]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`ollama`,modelRef),`Ollama configured (${normalizedUrl}), model → ${modelRef}`}if(chosen===`vllm`){let vllmUrl=await text({message:`Server base URL (e.g. http://127.0.0.1:8000/v1):`,initialValue:`http://127.0.0.1:8000/v1`});if(typeof vllmUrl==`symbol`)return null;let vllmModelId=await text({message:`Model ID served at that endpoint:`,placeholder:`meta-llama/Llama-3.1-8B-Instruct`});if(typeof vllmModelId==`symbol`||!vllmModelId.trim())return null;let modelId=vllmModelId.trim(),modelRef=`vllm/${modelId}`;try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,vllm:{baseUrl:normalizeBaseUrl(vllmUrl.trim()),api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:128e3,maxTokens:8192}]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`vllm`,modelRef),`vLLM configured (${vllmUrl.trim()}), model → ${modelRef}`}return null}async function builderforceApiFetch(url,opts={}){let{token,...rest}=opts,headers={"Content-Type":`application/json`,...token?{Authorization:`Bearer ${token}`}:{}},res=await fetch(url,{...rest,headers}),body=await res.json().catch(()=>({}));if(!res.ok){let msg=body.error??body.message??res.statusText;throw Error(`${res.status} ${msg}`)}return body}async function ensureProjectMapping(params){try{let upsert=await builderforceApiFetch(`${params.serverUrl}/api/projects/upsert`,{method:`POST`,token:params.tenantJwt,body:JSON.stringify({name:params.projectName,description:params.description??`Managed from ${params.projectRoot}`})});return await builderforceApiFetch(`${params.serverUrl}/api/agent-hosts/${params.agentNodeId}/projects/${upsert.project.id}`,{method:`PUT`,token:params.tenantJwt}),{projectId:upsert.project.id,action:upsert.action}}catch{return null}}async function ensureProjectMappingFromStoredCreds(params){let serverUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,webToken=readSharedEnvVar(`BUILDERFORCE_WEB_TOKEN`),tenantIdRaw=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`);if(!webToken||!tenantIdRaw)return;let tenantId=Number(tenantIdRaw);if(!Number.isFinite(tenantId)||tenantId<=0)return;let ctx=await loadProjectContext(params.projectRoot).catch(()=>null),agentNodeId=ctx?.builderforce?.instanceId?.trim();if(!agentNodeId)return;let tenantJwtRes=await builderforceApiFetch(`${serverUrl}/api/auth/tenant-token`,{method:`POST`,token:webToken,body:JSON.stringify({tenantId})}).catch(()=>null);if(!tenantJwtRes?.token)return;let mapped=await ensureProjectMapping({serverUrl,tenantJwt:tenantJwtRes.token,projectRoot:params.projectRoot,projectName:params.projectName,description:params.description,agentNodeId});mapped&&await updateProjectContextFields(params.projectRoot,{builderforce:{instanceId:agentNodeId,...ctx?.builderforce,projectId:mapped.projectId}}).catch(()=>void 0)}async function promptBuilderforceSetup(projectRoot,defaultInstanceName){if(readSharedEnvVar(`BUILDERFORCE_API_KEY`)){let existingUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,existingTenantId=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`),existingCtx=await loadProjectContext(projectRoot).catch(()=>null),agentNodeLabel=existingCtx?.builderforce?.instanceSlug??existingCtx?.builderforce?.instanceName??existingCtx?.builderforce?.instanceId??`(registered)`;return note([`URL: ${existingUrl}`,`Tenant: ${existingTenantId??`unknown`}`,`AgentNode: ${agentNodeLabel}`,``,`Run 'builderforce init --reconnect' to link a different account.`].join(`
|
|
11
11
|
`),`Already connected to Builderforce`),`Builderforce: already connected (${existingUrl})`}if(readSharedEnvVar(`BUILDERFORCE_SKIPPED`)===`1`)return null;let connect=await confirm({message:`Connect to Builderforce? (optional — manage projects, tasks & agents across your mesh)`,initialValue:!0});if(typeof connect==`symbol`||!connect)return upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`1`}),note(`You can connect to Builderforce anytime with: builderforce init --reconnect`,`Skipped`),null;let urlInput=await text({message:`Orchestration API URL (Builderforce):`,initialValue:`https://api.builderforce.ai`});if(typeof urlInput==`symbol`)return null;let serverUrl=normalizeBaseUrl(urlInput.trim())||`https://api.builderforce.ai`,authMode=await select({message:`Do you have a Builderforce account?`,options:[{value:`login`,label:`Yes — log in`},{value:`register`,label:`No — create a free account`}]});if(typeof authMode==`symbol`)return null;let emailInput=await text({message:`Email:`});if(typeof emailInput==`symbol`||!emailInput.trim())return null;let email=emailInput.trim(),usernameForReg=``;if(authMode===`register`){let unInput=await text({message:`Username:`,initialValue:defaultInstanceName.toLowerCase().replace(/[^a-z0-9]+/g,`-`)});if(typeof unInput==`symbol`||!unInput.trim())return null;usernameForReg=unInput.trim()}let pwdInput=await password({message:`Password:`});if(typeof pwdInput==`symbol`||!pwdInput.trim())return null;let pwd=pwdInput.trim(),webToken=``,authSpin=spinner();try{authMode===`register`?(authSpin.start(`Creating account…`),webToken=(await builderforceApiFetch(`${serverUrl}/api/auth/web/register`,{method:`POST`,body:JSON.stringify({email,username:usernameForReg,password:pwd})})).token,authSpin.stop(`Account created`)):(authSpin.start(`Authenticating…`),webToken=(await builderforceApiFetch(`${serverUrl}/api/auth/web/login`,{method:`POST`,body:JSON.stringify({email,password:pwd})})).token,authSpin.stop(`Authenticated`))}catch(err){return authSpin.stop(`Authentication failed`),note(String(err instanceof Error?err.message:err),`Error`),null}let tenantId=0,tenantSpin=spinner();tenantSpin.start(`Loading workspaces…`);let tenants=[];try{tenants=(await builderforceApiFetch(`${serverUrl}/api/auth/my-tenants`,{token:webToken})).tenants,tenantSpin.stop(`${tenants.length} workspace(s) found`)}catch(err){return tenantSpin.stop(`Could not load workspaces`),note(String(err instanceof Error?err.message:err),`Error`),null}if(tenants.length===0){let wsNameInput=await text({message:`Create your first workspace:`,initialValue:defaultInstanceName});if(typeof wsNameInput==`symbol`||!wsNameInput.trim())return null;let wsSpin=spinner();wsSpin.start(`Creating workspace…`);try{let created=await builderforceApiFetch(`${serverUrl}/api/tenants/create`,{method:`POST`,token:webToken,body:JSON.stringify({name:wsNameInput.trim()})});tenantId=created.id,wsSpin.stop(`Workspace "${created.name}" created`)}catch(err){return wsSpin.stop(`Could not create workspace`),note(String(err instanceof Error?err.message:err),`Error`),null}}else if(tenants.length===1)tenantId=tenants[0].id,note(`Using workspace: ${tenants[0].name}`,`Workspace`);else{let picked=await select({message:`Select workspace:`,options:tenants.map(t=>({value:t.id,label:t.name,hint:t.slug}))});if(typeof picked==`symbol`)return null;tenantId=picked}let tenantJwt=``;try{tenantJwt=(await builderforceApiFetch(`${serverUrl}/api/auth/tenant-token`,{method:`POST`,token:webToken,body:JSON.stringify({tenantId})})).token}catch(err){return note(String(err instanceof Error?err.message:err),`Could not get workspace token`),null}let agentNodeNameInput=await text({message:`AgentNode instance name (shown in dashboard):`,initialValue:defaultInstanceName});if(typeof agentNodeNameInput==`symbol`)return null;let agentNodeName=agentNodeNameInput.trim()||defaultInstanceName,agentNodeSpin=spinner();agentNodeSpin.start(`Registering agentNode instance…`);let agentNodeId=``,agentNodeSlug=``,apiKey=``,projectId=``,projectAction=`unknown`;try{let res=await builderforceApiFetch(`${serverUrl}/api/agent-hosts`,{method:`POST`,token:tenantJwt,body:JSON.stringify({name:agentNodeName})});agentNodeId=String(res.agentHost.id),agentNodeSlug=res.agentHost.slug,apiKey=res.apiKey;let mapped=await ensureProjectMapping({serverUrl,tenantJwt,agentNodeId,projectRoot,projectName:defaultInstanceName,description:`builderForceAgents project at ${projectRoot}`});mapped&&(projectId=mapped.projectId,projectAction=mapped.action),agentNodeSpin.stop(`AgentNode "${res.agentHost.name}" registered`)}catch(err){return agentNodeSpin.stop(`AgentNode registration failed`),note(String(err instanceof Error?err.message:err),`Error`),null}upsertSharedEnvVar({key:`BUILDERFORCE_URL`,value:serverUrl}),upsertSharedEnvVar({key:`BUILDERFORCE_WEB_TOKEN`,value:webToken}),upsertSharedEnvVar({key:`BUILDERFORCE_TENANT_ID`,value:String(tenantId)}),upsertSharedEnvVar({key:`BUILDERFORCE_API_KEY`,value:apiKey});try{await updateProjectContextFields(projectRoot,{builderforce:{instanceId:agentNodeId,instanceSlug:agentNodeSlug,instanceName:agentNodeName,...projectId?{projectId}:{},tenantId,url:serverUrl}})}catch{}return note([`AgentNode API key saved to ~/.builderforce/.env`,`This key was shown once — it is hashed on the server.`,`Instance slug: ${agentNodeSlug} · tenant: ${tenantId}`,projectId?`Project ${projectAction}: ${projectId}`:`Project mapping: not available`].join(`
|
|
12
12
|
`),`Builderforce connected`),`Builderforce: ${agentNodeName} (${agentNodeSlug}) on tenant ${tenantId}`}function createBuilderForceAgentsCommand(){let cmd=new Command(`project`);return cmd.description(`Manage builderForceAgents project context`).addCommand(createStatusCommand()),cmd}function createInitCommand(){return new Command(`init`).description(`Initialize a project with builderForceAgents`).argument(`[path]`,`Project directory path`,`.`).action(async projectPath=>{let projectRoot=projectPath===`.`?process.cwd():projectPath;if(await isBuilderForceAgentsProject(projectRoot)){await runBuilderForceAgentsSession(projectRoot);return}intro(theme.accent(`builderForceAgents`));let detectSpin=spinner();detectSpin.start(`Detecting project info...`);let detected=await detectProjectInfo(projectRoot);detectSpin.stop(`Project info detected`),note([`name: ${detected.projectName}`,`languages: ${detected.languages.join(`, `)||`(none detected)`}`,`frameworks: ${detected.frameworks.join(`, `)||`(none detected)`}`,`build: ${detected.buildSystem??`(unknown)`}`,`test: ${detected.testFramework??`(unknown)`}`,`lint: ${detected.lintingTools.join(`, `)||`(none detected)`}`].join(`
|
package/dist/{builderforce-directory-sync-BCZK4FYJ.js → builderforce-directory-sync-CFiQew6N.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as normalizeBaseUrl}from"./normalize-base-url-Dz6Za7Ks.js";import{i as readSharedEnvVar}from"./env-file-BI2jpOmF.js";import{n as loadProjectContext,v as resolveBuilderForceAgentsDir}from"./project-context-store-
|
|
1
|
+
import{t as normalizeBaseUrl}from"./normalize-base-url-Dz6Za7Ks.js";import{i as readSharedEnvVar}from"./env-file-BI2jpOmF.js";import{n as loadProjectContext,v as resolveBuilderForceAgentsDir}from"./project-context-store-BS994lZX.js";import{n as loadWorkspaceState,r as updateWorkspaceState}from"./project-context-Cg0S9eFT.js";import path from"node:path";import fs from"node:fs/promises";function shouldSyncFile(filePath){let normalized=filePath.toLowerCase();return!(normalized.includes(`${path.sep}node_modules${path.sep}`)||normalized.endsWith(`.png`)||normalized.endsWith(`.jpg`)||normalized.endsWith(`.jpeg`)||normalized.endsWith(`.zip`)||normalized.endsWith(`.db`))}async function digestHex(content){let bytes=new TextEncoder().encode(content),digest=await crypto.subtle.digest(`SHA-256`,bytes);return Array.from(new Uint8Array(digest)).map(b=>b.toString(16).padStart(2,`0`)).join(``)}async function collectFiles(root){let result=[],walk=async dir=>{if(result.length>=200)return;let entries=await fs.readdir(dir,{withFileTypes:!0}).catch(()=>[]);for(let entry of entries){if(result.length>=200)break;let fullPath=path.join(dir,entry.name);if(entry.isDirectory()){await walk(fullPath);continue}if(!entry.isFile()||!shouldSyncFile(fullPath))continue;let stat=await fs.stat(fullPath).catch(()=>null);if(!stat||stat.size>524288)continue;let content=await fs.readFile(fullPath,`utf-8`).catch(()=>``),relPath=path.relative(root,fullPath).replace(/\\/g,`/`);result.push({relPath,content,sizeBytes:Buffer.byteLength(content,`utf-8`),contentHash:await digestHex(content)})}};return await walk(root),result}async function syncBuilderForceAgentsDirectory(params){let baseUrl=normalizeBaseUrl(params.baseUrl),builderForceAgentsDir=resolveBuilderForceAgentsDir(params.workspaceDir);if(!await fs.stat(builderForceAgentsDir.root).then(s=>s.isDirectory()).catch(()=>!1))return{fileCount:0};let files=await collectFiles(builderForceAgentsDir.root),payload={projectId:params.projectId,absPath:builderForceAgentsDir.root,status:`synced`,metadata:{source:`sync`,workspaceDir:params.workspaceDir,fileCount:files.length,triggeredBy:params.triggeredBy??`startup`},files},response=await fetch(`${baseUrl}/api/agent-hosts/${encodeURIComponent(params.agentNodeId)}/directories/sync?key=${encodeURIComponent(params.apiKey)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(payload),signal:AbortSignal.timeout(15e3)}).catch(error=>({ok:!1,statusText:String(error)}));if(!response.ok)throw Error(`sync failed: ${response.status} ${response.statusText}`);return{fileCount:files.length}}async function syncBuilderForceAgentsDirectoryWithMetaUpdate(params){let result=await syncBuilderForceAgentsDirectory(params),prev=await loadWorkspaceState(params.workspaceDir);return await updateWorkspaceState(params.workspaceDir,{lastSyncedAt:new Date().toISOString(),syncCount:(prev.syncCount??0)+1}),result}async function syncBuilderForceAgentsDirectoryOnStartup(params){let apiKey=readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim(),baseUrl=normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`);if(!apiKey)return;let ctx=await loadProjectContext(params.workspaceDir).catch(()=>null),agentNodeId=ctx?.builderforce?.instanceId?.trim();if(!agentNodeId)return;let projectId=ctx?.builderforce?.projectId?Number(ctx.builderforce.projectId):void 0;try{await syncBuilderForceAgentsDirectoryWithMetaUpdate({workspaceDir:params.workspaceDir,apiKey,baseUrl,agentNodeId,projectId})}catch(err){params.log.warn(`[builderforce] startup .builderForceAgents sync failed: ${String(err)}`)}}export{syncBuilderForceAgentsDirectoryOnStartup as n,syncBuilderForceAgentsDirectoryWithMetaUpdate as r,syncBuilderForceAgentsDirectory as t};
|
package/dist/{builderforce-directory-sync-DHfiUf2g.js → builderforce-directory-sync-DIQQT09l.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as normalizeBaseUrl}from"./normalize-base-url-CaRxuDMW.js";import{i as readSharedEnvVar}from"./env-file-BIKVpYUN.js";import{n as loadProjectContext,v as resolveBuilderForceAgentsDir}from"./project-context-store-
|
|
1
|
+
import{t as normalizeBaseUrl}from"./normalize-base-url-CaRxuDMW.js";import{i as readSharedEnvVar}from"./env-file-BIKVpYUN.js";import{n as loadProjectContext,v as resolveBuilderForceAgentsDir}from"./project-context-store-BSIWJD6S.js";import{n as loadWorkspaceState,r as updateWorkspaceState}from"./project-context-C5KLsMTc.js";import path from"node:path";import fs from"node:fs/promises";function shouldSyncFile(filePath){let normalized=filePath.toLowerCase();return!(normalized.includes(`${path.sep}node_modules${path.sep}`)||normalized.endsWith(`.png`)||normalized.endsWith(`.jpg`)||normalized.endsWith(`.jpeg`)||normalized.endsWith(`.zip`)||normalized.endsWith(`.db`))}async function digestHex(content){let bytes=new TextEncoder().encode(content),digest=await crypto.subtle.digest(`SHA-256`,bytes);return Array.from(new Uint8Array(digest)).map(b=>b.toString(16).padStart(2,`0`)).join(``)}async function collectFiles(root){let result=[],walk=async dir=>{if(result.length>=200)return;let entries=await fs.readdir(dir,{withFileTypes:!0}).catch(()=>[]);for(let entry of entries){if(result.length>=200)break;let fullPath=path.join(dir,entry.name);if(entry.isDirectory()){await walk(fullPath);continue}if(!entry.isFile()||!shouldSyncFile(fullPath))continue;let stat=await fs.stat(fullPath).catch(()=>null);if(!stat||stat.size>524288)continue;let content=await fs.readFile(fullPath,`utf-8`).catch(()=>``),relPath=path.relative(root,fullPath).replace(/\\/g,`/`);result.push({relPath,content,sizeBytes:Buffer.byteLength(content,`utf-8`),contentHash:await digestHex(content)})}};return await walk(root),result}async function syncBuilderForceAgentsDirectory(params){let baseUrl=normalizeBaseUrl(params.baseUrl),builderForceAgentsDir=resolveBuilderForceAgentsDir(params.workspaceDir);if(!await fs.stat(builderForceAgentsDir.root).then(s=>s.isDirectory()).catch(()=>!1))return{fileCount:0};let files=await collectFiles(builderForceAgentsDir.root),payload={projectId:params.projectId,absPath:builderForceAgentsDir.root,status:`synced`,metadata:{source:`sync`,workspaceDir:params.workspaceDir,fileCount:files.length,triggeredBy:params.triggeredBy??`startup`},files},response=await fetch(`${baseUrl}/api/agent-hosts/${encodeURIComponent(params.agentNodeId)}/directories/sync?key=${encodeURIComponent(params.apiKey)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(payload),signal:AbortSignal.timeout(15e3)}).catch(error=>({ok:!1,statusText:String(error)}));if(!response.ok)throw Error(`sync failed: ${response.status} ${response.statusText}`);return{fileCount:files.length}}async function syncBuilderForceAgentsDirectoryWithMetaUpdate(params){let result=await syncBuilderForceAgentsDirectory(params),prev=await loadWorkspaceState(params.workspaceDir);return await updateWorkspaceState(params.workspaceDir,{lastSyncedAt:new Date().toISOString(),syncCount:(prev.syncCount??0)+1}),result}async function syncBuilderForceAgentsDirectoryOnStartup(params){let apiKey=readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim(),baseUrl=normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`);if(!apiKey)return;let ctx=await loadProjectContext(params.workspaceDir).catch(()=>null),agentNodeId=ctx?.builderforce?.instanceId?.trim();if(!agentNodeId)return;let projectId=ctx?.builderforce?.projectId?Number(ctx.builderforce.projectId):void 0;try{await syncBuilderForceAgentsDirectoryWithMetaUpdate({workspaceDir:params.workspaceDir,apiKey,baseUrl,agentNodeId,projectId})}catch(err){params.log.warn(`[builderforce] startup .builderForceAgents sync failed: ${String(err)}`)}}export{syncBuilderForceAgentsDirectoryOnStartup as n,syncBuilderForceAgentsDirectoryWithMetaUpdate as r,syncBuilderForceAgentsDirectory as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import{t as normalizeBaseUrl}from"./normalize-base-url-Dz6Za7Ks.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./paths-CkcK939O.js";import"./src-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import{t as normalizeBaseUrl}from"./normalize-base-url-Dz6Za7Ks.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./paths-CkcK939O.js";import"./src-D2-7sOAX.js";import{n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-BS994lZX.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import{d as openUrl,i as detectBrowserOpenSupport}from"./onboard-helpers-CPmBeDvt.js";import"./prompt-style-BwwmGo3-.js";import"./project-context-Cg0S9eFT.js";import{t as buildLocalMachineProfile}from"./builderforce-context-xdRubwNz.js";import{randomBytes}from"node:crypto";import http from"node:http";import{confirm,note,password,select,spinner,text}from"@clack/prompts";const CALLBACK_PORT=51122;async function authenticateViaBrowser(opts){let state=randomBytes(16).toString(`hex`),callbackUrl=`http://localhost:${CALLBACK_PORT}/callback`,authUrl=`${opts.serverUrl.replace(`api.builderforce.ai`,`builderforce.ai`).replace(`api.builderforce.ai`,`builderforce.ai`)}/auth/cli?callback=${encodeURIComponent(callbackUrl)}&state=${encodeURIComponent(state)}`;return(await detectBrowserOpenSupport()).ok?authenticateWithCallbackServer({state,authUrl,prompter:opts.prompter}):authenticateManually({state,authUrl,prompter:opts.prompter})}async function authenticateWithCallbackServer(opts){let tokenPromise=startCallbackServer(opts.state);if(await opts.prompter.note(`Opening browser for authentication…\n${opts.authUrl}`,`Builderforce Auth`),!await openUrl(opts.authUrl))return authenticateManually({state:opts.state,authUrl:opts.authUrl,prompter:opts.prompter});try{return await tokenPromise}catch{return await opts.prompter.note(`Authentication timed out or was cancelled.`,`Auth Error`),null}}async function authenticateManually(opts){await opts.prompter.note([`Open this URL in a browser to authenticate:`,``,opts.authUrl,``,`After authenticating, paste the full callback URL shown in the browser.`].join(`
|
|
2
2
|
`),`Builderforce Auth (manual)`);let pastedUrl=await opts.prompter.text({message:`Paste the callback URL:`,validate:val=>{if(!val.includes(`token=`))return`Invalid callback URL — must contain a token parameter`}});if(typeof pastedUrl==`symbol`||!pastedUrl?.trim())return null;let url=new URL(pastedUrl.trim()),token=url.searchParams.get(`token`);if(url.searchParams.get(`state`)!==opts.state)throw Error(`State mismatch — authentication may have been tampered with.`);if(!token)throw Error(`No token found in callback URL.`);return{webToken:token}}function startCallbackServer(expectedState){return new Promise((resolve,reject)=>{let server=http.createServer((req,res)=>{let url=new URL(req.url??`/`,`http://localhost:${CALLBACK_PORT}`);if(url.pathname!==`/callback`){res.writeHead(404,{"Content-Type":`text/plain`}),res.end(`Not found`);return}let token=url.searchParams.get(`token`);if(url.searchParams.get(`state`)!==expectedState){res.writeHead(400,{"Content-Type":`text/plain`}),res.end(`State mismatch`);return}if(!token){res.writeHead(400,{"Content-Type":`text/plain`}),res.end(`Missing token`);return}res.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Cache-Control":`no-store`}),res.end(`<!DOCTYPE html>
|
|
3
3
|
<html lang="en">
|
|
4
4
|
<head>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import{t as normalizeBaseUrl}from"./normalize-base-url-CaRxuDMW.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./sessions-ko0LxxGk.js";import"./src-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import{t as normalizeBaseUrl}from"./normalize-base-url-CaRxuDMW.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./sessions-ko0LxxGk.js";import"./src-BM8G-tIl.js";import{n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-BSIWJD6S.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./accounts-DoJYLMfS.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./project-context-C5KLsMTc.js";import{d as openUrl,i as detectBrowserOpenSupport}from"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import{t as buildLocalMachineProfile}from"./builderforce-context-SE9cd_a_.js";import{randomBytes}from"node:crypto";import http from"node:http";import{confirm,note,password,select,spinner,text}from"@clack/prompts";const CALLBACK_PORT=51122;async function authenticateViaBrowser(opts){let state=randomBytes(16).toString(`hex`),callbackUrl=`http://localhost:${CALLBACK_PORT}/callback`,authUrl=`${opts.serverUrl.replace(`api.builderforce.ai`,`builderforce.ai`).replace(`api.builderforce.ai`,`builderforce.ai`)}/auth/cli?callback=${encodeURIComponent(callbackUrl)}&state=${encodeURIComponent(state)}`;return(await detectBrowserOpenSupport()).ok?authenticateWithCallbackServer({state,authUrl,prompter:opts.prompter}):authenticateManually({state,authUrl,prompter:opts.prompter})}async function authenticateWithCallbackServer(opts){let tokenPromise=startCallbackServer(opts.state);if(await opts.prompter.note(`Opening browser for authentication…\n${opts.authUrl}`,`Builderforce Auth`),!await openUrl(opts.authUrl))return authenticateManually({state:opts.state,authUrl:opts.authUrl,prompter:opts.prompter});try{return await tokenPromise}catch{return await opts.prompter.note(`Authentication timed out or was cancelled.`,`Auth Error`),null}}async function authenticateManually(opts){await opts.prompter.note([`Open this URL in a browser to authenticate:`,``,opts.authUrl,``,`After authenticating, paste the full callback URL shown in the browser.`].join(`
|
|
2
2
|
`),`Builderforce Auth (manual)`);let pastedUrl=await opts.prompter.text({message:`Paste the callback URL:`,validate:val=>{if(!val.includes(`token=`))return`Invalid callback URL — must contain a token parameter`}});if(typeof pastedUrl==`symbol`||!pastedUrl?.trim())return null;let url=new URL(pastedUrl.trim()),token=url.searchParams.get(`token`);if(url.searchParams.get(`state`)!==opts.state)throw Error(`State mismatch — authentication may have been tampered with.`);if(!token)throw Error(`No token found in callback URL.`);return{webToken:token}}function startCallbackServer(expectedState){return new Promise((resolve,reject)=>{let server=http.createServer((req,res)=>{let url=new URL(req.url??`/`,`http://localhost:${CALLBACK_PORT}`);if(url.pathname!==`/callback`){res.writeHead(404,{"Content-Type":`text/plain`}),res.end(`Not found`);return}let token=url.searchParams.get(`token`);if(url.searchParams.get(`state`)!==expectedState){res.writeHead(400,{"Content-Type":`text/plain`}),res.end(`State mismatch`);return}if(!token){res.writeHead(400,{"Content-Type":`text/plain`}),res.end(`Missing token`);return}res.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Cache-Control":`no-store`}),res.end(`<!DOCTYPE html>
|
|
3
3
|
<html lang="en">
|
|
4
4
|
<head>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{V as resolveConfiguredModelRef,in as DEFAULT_PROVIDER,rn as DEFAULT_MODEL}from"./auth-profiles-BARnVAUE.js";import{R as listChannelDocks}from"./sessions-ko0LxxGk.js";import{s as listThinkingLevels}from"./embedded-helpers-
|
|
1
|
+
import{d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{V as resolveConfiguredModelRef,in as DEFAULT_PROVIDER,rn as DEFAULT_MODEL}from"./auth-profiles-BARnVAUE.js";import{R as listChannelDocks}from"./sessions-ko0LxxGk.js";import{s as listThinkingLevels}from"./embedded-helpers-DGDYymYx.js";import"node:os";import path from"node:path";import fs from"node:fs/promises";function normalizeArgValue(value){if(value==null)return;let text;return text=typeof value==`string`?value.trim():typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value).trim():typeof value==`symbol`||typeof value==`function`?value.toString().trim():JSON.stringify(value),text||void 0}function formatActionArgs(values,params){let action=normalizeArgValue(values.action)?.toLowerCase(),path=normalizeArgValue(values.path),value=normalizeArgValue(values.value);return action?params.formatKnownAction(action,path)||formatSetUnsetArgAction(action,{path,value}):void 0}const formatConfigArgs=values=>formatActionArgs(values,{formatKnownAction:(action,path)=>{if(action===`show`||action===`get`)return path?`${action} ${path}`:action}}),formatDebugArgs=values=>formatActionArgs(values,{formatKnownAction:action=>{if(action===`show`||action===`reset`)return action}});function formatSetUnsetArgAction(action,params){return action===`unset`?params.path?`${action} ${params.path}`:action:action===`set`&¶ms.path?params.value?`${action} ${params.path}=${params.value}`:`${action} ${params.path}`:action}const COMMAND_ARG_FORMATTERS={config:formatConfigArgs,debug:formatDebugArgs,queue:values=>{let mode=normalizeArgValue(values.mode),debounce=normalizeArgValue(values.debounce),cap=normalizeArgValue(values.cap),drop=normalizeArgValue(values.drop),parts=[];return mode&&parts.push(mode),debounce&&parts.push(`debounce:${debounce}`),cap&&parts.push(`cap:${cap}`),drop&&parts.push(`drop:${drop}`),parts.length>0?parts.join(` `):void 0},exec:values=>{let host=normalizeArgValue(values.host),security=normalizeArgValue(values.security),ask=normalizeArgValue(values.ask),node=normalizeArgValue(values.node),parts=[];return host&&parts.push(`host=${host}`),security&&parts.push(`security=${security}`),ask&&parts.push(`ask=${ask}`),node&&parts.push(`node=${node}`),parts.length>0?parts.join(` `):void 0}};function defineChatCommand(command){let aliases=(command.textAliases??(command.textAlias?[command.textAlias]:[])).map(alias=>alias.trim()).filter(Boolean),scope=command.scope??(command.nativeName?aliases.length?`both`:`native`:`text`),acceptsArgs=command.acceptsArgs??!!command.args?.length,argsParsing=command.argsParsing??(command.args?.length?`positional`:`none`);return{key:command.key,nativeName:command.nativeName,description:command.description,acceptsArgs,args:command.args,argsParsing,formatArgs:command.formatArgs,argsMenu:command.argsMenu,textAliases:aliases,scope,category:command.category}}function defineDockCommand(dock){return defineChatCommand({key:`dock:${dock.id}`,nativeName:`dock_${dock.id}`,description:`Switch to ${dock.id} for replies.`,textAliases:[`/dock-${dock.id}`,`/dock_${dock.id}`],category:`docks`})}function registerAlias(commands,key,...aliases){let command=commands.find(entry=>entry.key===key);if(!command)throw Error(`registerAlias: unknown command key: ${key}`);let existing=new Set(command.textAliases.map(alias=>alias.trim().toLowerCase()));for(let alias of aliases){let trimmed=alias.trim();if(!trimmed)continue;let lowered=trimmed.toLowerCase();existing.has(lowered)||(existing.add(lowered),command.textAliases.push(trimmed))}}function assertCommandRegistry(commands){let keys=new Set,nativeNames=new Set,textAliases=new Set;for(let command of commands){if(keys.has(command.key))throw Error(`Duplicate command key: ${command.key}`);keys.add(command.key);let nativeName=command.nativeName?.trim();if(command.scope===`text`){if(nativeName)throw Error(`Text-only command has native name: ${command.key}`);if(command.textAliases.length===0)throw Error(`Text-only command missing text alias: ${command.key}`)}else if(nativeName){let nativeKey=nativeName.toLowerCase();if(nativeNames.has(nativeKey))throw Error(`Duplicate native command: ${nativeName}`);nativeNames.add(nativeKey)}else throw Error(`Native command missing native name: ${command.key}`);if(command.scope===`native`&&command.textAliases.length>0)throw Error(`Native-only command has text aliases: ${command.key}`);for(let alias of command.textAliases){if(!alias.startsWith(`/`))throw Error(`Command alias missing leading '/': ${alias}`);let aliasKey=alias.toLowerCase();if(textAliases.has(aliasKey))throw Error(`Duplicate command alias: ${alias}`);textAliases.add(aliasKey)}}}let cachedCommands=null,cachedRegistry=null,cachedNativeCommandSurfaces=null,cachedNativeRegistry=null;function buildChatCommands(){let commands=[defineChatCommand({key:`help`,nativeName:`help`,description:`Show available commands.`,textAlias:`/help`,category:`status`}),defineChatCommand({key:`commands`,nativeName:`commands`,description:`List all slash commands.`,textAlias:`/commands`,category:`status`}),defineChatCommand({key:`skill`,nativeName:`skill`,description:`Run a skill by name.`,textAlias:`/skill`,category:`tools`,args:[{name:`name`,description:`Skill name`,type:`string`,required:!0},{name:`input`,description:`Skill input`,type:`string`,captureRemaining:!0}]}),defineChatCommand({key:`status`,nativeName:`status`,description:`Show current status.`,textAlias:`/status`,category:`status`}),defineChatCommand({key:`allowlist`,description:`List/add/remove allowlist entries.`,textAlias:`/allowlist`,acceptsArgs:!0,scope:`text`,category:`management`}),defineChatCommand({key:`approve`,nativeName:`approve`,description:`Approve or deny exec requests.`,textAlias:`/approve`,acceptsArgs:!0,category:`management`}),defineChatCommand({key:`context`,nativeName:`context`,description:`Explain how context is built and used.`,textAlias:`/context`,acceptsArgs:!0,category:`status`}),defineChatCommand({key:`export-session`,nativeName:`export-session`,description:`Export current session to HTML file with full system prompt.`,textAliases:[`/export-session`,`/export`],acceptsArgs:!0,category:`status`,args:[{name:`path`,description:`Output path (default: workspace)`,type:`string`,required:!1}]}),defineChatCommand({key:`tts`,nativeName:`tts`,description:`Control text-to-speech (TTS).`,textAlias:`/tts`,category:`media`,args:[{name:`action`,description:`TTS action`,type:`string`,choices:[{value:`on`,label:`On`},{value:`off`,label:`Off`},{value:`status`,label:`Status`},{value:`provider`,label:`Provider`},{value:`limit`,label:`Limit`},{value:`summary`,label:`Summary`},{value:`audio`,label:`Audio`},{value:`help`,label:`Help`}]},{name:`value`,description:`Provider, limit, or text`,type:`string`,captureRemaining:!0}],argsMenu:{arg:`action`,title:`TTS Actions:
|
|
2
2
|
• On – Enable TTS for responses
|
|
3
3
|
• Off – Disable TTS
|
|
4
4
|
• Status – Show current settings
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{H as listThinkingLevels}from"./embedded-helpers-
|
|
1
|
+
import{H as listThinkingLevels}from"./embedded-helpers-3FEGD_4b.js";import{d as getActivePluginRegistry}from"./registry-TdK-aV05.js";import{on as DEFAULT_MODEL,p as resolveConfiguredModelRef,sn as DEFAULT_PROVIDER}from"./model-selection-DX_WOc2P.js";import{G as listChannelDocks}from"./sessions-OZNhnSwZ.js";import"node:os";import path from"node:path";import fs from"node:fs/promises";function normalizeArgValue(value){if(value==null)return;let text;return text=typeof value==`string`?value.trim():typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value).trim():typeof value==`symbol`||typeof value==`function`?value.toString().trim():JSON.stringify(value),text||void 0}function formatActionArgs(values,params){let action=normalizeArgValue(values.action)?.toLowerCase(),path=normalizeArgValue(values.path),value=normalizeArgValue(values.value);return action?params.formatKnownAction(action,path)||formatSetUnsetArgAction(action,{path,value}):void 0}const formatConfigArgs=values=>formatActionArgs(values,{formatKnownAction:(action,path)=>{if(action===`show`||action===`get`)return path?`${action} ${path}`:action}}),formatDebugArgs=values=>formatActionArgs(values,{formatKnownAction:action=>{if(action===`show`||action===`reset`)return action}});function formatSetUnsetArgAction(action,params){return action===`unset`?params.path?`${action} ${params.path}`:action:action===`set`&¶ms.path?params.value?`${action} ${params.path}=${params.value}`:`${action} ${params.path}`:action}const COMMAND_ARG_FORMATTERS={config:formatConfigArgs,debug:formatDebugArgs,queue:values=>{let mode=normalizeArgValue(values.mode),debounce=normalizeArgValue(values.debounce),cap=normalizeArgValue(values.cap),drop=normalizeArgValue(values.drop),parts=[];return mode&&parts.push(mode),debounce&&parts.push(`debounce:${debounce}`),cap&&parts.push(`cap:${cap}`),drop&&parts.push(`drop:${drop}`),parts.length>0?parts.join(` `):void 0},exec:values=>{let host=normalizeArgValue(values.host),security=normalizeArgValue(values.security),ask=normalizeArgValue(values.ask),node=normalizeArgValue(values.node),parts=[];return host&&parts.push(`host=${host}`),security&&parts.push(`security=${security}`),ask&&parts.push(`ask=${ask}`),node&&parts.push(`node=${node}`),parts.length>0?parts.join(` `):void 0}};function defineChatCommand(command){let aliases=(command.textAliases??(command.textAlias?[command.textAlias]:[])).map(alias=>alias.trim()).filter(Boolean),scope=command.scope??(command.nativeName?aliases.length?`both`:`native`:`text`),acceptsArgs=command.acceptsArgs??!!command.args?.length,argsParsing=command.argsParsing??(command.args?.length?`positional`:`none`);return{key:command.key,nativeName:command.nativeName,description:command.description,acceptsArgs,args:command.args,argsParsing,formatArgs:command.formatArgs,argsMenu:command.argsMenu,textAliases:aliases,scope,category:command.category}}function defineDockCommand(dock){return defineChatCommand({key:`dock:${dock.id}`,nativeName:`dock_${dock.id}`,description:`Switch to ${dock.id} for replies.`,textAliases:[`/dock-${dock.id}`,`/dock_${dock.id}`],category:`docks`})}function registerAlias(commands,key,...aliases){let command=commands.find(entry=>entry.key===key);if(!command)throw Error(`registerAlias: unknown command key: ${key}`);let existing=new Set(command.textAliases.map(alias=>alias.trim().toLowerCase()));for(let alias of aliases){let trimmed=alias.trim();if(!trimmed)continue;let lowered=trimmed.toLowerCase();existing.has(lowered)||(existing.add(lowered),command.textAliases.push(trimmed))}}function assertCommandRegistry(commands){let keys=new Set,nativeNames=new Set,textAliases=new Set;for(let command of commands){if(keys.has(command.key))throw Error(`Duplicate command key: ${command.key}`);keys.add(command.key);let nativeName=command.nativeName?.trim();if(command.scope===`text`){if(nativeName)throw Error(`Text-only command has native name: ${command.key}`);if(command.textAliases.length===0)throw Error(`Text-only command missing text alias: ${command.key}`)}else if(nativeName){let nativeKey=nativeName.toLowerCase();if(nativeNames.has(nativeKey))throw Error(`Duplicate native command: ${nativeName}`);nativeNames.add(nativeKey)}else throw Error(`Native command missing native name: ${command.key}`);if(command.scope===`native`&&command.textAliases.length>0)throw Error(`Native-only command has text aliases: ${command.key}`);for(let alias of command.textAliases){if(!alias.startsWith(`/`))throw Error(`Command alias missing leading '/': ${alias}`);let aliasKey=alias.toLowerCase();if(textAliases.has(aliasKey))throw Error(`Duplicate command alias: ${alias}`);textAliases.add(aliasKey)}}}let cachedCommands=null,cachedRegistry=null,cachedNativeCommandSurfaces=null,cachedNativeRegistry=null;function buildChatCommands(){let commands=[defineChatCommand({key:`help`,nativeName:`help`,description:`Show available commands.`,textAlias:`/help`,category:`status`}),defineChatCommand({key:`commands`,nativeName:`commands`,description:`List all slash commands.`,textAlias:`/commands`,category:`status`}),defineChatCommand({key:`skill`,nativeName:`skill`,description:`Run a skill by name.`,textAlias:`/skill`,category:`tools`,args:[{name:`name`,description:`Skill name`,type:`string`,required:!0},{name:`input`,description:`Skill input`,type:`string`,captureRemaining:!0}]}),defineChatCommand({key:`status`,nativeName:`status`,description:`Show current status.`,textAlias:`/status`,category:`status`}),defineChatCommand({key:`allowlist`,description:`List/add/remove allowlist entries.`,textAlias:`/allowlist`,acceptsArgs:!0,scope:`text`,category:`management`}),defineChatCommand({key:`approve`,nativeName:`approve`,description:`Approve or deny exec requests.`,textAlias:`/approve`,acceptsArgs:!0,category:`management`}),defineChatCommand({key:`context`,nativeName:`context`,description:`Explain how context is built and used.`,textAlias:`/context`,acceptsArgs:!0,category:`status`}),defineChatCommand({key:`export-session`,nativeName:`export-session`,description:`Export current session to HTML file with full system prompt.`,textAliases:[`/export-session`,`/export`],acceptsArgs:!0,category:`status`,args:[{name:`path`,description:`Output path (default: workspace)`,type:`string`,required:!1}]}),defineChatCommand({key:`tts`,nativeName:`tts`,description:`Control text-to-speech (TTS).`,textAlias:`/tts`,category:`media`,args:[{name:`action`,description:`TTS action`,type:`string`,choices:[{value:`on`,label:`On`},{value:`off`,label:`Off`},{value:`status`,label:`Status`},{value:`provider`,label:`Provider`},{value:`limit`,label:`Limit`},{value:`summary`,label:`Summary`},{value:`audio`,label:`Audio`},{value:`help`,label:`Help`}]},{name:`value`,description:`Provider, limit, or text`,type:`string`,captureRemaining:!0}],argsMenu:{arg:`action`,title:`TTS Actions:
|
|
2
2
|
• On – Enable TTS for responses
|
|
3
3
|
• Off – Disable TTS
|
|
4
4
|
• Status – Show current settings
|