From 80597cd3fdf149cef87db55f03a3cc0bfd723a7a Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 May 2025 11:58:40 -0400 Subject: [PATCH] type error fix --- js/example/broken.ts | 1 - js/example/cli.ts | 21 ------ js/example/ink.tsx | 122 ------------------------------- js/src/app/{index.ts => app.ts} | 0 js/src/bus/index.ts | 2 +- js/src/{app => config}/config.ts | 34 +-------- js/src/index.ts | 2 +- js/src/llm/llm.ts | 17 +++-- js/src/llm/models/anthropic.ts | 0 js/src/llm/models/index.ts | 1 - js/src/llm/models/model.ts | 11 --- js/src/lsp/client.ts | 3 +- js/src/lsp/index.ts | 3 +- js/src/provider/provider.ts | 32 ++++++++ js/src/server/server.ts | 6 +- js/src/session/session.ts | 2 +- js/src/share/share.ts | 2 +- js/src/storage/storage.ts | 2 +- js/src/tool/edit.ts | 3 - js/src/tool/glob.ts | 2 +- js/src/tool/grep.ts | 2 +- js/src/tool/ls.ts | 2 +- js/src/tool/lsp-diagnostics.ts | 2 +- js/src/tool/lsp-hover.ts | 2 +- js/src/tool/util/file-times.ts | 2 +- js/test/tool/tool.test.ts | 2 +- pkg/client/gen/openapi.json | 8 +- pkg/client/generated-client.go | 20 ++--- 28 files changed, 76 insertions(+), 230 deletions(-) delete mode 100644 js/example/broken.ts delete mode 100644 js/example/cli.ts delete mode 100644 js/example/ink.tsx rename js/src/app/{index.ts => app.ts} (100%) rename js/src/{app => config}/config.ts (58%) delete mode 100644 js/src/llm/models/anthropic.ts delete mode 100644 js/src/llm/models/index.ts delete mode 100644 js/src/llm/models/model.ts create mode 100644 js/src/provider/provider.ts diff --git a/js/example/broken.ts b/js/example/broken.ts deleted file mode 100644 index e073ad0089..0000000000 --- a/js/example/broken.ts +++ /dev/null @@ -1 +0,0 @@ -export const x: number = "asd"; diff --git a/js/example/cli.ts b/js/example/cli.ts deleted file mode 100644 index 9c9e07edd0..0000000000 --- a/js/example/cli.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { App } from "../src/app"; -import path from "path"; -import { edit } from "../src/tool"; -import { FileTimes } from "../src/tool/util/file-times"; - -await App.provide({ directory: process.cwd() }, async () => { - const file = path.join(process.cwd(), "example/broken.ts"); - FileTimes.read(file); - const tool = await edit.execute( - { - file_path: file, - old_string: "x:", - new_string: "x:", - }, - { - toolCallId: "test", - messages: [], - }, - ); - console.log(tool.output); -}); diff --git a/js/example/ink.tsx b/js/example/ink.tsx deleted file mode 100644 index 5eaab4d3be..0000000000 --- a/js/example/ink.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import React, { useEffect, useState } from "react"; -import type { Server } from "../src/server/server"; -import type { Session } from "../src/session/session"; -import { hc } from "hono/client"; -import { createInterface, Interface } from "readline"; - -const client = hc(`http://localhost:16713`); - - -const session = await client.session_create.$post().then((res) => res.json()); - -const initial: { - session: { - info: { - [sessionID: string]: Session.Info; - }; - message: { - [sessionID: string]: { - [messageID: string]: Session.Message; - }; - }; - }; -} = { - session: { - info: { - [session.id]: session - }, - message: { - [session.id]: {} - }, - }, -}; - -import { render, Text, Newline, useStdout, Box } from "ink"; -import TextInput from "ink-text-input" - -function App() { - const [state, setState] = useState(initial) - const [input, setInput] = useState("") - - useEffect(() => { - fetch("http://localhost:16713/event") - .then(stream => { - const decoder = new TextDecoder(); - stream.body!.pipeTo( - new WritableStream({ - write(chunk) { - const data = decoder.decode(chunk); - if (data.startsWith("data: ")) { - try { - const event = JSON.parse(data.substring(6)); - switch (event.type) { - case "storage.write": - const splits: string[] = event.properties.key.split("/"); - let item = state as any; - for (let i = 0; i < splits.length; i++) { - const part = splits[i]; - if (i === splits.length - 1) { - item[part] = event.properties.body; - continue; - } - if (!item[part]) item[part] = {}; - item = item[part]; - } - } - setState({ ...state }) - } catch { - } - } - }, - }), - ) - }); - }, []) - - - return ( - <> - {session.title} - { - Object.values(state.session.message[session.id]) - .filter(message => message.role !== "system") - .map(message => { - return Object.values(message.parts) - .map((part, index) => { - if (part.type === "text") { - return {message.role}: {part.text} - } - if (part.type === "tool-invocation") { - return {message.role}: {part.toolInvocation.toolName} {JSON.stringify(part.toolInvocation.args)} - } - }) - }) - } - - Input: - { - setInput("") - client.session_chat.$post({ - json: { - sessionID: session.id, - parts: [ - { - type: "text", - text: input, - }, - ], - } - }) - }} - /> - - - ); -}; - -console.clear(); -render(); - diff --git a/js/src/app/index.ts b/js/src/app/app.ts similarity index 100% rename from js/src/app/index.ts rename to js/src/app/app.ts diff --git a/js/src/bus/index.ts b/js/src/bus/index.ts index cf5101b673..342d82b6df 100644 --- a/js/src/bus/index.ts +++ b/js/src/bus/index.ts @@ -1,5 +1,5 @@ import { z, type ZodType } from "zod"; -import { App } from "../app"; +import { App } from "../app/app"; import { Log } from "../util/log"; export namespace Bus { diff --git a/js/src/app/config.ts b/js/src/config/config.ts similarity index 58% rename from js/src/app/config.ts rename to js/src/config/config.ts index e68b24bb9c..76181b7923 100644 --- a/js/src/app/config.ts +++ b/js/src/config/config.ts @@ -1,7 +1,8 @@ import path from "path"; import { Log } from "../util/log"; import { z } from "zod"; -import { App } from "."; +import { App } from "../app/app"; +import { Provider } from "../provider/provider"; export namespace Config { const log = Log.create({ service: "config" }); @@ -11,38 +12,9 @@ export namespace Config { return result; }); - export const Model = z - .object({ - name: z.string().optional(), - cost: z.object({ - input: z.number(), - inputCached: z.number(), - output: z.number(), - outputCached: z.number(), - }), - contextWindow: z.number(), - maxTokens: z.number().optional(), - attachment: z.boolean(), - reasoning: z.boolean().optional(), - }) - .openapi({ - ref: "model", - }); - export type Model = z.output; - - export const Provider = z - .object({ - options: z.record(z.string(), z.any()).optional(), - models: z.record(z.string(), Model), - }) - .openapi({ - ref: "provider", - }); - export type Provider = z.output; - export const Info = z .object({ - providers: z.record(z.string(), Provider).optional(), + providers: z.record(z.string(), Provider.Info).optional(), }) .strict(); diff --git a/js/src/index.ts b/js/src/index.ts index ddea15e91a..1f6c7ae26d 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,5 +1,5 @@ import "zod-openapi/extend"; -import { App } from "./app"; +import { App } from "./app/app"; import { Server } from "./server/server"; import fs from "fs/promises"; import path from "path"; diff --git a/js/src/llm/llm.ts b/js/src/llm/llm.ts index e6230584a2..990c30069e 100644 --- a/js/src/llm/llm.ts +++ b/js/src/llm/llm.ts @@ -1,11 +1,12 @@ -import { App } from "../app"; +import { App } from "../app/app"; import { Log } from "../util/log"; import { mergeDeep } from "remeda"; import path from "path"; +import { Provider } from "../provider/provider"; -import type { LanguageModel, Provider } from "ai"; +import type { LanguageModel, Provider as ProviderInstance } from "ai"; import { NoSuchModelError } from "ai"; -import { Config } from "../app/config"; +import { Config } from "../config/config"; import { BunProc } from "../bun"; import { Global } from "../global"; @@ -18,7 +19,7 @@ export namespace LLM { } } - const NATIVE_PROVIDERS: Record = { + const NATIVE_PROVIDERS: Record = { anthropic: { models: { "claude-sonnet-4-20250514": { @@ -76,18 +77,18 @@ export namespace LLM { google: ["GOOGLE_GENERATIVE_AI_API_KEY"], }; - const state = App.state("llm", async (app) => { + const state = App.state("llm", async () => { const config = await Config.get(); const providers: Record< string, { - info: Config.Provider; - instance: Provider; + info: Provider.Info; + instance: ProviderInstance; } > = {}; const models = new Map< string, - { info: Config.Model; instance: LanguageModel } + { info: Provider.Model; instance: LanguageModel } >(); const list = mergeDeep(NATIVE_PROVIDERS, config.providers ?? {}); diff --git a/js/src/llm/models/anthropic.ts b/js/src/llm/models/anthropic.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/js/src/llm/models/index.ts b/js/src/llm/models/index.ts deleted file mode 100644 index f974b4d3ec..0000000000 --- a/js/src/llm/models/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as anthropic from "./anthropic"; diff --git a/js/src/llm/models/model.ts b/js/src/llm/models/model.ts deleted file mode 100644 index e78dbb87f6..0000000000 --- a/js/src/llm/models/model.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface ModelInfo { - cost: { - input: number; - inputCached: number; - output: number; - outputCached: number; - }; - contextWindow: number; - maxTokens: number; - attachment: boolean; -} diff --git a/js/src/lsp/client.ts b/js/src/lsp/client.ts index cb8bdad2df..82caa82a2d 100644 --- a/js/src/lsp/client.ts +++ b/js/src/lsp/client.ts @@ -6,7 +6,7 @@ import { StreamMessageWriter, } from "vscode-jsonrpc/node"; import type { Diagnostic as VSCodeDiagnostic } from "vscode-languageserver-types"; -import { App } from "../app"; +import { App } from "../app/app"; import { Log } from "../util/log"; import { LANGUAGE_EXTENSIONS } from "./language"; import { Bus } from "../bus"; @@ -31,7 +31,6 @@ export namespace LSPClient { export async function create(input: { cmd: string[]; serverID: string }) { log.info("starting client", input); - let version = 0; const app = await App.use(); const [command, ...args] = input.cmd; diff --git a/js/src/lsp/index.ts b/js/src/lsp/index.ts index ee5a8b2d7f..e3344a934b 100644 --- a/js/src/lsp/index.ts +++ b/js/src/lsp/index.ts @@ -1,4 +1,4 @@ -import { App } from "../app"; +import { App } from "../app/app"; import { Log } from "../util/log"; import { LSPClient } from "./client"; import path from "path"; @@ -9,6 +9,7 @@ export namespace LSP { const state = App.state( "lsp", async () => { + log.info("initializing"); const clients = new Map(); return { diff --git a/js/src/provider/provider.ts b/js/src/provider/provider.ts new file mode 100644 index 0000000000..44482b6dba --- /dev/null +++ b/js/src/provider/provider.ts @@ -0,0 +1,32 @@ +import z from "zod"; + +export namespace Provider { + export const Model = z + .object({ + name: z.string().optional(), + cost: z.object({ + input: z.number(), + inputCached: z.number(), + output: z.number(), + outputCached: z.number(), + }), + contextWindow: z.number(), + maxTokens: z.number().optional(), + attachment: z.boolean(), + reasoning: z.boolean().optional(), + }) + .openapi({ + ref: "Provider.Model", + }); + export type Model = z.output; + + export const Info = z + .object({ + options: z.record(z.string(), z.any()).optional(), + models: z.record(z.string(), Model), + }) + .openapi({ + ref: "Provider.Info", + }); + export type Info = z.output; +} diff --git a/js/src/server/server.ts b/js/src/server/server.ts index ff2d0924be..5bf8d9f54c 100644 --- a/js/src/server/server.ts +++ b/js/src/server/server.ts @@ -6,9 +6,9 @@ import { streamSSE } from "hono/streaming"; import { Session } from "../session/session"; import { resolver, validator as zValidator } from "hono-openapi/zod"; import { z } from "zod"; -import { Config } from "../app/config"; import { LLM } from "../llm/llm"; import { Message } from "../session/message"; +import { Provider } from "../provider/provider"; export namespace Server { const log = Log.create({ service: "server" }); @@ -234,7 +234,7 @@ export namespace Server { description: "List of providers", content: { "application/json": { - schema: resolver(z.record(z.string(), Config.Provider)), + schema: resolver(z.record(z.string(), Provider.Info)), }, }, }, @@ -242,7 +242,7 @@ export namespace Server { }), async (c) => { const providers = await LLM.providers(); - const result: Record = {}; + const result: Record = {}; for (const [providerID, provider] of Object.entries(providers)) { result[providerID] = provider.info; } diff --git a/js/src/session/session.ts b/js/src/session/session.ts index 5e07764b80..f6b50a0bf2 100644 --- a/js/src/session/session.ts +++ b/js/src/session/session.ts @@ -1,5 +1,5 @@ import path from "path"; -import { App } from "../app/"; +import { App } from "../app/app"; import { Identifier } from "../id/id"; import { LLM } from "../llm/llm"; import { Storage } from "../storage/storage"; diff --git a/js/src/share/share.ts b/js/src/share/share.ts index e77f692f45..62dee63a70 100644 --- a/js/src/share/share.ts +++ b/js/src/share/share.ts @@ -1,4 +1,4 @@ -import { App } from "../app"; +import { App } from "../app/app"; import { Bus } from "../bus"; import { Session } from "../session/session"; import { Storage } from "../storage/storage"; diff --git a/js/src/storage/storage.ts b/js/src/storage/storage.ts index 85fa26be6a..983b7e0f97 100644 --- a/js/src/storage/storage.ts +++ b/js/src/storage/storage.ts @@ -2,7 +2,7 @@ import { FileStorage } from "@flystorage/file-storage"; import { LocalStorageAdapter } from "@flystorage/local-fs"; import fs from "fs/promises"; import { Log } from "../util/log"; -import { App } from "../app"; +import { App } from "../app/app"; import { AppPath } from "../app/path"; import { Bus } from "../bus"; import z from "zod"; diff --git a/js/src/tool/edit.ts b/js/src/tool/edit.ts index 3f784d616e..41ff60855d 100644 --- a/js/src/tool/edit.ts +++ b/js/src/tool/edit.ts @@ -1,12 +1,9 @@ import { z } from "zod"; import * as path from "path"; -import { Log } from "../util/log"; import { Tool } from "./tool"; import { FileTimes } from "./util/file-times"; import { LSP } from "../lsp"; -const log = Log.create({ service: "tool.edit" }); - const DESCRIPTION = `Edits files by replacing text, creating new files, or deleting content. For moving or renaming files, use the Bash tool with the 'mv' command instead. For larger file edits, use the FileWrite tool to overwrite files. Before using this tool: diff --git a/js/src/tool/glob.ts b/js/src/tool/glob.ts index 5f1952b78e..f52c3f5d08 100644 --- a/js/src/tool/glob.ts +++ b/js/src/tool/glob.ts @@ -1,6 +1,6 @@ import { z } from "zod"; import { Tool } from "./tool"; -import { App } from "../app"; +import { App } from "../app/app"; const DESCRIPTION = `Fast file pattern matching tool that finds files by name and pattern, returning matching paths sorted by modification time (newest first). diff --git a/js/src/tool/grep.ts b/js/src/tool/grep.ts index d5c2d700c4..0c5848074d 100644 --- a/js/src/tool/grep.ts +++ b/js/src/tool/grep.ts @@ -1,6 +1,6 @@ import { z } from "zod"; import { Tool } from "./tool"; -import { App } from "../app"; +import { App } from "../app/app"; import { spawn } from "child_process"; import { promises as fs } from "fs"; import path from "path"; diff --git a/js/src/tool/ls.ts b/js/src/tool/ls.ts index 62c3d113bd..5954355a34 100644 --- a/js/src/tool/ls.ts +++ b/js/src/tool/ls.ts @@ -1,6 +1,6 @@ import { z } from "zod"; import { Tool } from "./tool"; -import { App } from "../app"; +import { App } from "../app/app"; import * as path from "path"; import * as fs from "fs"; diff --git a/js/src/tool/lsp-diagnostics.ts b/js/src/tool/lsp-diagnostics.ts index c1372b0e95..ecd54c1a7e 100644 --- a/js/src/tool/lsp-diagnostics.ts +++ b/js/src/tool/lsp-diagnostics.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { Tool } from "./tool"; import path from "path"; import { LSP } from "../lsp"; -import { App } from "../app"; +import { App } from "../app/app"; export const LspDiagnosticTool = Tool.define({ name: "diagnostics", diff --git a/js/src/tool/lsp-hover.ts b/js/src/tool/lsp-hover.ts index 9b6290ef5f..4ffa90a755 100644 --- a/js/src/tool/lsp-hover.ts +++ b/js/src/tool/lsp-hover.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { Tool } from "./tool"; import path from "path"; import { LSP } from "../lsp"; -import { App } from "../app"; +import { App } from "../app/app"; export const LspHoverTool = Tool.define({ name: "lsp.hover", diff --git a/js/src/tool/util/file-times.ts b/js/src/tool/util/file-times.ts index aab562dd45..8d36d007d2 100644 --- a/js/src/tool/util/file-times.ts +++ b/js/src/tool/util/file-times.ts @@ -1,4 +1,4 @@ -import { App } from "../../app"; +import { App } from "../../app/app"; export namespace FileTimes { export const state = App.state("tool.filetimes", () => ({ diff --git a/js/test/tool/tool.test.ts b/js/test/tool/tool.test.ts index a8a621dc6e..4b6d2efd32 100644 --- a/js/test/tool/tool.test.ts +++ b/js/test/tool/tool.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { App } from "../../src/app"; +import { App } from "../../src/app/app"; import { glob } from "../../src/tool/glob"; import { ls } from "../../src/tool/ls"; diff --git a/pkg/client/gen/openapi.json b/pkg/client/gen/openapi.json index 4e6506e73a..0b481d2094 100644 --- a/pkg/client/gen/openapi.json +++ b/pkg/client/gen/openapi.json @@ -238,7 +238,7 @@ "schema": { "type": "object", "additionalProperties": { - "$ref": "#/components/schemas/provider" + "$ref": "#/components/schemas/Provider.Info" } } } @@ -740,7 +740,7 @@ "title" ] }, - "provider": { + "Provider.Info": { "type": "object", "properties": { "options": { @@ -750,7 +750,7 @@ "models": { "type": "object", "additionalProperties": { - "$ref": "#/components/schemas/model" + "$ref": "#/components/schemas/Provider.Model" } } }, @@ -758,7 +758,7 @@ "models" ] }, - "model": { + "Provider.Model": { "type": "object", "properties": { "name": { diff --git a/pkg/client/generated-client.go b/pkg/client/generated-client.go index 0fce536e74..9cbb91944e 100644 --- a/pkg/client/generated-client.go +++ b/pkg/client/generated-client.go @@ -170,8 +170,14 @@ type MessageToolInvocationToolResult struct { ToolName string `json:"toolName"` } -// Model defines model for model. -type Model struct { +// ProviderInfo defines model for Provider.Info. +type ProviderInfo struct { + Models map[string]ProviderModel `json:"models"` + Options *map[string]interface{} `json:"options,omitempty"` +} + +// ProviderModel defines model for Provider.Model. +type ProviderModel struct { Attachment bool `json:"attachment"` ContextWindow float32 `json:"contextWindow"` Cost struct { @@ -185,12 +191,6 @@ type Model struct { Reasoning *bool `json:"reasoning,omitempty"` } -// Provider defines model for provider. -type Provider struct { - Models map[string]Model `json:"models"` - Options *map[string]interface{} `json:"options,omitempty"` -} - // SessionInfo defines model for session.info. type SessionInfo struct { Id string `json:"id"` @@ -1329,7 +1329,7 @@ func (r GetEventResponse) StatusCode() int { type PostProviderListResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *map[string]Provider + JSON200 *map[string]ProviderInfo } // Status returns HTTPResponse.Status @@ -1625,7 +1625,7 @@ func ParsePostProviderListResponse(rsp *http.Response) (*PostProviderListRespons switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest map[string]Provider + var dest map[string]ProviderInfo if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err }