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.
- package/dist/.env.example +4 -1
- package/dist/locales/en.json +573 -10
- package/dist/locales/fi.json +572 -9
- package/dist/public/css/views/admin-agent-integration.css +304 -0
- package/dist/public/css/views/agents-detail.css +1697 -120
- package/dist/public/css/views/profile.css +22 -2
- package/dist/public/css/views/public-knowledge-viewer.css +479 -0
- package/dist/public/js/i18n.js +9 -3
- package/dist/public/js/services/admin-agent-integration.js +52 -0
- package/dist/public/js/services/agent-integration.js +80 -0
- package/dist/public/js/services/agent-messages.js +3 -1
- package/dist/public/js/services/generator-spec-validate.js +23 -0
- package/dist/public/js/services/memory.js +39 -0
- package/dist/public/lib/live-updates.js +9 -4
- package/dist/public/llms-template.txt +106 -0
- package/dist/public/spa.html +7 -2
- package/dist/public/views/admin/agent-integration-tab.js +390 -0
- package/dist/public/views/admin/federation-tab.js +5 -5
- package/dist/public/views/admin/prompts-tab.js +9 -10
- package/dist/public/views/admin.js +2 -0
- package/dist/public/views/profile/access-tab.js +18 -0
- package/dist/public/views/profile/agents/agent-card.js +396 -0
- package/dist/public/views/profile/agents/shared-board.js +97 -0
- package/dist/public/views/profile/agents/state-detector.js +62 -0
- package/dist/public/views/profile/agents/tab-activity.js +232 -0
- package/dist/public/views/profile/agents/tab-agent-config.js +199 -0
- package/dist/public/views/profile/agents/tab-data-access.js +304 -0
- package/dist/public/views/profile/agents/tab-directives.js +178 -0
- package/dist/public/views/profile/agents/tab-integration.js +505 -0
- package/dist/public/views/profile/agents/tab-messages.js +278 -0
- package/dist/public/views/profile/agents/tab-services.js +17 -0
- package/dist/public/views/profile/agents/tab-tasks.js +17 -0
- package/dist/public/views/profile/agents-messages-subtab.js +12 -10
- package/dist/public/views/profile/agents-services-subtab.js +17 -11
- package/dist/public/views/profile/agents-tab.js +159 -255
- package/dist/public/views/profile/agents-task-builder.js +403 -0
- package/dist/public/views/profile/agents-tasks-subtab.js +186 -140
- package/dist/public/views/profile/generator-detail.js +8 -1
- package/dist/public/views/profile/memory-tab.js +371 -7
- package/dist/public/views/profile/wallet-tab.js +14 -0
- package/dist/public/views/public-knowledge-viewer.js +650 -0
- package/dist/src/auth/middleware.d.ts.map +1 -1
- package/dist/src/auth/middleware.js +17 -0
- package/dist/src/auth/middleware.js.map +1 -1
- package/dist/src/config.d.ts +1 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +1 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/middleware/readiness-gate.d.ts +18 -0
- package/dist/src/middleware/readiness-gate.d.ts.map +1 -0
- package/dist/src/middleware/readiness-gate.js +50 -0
- package/dist/src/middleware/readiness-gate.js.map +1 -0
- package/dist/src/models/agent-capabilities-schemas.d.ts +3 -0
- package/dist/src/models/agent-capabilities-schemas.d.ts.map +1 -1
- package/dist/src/models/agent-capabilities-schemas.js +3 -0
- package/dist/src/models/agent-capabilities-schemas.js.map +1 -1
- package/dist/src/models/agent-directives-schemas.d.ts +12 -0
- package/dist/src/models/agent-directives-schemas.d.ts.map +1 -1
- package/dist/src/models/agent-directives-schemas.js +7 -0
- package/dist/src/models/agent-directives-schemas.js.map +1 -1
- package/dist/src/models/agent-onboarding-schemas.d.ts +45 -0
- package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -0
- package/dist/src/models/agent-onboarding-schemas.js +91 -0
- package/dist/src/models/agent-onboarding-schemas.js.map +1 -0
- package/dist/src/models/webhook-schemas.d.ts +266 -0
- package/dist/src/models/webhook-schemas.d.ts.map +1 -0
- package/dist/src/models/webhook-schemas.js +137 -0
- package/dist/src/models/webhook-schemas.js.map +1 -0
- package/dist/src/routes/admin-agent-integration.d.ts +24 -0
- package/dist/src/routes/admin-agent-integration.d.ts.map +1 -0
- package/dist/src/routes/admin-agent-integration.js +186 -0
- package/dist/src/routes/admin-agent-integration.js.map +1 -0
- package/dist/src/routes/admin-monitoring.js +12 -7
- package/dist/src/routes/admin-monitoring.js.map +1 -1
- package/dist/src/routes/agent-activity.d.ts.map +1 -1
- package/dist/src/routes/agent-activity.js +17 -0
- package/dist/src/routes/agent-activity.js.map +1 -1
- package/dist/src/routes/agent-capabilities.d.ts +1 -0
- package/dist/src/routes/agent-capabilities.d.ts.map +1 -1
- package/dist/src/routes/agent-capabilities.js +9 -0
- package/dist/src/routes/agent-capabilities.js.map +1 -1
- package/dist/src/routes/agent-directives.d.ts +5 -1
- package/dist/src/routes/agent-directives.d.ts.map +1 -1
- package/dist/src/routes/agent-directives.js +74 -20
- package/dist/src/routes/agent-directives.js.map +1 -1
- package/dist/src/routes/agent-integration.d.ts +1 -0
- package/dist/src/routes/agent-integration.d.ts.map +1 -1
- package/dist/src/routes/agent-integration.js +128 -11
- package/dist/src/routes/agent-integration.js.map +1 -1
- package/dist/src/routes/agent-messages.d.ts +5 -1
- package/dist/src/routes/agent-messages.d.ts.map +1 -1
- package/dist/src/routes/agent-messages.js +20 -1
- package/dist/src/routes/agent-messages.js.map +1 -1
- package/dist/src/routes/agent-onboarding.d.ts +23 -0
- package/dist/src/routes/agent-onboarding.d.ts.map +1 -0
- package/dist/src/routes/agent-onboarding.js +374 -0
- package/dist/src/routes/agent-onboarding.js.map +1 -0
- package/dist/src/routes/agent-skill-bundle.d.ts +16 -0
- package/dist/src/routes/agent-skill-bundle.d.ts.map +1 -0
- package/dist/src/routes/agent-skill-bundle.js +133 -0
- package/dist/src/routes/agent-skill-bundle.js.map +1 -0
- package/dist/src/routes/agent-tasks.d.ts +8 -1
- package/dist/src/routes/agent-tasks.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks.js +192 -14
- package/dist/src/routes/agent-tasks.js.map +1 -1
- package/dist/src/routes/agent-telemetry.d.ts +15 -0
- package/dist/src/routes/agent-telemetry.d.ts.map +1 -0
- package/dist/src/routes/agent-telemetry.js +99 -0
- package/dist/src/routes/agent-telemetry.js.map +1 -0
- package/dist/src/routes/agent-webhook.d.ts +18 -0
- package/dist/src/routes/agent-webhook.d.ts.map +1 -0
- package/dist/src/routes/agent-webhook.js +243 -0
- package/dist/src/routes/agent-webhook.js.map +1 -0
- package/dist/src/routes/agents.d.ts.map +1 -1
- package/dist/src/routes/agents.js +203 -4
- package/dist/src/routes/agents.js.map +1 -1
- package/dist/src/routes/auth.d.ts.map +1 -1
- package/dist/src/routes/auth.js +45 -2
- package/dist/src/routes/auth.js.map +1 -1
- package/dist/src/routes/federation-auth.d.ts.map +1 -1
- package/dist/src/routes/federation-auth.js +3 -1
- package/dist/src/routes/federation-auth.js.map +1 -1
- package/dist/src/routes/federation-peer.d.ts.map +1 -1
- package/dist/src/routes/federation-peer.js +11 -2
- package/dist/src/routes/federation-peer.js.map +1 -1
- package/dist/src/routes/federation-sync.d.ts +1 -0
- package/dist/src/routes/federation-sync.d.ts.map +1 -1
- package/dist/src/routes/federation-sync.js +29 -0
- package/dist/src/routes/federation-sync.js.map +1 -1
- package/dist/src/routes/ghii.d.ts.map +1 -1
- package/dist/src/routes/ghii.js +42 -5
- package/dist/src/routes/ghii.js.map +1 -1
- package/dist/src/routes/knowledge.d.ts.map +1 -1
- package/dist/src/routes/knowledge.js +19 -7
- package/dist/src/routes/knowledge.js.map +1 -1
- package/dist/src/routes/memory.d.ts +9 -0
- package/dist/src/routes/memory.d.ts.map +1 -1
- package/dist/src/routes/memory.js +307 -12
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/portal.d.ts.map +1 -1
- package/dist/src/routes/portal.js +1 -0
- package/dist/src/routes/portal.js.map +1 -1
- package/dist/src/routes/prompts.d.ts +1 -0
- package/dist/src/routes/prompts.d.ts.map +1 -1
- package/dist/src/routes/prompts.js +40 -1
- package/dist/src/routes/prompts.js.map +1 -1
- package/dist/src/routes/sharing-groups.d.ts.map +1 -1
- package/dist/src/routes/sharing-groups.js +8 -2
- package/dist/src/routes/sharing-groups.js.map +1 -1
- package/dist/src/routes/wallet.d.ts.map +1 -1
- package/dist/src/routes/wallet.js +2 -0
- package/dist/src/routes/wallet.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +47 -3
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/services/config-schema.d.ts.map +1 -1
- package/dist/src/services/config-schema.js +2 -1
- package/dist/src/services/config-schema.js.map +1 -1
- package/dist/src/services/core-jobs.d.ts.map +1 -1
- package/dist/src/services/core-jobs.js +3 -2
- package/dist/src/services/core-jobs.js.map +1 -1
- package/dist/src/services/federation-helpers.d.ts +1 -0
- package/dist/src/services/federation-helpers.d.ts.map +1 -1
- package/dist/src/services/federation-helpers.js +1 -1
- package/dist/src/services/federation-helpers.js.map +1 -1
- package/dist/src/services/generator-autopilot.d.ts.map +1 -1
- package/dist/src/services/generator-autopilot.js +125 -26
- package/dist/src/services/generator-autopilot.js.map +1 -1
- package/dist/src/services/generator-prompts/index.d.ts +1 -1
- package/dist/src/services/generator-prompts/index.d.ts.map +1 -1
- package/dist/src/services/generator-prompts/index.js +1 -1
- package/dist/src/services/generator-prompts/index.js.map +1 -1
- package/dist/src/services/generator-prompts/spec-validate.d.ts +1 -0
- package/dist/src/services/generator-prompts/spec-validate.d.ts.map +1 -1
- package/dist/src/services/generator-prompts/spec-validate.js +20 -0
- package/dist/src/services/generator-prompts/spec-validate.js.map +1 -1
- package/dist/src/services/generator-prompts/validate.d.ts +7 -1
- package/dist/src/services/generator-prompts/validate.d.ts.map +1 -1
- package/dist/src/services/generator-prompts/validate.js +70 -0
- package/dist/src/services/generator-prompts/validate.js.map +1 -1
- package/dist/src/services/onboarding-validator.d.ts +22 -0
- package/dist/src/services/onboarding-validator.d.ts.map +1 -0
- package/dist/src/services/onboarding-validator.js +202 -0
- package/dist/src/services/onboarding-validator.js.map +1 -0
- package/dist/src/services/platform-detector.d.ts +27 -0
- package/dist/src/services/platform-detector.d.ts.map +1 -0
- package/dist/src/services/platform-detector.js +73 -0
- package/dist/src/services/platform-detector.js.map +1 -0
- package/dist/src/services/prompt-defaults.d.ts +1 -0
- package/dist/src/services/prompt-defaults.d.ts.map +1 -1
- package/dist/src/services/prompt-defaults.js +875 -47
- package/dist/src/services/prompt-defaults.js.map +1 -1
- package/dist/src/services/prompt-seeder.js +1 -1
- package/dist/src/services/prompt-seeder.js.map +1 -1
- package/dist/src/services/readiness-scorer.d.ts +34 -0
- package/dist/src/services/readiness-scorer.d.ts.map +1 -0
- package/dist/src/services/readiness-scorer.js +87 -0
- package/dist/src/services/readiness-scorer.js.map +1 -0
- package/dist/src/services/skill-bundle/generator.d.ts +17 -0
- package/dist/src/services/skill-bundle/generator.d.ts.map +1 -0
- package/dist/src/services/skill-bundle/generator.js +387 -0
- package/dist/src/services/skill-bundle/generator.js.map +1 -0
- package/dist/src/services/skill-bundle/generic-adapter.d.ts +16 -0
- package/dist/src/services/skill-bundle/generic-adapter.d.ts.map +1 -0
- package/dist/src/services/skill-bundle/generic-adapter.js +96 -0
- package/dist/src/services/skill-bundle/generic-adapter.js.map +1 -0
- package/dist/src/services/skill-bundle/hermes-adapter.d.ts +25 -0
- package/dist/src/services/skill-bundle/hermes-adapter.d.ts.map +1 -0
- package/dist/src/services/skill-bundle/hermes-adapter.js +302 -0
- package/dist/src/services/skill-bundle/hermes-adapter.js.map +1 -0
- package/dist/src/services/skill-bundle/types.d.ts +54 -0
- package/dist/src/services/skill-bundle/types.d.ts.map +1 -0
- package/dist/src/services/skill-bundle/types.js +8 -0
- package/dist/src/services/skill-bundle/types.js.map +1 -0
- package/dist/src/services/task-stall-detector.d.ts +10 -2
- package/dist/src/services/task-stall-detector.d.ts.map +1 -1
- package/dist/src/services/task-stall-detector.js +34 -5
- package/dist/src/services/task-stall-detector.js.map +1 -1
- package/dist/src/services/webhook-dispatcher.d.ts +71 -0
- package/dist/src/services/webhook-dispatcher.d.ts.map +1 -0
- package/dist/src/services/webhook-dispatcher.js +259 -0
- package/dist/src/services/webhook-dispatcher.js.map +1 -0
- package/dist/src/storage/interface.d.ts +82 -2
- package/dist/src/storage/interface.d.ts.map +1 -1
- package/dist/src/storage/providers/mongodb/index.d.ts +20 -1
- package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
- package/dist/src/storage/providers/mongodb/index.js +254 -3
- package/dist/src/storage/providers/mongodb/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/index.d.ts +18 -1
- package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/index.js +173 -4
- package/dist/src/storage/providers/sqlite/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/agent-directives.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/agent-directives.js +8 -4
- package/dist/src/storage/providers/sqlite/repos/agent-directives.js.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/agent.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/agent.js +25 -4
- package/dist/src/storage/providers/sqlite/repos/agent.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +73 -1
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/dist/src/storage/repositories/agent-onboarding.repository.d.ts +16 -0
- package/dist/src/storage/repositories/agent-onboarding.repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/agent-onboarding.repository.js +8 -0
- package/dist/src/storage/repositories/agent-onboarding.repository.js.map +1 -0
- package/dist/src/storage/repositories/agent-webhook.repository.d.ts +21 -0
- package/dist/src/storage/repositories/agent-webhook.repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/agent-webhook.repository.js +2 -0
- package/dist/src/storage/repositories/agent-webhook.repository.js.map +1 -0
- package/dist/src/storage/repositories/agent.repository.d.ts +1 -0
- package/dist/src/storage/repositories/agent.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/index.d.ts +2 -0
- package/dist/src/storage/repositories/index.d.ts.map +1 -1
- package/dist/src/utils/env-config.d.ts.map +1 -1
- package/dist/src/utils/env-config.js +7 -1
- package/dist/src/utils/env-config.js.map +1 -1
- package/dist/src/utils/url-validator.d.ts.map +1 -1
- package/dist/src/utils/url-validator.js +3 -0
- package/dist/src/utils/url-validator.js.map +1 -1
- package/package.json +1 -1
- 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
|
-
|
|
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
|