From 80597cd3fdf149cef87db55f03a3cc0bfd723a7a Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 29 May 2025 11:58:40 -0400 Subject: type error fix --- js/src/app/app.ts | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++ js/src/app/config.ts | 79 ---------------------------------------------------- js/src/app/index.ts | 78 --------------------------------------------------- 3 files changed, 78 insertions(+), 157 deletions(-) create mode 100644 js/src/app/app.ts delete mode 100644 js/src/app/config.ts delete mode 100644 js/src/app/index.ts (limited to 'js/src/app') diff --git a/js/src/app/app.ts b/js/src/app/app.ts new file mode 100644 index 000000000..0c6260bc7 --- /dev/null +++ b/js/src/app/app.ts @@ -0,0 +1,78 @@ +import fs from "fs/promises"; +import { AppPath } from "./path"; +import { Log } from "../util/log"; +import { Context } from "../util/context"; + +export namespace App { + const log = Log.create({ service: "app" }); + + export type Info = Awaited>; + + const ctx = Context.create("app"); + + async function create(input: { directory: string }) { + const dataDir = AppPath.data(input.directory); + await fs.mkdir(dataDir, { recursive: true }); + await Log.file(input.directory); + + log.info("created", { path: dataDir }); + + const services = new Map< + any, + { + state: any; + shutdown?: (input: any) => Promise; + } + >(); + + const result = { + get services() { + return services; + }, + get root() { + return input.directory; + }, + }; + + return result; + } + + export function state( + key: any, + init: (app: Info) => State, + shutdown?: (state: Awaited) => Promise, + ) { + return () => { + const app = ctx.use(); + const services = app.services; + if (!services.has(key)) { + log.info("registering service", { name: key }); + services.set(key, { + state: init(app), + shutdown: shutdown, + }); + } + return services.get(key)?.state as State; + }; + } + + export async function use() { + return ctx.use(); + } + + export async function provide any>( + input: { directory: string }, + cb: T, + ) { + const app = await create(input); + + return ctx.provide(app, async () => { + const result = await cb(app); + for (const [key, entry] of app.services.entries()) { + log.info("shutdown", { name: key }); + await entry.shutdown?.(await entry.state); + } + return result; + }); + } +} diff --git a/js/src/app/config.ts b/js/src/app/config.ts deleted file mode 100644 index e68b24bb9..000000000 --- a/js/src/app/config.ts +++ /dev/null @@ -1,79 +0,0 @@ -import path from "path"; -import { Log } from "../util/log"; -import { z } from "zod"; -import { App } from "."; - -export namespace Config { - const log = Log.create({ service: "config" }); - - export const state = App.state("config", async (app) => { - const result = await load(app.root); - 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(), - }) - .strict(); - - export type Info = z.output; - - export function get() { - return state(); - } - - async function load(directory: string) { - let result: Info = {}; - for (const file of ["opencode.jsonc", "opencode.json"]) { - const resolved = path.join(directory, file); - log.info("searching", { path: resolved }); - try { - result = await import(path.join(directory, file)).then((mod) => - Info.parse(mod.default), - ); - log.info("found", { path: resolved }); - break; - } catch (e) { - if (e instanceof z.ZodError) { - for (const issue of e.issues) { - log.info(issue.message); - } - throw e; - } - continue; - } - } - log.info("loaded", result); - return result; - } -} diff --git a/js/src/app/index.ts b/js/src/app/index.ts deleted file mode 100644 index 0c6260bc7..000000000 --- a/js/src/app/index.ts +++ /dev/null @@ -1,78 +0,0 @@ -import fs from "fs/promises"; -import { AppPath } from "./path"; -import { Log } from "../util/log"; -import { Context } from "../util/context"; - -export namespace App { - const log = Log.create({ service: "app" }); - - export type Info = Awaited>; - - const ctx = Context.create("app"); - - async function create(input: { directory: string }) { - const dataDir = AppPath.data(input.directory); - await fs.mkdir(dataDir, { recursive: true }); - await Log.file(input.directory); - - log.info("created", { path: dataDir }); - - const services = new Map< - any, - { - state: any; - shutdown?: (input: any) => Promise; - } - >(); - - const result = { - get services() { - return services; - }, - get root() { - return input.directory; - }, - }; - - return result; - } - - export function state( - key: any, - init: (app: Info) => State, - shutdown?: (state: Awaited) => Promise, - ) { - return () => { - const app = ctx.use(); - const services = app.services; - if (!services.has(key)) { - log.info("registering service", { name: key }); - services.set(key, { - state: init(app), - shutdown: shutdown, - }); - } - return services.get(key)?.state as State; - }; - } - - export async function use() { - return ctx.use(); - } - - export async function provide any>( - input: { directory: string }, - cb: T, - ) { - const app = await create(input); - - return ctx.provide(app, async () => { - const result = await cb(app); - for (const [key, entry] of app.services.entries()) { - log.info("shutdown", { name: key }); - await entry.shutdown?.(await entry.state); - } - return result; - }); - } -} -- cgit v1.2.3