feat: [v1.18.10] merge upstream OpenCode v1.17.9 → v1.18.10 (grafted 3-way) - #1054
feat: [v1.18.10] merge upstream OpenCode v1.17.9 → v1.18.10 (grafted 3-way)#1054anandgupta42 wants to merge 10 commits into
Conversation
- Split `auditExclude` out of `skipFiles` in `script/upstream/utils/config.ts`: 15 patterns (904 live files — `packages/opencode/test/**`, `packages/cli/**`, `patches/**`, generated SDK surfaces, repo-local `.opencode` metadata) were branding-audit exclusions but `merge.ts` treats `skipFiles` destructively (deletes matches, auto-resolves conflicts to upstream). Running a merge unpatched would have deleted the fork test suites. - `cleanupSkipFiles` now only deletes files the merge newly introduced (base-branch tracked files are never removed) — defense in depth. - `sanitizePackageJson` allowlist gains `imports` (was silently dropping the `#db` import map from `packages/opencode/package.json`). - Branding scan honors `auditExclude` (behavior identical: 0 leaks before/after). - `skipFiles` gains upstream v1.18.x web/preview packages we don't ship: `packages/client`, `packages/session-ui`, `packages/sdk-next`, `packages/httpapi-codegen`. Found via Codex review of the v1.18.10 merge plan. Tooling tests 29/29 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts: # .github/ISSUE_TEMPLATE/question.yml # .github/workflows/compliance-close.yml # .github/workflows/duplicate-issues.yml # .github/workflows/publish.yml # .github/workflows/storybook.yml # .github/workflows/test.yml # .github/workflows/triage.yml # .opencode/tool/github-triage.ts # AGENTS.md # README.zh.md # README.zht.md # bun.lock # infra/console.ts # infra/enterprise.ts # infra/lake.ts # infra/secret.ts # infra/stage.ts # infra/stats.ts # nix/desktop.nix # nix/hashes.json # nix/opencode.nix # package.json # packages/app/e2e/performance/README.md # packages/app/e2e/performance/timeline/session-tab-flash.spec.ts # packages/app/e2e/performance/timeline/session-tab-switch-benchmark.spec.ts # packages/app/e2e/performance/timeline/session-tab-switch-metrics.ts # packages/app/e2e/performance/timeline/session-tab-switch-probe.ts # packages/app/e2e/performance/timeline/session-timeline-benchmark.fixture.ts # packages/app/e2e/performance/timeline/session-timeline-benchmark.spec.ts # packages/app/e2e/performance/timeline/session-timeline-stress.fixture.ts # packages/app/e2e/performance/timeline/timeline-test-helpers.ts # packages/app/e2e/performance/unit/session-tab-switch-metrics.test.ts # packages/app/e2e/regression/prompt-thinking-level.spec.ts # packages/app/e2e/regression/session-list-path-loading.spec.ts # packages/app/e2e/regression/session-timeline-collapse-state.spec.ts # packages/app/e2e/regression/session-timeline-context-resize.spec.ts # packages/app/e2e/smoke/session-timeline.fixture.ts # packages/app/e2e/smoke/session-timeline.spec.ts # packages/app/e2e/tsconfig.json # packages/app/e2e/utils/mock-server.ts # packages/app/index.html # packages/app/package.json # packages/app/public/oc-theme-preload.js # packages/app/src/addons/serialize.test.ts # packages/app/src/addons/serialize.ts # packages/app/src/app.tsx # packages/app/src/components/debug-bar.tsx # packages/app/src/components/dialog-connect-provider.tsx # packages/app/src/components/dialog-custom-provider.tsx # packages/app/src/components/dialog-edit-project.tsx # packages/app/src/components/dialog-fork.tsx # packages/app/src/components/dialog-manage-models.tsx # packages/app/src/components/dialog-select-directory-v2.tsx # packages/app/src/components/dialog-select-directory.tsx # packages/app/src/components/dialog-select-file.tsx # packages/app/src/components/dialog-select-mcp.tsx # packages/app/src/components/dialog-select-model-unpaid.tsx # packages/app/src/components/dialog-select-model.tsx # packages/app/src/components/dialog-select-server.tsx # packages/app/src/components/dialog-settings.tsx # packages/app/src/components/directory-picker-domain.test.ts # packages/app/src/components/directory-picker-domain.ts # packages/app/src/components/file-tree.tsx # packages/app/src/components/help-button.tsx # packages/app/src/components/model-tooltip.tsx # packages/app/src/components/prompt-input.stories.tsx # packages/app/src/components/prompt-input.tsx # packages/app/src/components/prompt-input/attachments.ts # packages/app/src/components/prompt-input/build-request-parts.test.ts # packages/app/src/components/prompt-input/build-request-parts.ts # packages/app/src/components/prompt-input/context-items.tsx # packages/app/src/components/prompt-input/image-attachments.tsx # packages/app/src/components/prompt-input/placeholder.ts # packages/app/src/components/prompt-input/slash-popover.tsx # packages/app/src/components/prompt-input/submit.test.ts # packages/app/src/components/prompt-input/submit.ts # packages/app/src/components/server/server-row-menu.tsx # packages/app/src/components/server/server-row.tsx # packages/app/src/components/session-context-usage.tsx # packages/app/src/components/session/index.ts # packages/app/src/components/session/session-context-metrics.test.ts # packages/app/src/components/session/session-context-metrics.ts # packages/app/src/components/session/session-context-tab.tsx # packages/app/src/components/session/session-header.tsx # packages/app/src/components/session/session-sortable-tab.tsx # packages/app/src/components/settings-general.tsx # packages/app/src/components/settings-keybinds.tsx # packages/app/src/components/settings-providers.tsx # packages/app/src/components/settings-server-picker.tsx # packages/app/src/components/settings-v2/dialog-server-v2.tsx # packages/app/src/components/settings-v2/dialog-settings-v2.tsx # packages/app/src/components/settings-v2/general.tsx # packages/app/src/components/settings-v2/models.tsx # packages/app/src/components/settings-v2/providers.tsx # packages/app/src/components/settings-v2/servers.tsx # packages/app/src/components/settings-v2/settings-v2.css # packages/app/src/components/status-popover-body.tsx # packages/app/src/components/status-popover.tsx # packages/app/src/components/terminal.tsx # packages/app/src/components/titlebar-session-events.test.ts # packages/app/src/components/titlebar-session-events.ts # packages/app/src/components/titlebar.css # packages/app/src/components/titlebar.tsx # packages/app/src/context/command.test.ts # packages/app/src/context/command.tsx # packages/app/src/context/comments.tsx # packages/app/src/context/directory-sync.ts # packages/app/src/context/file.tsx # packages/app/src/context/file/path.test.ts # packages/app/src/context/file/path.ts # packages/app/src/context/file/tree-store.ts # packages/app/src/context/global-sync/bootstrap.test.ts # packages/app/src/context/global-sync/bootstrap.ts # packages/app/src/context/global-sync/child-store.test.ts # packages/app/src/context/global-sync/child-store.ts # packages/app/src/context/global-sync/event-reducer.test.ts # packages/app/src/context/global-sync/event-reducer.ts # packages/app/src/context/global-sync/mcp.test.ts # packages/app/src/context/global-sync/mcp.ts # packages/app/src/context/global-sync/session-cache.test.ts # packages/app/src/context/global-sync/session-cache.ts # packages/app/src/context/global-sync/session-load.ts # packages/app/src/context/global-sync/types.ts # packages/app/src/context/global-sync/utils.test.ts # packages/app/src/context/global-sync/utils.ts # packages/app/src/context/global.tsx # packages/app/src/context/layout.tsx # packages/app/src/context/local.tsx # packages/app/src/context/models.tsx # packages/app/src/context/notification.tsx # packages/app/src/context/permission-auto-respond.test.ts # packages/app/src/context/permission-auto-respond.ts # packages/app/src/context/permission.tsx # packages/app/src/context/platform.tsx # packages/app/src/context/prompt.tsx # packages/app/src/context/sdk.tsx # packages/app/src/context/server-sdk.test.ts # packages/app/src/context/server-sdk.tsx # packages/app/src/context/server-sync.test.ts # packages/app/src/context/server-sync.tsx # packages/app/src/context/server.test.ts # packages/app/src/context/server.tsx # packages/app/src/context/settings.tsx # packages/app/src/context/sync.tsx # packages/app/src/context/tabs.tsx # packages/app/src/context/terminal.tsx # packages/app/src/env.d.ts # packages/app/src/hooks/use-providers.ts # packages/app/src/i18n/ar.ts # packages/app/src/i18n/br.ts # packages/app/src/i18n/bs.ts # packages/app/src/i18n/da.ts # packages/app/src/i18n/de.ts # packages/app/src/i18n/en.ts # packages/app/src/i18n/es.ts # packages/app/src/i18n/fr.ts # packages/app/src/i18n/ja.ts # packages/app/src/i18n/ko.ts # packages/app/src/i18n/no.ts # packages/app/src/i18n/parity.test.ts # packages/app/src/i18n/pl.ts # packages/app/src/i18n/ru.ts # packages/app/src/i18n/th.ts # packages/app/src/i18n/tr.ts # packages/app/src/i18n/uk.ts # packages/app/src/i18n/zh.ts # packages/app/src/i18n/zht.ts # packages/app/src/index.css # packages/app/src/index.ts # packages/app/src/pages/directory-layout.tsx # packages/app/src/pages/error.tsx # packages/app/src/pages/home.tsx # packages/app/src/pages/layout.tsx # packages/app/src/pages/layout/helpers.ts # packages/app/src/pages/layout/project-avatar-state.ts # packages/app/src/pages/layout/sidebar-items.tsx # packages/app/src/pages/layout/sidebar-project.tsx # packages/app/src/pages/layout/sidebar-workspace.tsx # packages/app/src/pages/new-session.tsx # packages/app/src/pages/session.tsx # packages/app/src/pages/session/composer/index.ts # packages/app/src/pages/session/composer/session-composer-region.tsx # packages/app/src/pages/session/composer/session-composer-state.test.ts # packages/app/src/pages/session/composer/session-composer-state.ts # packages/app/src/pages/session/composer/session-permission-dock.tsx # packages/app/src/pages/session/composer/session-question-dock.tsx # packages/app/src/pages/session/composer/session-revert-dock.tsx # packages/app/src/pages/session/composer/session-todo-dock.tsx # packages/app/src/pages/session/file-tabs.tsx # packages/app/src/pages/session/helpers.test.ts # packages/app/src/pages/session/helpers.ts # packages/app/src/pages/session/review-tab.tsx # packages/app/src/pages/session/session-layout.ts # packages/app/src/pages/session/session-model-helpers.test.ts # packages/app/src/pages/session/session-model-helpers.ts # packages/app/src/pages/session/session-side-panel.tsx # packages/app/src/pages/session/terminal-panel.tsx # packages/app/src/pages/session/timeline/message-timeline.tsx # packages/app/src/pages/session/timeline/model.test.ts # packages/app/src/pages/session/timeline/model.ts # packages/app/src/pages/session/timeline/projection.ts # packages/app/src/pages/session/timeline/rows.ts # packages/app/src/pages/session/usage-exceeded-dialogs.tsx # packages/app/src/pages/session/use-session-commands.tsx # packages/app/src/utils/diffs.test.ts # packages/app/src/utils/diffs.ts # packages/app/src/utils/persist.ts # packages/app/src/utils/server-errors.test.ts # packages/app/src/utils/server-errors.ts # packages/app/src/utils/server-health.test.ts # packages/app/src/utils/server-health.ts # packages/app/src/utils/server.ts # packages/app/src/utils/terminal-websocket-url.test.ts # packages/app/src/utils/terminal-websocket-url.ts # packages/app/src/utils/toast.tsx # packages/app/src/wsl/dialog-add-server.tsx # packages/app/src/wsl/settings-model.test.ts # packages/app/src/wsl/settings-model.ts # packages/app/src/wsl/settings.tsx # packages/app/src/wsl/types.ts # packages/app/test-browser/solid-virtual.test.ts # packages/console/app/package.json # packages/console/app/public/robots.txt # packages/console/app/src/asset/brand/preview-opencode-logo-dark-square.png # packages/console/app/src/asset/brand/preview-opencode-logo-light-square.png # packages/console/app/src/i18n/ar.ts # packages/console/app/src/i18n/br.ts # packages/console/app/src/i18n/da.ts # packages/console/app/src/i18n/de.ts # packages/console/app/src/i18n/en.ts # packages/console/app/src/i18n/es.ts # packages/console/app/src/i18n/fr.ts # packages/console/app/src/i18n/it.ts # packages/console/app/src/i18n/ja.ts # packages/console/app/src/i18n/ko.ts # packages/console/app/src/i18n/no.ts # packages/console/app/src/i18n/pl.ts # packages/console/app/src/i18n/ru.ts # packages/console/app/src/i18n/th.ts # packages/console/app/src/i18n/tr.ts # packages/console/app/src/i18n/uk.ts # packages/console/app/src/i18n/zh.ts # packages/console/app/src/i18n/zht.ts # packages/console/app/src/lib/stats-proxy.ts # packages/console/app/src/routes/brand/index.css # packages/console/app/src/routes/download/index.css # packages/console/app/src/routes/download/index.tsx # packages/console/app/src/routes/enterprise/index.tsx # packages/console/app/src/routes/feishu.ts # packages/console/app/src/routes/go/index.css # packages/console/app/src/routes/go/index.tsx # packages/console/app/src/routes/honeycomb/webhook.ts # packages/console/app/src/routes/workspace/[id]/go/lite-section.module.css # packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx # packages/console/app/src/routes/workspace/[id]/settings/settings-section.tsx # packages/console/app/src/routes/zen/util/error.ts # packages/console/app/src/routes/zen/util/handler.ts # packages/console/app/src/routes/zen/util/modelTpsLimiter.ts # packages/console/app/src/routes/zen/util/provider/anthropic.ts # packages/console/app/src/routes/zen/util/provider/google.ts # packages/console/app/src/routes/zen/util/provider/openai-compatible.ts # packages/console/app/src/routes/zen/util/provider/openai.ts # packages/console/app/src/routes/zen/util/provider/provider.ts # packages/console/app/src/routes/zen/util/providerBudgetTracker.ts # packages/console/app/test/providerUsage.test.ts # packages/console/core/package.json # packages/console/core/src/account.ts # packages/console/core/src/model.ts # packages/console/core/src/referral.ts # packages/console/core/src/schema/workspace.sql.ts # packages/console/core/src/user.ts # packages/console/core/src/workspace.ts # packages/console/function/package.json # packages/console/function/src/log-processor.ts # packages/console/mail/package.json # packages/console/support/package.json # packages/core/src/config.ts # packages/core/src/effect/layer-node.ts # packages/core/src/event.ts # packages/core/src/filesystem/search.ts # packages/core/src/location-layer.ts # packages/core/src/plugin/provider/openai-auth.ts # packages/core/src/schema.ts # packages/core/src/tool/webfetch.ts # packages/desktop/electron-builder.config.test.ts # packages/desktop/electron-builder.config.ts # packages/desktop/electron.vite.config.ts # packages/desktop/package.json # packages/desktop/scripts/prebuild.ts # packages/desktop/scripts/predev.ts # packages/desktop/scripts/utils.ts # packages/desktop/src/main/index.ts # packages/desktop/src/main/ipc.ts # packages/desktop/src/main/server.ts # packages/desktop/src/main/store-keys.ts # packages/desktop/src/main/store.ts # packages/desktop/src/main/unresponsive.ts # packages/desktop/src/main/updater.ts # packages/desktop/src/main/windows.ts # packages/desktop/src/main/wsl/ipc.ts # packages/desktop/src/main/wsl/policy.ts # packages/desktop/src/main/wsl/servers.test.ts # packages/desktop/src/main/wsl/servers.ts # packages/desktop/src/preload/index.ts # packages/desktop/src/preload/types.ts # packages/desktop/src/renderer/index.tsx # packages/enterprise/package.json # packages/enterprise/src/app.css # packages/enterprise/src/core/share.ts # packages/enterprise/src/routes/api/[...path].ts # packages/enterprise/src/routes/share/[shareID].tsx # packages/enterprise/test/core/share.test.ts # packages/function/package.json # packages/opencode/package.json # packages/opencode/script/build.ts # packages/opencode/src/account/account.ts # packages/opencode/src/account/repo.ts # packages/opencode/src/acp/directory.ts # packages/opencode/src/acp/usage.ts # packages/opencode/src/agent/agent.ts # packages/opencode/src/auth/index.ts # packages/opencode/src/cli/cmd/run.ts # packages/opencode/src/cli/cmd/tui.ts # packages/opencode/src/cli/tui/worker.ts # packages/opencode/src/command/index.ts # packages/opencode/src/config/config.ts # packages/opencode/src/config/tui.ts # packages/opencode/src/control-plane/workspace.ts # packages/opencode/src/effect/app-runtime.ts # packages/opencode/src/effect/runtime-flags.ts # packages/opencode/src/event-v2-bridge.ts # packages/opencode/src/format/index.ts # packages/opencode/src/git/index.ts # packages/opencode/src/image/image.ts # packages/opencode/src/installation/index.ts # packages/opencode/src/lsp/lsp.ts # packages/opencode/src/mcp/auth.ts # packages/opencode/src/mcp/index.ts # packages/opencode/src/mcp/oauth-callback.ts # packages/opencode/src/permission/index.ts # packages/opencode/src/plugin/digitalocean.ts # packages/opencode/src/plugin/github-copilot/models.ts # packages/opencode/src/plugin/index.ts # packages/opencode/src/plugin/openai/codex.ts # packages/opencode/src/plugin/snowflake-cortex.ts # packages/opencode/src/plugin/xai.ts # packages/opencode/src/project/bootstrap.ts # packages/opencode/src/project/instance-store.ts # packages/opencode/src/project/project.ts # packages/opencode/src/project/vcs.ts # packages/opencode/src/provider/auth.ts # packages/opencode/src/provider/provider.ts # packages/opencode/src/provider/transform.ts # packages/opencode/src/question/index.ts # packages/opencode/src/question/schema.ts # packages/opencode/src/server/server.ts # packages/opencode/src/session/compaction.ts # packages/opencode/src/session/instruction.ts # packages/opencode/src/session/llm.ts # packages/opencode/src/session/message-v2.ts # packages/opencode/src/session/processor.ts # packages/opencode/src/session/prompt.ts # packages/opencode/src/session/revert.ts # packages/opencode/src/session/run-state.ts # packages/opencode/src/session/schema.ts # packages/opencode/src/session/session.ts # packages/opencode/src/session/status.ts # packages/opencode/src/session/summary.ts # packages/opencode/src/session/system.ts # packages/opencode/src/session/todo.ts # packages/opencode/src/session/tools.ts # packages/opencode/src/share/session.ts # packages/opencode/src/share/share-next.ts # packages/opencode/src/skill/discovery.ts # packages/opencode/src/skill/index.ts # packages/opencode/src/snapshot/index.ts # packages/opencode/src/storage/storage.ts # packages/opencode/src/tool/registry.ts # packages/opencode/src/tool/skill.ts # packages/opencode/src/tool/task.ts # packages/opencode/src/tool/truncate.ts # packages/opencode/src/worktree/index.ts # packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap # packages/opencode/test/cli/import.test.ts # packages/opencode/test/cli/tui/thread.test.ts # packages/opencode/test/config/config.test.ts # packages/opencode/test/lib/cli-process.ts # packages/opencode/test/mcp/headers.test.ts # packages/opencode/test/mcp/lifecycle.test.ts # packages/opencode/test/mcp/oauth-callback.test.ts # packages/opencode/test/permission/next.test.ts # packages/opencode/test/plugin/workspace-adapter.test.ts # packages/opencode/test/project/project.test.ts # packages/opencode/test/project/worktree.test.ts # packages/opencode/test/provider/digitalocean.test.ts # packages/opencode/test/provider/header-timeout.test.ts # packages/opencode/test/provider/provider.test.ts # packages/opencode/test/provider/transform.test.ts # packages/opencode/test/server/httpapi-instance-context.test.ts # packages/opencode/test/server/httpapi-promptasync-context.test.ts # packages/opencode/test/server/httpapi-provider.test.ts # packages/opencode/test/server/httpapi-reference.test.ts # packages/opencode/test/session/compaction.test.ts # packages/opencode/test/session/instruction.test.ts # packages/opencode/test/session/llm-native-recorded.test.ts # packages/opencode/test/session/llm.test.ts # packages/opencode/test/session/messages-pagination.test.ts # packages/opencode/test/session/processor-effect.test.ts # packages/opencode/test/session/prompt.test.ts # packages/opencode/test/session/retry.test.ts # packages/opencode/test/session/system.test.ts # packages/opencode/test/tool/fixtures/models-api.json # packages/opencode/test/tool/question.test.ts # packages/opencode/test/tool/registry.test.ts # packages/opencode/test/tool/skill.test.ts # packages/opencode/test/tool/write.test.ts # packages/server/src/handlers/event.ts # packages/session-ui/src/components/apply-patch-file.test.ts # packages/session-ui/src/components/apply-patch-file.ts # packages/session-ui/src/components/basic-tool.css # packages/session-ui/src/components/basic-tool.stories.tsx # packages/session-ui/src/components/basic-tool.tsx # packages/session-ui/src/components/dock-prompt.stories.tsx # packages/session-ui/src/components/dock-prompt.tsx # packages/session-ui/src/components/file-media.tsx # packages/session-ui/src/components/file-search.tsx # packages/session-ui/src/components/file-ssr.tsx # packages/session-ui/src/components/file.css # packages/session-ui/src/components/file.tsx # packages/session-ui/src/components/line-comment-annotations.tsx # packages/session-ui/src/components/line-comment-styles.ts # packages/session-ui/src/components/line-comment.stories.tsx # packages/session-ui/src/components/line-comment.tsx # packages/session-ui/src/components/markdown-code-state.test.ts # packages/session-ui/src/components/markdown-code-state.ts # packages/session-ui/src/components/markdown-shiki.worker.ts # packages/session-ui/src/components/markdown-stream.test.ts # packages/session-ui/src/components/markdown-stream.ts # packages/session-ui/src/components/markdown-worker-protocol.test.ts # packages/session-ui/src/components/markdown-worker-protocol.ts # packages/session-ui/src/components/markdown-worker-queue.test.ts # packages/session-ui/src/components/markdown-worker-queue.ts # packages/session-ui/src/components/markdown-worker-transport.test.ts # packages/session-ui/src/components/markdown-worker-transport.ts # packages/session-ui/src/components/markdown-worker.ts # packages/session-ui/src/components/markdown.stories.tsx # packages/session-ui/src/components/markdown.tsx # packages/session-ui/src/components/message-file.test.ts # packages/session-ui/src/components/message-nav.css # packages/session-ui/src/components/message-nav.stories.tsx # packages/session-ui/src/components/message-nav.tsx # packages/session-ui/src/components/message-part-text.ts # packages/session-ui/src/components/message-part.css # packages/session-ui/src/components/message-part.stories.tsx # packages/session-ui/src/components/message-part.test.ts # packages/session-ui/src/components/message-part.tsx # packages/session-ui/src/components/session-diff.test.ts # packages/session-ui/src/components/session-diff.ts # packages/session-ui/src/components/session-retry.tsx # packages/session-ui/src/components/session-review.css # packages/session-ui/src/components/session-review.stories.tsx # packages/session-ui/src/components/session-review.tsx # packages/session-ui/src/components/session-turn.css # packages/session-ui/src/components/session-turn.stories.tsx # packages/session-ui/src/components/session-turn.tsx # packages/session-ui/src/components/shell-submessage-motion.stories.tsx # packages/session-ui/src/components/shell-submessage.css # packages/session-ui/src/components/timeline-playground.stories.tsx # packages/session-ui/src/components/tool-count-label.css # packages/session-ui/src/components/tool-count-label.tsx # packages/session-ui/src/components/tool-count-summary.css # packages/session-ui/src/components/tool-count-summary.stories.tsx # packages/session-ui/src/components/tool-count-summary.tsx # packages/session-ui/src/components/tool-error-card.css # packages/session-ui/src/components/tool-error-card.stories.tsx # packages/session-ui/src/components/tool-error-card.tsx # packages/session-ui/src/components/tool-status-title.css # packages/session-ui/src/components/tool-status-title.tsx # packages/session-ui/src/context/data.tsx # packages/session-ui/src/pierre/comment-hover.ts # packages/session-ui/src/pierre/commented-lines.ts # packages/session-ui/src/pierre/diff-selection.ts # packages/session-ui/src/pierre/file-find.ts # packages/session-ui/src/pierre/file-runtime.ts # packages/session-ui/src/pierre/file-selection.ts # packages/session-ui/src/pierre/index.ts # packages/session-ui/src/pierre/media.ts # packages/session-ui/src/pierre/selection-bridge.ts # packages/session-ui/src/pierre/virtualizer.ts # packages/session-ui/src/pierre/worker.ts # packages/session-ui/src/v2/components/basic-tool-v2.css # packages/session-ui/src/v2/components/basic-tool-v2.stories.tsx # packages/session-ui/src/v2/components/basic-tool-v2.tsx # packages/session-ui/src/v2/components/tool-error-card-v2.css # packages/session-ui/src/v2/components/tool-error-card-v2.stories.tsx # packages/session-ui/src/v2/components/tool-error-card-v2.tsx # packages/slack/package.json # packages/stats/app/package.json # packages/stats/app/src/app.tsx # packages/stats/app/src/entry-server.tsx # packages/stats/app/src/routes/[lab]/[model].tsx # packages/stats/app/src/routes/[lab]/index.tsx # packages/stats/app/src/routes/api/health.ts # packages/stats/app/src/routes/index.css # packages/stats/app/src/routes/index.tsx # packages/stats/app/src/routes/model-catalog.ts # packages/stats/app/src/routes/stats-shell.tsx # packages/stats/core/package.json # packages/stats/core/src/athena.ts # packages/stats/core/src/database.ts # packages/stats/core/src/domain/home.ts # packages/stats/core/src/domain/inference.ts # packages/stats/core/src/domain/model.ts # packages/stats/core/src/honeycomb-backfill.ts # packages/stats/core/src/stat-sync.ts # packages/stats/server/package.json # packages/stats/server/src/ingest.ts # packages/stats/server/src/stat-sync.ts # packages/storybook/.storybook/main.ts # packages/storybook/.storybook/mocks/app/components/dialog-select-model.tsx # packages/storybook/.storybook/mocks/app/context/command.ts # packages/storybook/.storybook/mocks/app/context/language.ts # packages/storybook/.storybook/mocks/app/context/prompt.ts # packages/storybook/.storybook/mocks/app/context/sync.ts # packages/storybook/.storybook/mocks/app/hooks/use-providers.ts # packages/storybook/.storybook/playground-css-plugin.ts # packages/storybook/.storybook/preview.tsx # packages/storybook/package.json # packages/tui/LICENSE # packages/tui/script/pack.ts # packages/tui/script/publish.ts # packages/tui/src/assets/fonts/Inter.ttf # packages/tui/src/assets/fonts/JetBrainsMonoNerdFontMono-Regular.woff2 # packages/tui/src/component/error-component.tsx # packages/tui/src/component/logo.tsx # packages/tui/src/component/prompt/index.tsx # packages/tui/src/context/marked-code-span.test.ts # packages/tui/src/context/marked-code-span.ts # packages/tui/src/context/sync.tsx # packages/tui/src/feature-plugins/home/tips-view.tsx # packages/tui/src/routes/session/index.tsx # packages/tui/src/v2/components/divider-v2.css # packages/tui/src/v2/components/divider-v2.stories.tsx # packages/tui/src/v2/components/divider-v2.tsx # packages/tui/src/v2/components/file-tree-v2.css # packages/tui/src/v2/components/loader-v2.css # packages/tui/src/v2/components/loader-v2.stories.tsx # packages/tui/src/v2/components/loader-v2.tsx # packages/tui/src/v2/components/progress-circle-v2.css # packages/tui/src/v2/components/progress-circle-v2.tsx # packages/tui/src/v2/components/split-button-v2.css # packages/tui/src/v2/components/split-button-v2.tsx # packages/tui/test/cli/tui/diff-viewer.test.tsx # packages/tui/tsconfig.build.json # packages/ui/package.json # packages/ui/script/colors.txt # packages/ui/src/assets/favicon/site.webmanifest # packages/ui/src/components/accordion.css # packages/ui/src/components/card.css # packages/ui/src/components/card.tsx # packages/ui/src/components/collapsible.css # packages/ui/src/components/dialog.css # packages/ui/src/components/dock-surface.css # packages/ui/src/components/icon.stories.tsx # packages/ui/src/components/icon.tsx # packages/ui/src/components/motion-spring.tsx # packages/ui/src/components/progress-circle.css # packages/ui/src/components/progress-circle.tsx # packages/ui/src/components/resize-handle.tsx # packages/ui/src/components/scroll-view.css # packages/ui/src/components/scroll-view.test.ts # packages/ui/src/components/scroll-view.tsx # packages/ui/src/components/select.css # packages/ui/src/components/tabs.css # packages/ui/src/components/tooltip.tsx # packages/ui/src/context/index.ts # packages/ui/src/context/marked.tsx # packages/ui/src/i18n/ar.ts # packages/ui/src/i18n/br.ts # packages/ui/src/i18n/bs.ts # packages/ui/src/i18n/da.ts # packages/ui/src/i18n/de.ts # packages/ui/src/i18n/en.ts # packages/ui/src/i18n/es.ts # packages/ui/src/i18n/fr.ts # packages/ui/src/i18n/ja.ts # packages/ui/src/i18n/ko.ts # packages/ui/src/i18n/no.ts # packages/ui/src/i18n/pl.ts # packages/ui/src/i18n/ru.ts # packages/ui/src/i18n/th.ts # packages/ui/src/i18n/tr.ts # packages/ui/src/i18n/uk.ts # packages/ui/src/i18n/zh.ts # packages/ui/src/i18n/zht.ts # packages/ui/src/styles/index.css # packages/ui/src/styles/tailwind/colors.css # packages/ui/src/styles/tailwind/utilities.css # packages/ui/src/styles/theme.css # packages/ui/src/theme/context.tsx # packages/ui/src/theme/themes/oc-2.json # packages/ui/src/theme/v2/mapping.ts # packages/ui/src/v2/components/accordion-v2.css # packages/ui/src/v2/components/badge-v2.css # packages/ui/src/v2/components/badge-v2.stories.tsx # packages/ui/src/v2/components/badge-v2.tsx # packages/ui/src/v2/components/button-v2.css # packages/ui/src/v2/components/button-v2.stories.tsx # packages/ui/src/v2/components/button-v2.tsx # packages/ui/src/v2/components/checkbox-v2.css # packages/ui/src/v2/components/dialog-v2.css # packages/ui/src/v2/components/dialog-v2.stories.tsx # packages/ui/src/v2/components/dialog-v2.tsx # packages/ui/src/v2/components/diff-changes-v2.css # packages/ui/src/v2/components/field-v2.css # packages/ui/src/v2/components/icon-button-v2.css # packages/ui/src/v2/components/icon.tsx # packages/ui/src/v2/components/inline-input-v2.css # packages/ui/src/v2/components/inline-input-v2.tsx # packages/ui/src/v2/components/line-comment-v2.css # packages/ui/src/v2/components/line-comment-v2.tsx # packages/ui/src/v2/components/project-avatar-v2.css # packages/ui/src/v2/components/project-avatar-v2.stories.tsx # packages/ui/src/v2/components/project-avatar-v2.tsx # packages/ui/src/v2/components/radio-v2.css # packages/ui/src/v2/components/segmented-control-v2.css # packages/ui/src/v2/components/select-v2.css # packages/ui/src/v2/components/select-v2.tsx # packages/ui/src/v2/components/switch-v2.css # packages/ui/src/v2/components/tabs-v2.css # packages/ui/src/v2/components/text-input-v2.css # packages/ui/src/v2/components/text-input-v2.tsx # packages/ui/src/v2/components/text-shimmer-v2.css # packages/ui/src/v2/components/textarea-v2.css # packages/ui/src/v2/components/toast-v2.css # packages/ui/src/v2/components/toast-v2.stories.tsx # packages/ui/src/v2/components/toast-v2.tsx # packages/ui/src/v2/components/tooltip-v2.css # packages/ui/src/v2/components/tooltip-v2.tsx # packages/ui/src/v2/components/wordmark-v2.tsx # packages/ui/src/v2/styles/theme.css # packages/ui/vite.config.ts # packages/util/V1_API_MIGRATION.md # packages/util/e2e/performance/timeline-stability/README.md # packages/util/e2e/performance/timeline-stability/adverse.spec.ts # packages/util/e2e/performance/timeline-stability/context-matrix.spec.ts # packages/util/e2e/performance/timeline-stability/environment-matrix.spec.ts # packages/util/e2e/performance/timeline-stability/file-matrix.spec.ts # packages/util/e2e/performance/timeline-stability/file-mutation.spec.ts # packages/util/e2e/performance/timeline-stability/fixture.test.ts # packages/util/e2e/performance/timeline-stability/fixture.ts # packages/util/e2e/performance/timeline-stability/interaction.spec.ts # packages/util/e2e/performance/timeline-stability/lifecycle.spec.ts # packages/util/e2e/performance/timeline-stability/oracle-browser.spec.ts # packages/util/e2e/performance/timeline-stability/playwright.config.ts # packages/util/e2e/performance/timeline-stability/scroll-interaction.spec.ts # packages/util/e2e/performance/timeline-stability/shell-matrix.spec.ts # packages/util/e2e/performance/timeline-stability/tool-mutation.spec.ts # packages/util/e2e/performance/timeline-stability/tools.spec.ts # packages/util/e2e/performance/timeline-stability/transition-matrix.spec.ts # packages/util/e2e/performance/timeline/first-navigation-benchmark.spec.ts # packages/util/e2e/performance/timeline/first-navigation-metrics.ts # packages/util/e2e/performance/timeline/first-navigation-probe.ts # packages/util/e2e/performance/timeline/home-tab-navigation-benchmark.spec.ts # packages/util/e2e/performance/timeline/navigation-milestones.ts # packages/util/e2e/performance/timeline/review-pane-scaling-benchmark.spec.ts # packages/util/e2e/performance/timeline/session-parent-hydration-benchmark.spec.ts # packages/util/e2e/performance/unit/first-navigation-metrics.test.ts # packages/util/e2e/performance/unit/mock-server.test.ts # packages/util/e2e/performance/unit/navigation-milestones.test.ts # packages/util/e2e/performance/unit/session-tab-switch-probe.test.ts # packages/util/e2e/performance/unit/timeline-test-helpers.test.ts # packages/util/e2e/performance/unit/visual-stability.test.ts # packages/util/e2e/regression/cross-server-tab-close.spec.ts # packages/util/e2e/regression/file-browser-sidebar-tab-switch.spec.ts # packages/util/e2e/regression/legacy-new-session.spec.ts # packages/util/e2e/regression/new-session-panel-corner.spec.ts # packages/util/e2e/regression/open-file-expand-folder.spec.ts # packages/util/e2e/regression/prompt-input-v2-command-draft.spec.ts # packages/util/e2e/regression/remote-session-settings.spec.ts # packages/util/e2e/regression/remote-tab-busy.spec.ts # packages/util/e2e/regression/review-image-flash.spec.ts # packages/util/e2e/regression/review-line-comment.spec.ts # packages/util/e2e/regression/review-open-file.spec.ts # packages/util/e2e/regression/review-state-persistence.spec.ts # packages/util/e2e/regression/review-tab-switch.spec.ts # packages/util/e2e/regression/review-terminal-stacked.spec.ts # packages/util/e2e/regression/session-request-docks.spec.ts # packages/util/e2e/regression/session-timeline-accessibility.spec.ts # packages/util/e2e/regression/session-timeline-context-state.spec.ts # packages/util/e2e/regression/session-timeline-file-projection.spec.ts # packages/util/e2e/regression/session-timeline-file-state.spec.ts # packages/util/e2e/regression/session-timeline-history-root.spec.ts # packages/util/e2e/regression/session-timeline-lifecycle-state.spec.ts # packages/util/e2e/regression/session-timeline-locale-projection.spec.ts # packages/util/e2e/regression/session-timeline-projection.spec.ts # packages/util/e2e/regression/session-timeline-reasoning-projection.spec.ts # packages/util/e2e/regression/session-timeline-reducer-projection.spec.ts # packages/util/e2e/regression/session-timeline-shell-outline.spec.ts # packages/util/e2e/regression/session-timeline-tool-projection.spec.ts # packages/util/e2e/regression/session-timeline-tool-state.spec.ts # packages/util/e2e/regression/session-timeline-transport.spec.ts # packages/util/e2e/regression/session-todo-dock-navigation.spec.ts # packages/util/e2e/regression/subagent-child-navigation.spec.ts # packages/util/e2e/regression/tab-navigate-mousedown.spec.ts # packages/util/e2e/regression/terminal-composer-focus.spec.ts # packages/util/e2e/regression/terminal-hidden.spec.ts # packages/util/e2e/regression/terminal-tab-switch.spec.ts # packages/util/e2e/reproduction/timeline-suspense/index.html # packages/util/e2e/reproduction/timeline-suspense/main.tsx # packages/util/e2e/reproduction/timeline-suspense/playwright.config.ts # packages/util/e2e/reproduction/timeline-suspense/timeline-suspense.repro.ts # packages/util/e2e/reproduction/timeline-suspense/vite.config.ts # packages/util/e2e/user-story/model-selection-flow.spec.ts # packages/util/e2e/utils/sse-transport.ts # packages/util/e2e/utils/visual-stability.ts # packages/util/e2e/utils/visual-stability/analyzer.ts # packages/util/e2e/utils/visual-stability/capture.ts # packages/util/e2e/utils/visual-stability/index.ts # packages/util/e2e/utils/visual-stability/invariant.ts # packages/util/e2e/utils/visual-stability/model.ts # packages/util/e2e/utils/visual-stability/probe.ts # packages/util/e2e/utils/visual-stability/regions.ts # packages/util/e2e/utils/visual-stability/reporter.ts # packages/util/e2e/utils/visual-stability/scenario.ts # packages/util/src/assets/help/home.png # packages/util/src/assets/help/introducing-tabs.mp4 # packages/util/src/assets/help/placeholder.png # packages/util/src/assets/help/tabs.png # packages/util/src/components/command-palette.ts # packages/util/src/components/command-tooltip-keybind.test.ts # packages/util/src/components/command-tooltip-keybind.ts # packages/util/src/components/dialog-command-palette-v2.css # packages/util/src/components/dialog-command-palette-v2.tsx # packages/util/src/components/dialog-connect-provider.stories.tsx # packages/util/src/components/dialog-edit-project-v2.tsx # packages/util/src/components/dialog-select-model-search.test.ts # packages/util/src/components/dialog-select-model-search.ts # packages/util/src/components/dialog-select-model-unpaid-v2.stories.tsx # packages/util/src/components/dialog-select-model-unpaid-v2.tsx # packages/util/src/components/edit-project.ts # packages/util/src/components/file-tree-v2-model.test.ts # packages/util/src/components/file-tree-v2-model.ts # packages/util/src/components/file-tree-v2.tsx # packages/util/src/components/prompt-input-v2.tsx # packages/util/src/components/prompt-input/contracts.ts # packages/util/src/components/prompt-input/history-store.ts # packages/util/src/components/prompt-input/image-attachments.css # packages/util/src/components/prompt-input/submission-state.ts # packages/util/src/components/prompt-input/transient-state.ts # packages/util/src/components/prompt-project-selector.tsx # packages/util/src/components/prompt-workspace-selector.tsx # packages/util/src/components/session/open-in-app-v2.tsx # packages/util/src/components/session/open-in-app.tsx # packages/util/src/components/session/session-sortable-tab-v2.tsx # packages/util/src/components/session/session-sortable-terminal-tab-v2.tsx # packages/util/src/components/settings-dialog.tsx # packages/util/src/components/settings-v2/general-controller-behavior.ts # packages/util/src/components/settings-v2/general-controllers.test.ts # packages/util/src/components/settings-v2/general-controllers.ts # packages/util/src/components/settings-v2/interface-transition.stories.tsx # packages/util/src/components/settings-v2/interface-transition.tsx # packages/util/src/components/status-popover-indicator.test.ts # packages/util/src/components/status-popover-indicator.ts # packages/util/src/components/titlebar-tab-gesture.test.ts # packages/util/src/components/titlebar-tab-gesture.ts # packages/util/src/components/titlebar-tab-nav.css # packages/util/src/components/titlebar-tab-nav.tsx # packages/util/src/components/titlebar-tab-order.test.ts # packages/util/src/components/titlebar-tab-order.ts # packages/util/src/components/titlebar-tab-popover.css # packages/util/src/components/titlebar-tab-popover.tsx # packages/util/src/components/titlebar-tab-strip.tsx # packages/util/src/components/ui/drawer.tsx # packages/util/src/components/virtual-scroll-element.test.ts # packages/util/src/components/virtual-scroll-element.ts # packages/util/src/context/closed-tabs.ts # packages/util/src/context/global-sync/home-session-index.test.ts # packages/util/src/context/global-sync/home-session-index.ts # packages/util/src/context/layout-tabs.test.ts # packages/util/src/context/layout-tabs.ts # packages/util/src/context/local-agent.test.ts # packages/util/src/context/local-agent.ts # packages/util/src/context/prompt-state.test.ts # packages/util/src/context/prompt-state.ts # packages/util/src/context/server-session-v2-reducer.test.ts # packages/util/src/context/server-session-v2-reducer.ts # packages/util/src/context/server-session.test.ts # packages/util/src/context/server-session.ts # packages/util/src/context/settings.test.ts # packages/util/src/context/tab-memory.ts # packages/util/src/context/tab-migration.ts # packages/util/src/context/tabs.test.ts # packages/util/src/desktop-menu.test.ts # packages/util/src/hooks/provider-catalog.test.ts # packages/util/src/hooks/provider-catalog.ts # packages/util/src/pages/home-session-archive.test.ts # packages/util/src/pages/home-session-archive.ts # packages/util/src/pages/home-session-open.test.ts # packages/util/src/pages/home-session-open.ts # packages/util/src/pages/home/home-controller.ts # packages/util/src/pages/home/home-projects-controller.tsx # packages/util/src/pages/home/home-projects-view.tsx # packages/util/src/pages/home/home-projects.tsx # packages/util/src/pages/home/home-scroll-controller.ts # packages/util/src/pages/home/home-session-search-controller.ts # packages/util/src/pages/home/home-sessions-controller.tsx # packages/util/src/pages/home/home-sessions-view.tsx # packages/util/src/pages/home/home-sessions.tsx # packages/util/src/pages/home/legacy-home.tsx # packages/util/src/pages/layout-new.tsx # packages/util/src/pages/layout/session-tab-avatar.tsx # packages/util/src/pages/new-session/new-session-draft-controller.ts # packages/util/src/pages/new-session/new-session-view.tsx # packages/util/src/pages/new-session/new-session-workspace-controller.test.ts # packages/util/src/pages/new-session/new-session-workspace-controller.ts # packages/util/src/pages/new-session/use-new-session-commands.tsx # packages/util/src/pages/session/composer/prompt-model-selection.ts # packages/util/src/pages/session/composer/session-composer-controls.ts # packages/util/src/pages/session/composer/session-composer-region-controller.ts # packages/util/src/pages/session/composer/session-revert-dock.stories.tsx # packages/util/src/pages/session/composer/todo-panel-motion.stories.tsx # packages/util/src/pages/session/session-lineage.ts # packages/util/src/pages/session/session-ownership.ts # packages/util/src/pages/session/session-panel-layout.test.ts # packages/util/src/pages/session/session-panel-layout.ts # packages/util/src/pages/session/session-panel-width.test.ts # packages/util/src/pages/session/session-panel-width.ts # packages/util/src/pages/session/terminal-panel-v2.tsx # packages/util/src/pages/session/timeline/observe-element-offset.test.ts # packages/util/src/pages/session/timeline/observe-element-offset.ts # packages/util/src/pages/session/timeline/projection.test.ts # packages/util/src/pages/session/timeline/row-reconciliation.ts # packages/util/src/pages/session/timeline/rows-current.test.ts # packages/util/src/pages/session/timeline/summary-diffs.test.ts # packages/util/src/pages/session/timeline/summary-diffs.ts # packages/util/src/pages/session/timeline/timeline-row.ts # packages/util/src/pages/session/timeline/virtual-items.ts # packages/util/src/pages/session/use-composer-commands.tsx # packages/util/src/pages/session/v2/review-diff-kinds.test.ts # packages/util/src/pages/session/v2/review-diff-kinds.ts # packages/util/src/pages/session/v2/review-panel-v2-state.ts # packages/util/src/pages/session/v2/review-panel-v2.tsx # packages/util/src/pages/session/v2/session-file-browser-tab.tsx # packages/util/src/pages/session/v2/session-file-list-v2.tsx # packages/util/src/utils/file-manager.ts # packages/util/src/utils/menu-dismiss-controller.ts # packages/util/src/utils/search-keydown.ts # packages/util/src/utils/server-compat.test.ts # packages/util/src/utils/server-compat.ts # packages/util/src/utils/server-protocol.test.ts # packages/util/src/utils/server-protocol.ts # packages/util/src/utils/session-message.test.ts # packages/util/src/utils/session-message.ts # packages/util/src/utils/session-route.test.ts # packages/util/src/utils/session-route.ts # packages/util/src/utils/session.test.ts # packages/util/src/utils/session.ts # packages/util/src/wsl/add-server-probes.ts # packages/util/src/wsl/dialog-add-wsl-server.css # packages/util/test-browser/command-palette.test.ts # packages/util/test-browser/motion-spring.test.ts # packages/util/test-browser/prompt-attachments.test.ts # packages/util/test-browser/prompt-persistence.test.ts # packages/util/test-browser/prompt-scope.test.ts # packages/util/test-browser/prompt-submission-state.test.ts # packages/util/test-browser/prompt-transient-state.test.ts # packages/util/test-browser/review-panel-v2-state.test.ts # packages/util/test-browser/session-lineage.test.ts # packages/util/test-browser/session-ownership.test.ts # packages/util/test-browser/settings-keybinds.test.ts # packages/util/test-browser/solid-router-cleanup.test.ts # packages/util/test-browser/toast-owner.test.ts # packages/util/vendor/opencode-ai-client-1.17.13-v2.tgz # packages/web/package.json # packages/web/src/components/share/content-bash.tsx # packages/web/src/components/share/part.tsx # packages/web/src/content/docs/ar/go.mdx # packages/web/src/content/docs/ar/zen.mdx # packages/web/src/content/docs/bs/go.mdx # packages/web/src/content/docs/bs/zen.mdx # packages/web/src/content/docs/cli.mdx # packages/web/src/content/docs/config.mdx # packages/web/src/content/docs/da/go.mdx # packages/web/src/content/docs/da/zen.mdx # packages/web/src/content/docs/de/go.mdx # packages/web/src/content/docs/de/zen.mdx # packages/web/src/content/docs/ecosystem.mdx # packages/web/src/content/docs/enterprise.mdx # packages/web/src/content/docs/es/go.mdx # packages/web/src/content/docs/es/zen.mdx # packages/web/src/content/docs/fr/go.mdx # packages/web/src/content/docs/fr/zen.mdx # packages/web/src/content/docs/go.mdx # packages/web/src/content/docs/it/go.mdx # packages/web/src/content/docs/it/zen.mdx # packages/web/src/content/docs/ja/go.mdx # packages/web/src/content/docs/ja/zen.mdx # packages/web/src/content/docs/keybinds.mdx # packages/web/src/content/docs/ko/go.mdx # packages/web/src/content/docs/ko/zen.mdx # packages/web/src/content/docs/nb/go.mdx # packages/web/src/content/docs/nb/zen.mdx # packages/web/src/content/docs/permissions.mdx # packages/web/src/content/docs/pl/go.mdx # packages/web/src/content/docs/pl/zen.mdx # packages/web/src/content/docs/providers.mdx # packages/web/src/content/docs/pt-br/go.mdx # packages/web/src/content/docs/pt-br/zen.mdx # packages/web/src/content/docs/ru/go.mdx # packages/web/src/content/docs/ru/index.mdx # packages/web/src/content/docs/ru/zen.mdx # packages/web/src/content/docs/th/go.mdx # packages/web/src/content/docs/th/zen.mdx # packages/web/src/content/docs/tr/go.mdx # packages/web/src/content/docs/tr/zen.mdx # packages/web/src/content/docs/zen.mdx # packages/web/src/content/docs/zh-cn/go.mdx # packages/web/src/content/docs/zh-cn/zen.mdx # packages/web/src/content/docs/zh-tw/go.mdx # packages/web/src/content/docs/zh-tw/zen.mdx # sdks/vscode/package.json # specs/v2/config.md # specs/v2/instructions.md # specs/v2/provider-model.md # specs/v2/schema-changelog.md # specs/v2/session.md # specs/v2/todo.md # sst-env.d.ts # turbo.json
… test suite Remediation pass after the v1.18.10 grafted 3-way merge: - `LayerNode`: re-added the fork's lazy-deps capability on upstream's object API (`LayerNode.lazy()` + `nodeDependencies()` resolver at every consumer); swept all 47 opencode dep arrays + thunk call sites onto it. - Module-init TDZ class closed: `Layer.suspend` on all restored core `defaultLayer`s and `AppLayer`; lazy bootstrap replacement in `AppNodeBuilderV1`; restored `Database`/`FSUtil`/`Global` defaultLayers. - Fixed real regressions: dropped Anthropic `BUILTIN` plugin restored; CI typecheck filter gained `codemode`/`protocol`/`schema`; OpenAI header timeout restored to the fork's 10s; fork `tui.ts` event-definitions iteration bug; `discover.ts` test-isolation leak (`os.homedir()` → `Global.Path.home`); CORS origin regex missed by branding transform; `glob.ts` containment patch missing its `FSUtil.node` dep; event group now declares the location middleware (fork per-location SSE filtering). - Completed the partially-ported upstream provider/transform v1.18.10 logic (prompt-cache keys, forceReasoning, Gemini sampling allowlist, adaptive thinking for current Claude models, reasoning_options/modes, Vertex REP, family-based small-model selection). - Guard suites updated to assert adopted architectures (OauthCallbackPage escaping/branding, Effect-native Plugin.trigger isolation, beta.83 pin, turbo package-name task keys); 3 unclosed marker blocks fixed. - Upstream-only integration depths converted to documented `.todo`s (NVIDIA ProviderPlugins pipeline, RuntimeFlags DI, plugin-config providers) — feature-parity follow-ups, not regressions. - Merge tooling: regex-escaped root-domain branding rule; provider identity headers documented in preservePatterns. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…TUI crashed at startup
- Port upstream v1.18.10's `build.ts` change: embed `@opentui/core/parser.worker`
as a virtual file (`opentui-tree-sitter-worker.js`) instead of a realpath
entrypoint. The 0.4.5 loader's path normalization received `undefined` under
the old embedding, killing every compiled binary at TUI startup
("undefined is not an object (evaluating 'loadedPath.startsWith')").
Caught by the real-binary pty smoke test; code gates were all green.
- Regenerate CLI help snapshots for the new upstream flag layout (fork flags
`--yolo` etc. verified intact).
Verified: rebuilt binary boots the TUI clean in an isolated sandbox (brand
title + live render, no errors); upgrade-path boot against a copy of the real
1,194-session DB preserves all data with a stable migration journal across
3 boots; permission ask→reply→resolve regression suite 143/143.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ning, phase manifest
- `cli/cmd/run.ts`: restore two upstream v1.18.10 behaviors dropped in the merge
(attach + local-directory rejection before prompt admission; `--format json`
emits a JSON error record for unknown-model failures instead of bare stderr).
- `provider/error.ts`: port one missing context-overflow classifier pattern from
upstream's `isContextOverflow`.
- `session-status-event.ts` (schema): add the fork's AI-7519 `session.phase`
event to the manifest — the v2 SSE handler encodes against the manifest union
and drops unknown types.
- `run-process.test.ts`: serialize (cliIt.live) — 12+ concurrent `bun run src`
cold-boots contend for CPU post-merge, rotating failures under load (each test
passes in isolation); matches the win32 sequential precedent. 3/3 deterministic.
- `snapshot-tool-race.test.ts`: fix the mocked bash call (missing required
`description` arg failed schema validation, masking the guarded scenario) and
keep the file-created assertion.
- `message-v2.test.ts`: assert the adopted per-attachment media hoisting shape
and align overflow-error identity with the fork's error classes.
KNOWN ISSUE (documented, follow-up): the AI-7519 phase LABEL ("Discovering
tools...") no longer renders in the TUI — the busy fallback ("Thinking...")
works, src publish wiring + TUI store handler are intact, but the event no
longer traverses publish→GlobalBus→RPC→sync store. The dev-only, CI-skipped
e2e (phase-label.tui-e2e.test.ts) stays red locally as the honest signal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, guard updates - `tool/task.ts`: restore the fork's caller-permission filter on the subagent list (denied `task` subagent types are hidden from the tool description) — the resolution had dropped it with an incorrect "can't thread caller ctx" note; the restored `Tool.InitContext` threading supports it via the ctx-function Init shape. - `tool/registry.ts`: port upstream v1.18.10's code-mode registry wiring — flag-gated lazy `execute` tool registration, per-call MCP catalog description (`describeCatalog`), drop-when-no-visible-MCP-tools gate. Catalog resolves through the injected `MCP.Service` (honors mocked layers); `MCP.node` added to the registry node deps. - `test/altimate/tool-fixture.ts`: stub the services TaskTool's init now yields (BackgroundJob/Config/Session/RuntimeFlags). - Guard updates for adopted architecture: manifest count 88→89 (fork `session.phase` addition), upgradeCurl body regex, OauthCallbackPage delegation in bridge-merge-e2e, `configured`-list assertion in upi-provider. Verified: test/tool 553/553; task/registry/code-mode/parameters green; pty-session 3/3 isolated (in-suite failures are load contention); typecheck 0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Claude Code Review
This repository is configured for manual code reviews. Comment @claude review for a one-time review, or @claude review always to subscribe this PR to a review on every future push.
Tip: disable this comment in your organization's Code Review settings.
|
This PR doesn't fully meet our contributing guidelines and PR template. What needs to be fixed:
Please edit this PR description to address the above within 2 hours, or it will be automatically closed. If you believe this was flagged incorrectly, please let a maintainer know. |
|
👋 This PR was automatically closed by our quality checks. Common reasons:
If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you. |
|
Important Review skippedToo many files! This PR contains 1008 files, which is 858 over the limit of 150. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (21)
📒 Files selected for processing (1008)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
👋 This PR was automatically closed by our quality checks. Common reasons:
If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e4205513b5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| }, | ||
| "exports": { | ||
| "./public": "./src/public/index.ts", | ||
| "./effect/layer-node": "./src/effect/layer-node.ts", |
There was a problem hiding this comment.
Restore the supported public Core export
Existing embedding consumers that import @opencode-ai/core/public will now fail with ERR_PACKAGE_PATH_NOT_EXPORTED: this patch removes the ./public export and deletes the corresponding implementation and contract tests, even though src/public/index.ts explicitly described it as the supported native API. Preserve this export or provide a compatible replacement before removing the public modules.
Useful? React with 👍 / 👎.
| const output = yield* Effect.promise(() => response.text()) | ||
| if (output) process.stdout.write(output + (output.endsWith(EOL) ? "" : EOL)) |
There was a problem hiding this comment.
Fail the api command on HTTP errors
When the requested endpoint returns a 4xx or 5xx response—for example, a rejected mutation or authorization failure—the handler prints the response body and completes successfully because it never checks response.ok. Scripts invoking this command therefore cannot distinguish a failed request from a successful one via the exit status; propagate an error after reading the body when the response is not successful.
Useful? React with 👍 / 👎.
| if (seen.has(entry)) continue | ||
| seen.add(entry) | ||
| const plugin = getServerPlugin(entry) | ||
| if (!plugin) throw new TypeError("Plugin export is not a function") |
There was a problem hiding this comment.
Skip non-callable exports in legacy plugins
For a legacy function-style plugin that also exports an ordinary value such as version, readV1Plugin(..., "detect") falls through to this loader and the non-callable export now throws, causing the entire plugin to be skipped. The previous loader deliberately ignored non-function exports, so existing plugins with helper constants or types emitted at runtime stop loading; continue past non-plugin exports while retaining deduplication of callable exports.
Useful? React with 👍 / 👎.
| const isLoading = createMemo(() => props.part.state.status === "pending" || props.part.state.status === "running") | ||
| const calls = createMemo(() => executeCalls(props.metadata.toolCalls)) | ||
| const output = createMemo(() => stripAnsi(props.output?.trim() ?? "")) | ||
| const hasRuntimeError = createMemo(() => props.metadata.error === true) |
There was a problem hiding this comment.
Treat string error metadata as an execution failure
When Code Mode is cancelled, CodeModeTool returns a normal result with metadata.error set to the string "Execution cancelled."; the shared tool metadata contract also declares this field as string. This strict comparison is therefore always false for that result, so the TUI renders a success checkmark and hides the cancellation output instead of showing the error. Check for a non-empty error value rather than the boolean literal.
Useful? React with 👍 / 👎.
… code-mode fixes Codex diff review of PR #1054 found four blockers, all fixed: 1. `session.status`/`idle`/`phase` were absent from `ServerDefinitions` — the union `/api/event` encodes against — so one status event killed the v2 SSE stream with an encode error. Added `SessionStatusEvent.Definitions` to the inventory (marked); schema manifest pins updated (61/89/89/35) and the brittle positional-slice assertion replaced with Latest-map identity checks. 2. `cleanupSkipFiles`' directory sweep (`rmSync` recursive) bypassed the newly-introduced-only guard — it now skips any `/**` directory containing base-branch-tracked files, and the baseline honors the `--base-branch` override end-to-end (threaded through `postMergeTransforms`). 3. Code-mode server grouping read `entry.client` (the MCP client OBJECT) — now uses the fork's `entry.clientName`, so underscore-containing server names group into the same `tools.<server>.<tool>` paths the runtime exposes instead of splitting at the wrong boundary. 4. Restored upstream's session-level permission filtering in the code-mode visibility gate: `registry.tools()` accepts `permission` again, `session/tools.ts` passes `input.session.permission`, and the ruleset merges session rules after agent rules — session-denied MCP tools no longer leak into `execute`'s description. Note: the phase-label e2e still fails locally — the SSE-killer was real but is not the (only) label-delivery break; known-issue status unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Codex diff review completed (4 blockers found, all fixed in f9d64e1):
Codex verdict otherwise: no DDL-safety / XSS / path-containment / deny-filter / lazy-layer / location-middleware / opentui-embedding defects found. Phase-label known issue: the SSE killer was real but not the only delivery break — follow-up stands. |
|
👋 This PR was automatically closed by our quality checks. Common reasons:
If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you. |
There was a problem hiding this comment.
27 issues found and verified against the latest diff
Not reviewed (too large): packages/opencode/test/provider/provider.test.ts (~4,196 lines), .github/meta/merge-report-v1.18.10.json (~2,037 lines), patches/@ai-sdk%2Fmistral@3.0.51.patch (~709 lines) - if these are generated or fixture files, add them to ignored paths to exclude them from future reviews.
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="packages/core/src/tool/edit.ts">
<violation number="1" location="packages/core/src/tool/edit.ts:183">
P3: Edit and apply_patch now maintain identical FileDiff construction separately, so later diff/count changes can diverge between mutation tools. Consider sharing a FileDiff builder for the common modified-file case.</violation>
</file>
<file name="packages/codemode/src/openapi/index.ts">
<violation number="1" location="packages/codemode/src/openapi/index.ts:51">
P2: Referenced path items silently disappear from the generated subtree because this loop examines `$ref` instead of the resolved Path Item Object. Resolve each `pathValue` before method iteration, and use that resolved value for path-level servers and parameters.</violation>
<violation number="2" location="packages/codemode/src/openapi/index.ts:92">
P3: Malformed path templates create tools that always fail (`/pets/{id}` with no `id` parameter) or silently call the wrong endpoint (a declared `id` absent from the path). Validate a one-to-one match between `{...}` placeholders and parsed path parameters, then add an unsupported operation to `skipped` when it does not match.</violation>
</file>
<file name="packages/core/src/location-service-map.ts">
<violation number="1" location="packages/core/src/location-service-map.ts:10">
P3: Runtime diagnostics and missing-service errors will label the production location map as an example service. Use the production service-key namespace to keep service identity and observability consistent with core.</violation>
</file>
<file name="packages/core/src/session/runner/publish-llm-event.ts">
<violation number="1" location="packages/core/src/session/runner/publish-llm-event.ts:400">
P1: A user-declined tool leaves the assistant step unclosed because `Step.Ended` is deferred past the early interrupt return. Settle the stored step before that return, or emit a terminal failure there, so started steps always have a terminal event.</violation>
</file>
<file name=".opencode/opencode.jsonc">
<violation number="1" location=".opencode/opencode.jsonc:2">
P1: The `$schema` URL `https://altimate.ai/config.json` returns a 404 (HTML landing page), breaking IDE validation, autocomplete, and documentation for this config file. Either host the schema at that URL or point `$schema` to a resolvable schema endpoint so editors and tooling can validate the file.</violation>
</file>
<file name="packages/codemode/src/stdlib/date.ts">
<violation number="1" location="packages/codemode/src/stdlib/date.ts:1">
P3: Programs using the documented Date getter set cannot call `getYear()`: property access is not made callable because this allowlist omits it. Include `getYear` and dispatch it to `hosted.getYear()` (or narrow the public Date-support promise).</violation>
</file>
<file name="packages/core/src/effect/app-node-builder.ts">
<violation number="1" location="packages/core/src/effect/app-node-builder.ts:10">
P2: A replacement that adds a `LocationServiceMap.node` dependency fails at compile time because this check runs before replacement resolution. Register the automatic map replacement whenever callers have not supplied their own `LocationServiceMap` replacement (or inspect the resolved graph), so introduced dependencies are covered.</violation>
</file>
<file name="packages/cli/src/commands/handlers/api.ts">
<violation number="1" location="packages/cli/src/commands/handlers/api.ts:56">
P1: Raw paths such as `//attacker.example/x` (or `/\\attacker.example/x`) resolve off-origin and send the daemon’s Basic Authorization header to that host. Restrict raw input to a single-origin absolute path before resolving it.</violation>
</file>
<file name="packages/core/src/process.ts">
<violation number="1" location="packages/core/src/process.ts:159">
P2: Failed combined-output commands passed through `requireSuccess` produce an error with no command diagnostics, because this branch deliberately empties `stderr` while `requireSuccess` only reads `result.stderr`. Have `requireSuccess` and `requireExitIn` use `result.output ?? result.stderr` when constructing `AppProcessError`.</violation>
</file>
<file name="packages/core/src/models-dev.ts">
<violation number="1" location="packages/core/src/models-dev.ts:161">
P2: Users upgrading with a fresh `models.json` from models.dev continue using that old catalog for up to an hour instead of the new Altimate source. Give the new default a distinct cache filename (or invalidate/migrate the old file) so switching the endpoint takes effect immediately.</violation>
</file>
<file name="packages/core/src/database/migration/20260622170816_reset_v2_session_state.ts">
<violation number="1" location="packages/core/src/database/migration/20260622170816_reset_v2_session_state.ts:8">
P3: Upgrades run this complete session-state reset twice because the immediately following `20260622202450_simplify_session_input` migration has identical SQL. Consolidating these migrations avoids a redundant write transaction and leaves one authoritative reset path.</violation>
</file>
<file name="packages/core/src/tool/tool.ts">
<violation number="1" location="packages/core/src/tool/tool.ts:86">
P2: A partially specified structured projection can advertise one output schema while emitting another. Require `structured` and `toStructuredOutput` as a pair, or fall back to `output` unless both are present.</violation>
</file>
<file name="packages/llm/src/protocols/bedrock-converse.ts">
<violation number="1" location="packages/llm/src/protocols/bedrock-converse.ts:226">
P3: Bedrock compatibility projection has no protocol-level assertion. Add a `LLMClient.prepare` case with a compatibility-tagged Bedrock model so regressions in the raw `toolSpec.inputSchema.json` payload are caught without OpenAI's additional projection masking them.</violation>
</file>
<file name="packages/core/src/database/migration.ts">
<violation number="1" location="packages/core/src/database/migration.ts:146">
P1: Pre-simplification databases without this migration journal now fingerprint as current, so adoption records `simplify_session_context_epoch` without dropping these three columns (and skips subsequent reset migrations). Compare the live column set for equality, not only required-column inclusion, before adopting.</violation>
</file>
<file name="packages/codemode/src/stdlib/regexp.ts">
<violation number="1" location="packages/codemode/src/stdlib/regexp.ts:6">
P2: Programs cannot set `RegExp.lastIndex`, so global/sticky scans cannot be started or reset at a chosen offset despite exposing the property. Return a writable member reference for `lastIndex` and route writes to `SandboxRegExp.regex.lastIndex`.</violation>
</file>
<file name="packages/core/src/skill/guidance.ts">
<violation number="1" location="packages/core/src/skill/guidance.ts:76">
P2: First prompt after location startup can render no available skills: plugin registration now runs in a background fiber, but `SkillGuidance.load` no longer waits for it before calling `skills.list()`. Keep an explicit readiness dependency/await for plugin boot before loading guidance.</violation>
</file>
<file name="packages/codemode/src/openapi/types.ts">
<violation number="1" location="packages/codemode/src/openapi/types.ts:30">
P2: A resolver can supply a credential incompatible with its declared security scheme and still send it, producing requests that do not satisfy the OpenAPI contract. Validate credential/scheme pairs in `applyCredentials` (or make the resolver result scheme-dependent) and fail with `ToolError` on a mismatch.</violation>
</file>
<file name="packages/codemode/src/stdlib/value.ts">
<violation number="1" location="packages/codemode/src/stdlib/value.ts:40">
P2: String coercion loses error messages: branded `Error` values fall into the generic object branch and render as `[object Object]`. Handle `errorBrandName(value)` before that branch so thrown/caught errors retain their standard `Error: message` representation.</violation>
<violation number="2" location="packages/codemode/src/stdlib/value.ts:60">
P2: `parseInt` ignores its radix whenever input is a sandbox value, so `parseInt(new Date(0), 16)` and `dates.map(parseInt)` produce base-10 results instead of using the supplied radix/index. Preserve the same radix handling used by the non-sandbox path.</violation>
</file>
<file name="packages/cli/src/commands/handlers/serve.ts">
<violation number="1" location="packages/cli/src/commands/handlers/serve.ts:34">
P2: An invalid/unavailable `--hostname` can make `serve` attempt every port through 65535 before reporting the actual error. Restrict fallback to address-in-use failures; propagate other bind errors immediately.</violation>
</file>
<file name="packages/core/src/session/revert.ts">
<violation number="1" location="packages/core/src/session/revert.ts:76">
P1: Staging can restore files while this session's runner is still executing, so an in-flight tool or LLM step can write against a reverted worktree and corrupt the staged result. Reject or interrupt active sessions before snapshot operations, matching the legacy busy guard.</violation>
<violation number="2" location="packages/core/src/session/revert.ts:116">
P1: Committing during an active run deletes messages and inputs the runner may still be recording or consuming. Gate commit on session idleness (or interrupt and await execution) before publishing the durable deletion event.</violation>
</file>
<file name="packages/codemode/src/stdlib/object.ts">
<violation number="1" location="packages/codemode/src/stdlib/object.ts:33">
P2: `Object.values(["a"])` and `Object.entries(["a"])` now throw instead of returning indexed values. Handle arrays in these two helpers, matching `Object.keys` and normal JavaScript behavior.</violation>
<violation number="2" location="packages/codemode/src/stdlib/object.ts:38">
P2: `Object.assign(target, source)` does not update `target`, so later reads through the original reference miss assigned fields. Validate the first argument but use it as `out`, then copy only `args.slice(1)`.</violation>
<violation number="3" location="packages/codemode/src/stdlib/object.ts:62">
P2: `Object.fromEntries(new Set([["a", 1]]))` fails even though `Set` is a supported iterable. Materialize `SandboxSet` values as entry pairs before the array-only fallback.</violation>
</file>
<file name="packages/cli/src/commands/commands.ts">
<violation number="1" location="packages/cli/src/commands/commands.ts:17">
P2: The `header` flag may be missing `Flag.optional` — all other optional params in this command and file use it, and `Flag.atMost(100)` only controls the upper cardinality bound. Without it, a user might be forced to supply at least one `--header` for every `api` call, which breaks the expected usage pattern for most endpoints.</violation>
</file>
Note: This PR contains a large number of files. cubic only reviews up to 200 files per PR, so some files may not have been reviewed. cubic prioritizes the most important files to review.
Re-trigger cubic
| }) | ||
| assistantActive = false | ||
| if (stepSettlement) return yield* Effect.die("Duplicate step finish") | ||
| stepSettlement = { finish: event.reason, tokens: tokens(event.usage) } |
There was a problem hiding this comment.
P1: A user-declined tool leaves the assistant step unclosed because Step.Ended is deferred past the early interrupt return. Settle the stored step before that return, or emit a terminal failure there, so started steps always have a terminal event.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/core/src/session/runner/publish-llm-event.ts, line 400:
<comment>A user-declined tool leaves the assistant step unclosed because `Step.Ended` is deferred past the early interrupt return. Settle the stored step before that return, or emit a terminal failure there, so started steps always have a terminal event.</comment>
<file context>
@@ -375,36 +395,28 @@ export const createLLMEventPublisher = (events: EventV2.Interface, input: Input)
- })
+ assistantActive = false
+ if (stepSettlement) return yield* Effect.die("Duplicate step finish")
+ stepSettlement = { finish: event.reason, tokens: tokens(event.usage) }
return
case "finish":
</file context>
| @@ -1,5 +1,5 @@ | |||
| { | |||
| "$schema": "https://opencode.ai/config.json", | |||
| "$schema": "https://altimate.ai/config.json", | |||
There was a problem hiding this comment.
P1: The $schema URL https://altimate.ai/config.json returns a 404 (HTML landing page), breaking IDE validation, autocomplete, and documentation for this config file. Either host the schema at that URL or point $schema to a resolvable schema endpoint so editors and tooling can validate the file.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .opencode/opencode.jsonc, line 2:
<comment>The `$schema` URL `https://altimate.ai/config.json` returns a 404 (HTML landing page), breaking IDE validation, autocomplete, and documentation for this config file. Either host the schema at that URL or point `$schema` to a resolvable schema endpoint so editors and tooling can validate the file.</comment>
<file context>
@@ -1,5 +1,5 @@
{
- "$schema": "https://opencode.ai/config.json",
+ "$schema": "https://altimate.ai/config.json",
"provider": {},
"permission": {},
</file context>
| } | ||
|
|
||
| export function rawRequest(input: readonly string[]) { | ||
| if (input.length !== 2 || !methods.has(input[0].toLowerCase()) || !input[1].startsWith("/")) return |
There was a problem hiding this comment.
P1: Raw paths such as //attacker.example/x (or /\\attacker.example/x) resolve off-origin and send the daemon’s Basic Authorization header to that host. Restrict raw input to a single-origin absolute path before resolving it.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/cli/src/commands/handlers/api.ts, line 56:
<comment>Raw paths such as `//attacker.example/x` (or `/\\attacker.example/x`) resolve off-origin and send the daemon’s Basic Authorization header to that host. Restrict raw input to a single-origin absolute path before resolving it.</comment>
<file context>
@@ -0,0 +1,85 @@
+}
+
+export function rawRequest(input: readonly string[]) {
+ if (input.length !== 2 || !methods.has(input[0].toLowerCase()) || !input[1].startsWith("/")) return
+ return { method: input[0].toUpperCase(), path: input[1] }
+}
</file context>
| "time_compacting", | ||
| "time_archived", | ||
| ], | ||
| session_context_epoch: ["session_id", "baseline", "snapshot", "baseline_seq"], |
There was a problem hiding this comment.
P1: Pre-simplification databases without this migration journal now fingerprint as current, so adoption records simplify_session_context_epoch without dropping these three columns (and skips subsequent reset migrations). Compare the live column set for equality, not only required-column inclusion, before adopting.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/core/src/database/migration.ts, line 146:
<comment>Pre-simplification databases without this migration journal now fingerprint as current, so adoption records `simplify_session_context_epoch` without dropping these three columns (and skips subsequent reset migrations). Compare the live column set for equality, not only required-column inclusion, before adopting.</comment>
<file context>
@@ -70,18 +70,80 @@ export const currentSchemaTables = [
+ "time_compacting",
+ "time_archived",
+ ],
+ session_context_epoch: ["session_id", "baseline", "snapshot", "baseline_seq"],
session_input: ["id", "session_id", "prompt", "delivery", "admitted_seq", "promoted_seq", "time_created"],
session_message: ["id", "session_id", "type", "seq", "time_created", "time_updated", "data"],
</file context>
| export const commit = Effect.fn("SessionRevert.commit")(function* (session: SessionSchema.Info) { | ||
| if (!session.revert) return | ||
| const events = yield* EventV2.Service | ||
| yield* events.publish(SessionEvent.RevertEvent.Committed, { |
There was a problem hiding this comment.
P1: Committing during an active run deletes messages and inputs the runner may still be recording or consuming. Gate commit on session idleness (or interrupt and await execution) before publishing the durable deletion event.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/core/src/session/revert.ts, line 116:
<comment>Committing during an active run deletes messages and inputs the runner may still be recording or consuming. Gate commit on session idleness (or interrupt and await execution) before publishing the durable deletion event.</comment>
<file context>
@@ -0,0 +1,121 @@
+export const commit = Effect.fn("SessionRevert.commit")(function* (session: SessionSchema.Info) {
+ if (!session.revert) return
+ const events = yield* EventV2.Service
+ yield* events.publish(SessionEvent.RevertEvent.Committed, {
+ sessionID: session.id,
+ messageID: session.revert.messageID,
</file context>
| } | ||
| const plan = { | ||
| operation, | ||
| url: `${resolvedBaseUrl.value.replace(/\/+$/, "")}${path}`, |
There was a problem hiding this comment.
P3: Malformed path templates create tools that always fail (/pets/{id} with no id parameter) or silently call the wrong endpoint (a declared id absent from the path). Validate a one-to-one match between {...} placeholders and parsed path parameters, then add an unsupported operation to skipped when it does not match.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/codemode/src/openapi/index.ts, line 92:
<comment>Malformed path templates create tools that always fail (`/pets/{id}` with no `id` parameter) or silently call the wrong endpoint (a declared `id` absent from the path). Validate a one-to-one match between `{...}` placeholders and parsed path parameters, then add an unsupported operation to `skipped` when it does not match.</comment>
<file context>
@@ -0,0 +1,130 @@
+ }
+ const plan = {
+ operation,
+ url: `${resolvedBaseUrl.value.replace(/\/+$/, "")}${path}`,
+ fields: input.fields,
+ body: input.body,
</file context>
| export class Service extends Context.Service< | ||
| Service, | ||
| LayerMap.LayerMap<Location.Ref, LocationServices, LocationError> | ||
| >()("@opencode/example/LocationServiceMap") { |
There was a problem hiding this comment.
P3: Runtime diagnostics and missing-service errors will label the production location map as an example service. Use the production service-key namespace to keep service identity and observability consistent with core.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/core/src/location-service-map.ts, line 10:
<comment>Runtime diagnostics and missing-service errors will label the production location map as an example service. Use the production service-key namespace to keep service identity and observability consistent with core.</comment>
<file context>
@@ -0,0 +1,18 @@
+export class Service extends Context.Service<
+ Service,
+ LayerMap.LayerMap<Location.Ref, LocationServices, LocationError>
+>()("@opencode/example/LocationServiceMap") {
+ static get(ref: Location.Ref) {
+ return Layer.unwrap(Effect.map(Service, (locations) => locations.get(ref)))
</file context>
| @@ -0,0 +1,94 @@ | |||
| export const dateMethods = new Set([ | |||
There was a problem hiding this comment.
P3: Programs using the documented Date getter set cannot call getYear(): property access is not made callable because this allowlist omits it. Include getYear and dispatch it to hosted.getYear() (or narrow the public Date-support promise).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/codemode/src/stdlib/date.ts, line 1:
<comment>Programs using the documented Date getter set cannot call `getYear()`: property access is not made callable because this allowlist omits it. Include `getYear` and dispatch it to `hosted.getYear()` (or narrow the public Date-support promise).</comment>
<file context>
@@ -0,0 +1,94 @@
+export const dateMethods = new Set([
+ "getTime",
+ "valueOf",
</file context>
| id: "20260622170816_reset_v2_session_state", | ||
| up(tx) { | ||
| return Effect.gen(function* () { | ||
| yield* tx.run(`DELETE FROM \`session_context_epoch\`;`) |
There was a problem hiding this comment.
P3: Upgrades run this complete session-state reset twice because the immediately following 20260622202450_simplify_session_input migration has identical SQL. Consolidating these migrations avoids a redundant write transaction and leaves one authoritative reset path.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/core/src/database/migration/20260622170816_reset_v2_session_state.ts, line 8:
<comment>Upgrades run this complete session-state reset twice because the immediately following `20260622202450_simplify_session_input` migration has identical SQL. Consolidating these migrations avoids a redundant write transaction and leaves one authoritative reset path.</comment>
<file context>
@@ -0,0 +1,17 @@
+ id: "20260622170816_reset_v2_session_state",
+ up(tx) {
+ return Effect.gen(function* () {
+ yield* tx.run(`DELETE FROM \`session_context_epoch\`;`)
+ yield* tx.run(`DELETE FROM \`session_input\`;`)
+ yield* tx.run(`DELETE FROM \`session_message\`;`)
</file context>
| const result: BedrockTool[] = [] | ||
| for (const tool of tools) { | ||
| result.push(lowerToolSpec(tool)) | ||
| result.push(lowerToolSpec(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, compatibility))) |
There was a problem hiding this comment.
P3: Bedrock compatibility projection has no protocol-level assertion. Add a LLMClient.prepare case with a compatibility-tagged Bedrock model so regressions in the raw toolSpec.inputSchema.json payload are caught without OpenAI's additional projection masking them.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/llm/src/protocols/bedrock-converse.ts, line 226:
<comment>Bedrock compatibility projection has no protocol-level assertion. Add a `LLMClient.prepare` case with a compatibility-tagged Bedrock model so regressions in the raw `toolSpec.inputSchema.json` payload are caught without OpenAI's additional projection masking them.</comment>
<file context>
@@ -205,18 +208,22 @@ type BedrockEvent = Schema.Schema.Type<typeof BedrockEvent>
const result: BedrockTool[] = []
for (const tool of tools) {
- result.push(lowerToolSpec(tool))
+ result.push(lowerToolSpec(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, compatibility)))
const cachePoint = BedrockCache.block(breakpoints, tool.cache)
if (cachePoint) result.push(cachePoint)
</file context>
|
👋 This PR was automatically closed by our quality checks. Common reasons:
If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f9d64e126a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| break | ||
| } | ||
| const mime = block.resource.mimeType ?? "application/octet-stream" | ||
| push({ type: "file", mime, url: dataUrl(mime, block.resource.blob), filename: lastSegment(block.resource.uri) }) |
There was a problem hiding this comment.
Apply MCP attachment guards in Code Mode
When experimental Code Mode is enabled and an MCP tool returns a binary resource, this path attaches the blob without the MIME allowlist or 10 MiB limit enforced by the normal MCP path in session/tools.ts. An unsupported resource such as application/octet-stream is consequently forwarded as model media and can make the next provider request fail, while a very large blob is retained in session state and model payloads; apply the same type and decoded-size checks before collecting the attachment.
Useful? React with 👍 / 👎.
| const codeMode = runtimeFlags?.experimentalCodeMode ? [(await loadCodeMode()).tool] : [] | ||
| return [...resolved, ...custom, ...pluginCustom, ...codeMode] |
There was a problem hiding this comment.
Pass runtime flags through the active session tool resolver
With OPENCODE_EXPERIMENTAL_CODE_MODE enabled, the active /session/:id/prompt path still calls the namespace ToolRegistry.tools(model, agent) from SessionPrompt.resolveTools without this runtimeFlags argument, so it remains undefined here and execute is never added. The alternative SessionTools.resolve implementation that captures RuntimeFlags.Service has no callers anywhere in the repository, meaning the feature flag has no effect for ordinary sessions; thread the flags through the active resolver or switch that pipeline to the service-backed resolver.
Useful? React with 👍 / 👎.
| const result = await client.callTool( | ||
| { name: def.name, arguments: args }, | ||
| undefined, | ||
| timeout !== undefined ? { timeout } : undefined, | ||
| ) |
There was a problem hiding this comment.
Propagate MCP error results as tool failures
When an MCP server returns a valid CallToolResult with isError: true, this direct call path continues through formatting and returns its text as a successful tool result, so the session marks a rejected MCP operation as completed and the model cannot reliably distinguish it from normal output. Both McpCatalog.convertTool and the new Code Mode adapter explicitly throw for isError; perform the same check before firing the success hook and constructing the output here.
Useful? React with 👍 / 👎.
| undefined, | ||
| timeout !== undefined ? { timeout } : undefined, |
There was a problem hiding this comment.
Forward cancellation and progress options to MCP calls
For MCP tools invoked by the active legacy prompt pipeline, this replacement for the previous AI SDK adapter passes only timeout; it drops opts.abortSignal, resetTimeoutOnProgress, and the progress callback that McpCatalog.convertTool supplies. Consequently, cancelling a session does not cancel an in-flight MCP request, and a long-running tool that reports progress can still time out instead of extending its deadline; pass the execution signal and progress-reset options to client.callTool.
Useful? React with 👍 / 👎.
| const textParts: string[] = [] | ||
| const attachments: Omit<MessageV2.FilePart, "id" | "sessionID" | "messageID">[] = [] | ||
|
|
||
| for (const contentItem of (result.content ?? []) as any[]) { |
There was a problem hiding this comment.
Preserve structured-only MCP results
When an MCP tool returns the valid shape { content: [], structuredContent: ... }, this manual projection iterates only content and produces an empty successful output, discarding the actual result. The prior adapter behavior is retained in McpCatalog.convertTool, which synthesizes a JSON text block when only structuredContent is present, and its focused tests cover this case; apply that fallback here or reuse the shared converter.
Useful? React with 👍 / 👎.
| const proc = Bun.spawn( | ||
| [ | ||
| "opencode", | ||
| "--pure", | ||
| "run", |
There was a problem hiding this comment.
Invoke the fork CLI when translating
Running the newly documented bun run translate:app -- <locale> command reaches this spawn, but this repository publishes only the altimate and altimate-code binaries; there is no opencode bin in packages/opencode/package.json or the workspace. On a normal fork development environment without an unrelated upstream CLI installed, every translation job therefore fails with ENOENT, while this same script correctly uses altimate for its models and export subprocesses; use the fork binary consistently.
Useful? React with 👍 / 👎.
# Conflicts: # packages/opencode/test/acp/permission.test.ts # packages/opencode/test/lib/cli-process.ts # packages/opencode/test/mcp/lifecycle.test.ts # packages/tui/src/component/dialog-model.tsx # packages/tui/src/component/prompt/autocomplete.tsx # packages/tui/src/component/prompt/index.tsx # packages/tui/src/feature-plugins/sidebar/footer.tsx
… code-mode fixes Codex diff review of PR #1054 found four blockers, all fixed: 1. `session.status`/`idle`/`phase` were absent from `ServerDefinitions` — the union `/api/event` encodes against — so one status event killed the v2 SSE stream with an encode error. Added `SessionStatusEvent.Definitions` to the inventory (marked); schema manifest pins updated (61/89/89/35) and the brittle positional-slice assertion replaced with Latest-map identity checks. 2. `cleanupSkipFiles`' directory sweep (`rmSync` recursive) bypassed the newly-introduced-only guard — it now skips any `/**` directory containing base-branch-tracked files, and the baseline honors the `--base-branch` override end-to-end (threaded through `postMergeTransforms`). 3. Code-mode server grouping read `entry.client` (the MCP client OBJECT) — now uses the fork's `entry.clientName`, so underscore-containing server names group into the same `tools.<server>.<tool>` paths the runtime exposes instead of splitting at the wrong boundary. 4. Restored upstream's session-level permission filtering in the code-mode visibility gate: `registry.tools()` accepts `permission` again, `session/tools.ts` passes `input.session.permission`, and the ruleset merges session rules after agent rules — session-denied MCP tools no longer leak into `execute`'s description. Note: the phase-label e2e still fails locally — the SSE-killer was real but is not the (only) label-delivery break; known-issue status unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
👋 This PR was automatically closed by our quality checks. Common reasons:
If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you. |
Review-comment triage (Codex GitHub + cubic inline)
Also resolved the merge conflicts with main (v0.9.4 + #1001 gateway onboarding): took main's newer fork UX where it superseded merge-era code, and re-homed main's v0.9.4 harness fixes (database-locked retry, homedir-spy stable-dir + afterEach restore) onto the rewritten test files. Declined (out of merge scope — upstream's own code, adopted as-is): cubic's comments on Deferred as follow-up (with the existing list): Code Mode MCP attachment size/MIME guards (flag-gated experimental feature; the guard exists on the non-code-mode path). |
full receipts (3 sessions)
orchestrator ·
|
| subagent | cost |
|---|---|
| agent-amerge-misc-656526cb5b9ead26 · claude-sonnet-5 | ≥ $39.6251 |
| agent-afix-src-errors-8884253d2aa6943c · claude-sonnet-5 | ≥ $35.9186 |
| agent-amerge-provider-f91c2cc70ae74a38 · claude-sonnet-5 | ≥ $31.8725 |
| agent-afix-t-misc-4ffdae80fce64a8f · claude-sonnet-5 | ≥ $28.5665 |
| agent-afix-t-provider-192137aa70eca91a · claude-sonnet-5 | ≥ $16.2223 |
| agent-afix-test-errors-48721089ad1731db · claude-sonnet-5 | ≥ $12.8623 |
| agent-a175829052802353f · claude-sonnet-5 | ≥ $11.4221 |
| agent-amerge-session-a955e6132d1fa4c0 · claude-sonnet-5 | ≥ $10.8287 |
| agent-a271ffc7c8a00784c · claude-sonnet-5 | ≥ $9.6853 |
| agent-amerge-coretui-0a1ae438ceb768e4 · claude-sonnet-5 | ≥ $8.7704 |
| agent-afix-final-8-8339362751bea908 · claude-sonnet-5 | ≥ $8.1541 |
| agent-ab41b6eb19fef171d · claude-sonnet-5 | ≥ $7.8212 |
| agent-afix-provider-tests-3b7088c2084e338a · claude-sonnet-5 | ≥ $6.1689 |
| agent-afcb6b0105a3e561b · claude-sonnet-5 | ≥ $5.4706 |
| agent-aafb7ece5fef5aecd · claude-sonnet-5 | ≥ $5.3669 |
| agent-afix-core-failures-d1d12fba2f41f957 · claude-sonnet-5 | ≥ $5.3286 |
| agent-a3da2521d3084a4c3 · claude-sonnet-5 | ≥ $4.5729 |
| agent-ae7e274ab5fb062fa · claude-sonnet-5 | ≥ $4.1359 |
| agent-adeb69f69e48f0f1b · claude-sonnet-5 | ≥ $3.9527 |
| 9 more subagents | ≥ $26.8097 |
codex · bf34869b
- - - - - - - - - - - - - - - - - - - - - - - - -
AIRECEIPTS
“You are reviewing a merge plan for a fork of…”
Codex · Jul 30 2026 20:08:38 UTC · 9m 00s
gpt-5.6-sol 100%
cache served 87% of input tokens
pre-edit: no named edit tool observed
(share before the first named edit tool)
exec_command.................≥ $2.3909 (23 calls)
list_projects..................≥ $0.1039 (1 call)
caveat: Codex trace omits GPT-5.6 cache-write tokens — floor excludes any write premium
--------------------------------------------------
KNOWN PRICED SUBTOTAL....................≥ $2.4948
standard API-equivalent floor; not an invoice
partial pricing coverage; invoice total unknown
same tokens on gpt-5.4-mini..............≥ $0.3742
(85% lower observable floor)
(arithmetic, not a prediction)
- - - - - - - - - - - - - - - - - - - - - - - - -
npx aireceipts-cli
github.com/anandgupta42/receipts
- - - - - - - - - - - - - - - - - - - - - - - - -
codex · 389b8aa4
- - - - - - - - - - - - - - - - - - - - - - - - -
AIRECEIPTS
“Review PR #1054 on this repo (branch upstream…”
Codex · Jul 31 2026 08:39:52 UTC · 13m 46s
(unattributed usage) 100%
cache served 97% of input tokens
(unattributed usage)......9,986,044 tok (0 calls)
exec.............................0 tok (67 calls)
exec_command.......................0 tok (1 call)
list_projects.....................0 tok (2 calls)
update_plan.......................0 tok (4 calls)
caveat: Codex request envelopes did not reconcile — request-level pricing disabled
--------------------------------------------------
TOTAL................................9,986,044 tok
no price table matched
- - - - - - - - - - - - - - - - - - - - - - - - -
npx aireceipts-cli
github.com/anandgupta42/receipts
- - - - - - - - - - - - - - - - - - - - - - - - -
handoff — flagged pattern cost ≈ 9,625,079 tok
FLAGGED PATTERN COST...............≈ 9,625,079 tok
heuristic pattern subtotal · not proven savings
≈ re-priced eligible trivial spans.......≈ $1.0034
(22 tiny turns, priced at claude-haiku-4-5)
→ route short replies to a cheaper model
covers: 3 sessions · 711 turns · 1 flagged-pattern line
Generated by aireceipts
|
👋 This PR was automatically closed by our quality checks. Common reasons:
If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2a7b44bc4e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| export function targetFiles(locale: Locale) { | ||
| return [ | ||
| `packages/app/src/i18n/${locale}.ts`, |
There was a problem hiding this comment.
Point the translation command at existing packages
Running the newly added bun run translate:app -- <locale> command always fails during inspect(): every locale begins by importing packages/app/src/i18n/en.ts, but git ls-tree 034545d:packages confirms that packages/app, packages/ui, and packages/desktop are all absent from this commit (and the merge configuration explicitly skips them). Retarget this script to translation dictionaries that exist in the fork, or do not expose the command here.
Useful? React with 👍 / 👎.
| return bind(hostname, 4096, password).pipe(Effect.catch(() => bind(hostname, 0, password))) | ||
| const next = (port: number): ReturnType<typeof bind> => | ||
| bind(hostname, port, password).pipe( | ||
| Effect.catch((error) => (port === 65_535 ? Effect.fail(error) : next(port + 1))), |
There was a problem hiding this comment.
Retry serve only for occupied ports
When serve is started without an explicit port and bind fails for any reason other than an occupied port—for example, an invalid --hostname—this catch recursively retries every port from 4096 through 65535 instead of returning the original error promptly. Inspect the bind failure and advance to the next port only for EADDRINUSE; otherwise fail immediately.
Useful? React with 👍 / 👎.
| export async function mcpInstructions(agent: Agent.Info, permission?: PermissionV1.Ruleset) { | ||
| return runSystemPrompt((s) => s.mcp(agent, permission)) |
There was a problem hiding this comment.
Include MCP server instructions in the active system prompt
When a connected MCP server advertises usage instructions, this new facade computes them but no production caller invokes it: the active prompt builder in session/prompt.ts constructs its system array from SystemPrompt.environment, SystemPrompt.skills, local instructions, and reminders only. Consequently the model never receives the server-provided guidance; call this facade from that builder and pass the session permission rules so its visibility filtering is preserved.
Useful? React with 👍 / 👎.
PINEAPPLE
Summary
Merges upstream OpenCode v1.17.9 → v1.18.10 (~1,055 upstream commits, 1,937 changed files) into the fork.
Merge mechanics (new this time)
git replace --graftrefs gavegit merge v1.18.10a real base (= v1.17.9). Fork changes — marked and unmarked — survived automatically unless upstream touched the same lines; this eliminates the overwrite class that produced v1.4.0's 16 regressions. Grafts were deleted after the merge; history flattened back to single-parent per fork convention.skipFilesvsauditExcludesplit (the old config would have deleted 904 live files including the fork test suites), delete-only-newly-introduced guard,package.jsonimportsmap preservation, regex-escaped root-domain branding rule, provider identity headers documented inpreservePatterns.Adopted from upstream
packages/codemode; MCP resources (3 new tools + real file attachments with size/MIME guards); durable events (superseded 2 fork patches, dropped in upstream's favor).reasoning_options+experimental.modes, family/release-date small-model selection, Vertex regional endpoints for Claude, unified prompt-cache keys,forceReasoning, Gemini sampling allowlists, Kimi/Moonshot detection, ~11 new bundled SDK mappings.providerExecutedforwarding (closes a feat: [v1.17.9] bridge merge upstream OpenCode v1.4.0 → v1.17.9 #964 follow-up), per-attachment media support (Bedrock images-not-PDFs in tool results), header-timeout/stream-error retryable mapping, 2 new compaction plugin hooks.packages/protocol+packages/schemaworkspaces, LayerNode graph redesign (fork's lazy-deps re-added asLayerNode.lazy()), Effect beta.74→beta.83, turbo 2.10.2, SSE bounded queues + heartbeats, shared XSS-escaped OAuth pages, opentui 0.4.5 (build embedding ported — old embedding crashed every compiled TUI at startup).Fork preserved (verified per-file by 5 review agents + guard suites)
Imperative session core (processor/prompt/llm/message-v2 with all ~15 marked safety/telemetry behaviors), 100+ altimate tools + skill ops, warehouse drivers, validator dispatch, tracing, per-location SSE filtering (now with proper location middleware on the event group), permission split-brain guard (143/143 regression tests), DDL safety denials, brand surfaces, DE tips, yolo/line-streaming, calm mode, Anthropic BUILTIN plugin (restored — dropped in resolution), Snowflake Cortex/Databricks/Altimate auth plugins, tail-preserving compaction,
SessionSummary.diffworkaround, qwen.txt safety-guardrail prompt.upstream_fix reconciliation (pre-merge audit: 3 carried)
tools.tsmodel-id re-brand → dropped (upstream ships the identical fix viaModelV2.ID.make)session/index.tspermission column,system.tsdate-outside-cache → carried (upstream has no equivalent)core/event.tsreplay fixes + 2 share-nextcatchCauseguards → dropped (upstream's durable-events/scoped-fork designs supersede them)Known issue (follow-up filed in-source)
Deferred (documented
.todos + in-source markers, not regressions)Upstream's Effect-native processor/prompt/message-v2 rewrites;
setAgentModelsession persistence; core ProviderPlugins header pipeline (NVIDIA billing headers); deeper plugin-config→provider registration; RuntimeFlags DI for the legacy alpha-model filter.Test Plan
bunx turbo typecheck— 16/16 packagesanalyze.ts --branding --strict— 0 leaks;--require-markers --strict— pass; marker guard per CI policyChecklist
Summary by cubic
Merges upstream OpenCode v1.17.9 → v1.18.10 into the fork with a true 3‑way graft to preserve local changes. Adds Code Mode, provider and session upgrades, a new CLI
apicommand, and hardens SSE, CI build, and merge tooling; this lifts the v1.17.9 freeze.New Features
packages/codemode, including OpenAPI‑derived tools and confined JS execution.reasoning_options/experimental.modes, Vertex regional endpoints, unified prompt‑cache keys,forceReasoning, Gemini sampling allowlists, plus new SDK mappings.providerExecutedforwarding, per‑attachment media support, retryable mapping, new compaction hooks.apisubcommand to call server OpenAPI operations orMETHOD path, with headers and JSON body support.packages/protocolandpackages/schema; SSE bounded queues + heartbeats;turbo2.10.2.Bug Fixes
session.status/idle/phase, fixing v2 SSE encode errors.cleanupSkipFilesonly deletes newly introduced files and honors the base‑branch override end‑to‑end.clientName; session‑level permission filtering restored so session‑denied tools don’t appear inexecute.node-gyp; typecheck includespackages/codemode,packages/protocol, andpackages/schema.Written for commit 2a7b44b. Summary will update on new commits.