Dashboard › opencode › Distillation
08ba7357-fabf-4ba9-840e-8e21c56af81e["lore_tm_v1_mq_oJ3ebIl6aGw8TCdPHnI8zF4rSzIG8PhUF9Lq9ZkM","lore_tm_v1_JWUpIAZqRspv55E2opoTfDEBmYmzvE0opuYdyo5x8eE","lore_tm_v1_cuL6AE47zixvihYGkr96TF10zBTmmkyWdTxIsuEOCwo","lore_tm_v1_ED6Mm_IwlFccLM08XoLd8RF_YgRHY5PZ5fnFsOXxssI","lore_tm_v1_u3GEJZn8oe9mXCivaGhEMlMNK0Ut9X8FHlTY0nB7N2s","lore_tm_v1__O-WGGAuBjw5gExgmE4cQRrTFLW-LRhICZAbz3bheFQ","lore_tm_v1_hm0yWsp8-Vsr1XpYMRIBnuEje4SOcvXG62OUl_vvO8U","lore_tm_v1_L8frpR-_IUxrN4crBuSVEvV8EAvz4Ic04HF2UL9qEYs","lore_tm_v1_-ERsvByR7n8m3rhWorRp0fUw2q97cpWlrSY5aaTHJWA"]
Date: Sep 8, 2026
/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.ctx.permission.assert remains successful; 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; 4. plain DeclinedError should retain its established defect tunnel if practical.testEffect, and package-local testing.bun typecheck and focused tests from packages/core with --printConsoleTrace.packages/core.bun typecheck from package directories, for example packages/core; never run tsc directly.sdk composes Client, Core, and Server.import { foo as bar } from "..." or resolve as pathResolve.import("...") references such as Schema.declare<import("@opencode/plugin/effect/plugin").Plugin["effect"]>; only as a last resort when names genuinely collide may an aliased type import such as import type { Plugin as PluginDefinition } from "..." be used, though it remains strongly discouraged.import * as Foo from "..." and import type * as Foo from "..."; namespace-style values should use a module’s exported namespace by name, such as import { Project } from "@opencode/core/project" followed by Project.ID.globalThis.* unless it is the only option; test the actual implementation rather than duplicating logic in tests.Effect.gen(function* () { ... }), existing testEffect(...), explicit layers, scoped fixtures/finalizers, and it.live(...) for real platform behavior.packages/core/test/plugin.test.ts uses testEffect(PluginTestLayer), imports fromPromise from @opencode/plugin/promise/adapter, and already contains a test named "exposes canonical permission assertions to Promise plugins" that activates a promise-permission plugin, calls ctx.permission.assert(...), waits on a Deferred, and expects the plugin state to be "active".sessionID: Session.ID.make("ses_plugin_permission"), action: "shell", resources: ["'true'"], and source { type: "tool", messageID: "msg_plugin_permission", id: "call_plugin_permission" }.packages/core/test/plugin/fixture.ts defines permissionLayer with Permission.Service.of(...); its assert implementation is currently () => Effect.void, while ask returns { id: input.id ?? Permission.ID.create(), effect: "ask" }, and reply, get, forSession, and list are inert/empty test implementations.PluginTestLayer in packages/core/test/plugin/fixture.ts includes both Permission.node and Tool.node, and replaces Permission.node with permissionLayer.tool.execute(decoded, context) in packages/core/src/tool/runtime.ts:36; unrelated execute(...) matches also appeared in packages/core/src/tool/plugin/webfetch.ts:75, packages/core/src/tool/plugin/webfetch.ts:135, and packages/core/src/tool/plugin/webfetch.ts:136.packages/core, packages/cli, packages/server, packages/protocol, packages/schema, and related generated client surfaces when required; public Protocol or Server HttpApi changes require bun run generate from packages/client, and generated client files must not be edited directly..changeset files must not be added.