@4via6/relay 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/.env.example +50 -0
  2. package/README.md +253 -0
  3. package/dist/auth.d.ts +3 -0
  4. package/dist/auth.js +32 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/bot.d.ts +2 -0
  7. package/dist/bot.js +14 -0
  8. package/dist/bot.js.map +1 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +3 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/admin.d.ts +2 -0
  13. package/dist/commands/admin.js +420 -0
  14. package/dist/commands/admin.js.map +1 -0
  15. package/dist/commands/chat.d.ts +2 -0
  16. package/dist/commands/chat.js +80 -0
  17. package/dist/commands/chat.js.map +1 -0
  18. package/dist/commands/files.d.ts +2 -0
  19. package/dist/commands/files.js +162 -0
  20. package/dist/commands/files.js.map +1 -0
  21. package/dist/commands/history.d.ts +2 -0
  22. package/dist/commands/history.js +152 -0
  23. package/dist/commands/history.js.map +1 -0
  24. package/dist/commands/index.d.ts +2 -0
  25. package/dist/commands/index.js +21 -0
  26. package/dist/commands/index.js.map +1 -0
  27. package/dist/commands/mcp.d.ts +2 -0
  28. package/dist/commands/mcp.js +105 -0
  29. package/dist/commands/mcp.js.map +1 -0
  30. package/dist/commands/media.d.ts +2 -0
  31. package/dist/commands/media.js +248 -0
  32. package/dist/commands/media.js.map +1 -0
  33. package/dist/commands/monitor.d.ts +2 -0
  34. package/dist/commands/monitor.js +136 -0
  35. package/dist/commands/monitor.js.map +1 -0
  36. package/dist/commands/session.d.ts +2 -0
  37. package/dist/commands/session.js +114 -0
  38. package/dist/commands/session.js.map +1 -0
  39. package/dist/commands/shell.d.ts +2 -0
  40. package/dist/commands/shell.js +90 -0
  41. package/dist/commands/shell.js.map +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +82 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/providers/claude.d.ts +52 -0
  46. package/dist/providers/claude.js +449 -0
  47. package/dist/providers/claude.js.map +1 -0
  48. package/dist/providers/codex.d.ts +45 -0
  49. package/dist/providers/codex.js +400 -0
  50. package/dist/providers/codex.js.map +1 -0
  51. package/dist/providers/index.d.ts +6 -0
  52. package/dist/providers/index.js +40 -0
  53. package/dist/providers/index.js.map +1 -0
  54. package/dist/providers/opencode.d.ts +40 -0
  55. package/dist/providers/opencode.js +498 -0
  56. package/dist/providers/opencode.js.map +1 -0
  57. package/dist/providers/types.d.ts +173 -0
  58. package/dist/providers/types.js +6 -0
  59. package/dist/providers/types.js.map +1 -0
  60. package/dist/session.d.ts +10 -0
  61. package/dist/session.js +65 -0
  62. package/dist/session.js.map +1 -0
  63. package/dist/utils/chunker.d.ts +1 -0
  64. package/dist/utils/chunker.js +24 -0
  65. package/dist/utils/chunker.js.map +1 -0
  66. package/dist/utils/errors.d.ts +12 -0
  67. package/dist/utils/errors.js +85 -0
  68. package/dist/utils/errors.js.map +1 -0
  69. package/dist/utils/files.d.ts +15 -0
  70. package/dist/utils/files.js +81 -0
  71. package/dist/utils/files.js.map +1 -0
  72. package/dist/utils/html.d.ts +4 -0
  73. package/dist/utils/html.js +10 -0
  74. package/dist/utils/html.js.map +1 -0
  75. package/dist/utils/media.d.ts +15 -0
  76. package/dist/utils/media.js +103 -0
  77. package/dist/utils/media.js.map +1 -0
  78. package/dist/utils/store.d.ts +15 -0
  79. package/dist/utils/store.js +44 -0
  80. package/dist/utils/store.js.map +1 -0
  81. package/dist/utils/stream.d.ts +21 -0
  82. package/dist/utils/stream.js +149 -0
  83. package/dist/utils/stream.js.map +1 -0
  84. package/dist/utils/stt.d.ts +7 -0
  85. package/dist/utils/stt.js +118 -0
  86. package/dist/utils/stt.js.map +1 -0
  87. package/dist/utils/system-prompt.d.ts +5 -0
  88. package/dist/utils/system-prompt.js +64 -0
  89. package/dist/utils/system-prompt.js.map +1 -0
  90. package/dist/utils/timeout.d.ts +2 -0
  91. package/dist/utils/timeout.js +18 -0
  92. package/dist/utils/timeout.js.map +1 -0
  93. package/docs/commands.md +351 -0
  94. package/docs/configuration.md +160 -0
  95. package/docs/features.md +443 -0
  96. package/docs/getting-started.md +102 -0
  97. package/docs/providers.md +236 -0
  98. package/docs/troubleshooting.md +287 -0
  99. package/package.json +54 -0
@@ -0,0 +1,400 @@
1
+ import { JsonStore } from "../utils/store.js";
2
+ // Dynamic import — only loads when PROVIDER=codex
3
+ let CodexClass;
4
+ let codexInstance;
5
+ // Per-session abort controllers (keyed by session ID)
6
+ const abortControllers = new Map();
7
+ // Map session IDs to thread objects (bounded to prevent memory leaks)
8
+ const threads = new Map();
9
+ const MAX_THREADS = 500;
10
+ // Persist thread IDs so sessions survive restarts
11
+ const threadStore = new JsonStore("codex-threads.json", []);
12
+ export class CodexProvider {
13
+ name = "codex";
14
+ capabilities = {
15
+ streaming: true,
16
+ todos: false,
17
+ diff: true,
18
+ fork: false,
19
+ revert: false,
20
+ share: false,
21
+ summarize: false,
22
+ history: false,
23
+ fileOps: true,
24
+ shell: true,
25
+ commands: false,
26
+ fileOutput: false,
27
+ mcp: false,
28
+ };
29
+ model;
30
+ cwd;
31
+ constructor() {
32
+ this.model = process.env.CODEX_MODEL ?? "o3";
33
+ this.cwd = process.env.CODEX_CWD ?? process.cwd();
34
+ }
35
+ async init() {
36
+ if (!process.env.CODEX_API_KEY && !process.env.OPENAI_API_KEY) {
37
+ throw new Error("CODEX_API_KEY or OPENAI_API_KEY is required for Codex provider.");
38
+ }
39
+ try {
40
+ const sdk = await import("@openai/codex");
41
+ CodexClass = sdk.Codex ?? sdk.default;
42
+ codexInstance = new CodexClass();
43
+ }
44
+ catch (err) {
45
+ throw new Error(`Failed to load @openai/codex: ${err.message}\n` +
46
+ `Install it: bun add @openai/codex`);
47
+ }
48
+ }
49
+ shutdown() {
50
+ for (const controller of abortControllers.values()) {
51
+ controller.abort();
52
+ }
53
+ abortControllers.clear();
54
+ threads.clear();
55
+ }
56
+ // --- Sessions ---
57
+ async createSession(title) {
58
+ const thread = await codexInstance.startThread({
59
+ workingDirectory: this.cwd,
60
+ });
61
+ const threadId = thread.id ?? thread.threadId ?? `codex-${Date.now()}`;
62
+ // Evict oldest entries if map exceeds limit
63
+ if (threads.size >= MAX_THREADS) {
64
+ const oldest = threads.keys().next().value;
65
+ if (oldest)
66
+ threads.delete(oldest);
67
+ }
68
+ threads.set(threadId, thread);
69
+ this.persistThreadIds();
70
+ return { id: threadId, title: title ?? "Codex Thread" };
71
+ }
72
+ async listSessions() {
73
+ // Codex stores sessions on filesystem (~/.codex/sessions)
74
+ // Try listing them via the SDK if available
75
+ try {
76
+ if (codexInstance.listThreads) {
77
+ const threadList = await codexInstance.listThreads();
78
+ return (threadList ?? []).map((t) => ({
79
+ id: t.id ?? t.threadId,
80
+ title: t.title ?? t.id ?? t.threadId,
81
+ lastModified: t.timestamp ? new Date(t.timestamp).getTime() : undefined,
82
+ }));
83
+ }
84
+ }
85
+ catch {
86
+ // Fall through
87
+ }
88
+ // Return in-memory threads + persisted IDs
89
+ const persistedIds = threadStore.load();
90
+ const allIds = new Set([...threads.keys(), ...persistedIds]);
91
+ return Array.from(allIds).map((id) => ({
92
+ id,
93
+ title: `Thread ${id}`,
94
+ }));
95
+ }
96
+ async getSession(id) {
97
+ if (threads.has(id)) {
98
+ return { id, title: `Thread ${id}` };
99
+ }
100
+ // Try to resume from SDK
101
+ try {
102
+ if (codexInstance.resumeThread) {
103
+ const thread = await codexInstance.resumeThread(id);
104
+ threads.set(id, thread);
105
+ return { id, title: `Thread ${id}` };
106
+ }
107
+ }
108
+ catch {
109
+ // Thread doesn't exist
110
+ }
111
+ return null;
112
+ }
113
+ async deleteSession(id) {
114
+ threads.delete(id);
115
+ threadStore.update((ids) => ids.filter((tid) => tid !== id));
116
+ return true;
117
+ }
118
+ // --- Messaging ---
119
+ async getOrResumeThread(sessionId) {
120
+ let thread = threads.get(sessionId);
121
+ if (!thread) {
122
+ if (codexInstance.resumeThread) {
123
+ thread = await codexInstance.resumeThread(sessionId);
124
+ threads.set(sessionId, thread);
125
+ }
126
+ else {
127
+ throw new Error(`Thread ${sessionId} not found. Create a new session first.`);
128
+ }
129
+ }
130
+ return thread;
131
+ }
132
+ async prompt(sessionId, text, options) {
133
+ const thread = await this.getOrResumeThread(sessionId);
134
+ const controller = new AbortController();
135
+ abortControllers.set(sessionId, controller);
136
+ try {
137
+ const result = await thread.run(text, {
138
+ signal: controller.signal,
139
+ model: options?.model?.modelID ?? this.model,
140
+ });
141
+ const responseText = result.finalResponse ??
142
+ result.response ??
143
+ (result.items ?? [])
144
+ .filter((i) => i.type === "message")
145
+ .map((i) => i.content ?? i.text ?? "")
146
+ .join("\n") ??
147
+ "(empty response)";
148
+ return { text: responseText, raw: result };
149
+ }
150
+ finally {
151
+ abortControllers.delete(sessionId);
152
+ }
153
+ }
154
+ async *promptStream(sessionId, text, options) {
155
+ const thread = await this.getOrResumeThread(sessionId);
156
+ const controller = new AbortController();
157
+ abortControllers.set(sessionId, controller);
158
+ try {
159
+ if (!thread.runStreamed) {
160
+ // Fallback: non-streaming
161
+ const result = await this.prompt(sessionId, text, options);
162
+ yield { type: "text", content: result.text };
163
+ yield { type: "done", content: "" };
164
+ return;
165
+ }
166
+ const { events } = await thread.runStreamed(text, {
167
+ signal: controller.signal,
168
+ model: options?.model?.modelID ?? this.model,
169
+ });
170
+ for await (const event of events) {
171
+ if (event.type === "item.completed") {
172
+ const item = event.item;
173
+ if (item?.type === "message") {
174
+ yield { type: "text", content: item.content ?? item.text ?? "" };
175
+ }
176
+ else if (item?.type === "function_call") {
177
+ yield { type: "tool_use", content: `[${item.name ?? "tool"}]` };
178
+ }
179
+ }
180
+ else if (event.type === "turn.completed") {
181
+ yield { type: "done", content: "" };
182
+ }
183
+ else if (event.type === "error") {
184
+ yield { type: "text", content: `Error: ${event.message ?? "unknown"}` };
185
+ yield { type: "done", content: "" };
186
+ }
187
+ }
188
+ }
189
+ finally {
190
+ abortControllers.delete(sessionId);
191
+ }
192
+ }
193
+ async abort(sessionId) {
194
+ const controller = abortControllers.get(sessionId);
195
+ if (controller) {
196
+ controller.abort();
197
+ abortControllers.delete(sessionId);
198
+ }
199
+ }
200
+ // --- Session features ---
201
+ async getTodos() {
202
+ return null;
203
+ }
204
+ async getDiff(sessionId) {
205
+ try {
206
+ const result = await this.prompt(sessionId, "Run `git diff` and return the raw diff output only, no commentary.");
207
+ if (!result.text || result.text === "(empty response)")
208
+ return null;
209
+ return [{ file: "(git diff)", additions: 0, deletions: 0, after: result.text }];
210
+ }
211
+ catch {
212
+ return null;
213
+ }
214
+ }
215
+ async forkSession() {
216
+ return null;
217
+ }
218
+ async revert() {
219
+ return false;
220
+ }
221
+ async unrevert() {
222
+ return false;
223
+ }
224
+ async share() {
225
+ return null;
226
+ }
227
+ async summarize() {
228
+ return false;
229
+ }
230
+ async getHistory() {
231
+ return null;
232
+ }
233
+ // --- File operations (via prompt delegation) ---
234
+ async readFile(path) {
235
+ const sessionId = `codex-fileop-${Date.now()}`;
236
+ try {
237
+ const thread = await codexInstance.startThread({ workingDirectory: this.cwd });
238
+ const threadId = thread.id ?? thread.threadId ?? sessionId;
239
+ threads.set(threadId, thread);
240
+ const result = await this.prompt(threadId, `Read the file at "${path}" and return its contents verbatim. Output ONLY the file content, nothing else.`);
241
+ threads.delete(threadId);
242
+ return result.text === "(empty response)" ? null : result.text;
243
+ }
244
+ catch {
245
+ return null;
246
+ }
247
+ }
248
+ async findFiles(query) {
249
+ const sessionId = `codex-fileop-${Date.now()}`;
250
+ try {
251
+ const thread = await codexInstance.startThread({ workingDirectory: this.cwd });
252
+ const threadId = thread.id ?? thread.threadId ?? sessionId;
253
+ threads.set(threadId, thread);
254
+ const result = await this.prompt(threadId, `Find files matching "${query}". List each matching file path on its own line. Output ONLY the file paths, nothing else.`);
255
+ threads.delete(threadId);
256
+ if (result.text === "(empty response)")
257
+ return null;
258
+ return result.text.split("\n").map((l) => l.trim()).filter(Boolean);
259
+ }
260
+ catch {
261
+ return null;
262
+ }
263
+ }
264
+ async searchText(pattern) {
265
+ const sessionId = `codex-fileop-${Date.now()}`;
266
+ try {
267
+ const thread = await codexInstance.startThread({ workingDirectory: this.cwd });
268
+ const threadId = thread.id ?? thread.threadId ?? sessionId;
269
+ threads.set(threadId, thread);
270
+ const result = await this.prompt(threadId, `Search the codebase for "${pattern}". For each match output file:line:text. Output ONLY the matches, nothing else.`);
271
+ threads.delete(threadId);
272
+ if (result.text === "(empty response)")
273
+ return null;
274
+ return result.text
275
+ .split("\n")
276
+ .map((l) => l.trim())
277
+ .filter(Boolean)
278
+ .map((line) => {
279
+ const [file, lineStr, ...rest] = line.split(":");
280
+ return { file: file ?? line, line: Number(lineStr) || undefined, text: rest.join(":") || undefined };
281
+ });
282
+ }
283
+ catch {
284
+ return null;
285
+ }
286
+ }
287
+ async findSymbols() {
288
+ return null;
289
+ }
290
+ async getFileStatus() {
291
+ const sessionId = `codex-fileop-${Date.now()}`;
292
+ try {
293
+ const thread = await codexInstance.startThread({ workingDirectory: this.cwd });
294
+ const threadId = thread.id ?? thread.threadId ?? sessionId;
295
+ threads.set(threadId, thread);
296
+ const result = await this.prompt(threadId, `Run "git status --porcelain" and return the output. Output ONLY the raw git status output, nothing else.`);
297
+ threads.delete(threadId);
298
+ if (result.text === "(empty response)")
299
+ return null;
300
+ return result.text
301
+ .split("\n")
302
+ .map((l) => l.trim())
303
+ .filter(Boolean)
304
+ .map((line) => {
305
+ const status = line.slice(0, 2).trim();
306
+ const path = line.slice(3).trim();
307
+ return { path, status };
308
+ });
309
+ }
310
+ catch {
311
+ return null;
312
+ }
313
+ }
314
+ // --- Shell ---
315
+ async shell(sessionId, command) {
316
+ // Route through prompt — Codex will execute via its tools
317
+ const result = await this.prompt(sessionId, `Run this shell command and show the output: ${command}`);
318
+ return result.text;
319
+ }
320
+ async runCommand() {
321
+ return null;
322
+ }
323
+ // --- Info ---
324
+ async getProjectInfo() {
325
+ return {
326
+ directory: this.cwd,
327
+ };
328
+ }
329
+ async getTools() {
330
+ return ["shell", "file_read", "file_write", "file_edit"];
331
+ }
332
+ async getCommands() {
333
+ return null;
334
+ }
335
+ async getHealth() {
336
+ return {
337
+ status: "Healthy",
338
+ provider: "codex",
339
+ model: this.model,
340
+ extra: {
341
+ cwd: this.cwd,
342
+ },
343
+ };
344
+ }
345
+ async getConfig() {
346
+ return {
347
+ provider: "codex",
348
+ model: this.model,
349
+ cwd: this.cwd,
350
+ };
351
+ }
352
+ async getProviders() {
353
+ return { openai: { models: [this.model] } };
354
+ }
355
+ async getAgents() {
356
+ return null;
357
+ }
358
+ // --- Models ---
359
+ async listModels() {
360
+ const apiKey = process.env.CODEX_API_KEY ?? process.env.OPENAI_API_KEY;
361
+ if (!apiKey) {
362
+ throw new Error("CODEX_API_KEY or OPENAI_API_KEY is required to list models.");
363
+ }
364
+ const res = await fetch("https://api.openai.com/v1/models", {
365
+ headers: { Authorization: `Bearer ${apiKey}` },
366
+ });
367
+ if (!res.ok) {
368
+ throw new Error(`Failed to fetch models from OpenAI API (HTTP ${res.status}). Check your API key.`);
369
+ }
370
+ const body = await res.json();
371
+ const models = (body.data ?? [])
372
+ .map((m) => ({
373
+ id: m.id,
374
+ name: m.id,
375
+ provider: "openai",
376
+ reasoning: /^(o[0-9]|gpt-5)/i.test(m.id),
377
+ attachment: false,
378
+ active: this.model === m.id,
379
+ }))
380
+ .sort((a, b) => a.id.localeCompare(b.id));
381
+ if (models.length === 0) {
382
+ throw new Error("No models returned from OpenAI API. Check your API key permissions.");
383
+ }
384
+ return models;
385
+ }
386
+ // --- MCP (not supported) ---
387
+ async getMcpStatus() {
388
+ return null;
389
+ }
390
+ async addMcpServer() {
391
+ return false;
392
+ }
393
+ async removeMcpServer() {
394
+ return false;
395
+ }
396
+ persistThreadIds() {
397
+ threadStore.save(Array.from(threads.keys()));
398
+ }
399
+ }
400
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/providers/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Provider, ProviderName } from "./types.js";
2
+ export declare function getProviderName(): ProviderName;
3
+ export declare function initProvider(): Promise<Provider>;
4
+ export declare function getProvider(): Provider;
5
+ export declare function shutdownProvider(): void;
6
+ export type { Provider, ProviderName } from "./types.js";
@@ -0,0 +1,40 @@
1
+ let activeProvider = null;
2
+ export function getProviderName() {
3
+ const name = (process.env.PROVIDER ?? "opencode").toLowerCase();
4
+ if (name === "opencode" || name === "claude" || name === "codex") {
5
+ return name;
6
+ }
7
+ throw new Error(`Unknown provider: "${name}". Supported: opencode, claude, codex`);
8
+ }
9
+ export async function initProvider() {
10
+ const name = getProviderName();
11
+ switch (name) {
12
+ case "opencode": {
13
+ const { OpenCodeProvider } = await import("./opencode.js");
14
+ activeProvider = new OpenCodeProvider();
15
+ break;
16
+ }
17
+ case "claude": {
18
+ const { ClaudeProvider } = await import("./claude.js");
19
+ activeProvider = new ClaudeProvider();
20
+ break;
21
+ }
22
+ case "codex": {
23
+ const { CodexProvider } = await import("./codex.js");
24
+ activeProvider = new CodexProvider();
25
+ break;
26
+ }
27
+ }
28
+ await activeProvider.init();
29
+ return activeProvider;
30
+ }
31
+ export function getProvider() {
32
+ if (!activeProvider) {
33
+ throw new Error("Provider not initialized. Call initProvider() first.");
34
+ }
35
+ return activeProvider;
36
+ }
37
+ export function shutdownProvider() {
38
+ activeProvider?.shutdown();
39
+ }
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAEA,IAAI,cAAc,GAAoB,IAAI,CAAC;AAE3C,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,uCAAuC,CAClE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAE/B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAC3D,cAAc,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACvD,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YACrD,cAAc,GAAG,IAAI,aAAa,EAAE,CAAC;YACrC,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,cAAc,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { Provider, ProviderCapabilities, Session, SessionInfo, PromptOptions, PromptResult, StreamChunk, Todo, FileDiff, SearchResult, FileStatus, ProjectInfo, CommandInfo, HealthInfo, ModelDetail, McpServerConfig, McpServerStatus } from "./types.js";
2
+ export declare class OpenCodeProvider implements Provider {
3
+ readonly name: "opencode";
4
+ readonly capabilities: ProviderCapabilities;
5
+ init(): Promise<void>;
6
+ shutdown(): void;
7
+ createSession(title?: string): Promise<Session>;
8
+ listSessions(): Promise<SessionInfo[]>;
9
+ getSession(id: string): Promise<Session | null>;
10
+ deleteSession(id: string): Promise<boolean>;
11
+ prompt(sessionId: string, text: string, options?: PromptOptions): Promise<PromptResult>;
12
+ abort(sessionId: string): Promise<void>;
13
+ promptStream(sessionId: string, text: string, options?: PromptOptions): AsyncGenerator<StreamChunk>;
14
+ getTodos(sessionId: string): Promise<Todo[] | null>;
15
+ getDiff(sessionId: string): Promise<FileDiff[] | null>;
16
+ forkSession(sessionId: string, messageId?: string): Promise<Session | null>;
17
+ revert(sessionId: string): Promise<boolean>;
18
+ unrevert(sessionId: string): Promise<boolean>;
19
+ share(sessionId: string): Promise<string | null>;
20
+ summarize(sessionId: string): Promise<boolean>;
21
+ getHistory(sessionId: string): Promise<unknown[] | null>;
22
+ readFile(path: string): Promise<string | null>;
23
+ findFiles(query: string): Promise<string[] | null>;
24
+ searchText(pattern: string): Promise<SearchResult[] | null>;
25
+ findSymbols(query: string): Promise<unknown[] | null>;
26
+ getFileStatus(): Promise<FileStatus[] | null>;
27
+ shell(sessionId: string, command: string): Promise<string | null>;
28
+ runCommand(sessionId: string, command: string, args?: string): Promise<PromptResult | null>;
29
+ getProjectInfo(): Promise<ProjectInfo | null>;
30
+ getTools(): Promise<string[] | null>;
31
+ getCommands(): Promise<CommandInfo[] | null>;
32
+ getHealth(): Promise<HealthInfo>;
33
+ getConfig(): Promise<unknown>;
34
+ getProviders(): Promise<unknown>;
35
+ getAgents(): Promise<unknown[] | null>;
36
+ listModels(): Promise<ModelDetail[]>;
37
+ getMcpStatus(): Promise<McpServerStatus[] | null>;
38
+ addMcpServer(name: string, config: McpServerConfig): Promise<boolean>;
39
+ removeMcpServer(name: string): Promise<boolean>;
40
+ }