@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.
Files changed (99) hide show
  1. package/dist/channel/channel.module.js +2 -0
  2. package/dist/channel/channel.module.js.map +1 -1
  3. package/dist/channel/entities/source.entity.d.ts +38 -0
  4. package/dist/channel/webhook.controller.d.ts +4 -1
  5. package/dist/channel/webhook.controller.js +19 -1
  6. package/dist/channel/webhook.controller.js.map +1 -1
  7. package/dist/chat/services/chat.service.js +4 -2
  8. package/dist/chat/services/chat.service.js.map +1 -1
  9. package/dist/chat/services/thread.service.js +6 -2
  10. package/dist/chat/services/thread.service.js.map +1 -1
  11. package/dist/mcp/tools/hexabot-mcp-tool.base.d.ts +0 -3
  12. package/dist/mcp/tools/hexabot-mcp-tool.base.js +0 -6
  13. package/dist/mcp/tools/hexabot-mcp-tool.base.js.map +1 -1
  14. package/dist/mcp/tools/hexabot-mcp.utils.d.ts +3 -0
  15. package/dist/mcp/tools/hexabot-mcp.utils.js +8 -1
  16. package/dist/mcp/tools/hexabot-mcp.utils.js.map +1 -1
  17. package/dist/mcp/tools/workflow-mcp.helper.d.ts +19 -1
  18. package/dist/mcp/tools/workflow-mcp.helper.js +2 -7
  19. package/dist/mcp/tools/workflow-mcp.helper.js.map +1 -1
  20. package/dist/mcp/tools/workflow-mcp.tools.d.ts +114 -0
  21. package/dist/mcp/tools/workflow-run-mcp.tools.d.ts +38 -0
  22. package/dist/mcp/tools/workflow-run-mcp.tools.js +1 -1
  23. package/dist/mcp/tools/workflow-run-mcp.tools.js.map +1 -1
  24. package/dist/mcp/tools/workflow-version-mcp.tools.d.ts +0 -22
  25. package/dist/mcp/tools/workflow-version-mcp.tools.js +3 -24
  26. package/dist/mcp/tools/workflow-version-mcp.tools.js.map +1 -1
  27. package/dist/static/assets/{cssMode-v8DOzA4o.js → cssMode-CVfTJuzy.js} +1 -1
  28. package/dist/static/assets/{freemarker2-B92dv90I.js → freemarker2-BA7GKqB7.js} +1 -1
  29. package/dist/static/assets/{handlebars-Dw3f_475.js → handlebars-BCwvKzIX.js} +1 -1
  30. package/dist/static/assets/{html-BLTdldWn.js → html-f6_JN1YY.js} +1 -1
  31. package/dist/static/assets/{htmlMode-tP1xHfwv.js → htmlMode-f4asMwRs.js} +1 -1
  32. package/dist/static/assets/index-CLS5CNoN.css +1 -0
  33. package/dist/static/assets/{index-1C1RUhvE.js → index-X6nbc-0C.js} +399 -392
  34. package/dist/static/assets/{javascript-D6zFkYDA.js → javascript-DaS6vtZ9.js} +1 -1
  35. package/dist/static/assets/{jsonMode-Casc9QAu.js → jsonMode-Ct41J50t.js} +1 -1
  36. package/dist/static/assets/{liquid-CiiGxWfs.js → liquid-4giXfRN2.js} +1 -1
  37. package/dist/static/assets/{lspLanguageFeatures-DDa9NCMy.js → lspLanguageFeatures-CqJlQWTJ.js} +1 -1
  38. package/dist/static/assets/{mdx-CkcXhfmV.js → mdx-DcO2npTr.js} +1 -1
  39. package/dist/static/assets/{python-CBPYdNzT.js → python-D7O1gNbd.js} +1 -1
  40. package/dist/static/assets/{razor-BU2J-T3U.js → razor-K5r5YQ4D.js} +1 -1
  41. package/dist/static/assets/{tsMode-CMXRM61t.js → tsMode-CvIEOKtw.js} +1 -1
  42. package/dist/static/assets/{typescript-GDvJ0GIf.js → typescript-BKjAKJn9.js} +1 -1
  43. package/dist/static/assets/{xml-CSlsq1iC.js → xml-BpIa2Zv1.js} +1 -1
  44. package/dist/static/assets/{yaml-stKXP2Du.js → yaml-BJzMbZhP.js} +1 -1
  45. package/dist/static/index.html +2 -2
  46. package/dist/static/locales/en/translation.json +75 -2
  47. package/dist/static/locales/fr/translation.json +72 -1
  48. package/dist/tsconfig.build.tsbuildinfo +1 -1
  49. package/dist/user/services/passwordReset.service.js +2 -1
  50. package/dist/user/services/passwordReset.service.js.map +1 -1
  51. package/dist/workflow/controllers/workflow-version.controller.d.ts +38 -0
  52. package/dist/workflow/controllers/workflow.controller.d.ts +43 -6
  53. package/dist/workflow/controllers/workflow.controller.js +23 -13
  54. package/dist/workflow/controllers/workflow.controller.js.map +1 -1
  55. package/dist/workflow/dto/workflow.dto.d.ts +40 -1
  56. package/dist/workflow/dto/workflow.dto.js +10 -0
  57. package/dist/workflow/dto/workflow.dto.js.map +1 -1
  58. package/dist/workflow/entities/memory-record.entity.d.ts +38 -0
  59. package/dist/workflow/entities/workflow-run.entity.d.ts +38 -0
  60. package/dist/workflow/entities/workflow-version.entity.d.ts +38 -0
  61. package/dist/workflow/entities/workflow.entity.d.ts +78 -0
  62. package/dist/workflow/entities/workflow.entity.js +4 -0
  63. package/dist/workflow/entities/workflow.entity.js.map +1 -1
  64. package/dist/workflow/guards/webhook-trigger.guard.d.ts +17 -0
  65. package/dist/workflow/guards/webhook-trigger.guard.js +139 -0
  66. package/dist/workflow/guards/webhook-trigger.guard.js.map +1 -0
  67. package/dist/workflow/services/agentic.service.d.ts +14 -2
  68. package/dist/workflow/services/agentic.service.js +17 -4
  69. package/dist/workflow/services/agentic.service.js.map +1 -1
  70. package/dist/workflow/services/webhook-trigger.service.d.ts +27 -0
  71. package/dist/workflow/services/webhook-trigger.service.js +90 -0
  72. package/dist/workflow/services/webhook-trigger.service.js.map +1 -0
  73. package/dist/workflow/services/workflow-run.service.d.ts +1 -0
  74. package/dist/workflow/services/workflow-run.service.js +9 -0
  75. package/dist/workflow/services/workflow-run.service.js.map +1 -1
  76. package/dist/workflow/workflow.module.js +8 -0
  77. package/dist/workflow/workflow.module.js.map +1 -1
  78. package/package.json +5 -6
  79. package/src/channel/README.md +17 -0
  80. package/src/channel/channel.module.ts +4 -0
  81. package/src/channel/webhook.controller.ts +46 -1
  82. package/src/chat/services/chat.service.ts +5 -4
  83. package/src/chat/services/thread.service.ts +10 -2
  84. package/src/mcp/README.md +2 -3
  85. package/src/mcp/tools/hexabot-mcp-tool.base.ts +0 -10
  86. package/src/mcp/tools/hexabot-mcp.utils.ts +10 -0
  87. package/src/mcp/tools/workflow-mcp.helper.ts +3 -11
  88. package/src/mcp/tools/workflow-run-mcp.tools.ts +2 -2
  89. package/src/mcp/tools/workflow-version-mcp.tools.ts +3 -29
  90. package/src/user/services/passwordReset.service.ts +9 -2
  91. package/src/workflow/controllers/workflow.controller.ts +36 -10
  92. package/src/workflow/dto/workflow.dto.ts +12 -0
  93. package/src/workflow/entities/workflow.entity.ts +11 -1
  94. package/src/workflow/guards/webhook-trigger.guard.ts +193 -0
  95. package/src/workflow/services/agentic.service.ts +27 -3
  96. package/src/workflow/services/webhook-trigger.service.ts +169 -0
  97. package/src/workflow/services/workflow-run.service.ts +21 -0
  98. package/src/workflow/workflow.module.ts +8 -0
  99. 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;AAsEzC,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IApE1B,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;SACX;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,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,6BAAqB;SACtB;KACF,CAAC;GACW,cAAc,CAAG"}
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.2.7",
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.1.7",
97
- "@hexabot-ai/types": "3.0.7"
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.2.7"
146
+ "@hexabot-ai/frontend": "3.3.0"
148
147
  },
149
148
  "optionalDependencies": {
150
149
  "@css-inline/css-inline-linux-arm64-musl": "^0.14.1",
@@ -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 { Controller, Get, Param, Post, Query, Req, Res } from '@nestjs/common';
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
- // @ts-expect-error Invesstigate why this is causing a ts error
187
- recipient: subscriber.id,
188
- createdAt: { $lte: watermark, $gte: start },
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.reopenThread(explicit.id, now);
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
- return explicit;
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` and
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
- | `hexabot_workflow_version_restore` | `workflowversion:create` | Restore a previous version by creating a new snapshot. |
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
- ? this.resolveRelationId(workflow.currentVersion)
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 = this.resolveRelationId(run.parentRun);
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 = this.resolveRelationId(version.workflow);
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 = this.resolveRelationId(workflow.currentVersion);
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
- throw new NotFoundException('User not found');
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 { AgenticService } from '../services/agentic.service';
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 agenticService: AgenticService,
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.findOne(id);
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.agenticService.handleEvent(event);
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;