dot-studio 0.0.1 → 0.0.2

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 (148) hide show
  1. package/README.md +20 -200
  2. package/client/assets/ActFrame-BYOBkLYW.js +1 -0
  3. package/client/assets/ActFrame-C_WEt6bv.css +1 -0
  4. package/client/assets/ActInspectorPanel-C3VlS7tB.js +1 -0
  5. package/client/assets/ActInspectorPanel-CE6s6GYv.css +1 -0
  6. package/client/assets/AssistantChat-BOyW0K79.js +1 -0
  7. package/client/assets/AssistantChat-DoVmHvMJ.css +1 -0
  8. package/client/assets/CanvasTerminalFrame-BC-79q9U.css +1 -0
  9. package/client/assets/CanvasTerminalFrame-DxKbexK6.js +4 -0
  10. package/client/assets/CanvasTrackingFrame-DumxhNwg.js +1 -0
  11. package/client/assets/CanvasTrackingFrame-G4rRrfne.css +1 -0
  12. package/client/assets/CanvasWindowFrame-ziJeVfHG.js +1 -0
  13. package/client/assets/DanceBundleEditorFrame-CH8VDUMK.js +1 -0
  14. package/client/assets/DanceBundleEditorFrame-DaLqMflT.css +1 -0
  15. package/client/assets/MarkdownEditorFrame-DVecIZpZ.css +1 -0
  16. package/client/assets/MarkdownEditorFrame-Dwpgs2GX.js +2 -0
  17. package/client/assets/MarkdownRenderer-Cz8A4AgP.js +1 -0
  18. package/client/assets/PublishModal-DUlHz0fT.js +1 -0
  19. package/client/assets/TodoDock-DcVf7zQG.js +1 -0
  20. package/client/assets/WorkspaceToolbar-CXYi_sMD.js +2 -0
  21. package/client/assets/WorkspaceToolbar-CiQvVocC.css +1 -0
  22. package/client/assets/chat-message-visibility-YwJ-AQno.js +11 -0
  23. package/client/assets/dnd-vendor-CIAZE2P2.js +5 -0
  24. package/client/assets/flow-vendor-BZV40eAE.css +1 -0
  25. package/client/assets/flow-vendor-C868rU-6.js +23 -0
  26. package/client/assets/icon-vendor-I2JVIi1s.js +501 -0
  27. package/client/assets/index-BMY4hrBP.js +3 -0
  28. package/client/assets/index-C-vnj9y3.js +1 -0
  29. package/client/assets/index-C9HTqfZw.css +1 -0
  30. package/client/assets/index-CWrv6O3o.js +64 -0
  31. package/client/assets/index-DMS12-Q2.js +8 -0
  32. package/client/assets/index-Dn7t_Y7G.js +1 -0
  33. package/client/assets/index-p-wk7iGH.css +1 -0
  34. package/client/assets/markdown-vendor-BSTcku12.css +10 -0
  35. package/client/assets/markdown-vendor-DnTJ9hmR.js +35 -0
  36. package/client/assets/participant-labels-Cf3qP3GB.js +1 -0
  37. package/client/assets/queries-Dm1jEHfc.js +1 -0
  38. package/client/assets/query-vendor-_taqgrbn.js +1 -0
  39. package/client/assets/react-vendor-DzpMUNDT.js +49 -0
  40. package/client/assets/settings-utils-l7KCS3Ev.js +1 -0
  41. package/client/assets/terminal-vendor-6GBZ9nXN.css +32 -0
  42. package/client/assets/terminal-vendor-D0xRnmbI.js +112 -0
  43. package/client/index.html +13 -3
  44. package/dist/cli.js +25 -3
  45. package/dist/server/app.js +72 -0
  46. package/dist/server/index.js +2 -62
  47. package/dist/server/lib/act-session-policy.js +31 -0
  48. package/dist/server/lib/chat-session.js +101 -0
  49. package/dist/server/lib/config.js +18 -4
  50. package/dist/server/lib/dot-authoring.js +171 -102
  51. package/dist/server/lib/dot-loader.js +9 -8
  52. package/dist/server/lib/dot-login.js +8 -190
  53. package/dist/server/lib/dot-source.js +11 -0
  54. package/dist/server/lib/model-catalog.js +74 -15
  55. package/dist/server/lib/opencode-auth.js +4 -1
  56. package/dist/server/lib/opencode-errors.js +70 -38
  57. package/dist/server/lib/opencode-sidecar.js +5 -2
  58. package/dist/server/lib/project-config.js +8 -0
  59. package/dist/server/lib/runtime-tools.js +46 -8
  60. package/dist/server/lib/safe-mode.js +410 -0
  61. package/dist/server/lib/session-execution.js +81 -0
  62. package/dist/server/lib/sse.js +22 -0
  63. package/dist/server/routes/act-runtime-threads.js +156 -0
  64. package/dist/server/routes/act-runtime-tools.js +157 -0
  65. package/dist/server/routes/act-runtime.js +7 -0
  66. package/dist/server/routes/adapter.js +32 -0
  67. package/dist/server/routes/assets-collection.js +16 -0
  68. package/dist/server/routes/assets-detail.js +38 -0
  69. package/dist/server/routes/assets.js +4 -158
  70. package/dist/server/routes/chat-messages.js +104 -0
  71. package/dist/server/routes/chat-sessions.js +104 -0
  72. package/dist/server/routes/chat-stream.js +15 -0
  73. package/dist/server/routes/chat.js +6 -353
  74. package/dist/server/routes/compile.js +5 -91
  75. package/dist/server/routes/dot-assets.js +77 -0
  76. package/dist/server/routes/dot-core.js +62 -0
  77. package/dist/server/routes/dot-performer.js +80 -0
  78. package/dist/server/routes/dot.js +6 -267
  79. package/dist/server/routes/drafts-collection.js +40 -0
  80. package/dist/server/routes/drafts-dance-bundle.js +113 -0
  81. package/dist/server/routes/drafts-item.js +86 -0
  82. package/dist/server/routes/drafts.js +9 -0
  83. package/dist/server/routes/health.js +18 -33
  84. package/dist/server/routes/opencode-core.js +120 -0
  85. package/dist/server/routes/opencode-file.js +67 -0
  86. package/dist/server/routes/opencode-mcp.js +74 -0
  87. package/dist/server/routes/opencode-provider.js +41 -0
  88. package/dist/server/routes/opencode.js +8 -418
  89. package/dist/server/routes/route-errors.js +10 -0
  90. package/dist/server/routes/safe-actions.js +60 -0
  91. package/dist/server/routes/safe-summary.js +20 -0
  92. package/dist/server/routes/safe.js +7 -0
  93. package/dist/server/routes/workspaces.js +47 -0
  94. package/dist/server/services/act-runtime/act-context-builder.js +81 -0
  95. package/dist/server/services/act-runtime/act-runtime-service.js +313 -0
  96. package/dist/server/services/act-runtime/act-runtime-utils.js +10 -0
  97. package/dist/server/services/act-runtime/act-tool-projection.js +26 -0
  98. package/dist/server/services/act-runtime/act-tools.js +151 -0
  99. package/dist/server/services/act-runtime/board-persistence.js +38 -0
  100. package/dist/server/services/act-runtime/event-logger.js +73 -0
  101. package/dist/server/services/act-runtime/event-router.js +102 -0
  102. package/dist/server/services/act-runtime/mailbox.js +149 -0
  103. package/dist/server/services/act-runtime/safety-guard.js +162 -0
  104. package/dist/server/services/act-runtime/session-queue.js +114 -0
  105. package/dist/server/services/act-runtime/thread-manager.js +351 -0
  106. package/dist/server/services/act-runtime/wake-cascade.js +306 -0
  107. package/dist/server/services/act-runtime/wake-evaluator.js +43 -0
  108. package/dist/server/services/act-runtime/wake-performer-resolver.js +68 -0
  109. package/dist/server/services/act-runtime/wake-prompt-builder.js +77 -0
  110. package/dist/server/services/adapter-view-service.js +6 -0
  111. package/dist/server/services/asset-service.js +366 -0
  112. package/dist/server/services/chat-event-stream-service.js +157 -0
  113. package/dist/server/services/chat-service.js +207 -0
  114. package/dist/server/services/chat-session-service.js +203 -0
  115. package/dist/server/services/compile-service.js +4 -0
  116. package/dist/server/services/dance-bundle-service.js +222 -0
  117. package/dist/server/services/dot-add-service.js +59 -0
  118. package/dist/server/services/dot-service.js +178 -0
  119. package/dist/server/services/draft-service.js +367 -0
  120. package/dist/server/services/opencode-projection/dance-compiler.js +164 -0
  121. package/dist/server/services/opencode-projection/performer-compiler.js +195 -0
  122. package/dist/server/services/opencode-projection/preview-service.js +31 -0
  123. package/dist/server/services/opencode-projection/projection-manifest.js +98 -0
  124. package/dist/server/services/opencode-projection/stage-projection-service.js +188 -0
  125. package/dist/server/services/opencode-service.js +338 -0
  126. package/dist/server/services/safe-service.js +33 -0
  127. package/dist/server/services/studio-assistant/assistant-service.js +172 -0
  128. package/dist/server/services/studio-service.js +69 -0
  129. package/dist/server/services/workspace-service.js +224 -0
  130. package/dist/server/terminal.js +57 -11
  131. package/dist/shared/act-types.js +4 -0
  132. package/dist/shared/adapter-view.js +1 -0
  133. package/dist/shared/asset-contracts.js +1 -0
  134. package/dist/shared/assistant-actions.js +1 -0
  135. package/dist/shared/chat-contracts.js +1 -0
  136. package/dist/shared/dot-contracts.js +1 -0
  137. package/dist/shared/dot-types.js +4 -0
  138. package/dist/shared/draft-contracts.js +2 -0
  139. package/dist/shared/model-types.js +2 -0
  140. package/dist/shared/performer-mcp-portability.js +10 -0
  141. package/dist/shared/safe-mode.js +1 -0
  142. package/dist/shared/session-metadata.js +4 -3
  143. package/package.json +6 -4
  144. package/client/assets/index-C2eIILoa.css +0 -41
  145. package/client/assets/index-DUPZ_Lw5.js +0 -616
  146. package/dist/server/lib/act-runtime.js +0 -1282
  147. package/dist/server/lib/prompt.js +0 -222
  148. package/dist/server/routes/stages.js +0 -137
@@ -1,56 +1,41 @@
1
1
  // Health, Studio Config & Activation Routes
2
2
  import { Hono } from 'hono';
3
- import { exec } from 'child_process';
4
- import { promisify } from 'util';
5
- import fs from 'fs/promises';
6
- import path from 'path';
7
- import { getActiveProjectDir, setActiveProjectDir, readStudioConfig, writeStudioConfig, } from '../lib/config.js';
8
- import { invalidateAll } from '../lib/cache.js';
9
- import { resolveRequestWorkingDir } from '../lib/request-context.js';
10
- const execAsync = promisify(exec);
3
+ import { activateStudioProject, getStudioConfig, openStudioPath, pickWorkingDirectory, updateStudioConfig, } from '../services/studio-service.js';
4
+ import { jsonError, jsonServiceFailure, requestWorkingDir } from './route-errors.js';
11
5
  const health = new Hono();
12
6
  // ── Health ───────────────────────────────────────────────
13
- health.get('/api/health', (c) => c.json({ ok: true, project: resolveRequestWorkingDir(c) }));
7
+ health.get('/api/health', (c) => c.json({ ok: true, project: requestWorkingDir(c) }));
14
8
  // ── Pick Directory (macOS) ──────────────────────────────
15
9
  health.get('/api/studio/pick-directory', async (c) => {
16
10
  try {
17
- const { stdout } = await execAsync(`osascript -e 'POSIX path of (choose folder with prompt "Select Working Directory for Stage")'`);
18
- return c.json({ path: stdout.trim() });
11
+ return c.json(await pickWorkingDirectory());
19
12
  }
20
13
  catch {
21
- return c.json({ error: 'Selection cancelled or failed' }, 400);
14
+ return jsonError(c, 'Selection cancelled or failed', 400);
22
15
  }
23
16
  });
24
17
  // ── Studio Config ───────────────────────────────────────
25
18
  health.get('/api/studio/config', async (c) => {
26
- const config = await readStudioConfig();
27
- return c.json({ ...config, projectDir: resolveRequestWorkingDir(c) });
19
+ return c.json(await getStudioConfig(requestWorkingDir(c)));
28
20
  });
29
21
  health.put('/api/studio/config', async (c) => {
30
22
  const body = await c.req.json();
31
- const merged = await writeStudioConfig(body);
32
- return c.json(merged);
23
+ return c.json(await updateStudioConfig(body));
33
24
  });
34
25
  health.post('/api/studio/activate', async (c) => {
35
26
  const { workingDir } = await c.req.json();
36
- if (!workingDir) {
37
- return c.json({ error: 'workingDir is required' }, 400);
27
+ const result = await activateStudioProject(workingDir);
28
+ if (!result.ok) {
29
+ return jsonServiceFailure(c, result);
38
30
  }
39
- // Normalize: resolve, trim trailing slashes
40
- const resolved = path.resolve(workingDir.replace(/\/+$/, ''));
41
- // Verify directory exists
42
- try {
43
- const stat = await fs.stat(resolved);
44
- if (!stat.isDirectory()) {
45
- return c.json({ error: 'workingDir is not a directory' }, 400);
46
- }
47
- }
48
- catch {
49
- return c.json({ error: `Directory not found: ${resolved}` }, 400);
31
+ return c.json(result);
32
+ });
33
+ health.post('/api/studio/open-path', async (c) => {
34
+ const { path } = await c.req.json();
35
+ const result = await openStudioPath(path);
36
+ if (!result.ok) {
37
+ return jsonServiceFailure(c, result);
50
38
  }
51
- setActiveProjectDir(resolved);
52
- invalidateAll(); // flush all caches — assets, models, MCP are project-scoped
53
- console.log(`🎯 Active project dir switched to: ${getActiveProjectDir()}`);
54
- return c.json({ ok: true, activeProjectDir: getActiveProjectDir() });
39
+ return c.json(result);
55
40
  });
56
41
  export default health;
@@ -0,0 +1,120 @@
1
+ import { Hono } from 'hono';
2
+ import { resolveRuntimeTools } from '../lib/runtime-tools.js';
3
+ import { jsonOpencodeError } from '../lib/opencode-errors.js';
4
+ import { listRuntimeModels, listProviderSummaries } from '../lib/model-catalog.js';
5
+ import { getLspStatus, getOpenCodeConfig, getOpenCodeHealth, getOpenCodeUnavailableHealth, getProviderAuthStatus, getVcsStatus, listOpenCodeAgents, listOpenCodeToolIds, listOpenCodeToolsForModel, readProjectConfigSnapshot, restartManagedOpenCode, updateOpenCodeConfig, } from '../services/opencode-service.js';
6
+ import { requestWorkingDir } from './route-errors.js';
7
+ const opencodeCore = new Hono();
8
+ function toError(error) {
9
+ return error instanceof Error ? error : new Error('OpenCode is unavailable');
10
+ }
11
+ opencodeCore.get('/api/opencode/health', async (c) => {
12
+ try {
13
+ return c.json(await getOpenCodeHealth(requestWorkingDir(c)));
14
+ }
15
+ catch (error) {
16
+ return c.json(getOpenCodeUnavailableHealth(toError(error)), 503);
17
+ }
18
+ });
19
+ opencodeCore.post('/api/opencode/restart', async (c) => {
20
+ try {
21
+ return c.json(await restartManagedOpenCode());
22
+ }
23
+ catch (err) {
24
+ return jsonOpencodeError(c, err, { defaultStatus: 400 });
25
+ }
26
+ });
27
+ opencodeCore.get('/api/models', async (c) => {
28
+ try {
29
+ return c.json(await listRuntimeModels(requestWorkingDir(c)));
30
+ }
31
+ catch {
32
+ return c.json([]);
33
+ }
34
+ });
35
+ opencodeCore.get('/api/providers', async (c) => {
36
+ try {
37
+ return c.json(await listProviderSummaries(requestWorkingDir(c)));
38
+ }
39
+ catch (err) {
40
+ return jsonOpencodeError(c, err, { defaultStatus: 503 });
41
+ }
42
+ });
43
+ opencodeCore.get('/api/agents', async (c) => {
44
+ try {
45
+ return c.json(await listOpenCodeAgents(requestWorkingDir(c)));
46
+ }
47
+ catch {
48
+ return c.json([]);
49
+ }
50
+ });
51
+ opencodeCore.get('/api/tools', async (c) => {
52
+ try {
53
+ return c.json(await listOpenCodeToolIds(requestWorkingDir(c)));
54
+ }
55
+ catch {
56
+ return c.json([]);
57
+ }
58
+ });
59
+ opencodeCore.get('/api/tools/:provider/:model', async (c) => {
60
+ try {
61
+ return c.json(await listOpenCodeToolsForModel(requestWorkingDir(c), c.req.param('provider'), c.req.param('model')));
62
+ }
63
+ catch (err) {
64
+ return jsonOpencodeError(c, err);
65
+ }
66
+ });
67
+ opencodeCore.post('/api/runtime/tools', async (c) => {
68
+ const { model = null, mcpServerNames = [] } = await c.req.json();
69
+ try {
70
+ return c.json(await resolveRuntimeTools(requestWorkingDir(c), model, mcpServerNames));
71
+ }
72
+ catch (err) {
73
+ return jsonOpencodeError(c, err);
74
+ }
75
+ });
76
+ opencodeCore.get('/api/config', async (c) => {
77
+ try {
78
+ return c.json(await getOpenCodeConfig(requestWorkingDir(c)));
79
+ }
80
+ catch (err) {
81
+ return jsonOpencodeError(c, err);
82
+ }
83
+ });
84
+ opencodeCore.get('/api/config/project', async (c) => {
85
+ return c.json(await readProjectConfigSnapshot(requestWorkingDir(c)));
86
+ });
87
+ opencodeCore.put('/api/config', async (c) => {
88
+ const body = await c.req.json();
89
+ try {
90
+ return c.json(await updateOpenCodeConfig(requestWorkingDir(c), body));
91
+ }
92
+ catch (err) {
93
+ return jsonOpencodeError(c, err);
94
+ }
95
+ });
96
+ opencodeCore.get('/api/provider/auth', async (c) => {
97
+ try {
98
+ return c.json(await getProviderAuthStatus(requestWorkingDir(c)));
99
+ }
100
+ catch (err) {
101
+ return jsonOpencodeError(c, err, { defaultStatus: 503 });
102
+ }
103
+ });
104
+ opencodeCore.get('/api/lsp/status', async (c) => {
105
+ try {
106
+ return c.json(await getLspStatus(requestWorkingDir(c)));
107
+ }
108
+ catch (err) {
109
+ return jsonOpencodeError(c, err);
110
+ }
111
+ });
112
+ opencodeCore.get('/api/vcs', async (c) => {
113
+ try {
114
+ return c.json(await getVcsStatus(requestWorkingDir(c)));
115
+ }
116
+ catch (err) {
117
+ return jsonOpencodeError(c, err);
118
+ }
119
+ });
120
+ export default opencodeCore;
@@ -0,0 +1,67 @@
1
+ import { Hono } from 'hono';
2
+ import { jsonOpencodeError } from '../lib/opencode-errors.js';
3
+ import { findFilesInProject, findSymbolsInProject, findTextInProject, getFileStatus, listFiles, readFile, } from '../services/opencode-service.js';
4
+ import { jsonError, requestWorkingDir } from './route-errors.js';
5
+ const opencodeFile = new Hono();
6
+ opencodeFile.get('/api/file/list', async (c) => {
7
+ const dirPath = c.req.query('path') || '.';
8
+ try {
9
+ return c.json(await listFiles(requestWorkingDir(c), dirPath));
10
+ }
11
+ catch {
12
+ return c.json([]);
13
+ }
14
+ });
15
+ opencodeFile.get('/api/file/read', async (c) => {
16
+ const filePath = c.req.query('path');
17
+ if (!filePath)
18
+ return jsonError(c, 'path required', 400);
19
+ try {
20
+ return c.json(await readFile(requestWorkingDir(c), filePath));
21
+ }
22
+ catch (err) {
23
+ return jsonOpencodeError(c, err);
24
+ }
25
+ });
26
+ opencodeFile.get('/api/file/status', async (c) => {
27
+ try {
28
+ return c.json(await getFileStatus(requestWorkingDir(c)));
29
+ }
30
+ catch {
31
+ return c.json([]);
32
+ }
33
+ });
34
+ opencodeFile.get('/api/find/text', async (c) => {
35
+ const pattern = c.req.query('pattern');
36
+ if (!pattern)
37
+ return jsonError(c, 'pattern required', 400);
38
+ try {
39
+ return c.json(await findTextInProject(requestWorkingDir(c), pattern));
40
+ }
41
+ catch (err) {
42
+ return jsonOpencodeError(c, err);
43
+ }
44
+ });
45
+ opencodeFile.get('/api/find/files', async (c) => {
46
+ const pattern = c.req.query('pattern');
47
+ if (!pattern)
48
+ return jsonError(c, 'pattern required', 400);
49
+ try {
50
+ return c.json(await findFilesInProject(requestWorkingDir(c), pattern));
51
+ }
52
+ catch (err) {
53
+ return jsonOpencodeError(c, err);
54
+ }
55
+ });
56
+ opencodeFile.get('/api/find/symbols', async (c) => {
57
+ const pattern = c.req.query('pattern');
58
+ if (!pattern)
59
+ return jsonError(c, 'pattern required', 400);
60
+ try {
61
+ return c.json(await findSymbolsInProject(requestWorkingDir(c), pattern));
62
+ }
63
+ catch (err) {
64
+ return jsonOpencodeError(c, err);
65
+ }
66
+ });
67
+ export default opencodeFile;
@@ -0,0 +1,74 @@
1
+ import { Hono } from 'hono';
2
+ import { cached, TTL } from '../lib/cache.js';
3
+ import { jsonOpencodeError } from '../lib/opencode-errors.js';
4
+ import { addMcpServer, authenticateMcp, completeMcpAuth, connectMcpServer, disconnectMcpServer, listMcpServers, removeMcpAuth, startMcpAuth, } from '../services/opencode-service.js';
5
+ import { requestWorkingDir } from './route-errors.js';
6
+ const opencodeMcp = new Hono();
7
+ opencodeMcp.get('/api/mcp/servers', async (c) => {
8
+ try {
9
+ const cwd = requestWorkingDir(c);
10
+ return c.json(await cached(`mcp-servers-${cwd}`, TTL.MCP_SERVERS, async () => listMcpServers(cwd)));
11
+ }
12
+ catch {
13
+ return c.json([]);
14
+ }
15
+ });
16
+ opencodeMcp.post('/api/mcp/add', async (c) => {
17
+ const { name, config } = await c.req.json();
18
+ try {
19
+ return c.json(await addMcpServer(requestWorkingDir(c), { name, config }));
20
+ }
21
+ catch (err) {
22
+ return jsonOpencodeError(c, err);
23
+ }
24
+ });
25
+ opencodeMcp.post('/api/mcp/:name/connect', async (c) => {
26
+ try {
27
+ return c.json(await connectMcpServer(requestWorkingDir(c), c.req.param('name')));
28
+ }
29
+ catch (err) {
30
+ return jsonOpencodeError(c, err);
31
+ }
32
+ });
33
+ opencodeMcp.post('/api/mcp/:name/auth/start', async (c) => {
34
+ try {
35
+ return c.json(await startMcpAuth(requestWorkingDir(c), c.req.param('name')));
36
+ }
37
+ catch (err) {
38
+ return jsonOpencodeError(c, err, { defaultStatus: 500 });
39
+ }
40
+ });
41
+ opencodeMcp.post('/api/mcp/:name/auth/callback', async (c) => {
42
+ const { code } = await c.req.json().catch(() => ({ code: '' }));
43
+ try {
44
+ return c.json(await completeMcpAuth(requestWorkingDir(c), c.req.param('name'), code));
45
+ }
46
+ catch (err) {
47
+ return jsonOpencodeError(c, err, { defaultStatus: 500 });
48
+ }
49
+ });
50
+ opencodeMcp.post('/api/mcp/:name/auth/authenticate', async (c) => {
51
+ try {
52
+ return c.json(await authenticateMcp(requestWorkingDir(c), c.req.param('name')));
53
+ }
54
+ catch (err) {
55
+ return jsonOpencodeError(c, err, { defaultStatus: 500 });
56
+ }
57
+ });
58
+ opencodeMcp.delete('/api/mcp/:name/auth', async (c) => {
59
+ try {
60
+ return c.json(await removeMcpAuth(requestWorkingDir(c), c.req.param('name')));
61
+ }
62
+ catch (err) {
63
+ return jsonOpencodeError(c, err, { defaultStatus: 500 });
64
+ }
65
+ });
66
+ opencodeMcp.post('/api/mcp/:name/disconnect', async (c) => {
67
+ try {
68
+ return c.json(await disconnectMcpServer(requestWorkingDir(c), c.req.param('name')));
69
+ }
70
+ catch (err) {
71
+ return jsonOpencodeError(c, err);
72
+ }
73
+ });
74
+ export default opencodeMcp;
@@ -0,0 +1,41 @@
1
+ import { Hono } from 'hono';
2
+ import { jsonOpencodeError } from '../lib/opencode-errors.js';
3
+ import { authorizeProviderOauth, completeProviderOauth, deleteProviderAuth, updateProviderAuth, } from '../services/opencode-service.js';
4
+ import { requestWorkingDir } from './route-errors.js';
5
+ const opencodeProvider = new Hono();
6
+ opencodeProvider.post('/api/provider/:id/oauth/authorize', async (c) => {
7
+ const { method } = await c.req.json();
8
+ try {
9
+ return c.json(await authorizeProviderOauth(requestWorkingDir(c), c.req.param('id'), method));
10
+ }
11
+ catch (err) {
12
+ return jsonOpencodeError(c, err, { providerId: c.req.param('id'), defaultStatus: 500 });
13
+ }
14
+ });
15
+ opencodeProvider.post('/api/provider/:id/oauth/callback', async (c) => {
16
+ const { method, code } = await c.req.json();
17
+ try {
18
+ return c.json(await completeProviderOauth(requestWorkingDir(c), c.req.param('id'), method, code));
19
+ }
20
+ catch (err) {
21
+ return jsonOpencodeError(c, err, { providerId: c.req.param('id'), defaultStatus: 500 });
22
+ }
23
+ });
24
+ opencodeProvider.put('/api/provider/:id/auth', async (c) => {
25
+ const auth = await c.req.json();
26
+ try {
27
+ return c.json(await updateProviderAuth(requestWorkingDir(c), c.req.param('id'), auth));
28
+ }
29
+ catch (err) {
30
+ return jsonOpencodeError(c, err, { providerId: c.req.param('id'), defaultStatus: 500 });
31
+ }
32
+ });
33
+ opencodeProvider.delete('/api/provider/:id/auth', async (c) => {
34
+ try {
35
+ return c.json(await deleteProviderAuth(requestWorkingDir(c), c.req.param('id')));
36
+ }
37
+ catch (err) {
38
+ return jsonOpencodeError(c, err, { providerId: c.req.param('id'), defaultStatus: 500 });
39
+ }
40
+ });
41
+ export default opencodeProvider;