diff --git a/bun.lock b/bun.lock index d98e37cfb4..c0b2c62ffe 100644 --- a/bun.lock +++ b/bun.lock @@ -456,7 +456,6 @@ }, "devDependencies": { "@babel/core": "7.28.4", - "@effect/language-service": "0.84.2", "@octokit/webhooks-types": "7.6.1", "@opencode-ai/core": "workspace:*", "@opencode-ai/script": "workspace:*", @@ -1069,8 +1068,6 @@ "@drizzle-team/brocli": ["@drizzle-team/brocli@0.11.0", "", {}, "sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg=="], - "@effect/language-service": ["@effect/language-service@0.84.2", "", { "bin": { "effect-language-service": "cli.js" } }, "sha512-l04qNxpiA8rY5yXWckRPJ7Mk5MNerXuNymSFf+IdflfI5i8jgL1bpBNLuP6ijg7wgjdHc/KmTnCj2kT0SCntuA=="], - "@effect/opentelemetry": ["@effect/opentelemetry@4.0.0-beta.48", "", { "peerDependencies": { "@opentelemetry/api": "^1.9", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-logs": ">=0.203.0 <0.300.0", "@opentelemetry/sdk-metrics": "^2.0.0", "@opentelemetry/sdk-trace-base": "^2.0.0", "@opentelemetry/sdk-trace-node": "^2.0.0", "@opentelemetry/sdk-trace-web": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.33.0", "effect": "^4.0.0-beta.48" }, "optionalPeers": ["@opentelemetry/api", "@opentelemetry/resources", "@opentelemetry/sdk-logs", "@opentelemetry/sdk-metrics", "@opentelemetry/sdk-trace-base", "@opentelemetry/sdk-trace-node", "@opentelemetry/sdk-trace-web"] }, "sha512-vHk/X1vgDrviGcOTHQqzm2D81TtyPE/C7Qdksg5eAdbGpnqL4Dm4lk6PzTReQ0pO1/avIvWqpxy315IURV0Ldw=="], "@effect/platform-node": ["@effect/platform-node@4.0.0-beta.48", "", { "dependencies": { "@effect/platform-node-shared": "^4.0.0-beta.48", "mime": "^4.1.0", "undici": "^8.0.2" }, "peerDependencies": { "effect": "^4.0.0-beta.48", "ioredis": "^5.7.0" } }, "sha512-8J6H0k9rtbp9O1QvKOyOPRcCTJ8WrR7IzZLJtYFTZ4bXVEEMCTo84h0CRpi7ccpA9t7DLqotip0NeFgiBosNKQ=="], diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index d7745d7554..fe5c4d217b 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -2,13 +2,6 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "@tsconfig/bun/tsconfig.json", "compilerOptions": { - "noUncheckedIndexedAccess": false, - "plugins": [ - { - "name": "@effect/language-service", - "transform": "@effect/language-service/transform", - "namespaceImportPackages": ["effect", "@effect/*"] - } - ] + "noUncheckedIndexedAccess": false } } diff --git a/packages/opencode/package.json b/packages/opencode/package.json index c569b9b225..73097674d7 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -6,7 +6,6 @@ "license": "MIT", "private": true, "scripts": { - "prepare": "effect-language-service patch || true", "typecheck": "tsgo --noEmit", "test": "bun test --timeout 30000", "test:ci": "mkdir -p .artifacts/unit && bun test --timeout 30000 --reporter=junit --reporter-outfile=.artifacts/unit/junit.xml", @@ -42,7 +41,6 @@ }, "devDependencies": { "@babel/core": "7.28.4", - "@effect/language-service": "0.84.2", "@octokit/webhooks-types": "7.6.1", "@opencode-ai/script": "workspace:*", "@opencode-ai/core": "workspace:*", diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts index 0efb9697ea..890af22e7d 100644 --- a/packages/opencode/src/session/processor.ts +++ b/packages/opencode/src/session/processor.ts @@ -380,22 +380,19 @@ export const layer: Layer.Layer< SyncEvent.run(SessionEvent.Tool.Success.Sync, { sessionID: ctx.sessionID, callID: value.toolCallId, - output: value.output.output, - attachments: value.output.attachments?.map((item: MessageV2.FilePart) => ({ - uri: item.url, - mime: item.mime, - ...(item.filename ? { name: item.filename } : {}), - ...(item.source - ? { - source: { - start: item.source.text.start, - end: item.source.text.end, - text: item.source.text.value, - }, - } - : {}), - })), - details: value.output.metadata, + structured: value.output.metadata, + content: [ + { + type: "text", + text: value.output.output, + }, + ...value.output.attachments?.map((item: MessageV2.FilePart) => ({ + type: "file", + uri: item.url, + mime: item.mime, + name: item.filename, + })), + ], provider: { executed: toolCall?.part.metadata?.providerExecuted === true, }, @@ -410,7 +407,10 @@ export const layer: Layer.Layer< SyncEvent.run(SessionEvent.Tool.Error.Sync, { sessionID: ctx.sessionID, callID: value.toolCallId, - error: errorMessage(value.error), + error: { + type: "unknown", + message: errorMessage(value.error), + }, provider: { executed: toolCall?.part.metadata?.providerExecuted === true, }, diff --git a/packages/opencode/src/v2/session-event.ts b/packages/opencode/src/v2/session-event.ts index aa53e0b6dc..5dcc6b7e04 100644 --- a/packages/opencode/src/v2/session-event.ts +++ b/packages/opencode/src/v2/session-event.ts @@ -3,6 +3,7 @@ import { Event } from "./event" import { FileAttachment, Prompt } from "./session-prompt" import { Schema } from "effect" export { FileAttachment } +import { ToolOutput } from "./tool-output" export const ID = Event.ID export type ID = Schema.Schema.Type @@ -201,7 +202,8 @@ export namespace Tool { schema: { ...Base, callID: Schema.String, - details: Schema.Record(Schema.String, Schema.Unknown), + structured: ToolOutput.Structured, + content: Schema.Array(ToolOutput.Content), }, }) export type Progress = Schema.Schema.Type @@ -212,9 +214,8 @@ export namespace Tool { schema: { ...Base, callID: Schema.String, - output: Schema.String.pipe(Schema.optional), - attachments: Schema.Array(FileAttachment).pipe(Schema.optional), - details: Schema.Record(Schema.String, Schema.Unknown).pipe(Schema.optional), + structured: ToolOutput.Structured, + content: Schema.Array(ToolOutput.Content), provider: Schema.Struct({ executed: Schema.Boolean, metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(Schema.optional), @@ -229,7 +230,10 @@ export namespace Tool { schema: { ...Base, callID: Schema.String, - error: Schema.String, + error: Schema.Struct({ + type: Schema.String, + message: Schema.String, + }), provider: Schema.Struct({ executed: Schema.Boolean, metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(Schema.optional), diff --git a/packages/opencode/src/v2/session-message-updater.ts b/packages/opencode/src/v2/session-message-updater.ts index 2e1735549f..ed5aac951e 100644 --- a/packages/opencode/src/v2/session-message-updater.ts +++ b/packages/opencode/src/v2/session-message-updater.ts @@ -163,6 +163,8 @@ export function update(adapter: Adapter, event: SessionEvent.Eve match.state = { status: "running", input: event.data.input, + structured: {}, + content: [], } } }), @@ -174,7 +176,10 @@ export function update(adapter: Adapter, event: SessionEvent.Eve adapter.updateAssistant( produce(currentAssistant, (draft) => { const match = latestTool(draft, event.data.callID) - if (match && match.state.status === "running") match.state.details = event.data.details + if (match && match.state.status === "running") { + match.state.structured = event.data.structured + match.state.content = [...event.data.content] + } }), ) } @@ -188,9 +193,8 @@ export function update(adapter: Adapter, event: SessionEvent.Eve match.state = { status: "completed", input: match.state.input, - output: event.data.output ?? "", - details: event.data.details, - attachments: [...(event.data.attachments ?? [])], + structured: event.data.structured, + content: [...event.data.content], } } }), @@ -207,6 +211,8 @@ export function update(adapter: Adapter, event: SessionEvent.Eve status: "error", error: event.data.error, input: match.state.input, + structured: match.state.structured, + content: match.state.content, } } }), diff --git a/packages/opencode/src/v2/session-message.ts b/packages/opencode/src/v2/session-message.ts index dea7ee80f1..6d84c2ca8e 100644 --- a/packages/opencode/src/v2/session-message.ts +++ b/packages/opencode/src/v2/session-message.ts @@ -2,6 +2,7 @@ import { Schema } from "effect" import { Prompt } from "./session-prompt" import { SessionEvent } from "./session-event" import { Event } from "./event" +import { ToolOutput } from "./tool-output" export const ID = Event.ID export type ID = Schema.Schema.Type @@ -62,22 +63,27 @@ export class ToolStatePending extends Schema.Class("Session.Me export class ToolStateRunning extends Schema.Class("Session.Message.ToolState.Running")({ status: Schema.Literal("running"), input: Schema.Record(Schema.String, Schema.Unknown), - details: Schema.Record(Schema.String, Schema.Unknown).pipe(Schema.optional), + structured: ToolOutput.Structured, + content: ToolOutput.Content.pipe(Schema.Array), }) {} export class ToolStateCompleted extends Schema.Class("Session.Message.ToolState.Completed")({ status: Schema.Literal("completed"), input: Schema.Record(Schema.String, Schema.Unknown), - output: Schema.String, - details: Schema.Record(Schema.String, Schema.Unknown).pipe(Schema.optional), attachments: SessionEvent.FileAttachment.pipe(Schema.Array, Schema.optional), + content: ToolOutput.Content.pipe(Schema.Array), + structured: ToolOutput.Structured, }) {} export class ToolStateError extends Schema.Class("Session.Message.ToolState.Error")({ status: Schema.Literal("error"), input: Schema.Record(Schema.String, Schema.Unknown), - error: Schema.String, - details: Schema.Record(Schema.String, Schema.Unknown).pipe(Schema.optional), + content: ToolOutput.Content.pipe(Schema.Array), + structured: ToolOutput.Structured, + error: Schema.Struct({ + type: Schema.String, + message: Schema.String, + }), }) {} export const ToolState = Schema.Union([ToolStatePending, ToolStateRunning, ToolStateCompleted, ToolStateError]).pipe( diff --git a/packages/opencode/src/v2/tool-output.ts b/packages/opencode/src/v2/tool-output.ts new file mode 100644 index 0000000000..dee2bb11ed --- /dev/null +++ b/packages/opencode/src/v2/tool-output.ts @@ -0,0 +1,18 @@ +export * as ToolOutput from "./tool-output" +import { Schema } from "effect" + +export class TextContent extends Schema.Class("Tool.TextContent")({ + type: Schema.Literal("text"), + text: Schema.String, +}) {} + +export class FileContent extends Schema.Class("Tool.FileContent")({ + type: Schema.Literal("file"), + uri: Schema.String, + mime: Schema.String, + name: Schema.String.pipe(Schema.optional), +}) {} + +export const Content = Schema.Union([TextContent, FileContent]).pipe(Schema.toTaggedUnion("type")) + +export const Structured = Schema.Record(Schema.String, Schema.Any) diff --git a/packages/opencode/tsconfig.json b/packages/opencode/tsconfig.json index 5cb51012ae..f09fca6878 100644 --- a/packages/opencode/tsconfig.json +++ b/packages/opencode/tsconfig.json @@ -12,13 +12,6 @@ "@/*": ["./src/*"], "@tui/*": ["./src/cli/cmd/tui/*"], "@test/*": ["./test/*"] - }, - "plugins": [ - { - "name": "@effect/language-service", - "transform": "@effect/language-service/transform", - "namespaceImportPackages": ["effect", "@effect/*"] - } - ] + } } }