@hexabot-ai/api 3.2.2-alpha.13 → 3.2.2-alpha.15

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 (89) hide show
  1. package/dist/mcp/mcp-api.module.js +2 -2
  2. package/dist/mcp/mcp-api.module.js.map +1 -1
  3. package/dist/mcp/tools/catalog-mcp.tools.d.ts +63 -0
  4. package/dist/mcp/tools/catalog-mcp.tools.js +135 -0
  5. package/dist/mcp/tools/catalog-mcp.tools.js.map +1 -0
  6. package/dist/mcp/tools/cms-mcp.tools.d.ts +128 -0
  7. package/dist/mcp/tools/cms-mcp.tools.js +242 -0
  8. package/dist/mcp/tools/cms-mcp.tools.js.map +1 -0
  9. package/dist/mcp/tools/credential-mcp.tools.d.ts +19 -0
  10. package/dist/mcp/tools/credential-mcp.tools.js +82 -0
  11. package/dist/mcp/tools/credential-mcp.tools.js.map +1 -0
  12. package/dist/mcp/tools/hexabot-mcp-tool.base.d.ts +22 -0
  13. package/dist/mcp/tools/hexabot-mcp-tool.base.js +48 -0
  14. package/dist/mcp/tools/hexabot-mcp-tool.base.js.map +1 -0
  15. package/dist/mcp/tools/hexabot-mcp.schemas.d.ts +41 -0
  16. package/dist/mcp/tools/hexabot-mcp.schemas.js +36 -0
  17. package/dist/mcp/tools/hexabot-mcp.schemas.js.map +1 -0
  18. package/dist/mcp/tools/hexabot-mcp.tools.d.ts +1 -1199
  19. package/dist/mcp/tools/hexabot-mcp.tools.js +14 -953
  20. package/dist/mcp/tools/hexabot-mcp.tools.js.map +1 -1
  21. package/dist/mcp/tools/hexabot-mcp.utils.d.ts +1 -0
  22. package/dist/mcp/tools/hexabot-mcp.utils.js +9 -0
  23. package/dist/mcp/tools/hexabot-mcp.utils.js.map +1 -0
  24. package/dist/mcp/tools/index.d.ts +22 -0
  25. package/dist/mcp/tools/index.js +50 -0
  26. package/dist/mcp/tools/index.js.map +1 -0
  27. package/dist/mcp/tools/mcp-server-mcp.tools.d.ts +77 -0
  28. package/dist/mcp/tools/mcp-server-mcp.tools.js +130 -0
  29. package/dist/mcp/tools/mcp-server-mcp.tools.js.map +1 -0
  30. package/dist/mcp/tools/memory-definition-mcp.tools.d.ts +57 -0
  31. package/dist/mcp/tools/memory-definition-mcp.tools.js +128 -0
  32. package/dist/mcp/tools/memory-definition-mcp.tools.js.map +1 -0
  33. package/dist/mcp/tools/workflow-mcp.helper.d.ts +141 -0
  34. package/dist/mcp/tools/workflow-mcp.helper.js +108 -0
  35. package/dist/mcp/tools/workflow-mcp.helper.js.map +1 -0
  36. package/dist/mcp/tools/workflow-mcp.tools.d.ts +468 -0
  37. package/dist/mcp/tools/workflow-mcp.tools.js +222 -0
  38. package/dist/mcp/tools/workflow-mcp.tools.js.map +1 -0
  39. package/dist/mcp/tools/workflow-run-mcp.tools.d.ts +347 -0
  40. package/dist/mcp/tools/workflow-run-mcp.tools.js +229 -0
  41. package/dist/mcp/tools/workflow-run-mcp.tools.js.map +1 -0
  42. package/dist/mcp/tools/workflow-version-mcp.tools.d.ts +230 -0
  43. package/dist/mcp/tools/workflow-version-mcp.tools.js +211 -0
  44. package/dist/mcp/tools/workflow-version-mcp.tools.js.map +1 -0
  45. package/dist/static/assets/{browser-ponyfill-BAQMT4v6.js → browser-ponyfill-D3QB7SUD.js} +1 -1
  46. package/dist/static/assets/{cssMode-Ck2GqK0z.js → cssMode-Bk0-m_Ij.js} +1 -1
  47. package/dist/static/assets/{freemarker2-D6BTrnBM.js → freemarker2-D1tTqqt8.js} +1 -1
  48. package/dist/static/assets/{handlebars-BZezzX8Y.js → handlebars-D3VQYLDj.js} +1 -1
  49. package/dist/static/assets/{html-BaHYviVY.js → html-Cmhr3-6_.js} +1 -1
  50. package/dist/static/assets/{htmlMode-DUmaotGP.js → htmlMode-Bb5Kynv_.js} +1 -1
  51. package/dist/static/assets/{index-BHEX1fRT.js → index-JPQj6OiL.js} +2000 -2000
  52. package/dist/static/assets/{javascript-B9CVllx-.js → javascript-BkQdNyFT.js} +1 -1
  53. package/dist/static/assets/{jsonMode-CKDg1one.js → jsonMode-CS1296LF.js} +1 -1
  54. package/dist/static/assets/{liquid-B0Y1CBIq.js → liquid-C9ufUE-r.js} +1 -1
  55. package/dist/static/assets/{lspLanguageFeatures-CEFdgYOu.js → lspLanguageFeatures-Dxd2SsrE.js} +1 -1
  56. package/dist/static/assets/{mdx-Deeg6oYM.js → mdx-Dm4bC48D.js} +1 -1
  57. package/dist/static/assets/{python-CwGXs8Vo.js → python-ZvBWpr_q.js} +1 -1
  58. package/dist/static/assets/{razor-DNVdulkX.js → razor-DBj-LyWR.js} +1 -1
  59. package/dist/static/assets/{tsMode-C1iFfVv3.js → tsMode-DzMlJB2i.js} +1 -1
  60. package/dist/static/assets/{typescript-BbwxPKOl.js → typescript-Cfo3bzpy.js} +1 -1
  61. package/dist/static/assets/{xml-mxS5SzT4.js → xml-ZyceR0L3.js} +1 -1
  62. package/dist/static/assets/{yaml-CScJydFV.js → yaml-oyu_gOar.js} +1 -1
  63. package/dist/static/index.html +1 -1
  64. package/dist/tsconfig.build.tsbuildinfo +1 -1
  65. package/dist/utils/test/port.d.ts +8 -0
  66. package/dist/utils/test/port.js +34 -0
  67. package/dist/utils/test/port.js.map +1 -0
  68. package/dist/workflow/services/workflow.service.d.ts +7 -7
  69. package/dist/workflow/services/workflow.service.js +40 -35
  70. package/dist/workflow/services/workflow.service.js.map +1 -1
  71. package/package.json +4 -4
  72. package/src/mcp/README.md +24 -3
  73. package/src/mcp/mcp-api.module.ts +2 -2
  74. package/src/mcp/tools/catalog-mcp.tools.ts +122 -0
  75. package/src/mcp/tools/cms-mcp.tools.ts +239 -0
  76. package/src/mcp/tools/credential-mcp.tools.ts +81 -0
  77. package/src/mcp/tools/hexabot-mcp-tool.base.ts +74 -0
  78. package/src/mcp/tools/hexabot-mcp.schemas.ts +55 -0
  79. package/src/mcp/tools/hexabot-mcp.tools.ts +1 -1035
  80. package/src/mcp/tools/hexabot-mcp.utils.ts +13 -0
  81. package/src/mcp/tools/index.ts +51 -0
  82. package/src/mcp/tools/mcp-server-mcp.tools.ts +135 -0
  83. package/src/mcp/tools/memory-definition-mcp.tools.ts +125 -0
  84. package/src/mcp/tools/workflow-mcp.helper.ts +166 -0
  85. package/src/mcp/tools/workflow-mcp.tools.ts +254 -0
  86. package/src/mcp/tools/workflow-run-mcp.tools.ts +274 -0
  87. package/src/mcp/tools/workflow-version-mcp.tools.ts +226 -0
  88. package/src/utils/test/port.ts +48 -0
  89. package/src/workflow/services/workflow.service.ts +49 -29
@@ -0,0 +1,239 @@
1
+ /*
2
+ * Hexabot — Fair Core License (FCL-1.0-ALv2)
3
+ * Copyright (c) 2026 Hexastack.
4
+ * Full terms: see LICENSE.md.
5
+ */
6
+
7
+ import { Action } from '@hexabot-ai/types';
8
+ import { Injectable, NotFoundException } from '@nestjs/common';
9
+ import { Tool, ToolGuards } from '@rekog/mcp-nest';
10
+ import { z } from 'zod';
11
+
12
+ import { ContentTypeOrmEntity } from '@/cms/entities/content-type.entity';
13
+ import { ContentOrmEntity } from '@/cms/entities/content.entity';
14
+ import { ContentTypeService } from '@/cms/services/content-type.service';
15
+ import { ContentService } from '@/cms/services/content.service';
16
+
17
+ import { McpPermission } from '../decorators/mcp-permission.decorator';
18
+ import { McpPermissionGuard } from '../guards/mcp-permission.guard';
19
+
20
+ import { HexabotMcpToolBase } from './hexabot-mcp-tool.base';
21
+ import {
22
+ jsonObjectSchema,
23
+ PaginationArgs,
24
+ paginationSchema,
25
+ uuidSchema,
26
+ } from './hexabot-mcp.schemas';
27
+
28
+ @Injectable()
29
+ export class HexabotCmsMcpTools extends HexabotMcpToolBase {
30
+ constructor(
31
+ private readonly contentTypeService: ContentTypeService,
32
+ private readonly contentService: ContentService,
33
+ ) {
34
+ super();
35
+ }
36
+
37
+ @McpPermission('contenttype', Action.READ)
38
+ @ToolGuards([McpPermissionGuard])
39
+ @Tool({
40
+ name: 'hexabot_content_type_search',
41
+ description: 'Search CMS content types.',
42
+ parameters: z.object({
43
+ query: z.string().optional(),
44
+ ...paginationSchema,
45
+ }),
46
+ })
47
+ async searchContentTypes(args: { query?: string } & PaginationArgs) {
48
+ const where = args.query ? { name: this.contains(args.query) } : {};
49
+
50
+ return await this.listWithCount(
51
+ this.contentTypeService,
52
+ this.findOptions<ContentTypeOrmEntity>(args, where),
53
+ );
54
+ }
55
+
56
+ @McpPermission('contenttype', Action.READ)
57
+ @ToolGuards([McpPermissionGuard])
58
+ @Tool({
59
+ name: 'hexabot_content_type_get',
60
+ description: 'Read one CMS content type.',
61
+ parameters: z.object({
62
+ id: uuidSchema,
63
+ }),
64
+ })
65
+ async getContentType(args: { id: string }) {
66
+ const contentType = await this.contentTypeService.findOne(args.id);
67
+ if (!contentType) {
68
+ throw new NotFoundException(`Content type ${args.id} not found`);
69
+ }
70
+
71
+ return contentType;
72
+ }
73
+
74
+ @McpPermission('contenttype', Action.CREATE)
75
+ @ToolGuards([McpPermissionGuard])
76
+ @Tool({
77
+ name: 'hexabot_content_type_create',
78
+ description: 'Create a CMS content type.',
79
+ parameters: z.object({
80
+ name: z.string().min(1),
81
+ schema: jsonObjectSchema,
82
+ }),
83
+ })
84
+ async createContentType(args: {
85
+ name: string;
86
+ schema: Record<string, unknown>;
87
+ }) {
88
+ return await this.contentTypeService.create(args as any);
89
+ }
90
+
91
+ @McpPermission('contenttype', Action.UPDATE)
92
+ @ToolGuards([McpPermissionGuard])
93
+ @Tool({
94
+ name: 'hexabot_content_type_update',
95
+ description: 'Update a CMS content type.',
96
+ parameters: z.object({
97
+ id: uuidSchema,
98
+ name: z.string().min(1).optional(),
99
+ schema: jsonObjectSchema.optional(),
100
+ }),
101
+ })
102
+ async updateContentType(args: { id: string } & Record<string, unknown>) {
103
+ const { id, ...updates } = args;
104
+
105
+ return await this.contentTypeService.updateOne(id, updates as any);
106
+ }
107
+
108
+ @McpPermission('content', Action.READ)
109
+ @ToolGuards([McpPermissionGuard])
110
+ @Tool({
111
+ name: 'hexabot_content_search',
112
+ description: 'Search CMS content records.',
113
+ parameters: z.object({
114
+ query: z.string().optional(),
115
+ contentTypeId: uuidSchema.optional(),
116
+ status: z.boolean().optional(),
117
+ ...paginationSchema,
118
+ }),
119
+ })
120
+ async searchContent(
121
+ args: {
122
+ query?: string;
123
+ contentTypeId?: string;
124
+ status?: boolean;
125
+ } & PaginationArgs,
126
+ ) {
127
+ if (args.query) {
128
+ return {
129
+ items: await this.contentService.textSearch(args.query, {
130
+ status: args.status,
131
+ contentTypeId: args.contentTypeId,
132
+ limit: args.limit,
133
+ }),
134
+ limit: args.limit,
135
+ skip: 0,
136
+ };
137
+ }
138
+
139
+ const where = {
140
+ ...(args.contentTypeId
141
+ ? { contentType: { id: args.contentTypeId } }
142
+ : {}),
143
+ ...(args.status !== undefined ? { status: args.status } : {}),
144
+ } as any;
145
+
146
+ return await this.listWithCount(
147
+ this.contentService,
148
+ this.findOptions<ContentOrmEntity>(args, where),
149
+ );
150
+ }
151
+
152
+ @McpPermission('content', Action.READ)
153
+ @ToolGuards([McpPermissionGuard])
154
+ @Tool({
155
+ name: 'hexabot_content_get',
156
+ description: 'Read one CMS content record.',
157
+ parameters: z.object({
158
+ id: uuidSchema,
159
+ }),
160
+ })
161
+ async getContent(args: { id: string }) {
162
+ const content = await this.contentService.findOneAndPopulate(args.id);
163
+ if (!content) {
164
+ throw new NotFoundException(`Content ${args.id} not found`);
165
+ }
166
+
167
+ return content;
168
+ }
169
+
170
+ @McpPermission('content', Action.CREATE)
171
+ @ToolGuards([McpPermissionGuard])
172
+ @Tool({
173
+ name: 'hexabot_content_create',
174
+ description: 'Create a CMS content record.',
175
+ parameters: z.object({
176
+ contentType: uuidSchema,
177
+ title: z.string().min(1),
178
+ status: z.boolean().optional(),
179
+ properties: jsonObjectSchema.optional(),
180
+ }),
181
+ })
182
+ async createContent(args: {
183
+ contentType: string;
184
+ title: string;
185
+ status?: boolean;
186
+ properties?: Record<string, unknown>;
187
+ }) {
188
+ return await this.contentService.create(args as any);
189
+ }
190
+
191
+ @McpPermission('content', Action.UPDATE)
192
+ @ToolGuards([McpPermissionGuard])
193
+ @Tool({
194
+ name: 'hexabot_content_update',
195
+ description: 'Update a CMS content record.',
196
+ parameters: z.object({
197
+ id: uuidSchema,
198
+ contentType: uuidSchema.optional(),
199
+ title: z.string().min(1).optional(),
200
+ status: z.boolean().optional(),
201
+ properties: jsonObjectSchema.optional(),
202
+ }),
203
+ })
204
+ async updateContent(args: { id: string } & Record<string, unknown>) {
205
+ const { id, ...updates } = args;
206
+
207
+ return await this.contentService.updateOne(id, updates as any);
208
+ }
209
+
210
+ @McpPermission('content', Action.READ)
211
+ @ToolGuards([McpPermissionGuard])
212
+ @Tool({
213
+ name: 'hexabot_rag_content_search',
214
+ description: 'Search indexed CMS content through Hexabot RAG retrieval.',
215
+ parameters: z.object({
216
+ query: z.string().min(1),
217
+ mode: z.enum(['embedding', 'lexical']).optional(),
218
+ limit: z.number().int().min(1).max(50).default(10),
219
+ contentTypeId: uuidSchema.optional(),
220
+ includeInactive: z.boolean().optional(),
221
+ }),
222
+ })
223
+ async searchRagContent(args: {
224
+ query: string;
225
+ mode?: 'embedding' | 'lexical';
226
+ limit: number;
227
+ contentTypeId?: string;
228
+ includeInactive?: boolean;
229
+ }) {
230
+ return {
231
+ items: await this.contentService.retrieve(args.query, {
232
+ mode: args.mode,
233
+ limit: args.limit,
234
+ contentTypeId: args.contentTypeId,
235
+ includeInactive: args.includeInactive,
236
+ }),
237
+ };
238
+ }
239
+ }
@@ -0,0 +1,81 @@
1
+ /*
2
+ * Hexabot — Fair Core License (FCL-1.0-ALv2)
3
+ * Copyright (c) 2026 Hexastack.
4
+ * Full terms: see LICENSE.md.
5
+ */
6
+
7
+ import { Action } from '@hexabot-ai/types';
8
+ import { Injectable, NotFoundException } from '@nestjs/common';
9
+ import { Tool, ToolGuards } from '@rekog/mcp-nest';
10
+ import { z } from 'zod';
11
+
12
+ import { CredentialService } from '@/user/services/credential.service';
13
+
14
+ import { McpPermission } from '../decorators/mcp-permission.decorator';
15
+ import { McpPermissionGuard } from '../guards/mcp-permission.guard';
16
+
17
+ import { HexabotMcpToolBase } from './hexabot-mcp-tool.base';
18
+ import {
19
+ PaginationArgs,
20
+ paginationSchema,
21
+ uuidSchema,
22
+ } from './hexabot-mcp.schemas';
23
+ import { sanitizeCredential } from './hexabot-mcp.utils';
24
+
25
+ @Injectable()
26
+ export class HexabotCredentialMcpTools extends HexabotMcpToolBase {
27
+ constructor(private readonly credentialService: CredentialService) {
28
+ super();
29
+ }
30
+
31
+ @McpPermission('credential', Action.READ)
32
+ @ToolGuards([McpPermissionGuard])
33
+ @Tool({
34
+ name: 'hexabot_credential_search',
35
+ description:
36
+ 'Search credentials by metadata only. Secret credential values are never returned.',
37
+ parameters: z.object({
38
+ query: z.string().optional(),
39
+ ownerId: uuidSchema.optional(),
40
+ ...paginationSchema,
41
+ }),
42
+ })
43
+ async searchCredentials(
44
+ args: { query?: string; ownerId?: string } & PaginationArgs,
45
+ ) {
46
+ const where = {
47
+ ...(args.ownerId ? { owner: { id: args.ownerId } } : {}),
48
+ ...(args.query ? { name: this.contains(args.query) } : {}),
49
+ } as any;
50
+ const result = await this.listWithCount(
51
+ this.credentialService,
52
+ this.findOptions(args, where),
53
+ );
54
+
55
+ return {
56
+ ...result,
57
+ items: result.items.map((credential) =>
58
+ sanitizeCredential(credential as Record<string, unknown>),
59
+ ),
60
+ };
61
+ }
62
+
63
+ @McpPermission('credential', Action.READ)
64
+ @ToolGuards([McpPermissionGuard])
65
+ @Tool({
66
+ name: 'hexabot_credential_get',
67
+ description:
68
+ 'Read credential metadata. Secret credential values are never returned.',
69
+ parameters: z.object({
70
+ id: uuidSchema,
71
+ }),
72
+ })
73
+ async getCredential(args: { id: string }) {
74
+ const credential = await this.credentialService.findOneAndPopulate(args.id);
75
+ if (!credential) {
76
+ throw new NotFoundException(`Credential ${args.id} not found`);
77
+ }
78
+
79
+ return sanitizeCredential(credential as Record<string, unknown>);
80
+ }
81
+ }
@@ -0,0 +1,74 @@
1
+ /*
2
+ * Hexabot — Fair Core License (FCL-1.0-ALv2)
3
+ * Copyright (c) 2026 Hexastack.
4
+ * Full terms: see LICENSE.md.
5
+ */
6
+
7
+ import type { User } from '@hexabot-ai/types';
8
+ import { UnauthorizedException } from '@nestjs/common';
9
+ import { FindManyOptions, Like } from 'typeorm';
10
+
11
+ import { HexabotMcpRequest } from '../types';
12
+
13
+ import { PaginationArgs } from './hexabot-mcp.schemas';
14
+
15
+ export abstract class HexabotMcpToolBase {
16
+ protected findOptions<Entity>(
17
+ args: PaginationArgs,
18
+ where: FindManyOptions<Entity>['where'],
19
+ ): FindManyOptions<Entity> {
20
+ return {
21
+ where,
22
+ take: args.limit,
23
+ skip: args.skip,
24
+ order: { [args.sortBy]: args.sortDirection } as any,
25
+ };
26
+ }
27
+
28
+ protected async listWithCount<Entity>(
29
+ service: {
30
+ findAndPopulate(options?: FindManyOptions<Entity>): Promise<unknown[]>;
31
+ count(options?: FindManyOptions<Entity>): Promise<number>;
32
+ },
33
+ options: FindManyOptions<Entity>,
34
+ ) {
35
+ const [items, total] = await Promise.all([
36
+ service.findAndPopulate(options),
37
+ service.count({ where: options.where }),
38
+ ]);
39
+
40
+ return {
41
+ items,
42
+ total,
43
+ limit: options.take,
44
+ skip: options.skip,
45
+ };
46
+ }
47
+
48
+ protected contains(value: string) {
49
+ return Like(`%${value}%`);
50
+ }
51
+
52
+ protected resolveRelationId(
53
+ relation: string | { id?: string | null } | null | undefined,
54
+ ): string | null {
55
+ if (typeof relation === 'string') {
56
+ return relation;
57
+ }
58
+
59
+ return relation?.id ?? null;
60
+ }
61
+
62
+ protected getActor(request?: HexabotMcpRequest): User {
63
+ const actor = request?.hexabotUser ?? request?.user;
64
+ if (!actor?.id) {
65
+ throw new UnauthorizedException('MCP Hexabot user is required');
66
+ }
67
+
68
+ return actor as User;
69
+ }
70
+
71
+ protected getActorId(request?: HexabotMcpRequest): string {
72
+ return this.getActor(request).id;
73
+ }
74
+ }
@@ -0,0 +1,55 @@
1
+ /*
2
+ * Hexabot — Fair Core License (FCL-1.0-ALv2)
3
+ * Copyright (c) 2026 Hexastack.
4
+ * Full terms: see LICENSE.md.
5
+ */
6
+
7
+ import { z } from 'zod';
8
+
9
+ import {
10
+ DirectionType,
11
+ McpServerTransport,
12
+ WorkflowType,
13
+ } from '@/workflow/types';
14
+
15
+ export const uuidSchema = z.string().uuid();
16
+
17
+ export const jsonObjectSchema = z.record(z.string(), z.unknown());
18
+
19
+ export const paginationSchema = {
20
+ limit: z.number().int().min(1).max(100).default(20),
21
+ skip: z.number().int().min(0).default(0),
22
+ sortBy: z.string().default('createdAt'),
23
+ sortDirection: z.enum(['ASC', 'DESC']).default('DESC'),
24
+ };
25
+
26
+ export const workflowPayloadSchema = {
27
+ name: z.string().min(1).optional(),
28
+ description: z.string().optional(),
29
+ type: z.enum(WorkflowType).optional(),
30
+ schedule: z.string().nullable().optional(),
31
+ inputSchema: jsonObjectSchema.optional(),
32
+ builtin: z.boolean().optional(),
33
+ x: z.number().optional(),
34
+ y: z.number().optional(),
35
+ zoom: z.number().optional(),
36
+ direction: z.enum(DirectionType).optional(),
37
+ };
38
+
39
+ export const mcpServerPayloadSchema = {
40
+ name: z.string().min(1).optional(),
41
+ enabled: z.boolean().optional(),
42
+ transport: z.enum(McpServerTransport).optional(),
43
+ url: z.string().nullable().optional(),
44
+ command: z.string().nullable().optional(),
45
+ args: z.array(z.string()).nullable().optional(),
46
+ cwd: z.string().nullable().optional(),
47
+ credential: uuidSchema.nullable().optional(),
48
+ };
49
+
50
+ export type PaginationArgs = {
51
+ limit: number;
52
+ skip: number;
53
+ sortBy: string;
54
+ sortDirection: 'ASC' | 'DESC';
55
+ };