@hexabot-ai/api 3.2.7 → 3.3.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.
- package/dist/channel/channel.module.js +2 -0
- package/dist/channel/channel.module.js.map +1 -1
- package/dist/channel/entities/source.entity.d.ts +38 -0
- package/dist/channel/webhook.controller.d.ts +4 -1
- package/dist/channel/webhook.controller.js +19 -1
- package/dist/channel/webhook.controller.js.map +1 -1
- package/dist/chat/services/chat.service.js +4 -2
- package/dist/chat/services/chat.service.js.map +1 -1
- package/dist/chat/services/thread.service.js +6 -2
- package/dist/chat/services/thread.service.js.map +1 -1
- package/dist/mcp/tools/hexabot-mcp-tool.base.d.ts +0 -3
- package/dist/mcp/tools/hexabot-mcp-tool.base.js +0 -6
- package/dist/mcp/tools/hexabot-mcp-tool.base.js.map +1 -1
- package/dist/mcp/tools/hexabot-mcp.utils.d.ts +3 -0
- package/dist/mcp/tools/hexabot-mcp.utils.js +8 -1
- package/dist/mcp/tools/hexabot-mcp.utils.js.map +1 -1
- package/dist/mcp/tools/workflow-mcp.helper.d.ts +19 -1
- package/dist/mcp/tools/workflow-mcp.helper.js +2 -7
- package/dist/mcp/tools/workflow-mcp.helper.js.map +1 -1
- package/dist/mcp/tools/workflow-mcp.tools.d.ts +114 -0
- package/dist/mcp/tools/workflow-run-mcp.tools.d.ts +38 -0
- package/dist/mcp/tools/workflow-run-mcp.tools.js +1 -1
- package/dist/mcp/tools/workflow-run-mcp.tools.js.map +1 -1
- package/dist/mcp/tools/workflow-version-mcp.tools.d.ts +0 -22
- package/dist/mcp/tools/workflow-version-mcp.tools.js +3 -24
- package/dist/mcp/tools/workflow-version-mcp.tools.js.map +1 -1
- package/dist/static/assets/{cssMode-v8DOzA4o.js → cssMode-CVfTJuzy.js} +1 -1
- package/dist/static/assets/{freemarker2-B92dv90I.js → freemarker2-BA7GKqB7.js} +1 -1
- package/dist/static/assets/{handlebars-Dw3f_475.js → handlebars-BCwvKzIX.js} +1 -1
- package/dist/static/assets/{html-BLTdldWn.js → html-f6_JN1YY.js} +1 -1
- package/dist/static/assets/{htmlMode-tP1xHfwv.js → htmlMode-f4asMwRs.js} +1 -1
- package/dist/static/assets/index-CLS5CNoN.css +1 -0
- package/dist/static/assets/{index-1C1RUhvE.js → index-X6nbc-0C.js} +399 -392
- package/dist/static/assets/{javascript-D6zFkYDA.js → javascript-DaS6vtZ9.js} +1 -1
- package/dist/static/assets/{jsonMode-Casc9QAu.js → jsonMode-Ct41J50t.js} +1 -1
- package/dist/static/assets/{liquid-CiiGxWfs.js → liquid-4giXfRN2.js} +1 -1
- package/dist/static/assets/{lspLanguageFeatures-DDa9NCMy.js → lspLanguageFeatures-CqJlQWTJ.js} +1 -1
- package/dist/static/assets/{mdx-CkcXhfmV.js → mdx-DcO2npTr.js} +1 -1
- package/dist/static/assets/{python-CBPYdNzT.js → python-D7O1gNbd.js} +1 -1
- package/dist/static/assets/{razor-BU2J-T3U.js → razor-K5r5YQ4D.js} +1 -1
- package/dist/static/assets/{tsMode-CMXRM61t.js → tsMode-CvIEOKtw.js} +1 -1
- package/dist/static/assets/{typescript-GDvJ0GIf.js → typescript-BKjAKJn9.js} +1 -1
- package/dist/static/assets/{xml-CSlsq1iC.js → xml-BpIa2Zv1.js} +1 -1
- package/dist/static/assets/{yaml-stKXP2Du.js → yaml-BJzMbZhP.js} +1 -1
- package/dist/static/index.html +2 -2
- package/dist/static/locales/en/translation.json +75 -2
- package/dist/static/locales/fr/translation.json +72 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/user/services/passwordReset.service.js +2 -1
- package/dist/user/services/passwordReset.service.js.map +1 -1
- package/dist/workflow/controllers/workflow-version.controller.d.ts +38 -0
- package/dist/workflow/controllers/workflow.controller.d.ts +43 -6
- package/dist/workflow/controllers/workflow.controller.js +23 -13
- package/dist/workflow/controllers/workflow.controller.js.map +1 -1
- package/dist/workflow/dto/workflow.dto.d.ts +40 -1
- package/dist/workflow/dto/workflow.dto.js +10 -0
- package/dist/workflow/dto/workflow.dto.js.map +1 -1
- package/dist/workflow/entities/memory-record.entity.d.ts +38 -0
- package/dist/workflow/entities/workflow-run.entity.d.ts +38 -0
- package/dist/workflow/entities/workflow-version.entity.d.ts +38 -0
- package/dist/workflow/entities/workflow.entity.d.ts +78 -0
- package/dist/workflow/entities/workflow.entity.js +4 -0
- package/dist/workflow/entities/workflow.entity.js.map +1 -1
- package/dist/workflow/guards/webhook-trigger.guard.d.ts +17 -0
- package/dist/workflow/guards/webhook-trigger.guard.js +139 -0
- package/dist/workflow/guards/webhook-trigger.guard.js.map +1 -0
- package/dist/workflow/services/agentic.service.d.ts +14 -2
- package/dist/workflow/services/agentic.service.js +17 -4
- package/dist/workflow/services/agentic.service.js.map +1 -1
- package/dist/workflow/services/webhook-trigger.service.d.ts +27 -0
- package/dist/workflow/services/webhook-trigger.service.js +90 -0
- package/dist/workflow/services/webhook-trigger.service.js.map +1 -0
- package/dist/workflow/services/workflow-run.service.d.ts +1 -0
- package/dist/workflow/services/workflow-run.service.js +9 -0
- package/dist/workflow/services/workflow-run.service.js.map +1 -1
- package/dist/workflow/workflow.module.js +8 -0
- package/dist/workflow/workflow.module.js.map +1 -1
- package/package.json +5 -6
- package/src/channel/README.md +17 -0
- package/src/channel/channel.module.ts +4 -0
- package/src/channel/webhook.controller.ts +46 -1
- package/src/chat/services/chat.service.ts +5 -4
- package/src/chat/services/thread.service.ts +10 -2
- package/src/mcp/README.md +2 -3
- package/src/mcp/tools/hexabot-mcp-tool.base.ts +0 -10
- package/src/mcp/tools/hexabot-mcp.utils.ts +10 -0
- package/src/mcp/tools/workflow-mcp.helper.ts +3 -11
- package/src/mcp/tools/workflow-run-mcp.tools.ts +2 -2
- package/src/mcp/tools/workflow-version-mcp.tools.ts +3 -29
- package/src/user/services/passwordReset.service.ts +9 -2
- package/src/workflow/controllers/workflow.controller.ts +36 -10
- package/src/workflow/dto/workflow.dto.ts +12 -0
- package/src/workflow/entities/workflow.entity.ts +11 -1
- package/src/workflow/guards/webhook-trigger.guard.ts +193 -0
- package/src/workflow/services/agentic.service.ts +27 -3
- package/src/workflow/services/webhook-trigger.service.ts +169 -0
- package/src/workflow/services/workflow-run.service.ts +21 -0
- package/src/workflow/workflow.module.ts +8 -0
- package/dist/static/assets/index-DyBPx3f5.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-run.service.js","sourceRoot":"","sources":["../../../src/workflow/services/workflow-run.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workflow-run.service.js","sourceRoot":"","sources":["../../../src/workflow/services/workflow-run.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.WorkflowModule = void 0;
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
|
+
const jwt_1 = require("@nestjs/jwt");
|
|
11
12
|
const schedule_1 = require("@nestjs/schedule");
|
|
12
13
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
13
14
|
const chat_module_1 = require("../chat/chat.module");
|
|
@@ -29,6 +30,7 @@ const memory_record_entity_1 = require("./entities/memory-record.entity");
|
|
|
29
30
|
const workflow_run_entity_1 = require("./entities/workflow-run.entity");
|
|
30
31
|
const workflow_version_entity_1 = require("./entities/workflow-version.entity");
|
|
31
32
|
const workflow_entity_1 = require("./entities/workflow.entity");
|
|
33
|
+
const webhook_trigger_guard_1 = require("./guards/webhook-trigger.guard");
|
|
32
34
|
const mcp_server_repository_1 = require("./repositories/mcp-server.repository");
|
|
33
35
|
const memory_definition_repository_1 = require("./repositories/memory-definition.repository");
|
|
34
36
|
const memory_record_repository_1 = require("./repositories/memory-record.repository");
|
|
@@ -43,6 +45,7 @@ const mcp_server_service_1 = require("./services/mcp-server.service");
|
|
|
43
45
|
const memory_definition_service_1 = require("./services/memory-definition.service");
|
|
44
46
|
const memory_record_service_1 = require("./services/memory-record.service");
|
|
45
47
|
const memory_service_1 = require("./services/memory.service");
|
|
48
|
+
const webhook_trigger_service_1 = require("./services/webhook-trigger.service");
|
|
46
49
|
const workflow_run_service_1 = require("./services/workflow-run.service");
|
|
47
50
|
const workflow_scheduler_service_1 = require("./services/workflow-scheduler.service");
|
|
48
51
|
const workflow_version_service_1 = require("./services/workflow-version.service");
|
|
@@ -66,6 +69,7 @@ exports.WorkflowModule = WorkflowModule = __decorate([
|
|
|
66
69
|
(0, common_1.forwardRef)(() => cms_module_1.CmsModule),
|
|
67
70
|
(0, common_1.forwardRef)(() => chat_module_1.ChatModule),
|
|
68
71
|
user_module_1.UserModule,
|
|
72
|
+
jwt_1.JwtModule.register({}),
|
|
69
73
|
],
|
|
70
74
|
controllers: [
|
|
71
75
|
workflow_controller_1.WorkflowController,
|
|
@@ -98,6 +102,8 @@ exports.WorkflowModule = WorkflowModule = __decorate([
|
|
|
98
102
|
scheduled_workflow_context_1.ScheduledWorkflowContext,
|
|
99
103
|
workflow_context_factory_1.WorkflowContextFactory,
|
|
100
104
|
agentic_service_1.AgenticService,
|
|
105
|
+
webhook_trigger_service_1.WebhookTriggerService,
|
|
106
|
+
webhook_trigger_guard_1.WebhookTriggerGuard,
|
|
101
107
|
{ provide: types_1.WORKFLOW_CALL_SERVICE, useExisting: agentic_service_1.AgenticService },
|
|
102
108
|
],
|
|
103
109
|
exports: [
|
|
@@ -117,6 +123,8 @@ exports.WorkflowModule = WorkflowModule = __decorate([
|
|
|
117
123
|
mcp_client_pool_service_1.McpClientPoolService,
|
|
118
124
|
conversational_workflow_context_1.ConversationalWorkflowContext,
|
|
119
125
|
agentic_service_1.AgenticService,
|
|
126
|
+
webhook_trigger_service_1.WebhookTriggerService,
|
|
127
|
+
webhook_trigger_guard_1.WebhookTriggerGuard,
|
|
120
128
|
types_1.WORKFLOW_CALL_SERVICE,
|
|
121
129
|
],
|
|
122
130
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.module.js","sourceRoot":"","sources":["../../src/workflow/workflow.module.ts"],"names":[],"mappings":";;;;;;;;;AAMA,2CAAoD;AACpD,+CAAqD;AACrD,6CAAgD;AAEhD,qDAAgD;AAChD,kEAAgE;AAChE,kDAA6C;AAC7C,qDAAgD;AAEhD,gGAA2F;AAC3F,gFAA2E;AAC3E,sFAAiF;AACjF,kFAA6E;AAC7E,+EAA0E;AAC1E,6FAAwF;AACxF,mFAA8E;AAC9E,2FAAsF;AACtF,2EAAuE;AACvE,oEAAkE;AAClE,kFAAgF;AAChF,0EAAwE;AACxE,wEAAsE;AACtE,gFAA8E;AAC9E,gEAA+D;AAC/D,gFAA2E;AAC3E,8FAAyF;AACzF,sFAAiF;AACjF,oFAA+E;AAC/E,4FAAuF;AACvF,4EAAwE;AACxE,2EAAwE;AACxE,yDAAuD;AACvD,gEAA4D;AAC5D,gFAA0E;AAC1E,sEAAiE;AACjE,oFAA+E;AAC/E,4EAAuE;AACvE,8DAA0D;AAC1D,0EAAqE;AACrE,sFAAiF;AACjF,kFAA6E;AAC7E,kEAA8D;AAC9D,mCAAgD;
|
|
1
|
+
{"version":3,"file":"workflow.module.js","sourceRoot":"","sources":["../../src/workflow/workflow.module.ts"],"names":[],"mappings":";;;;;;;;;AAMA,2CAAoD;AACpD,qCAAwC;AACxC,+CAAqD;AACrD,6CAAgD;AAEhD,qDAAgD;AAChD,kEAAgE;AAChE,kDAA6C;AAC7C,qDAAgD;AAEhD,gGAA2F;AAC3F,gFAA2E;AAC3E,sFAAiF;AACjF,kFAA6E;AAC7E,+EAA0E;AAC1E,6FAAwF;AACxF,mFAA8E;AAC9E,2FAAsF;AACtF,2EAAuE;AACvE,oEAAkE;AAClE,kFAAgF;AAChF,0EAAwE;AACxE,wEAAsE;AACtE,gFAA8E;AAC9E,gEAA+D;AAC/D,0EAAqE;AACrE,gFAA2E;AAC3E,8FAAyF;AACzF,sFAAiF;AACjF,oFAA+E;AAC/E,4FAAuF;AACvF,4EAAwE;AACxE,2EAAwE;AACxE,yDAAuD;AACvD,gEAA4D;AAC5D,gFAA0E;AAC1E,sEAAiE;AACjE,oFAA+E;AAC/E,4EAAuE;AACvE,8DAA0D;AAC1D,gFAA2E;AAC3E,0EAAqE;AACrE,sFAAiF;AACjF,kFAA6E;AAC7E,kEAA8D;AAC9D,mCAAgD;AA2EzC,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAzE1B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,uBAAa,CAAC,UAAU,CAAC;gBACvB,mCAAiB;gBACjB,kDAAwB;gBACxB,0CAAoB;gBACpB,oDAAyB;gBACzB,4CAAqB;gBACrB,sCAAkB;gBAClB,+BAAe;aAChB,CAAC;YACF,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,sBAAS,CAAC;YAC3B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;YAC5B,wBAAU;YACV,eAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;SACvB;QACD,WAAW,EAAE;YACX,wCAAkB;YAClB,uDAAyB;YACzB,+CAAqB;YACrB,yDAA0B;YAC1B,2CAAmB;SACpB;QACD,SAAS,EAAE;YACT,wCAAkB;YAClB,uDAAyB;YACzB,+CAAqB;YACrB,yDAA0B;YAC1B,iDAAsB;YACtB,2CAAmB;YACnB,+CAAsB;YACtB,8BAAc;YACd,kCAAe;YACf,iDAAsB;YACtB,yCAAkB;YAClB,mDAAuB;YACvB,2CAAmB;YACnB,8BAAa;YACb,qCAAgB;YAChB,8CAAoB;YACpB,4BAAiB;YACjB,qDAAwB;YACxB,+DAA6B;YAC7B,+CAAqB;YACrB,qDAAwB;YACxB,iDAAsB;YACtB,gCAAc;YACd,+CAAqB;YACrB,2CAAmB;YACnB,EAAE,OAAO,EAAE,6BAAqB,EAAE,WAAW,EAAE,gCAAc,EAAE;SAChE;QACD,OAAO,EAAE;YACP,wCAAkB;YAClB,uDAAyB;YACzB,+CAAqB;YACrB,yDAA0B;YAC1B,iDAAsB;YACtB,2CAAmB;YACnB,kCAAe;YACf,iDAAsB;YACtB,yCAAkB;YAClB,mDAAuB;YACvB,2CAAmB;YACnB,8BAAa;YACb,qCAAgB;YAChB,8CAAoB;YACpB,+DAA6B;YAC7B,gCAAc;YACd,+CAAqB;YACrB,2CAAmB;YACnB,6BAAqB;SACtB;KACF,CAAC;GACW,cAAc,CAAG"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hexabot-ai/api",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.3.0",
|
|
5
5
|
"description": "Hexabot is a solution for creating and managing chatbots across multiple channels, leveraging AI for advanced conversational capabilities. It provides a user-friendly interface for building, training, and deploying chatbots with integrated support for various messaging platforms.",
|
|
6
6
|
"author": "Hexastack",
|
|
7
7
|
"license": "FCL-1.0-ALv2",
|
|
@@ -93,14 +93,15 @@
|
|
|
93
93
|
"typeorm": "^0.3.29",
|
|
94
94
|
"yaml": "^2.8.3",
|
|
95
95
|
"zod": "^4.3.6",
|
|
96
|
-
"@hexabot-ai/agentic": "3.
|
|
97
|
-
"@hexabot-ai/types": "3.0
|
|
96
|
+
"@hexabot-ai/agentic": "3.2.0",
|
|
97
|
+
"@hexabot-ai/types": "3.1.0"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
100
|
"@compodoc/compodoc": "^1.2.1",
|
|
101
101
|
"@nestjs/cli": "^11.0.21",
|
|
102
102
|
"@nestjs/schematics": "^11.1.0",
|
|
103
103
|
"@nestjs/testing": "^11.1.19",
|
|
104
|
+
"@swc/cli": "^0.8.1",
|
|
104
105
|
"@swc/core": "^1.15.32",
|
|
105
106
|
"@swc/jest": "^0.2.39",
|
|
106
107
|
"@types/cookie-parser": "^1.4.9",
|
|
@@ -115,7 +116,6 @@
|
|
|
115
116
|
"@types/module-alias": "^2.0.4",
|
|
116
117
|
"@types/multer": "^2.0.0",
|
|
117
118
|
"@types/node": "^20.3.1",
|
|
118
|
-
"@types/node-fetch": "^2.6.13",
|
|
119
119
|
"@types/nodemailer": "^8.0.0",
|
|
120
120
|
"@types/papaparse": "^5.3.16",
|
|
121
121
|
"@types/passport-anonymous": "^1.0.5",
|
|
@@ -132,7 +132,6 @@
|
|
|
132
132
|
"eslint-plugin-header": "^3.1.1",
|
|
133
133
|
"eslint-plugin-import": "^2.32.0",
|
|
134
134
|
"eslint-plugin-prettier": "^5.5.4",
|
|
135
|
-
"husky": "^8.0.0",
|
|
136
135
|
"jest": "^30.2.0",
|
|
137
136
|
"lint-staged": "^15.3.0",
|
|
138
137
|
"prettier": "^3.6.2",
|
|
@@ -144,7 +143,7 @@
|
|
|
144
143
|
"tsconfig-paths": "^4.2.0",
|
|
145
144
|
"tsconfig-paths-jest": "^0.0.1",
|
|
146
145
|
"typescript": "^5.8.3",
|
|
147
|
-
"@hexabot-ai/frontend": "3.
|
|
146
|
+
"@hexabot-ai/frontend": "3.3.0"
|
|
148
147
|
},
|
|
149
148
|
"optionalDependencies": {
|
|
150
149
|
"@css-inline/css-inline-linux-arm64-musl": "^0.14.1",
|
package/src/channel/README.md
CHANGED
|
@@ -33,6 +33,7 @@ At request time:
|
|
|
33
33
|
|
|
34
34
|
`WebhookController` is mounted at `/webhook` (effective path is `/api/webhook/*` because of the global `/api` prefix):
|
|
35
35
|
|
|
36
|
+
- `POST /api/webhook/:id/trigger`
|
|
36
37
|
- `GET /api/webhook/:sourceRef`
|
|
37
38
|
- `POST /api/webhook/:sourceRef`
|
|
38
39
|
- `GET /api/webhook/:sourceRef/:workflowId`
|
|
@@ -40,6 +41,22 @@ At request time:
|
|
|
40
41
|
- `GET /api/webhook/:sourceRef/download/:name?t=<jwt>`
|
|
41
42
|
- `GET /api/webhook/:sourceRef/not-found`
|
|
42
43
|
|
|
44
|
+
### Manual Workflow Trigger
|
|
45
|
+
|
|
46
|
+
`POST /api/webhook/:id/trigger` runs a manual workflow from an external caller.
|
|
47
|
+
It is declared before the `:sourceRef/:workflowId` catch-all so it wins route
|
|
48
|
+
resolution. The endpoint is CSRF-exempt like the rest of `/webhook/*`.
|
|
49
|
+
|
|
50
|
+
- `WebhookTriggerGuard` (workflow module) authorizes the call: the workflow
|
|
51
|
+
must exist, be `manual`, have `webhookTrigger.enabled`, and the request must
|
|
52
|
+
satisfy the configured auth (`none`, `basic`, `header`, or `jwt`). Workflows
|
|
53
|
+
that are not exposed as webhooks respond `404` without disclosing existence.
|
|
54
|
+
- The JSON request body is the workflow input and is validated against the
|
|
55
|
+
workflow `inputSchema` (`400` on mismatch).
|
|
56
|
+
- The run executes synchronously; the `200` response carries the outcome:
|
|
57
|
+
`{ runId, status, output, error }`. When no run could be started the endpoint
|
|
58
|
+
responds `422`.
|
|
59
|
+
|
|
43
60
|
Also available:
|
|
44
61
|
|
|
45
62
|
- `GET /api/channel` returns channel metadata (`name`, `visibility`, settings JSON schema).
|
|
@@ -13,6 +13,7 @@ import { InjectDynamicProviders } from 'nestjs-dynamic-providers';
|
|
|
13
13
|
import { AttachmentModule } from '@/attachment/attachment.module';
|
|
14
14
|
import { ChatModule } from '@/chat/chat.module';
|
|
15
15
|
import { CmsModule } from '@/cms/cms.module';
|
|
16
|
+
import { UserModule } from '@/user/user.module';
|
|
16
17
|
import { WorkflowOrmEntity } from '@/workflow/entities/workflow.entity';
|
|
17
18
|
import { WorkflowModule } from '@/workflow/workflow.module';
|
|
18
19
|
|
|
@@ -51,6 +52,9 @@ export interface ChannelModuleOptions {
|
|
|
51
52
|
JwtModule,
|
|
52
53
|
TypeOrmModule.forFeature([SourceOrmEntity, WorkflowOrmEntity]),
|
|
53
54
|
forwardRef(() => WorkflowModule),
|
|
55
|
+
// WebhookTriggerGuard is instantiated in this module's context (the
|
|
56
|
+
// trigger route lives on WebhookController) and needs CredentialService.
|
|
57
|
+
UserModule,
|
|
54
58
|
],
|
|
55
59
|
controllers: [WebhookController, ChannelController, SourceController],
|
|
56
60
|
providers: [
|
|
@@ -4,12 +4,28 @@
|
|
|
4
4
|
* Full terms: see LICENSE.md.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
Body,
|
|
9
|
+
Controller,
|
|
10
|
+
Get,
|
|
11
|
+
HttpCode,
|
|
12
|
+
Param,
|
|
13
|
+
Post,
|
|
14
|
+
Query,
|
|
15
|
+
Req,
|
|
16
|
+
Res,
|
|
17
|
+
UseGuards,
|
|
18
|
+
} from '@nestjs/common';
|
|
8
19
|
import { Request, Response } from 'express';
|
|
9
20
|
|
|
10
21
|
import { LoggerService } from '@/logger/logger.service';
|
|
11
22
|
import { UuidParam } from '@/utils';
|
|
12
23
|
import { Roles } from '@/utils/decorators/roles.decorator';
|
|
24
|
+
import { WebhookTriggerGuard } from '@/workflow/guards/webhook-trigger.guard';
|
|
25
|
+
import {
|
|
26
|
+
WebhookTriggerService,
|
|
27
|
+
WorkflowTriggerResult,
|
|
28
|
+
} from '@/workflow/services/webhook-trigger.service';
|
|
13
29
|
|
|
14
30
|
import { ChannelService } from './channel.service';
|
|
15
31
|
import { ChannelDownloadService } from './services/channel-download.service';
|
|
@@ -19,9 +35,38 @@ export class WebhookController {
|
|
|
19
35
|
constructor(
|
|
20
36
|
private readonly channelService: ChannelService,
|
|
21
37
|
private readonly channelDownloadService: ChannelDownloadService,
|
|
38
|
+
private readonly webhookTriggerService: WebhookTriggerService,
|
|
22
39
|
private readonly logger: LoggerService,
|
|
23
40
|
) {}
|
|
24
41
|
|
|
42
|
+
/**
|
|
43
|
+
* Public webhook endpoint that triggers a manual workflow run.
|
|
44
|
+
*
|
|
45
|
+
* {@link WebhookTriggerGuard} authenticates the request; this handler only
|
|
46
|
+
* forwards the workflow ID and payload to the service. The run executes
|
|
47
|
+
* synchronously and the response carries its final status and output.
|
|
48
|
+
*
|
|
49
|
+
* The whole request body is the workflow input, so third-party services
|
|
50
|
+
* that emit fixed body shapes can call the endpoint directly.
|
|
51
|
+
*
|
|
52
|
+
* Declared before the `:sourceRef/:workflowId` catch-all so `POST
|
|
53
|
+
* /webhook/:id/trigger` is matched first: NestJS registers routes in method
|
|
54
|
+
* definition order and Express 5 resolves overlapping dynamic routes by
|
|
55
|
+
* registration order.
|
|
56
|
+
*
|
|
57
|
+
* @param input - Optional workflow input payload (the request body).
|
|
58
|
+
*/
|
|
59
|
+
@Roles('public')
|
|
60
|
+
@UseGuards(WebhookTriggerGuard)
|
|
61
|
+
@Post(':id/trigger')
|
|
62
|
+
@HttpCode(200)
|
|
63
|
+
async trigger(
|
|
64
|
+
@UuidParam('id') id: string,
|
|
65
|
+
@Body() input: unknown = {},
|
|
66
|
+
): Promise<WorkflowTriggerResult> {
|
|
67
|
+
return await this.webhookTriggerService.trigger(id, input);
|
|
68
|
+
}
|
|
69
|
+
|
|
25
70
|
@Roles('public')
|
|
26
71
|
@Get(':sourceRef/download/:name')
|
|
27
72
|
async handleDownload(
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { forwardRef, Inject, Injectable } from '@nestjs/common';
|
|
8
8
|
import { EventEmitter2, OnEvent } from '@nestjs/event-emitter';
|
|
9
|
-
import { In } from 'typeorm';
|
|
9
|
+
import { Between, In } from 'typeorm';
|
|
10
10
|
|
|
11
11
|
import { StatsType } from '@/analytics/entities/stats.entity';
|
|
12
12
|
import { MessageInboundEvent } from '@/channel/lib/inbound-events';
|
|
@@ -183,9 +183,10 @@ export class ChatService {
|
|
|
183
183
|
try {
|
|
184
184
|
await this.messageService.updateMany(
|
|
185
185
|
{
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
186
|
+
where: {
|
|
187
|
+
recipient: { id: subscriber.id },
|
|
188
|
+
createdAt: Between(start, watermark),
|
|
189
|
+
},
|
|
189
190
|
},
|
|
190
191
|
{
|
|
191
192
|
delivery: true,
|
|
@@ -218,7 +218,7 @@ export class ThreadService extends BaseOrmService<ThreadOrmEntity> {
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
if (explicit.status === 'closed') {
|
|
221
|
-
return await this.
|
|
221
|
+
return await this.createThread(subscriberId, null, sourceId);
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
await this.touchThread(explicit.id, now);
|
|
@@ -286,7 +286,15 @@ export class ThreadService extends BaseOrmService<ThreadOrmEntity> {
|
|
|
286
286
|
);
|
|
287
287
|
}
|
|
288
288
|
|
|
289
|
-
|
|
289
|
+
if (explicit.status !== 'closed') {
|
|
290
|
+
return explicit;
|
|
291
|
+
}
|
|
292
|
+
// Explicit thread is closed; fall through to the latest open thread
|
|
293
|
+
// so callers (subscribe/history flows) don't serve stale history.
|
|
294
|
+
const latestOpenAfterClose =
|
|
295
|
+
await this.repository.findLatestOpenThreadForSubscriber(subscriberId);
|
|
296
|
+
|
|
297
|
+
return latestOpenAfterClose ?? null;
|
|
290
298
|
}
|
|
291
299
|
|
|
292
300
|
const latestOpen =
|
package/src/mcp/README.md
CHANGED
|
@@ -160,8 +160,7 @@ Workflow YAML is validated with `parseWorkflowDefinition()` before a version is
|
|
|
160
160
|
created. Coding agents can call `hexabot_workflow_yaml_validate` first to get
|
|
161
161
|
structured validation errors without mutating workflow state. Commits inherit
|
|
162
162
|
the workflow's current version as their parent unless `parentVersion` is
|
|
163
|
-
explicitly supplied. `hexabot_workflow_rollback`
|
|
164
|
-
`hexabot_workflow_version_restore` both create a new current restore snapshot;
|
|
163
|
+
explicitly supplied. `hexabot_workflow_rollback` creates a new current restore snapshot;
|
|
165
164
|
publish that snapshot with `hexabot_workflow_publish` when it should become the
|
|
166
165
|
published version.
|
|
167
166
|
|
|
@@ -178,7 +177,7 @@ version checksum and total byte length so clients can verify reconstruction.
|
|
|
178
177
|
| `hexabot_workflow_version_search` | `workflowversion:read` | List compact version metadata for a workflow. |
|
|
179
178
|
| `hexabot_workflow_version_get` | `workflowversion:read` | Read compact version metadata. |
|
|
180
179
|
| `hexabot_workflow_version_update` | `workflowversion:update` | Update workflow version metadata. |
|
|
181
|
-
| `
|
|
180
|
+
| `hexabot_workflow_rollback` | `workflowversion:create` | Restore a previous version by creating a new snapshot. |
|
|
182
181
|
| `hexabot_workflow_run_search` | `workflowrun:read` | Search workflow runs by workflow and status. |
|
|
183
182
|
| `hexabot_workflow_run_get` | `workflowrun:read` | Read one workflow run with populated workflow metadata but no nested YAML body. |
|
|
184
183
|
| `hexabot_workflow_run_debug` | `workflowrun:read` | Inspect one workflow run with execution state and parent/child run context for troubleshooting. |
|
|
@@ -49,16 +49,6 @@ export abstract class HexabotMcpToolBase {
|
|
|
49
49
|
return Like(`%${value}%`);
|
|
50
50
|
}
|
|
51
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
52
|
protected getActor(request?: HexabotMcpRequest): User {
|
|
63
53
|
const actor = request?.hexabotUser ?? request?.user;
|
|
64
54
|
if (!actor?.id) {
|
|
@@ -27,3 +27,13 @@ export const omitKeysDeep = <T>(value: T, keys: readonly string[]): T => {
|
|
|
27
27
|
.map(([key, nestedValue]) => [key, omitKeysDeep(nestedValue, keys)]),
|
|
28
28
|
) as T;
|
|
29
29
|
};
|
|
30
|
+
|
|
31
|
+
export const resolveRelationId = (
|
|
32
|
+
relation: string | { id?: string | null } | null | undefined,
|
|
33
|
+
): string | null => {
|
|
34
|
+
if (typeof relation === 'string') {
|
|
35
|
+
return relation;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return relation?.id ?? null;
|
|
39
|
+
};
|
|
@@ -21,6 +21,8 @@ import { WorkflowVersionService } from '@/workflow/services/workflow-version.ser
|
|
|
21
21
|
import { WorkflowService } from '@/workflow/services/workflow.service';
|
|
22
22
|
import { WorkflowVersionAction } from '@/workflow/types';
|
|
23
23
|
|
|
24
|
+
import { resolveRelationId } from './hexabot-mcp.utils';
|
|
25
|
+
|
|
24
26
|
type WorkflowVersionLike = WorkflowVersion | WorkflowVersionFull;
|
|
25
27
|
|
|
26
28
|
type WorkflowVersionSummary = Pick<
|
|
@@ -85,7 +87,7 @@ export class HexabotWorkflowMcpHelper {
|
|
|
85
87
|
}
|
|
86
88
|
const parentVersion =
|
|
87
89
|
params.parentVersion === undefined
|
|
88
|
-
?
|
|
90
|
+
? resolveRelationId(workflow.currentVersion)
|
|
89
91
|
: params.parentVersion;
|
|
90
92
|
const payload: WorkflowNewVersionDto = {
|
|
91
93
|
workflow: params.workflowId,
|
|
@@ -206,14 +208,4 @@ export class HexabotWorkflowMcpHelper {
|
|
|
206
208
|
Object.entries(summary).filter(([, value]) => value !== undefined),
|
|
207
209
|
) as WorkflowVersionSummary;
|
|
208
210
|
}
|
|
209
|
-
|
|
210
|
-
private resolveRelationId(
|
|
211
|
-
relation: string | { id?: string | null } | null | undefined,
|
|
212
|
-
): string | null {
|
|
213
|
-
if (typeof relation === 'string') {
|
|
214
|
-
return relation;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
return relation?.id ?? null;
|
|
218
|
-
}
|
|
219
211
|
}
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
paginationSchema,
|
|
40
40
|
uuidSchema,
|
|
41
41
|
} from './hexabot-mcp.schemas';
|
|
42
|
-
import { omitKeysDeep } from './hexabot-mcp.utils';
|
|
42
|
+
import { omitKeysDeep, resolveRelationId } from './hexabot-mcp.utils';
|
|
43
43
|
|
|
44
44
|
const WORKFLOW_DEFINITION_RESPONSE_KEYS = ['definitionYml'] as const;
|
|
45
45
|
|
|
@@ -175,7 +175,7 @@ export class HexabotWorkflowRunMcpTools extends HexabotMcpToolBase {
|
|
|
175
175
|
|
|
176
176
|
const includeRelatedRuns = args.includeRelatedRuns ?? true;
|
|
177
177
|
const childRunsLimit = args.childRunsLimit ?? 10;
|
|
178
|
-
const parentRunId =
|
|
178
|
+
const parentRunId = resolveRelationId(run.parentRun);
|
|
179
179
|
const childWhere = { parentRun: { id: run.id } } as any;
|
|
180
180
|
const [parentRun, childRuns, childRunTotal] = includeRelatedRuns
|
|
181
181
|
? await Promise.all([
|
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
paginationSchema,
|
|
35
35
|
uuidSchema,
|
|
36
36
|
} from './hexabot-mcp.schemas';
|
|
37
|
+
import { resolveRelationId } from './hexabot-mcp.utils';
|
|
37
38
|
import { HexabotWorkflowMcpHelper } from './workflow-mcp.helper';
|
|
38
39
|
|
|
39
40
|
@Injectable()
|
|
@@ -199,7 +200,7 @@ export class HexabotWorkflowVersionMcpTools extends HexabotMcpToolBase {
|
|
|
199
200
|
const limit = args.limit ?? 16000;
|
|
200
201
|
const { chunk, chunkByteLength, endOffset, totalByteLength } =
|
|
201
202
|
this.sliceUtf8Chunk(definitionYml, offset, limit);
|
|
202
|
-
const workflowId =
|
|
203
|
+
const workflowId = resolveRelationId(version.workflow);
|
|
203
204
|
|
|
204
205
|
return {
|
|
205
206
|
workflowId,
|
|
@@ -243,33 +244,6 @@ export class HexabotWorkflowVersionMcpTools extends HexabotMcpToolBase {
|
|
|
243
244
|
});
|
|
244
245
|
}
|
|
245
246
|
|
|
246
|
-
@McpPermission('workflowversion', Action.CREATE)
|
|
247
|
-
@ToolGuards([McpPermissionGuard])
|
|
248
|
-
@Tool({
|
|
249
|
-
name: 'hexabot_workflow_version_restore',
|
|
250
|
-
description:
|
|
251
|
-
'Restore a workflow to a previous YAML version by creating a new restore snapshot.',
|
|
252
|
-
parameters: z.object({
|
|
253
|
-
workflowId: uuidSchema,
|
|
254
|
-
versionId: uuidSchema,
|
|
255
|
-
message: z.string().optional(),
|
|
256
|
-
}),
|
|
257
|
-
})
|
|
258
|
-
async restoreWorkflowVersion(
|
|
259
|
-
args: { workflowId: string; versionId: string; message?: string },
|
|
260
|
-
_context: unknown,
|
|
261
|
-
request?: HexabotMcpRequest,
|
|
262
|
-
) {
|
|
263
|
-
const version = await this.workflowHelper.restoreWorkflowVersionSnapshot(
|
|
264
|
-
args,
|
|
265
|
-
this.getActorId(request),
|
|
266
|
-
);
|
|
267
|
-
|
|
268
|
-
return this.workflowHelper.summarizeWorkflowVersion(version, {
|
|
269
|
-
includeDefinitionYmlByteLength: true,
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
|
|
273
247
|
@McpPermission('workflowversion', Action.CREATE)
|
|
274
248
|
@ToolGuards([McpPermissionGuard])
|
|
275
249
|
@Tool({
|
|
@@ -342,7 +316,7 @@ export class HexabotWorkflowVersionMcpTools extends HexabotMcpToolBase {
|
|
|
342
316
|
);
|
|
343
317
|
}
|
|
344
318
|
const workflow = await this.workflowHelper.requireWorkflow(workflowId);
|
|
345
|
-
const currentVersionId =
|
|
319
|
+
const currentVersionId = resolveRelationId(workflow.currentVersion);
|
|
346
320
|
if (!currentVersionId) {
|
|
347
321
|
throw new NotFoundException(
|
|
348
322
|
`Workflow ${workflowId} has no current version`,
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
Inject,
|
|
10
10
|
Injectable,
|
|
11
11
|
InternalServerErrorException,
|
|
12
|
-
NotFoundException,
|
|
13
12
|
UnauthorizedException,
|
|
14
13
|
} from '@nestjs/common';
|
|
15
14
|
import { JwtService, JwtSignOptions, JwtVerifyOptions } from '@nestjs/jwt';
|
|
@@ -54,7 +53,15 @@ export class PasswordResetService {
|
|
|
54
53
|
where: { email: dto.email },
|
|
55
54
|
});
|
|
56
55
|
if (!user) {
|
|
57
|
-
|
|
56
|
+
// Do not disclose whether an account exists for the given email.
|
|
57
|
+
// Returning silently prevents user/account enumeration (CWE-204) via
|
|
58
|
+
// the public, unauthenticated password-reset endpoint.
|
|
59
|
+
this.logger.log(
|
|
60
|
+
`Password reset requested for a non-existent email`,
|
|
61
|
+
'PasswordResetService',
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
return;
|
|
58
65
|
}
|
|
59
66
|
const jwt = await this.sign({ ...dto });
|
|
60
67
|
|
|
@@ -27,7 +27,6 @@ import { DeleteResult } from 'typeorm/driver/mongodb/typings';
|
|
|
27
27
|
|
|
28
28
|
import { ActionService } from '@/actions/actions.service';
|
|
29
29
|
import { I18nService } from '@/i18n/services/i18n.service';
|
|
30
|
-
import { UserService } from '@/user/services/user.service';
|
|
31
30
|
import { UuidParam } from '@/utils/decorators/uuid-param.decorator';
|
|
32
31
|
import { BaseOrmController } from '@/utils/generics/base-orm.controller';
|
|
33
32
|
import { PopulatePipe } from '@/utils/pipes/populate.pipe';
|
|
@@ -40,7 +39,10 @@ import {
|
|
|
40
39
|
ManualEventWrapper,
|
|
41
40
|
ScheduledEventWrapper,
|
|
42
41
|
} from '../lib/trigger-event-wrapper';
|
|
43
|
-
import {
|
|
42
|
+
import {
|
|
43
|
+
WebhookTokenResult,
|
|
44
|
+
WebhookTriggerService,
|
|
45
|
+
} from '../services/webhook-trigger.service';
|
|
44
46
|
import { WorkflowService } from '../services/workflow.service';
|
|
45
47
|
import { WorkflowType } from '../types';
|
|
46
48
|
|
|
@@ -48,8 +50,7 @@ import { WorkflowType } from '../types';
|
|
|
48
50
|
export class WorkflowController extends BaseOrmController<WorkflowOrmEntity> {
|
|
49
51
|
constructor(
|
|
50
52
|
private readonly workflowService: WorkflowService,
|
|
51
|
-
private readonly
|
|
52
|
-
private readonly userService: UserService,
|
|
53
|
+
private readonly webhookTriggerService: WebhookTriggerService,
|
|
53
54
|
private readonly actionService: ActionService,
|
|
54
55
|
private readonly runtimeBindingsService: RuntimeBindingsService,
|
|
55
56
|
private readonly i18nService: I18nService,
|
|
@@ -120,7 +121,7 @@ export class WorkflowController extends BaseOrmController<WorkflowOrmEntity> {
|
|
|
120
121
|
* @returns Action metadata with JSON schemas.
|
|
121
122
|
*/
|
|
122
123
|
@Get('actions{/:type}')
|
|
123
|
-
findActions(@Param('type') type?: WorkflowType) {
|
|
124
|
+
findActions(@Param('type') type?: WorkflowType | undefined) {
|
|
124
125
|
if (type && !Object.values(WorkflowType).includes(type)) {
|
|
125
126
|
throw new BadRequestException(`Invalid workflow type "${type}"`);
|
|
126
127
|
}
|
|
@@ -298,7 +299,7 @@ export class WorkflowController extends BaseOrmController<WorkflowOrmEntity> {
|
|
|
298
299
|
);
|
|
299
300
|
}
|
|
300
301
|
|
|
301
|
-
const workflow = await this.workflowService.
|
|
302
|
+
const workflow = await this.workflowService.findOneAndPopulate(id);
|
|
302
303
|
if (!workflow) {
|
|
303
304
|
this.logger.warn(`Unable to run Workflow by id ${id}`);
|
|
304
305
|
throw new NotFoundException(`Workflow with ID ${id} not found`);
|
|
@@ -327,12 +328,37 @@ export class WorkflowController extends BaseOrmController<WorkflowOrmEntity> {
|
|
|
327
328
|
triggeredAt: new Date(),
|
|
328
329
|
})
|
|
329
330
|
: new ManualEventWrapper(manualInput, userId);
|
|
330
|
-
const initiator = await this.userService.findOne(userId);
|
|
331
|
-
event.setInitiator(initiator!);
|
|
332
|
-
event.setWorkflowId(workflow.id);
|
|
333
331
|
|
|
334
|
-
await this.
|
|
332
|
+
await this.webhookTriggerService.dispatchTriggerEvent(
|
|
333
|
+
workflow,
|
|
334
|
+
event,
|
|
335
|
+
userId,
|
|
336
|
+
);
|
|
335
337
|
|
|
336
338
|
return { accepted: true };
|
|
337
339
|
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Issues a webhook trigger token signed with the workflow's JWT secret so
|
|
343
|
+
* callers do not have to craft tokens themselves. Tokens carry no expiry;
|
|
344
|
+
* rotating the signing secret credential revokes them.
|
|
345
|
+
*
|
|
346
|
+
* @param id - The workflow ID the token is scoped to.
|
|
347
|
+
* @param req - Express request containing the authenticated session.
|
|
348
|
+
*/
|
|
349
|
+
@Post(':id/webhook-token')
|
|
350
|
+
@HttpCode(201)
|
|
351
|
+
async generateWebhookToken(
|
|
352
|
+
@UuidParam('id') id: string,
|
|
353
|
+
@Req() req: Request,
|
|
354
|
+
): Promise<WebhookTokenResult> {
|
|
355
|
+
const userId = req.session?.passport?.user?.id;
|
|
356
|
+
if (!userId) {
|
|
357
|
+
throw new UnauthorizedException(
|
|
358
|
+
'Only authenticated users can generate webhook tokens',
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
return await this.webhookTriggerService.generateToken(id);
|
|
363
|
+
}
|
|
338
364
|
}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
8
|
createWorkflowFullSchema as createTypesWorkflowFullSchema,
|
|
9
|
+
WebhookTriggerConfig,
|
|
10
|
+
webhookTriggerSchema,
|
|
9
11
|
workflowSchema,
|
|
10
12
|
} from '@hexabot-ai/types';
|
|
11
13
|
import {
|
|
@@ -80,6 +82,16 @@ export class WorkflowCreateDto {
|
|
|
80
82
|
@Validate(WorkflowInputSchemaValidator)
|
|
81
83
|
inputSchema?: JsonSchema;
|
|
82
84
|
|
|
85
|
+
@ApiPropertyOptional({
|
|
86
|
+
description:
|
|
87
|
+
'Webhook trigger configuration (manual workflows only). Enables a public ' +
|
|
88
|
+
'trigger URL and defines how incoming calls authenticate.',
|
|
89
|
+
type: Object,
|
|
90
|
+
})
|
|
91
|
+
@IsOptional()
|
|
92
|
+
@Validate(webhookTriggerSchema)
|
|
93
|
+
webhookTrigger?: WebhookTriggerConfig | null;
|
|
94
|
+
|
|
83
95
|
@ApiPropertyOptional({
|
|
84
96
|
description: 'Indicates if the workflow is built-in',
|
|
85
97
|
type: Boolean,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
DEFAULT_RETRY_SETTINGS,
|
|
12
12
|
DEFAULT_TIMEOUT_MS,
|
|
13
13
|
} from '@hexabot-ai/agentic';
|
|
14
|
-
import { workflowSchema } from '@hexabot-ai/types';
|
|
14
|
+
import { WebhookTriggerConfig, workflowSchema } from '@hexabot-ai/types';
|
|
15
15
|
import { CronJob } from 'cron';
|
|
16
16
|
import { JSONSchema7 as JsonSchema } from 'json-schema';
|
|
17
17
|
import {
|
|
@@ -90,6 +90,16 @@ export class WorkflowOrmEntity extends BaseOrmEntity<WorkflowDto> {
|
|
|
90
90
|
@JsonColumn({ name: 'input_schema' })
|
|
91
91
|
inputSchema!: JsonSchema;
|
|
92
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Optional webhook trigger configuration for manual workflows. When enabled,
|
|
95
|
+
* exposes a public URL that authenticates incoming calls before running the
|
|
96
|
+
* workflow. Stored as JSON; secrets are referenced by credential ID, never
|
|
97
|
+
* inline. The JSON carries no foreign key, so referential integrity is
|
|
98
|
+
* enforced at the guard: a dangling credential reference fails auth (401).
|
|
99
|
+
*/
|
|
100
|
+
@JsonColumn({ name: 'webhook_trigger', nullable: true })
|
|
101
|
+
webhookTrigger?: WebhookTriggerConfig | null;
|
|
102
|
+
|
|
93
103
|
/** Indicates if the workflow is built-in and protected from deletion. */
|
|
94
104
|
@Column({ default: false })
|
|
95
105
|
builtin!: boolean;
|