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,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file generic-adapter.ts
|
|
3
|
+
* @description Generic fallback runtime adapter for skill bundle generation.
|
|
4
|
+
* Produces aimeat-agent bundle with minimal SKILL.md + references only.
|
|
5
|
+
* Used for runtimes without a dedicated adapter.
|
|
6
|
+
* @version-history
|
|
7
|
+
* v1.0.0 -- 2026-05-23 -- Initial creation for Agent Integration Phase A
|
|
8
|
+
*/
|
|
9
|
+
import { computeBundleVersion } from './generator.js';
|
|
10
|
+
export class GenericAdapter {
|
|
11
|
+
runtime = 'generic';
|
|
12
|
+
bundleName = 'aimeat-agent';
|
|
13
|
+
generate(ctx, references) {
|
|
14
|
+
const files = [
|
|
15
|
+
{ path: 'SKILL.md', content: this.renderSkillMd(ctx) },
|
|
16
|
+
...references,
|
|
17
|
+
];
|
|
18
|
+
const metadata = {
|
|
19
|
+
bundleName: this.bundleName,
|
|
20
|
+
runtime: this.runtime,
|
|
21
|
+
version: '',
|
|
22
|
+
agentName: ctx.agentName,
|
|
23
|
+
agentGaii: ctx.agentGaii,
|
|
24
|
+
nodeId: ctx.nodeId,
|
|
25
|
+
nodeUrl: ctx.nodeUrl,
|
|
26
|
+
generatedAt: new Date().toISOString(),
|
|
27
|
+
};
|
|
28
|
+
const bundle = { metadata, files };
|
|
29
|
+
bundle.metadata.version = computeBundleVersion(bundle);
|
|
30
|
+
return bundle;
|
|
31
|
+
}
|
|
32
|
+
renderSkillMd(ctx) {
|
|
33
|
+
const rulesBlock = ctx.directives.rules.length > 0
|
|
34
|
+
? ctx.directives.rules.map((r, i) => `${i + 1}. ${r.description}`).join('\n')
|
|
35
|
+
: 'No specific rules configured.';
|
|
36
|
+
return `# AIMEAT Agent Integration
|
|
37
|
+
|
|
38
|
+
## Identity
|
|
39
|
+
- Agent: ${ctx.agentName}
|
|
40
|
+
- GAII: ${ctx.agentGaii}
|
|
41
|
+
- Node: ${ctx.nodeUrl} (${ctx.nodeId})
|
|
42
|
+
|
|
43
|
+
## Quick Start
|
|
44
|
+
1. Authenticate with your Bearer token
|
|
45
|
+
2. Check inbox: GET ${ctx.nodeUrl}/v1/agents/me/inbox
|
|
46
|
+
3. Propose todos for queued tasks: PATCH /v1/agents/me/tasks/{id}
|
|
47
|
+
4. Wait for owner approval before executing
|
|
48
|
+
5. Report progress via task events
|
|
49
|
+
6. Complete tasks when done
|
|
50
|
+
|
|
51
|
+
## Directives
|
|
52
|
+
${rulesBlock}
|
|
53
|
+
|
|
54
|
+
## Setup (Manual)
|
|
55
|
+
This is a generic skill bundle. You will need to manually configure:
|
|
56
|
+
- Polling: set up a cron job or scheduled task to poll the inbox endpoint
|
|
57
|
+
- Telemetry: POST to /v1/agents/me/telemetry after each LLM call
|
|
58
|
+
- Webhook (optional): PUT /v1/agents/me/webhook to register a push endpoint
|
|
59
|
+
|
|
60
|
+
See the references/ directory for full API documentation.
|
|
61
|
+
|
|
62
|
+
## After Onboarding: Register Commands and Config
|
|
63
|
+
|
|
64
|
+
These steps are required after completing Hello Integration. They make your capabilities visible in the owner's dashboard.
|
|
65
|
+
|
|
66
|
+
### Register Commands (owner sees these in Messages tab)
|
|
67
|
+
\`\`\`
|
|
68
|
+
POST ${ctx.nodeUrl}/v1/memory
|
|
69
|
+
{ "key": "agents.${ctx.agentName}.commands", "value": [
|
|
70
|
+
{ "name": "/status", "description": "Show current agent status", "category": "general" },
|
|
71
|
+
{ "name": "/inbox", "description": "Check inbox for tasks and messages", "category": "tasks" }
|
|
72
|
+
], "visibility": "owner" }
|
|
73
|
+
\`\`\`
|
|
74
|
+
The value MUST be a flat array of { name, description, category }. Each name starts with /.
|
|
75
|
+
|
|
76
|
+
### Push Config Files (owner sees these in Agent Config tab)
|
|
77
|
+
\`\`\`
|
|
78
|
+
POST ${ctx.nodeUrl}/v1/memory
|
|
79
|
+
{ "key": "agents.config.watchdog", "value": {
|
|
80
|
+
"script": "path/to/your/watchdog",
|
|
81
|
+
"poll_interval": "60s",
|
|
82
|
+
"platform": "your-platform"
|
|
83
|
+
}, "visibility": "owner" }
|
|
84
|
+
\`\`\`
|
|
85
|
+
|
|
86
|
+
## References
|
|
87
|
+
- references/api-overview.md -- Endpoints, auth, response format
|
|
88
|
+
- references/task-lifecycle.md -- Task states and flow
|
|
89
|
+
- references/message-protocol.md -- Messages, threads, slash commands
|
|
90
|
+
- references/telemetry-protocol.md -- Token usage reporting
|
|
91
|
+
- references/capability-report.md -- Declaring capabilities
|
|
92
|
+
- references/error-protocol.md -- Error handling and retry strategy
|
|
93
|
+
`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=generic-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-adapter.js","sourceRoot":"","sources":["../../../../src/services/skill-bundle/generic-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,OAAO,cAAc;IAChB,OAAO,GAAG,SAAS,CAAC;IACpB,UAAU,GAAG,cAAc,CAAC;IAErC,QAAQ,CAAC,GAAkB,EAAE,UAAwB;QACnD,MAAM,KAAK,GAAiB;YAC1B,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;YACtD,GAAG,UAAU;SACd,CAAC;QAEF,MAAM,QAAQ,GAAG;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,MAAM,MAAM,GAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,aAAa,CAAC,GAAkB;QACtC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAChD,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7E,CAAC,CAAC,+BAA+B,CAAC;QAEpC,OAAO;;;WAGA,GAAG,CAAC,SAAS;UACd,GAAG,CAAC,SAAS;UACb,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,MAAM;;;;sBAId,GAAG,CAAC,OAAO;;;;;;;EAO/B,UAAU;;;;;;;;;;;;;;;;OAgBL,GAAG,CAAC,OAAO;mBACC,GAAG,CAAC,SAAS;;;;;;;;;OASzB,GAAG,CAAC,OAAO;;;;;;;;;;;;;;;CAejB,CAAC;IACA,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file hermes-adapter.ts
|
|
3
|
+
* @description Hermes (OpenClaw) runtime adapter for skill bundle generation.
|
|
4
|
+
* Produces aimeat-hermes bundle with SKILL.md, scripts/, and config/ directories.
|
|
5
|
+
* @structure
|
|
6
|
+
* - HermesAdapter class implementing RuntimeAdapter
|
|
7
|
+
* - SKILL.md template with on-wake protocol
|
|
8
|
+
* - Shell scripts: poll-inbox.sh, post-telemetry.sh, test-connection.sh
|
|
9
|
+
* - YAML configs: webhook-route.yaml, hooks.yaml
|
|
10
|
+
* @version-history
|
|
11
|
+
* v1.0.0 -- 2026-05-23 -- Initial creation for Agent Integration Phase A
|
|
12
|
+
*/
|
|
13
|
+
import type { RuntimeAdapter, BundleContext, BundleFile, BundleContent } from './types.js';
|
|
14
|
+
export declare class HermesAdapter implements RuntimeAdapter {
|
|
15
|
+
readonly runtime = "hermes";
|
|
16
|
+
readonly bundleName = "aimeat-hermes";
|
|
17
|
+
generate(ctx: BundleContext, references: BundleFile[]): BundleContent;
|
|
18
|
+
private renderSkillMd;
|
|
19
|
+
private renderPollInbox;
|
|
20
|
+
private renderPostTelemetry;
|
|
21
|
+
private renderTestConnection;
|
|
22
|
+
private renderWebhookRoute;
|
|
23
|
+
private renderHooksYaml;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=hermes-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes-adapter.d.ts","sourceRoot":"","sources":["../../../../src/services/skill-bundle/hermes-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3F,qBAAa,aAAc,YAAW,cAAc;IAClD,QAAQ,CAAC,OAAO,YAAY;IAC5B,QAAQ,CAAC,UAAU,mBAAmB;IAEtC,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,aAAa;IA2BrE,OAAO,CAAC,aAAa;IAoFrB,OAAO,CAAC,eAAe;IAkEvB,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,oBAAoB;IA2C5B,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,eAAe;CAaxB"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file hermes-adapter.ts
|
|
3
|
+
* @description Hermes (OpenClaw) runtime adapter for skill bundle generation.
|
|
4
|
+
* Produces aimeat-hermes bundle with SKILL.md, scripts/, and config/ directories.
|
|
5
|
+
* @structure
|
|
6
|
+
* - HermesAdapter class implementing RuntimeAdapter
|
|
7
|
+
* - SKILL.md template with on-wake protocol
|
|
8
|
+
* - Shell scripts: poll-inbox.sh, post-telemetry.sh, test-connection.sh
|
|
9
|
+
* - YAML configs: webhook-route.yaml, hooks.yaml
|
|
10
|
+
* @version-history
|
|
11
|
+
* v1.0.0 -- 2026-05-23 -- Initial creation for Agent Integration Phase A
|
|
12
|
+
*/
|
|
13
|
+
import { computeBundleVersion } from './generator.js';
|
|
14
|
+
export class HermesAdapter {
|
|
15
|
+
runtime = 'hermes';
|
|
16
|
+
bundleName = 'aimeat-hermes';
|
|
17
|
+
generate(ctx, references) {
|
|
18
|
+
const files = [
|
|
19
|
+
{ path: 'SKILL.md', content: this.renderSkillMd(ctx) },
|
|
20
|
+
...references,
|
|
21
|
+
{ path: 'scripts/poll-inbox.sh', content: this.renderPollInbox(ctx) },
|
|
22
|
+
{ path: 'scripts/post-telemetry.sh', content: this.renderPostTelemetry(ctx) },
|
|
23
|
+
{ path: 'scripts/test-connection.sh', content: this.renderTestConnection(ctx) },
|
|
24
|
+
{ path: 'config/webhook-route.yaml', content: this.renderWebhookRoute(ctx) },
|
|
25
|
+
{ path: 'config/hooks.yaml', content: this.renderHooksYaml(ctx) },
|
|
26
|
+
];
|
|
27
|
+
const metadata = {
|
|
28
|
+
bundleName: this.bundleName,
|
|
29
|
+
runtime: this.runtime,
|
|
30
|
+
version: '',
|
|
31
|
+
agentName: ctx.agentName,
|
|
32
|
+
agentGaii: ctx.agentGaii,
|
|
33
|
+
nodeId: ctx.nodeId,
|
|
34
|
+
nodeUrl: ctx.nodeUrl,
|
|
35
|
+
generatedAt: new Date().toISOString(),
|
|
36
|
+
};
|
|
37
|
+
const bundle = { metadata, files };
|
|
38
|
+
bundle.metadata.version = computeBundleVersion(bundle);
|
|
39
|
+
return bundle;
|
|
40
|
+
}
|
|
41
|
+
renderSkillMd(ctx) {
|
|
42
|
+
const rulesBlock = ctx.directives.rules.length > 0
|
|
43
|
+
? ctx.directives.rules.map((r, i) => `${i + 1}. ${r.description}`).join('\n')
|
|
44
|
+
: 'No specific rules configured.';
|
|
45
|
+
return `---
|
|
46
|
+
name: aimeat-hermes
|
|
47
|
+
description: AIMEAT node integration for ${ctx.nodeId}
|
|
48
|
+
trigger: when user mentions AIMEAT, tasks, inbox, or this skill is invoked
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Identity
|
|
52
|
+
You are ${ctx.agentName} on AIMEAT node ${ctx.nodeUrl}
|
|
53
|
+
Your GAII: ${ctx.agentGaii}
|
|
54
|
+
|
|
55
|
+
## On First Run
|
|
56
|
+
1. Complete Hello Integration: GET /v1/agents/me/onboarding (steps auto-validate, test task auto-starts)
|
|
57
|
+
2. Install the watchdog cron job (this delivers AIMEAT messages to you automatically):
|
|
58
|
+
\`\`\`
|
|
59
|
+
cp scripts/poll-inbox.sh ~/.hermes/scripts/
|
|
60
|
+
chmod +x ~/.hermes/scripts/poll-inbox.sh
|
|
61
|
+
(crontab -l 2>/dev/null; echo "*/5 * * * * ~/.hermes/scripts/poll-inbox.sh") | crontab -
|
|
62
|
+
\`\`\`
|
|
63
|
+
3. Install the telemetry hook:
|
|
64
|
+
\`\`\`
|
|
65
|
+
cp config/hooks.yaml ~/.hermes/config/
|
|
66
|
+
hermes reload_skills
|
|
67
|
+
\`\`\`
|
|
68
|
+
4. Register your commands and config in AIMEAT memory (see "After Setup" section in references)
|
|
69
|
+
|
|
70
|
+
## On Every Wake
|
|
71
|
+
1. Check inbox: GET ${ctx.nodeUrl}/v1/agents/me/inbox?since={cursor}
|
|
72
|
+
2. Queued tasks without todos -> propose plan (PATCH with todos)
|
|
73
|
+
3. Active tasks -> execute next pending todo
|
|
74
|
+
4. Pending messages -> read and respond
|
|
75
|
+
5. Report capabilities if changed
|
|
76
|
+
|
|
77
|
+
## Directives
|
|
78
|
+
${rulesBlock}
|
|
79
|
+
|
|
80
|
+
## Events You May Receive (via webhook)
|
|
81
|
+
- task.queued -- Owner created a new task. Fetch and propose todos.
|
|
82
|
+
- task.approved -- Owner approved your plan. Start executing.
|
|
83
|
+
- task.updated -- Owner edited the task. Re-fetch and adjust.
|
|
84
|
+
- task.paused -- Owner paused the task. Stop work immediately.
|
|
85
|
+
- message.inbound -- Owner sent a message. Read and respond.
|
|
86
|
+
- directive.updated -- Directives changed. Re-fetch via GET /directives.
|
|
87
|
+
- onboarding.step -- Onboarding step needs attention.
|
|
88
|
+
|
|
89
|
+
## After Onboarding: Register Commands and Config
|
|
90
|
+
|
|
91
|
+
These steps are required after completing Hello Integration.
|
|
92
|
+
|
|
93
|
+
### Register Commands (owner sees these in Messages tab)
|
|
94
|
+
\`\`\`
|
|
95
|
+
POST ${ctx.nodeUrl}/v1/memory
|
|
96
|
+
{ "key": "agents.${ctx.agentName}.commands", "value": [
|
|
97
|
+
{ "name": "/status", "description": "Show current agent status", "category": "general" },
|
|
98
|
+
{ "name": "/inbox", "description": "Check inbox for tasks and messages", "category": "tasks" }
|
|
99
|
+
], "visibility": "owner" }
|
|
100
|
+
\`\`\`
|
|
101
|
+
The value MUST be a flat array of { name, description, category }. Each name starts with /.
|
|
102
|
+
|
|
103
|
+
### Push Config Files (owner sees these in Agent Config tab)
|
|
104
|
+
\`\`\`
|
|
105
|
+
POST ${ctx.nodeUrl}/v1/memory
|
|
106
|
+
{ "key": "agents.config.watchdog", "value": {
|
|
107
|
+
"script": "~/.hermes/aimeat_watchdog.sh",
|
|
108
|
+
"poll_interval": "60s",
|
|
109
|
+
"platform": "hermes-agent"
|
|
110
|
+
}, "visibility": "owner" }
|
|
111
|
+
\`\`\`
|
|
112
|
+
|
|
113
|
+
## References
|
|
114
|
+
See references/ directory for detailed API documentation:
|
|
115
|
+
- api-overview.md -- Endpoints, auth, response format
|
|
116
|
+
- task-lifecycle.md -- Task states and flow
|
|
117
|
+
- message-protocol.md -- Messages, threads, slash commands
|
|
118
|
+
- telemetry-protocol.md -- Token usage reporting
|
|
119
|
+
- capability-report.md -- Declaring capabilities
|
|
120
|
+
- error-protocol.md -- Error handling and retry strategy
|
|
121
|
+
`;
|
|
122
|
+
}
|
|
123
|
+
renderPollInbox(ctx) {
|
|
124
|
+
return `#!/bin/bash
|
|
125
|
+
# poll-inbox.sh -- Cron script for Tier 3 polling fallback
|
|
126
|
+
# Runs in no_agent mode (zero LLM cost). Only wakes the agent if new items exist.
|
|
127
|
+
#
|
|
128
|
+
# Install: copy to ~/.hermes/scripts/ and add to crontab:
|
|
129
|
+
# */5 * * * * ~/.hermes/scripts/poll-inbox.sh
|
|
130
|
+
|
|
131
|
+
set -euo pipefail
|
|
132
|
+
|
|
133
|
+
NODE_URL="${ctx.nodeUrl}"
|
|
134
|
+
AGENT_NAME="${ctx.agentName}"
|
|
135
|
+
CURSOR_FILE="$HOME/.hermes/state/aimeat-cursor"
|
|
136
|
+
|
|
137
|
+
# Load auth token
|
|
138
|
+
TOKEN=$(hermes auth token 2>/dev/null || echo "")
|
|
139
|
+
if [ -z "$TOKEN" ]; then
|
|
140
|
+
echo "No auth token available, skipping poll"
|
|
141
|
+
exit 0
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
# Read cursor from previous poll
|
|
145
|
+
CURSOR=""
|
|
146
|
+
if [ -f "$CURSOR_FILE" ]; then
|
|
147
|
+
CURSOR=$(cat "$CURSOR_FILE")
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Build URL
|
|
151
|
+
if [ -n "$CURSOR" ]; then
|
|
152
|
+
URL="$NODE_URL/v1/agents/$AGENT_NAME/inbox?since=$CURSOR"
|
|
153
|
+
else
|
|
154
|
+
URL="$NODE_URL/v1/agents/$AGENT_NAME/inbox"
|
|
155
|
+
fi
|
|
156
|
+
|
|
157
|
+
# Poll inbox
|
|
158
|
+
RESPONSE=$(curl -s -w "\\n%{http_code}" \\
|
|
159
|
+
-H "Authorization: Bearer $TOKEN" \\
|
|
160
|
+
-H "Accept: application/json" \\
|
|
161
|
+
"$URL")
|
|
162
|
+
|
|
163
|
+
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
|
|
164
|
+
BODY=$(echo "$RESPONSE" | head -n -1)
|
|
165
|
+
|
|
166
|
+
if [ "$HTTP_CODE" != "200" ]; then
|
|
167
|
+
echo "Inbox poll failed with HTTP $HTTP_CODE"
|
|
168
|
+
exit 1
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
# Save next cursor
|
|
172
|
+
NEXT_CURSOR=$(echo "$BODY" | jq -r '.data.next_cursor // empty')
|
|
173
|
+
if [ -n "$NEXT_CURSOR" ]; then
|
|
174
|
+
mkdir -p "$(dirname "$CURSOR_FILE")"
|
|
175
|
+
echo "$NEXT_CURSOR" > "$CURSOR_FILE"
|
|
176
|
+
fi
|
|
177
|
+
|
|
178
|
+
# Check if there are new items
|
|
179
|
+
TASK_COUNT=$(echo "$BODY" | jq '.data.queued_tasks | length')
|
|
180
|
+
MSG_COUNT=$(echo "$BODY" | jq '.data.pending_messages | length')
|
|
181
|
+
|
|
182
|
+
if [ "$TASK_COUNT" -gt 0 ] || [ "$MSG_COUNT" -gt 0 ]; then
|
|
183
|
+
echo "New items: $TASK_COUNT tasks, $MSG_COUNT messages -- waking agent"
|
|
184
|
+
hermes wake --reason "AIMEAT inbox: $TASK_COUNT tasks, $MSG_COUNT messages" 2>/dev/null || true
|
|
185
|
+
fi
|
|
186
|
+
`;
|
|
187
|
+
}
|
|
188
|
+
renderPostTelemetry(ctx) {
|
|
189
|
+
return `#!/bin/bash
|
|
190
|
+
# post-telemetry.sh -- Hook script for automatic telemetry reporting
|
|
191
|
+
# Registered as Hermes post_llm_call hook. Fires after every LLM API call.
|
|
192
|
+
#
|
|
193
|
+
# Environment variables set by Hermes:
|
|
194
|
+
# HERMES_TOKENS_IN, HERMES_TOKENS_OUT, HERMES_MODEL,
|
|
195
|
+
# HERMES_DURATION_MS, HERMES_SESSION_ID
|
|
196
|
+
|
|
197
|
+
set -euo pipefail
|
|
198
|
+
|
|
199
|
+
NODE_URL="${ctx.nodeUrl}"
|
|
200
|
+
AGENT_NAME="${ctx.agentName}"
|
|
201
|
+
|
|
202
|
+
TOKEN=$(hermes auth token 2>/dev/null || echo "")
|
|
203
|
+
if [ -z "$TOKEN" ]; then
|
|
204
|
+
exit 0
|
|
205
|
+
fi
|
|
206
|
+
|
|
207
|
+
curl -s -X POST \\
|
|
208
|
+
-H "Authorization: Bearer $TOKEN" \\
|
|
209
|
+
-H "Content-Type: application/json" \\
|
|
210
|
+
-d "{
|
|
211
|
+
\\"type\\": \\"llm_call\\",
|
|
212
|
+
\\"tokens_in\\": \${HERMES_TOKENS_IN:-0},
|
|
213
|
+
\\"tokens_out\\": \${HERMES_TOKENS_OUT:-0},
|
|
214
|
+
\\"model\\": \\"\${HERMES_MODEL:-unknown}\\",
|
|
215
|
+
\\"duration_ms\\": \${HERMES_DURATION_MS:-0},
|
|
216
|
+
\\"session_id\\": \\"\${HERMES_SESSION_ID:-}\\",
|
|
217
|
+
\\"timestamp\\": \\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\"
|
|
218
|
+
}" \\
|
|
219
|
+
"$NODE_URL/v1/agents/$AGENT_NAME/telemetry" > /dev/null 2>&1 || true
|
|
220
|
+
`;
|
|
221
|
+
}
|
|
222
|
+
renderTestConnection(ctx) {
|
|
223
|
+
return `#!/bin/bash
|
|
224
|
+
# test-connection.sh -- Healthcheck script
|
|
225
|
+
# Verifies auth token works and inbox endpoint is reachable.
|
|
226
|
+
#
|
|
227
|
+
# Usage: ./test-connection.sh
|
|
228
|
+
|
|
229
|
+
set -euo pipefail
|
|
230
|
+
|
|
231
|
+
NODE_URL="${ctx.nodeUrl}"
|
|
232
|
+
AGENT_NAME="${ctx.agentName}"
|
|
233
|
+
|
|
234
|
+
TOKEN=$(hermes auth token 2>/dev/null || echo "")
|
|
235
|
+
if [ -z "$TOKEN" ]; then
|
|
236
|
+
echo "FAIL: No auth token available"
|
|
237
|
+
echo "Run: hermes auth login"
|
|
238
|
+
exit 1
|
|
239
|
+
fi
|
|
240
|
+
|
|
241
|
+
echo "Testing connection to $NODE_URL..."
|
|
242
|
+
|
|
243
|
+
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \\
|
|
244
|
+
-H "Authorization: Bearer $TOKEN" \\
|
|
245
|
+
"$NODE_URL/v1/agents/$AGENT_NAME/inbox")
|
|
246
|
+
|
|
247
|
+
if [ "$HTTP_CODE" = "200" ]; then
|
|
248
|
+
echo "OK: Connection successful (HTTP 200)"
|
|
249
|
+
exit 0
|
|
250
|
+
elif [ "$HTTP_CODE" = "401" ]; then
|
|
251
|
+
echo "FAIL: Authentication failed (HTTP 401)"
|
|
252
|
+
echo "Token may have expired. Run: hermes auth login"
|
|
253
|
+
exit 1
|
|
254
|
+
elif [ "$HTTP_CODE" = "404" ]; then
|
|
255
|
+
echo "FAIL: Agent not found (HTTP 404)"
|
|
256
|
+
echo "Agent '$AGENT_NAME' may not exist on this node."
|
|
257
|
+
exit 1
|
|
258
|
+
else
|
|
259
|
+
echo "FAIL: Unexpected response (HTTP $HTTP_CODE)"
|
|
260
|
+
exit 1
|
|
261
|
+
fi
|
|
262
|
+
`;
|
|
263
|
+
}
|
|
264
|
+
renderWebhookRoute(ctx) {
|
|
265
|
+
return `# webhook-route.yaml -- Hermes webhook route configuration
|
|
266
|
+
# Copy this file to your Hermes config directory.
|
|
267
|
+
#
|
|
268
|
+
# This configures Hermes to accept incoming webhook events from AIMEAT
|
|
269
|
+
# and wake the agent when relevant events arrive.
|
|
270
|
+
|
|
271
|
+
route:
|
|
272
|
+
path: /webhooks/aimeat
|
|
273
|
+
method: POST
|
|
274
|
+
handler: wake_agent
|
|
275
|
+
validation:
|
|
276
|
+
signature_header: X-AIMEAT-Signature
|
|
277
|
+
algorithm: hmac-sha256
|
|
278
|
+
events:
|
|
279
|
+
- task.queued
|
|
280
|
+
- task.approved
|
|
281
|
+
- task.updated
|
|
282
|
+
- task.paused
|
|
283
|
+
- message.inbound
|
|
284
|
+
- directive.updated
|
|
285
|
+
- onboarding.step
|
|
286
|
+
`;
|
|
287
|
+
}
|
|
288
|
+
renderHooksYaml(ctx) {
|
|
289
|
+
return `# hooks.yaml -- Hermes hook registration
|
|
290
|
+
# Copy this file to your Hermes config directory.
|
|
291
|
+
#
|
|
292
|
+
# Registers post_llm_call hook for automatic telemetry reporting.
|
|
293
|
+
|
|
294
|
+
hooks:
|
|
295
|
+
post_llm_call:
|
|
296
|
+
- script: scripts/post-telemetry.sh
|
|
297
|
+
description: Report token usage to AIMEAT node
|
|
298
|
+
enabled: true
|
|
299
|
+
`;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=hermes-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes-adapter.js","sourceRoot":"","sources":["../../../../src/services/skill-bundle/hermes-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file types.ts
|
|
3
|
+
* @description Shared types for the skill bundle generator and runtime adapters.
|
|
4
|
+
* @version-history
|
|
5
|
+
* v1.0.0 -- 2026-05-23 -- Initial creation for Agent Integration Phase A
|
|
6
|
+
*/
|
|
7
|
+
export interface BundleFile {
|
|
8
|
+
path: string;
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
11
|
+
export interface BundleMetadata {
|
|
12
|
+
bundleName: string;
|
|
13
|
+
runtime: string;
|
|
14
|
+
version: string;
|
|
15
|
+
agentName: string;
|
|
16
|
+
agentGaii: string;
|
|
17
|
+
nodeId: string;
|
|
18
|
+
nodeUrl: string;
|
|
19
|
+
generatedAt: string;
|
|
20
|
+
}
|
|
21
|
+
export interface BundleContent {
|
|
22
|
+
metadata: BundleMetadata;
|
|
23
|
+
files: BundleFile[];
|
|
24
|
+
}
|
|
25
|
+
export interface BundleContext {
|
|
26
|
+
agentName: string;
|
|
27
|
+
agentGaii: string;
|
|
28
|
+
nodeId: string;
|
|
29
|
+
nodeUrl: string;
|
|
30
|
+
directives: {
|
|
31
|
+
purpose?: string;
|
|
32
|
+
rules: Array<{
|
|
33
|
+
id: string;
|
|
34
|
+
description: string;
|
|
35
|
+
source: string;
|
|
36
|
+
}>;
|
|
37
|
+
memoryAreas?: string[];
|
|
38
|
+
resources?: Array<{
|
|
39
|
+
key: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
}>;
|
|
42
|
+
};
|
|
43
|
+
capabilities: {
|
|
44
|
+
technical?: string[];
|
|
45
|
+
domain?: string[];
|
|
46
|
+
};
|
|
47
|
+
webhookUrl?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface RuntimeAdapter {
|
|
50
|
+
readonly runtime: string;
|
|
51
|
+
readonly bundleName: string;
|
|
52
|
+
generate(ctx: BundleContext, references: BundleFile[]): BundleContent;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/skill-bundle/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE;QACV,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,SAAS,CAAC,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC1D,CAAC;IACF,YAAY,EAAE;QACZ,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC;CACvE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/skill-bundle/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import type { Storage } from '../storage/interface.js';
|
|
2
2
|
import type { AimeatConfig } from '../config.js';
|
|
3
|
+
export interface AgentStallCondition {
|
|
4
|
+
gaii: string;
|
|
5
|
+
condition: 'unreachable' | 'webhook_down';
|
|
6
|
+
}
|
|
3
7
|
/**
|
|
4
8
|
* Find active tasks that have had no events for longer than the threshold
|
|
5
9
|
* and mark them as stalled. Appends a 'failed' event explaining the reason.
|
|
6
|
-
*
|
|
7
|
-
* @returns Number of tasks marked as stalled
|
|
8
10
|
*/
|
|
9
11
|
export declare function detectStalledTasks(storage: Storage, config: AimeatConfig): Promise<number>;
|
|
12
|
+
/**
|
|
13
|
+
* Check all agents for connectivity stall conditions:
|
|
14
|
+
* - unreachable: no activity for 2h AND no webhook configured
|
|
15
|
+
* - webhook_down: 10+ consecutive webhook delivery failures
|
|
16
|
+
*/
|
|
17
|
+
export declare function detectAgentStallConditions(storage: Storage): Promise<AgentStallCondition[]>;
|
|
10
18
|
//# sourceMappingURL=task-stall-detector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-stall-detector.d.ts","sourceRoot":"","sources":["../../../src/services/task-stall-detector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"task-stall-detector.d.ts","sourceRoot":"","sources":["../../../src/services/task-stall-detector.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAMjD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,GAAG,cAAc,CAAC;CAC3C;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBhG;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAyBjG"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file task-stall-detector.ts
|
|
3
|
-
* @description Background job that detects
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* @description Background job that detects stalled agent tasks and agent-level
|
|
4
|
+
* connectivity issues (unreachable, webhook_down).
|
|
5
|
+
* @structure
|
|
6
|
+
* - detectStalledTasks() -- marks active tasks with no events as stalled
|
|
7
|
+
* - detectAgentStallConditions() -- checks agent-level unreachable/webhook_down
|
|
6
8
|
* @version-history
|
|
9
|
+
* v1.1.0 -- 2026-05-24 -- Add unreachable + webhook_down agent stall conditions
|
|
7
10
|
* v1.0.0 -- 2026-05-21 -- Initial creation for Agent Dashboard Phase 1
|
|
8
11
|
*/
|
|
9
12
|
import { randomUUID } from 'node:crypto';
|
|
10
13
|
import { logger } from '../utils/logger.js';
|
|
14
|
+
const UNREACHABLE_THRESHOLD_MS = 2 * 60 * 60 * 1000; // 2 hours
|
|
15
|
+
const WEBHOOK_DOWN_THRESHOLD = 10;
|
|
11
16
|
/**
|
|
12
17
|
* Find active tasks that have had no events for longer than the threshold
|
|
13
18
|
* and mark them as stalled. Appends a 'failed' event explaining the reason.
|
|
14
|
-
*
|
|
15
|
-
* @returns Number of tasks marked as stalled
|
|
16
19
|
*/
|
|
17
20
|
export async function detectStalledTasks(storage, config) {
|
|
18
21
|
const stalled = await storage.findStalledTasks(config.taskStallThresholdMinutes);
|
|
@@ -35,4 +38,30 @@ export async function detectStalledTasks(storage, config) {
|
|
|
35
38
|
}
|
|
36
39
|
return stalled.length;
|
|
37
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Check all agents for connectivity stall conditions:
|
|
43
|
+
* - unreachable: no activity for 2h AND no webhook configured
|
|
44
|
+
* - webhook_down: 10+ consecutive webhook delivery failures
|
|
45
|
+
*/
|
|
46
|
+
export async function detectAgentStallConditions(storage) {
|
|
47
|
+
const agents = await storage.listAgents();
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
const conditions = [];
|
|
50
|
+
for (const agent of agents) {
|
|
51
|
+
const lastSeenMs = new Date(agent.lastSeen).getTime();
|
|
52
|
+
const hasWebhook = agent.webhookEnabled && agent.webhookUrl;
|
|
53
|
+
if (!hasWebhook && (now - lastSeenMs) > UNREACHABLE_THRESHOLD_MS) {
|
|
54
|
+
conditions.push({ gaii: agent.gaii, condition: 'unreachable' });
|
|
55
|
+
}
|
|
56
|
+
if ((agent.webhookFailCount ?? 0) >= WEBHOOK_DOWN_THRESHOLD) {
|
|
57
|
+
conditions.push({ gaii: agent.gaii, condition: 'webhook_down' });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (conditions.length > 0) {
|
|
61
|
+
const unreachable = conditions.filter(c => c.condition === 'unreachable').length;
|
|
62
|
+
const webhookDown = conditions.filter(c => c.condition === 'webhook_down').length;
|
|
63
|
+
logger.info(`Stall detector: ${unreachable} unreachable agent(s), ${webhookDown} webhook_down agent(s)`);
|
|
64
|
+
}
|
|
65
|
+
return conditions;
|
|
66
|
+
}
|
|
38
67
|
//# sourceMappingURL=task-stall-detector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-stall-detector.js","sourceRoot":"","sources":["../../../src/services/task-stall-detector.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"task-stall-detector.js","sourceRoot":"","sources":["../../../src/services/task-stall-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;AAC/D,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAOlC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAgB,EAAE,MAAoB;IAC7E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACjF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,eAAe,CAAC;YAC5B,EAAE,EAAE,UAAU,EAAE;YAChB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,+BAA+B,MAAM,CAAC,yBAAyB,UAAU;YAClF,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,OAAgB;IAC/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,UAAU,GAA0B,EAAE,CAAC;IAE7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC;QAE5D,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,wBAAwB,EAAE,CAAC;YACjE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI,sBAAsB,EAAE,CAAC;YAC5D,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,aAAa,CAAC,CAAC,MAAM,CAAC;QACjF,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC,MAAM,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,mBAAmB,WAAW,0BAA0B,WAAW,wBAAwB,CAAC,CAAC;IAC3G,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|