tui-plugin.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import type { TuiPluginApi } from "@opencode-ai/plugin/tui"
  2. import { RGBA } from "@opentui/core"
  3. import { createTuiResolvedConfig } from "./tui-runtime"
  4. type Opts = {
  5. client?: TuiPluginApi["client"]
  6. keymap?: TuiPluginApi["keymap"]
  7. attention?: Partial<TuiPluginApi["attention"]>
  8. event?: TuiPluginApi["event"]
  9. state?: { session?: Partial<TuiPluginApi["state"]["session"]> }
  10. }
  11. export function createTuiPluginApi(opts: Opts = {}) {
  12. const values = new Map<string, unknown>()
  13. const color = RGBA.fromInts(200, 200, 200)
  14. const dialog = { clear() {}, replace() {}, setSize() {}, size: "medium" as const, depth: 0, open: false }
  15. return {
  16. attention: { notify: async () => ({ ok: false, notification: false, sound: false }), ...opts.attention },
  17. client: opts.client,
  18. event: opts.event,
  19. keymap: opts.keymap,
  20. kv: {
  21. get(name: string, fallback?: unknown) {
  22. return values.has(name) ? values.get(name) : fallback
  23. },
  24. set(name: string, value: unknown) {
  25. values.set(name, value)
  26. },
  27. ready: true,
  28. },
  29. state: { session: { get: () => undefined, ...opts.state?.session } },
  30. theme: { current: new Proxy({}, { get: () => color }) },
  31. tuiConfig: createTuiResolvedConfig(),
  32. ui: { dialog },
  33. } as unknown as TuiPluginApi
  34. }