devchain-cli 0.6.1 → 0.7.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 (169) hide show
  1. package/dist/drizzle/0024_review_tables.sql +71 -0
  2. package/dist/drizzle/0025_reviews_mode_and_nullable_shas.sql +80 -0
  3. package/dist/drizzle/0026_review_comments_edited_at.sql +2 -0
  4. package/dist/drizzle/meta/_journal.json +22 -1
  5. package/dist/server/common/errors/error-types.d.ts +3 -0
  6. package/dist/server/common/errors/error-types.js +7 -1
  7. package/dist/server/common/errors/error-types.js.map +1 -1
  8. package/dist/server/common/validation/path-validation.d.ts +11 -0
  9. package/dist/server/common/validation/path-validation.js +197 -0
  10. package/dist/server/common/validation/path-validation.js.map +1 -0
  11. package/dist/server/modules/chat/dtos/chat.dto.d.ts +13 -13
  12. package/dist/server/modules/core/core.module.js +3 -2
  13. package/dist/server/modules/core/core.module.js.map +1 -1
  14. package/dist/server/modules/core/services/preflight.service.d.ts +1 -3
  15. package/dist/server/modules/core/services/preflight.service.js +2 -28
  16. package/dist/server/modules/core/services/preflight.service.js.map +1 -1
  17. package/dist/server/modules/core/services/provider-mcp-ensure.service.d.ts +26 -0
  18. package/dist/server/modules/core/services/provider-mcp-ensure.service.js +224 -0
  19. package/dist/server/modules/core/services/provider-mcp-ensure.service.js.map +1 -0
  20. package/dist/server/modules/epics/controllers/epics.controller.d.ts +3 -2
  21. package/dist/server/modules/epics/controllers/epics.controller.js +16 -6
  22. package/dist/server/modules/epics/controllers/epics.controller.js.map +1 -1
  23. package/dist/server/modules/events/catalog/epic.created.d.ts +2 -2
  24. package/dist/server/modules/events/catalog/index.d.ts +340 -2
  25. package/dist/server/modules/events/catalog/index.js +12 -0
  26. package/dist/server/modules/events/catalog/index.js.map +1 -1
  27. package/dist/server/modules/events/catalog/review.comment.created.d.ts +69 -0
  28. package/dist/server/modules/events/catalog/review.comment.created.js +30 -0
  29. package/dist/server/modules/events/catalog/review.comment.created.js.map +1 -0
  30. package/dist/server/modules/events/catalog/review.comment.deleted.d.ts +30 -0
  31. package/dist/server/modules/events/catalog/review.comment.deleted.js +17 -0
  32. package/dist/server/modules/events/catalog/review.comment.deleted.js.map +1 -0
  33. package/dist/server/modules/events/catalog/review.comment.resolved.d.ts +30 -0
  34. package/dist/server/modules/events/catalog/review.comment.resolved.js +17 -0
  35. package/dist/server/modules/events/catalog/review.comment.resolved.js.map +1 -0
  36. package/dist/server/modules/events/catalog/review.comment.updated.d.ts +39 -0
  37. package/dist/server/modules/events/catalog/review.comment.updated.js +20 -0
  38. package/dist/server/modules/events/catalog/review.comment.updated.js.map +1 -0
  39. package/dist/server/modules/events/catalog/review.created.d.ts +90 -0
  40. package/dist/server/modules/events/catalog/review.created.js +40 -0
  41. package/dist/server/modules/events/catalog/review.created.js.map +1 -0
  42. package/dist/server/modules/events/catalog/review.updated.d.ts +110 -0
  43. package/dist/server/modules/events/catalog/review.updated.js +35 -0
  44. package/dist/server/modules/events/catalog/review.updated.js.map +1 -0
  45. package/dist/server/modules/events/subscribers/index.js +4 -0
  46. package/dist/server/modules/events/subscribers/index.js.map +1 -1
  47. package/dist/server/modules/events/subscribers/review-broadcaster.subscriber.d.ts +16 -0
  48. package/dist/server/modules/events/subscribers/review-broadcaster.subscriber.js +163 -0
  49. package/dist/server/modules/events/subscribers/review-broadcaster.subscriber.js.map +1 -0
  50. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.d.ts +23 -0
  51. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.js +217 -0
  52. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.js.map +1 -0
  53. package/dist/server/modules/git/controllers/git.controller.d.ts +24 -0
  54. package/dist/server/modules/git/controllers/git.controller.js +230 -0
  55. package/dist/server/modules/git/controllers/git.controller.js.map +1 -0
  56. package/dist/server/modules/git/dtos/git.dto.d.ts +86 -0
  57. package/dist/server/modules/git/dtos/git.dto.js +36 -0
  58. package/dist/server/modules/git/dtos/git.dto.js.map +1 -0
  59. package/dist/server/modules/git/git.module.d.ts +2 -0
  60. package/dist/server/modules/git/git.module.js +25 -0
  61. package/dist/server/modules/git/git.module.js.map +1 -0
  62. package/dist/server/modules/git/services/git.service.d.ts +71 -0
  63. package/dist/server/modules/git/services/git.service.js +550 -0
  64. package/dist/server/modules/git/services/git.service.js.map +1 -0
  65. package/dist/server/modules/mcp/controllers/mcp-http.controller.js +17 -562
  66. package/dist/server/modules/mcp/controllers/mcp-http.controller.js.map +1 -1
  67. package/dist/server/modules/mcp/controllers/mcp-sdk.controller.js +9 -568
  68. package/dist/server/modules/mcp/controllers/mcp-sdk.controller.js.map +1 -1
  69. package/dist/server/modules/mcp/dtos/mcp.dto.d.ts +226 -36
  70. package/dist/server/modules/mcp/dtos/mcp.dto.js +158 -50
  71. package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
  72. package/dist/server/modules/mcp/dtos/schema-registry.d.ts +7 -0
  73. package/dist/server/modules/mcp/dtos/schema-registry.js +56 -0
  74. package/dist/server/modules/mcp/dtos/schema-registry.js.map +1 -0
  75. package/dist/server/modules/mcp/mcp.module.js +2 -0
  76. package/dist/server/modules/mcp/mcp.module.js.map +1 -1
  77. package/dist/server/modules/mcp/services/mcp.service.d.ts +9 -1
  78. package/dist/server/modules/mcp/services/mcp.service.js +702 -33
  79. package/dist/server/modules/mcp/services/mcp.service.js.map +1 -1
  80. package/dist/server/modules/mcp/tool-definitions.d.ts +2438 -0
  81. package/dist/server/modules/mcp/tool-definitions.js +727 -0
  82. package/dist/server/modules/mcp/tool-definitions.js.map +1 -0
  83. package/dist/server/modules/mcp/utils/param-suggestion.d.ts +3 -0
  84. package/dist/server/modules/mcp/utils/param-suggestion.js +95 -0
  85. package/dist/server/modules/mcp/utils/param-suggestion.js.map +1 -0
  86. package/dist/server/modules/providers/controllers/providers.controller.d.ts +7 -6
  87. package/dist/server/modules/providers/controllers/providers.controller.js +12 -107
  88. package/dist/server/modules/providers/controllers/providers.controller.js.map +1 -1
  89. package/dist/server/modules/reviews/controllers/reviews.controller.d.ts +28 -0
  90. package/dist/server/modules/reviews/controllers/reviews.controller.js +369 -0
  91. package/dist/server/modules/reviews/controllers/reviews.controller.js.map +1 -0
  92. package/dist/server/modules/reviews/dtos/review.dto.d.ts +195 -0
  93. package/dist/server/modules/reviews/dtos/review.dto.js +92 -0
  94. package/dist/server/modules/reviews/dtos/review.dto.js.map +1 -0
  95. package/dist/server/modules/reviews/reviews.module.d.ts +2 -0
  96. package/dist/server/modules/reviews/reviews.module.js +27 -0
  97. package/dist/server/modules/reviews/reviews.module.js.map +1 -0
  98. package/dist/server/modules/reviews/services/reviews.service.d.ts +86 -0
  99. package/dist/server/modules/reviews/services/reviews.service.js +464 -0
  100. package/dist/server/modules/reviews/services/reviews.service.js.map +1 -0
  101. package/dist/server/modules/reviews/utils/notification-formatter.d.ts +12 -0
  102. package/dist/server/modules/reviews/utils/notification-formatter.js +60 -0
  103. package/dist/server/modules/reviews/utils/notification-formatter.js.map +1 -0
  104. package/dist/server/modules/sessions/services/sessions.service.d.ts +3 -1
  105. package/dist/server/modules/sessions/services/sessions.service.js +32 -2
  106. package/dist/server/modules/sessions/services/sessions.service.js.map +1 -1
  107. package/dist/server/modules/storage/db/schema.d.ts +697 -0
  108. package/dist/server/modules/storage/db/schema.js +71 -1
  109. package/dist/server/modules/storage/db/schema.js.map +1 -1
  110. package/dist/server/modules/storage/interfaces/storage.interface.d.ts +23 -1
  111. package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
  112. package/dist/server/modules/storage/local/local-storage.service.d.ts +15 -2
  113. package/dist/server/modules/storage/local/local-storage.service.js +396 -7
  114. package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
  115. package/dist/server/modules/storage/models/domain.models.d.ts +62 -0
  116. package/dist/server/templates/claude-codex-advanced-swe.json +139 -0
  117. package/dist/server/templates/claude-codex-advanced.json +82 -82
  118. package/dist/server/templates/claude-opus.json +99 -99
  119. package/dist/server/templates/claude-swe-single.json +105 -0
  120. package/dist/server/templates/simple-codex.json +70 -70
  121. package/dist/server/test-setup.js +45 -0
  122. package/dist/server/test-setup.js.map +1 -1
  123. package/dist/server/tsconfig.tsbuildinfo +1 -1
  124. package/dist/server/ui/assets/ReviewDetailPage-I54h-2L-.js +6 -0
  125. package/dist/server/ui/assets/ReviewsPage-B4ua5hiX.js +19 -0
  126. package/dist/server/ui/assets/index-CqcmnFBh.css +32 -0
  127. package/dist/server/ui/assets/index-JbUMpbg7.js +858 -0
  128. package/dist/server/ui/assets/useReviewSubscription-C0GEsiRw.js +83 -0
  129. package/dist/server/ui/assets/useReviewSubscription-T3uj2-aP.css +1 -0
  130. package/dist/server/ui/index.html +2 -2
  131. package/dist/templates/claude-codex-advanced-swe.json +139 -0
  132. package/dist/templates/claude-codex-advanced.json +82 -82
  133. package/dist/templates/claude-opus.json +99 -99
  134. package/dist/templates/claude-swe-single.json +105 -0
  135. package/dist/templates/simple-codex.json +70 -70
  136. package/package.json +12 -2
  137. package/prebuilds/node-pty/darwin-arm64/pty.node +0 -0
  138. package/prebuilds/node-pty/darwin-arm64/spawn-helper +0 -0
  139. package/prebuilds/node-pty/darwin-x64/pty.node +0 -0
  140. package/prebuilds/node-pty/darwin-x64/spawn-helper +0 -0
  141. package/prebuilds/node-pty/linux-arm64/pty.node +0 -0
  142. package/prebuilds/node-pty/linux-x64/pty.node +0 -0
  143. package/prebuilds/node-pty/win32-arm64/conpty/OpenConsole.exe +0 -0
  144. package/prebuilds/node-pty/win32-arm64/conpty/conpty.dll +0 -0
  145. package/prebuilds/node-pty/win32-arm64/conpty.node +0 -0
  146. package/prebuilds/node-pty/win32-arm64/conpty.pdb +0 -0
  147. package/prebuilds/node-pty/win32-arm64/conpty_console_list.node +0 -0
  148. package/prebuilds/node-pty/win32-arm64/conpty_console_list.pdb +0 -0
  149. package/prebuilds/node-pty/win32-arm64/pty.node +0 -0
  150. package/prebuilds/node-pty/win32-arm64/pty.pdb +0 -0
  151. package/prebuilds/node-pty/win32-arm64/winpty-agent.exe +0 -0
  152. package/prebuilds/node-pty/win32-arm64/winpty-agent.pdb +0 -0
  153. package/prebuilds/node-pty/win32-arm64/winpty.dll +0 -0
  154. package/prebuilds/node-pty/win32-arm64/winpty.pdb +0 -0
  155. package/prebuilds/node-pty/win32-x64/conpty/OpenConsole.exe +0 -0
  156. package/prebuilds/node-pty/win32-x64/conpty/conpty.dll +0 -0
  157. package/prebuilds/node-pty/win32-x64/conpty.node +0 -0
  158. package/prebuilds/node-pty/win32-x64/conpty.pdb +0 -0
  159. package/prebuilds/node-pty/win32-x64/conpty_console_list.node +0 -0
  160. package/prebuilds/node-pty/win32-x64/conpty_console_list.pdb +0 -0
  161. package/prebuilds/node-pty/win32-x64/pty.node +0 -0
  162. package/prebuilds/node-pty/win32-x64/pty.pdb +0 -0
  163. package/prebuilds/node-pty/win32-x64/winpty-agent.exe +0 -0
  164. package/prebuilds/node-pty/win32-x64/winpty-agent.pdb +0 -0
  165. package/prebuilds/node-pty/win32-x64/winpty.dll +0 -0
  166. package/prebuilds/node-pty/win32-x64/winpty.pdb +0 -0
  167. package/scripts/postinstall.js +51 -1
  168. package/dist/server/ui/assets/index-BoDZOB7c.css +0 -32
  169. package/dist/server/ui/assets/index-hB0e02VB.js +0 -735
@@ -17,6 +17,7 @@ const common_1 = require("@nestjs/common");
17
17
  const mcp_service_1 = require("../services/mcp.service");
18
18
  const crypto_1 = require("crypto");
19
19
  const constants_1 = require("../constants");
20
+ const tool_definitions_1 = require("../tool-definitions");
20
21
  const JSONRPC_ERRORS = {
21
22
  PARSE_ERROR: -32700,
22
23
  INVALID_REQUEST: -32600,
@@ -43,6 +44,18 @@ function isJsonRpcRequest(msg) {
43
44
  function isNotification(msg) {
44
45
  return !('id' in msg);
45
46
  }
47
+ function isPlainObject(value) {
48
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
49
+ }
50
+ function getSpreadableErrorData(data) {
51
+ if (data === undefined || data === null) {
52
+ return {};
53
+ }
54
+ if (isPlainObject(data)) {
55
+ return data;
56
+ }
57
+ return { data };
58
+ }
46
59
  let McpHttpController = class McpHttpController {
47
60
  constructor(mcp) {
48
61
  this.mcp = mcp;
@@ -114,6 +127,7 @@ let McpHttpController = class McpHttpController {
114
127
  return makeResult(id, resp.data ?? null);
115
128
  return makeError(id, JSONRPC_ERRORS.INTERNAL_ERROR, resp.error?.message || 'Error', {
116
129
  code: resp.error?.code,
130
+ ...getSpreadableErrorData(resp.error?.data),
117
131
  });
118
132
  }
119
133
  if (req.method === 'tools/call' || req.method === 'tools.call') {
@@ -131,6 +145,7 @@ let McpHttpController = class McpHttpController {
131
145
  });
132
146
  return makeError(id, JSONRPC_ERRORS.INTERNAL_ERROR, resp.error?.message || 'Error', {
133
147
  code: resp.error?.code,
148
+ ...getSpreadableErrorData(resp.error?.data),
134
149
  });
135
150
  }
136
151
  const resp = await this.mcp.handleToolCall(req.method, req.params ?? {});
@@ -138,6 +153,7 @@ let McpHttpController = class McpHttpController {
138
153
  return makeResult(id, resp.data ?? null);
139
154
  return makeError(id, JSONRPC_ERRORS.INTERNAL_ERROR, resp.error?.message || 'Error', {
140
155
  code: resp.error?.code,
156
+ ...getSpreadableErrorData(resp.error?.data),
141
157
  });
142
158
  }
143
159
  catch (err) {
@@ -146,568 +162,7 @@ let McpHttpController = class McpHttpController {
146
162
  }
147
163
  }
148
164
  listTools() {
149
- const tools = [
150
- {
151
- name: 'devchain_list_sessions',
152
- description: 'List active sessions for discovery. This is the bootstrap tool that requires no sessionId - use it to discover valid session IDs for other MCP calls.',
153
- inputSchema: {
154
- type: 'object',
155
- properties: {},
156
- },
157
- },
158
- {
159
- name: 'devchain_register_guest',
160
- description: 'Register as a guest agent to join the DevChain system. Use this when you are an external AI agent running in a tmux session and want to appear in the Chat page alongside other agents. Returns a guestId that must be used as sessionId for all subsequent MCP tool calls. Your project is auto-detected from your tmux working directory.',
161
- inputSchema: {
162
- type: 'object',
163
- required: ['name', 'tmuxSessionId'],
164
- properties: {
165
- name: {
166
- type: 'string',
167
- description: 'Display name for the guest agent (must be unique within the project)',
168
- },
169
- tmuxSessionId: {
170
- type: 'string',
171
- description: 'The tmux session ID where the guest is running',
172
- },
173
- description: {
174
- type: 'string',
175
- description: 'Optional description of the guest agent',
176
- },
177
- },
178
- },
179
- },
180
- {
181
- name: 'devchain_list_documents',
182
- description: 'List all documents for the project resolved from the session.',
183
- inputSchema: {
184
- type: 'object',
185
- required: ['sessionId'],
186
- properties: {
187
- sessionId: {
188
- type: 'string',
189
- description: 'Session ID (full UUID or 8+ char prefix)',
190
- },
191
- tags: {
192
- type: 'array',
193
- items: { type: 'string' },
194
- description: 'Filter by tags (all must match)',
195
- },
196
- q: { type: 'string', description: 'Search query for title/content' },
197
- limit: { type: 'number', description: 'Max results (default: 100)' },
198
- offset: { type: 'number', description: 'Pagination offset (default: 0)' },
199
- },
200
- },
201
- },
202
- {
203
- name: 'devchain_activity_start',
204
- description: 'Start an activity for an agent; posts a system start message and begins a running timer (DM by default).',
205
- inputSchema: {
206
- type: 'object',
207
- required: ['sessionId', 'title'],
208
- properties: {
209
- sessionId: {
210
- type: 'string',
211
- description: 'Session ID (full UUID or 8+ char prefix)',
212
- },
213
- title: { type: 'string', description: 'Activity title (<=256 chars)' },
214
- threadId: { type: 'string', description: 'Target thread UUID (optional)' },
215
- announce: { type: 'boolean', description: 'Whether to post the start system message' },
216
- },
217
- },
218
- },
219
- {
220
- name: 'devchain_activity_finish',
221
- description: 'Finish the latest running activity for an agent; optionally posts a finish system message.',
222
- inputSchema: {
223
- type: 'object',
224
- required: ['sessionId'],
225
- properties: {
226
- sessionId: {
227
- type: 'string',
228
- description: 'Session ID (full UUID or 8+ char prefix)',
229
- },
230
- threadId: { type: 'string', description: 'Target thread UUID (optional)' },
231
- message: { type: 'string', description: 'Optional finish message (<=1000 chars)' },
232
- status: {
233
- type: 'string',
234
- enum: ['success', 'failed', 'canceled'],
235
- description: 'Final status (default success)',
236
- },
237
- },
238
- },
239
- },
240
- {
241
- name: 'devchain_get_document',
242
- description: 'Get a single document by ID or slug, with optional link resolution',
243
- inputSchema: {
244
- type: 'object',
245
- properties: {
246
- id: { type: 'string', description: 'Document UUID' },
247
- slug: { type: 'string', description: 'Document slug (requires projectId)' },
248
- projectId: { type: 'string', description: 'Project ID when using slug' },
249
- includeLinks: {
250
- type: 'string',
251
- enum: ['none', 'meta', 'inline'],
252
- description: 'Link resolution: none (no links), meta (link metadata), inline (full content)',
253
- },
254
- maxDepth: {
255
- type: 'number',
256
- description: 'Max depth for inline resolution (default: 1)',
257
- },
258
- maxBytes: {
259
- type: 'number',
260
- description: 'Max bytes for inline content (default: 64KB)',
261
- },
262
- },
263
- },
264
- },
265
- {
266
- name: 'devchain_create_document',
267
- description: 'Create a new markdown document in the project resolved from the session',
268
- inputSchema: {
269
- type: 'object',
270
- required: ['sessionId', 'title', 'contentMd'],
271
- properties: {
272
- sessionId: {
273
- type: 'string',
274
- description: 'Session ID (full UUID or 8+ char prefix)',
275
- },
276
- title: { type: 'string', description: 'Document title' },
277
- contentMd: { type: 'string', description: 'Markdown content' },
278
- tags: { type: 'array', items: { type: 'string' }, description: 'Document tags' },
279
- },
280
- },
281
- },
282
- {
283
- name: 'devchain_update_document',
284
- description: 'Update an existing document',
285
- inputSchema: {
286
- type: 'object',
287
- required: ['id'],
288
- properties: {
289
- id: { type: 'string', description: 'Document UUID' },
290
- title: { type: 'string', description: 'New title' },
291
- slug: { type: 'string', description: 'New slug' },
292
- contentMd: { type: 'string', description: 'New markdown content' },
293
- tags: { type: 'array', items: { type: 'string' }, description: 'New tags' },
294
- archived: { type: 'boolean', description: 'Archive status' },
295
- version: { type: 'number', description: 'Version for optimistic locking' },
296
- },
297
- },
298
- },
299
- {
300
- name: 'devchain_list_prompts',
301
- description: 'List prompts for the project resolved from the session',
302
- inputSchema: {
303
- type: 'object',
304
- required: ['sessionId'],
305
- properties: {
306
- sessionId: {
307
- type: 'string',
308
- description: 'Session ID (full UUID or 8+ char prefix)',
309
- },
310
- tags: { type: 'array', items: { type: 'string' }, description: 'Filter by tags' },
311
- q: { type: 'string', description: 'Search query' },
312
- },
313
- },
314
- },
315
- {
316
- name: 'devchain_get_prompt',
317
- description: 'Get a specific prompt by ID or by (name + sessionId)',
318
- inputSchema: {
319
- type: 'object',
320
- properties: {
321
- id: { type: 'string', description: 'Prompt UUID' },
322
- name: { type: 'string', description: 'Prompt name/title' },
323
- version: { type: 'number', description: 'Specific version number' },
324
- sessionId: {
325
- type: 'string',
326
- description: 'Session ID (full UUID or 8+ char prefix) required when querying by name',
327
- },
328
- },
329
- },
330
- },
331
- {
332
- name: 'devchain_list_agents',
333
- description: 'List agents for the project resolved from the session',
334
- inputSchema: {
335
- type: 'object',
336
- required: ['sessionId'],
337
- properties: {
338
- sessionId: {
339
- type: 'string',
340
- description: 'Session ID (full UUID or 8+ char prefix)',
341
- },
342
- limit: { type: 'number', description: 'Max results (default: 100)' },
343
- offset: { type: 'number', description: 'Pagination offset (default: 0)' },
344
- q: {
345
- type: 'string',
346
- description: 'Optional case-insensitive substring filter on agent name',
347
- },
348
- },
349
- },
350
- },
351
- {
352
- name: 'devchain_get_agent_by_name',
353
- description: 'Fetch a single agent by name for the project resolved from the session',
354
- inputSchema: {
355
- type: 'object',
356
- required: ['sessionId', 'name'],
357
- properties: {
358
- sessionId: {
359
- type: 'string',
360
- description: 'Session ID (full UUID or 8+ char prefix)',
361
- },
362
- name: {
363
- type: 'string',
364
- description: 'Agent name to look up (case-insensitive match)',
365
- },
366
- },
367
- },
368
- },
369
- {
370
- name: 'devchain_list_statuses',
371
- description: 'List project statuses resolved from the session',
372
- inputSchema: {
373
- type: 'object',
374
- required: ['sessionId'],
375
- properties: {
376
- sessionId: {
377
- type: 'string',
378
- description: 'Session ID (full UUID or 8+ char prefix)',
379
- },
380
- },
381
- },
382
- },
383
- {
384
- name: 'devchain_list_epics',
385
- description: 'List epics for the project resolved from the session with optional filters',
386
- inputSchema: {
387
- type: 'object',
388
- required: ['sessionId'],
389
- properties: {
390
- sessionId: {
391
- type: 'string',
392
- description: 'Session ID (full UUID or 8+ char prefix)',
393
- },
394
- statusName: {
395
- type: 'string',
396
- description: 'Optional status name filter (case-insensitive)',
397
- },
398
- limit: { type: 'number', description: 'Max results (default: 100)' },
399
- offset: { type: 'number', description: 'Pagination offset (default: 0)' },
400
- q: {
401
- type: 'string',
402
- description: 'Optional search query applied to epic titles and descriptions',
403
- },
404
- },
405
- },
406
- },
407
- {
408
- name: 'devchain_list_assigned_epics_tasks',
409
- description: 'List epics assigned to the specified agent within the project resolved from the session',
410
- inputSchema: {
411
- type: 'object',
412
- required: ['sessionId', 'agentName'],
413
- properties: {
414
- sessionId: {
415
- type: 'string',
416
- description: 'Session ID (full UUID or 8+ char prefix)',
417
- },
418
- agentName: { type: 'string', description: 'Agent name to match (case-insensitive)' },
419
- limit: { type: 'number', description: 'Max results (default: 100)' },
420
- offset: { type: 'number', description: 'Pagination offset (default: 0)' },
421
- },
422
- },
423
- },
424
- {
425
- name: 'devchain_create_epic',
426
- description: 'Create a new epic within the project resolved from the session',
427
- inputSchema: {
428
- type: 'object',
429
- required: ['sessionId', 'title'],
430
- properties: {
431
- sessionId: {
432
- type: 'string',
433
- description: 'Session ID (full UUID or 8+ char prefix)',
434
- },
435
- title: { type: 'string', description: 'Epic title' },
436
- description: { type: 'string', description: 'Optional epic description' },
437
- statusName: {
438
- type: 'string',
439
- description: 'Optional status name (case-insensitive)',
440
- },
441
- tags: {
442
- type: 'array',
443
- items: { type: 'string' },
444
- description: 'Optional list of tags to assign to the epic',
445
- },
446
- agentName: {
447
- type: 'string',
448
- description: 'Optional agent name to assign (case-insensitive)',
449
- },
450
- parentId: {
451
- type: 'string',
452
- description: 'Optional parent epic UUID to nest this epic under',
453
- },
454
- },
455
- },
456
- },
457
- {
458
- name: 'devchain_get_epic_by_id',
459
- description: 'Fetch a single epic, including comments and related hierarchy details',
460
- inputSchema: {
461
- type: 'object',
462
- required: ['sessionId', 'id'],
463
- properties: {
464
- sessionId: {
465
- type: 'string',
466
- description: 'Session ID (full UUID or 8+ char prefix)',
467
- },
468
- id: { type: 'string', description: 'Epic UUID' },
469
- },
470
- },
471
- },
472
- {
473
- name: 'devchain_add_epic_comment',
474
- description: 'Add a comment to the specified epic within the project resolved from the session. Author is derived from session agent.',
475
- inputSchema: {
476
- type: 'object',
477
- required: ['sessionId', 'epicId', 'content'],
478
- properties: {
479
- sessionId: {
480
- type: 'string',
481
- description: 'Session ID (full UUID or 8+ char prefix)',
482
- },
483
- epicId: { type: 'string', description: 'Epic UUID' },
484
- content: { type: 'string', description: 'Comment body content' },
485
- },
486
- },
487
- },
488
- {
489
- name: 'devchain_update_epic',
490
- description: 'Update an epic with flexible field updates including status (by name), assignment (by agent name or clear), parent hierarchy, and tags. Uses optimistic locking via version.',
491
- inputSchema: {
492
- type: 'object',
493
- required: ['sessionId', 'id', 'version'],
494
- properties: {
495
- sessionId: {
496
- type: 'string',
497
- description: 'Session ID (full UUID or 8+ char prefix)',
498
- },
499
- id: { type: 'string', description: 'Epic UUID' },
500
- version: { type: 'number', description: 'Current version for optimistic locking' },
501
- title: { type: 'string', description: 'New epic title' },
502
- description: { type: 'string', description: 'New epic description' },
503
- statusName: {
504
- type: 'string',
505
- description: 'Status name (case-insensitive exact match)',
506
- },
507
- assignment: {
508
- type: 'object',
509
- description: 'Assignment update: either { agentName: string } to assign or { clear: true } to unassign',
510
- oneOf: [
511
- {
512
- type: 'object',
513
- required: ['agentName'],
514
- properties: {
515
- agentName: {
516
- type: 'string',
517
- description: 'Agent name (case-insensitive exact match)',
518
- },
519
- },
520
- },
521
- {
522
- type: 'object',
523
- required: ['clear'],
524
- properties: {
525
- clear: {
526
- type: 'boolean',
527
- const: true,
528
- description: 'Set to true to clear assignment',
529
- },
530
- },
531
- },
532
- ],
533
- },
534
- parentId: {
535
- type: 'string',
536
- description: 'Parent epic UUID (mutually exclusive with clearParent)',
537
- },
538
- clearParent: {
539
- type: 'boolean',
540
- description: 'Set to true to remove parent (mutually exclusive with parentId)',
541
- },
542
- setTags: {
543
- type: 'array',
544
- items: { type: 'string' },
545
- description: 'Replace all tags with this array',
546
- },
547
- addTags: { type: 'array', items: { type: 'string' }, description: 'Tags to add' },
548
- removeTags: { type: 'array', items: { type: 'string' }, description: 'Tags to remove' },
549
- },
550
- },
551
- },
552
- {
553
- name: 'devchain_create_record',
554
- description: 'Create a new record (generic data storage for epics)',
555
- inputSchema: {
556
- type: 'object',
557
- required: ['epicId', 'type', 'data'],
558
- properties: {
559
- epicId: { type: 'string', description: 'Epic UUID this record belongs to' },
560
- type: { type: 'string', description: 'Record type identifier' },
561
- data: { type: 'object', description: 'Arbitrary JSON data' },
562
- tags: { type: 'array', items: { type: 'string' }, description: 'Record tags' },
563
- },
564
- },
565
- },
566
- {
567
- name: 'devchain_update_record',
568
- description: 'Update an existing record',
569
- inputSchema: {
570
- type: 'object',
571
- required: ['id', 'version'],
572
- properties: {
573
- id: { type: 'string', description: 'Record UUID' },
574
- data: { type: 'object', description: 'New data (merged)' },
575
- type: { type: 'string', description: 'New type' },
576
- tags: { type: 'array', items: { type: 'string' }, description: 'New tags' },
577
- version: { type: 'number', description: 'Current version for optimistic locking' },
578
- },
579
- },
580
- },
581
- {
582
- name: 'devchain_get_record',
583
- description: 'Get a record by ID',
584
- inputSchema: {
585
- type: 'object',
586
- required: ['id'],
587
- properties: { id: { type: 'string', description: 'Record UUID' } },
588
- },
589
- },
590
- {
591
- name: 'devchain_list_records',
592
- description: 'List records for an epic with optional filtering',
593
- inputSchema: {
594
- type: 'object',
595
- required: ['epicId'],
596
- properties: {
597
- epicId: { type: 'string', description: 'Epic UUID' },
598
- type: { type: 'string', description: 'Filter by record type' },
599
- tags: { type: 'array', items: { type: 'string' }, description: 'Filter by tags' },
600
- limit: { type: 'number', description: 'Max results' },
601
- offset: { type: 'number', description: 'Pagination offset' },
602
- },
603
- },
604
- },
605
- {
606
- name: 'devchain_add_tags',
607
- description: 'Add tags to a record',
608
- inputSchema: {
609
- type: 'object',
610
- required: ['id', 'tags'],
611
- properties: {
612
- id: { type: 'string', description: 'Record UUID' },
613
- tags: {
614
- type: 'array',
615
- items: { type: 'string' },
616
- minItems: 1,
617
- description: 'Tags to add',
618
- },
619
- },
620
- },
621
- },
622
- {
623
- name: 'devchain_remove_tags',
624
- description: 'Remove tags from a record',
625
- inputSchema: {
626
- type: 'object',
627
- required: ['id', 'tags'],
628
- properties: {
629
- id: { type: 'string', description: 'Record UUID' },
630
- tags: {
631
- type: 'array',
632
- items: { type: 'string' },
633
- minItems: 1,
634
- description: 'Tags to remove',
635
- },
636
- },
637
- },
638
- },
639
- {
640
- name: 'devchain_send_message',
641
- description: 'Send a chat message. Sender is derived from session agent. Provide recipientAgentNames to create a new agent-initiated group.',
642
- inputSchema: {
643
- type: 'object',
644
- required: ['sessionId', 'message'],
645
- properties: {
646
- sessionId: {
647
- type: 'string',
648
- description: 'Session ID (full UUID or 8+ char prefix)',
649
- },
650
- recipientAgentNames: {
651
- type: 'array',
652
- items: { type: 'string' },
653
- description: 'Agent names (case-insensitive) to receive the message.',
654
- },
655
- recipient: {
656
- type: 'string',
657
- enum: ['user', 'agents'],
658
- description: 'Set to "user" to DM the user without a threadId.',
659
- },
660
- message: { type: 'string', description: 'Message content to deliver.' },
661
- },
662
- },
663
- },
664
- {
665
- name: 'devchain_chat_ack',
666
- description: 'Mark a chat message as read for an agent and emit a message.read event.',
667
- inputSchema: {
668
- type: 'object',
669
- required: ['sessionId', 'thread_id', 'message_id'],
670
- properties: {
671
- sessionId: {
672
- type: 'string',
673
- description: 'Session ID (full UUID or 8+ char prefix)',
674
- },
675
- thread_id: { type: 'string', description: 'Chat thread UUID.' },
676
- message_id: { type: 'string', description: 'Chat message UUID to acknowledge.' },
677
- },
678
- },
679
- },
680
- {
681
- name: 'devchain_chat_read_history',
682
- description: 'Fetch recent messages for a chat thread so agents can catch up after an invite.',
683
- inputSchema: {
684
- type: 'object',
685
- required: ['thread_id'],
686
- properties: {
687
- thread_id: { type: 'string', description: 'Chat thread UUID.' },
688
- limit: { type: 'number', description: 'Max messages to return (default 50, max 200).' },
689
- since: {
690
- type: 'string',
691
- description: 'ISO timestamp; only messages after this time are returned.',
692
- },
693
- exclude_system: {
694
- type: 'boolean',
695
- description: 'Exclude system messages. Defaults to true when omitted to show only user/agent authored messages.',
696
- },
697
- },
698
- },
699
- },
700
- {
701
- name: 'devchain_chat_list_members',
702
- description: 'List members of a chat thread along with their online status.',
703
- inputSchema: {
704
- type: 'object',
705
- required: ['thread_id'],
706
- properties: { thread_id: { type: 'string', description: 'Chat thread UUID.' } },
707
- },
708
- },
709
- ];
710
- return (0, constants_1.filterHiddenTools)(tools);
165
+ return (0, constants_1.filterHiddenTools)((0, tool_definitions_1.getToolDefinitions)());
711
166
  }
712
167
  async handleSseStream(request, reply, sessionId, _lastEventId) {
713
168
  reply.raw.writeHead(200, {