From 41283933ff19420e4c78cad568e2e2f424cb4ad8 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Sun, 28 Jun 2026 11:30:38 -0400 Subject: [PATCH] chore: merge dev into v2 (#34317) Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: opencode-agent[bot] Co-authored-by: Affan Ali <93028901+affanali2k3@users.noreply.github.com> Co-authored-by: affanali2k3 Co-authored-by: Frank Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: James Long Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: Jay V Co-authored-by: Dax Raad Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: OpeOginni <107570612+OpeOginni@users.noreply.github.com> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: Ben Guthrie Co-authored-by: Dax Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com> --- bun.lock | 5 + nix/hashes.json | 8 +- package.json | 3 +- packages/app/package.json | 1 + packages/app/src/app.tsx | 34 +- packages/app/src/components/debug-bar.tsx | 93 +- .../components/dialog-connect-provider.tsx | 31 +- .../src/components/dialog-select-model.tsx | 1 + packages/app/src/components/prompt-input.tsx | 94 +- packages/app/src/components/titlebar.tsx | 4 +- packages/app/src/context/notification.tsx | 588 +- packages/app/src/context/server-sdk.test.ts | 123 +- packages/app/src/context/server-sdk.tsx | 91 +- .../app/src/context/server-session.test.ts | 1037 +++- packages/app/src/context/server-session.ts | 603 +- packages/app/src/context/tabs.tsx | 32 +- packages/app/src/index.css | 10 +- packages/app/src/pages/home.tsx | 61 +- packages/app/src/pages/layout-new.tsx | 12 +- packages/client/README.md | 2 +- packages/client/script/build.ts | 21 +- packages/client/src/contract.ts | 38 +- packages/client/src/effect.ts | 13 + .../client/src/generated-effect/client.ts | 761 ++- packages/client/src/generated/client.ts | 658 ++- packages/client/src/generated/types.ts | 1649 +++++- packages/client/src/index.ts | 1 + .../client/test/contract-identity.test.ts | 12 +- packages/client/test/effect.test.ts | 101 +- packages/client/test/promise.test.ts | 106 +- .../app/src/routes/zen/util/handler.ts | 10 + packages/core/package.json | 2 + packages/core/src/agent.ts | 3 + packages/core/src/aisdk.ts | 3 + packages/core/src/background-job.ts | 3 + packages/core/src/catalog.ts | 3 + packages/core/src/command.ts | 3 + packages/core/src/config.ts | 7 + packages/core/src/credential.ts | 3 + packages/core/src/cross-spawn-spawner.ts | 6 +- packages/core/src/database/database.ts | 4 +- packages/core/src/effect/app-node-builder.ts | 24 + ...-node-platform.ts => app-node-platform.ts} | 14 +- packages/core/src/effect/app-node.ts | 14 + packages/core/src/effect/layer-node.ts | 337 +- packages/core/src/effect/scoped-node.ts | 11 - packages/core/src/event.ts | 100 +- packages/core/src/file-mutation.ts | 3 + packages/core/src/filesystem.ts | 7 + packages/core/src/filesystem/search.ts | 9 +- packages/core/src/filesystem/watcher.ts | 7 + packages/core/src/fs-util.ts | 6 +- packages/core/src/git.ts | 4 +- packages/core/src/global.ts | 4 +- packages/core/src/image.ts | 3 + packages/core/src/instruction-context.ts | 7 + packages/core/src/integration.ts | 3 + packages/core/src/location-layer.ts | 151 - packages/core/src/location-mutation.ts | 7 + packages/core/src/location-service-map.ts | 18 + packages/core/src/location-services.ts | 112 + packages/core/src/location.ts | 11 + packages/core/src/models-dev.ts | 6 +- packages/core/src/npm.ts | 6 +- packages/core/src/permission.ts | 7 + packages/core/src/permission/saved.ts | 3 + packages/core/src/plugin.ts | 16 + packages/core/src/plugin/internal.ts | 31 +- packages/core/src/policy.ts | 3 + packages/core/src/process.ts | 4 +- packages/core/src/project.ts | 4 +- packages/core/src/project/copy.ts | 10 +- packages/core/src/project/directories.ts | 4 +- packages/core/src/pty.ts | 3 + packages/core/src/pty/ticket.ts | 4 +- packages/core/src/public-event-manifest.ts | 7 - packages/core/src/question.ts | 3 + packages/core/src/reference.ts | 7 + packages/core/src/reference/guidance.ts | 3 + packages/core/src/repository-cache.ts | 7 + packages/core/src/ripgrep.ts | 4 +- packages/core/src/ripgrep/binary.ts | 6 +- packages/core/src/session.ts | 599 +- packages/core/src/session/execution.ts | 4 + packages/core/src/session/execution/local.ts | 13 +- packages/core/src/session/projector.ts | 4 +- packages/core/src/session/runner/llm.ts | 22 + packages/core/src/session/runner/model.ts | 3 + packages/core/src/session/store.ts | 3 + packages/core/src/session/todo.ts | 3 + packages/core/src/skill.ts | 3 + packages/core/src/skill/discovery.ts | 4 + packages/core/src/skill/guidance.ts | 3 + packages/core/src/snapshot.ts | 7 + packages/core/src/system-context/builtins.ts | 9 + packages/core/src/system-context/registry.ts | 3 + packages/core/src/tool-output-store.ts | 5 + packages/core/src/tool/application-tools.ts | 3 + packages/core/src/tool/builtins.ts | 37 + packages/core/src/tool/read-filesystem.ts | 3 + packages/core/src/tool/registry.ts | 13 + packages/core/src/util/effect-flock.ts | 4 +- .../test/effect/cross-spawn-spawner.test.ts | 3 +- .../layer-node/layer-node-types.test.ts | 136 + .../test/effect/layer-node/layer-node.test.ts | 222 + .../test/effect/layer-node/node-build.test.ts | 123 + packages/core/test/event.test.ts | 65 +- packages/core/test/filesystem/search.test.ts | 3 +- packages/core/test/git.test.ts | 3 +- packages/core/test/integration.test.ts | 10 +- .../core/test/location-filesystem.test.ts | 23 +- packages/core/test/location-layer.test.ts | 14 +- packages/core/test/location-mutation.test.ts | 21 +- packages/core/test/move-session.test.ts | 4 +- packages/core/test/permission.test.ts | 4 +- packages/core/test/plugin/skill.test.ts | 14 +- packages/core/test/process/process.test.ts | 3 +- .../core/test/project-directories.test.ts | 7 +- packages/core/test/project.test.ts | 9 +- packages/core/test/question.test.ts | 7 +- packages/core/test/ripgrep.test.ts | 3 +- packages/core/test/session-create.test.ts | 4 +- packages/core/test/session-history.test.ts | 174 + packages/core/test/session-projector.test.ts | 29 +- packages/core/test/session-prompt.test.ts | 4 +- .../core/test/session-runner-recorded.test.ts | 4 +- packages/core/test/session-runner.test.ts | 4 +- packages/core/test/session-todo.test.ts | 6 +- packages/core/test/skill.test.ts | 10 +- .../core/test/system-context/builtins.test.ts | 26 +- packages/desktop/src/main/windows.ts | 6 +- packages/httpapi-codegen/src/index.ts | 111 +- .../httpapi-codegen/test/generate.test.ts | 123 + packages/opencode/src/account/account.ts | 2 +- packages/opencode/src/agent/agent.ts | 12 +- packages/opencode/src/cli/cmd/debug/file.ts | 6 +- packages/opencode/src/cli/cmd/debug/v2.ts | 6 +- packages/opencode/src/config/config.ts | 2 +- .../opencode/src/control-plane/workspace.ts | 2 +- packages/opencode/src/installation/index.ts | 2 +- packages/opencode/src/mcp/index.ts | 21 +- packages/opencode/src/provider/provider.ts | 3 +- .../routes/instance/httpapi/handlers/file.ts | 6 +- .../routes/instance/httpapi/handlers/pty.ts | 10 +- .../server/routes/instance/httpapi/server.ts | 24 +- packages/opencode/src/session/instruction.ts | 2 +- packages/opencode/src/session/llm.ts | 2 +- packages/opencode/src/session/message-v2.ts | 3 +- packages/opencode/src/session/session.ts | 4 +- packages/opencode/src/session/system.ts | 12 +- packages/opencode/src/share/share-next.ts | 2 +- packages/opencode/src/skill/discovery.ts | 2 +- packages/opencode/src/tool/registry.ts | 2 +- packages/opencode/src/worktree/index.ts | 2 +- packages/opencode/test/agent/agent.test.ts | 4 +- .../agent/plugin-agent-regression.test.ts | 4 +- .../effect/layer-node-tiers-types.test.ts | 19 - .../test/effect/layer-node-tiers.test.ts | 169 - .../test/effect/layer-node-types.test.ts | 66 - .../opencode/test/effect/layer-node.test.ts | 86 - .../test/effect/scoped-node-types.test.ts | 23 - packages/opencode/test/git/git.test.ts | 4 +- .../test/mcp/oauth-auto-connect.test.ts | 2 +- .../opencode/test/mcp/oauth-provider.test.ts | 41 + .../opencode/test/provider/provider.test.ts | 11 + .../test/server/httpapi-exercise/index.ts | 34 + .../server/httpapi-public-openapi.test.ts | 17 + .../test/server/httpapi-v2-location.test.ts | 45 +- .../opencode/test/session/compaction.test.ts | 5 +- .../test/session/messages-pagination.test.ts | 4 +- .../test/session/processor-effect.test.ts | 22 +- packages/opencode/test/session/prompt.test.ts | 8 +- packages/opencode/test/session/retry.test.ts | 4 +- .../test/session/snapshot-tool-race.test.ts | 17 +- packages/opencode/test/session/system.test.ts | 4 +- .../opencode/test/share/share-next.test.ts | 17 +- packages/opencode/test/tool/registry.test.ts | 14 +- packages/protocol/src/groups/event.ts | 23 +- packages/protocol/src/groups/session.ts | 38 +- packages/protocol/test/session-cursor.test.ts | 12 +- packages/schema/src/durable-event-manifest.ts | 5 + packages/schema/src/event.ts | 6 +- packages/schema/src/session-event.ts | 4 +- packages/sdk-next/src/index.ts | 1 + packages/sdk-next/test/embedded.test.ts | 85 +- packages/sdk/js/package.json | 1 + packages/sdk/js/script/build.ts | 54 + packages/sdk/js/src/v2/gen/sdk.gen.ts | 34 + packages/sdk/js/src/v2/gen/types.gen.ts | 1670 ++---- packages/sdk/js/test/session-history.test.ts | 12 + packages/sdk/openapi.json | 4859 ++++------------- packages/server/src/handlers.ts | 21 - packages/server/src/handlers/event.ts | 29 +- packages/server/src/handlers/session.ts | 26 + packages/server/src/location.ts | 6 +- .../server/src/middleware/session-location.ts | 4 +- packages/server/src/pty-environment.ts | 5 +- packages/server/src/routes.ts | 41 +- .../components/markdown-inline-code-kind.ts | 1 + .../session-ui/src/components/markdown.css | 12 +- packages/tui/src/component/prompt/index.tsx | 1 + packages/ui/package.json | 3 +- packages/ui/src/components/select.css | 3 - .../@modelcontextprotocol%2Fsdk@1.29.0.patch | 152 + patches/effect@4.0.0-beta.83.patch | 57 + specs/layer-node-tiers.md | 235 - specs/v2/schema-changelog.md | 7 + specs/v2/session.md | 6 +- 208 files changed, 10237 insertions(+), 7073 deletions(-) create mode 100644 packages/core/src/effect/app-node-builder.ts rename packages/core/src/effect/{layer-node-platform.ts => app-node-platform.ts} (58%) create mode 100644 packages/core/src/effect/app-node.ts delete mode 100644 packages/core/src/effect/scoped-node.ts delete mode 100644 packages/core/src/location-layer.ts create mode 100644 packages/core/src/location-service-map.ts create mode 100644 packages/core/src/location-services.ts delete mode 100644 packages/core/src/public-event-manifest.ts create mode 100644 packages/core/test/effect/layer-node/layer-node-types.test.ts create mode 100644 packages/core/test/effect/layer-node/layer-node.test.ts create mode 100644 packages/core/test/effect/layer-node/node-build.test.ts create mode 100644 packages/core/test/session-history.test.ts delete mode 100644 packages/opencode/test/effect/layer-node-tiers-types.test.ts delete mode 100644 packages/opencode/test/effect/layer-node-tiers.test.ts delete mode 100644 packages/opencode/test/effect/layer-node-types.test.ts delete mode 100644 packages/opencode/test/effect/layer-node.test.ts delete mode 100644 packages/opencode/test/effect/scoped-node-types.test.ts create mode 100644 packages/sdk/js/test/session-history.test.ts create mode 100644 patches/effect@4.0.0-beta.83.patch delete mode 100644 specs/layer-node-tiers.md diff --git a/bun.lock b/bun.lock index 85a54c847e..87361c62e8 100644 --- a/bun.lock +++ b/bun.lock @@ -83,6 +83,7 @@ "@types/luxon": "catalog:", "@types/node": "catalog:", "@typescript/native-preview": "catalog:", + "tw-animate-css": "1.4.0", "typescript": "catalog:", "vite": "catalog:", "vite-plugin-icons-spritesheet": "3.0.1", @@ -995,6 +996,7 @@ "@typescript/native-preview": "catalog:", "solid-js": "catalog:", "tailwindcss": "catalog:", + "tw-animate-css": "1.4.0", "typescript": "catalog:", "vite": "catalog:", "vite-plugin-icons-spritesheet": "3.0.1", @@ -1053,6 +1055,7 @@ "@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch", "gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch", "@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch", + "effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch", "@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch", "@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch", "@tanstack/solid-virtual@3.13.28": "patches/@tanstack%2Fsolid-virtual@3.13.28.patch", @@ -5320,6 +5323,8 @@ "turndown": ["turndown@7.2.0", "", { "dependencies": { "@mixmark-io/domino": "^2.2.0" } }, "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A=="], + "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], + "tw-to-css": ["tw-to-css@0.0.12", "", { "dependencies": { "postcss": "8.4.31", "postcss-css-variables": "0.18.0", "tailwindcss": "3.3.2" } }, "sha512-rQAsQvOtV1lBkyCw+iypMygNHrShYAItES5r8fMsrhhaj5qrV2LkZyXc8ccEH+u5bFjHjQ9iuxe90I7Kykf6pw=="], "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], diff --git a/nix/hashes.json b/nix/hashes.json index 3b57bf2269..5809bf7ff3 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-OiWvZ57vuyHwiIKNtW1n1KX+MLmOXVG3x4fLKvUoGQw=", - "aarch64-linux": "sha256-RnPLxVEg/UsL5IeIFWmXMSLUOG6rVrajYxhyDYj1vTA=", - "aarch64-darwin": "sha256-KPIgcBA0pTFBPrCTSZgIbvEorbtWcMgXvyX9bFAypVs=", - "x86_64-darwin": "sha256-6jVU7/uVId0VD24MVQ8s8Ill5b6PsKdlBgHg+oceKRg=" + "x86_64-linux": "sha256-JXQ9PAqqRlJtHa8T3ZxqdRRyxC+0ip+2wSnehvKXUbI=", + "aarch64-linux": "sha256-nI+RaxDXmAcjhSjCtIvyi292xBEg0E5NXaoyGrJE69s=", + "aarch64-darwin": "sha256-UleKpm7Khf3kibm4BqZJ9bmu0N2kOjNd77g1Bd2tmfw=", + "x86_64-darwin": "sha256-V4AQH868dOfVhEj1mKTnZlhpZwFqBYsHS28Tx9VXHkE=" } } diff --git a/package.json b/package.json index 3fdd2dc33b..226a86ff2c 100644 --- a/package.json +++ b/package.json @@ -154,6 +154,7 @@ "@tanstack/solid-virtual@3.13.28": "patches/@tanstack%2Fsolid-virtual@3.13.28.patch", "@pierre/trees@1.0.0-beta.4": "patches/@pierre%2Ftrees@1.0.0-beta.4.patch", "@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch", - "@tanstack/virtual-core@3.17.0": "patches/@tanstack%2Fvirtual-core@3.17.0.patch" + "@tanstack/virtual-core@3.17.0": "patches/@tanstack%2Fvirtual-core@3.17.0.patch", + "effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch" } } diff --git a/packages/app/package.json b/packages/app/package.json index b8f52ebfc7..52420afedc 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -38,6 +38,7 @@ "@types/luxon": "catalog:", "@types/node": "catalog:", "@typescript/native-preview": "catalog:", + "tw-animate-css": "1.4.0", "typescript": "catalog:", "vite": "catalog:", "vite-plugin-icons-spritesheet": "3.0.1", diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index 6a1c8f268d..5b9223b5ee 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -38,7 +38,7 @@ import { HighlightsProvider } from "@/context/highlights" import { LanguageProvider, type Locale, useLanguage } from "@/context/language" import { LayoutProvider } from "@/context/layout" import { ModelsProvider } from "@/context/models" -import { NotificationProvider } from "@/context/notification" +import { NotificationProvider, useNotification } from "@/context/notification" import { PermissionProvider } from "@/context/permission" import { PromptProvider } from "@/context/prompt" import { ServerConnection, ServerProvider, serverName, useServer } from "@/context/server" @@ -316,9 +316,7 @@ function ServerScopedProviders(props: ServerScopedShellProps) { return ( - - {props.children} - + {props.children} ) @@ -345,13 +343,23 @@ function NewAppLayout(props: ParentProps) { function TargetServerScopedProviders(props: ServerScopedShellProps) { return ( - - {props.children} - + + {props.children} ) } +function MarkSessionNotificationsViewed(props: { sessionID?: () => string | undefined }) { + const notification = useNotification() + createEffect(() => { + const sessionID = props.sessionID?.() + if (!notification.ready() || !sessionID) return + if (notification.session.unseenCount(sessionID) === 0) return + notification.session.markViewed(sessionID) + }) + return null +} + function SessionProviders(props: ParentProps) { return ( @@ -560,11 +568,13 @@ export function AppInterface(props: { component={props.router ?? Router} root={(routerProps) => ( - - - {routerProps.children} - - + + + + {routerProps.children} + + + )} > diff --git a/packages/app/src/components/debug-bar.tsx b/packages/app/src/components/debug-bar.tsx index eda025546a..e55e128b82 100644 --- a/packages/app/src/components/debug-bar.tsx +++ b/packages/app/src/components/debug-bar.tsx @@ -3,6 +3,7 @@ import { batch, createEffect, onCleanup, onMount } from "solid-js" import { createStore } from "solid-js/store" import { makeEventListener } from "@solid-primitives/event-listener" import { Tooltip } from "@opencode-ai/ui/tooltip" +import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2" import { useLanguage } from "@/context/language" type Mem = Performance & { @@ -51,31 +52,62 @@ const bad = (n: number | undefined, limit: number, low = false) => { const session = (path: string) => path.includes("/session") -function Cell(props: { bad?: boolean; dim?: boolean; label: string; tip: string; value: string; wide?: boolean }) { - return ( - +function Cell(props: { + bad?: boolean + dim?: boolean + inline?: boolean + label: string + tip: string + value: string + wide?: boolean +}) { + const content = () => ( +
-
{props.label}
-
- {props.value} -
+ {props.label}
+
+ {props.value} +
+
+ ) + + if (props.inline) { + return ( + + {content()} + + ) + } + + return ( + + {content()} ) } -export function DebugBar() { +export function DebugBar(props: { inline?: boolean } = {}) { const language = useLanguage() const location = useLocation() const routing = useIsRouting() @@ -101,7 +133,7 @@ export function DebugBar() { }, }) - const na = () => language.t("debugBar.na") + const na = () => language.t("debugBar.na").toUpperCase() const heap = () => (state.heap.limit ? (state.heap.used ?? 0) / state.heap.limit : undefined) const heapv = () => { const value = heap() @@ -363,15 +395,30 @@ export function DebugBar() { return (