@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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { makeOpenCodeV2Client } from '../opencode/v2-client.js';
|
|
2
2
|
import { projectMessageSummaryDiffCounts } from '../event-stream/diff-summary.js';
|
|
3
3
|
import {
|
|
4
4
|
projectMessagesPayloadForReasoning,
|
|
@@ -18,6 +18,10 @@ import {
|
|
|
18
18
|
projectSlimParts,
|
|
19
19
|
SLIM_PARTS_PROJECTION,
|
|
20
20
|
} from './service.js';
|
|
21
|
+
import {
|
|
22
|
+
projectSessionMessage,
|
|
23
|
+
projectSessionMessageRecords as projectRecords,
|
|
24
|
+
} from './session-message-projection.js';
|
|
21
25
|
|
|
22
26
|
const TURNS_MIN = 1;
|
|
23
27
|
const TURNS_MAX = 10;
|
|
@@ -210,10 +214,57 @@ const requestSignal = (req, res) => {
|
|
|
210
214
|
return controller.signal;
|
|
211
215
|
};
|
|
212
216
|
|
|
217
|
+
/**
|
|
218
|
+
* Host outbound order: normalize → slim/L1 bounds → reasoning strip.
|
|
219
|
+
* Slim/reasoning must run on `{info, parts}` so native `content` cannot
|
|
220
|
+
* rebuild filtered parts or leak through info expansion.
|
|
221
|
+
*/
|
|
222
|
+
const projectTurnPageRecords = (records, includeReasoning) =>
|
|
223
|
+
projectMessagesPayloadForReasoning(projectSlimParts(projectRecords(records)), includeReasoning);
|
|
224
|
+
|
|
225
|
+
const projectReconcileRecords = (records, includeReasoning) =>
|
|
226
|
+
projectMessagesPayloadForReasoning(
|
|
227
|
+
projectMessageDiffSummaries(projectRecords(records)),
|
|
228
|
+
includeReasoning,
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
const createV2FetchPage = ({ buildOpenCodeUrl, getOpenCodeAuthHeaders, logger }) => {
|
|
232
|
+
return async ({ sessionID, before, limit, signal }) => {
|
|
233
|
+
const baseUrl = buildOpenCodeUrl('/', '').replace(/\/$/, '');
|
|
234
|
+
const headers = typeof getOpenCodeAuthHeaders === 'function' ? getOpenCodeAuthHeaders() : {};
|
|
235
|
+
const client = makeOpenCodeV2Client({ baseUrl, authHeaders: headers });
|
|
236
|
+
|
|
237
|
+
// Upstream rejects `order` together with `cursor` (400); the cursor
|
|
238
|
+
// already encodes the desc direction of the first page.
|
|
239
|
+
const result = await client.message.list({
|
|
240
|
+
sessionID,
|
|
241
|
+
...(Number.isFinite(limit) ? { limit } : {}),
|
|
242
|
+
...(typeof before === 'string' && before.length > 0 ? { cursor: before } : { order: 'desc' }),
|
|
243
|
+
}, { signal });
|
|
244
|
+
|
|
245
|
+
const items = Array.isArray(result?.data) ? result.data : null;
|
|
246
|
+
if (!items) {
|
|
247
|
+
logger?.warn?.('[session-turn-pages] message.list malformed payload');
|
|
248
|
+
const error = new Error('upstream');
|
|
249
|
+
error.code = 'upstream';
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const next = result?.cursor?.next;
|
|
254
|
+
const nextCursor = typeof next === 'string' && next.length > 0 ? next : null;
|
|
255
|
+
|
|
256
|
+
return {
|
|
257
|
+
records: items.slice().reverse(),
|
|
258
|
+
nextCursor,
|
|
259
|
+
complete: nextCursor == null,
|
|
260
|
+
};
|
|
261
|
+
};
|
|
262
|
+
};
|
|
263
|
+
|
|
213
264
|
const createSdkClient = ({ buildOpenCodeUrl, getOpenCodeAuthHeaders }) => {
|
|
214
265
|
const baseUrl = buildOpenCodeUrl('/', '').replace(/\/$/, '');
|
|
215
266
|
const headers = typeof getOpenCodeAuthHeaders === 'function' ? getOpenCodeAuthHeaders() : {};
|
|
216
|
-
return
|
|
267
|
+
return makeOpenCodeV2Client({ baseUrl, authHeaders: headers });
|
|
217
268
|
};
|
|
218
269
|
|
|
219
270
|
const throwUpstream = (logger, label) => {
|
|
@@ -223,89 +274,86 @@ const throwUpstream = (logger, label) => {
|
|
|
223
274
|
throw error;
|
|
224
275
|
};
|
|
225
276
|
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
...(Number.isFinite(limit) ? { limit } : {}),
|
|
234
|
-
...(typeof before === 'string' && before.length > 0 ? { before } : {}),
|
|
235
|
-
}, { signal });
|
|
236
|
-
|
|
237
|
-
if (result?.error) {
|
|
238
|
-
throwUpstream(logger, '[session-turn-pages] session.messages SDK error');
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
const data = result?.data;
|
|
242
|
-
const records = Array.isArray(data)
|
|
243
|
-
? data
|
|
244
|
-
: Array.isArray(data?.items)
|
|
245
|
-
? data.items
|
|
246
|
-
: null;
|
|
247
|
-
if (!records) {
|
|
248
|
-
throwUpstream(logger, '[session-turn-pages] session.messages malformed payload');
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
const headerCursor = result?.response?.headers?.get?.('x-next-cursor');
|
|
252
|
-
const nextCursor = typeof headerCursor === 'string' && headerCursor.length > 0
|
|
253
|
-
? headerCursor
|
|
254
|
-
: null;
|
|
277
|
+
const getHttpStatus = (error) => {
|
|
278
|
+
const candidates = [error?.cause?.status, error?.status, error?.response?.status, error?.statusCode];
|
|
279
|
+
for (const value of candidates) {
|
|
280
|
+
if (Number.isFinite(value)) return value;
|
|
281
|
+
}
|
|
282
|
+
return undefined;
|
|
283
|
+
};
|
|
255
284
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
285
|
+
/**
|
|
286
|
+
* Real `@opencode/client` throws declared JSON bodies with `_tag`
|
|
287
|
+
* (e.g. MessageNotFoundError) — no HTTP status on the object. Also accept
|
|
288
|
+
* legacy status/code shapes from tests and older surfaces.
|
|
289
|
+
*/
|
|
290
|
+
const isNotFoundError = (error) => {
|
|
291
|
+
if (!error || typeof error !== 'object') return false;
|
|
292
|
+
const tag = error._tag ?? error.name;
|
|
293
|
+
if (tag === 'MessageNotFoundError' || tag === 'SessionNotFoundError') return true;
|
|
294
|
+
if (getHttpStatus(error) === 404) return true;
|
|
295
|
+
const code = error.code ?? error.type ?? error.error?.code ?? error.error?.type ?? error.error?._tag;
|
|
296
|
+
return code === 'not_found'
|
|
297
|
+
|| code === 'NotFound'
|
|
298
|
+
|| code === 'MessageNotFoundError'
|
|
299
|
+
|| code === 'SessionNotFoundError';
|
|
262
300
|
};
|
|
263
301
|
|
|
302
|
+
const isAbortError = (error) => (
|
|
303
|
+
error?.name === 'AbortError'
|
|
304
|
+
|| error?.code === 'aborted'
|
|
305
|
+
|| error?.cause?.name === 'AbortError'
|
|
306
|
+
);
|
|
307
|
+
|
|
264
308
|
const createSdkFetchMessage = ({ buildOpenCodeUrl, getOpenCodeAuthHeaders, logger }) => {
|
|
265
|
-
return async ({ sessionID, messageID,
|
|
309
|
+
return async ({ sessionID, messageID, signal }) => {
|
|
266
310
|
const client = createSdkClient({ buildOpenCodeUrl, getOpenCodeAuthHeaders });
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
messageID,
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
error.code = 'not_found';
|
|
278
|
-
throw error;
|
|
311
|
+
let result;
|
|
312
|
+
try {
|
|
313
|
+
result = await client.session.message({ sessionID, messageID }, { signal });
|
|
314
|
+
} catch (error) {
|
|
315
|
+
// Preserve abort so routes map 499; never fold into upstream 502.
|
|
316
|
+
if (isAbortError(error) || signal?.aborted) throw error;
|
|
317
|
+
if (isNotFoundError(error)) {
|
|
318
|
+
const notFound = new Error('not_found');
|
|
319
|
+
notFound.code = 'not_found';
|
|
320
|
+
throw notFound;
|
|
279
321
|
}
|
|
280
322
|
throwUpstream(logger, '[session-turn-pages] session.message SDK error');
|
|
281
323
|
}
|
|
282
324
|
|
|
283
|
-
const data = result?.data;
|
|
325
|
+
const data = result?.data ?? result;
|
|
284
326
|
if (!data || typeof data !== 'object' || Array.isArray(data)) {
|
|
285
327
|
throwUpstream(logger, '[session-turn-pages] session.message malformed payload');
|
|
286
328
|
}
|
|
287
|
-
|
|
329
|
+
const projected = projectSessionMessage(data);
|
|
330
|
+
// Control rows (idle / model-switched) are not chat messages.
|
|
331
|
+
if (!projected || !projected.info) {
|
|
332
|
+
const notFound = new Error('not_found');
|
|
333
|
+
notFound.code = 'not_found';
|
|
334
|
+
throw notFound;
|
|
335
|
+
}
|
|
336
|
+
return projected;
|
|
288
337
|
};
|
|
289
338
|
};
|
|
290
339
|
|
|
340
|
+
/**
|
|
341
|
+
* L3 diff source. v2 SessionMessageInfo has no summary.diffs; keep failure
|
|
342
|
+
* explicit until the parent lands an authoritative per-message diff API.
|
|
343
|
+
* Do not substitute working-tree / vcs.diff here.
|
|
344
|
+
*/
|
|
291
345
|
const createSdkFetchDiff = ({ buildOpenCodeUrl, getOpenCodeAuthHeaders, logger }) => {
|
|
292
346
|
return async ({ sessionID, messageID, directory, signal }) => {
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
throwUpstream(logger, '[session-changes] session.diff SDK error');
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
const data = result?.data;
|
|
305
|
-
if (!Array.isArray(data)) {
|
|
306
|
-
throwUpstream(logger, '[session-changes] session.diff malformed payload');
|
|
347
|
+
const payload = await createSdkFetchMessage({
|
|
348
|
+
buildOpenCodeUrl,
|
|
349
|
+
getOpenCodeAuthHeaders,
|
|
350
|
+
logger,
|
|
351
|
+
})({ sessionID, messageID, directory, signal });
|
|
352
|
+
const diffs = payload?.info?.summary?.diffs;
|
|
353
|
+
if (!Array.isArray(diffs)) {
|
|
354
|
+
throwUpstream(logger, '[session-changes] session.message summary.diffs unavailable (L3 source pending)');
|
|
307
355
|
}
|
|
308
|
-
return
|
|
356
|
+
return diffs;
|
|
309
357
|
};
|
|
310
358
|
};
|
|
311
359
|
|
|
@@ -441,7 +489,7 @@ export const registerSessionTurnPageRoutes = (app, dependencies = {}) => {
|
|
|
441
489
|
|
|
442
490
|
const needsDefaultFetch = !injectedService || !injectedReconcileService;
|
|
443
491
|
const defaultFetchPage = needsDefaultFetch
|
|
444
|
-
?
|
|
492
|
+
? createV2FetchPage({ buildOpenCodeUrl, getOpenCodeAuthHeaders, logger })
|
|
445
493
|
: null;
|
|
446
494
|
|
|
447
495
|
const service = injectedService ?? createSessionTurnPageService({
|
|
@@ -514,8 +562,8 @@ export const registerSessionTurnPageRoutes = (app, dependencies = {}) => {
|
|
|
514
562
|
}
|
|
515
563
|
|
|
516
564
|
const includeReasoning = readIncludeReasoningQuery(req.query);
|
|
517
|
-
const records =
|
|
518
|
-
|
|
565
|
+
const records = projectReconcileRecords(
|
|
566
|
+
Array.isArray(result.records) ? result.records : [],
|
|
519
567
|
includeReasoning,
|
|
520
568
|
);
|
|
521
569
|
|
|
@@ -609,10 +657,10 @@ export const registerSessionTurnPageRoutes = (app, dependencies = {}) => {
|
|
|
609
657
|
|
|
610
658
|
// Turn-page responses (first packet and prepend) share slim-v1.
|
|
611
659
|
// Reconcile stays on the other route and keeps full parts.
|
|
612
|
-
//
|
|
660
|
+
// Normalize native SessionMessageInfo first, then slim, then reasoning strip.
|
|
613
661
|
const includeReasoning = readIncludeReasoningQuery(req.query);
|
|
614
|
-
const records =
|
|
615
|
-
|
|
662
|
+
const records = projectTurnPageRecords(
|
|
663
|
+
Array.isArray(result.records) ? result.records : [],
|
|
616
664
|
includeReasoning,
|
|
617
665
|
);
|
|
618
666
|
return res.status(200).json({
|
|
@@ -673,13 +721,13 @@ export const registerSessionTurnPageRoutes = (app, dependencies = {}) => {
|
|
|
673
721
|
projectMessagesPayloadForReasoning(projectExactMessagePayload(payload), includeReasoning),
|
|
674
722
|
);
|
|
675
723
|
} catch (error) {
|
|
676
|
-
if (error
|
|
724
|
+
if (isAbortError(error) || error?.code === 'aborted') {
|
|
677
725
|
if (!res.headersSent) {
|
|
678
726
|
return res.status(499).json({ error: SAFE_ERRORS.aborted });
|
|
679
727
|
}
|
|
680
728
|
return undefined;
|
|
681
729
|
}
|
|
682
|
-
if (error?.code === 'not_found') {
|
|
730
|
+
if (error?.code === 'not_found' || isNotFoundError(error)) {
|
|
683
731
|
if (!res.headersSent) {
|
|
684
732
|
return res.status(404).json({ error: 'not found', code: 'not_found' });
|
|
685
733
|
}
|