@openchambery/web 1.19.22-beta.1 → 2.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -7
- package/bin/cli-opencode.test.js +208 -0
- package/bin/cli.js +62 -9
- package/bin/lib/cli-startup.js +105 -2
- package/bin/lib/cli-startup.test.js +179 -0
- package/dist/assets/{AgentAvatar-CRaBJXKs.js → AgentAvatar-B_JQoreg.js} +1 -1
- package/dist/assets/AssistantView-ClQAfGOT.js +3 -0
- package/dist/assets/{DiagramView-D1LGK_s2.js → DiagramView-BNnda8qO.js} +1 -1
- package/dist/assets/{FadeInOnReveal-B0kJo9Ii.js → FadeInOnReveal-VYQTSAkr.js} +1 -1
- package/dist/assets/{Icon-BgdfPhNs.js → Icon-BiEQEcih.js} +1 -1
- package/dist/assets/MarkdownRenderer-CJHSsWin.js +2 -0
- package/dist/assets/{MarkdownRendererImpl-DfoCJ1Mq.js → MarkdownRendererImpl-DwrHFGUp.js} +3 -3
- package/dist/assets/{MarkstreamRendererImpl-D2dsW5Lg.js → MarkstreamRendererImpl-CSnbQMu3.js} +1 -1
- package/dist/assets/MobileDetailNavigation-BXr6AGLT.js +1 -0
- package/dist/assets/{MobileShareBridge-2Yjn6wXg.js → MobileShareBridge-D7OE9OP_.js} +2 -2
- package/dist/assets/MobileSurface-D2jUkX9l.js +2 -0
- package/dist/assets/{MultiRunWindow-tTbMFowS.js → MultiRunWindow-DF3iIFCd.js} +1 -1
- package/dist/assets/{OnboardingScreen-CD2KtlF3.js → OnboardingScreen-BjHmlwlw.js} +1 -1
- package/dist/assets/OverlayScrollbar-DLtWO_Gp.js +2 -0
- package/dist/assets/SettingsView-BRxELjow.js +25 -0
- package/dist/assets/{SettingsWindow-zIa76s4t.js → SettingsWindow-BI5swspb.js} +1 -1
- package/dist/assets/{TerminalView-CDdzF4yi.js → TerminalView-BU3x8-fr.js} +1 -1
- package/dist/assets/{ToolOutputDialog-DNqA4uBl.js → ToolOutputDialog-BEWhBcRd.js} +2 -2
- package/dist/assets/appThemeRegistry-4MR0F7Jz.js +1 -0
- package/dist/assets/{button-CI7Q-Zw_.js → button-DKuz3L8l.js} +1 -1
- package/dist/assets/collapsible-DXbDynN4.js +3 -0
- package/dist/assets/context-menu-CqolsLCm.js +1 -0
- package/dist/assets/{desktopHosts-B1ixEylr.js → desktopHosts-CoDkOnyS.js} +1 -1
- package/dist/assets/{desktopRelayRestore-4JmFUw8r.js → desktopRelayRestore-DDlVKyOE.js} +1 -1
- package/dist/assets/{diagram-DdLO8HZ9.js → diagram-D7T8HQgj.js} +1 -1
- package/dist/assets/{dialog-B6pnIYmp.js → dialog-DQYl3W_o.js} +1 -1
- package/dist/assets/es-CN3E_zXj.js +15 -0
- package/dist/assets/{fileMentionTouchSelection-DNeiqns-.js → fileMentionTouchSelection-BZ6ovBYH.js} +1 -1
- package/dist/assets/{fileQueries-DQc8EJUf.js → fileQueries-JrpcsOCs.js} +1 -1
- package/dist/assets/fr-9zZvQZD2.js +13 -0
- package/dist/assets/gitApi-CM42qUed.js +10 -0
- package/dist/assets/{imageSource-BlAJJUEI.js → imageSource-CIl0FL10.js} +1 -1
- package/dist/assets/{input-D-__fwRi.js → input-CzQy8UhV.js} +1 -1
- package/dist/assets/insertionBoundaries-CtkZ9720.js +1 -0
- package/dist/assets/ja-Dnjk_82N.js +15 -0
- package/dist/assets/ko-BxCEE99C.js +15 -0
- package/dist/assets/main-BILgBI3B.js +169 -0
- package/dist/assets/main-BeveiW6F.js +2 -0
- package/dist/assets/markdown-worker-bS5OgGO3.js +2 -0
- package/dist/assets/{markdownHeightCache-BhxqJOvf.js → markdownHeightCache-Cj1I5NDw.js} +1 -1
- package/dist/assets/{markdownTheme-DOfGg-A7.js → markdownTheme-CKac3wKC.js} +1 -1
- package/dist/assets/mcpQueries-D5mQymgM.js +1 -0
- package/dist/assets/miniChat-BgrzM3u7.js +2 -0
- package/dist/assets/mobile-DtYoQE8C.js +2 -0
- package/dist/assets/multirun-jy8dEI96.js +4 -0
- package/dist/assets/{persistence-Ce3AnpEr.js → persistence-C9LQpiOS.js} +2 -2
- package/dist/assets/pl-CNNsWnPM.js +15 -0
- package/dist/assets/platform-BQghHRfp.js +6 -0
- package/dist/assets/pt-BR-BZB2DJMp.js +15 -0
- package/dist/assets/renderElectronMiniChatApp-BGrrmeME.js +2 -0
- package/dist/assets/renderMobileApp-u3c4GtFC.js +28 -0
- package/dist/assets/{runtimeConfig-CMkwoQ_X.js → runtimeConfig-BIGBRGQI.js} +1 -1
- package/dist/assets/{runtimeEndpointReset-ChOxt-J7.js → runtimeEndpointReset-D2savkuw.js} +12 -12
- package/dist/assets/{sessionChangeSummary-NnxcqCTI.js → sessionChangeSummary-eIbpSfrO.js} +1 -1
- package/dist/assets/{sessionLookup-BrU3rFHJ.js → sessionLookup-myHe5ltu.js} +1 -1
- package/dist/assets/{sortable-tabs-strip-Fnfhf3K9.js → sortable-tabs-strip-BQtmHx9r.js} +1 -1
- package/dist/assets/src-CLN7Z-zx.css +2 -0
- package/dist/assets/store-DLCiZaA6.js +15 -0
- package/dist/assets/{terminalApi-xjqssKke.js → terminalApi-BxcdiduX.js} +1 -1
- package/dist/assets/{textarea-bHYxZtfH.js → textarea-CakKvqFw.js} +1 -1
- package/dist/assets/{tooltip-0T5jv0cu.js → tooltip-Cx5gTbdY.js} +1 -1
- package/dist/assets/uk-rwQrxeYM.js +15 -0
- package/dist/assets/{url-_z7evzdK.js → url-CDHnjlsm.js} +1 -1
- package/dist/assets/{useAppFontEffects-C02YFyAv.js → useAppFontEffects-CNeo0aZs.js} +59 -45
- package/dist/assets/{useAssistantUIStore-CMutVh9B.js → useAssistantUIStore-asNG6K7n.js} +1 -1
- package/dist/assets/useDesktopWindowControlsLayout-DBJ56qIo.js +1 -0
- package/dist/assets/useEffectiveDirectory-B4LvR8Gt.js +1 -0
- package/dist/assets/{useFontPreferences-B1JYyzpK.js → useFontPreferences-CUnQ4TVm.js} +1 -1
- package/dist/assets/useMobileNavigationStore-ZHJPxlHt.js +414 -0
- package/dist/assets/{useRuntimeAPIs-DSLXJybW.js → useRuntimeAPIs-DwLtO0c_.js} +1 -1
- package/dist/assets/useSessionAutoCleanup-BIVmrnYU.js +2 -0
- package/dist/assets/{useThemeSystem-DMzWVJaW.js → useThemeSystem-BlNUWH47.js} +1 -1
- package/dist/assets/useUIStore-CQYKJnrg.js +1 -0
- package/dist/assets/{useWorkerHighlightedLines-C9z0ML1z.js → useWorkerHighlightedLines-CJZbJDW3.js} +2 -2
- package/dist/assets/{vendor-base-ui-CnHfUmDN.js → vendor-base-ui-CDjyofeD.js} +1 -1
- package/dist/assets/{vendor-cmdk-CeAGfrLo.js → vendor-cmdk-BFH0UpXX.js} +1 -1
- package/dist/assets/{vendor-dnd-kit-accessibility-BY5LhhUB.js → vendor-dnd-kit-accessibility-BrR3AKvM.js} +1 -1
- package/dist/assets/{vendor-dnd-kit-core-CvWxUPdb.js → vendor-dnd-kit-core-CNfdvk6H.js} +1 -1
- package/dist/assets/{vendor-dnd-kit-sortable-hHdP9lLb.js → vendor-dnd-kit-sortable-DQUaTeGj.js} +1 -1
- package/dist/assets/{vendor-framer-motion-DFy_BSVd.js → vendor-framer-motion-4dogsUk3.js} +1 -1
- package/dist/assets/{vendor-legendapp-list-WE32lwNk.js → vendor-legendapp-list-BU7MdPZR.js} +1 -1
- package/dist/assets/{vendor-markstream-react-DX55XLGO.js → vendor-markstream-react-qHC2FykU.js} +3 -3
- package/dist/assets/vendor-opencode-client-BOe2qpQb.js +12 -0
- package/dist/assets/{vendor-pierre-diffs-DX7XTPG3.js → vendor-pierre-diffs-CUfqC003.js} +1 -1
- package/dist/assets/{vendor-react-DLPElpoQ.js → vendor-react-C94A0AHl.js} +1 -1
- package/dist/assets/{vendor-react-drawio-ECtEwvbc.js → vendor-react-drawio-FVlWqKVE.js} +1 -1
- package/dist/assets/{vendor-reactuses-core-BnW6GxJt.js → vendor-reactuses-core-C2A3EjUi.js} +1 -1
- package/dist/assets/{vendor-sonner-DVzioF3d.js → vendor-sonner-DNqHmUQs.js} +1 -1
- package/dist/assets/{vendor-stream-diffs-DWy3xSmp.js → vendor-stream-diffs-CwbKsmlv.js} +2 -2
- package/dist/assets/{vendor-tanstack-react-query-D7pys_c9.js → vendor-tanstack-react-query-D0iFK57C.js} +1 -1
- package/dist/assets/{vendor-tanstack-react-virtual-tlDgH6PG.js → vendor-tanstack-react-virtual-B2kV6cnT.js} +1 -1
- package/dist/assets/{vendor-yaml-DIcAK3EC.js → vendor-yaml-C9KlJAlj.js} +37 -37
- package/dist/assets/{vendor-zustand-B4dlGEM2.js → vendor-zustand-BqLKf6ZY.js} +1 -1
- package/dist/assets/zh-CN-BvmBDnkD.js +15 -0
- package/dist/assets/zh-TW-9wcHTX0y.js +15 -0
- package/dist/index.html +13 -13
- package/dist/mini-chat.html +13 -13
- package/dist/mobile.html +13 -13
- package/package.json +2 -2
- package/server/index.js +392 -20
- package/server/lib/assistants/DOCUMENTATION.md +26 -21
- package/server/lib/assistants/assign.js +2 -1
- package/server/lib/assistants/contact-store.js +37 -19
- package/server/lib/assistants/contracts.js +11 -1
- package/server/lib/assistants/projection-history.test.js +454 -0
- package/server/lib/assistants/routes.js +11 -5
- package/server/lib/assistants/service.js +850 -294
- package/server/lib/assistants/service.test.js +588 -274
- package/server/lib/conversations/DOCUMENTATION.md +5 -5
- package/server/lib/conversations/service.js +87 -57
- package/server/lib/conversations/service.test.js +132 -100
- package/server/lib/conversations/validation.js +11 -1
- package/server/lib/event-stream/directory-ws-bridge.js +13 -2
- package/server/lib/event-stream/global-hub.js +51 -5
- package/server/lib/event-stream/runtime.js +57 -20
- package/server/lib/event-stream/runtime.test.js +112 -0
- package/server/lib/llm/DOCUMENTATION.md +95 -84
- package/server/lib/llm/catalog.js +111 -45
- package/server/lib/llm/catalog.test.js +121 -59
- package/server/lib/llm/completions.js +41 -12
- package/server/lib/llm/completions.test.js +45 -4
- package/server/lib/llm/generate.js +516 -453
- package/server/lib/llm/generate.test.js +705 -484
- package/server/lib/llm/routes.js +8 -4
- package/server/lib/message-queue/DOCUMENTATION.md +5 -5
- package/server/lib/message-queue/opencode-adapter.js +191 -104
- package/server/lib/message-queue/opencode-adapter.test.js +328 -58
- package/server/lib/message-queue/runtime.js +15 -2
- package/server/lib/message-queue/runtime.test.js +6 -6
- package/server/lib/message-queue/worker.js +7 -1
- package/server/lib/notifications/runtime.js +5 -0
- package/server/lib/opencode/DOCUMENTATION.md +103 -16
- package/server/lib/opencode/agent-document.d.ts +28 -0
- package/server/lib/opencode/agent-document.js +280 -0
- package/server/lib/opencode/agent-document.test.js +137 -0
- package/server/lib/opencode/agents.js +96 -0
- package/server/lib/opencode/auth-state-runtime.js +5 -0
- package/server/lib/opencode/bootstrap-runtime.js +2 -0
- package/server/lib/opencode/config-entity-routes.js +111 -102
- package/server/lib/opencode/config-entity-routes.test.js +123 -10
- package/server/lib/opencode/config-hot-reload.integration.test.js +105 -0
- package/server/lib/opencode/ensure-cli.js +238 -0
- package/server/lib/opencode/ensure-cli.test.js +119 -0
- package/server/lib/opencode/env-runtime.js +208 -111
- package/server/lib/opencode/env-runtime.test.js +211 -14
- package/server/lib/opencode/feature-routes-runtime.js +80 -5
- package/server/lib/opencode/feature-routes-runtime.test.js +18 -0
- package/server/lib/opencode/http-server-connections.js +98 -0
- package/server/lib/opencode/http-server-connections.test.js +321 -0
- package/server/lib/opencode/lifecycle.js +539 -95
- package/server/lib/opencode/lifecycle.test.js +698 -6
- package/server/lib/opencode/managed-capabilities-runtime.js +15 -2
- package/server/lib/opencode/managed-capabilities-runtime.test.js +1 -0
- package/server/lib/opencode/network-runtime.js +28 -16
- package/server/lib/opencode/network-runtime.test.js +68 -4
- package/server/lib/opencode/openchamber-routes.js +7 -1
- package/server/lib/opencode/opencode2-pin.js +139 -0
- package/server/lib/opencode/opencode2-pin.test.js +88 -0
- package/server/lib/opencode/opencode2-sidecar.e2e.test.js +326 -0
- package/server/lib/opencode/owned-runtime-upgrade.js +431 -0
- package/server/lib/opencode/owned-runtime-upgrade.test.js +160 -0
- package/server/lib/opencode/plugin-compatibility.js +15 -0
- package/server/lib/opencode/plugin-compatibility.test.js +21 -0
- package/server/lib/opencode/plugin-routes.js +3 -18
- package/server/lib/opencode/plugin-routes.test.js +9 -9
- package/server/lib/opencode/plugins.js +4 -3
- package/server/lib/opencode/plugins.test.js +12 -0
- package/server/lib/opencode/provider-catalog.js +58 -12
- package/server/lib/opencode/provider-catalog.test.js +48 -0
- package/server/lib/opencode/proxy.js +368 -28
- package/server/lib/opencode/proxy.test.js +338 -0
- package/server/lib/opencode/routes.js +303 -76
- package/server/lib/opencode/routes.test.js +315 -50
- package/server/lib/opencode/runtime-contract.js +401 -0
- package/server/lib/opencode/runtime-contract.test.js +214 -0
- package/server/lib/opencode/server-opencode-fetch.js +242 -0
- package/server/lib/opencode/server-opencode-fetch.test.js +130 -0
- package/server/lib/opencode/server-utils-runtime.js +35 -0
- package/server/lib/opencode/shared-service.integration.test.js +66 -0
- package/server/lib/opencode/shared-service.js +147 -0
- package/server/lib/opencode/shared-service.test.js +93 -0
- package/server/lib/opencode/shared.js +3 -3
- package/server/lib/opencode/shutdown-runtime.js +15 -6
- package/server/lib/opencode/shutdown-runtime.test.js +49 -1
- package/server/lib/opencode/skill-routes.js +26 -40
- package/server/lib/opencode/skill-routes.test.js +71 -7
- package/server/lib/opencode/skills.test.js +15 -0
- package/server/lib/opencode/startup-pipeline-runtime.js +4 -0
- package/server/lib/opencode/static-routes-runtime.js +3 -1
- package/server/lib/opencode/static-routes-runtime.test.js +33 -0
- package/server/lib/opencode/v1-migration-gate.js +157 -0
- package/server/lib/opencode/v1-migration-gate.test.js +111 -0
- package/server/lib/opencode/v2-client.js +60 -0
- package/server/lib/opencode/v2-plugin-host-shim/index.mjs +155 -0
- package/server/lib/opencode/v2-plugin-host-shim/package.json +4 -0
- package/server/lib/opencode/watcher.js +2 -1
- package/server/lib/opencode/watcher.test.js +1 -1
- package/server/lib/permission-auto-accept/DOCUMENTATION.md +5 -5
- package/server/lib/permission-auto-accept/runtime.js +14 -7
- package/server/lib/permission-auto-accept/runtime.test.js +27 -12
- package/server/lib/relay/reasoning-projection.e2e.test.ts +22 -7
- package/server/lib/scheduled-tasks/DOCUMENTATION.md +79 -39
- package/server/lib/scheduled-tasks/managed-tool-route.js +31 -1
- package/server/lib/scheduled-tasks/managed-tool-route.test.js +23 -0
- package/server/lib/scheduled-tasks/routes.js +27 -0
- package/server/lib/scheduled-tasks/routes.test.js +94 -0
- package/server/lib/scheduled-tasks/runtime.js +381 -310
- package/server/lib/scheduled-tasks/runtime.test.js +600 -309
- package/server/lib/session-goal/DOCUMENTATION.md +173 -22
- package/server/lib/session-goal/capability.js +57 -0
- package/server/lib/session-goal/capability.test.js +33 -0
- package/server/lib/session-goal/routes.js +240 -2
- package/server/lib/session-goal/routes.test.js +211 -0
- package/server/lib/session-goal/runtime.js +1617 -113
- package/server/lib/session-goal/runtime.test.js +1500 -70
- package/server/lib/session-index/DOCUMENTATION.md +18 -15
- package/server/lib/session-index/event-ingest.js +89 -16
- package/server/lib/session-index/event-ingest.test.js +73 -0
- package/server/lib/session-index/host-authority-snapshot.js +92 -0
- package/server/lib/session-index/routes.host-archive.test.js +201 -0
- package/server/lib/session-index/routes.js +63 -10
- package/server/lib/session-index/routes.test.js +8 -8
- package/server/lib/session-index/service.js +7 -1
- package/server/lib/session-index/sync-runtime.js +171 -41
- package/server/lib/session-index/sync-runtime.test.js +164 -9
- package/server/lib/session-metadata/DOCUMENTATION.md +86 -0
- package/server/lib/session-metadata/routes.js +193 -0
- package/server/lib/session-metadata/routes.test.js +156 -0
- package/server/lib/session-metadata/session-archive.d.ts +73 -0
- package/server/lib/session-metadata/session-archive.js +654 -0
- package/server/lib/session-metadata/session-archive.test.js +359 -0
- package/server/lib/session-metadata/session-metadata-store.d.ts +36 -0
- package/server/lib/session-metadata/session-metadata-store.js +375 -0
- package/server/lib/session-metadata/session-metadata-store.test.js +379 -0
- package/server/lib/session-metadata/session-projection.d.ts +41 -0
- package/server/lib/session-metadata/session-projection.js +255 -0
- package/server/lib/session-metadata/session-projection.test.js +64 -0
- package/server/lib/session-metadata/system-session.js +55 -0
- package/server/lib/session-metadata/system-session.test.js +55 -0
- package/server/lib/session-title/DOCUMENTATION.md +40 -7
- package/server/lib/session-title/native-runtime.test.js +167 -0
- package/server/lib/session-title/runtime.js +67 -42
- package/server/lib/session-title/session-access.js +46 -0
- package/server/lib/session-title/session-access.test.js +91 -0
- package/server/lib/session-turn-pages/DOCUMENTATION.md +12 -11
- package/server/lib/session-turn-pages/reconcile.service.js +1 -1
- package/server/lib/session-turn-pages/reconcile.service.test.js +16 -0
- package/server/lib/session-turn-pages/routes.js +123 -75
- package/server/lib/session-turn-pages/routes.test.js +566 -0
- package/server/lib/session-turn-pages/service.js +6 -2
- package/server/lib/session-turn-pages/service.test.js +34 -0
- package/server/lib/session-turn-pages/session-message-projection.d.ts +13 -0
- package/server/lib/session-turn-pages/session-message-projection.js +281 -0
- package/server/lib/small-model/DOCUMENTATION.md +101 -146
- package/server/lib/small-model/catalog.js +84 -54
- package/server/lib/small-model/catalog.test.js +111 -9
- package/server/lib/small-model/custom-api.js +68 -0
- package/server/lib/small-model/custom-api.test.js +64 -0
- package/server/lib/small-model/index.js +125 -241
- package/server/lib/small-model/resolve.js +35 -120
- package/server/lib/small-model/resolve.test.js +20 -110
- package/server/lib/small-model/routes.js +1 -3
- package/server/lib/small-model/summary-settings.test.js +157 -253
- package/server/opencode-proxy.test.js +63 -12
- package/dist/assets/AssistantView-BUveAgc4.js +0 -3
- package/dist/assets/MarkdownRenderer-BbrbDH6-.js +0 -2
- package/dist/assets/MobileDetailNavigation-B0aqKXd7.js +0 -1
- package/dist/assets/MobileSurface-DW7WfPsy.js +0 -2
- package/dist/assets/OverlayScrollbar-DrA0Vsg5.js +0 -2
- package/dist/assets/SettingsView-PkXIavr7.js +0 -25
- package/dist/assets/appThemeRegistry-D5Yxg4YF.js +0 -1
- package/dist/assets/collapsible-D5Phaykh.js +0 -1
- package/dist/assets/context-menu-CubSDW2g.js +0 -1
- package/dist/assets/es-DA3MqOo0.js +0 -15
- package/dist/assets/fr-Dbz0CdIA.js +0 -13
- package/dist/assets/gitApi-DXyC4MiV.js +0 -7
- package/dist/assets/insertionBoundaries-KlOVrHHt.js +0 -1
- package/dist/assets/ja-DumanVQA.js +0 -15
- package/dist/assets/ko-C0IkiUjQ.js +0 -15
- package/dist/assets/main-BPS5ylib.js +0 -2
- package/dist/assets/main-Cpd9VWYs.js +0 -169
- package/dist/assets/markdown-worker-CptoICmq.js +0 -2
- package/dist/assets/miniChat-B8_KLWiY.js +0 -2
- package/dist/assets/mobile-CtktKrXn.js +0 -2
- package/dist/assets/multirun-CYfP9Cfm.js +0 -4
- package/dist/assets/pl-B9No6MQp.js +0 -15
- package/dist/assets/platform-0w_Q9_ji.js +0 -2
- package/dist/assets/projectMeta-S1hJ7oBp.js +0 -3
- package/dist/assets/pt-BR-DyQ0WTDh.js +0 -15
- package/dist/assets/renderElectronMiniChatApp-iK14LWm8.js +0 -2
- package/dist/assets/renderMobileApp-DORLPWnb.js +0 -28
- package/dist/assets/src-rS3zCcsC.css +0 -2
- package/dist/assets/store-5B_LDnLM.js +0 -15
- package/dist/assets/uk-C_1KkqyP.js +0 -15
- package/dist/assets/useDesktopWindowControlsLayout-Dnr-jX0C.js +0 -1
- package/dist/assets/useEffectiveDirectory-CZLLyarc.js +0 -1
- package/dist/assets/useMobileNavigationStore-CoCiqNgm.js +0 -413
- package/dist/assets/useSessionAutoCleanup-xQyETQkG.js +0 -2
- package/dist/assets/useUIStore-Bxv3f23A.js +0 -1
- package/dist/assets/vendor-opencode-sdk-C07HQypa.js +0 -7
- package/dist/assets/zh-CN-uWILgBdt.js +0 -15
- package/dist/assets/zh-TW-MYfdvhbD.js +0 -15
- package/server/lib/small-model/call.js +0 -427
- package/server/lib/small-model/call.test.js +0 -382
- package/server/lib/small-model/opencode-session.js +0 -339
- package/server/lib/small-model/opencode-session.test.js +0 -177
|
@@ -3,6 +3,8 @@ import fs from 'node:fs';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { mergePathValues } from './path-utils.js';
|
|
6
|
+
import { PINNED_OPENCODE2_VERSION, isAcceptableOpenCode2HealthVersion, isOpenCode1xVersion } from './opencode2-pin.js';
|
|
7
|
+
import { ensurePinnedOpenCode2Cli, installedOpenCode2BinaryPath, readOpenCode2BinaryVersion } from './ensure-cli.js';
|
|
6
8
|
|
|
7
9
|
export const createOpenCodeEnvRuntime = (deps) => {
|
|
8
10
|
const {
|
|
@@ -12,6 +14,9 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
12
14
|
} = deps;
|
|
13
15
|
const runSpawnSync = typeof deps.spawnSync === 'function' ? deps.spawnSync : spawnSync;
|
|
14
16
|
const resolveHomeDir = typeof deps.homedir === 'function' ? deps.homedir : () => os.homedir();
|
|
17
|
+
const ensurePinnedCli = typeof deps.ensurePinnedOpenCode2Cli === 'function'
|
|
18
|
+
? deps.ensurePinnedOpenCode2Cli
|
|
19
|
+
: ensurePinnedOpenCode2Cli;
|
|
15
20
|
|
|
16
21
|
const parseNullSeparatedEnvSnapshot = (raw) => {
|
|
17
22
|
if (typeof raw !== 'string' || raw.length === 0) {
|
|
@@ -275,41 +280,20 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
275
280
|
return normalized.endsWith(`${path.sep}programs${path.sep}opencode${path.sep}opencode.exe`);
|
|
276
281
|
};
|
|
277
282
|
|
|
278
|
-
const
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
for (const root of roots) {
|
|
289
|
-
for (const name of names) {
|
|
290
|
-
candidates.push(path.join(root, name));
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return candidates;
|
|
294
|
-
};
|
|
295
|
-
|
|
296
|
-
const resolveBundledOpenCodeCliPath = () => {
|
|
297
|
-
for (const candidate of bundledOpenCodeCliCandidates()) {
|
|
298
|
-
if (isExecutable(candidate) && !isWindowsOpenCodeDesktopAppPath(candidate)) {
|
|
299
|
-
return candidate;
|
|
300
|
-
}
|
|
283
|
+
const resolveInstalledOpenCodeCliPath = () => {
|
|
284
|
+
const installed = installedOpenCode2BinaryPath(PINNED_OPENCODE2_VERSION, {
|
|
285
|
+
env: process.env,
|
|
286
|
+
homedir: resolveHomeDir,
|
|
287
|
+
platform: process.platform,
|
|
288
|
+
});
|
|
289
|
+
if (isExecutable(installed) && !isWindowsOpenCodeDesktopAppPath(installed)) {
|
|
290
|
+
clearWslOpencodeResolution();
|
|
291
|
+
state.resolvedOpencodeBinarySource = 'installed';
|
|
292
|
+
return installed;
|
|
301
293
|
}
|
|
302
294
|
return null;
|
|
303
295
|
};
|
|
304
296
|
|
|
305
|
-
const bundledOpenCodeCliFallback = () => {
|
|
306
|
-
const bundled = resolveBundledOpenCodeCliPath();
|
|
307
|
-
if (!bundled) return null;
|
|
308
|
-
clearWslOpencodeResolution();
|
|
309
|
-
state.resolvedOpencodeBinarySource = 'bundled';
|
|
310
|
-
return bundled;
|
|
311
|
-
};
|
|
312
|
-
|
|
313
297
|
const clearWslOpencodeResolution = () => {
|
|
314
298
|
state.useWslForOpencode = false;
|
|
315
299
|
state.resolvedWslBinary = null;
|
|
@@ -330,6 +314,20 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
330
314
|
return trimmed;
|
|
331
315
|
};
|
|
332
316
|
|
|
317
|
+
const acceptOpenCodeV2Candidate = (candidate, source) => {
|
|
318
|
+
if (typeof candidate !== 'string' || !candidate.trim()) return null;
|
|
319
|
+
if (!isExecutable(candidate) || isWindowsOpenCodeDesktopAppPath(candidate) || isMacOpenCodeAppBundlePath(candidate)) {
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
const version = readOpenCode2BinaryVersion(candidate);
|
|
323
|
+
if (!isAcceptableOpenCode2HealthVersion(version)) {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
clearWslOpencodeResolution();
|
|
327
|
+
state.resolvedOpencodeBinarySource = source;
|
|
328
|
+
return candidate;
|
|
329
|
+
};
|
|
330
|
+
|
|
333
331
|
const resolveOpencodeCliPath = () => {
|
|
334
332
|
const explicit = [
|
|
335
333
|
process.env.OPENCODE_BINARY,
|
|
@@ -341,118 +339,114 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
341
339
|
.filter(Boolean);
|
|
342
340
|
|
|
343
341
|
for (const candidate of explicit) {
|
|
344
|
-
if (
|
|
345
|
-
|
|
346
|
-
state.resolvedOpencodeBinarySource = 'env';
|
|
347
|
-
return candidate;
|
|
342
|
+
if (isWindowsOpenCodeDesktopAppPath(candidate) || isMacOpenCodeAppBundlePath(candidate)) {
|
|
343
|
+
continue;
|
|
348
344
|
}
|
|
345
|
+
if (!isExecutable(candidate)) continue;
|
|
346
|
+
const version = readOpenCode2BinaryVersion(candidate);
|
|
347
|
+
if (isOpenCode1xVersion(version)) {
|
|
348
|
+
// Inherited OPENCODE_BINARY often points at a still-installed 1.x.
|
|
349
|
+
// Skip it and keep looking; never overwrite that binary.
|
|
350
|
+
console.warn(`Skipping OpenCode 1.x at ${candidate} (${version}); looking for v2.`);
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
const accepted = acceptOpenCodeV2Candidate(candidate, 'env');
|
|
354
|
+
if (accepted) return accepted;
|
|
349
355
|
}
|
|
350
356
|
|
|
351
|
-
//
|
|
352
|
-
//
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
state.resolvedOpencodeBinarySource = 'path';
|
|
358
|
-
return resolvedFromPath;
|
|
357
|
+
// Match master: reuse a globally installed CLI. Official v2 is `opencode`;
|
|
358
|
+
// Skip 1.x binaries by version; auto-discovery uses only the official name.
|
|
359
|
+
for (const name of ['opencode']) {
|
|
360
|
+
const resolvedFromPath = searchPathFor(name);
|
|
361
|
+
const accepted = acceptOpenCodeV2Candidate(resolvedFromPath, 'path');
|
|
362
|
+
if (accepted) return accepted;
|
|
359
363
|
}
|
|
360
364
|
|
|
361
365
|
const home = resolveHomeDir();
|
|
362
|
-
const unixFallbacks = [
|
|
363
|
-
path.join(home, '.opencode', 'bin',
|
|
364
|
-
path.join(home, '.bun', 'bin',
|
|
365
|
-
path.join(home, '.local', 'bin',
|
|
366
|
-
path.join(home, 'bin',
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
];
|
|
366
|
+
const unixFallbacks = ['opencode'].flatMap((name) => [
|
|
367
|
+
path.join(home, '.opencode', 'bin', name),
|
|
368
|
+
path.join(home, '.bun', 'bin', name),
|
|
369
|
+
path.join(home, '.local', 'bin', name),
|
|
370
|
+
path.join(home, 'bin', name),
|
|
371
|
+
`/opt/homebrew/bin/${name}`,
|
|
372
|
+
`/usr/local/bin/${name}`,
|
|
373
|
+
`/home/linuxbrew/.linuxbrew/bin/${name}`,
|
|
374
|
+
`/usr/bin/${name}`,
|
|
375
|
+
`/bin/${name}`,
|
|
376
|
+
]);
|
|
373
377
|
|
|
374
378
|
const winFallbacks = (() => {
|
|
375
379
|
const userProfile = process.env.USERPROFILE || home;
|
|
376
380
|
const appData = process.env.APPDATA || '';
|
|
377
381
|
const localAppData = process.env.LOCALAPPDATA || '';
|
|
378
382
|
const programData = process.env.ProgramData || 'C:\\ProgramData';
|
|
379
|
-
|
|
380
383
|
const programFiles = process.env.ProgramFiles || 'C:\\Program Files';
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
path.join(userProfile, '.opencode', 'bin'
|
|
384
|
-
path.join(
|
|
385
|
-
path.join(
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
path.join(
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
path.join(programData, 'chocolatey', 'bin', 'opencode.exe'),
|
|
392
|
-
path.join(programData, 'chocolatey', 'bin', 'opencode.cmd'),
|
|
393
|
-
path.join(userProfile, '.bun', 'bin', 'opencode.exe'),
|
|
394
|
-
path.join(userProfile, '.bun', 'bin', 'opencode.cmd'),
|
|
395
|
-
].filter(Boolean);
|
|
384
|
+
const names = ['opencode.exe', 'opencode.cmd'];
|
|
385
|
+
const dirs = [
|
|
386
|
+
path.join(userProfile, '.opencode', 'bin'),
|
|
387
|
+
path.join(appData, 'npm'),
|
|
388
|
+
path.join(programFiles, 'nodejs'),
|
|
389
|
+
path.join(userProfile, 'scoop', 'shims'),
|
|
390
|
+
path.join(programData, 'chocolatey', 'bin'),
|
|
391
|
+
path.join(userProfile, '.bun', 'bin'),
|
|
392
|
+
];
|
|
393
|
+
return dirs.flatMap((dir) => names.map((name) => path.join(dir, name))).filter(Boolean);
|
|
396
394
|
})();
|
|
397
395
|
|
|
398
396
|
const fallbacks = process.platform === 'win32' ? winFallbacks : unixFallbacks;
|
|
399
397
|
for (const candidate of fallbacks) {
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
state.resolvedOpencodeBinarySource = 'fallback';
|
|
403
|
-
return candidate;
|
|
404
|
-
}
|
|
398
|
+
const accepted = acceptOpenCodeV2Candidate(candidate, 'fallback');
|
|
399
|
+
if (accepted) return accepted;
|
|
405
400
|
}
|
|
406
401
|
|
|
407
402
|
if (process.platform === 'win32') {
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
.
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
403
|
+
for (const name of ['opencode']) {
|
|
404
|
+
try {
|
|
405
|
+
const result = runSpawnSync('where', [name], {
|
|
406
|
+
encoding: 'utf8',
|
|
407
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
408
|
+
windowsHide: true,
|
|
409
|
+
});
|
|
410
|
+
if (result.status === 0) {
|
|
411
|
+
const lines = (result.stdout || '')
|
|
412
|
+
.split(/\r?\n/)
|
|
413
|
+
.map((line) => line.trim())
|
|
414
|
+
.filter(Boolean);
|
|
415
|
+
for (const line of lines) {
|
|
416
|
+
const accepted = acceptOpenCodeV2Candidate(line, 'where');
|
|
417
|
+
if (accepted) return accepted;
|
|
418
|
+
}
|
|
424
419
|
}
|
|
420
|
+
} catch {
|
|
425
421
|
}
|
|
426
|
-
} catch {
|
|
427
422
|
}
|
|
428
423
|
// Do not auto-detect OpenCode from WSL. OpenCode sessions are keyed by
|
|
429
424
|
// server-visible directories, and mixing Windows paths with WSL paths
|
|
430
425
|
// creates duplicate/missing project state in the desktop app.
|
|
431
|
-
return
|
|
426
|
+
return resolveInstalledOpenCodeCliPath();
|
|
432
427
|
}
|
|
433
428
|
|
|
434
429
|
const shells = [process.env.SHELL, '/bin/zsh', '/bin/bash', '/bin/sh'].filter(Boolean);
|
|
435
|
-
for (const
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
return found;
|
|
430
|
+
for (const name of ['opencode']) {
|
|
431
|
+
for (const shell of shells) {
|
|
432
|
+
if (!isExecutable(shell)) continue;
|
|
433
|
+
try {
|
|
434
|
+
const result = runSpawnSync(shell, ['-lic', `command -v ${name}`], {
|
|
435
|
+
encoding: 'utf8',
|
|
436
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
437
|
+
windowsHide: true,
|
|
438
|
+
});
|
|
439
|
+
if (result.status === 0) {
|
|
440
|
+
const found = (result.stdout || '').trim().split(/\s+/).pop() || '';
|
|
441
|
+
const accepted = acceptOpenCodeV2Candidate(found, 'shell');
|
|
442
|
+
if (accepted) return accepted;
|
|
449
443
|
}
|
|
444
|
+
} catch {
|
|
450
445
|
}
|
|
451
|
-
} catch {
|
|
452
446
|
}
|
|
453
447
|
}
|
|
454
448
|
|
|
455
|
-
return
|
|
449
|
+
return resolveInstalledOpenCodeCliPath();
|
|
456
450
|
};
|
|
457
451
|
|
|
458
452
|
const resolveNodeCliPath = () => {
|
|
@@ -912,7 +906,7 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
912
906
|
const createConfiguredOpencodeBinaryError = (raw, normalized) => {
|
|
913
907
|
const configured = typeof raw === 'string' ? raw.trim() : '';
|
|
914
908
|
const candidate = typeof normalized === 'string' && normalized.trim().length > 0 ? normalized.trim() : configured;
|
|
915
|
-
const messageSuffix = 'OpenChamber needs the standalone
|
|
909
|
+
const messageSuffix = 'OpenChamber needs the standalone OpenCode v2 CLI (`opencode`). Install it and set settings.opencodeBinary to the CLI path, for example ~/.opencode/bin/opencode, or leave the setting empty to use PATH lookup.';
|
|
916
910
|
const error = (() => {
|
|
917
911
|
if (isKnownOpenCodeDesktopAppPath(candidate) || isKnownOpenCodeDesktopAppPath(configured)) {
|
|
918
912
|
const platformName = process.platform === 'win32' ? 'Windows desktop app install' : 'macOS desktop app bundle';
|
|
@@ -1013,6 +1007,22 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
1013
1007
|
return null;
|
|
1014
1008
|
}
|
|
1015
1009
|
|
|
1010
|
+
if (normalized && isKnownOpenCodeDesktopAppPath(normalized)) {
|
|
1011
|
+
if (strict) {
|
|
1012
|
+
throw createConfiguredOpencodeBinaryError(raw, normalized);
|
|
1013
|
+
}
|
|
1014
|
+
console.warn(`Configured settings.opencodeBinary points at a desktop app, not the CLI: ${normalized}`);
|
|
1015
|
+
return null;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
if (normalized && isExecutable(normalized)) {
|
|
1019
|
+
const version = readOpenCode2BinaryVersion(normalized);
|
|
1020
|
+
if (isOpenCode1xVersion(version)) {
|
|
1021
|
+
console.warn(`Skipping configured OpenCode 1.x at ${normalized} (${version}); looking for v2.`);
|
|
1022
|
+
return null;
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1016
1026
|
if (normalized && isExecutable(normalized) && !isKnownOpenCodeDesktopAppPath(normalized)) {
|
|
1017
1027
|
clearWslOpencodeResolution();
|
|
1018
1028
|
process.env.OPENCODE_BINARY = normalized;
|
|
@@ -1043,12 +1053,16 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
1043
1053
|
if (state.useWslForOpencode) {
|
|
1044
1054
|
return state.resolvedOpencodeBinary;
|
|
1045
1055
|
}
|
|
1056
|
+
process.env.OPENCODE_BINARY = state.resolvedOpencodeBinary;
|
|
1046
1057
|
ensureOpencodeShimRuntime(state.resolvedOpencodeBinary);
|
|
1047
1058
|
return state.resolvedOpencodeBinary;
|
|
1048
1059
|
}
|
|
1049
1060
|
|
|
1050
1061
|
const existing = typeof process.env.OPENCODE_BINARY === 'string' ? process.env.OPENCODE_BINARY.trim() : '';
|
|
1051
|
-
if (existing && isExecutable(existing)) {
|
|
1062
|
+
if (existing && isExecutable(existing) && isOpenCode1xVersion(readOpenCode2BinaryVersion(existing))) {
|
|
1063
|
+
console.warn(`Ignoring OpenCode 1.x OPENCODE_BINARY at ${existing}; looking for v2.`);
|
|
1064
|
+
delete process.env.OPENCODE_BINARY;
|
|
1065
|
+
} else if (existing && isExecutable(existing)) {
|
|
1052
1066
|
clearWslOpencodeResolution();
|
|
1053
1067
|
state.resolvedOpencodeBinary = existing;
|
|
1054
1068
|
state.resolvedOpencodeBinarySource = state.resolvedOpencodeBinarySource || 'env';
|
|
@@ -1079,6 +1093,67 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
1079
1093
|
return null;
|
|
1080
1094
|
};
|
|
1081
1095
|
|
|
1096
|
+
// Last-resort only: used after pin install fails. Never consulted by resolveOpencodeCliPath.
|
|
1097
|
+
const resolveBundledOpenCodeCliPath = () => {
|
|
1098
|
+
const dirs = [];
|
|
1099
|
+
const envDir = typeof process.env.OPENCHAMBER_BUNDLED_OPENCODE_CLI_DIR === 'string'
|
|
1100
|
+
? process.env.OPENCHAMBER_BUNDLED_OPENCODE_CLI_DIR.trim()
|
|
1101
|
+
: '';
|
|
1102
|
+
if (envDir) {
|
|
1103
|
+
dirs.push(envDir);
|
|
1104
|
+
}
|
|
1105
|
+
if (typeof process.resourcesPath === 'string' && process.resourcesPath.trim()) {
|
|
1106
|
+
dirs.push(path.join(process.resourcesPath, 'opencode-cli'));
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
// Runtime and packaging use the official v2 executable name.
|
|
1110
|
+
const names = ['opencode', 'opencode.exe'];
|
|
1111
|
+
for (const dir of dirs) {
|
|
1112
|
+
for (const name of names) {
|
|
1113
|
+
const accepted = acceptOpenCodeV2Candidate(path.join(dir, name), 'bundled');
|
|
1114
|
+
if (accepted) {
|
|
1115
|
+
return accepted;
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
return null;
|
|
1120
|
+
};
|
|
1121
|
+
|
|
1122
|
+
const ensurePinnedOpenCode2CliEnv = async (options = {}) => {
|
|
1123
|
+
const discovered = state.resolvedOpencodeBinary || resolveOpencodeCliPath();
|
|
1124
|
+
const source = state.resolvedOpencodeBinarySource;
|
|
1125
|
+
const explicit = source === 'env' || source === 'settings';
|
|
1126
|
+
try {
|
|
1127
|
+
const result = await ensurePinnedCli({
|
|
1128
|
+
discoveredPath: discovered,
|
|
1129
|
+
preferDiscovered: explicit,
|
|
1130
|
+
env: process.env,
|
|
1131
|
+
homedir: resolveHomeDir,
|
|
1132
|
+
...options,
|
|
1133
|
+
});
|
|
1134
|
+
if (!result?.path) {
|
|
1135
|
+
return ensureOpencodeCliEnv();
|
|
1136
|
+
}
|
|
1137
|
+
if (result.path) {
|
|
1138
|
+
clearWslOpencodeResolution();
|
|
1139
|
+
process.env.OPENCODE_BINARY = result.path;
|
|
1140
|
+
state.resolvedOpencodeBinary = result.path;
|
|
1141
|
+
state.resolvedOpencodeBinarySource = result.source === 'installed' ? 'installed' : (state.resolvedOpencodeBinarySource || 'discovered');
|
|
1142
|
+
}
|
|
1143
|
+
return ensureOpencodeCliEnv();
|
|
1144
|
+
} catch (error) {
|
|
1145
|
+
const bundled = resolveBundledOpenCodeCliPath();
|
|
1146
|
+
if (!bundled) {
|
|
1147
|
+
throw error;
|
|
1148
|
+
}
|
|
1149
|
+
clearWslOpencodeResolution();
|
|
1150
|
+
process.env.OPENCODE_BINARY = bundled;
|
|
1151
|
+
state.resolvedOpencodeBinary = bundled;
|
|
1152
|
+
state.resolvedOpencodeBinarySource = 'bundled';
|
|
1153
|
+
return ensureOpencodeCliEnv();
|
|
1154
|
+
}
|
|
1155
|
+
};
|
|
1156
|
+
|
|
1082
1157
|
const resolveGitBinaryForSpawn = () => {
|
|
1083
1158
|
if (process.platform !== 'win32') {
|
|
1084
1159
|
return 'git';
|
|
@@ -1159,9 +1234,30 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
1159
1234
|
state.resolvedOpencodeBinary = null;
|
|
1160
1235
|
};
|
|
1161
1236
|
|
|
1237
|
+
/**
|
|
1238
|
+
* Pin managed launch to an explicit binary for the duration of an owned-cache
|
|
1239
|
+
* upgrade (ticket 12). Avoids rediscovery that would re-attach a global CLI.
|
|
1240
|
+
*/
|
|
1241
|
+
const forceResolvedOpenCodeBinary = (binaryPath, source = 'installed') => {
|
|
1242
|
+
const trimmed = typeof binaryPath === 'string' ? binaryPath.trim() : '';
|
|
1243
|
+
if (!trimmed) {
|
|
1244
|
+
const error = new Error('forceResolvedOpenCodeBinary requires a binary path');
|
|
1245
|
+
error.code = 'OPENCODE_BINARY_INVALID';
|
|
1246
|
+
throw error;
|
|
1247
|
+
}
|
|
1248
|
+
clearWslOpencodeResolution();
|
|
1249
|
+
process.env.OPENCODE_BINARY = trimmed;
|
|
1250
|
+
state.resolvedOpencodeBinary = trimmed;
|
|
1251
|
+
state.resolvedOpencodeBinarySource = source || 'installed';
|
|
1252
|
+
prependToPath(path.dirname(trimmed));
|
|
1253
|
+
ensureOpencodeShimRuntime(trimmed);
|
|
1254
|
+
return trimmed;
|
|
1255
|
+
};
|
|
1256
|
+
|
|
1162
1257
|
return {
|
|
1163
1258
|
applyLoginShellEnvSnapshot,
|
|
1164
1259
|
ensureOpencodeCliEnv,
|
|
1260
|
+
ensurePinnedOpenCode2CliEnv,
|
|
1165
1261
|
applyOpencodeBinaryFromSettings,
|
|
1166
1262
|
getLoginShellEnvSnapshot,
|
|
1167
1263
|
resolveOpencodeCliPath,
|
|
@@ -1170,5 +1266,6 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
|
|
1170
1266
|
searchPathFor,
|
|
1171
1267
|
resolveGitBinaryForSpawn,
|
|
1172
1268
|
clearResolvedOpenCodeBinary,
|
|
1269
|
+
forceResolvedOpenCodeBinary,
|
|
1173
1270
|
};
|
|
1174
1271
|
};
|