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.
- package/README.md +20 -200
- package/client/assets/ActFrame-BYOBkLYW.js +1 -0
- package/client/assets/ActFrame-C_WEt6bv.css +1 -0
- package/client/assets/ActInspectorPanel-C3VlS7tB.js +1 -0
- package/client/assets/ActInspectorPanel-CE6s6GYv.css +1 -0
- package/client/assets/AssistantChat-BOyW0K79.js +1 -0
- package/client/assets/AssistantChat-DoVmHvMJ.css +1 -0
- package/client/assets/CanvasTerminalFrame-BC-79q9U.css +1 -0
- package/client/assets/CanvasTerminalFrame-DxKbexK6.js +4 -0
- package/client/assets/CanvasTrackingFrame-DumxhNwg.js +1 -0
- package/client/assets/CanvasTrackingFrame-G4rRrfne.css +1 -0
- package/client/assets/CanvasWindowFrame-ziJeVfHG.js +1 -0
- package/client/assets/DanceBundleEditorFrame-CH8VDUMK.js +1 -0
- package/client/assets/DanceBundleEditorFrame-DaLqMflT.css +1 -0
- package/client/assets/MarkdownEditorFrame-DVecIZpZ.css +1 -0
- package/client/assets/MarkdownEditorFrame-Dwpgs2GX.js +2 -0
- package/client/assets/MarkdownRenderer-Cz8A4AgP.js +1 -0
- package/client/assets/PublishModal-DUlHz0fT.js +1 -0
- package/client/assets/TodoDock-DcVf7zQG.js +1 -0
- package/client/assets/WorkspaceToolbar-CXYi_sMD.js +2 -0
- package/client/assets/WorkspaceToolbar-CiQvVocC.css +1 -0
- package/client/assets/chat-message-visibility-YwJ-AQno.js +11 -0
- package/client/assets/dnd-vendor-CIAZE2P2.js +5 -0
- package/client/assets/flow-vendor-BZV40eAE.css +1 -0
- package/client/assets/flow-vendor-C868rU-6.js +23 -0
- package/client/assets/icon-vendor-I2JVIi1s.js +501 -0
- package/client/assets/index-BMY4hrBP.js +3 -0
- package/client/assets/index-C-vnj9y3.js +1 -0
- package/client/assets/index-C9HTqfZw.css +1 -0
- package/client/assets/index-CWrv6O3o.js +64 -0
- package/client/assets/index-DMS12-Q2.js +8 -0
- package/client/assets/index-Dn7t_Y7G.js +1 -0
- package/client/assets/index-p-wk7iGH.css +1 -0
- package/client/assets/markdown-vendor-BSTcku12.css +10 -0
- package/client/assets/markdown-vendor-DnTJ9hmR.js +35 -0
- package/client/assets/participant-labels-Cf3qP3GB.js +1 -0
- package/client/assets/queries-Dm1jEHfc.js +1 -0
- package/client/assets/query-vendor-_taqgrbn.js +1 -0
- package/client/assets/react-vendor-DzpMUNDT.js +49 -0
- package/client/assets/settings-utils-l7KCS3Ev.js +1 -0
- package/client/assets/terminal-vendor-6GBZ9nXN.css +32 -0
- package/client/assets/terminal-vendor-D0xRnmbI.js +112 -0
- package/client/index.html +13 -3
- package/dist/cli.js +25 -3
- package/dist/server/app.js +72 -0
- package/dist/server/index.js +2 -62
- package/dist/server/lib/act-session-policy.js +31 -0
- package/dist/server/lib/chat-session.js +101 -0
- package/dist/server/lib/config.js +18 -4
- package/dist/server/lib/dot-authoring.js +171 -102
- package/dist/server/lib/dot-loader.js +9 -8
- package/dist/server/lib/dot-login.js +8 -190
- package/dist/server/lib/dot-source.js +11 -0
- package/dist/server/lib/model-catalog.js +74 -15
- package/dist/server/lib/opencode-auth.js +4 -1
- package/dist/server/lib/opencode-errors.js +70 -38
- package/dist/server/lib/opencode-sidecar.js +5 -2
- package/dist/server/lib/project-config.js +8 -0
- package/dist/server/lib/runtime-tools.js +46 -8
- package/dist/server/lib/safe-mode.js +410 -0
- package/dist/server/lib/session-execution.js +81 -0
- package/dist/server/lib/sse.js +22 -0
- package/dist/server/routes/act-runtime-threads.js +156 -0
- package/dist/server/routes/act-runtime-tools.js +157 -0
- package/dist/server/routes/act-runtime.js +7 -0
- package/dist/server/routes/adapter.js +32 -0
- package/dist/server/routes/assets-collection.js +16 -0
- package/dist/server/routes/assets-detail.js +38 -0
- package/dist/server/routes/assets.js +4 -158
- package/dist/server/routes/chat-messages.js +104 -0
- package/dist/server/routes/chat-sessions.js +104 -0
- package/dist/server/routes/chat-stream.js +15 -0
- package/dist/server/routes/chat.js +6 -353
- package/dist/server/routes/compile.js +5 -91
- package/dist/server/routes/dot-assets.js +77 -0
- package/dist/server/routes/dot-core.js +62 -0
- package/dist/server/routes/dot-performer.js +80 -0
- package/dist/server/routes/dot.js +6 -267
- package/dist/server/routes/drafts-collection.js +40 -0
- package/dist/server/routes/drafts-dance-bundle.js +113 -0
- package/dist/server/routes/drafts-item.js +86 -0
- package/dist/server/routes/drafts.js +9 -0
- package/dist/server/routes/health.js +18 -33
- package/dist/server/routes/opencode-core.js +120 -0
- package/dist/server/routes/opencode-file.js +67 -0
- package/dist/server/routes/opencode-mcp.js +74 -0
- package/dist/server/routes/opencode-provider.js +41 -0
- package/dist/server/routes/opencode.js +8 -418
- package/dist/server/routes/route-errors.js +10 -0
- package/dist/server/routes/safe-actions.js +60 -0
- package/dist/server/routes/safe-summary.js +20 -0
- package/dist/server/routes/safe.js +7 -0
- package/dist/server/routes/workspaces.js +47 -0
- package/dist/server/services/act-runtime/act-context-builder.js +81 -0
- package/dist/server/services/act-runtime/act-runtime-service.js +313 -0
- package/dist/server/services/act-runtime/act-runtime-utils.js +10 -0
- package/dist/server/services/act-runtime/act-tool-projection.js +26 -0
- package/dist/server/services/act-runtime/act-tools.js +151 -0
- package/dist/server/services/act-runtime/board-persistence.js +38 -0
- package/dist/server/services/act-runtime/event-logger.js +73 -0
- package/dist/server/services/act-runtime/event-router.js +102 -0
- package/dist/server/services/act-runtime/mailbox.js +149 -0
- package/dist/server/services/act-runtime/safety-guard.js +162 -0
- package/dist/server/services/act-runtime/session-queue.js +114 -0
- package/dist/server/services/act-runtime/thread-manager.js +351 -0
- package/dist/server/services/act-runtime/wake-cascade.js +306 -0
- package/dist/server/services/act-runtime/wake-evaluator.js +43 -0
- package/dist/server/services/act-runtime/wake-performer-resolver.js +68 -0
- package/dist/server/services/act-runtime/wake-prompt-builder.js +77 -0
- package/dist/server/services/adapter-view-service.js +6 -0
- package/dist/server/services/asset-service.js +366 -0
- package/dist/server/services/chat-event-stream-service.js +157 -0
- package/dist/server/services/chat-service.js +207 -0
- package/dist/server/services/chat-session-service.js +203 -0
- package/dist/server/services/compile-service.js +4 -0
- package/dist/server/services/dance-bundle-service.js +222 -0
- package/dist/server/services/dot-add-service.js +59 -0
- package/dist/server/services/dot-service.js +178 -0
- package/dist/server/services/draft-service.js +367 -0
- package/dist/server/services/opencode-projection/dance-compiler.js +164 -0
- package/dist/server/services/opencode-projection/performer-compiler.js +195 -0
- package/dist/server/services/opencode-projection/preview-service.js +31 -0
- package/dist/server/services/opencode-projection/projection-manifest.js +98 -0
- package/dist/server/services/opencode-projection/stage-projection-service.js +188 -0
- package/dist/server/services/opencode-service.js +338 -0
- package/dist/server/services/safe-service.js +33 -0
- package/dist/server/services/studio-assistant/assistant-service.js +172 -0
- package/dist/server/services/studio-service.js +69 -0
- package/dist/server/services/workspace-service.js +224 -0
- package/dist/server/terminal.js +57 -11
- package/dist/shared/act-types.js +4 -0
- package/dist/shared/adapter-view.js +1 -0
- package/dist/shared/asset-contracts.js +1 -0
- package/dist/shared/assistant-actions.js +1 -0
- package/dist/shared/chat-contracts.js +1 -0
- package/dist/shared/dot-contracts.js +1 -0
- package/dist/shared/dot-types.js +4 -0
- package/dist/shared/draft-contracts.js +2 -0
- package/dist/shared/model-types.js +2 -0
- package/dist/shared/performer-mcp-portability.js +10 -0
- package/dist/shared/safe-mode.js +1 -0
- package/dist/shared/session-metadata.js +4 -3
- package/package.json +6 -4
- package/client/assets/index-C2eIILoa.css +0 -41
- package/client/assets/index-DUPZ_Lw5.js +0 -616
- package/dist/server/lib/act-runtime.js +0 -1282
- package/dist/server/lib/prompt.js +0 -222
- 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 {
|
|
4
|
-
import {
|
|
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:
|
|
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
|
-
|
|
18
|
-
return c.json({ path: stdout.trim() });
|
|
11
|
+
return c.json(await pickWorkingDirectory());
|
|
19
12
|
}
|
|
20
13
|
catch {
|
|
21
|
-
return c
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
27
|
+
const result = await activateStudioProject(workingDir);
|
|
28
|
+
if (!result.ok) {
|
|
29
|
+
return jsonServiceFailure(c, result);
|
|
38
30
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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;
|