fix(beta): resolve missing ${tmp} in shell prompt template#25406
fix(beta): resolve missing ${tmp} in shell prompt template#25406himax12 wants to merge 44 commits intoanomalyco:betafrom
Conversation
# Conflicts: # packages/opencode/src/agent/agent.ts # packages/opencode/src/cli/cmd/github.ts # packages/opencode/src/config/config.ts # packages/opencode/src/config/permission.ts # packages/opencode/src/global/index.ts # packages/opencode/src/tool/registry.ts
…ompts in the history, toggled by a KV-persisted command palette item (resolves anomalyco#11489)
…d/bash specific tool definitions so agents work better
…v/beta channels
…ompts in the history, toggled by a KV-persisted command palette item (resolves anomalyco#11489)
…d/bash specific tool definitions so agents work better
…v/beta channels
Populate the placeholder used by shell.txt so ShellPrompt.render() no longer throws during tool initialization. Adds regression coverage to ensure is resolved in generated prompt text.
|
Thanks for your contribution! This PR doesn't have a linked issue. All PRs must reference an existing issue. Please:
See CONTRIBUTING.md for details. |
|
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. |
There was a problem hiding this comment.
Pull request overview
Fixes a beta startup/runtime failure where the shell prompt template referenced ${tmp} but the shell prompt renderer did not supply a tmp value. In addition, this PR introduces a large set of new/updated capabilities across v2 session/message plumbing, tools, background jobs, and UI behavior.
Changes:
- Provide
tmp: Global.Path.tmpto shell prompt template rendering so${tmp}resolves. - Add/adjust tests around shell/tool parameters, v2 session message projection, background jobs, repo utilities, etc.
- Introduce/expand v2 session/message infrastructure (DB table, projectors, HTTP API surface) plus new tools/agents (e.g. Scout, repo_clone/repo_overview, codesearch, task_status) and various UI updates.
Reviewed changes
Copilot reviewed 111 out of 111 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| specs/v2/session-concepts-gap.md | Adds a spec note capturing known gaps in Session V2 concepts. |
| packages/web/src/content/docs/agents.mdx | Docs: updates built-in subagents list to include Scout. |
| packages/web/src/content/docs/zh-cn/agents.mdx | Docs (zh-cn): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/zh-tw/agents.mdx | Docs (zh-tw): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/tr/agents.mdx | Docs (tr): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/th/agents.mdx | Docs (th): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/ru/agents.mdx | Docs (ru): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/pt-br/agents.mdx | Docs (pt-br): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/pl/agents.mdx | Docs (pl): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/nb/agents.mdx | Docs (nb): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/ko/agents.mdx | Docs (ko): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/ja/agents.mdx | Docs (ja): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/it/agents.mdx | Docs (it): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/fr/agents.mdx | Docs (fr): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/es/agents.mdx | Docs (es): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/de/agents.mdx | Docs (de): adds Scout subagent section. |
| packages/web/src/content/docs/da/agents.mdx | Docs (da): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/bs/agents.mdx | Docs (bs): adds Scout subagent section and count updates. |
| packages/web/src/content/docs/ar/agents.mdx | Docs (ar): adds Scout subagent section and count updates. |
| packages/ui/src/pierre/virtualizer.ts | Removes UI virtualizer helper implementation. |
| packages/ui/src/components/session-review.tsx | Simplifies session review diff rendering by removing “visible/mounted” virtualization logic. |
| packages/ui/src/components/message-part.tsx | Adds background indicator in Task tool subtitle. |
| packages/ui/src/components/file.tsx | Removes diff/text virtualization strategy usage; always uses non-virtualized Pierre viewers. |
| packages/ui/src/components/file-ssr.tsx | Removes SSR diff virtualization usage and shared virtualizer lifecycle. |
| packages/sdk/js/src/v2/gen/sdk.gen.ts | Updates generated SDK to include v2 session list/messages client surface. |
| packages/opencode/test/v2/session-message-updater.test.ts | Adds tests for v2 session-message updater behavior (snapshots, tool timestamps, compaction). |
| packages/opencode/test/tool/task_status.test.ts | Adds live tests for the new task_status tool behavior (wait/poll/timeout/error). |
| packages/opencode/test/tool/repo_overview.test.ts | Adds tests for repo overview behavior (local path + cached repo shorthand). |
| packages/opencode/test/tool/parameters.test.ts | Updates tool-parameter schema snapshot coverage and adds new Task params assertions. |
| packages/opencode/test/tool/snapshots/parameters.test.ts.snap | Updates JSON-schema snapshots for updated tool parameters. |
| packages/opencode/test/session/snapshot-tool-race.test.ts | Extends test layers to include Git + BackgroundJob. |
| packages/opencode/test/session/prompt.test.ts | Adds v2 message/event regression coverage around prompt emission and DB projection. |
| packages/opencode/test/session/message-v2.test.ts | Updates expected tool title/metadata tag names from Bash → Shell. |
| packages/opencode/test/session/compaction.test.ts | Adds assertion that v2 compaction message is projected. |
| packages/opencode/test/server/httpapi-session.test.ts | Extends HTTP API session test to validate v2 session message endpoint reads from DB. |
| packages/opencode/test/preload.ts | Adjusts log import shape for test preload. |
| packages/opencode/test/cli/tui/use-event.test.tsx | Adds deterministic IDs to certain test events. |
| packages/opencode/test/cli/github-remote.test.ts | Adds coverage for additional git remote URL forms. |
| packages/opencode/test/background/job.test.ts | Adds coverage for background job tracking/cancellation. |
| packages/opencode/test/agent/agent.test.ts | Updates agent defaults/permissions; adds Scout + reference config behaviors. |
| packages/opencode/test/acp/event-subscription.test.ts | Adds event IDs to part-updated test events. |
| packages/opencode/src/v2/tool-output.ts | Introduces v2 tool output schema types. |
| packages/opencode/src/v2/session-prompt.ts | Introduces v2 prompt schema types (files/agents + source ranges). |
| packages/opencode/src/v2/session-message.ts | Introduces v2 session message schema types and event-to-message conversion helpers. |
| packages/opencode/src/v2/event.ts | Adds v2 event definition helper with branded event IDs. |
| packages/opencode/src/util/repository.ts | Adds generalized repository reference parsing + cache path helpers. |
| packages/opencode/src/util/effect-zod.ts | Improves Schema→Zod conversion (Suspend support; encoding handling changes). |
| packages/opencode/src/tool/task_status.txt | Adds tool description text for task_status. |
| packages/opencode/src/tool/task_status.ts | Adds task_status tool implementation (poll/wait/timeout + BackgroundJob integration). |
| packages/opencode/src/tool/task.txt | Updates Task tool guidance to include background runs + task_status usage. |
| packages/opencode/src/tool/shell/shell.txt | Converts shell tool prompt template to parameterized placeholders and includes ${tmp}. |
| packages/opencode/src/tool/shell/id.ts | Adds shell kind parsing and a canonical tool ID mapping (still "bash"). |
| packages/opencode/src/tool/repo_overview.txt | Adds description for repo overview tool. |
| packages/opencode/src/tool/repo_clone.txt | Adds description for repo clone tool. |
| packages/opencode/src/tool/repo_clone.ts | Adds repo clone tool implementation (managed cache + refresh/branch support). |
| packages/opencode/src/tool/registry.ts | Registers new tools (shell, codesearch, repo_clone, repo_overview, task_status) and provides new layers. |
| packages/opencode/src/tool/mcp-exa.ts | Adds Exa “code args” schema to support code search. |
| packages/opencode/src/tool/codesearch.txt | Adds description text for the codesearch tool. |
| packages/opencode/src/tool/codesearch.ts | Adds codesearch tool backed by Exa Code API. |
| packages/opencode/src/sync/index.ts | Changes projector signature to include the full event; publishes bus events with stable IDs. |
| packages/opencode/src/session/session.ts | Adds agent/model fields to Session info + schemas and uses Schema.suspend to avoid circular init. |
| packages/opencode/src/session/session.sql.ts | Adds session agent/model columns and replaces session_entry table with session_message. |
| packages/opencode/src/session/prompt.ts | Emits v2 sync events (prompted/synthetic/model/agent switched) and updates shell tool id usage. |
| packages/opencode/src/session/projectors.ts | Switches log import shape and composes next/v2 projectors. |
| packages/opencode/src/session/projectors-next.ts | Adds projector set to materialize v2 session messages into session_message table. |
| packages/opencode/src/session/compaction.ts | Emits v2 compaction started/ended events in addition to v1 bus events. |
| packages/opencode/src/server/routes/instance/v2.ts | Adds Hono v2 routes for listing v2 sessions and reading v2 messages. |
| packages/opencode/src/server/routes/instance/httpapi/server.ts | Wires v2 HttpApi handlers into the server. |
| packages/opencode/src/server/routes/instance/httpapi/handlers/v2/session.ts | Adds effect-httpapi handlers for v2 session routes. |
| packages/opencode/src/server/routes/instance/httpapi/handlers/v2/message.ts | Adds effect-httpapi handlers for v2 message routes. |
| packages/opencode/src/server/routes/instance/httpapi/handlers/v2.ts | Adds layer wiring for v2 HttpApi handlers. |
| packages/opencode/src/server/routes/instance/httpapi/handlers/global.ts | Ensures SSE payloads include IDs for connected/heartbeat. |
| packages/opencode/src/server/routes/instance/httpapi/groups/v2/session.ts | Defines v2 session endpoints in HttpApi schema. |
| packages/opencode/src/server/routes/instance/httpapi/groups/v2/message.ts | Defines v2 message endpoints in HttpApi schema. |
| packages/opencode/src/server/routes/instance/httpapi/groups/v2.ts | Adds v2 HttpApi grouping metadata. |
| packages/opencode/src/server/routes/instance/httpapi/event.ts | Ensures SSE events include IDs for connected/heartbeat. |
| packages/opencode/src/server/routes/instance/httpapi/api.ts | Adds V2Api to the instance HttpApi surface. |
| packages/opencode/src/server/routes/instance/event.ts | Ensures legacy SSE route includes IDs for connected/heartbeat. |
| packages/opencode/src/server/routes/global.ts | Ensures global SSE route includes IDs for connected/heartbeat. |
| packages/opencode/src/project/bootstrap.ts | Ensures plugin initialization precedes config reads via a wrapped Config layer. |
| packages/opencode/src/id/id.ts | Adds a new job prefix to Identifier prefixes. |
| packages/opencode/src/effect/app-runtime.ts | Provides Config layer that initializes plugins first; adds BackgroundJob layer. |
| packages/opencode/src/config/reference.ts | Adds reference config schema for Scout-backed named references. |
| packages/opencode/src/config/permission.ts | Extends permission config to cover codesearch/repo_clone/repo_overview. |
| packages/opencode/src/config/config.ts | Adds reference config and adds default scout agent config entry. |
| packages/opencode/src/cli/cmd/web.ts | Boots via CLI bootstrap before resolving network options. |
| packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx | Adds optional search field and includes it in fuzzysort keys. |
| packages/opencode/src/cli/cmd/tui/thread.ts | Resolves network options within an Instance context. |
| packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx | Updates permission prompt logic to match the shell tool id constant. |
| packages/opencode/src/cli/cmd/tui/routes/session/index.tsx | Updates TUI tool rendering from Bash → Shell, improves command palette search, and refines Task UI behavior. |
| packages/opencode/src/cli/cmd/tui/plugin/internal.ts | Adds a v2 debug internal plugin. |
| packages/opencode/src/cli/cmd/tui/context/sync.tsx | Adds “autoedit” permission auto-accept setting (currently defaulting to enabled). |
| packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx | Adds UI + command entry for autoedit toggle; includes agent/model when creating sessions; prompt history tweaks. |
| packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx | Prevents adding duplicate prompt history entries. |
| packages/opencode/src/cli/cmd/tui/app.tsx | Wraps app in SyncProviderV2 and adds more command palette search strings + prompt-history toggle. |
| packages/opencode/src/cli/cmd/serve.ts | Boots via CLI bootstrap before resolving network options. |
| packages/opencode/src/cli/cmd/run.ts | Updates CLI run tool renderer from Bash → Shell and changes default permissions. |
| packages/opencode/src/cli/cmd/github.ts | Reuses repository parsing helper and updates UI labeling for shell tool. |
| packages/opencode/src/bus/index.ts | Adds stable id field to bus events; supports publishing with explicit IDs. |
| packages/opencode/src/bus/global.ts | Ensures global bus payloads have IDs (deriving from sync event when possible). |
| packages/opencode/src/bus/bus-event.ts | Updates event payload schemas to include id. |
| packages/opencode/src/background/job.ts | Adds BackgroundJob service for tracking/cancelling async jobs. |
| packages/opencode/src/agent/prompt/scout.txt | Adds prompt for new Scout read-only research agent. |
| packages/opencode/src/agent/agent.ts | Adds Scout agent, reference-config-derived agents, and permission adjustments. |
| packages/opencode/src/acp/agent.ts | Renames bash snapshot handling to shell; updates tool kind mapping and locations. |
| packages/opencode/migration/20260501142318_next_venus/migration.sql | DB migration adding session.agent + session.model columns. |
| packages/opencode/migration/20260427172553_slow_nightmare/migration.sql | DB migration creating session_message table and removing session_entry. |
| packages/desktop-electron/electron-builder.config.ts | Renames desktop artifact to opencode-desktop-*. |
| packages/core/src/util/log.ts | Adds export * as Log re-export shape. |
| packages/core/src/global.ts | Adds Global.Path.repos and ensures repos directory exists. |
| packages/core/src/flag/flag.ts | Makes OPENCODE_EXPERIMENTAL_HTTPAPI default on for dev/beta/local channels. |
Comments suppressed due to low confidence (1)
packages/opencode/src/tool/shell/shell.txt:11
- PR description/title focuses on fixing the missing
${tmp}placeholder in the shell prompt template, but this PR also introduces a large set of unrelated changes (new v2 session/message APIs + DB tables, new tools likerepo_clone/codesearch, background jobs, removal of UI virtualizer, new Scout agent, etc.). This scope mismatch makes review/risk assessment difficult; consider splitting into focused PRs or updating the PR description to accurately enumerate the major behavioral changes.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| const waitForTerminal: ( | ||
| taskID: SessionID, | ||
| timeout: number, | ||
| ) => Effect.Effect<{ result: InspectResult; timedOut: boolean }> = Effect.fn( | ||
| "TaskStatusTool.waitForTerminal", | ||
| )(function* (taskID: SessionID, timeout: number) { | ||
| const result = yield* inspect(taskID) | ||
| if (result.state !== "running") return { result, timedOut: false } | ||
| if (timeout <= 0) return { result, timedOut: true } | ||
| const sleep = Math.min(POLL_MS, timeout) | ||
| yield* Effect.sleep(sleep) | ||
| return yield* waitForTerminal(taskID, timeout - sleep) | ||
| }) |
| test("apply_patch", () => expect(toJsonSchema(ApplyPatch)).toMatchSnapshot()) | ||
| test("bash", () => expect(toJsonSchema(Bash)).toMatchSnapshot()) | ||
| test("bash", () => expect(toJsonSchema(Shell)).toMatchSnapshot()) | ||
| test("edit", () => expect(toJsonSchema(Edit)).toMatchSnapshot()) | ||
| test("glob", () => expect(toJsonSchema(Glob)).toMatchSnapshot()) | ||
| test("grep", () => expect(toJsonSchema(Grep)).toMatchSnapshot()) | ||
| test("invalid", () => expect(toJsonSchema(Invalid)).toMatchSnapshot()) | ||
| test("lsp", () => expect(toJsonSchema(Lsp)).toMatchSnapshot()) | ||
| test("plan", () => expect(toJsonSchema(Plan)).toMatchSnapshot()) | ||
| test("question", () => expect(toJsonSchema(Question)).toMatchSnapshot()) | ||
| test("read", () => expect(toJsonSchema(Read)).toMatchSnapshot()) | ||
| test("skill", () => expect(toJsonSchema(Skill)).toMatchSnapshot()) | ||
| test("task", () => expect(toJsonSchema(Task)).toMatchSnapshot()) | ||
| test("todo", () => expect(toJsonSchema(Todo)).toMatchSnapshot()) | ||
| test("webfetch", () => expect(toJsonSchema(WebFetch)).toMatchSnapshot()) | ||
| test("websearch", () => expect(toJsonSchema(WebSearch)).toMatchSnapshot()) | ||
| test("write", () => expect(toJsonSchema(Write)).toMatchSnapshot()) | ||
| }) | ||
|
|
||
| describe("apply_patch", () => { | ||
| test("accepts patchText", () => { | ||
| expect(parse(ApplyPatch, { patchText: "*** Begin Patch\n*** End Patch" })).toEqual({ | ||
| patchText: "*** Begin Patch\n*** End Patch", | ||
| }) | ||
| }) | ||
| test("rejects missing patchText", () => { | ||
| expect(accepts(ApplyPatch, {})).toBe(false) | ||
| }) | ||
| test("rejects non-string patchText", () => { | ||
| expect(accepts(ApplyPatch, { patchText: 123 })).toBe(false) | ||
| }) | ||
| }) | ||
|
|
||
| describe("bash", () => { | ||
| describe("shell", () => { | ||
| test("accepts minimum: command + description", () => { |
| const project = useProject() | ||
| const sdk = useSDK() | ||
| const kv = useKV() | ||
| const [autoaccept] = kv.signal<"none" | "edit">("permission_auto_accept", "edit") |
| if (autoaccept() === "edit" && request.permission === "edit") { | ||
| sdk.client.permission.reply({ | ||
| reply: "once", | ||
| requestID: request.id, | ||
| }) | ||
| break |
45c38a6 to
fe56378
Compare
|
This pull request has been automatically closed because it was not updated to meet our contributing guidelines within the 2-hour window. Feel free to open a new pull request that follows our guidelines. |
Fixes #25365
The beta shell prompt template (
tool/shell/shell.txt) includes${tmp}, butShellPrompt.render()did not provide that value, causing startup/runtime failures like:Missing shell prompt value: tmp.What changed:
tmp: Global.Path.tmpinto template rendering values${tmp}is resolvedVerification:
bun --cwd packages/opencode test test/tool/shell.test.ts -t "tmp placeholder" --timeout 120000bun --cwd packages/opencode test test/tool/shell.test.ts -t "basic" --timeout 120000