@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
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# Conversations Module
|
|
2
2
|
|
|
3
3
|
## Purpose
|
|
4
|
-
Server-owned conversation orchestration for OpenChamber. Provides an idempotent create-session-and-first-prompt workflow using `session.create` + `session.
|
|
4
|
+
Server-owned conversation orchestration for OpenChamber. Provides an idempotent create-session-and-first-prompt workflow using `session.create` + `session.prompt` (`delivery=steer`) through `@opencode-ai/sdk/v2` directory-scoped client, exposed as `POST /api/openchamber/conversations`. Host does not cache message body.
|
|
5
5
|
|
|
6
6
|
## Scope
|
|
7
7
|
- This module is OpenChamber feature logic, intentionally separate from OpenCode proxy/runtime internals.
|
|
8
8
|
- Registered in `feature-routes-runtime.js` before the generic OpenCode proxy.
|
|
9
9
|
- JSON request bodies are parsed by the explicit OpenChamber route allowlist in `core-routes.js`; conversation payloads allow up to 50 MB so data-URL attachments reach validation and the OpenCode SDK.
|
|
10
10
|
- Only accepts `input.type === 'prompt'`; shell/slash commands use the existing SDK sequence.
|
|
11
|
-
- `
|
|
11
|
+
- `prompt` + `delivery=steer` returns an inbox item immediately (does not wait for model completion).
|
|
12
12
|
|
|
13
13
|
## Operation Idempotency
|
|
14
14
|
|
|
@@ -33,7 +33,7 @@ The service calls `waitForOpenCodeReady(6000, 75)` (6s, matching proxy gate `REA
|
|
|
33
33
|
- `packages/web/server/lib/conversations/validation.js`
|
|
34
34
|
- Request validation and sanitization with strict whitelist
|
|
35
35
|
- Required: `input.type='prompt'`, `directory`, `messageID`, `model` (providerID/modelID), `parts` (non-empty array)
|
|
36
|
-
|
|
36
|
+
- Optional: `title`, `parentID`, `agent`, `variant`, `metadata`, `skills` (array of `{ id }`, sanitized before forwarding as native V2 skill attachments)
|
|
37
37
|
- **Rejected**: `delivery`, `format`, unknown top-level keys (whitelist enforcement)
|
|
38
38
|
- Part types: `text` (requires non-empty `text`), `file` (requires `mime`+`url`), `agent` (requires `name`)
|
|
39
39
|
- At least one content-carrying part (text/file/agent) required
|
|
@@ -51,7 +51,7 @@ The service calls `waitForOpenCodeReady(6000, 75)` (6s, matching proxy gate `REA
|
|
|
51
51
|
- Dependencies: `buildOpenCodeUrl`, `getOpenCodeAuthHeaders`, `markUserMessageSent`, `waitForOpenCodeReady`, `logger`
|
|
52
52
|
- Internal bounded timeouts: 30s create, 45s prompt, 6s readiness (all with `AbortSignal.timeout`)
|
|
53
53
|
- `session.create` only receives title/parentID/metadata/directory
|
|
54
|
-
- `session.
|
|
54
|
+
- `session.prompt` receives model/agent/variant/parts and `delivery: "steer"` — Host does not persist parts/text
|
|
55
55
|
- Calls `safeMark(markUserMessageSent)` (swallows errors) ONLY on: success, or ambiguous prompt outcomes
|
|
56
56
|
- All client-facing errors are sanitized
|
|
57
57
|
- Returns discriminated result (see Result Union below)
|
|
@@ -149,7 +149,7 @@ All prompt-phase results include `session` and `messageID` for client surface.
|
|
|
149
149
|
All SDK calls use internal bounded `AbortSignal.timeout`:
|
|
150
150
|
- Readiness wait: 6s
|
|
151
151
|
- `session.create`: 30s
|
|
152
|
-
- `session.
|
|
152
|
+
- `session.prompt`: 45s
|
|
153
153
|
|
|
154
154
|
## Error safety
|
|
155
155
|
- Client-facing errors are stable generic strings
|
|
@@ -1,15 +1,66 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OpenCode } from '@opencode/client';
|
|
2
2
|
|
|
3
3
|
// --- error classification ---
|
|
4
4
|
|
|
5
5
|
const isTransportError = (error) => {
|
|
6
6
|
if (!error) return true;
|
|
7
|
+
if (error.reason === 'Transport') return true;
|
|
7
8
|
if (error.name === 'TypeError' || error.name === 'FetchError' || error.name === 'AbortError') return true;
|
|
9
|
+
if (error.cause?.name === 'TypeError' || error.cause?.name === 'FetchError' || error.cause?.name === 'AbortError') return true;
|
|
8
10
|
const code = error.cause?.code || error.code;
|
|
9
11
|
if (code === 'ECONNREFUSED' || code === 'ENOTFOUND' || code === 'ECONNRESET' || code === 'ETIMEDOUT' || code === 'EPIPE') return true;
|
|
10
12
|
return false;
|
|
11
13
|
};
|
|
12
14
|
|
|
15
|
+
// v2 client throws raw data or ClientError; recover HTTP status when present.
|
|
16
|
+
const getHttpStatus = (error) => {
|
|
17
|
+
const candidates = [error?.cause?.status, error?.status, error?.response?.status];
|
|
18
|
+
for (const value of candidates) {
|
|
19
|
+
if (Number.isFinite(value)) return value;
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const classifyPromptFailure = (error) => {
|
|
25
|
+
if (isTransportError(error)) {
|
|
26
|
+
return { ambiguous: true, status: undefined };
|
|
27
|
+
}
|
|
28
|
+
const status = getHttpStatus(error);
|
|
29
|
+
if (Number.isFinite(status)) {
|
|
30
|
+
return { ambiguous: isRetryableHttpStatus(status), status };
|
|
31
|
+
}
|
|
32
|
+
// Declared v2 HTTP errors (400/401/404/409) throw JSON without a status field.
|
|
33
|
+
return { ambiguous: false, status: 400 };
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Map sanitized parts onto the official v2 prompt body (text/files/agents).
|
|
37
|
+
const toV2PromptInput = (sanitizedInput, sessionID) => {
|
|
38
|
+
const text = sanitizedInput.parts
|
|
39
|
+
.filter((part) => part.type === 'text')
|
|
40
|
+
.map((part) => part.text)
|
|
41
|
+
.join('\n');
|
|
42
|
+
const files = sanitizedInput.parts
|
|
43
|
+
.filter((part) => part.type === 'file')
|
|
44
|
+
.map((part) => ({
|
|
45
|
+
uri: part.url,
|
|
46
|
+
...(part.filename ? { name: part.filename } : {}),
|
|
47
|
+
}));
|
|
48
|
+
const agents = sanitizedInput.parts
|
|
49
|
+
.filter((part) => part.type === 'agent')
|
|
50
|
+
.map((part) => ({ name: part.name }));
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
sessionID,
|
|
54
|
+
id: sanitizedInput.messageID,
|
|
55
|
+
text,
|
|
56
|
+
...(files.length > 0 ? { files } : {}),
|
|
57
|
+
...(agents.length > 0 ? { agents } : {}),
|
|
58
|
+
...(sanitizedInput.skills?.length ? { skills: sanitizedInput.skills.map(({ id }) => ({ id, name: id })) } : {}),
|
|
59
|
+
...(sanitizedInput.metadata ? { metadata: sanitizedInput.metadata } : {}),
|
|
60
|
+
delivery: 'steer',
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
|
|
13
64
|
const isRetryableHttpStatus = (status) => {
|
|
14
65
|
if (!Number.isFinite(status)) return true;
|
|
15
66
|
return status === 408 || status === 429 || status >= 500;
|
|
@@ -84,7 +135,7 @@ export const createConversationsService = (deps) => {
|
|
|
84
135
|
|
|
85
136
|
const baseUrl = buildOpenCodeUrl('/', '').replace(/\/$/, '');
|
|
86
137
|
const authHeaders = getOpenCodeAuthHeaders();
|
|
87
|
-
return
|
|
138
|
+
return OpenCode.make({ baseUrl, headers: authHeaders });
|
|
88
139
|
};
|
|
89
140
|
|
|
90
141
|
const createAndPrompt = async ({ sanitizedInput } = {}) => {
|
|
@@ -99,19 +150,34 @@ export const createConversationsService = (deps) => {
|
|
|
99
150
|
const client = clientOrError;
|
|
100
151
|
|
|
101
152
|
// Phase 1: create session (30s timeout)
|
|
102
|
-
let
|
|
103
|
-
let upstreamStatus;
|
|
153
|
+
let session;
|
|
104
154
|
const createT = timeoutSignal(CREATE_TIMEOUT_MS);
|
|
105
155
|
try {
|
|
106
|
-
|
|
107
|
-
directory: sanitizedInput.directory,
|
|
156
|
+
session = await client.session.create({
|
|
157
|
+
location: { directory: sanitizedInput.directory },
|
|
108
158
|
...(sanitizedInput.title ? { title: sanitizedInput.title } : {}),
|
|
109
|
-
...(sanitizedInput.
|
|
110
|
-
...(sanitizedInput.
|
|
159
|
+
...(sanitizedInput.agent ? { agent: sanitizedInput.agent } : {}),
|
|
160
|
+
...(sanitizedInput.model ? {
|
|
161
|
+
model: {
|
|
162
|
+
id: sanitizedInput.model.modelID,
|
|
163
|
+
providerID: sanitizedInput.model.providerID,
|
|
164
|
+
...(sanitizedInput.variant ? { variant: sanitizedInput.variant } : {}),
|
|
165
|
+
},
|
|
166
|
+
} : {}),
|
|
111
167
|
}, {
|
|
112
168
|
signal: createT.signal,
|
|
113
169
|
});
|
|
114
170
|
} catch (error) {
|
|
171
|
+
const status = getHttpStatus(error);
|
|
172
|
+
if (Number.isFinite(status) && !isTransportError(error)) {
|
|
173
|
+
logger.warn(`[conversations] session.create client error (${status})`);
|
|
174
|
+
return {
|
|
175
|
+
ok: false,
|
|
176
|
+
phase: 'create',
|
|
177
|
+
error: safeErrorMessage('create'),
|
|
178
|
+
status,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
115
181
|
logger.warn('[conversations] session.create transport error');
|
|
116
182
|
return {
|
|
117
183
|
ok: false,
|
|
@@ -122,19 +188,7 @@ export const createConversationsService = (deps) => {
|
|
|
122
188
|
createT.clear();
|
|
123
189
|
}
|
|
124
190
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (sessionResult.error) {
|
|
128
|
-
logger.warn(`[conversations] session.create SDK error (${upstreamStatus || 'no status'})`);
|
|
129
|
-
return {
|
|
130
|
-
ok: false,
|
|
131
|
-
phase: 'create',
|
|
132
|
-
error: safeErrorMessage('create'),
|
|
133
|
-
...(Number.isFinite(upstreamStatus) ? { status: upstreamStatus } : {}),
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const sessionID = sessionResult?.data?.id;
|
|
191
|
+
const sessionID = session?.id;
|
|
138
192
|
if (!sessionID) {
|
|
139
193
|
logger.warn('[conversations] session.create returned no session ID');
|
|
140
194
|
return {
|
|
@@ -144,29 +198,17 @@ export const createConversationsService = (deps) => {
|
|
|
144
198
|
};
|
|
145
199
|
}
|
|
146
200
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
// Phase 2: promptAsync (45s timeout, 204, does not wait for model completion)
|
|
201
|
+
// Phase 2: v2 prompt + delivery=steer (45s timeout). Host only orchestrates
|
|
202
|
+
// create + first prompt; it does not cache message body as conversation content.
|
|
150
203
|
let promptResult;
|
|
151
204
|
const promptT = timeoutSignal(PROMPT_TIMEOUT_MS);
|
|
152
205
|
try {
|
|
153
|
-
promptResult = await client.session.
|
|
154
|
-
sessionID,
|
|
155
|
-
directory: sanitizedInput.directory,
|
|
156
|
-
messageID: sanitizedInput.messageID,
|
|
157
|
-
model: {
|
|
158
|
-
providerID: sanitizedInput.model.providerID,
|
|
159
|
-
modelID: sanitizedInput.model.modelID,
|
|
160
|
-
},
|
|
161
|
-
...(sanitizedInput.agent ? { agent: sanitizedInput.agent } : {}),
|
|
162
|
-
...(sanitizedInput.variant ? { variant: sanitizedInput.variant } : {}),
|
|
163
|
-
parts: sanitizedInput.parts,
|
|
164
|
-
}, {
|
|
206
|
+
promptResult = await client.session.prompt(toV2PromptInput(sanitizedInput, sessionID), {
|
|
165
207
|
signal: promptT.signal,
|
|
166
208
|
});
|
|
167
209
|
} catch (error) {
|
|
168
|
-
const ambiguous =
|
|
169
|
-
logger.warn(`[conversations]
|
|
210
|
+
const { ambiguous, status } = classifyPromptFailure(error);
|
|
211
|
+
logger.warn(`[conversations] prompt throw (ambiguous=${ambiguous})`);
|
|
170
212
|
if (ambiguous) {
|
|
171
213
|
safeMark(markUserMessageSent, sessionID, logger);
|
|
172
214
|
}
|
|
@@ -177,37 +219,25 @@ export const createConversationsService = (deps) => {
|
|
|
177
219
|
messageID: sanitizedInput.messageID,
|
|
178
220
|
ambiguous,
|
|
179
221
|
error: safeErrorMessage('prompt'),
|
|
222
|
+
...(Number.isFinite(status) ? { status } : {}),
|
|
180
223
|
};
|
|
181
224
|
} finally {
|
|
182
225
|
promptT.clear();
|
|
183
226
|
}
|
|
184
227
|
|
|
185
228
|
// SDK result shape { data, error, response }
|
|
186
|
-
|
|
187
|
-
const httpStatus = promptResult.response?.status;
|
|
188
|
-
const ambiguous = isAmbiguousPromptError(promptResult.error, promptResult.response);
|
|
189
|
-
logger.warn(`[conversations] promptAsync SDK error (${httpStatus || 'no status'}, ambiguous=${ambiguous})`);
|
|
190
|
-
if (ambiguous) {
|
|
191
|
-
safeMark(markUserMessageSent, sessionID, logger);
|
|
192
|
-
}
|
|
193
|
-
return {
|
|
194
|
-
ok: false,
|
|
195
|
-
phase: 'prompt',
|
|
196
|
-
session,
|
|
197
|
-
messageID: sanitizedInput.messageID,
|
|
198
|
-
ambiguous,
|
|
199
|
-
error: safeErrorMessage('prompt'),
|
|
200
|
-
...(Number.isFinite(httpStatus) ? { status: httpStatus } : {}),
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// promptAsync 204 success
|
|
229
|
+
// prompt success — return inbox item when present; never persist parts/text.
|
|
205
230
|
safeMark(markUserMessageSent, sessionID, logger);
|
|
206
231
|
|
|
232
|
+
const inbox = promptResult && typeof promptResult === 'object'
|
|
233
|
+
? promptResult
|
|
234
|
+
: undefined;
|
|
235
|
+
|
|
207
236
|
return {
|
|
208
237
|
ok: true,
|
|
209
238
|
session,
|
|
210
239
|
messageID: sanitizedInput.messageID,
|
|
240
|
+
...(inbox && (inbox.id || inbox.type) ? { inbox } : {}),
|
|
211
241
|
};
|
|
212
242
|
};
|
|
213
243
|
|