aimeat 1.7.0 → 1.9.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 (261) hide show
  1. package/dist/.env.example +4 -1
  2. package/dist/locales/en.json +573 -10
  3. package/dist/locales/fi.json +572 -9
  4. package/dist/public/css/views/admin-agent-integration.css +304 -0
  5. package/dist/public/css/views/agents-detail.css +1697 -120
  6. package/dist/public/css/views/profile.css +22 -2
  7. package/dist/public/css/views/public-knowledge-viewer.css +479 -0
  8. package/dist/public/js/i18n.js +9 -3
  9. package/dist/public/js/services/admin-agent-integration.js +52 -0
  10. package/dist/public/js/services/agent-integration.js +80 -0
  11. package/dist/public/js/services/agent-messages.js +3 -1
  12. package/dist/public/js/services/generator-spec-validate.js +23 -0
  13. package/dist/public/js/services/memory.js +39 -0
  14. package/dist/public/lib/live-updates.js +9 -4
  15. package/dist/public/llms-template.txt +106 -0
  16. package/dist/public/spa.html +7 -2
  17. package/dist/public/views/admin/agent-integration-tab.js +390 -0
  18. package/dist/public/views/admin/federation-tab.js +5 -5
  19. package/dist/public/views/admin/prompts-tab.js +9 -10
  20. package/dist/public/views/admin.js +2 -0
  21. package/dist/public/views/profile/access-tab.js +18 -0
  22. package/dist/public/views/profile/agents/agent-card.js +396 -0
  23. package/dist/public/views/profile/agents/shared-board.js +97 -0
  24. package/dist/public/views/profile/agents/state-detector.js +62 -0
  25. package/dist/public/views/profile/agents/tab-activity.js +232 -0
  26. package/dist/public/views/profile/agents/tab-agent-config.js +199 -0
  27. package/dist/public/views/profile/agents/tab-data-access.js +304 -0
  28. package/dist/public/views/profile/agents/tab-directives.js +178 -0
  29. package/dist/public/views/profile/agents/tab-integration.js +505 -0
  30. package/dist/public/views/profile/agents/tab-messages.js +278 -0
  31. package/dist/public/views/profile/agents/tab-services.js +17 -0
  32. package/dist/public/views/profile/agents/tab-tasks.js +17 -0
  33. package/dist/public/views/profile/agents-messages-subtab.js +12 -10
  34. package/dist/public/views/profile/agents-services-subtab.js +17 -11
  35. package/dist/public/views/profile/agents-tab.js +159 -255
  36. package/dist/public/views/profile/agents-task-builder.js +403 -0
  37. package/dist/public/views/profile/agents-tasks-subtab.js +186 -140
  38. package/dist/public/views/profile/generator-detail.js +8 -1
  39. package/dist/public/views/profile/memory-tab.js +371 -7
  40. package/dist/public/views/profile/wallet-tab.js +14 -0
  41. package/dist/public/views/public-knowledge-viewer.js +650 -0
  42. package/dist/src/auth/middleware.d.ts.map +1 -1
  43. package/dist/src/auth/middleware.js +17 -0
  44. package/dist/src/auth/middleware.js.map +1 -1
  45. package/dist/src/config.d.ts +1 -0
  46. package/dist/src/config.d.ts.map +1 -1
  47. package/dist/src/config.js +1 -0
  48. package/dist/src/config.js.map +1 -1
  49. package/dist/src/middleware/readiness-gate.d.ts +18 -0
  50. package/dist/src/middleware/readiness-gate.d.ts.map +1 -0
  51. package/dist/src/middleware/readiness-gate.js +50 -0
  52. package/dist/src/middleware/readiness-gate.js.map +1 -0
  53. package/dist/src/models/agent-capabilities-schemas.d.ts +3 -0
  54. package/dist/src/models/agent-capabilities-schemas.d.ts.map +1 -1
  55. package/dist/src/models/agent-capabilities-schemas.js +3 -0
  56. package/dist/src/models/agent-capabilities-schemas.js.map +1 -1
  57. package/dist/src/models/agent-directives-schemas.d.ts +12 -0
  58. package/dist/src/models/agent-directives-schemas.d.ts.map +1 -1
  59. package/dist/src/models/agent-directives-schemas.js +7 -0
  60. package/dist/src/models/agent-directives-schemas.js.map +1 -1
  61. package/dist/src/models/agent-onboarding-schemas.d.ts +45 -0
  62. package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -0
  63. package/dist/src/models/agent-onboarding-schemas.js +91 -0
  64. package/dist/src/models/agent-onboarding-schemas.js.map +1 -0
  65. package/dist/src/models/webhook-schemas.d.ts +266 -0
  66. package/dist/src/models/webhook-schemas.d.ts.map +1 -0
  67. package/dist/src/models/webhook-schemas.js +137 -0
  68. package/dist/src/models/webhook-schemas.js.map +1 -0
  69. package/dist/src/routes/admin-agent-integration.d.ts +24 -0
  70. package/dist/src/routes/admin-agent-integration.d.ts.map +1 -0
  71. package/dist/src/routes/admin-agent-integration.js +186 -0
  72. package/dist/src/routes/admin-agent-integration.js.map +1 -0
  73. package/dist/src/routes/admin-monitoring.js +12 -7
  74. package/dist/src/routes/admin-monitoring.js.map +1 -1
  75. package/dist/src/routes/agent-activity.d.ts.map +1 -1
  76. package/dist/src/routes/agent-activity.js +17 -0
  77. package/dist/src/routes/agent-activity.js.map +1 -1
  78. package/dist/src/routes/agent-capabilities.d.ts +1 -0
  79. package/dist/src/routes/agent-capabilities.d.ts.map +1 -1
  80. package/dist/src/routes/agent-capabilities.js +9 -0
  81. package/dist/src/routes/agent-capabilities.js.map +1 -1
  82. package/dist/src/routes/agent-directives.d.ts +5 -1
  83. package/dist/src/routes/agent-directives.d.ts.map +1 -1
  84. package/dist/src/routes/agent-directives.js +74 -20
  85. package/dist/src/routes/agent-directives.js.map +1 -1
  86. package/dist/src/routes/agent-integration.d.ts +1 -0
  87. package/dist/src/routes/agent-integration.d.ts.map +1 -1
  88. package/dist/src/routes/agent-integration.js +128 -11
  89. package/dist/src/routes/agent-integration.js.map +1 -1
  90. package/dist/src/routes/agent-messages.d.ts +5 -1
  91. package/dist/src/routes/agent-messages.d.ts.map +1 -1
  92. package/dist/src/routes/agent-messages.js +20 -1
  93. package/dist/src/routes/agent-messages.js.map +1 -1
  94. package/dist/src/routes/agent-onboarding.d.ts +23 -0
  95. package/dist/src/routes/agent-onboarding.d.ts.map +1 -0
  96. package/dist/src/routes/agent-onboarding.js +374 -0
  97. package/dist/src/routes/agent-onboarding.js.map +1 -0
  98. package/dist/src/routes/agent-skill-bundle.d.ts +16 -0
  99. package/dist/src/routes/agent-skill-bundle.d.ts.map +1 -0
  100. package/dist/src/routes/agent-skill-bundle.js +133 -0
  101. package/dist/src/routes/agent-skill-bundle.js.map +1 -0
  102. package/dist/src/routes/agent-tasks.d.ts +8 -1
  103. package/dist/src/routes/agent-tasks.d.ts.map +1 -1
  104. package/dist/src/routes/agent-tasks.js +192 -14
  105. package/dist/src/routes/agent-tasks.js.map +1 -1
  106. package/dist/src/routes/agent-telemetry.d.ts +15 -0
  107. package/dist/src/routes/agent-telemetry.d.ts.map +1 -0
  108. package/dist/src/routes/agent-telemetry.js +99 -0
  109. package/dist/src/routes/agent-telemetry.js.map +1 -0
  110. package/dist/src/routes/agent-webhook.d.ts +18 -0
  111. package/dist/src/routes/agent-webhook.d.ts.map +1 -0
  112. package/dist/src/routes/agent-webhook.js +243 -0
  113. package/dist/src/routes/agent-webhook.js.map +1 -0
  114. package/dist/src/routes/agents.d.ts.map +1 -1
  115. package/dist/src/routes/agents.js +203 -4
  116. package/dist/src/routes/agents.js.map +1 -1
  117. package/dist/src/routes/auth.d.ts.map +1 -1
  118. package/dist/src/routes/auth.js +45 -2
  119. package/dist/src/routes/auth.js.map +1 -1
  120. package/dist/src/routes/federation-auth.d.ts.map +1 -1
  121. package/dist/src/routes/federation-auth.js +3 -1
  122. package/dist/src/routes/federation-auth.js.map +1 -1
  123. package/dist/src/routes/federation-peer.d.ts.map +1 -1
  124. package/dist/src/routes/federation-peer.js +11 -2
  125. package/dist/src/routes/federation-peer.js.map +1 -1
  126. package/dist/src/routes/federation-sync.d.ts +1 -0
  127. package/dist/src/routes/federation-sync.d.ts.map +1 -1
  128. package/dist/src/routes/federation-sync.js +29 -0
  129. package/dist/src/routes/federation-sync.js.map +1 -1
  130. package/dist/src/routes/ghii.d.ts.map +1 -1
  131. package/dist/src/routes/ghii.js +42 -5
  132. package/dist/src/routes/ghii.js.map +1 -1
  133. package/dist/src/routes/knowledge.d.ts.map +1 -1
  134. package/dist/src/routes/knowledge.js +19 -7
  135. package/dist/src/routes/knowledge.js.map +1 -1
  136. package/dist/src/routes/memory.d.ts +9 -0
  137. package/dist/src/routes/memory.d.ts.map +1 -1
  138. package/dist/src/routes/memory.js +307 -12
  139. package/dist/src/routes/memory.js.map +1 -1
  140. package/dist/src/routes/portal.d.ts.map +1 -1
  141. package/dist/src/routes/portal.js +1 -0
  142. package/dist/src/routes/portal.js.map +1 -1
  143. package/dist/src/routes/prompts.d.ts +1 -0
  144. package/dist/src/routes/prompts.d.ts.map +1 -1
  145. package/dist/src/routes/prompts.js +40 -1
  146. package/dist/src/routes/prompts.js.map +1 -1
  147. package/dist/src/routes/sharing-groups.d.ts.map +1 -1
  148. package/dist/src/routes/sharing-groups.js +8 -2
  149. package/dist/src/routes/sharing-groups.js.map +1 -1
  150. package/dist/src/routes/wallet.d.ts.map +1 -1
  151. package/dist/src/routes/wallet.js +2 -0
  152. package/dist/src/routes/wallet.js.map +1 -1
  153. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  154. package/dist/src/server-bootstrap/routes-loader.js +47 -3
  155. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  156. package/dist/src/services/config-schema.d.ts.map +1 -1
  157. package/dist/src/services/config-schema.js +2 -1
  158. package/dist/src/services/config-schema.js.map +1 -1
  159. package/dist/src/services/core-jobs.d.ts.map +1 -1
  160. package/dist/src/services/core-jobs.js +3 -2
  161. package/dist/src/services/core-jobs.js.map +1 -1
  162. package/dist/src/services/federation-helpers.d.ts +1 -0
  163. package/dist/src/services/federation-helpers.d.ts.map +1 -1
  164. package/dist/src/services/federation-helpers.js +1 -1
  165. package/dist/src/services/federation-helpers.js.map +1 -1
  166. package/dist/src/services/generator-autopilot.d.ts.map +1 -1
  167. package/dist/src/services/generator-autopilot.js +125 -26
  168. package/dist/src/services/generator-autopilot.js.map +1 -1
  169. package/dist/src/services/generator-prompts/index.d.ts +1 -1
  170. package/dist/src/services/generator-prompts/index.d.ts.map +1 -1
  171. package/dist/src/services/generator-prompts/index.js +1 -1
  172. package/dist/src/services/generator-prompts/index.js.map +1 -1
  173. package/dist/src/services/generator-prompts/spec-validate.d.ts +1 -0
  174. package/dist/src/services/generator-prompts/spec-validate.d.ts.map +1 -1
  175. package/dist/src/services/generator-prompts/spec-validate.js +20 -0
  176. package/dist/src/services/generator-prompts/spec-validate.js.map +1 -1
  177. package/dist/src/services/generator-prompts/validate.d.ts +7 -1
  178. package/dist/src/services/generator-prompts/validate.d.ts.map +1 -1
  179. package/dist/src/services/generator-prompts/validate.js +70 -0
  180. package/dist/src/services/generator-prompts/validate.js.map +1 -1
  181. package/dist/src/services/onboarding-validator.d.ts +22 -0
  182. package/dist/src/services/onboarding-validator.d.ts.map +1 -0
  183. package/dist/src/services/onboarding-validator.js +202 -0
  184. package/dist/src/services/onboarding-validator.js.map +1 -0
  185. package/dist/src/services/platform-detector.d.ts +27 -0
  186. package/dist/src/services/platform-detector.d.ts.map +1 -0
  187. package/dist/src/services/platform-detector.js +73 -0
  188. package/dist/src/services/platform-detector.js.map +1 -0
  189. package/dist/src/services/prompt-defaults.d.ts +1 -0
  190. package/dist/src/services/prompt-defaults.d.ts.map +1 -1
  191. package/dist/src/services/prompt-defaults.js +875 -47
  192. package/dist/src/services/prompt-defaults.js.map +1 -1
  193. package/dist/src/services/prompt-seeder.js +1 -1
  194. package/dist/src/services/prompt-seeder.js.map +1 -1
  195. package/dist/src/services/readiness-scorer.d.ts +34 -0
  196. package/dist/src/services/readiness-scorer.d.ts.map +1 -0
  197. package/dist/src/services/readiness-scorer.js +87 -0
  198. package/dist/src/services/readiness-scorer.js.map +1 -0
  199. package/dist/src/services/skill-bundle/generator.d.ts +17 -0
  200. package/dist/src/services/skill-bundle/generator.d.ts.map +1 -0
  201. package/dist/src/services/skill-bundle/generator.js +387 -0
  202. package/dist/src/services/skill-bundle/generator.js.map +1 -0
  203. package/dist/src/services/skill-bundle/generic-adapter.d.ts +16 -0
  204. package/dist/src/services/skill-bundle/generic-adapter.d.ts.map +1 -0
  205. package/dist/src/services/skill-bundle/generic-adapter.js +96 -0
  206. package/dist/src/services/skill-bundle/generic-adapter.js.map +1 -0
  207. package/dist/src/services/skill-bundle/hermes-adapter.d.ts +25 -0
  208. package/dist/src/services/skill-bundle/hermes-adapter.d.ts.map +1 -0
  209. package/dist/src/services/skill-bundle/hermes-adapter.js +302 -0
  210. package/dist/src/services/skill-bundle/hermes-adapter.js.map +1 -0
  211. package/dist/src/services/skill-bundle/types.d.ts +54 -0
  212. package/dist/src/services/skill-bundle/types.d.ts.map +1 -0
  213. package/dist/src/services/skill-bundle/types.js +8 -0
  214. package/dist/src/services/skill-bundle/types.js.map +1 -0
  215. package/dist/src/services/task-stall-detector.d.ts +10 -2
  216. package/dist/src/services/task-stall-detector.d.ts.map +1 -1
  217. package/dist/src/services/task-stall-detector.js +34 -5
  218. package/dist/src/services/task-stall-detector.js.map +1 -1
  219. package/dist/src/services/webhook-dispatcher.d.ts +71 -0
  220. package/dist/src/services/webhook-dispatcher.d.ts.map +1 -0
  221. package/dist/src/services/webhook-dispatcher.js +259 -0
  222. package/dist/src/services/webhook-dispatcher.js.map +1 -0
  223. package/dist/src/storage/interface.d.ts +82 -2
  224. package/dist/src/storage/interface.d.ts.map +1 -1
  225. package/dist/src/storage/providers/mongodb/index.d.ts +20 -1
  226. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  227. package/dist/src/storage/providers/mongodb/index.js +254 -3
  228. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  229. package/dist/src/storage/providers/sqlite/index.d.ts +18 -1
  230. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  231. package/dist/src/storage/providers/sqlite/index.js +173 -4
  232. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  233. package/dist/src/storage/providers/sqlite/repos/agent-directives.d.ts.map +1 -1
  234. package/dist/src/storage/providers/sqlite/repos/agent-directives.js +8 -4
  235. package/dist/src/storage/providers/sqlite/repos/agent-directives.js.map +1 -1
  236. package/dist/src/storage/providers/sqlite/repos/agent.d.ts.map +1 -1
  237. package/dist/src/storage/providers/sqlite/repos/agent.js +25 -4
  238. package/dist/src/storage/providers/sqlite/repos/agent.js.map +1 -1
  239. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  240. package/dist/src/storage/providers/sqlite/schema.js +73 -1
  241. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  242. package/dist/src/storage/repositories/agent-onboarding.repository.d.ts +16 -0
  243. package/dist/src/storage/repositories/agent-onboarding.repository.d.ts.map +1 -0
  244. package/dist/src/storage/repositories/agent-onboarding.repository.js +8 -0
  245. package/dist/src/storage/repositories/agent-onboarding.repository.js.map +1 -0
  246. package/dist/src/storage/repositories/agent-webhook.repository.d.ts +21 -0
  247. package/dist/src/storage/repositories/agent-webhook.repository.d.ts.map +1 -0
  248. package/dist/src/storage/repositories/agent-webhook.repository.js +2 -0
  249. package/dist/src/storage/repositories/agent-webhook.repository.js.map +1 -0
  250. package/dist/src/storage/repositories/agent.repository.d.ts +1 -0
  251. package/dist/src/storage/repositories/agent.repository.d.ts.map +1 -1
  252. package/dist/src/storage/repositories/index.d.ts +2 -0
  253. package/dist/src/storage/repositories/index.d.ts.map +1 -1
  254. package/dist/src/utils/env-config.d.ts.map +1 -1
  255. package/dist/src/utils/env-config.js +7 -1
  256. package/dist/src/utils/env-config.js.map +1 -1
  257. package/dist/src/utils/url-validator.d.ts.map +1 -1
  258. package/dist/src/utils/url-validator.js +3 -0
  259. package/dist/src/utils/url-validator.js.map +1 -1
  260. package/package.json +1 -1
  261. package/prisma/schema.prisma +67 -7
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @file webhook-dispatcher.ts
3
+ * @description Webhook delivery service for the AIMEAT push layer.
4
+ * Loads an agent's webhook configuration, validates the target URL,
5
+ * signs the payload with HMAC-SHA256, and fires HTTP POST with retry.
6
+ * Auto-disables webhooks after 10 consecutive failures.
7
+ * Logs every delivery attempt (success or failure) and prunes old entries.
8
+ *
9
+ * @structure
10
+ * - createWebhookDispatcher({ config, storage }) -- factory, returns { dispatchWebhookEvent }
11
+ * - dispatchWebhookEvent(agentGaii, event, data) -- main entry point
12
+ * - fireWithRetry(url, body, secret, attempt) -- recursive retry with backoff
13
+ * - onSuccess(agentGaii) -- resets fail counter
14
+ * - onFailure(agentGaii, failCount) -- increments counter, auto-disables at threshold
15
+ * - logDelivery(agentGaii, event, payload, result) -- persists + prunes
16
+ *
17
+ * @usage
18
+ * import { createWebhookDispatcher } from '../services/webhook-dispatcher.js';
19
+ * const { dispatchWebhookEvent } = createWebhookDispatcher({ config, storage });
20
+ * await dispatchWebhookEvent('claude#alice@node', 'task.queued', { task_id: '...' });
21
+ *
22
+ * @maintenance Adding a new webhook event type:
23
+ * 1. Define the payload schema in webhook-schemas.ts:
24
+ * - Add a Zod schema for the new event's `data` field
25
+ * - Use snake_case for all field names (vendor contract)
26
+ * - Include the standard envelope (version, event, timestamp, node_id, agent_gaii)
27
+ * - Document "Expected agent action" in a comment above the schema
28
+ * 2. Add the event constant to WEBHOOK_EVENTS in webhook-schemas.ts
29
+ * 3. Add the dispatch call in the relevant route handler:
30
+ * - Import dispatchWebhookEvent from webhook-dispatcher.ts
31
+ * - Call it AFTER the storage write succeeds, BEFORE res.json()
32
+ * - Pass the agent's GAII so the dispatcher can resolve webhook config
33
+ * 4. Add MCP notification (parallel delivery):
34
+ * - In the same route handler, call mcpServer.notify() with the matching event name
35
+ * - MCP uses the same event name (e.g., 'notifications/tasks/failed')
36
+ * 5. Update the skill bundle SKILL.md template:
37
+ * - Add the event to the "Events you may receive" list
38
+ * - Document the expected agent action
39
+ * 6. Update openapi.yaml:
40
+ * - Add the event to the webhook events enum
41
+ * - Add the payload schema to components/schemas
42
+ * 7. Update locales (en.json + fi.json):
43
+ * - Add delivery log display string for the event
44
+ * 8. Add E2E test:
45
+ * - Test that the event fires on the correct trigger
46
+ * - Test payload shape matches schema
47
+ * - Test HMAC signature is valid
48
+ * 9. Update this header's event list below.
49
+ *
50
+ * Current event types (v1):
51
+ * task.queued, task.approved, task.updated, task.paused,
52
+ * message.inbound, directive.updated, onboarding.step
53
+ *
54
+ * Versioning: new event types are non-breaking (v1 stays).
55
+ * Consumers MUST ignore unknown event types.
56
+ * See: docs/superpowers/specs/2026-05-23-agent-integration-architecture-design.md, Appendix A
57
+ *
58
+ * @version-history
59
+ * v1.0.0 -- 2026-05-23 -- Initial creation with retry, HMAC signing, auto-disable
60
+ */
61
+ import type { Storage } from '../storage/interface.js';
62
+ import type { AimeatConfig } from '../config.js';
63
+ import { type WebhookEventType } from '../models/webhook-schemas.js';
64
+ export interface DispatchOptions {
65
+ config: AimeatConfig;
66
+ storage: Storage;
67
+ }
68
+ export declare function createWebhookDispatcher({ config, storage }: DispatchOptions): {
69
+ dispatchWebhookEvent: (agentGaii: string, event: WebhookEventType, data: Record<string, unknown>) => Promise<void>;
70
+ };
71
+ //# sourceMappingURL=webhook-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-dispatcher.d.ts","sourceRoot":"","sources":["../../../src/services/webhook-dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAsB,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,KAAK,gBAAgB,EAA6C,MAAM,8BAA8B,CAAC;AAkBhH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAYD,wBAAgB,uBAAuB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,eAAe;sCAO7D,MAAM,SACV,gBAAgB,QACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,IAAI,CAAC;EAwNjB"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * @file webhook-dispatcher.ts
3
+ * @description Webhook delivery service for the AIMEAT push layer.
4
+ * Loads an agent's webhook configuration, validates the target URL,
5
+ * signs the payload with HMAC-SHA256, and fires HTTP POST with retry.
6
+ * Auto-disables webhooks after 10 consecutive failures.
7
+ * Logs every delivery attempt (success or failure) and prunes old entries.
8
+ *
9
+ * @structure
10
+ * - createWebhookDispatcher({ config, storage }) -- factory, returns { dispatchWebhookEvent }
11
+ * - dispatchWebhookEvent(agentGaii, event, data) -- main entry point
12
+ * - fireWithRetry(url, body, secret, attempt) -- recursive retry with backoff
13
+ * - onSuccess(agentGaii) -- resets fail counter
14
+ * - onFailure(agentGaii, failCount) -- increments counter, auto-disables at threshold
15
+ * - logDelivery(agentGaii, event, payload, result) -- persists + prunes
16
+ *
17
+ * @usage
18
+ * import { createWebhookDispatcher } from '../services/webhook-dispatcher.js';
19
+ * const { dispatchWebhookEvent } = createWebhookDispatcher({ config, storage });
20
+ * await dispatchWebhookEvent('claude#alice@node', 'task.queued', { task_id: '...' });
21
+ *
22
+ * @maintenance Adding a new webhook event type:
23
+ * 1. Define the payload schema in webhook-schemas.ts:
24
+ * - Add a Zod schema for the new event's `data` field
25
+ * - Use snake_case for all field names (vendor contract)
26
+ * - Include the standard envelope (version, event, timestamp, node_id, agent_gaii)
27
+ * - Document "Expected agent action" in a comment above the schema
28
+ * 2. Add the event constant to WEBHOOK_EVENTS in webhook-schemas.ts
29
+ * 3. Add the dispatch call in the relevant route handler:
30
+ * - Import dispatchWebhookEvent from webhook-dispatcher.ts
31
+ * - Call it AFTER the storage write succeeds, BEFORE res.json()
32
+ * - Pass the agent's GAII so the dispatcher can resolve webhook config
33
+ * 4. Add MCP notification (parallel delivery):
34
+ * - In the same route handler, call mcpServer.notify() with the matching event name
35
+ * - MCP uses the same event name (e.g., 'notifications/tasks/failed')
36
+ * 5. Update the skill bundle SKILL.md template:
37
+ * - Add the event to the "Events you may receive" list
38
+ * - Document the expected agent action
39
+ * 6. Update openapi.yaml:
40
+ * - Add the event to the webhook events enum
41
+ * - Add the payload schema to components/schemas
42
+ * 7. Update locales (en.json + fi.json):
43
+ * - Add delivery log display string for the event
44
+ * 8. Add E2E test:
45
+ * - Test that the event fires on the correct trigger
46
+ * - Test payload shape matches schema
47
+ * - Test HMAC signature is valid
48
+ * 9. Update this header's event list below.
49
+ *
50
+ * Current event types (v1):
51
+ * task.queued, task.approved, task.updated, task.paused,
52
+ * message.inbound, directive.updated, onboarding.step
53
+ *
54
+ * Versioning: new event types are non-breaking (v1 stays).
55
+ * Consumers MUST ignore unknown event types.
56
+ * See: docs/superpowers/specs/2026-05-23-agent-integration-architecture-design.md, Appendix A
57
+ *
58
+ * @version-history
59
+ * v1.0.0 -- 2026-05-23 -- Initial creation with retry, HMAC signing, auto-disable
60
+ */
61
+ import { createHmac, randomUUID } from 'node:crypto';
62
+ import { validateOutboundUrl } from '../utils/url-validator.js';
63
+ import { logger } from '../utils/logger.js';
64
+ import { buildWebhookEnvelope } from '../models/webhook-schemas.js';
65
+ // ── Constants ──────────────────────────────────────────────────────────
66
+ /** Retry delays in ms: 5s, 30s, 2min */
67
+ const RETRY_DELAYS_MS = [5_000, 30_000, 120_000];
68
+ /** Auto-disable webhook after this many consecutive failures */
69
+ const MAX_CONSECUTIVE_FAILURES = 10;
70
+ /** Keep only the last N delivery log entries per agent */
71
+ const DELIVERY_LOG_KEEP = 50;
72
+ /** HTTP timeout for each delivery attempt */
73
+ const FETCH_TIMEOUT_MS = 10_000;
74
+ // ── Factory ────────────────────────────────────────────────────────────
75
+ export function createWebhookDispatcher({ config, storage }) {
76
+ /**
77
+ * Main entry point: dispatch a webhook event to an agent's configured URL.
78
+ * Returns silently if the agent has no webhook configured or it is disabled.
79
+ */
80
+ async function dispatchWebhookEvent(agentGaii, event, data) {
81
+ // Load agent record
82
+ const agent = await storage.getAgent(agentGaii);
83
+ if (!agent) {
84
+ logger.warn('Webhook dispatch: agent not found', { agentGaii, event });
85
+ return;
86
+ }
87
+ // Check webhook is configured and enabled
88
+ if (!agent.webhookUrl || !agent.webhookEnabled) {
89
+ logger.debug('Webhook dispatch: skipped (not configured or disabled)', { agentGaii, event });
90
+ return;
91
+ }
92
+ if (!agent.webhookSecret) {
93
+ logger.warn('Webhook dispatch: skipped (no secret configured)', { agentGaii, event });
94
+ return;
95
+ }
96
+ // Validate URL (SSRF protection)
97
+ const urlCheck = await validateOutboundUrl(agent.webhookUrl);
98
+ if (!urlCheck.valid) {
99
+ logger.warn('Webhook dispatch: URL validation failed', {
100
+ agentGaii,
101
+ event,
102
+ url: agent.webhookUrl,
103
+ reason: urlCheck.reason,
104
+ });
105
+ await onFailure(agentGaii, agent.webhookFailCount ?? 0);
106
+ await logDelivery(agentGaii, event, data, {
107
+ status: 'failed',
108
+ errorMessage: `URL validation failed: ${urlCheck.reason}`,
109
+ attemptCount: 0,
110
+ latencyMs: 0,
111
+ });
112
+ return;
113
+ }
114
+ // Build the signed payload
115
+ const envelope = buildWebhookEnvelope(event, config.nodeId, agentGaii, data);
116
+ const body = JSON.stringify(envelope);
117
+ // Fire with retry (async, does not block the caller's response)
118
+ fireWithRetry(agentGaii, agent.webhookUrl, body, agent.webhookSecret, event, data, 0);
119
+ }
120
+ /**
121
+ * Fire HTTP POST with exponential backoff retry.
122
+ * Each attempt has a 10s timeout. Retries are scheduled via setTimeout
123
+ * so the caller is not blocked.
124
+ */
125
+ function fireWithRetry(agentGaii, url, body, secret, event, data, attempt) {
126
+ const startMs = Date.now();
127
+ // HMAC-SHA256 signature
128
+ const signature = createHmac('sha256', secret).update(body).digest('hex');
129
+ fetch(url, {
130
+ method: 'POST',
131
+ headers: {
132
+ 'Content-Type': 'application/json',
133
+ 'X-AIMEAT-Signature': `sha256=${signature}`,
134
+ 'X-AIMEAT-Event': event,
135
+ 'X-AIMEAT-Delivery': randomUUID(),
136
+ },
137
+ body,
138
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
139
+ })
140
+ .then(async (response) => {
141
+ const latencyMs = Date.now() - startMs;
142
+ if (response.ok) {
143
+ // Success (2xx)
144
+ logger.info('Webhook delivered', { agentGaii, event, attempt: attempt + 1, httpStatus: response.status, latencyMs });
145
+ await onSuccess(agentGaii);
146
+ await logDelivery(agentGaii, event, data, {
147
+ status: 'success',
148
+ httpStatus: response.status,
149
+ attemptCount: attempt + 1,
150
+ latencyMs,
151
+ });
152
+ }
153
+ else {
154
+ // Non-2xx response -- treat as failure
155
+ const errorMessage = `HTTP ${response.status} ${response.statusText}`;
156
+ logger.warn('Webhook delivery failed (non-2xx)', { agentGaii, event, attempt: attempt + 1, httpStatus: response.status });
157
+ await handleRetryOrFail(agentGaii, url, body, secret, event, data, attempt, errorMessage, response.status, latencyMs);
158
+ }
159
+ })
160
+ .catch(async (err) => {
161
+ const latencyMs = Date.now() - startMs;
162
+ const errorMessage = err instanceof Error ? err.message : String(err);
163
+ logger.warn('Webhook delivery failed (network)', { agentGaii, event, attempt: attempt + 1, error: errorMessage });
164
+ await handleRetryOrFail(agentGaii, url, body, secret, event, data, attempt, errorMessage, undefined, latencyMs);
165
+ });
166
+ }
167
+ /**
168
+ * Decide whether to retry or record final failure.
169
+ */
170
+ async function handleRetryOrFail(agentGaii, url, body, secret, event, data, attempt, errorMessage, httpStatus, latencyMs) {
171
+ if (attempt < RETRY_DELAYS_MS.length) {
172
+ // Schedule retry
173
+ const delayMs = RETRY_DELAYS_MS[attempt];
174
+ logger.info('Webhook retry scheduled', { agentGaii, event, attempt: attempt + 1, nextAttempt: attempt + 2, delayMs });
175
+ setTimeout(() => {
176
+ fireWithRetry(agentGaii, url, body, secret, event, data, attempt + 1);
177
+ }, delayMs);
178
+ }
179
+ else {
180
+ // All retries exhausted
181
+ logger.error('Webhook delivery failed permanently', { agentGaii, event, totalAttempts: attempt + 1 });
182
+ // Load current fail count (may have changed during retries)
183
+ const agent = await storage.getAgent(agentGaii);
184
+ const currentFailCount = agent?.webhookFailCount ?? 0;
185
+ await onFailure(agentGaii, currentFailCount);
186
+ await logDelivery(agentGaii, event, data, {
187
+ status: 'failed',
188
+ httpStatus,
189
+ errorMessage,
190
+ attemptCount: attempt + 1,
191
+ latencyMs,
192
+ });
193
+ }
194
+ }
195
+ /**
196
+ * Handle successful delivery: reset fail counter and record timestamp.
197
+ */
198
+ async function onSuccess(agentGaii) {
199
+ try {
200
+ await storage.updateAgent(agentGaii, {
201
+ webhookFailCount: 0,
202
+ webhookLastSuccess: new Date().toISOString(),
203
+ });
204
+ }
205
+ catch (err) {
206
+ logger.error('Failed to update agent webhook success state', { agentGaii, error: err });
207
+ }
208
+ }
209
+ /**
210
+ * Handle failed delivery: increment fail counter, auto-disable at threshold.
211
+ */
212
+ async function onFailure(agentGaii, currentFailCount) {
213
+ const newFailCount = currentFailCount + 1;
214
+ try {
215
+ const updates = {
216
+ webhookFailCount: newFailCount,
217
+ webhookLastFailure: new Date().toISOString(),
218
+ };
219
+ if (newFailCount >= MAX_CONSECUTIVE_FAILURES) {
220
+ updates.webhookEnabled = false;
221
+ logger.warn('Webhook auto-disabled after consecutive failures', {
222
+ agentGaii,
223
+ failCount: newFailCount,
224
+ threshold: MAX_CONSECUTIVE_FAILURES,
225
+ });
226
+ }
227
+ await storage.updateAgent(agentGaii, updates);
228
+ }
229
+ catch (err) {
230
+ logger.error('Failed to update agent webhook failure state', { agentGaii, error: err });
231
+ }
232
+ }
233
+ /**
234
+ * Persist a delivery log entry and prune old records.
235
+ */
236
+ async function logDelivery(agentGaii, event, data, result) {
237
+ const log = {
238
+ id: randomUUID(),
239
+ agentGaii,
240
+ event,
241
+ payload: data,
242
+ status: result.status,
243
+ httpStatus: result.httpStatus,
244
+ errorMessage: result.errorMessage,
245
+ attemptCount: result.attemptCount,
246
+ latencyMs: result.latencyMs,
247
+ createdAt: new Date().toISOString(),
248
+ };
249
+ try {
250
+ await storage.appendDeliveryLog(log);
251
+ await storage.pruneDeliveryLog(agentGaii, DELIVERY_LOG_KEEP);
252
+ }
253
+ catch (err) {
254
+ logger.error('Failed to persist webhook delivery log', { agentGaii, event, error: err });
255
+ }
256
+ }
257
+ return { dispatchWebhookEvent };
258
+ }
259
+ //# sourceMappingURL=webhook-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-dispatcher.js","sourceRoot":"","sources":["../../../src/services/webhook-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,18 @@ export interface AgentRecord {
30
30
  technicalCapabilities?: AgentTechnicalCapability[];
31
31
  domainCapabilities?: string[];
32
32
  activityStats?: AgentActivityStats;
33
+ modulesLoaded?: string[];
34
+ agentLimitations?: string[];
35
+ webhookUrl?: string;
36
+ webhookSecret?: string;
37
+ webhookEnabled?: boolean;
38
+ webhookLastSuccess?: string;
39
+ webhookLastFailure?: string;
40
+ webhookFailCount?: number;
41
+ platform?: string;
42
+ platformVersion?: string;
43
+ platformDetectedBy?: 'auto' | 'self_report' | 'message_reply';
44
+ tags?: string[];
33
45
  }
34
46
  export interface MemoryRecord {
35
47
  key: string;
@@ -1297,7 +1309,7 @@ export interface AgentTaskRecord {
1297
1309
  memoryPrefixes?: string[];
1298
1310
  };
1299
1311
  todos: AgentTaskTodo[];
1300
- status: 'draft' | 'queued' | 'active' | 'stalled' | 'done' | 'failed';
1312
+ status: 'draft' | 'queued' | 'active' | 'paused' | 'stalled' | 'done' | 'failed';
1301
1313
  parentTaskId?: string;
1302
1314
  workTrackingCode?: string;
1303
1315
  telemetry?: {
@@ -1335,12 +1347,19 @@ export interface DirectiveResource {
1335
1347
  reference: string;
1336
1348
  description: string;
1337
1349
  }
1350
+ export interface BudgetLimits {
1351
+ maxTokensPerTask?: number;
1352
+ maxTokensPerDay?: number;
1353
+ maxTasksPerDay?: number;
1354
+ alertThreshold?: number;
1355
+ }
1338
1356
  export interface AgentDirectivesRecord {
1339
1357
  agentGaii: string;
1340
1358
  purpose: string;
1341
1359
  rules: DirectiveRule[];
1342
1360
  memoryAreas: DirectiveMemoryArea[];
1343
1361
  resources: DirectiveResource[];
1362
+ budgetLimits?: BudgetLimits;
1344
1363
  updatedAt: string;
1345
1364
  }
1346
1365
  export interface OwnerAgentDefaults {
@@ -1415,6 +1434,65 @@ export interface AgentMessageRecord {
1415
1434
  createdAt: string;
1416
1435
  processedAt?: string;
1417
1436
  }
1437
+ export interface TelemetryEvent {
1438
+ id: string;
1439
+ agentGaii: string;
1440
+ type: 'llm_call' | 'tool_call' | 'agent_report';
1441
+ data: Record<string, unknown>;
1442
+ sessionId?: string;
1443
+ taskId?: string;
1444
+ createdAt: string;
1445
+ }
1446
+ export interface WebhookDeliveryLog {
1447
+ id: string;
1448
+ agentGaii: string;
1449
+ event: string;
1450
+ payload: Record<string, unknown>;
1451
+ status: 'success' | 'failed';
1452
+ httpStatus?: number;
1453
+ errorMessage?: string;
1454
+ attemptCount: number;
1455
+ latencyMs: number;
1456
+ createdAt: string;
1457
+ }
1458
+ export interface AgentOnboardingStep {
1459
+ id: string;
1460
+ order: number;
1461
+ title: string;
1462
+ description: string;
1463
+ status: 'pending' | 'passed' | 'failed' | 'skipped';
1464
+ required: boolean;
1465
+ validatedAt?: string;
1466
+ validationMethod: 'automatic' | 'api_call' | 'owner_confirm';
1467
+ details?: Record<string, unknown>;
1468
+ failureReason?: string;
1469
+ }
1470
+ export interface AgentOnboardingRecord {
1471
+ agentGaii: string;
1472
+ status: 'pending' | 'in_progress' | 'completed' | 'failed';
1473
+ startedAt: string;
1474
+ completedAt?: string;
1475
+ steps: AgentOnboardingStep[];
1476
+ readinessScore?: number;
1477
+ readinessLevel?: 'basic' | 'standard' | 'full' | 'expert';
1478
+ detectedPlatform?: string;
1479
+ installedRuntime?: string;
1480
+ onboardingBaseline?: number;
1481
+ operationalHealth?: number;
1482
+ healthComponents?: {
1483
+ deliveryHealth: number;
1484
+ telemetryContinuity: number;
1485
+ taskCompletion: number;
1486
+ };
1487
+ healthRecalculatedAt?: string;
1488
+ readinessOverride?: {
1489
+ level: 'basic' | 'standard' | 'full' | 'expert';
1490
+ setBy: string;
1491
+ setAt: string;
1492
+ expiresAt: string;
1493
+ reason?: string;
1494
+ };
1495
+ }
1418
1496
  import type { OwnerRepository } from './repositories/owner.repository.js';
1419
1497
  import type { AgentRepository } from './repositories/agent.repository.js';
1420
1498
  import type { MemoryRepository } from './repositories/memory.repository.js';
@@ -1459,6 +1537,8 @@ import type { AgentDirectivesRepository } from './repositories/agent-directives.
1459
1537
  import type { SharingGroupRepository } from './repositories/sharing-group.repository.js';
1460
1538
  import type { AgentActivityRepository } from './repositories/agent-activity.repository.js';
1461
1539
  import type { AgentMessageRepository } from './repositories/agent-message.repository.js';
1462
- export interface Storage extends OwnerRepository, AgentRepository, MemoryRepository, ActionRepository, WorkRepository, WalletRepository, BoardRepository, OtkRepository, DisputeRepository, MicroMemoryRepository, FileRepository, IdentityRepository, SchemaRepository, ConsentRepository, CatalogueRepository, ModerationRepository, OrganismRepository, MarketplaceRepository, FederationRepository, NodeRepository, NotificationRepository, AuthRepository, SessionRepository, AppRepository, AppMarketplaceRepository, ConfigRepository, NotificationTemplateRepository, KnowledgeRepository, SchedulerRepository, ExtensionInstanceRepository, ReplicationQueueRepository, DeviceAuthRepository, OAuthRepository, SystemPromptRepository, PackageRepository, TemplateListingRepository, PackageInstanceRepository, CapabilityRepository, AgentTaskRepository, AgentDirectivesRepository, SharingGroupRepository, AgentActivityRepository, AgentMessageRepository, StatsRepository {
1540
+ import type { AgentTelemetryRepository, AgentWebhookRepository } from './repositories/agent-webhook.repository.js';
1541
+ import type { AgentOnboardingRepository } from './repositories/agent-onboarding.repository.js';
1542
+ export interface Storage extends OwnerRepository, AgentRepository, MemoryRepository, ActionRepository, WorkRepository, WalletRepository, BoardRepository, OtkRepository, DisputeRepository, MicroMemoryRepository, FileRepository, IdentityRepository, SchemaRepository, ConsentRepository, CatalogueRepository, ModerationRepository, OrganismRepository, MarketplaceRepository, FederationRepository, NodeRepository, NotificationRepository, AuthRepository, SessionRepository, AppRepository, AppMarketplaceRepository, ConfigRepository, NotificationTemplateRepository, KnowledgeRepository, SchedulerRepository, ExtensionInstanceRepository, ReplicationQueueRepository, DeviceAuthRepository, OAuthRepository, SystemPromptRepository, PackageRepository, TemplateListingRepository, PackageInstanceRepository, CapabilityRepository, AgentTaskRepository, AgentDirectivesRepository, SharingGroupRepository, AgentActivityRepository, AgentMessageRepository, AgentTelemetryRepository, AgentWebhookRepository, AgentOnboardingRepository, StatsRepository {
1463
1543
  }
1464
1544
  //# sourceMappingURL=interface.d.ts.map