@yinuo-ngm/mcp-server 0.1.1 → 0.1.3

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 (221) hide show
  1. package/README.md +225 -188
  2. package/lib/audit/audit-event.d.ts +14 -0
  3. package/lib/audit/audit-event.js +2 -0
  4. package/lib/audit/audit-log.service.d.ts +7 -0
  5. package/lib/audit/audit-log.service.js +187 -0
  6. package/lib/audit/redact.d.ts +3 -0
  7. package/lib/audit/redact.js +28 -0
  8. package/lib/catalog/capabilities/blocked-local-actions.d.ts +1 -0
  9. package/lib/catalog/capabilities/blocked-local-actions.js +18 -0
  10. package/lib/catalog/capabilities/frontend-standard.d.ts +2 -0
  11. package/lib/catalog/capabilities/frontend-standard.js +36 -0
  12. package/lib/catalog/capabilities/hub-v2.d.ts +2 -0
  13. package/lib/catalog/capabilities/hub-v2.js +34 -0
  14. package/lib/catalog/capabilities/nginx.d.ts +2 -0
  15. package/lib/catalog/capabilities/nginx.js +23 -0
  16. package/lib/catalog/capabilities/project.d.ts +2 -0
  17. package/lib/catalog/capabilities/project.js +23 -0
  18. package/lib/catalog/capabilities/router.d.ts +2 -0
  19. package/lib/catalog/capabilities/router.js +11 -0
  20. package/lib/catalog/capabilities/runtime.d.ts +2 -0
  21. package/lib/catalog/capabilities/runtime.js +17 -0
  22. package/lib/catalog/capabilities/workspace.d.ts +2 -0
  23. package/lib/catalog/capabilities/workspace.js +23 -0
  24. package/lib/catalog/helpers.d.ts +3 -0
  25. package/lib/catalog/helpers.js +42 -0
  26. package/lib/catalog/index.d.ts +4 -0
  27. package/lib/catalog/index.js +23 -0
  28. package/lib/catalog/tools/frontend-standard.d.ts +2 -0
  29. package/lib/catalog/tools/frontend-standard.js +166 -0
  30. package/lib/catalog/tools/hub-v2-api.d.ts +2 -0
  31. package/lib/catalog/tools/hub-v2-api.js +124 -0
  32. package/lib/catalog/tools/hub-v2-docs.d.ts +2 -0
  33. package/lib/catalog/tools/hub-v2-docs.js +40 -0
  34. package/lib/catalog/tools/nginx.d.ts +2 -0
  35. package/lib/catalog/tools/nginx.js +96 -0
  36. package/lib/catalog/tools/project.d.ts +2 -0
  37. package/lib/catalog/tools/project.js +138 -0
  38. package/lib/catalog/tools/router.d.ts +2 -0
  39. package/lib/catalog/tools/router.js +26 -0
  40. package/lib/catalog/tools/runtime.d.ts +2 -0
  41. package/lib/catalog/tools/runtime.js +47 -0
  42. package/lib/catalog/tools/workspace.d.ts +2 -0
  43. package/lib/catalog/tools/workspace.js +75 -0
  44. package/lib/catalog/types.d.ts +15 -0
  45. package/lib/catalog/types.js +2 -0
  46. package/lib/context/create-tool-context.js +11 -10
  47. package/lib/context/local-server-client.d.ts +2 -0
  48. package/lib/context/local-server-client.js +174 -0
  49. package/lib/context/tool-context.d.ts +36 -0
  50. package/lib/doctor.d.ts +8 -0
  51. package/lib/doctor.js +221 -0
  52. package/lib/errors/error-codes.d.ts +12 -0
  53. package/lib/errors/error-codes.js +14 -0
  54. package/lib/errors/mcp-tool-error.d.ts +8 -0
  55. package/lib/errors/mcp-tool-error.js +14 -0
  56. package/lib/filesystem/project-files.d.ts +18 -0
  57. package/lib/filesystem/project-files.js +112 -0
  58. package/lib/git/local-git-read-service.d.ts +2 -0
  59. package/lib/git/local-git-read-service.js +96 -0
  60. package/lib/index.d.ts +1 -0
  61. package/lib/index.js +4 -0
  62. package/lib/policy/assert-tool-policy.js +10 -1
  63. package/lib/register-tools.js +70 -9
  64. package/lib/registry/tool-names.d.ts +95 -0
  65. package/lib/registry/tool-names.js +97 -0
  66. package/lib/services/path-guard.service.d.ts +4 -0
  67. package/lib/services/path-guard.service.js +75 -0
  68. package/lib/services/permission.service.d.ts +5 -0
  69. package/lib/services/permission.service.js +38 -0
  70. package/lib/services/project-resolver.service.d.ts +32 -0
  71. package/lib/services/project-resolver.service.js +95 -0
  72. package/lib/standard/frontend-standard.default.d.ts +2 -0
  73. package/lib/standard/frontend-standard.default.js +51 -0
  74. package/lib/standard/frontend-standard.schema.d.ts +196 -0
  75. package/lib/standard/frontend-standard.schema.js +61 -0
  76. package/lib/standard/frontend-standard.service.d.ts +79 -0
  77. package/lib/standard/frontend-standard.service.js +115 -0
  78. package/lib/standard/project-scan.d.ts +9 -0
  79. package/lib/standard/project-scan.js +91 -0
  80. package/lib/standard/validators/angular-structure.validator.d.ts +4 -0
  81. package/lib/standard/validators/angular-structure.validator.js +75 -0
  82. package/lib/standard/validators/component.validator.d.ts +4 -0
  83. package/lib/standard/validators/component.validator.js +94 -0
  84. package/lib/standard/validators/git.validator.d.ts +8 -0
  85. package/lib/standard/validators/git.validator.js +32 -0
  86. package/lib/standard/validators/review.validator.d.ts +15 -0
  87. package/lib/standard/validators/review.validator.js +67 -0
  88. package/lib/standard/validators/test.validator.d.ts +19 -0
  89. package/lib/standard/validators/test.validator.js +89 -0
  90. package/lib/tool-catalog.d.ts +2 -0
  91. package/lib/tool-catalog.js +6 -0
  92. package/lib/tools/angular/angular-standard.tools.d.ts +2 -0
  93. package/lib/tools/angular/angular-standard.tools.js +53 -0
  94. package/lib/tools/angular/index.d.ts +1 -0
  95. package/lib/tools/angular/index.js +5 -0
  96. package/lib/tools/capability.tools.d.ts +2 -0
  97. package/lib/tools/capability.tools.js +205 -0
  98. package/lib/tools/controlled/index.d.ts +2 -0
  99. package/lib/tools/controlled/index.js +13 -0
  100. package/lib/tools/controlled/local-server.d.ts +6 -0
  101. package/lib/tools/controlled/local-server.js +17 -0
  102. package/lib/tools/controlled/operation-policy.d.ts +22 -0
  103. package/lib/tools/controlled/operation-policy.js +50 -0
  104. package/lib/tools/controlled/operation-result.d.ts +30 -0
  105. package/lib/tools/controlled/operation-result.js +33 -0
  106. package/lib/tools/controlled/schemas.d.ts +159 -0
  107. package/lib/tools/controlled/schemas.js +49 -0
  108. package/lib/tools/controlled.tools.d.ts +1 -0
  109. package/lib/tools/controlled.tools.js +5 -0
  110. package/lib/tools/file-write.tools.d.ts +2 -0
  111. package/lib/tools/file-write.tools.js +70 -0
  112. package/lib/tools/git.tools.js +109 -8
  113. package/lib/tools/hub-v2/client.d.ts +20 -0
  114. package/lib/tools/hub-v2/client.js +112 -0
  115. package/lib/tools/hub-v2/config/config-paths.d.ts +2 -0
  116. package/lib/tools/hub-v2/config/config-paths.js +17 -0
  117. package/lib/tools/hub-v2/config/env.d.ts +1 -0
  118. package/lib/tools/hub-v2/config/env.js +12 -0
  119. package/lib/tools/hub-v2/config/index.d.ts +8 -0
  120. package/lib/tools/hub-v2/config/index.js +18 -0
  121. package/lib/tools/hub-v2/config/jsonc.d.ts +5 -0
  122. package/lib/tools/hub-v2/config/jsonc.js +86 -0
  123. package/lib/tools/hub-v2/config/load-config.d.ts +18 -0
  124. package/lib/tools/hub-v2/config/load-config.js +93 -0
  125. package/lib/tools/hub-v2/config/project-selector.d.ts +5 -0
  126. package/lib/tools/hub-v2/config/project-selector.js +92 -0
  127. package/lib/tools/hub-v2/config/resolve-context.d.ts +13 -0
  128. package/lib/tools/hub-v2/config/resolve-context.js +33 -0
  129. package/lib/tools/hub-v2/docs.tools.d.ts +2 -0
  130. package/lib/tools/hub-v2/docs.tools.js +215 -0
  131. package/lib/tools/hub-v2/errors.d.ts +8 -0
  132. package/lib/tools/hub-v2/errors.js +27 -0
  133. package/lib/tools/hub-v2/index.d.ts +2 -0
  134. package/lib/tools/hub-v2/index.js +19 -0
  135. package/lib/tools/hub-v2/issues-workflow.tools.d.ts +2 -0
  136. package/lib/tools/hub-v2/issues-workflow.tools.js +199 -0
  137. package/lib/tools/hub-v2/issues.tools.d.ts +2 -0
  138. package/lib/tools/hub-v2/issues.tools.js +244 -0
  139. package/lib/tools/hub-v2/projects.tools.d.ts +2 -0
  140. package/lib/tools/hub-v2/projects.tools.js +41 -0
  141. package/lib/tools/hub-v2/raw.d.ts +8 -0
  142. package/lib/tools/hub-v2/raw.js +33 -0
  143. package/lib/tools/hub-v2/rd.tools.d.ts +2 -0
  144. package/lib/tools/hub-v2/rd.tools.js +361 -0
  145. package/lib/tools/hub-v2/schemas.d.ts +1182 -0
  146. package/lib/tools/hub-v2/schemas.js +318 -0
  147. package/lib/tools/hub-v2/upload.tools.d.ts +2 -0
  148. package/lib/tools/hub-v2/upload.tools.js +198 -0
  149. package/lib/tools/index.d.ts +3 -0
  150. package/lib/tools/index.js +24 -0
  151. package/lib/tools/log.tools.js +33 -6
  152. package/lib/tools/nginx/index.d.ts +1 -0
  153. package/lib/tools/nginx/index.js +5 -0
  154. package/lib/tools/nginx/nginx-control.tools.d.ts +2 -0
  155. package/lib/tools/nginx/nginx-control.tools.js +133 -0
  156. package/lib/tools/nginx/nginx-proxy.d.ts +24 -0
  157. package/lib/tools/nginx/nginx-proxy.js +154 -0
  158. package/lib/tools/nginx.tools.d.ts +2 -0
  159. package/lib/tools/nginx.tools.js +111 -0
  160. package/lib/tools/project/index.d.ts +2 -0
  161. package/lib/tools/project/index.js +7 -0
  162. package/lib/tools/project/launch-status.d.ts +10 -0
  163. package/lib/tools/project/launch-status.js +78 -0
  164. package/lib/tools/project/local-diagnostics.d.ts +19 -0
  165. package/lib/tools/project/local-diagnostics.js +97 -0
  166. package/lib/tools/project/observe-redaction.d.ts +3 -0
  167. package/lib/tools/project/observe-redaction.js +25 -0
  168. package/lib/tools/project/observe-runtime.d.ts +72 -0
  169. package/lib/tools/project/observe-runtime.js +147 -0
  170. package/lib/tools/project/project-control.tools.d.ts +2 -0
  171. package/lib/tools/project/project-control.tools.js +216 -0
  172. package/lib/tools/project/project-observe.tools.d.ts +2 -0
  173. package/lib/tools/project/project-observe.tools.js +191 -0
  174. package/lib/tools/project/runtime-config.d.ts +7 -0
  175. package/lib/tools/project/runtime-config.js +50 -0
  176. package/lib/tools/project-observe.tools.d.ts +1 -0
  177. package/lib/tools/project-observe.tools.js +5 -0
  178. package/lib/tools/project.tools.d.ts +8 -0
  179. package/lib/tools/project.tools.js +97 -6
  180. package/lib/tools/proxy.tools.js +4 -4
  181. package/lib/tools/review/index.d.ts +1 -0
  182. package/lib/tools/review/index.js +5 -0
  183. package/lib/tools/review/review.tools.d.ts +2 -0
  184. package/lib/tools/review/review.tools.js +152 -0
  185. package/lib/tools/runtime/index.d.ts +1 -0
  186. package/lib/tools/runtime/index.js +5 -0
  187. package/lib/tools/runtime/runtime-control.tools.d.ts +2 -0
  188. package/lib/tools/runtime/runtime-control.tools.js +89 -0
  189. package/lib/tools/runtime.tools.js +41 -4
  190. package/lib/tools/standard/index.d.ts +1 -0
  191. package/lib/tools/standard/index.js +5 -0
  192. package/lib/tools/standard/standard.tools.d.ts +2 -0
  193. package/lib/tools/standard/standard.tools.js +91 -0
  194. package/lib/tools/task.tools.js +44 -9
  195. package/lib/tools/test/index.d.ts +1 -0
  196. package/lib/tools/test/index.js +5 -0
  197. package/lib/tools/test/test-standard.tools.d.ts +2 -0
  198. package/lib/tools/test/test-standard.tools.js +51 -0
  199. package/lib/tools/tool-catalog.d.ts +2 -0
  200. package/lib/tools/tool-catalog.js +7 -0
  201. package/lib/tools/workflow/frontend-workflow.tools.d.ts +2 -0
  202. package/lib/tools/workflow/frontend-workflow.tools.js +364 -0
  203. package/lib/tools/workflow/index.d.ts +1 -0
  204. package/lib/tools/workflow/index.js +5 -0
  205. package/lib/tools/workspace-package.d.ts +22 -0
  206. package/lib/tools/workspace-package.js +130 -0
  207. package/lib/tools/workspace.tools.d.ts +7 -0
  208. package/lib/tools/workspace.tools.js +336 -0
  209. package/lib/utils/errors.d.ts +5 -0
  210. package/lib/utils/errors.js +17 -0
  211. package/lib/utils/result.d.ts +20 -2
  212. package/lib/utils/result.js +108 -3
  213. package/lib/workflow/frontend-task.schema.d.ts +83 -0
  214. package/lib/workflow/frontend-task.schema.js +25 -0
  215. package/lib/workflow/frontend-task.service.d.ts +57 -0
  216. package/lib/workflow/frontend-task.service.js +195 -0
  217. package/lib/workflow/workflow-status.d.ts +2 -0
  218. package/lib/workflow/workflow-status.js +14 -0
  219. package/lib/workflow/workflow-transition.d.ts +9 -0
  220. package/lib/workflow/workflow-transition.js +38 -0
  221. package/package.json +10 -4
@@ -0,0 +1,318 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rdUpdateSchema = exports.rdCloseSchema = exports.rdCompleteSchema = exports.rdBlockSchema = exports.rdSimpleWriteSchema = exports.rdUpdateProgressSchema = exports.rdStageTaskCreateSchema = exports.rdStageTasksListSchema = exports.rdAdvanceStageSchema = exports.rdCreateSchema = exports.rdUploadRawSchema = exports.rdReadDetailSchema = exports.rdGetSchema = exports.rdListSchema = exports.fileUploadSchema = exports.markdownImageUploadSchema = exports.issueUpdateSchema = exports.issueParticipantRemoveSchema = exports.issueBranchCompleteSchema = exports.issueBranchActionSchema = exports.issueBranchStartMineSchema = exports.issueBranchCreateSchema = exports.issueParticipantAddSchema = exports.issueCloseSchema = exports.issueReopenSchema = exports.issueResolveSchema = exports.issueSimpleWriteSchema = exports.issueAssignSchema = exports.issueCommentSchema = exports.issueCreateSchema = exports.issueUploadRawSchema = exports.issueAttachmentRawSchema = exports.issueReadDetailSchema = exports.issueGetSchema = exports.issuesListSchema = exports.docsPublishSchema = exports.docsUpdateSchema = exports.docsCreateSchema = exports.docsGetBySlugSchema = exports.docsGetSchema = exports.docsListSchema = exports.pagingSchema = exports.projectMembersListSchema = exports.projectSelectorSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.projectSelectorSchema = zod_1.z.object({
6
+ project: zod_1.z.string().trim().min(1).optional(),
7
+ projectKey: zod_1.z.string().trim().min(1).optional(),
8
+ }).strict();
9
+ exports.projectMembersListSchema = exports.projectSelectorSchema;
10
+ exports.pagingSchema = zod_1.z.object({
11
+ page: zod_1.z.number().int().min(1).optional(),
12
+ pageSize: zod_1.z.number().int().min(1).max(200).optional(),
13
+ }).strict();
14
+ exports.docsListSchema = exports.projectSelectorSchema.extend({
15
+ page: zod_1.z.number().int().min(1).optional(),
16
+ pageSize: zod_1.z.number().int().min(1).max(200).optional(),
17
+ status: zod_1.z.enum(["draft", "published", "archived"]).optional(),
18
+ keyword: zod_1.z.string().trim().min(1).optional(),
19
+ category: zod_1.z.string().trim().min(1).optional(),
20
+ categoryId: zod_1.z.string().trim().min(1).optional(),
21
+ }).strict();
22
+ exports.docsGetSchema = exports.projectSelectorSchema.extend({
23
+ docId: zod_1.z.string().trim().min(1),
24
+ }).strict();
25
+ exports.docsGetBySlugSchema = exports.projectSelectorSchema.extend({
26
+ slug: zod_1.z.string().trim().min(1),
27
+ contentOnly: zod_1.z.boolean().optional(),
28
+ }).strict();
29
+ exports.docsCreateSchema = exports.projectSelectorSchema.extend({
30
+ title: zod_1.z.string().trim().min(1).max(120),
31
+ content: zod_1.z.string().min(1).optional(),
32
+ contentMd: zod_1.z.string().min(1).optional(),
33
+ slug: zod_1.z.string().trim().min(1).max(80).optional(),
34
+ category: zod_1.z.string().trim().max(80).optional(),
35
+ categoryId: zod_1.z.string().trim().max(80).optional(),
36
+ summary: zod_1.z.string().trim().max(500).optional(),
37
+ tags: zod_1.z.array(zod_1.z.string().trim().min(1).max(40)).max(20).optional(),
38
+ status: zod_1.z.enum(["draft"]).optional(),
39
+ source: zod_1.z.string().trim().max(40).optional(),
40
+ version: zod_1.z.string().trim().max(40).optional(),
41
+ confirm: zod_1.z.boolean().optional(),
42
+ }).strict();
43
+ exports.docsUpdateSchema = exports.projectSelectorSchema.extend({
44
+ docId: zod_1.z.string().trim().min(1),
45
+ title: zod_1.z.string().trim().min(1).max(120).optional(),
46
+ content: zod_1.z.string().min(1).optional(),
47
+ contentMd: zod_1.z.string().min(1).optional(),
48
+ slug: zod_1.z.string().trim().min(1).max(80).optional(),
49
+ category: zod_1.z.string().trim().max(80).optional(),
50
+ categoryId: zod_1.z.string().trim().max(80).optional(),
51
+ summary: zod_1.z.string().trim().max(500).nullable().optional(),
52
+ tags: zod_1.z.array(zod_1.z.string().trim().min(1).max(40)).max(20).optional(),
53
+ source: zod_1.z.string().trim().max(40).optional(),
54
+ version: zod_1.z.string().trim().max(40).nullable().optional(),
55
+ confirm: zod_1.z.boolean().optional(),
56
+ }).strict();
57
+ exports.docsPublishSchema = exports.projectSelectorSchema.extend({
58
+ docId: zod_1.z.string().trim().min(1),
59
+ source: zod_1.z.string().trim().max(40).optional(),
60
+ confirm: zod_1.z.boolean().optional(),
61
+ }).strict();
62
+ exports.issuesListSchema = exports.projectSelectorSchema.extend({
63
+ page: zod_1.z.number().int().min(1).optional(),
64
+ pageSize: zod_1.z.number().int().min(1).max(200).optional(),
65
+ keyword: zod_1.z.string().trim().min(1).optional(),
66
+ status: zod_1.z.array(zod_1.z.string().trim().min(1)).optional(),
67
+ priority: zod_1.z.array(zod_1.z.string().trim().min(1)).optional(),
68
+ assigneeId: zod_1.z.string().trim().min(1).optional(),
69
+ verifierId: zod_1.z.string().trim().min(1).optional(),
70
+ rdItemId: zod_1.z.string().trim().min(1).optional(),
71
+ }).strict();
72
+ exports.issueGetSchema = exports.projectSelectorSchema.extend({
73
+ issueId: zod_1.z.string().trim().min(1),
74
+ }).strict();
75
+ exports.issueReadDetailSchema = exports.issueGetSchema;
76
+ exports.issueAttachmentRawSchema = exports.projectSelectorSchema.extend({
77
+ issueId: zod_1.z.string().trim().min(1),
78
+ attachmentId: zod_1.z.string().trim().min(1),
79
+ maxBytes: zod_1.z.number().int().min(1).max(5 * 1024 * 1024).optional(),
80
+ }).strict();
81
+ exports.issueUploadRawSchema = exports.projectSelectorSchema.extend({
82
+ issueId: zod_1.z.string().trim().min(1),
83
+ uploadId: zod_1.z.string().trim().min(1),
84
+ maxBytes: zod_1.z.number().int().min(1).max(5 * 1024 * 1024).optional(),
85
+ }).strict();
86
+ const issueTypeSchema = zod_1.z.enum(["bug", "feature", "change", "improvement", "task", "test"]);
87
+ const issuePrioritySchema = zod_1.z.enum(["low", "medium", "high", "critical"]);
88
+ exports.issueCreateSchema = exports.projectSelectorSchema.extend({
89
+ title: zod_1.z.string().trim().min(1),
90
+ description: zod_1.z.string().optional(),
91
+ type: issueTypeSchema.optional(),
92
+ priority: issuePrioritySchema.optional(),
93
+ assigneeId: zod_1.z.string().trim().nullable().optional(),
94
+ verifierId: zod_1.z.string().trim().nullable().optional(),
95
+ rdItemId: zod_1.z.string().trim().nullable().optional(),
96
+ moduleCode: zod_1.z.string().trim().optional(),
97
+ versionCode: zod_1.z.string().trim().optional(),
98
+ environmentCode: zod_1.z.string().trim().optional(),
99
+ confirm: zod_1.z.boolean().optional(),
100
+ }).strict();
101
+ exports.issueCommentSchema = exports.projectSelectorSchema.extend({
102
+ issueId: zod_1.z.string().trim().min(1),
103
+ content: zod_1.z.string().min(1),
104
+ mentions: zod_1.z.array(zod_1.z.string().trim().min(1)).optional(),
105
+ confirm: zod_1.z.boolean().optional(),
106
+ }).strict();
107
+ exports.issueAssignSchema = exports.projectSelectorSchema.extend({
108
+ issueId: zod_1.z.string().trim().min(1),
109
+ assigneeId: zod_1.z.string().trim().min(1),
110
+ confirm: zod_1.z.boolean().optional(),
111
+ }).strict();
112
+ exports.issueSimpleWriteSchema = exports.projectSelectorSchema.extend({
113
+ issueId: zod_1.z.string().trim().min(1),
114
+ confirm: zod_1.z.boolean().optional(),
115
+ }).strict();
116
+ exports.issueResolveSchema = exports.projectSelectorSchema.extend({
117
+ issueId: zod_1.z.string().trim().min(1),
118
+ resolutionSummary: zod_1.z.string().optional(),
119
+ confirm: zod_1.z.boolean().optional(),
120
+ }).strict();
121
+ exports.issueReopenSchema = exports.projectSelectorSchema.extend({
122
+ issueId: zod_1.z.string().trim().min(1),
123
+ remark: zod_1.z.string().optional(),
124
+ confirm: zod_1.z.boolean().optional(),
125
+ }).strict();
126
+ exports.issueCloseSchema = exports.projectSelectorSchema.extend({
127
+ issueId: zod_1.z.string().trim().min(1),
128
+ reason: zod_1.z.string().trim().optional(),
129
+ remark: zod_1.z.string().optional(),
130
+ confirm: zod_1.z.boolean().optional(),
131
+ }).strict();
132
+ exports.issueParticipantAddSchema = exports.projectSelectorSchema.extend({
133
+ issueId: zod_1.z.string().trim().min(1),
134
+ userId: zod_1.z.string().trim().min(1),
135
+ taskTitle: zod_1.z.string().trim().max(80).optional(),
136
+ confirm: zod_1.z.boolean().optional(),
137
+ }).strict();
138
+ exports.issueBranchCreateSchema = exports.projectSelectorSchema.extend({
139
+ issueId: zod_1.z.string().trim().min(1),
140
+ ownerUserId: zod_1.z.string().trim().min(1),
141
+ title: zod_1.z.string().trim().min(1).max(80),
142
+ confirm: zod_1.z.boolean().optional(),
143
+ }).strict();
144
+ exports.issueBranchStartMineSchema = exports.projectSelectorSchema.extend({
145
+ issueId: zod_1.z.string().trim().min(1),
146
+ title: zod_1.z.string().trim().min(1).max(80),
147
+ confirm: zod_1.z.boolean().optional(),
148
+ }).strict();
149
+ exports.issueBranchActionSchema = exports.projectSelectorSchema.extend({
150
+ issueId: zod_1.z.string().trim().min(1),
151
+ branchId: zod_1.z.string().trim().min(1),
152
+ confirm: zod_1.z.boolean().optional(),
153
+ }).strict();
154
+ exports.issueBranchCompleteSchema = exports.projectSelectorSchema.extend({
155
+ issueId: zod_1.z.string().trim().min(1),
156
+ branchId: zod_1.z.string().trim().min(1),
157
+ summary: zod_1.z.string().trim().max(500).optional(),
158
+ confirm: zod_1.z.boolean().optional(),
159
+ }).strict();
160
+ exports.issueParticipantRemoveSchema = exports.projectSelectorSchema.extend({
161
+ issueId: zod_1.z.string().trim().min(1),
162
+ participantId: zod_1.z.string().trim().min(1),
163
+ confirm: zod_1.z.boolean().optional(),
164
+ }).strict();
165
+ exports.issueUpdateSchema = exports.projectSelectorSchema.extend({
166
+ issueId: zod_1.z.string().trim().min(1),
167
+ title: zod_1.z.string().trim().optional(),
168
+ description: zod_1.z.string().nullable().optional(),
169
+ type: issueTypeSchema.optional(),
170
+ priority: issuePrioritySchema.optional(),
171
+ rdItemId: zod_1.z.string().trim().nullable().optional(),
172
+ moduleCode: zod_1.z.string().trim().nullable().optional(),
173
+ versionCode: zod_1.z.string().trim().nullable().optional(),
174
+ environmentCode: zod_1.z.string().trim().nullable().optional(),
175
+ confirm: zod_1.z.boolean().optional(),
176
+ }).strict();
177
+ exports.markdownImageUploadSchema = exports.projectSelectorSchema.extend({
178
+ filePath: zod_1.z.string().trim().min(1).optional(),
179
+ contentBase64: zod_1.z.string().trim().min(1).optional(),
180
+ fileName: zod_1.z.string().trim().min(1).optional(),
181
+ mimeType: zod_1.z.string().trim().min(1).optional(),
182
+ alt: zod_1.z.string().trim().min(1).optional(),
183
+ confirm: zod_1.z.boolean().optional(),
184
+ }).strict();
185
+ exports.fileUploadSchema = exports.projectSelectorSchema.extend({
186
+ target: zod_1.z.enum(["issueAttachment", "taskSheetAttachment"]),
187
+ filePath: zod_1.z.string().trim().min(1).optional(),
188
+ contentBase64: zod_1.z.string().trim().min(1).optional(),
189
+ fileName: zod_1.z.string().trim().min(1).optional(),
190
+ mimeType: zod_1.z.string().trim().min(1).optional(),
191
+ confirm: zod_1.z.boolean().optional(),
192
+ }).strict();
193
+ exports.rdListSchema = exports.projectSelectorSchema.extend({
194
+ page: zod_1.z.number().int().min(1).optional(),
195
+ pageSize: zod_1.z.number().int().min(1).max(200).optional(),
196
+ keyword: zod_1.z.string().trim().min(1).optional(),
197
+ stageId: zod_1.z.string().trim().min(1).optional(),
198
+ status: zod_1.z.array(zod_1.z.string().trim().min(1)).optional(),
199
+ type: zod_1.z.array(zod_1.z.string().trim().min(1)).optional(),
200
+ priority: zod_1.z.array(zod_1.z.string().trim().min(1)).optional(),
201
+ assigneeId: zod_1.z.string().trim().min(1).optional(),
202
+ }).strict();
203
+ exports.rdGetSchema = exports.projectSelectorSchema.extend({
204
+ itemId: zod_1.z.string().trim().min(1),
205
+ }).strict();
206
+ exports.rdReadDetailSchema = exports.rdGetSchema;
207
+ exports.rdUploadRawSchema = exports.projectSelectorSchema.extend({
208
+ itemId: zod_1.z.string().trim().min(1),
209
+ uploadId: zod_1.z.string().trim().min(1),
210
+ maxBytes: zod_1.z.number().int().min(1).max(5 * 1024 * 1024).optional(),
211
+ }).strict();
212
+ const rdTypeSchema = zod_1.z.enum([
213
+ "feature_dev",
214
+ "tech_refactor",
215
+ "integration",
216
+ "env_setup",
217
+ "bug_fix",
218
+ "requirement_confirmation",
219
+ "solution_design",
220
+ "testing_validation",
221
+ "delivery_launch",
222
+ "project_closure",
223
+ ]);
224
+ const rdPrioritySchema = zod_1.z.enum(["low", "medium", "high", "critical"]);
225
+ const rdInitialStageTaskSchema = zod_1.z.object({
226
+ templateId: zod_1.z.string().trim().min(1).nullable().optional(),
227
+ title: zod_1.z.string().trim().min(1),
228
+ description: zod_1.z.string().trim().nullable().optional(),
229
+ ownerId: zod_1.z.string().trim().nullable().optional(),
230
+ plannedStartAt: zod_1.z.string().trim().nullable().optional(),
231
+ plannedEndAt: zod_1.z.string().trim().nullable().optional(),
232
+ }).strict();
233
+ const rdStageTaskTemplateSelectionSchema = zod_1.z.object({
234
+ templateId: zod_1.z.string().trim().min(1),
235
+ ownerId: zod_1.z.string().trim().nullable().optional(),
236
+ }).strict();
237
+ exports.rdCreateSchema = exports.projectSelectorSchema.extend({
238
+ title: zod_1.z.string().trim().min(1),
239
+ description: zod_1.z.string().optional(),
240
+ stageId: zod_1.z.string().trim().nullable().optional(),
241
+ type: rdTypeSchema.optional(),
242
+ priority: rdPrioritySchema.optional(),
243
+ memberIds: zod_1.z.array(zod_1.z.string().trim().min(1)).min(1),
244
+ verifierId: zod_1.z.string().trim().nullable().optional(),
245
+ planStartAt: zod_1.z.string().trim().optional(),
246
+ planEndAt: zod_1.z.string().trim().optional(),
247
+ stageTasks: zod_1.z.array(rdInitialStageTaskSchema).optional(),
248
+ stageTaskTemplates: zod_1.z.array(rdStageTaskTemplateSelectionSchema).optional(),
249
+ confirm: zod_1.z.boolean().optional(),
250
+ }).strict();
251
+ exports.rdAdvanceStageSchema = exports.projectSelectorSchema.extend({
252
+ itemId: zod_1.z.string().trim().min(1),
253
+ stageId: zod_1.z.string().trim().min(1),
254
+ memberIds: zod_1.z.array(zod_1.z.string().trim().min(1)).optional(),
255
+ description: zod_1.z.string().trim().min(1).optional(),
256
+ planStartAt: zod_1.z.string().trim().min(1).optional(),
257
+ planEndAt: zod_1.z.string().trim().min(1).optional(),
258
+ stageTasks: zod_1.z.array(rdInitialStageTaskSchema).optional(),
259
+ stageTaskTemplates: zod_1.z.array(rdStageTaskTemplateSelectionSchema).optional(),
260
+ confirm: zod_1.z.boolean().optional(),
261
+ }).strict();
262
+ exports.rdStageTasksListSchema = exports.projectSelectorSchema.extend({
263
+ itemId: zod_1.z.string().trim().min(1),
264
+ }).strict();
265
+ exports.rdStageTaskCreateSchema = exports.projectSelectorSchema.extend({
266
+ itemId: zod_1.z.string().trim().min(1),
267
+ title: zod_1.z.string().trim().min(1).max(200),
268
+ description: zod_1.z.string().trim().max(2000).nullable().optional(),
269
+ ownerIds: zod_1.z.array(zod_1.z.string().trim().min(1)).min(1),
270
+ plannedStartAt: zod_1.z.string().trim().nullable().optional(),
271
+ plannedEndAt: zod_1.z.string().trim().nullable().optional(),
272
+ sortOrder: zod_1.z.number().int().optional(),
273
+ remark: zod_1.z.string().trim().max(1000).nullable().optional(),
274
+ confirm: zod_1.z.boolean().optional(),
275
+ }).strict();
276
+ exports.rdUpdateProgressSchema = exports.projectSelectorSchema.extend({
277
+ itemId: zod_1.z.string().trim().min(1),
278
+ progress: zod_1.z.number().int().min(0).max(100),
279
+ note: zod_1.z.string().trim().optional(),
280
+ blockReason: zod_1.z.string().trim().min(1).max(500).optional(),
281
+ resolveBlockId: zod_1.z.string().trim().min(1).optional(),
282
+ stageTaskId: zod_1.z.string().trim().min(1).optional(),
283
+ confirm: zod_1.z.boolean().optional(),
284
+ }).strict();
285
+ exports.rdSimpleWriteSchema = exports.projectSelectorSchema.extend({
286
+ itemId: zod_1.z.string().trim().min(1),
287
+ confirm: zod_1.z.boolean().optional(),
288
+ }).strict();
289
+ exports.rdBlockSchema = exports.projectSelectorSchema.extend({
290
+ itemId: zod_1.z.string().trim().min(1),
291
+ blockerReason: zod_1.z.string().optional(),
292
+ confirm: zod_1.z.boolean().optional(),
293
+ }).strict();
294
+ exports.rdCompleteSchema = exports.projectSelectorSchema.extend({
295
+ itemId: zod_1.z.string().trim().min(1),
296
+ reason: zod_1.z.string().trim().max(1000).optional(),
297
+ confirm: zod_1.z.boolean().optional(),
298
+ }).strict();
299
+ exports.rdCloseSchema = exports.projectSelectorSchema.extend({
300
+ itemId: zod_1.z.string().trim().min(1),
301
+ reason: zod_1.z.string().trim().optional(),
302
+ confirm: zod_1.z.boolean().optional(),
303
+ }).strict();
304
+ exports.rdUpdateSchema = exports.projectSelectorSchema.extend({
305
+ itemId: zod_1.z.string().trim().min(1),
306
+ version: zod_1.z.number().int().min(1),
307
+ title: zod_1.z.string().trim().optional(),
308
+ description: zod_1.z.string().nullable().optional(),
309
+ stageId: zod_1.z.string().trim().nullable().optional(),
310
+ type: rdTypeSchema.optional(),
311
+ priority: rdPrioritySchema.optional(),
312
+ memberIds: zod_1.z.array(zod_1.z.string().trim().min(1)).min(1).optional(),
313
+ verifierId: zod_1.z.string().trim().nullable().optional(),
314
+ planStartAt: zod_1.z.string().trim().nullable().optional(),
315
+ planEndAt: zod_1.z.string().trim().nullable().optional(),
316
+ stageDescription: zod_1.z.string().trim().max(4000).nullable().optional(),
317
+ confirm: zod_1.z.boolean().optional(),
318
+ }).strict();
@@ -0,0 +1,2 @@
1
+ import type { McpToolDefinition } from "../index";
2
+ export declare function hubV2UploadTools(): McpToolDefinition[];
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.hubV2UploadTools = hubV2UploadTools;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const client_1 = require("./client");
10
+ const index_1 = require("./config/index");
11
+ const schemas_1 = require("./schemas");
12
+ const result_1 = require("../../utils/result");
13
+ function hubV2UploadTools() {
14
+ return [
15
+ {
16
+ name: "hub_v2_upload_markdown_image",
17
+ description: "Upload a local or base64 image with Personal Token and return Markdown for Hub V2 content.",
18
+ riskLevel: "write",
19
+ inputSchema: schemas_1.markdownImageUploadSchema,
20
+ allowPreviewWhenBlocked: true,
21
+ isConfirmed: (args) => args.confirm === true,
22
+ async handler(args) {
23
+ const path = "/uploads/markdown";
24
+ if (!args.confirm) {
25
+ return (0, result_1.ok)("hub_v2_upload_markdown_image", {
26
+ code: "PREVIEW",
27
+ message: "set confirm=true to upload this image",
28
+ data: {
29
+ method: "POST",
30
+ path,
31
+ requiredScope: "issue:create:write or issue:update:write or issue:comment:write or rd:create:write or rd:stage-task:write or rd:transition:write or rd:edit:write",
32
+ maxBytes: maxUploadBytes(),
33
+ input: {
34
+ mode: args.filePath ? "filePath" : "contentBase64",
35
+ fileName: args.fileName,
36
+ mimeType: args.mimeType,
37
+ alt: args.alt,
38
+ hasFilePath: Boolean(args.filePath),
39
+ hasContentBase64: Boolean(args.contentBase64),
40
+ },
41
+ },
42
+ });
43
+ }
44
+ const ctx = (0, index_1.resolveHubV2Context)(args, "personal");
45
+ const client = new client_1.HubV2Client(ctx);
46
+ const file = resolveUploadFile(args);
47
+ const form = new FormData();
48
+ const bytes = new Uint8Array(file.content.byteLength);
49
+ bytes.set(file.content);
50
+ form.append("file", new Blob([bytes], { type: file.mimeType }), file.fileName);
51
+ if (args.alt) {
52
+ form.append("alt", args.alt);
53
+ }
54
+ const data = await client.multipart("POST", client.personalUrl("/uploads/markdown"), form);
55
+ return (0, result_1.ok)("hub_v2_upload_markdown_image", data);
56
+ },
57
+ },
58
+ {
59
+ name: "hub_v2_file_upload",
60
+ description: "Upload a local or base64 file with Personal Token and return a Hub V2 uploadId.",
61
+ riskLevel: "write",
62
+ inputSchema: schemas_1.fileUploadSchema,
63
+ allowPreviewWhenBlocked: true,
64
+ isConfirmed: (args) => args.confirm === true,
65
+ async handler(args) {
66
+ const uploadPath = "/uploads/file";
67
+ if (!args.confirm) {
68
+ return (0, result_1.ok)("hub_v2_file_upload", {
69
+ code: "PREVIEW",
70
+ message: "set confirm=true to upload this file",
71
+ data: {
72
+ method: "POST",
73
+ path: uploadPath,
74
+ requiredScope: fileUploadRequiredScope(args.target),
75
+ maxBytes: maxUploadBytes(),
76
+ input: {
77
+ target: args.target,
78
+ mode: args.filePath ? "filePath" : "contentBase64",
79
+ fileName: args.fileName,
80
+ mimeType: args.mimeType,
81
+ hasFilePath: Boolean(args.filePath),
82
+ hasContentBase64: Boolean(args.contentBase64),
83
+ },
84
+ },
85
+ });
86
+ }
87
+ const ctx = (0, index_1.resolveHubV2Context)(args, "personal");
88
+ const client = new client_1.HubV2Client(ctx);
89
+ const file = resolveUploadFile(args);
90
+ const form = new FormData();
91
+ const bytes = new Uint8Array(file.content.byteLength);
92
+ bytes.set(file.content);
93
+ form.append("file", new Blob([bytes], { type: file.mimeType }), file.fileName);
94
+ form.append("target", args.target);
95
+ const data = await client.multipart("POST", client.personalUrl(uploadPath), form);
96
+ return (0, result_1.ok)("hub_v2_file_upload", data);
97
+ },
98
+ },
99
+ ];
100
+ }
101
+ function fileUploadRequiredScope(target) {
102
+ switch (target) {
103
+ case "issueAttachment":
104
+ return "issue:update:write";
105
+ case "taskSheetAttachment":
106
+ return "rd:stage-task:write or rd:edit:write";
107
+ }
108
+ }
109
+ function resolveUploadFile(args) {
110
+ if (Boolean(args.filePath) === Boolean(args.contentBase64)) {
111
+ throw new Error("provide exactly one of filePath or contentBase64");
112
+ }
113
+ if (args.filePath) {
114
+ const resolvedPath = node_path_1.default.resolve(args.filePath);
115
+ assertAllowedFilePath(resolvedPath);
116
+ if (!(0, node_fs_1.existsSync)(resolvedPath) || !(0, node_fs_1.statSync)(resolvedPath).isFile()) {
117
+ throw new Error(`upload file not found: ${resolvedPath}`);
118
+ }
119
+ const fileSize = (0, node_fs_1.statSync)(resolvedPath).size;
120
+ assertUploadSize(fileSize);
121
+ return {
122
+ content: (0, node_fs_1.readFileSync)(resolvedPath),
123
+ fileName: node_path_1.default.basename(resolvedPath),
124
+ mimeType: args.mimeType ?? inferMimeType(resolvedPath),
125
+ };
126
+ }
127
+ const fileName = args.fileName?.trim();
128
+ if (!args.contentBase64 || !fileName) {
129
+ throw new Error("contentBase64 and fileName are required");
130
+ }
131
+ const content = decodeBase64Content(args.contentBase64);
132
+ return {
133
+ content,
134
+ fileName,
135
+ mimeType: args.mimeType ?? inferMimeType(fileName),
136
+ };
137
+ }
138
+ function maxUploadBytes() {
139
+ const value = Number.parseInt(String(process.env.NGM_MCP_MAX_UPLOAD_BYTES ?? ""), 10);
140
+ return Number.isFinite(value) && value > 0 ? value : 5 * 1024 * 1024;
141
+ }
142
+ function assertUploadSize(fileSize) {
143
+ const maxBytes = maxUploadBytes();
144
+ if (fileSize > maxBytes) {
145
+ throw new Error(`upload file is too large: ${fileSize} bytes exceeds NGM_MCP_MAX_UPLOAD_BYTES=${maxBytes}`);
146
+ }
147
+ }
148
+ function decodeBase64Content(value) {
149
+ const normalized = value.trim().replace(/^data:[^,]+,/, "").replace(/\s+/g, "");
150
+ if (!normalized) {
151
+ throw new Error("contentBase64 is empty");
152
+ }
153
+ if (!/^[A-Za-z0-9+/]*={0,2}$/.test(normalized) || normalized.length % 4 !== 0) {
154
+ throw new Error("contentBase64 is not a valid base64 string");
155
+ }
156
+ const firstPaddingIndex = normalized.indexOf("=");
157
+ if (firstPaddingIndex !== -1 && !/^={1,2}$/.test(normalized.slice(firstPaddingIndex))) {
158
+ throw new Error("contentBase64 is not a valid base64 string");
159
+ }
160
+ const content = Buffer.from(normalized, "base64");
161
+ if (content.byteLength === 0) {
162
+ throw new Error("contentBase64 is empty");
163
+ }
164
+ assertUploadSize(content.byteLength);
165
+ return content;
166
+ }
167
+ function assertAllowedFilePath(filePath) {
168
+ const roots = [
169
+ process.env.NGM_MCP_UPLOAD_ROOT,
170
+ process.cwd(),
171
+ ]
172
+ .map((item) => item?.trim())
173
+ .filter((item) => Boolean(item))
174
+ .map((item) => node_path_1.default.resolve(item));
175
+ const allowed = roots.some((root) => filePath === root || filePath.startsWith(`${root}${node_path_1.default.sep}`));
176
+ if (!allowed) {
177
+ throw new Error("filePath must be under NGM_MCP_UPLOAD_ROOT or the current working directory");
178
+ }
179
+ }
180
+ function inferMimeType(fileName) {
181
+ switch (node_path_1.default.extname(fileName).toLowerCase()) {
182
+ case ".png":
183
+ return "image/png";
184
+ case ".jpg":
185
+ case ".jpeg":
186
+ return "image/jpeg";
187
+ case ".gif":
188
+ return "image/gif";
189
+ case ".webp":
190
+ return "image/webp";
191
+ case ".bmp":
192
+ return "image/bmp";
193
+ case ".svg":
194
+ return "image/svg+xml";
195
+ default:
196
+ return "application/octet-stream";
197
+ }
198
+ }
@@ -7,6 +7,9 @@ export type McpToolDefinition<TSchema extends z.AnyZodObject = z.AnyZodObject> =
7
7
  description: string;
8
8
  riskLevel: ToolRiskLevel;
9
9
  inputSchema: TSchema;
10
+ allowPreviewWhenBlocked?: boolean;
11
+ deferPolicyToHandler?: boolean;
12
+ isConfirmed?: (args: z.infer<TSchema>) => boolean;
10
13
  handler(args: z.infer<TSchema>, context: ToolContext): Promise<ToolResult> | ToolResult;
11
14
  };
12
15
  export declare function allTools(): McpToolDefinition[];
@@ -1,19 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.allTools = allTools;
4
+ const capability_tools_1 = require("./capability.tools");
5
+ const angular_1 = require("./angular");
6
+ const controlled_tools_1 = require("./controlled.tools");
7
+ const file_write_tools_1 = require("./file-write.tools");
4
8
  const git_tools_1 = require("./git.tools");
9
+ const hub_v2_1 = require("./hub-v2");
5
10
  const log_tools_1 = require("./log.tools");
11
+ const nginx_tools_1 = require("./nginx.tools");
12
+ const project_observe_tools_1 = require("./project-observe.tools");
6
13
  const project_tools_1 = require("./project.tools");
7
14
  const proxy_tools_1 = require("./proxy.tools");
8
15
  const runtime_tools_1 = require("./runtime.tools");
16
+ const review_1 = require("./review");
17
+ const standard_1 = require("./standard");
9
18
  const task_tools_1 = require("./task.tools");
19
+ const test_1 = require("./test");
20
+ const workspace_tools_1 = require("./workspace.tools");
21
+ const workflow_1 = require("./workflow");
10
22
  function allTools() {
11
23
  return [
24
+ ...(0, capability_tools_1.capabilityTools)(),
25
+ ...(0, workspace_tools_1.workspaceTools)(),
26
+ ...(0, controlled_tools_1.controlledTools)(),
27
+ ...(0, file_write_tools_1.fileWriteTools)(),
12
28
  ...(0, project_tools_1.projectTools)(),
29
+ ...(0, project_observe_tools_1.projectObserveTools)(),
13
30
  ...(0, task_tools_1.taskTools)(),
14
31
  ...(0, log_tools_1.logTools)(),
15
32
  ...(0, git_tools_1.gitTools)(),
33
+ ...(0, standard_1.standardTools)(),
34
+ ...(0, test_1.testStandardTools)(),
35
+ ...(0, angular_1.angularStandardTools)(),
36
+ ...(0, review_1.reviewTools)(),
37
+ ...(0, workflow_1.frontendWorkflowTools)(),
16
38
  ...(0, runtime_tools_1.runtimeTools)(),
39
+ ...(0, nginx_tools_1.nginxTools)(),
17
40
  ...(0, proxy_tools_1.proxyTools)(),
41
+ ...(0, hub_v2_1.hubV2Tools)(),
18
42
  ];
19
43
  }
@@ -23,22 +23,49 @@ function clampSearchLimit(value) {
23
23
  function logTools() {
24
24
  return [
25
25
  {
26
- name: "ngm.log.tail",
26
+ name: "ngm_log_tail",
27
27
  description: "Read recent task logs by runId or taskId.",
28
28
  riskLevel: "read",
29
29
  inputSchema: logTailSchema,
30
30
  async handler(args, context) {
31
31
  const tail = clampTail(args.tail);
32
32
  let runId = args.runId;
33
+ const localServer = context.services.localServer;
34
+ const availability = localServer ? await localServer.availability() : { available: false, reason: "local server client is not configured" };
33
35
  if (!runId && args.taskId) {
34
- const snapshot = await context.services.core.task.getSnapshotByTaskId(args.taskId);
36
+ if (!availability.available || !localServer) {
37
+ return (0, result_1.ok)("ngm_log_tail", {
38
+ controlPlane: "unavailable",
39
+ localServer: availability,
40
+ status: "unavailable",
41
+ reason: "ng-manager local server is not running; start it with ngm server or ngm ui to read shared task logs",
42
+ taskId: args.taskId,
43
+ tail,
44
+ lines: [],
45
+ });
46
+ }
47
+ const snapshot = await localServer.getTaskStatus(args.taskId);
35
48
  runId = snapshot?.runId;
36
49
  }
37
50
  if (!runId) {
38
51
  throw new Error("runId or taskId is required");
39
52
  }
40
- const lines = await context.services.core.task.getTailLogsByRun(runId, tail);
41
- return (0, result_1.ok)("ngm.log.tail", {
53
+ if (!availability.available || !localServer) {
54
+ return (0, result_1.ok)("ngm_log_tail", {
55
+ controlPlane: "unavailable",
56
+ localServer: availability,
57
+ status: "unavailable",
58
+ reason: "ng-manager local server is not running; start it with ngm server or ngm ui to read shared task logs",
59
+ runId,
60
+ tail,
61
+ lines: [],
62
+ });
63
+ }
64
+ const controlPlane = "local-server";
65
+ const lines = await localServer.getTaskLogTail(runId, tail);
66
+ return (0, result_1.ok)("ngm_log_tail", {
67
+ controlPlane,
68
+ localServer: availability,
42
69
  runId,
43
70
  tail,
44
71
  lines,
@@ -46,7 +73,7 @@ function logTools() {
46
73
  },
47
74
  },
48
75
  {
49
- name: "ngm.log.search",
76
+ name: "ngm_log_search",
50
77
  description: "Search recent ng-manager system logs by keyword.",
51
78
  riskLevel: "read",
52
79
  inputSchema: logSearchSchema,
@@ -64,7 +91,7 @@ function logTools() {
64
91
  return text.includes(needle);
65
92
  })
66
93
  .slice(0, limit);
67
- return (0, result_1.ok)("ngm.log.search", {
94
+ return (0, result_1.ok)("ngm_log_search", {
68
95
  query: args.query,
69
96
  limit,
70
97
  entries,
@@ -0,0 +1 @@
1
+ export { nginxControlTools } from "./nginx-control.tools";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nginxControlTools = void 0;
4
+ var nginx_control_tools_1 = require("./nginx-control.tools");
5
+ Object.defineProperty(exports, "nginxControlTools", { enumerable: true, get: function () { return nginx_control_tools_1.nginxControlTools; } });
@@ -0,0 +1,2 @@
1
+ import type { McpToolDefinition } from "../index";
2
+ export declare function nginxControlTools(): McpToolDefinition[];