Dashboard › opencode › Session 0h1QXR1lwjxy
0h1QXR1lwjxyQbbGGIn /home/byk/Code/opencode-v2-pilot, add focused regression tests for the current Promise permission adapter semantics. Inspect current packages/core/test/plugin.test.ts, fixtures, Tool service invocation API, and Permission errors. Test through a real activated Promise plugin/tool and real host adapter that: (1) ctx.permission.assert success remains success; (2) typed Permission.CorrectedError({feedback}) becomes a model-facing Tool.Error whose message is exactly feedback rather than a defect; (3) a defect remains a defect and is not converted; ideally plain DeclinedError remains its established defect tunnel if practical. Make only test/fixture changes needed; do not alter adapter implementation. Follow Effect v4 house style, use existing testEffect and package-local testing. Run bun typecheck and focused tests from packages/core with --printConsoleTrace. Return files, exact test results, and any mismatch in current implementation.
I’ll inspect the pilot checkout’s guidance, current plugin tests and fixtures, Tool invocation path, and Permission error definitions. Then I’ll add only focused regression coverage and run the package-local typecheck and tests.
<path>/home/byk/Code/opencode-v2-pilot</path> <type>directory</type> <entries> .changeset/ .dockerignore .editorconfig .git .gitattributes .github/ .gitignore .gitleaksignore .husky/ .opencode/ .oxlintrc.json .prettierignore .vscode/ .zed/ AGENTS.md artifacts/ bun.lock bunfig.toml CONTRIBUTING.md flake.lock flake.nix github/ infra/ install LICENSE nix/ node_modules/ package.json packages/ patches/ perf/ README.ar.md README.bn.md README.br.md README.bs.md README.da.md README.de.md README.es.md README.fr.md README.gr.md README.it.md README.ja.md README.ko.md README.md README.no.md README.pl.md README.ru.md README.th.md README.tr.md README.uk.md README.vi.md README.zh.md README.zht.md screenshot-uk.png script/ sdks/ SECURITY.md services/ specs/ sst-env.d.ts sst.config.ts STATS.md tsconfig.json turbo.json (64 entries) </entries>
<skill_content name="effect">
# Skill: effect
# Effect
This codebase uses Effect for typed, composable TypeScript services, schemas, and workflows.
## Source Of Truth
Use the current Effect v4 / effect-smol source, not memory or older Effect v2/v3 examples.
1. If `.opencode/references/effect-smol` is missing, clone `https://github.com/Effect-TS/effect-smol` there. Do this in the project, not in the skill folder.
2. Search `.opencode/references/effect-smol` for exact APIs, examples, tests, and naming patterns before answering or implementing Effect-specific code.
3. Also inspect existing repo code for local house style before introducing new patterns.
4. Prefer answers and implementations backed by specific source files or nearby repo examples.
## Guidelines
- Prefer current Effect v4 APIs and project-local patterns over old blog posts, examples, or package-memory guesses.
- Use `Effect.gen(function* () { ... })` for multi-step workflows.
- Use `Effect.fn("Name")` or ...
/home/byk/Code/opencode-v2-pilot/services/www/src/docs/AGENTS.md /home/byk/Code/opencode-v2-pilot/services/www/AGENTS.md /home/byk/Code/opencode-v2-pilot/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/ui/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/plugin/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/codemode/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/cli/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/desktop/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/app/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/tui/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/session-ui/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/schema/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/app/e2e/performance/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/app/e2e/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/ai/AGENTS.md /home/byk/Code/opencode-v2-pilot/packages/stats/AGENTS.md
<path>/home/byk/Code/opencode-v2-pilot/AGENTS.md</path> <type>file</type> <content> 1: - After changing the public Protocol or Server `HttpApi`, run `bun run generate` from `packages/client`. Do not edit generated client files directly. 2: - Keep runtime dependencies directed from Schema to Core and Protocol, then from Core and Protocol to Server. Client runtime code may depend on Schema and Protocol but never Core or Server; `sdk` composes Client, Core, and Server. 3: - Current implementation changes belong in `packages/core`, `packages/cli`, `packages/server`, `packages/protocol`, `packages/schema`, and related generated client surfaces when required. 4: - This repository does not use Changesets. Do not add `.changeset` files; follow the existing release workflow instead. 5: - The default branch in this repo is `v2`. 6: - Default new branches and worktrees to `v2`, or `origin/v2` when the local `v2` ref is unavailable, and default pull requests to target `v2`. ...
<path>/home/byk/Code/opencode-v2-pilot/packages/core/test/plugin.test.ts</path>
<type>file</type>
<content>
1: import { expect } from "bun:test"
2: import path from "path"
3: import { Clock, Deferred, Effect } from "effect"
4: import { TestClock } from "effect/testing"
5: import { Command } from "@opencode/core/command"
6: import { Bus } from "@opencode/core/bus"
7: import { Credential } from "@opencode/core/credential"
8: import { Integration } from "@opencode/core/integration"
9: import { Plugin } from "@opencode/core/plugin"
10: import { PluginModule } from "@opencode/core/plugin/module"
11: import { Watcher } from "@opencode/core/filesystem/watcher"
12: import { fromPromise } from "@opencode/plugin/promise/adapter"
13: import { Session } from "@opencode/schema/session"
14: import { testEffect } from "./lib/effect"
15: import { PluginTestLayer } from "./plugin/fixture"
16:
17: const it = testEffect(PluginTestLayer)
18:
19: for (const scenario of [
20: {
21: name: "starts ...
<path>/home/byk/Code/opencode-v2-pilot/packages/core/test/plugin/fixture.ts</path>
<type>file</type>
<content>
1: import { Agent } from "@opencode/core/agent"
2: import { AISDK } from "@opencode/core/aisdk"
3: import { Catalog } from "@opencode/core/catalog"
4: import { Command } from "@opencode/core/command"
5: import { Config } from "@opencode/core/config"
6: import { Credential } from "@opencode/core/credential"
7: import { LayerNodePlatform } from "@opencode/util/effect/app-node-platform"
8: import { AppProcess } from "@opencode/util/process"
9: import { LayerNode } from "@opencode/util/effect/layer-node"
10: import { Bus } from "@opencode/core/bus"
11: import { FileSystem } from "@opencode/core/filesystem"
12: import { FSUtil } from "@opencode/util/fs-util"
13: import { Form } from "@opencode/core/form"
14: import { Generate } from "@opencode/core/generate"
15: import { Integration } from "@opencode/core/integration"
16: import { KV } from "@opencode/core/kv"
17: import { ...
Found 4 matches /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/runtime.ts: Line 36: const result = yield* tool.execute(decoded, context).pipe( /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/plugin/webfetch.ts: Line 75: http.execute(request(url, format, userAgent)).pipe(Effect.flatMap(HttpClientResponse.filterStatusOk)) Line 135: const response = yield* execute(http, input.url, input.format).pipe( Line 136: Effect.catchIf(isCloudflareChallenge, () => execute(http, input.url, input.format, "opencode")),
/home/byk/Code/opencode-v2-pilot/packages/core/src/permission/sql.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/permission/saved.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/runtime.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/read-filesystem.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/mcp.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/html-markdown.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/plugin/write.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/plugin/websearch.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/plugin/webfetch.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/plugin/subagent.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/plugin/skill.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/plugin/shell.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/plugin/read.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/tool/plugin/questi...
/home/byk/Code/opencode-v2-pilot/packages/core/src/tool.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/plugin.ts /home/byk/Code/opencode-v2-pilot/packages/core/src/permission.ts
<path>/home/byk/Code/opencode-v2-pilot/packages/core/src/tool.ts</path>
<type>file</type>
<content>
1: export * as Tool from "./tool.js"
2: export { CallID, Content, Error, FileContent, TextContent } from "@opencode/schema/tool"
3: export type { Context, Metadata, Namespace, Options, Result } from "@opencode/schema/tool"
4:
5: import { ToolDefinition, type ToolCall } from "@opencode/ai"
6: import { Tool } from "@opencode/schema/tool"
7: import { Context, Effect, Layer, Result, Schema, SchemaIssue, Types } from "effect"
8: import { makeLocationNode } from "@opencode/util/effect/app-node"
9: import type { Agent } from "./agent.js"
10: import { CodeModeCatalog } from "./codemode/catalog.js"
11: import { CodeModeTool } from "./codemode/tool.js"
12: import { Image } from "./image.js"
13: import { Permission } from "./permission.js"
14: import { PluginHooks } from "./plugin/hooks.js"
15: import { SessionMessage } from "./session/message.js"
16: import { SessionSchema } from ...
<path>/home/byk/Code/opencode-v2-pilot/packages/core/src/permission.ts</path>
<type>file</type>
<content>
1: export * as Permission from "./permission.js"
2:
3: import { makeLocationNode } from "@opencode/util/effect/app-node"
4: import { Context, Deferred, Effect, Layer, Schema } from "effect"
5: import { Permission } from "@opencode/schema/permission"
6: import { Bus } from "./bus.js"
7: import { Location } from "./location.js"
8: import { Agent } from "./agent.js"
9: import { SessionErrors } from "./session/error.js"
10: import { SessionSchema } from "./session/schema.js"
11: import { SessionStore } from "./session/store.js"
12: import { Wildcard } from "./util/wildcard.js"
13: import { PermissionSaved } from "./permission/saved.js"
14: import { PluginHooks } from "./plugin/hooks.js"
15:
16: const PermissionEffect = Permission.Effect
17: export { PermissionEffect as Effect }
18: export { Rule, Ruleset } from "@opencode/schema/permission"
19: const missingAgentPermissions: ...
<path>/home/byk/Code/opencode-v2-pilot/packages/core/src/plugin/promise.ts</path>
<type>file</type>
<content>
1: export * as PluginPromise from "./promise.js"
2:
3: export { fromPromise } from "@opencode/plugin/promise/adapter"
(End of file - total 3 lines)
</content>
Found 2 matches
/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/adapter.ts:
Line 218: export function fromPromise(plugin: Plugin) {
Line 439: host.permission.assert(input).pipe(
<path>/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/adapter.ts</path> <type>file</type> <content> 180: endpoint.params, 181: endpoint.query === undefined ? undefined : Schema.toType(endpoint.query), 182: endpoint.headers, 183: ...payloadSchemas, 184: ].filter((schema): schema is Schema.Top => schema !== undefined) as Array<RuntimeSchema> 185: const success = (successSchemas[0] ?? HttpApiSchema.NoContent) as RuntimeSchema 186: const noContent = HttpApiSchema.isNoContent(success.ast) 187: const type = Schema.toType(success).ast 188: const data = SchemaAST.isObjects(success.ast) 189: ? success.ast.propertySignatures.find((property) => property.name === "data") 190: : undefined 191: const output = 192: !noContent && 193: SchemaAST.isObjects(type) && 194: type.indexSignatures.length === 0 && 195: type.propertySignatures.length === 1 && 196: type.propertySignatures[0]?.name === "data" && 197: data !== undefined 198: ...
<path>/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/adapter.ts</path>
<type>file</type>
<content>
1: import { Tool } from "@opencode/schema/tool"
2: import type { Rpc } from "@opencode/schema/rpc"
3: import type { RpcCallOptions, RpcEventPayload } from "@opencode/client/promise/api"
4: import { Effect, Schema, SchemaAST, Stream } from "effect"
5: import type { Scope } from "effect"
6: import { HttpApiEndpoint, HttpApiSchema } from "effect/unstable/httpapi"
7: import { define } from "../effect/plugin.js"
8: import type { Plugin } from "./plugin.js"
9: import type { Info } from "./tool.js"
10: import type { RpcDomain, RpcHandlers } from "./rpc.js"
11:
12: type HostRegistration = { readonly dispose: Effect.Effect<void> }
13: type Registration = { readonly dispose: () => Promise<void> }
14: type PromiseContext = Parameters<Plugin["setup"]>[0]
15: type PromiseEvent = ReturnType<PromiseContext["event"]["subscribe"]> extends AsyncIterable<infer Event> ? ...
<path>/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/adapter.ts</path>
<type>file</type>
<content>
467: tool: {
468: reload: () => run(host.tool.reload()),
469: transform: (callback) =>
470: register(
471: host.tool.transform((editor) =>
472: callback({
473: list: () => editor.list().map((tool) => ({ ...tool, execute: promiseExecutor(tool.execute) })),
474: get: (id) => {
475: const tool = editor.get(id)
476: return tool ? { ...tool, execute: promiseExecutor(tool.execute) } : undefined
477: },
478: namespace: editor.namespace,
479: add: (tool: Info) =>
480: editor.add({
481: ...tool,
482: execute: (input, context) => executePromiseTool(tool, input, context),
483: ...
Found 45 matches /home/byk/Code/opencode-v2-pilot/packages/core/test/wellknown.test.ts: Line 115: expect(wellknown.snapshot()[0]?.manifest.auth?.command).toEqual(["second"]) /home/byk/Code/opencode-v2-pilot/packages/core/test/tool-websearch.test.ts: Line 383: const tools = yield* fixture.registry.snapshot() Line 409: const tools = yield* fixture.registry.snapshot() Line 435: const tools = yield* registry.snapshot() /home/byk/Code/opencode-v2-pilot/packages/core/test/tool-subagent.test.ts: Line 269: expect((yield* registry.snapshot()).definitions.map((tool) => tool.name)).toContain(SubagentTool.name) /home/byk/Code/opencode-v2-pilot/packages/core/test/tool-registry.test.ts: Line 101: const original = yield* service.snapshot() Line 118: expect((yield* service.snapshot()).codeModeCatalog?.tools).toEqual([]) Line 123: const refreshed = yield* service.snapshot() Line 133: ...
<path>/home/byk/Code/opencode-v2-pilot/packages/core/test/tool-registry.test.ts</path>
<type>file</type>
<content>
780: call: { type: "tool-call", id: "missing", name: "missing", input: {} },
781: }),
782: ).toEqual({ status: "error", error: { type: "tool.execution", message: "Unknown tool: missing" } })
783:
784: yield* transform(
785: service,
786: {
787: defect: {
788: name: "defect",
789: description: "Defect",
790: input: Schema.Struct({}),
791: output: Schema.Struct({}),
792: execute: () => Effect.die("unexpected executor defect"),
793: },
794: },
795: { codemode: false },
796: )
797: expect(
798: yield* service.snapshot().pipe(
799: Effect.flatMap((toolSet) =>
800: toolSet.execute({
801: sessionID,
802: ...identity,
803: call: { type: "tool-call", id: ...
<path>/home/byk/Code/opencode-v2-pilot/packages/core/test/tool-registry.test.ts</path>
<type>file</type>
<content>
1: import { describe, expect } from "bun:test"
2: import { Agent } from "@opencode/core/agent"
3: import type { Permission } from "@opencode/core/permission"
4: import { AppNodeBuilder } from "@opencode/core/effect/app-node-builder"
5: import { Image } from "@opencode/core/image"
6: import { PluginHooks } from "@opencode/core/plugin/hooks"
7: import { Session } from "@opencode/core/session"
8: import { SessionMessage } from "@opencode/core/session/message"
9: import { State } from "@opencode/core/state"
10: import { Tool } from "@opencode/core/tool"
11: import type { Info } from "@opencode/schema/tool"
12: import { LayerNode } from "@opencode/util/effect/layer-node"
13: import { codeModeListings, executeTool, toolDefinitions } from "./lib/tool"
14: import { Deferred, Effect, Exit, Fiber, Layer, Logger, Schema, SchemaGetter, SchemaIssue, Scope } from "effect"
15: import { ...
<path>/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/tool.ts</path>
<type>file</type>
<content>
1: export { CallID, Error } from "@opencode/schema/tool"
2: export type { Metadata, Options, Result } from "@opencode/schema/tool"
3:
4: import { Tool } from "@opencode/schema/tool"
5: import type { Agent } from "@opencode/schema/agent"
6: import type { Session } from "@opencode/schema/session"
7: import type { SessionMessage } from "@opencode/schema/session-message"
8: import type { Types } from "effect"
9: import type { Hooks, Transform } from "./registration.js"
10:
11: export interface ToolContext extends Omit<Tool.Context, "progress"> {
12: readonly progress: (update: Tool.Metadata) => Promise<void>
13: }
14:
15: export type Info<
16: Input extends Tool.ValueSchema<any> = Tool.ValueSchema<any>,
17: Output extends Tool.ValueSchema<any> | undefined = Tool.ValueSchema<any> | undefined,
18: > = Omit<Tool.Info<Input, Output>, "execute"> & {
19: readonly execute: ...
Found 2 matches /home/byk/Code/opencode-v2-pilot/packages/sdk/test/instances-effect.test.ts: Line 75: yield* ctx.tool.transform((editor) => /home/byk/Code/opencode-v2-pilot/packages/server/test/session-instances.test.ts: Line 106: yield* ctx.tool.transform((editor) =>
<path>/home/byk/Code/opencode-v2-pilot/packages/schema/src/tool.ts</path>
<type>file</type>
<content>
1: export * as Tool from "./tool.js"
2:
3: import { Effect, JsonSchema, Schema } from "effect"
4: import type { StandardSchemaV1 } from "@standard-schema/spec"
5: import type { Agent } from "./agent.js"
6: import type { Session } from "./session.js"
7: import type { SessionMessage } from "./session-message.js"
8:
9: export type Metadata = Readonly<Record<string, any>>
10:
11: export const CallID = Schema.String.pipe(Schema.brand("Tool.CallID"))
12: export type CallID = typeof CallID.Type
13:
14: export interface Context {
15: readonly sessionID: Session.ID
16: readonly agent: Agent.ID
17: readonly messageID: SessionMessage.ID
18: readonly id: CallID
19: readonly progress: (update: Metadata) => Effect.Effect<void>
20: }
21:
22: export interface Namespace {
23: readonly name: string
24: readonly description: string
25: }
26:
27: interface BaseOptions {
28: readonly ...
<path>/home/byk/Code/opencode-v2-pilot/packages/core/test/lib/effect.ts</path>
<type>file</type>
<content>
1: import { test, type TestOptions } from "bun:test"
2: import { Cause, Effect, Exit, Layer, type Scope } from "effect"
3: import { TestClock, TestConsole } from "effect/testing"
4: import { FetchHttpClient } from "effect/unstable/http"
5:
6: type Body<A, E, R> = Effect.Effect<A, E, R> | (() => Effect.Effect<A, E, R>)
7:
8: const body = <A, E, R>(value: Body<A, E, R>) => Effect.suspend(() => (typeof value === "function" ? value() : value))
9:
10: const loopback = new Set(["127.0.0.1", "localhost", "[::1]"])
11:
12: // Core is env-free, so nothing tells the default node graph to stay offline;
13: // a test that boots it would phone home through FetchHttpClient. Every
14: // FetchHttpClient reads this reference at request time, so refusing here covers
15: // each node that shares the default client, while an explicit HttpClient
16: // replacement never reaches it. ...
Found 45 matches /home/byk/Code/opencode-v2-pilot/packages/core/test/vcs.test.ts: Line 275: expect(Exit.isFailure(exit) && Cause.hasInterrupts(exit.cause)).toBeTrue() Line 279: expect(Exit.isFailure(interrupted) && Cause.hasInterrupts(interrupted.cause)).toBeTrue() Line 283: expect(Exit.isFailure(cancelled) && Cause.hasInterrupts(cancelled.cause)).toBeTrue() Line 287: expect(Exit.isFailure(refreshed) && Cause.hasInterruptsOnly(refreshed.cause)).toBeTrue() Line 389: expect(Exit.isFailure(failed) && Cause.squash(failed.cause)).toBe(failure) Line 395: expect(Exit.isFailure(status) && Cause.squash(status.cause)).toBe(failure) /home/byk/Code/opencode-v2-pilot/packages/core/test/tool-shell.test.ts: Line 330: (reason) => Cause.isDieReason(reason) && reason.defect instanceof Permission.DeclinedError, Line 427: (reason) => Cause.isDieReason(reason) && reason.defect instanceof ...
Success. Updated the following files: M ../opencode-v2-pilot/packages/core/test/plugin/fixture.ts M ../opencode-v2-pilot/packages/core/test/plugin.test.ts
<path>/home/byk/Code/opencode-v2-pilot/packages/core/package.json</path>
<type>file</type>
<content>
1: {
2: "$schema": "https://json.schemastore.org/package.json",
3: "version": "1.18.4",
4: "name": "@opencode/core",
5: "type": "module",
6: "license": "MIT",
7: "repository": {
8: "type": "git",
9: "url": "git+https://github.com/anomalyco/opencode.git",
10: "directory": "packages/core"
11: },
12: "publishConfig": {
13: "access": "public"
14: },
15: "files": [
16: "dist"
17: ],
18: "scripts": {
19: "db": "bun drizzle-kit",
20: "migration": "bun run script/migration.ts",
21: "fix-node-pty": "bun run script/fix-node-pty.ts",
22: "benchmark:location": "bun run script/benchmark-location.ts",
23: "benchmark:location-memory": "bun run script/benchmark-location-memory.ts",
24: "build": "bun run script/build.ts",
25: "update-models-snapshot": "bun run script/update-models-snapshot.ts",
26: "test": "bun run ...
$ tsgo -b tsconfig.json tsconfig.tests.json
bun test v1.3.14 (0d9b296a)
test/plugin.test.ts:
19 pass
0 fail
65 expect() calls
Ran 19 tests across 1 file. [2.59s]
[00:02:00.000] INFO (#7639): credential updated {
credentialID: "cred_07f2eac68001s4PnQ16qxJ7wax",
integrationID: "refresh-fixture",
valueChanged: true,
labelChanged: false,
}
M packages/core/src/plugin/host.ts
M packages/core/test/plugin.test.ts
M packages/core/test/plugin/fixture.ts
M packages/core/test/plugin/host.ts
M packages/plugin/src/effect/permission.ts
M packages/plugin/src/promise/adapter.ts
M packages/plugin/src/promise/permission.ts
?? packages/cli/dist-v2-pilot-final/
?? packages/cli/dist-v2-pilot-next/
?? packages/cli/dist-v2-pilot/
diff --git a/packages/core/test/plugin.test.ts b/packages/core/test/plugin.test.ts
index 1b71e18978..18a6966a62 100644
--- a/packages/core/test/plugin.test.ts
+++ b/packages/core/test/plugin.test.ts
@@ -1,20 +1,33 @@
import { expect } from "bun:test"
import path from "path"
-import { Clock, Deferred, Effect } from "effect"
+import { Cause, Clock, Deferred, Effect, Exit, Schema } from "effect"
import { TestClock } from "effect/testing"
+import { Agent } from "@opencode/core/agent"
import { Command } from "@opencode/core/command"
import { Bus } from "@opencode/core/bus"
import { Credential } from ...
Success. Updated the following files: M ../opencode-v2-pilot/packages/core/test/plugin/fixture.ts
$ tsgo -b tsconfig.json tsconfig.tests.json
bun test v1.3.14 (0d9b296a) 1 pass 18 filtered out 0 fail 7 expect() calls Ran 1 test across 1 file. [1.82s]
M packages/core/src/plugin/host.ts M packages/core/test/plugin.test.ts M packages/core/test/plugin/fixture.ts M packages/core/test/plugin/host.ts M packages/plugin/src/effect/permission.ts M packages/plugin/src/promise/adapter.ts M packages/plugin/src/promise/permission.ts ?? packages/cli/dist-v2-pilot-final/ ?? packages/cli/dist-v2-pilot-next/ ?? packages/cli/dist-v2-pilot/
Implemented focused Promise permission adapter regression coverage without changing implementation code.
packages/core/test/plugin.test.ts
Permission.CorrectedError, defects, and plain Permission.DeclinedError through an activated Promise plugin and real Tool execution path.packages/core/test/plugin/fixture.ts
bun typecheck
bun test test/plugin.test.ts --printConsoleTracebun test test/plugin.test.ts --test-name-pattern "preserves Promise permission assertion outcomes" --printConsoleTracegit diff --check
The current implementation matches all tested semantics:
CorrectedError.feedback becomes the exact Tool.Error.message.DeclinedError retains its established defect tunnel.Existing unrelated worktree changes were left untouched.
Date: Sep 8, 2026 * 🟡 (04:02) Added Promise permission adapter regression coverage in `packages/core/test/plugin.test.ts`, importing `Cause`, `Exit`, `Schema`, `Agent`, `Permission`, `SessionMessage`, `Tool`, and `pluginTestLayer`. * 🟡 (04:02) Added test `"exposes canonical permission assertions to Promise plugins"`: activates Promise plugin `promise-permission`, calls `ctx.permission.assert()`…
Date: Sep 8, 2026 * 🟡 (04:02) Code search found exactly 45 matches involving Effect failure, interruption, defect, or cause inspection across 17 test files under `/home/byk/Code/opencode-v2-pilot/packages/core/test/`. * 🟡 (04:02) `/home/byk/Code/opencode-v2-pilot/packages/core/test/vcs.test.ts` matches: line 275 checks `Exit.isFailure(exit) && Cause.hasInterrupts(exit.cause)`; line 279 checks `…
Date: Sep 8, 2026 * 🔴 (04:00) User stated that an explicit `HttpClient` replacement never reaches the default `FetchHttpClient.Fetch` refusal mechanism in `/home/byk/Code/opencode-v2-pilot/packages/core/test/lib/effect.ts`. * 🟡 (04:00) `/home/byk/Code/opencode-v2-pilot/packages/core/test/lib/effect.ts:6-8` defines `Body<A, E, R>` as either an `Effect.Effect<A, E, R>` or a zero-argument function…
Date: Sep 8, 2026 * 🟡 (04:00) `/home/byk/Code/opencode-v2-pilot/packages/core/test/tool-registry.test.ts:18-43` defines an `imageStore` mock for `Image.Service.normalize`: `corrupt.png` fails with `Image.DecodeError`; `too-large.png` fails with `Image.SizeError` using `width: 9_000`, `height: 9_000`, `maxWidth: 2_000`, `maxHeight: 2_000`, and `maxBytes: 5`; other images have `" normalized"` appe…
Date: Sep 8, 2026 * 🟡 (03:59) Test search found 45 uses of `snapshot()` across Core tests, including `/home/byk/Code/opencode-v2-pilot/packages/core/test/wellknown.test.ts`, `tool-websearch.test.ts`, `tool-subagent.test.ts`, `tool-registry.test.ts`, `codemode.test.ts`, `codemode/instructions.test.ts`, and `mcp.test.ts`. * 🟡 (03:59) `/home/byk/Code/opencode-v2-pilot/packages/core/test/tool-regis…
Date: Sep 8, 2026 * 🟡 (03:58) Investigation identified the primary implementation surfaces for the Promise permission adapter semantics: `/home/byk/Code/opencode-v2-pilot/packages/core/src/permission.ts`, `/home/byk/Code/opencode-v2-pilot/packages/core/src/plugin/promise.ts`, and `/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/adapter.ts`; the broader search also covered Core tool/…
Date: Sep 8, 2026 * 🔴 [requested-tests] (03:57) User asked to add focused regression tests in `/home/byk/Code/opencode-v2-pilot` for the current Promise permission adapter semantics, inspecting `packages/core/test/plugin.test.ts`, fixtures, the Tool service invocation API, and Permission errors. * 🔴 (03:57) User required tests to exercise a real activated Promise plugin/tool and real host adapt…