tui-sdk.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import type { GlobalEvent } from "@kirincode-ai/sdk/v2"
  2. import type { EventSource } from "@kirincode-ai/tui/context/sdk"
  3. export const worktree = "/tmp/opencode"
  4. export const directory = `${worktree}/packages/opencode`
  5. export function json(data: unknown, init?: ResponseInit) {
  6. return new Response(JSON.stringify(data), {
  7. ...init,
  8. headers: { "content-type": "application/json", ...(init?.headers ?? {}) },
  9. })
  10. }
  11. export function eventSource(): EventSource {
  12. return { subscribe: async () => () => {} }
  13. }
  14. export function createEventSource() {
  15. let fn: ((event: GlobalEvent) => void) | undefined
  16. return {
  17. source: {
  18. subscribe: async (handler: (event: GlobalEvent) => void) => {
  19. fn = handler
  20. return () => {
  21. if (fn === handler) fn = undefined
  22. }
  23. },
  24. } satisfies EventSource,
  25. emit(event: GlobalEvent) {
  26. if (!fn) throw new Error("event source not ready")
  27. fn(event)
  28. },
  29. }
  30. }
  31. export type FetchHandler = (url: URL) => Response | Promise<Response> | undefined
  32. export function createFetch(override?: FetchHandler) {
  33. const session = [] as URL[]
  34. const fetch = (async (input: RequestInfo | URL) => {
  35. const url = new URL(input instanceof Request ? input.url : String(input))
  36. if (url.pathname === "/session") session.push(url)
  37. const overridden = await override?.(url)
  38. if (overridden) return overridden
  39. switch (url.pathname) {
  40. case "/agent":
  41. case "/command":
  42. case "/experimental/workspace":
  43. case "/experimental/workspace/status":
  44. case "/formatter":
  45. case "/lsp":
  46. return json([])
  47. case "/config":
  48. case "/experimental/resource":
  49. case "/mcp":
  50. case "/provider/auth":
  51. case "/session/status":
  52. return json({})
  53. case "/config/providers":
  54. return json({ providers: {}, default: {} })
  55. case "/experimental/console":
  56. return json({ consoleManagedProviders: [], switchableOrgCount: 0 })
  57. case "/path":
  58. return json({ home: "", state: "", config: "", worktree, directory })
  59. case "/project/current":
  60. return json({ id: "proj_test" })
  61. case "/provider":
  62. return json({ all: [], default: {}, connected: [] })
  63. case "/session":
  64. return json([])
  65. case "/vcs":
  66. return json({ branch: "main" })
  67. }
  68. throw new Error(`unexpected request: ${url.pathname}`)
  69. }) as typeof globalThis.fetch
  70. return { fetch, session }
  71. }