@aiworker/web 1.22.0 → 1.23.0
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 +4 -4
- package/bin/cli.js +14 -4
- package/bin/cli.test.js +165 -73
- package/bin/lib/cli-api-target.js +2 -2
- package/bin/lib/cli-args.js +119 -119
- package/bin/lib/cli-lifecycle.js +9 -9
- package/bin/lib/cli-network.js +3 -3
- package/bin/lib/cli-paths.js +3 -3
- package/bin/lib/cli-ports.js +2 -2
- package/bin/lib/cli-process.js +4 -4
- package/bin/lib/cli-startup.js +64 -15
- package/bin/lib/cli-tunnel-profiles.js +1 -1
- package/bin/lib/cli-tunnel-utils.js +2 -2
- package/bin/lib/commands-connect-url.js +19 -19
- package/bin/lib/commands-lifecycle.js +27 -27
- package/bin/lib/commands-logs.js +5 -5
- package/bin/lib/commands-models.js +1 -1
- package/bin/lib/commands-projects.js +1 -1
- package/bin/lib/commands-schedule.js +1 -1
- package/bin/lib/commands-serve.js +29 -29
- package/bin/lib/commands-session.js +1 -1
- package/bin/lib/commands-startup.js +45 -10
- package/bin/lib/commands-status.js +1 -1
- package/bin/lib/commands-tunnel.js +40 -40
- package/bin/lib/commands-update.js +1 -1
- package/bin/lib/commands-update.test.js +6 -6
- package/dist/assets/{CodeMirrorCommentWidgets-B3u7UIcE.js → CodeMirrorCommentWidgets-B1Gizi3a.js} +1 -1
- package/dist/assets/DiffView-DXjVsEOw.js +4 -0
- package/dist/assets/DirtyBranchSwitchDialog-aig6zJjg.js +1 -0
- package/dist/assets/FilesView-CJdG0-wk.js +17 -0
- package/dist/assets/GitView-BXsS3jG6.js +6 -0
- package/dist/assets/{JsonTreeView-B0BdZEHG.js → JsonTreeView-D_hpXBnF.js} +1 -1
- package/dist/assets/LinearIssuesView-BoUiLQG1.js +1 -0
- package/dist/assets/MarkdownImageGallery-B_B_a9KS.js +1 -0
- package/dist/assets/MarkdownRendererImpl-xgyyLiBM.js +12 -0
- package/dist/assets/OnboardingScreen-DIp84OWt.js +1 -0
- package/dist/assets/{PatchDiff-DvfqDql7.js → PatchDiff-8p6nLJaU.js} +1 -1
- package/dist/assets/PierreDiffViewer-DjC8nTk9.js +161 -0
- package/dist/assets/PlanView-CJTmOF6I.js +5 -0
- package/dist/assets/SettingsView-DD-JqIJx.js +28 -0
- package/dist/assets/{SettingsWindow-i45U1Cy1.js → SettingsWindow-Cpb4hM6q.js} +1 -1
- package/dist/assets/SymbolsNerdFontMono-Regular-aK5vsLov.woff2 +0 -0
- package/dist/assets/{ToolOutputDialog-BTwyh5OF.js → ToolOutputDialog-DfaKZXNU.js} +6 -6
- package/dist/assets/ToolPartDiffPreview-DtZLzrSK.js +8 -0
- package/dist/assets/{VirtualizedFileDiff-DD8lDVej.js → VirtualizedFileDiff-C8i9HpTB.js} +1 -1
- package/dist/assets/WalkthroughView-DeKMvZlL.js +4 -0
- package/dist/assets/{computeVirtualFileMetrics-BMIRgMHv.js → computeVirtualFileMetrics-BBI7ZwrC.js} +2 -2
- package/dist/assets/contextPanelEmbeddedChat-BdA6bdky.js +1 -0
- package/dist/assets/de-DCrsQ5zS.js +10 -0
- package/dist/assets/es-Dwv4YfH6.js +16 -0
- package/dist/assets/fr-BCWg4Cnx.js +14 -0
- package/dist/assets/ghostty-vt-DdA0Zryv.wasm +0 -0
- package/dist/assets/index-B68h5S5B.css +1 -0
- package/dist/assets/index-DVwMarHI.js +39 -0
- package/dist/assets/{index-CODwDsU_.js → index-jXSK5RrB.js} +1 -1
- package/dist/assets/{isDiffPlainText-BqayB8d3.js → isDiffPlainText-B_x_rVon.js} +1 -1
- package/dist/assets/{isFilePlainText-QfoiKJNY.js → isFilePlainText-DW_xMer1.js} +1 -1
- package/dist/assets/ja-Bruw3RYC.js +16 -0
- package/dist/assets/ko-idhXGF8j.js +16 -0
- package/dist/assets/main-BkyaQhJX.js +930 -0
- package/dist/assets/{main-C5DVOxc6.js → main-CzdPuL0s.js} +2 -2
- package/dist/assets/markdownCore-Cn4Tyejo.js +5 -0
- package/dist/assets/{miniChat-DUJ4irZc.js → miniChat-CCkqKOLp.js} +2 -2
- package/dist/assets/{mobile-CcaxB0n4.js → mobile-mvxTo055.js} +2 -2
- package/dist/assets/patchFileDiff-Csk4iNUi.js +13 -0
- package/dist/assets/pl-CGZWUqZJ.js +16 -0
- package/dist/assets/pt-BR-B8V7u7tA.js +16 -0
- package/dist/assets/renderElectronMiniChatApp-BxoyujA5.js +2 -0
- package/dist/assets/renderMobileApp-B48CsP4r.js +25 -0
- package/dist/assets/runtimeEndpointReset-Bg5gx18H.js +17 -0
- package/dist/assets/scheduledTasksApi-BW0Etzwz.js +1 -0
- package/dist/assets/{shikiHighlight-DYOWuY65.js → shikiHighlight-CRl0SUC9.js} +1 -1
- package/dist/assets/surface-oMvhsog3.js +1 -0
- package/dist/assets/tr-BK_KiO2V.js +7 -0
- package/dist/assets/uk-CG74xV8N.js +16 -0
- package/dist/assets/useAppFontEffects-CPKeOpUo.js +7284 -0
- package/dist/assets/useGitComparison-DH220WmO.js +1 -0
- package/dist/assets/useInlineCommentController-BiWz4AVb.js +2 -0
- package/dist/assets/useRootScrollLock-BS4-kr7P.js +1 -0
- package/dist/assets/{vendor-base-ui-BeMD8X_w.js → vendor-base-ui-DdV8vhHn.js} +1 -1
- package/dist/assets/{vendor-codemirror-language-data-DFZik9R2.js → vendor-codemirror-language-data-Bg4AEeCr.js} +2 -2
- package/dist/assets/vendor-zod-BPAANqvH.js +39 -0
- package/dist/assets/{web-components-Bhg83tjf.js → web-components-z7hfnS8n.js} +1 -1
- package/dist/assets/zh-CN-T4AXofZI.js +16 -0
- package/dist/assets/zh-TW-Dte40sxp.js +16 -0
- package/dist/index.html +21 -59
- package/dist/mini-chat.html +7 -7
- package/dist/mobile.html +5 -5
- package/package.json +3 -4
- package/server/index.d.ts +15 -0
- package/server/index.js +158 -89
- package/server/lib/agent-memory/actions.js +2 -2
- package/server/lib/agent-memory/feature-flag.js +1 -1
- package/server/lib/agent-memory/feature-flag.test.js +8 -8
- package/server/lib/agent-memory/routes.js +2 -2
- package/server/lib/agent-tool/runtime.js +37 -54
- package/server/lib/agent-tool/runtime.test.js +59 -59
- package/server/lib/browser-control/broker.js +3 -3
- package/server/lib/browser-control/broker.test.js +1 -1
- package/server/lib/changelog/update-notes.js +82 -0
- package/server/lib/changelog/update-notes.test.js +59 -0
- package/server/lib/client-auth/remote-clients.test.js +5 -5
- package/server/lib/context-obligatory/runtime.js +7 -7
- package/server/lib/context-obligatory/runtime.test.js +5 -5
- package/server/lib/data-dir-migration.js +40 -0
- package/server/lib/data-dir-migration.test.js +59 -0
- package/server/lib/dev-servers/parse.js +2 -2
- package/server/lib/dev-servers/parse.test.js +2 -2
- package/server/lib/dev-servers/routes.js +1 -1
- package/server/lib/dev-tunnel/DOCUMENTATION.md +13 -4
- package/server/lib/dev-tunnel/client.js +1 -1
- package/server/lib/dev-tunnel/runtime.js +5 -5
- package/server/lib/dev-tunnel/tunnel.test.js +21 -1
- package/server/lib/dictation/local/model-catalog.js +1 -1
- package/server/lib/dictation/local/worker-process.js +2 -2
- package/server/lib/event-stream/directory-ws-bridge.js +1 -1
- package/server/lib/event-stream/global-ws-bridge.js +1 -1
- package/server/lib/event-stream/protocol.test.js +4 -4
- package/server/lib/event-stream/runtime.test.js +18 -18
- package/server/lib/fs/DOCUMENTATION.md +5 -0
- package/server/lib/fs/routes.js +68 -26
- package/server/lib/fs/routes.test.js +208 -22
- package/server/lib/git/DOCUMENTATION.md +32 -6
- package/server/lib/git/identity-storage.js +1 -1
- package/server/lib/git/issue-2746-longpaths.test.js +4 -4
- package/server/lib/git/routes.js +41 -5
- package/server/lib/git/service.js +300 -224
- package/server/lib/git/service.test.js +596 -28
- package/server/lib/github/auth.js +8 -8
- package/server/lib/github/pr-status.js +1 -1
- package/server/lib/github/routes.js +2 -2
- package/server/lib/inherited-env.js +17 -10
- package/server/lib/inherited-env.test.js +10 -11
- package/server/lib/linear/auth.js +8 -8
- package/server/lib/linear/auth.test.js +24 -24
- package/server/lib/linear/issues.test.js +6 -6
- package/server/lib/linear/mapping.test.js +4 -4
- package/server/lib/linear/oauth.js +2 -2
- package/server/lib/linear/oauth.test.js +14 -14
- package/server/lib/linear/routes.js +5 -5
- package/server/lib/linear/routes.test.js +16 -16
- package/server/lib/linear/status-runtime.test.js +9 -9
- package/server/lib/linear/status.js +1 -1
- package/server/lib/linear/status.test.js +15 -15
- package/server/lib/linear/teams.test.js +4 -4
- package/server/lib/magic-prompts/routes.js +2 -2
- package/server/lib/mcp-reconnect/DOCUMENTATION.md +55 -0
- package/server/lib/mcp-reconnect/runtime.js +122 -0
- package/server/lib/mcp-reconnect/runtime.test.js +140 -0
- package/server/lib/message-queue/DOCUMENTATION.md +161 -0
- package/server/lib/message-queue/runtime.js +870 -0
- package/server/lib/message-queue/runtime.test.js +482 -0
- package/server/lib/network-defaults.js +23 -0
- package/server/lib/network-defaults.test.js +52 -0
- package/server/lib/notifications/apns-runtime.js +17 -17
- package/server/lib/notifications/apns-runtime.test.js +11 -11
- package/server/lib/notifications/emitter-runtime.js +1 -1
- package/server/lib/notifications/emitter-runtime.test.js +1 -1
- package/server/lib/notifications/push-runtime.js +7 -7
- package/server/lib/notifications/routes.js +1 -1
- package/server/lib/notifications/runtime.js +1 -1
- package/server/lib/openchamber-control/action-resolution.test.js +10 -10
- package/server/lib/openchamber-control/actions.js +24 -24
- package/server/lib/openchamber-control/error.js +4 -4
- package/server/lib/openchamber-control/routes.js +2 -2
- package/server/lib/openchamber-control/routes.test.js +5 -5
- package/server/lib/openchamber-control/screenshots.js +1 -1
- package/server/lib/openchamber-control/screenshots.test.js +1 -1
- package/server/lib/openchamber-control/service.js +50 -50
- package/server/lib/openchamber-control/service.test.js +5 -5
- package/server/lib/openchamber-sessions/routes.js +124 -22
- package/server/lib/openchamber-sessions/routes.test.js +99 -11
- package/server/lib/opencode/DOCUMENTATION.md +30 -6
- package/server/lib/opencode/auth.js +1 -1
- package/server/lib/opencode/bootstrap-runtime.js +8 -6
- package/server/lib/opencode/cli-options.js +8 -8
- package/server/lib/opencode/config-paths.test.js +116 -0
- package/server/lib/opencode/core-routes.js +8 -7
- package/server/lib/opencode/core-routes.test.js +11 -11
- package/server/lib/opencode/env-config.js +5 -5
- package/server/lib/opencode/env-config.test.js +7 -7
- package/server/lib/opencode/env-runtime.js +10 -10
- package/server/lib/opencode/env-runtime.test.js +18 -18
- package/server/lib/opencode/feature-routes-runtime.js +19 -12
- package/server/lib/opencode/hmr-state-runtime.js +2 -2
- package/server/lib/opencode/hmr-state-runtime.test.js +1 -1
- package/server/lib/opencode/input-history-scope.js +14 -0
- package/server/lib/opencode/lifecycle.js +8 -8
- package/server/lib/opencode/lifecycle.test.js +4 -4
- package/server/lib/opencode/managed-plugin-config.js +35 -0
- package/server/lib/opencode/managed-process-registry.js +3 -3
- package/server/lib/opencode/mcp-oauth-callback.test.js +2 -2
- package/server/lib/opencode/openchamber-routes.js +79 -19
- package/server/lib/opencode/openchamber-routes.test.js +139 -12
- package/server/lib/opencode/plugins.js +2 -2
- package/server/lib/opencode/plugins.test.js +1 -1
- package/server/lib/opencode/project-icon-routes.js +2 -2
- package/server/lib/opencode/project-icon-routes.test.js +1 -1
- package/server/lib/opencode/providers.js +44 -2
- package/server/lib/opencode/providers.test.js +131 -4
- package/server/lib/opencode/proxy.js +2 -2
- package/server/lib/opencode/pwa-manifest-routes.js +1 -1
- package/server/lib/opencode/restart-session-recovery.test.js +1 -1
- package/server/lib/opencode/routes-upgrade.test.js +4 -4
- package/server/lib/opencode/routes.js +19 -17
- package/server/lib/opencode/server-startup-runtime.js +6 -6
- package/server/lib/opencode/session-runtime.js +3 -3
- package/server/lib/opencode/session-runtime.test.js +6 -6
- package/server/lib/opencode/settings-files.js +214 -0
- package/server/lib/opencode/settings-helpers.js +116 -44
- package/server/lib/opencode/settings-helpers.test.js +354 -12
- package/server/lib/opencode/settings-registry.json +747 -0
- package/server/lib/opencode/settings-runtime.js +141 -20
- package/server/lib/opencode/settings-runtime.test.js +191 -4
- package/server/lib/opencode/shared.js +5 -2
- package/server/lib/opencode/shared.test.js +7 -7
- package/server/lib/opencode/shutdown-runtime.js +2 -0
- package/server/lib/opencode/skill-routes.js +2 -1
- package/server/lib/opencode/snippets.js +1 -2
- package/server/lib/opencode/startup-performance.js +1 -1
- package/server/lib/opencode/startup-performance.test.js +6 -6
- package/server/lib/opencode/static-routes-runtime.js +8 -8
- package/server/lib/opencode/static-routes-runtime.test.js +7 -7
- package/server/lib/opencode/upgrade-capability.js +2 -2
- package/server/lib/opencode/upgrade-capability.test.js +3 -3
- package/server/lib/package-manager.js +17 -42
- package/server/lib/package-manager.test.js +19 -19
- package/server/lib/permission-auto-accept/runtime.js +1 -1
- package/server/lib/project-context/DOCUMENTATION.md +25 -1
- package/server/lib/project-context/routes.http.test.js +18 -0
- package/server/lib/project-context/routes.js +16 -1
- package/server/lib/project-context/runtime.js +248 -23
- package/server/lib/project-context/runtime.test.js +106 -3
- package/server/lib/projects/DOCUMENTATION.md +76 -0
- package/server/lib/projects/project-config.js +144 -11
- package/server/lib/projects/project-id.js +17 -0
- package/server/lib/projects/project-setup.js +409 -0
- package/server/lib/projects/project-setup.test.js +557 -0
- package/server/lib/projects/routes.js +59 -0
- package/server/lib/quota/DOCUMENTATION.md +40 -2
- package/server/lib/quota/credentials/providers.js +4 -0
- package/server/lib/quota/credentials/store.js +4 -4
- package/server/lib/quota/credentials/store.test.js +8 -8
- package/server/lib/quota/index.js +1 -0
- package/server/lib/quota/providers/cline-pass.js +125 -0
- package/server/lib/quota/providers/cline-pass.test.js +103 -0
- package/server/lib/quota/providers/exe-dev.js +75 -0
- package/server/lib/quota/providers/exe-dev.test.js +47 -0
- package/server/lib/quota/providers/hyper.js +118 -0
- package/server/lib/quota/providers/hyper.test.js +126 -0
- package/server/lib/quota/providers/index.js +22 -0
- package/server/lib/quota/providers/neuralwatt.js +3 -6
- package/server/lib/quota/providers/neuralwatt.test.js +7 -7
- package/server/lib/quota/providers/ollama-cloud.js +32 -1
- package/server/lib/quota/providers/ollama-cloud.test.js +33 -1
- package/server/lib/quota/providers/opencode-go.js +3 -2
- package/server/lib/quota/providers/opencode-go.test.js +35 -6
- package/server/lib/quota/providers/openrouter.js +119 -24
- package/server/lib/quota/providers/openrouter.test.js +330 -0
- package/server/lib/quota/providers/xai.js +1 -1
- package/server/lib/quota/routes.js +2 -0
- package/server/lib/quota/utils/auth.js +1 -1
- package/server/lib/relay/DOCUMENTATION.md +56 -1
- package/server/lib/relay/cross-compat.test.js +26 -0
- package/server/lib/relay/downstream-scheduler.js +154 -0
- package/server/lib/relay/downstream-scheduler.test.js +162 -0
- package/server/lib/relay/e2ee.js +10 -8
- package/server/lib/relay/flow-control.test.js +177 -0
- package/server/lib/relay/host-client.js +38 -9
- package/server/lib/relay/host-client.test.js +9 -1
- package/server/lib/relay/host-lock.js +1 -1
- package/server/lib/relay/service.js +5 -5
- package/server/lib/relay/tunnel-codec.js +9 -0
- package/server/lib/relay/tunnel-host.js +69 -18
- package/server/lib/relay/tunnel-host.test.js +9 -1
- package/server/lib/scheduled-tasks/issue-2710-double-execution.test.js +2 -2
- package/server/lib/scheduled-tasks/routes.js +5 -5
- package/server/lib/scheduled-tasks/service.js +25 -25
- package/server/lib/scheduled-tasks/service.test.js +1 -1
- package/server/lib/security/bind-host.js +4 -4
- package/server/lib/security/bind-host.test.js +1 -1
- package/server/lib/security/request-security.js +11 -5
- package/server/lib/security/request-security.test.js +14 -14
- package/server/lib/session-assist/runtime.js +15 -18
- package/server/lib/session-folders/routes.js +2 -2
- package/server/lib/session-folders/routes.test.js +8 -8
- package/server/lib/session-goal/DOCUMENTATION.md +20 -7
- package/server/lib/session-goal/create.js +4 -2
- package/server/lib/session-goal/create.test.js +1 -1
- package/server/lib/session-goal/objectives.js +4 -4
- package/server/lib/session-goal/routes.js +1 -1
- package/server/lib/session-goal/runtime.js +91 -30
- package/server/lib/session-goal/runtime.test.js +428 -2
- package/server/lib/session-knowledge/runtime.js +11 -11
- package/server/lib/session-knowledge/runtime.test.js +5 -5
- package/server/lib/skills-catalog/DOCUMENTATION.md +1 -1
- package/server/lib/skills-catalog/cache.test.js +2 -2
- package/server/lib/skills-catalog/disk-cache.js +5 -5
- package/server/lib/skills-catalog/github-meta.test.js +2 -2
- package/server/lib/skills-catalog/install.js +3 -2
- package/server/lib/small-model/DOCUMENTATION.md +7 -2
- package/server/lib/small-model/call.js +18 -7
- package/server/lib/small-model/call.test.js +58 -6
- package/server/lib/small-model/index.js +12 -16
- package/server/lib/small-model/index.test.js +1 -1
- package/server/lib/small-model/resolve.js +1 -1
- package/server/lib/small-model/resolve.test.js +1 -1
- package/server/lib/small-model/routes.js +2 -1
- package/server/lib/small-model/runtime-providers.js +15 -7
- package/server/lib/small-model/runtime-providers.test.js +7 -1
- package/server/lib/system-prompt/runtime.js +3 -22
- package/server/lib/system-prompt/runtime.test.js +3 -3
- package/server/lib/terminal/DOCUMENTATION.md +14 -10
- package/server/lib/terminal/runtime.js +190 -31
- package/server/lib/terminal/runtime.test.js +572 -38
- package/server/lib/terminal/shells.js +20 -3
- package/server/lib/terminal/shells.test.js +33 -2
- package/server/lib/tts/base-url.js +3 -3
- package/server/lib/tts/routes.test.js +20 -20
- package/server/lib/ui-auth/ui-auth.js +12 -9
- package/server/lib/ui-auth/ui-auth.test.js +19 -3
- package/server/lib/ui-auth/ui-passkeys.js +7 -7
- package/server/lib/walkthrough/DOCUMENTATION.md +33 -14
- package/server/lib/walkthrough/index.js +1 -0
- package/server/lib/walkthrough/jobs.test.js +1 -1
- package/server/lib/walkthrough/language.test.js +1 -1
- package/server/lib/walkthrough/model-settings.js +11 -15
- package/server/lib/walkthrough/model-settings.test.js +1 -1
- package/server/lib/walkthrough/prompt.js +3 -1
- package/server/lib/walkthrough/pull-request.test.js +5 -5
- package/server/lib/walkthrough/reproduce-2607.test.js +2 -2
- package/server/lib/walkthrough/routes.test.js +26 -5
- package/server/lib/walkthrough/sources.js +23 -2
- package/server/lib/walkthrough/store.js +3 -3
- package/server/lib/walkthrough/store.test.js +1 -1
- package/server/opencode-proxy.test.js +2 -2
- package/server/proxy-headers.js +1 -1
- package/server/sse-routes.test.js +4 -4
- package/README.md.bak +0 -250
- package/bin/lib/DOCUMENTATION.md.bak +0 -163
- package/dist/assets/CommitSection-SGBCAW0w.js +0 -1
- package/dist/assets/DiffView-DluiRSla.js +0 -4
- package/dist/assets/FilesView-Bdq8ppva.js +0 -17
- package/dist/assets/GitView-Znn7VJcP.js +0 -6
- package/dist/assets/LinearIssuesView-jP-hXyac.js +0 -1
- package/dist/assets/MarkdownImageGallery-ClOvuZxC.js +0 -1
- package/dist/assets/MarkdownRendererImpl-Dt9mjTRN.js +0 -12
- package/dist/assets/OnboardingScreen-D2DG7K6b.js +0 -1
- package/dist/assets/PierreDiffViewer-B7m3f0d7.js +0 -157
- package/dist/assets/PlanView-B0F3BtPZ.js +0 -5
- package/dist/assets/SettingsView-BBW-S-gh.js +0 -28
- package/dist/assets/ToolPartDiffPreview-CUNe28U1.js +0 -8
- package/dist/assets/WalkthroughView-egQgxel3.js +0 -4
- package/dist/assets/contextPanelEmbeddedChat-C3fjDbdg.js +0 -1
- package/dist/assets/de-C1P6X5Rs.js +0 -9
- package/dist/assets/es-CDgaF1_t.js +0 -15
- package/dist/assets/fr-Bgxqvvz_.js +0 -13
- package/dist/assets/index-C57jT0Sa.css +0 -1
- package/dist/assets/index-DW_E3rnL.js +0 -7
- package/dist/assets/ja-BDRrEcNP.js +0 -15
- package/dist/assets/ko-Ba8sQV79.js +0 -15
- package/dist/assets/main-Bv5Pkngh.js +0 -928
- package/dist/assets/markdownCore-CZwzz5gw.js +0 -3
- package/dist/assets/patchFileDiff-yNfWXN4E.js +0 -10
- package/dist/assets/pl-Dioz29BI.js +0 -15
- package/dist/assets/pt-BR-DIs6ElwV.js +0 -15
- package/dist/assets/renderElectronMiniChatApp-BcKLHXKe.js +0 -2
- package/dist/assets/renderMobileApp-D9yQJy0L.js +0 -25
- package/dist/assets/runtimeEndpointReset-CjhvxLH0.js +0 -16
- package/dist/assets/scheduledTasksApi-DLW0mkQK.js +0 -1
- package/dist/assets/tr-DFnMlPxY.js +0 -6
- package/dist/assets/uk-ZrCNjM7Y.js +0 -15
- package/dist/assets/useAppFontEffects-CjrntdL0.js +0 -7310
- package/dist/assets/useInlineCommentController-CDEuSlPH.js +0 -2
- package/dist/assets/useRootScrollLock-BHYPkrLv.js +0 -1
- package/dist/assets/vendor-ghostty-web-CrxinGGH.js +0 -13
- package/dist/assets/vendor-zod-BLfBSgBh.js +0 -39
- package/dist/assets/zh-CN-iv_AV4EC.js +0 -15
- package/dist/assets/zh-TW-CzEUk38j.js +0 -15
- package/server/index.d.ts.bak +0 -39
- package/server/lib/agent-tool/DOCUMENTATION.md.bak +0 -119
- package/server/lib/browser-control/DOCUMENTATION.md.bak +0 -50
- package/server/lib/context-obligatory/DOCUMENTATION.md.bak +0 -19
- package/server/lib/dev-tunnel/DOCUMENTATION.md.bak +0 -57
- package/server/lib/dictation/DOCUMENTATION.md.bak +0 -100
- package/server/lib/event-stream/DOCUMENTATION.md.bak +0 -62
- package/server/lib/fs/DOCUMENTATION.md.bak +0 -47
- package/server/lib/git/DOCUMENTATION.md.bak +0 -193
- package/server/lib/github/DOCUMENTATION.md.bak +0 -183
- package/server/lib/linear/DOCUMENTATION.md.bak +0 -97
- package/server/lib/linear/OAUTH-BROKER-HANDOFF.md.bak +0 -91
- package/server/lib/markdown-image-grants/DOCUMENTATION.md.bak +0 -40
- package/server/lib/notifications/APNS.md.bak +0 -135
- package/server/lib/notifications/DOCUMENTATION.md.bak +0 -138
- package/server/lib/openchamber-control/DOCUMENTATION.md.bak +0 -64
- package/server/lib/opencode/DOCUMENTATION.md.bak +0 -431
- package/server/lib/opencode/managed-process-registry.d.ts.bak +0 -13
- package/server/lib/opencode/provider-env-aliases.d.ts.bak +0 -3
- package/server/lib/permission-auto-accept/DOCUMENTATION.md.bak +0 -34
- package/server/lib/project-context/DOCUMENTATION.md.bak +0 -160
- package/server/lib/quota/DOCUMENTATION.md.bak +0 -123
- package/server/lib/relay/DOCUMENTATION.md.bak +0 -100
- package/server/lib/scheduled-tasks/DOCUMENTATION.md.bak +0 -182
- package/server/lib/session-assist/DOCUMENTATION.md.bak +0 -66
- package/server/lib/session-goal/DOCUMENTATION.md.bak +0 -213
- package/server/lib/session-knowledge/DOCUMENTATION.md.bak +0 -89
- package/server/lib/skills-catalog/DOCUMENTATION.md.bak +0 -151
- package/server/lib/small-model/DOCUMENTATION.md.bak +0 -212
- package/server/lib/system-prompt/DOCUMENTATION.md.bak +0 -36
- package/server/lib/terminal/DOCUMENTATION.md.bak +0 -50
- package/server/lib/text/DOCUMENTATION.md.bak +0 -35
- package/server/lib/tts/DOCUMENTATION.md.bak +0 -147
- package/server/lib/tunnels/DOCUMENTATION.md.bak +0 -21
- package/server/lib/ui-auth/DOCUMENTATION.md.bak +0 -44
- package/server/lib/walkthrough/DOCUMENTATION.md.bak +0 -411
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
getProviderSources,
|
|
10
10
|
removeProviderConfig,
|
|
11
11
|
} from './providers.js';
|
|
12
|
+
import { OPENCODE_CONFIG_DIR } from './shared.js';
|
|
12
13
|
|
|
13
14
|
let projectDir;
|
|
14
15
|
|
|
@@ -162,6 +163,132 @@ describe('custom provider config persistence', () => {
|
|
|
162
163
|
expect(written.disabled_providers).toEqual(['other']);
|
|
163
164
|
});
|
|
164
165
|
|
|
166
|
+
test('upsertProviderConfig preserves unmanaged provider and model metadata', () => {
|
|
167
|
+
const configPath = path.join(projectDir, 'opencode.json');
|
|
168
|
+
writeJson(configPath, {
|
|
169
|
+
provider: {
|
|
170
|
+
'campus-llm': {
|
|
171
|
+
npm: '@ai-sdk/openai-compatible',
|
|
172
|
+
name: 'Old',
|
|
173
|
+
customProviderField: { owner: 'user' },
|
|
174
|
+
env: ['OLD_KEY'],
|
|
175
|
+
options: {
|
|
176
|
+
baseURL: 'https://old.example.edu/v1',
|
|
177
|
+
headers: { 'X-Old': '1' },
|
|
178
|
+
timeout: 45_000,
|
|
179
|
+
},
|
|
180
|
+
models: {
|
|
181
|
+
retained: {
|
|
182
|
+
name: 'Old retained name',
|
|
183
|
+
reasoning: true,
|
|
184
|
+
attachment: true,
|
|
185
|
+
tool_call: true,
|
|
186
|
+
modalities: { input: ['text', 'image', 'pdf'], output: ['text'] },
|
|
187
|
+
limit: { context: 1_050_000, input: 922_000, output: 128_000 },
|
|
188
|
+
options: { instructions: 'Keep this instruction' },
|
|
189
|
+
variants: {
|
|
190
|
+
low: { reasoningEffort: 'low' },
|
|
191
|
+
high: { reasoningEffort: 'high' },
|
|
192
|
+
},
|
|
193
|
+
customModelField: { source: 'manual' },
|
|
194
|
+
},
|
|
195
|
+
removed: {
|
|
196
|
+
name: 'Remove me',
|
|
197
|
+
reasoning: true,
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
upsertProviderConfig('campus-llm', {
|
|
205
|
+
name: 'Campus LLM',
|
|
206
|
+
options: { baseURL: 'https://new.example.edu/v1' },
|
|
207
|
+
models: {
|
|
208
|
+
retained: { name: 'Retained model' },
|
|
209
|
+
added: { name: 'Added model' },
|
|
210
|
+
},
|
|
211
|
+
}, projectDir, 'project', { hasStoredAuth: true });
|
|
212
|
+
|
|
213
|
+
const written = readJson(configPath).provider['campus-llm'];
|
|
214
|
+
expect(written).toEqual({
|
|
215
|
+
npm: '@ai-sdk/openai-compatible',
|
|
216
|
+
name: 'Campus LLM',
|
|
217
|
+
customProviderField: { owner: 'user' },
|
|
218
|
+
options: {
|
|
219
|
+
baseURL: 'https://new.example.edu/v1',
|
|
220
|
+
timeout: 45_000,
|
|
221
|
+
},
|
|
222
|
+
models: {
|
|
223
|
+
retained: {
|
|
224
|
+
name: 'Retained model',
|
|
225
|
+
reasoning: true,
|
|
226
|
+
attachment: true,
|
|
227
|
+
tool_call: true,
|
|
228
|
+
modalities: { input: ['text', 'image', 'pdf'], output: ['text'] },
|
|
229
|
+
limit: { context: 1_050_000, input: 922_000, output: 128_000 },
|
|
230
|
+
options: { instructions: 'Keep this instruction' },
|
|
231
|
+
variants: {
|
|
232
|
+
low: { reasoningEffort: 'low' },
|
|
233
|
+
high: { reasoningEffort: 'high' },
|
|
234
|
+
},
|
|
235
|
+
customModelField: { source: 'manual' },
|
|
236
|
+
},
|
|
237
|
+
added: { name: 'Added model' },
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test('upsertProviderConfig preserves metadata while migrating the legacy providers alias', () => {
|
|
243
|
+
const configPath = path.join(projectDir, 'opencode.json');
|
|
244
|
+
writeJson(configPath, {
|
|
245
|
+
providers: {
|
|
246
|
+
legacy: {
|
|
247
|
+
name: 'Legacy provider',
|
|
248
|
+
options: { baseURL: 'https://old.example.com/v1', timeout: 30_000 },
|
|
249
|
+
models: { model: { name: 'Old model', reasoning: true } },
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
upsertProviderConfig('legacy', {
|
|
255
|
+
name: 'Updated provider',
|
|
256
|
+
options: { baseURL: 'https://new.example.com/v1' },
|
|
257
|
+
models: { model: { name: 'Updated model' } },
|
|
258
|
+
}, projectDir, 'project', { hasStoredAuth: true });
|
|
259
|
+
|
|
260
|
+
const written = readJson(configPath);
|
|
261
|
+
expect(written.providers).toBeUndefined();
|
|
262
|
+
expect(written.provider.legacy).toEqual({
|
|
263
|
+
npm: '@ai-sdk/openai-compatible',
|
|
264
|
+
name: 'Updated provider',
|
|
265
|
+
options: { baseURL: 'https://new.example.com/v1', timeout: 30_000 },
|
|
266
|
+
models: { model: { name: 'Updated model', reasoning: true } },
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
test('migrating one legacy providers entry keeps the other legacy entries', () => {
|
|
271
|
+
const configPath = path.join(projectDir, 'opencode.json');
|
|
272
|
+
writeJson(configPath, {
|
|
273
|
+
providers: {
|
|
274
|
+
legacy: { name: 'Legacy provider', options: { baseURL: 'https://old.example.com/v1' }, models: { model: { name: 'Old model' } } },
|
|
275
|
+
untouched: { name: 'Untouched', options: { baseURL: 'https://other.example.com/v1' }, models: { model: { name: 'Other model' } } },
|
|
276
|
+
},
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
upsertProviderConfig('legacy', {
|
|
280
|
+
name: 'Updated provider',
|
|
281
|
+
options: { baseURL: 'https://new.example.com/v1' },
|
|
282
|
+
models: { model: { name: 'Updated model' } },
|
|
283
|
+
}, projectDir, 'project', { hasStoredAuth: true });
|
|
284
|
+
|
|
285
|
+
const written = readJson(configPath);
|
|
286
|
+
expect(written.providers).toEqual({
|
|
287
|
+
untouched: { name: 'Untouched', options: { baseURL: 'https://other.example.com/v1' }, models: { model: { name: 'Other model' } } },
|
|
288
|
+
});
|
|
289
|
+
expect(written.provider.legacy.name).toBe('Updated provider');
|
|
290
|
+
});
|
|
291
|
+
|
|
165
292
|
test('upsert then remove restores absence', () => {
|
|
166
293
|
upsertProviderConfig('temp-provider', {
|
|
167
294
|
name: 'Temp',
|
|
@@ -230,8 +357,8 @@ describe('custom provider config persistence', () => {
|
|
|
230
357
|
expect(sources.sources.custom.exists).toBe(false);
|
|
231
358
|
|
|
232
359
|
for (const userPath of [
|
|
233
|
-
path.join(
|
|
234
|
-
path.join(
|
|
360
|
+
path.join(OPENCODE_CONFIG_DIR, 'opencode.json'),
|
|
361
|
+
path.join(OPENCODE_CONFIG_DIR, 'config.json'),
|
|
235
362
|
]) {
|
|
236
363
|
if (!fs.existsSync(userPath)) continue;
|
|
237
364
|
const userConfig = readJson(userPath);
|
|
@@ -269,8 +396,8 @@ describe('custom provider config persistence', () => {
|
|
|
269
396
|
expect(sources.sources.project.exists).toBe(false);
|
|
270
397
|
|
|
271
398
|
for (const userPath of [
|
|
272
|
-
path.join(
|
|
273
|
-
path.join(
|
|
399
|
+
path.join(OPENCODE_CONFIG_DIR, 'opencode.json'),
|
|
400
|
+
path.join(OPENCODE_CONFIG_DIR, 'config.json'),
|
|
274
401
|
]) {
|
|
275
402
|
if (!fs.existsSync(userPath)) continue;
|
|
276
403
|
const userConfig = readJson(userPath);
|
|
@@ -407,7 +407,7 @@ export const registerOpenCodeProxy = (app, deps) => {
|
|
|
407
407
|
};
|
|
408
408
|
|
|
409
409
|
const PROXY_REQUEST_TIMEOUT_MS = normalizeProxyTimeout(LONG_REQUEST_TIMEOUT_MS);
|
|
410
|
-
const PROXY_TIMEOUT_MARKER = Symbol('
|
|
410
|
+
const PROXY_TIMEOUT_MARKER = Symbol('aiworkerProxyTimedOut');
|
|
411
411
|
|
|
412
412
|
// A provider OAuth callback blocks upstream for as long as the user takes to
|
|
413
413
|
// sign in in their browser (device-code polling, or a loopback redirect), so
|
|
@@ -793,7 +793,7 @@ export const registerOpenCodeProxy = (app, deps) => {
|
|
|
793
793
|
return null;
|
|
794
794
|
});
|
|
795
795
|
|
|
796
|
-
const settingsPath = path.join(os.homedir(), '.config', '
|
|
796
|
+
const settingsPath = path.join(os.homedir(), '.config', 'aiworker', 'settings.json');
|
|
797
797
|
let projectDirs = [];
|
|
798
798
|
try {
|
|
799
799
|
const settingsRaw = fs.readFileSync(settingsPath, 'utf8');
|
|
@@ -45,7 +45,7 @@ describe('managed OpenCode restart session recovery', () => {
|
|
|
45
45
|
expect(sessionRuntime.getActiveSessionCount()).toBe(0);
|
|
46
46
|
expect(Object.values(sessionRuntime.getSessionStateSnapshot()).map((state) => state.status))
|
|
47
47
|
.toEqual(['idle', 'idle', 'idle']);
|
|
48
|
-
expect(events.filter((event) => event.type === '
|
|
48
|
+
expect(events.filter((event) => event.type === 'aiworker:session-status')).toHaveLength(3);
|
|
49
49
|
expect(events.filter((event) => event.type === 'session.error')).toHaveLength(3);
|
|
50
50
|
expect(broadcastUiNotification).toHaveBeenCalledOnce();
|
|
51
51
|
expect(broadcastUiNotification).toHaveBeenCalledWith(expect.objectContaining({
|
|
@@ -22,7 +22,7 @@ const createApp = (overrides = {}) => {
|
|
|
22
22
|
const dependencies = {
|
|
23
23
|
getOpenCodeUpgradeCapability: () => ({
|
|
24
24
|
supported: false,
|
|
25
|
-
manager: '
|
|
25
|
+
manager: 'aiworker',
|
|
26
26
|
reason: 'bundled',
|
|
27
27
|
}),
|
|
28
28
|
buildOpenCodeUrl: (pathname) => `http://127.0.0.1:4096${pathname}`,
|
|
@@ -44,8 +44,8 @@ describe('OpenCode upgrade routes', () => {
|
|
|
44
44
|
.send({})
|
|
45
45
|
.expect(409, {
|
|
46
46
|
success: false,
|
|
47
|
-
code: '
|
|
48
|
-
error: 'OpenCode is bundled with
|
|
47
|
+
code: 'OPENCODE_UPGRADE_MANAGED_BY_AIWORKER',
|
|
48
|
+
error: 'OpenCode is bundled with AiWorker Desktop and updates with the app.',
|
|
49
49
|
});
|
|
50
50
|
|
|
51
51
|
expect(globalThis.fetch).not.toHaveBeenCalled();
|
|
@@ -68,7 +68,7 @@ describe('OpenCode upgrade routes', () => {
|
|
|
68
68
|
latestVersion: null,
|
|
69
69
|
upgrade: {
|
|
70
70
|
supported: false,
|
|
71
|
-
manager: '
|
|
71
|
+
manager: 'aiworker',
|
|
72
72
|
reason: 'bundled',
|
|
73
73
|
},
|
|
74
74
|
});
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import { createProjectIdFromPath } from '../projects/project-id.js';
|
|
3
3
|
import fs from 'fs';
|
|
4
|
-
import os from 'os';
|
|
5
4
|
import path from 'path';
|
|
6
5
|
import {
|
|
7
6
|
buildDeferredRestartResponse,
|
|
8
7
|
} from './config-mutation-response.js';
|
|
9
8
|
import { getClaudeCliAuthStatus } from './claude-cli-auth.js';
|
|
9
|
+
import { OPENCODE_CONFIG_DIR } from './shared.js';
|
|
10
|
+
import { settingsSurfaceOf } from './settings-files.js';
|
|
10
11
|
|
|
11
12
|
export const registerOpenCodeRoutes = (app, dependencies) => {
|
|
12
13
|
const {
|
|
@@ -57,7 +58,7 @@ export const registerOpenCodeRoutes = (app, dependencies) => {
|
|
|
57
58
|
|
|
58
59
|
// Self-contained page for the OAuth return leg: the system browser has no UI
|
|
59
60
|
// session, so it cannot load the SPA behind the auth gate — everything it
|
|
60
|
-
// needs ships inline. `
|
|
61
|
+
// needs ships inline. `aiworker://focus/mcp-auth` raises the desktop app;
|
|
61
62
|
// the link stays visible because some browsers only follow custom-protocol
|
|
62
63
|
// URLs from a user gesture.
|
|
63
64
|
const renderMcpOAuthCallbackPage = ({ title, message, desktopReturn }) => `<!doctype html>
|
|
@@ -65,7 +66,7 @@ export const registerOpenCodeRoutes = (app, dependencies) => {
|
|
|
65
66
|
<head>
|
|
66
67
|
<meta charset="utf-8">
|
|
67
68
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
68
|
-
<title>${escapeHtml(title)} —
|
|
69
|
+
<title>${escapeHtml(title)} — AiWorker</title>
|
|
69
70
|
<style>
|
|
70
71
|
:root { color-scheme: light dark; }
|
|
71
72
|
body { margin: 0; min-height: 100vh; display: flex; align-items: center; justify-content: center;
|
|
@@ -82,8 +83,8 @@ export const registerOpenCodeRoutes = (app, dependencies) => {
|
|
|
82
83
|
<main>
|
|
83
84
|
<h1>${escapeHtml(title)}</h1>
|
|
84
85
|
<p>${escapeHtml(message)}</p>
|
|
85
|
-
${desktopReturn ? `<a class="return" href="
|
|
86
|
-
<script>window.location.href = '
|
|
86
|
+
${desktopReturn ? `<a class="return" href="aiworker://focus/mcp-auth">Return to AiWorker</a>
|
|
87
|
+
<script>window.location.href = 'aiworker://focus/mcp-auth';</script>` : ''}
|
|
87
88
|
</main>
|
|
88
89
|
</body>
|
|
89
90
|
</html>`;
|
|
@@ -208,9 +209,10 @@ ${desktopReturn ? `<a class="return" href="openchamber://focus/mcp-auth">Return
|
|
|
208
209
|
}
|
|
209
210
|
};
|
|
210
211
|
|
|
211
|
-
app.get('/api/config/settings', async (
|
|
212
|
+
app.get('/api/config/settings', async (req, res) => {
|
|
212
213
|
try {
|
|
213
|
-
|
|
214
|
+
// The surface kind resolves the per-surface profile keys; absent means base.
|
|
215
|
+
const settings = await readSettingsFromDiskMigrated({ surface: settingsSurfaceOf(req) });
|
|
214
216
|
res.json(formatSettingsResponse(settings));
|
|
215
217
|
} catch (error) {
|
|
216
218
|
console.error('Failed to read settings:', error);
|
|
@@ -238,11 +240,11 @@ ${desktopReturn ? `<a class="return" href="openchamber://focus/mcp-auth">Return
|
|
|
238
240
|
return res.status(409).json({
|
|
239
241
|
success: false,
|
|
240
242
|
code: capability.reason === 'bundled'
|
|
241
|
-
? '
|
|
243
|
+
? 'OPENCODE_UPGRADE_MANAGED_BY_AIWORKER'
|
|
242
244
|
: 'OPENCODE_UPGRADE_UNSUPPORTED',
|
|
243
245
|
error: capability.reason === 'bundled'
|
|
244
|
-
? 'OpenCode is bundled with
|
|
245
|
-
: 'This OpenCode runtime cannot be upgraded by
|
|
246
|
+
? 'OpenCode is bundled with AiWorker Desktop and updates with the app.'
|
|
247
|
+
: 'This OpenCode runtime cannot be upgraded by AiWorker.',
|
|
246
248
|
});
|
|
247
249
|
}
|
|
248
250
|
if (openCodeUpgradePromise) {
|
|
@@ -422,7 +424,7 @@ ${desktopReturn ? `<a class="return" href="openchamber://focus/mcp-auth">Return
|
|
|
422
424
|
|
|
423
425
|
app.put('/api/config/settings', async (req, res) => {
|
|
424
426
|
try {
|
|
425
|
-
const updated = await persistSettings(req.body ?? {});
|
|
427
|
+
const updated = await persistSettings(req.body ?? {}, { surface: settingsSurfaceOf(req) });
|
|
426
428
|
res.json(updated);
|
|
427
429
|
} catch (error) {
|
|
428
430
|
console.error('[API:PUT /api/config/settings] Failed to save settings:', error);
|
|
@@ -513,7 +515,7 @@ ${desktopReturn ? `<a class="return" href="openchamber://focus/mcp-auth">Return
|
|
|
513
515
|
// Browser return leg of the MCP OAuth flow, completed entirely server-side.
|
|
514
516
|
//
|
|
515
517
|
// The provider redirects the SYSTEM browser here, and that browser has no
|
|
516
|
-
//
|
|
518
|
+
// AiWorker UI session — the SPA route this path used to land on sits
|
|
517
519
|
// behind the client-side auth gate, so the user saw a login page instead of
|
|
518
520
|
// a finished authorization. No session can be required on this path.
|
|
519
521
|
//
|
|
@@ -562,7 +564,7 @@ ${desktopReturn ? `<a class="return" href="openchamber://focus/mcp-auth">Return
|
|
|
562
564
|
if (!context?.name) {
|
|
563
565
|
return finish(400, {
|
|
564
566
|
title: 'Authorization Failed',
|
|
565
|
-
message: 'This authorization session has expired or is unknown to the running app. Return to
|
|
567
|
+
message: 'This authorization session has expired or is unknown to the running app. Return to AiWorker and click Authorize again.',
|
|
566
568
|
});
|
|
567
569
|
}
|
|
568
570
|
|
|
@@ -583,7 +585,7 @@ ${desktopReturn ? `<a class="return" href="openchamber://focus/mcp-auth">Return
|
|
|
583
585
|
}
|
|
584
586
|
return finish(200, {
|
|
585
587
|
title: 'Authorization Complete',
|
|
586
|
-
message: 'You can close this tab and return to
|
|
588
|
+
message: 'You can close this tab and return to AiWorker.',
|
|
587
589
|
});
|
|
588
590
|
} catch (error) {
|
|
589
591
|
return finish(502, {
|
|
@@ -807,7 +809,7 @@ ${desktopReturn ? `<a class="return" href="openchamber://focus/mcp-auth">Return
|
|
|
807
809
|
});
|
|
808
810
|
|
|
809
811
|
// Behavior / Global AGENTS.md endpoints
|
|
810
|
-
const AGENTS_MD_PATH = path.join(
|
|
812
|
+
const AGENTS_MD_PATH = path.join(OPENCODE_CONFIG_DIR, 'AGENTS.md');
|
|
811
813
|
const MAX_BEHAVIOR_PROMPT_SIZE = 1024 * 1024; // 1 MB
|
|
812
814
|
|
|
813
815
|
app.get('/api/behavior/agents-md', async (_req, res) => {
|
|
@@ -815,10 +817,10 @@ ${desktopReturn ? `<a class="return" href="openchamber://focus/mcp-auth">Return
|
|
|
815
817
|
try {
|
|
816
818
|
await fs.promises.access(AGENTS_MD_PATH);
|
|
817
819
|
} catch {
|
|
818
|
-
return res.json({ content: '', exists: false });
|
|
820
|
+
return res.json({ content: '', exists: false, path: AGENTS_MD_PATH });
|
|
819
821
|
}
|
|
820
822
|
const content = await fs.promises.readFile(AGENTS_MD_PATH, 'utf8');
|
|
821
|
-
return res.json({ content, exists: true });
|
|
823
|
+
return res.json({ content, exists: true, path: AGENTS_MD_PATH });
|
|
822
824
|
} catch (error) {
|
|
823
825
|
console.error('Failed to read AGENTS.md:', error);
|
|
824
826
|
return res.status(500).json({ error: 'Failed to read AGENTS.md' });
|
|
@@ -22,8 +22,8 @@ export const createServerStartupRuntime = (dependencies) => {
|
|
|
22
22
|
|
|
23
23
|
const resolveBindHost = (host) =>
|
|
24
24
|
host
|
|
25
|
-
|| (typeof process.env.
|
|
26
|
-
? process.env.
|
|
25
|
+
|| (typeof process.env.AIWORKER_HOST === 'string' && process.env.AIWORKER_HOST.trim().length > 0
|
|
26
|
+
? process.env.AIWORKER_HOST.trim()
|
|
27
27
|
: '127.0.0.1');
|
|
28
28
|
|
|
29
29
|
const startListeningAndMaybeTunnel = async ({
|
|
@@ -48,12 +48,12 @@ export const createServerStartupRuntime = (dependencies) => {
|
|
|
48
48
|
|
|
49
49
|
if (typeof process.send === 'function') {
|
|
50
50
|
if (!process.connected) {
|
|
51
|
-
throw new Error('
|
|
51
|
+
throw new Error('AiWorker startup IPC channel disconnected before ready notification');
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
await new Promise((resolveReadyNotification, rejectReadyNotification) => {
|
|
55
55
|
try {
|
|
56
|
-
process.send({ type: '
|
|
56
|
+
process.send({ type: 'aiworker:ready', port: activePort }, (error) => {
|
|
57
57
|
if (error) {
|
|
58
58
|
rejectReadyNotification(error);
|
|
59
59
|
return;
|
|
@@ -69,7 +69,7 @@ export const createServerStartupRuntime = (dependencies) => {
|
|
|
69
69
|
const displayHost = (bindHost === '0.0.0.0' || bindHost === '::' || bindHost === '[::]')
|
|
70
70
|
? 'localhost'
|
|
71
71
|
: (bindHost.includes(':') ? `[${bindHost}]` : bindHost);
|
|
72
|
-
console.log(`
|
|
72
|
+
console.log(`AiWorker server listening on ${bindHost}:${activePort}`);
|
|
73
73
|
console.log(`Health check: http://${displayHost}:${activePort}/health`);
|
|
74
74
|
console.log(`Web interface: http://${displayHost}:${activePort}`);
|
|
75
75
|
|
|
@@ -138,7 +138,7 @@ export const createServerStartupRuntime = (dependencies) => {
|
|
|
138
138
|
// Cover every signal a shell or dev harness may use to stop/restart us, so
|
|
139
139
|
// the managed OpenCode child is always torn down gracefully instead of
|
|
140
140
|
// orphaned: SIGINT/SIGQUIT (Ctrl+C/Ctrl+\), SIGTERM (kill/default), SIGHUP
|
|
141
|
-
// (terminal close), SIGUSR2 (nodemon restart
|
|
141
|
+
// (terminal close), SIGUSR2 (nodemon restart outside Windows).
|
|
142
142
|
process.on('SIGTERM', handleSignal);
|
|
143
143
|
process.on('SIGINT', handleSignal);
|
|
144
144
|
process.on('SIGQUIT', handleSignal);
|
|
@@ -98,7 +98,7 @@ export const createSessionRuntime = ({ writeSseEvent, getNotificationClients, br
|
|
|
98
98
|
|
|
99
99
|
if (typeof broadcastEvent === 'function') {
|
|
100
100
|
broadcastEvent({
|
|
101
|
-
type: '
|
|
101
|
+
type: 'aiworker:session-activity',
|
|
102
102
|
properties: {
|
|
103
103
|
sessionId,
|
|
104
104
|
phase,
|
|
@@ -149,7 +149,7 @@ export const createSessionRuntime = ({ writeSseEvent, getNotificationClients, br
|
|
|
149
149
|
if (!existing || existing.status !== status || attentionChanged || isRestartInterruption) {
|
|
150
150
|
const state = sessionStates.get(sessionId);
|
|
151
151
|
const syntheticPayload = {
|
|
152
|
-
type: '
|
|
152
|
+
type: 'aiworker:session-status',
|
|
153
153
|
properties: {
|
|
154
154
|
sessionID: sessionId,
|
|
155
155
|
status: state.status,
|
|
@@ -207,7 +207,7 @@ export const createSessionRuntime = ({ writeSseEvent, getNotificationClients, br
|
|
|
207
207
|
state.needsAttention = false;
|
|
208
208
|
|
|
209
209
|
const syntheticPayload = {
|
|
210
|
-
type: '
|
|
210
|
+
type: 'aiworker:session-status',
|
|
211
211
|
properties: {
|
|
212
212
|
sessionID: sessionId,
|
|
213
213
|
status: state.status,
|
|
@@ -47,7 +47,7 @@ describe('session runtime', () => {
|
|
|
47
47
|
runtime.markSessionViewed('session-1', 'client-1');
|
|
48
48
|
|
|
49
49
|
expect(events).toContainEqual({
|
|
50
|
-
type: '
|
|
50
|
+
type: 'aiworker:session-status',
|
|
51
51
|
properties: expect.objectContaining({
|
|
52
52
|
sessionID: 'session-1',
|
|
53
53
|
status: 'idle',
|
|
@@ -55,7 +55,7 @@ describe('session runtime', () => {
|
|
|
55
55
|
}),
|
|
56
56
|
});
|
|
57
57
|
expect(events.at(-1)).toEqual({
|
|
58
|
-
type: '
|
|
58
|
+
type: 'aiworker:session-status',
|
|
59
59
|
properties: {
|
|
60
60
|
sessionID: 'session-1',
|
|
61
61
|
status: 'idle',
|
|
@@ -90,7 +90,7 @@ describe('session runtime', () => {
|
|
|
90
90
|
});
|
|
91
91
|
|
|
92
92
|
expect(events).toContainEqual({
|
|
93
|
-
type: '
|
|
93
|
+
type: 'aiworker:session-status',
|
|
94
94
|
properties: expect.objectContaining({
|
|
95
95
|
sessionID: 'legacy-session-1',
|
|
96
96
|
status: 'busy',
|
|
@@ -132,7 +132,7 @@ describe('session runtime', () => {
|
|
|
132
132
|
});
|
|
133
133
|
|
|
134
134
|
const activityPhases = () => events
|
|
135
|
-
.filter((event) => event.type === '
|
|
135
|
+
.filter((event) => event.type === 'aiworker:session-activity')
|
|
136
136
|
.map((event) => event.properties.phase);
|
|
137
137
|
|
|
138
138
|
expect(activityPhases()).toEqual(['busy', 'cooldown']);
|
|
@@ -224,12 +224,12 @@ describe('session runtime', () => {
|
|
|
224
224
|
});
|
|
225
225
|
|
|
226
226
|
const terminalEvents = events.filter((event) => (
|
|
227
|
-
event.type === '
|
|
227
|
+
event.type === 'aiworker:session-status' || event.type === 'session.error'
|
|
228
228
|
));
|
|
229
229
|
expect(terminalEvents).toHaveLength(6);
|
|
230
230
|
for (const sessionId of ['session-busy-1', 'session-busy-2', 'session-busy-3']) {
|
|
231
231
|
expect(terminalEvents).toContainEqual({
|
|
232
|
-
type: '
|
|
232
|
+
type: 'aiworker:session-status',
|
|
233
233
|
properties: expect.objectContaining({
|
|
234
234
|
sessionID: sessionId,
|
|
235
235
|
status: 'idle',
|