modular-studio 0.2.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 (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/dist/assets/graphPopulator-C6jg83nL.js +1 -0
  4. package/dist/assets/index-CXhIX28x.js +634 -0
  5. package/dist/assets/index-CeNF0r-K.css +1 -0
  6. package/dist/assets/jszip.min-BlpRodxc.js +2 -0
  7. package/dist/index.html +16 -0
  8. package/dist/vite.svg +1 -0
  9. package/dist-server/bin/modular-mcp.d.ts +8 -0
  10. package/dist-server/bin/modular-mcp.d.ts.map +1 -0
  11. package/dist-server/bin/modular-mcp.js +158 -0
  12. package/dist-server/bin/modular-mcp.js.map +1 -0
  13. package/dist-server/bin/modular-studio.d.ts +3 -0
  14. package/dist-server/bin/modular-studio.d.ts.map +1 -0
  15. package/dist-server/bin/modular-studio.js +63 -0
  16. package/dist-server/bin/modular-studio.js.map +1 -0
  17. package/dist-server/server/config.d.ts +4 -0
  18. package/dist-server/server/config.d.ts.map +1 -0
  19. package/dist-server/server/config.js +33 -0
  20. package/dist-server/server/config.js.map +1 -0
  21. package/dist-server/server/data/mcp-clients.json +5 -0
  22. package/dist-server/server/index.d.ts +3 -0
  23. package/dist-server/server/index.d.ts.map +1 -0
  24. package/dist-server/server/index.js +174 -0
  25. package/dist-server/server/index.js.map +1 -0
  26. package/dist-server/server/mcp/manager.d.ts +47 -0
  27. package/dist-server/server/mcp/manager.d.ts.map +1 -0
  28. package/dist-server/server/mcp/manager.js +203 -0
  29. package/dist-server/server/mcp/manager.js.map +1 -0
  30. package/dist-server/server/mcp/modular-server.d.ts +55 -0
  31. package/dist-server/server/mcp/modular-server.d.ts.map +1 -0
  32. package/dist-server/server/mcp/modular-server.js +492 -0
  33. package/dist-server/server/mcp/modular-server.js.map +1 -0
  34. package/dist-server/server/mcp/transport.d.ts +29 -0
  35. package/dist-server/server/mcp/transport.d.ts.map +1 -0
  36. package/dist-server/server/mcp/transport.js +61 -0
  37. package/dist-server/server/mcp/transport.js.map +1 -0
  38. package/dist-server/server/routes/agent-sdk.d.ts +3 -0
  39. package/dist-server/server/routes/agent-sdk.d.ts.map +1 -0
  40. package/dist-server/server/routes/agent-sdk.js +99 -0
  41. package/dist-server/server/routes/agent-sdk.js.map +1 -0
  42. package/dist-server/server/routes/agents.d.ts +10 -0
  43. package/dist-server/server/routes/agents.d.ts.map +1 -0
  44. package/dist-server/server/routes/agents.js +61 -0
  45. package/dist-server/server/routes/agents.js.map +1 -0
  46. package/dist-server/server/routes/auth-codex.d.ts +3 -0
  47. package/dist-server/server/routes/auth-codex.d.ts.map +1 -0
  48. package/dist-server/server/routes/auth-codex.js +51 -0
  49. package/dist-server/server/routes/auth-codex.js.map +1 -0
  50. package/dist-server/server/routes/capabilities.d.ts +3 -0
  51. package/dist-server/server/routes/capabilities.d.ts.map +1 -0
  52. package/dist-server/server/routes/capabilities.js +32 -0
  53. package/dist-server/server/routes/capabilities.js.map +1 -0
  54. package/dist-server/server/routes/claude-config.d.ts +3 -0
  55. package/dist-server/server/routes/claude-config.d.ts.map +1 -0
  56. package/dist-server/server/routes/claude-config.js +146 -0
  57. package/dist-server/server/routes/claude-config.js.map +1 -0
  58. package/dist-server/server/routes/connectors.d.ts +12 -0
  59. package/dist-server/server/routes/connectors.d.ts.map +1 -0
  60. package/dist-server/server/routes/connectors.js +325 -0
  61. package/dist-server/server/routes/connectors.js.map +1 -0
  62. package/dist-server/server/routes/embeddings.d.ts +6 -0
  63. package/dist-server/server/routes/embeddings.d.ts.map +1 -0
  64. package/dist-server/server/routes/embeddings.js +130 -0
  65. package/dist-server/server/routes/embeddings.js.map +1 -0
  66. package/dist-server/server/routes/health.d.ts +9 -0
  67. package/dist-server/server/routes/health.d.ts.map +1 -0
  68. package/dist-server/server/routes/health.js +284 -0
  69. package/dist-server/server/routes/health.js.map +1 -0
  70. package/dist-server/server/routes/knowledge.d.ts +3 -0
  71. package/dist-server/server/routes/knowledge.d.ts.map +1 -0
  72. package/dist-server/server/routes/knowledge.js +534 -0
  73. package/dist-server/server/routes/knowledge.js.map +1 -0
  74. package/dist-server/server/routes/llm.d.ts +3 -0
  75. package/dist-server/server/routes/llm.d.ts.map +1 -0
  76. package/dist-server/server/routes/llm.js +200 -0
  77. package/dist-server/server/routes/llm.js.map +1 -0
  78. package/dist-server/server/routes/mcp-oauth.d.ts +12 -0
  79. package/dist-server/server/routes/mcp-oauth.d.ts.map +1 -0
  80. package/dist-server/server/routes/mcp-oauth.js +137 -0
  81. package/dist-server/server/routes/mcp-oauth.js.map +1 -0
  82. package/dist-server/server/routes/mcp.d.ts +3 -0
  83. package/dist-server/server/routes/mcp.d.ts.map +1 -0
  84. package/dist-server/server/routes/mcp.js +177 -0
  85. package/dist-server/server/routes/mcp.js.map +1 -0
  86. package/dist-server/server/routes/pipeline.d.ts +45 -0
  87. package/dist-server/server/routes/pipeline.d.ts.map +1 -0
  88. package/dist-server/server/routes/pipeline.js +483 -0
  89. package/dist-server/server/routes/pipeline.js.map +1 -0
  90. package/dist-server/server/routes/providers.d.ts +3 -0
  91. package/dist-server/server/routes/providers.d.ts.map +1 -0
  92. package/dist-server/server/routes/providers.js +204 -0
  93. package/dist-server/server/routes/providers.js.map +1 -0
  94. package/dist-server/server/routes/qualification.d.ts +3 -0
  95. package/dist-server/server/routes/qualification.d.ts.map +1 -0
  96. package/dist-server/server/routes/qualification.js +105 -0
  97. package/dist-server/server/routes/qualification.js.map +1 -0
  98. package/dist-server/server/routes/repo-index.d.ts +4 -0
  99. package/dist-server/server/routes/repo-index.d.ts.map +1 -0
  100. package/dist-server/server/routes/repo-index.js +318 -0
  101. package/dist-server/server/routes/repo-index.js.map +1 -0
  102. package/dist-server/server/routes/runtime.d.ts +3 -0
  103. package/dist-server/server/routes/runtime.d.ts.map +1 -0
  104. package/dist-server/server/routes/runtime.js +122 -0
  105. package/dist-server/server/routes/runtime.js.map +1 -0
  106. package/dist-server/server/routes/skills-search.d.ts +3 -0
  107. package/dist-server/server/routes/skills-search.d.ts.map +1 -0
  108. package/dist-server/server/routes/skills-search.js +198 -0
  109. package/dist-server/server/routes/skills-search.js.map +1 -0
  110. package/dist-server/server/routes/worktrees.d.ts +3 -0
  111. package/dist-server/server/routes/worktrees.d.ts.map +1 -0
  112. package/dist-server/server/routes/worktrees.js +70 -0
  113. package/dist-server/server/routes/worktrees.js.map +1 -0
  114. package/dist-server/server/services/__tests__/embeddingService.test.d.ts +5 -0
  115. package/dist-server/server/services/__tests__/embeddingService.test.d.ts.map +1 -0
  116. package/dist-server/server/services/__tests__/embeddingService.test.js +233 -0
  117. package/dist-server/server/services/__tests__/embeddingService.test.js.map +1 -0
  118. package/dist-server/server/services/agentRunner.d.ts +46 -0
  119. package/dist-server/server/services/agentRunner.d.ts.map +1 -0
  120. package/dist-server/server/services/agentRunner.js +295 -0
  121. package/dist-server/server/services/agentRunner.js.map +1 -0
  122. package/dist-server/server/services/agentStore.d.ts +40 -0
  123. package/dist-server/server/services/agentStore.d.ts.map +1 -0
  124. package/dist-server/server/services/agentStore.js +62 -0
  125. package/dist-server/server/services/agentStore.js.map +1 -0
  126. package/dist-server/server/services/contentStore.d.ts +32 -0
  127. package/dist-server/server/services/contentStore.d.ts.map +1 -0
  128. package/dist-server/server/services/contentStore.js +68 -0
  129. package/dist-server/server/services/contentStore.js.map +1 -0
  130. package/dist-server/server/services/embeddingService.d.ts +53 -0
  131. package/dist-server/server/services/embeddingService.d.ts.map +1 -0
  132. package/dist-server/server/services/embeddingService.js +199 -0
  133. package/dist-server/server/services/embeddingService.js.map +1 -0
  134. package/dist-server/server/services/factExtractor.d.ts +14 -0
  135. package/dist-server/server/services/factExtractor.d.ts.map +1 -0
  136. package/dist-server/server/services/factExtractor.js +126 -0
  137. package/dist-server/server/services/factExtractor.js.map +1 -0
  138. package/dist-server/server/services/githubIndexer.d.ts +59 -0
  139. package/dist-server/server/services/githubIndexer.d.ts.map +1 -0
  140. package/dist-server/server/services/githubIndexer.js +183 -0
  141. package/dist-server/server/services/githubIndexer.js.map +1 -0
  142. package/dist-server/server/services/mcpOAuth.d.ts +32 -0
  143. package/dist-server/server/services/mcpOAuth.d.ts.map +1 -0
  144. package/dist-server/server/services/mcpOAuth.js +264 -0
  145. package/dist-server/server/services/mcpOAuth.js.map +1 -0
  146. package/dist-server/server/services/memoryScorer.d.ts +19 -0
  147. package/dist-server/server/services/memoryScorer.d.ts.map +1 -0
  148. package/dist-server/server/services/memoryScorer.js +147 -0
  149. package/dist-server/server/services/memoryScorer.js.map +1 -0
  150. package/dist-server/server/services/repoIndexer.d.ts +91 -0
  151. package/dist-server/server/services/repoIndexer.d.ts.map +1 -0
  152. package/dist-server/server/services/repoIndexer.js +512 -0
  153. package/dist-server/server/services/repoIndexer.js.map +1 -0
  154. package/dist-server/server/services/teamRunner.d.ts +39 -0
  155. package/dist-server/server/services/teamRunner.d.ts.map +1 -0
  156. package/dist-server/server/services/teamRunner.js +76 -0
  157. package/dist-server/server/services/teamRunner.js.map +1 -0
  158. package/dist-server/server/services/worktreeManager.d.ts +27 -0
  159. package/dist-server/server/services/worktreeManager.d.ts.map +1 -0
  160. package/dist-server/server/services/worktreeManager.js +107 -0
  161. package/dist-server/server/services/worktreeManager.js.map +1 -0
  162. package/dist-server/server/types.d.ts +30 -0
  163. package/dist-server/server/types.d.ts.map +1 -0
  164. package/dist-server/server/types.js +2 -0
  165. package/dist-server/server/types.js.map +1 -0
  166. package/dist-server/server/utils/pathSecurity.d.ts +34 -0
  167. package/dist-server/server/utils/pathSecurity.d.ts.map +1 -0
  168. package/dist-server/server/utils/pathSecurity.js +78 -0
  169. package/dist-server/server/utils/pathSecurity.js.map +1 -0
  170. package/dist-server/src/services/budgetAllocator.d.ts +37 -0
  171. package/dist-server/src/services/budgetAllocator.d.ts.map +1 -0
  172. package/dist-server/src/services/budgetAllocator.js +120 -0
  173. package/dist-server/src/services/budgetAllocator.js.map +1 -0
  174. package/dist-server/src/services/contradictionDetector.d.ts +18 -0
  175. package/dist-server/src/services/contradictionDetector.d.ts.map +1 -0
  176. package/dist-server/src/services/contradictionDetector.js +111 -0
  177. package/dist-server/src/services/contradictionDetector.js.map +1 -0
  178. package/dist-server/src/services/treeIndexer.d.ts +91 -0
  179. package/dist-server/src/services/treeIndexer.d.ts.map +1 -0
  180. package/dist-server/src/services/treeIndexer.js +289 -0
  181. package/dist-server/src/services/treeIndexer.js.map +1 -0
  182. package/dist-server/src/store/knowledgeBase.d.ts +130 -0
  183. package/dist-server/src/store/knowledgeBase.d.ts.map +1 -0
  184. package/dist-server/src/store/knowledgeBase.js +299 -0
  185. package/dist-server/src/store/knowledgeBase.js.map +1 -0
  186. package/dist-server/tsconfig.server.tsbuildinfo +1 -0
  187. package/package.json +92 -0
@@ -0,0 +1,99 @@
1
+ import { Router } from "express";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { homedir } from "node:os";
5
+ const router = Router();
6
+ // POST /api/agent-sdk/chat — streaming chat via Agent SDK
7
+ router.post("/chat", async (req, res) => {
8
+ const { prompt, model, mcpServers, systemPrompt, maxTurns } = req.body;
9
+ res.setHeader("Content-Type", "text/event-stream");
10
+ res.setHeader("Cache-Control", "no-cache");
11
+ res.setHeader("Connection", "keep-alive");
12
+ try {
13
+ const { query } = await import("@anthropic-ai/claude-agent-sdk");
14
+ for await (const message of query({
15
+ prompt,
16
+ options: {
17
+ model: model || undefined,
18
+ allowedTools: ["Read", "Edit", "Bash", "Glob", "Grep", "WebSearch", "WebFetch"],
19
+ permissionMode: "acceptEdits",
20
+ maxTurns: Math.min(maxTurns || 10, 25), // Cap to prevent runaway agents
21
+ systemPrompt: systemPrompt || undefined,
22
+ ...(mcpServers ? { mcpServers } : {}),
23
+ },
24
+ })) {
25
+ if (message.type === "assistant" && message.message?.content) {
26
+ for (const block of message.message.content) {
27
+ if ("text" in block) {
28
+ res.write(`data: ${JSON.stringify({ type: "text", content: block.text })}\n\n`);
29
+ }
30
+ else if ("name" in block) {
31
+ const toolBlock = block;
32
+ res.write(`data: ${JSON.stringify({ type: "tool_use", name: toolBlock.name, input: toolBlock.input })}\n\n`);
33
+ }
34
+ }
35
+ }
36
+ else if (message.type === "result") {
37
+ res.write(`data: ${JSON.stringify({ type: "result", subtype: message.subtype })}\n\n`);
38
+ }
39
+ }
40
+ res.write("data: [DONE]\n\n");
41
+ res.end();
42
+ }
43
+ catch (error) {
44
+ const msg = error instanceof Error ? error.message : String(error);
45
+ res.write(`data: ${JSON.stringify({ type: "error", message: msg })}\n\n`);
46
+ res.end();
47
+ }
48
+ });
49
+ // GET /api/agent-sdk/status — check if Claude Code is authenticated
50
+ router.get("/status", async (_req, res) => {
51
+ try {
52
+ // Check for Claude Code credentials on disk (no CLI process needed)
53
+ const home = homedir();
54
+ const credPath = join(home, ".claude", ".credentials.json");
55
+ const configPath = join(home, ".claude.json");
56
+ if (!existsSync(configPath)) {
57
+ res.json({
58
+ status: "ok",
59
+ data: { authenticated: false, error: "Claude Code not installed — run: curl -fsSL https://claude.ai/install.sh | bash" },
60
+ });
61
+ return;
62
+ }
63
+ if (!existsSync(credPath)) {
64
+ res.json({
65
+ status: "ok",
66
+ data: { authenticated: false, error: "Not logged in — run: claude login" },
67
+ });
68
+ return;
69
+ }
70
+ // Read config for account info
71
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
72
+ const account = config?.oauthAccount;
73
+ // Claude Agent SDK supports these models
74
+ const models = [
75
+ "claude-sonnet-4-20250514",
76
+ "claude-opus-4-20250514",
77
+ "claude-haiku-4-20250514",
78
+ ];
79
+ res.json({
80
+ status: "ok",
81
+ data: {
82
+ authenticated: true,
83
+ email: account?.emailAddress,
84
+ displayName: account?.displayName,
85
+ organization: account?.organizationUuid,
86
+ models,
87
+ },
88
+ });
89
+ }
90
+ catch (error) {
91
+ const msg = error instanceof Error ? error.message : String(error);
92
+ res.json({
93
+ status: "ok",
94
+ data: { authenticated: false, error: msg },
95
+ });
96
+ }
97
+ });
98
+ export default router;
99
+ //# sourceMappingURL=agent-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-sdk.js","sourceRoot":"","sources":["../../../server/routes/agent-sdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Agent CRUD Routes
3
+ * GET /api/agents — list all (summary only)
4
+ * GET /api/agents/:id — full state
5
+ * PUT /api/agents/:id — save/update
6
+ * DELETE /api/agents/:id — delete
7
+ */
8
+ declare const router: import("express-serve-static-core").Router;
9
+ export default router;
10
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../server/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAmDxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Agent CRUD Routes
3
+ * GET /api/agents — list all (summary only)
4
+ * GET /api/agents/:id — full state
5
+ * PUT /api/agents/:id — save/update
6
+ * DELETE /api/agents/:id — delete
7
+ */
8
+ import { Router } from 'express';
9
+ import { saveAgent, loadAgent, listAgents, deleteAgent } from '../services/agentStore.js';
10
+ const router = Router();
11
+ router.get('/', (_req, res) => {
12
+ try {
13
+ const agents = listAgents();
14
+ res.json({ status: 'ok', data: agents });
15
+ }
16
+ catch (err) {
17
+ res.status(500).json({ status: 'error', error: err.message });
18
+ }
19
+ });
20
+ router.get('/:id', (req, res) => {
21
+ try {
22
+ const agent = loadAgent(req.params.id);
23
+ if (!agent) {
24
+ res.status(404).json({ status: 'error', error: 'Agent not found' });
25
+ return;
26
+ }
27
+ res.json({ status: 'ok', data: agent });
28
+ }
29
+ catch (err) {
30
+ res.status(500).json({ status: 'error', error: err.message });
31
+ }
32
+ });
33
+ router.put('/:id', (req, res) => {
34
+ try {
35
+ const state = req.body;
36
+ if (!state || typeof state !== 'object') {
37
+ res.status(400).json({ status: 'error', error: 'Invalid body' });
38
+ return;
39
+ }
40
+ saveAgent(req.params.id, state);
41
+ res.json({ status: 'ok', data: { id: req.params.id } });
42
+ }
43
+ catch (err) {
44
+ res.status(500).json({ status: 'error', error: err.message });
45
+ }
46
+ });
47
+ router.delete('/:id', (req, res) => {
48
+ try {
49
+ const deleted = deleteAgent(req.params.id);
50
+ if (!deleted) {
51
+ res.status(404).json({ status: 'error', error: 'Agent not found' });
52
+ return;
53
+ }
54
+ res.json({ status: 'ok' });
55
+ }
56
+ catch (err) {
57
+ res.status(500).json({ status: 'error', error: err.message });
58
+ }
59
+ });
60
+ export default router;
61
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../server/routes/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=auth-codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-codex.d.ts","sourceRoot":"","sources":["../../../server/routes/auth-codex.ts"],"names":[],"mappings":"AAWA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAuDxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { Router } from 'express';
2
+ import { randomUUID } from 'node:crypto';
3
+ const sessions = new Map();
4
+ const router = Router();
5
+ router.post('/start', (_req, res) => {
6
+ const id = randomUUID();
7
+ const session = { id, status: 'pending', createdAt: Date.now() };
8
+ sessions.set(id, session);
9
+ const resp = {
10
+ status: 'ok',
11
+ data: {
12
+ sessionId: id,
13
+ authUrl: 'https://platform.openai.com/settings/organization/api-keys',
14
+ },
15
+ };
16
+ res.json(resp);
17
+ });
18
+ router.get('/status/:sessionId', (req, res) => {
19
+ const session = sessions.get(req.params.sessionId);
20
+ if (!session) {
21
+ const resp = { status: 'error', error: 'Session not found' };
22
+ res.status(404).json(resp);
23
+ return;
24
+ }
25
+ if (Date.now() - session.createdAt > 10 * 60_000) {
26
+ session.status = 'expired';
27
+ sessions.set(session.id, session);
28
+ }
29
+ const resp = { status: 'ok', data: { status: session.status } };
30
+ res.json(resp);
31
+ });
32
+ router.post('/complete/:sessionId', (req, res) => {
33
+ const session = sessions.get(req.params.sessionId);
34
+ if (!session) {
35
+ const resp = { status: 'error', error: 'Session not found' };
36
+ res.status(404).json(resp);
37
+ return;
38
+ }
39
+ const apiKey = String(req.body?.apiKey || '').trim();
40
+ if (!apiKey) {
41
+ const resp = { status: 'error', error: 'Missing apiKey' };
42
+ res.status(400).json(resp);
43
+ return;
44
+ }
45
+ session.status = 'connected';
46
+ sessions.set(session.id, session);
47
+ const resp = { status: 'ok', data: { apiKey } };
48
+ res.json(resp);
49
+ });
50
+ export default router;
51
+ //# sourceMappingURL=auth-codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-codex.js","sourceRoot":"","sources":["../../../server/routes/auth-codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../server/routes/capabilities.ts"],"names":[],"mappings":"AA0BA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAcxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { Router } from 'express';
2
+ import { readConfig } from '../config.js';
3
+ const S = 'supported';
4
+ const D = 'degraded';
5
+ const U = 'unsupported';
6
+ const PROVIDER_CAPABILITIES = {
7
+ anthropic: { toolCalling: { status: S }, streaming: { status: S }, structuredOutput: { status: S }, memoryHooks: { status: S }, agentLoop: { status: S }, mcpBridge: { status: S } },
8
+ 'claude-agent-sdk': { toolCalling: { status: S }, streaming: { status: S }, structuredOutput: { status: S }, memoryHooks: { status: S }, agentLoop: { status: S }, mcpBridge: { status: S } },
9
+ openai: { toolCalling: { status: S }, streaming: { status: S }, structuredOutput: { status: S }, memoryHooks: { status: D, note: 'Requires external memory layer' }, agentLoop: { status: S }, mcpBridge: { status: D, note: 'Via OpenAI-compatible proxy' } },
10
+ google: { toolCalling: { status: S }, streaming: { status: S }, structuredOutput: { status: D, note: 'JSON mode only, no strict schema' }, memoryHooks: { status: U, note: 'Not natively supported' }, agentLoop: { status: D, note: 'Manual orchestration required' }, mcpBridge: { status: U, note: 'No MCP support' } },
11
+ openrouter: { toolCalling: { status: D, note: 'Depends on underlying model' }, streaming: { status: S }, structuredOutput: { status: D, note: 'Depends on underlying model' }, memoryHooks: { status: D, note: 'Depends on underlying model' }, agentLoop: { status: D, note: 'Depends on underlying model' }, mcpBridge: { status: U, note: 'Not available through proxy' } },
12
+ custom: { toolCalling: { status: D, note: 'Depends on implementation' }, streaming: { status: D, note: 'Depends on implementation' }, structuredOutput: { status: D, note: 'Depends on implementation' }, memoryHooks: { status: U, note: 'Unknown provider' }, agentLoop: { status: D, note: 'Depends on implementation' }, mcpBridge: { status: U, note: 'Unknown provider' } },
13
+ };
14
+ function resolveMatrix(id) {
15
+ return PROVIDER_CAPABILITIES[id] ?? (id.startsWith('custom') ? PROVIDER_CAPABILITIES.custom : PROVIDER_CAPABILITIES.custom);
16
+ }
17
+ const router = Router();
18
+ router.get('/', (_req, res) => {
19
+ const config = readConfig();
20
+ const result = {};
21
+ for (const p of config.providers)
22
+ result[p.id] = resolveMatrix(p.id);
23
+ for (const key of Object.keys(PROVIDER_CAPABILITIES))
24
+ if (!result[key])
25
+ result[key] = PROVIDER_CAPABILITIES[key];
26
+ res.json({ status: 'ok', data: result });
27
+ });
28
+ router.get('/:providerId', (req, res) => {
29
+ res.json({ status: 'ok', data: resolveMatrix(req.params.providerId) });
30
+ });
31
+ export default router;
32
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../server/routes/capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=claude-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-config.d.ts","sourceRoot":"","sources":["../../../server/routes/claude-config.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAwKxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,146 @@
1
+ import { Router } from 'express';
2
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ const router = Router();
6
+ function getClaudeConfig() {
7
+ const configPath = join(homedir(), '.claude.json');
8
+ if (!existsSync(configPath))
9
+ return null;
10
+ try {
11
+ return JSON.parse(readFileSync(configPath, 'utf-8'));
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ // GET /api/claude-config/mcp — list MCP servers from Claude Code config
18
+ router.get('/mcp', (_req, res) => {
19
+ const config = getClaudeConfig();
20
+ if (!config?.mcpServers) {
21
+ res.json({ status: 'ok', data: [] });
22
+ return;
23
+ }
24
+ const servers = Object.entries(config.mcpServers).map(([id, cfg]) => {
25
+ // Determine status from toolConfiguration
26
+ const toolConfig = cfg.toolConfiguration;
27
+ const defaults = toolConfig?.defaults;
28
+ let status = 'enabled';
29
+ if (defaults?.deferred)
30
+ status = 'deferred';
31
+ if (defaults?.disabled)
32
+ status = 'disabled';
33
+ return {
34
+ id,
35
+ name: id.charAt(0).toUpperCase() + id.slice(1).replace(/-/g, ' '),
36
+ type: (cfg.type || 'stdio'),
37
+ command: cfg.command,
38
+ args: cfg.args,
39
+ url: cfg.url,
40
+ env: cfg.env,
41
+ headers: cfg.headers,
42
+ status,
43
+ };
44
+ });
45
+ res.json({ status: 'ok', data: servers });
46
+ });
47
+ // GET /api/claude-config/skills — list skills from ~/.claude/skills
48
+ router.get('/skills', (_req, res) => {
49
+ const skillsDir = join(homedir(), '.claude', 'skills');
50
+ if (!existsSync(skillsDir)) {
51
+ // Also check .agents/skills
52
+ const agentsSkillsDir = join(homedir(), '.agents', 'skills');
53
+ if (!existsSync(agentsSkillsDir)) {
54
+ res.json({ status: 'ok', data: [] });
55
+ return;
56
+ }
57
+ }
58
+ const skills = [];
59
+ const dirs = [
60
+ { path: join(homedir(), '.claude', 'skills'), scope: 'global' },
61
+ { path: join(homedir(), '.agents', 'skills'), scope: 'user' },
62
+ ];
63
+ for (const { path: dir, scope } of dirs) {
64
+ if (!existsSync(dir))
65
+ continue;
66
+ try {
67
+ const entries = readdirSync(dir);
68
+ for (const entry of entries) {
69
+ const entryPath = join(dir, entry);
70
+ if (!statSync(entryPath).isDirectory())
71
+ continue;
72
+ const skillMdPath = join(entryPath, 'SKILL.md');
73
+ const hasSkillMd = existsSync(skillMdPath);
74
+ let description = '';
75
+ if (hasSkillMd) {
76
+ try {
77
+ const content = readFileSync(skillMdPath, 'utf-8');
78
+ // Extract first non-empty, non-header line as description
79
+ const lines = content.split('\n');
80
+ for (const line of lines) {
81
+ const trimmed = line.trim();
82
+ if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('---')) {
83
+ description = trimmed.slice(0, 200);
84
+ break;
85
+ }
86
+ }
87
+ }
88
+ catch { /* ignore */ }
89
+ }
90
+ skills.push({
91
+ id: `${scope}:${entry}`,
92
+ name: entry.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()),
93
+ path: entryPath,
94
+ hasSkillMd,
95
+ description: description || undefined,
96
+ });
97
+ }
98
+ }
99
+ catch { /* ignore */ }
100
+ }
101
+ res.json({ status: 'ok', data: skills });
102
+ });
103
+ // GET /api/claude-config/project-mcp?dir=... — list project-level MCP from .mcp.json
104
+ router.get('/project-mcp', (req, res) => {
105
+ const dir = req.query.dir;
106
+ if (!dir) {
107
+ res.json({ status: 'ok', data: [] });
108
+ return;
109
+ }
110
+ const resolved = resolve(dir);
111
+ const mcpJsonPath = join(resolved, '.mcp.json');
112
+ if (!existsSync(mcpJsonPath)) {
113
+ res.json({ status: 'ok', data: [] });
114
+ return;
115
+ }
116
+ try {
117
+ const mcpJson = JSON.parse(readFileSync(mcpJsonPath, 'utf-8'));
118
+ const mcpServers = mcpJson.mcpServers || {};
119
+ const servers = Object.entries(mcpServers).map(([id, cfg]) => {
120
+ const toolConfig = cfg.toolConfiguration;
121
+ const defaults = toolConfig?.defaults;
122
+ let status = 'enabled';
123
+ if (defaults?.deferred)
124
+ status = 'deferred';
125
+ if (defaults?.disabled)
126
+ status = 'disabled';
127
+ return {
128
+ id: `project:${id}`,
129
+ name: id.charAt(0).toUpperCase() + id.slice(1).replace(/-/g, ' '),
130
+ type: (cfg.type || 'stdio'),
131
+ command: cfg.command,
132
+ args: cfg.args,
133
+ url: cfg.url,
134
+ env: cfg.env,
135
+ headers: cfg.headers,
136
+ status,
137
+ };
138
+ });
139
+ res.json({ status: 'ok', data: servers });
140
+ }
141
+ catch {
142
+ res.json({ status: 'ok', data: [] });
143
+ }
144
+ });
145
+ export default router;
146
+ //# sourceMappingURL=claude-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-config.js","sourceRoot":"","sources":["../../../server/routes/claude-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAsBxB,SAAS,eAAe;IACtB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAClD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAsB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAqD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;QAChI,0CAA0C;QAC1C,MAAM,UAAU,GAAG,GAAG,CAAC,iBAAwE,CAAC;QAChG,MAAM,QAAQ,GAAG,UAAU,EAAE,QAA+C,CAAC;QAC7E,IAAI,MAAM,GAAwC,SAAS,CAAC;QAC5D,IAAI,QAAQ,EAAE,QAAQ;YAAE,MAAM,GAAG,UAAU,CAAC;QAC5C,IAAI,QAAQ,EAAE,QAAQ;YAAE,MAAM,GAAG,UAAU,CAAC;QAE5C,OAAO;YACL,EAAE;YACF,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;YACjE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAc,IAAI,OAAO,CAA6B;YACjE,OAAO,EAAE,GAAG,CAAC,OAA6B;YAC1C,IAAI,EAAE,GAAG,CAAC,IAA4B;YACtC,GAAG,EAAE,GAAG,CAAC,GAAyB;YAClC,GAAG,EAAE,GAAG,CAAC,GAAyC;YAClD,OAAO,EAAE,GAAG,CAAC,OAA6C;YAC1D,MAAM;SACP,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,oEAAoE;AACpE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,4BAA4B;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG;QACX,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC/D,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;KAC9D,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACnC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;oBAAE,SAAS;gBAEjD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBAChD,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;gBAC3C,IAAI,WAAW,GAAG,EAAE,CAAC;gBAErB,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;wBACnD,0DAA0D;wBAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;4BACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;4BAC5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gCACtE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gCACpC,MAAM;4BACR,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC1B,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,GAAG,KAAK,IAAI,KAAK,EAAE;oBACvB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBACvE,IAAI,EAAE,SAAS;oBACf,UAAU;oBACV,WAAW,EAAE,WAAW,IAAI,SAAS;iBACtC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,qFAAqF;AACrF,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACzD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAqD,IAAI,EAAE,CAAC;QAEvF,MAAM,OAAO,GAAsB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;YAC9E,MAAM,UAAU,GAAG,GAAG,CAAC,iBAAwE,CAAC;YAChG,MAAM,QAAQ,GAAG,UAAU,EAAE,QAA+C,CAAC;YAC7E,IAAI,MAAM,GAAwC,SAAS,CAAC;YAC5D,IAAI,QAAQ,EAAE,QAAQ;gBAAE,MAAM,GAAG,UAAU,CAAC;YAC5C,IAAI,QAAQ,EAAE,QAAQ;gBAAE,MAAM,GAAG,UAAU,CAAC;YAE5C,OAAO;gBACL,EAAE,EAAE,WAAW,EAAE,EAAE;gBACnB,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;gBACjE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAc,IAAI,OAAO,CAA6B;gBACjE,OAAO,EAAE,GAAG,CAAC,OAA6B;gBAC1C,IAAI,EAAE,GAAG,CAAC,IAA4B;gBACtC,GAAG,EAAE,GAAG,CAAC,GAAyB;gBAClC,GAAG,EAAE,GAAG,CAAC,GAAyC;gBAClD,OAAO,EAAE,GAAG,CAAC,OAA6C;gBAC1D,MAAM;aACP,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Connector Auth Routes — OAuth and API key management for service connectors.
3
+ *
4
+ * Supports:
5
+ * - API key storage (encrypted at rest via config)
6
+ * - OAuth flow initiation + callback
7
+ * - Connection testing
8
+ * - Status checks
9
+ */
10
+ declare const router: import("express-serve-static-core").Router;
11
+ export default router;
12
+ //# sourceMappingURL=connectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectors.d.ts","sourceRoot":"","sources":["../../../server/routes/connectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAsXxB,eAAe,MAAM,CAAC"}