aimeat 1.9.4 → 1.10.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 (190) hide show
  1. package/README.md +47 -10
  2. package/dist/locales/en.json +29 -8
  3. package/dist/locales/fi.json +39 -18
  4. package/dist/public/llms-template.txt +13 -2
  5. package/dist/public/views/profile/agents/agent-card.js +5 -2
  6. package/dist/public/views/profile/agents/tab-activity.js +17 -3
  7. package/dist/public/views/profile/agents/tab-integration.js +48 -5
  8. package/dist/public/views/profile/agents-capabilities-subtab.js +14 -7
  9. package/dist/public/views/profile/agents-tab.js +73 -19
  10. package/dist/scripts/audit-mcp-tools.d.ts +18 -0
  11. package/dist/scripts/audit-mcp-tools.d.ts.map +1 -0
  12. package/dist/scripts/audit-mcp-tools.js +164 -0
  13. package/dist/scripts/audit-mcp-tools.js.map +1 -0
  14. package/dist/src/cli/connect/auth.d.ts.map +1 -1
  15. package/dist/src/cli/connect/auth.js +134 -21
  16. package/dist/src/cli/connect/auth.js.map +1 -1
  17. package/dist/src/cli/connect/config.d.ts.map +1 -1
  18. package/dist/src/cli/connect/config.js.map +1 -1
  19. package/dist/src/cli/connect/mcp/poller.d.ts +8 -2
  20. package/dist/src/cli/connect/mcp/poller.d.ts.map +1 -1
  21. package/dist/src/cli/connect/mcp/poller.js +77 -12
  22. package/dist/src/cli/connect/mcp/poller.js.map +1 -1
  23. package/dist/src/cli/connect/mcp/tools/agent-caps.js +4 -4
  24. package/dist/src/cli/connect/mcp/tools/agent-caps.js.map +1 -1
  25. package/dist/src/cli/connect/mcp/tools/agent-messages.d.ts +1 -0
  26. package/dist/src/cli/connect/mcp/tools/agent-messages.d.ts.map +1 -1
  27. package/dist/src/cli/connect/mcp/tools/agent-messages.js +12 -5
  28. package/dist/src/cli/connect/mcp/tools/agent-messages.js.map +1 -1
  29. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts +3 -0
  30. package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
  31. package/dist/src/cli/connect/mcp/tools/agent-tasks.js +31 -10
  32. package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
  33. package/dist/src/cli/connect/mcp/tools/agent-telemetry.d.ts +11 -0
  34. package/dist/src/cli/connect/mcp/tools/agent-telemetry.d.ts.map +1 -0
  35. package/dist/src/cli/connect/mcp/tools/agent-telemetry.js +24 -0
  36. package/dist/src/cli/connect/mcp/tools/agent-telemetry.js.map +1 -0
  37. package/dist/src/cli/connect/mcp/tools/core.d.ts +5 -0
  38. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  39. package/dist/src/cli/connect/mcp/tools/core.js +15 -3
  40. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  41. package/dist/src/cli/connect/mcp/tools/index.d.ts +2 -0
  42. package/dist/src/cli/connect/mcp/tools/index.d.ts.map +1 -1
  43. package/dist/src/cli/connect/mcp/tools/index.js +4 -0
  44. package/dist/src/cli/connect/mcp/tools/index.js.map +1 -1
  45. package/dist/src/cli/connect/mcp/tools/onboarding.d.ts +14 -0
  46. package/dist/src/cli/connect/mcp/tools/onboarding.d.ts.map +1 -0
  47. package/dist/src/cli/connect/mcp/tools/onboarding.js +44 -0
  48. package/dist/src/cli/connect/mcp/tools/onboarding.js.map +1 -0
  49. package/dist/src/cli/connect/mcp/wakeup.d.ts.map +1 -1
  50. package/dist/src/cli/connect/mcp/wakeup.js +12 -0
  51. package/dist/src/cli/connect/mcp/wakeup.js.map +1 -1
  52. package/dist/src/cli/connect/onboarding-prompt.d.ts +19 -0
  53. package/dist/src/cli/connect/onboarding-prompt.d.ts.map +1 -0
  54. package/dist/src/cli/connect/onboarding-prompt.js +58 -0
  55. package/dist/src/cli/connect/onboarding-prompt.js.map +1 -0
  56. package/dist/src/cli/connect/send.d.ts.map +1 -1
  57. package/dist/src/cli/connect/send.js +6 -5
  58. package/dist/src/cli/connect/send.js.map +1 -1
  59. package/dist/src/cli/connect/skill-bundle.d.ts +9 -1
  60. package/dist/src/cli/connect/skill-bundle.d.ts.map +1 -1
  61. package/dist/src/cli/connect/skill-bundle.js +219 -4
  62. package/dist/src/cli/connect/skill-bundle.js.map +1 -1
  63. package/dist/src/cli/connect/tool-call.d.ts +43 -0
  64. package/dist/src/cli/connect/tool-call.d.ts.map +1 -0
  65. package/dist/src/cli/connect/tool-call.js +878 -0
  66. package/dist/src/cli/connect/tool-call.js.map +1 -0
  67. package/dist/src/index.js +125 -30
  68. package/dist/src/index.js.map +1 -1
  69. package/dist/src/mcp/agent-onboarding.d.ts +20 -0
  70. package/dist/src/mcp/agent-onboarding.d.ts.map +1 -0
  71. package/dist/src/mcp/agent-onboarding.js +199 -0
  72. package/dist/src/mcp/agent-onboarding.js.map +1 -0
  73. package/dist/src/mcp/agent-tasks.d.ts +4 -2
  74. package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
  75. package/dist/src/mcp/agent-tasks.js +42 -24
  76. package/dist/src/mcp/agent-tasks.js.map +1 -1
  77. package/dist/src/mcp/agent-telemetry.d.ts +18 -0
  78. package/dist/src/mcp/agent-telemetry.d.ts.map +1 -0
  79. package/dist/src/mcp/agent-telemetry.js +45 -0
  80. package/dist/src/mcp/agent-telemetry.js.map +1 -0
  81. package/dist/src/mcp/catalog/definitions.d.ts +42 -0
  82. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -0
  83. package/dist/src/mcp/catalog/definitions.js +825 -0
  84. package/dist/src/mcp/catalog/definitions.js.map +1 -0
  85. package/dist/src/mcp/core.d.ts +1 -0
  86. package/dist/src/mcp/core.d.ts.map +1 -1
  87. package/dist/src/mcp/core.js +31 -2
  88. package/dist/src/mcp/core.js.map +1 -1
  89. package/dist/src/mcp/index.d.ts +1 -0
  90. package/dist/src/mcp/index.d.ts.map +1 -1
  91. package/dist/src/mcp/index.js +5 -0
  92. package/dist/src/mcp/index.js.map +1 -1
  93. package/dist/src/middleware/agent-me-alias.d.ts +26 -0
  94. package/dist/src/middleware/agent-me-alias.d.ts.map +1 -0
  95. package/dist/src/middleware/agent-me-alias.js +29 -0
  96. package/dist/src/middleware/agent-me-alias.js.map +1 -0
  97. package/dist/src/models/agent-onboarding-schemas.d.ts +7 -2
  98. package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -1
  99. package/dist/src/models/agent-onboarding-schemas.js +13 -2
  100. package/dist/src/models/agent-onboarding-schemas.js.map +1 -1
  101. package/dist/src/routes/agent-capabilities.d.ts +2 -0
  102. package/dist/src/routes/agent-capabilities.d.ts.map +1 -1
  103. package/dist/src/routes/agent-capabilities.js +6 -6
  104. package/dist/src/routes/agent-capabilities.js.map +1 -1
  105. package/dist/src/routes/agent-directives.d.ts +1 -0
  106. package/dist/src/routes/agent-directives.d.ts.map +1 -1
  107. package/dist/src/routes/agent-directives.js +3 -0
  108. package/dist/src/routes/agent-directives.js.map +1 -1
  109. package/dist/src/routes/agent-integration.js +1 -1
  110. package/dist/src/routes/agent-integration.js.map +1 -1
  111. package/dist/src/routes/agent-onboarding.d.ts +5 -0
  112. package/dist/src/routes/agent-onboarding.d.ts.map +1 -1
  113. package/dist/src/routes/agent-onboarding.js +69 -2
  114. package/dist/src/routes/agent-onboarding.js.map +1 -1
  115. package/dist/src/routes/agent-telemetry.d.ts +3 -0
  116. package/dist/src/routes/agent-telemetry.d.ts.map +1 -1
  117. package/dist/src/routes/agent-telemetry.js +5 -0
  118. package/dist/src/routes/agent-telemetry.js.map +1 -1
  119. package/dist/src/routes/agents.d.ts +14 -0
  120. package/dist/src/routes/agents.d.ts.map +1 -1
  121. package/dist/src/routes/agents.js +69 -0
  122. package/dist/src/routes/agents.js.map +1 -1
  123. package/dist/src/routes/apps.d.ts.map +1 -1
  124. package/dist/src/routes/apps.js +5 -0
  125. package/dist/src/routes/apps.js.map +1 -1
  126. package/dist/src/routes/auth.d.ts +14 -0
  127. package/dist/src/routes/auth.d.ts.map +1 -1
  128. package/dist/src/routes/auth.js +23 -1
  129. package/dist/src/routes/auth.js.map +1 -1
  130. package/dist/src/routes/bootstrap.d.ts +1 -0
  131. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  132. package/dist/src/routes/bootstrap.js +3 -1
  133. package/dist/src/routes/bootstrap.js.map +1 -1
  134. package/dist/src/routes/libs.d.ts +10 -0
  135. package/dist/src/routes/libs.d.ts.map +1 -1
  136. package/dist/src/routes/libs.js +58 -27
  137. package/dist/src/routes/libs.js.map +1 -1
  138. package/dist/src/routes/memory.d.ts +1 -0
  139. package/dist/src/routes/memory.d.ts.map +1 -1
  140. package/dist/src/routes/memory.js +3 -1
  141. package/dist/src/routes/memory.js.map +1 -1
  142. package/dist/src/routes/prompts.d.ts +1 -0
  143. package/dist/src/routes/prompts.d.ts.map +1 -1
  144. package/dist/src/routes/prompts.js +2 -1
  145. package/dist/src/routes/prompts.js.map +1 -1
  146. package/dist/src/server.d.ts.map +1 -1
  147. package/dist/src/server.js +9 -1
  148. package/dist/src/server.js.map +1 -1
  149. package/dist/src/services/activity-recorder.d.ts +18 -1
  150. package/dist/src/services/activity-recorder.d.ts.map +1 -1
  151. package/dist/src/services/activity-recorder.js +42 -0
  152. package/dist/src/services/activity-recorder.js.map +1 -1
  153. package/dist/src/services/agent-post-onboarding.d.ts +31 -0
  154. package/dist/src/services/agent-post-onboarding.d.ts.map +1 -0
  155. package/dist/src/services/agent-post-onboarding.js +101 -0
  156. package/dist/src/services/agent-post-onboarding.js.map +1 -0
  157. package/dist/src/services/onboarding-validator.d.ts +3 -0
  158. package/dist/src/services/onboarding-validator.d.ts.map +1 -1
  159. package/dist/src/services/onboarding-validator.js +75 -0
  160. package/dist/src/services/onboarding-validator.js.map +1 -1
  161. package/dist/src/services/prompt-defaults.d.ts +23 -19
  162. package/dist/src/services/prompt-defaults.d.ts.map +1 -1
  163. package/dist/src/services/prompt-defaults.js +43 -37
  164. package/dist/src/services/prompt-defaults.js.map +1 -1
  165. package/dist/src/services/skill-bundle/generator.d.ts +8 -0
  166. package/dist/src/services/skill-bundle/generator.d.ts.map +1 -1
  167. package/dist/src/services/skill-bundle/generator.js +168 -48
  168. package/dist/src/services/skill-bundle/generator.js.map +1 -1
  169. package/dist/src/services/skill-bundle/generic-adapter.d.ts +5 -0
  170. package/dist/src/services/skill-bundle/generic-adapter.d.ts.map +1 -1
  171. package/dist/src/services/skill-bundle/generic-adapter.js +35 -15
  172. package/dist/src/services/skill-bundle/generic-adapter.js.map +1 -1
  173. package/dist/src/services/skill-bundle/hermes-adapter.d.ts +5 -0
  174. package/dist/src/services/skill-bundle/hermes-adapter.d.ts.map +1 -1
  175. package/dist/src/services/skill-bundle/hermes-adapter.js +26 -10
  176. package/dist/src/services/skill-bundle/hermes-adapter.js.map +1 -1
  177. package/dist/src/storage/interface.d.ts +2 -0
  178. package/dist/src/storage/interface.d.ts.map +1 -1
  179. package/dist/src/storage/providers/mongodb/index.d.ts +4 -0
  180. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  181. package/dist/src/storage/providers/mongodb/index.js +22 -3
  182. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  183. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  184. package/dist/src/storage/providers/sqlite/index.js +4 -2
  185. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  186. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  187. package/dist/src/storage/providers/sqlite/schema.js +1 -0
  188. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  189. package/package.json +3 -2
  190. package/prisma/schema.prisma +1 -0
package/README.md CHANGED
@@ -26,12 +26,12 @@ An AI agent connects to an AIMEAT node and reaches full operational readiness au
26
26
 
27
27
  [![AIMEAT Agent Hello Integration](https://img.youtube.com/vi/ncBX9BaoAWM/maxresdefault.jpg)](https://youtu.be/ncBX9BaoAWM)
28
28
 
29
- `0:45` Device auth with automatic polling (RFC 8628) | `2:10` Skill bundle download + boot sequence | `3:40` 11-step Hello Integration | `4:30` Test task proposed, executed, completed | `5:20` Commands + config registered, agent operational
29
+ `0:45` Device auth with automatic polling (RFC 8628) | `2:10` Skill bundle download + boot sequence | `3:40` Hello Integration | `4:30` Test task proposed, executed, completed | `5:20` Commands + config registered, agent operational
30
30
 
31
31
  <p align="center">
32
- <img src="assets/screenshots/agent_hello_integration_finished.png" alt="Agent Hello Integration completed -- 11/11 steps passed, capabilities reported, commands registered" width="70%" />
32
+ <img src="assets/screenshots/agent_hello_integration_finished.png" alt="Agent Hello Integration completed -- all required steps passed, capabilities reported, commands registered" width="70%" />
33
33
  </p>
34
- <p align="center"><em>After Hello Integration: agent detail view showing connection status, platform, skill bundle version, readiness (all 11 steps passed), identity, and delivery log.</em></p>
34
+ <p align="center"><em>After Hello Integration: agent detail view showing connection status, platform, skill bundle version, readiness (all required steps passed), identity, and delivery log. Since 1.10.0 the system also verifies that the agent has published its slash command catalogue and runtime config before declaring it complete.</em></p>
35
35
 
36
36
  ---
37
37
 
@@ -132,7 +132,22 @@ On top of the protocol sits the application layer. Apps are self-contained HTML
132
132
 
133
133
  <img src="assets/screenshots/profile-agents.png" alt="Agent connection prompt" width="600" />
134
134
 
135
- From your profile, copy the connection prompt and give it to any AI agent. The agent calls one endpoint, you approve, and it's connected with its own identity and scoped permissions. Claude Pro, ChatGPT Plus, and other MCP-capable AIs connect directly as MCP clients. OpenClaw, Hermes, Claude Code, and Cursor all work. Three scope presets (readonly, standard, full) control what each agent can access.
135
+ There are two ways to connect:
136
+
137
+ **1. `aimeat connect` CLI** (recommended, added in 1.10.0). Any runtime that can run a shell command can attach to a node in seconds:
138
+
139
+ ```bash
140
+ npx aimeat connect --url https://your-node --owner your-handle [--agent name]
141
+ # you approve from your profile -> Agents tab
142
+ # the CLI stores the token, downloads the runtime-specific skill bundle,
143
+ # and prints a paste-ready Hello Integration instruction for your agent
144
+ ```
145
+
146
+ For MCP-capable runtimes (Claude Desktop, MCP-aware IDEs), run `aimeat connect serve` afterwards to attach the AIMEAT toolset over stdio. For CLI-only runtimes that cannot do stdio, every MCP tool is also reachable via `aimeat connect call <tool-name> --json '<input>'`.
147
+
148
+ **2. Copy the prompt from your profile.** If you do not want to install a CLI, your profile -> Agents tab still produces a paste-ready prompt with the device-auth flow baked in -- give it to any AI agent, the agent calls one endpoint, you approve, and it is connected with its own identity and scoped permissions.
149
+
150
+ Claude Pro, ChatGPT Plus, and other MCP-capable AIs connect directly as MCP clients. OpenClaw, Hermes, Claude Code, and Cursor all work. Three scope presets (readonly, standard, full) control what each agent can access.
136
151
 
137
152
  ### Build apps with AI
138
153
 
@@ -231,6 +246,19 @@ On the left: Telegram chat with the agent. The user asks it to build things ("bu
231
246
 
232
247
  The app prompts the agent with the current world state so it can make informed decisions about what to build and where. You edit the world manually (drag objects, place shapes from the toolbar) while the agent builds alongside you. Everything syncs through AIMEAT memory.
233
248
 
249
+ ### Example: Comicland, an AI comic community (full app, built from VS Code)
250
+
251
+ Comicland is a community for AI-generated comics built end-to-end from VS Code with Claude Code talking directly to a live AIMEAT node. No CI, no separate deploy step -- each iteration is `aimeat_app_publish` over MCP and the new version is live on the node within seconds. The whole 5-layer AIMEAT stack (extension, cortex, app) was scaffolded by AI, then evolved through dozens of feature passes in the same workflow.
252
+
253
+ <p align="center">
254
+ <img src="assets/screenshots/comic-land-series-view.png" alt="Comicland series detail with episodes, follow, tip, and owner-only publish/unpublish controls" width="48%" />
255
+ <img src="assets/screenshots/comic-land-creation-pipeline.png" alt="Comicland creation pipeline: AI interview -> script JSON -> per-page image prompts -> overlay editor -> publish" width="48%" />
256
+ </p>
257
+
258
+ What's in there: a prompt-driven creation pipeline (AI interview produces a script, the app generates per-page Nano-Banana-style image prompts with character/environment references, the user pastes the resulting images back); a 3-step episode wizard with page or panel images; a drag-and-drop speech-bubble overlay editor with language-keyed translations; multi-tenant reading where any logged-in user can read another author's published series from their own GHII namespace; characters and environments with multiple reference images and a chosen showcase; follow/tip/comment social actions; per-series public/private toggle and per-episode draft/published toggle so authors can prepare quietly and roll out when ready; full FI/EN i18n. All of it stored in AIMEAT memory + storage with proper public/private visibility, no Comicland-specific backend code beyond one sandboxed extension with eleven router-actions.
259
+
260
+ The same loop works for any sufficiently rich app: open a folder, point Claude Code at the node, and iterate. The MCP tools (`aimeat_app_publish`, `aimeat_extension_install`, `aimeat_cortex_install`, `aimeat_memory_*`, `aimeat_storage_*`) cover the entire publish/install/inspect cycle.
261
+
234
262
  ### Calibrate prompts
235
263
 
236
264
  <img src="assets/screenshots/profile-generator.png" alt="Generator and calibrator" width="600" />
@@ -276,9 +304,13 @@ Each node runs independently with its own identity and portal. Operators customi
276
304
  Requires Node.js 24+. Runs without cloning the repo:
277
305
 
278
306
  ```bash
307
+ # Run a node
279
308
  npx aimeat init # interactive setup, generates .env
280
309
  npx aimeat start # start the server
281
310
  npx aimeat seed # seed example packages (in another terminal, server must be running)
311
+
312
+ # Or just connect an agent to someone else's node
313
+ npx aimeat connect --url https://your-node --owner your-handle
282
314
  ```
283
315
 
284
316
  ### From source
@@ -320,21 +352,25 @@ If the AI reads the docs and explains the protocol, everything works. Admin dash
320
352
 
321
353
  The `aimeat/` directory contains a full reference implementation in TypeScript (Express 5.2, Node 24). It implements the entire RFC and adds production features: GHII human identities, TOTP 2FA, V8 extensions, package marketplace, push notifications, WebRTC, and a comprehensive admin UI.
322
354
 
323
- Three storage backends: in-memory (fast dev), SQLite (personal nodes), MongoDB (production).
355
+ Two storage backends: SQLite (personal nodes, local dev; can run `:memory:` for true in-RAM speed) and MongoDB (production). The legacy in-memory backend is deprecated -- SQLite `:memory:` covers the same fast-iteration role using the actual production code path.
324
356
 
325
357
  See the [Implementation Guide v3.0](docs/AIMEAT-IO-Implementation-Guide-v3.0.md) for full details.
326
358
 
327
359
  ### Testing
328
360
 
329
361
  ```bash
330
- pnpm test:e2e # fastest (memory backend)
331
- pnpm test:e2e:sqlite
332
- pnpm test:e2e:mongodb
333
- pnpm test:playwright # browser tests
362
+ pnpm test:e2e:sqlite # fast iteration default
363
+ pnpm test:e2e:mongodb # most realistic; run before a PR
364
+ pnpm test:playwright:sqlite # browser tests, scoped
334
365
  pnpm test # unit tests
335
366
  pnpm typecheck && pnpm lint
367
+
368
+ # Run a single E2E suite (preferred during iteration -- much faster than the full sweep)
369
+ cd aimeat && pnpm exec node --env-file=.env.test.sqlite --import tsx test/run-e2e-ci.ts --test=<suite>
336
370
  ```
337
371
 
372
+ > The legacy `pnpm test:e2e` (in-memory backend) is deprecated and produces stale failures. Use the SQLite or MongoDB commands instead.
373
+
338
374
  ---
339
375
 
340
376
  ## Documentation
@@ -367,7 +403,8 @@ See [CONTRIBUTING.md](CONTRIBUTING.md). Before opening a PR:
367
403
  ```bash
368
404
  pnpm typecheck
369
405
  pnpm lint
370
- pnpm test:e2e
406
+ pnpm test:e2e:sqlite
407
+ pnpm test:e2e:mongodb
371
408
  ```
372
409
 
373
410
  ## License
@@ -12,7 +12,9 @@
12
12
  "noData": "No data available",
13
13
  "id": "ID",
14
14
  "name": "Name",
15
- "add": "Add"
15
+ "add": "Add",
16
+ "yes": "Yes",
17
+ "no": "No"
16
18
  },
17
19
  "nav": {
18
20
  "try": "Try it",
@@ -259,15 +261,24 @@
259
261
  },
260
262
  "agents": {
261
263
  "title": "Your Agents",
262
- "desc": "Agents are AI identities registered under your account, each with their own memory, wallet, and skills. Think of them as your personal AI team — they act on your behalf across the network.",
264
+ "desc": "Agents are AI identities registered under your account, each with their own identity, scopes, tools, tasks, and memory access. Think of them as your personal AI team — they act on your behalf across the network.",
263
265
  "connect": "Connect an Automation Agent",
264
- "connectDesc": "Connect an AI agent to your account using the AIMEAT connector CLI or by pasting a prompt to your AI chat:",
266
+ "connectDesc": "Connect an AI agent to your account using the AIMEAT connector CLI or an agent-capable runtime. The connector is the easiest path because it gives the agent a persistent identity, approved scopes, local skill bundle, and MCP access to AIMEAT tools:",
267
+ "connectOptionsTitle": "Choose how the agent connects to AIMEAT first:",
268
+ "connectOptionConnectorTitle": "Recommended: use the AIMEAT connector.",
269
+ "connectOptionConnectorDesc": "It handles device authentication, stores the agent token locally, downloads the skill bundle, and exposes AIMEAT tools through MCP so the agent can use tasks, messages, memory, telemetry, and Hello Integration across sessions.",
270
+ "connectOptionFallbackTitle": "Fallback: use the API prompt.",
271
+ "connectOptionFallbackDesc": "Use this when the connector or MCP tools are not available. It still lets an HTTPS-capable agent connect, but the agent must make API calls itself instead of receiving local tools.",
265
272
  "cliInstall": "Install the AIMEAT connector and authenticate:",
266
273
  "cliServe": "After connecting, start the MCP server:",
267
- "cliDesc": "The connector handles authentication, downloads your agent’s configuration, and provides all AIMEAT tools as an MCP server.",
274
+ "cliDesc": "Keep this server running while your AI runtime is attached. It turns AIMEAT into local tools so the agent can do useful work without manually composing every API call.",
275
+ "agentInstructionTitle": "Tell the connected agent what to do next:",
276
+ "agentInstructionDesc": "After the MCP server is attached to your agent runtime, paste this instruction to start Hello Integration:",
268
277
  "noNodejs": "Don’t have Node.js?",
269
- "pasteAlt": "Or paste to your AI chat",
270
- "pasteDesc": "For environments without terminal access, copy this prompt and paste it into your AI chat:",
278
+ "pasteAlt": "Fallback: connect an AI agent with APIs",
279
+ "pasteDesc": "If the connector or MCP tools are not available, copy this prompt for an agent that can make HTTPS requests. It explains how to connect to AIMEAT and start Hello Integration through the API:",
280
+ "copyCommand": "Copy command",
281
+ "copyAgentInstruction": "Copy agent instruction",
271
282
  "copyPrompt": "Copy Prompt",
272
283
  "copied": "Copied!",
273
284
  "copyGaii": "Copy GAII",
@@ -637,6 +648,12 @@
637
648
  },
638
649
  "integration": {
639
650
  "checklistTitle": "Hello Integration",
651
+ "postOnboardingSetup": "Post-Onboarding Setup",
652
+ "commandsRegistered": "Commands registered",
653
+ "configPublished": "Config published",
654
+ "sharedTagsInUse": "Shared tags in use",
655
+ "knowledgePackages": "Knowledge packages",
656
+ "notApplicable": "Not applicable",
640
657
  "progress": "Progress",
641
658
  "rerun": "Re-run Hello Integration",
642
659
  "rerunStarted": "Hello Integration re-started",
@@ -699,7 +716,7 @@
699
716
  "memoryAreasTitle": "Agent Memory Areas",
700
717
  "knowledgeTitle": "Knowledge Packages",
701
718
  "effectiveScope": "Effective data scope for this agent",
702
- "tagsHelp": "Tags create shared memory areas. All agents with the same tag can read and write to agents.tag.{name}.* -- they discover each other automatically.",
719
+ "tagsHelp": "Tags mark same-owner shared memory areas. Agents with the same tag should use agents.tag.{name}.* with visibility owner and the matching tag filter.",
703
720
  "addArea": "Add area",
704
721
  "areaKeyPlaceholder": "Key prefix (e.g., agents.mydata.)",
705
722
  "areaDescPlaceholder": "Description",
@@ -2782,7 +2799,7 @@
2782
2799
  "usernamePlaceholder": "Username",
2783
2800
  "passwordPlaceholder": "Password (min 4 chars)",
2784
2801
  "displayNamePlaceholder": "Display Name (optional, for new accounts)",
2785
- "signInBtn": "Sign In",
2802
+ "signInBtn": "Sign In / Register",
2786
2803
  "cancelBtn": "Cancel",
2787
2804
  "working": "Working...",
2788
2805
  "errUserShort": "Username must be at least 3 characters",
@@ -5417,6 +5434,8 @@
5417
5434
  "report_telemetry": "Report Telemetry",
5418
5435
  "accept_test_task": "Accept Test Task",
5419
5436
  "complete_test_task": "Complete Test Task",
5437
+ "publish_commands": "Publish Slash Commands",
5438
+ "publish_config": "Publish Runtime Config",
5420
5439
  "declare_services": "Declare Services"
5421
5440
  },
5422
5441
  "stepDescriptions": {
@@ -5430,6 +5449,8 @@
5430
5449
  "report_telemetry": "At least one telemetry event with non-zero data",
5431
5450
  "accept_test_task": "Agent proposes todos for the test task",
5432
5451
  "complete_test_task": "Agent executes and completes the test task",
5452
+ "publish_commands": "agents.{name}.commands memory has a non-empty array of { name, description, category }",
5453
+ "publish_config": "At least one agents.config.{name}.* memory entry exists describing this runtime",
5433
5454
  "declare_services": "Agent declares offered services (optional)"
5434
5455
  },
5435
5456
  "errors": {
@@ -12,7 +12,9 @@
12
12
  "noData": "Ei tietoja saatavilla",
13
13
  "id": "ID",
14
14
  "name": "Nimi",
15
- "add": "Lisää"
15
+ "add": "Lisää",
16
+ "yes": "Kyllä",
17
+ "no": "Ei"
16
18
  },
17
19
  "nav": {
18
20
  "try": "Kokeile",
@@ -259,15 +261,24 @@
259
261
  },
260
262
  "agents": {
261
263
  "title": "Agenttisi",
262
- "desc": "Agentit ovat tilillesi rekisteröityjä AI-identiteettejä, joilla jokaisella on oma muisti, lompakko ja taidot. Ajattele heitä henkilökohtaisena AI-tiiminsi ne toimivat puolestasi verkossa.",
264
+ "desc": "Agentit ovat tilillesi rekisteröityjä AI-identiteettejä, joilla on oma identiteetti, rajaukset, työkalut, tehtävät ja muistipääsy. Ajattele heitä henkilökohtaisena AI-tiiminäsi - ne toimivat puolestasi verkossa.",
263
265
  "connect": "Yhdistä automaatioagentti",
264
- "connectDesc": "Yhdista tekoalyagentti tilillesi AIMEAT-liittimen avulla tai liittamalla kehote tekoalykeskusteluun:",
266
+ "connectDesc": "Yhdistä tekoälyagentti tilillesi AIMEAT-liittimellä tai agenttia ajavassa ympäristössä. Liitin on helpoin polku, koska se antaa agentille pysyvän identiteetin, hyväksytyt rajaukset, paikallisen taitopaketin ja MCP-pääsyn AIMEAT-työkaluihin:",
267
+ "connectOptionsTitle": "Valitse ensin, miten agentti yhdistetään AIMEATiin:",
268
+ "connectOptionConnectorTitle": "Suositus: käytä AIMEAT-liitintä.",
269
+ "connectOptionConnectorDesc": "Se hoitaa laitetunnistautumisen, tallentaa agentin tunnuksen paikallisesti, lataa taitopaketin ja tarjoaa AIMEAT-työkalut MCP:n kautta, jotta agentti voi käyttää tehtäviä, viestejä, muistia, telemetriaa ja Hello Integrationia istuntojen välillä.",
270
+ "connectOptionFallbackTitle": "Varapolku: käytä API-kehotetta.",
271
+ "connectOptionFallbackDesc": "Käytä tätä, kun liitin tai MCP-työkalut eivät ole käytettävissä. HTTPS-pyyntöjä tekevä agentti voi silti yhdistää, mutta sen täytyy tehdä API-kutsut itse paikallisten työkalujen sijaan.",
265
272
  "cliInstall": "Asenna AIMEAT-liitin ja tunnistaudu:",
266
- "cliServe": "Yhdistamisen jalkeen kaynnista MCP-palvelin:",
267
- "cliDesc": "Liitin hoitaa tunnistautumisen, lataa agentin asetukset ja tarjoaa kaikki AIMEAT-tyokalut MCP-palvelimena.",
268
- "noNodejs": "Eiko Node.js:aa ole asennettuna?",
269
- "pasteAlt": "Tai liita tekoalykeskusteluun",
270
- "pasteDesc": "Jos terminaalia ei ole saatavilla, kopioi tama kehote ja liita se tekoalykeskusteluun:",
273
+ "cliServe": "Yhdistämisen jälkeen käynnistä MCP-palvelin:",
274
+ "cliDesc": "Pidä tämä palvelin käynnissä, kun AI-ympäristö on liitetty. Se muuttaa AIMEATin paikallisiksi työkaluiksi, jotta agentti voi tehdä hyödyllistä työtä ilman jokaisen API-kutsun käsin rakentamista.",
275
+ "agentInstructionTitle": "Kerro yhdistetylle agentille mitä tehdä seuraavaksi:",
276
+ "agentInstructionDesc": "Kun MCP-palvelin on liitetty agenttiympäristöön, liitä tämä ohje Hello Integration -prosessin aloittamiseen:",
277
+ "noNodejs": "Eikö Node.js:aa ole asennettuna?",
278
+ "pasteAlt": "Varapolku: yhdistä AI-agentti API-kutsuilla",
279
+ "pasteDesc": "Jos liitin tai MCP-työkalut eivät ole käytettävissä, kopioi tämä kehote agentille, joka voi tehdä HTTPS-pyyntöjä. Se kertoo, miten AIMEATiin yhdistetään ja Hello Integration aloitetaan API:n kautta:",
280
+ "copyCommand": "Kopioi komento",
281
+ "copyAgentInstruction": "Kopioi agentin ohje",
271
282
  "copyPrompt": "Kopioi kehote",
272
283
  "copied": "Kopioitu!",
273
284
  "copyGaii": "Kopioi GAII",
@@ -499,7 +510,7 @@
499
510
  "services": {
500
511
  "title": "Julkaistut palvelut",
501
512
  "empty": "Ei julkaistuja palveluita",
502
- "info": "Muut agentit voivat kutsua naita palveluita tyonvaihdon kautta",
513
+ "info": "Muut agentit voivat kutsua näitä palveluita työnvaihdon kautta",
503
514
  "calls": "kutsut",
504
515
  "unpublish": "Poista julkaisu",
505
516
  "unpublished": "Palvelun julkaisu poistettu",
@@ -517,19 +528,19 @@
517
528
  },
518
529
  "messages": {
519
530
  "title": "Viestit",
520
- "empty": "Ei viesteja viela. Laheta viesti aloittaaksesi keskustelun.",
521
- "send": "Laheta",
531
+ "empty": "Ei viestejä vielä. Lähetä viesti aloittaaksesi keskustelun.",
532
+ "send": "Lähetä",
522
533
  "placeholder": "Kirjoita viesti...",
523
534
  "online": "online",
524
535
  "offline": "offline",
525
536
  "threads": "Keskustelut",
526
- "proposedTask": "Ehdotettu tehtava",
527
- "createTask": "Luo tama tehtava",
537
+ "proposedTask": "Ehdotettu tehtävä",
538
+ "createTask": "Luo tämä tehtävä",
528
539
  "adjustTask": "Muokkaan ensin",
529
540
  "tokensUsed": "tokenia",
530
- "proposedTaskDefault": "Agentin ehdottama tehtava",
531
- "createTaskError": "Tehtavan luonti epaonnistui",
532
- "sendError": "Viestin lahetys epaonnistui",
541
+ "proposedTaskDefault": "Agentin ehdottama tehtävä",
542
+ "createTaskError": "Tehtävän luonti epäonnistui",
543
+ "sendError": "Viestin lähetys epäonnistui",
533
544
  "inboxLabel": "saapuneet",
534
545
  "deliveredLabel": "toimitettu",
535
546
  "errorsLabel": "virheet"
@@ -637,6 +648,12 @@
637
648
  },
638
649
  "integration": {
639
650
  "checklistTitle": "Hello-integraatio",
651
+ "postOnboardingSetup": "Perehdytyksen jälkeiset toimet",
652
+ "commandsRegistered": "Komennot rekisteröity",
653
+ "configPublished": "Konfiguraatio julkaistu",
654
+ "sharedTagsInUse": "Jaetut tagit käytössä",
655
+ "knowledgePackages": "Tietopaketit",
656
+ "notApplicable": "Ei sovellu",
640
657
  "progress": "Edistyminen",
641
658
  "rerun": "Suorita Hello-integraatio uudelleen",
642
659
  "rerunStarted": "Hello-integraatio aloitettu uudelleen",
@@ -699,7 +716,7 @@
699
716
  "memoryAreasTitle": "Agentin muistialueet",
700
717
  "knowledgeTitle": "Tietopaketit",
701
718
  "effectiveScope": "Agentin tehokas datan laajuus",
702
- "tagsHelp": "Tagit luovat jaettuja muistialueita. Kaikki agentit samalla tagilla voivat lukea ja kirjoittaa agents.tag.{name}.* -- ne löytävät toisensa automaattisesti.",
719
+ "tagsHelp": "Tunnisteet merkitsevät saman omistajan jaettuja muistialueita. Samalla tunnisteella olevien agenttien kannattaa käyttää agents.tag.{name}.*-avaimia, näkyvyyttä owner ja samaa tunnistesuodatinta.",
703
720
  "addArea": "Lisää alue",
704
721
  "areaKeyPlaceholder": "Avainprefiksi (esim. agents.tietoni.)",
705
722
  "areaDescPlaceholder": "Kuvaus",
@@ -2782,7 +2799,7 @@
2782
2799
  "usernamePlaceholder": "Käyttäjänimi",
2783
2800
  "passwordPlaceholder": "Salasana (vähintään 4 merkkiä)",
2784
2801
  "displayNamePlaceholder": "Näyttönimi (valinnainen, uusille tileille)",
2785
- "signInBtn": "Kirjaudu",
2802
+ "signInBtn": "Kirjaudu / Rekisteröidy",
2786
2803
  "cancelBtn": "Peruuta",
2787
2804
  "working": "Käsitellään...",
2788
2805
  "errUserShort": "Käyttäjänimen tulee olla vähintään 3 merkkiä",
@@ -5417,6 +5434,8 @@
5417
5434
  "report_telemetry": "Raportoi telemetria",
5418
5435
  "accept_test_task": "Hyväksy testitehtävä",
5419
5436
  "complete_test_task": "Suorita testitehtävä",
5437
+ "publish_commands": "Julkaise slash-komennot",
5438
+ "publish_config": "Julkaise runtime-konfiguraatio",
5420
5439
  "declare_services": "Ilmoita palvelut"
5421
5440
  },
5422
5441
  "stepDescriptions": {
@@ -5430,6 +5449,8 @@
5430
5449
  "report_telemetry": "Vähintään yksi telemetriatapahtuma nollasta poikkeavalla datalla",
5431
5450
  "accept_test_task": "Agentti ehdottaa todoja testitehtävälle",
5432
5451
  "complete_test_task": "Agentti suorittaa ja viimeistelee testitehtävän",
5452
+ "publish_commands": "agents.{name}.commands -muistissa on epätyhjä { name, description, category } -taulu",
5453
+ "publish_config": "Vähintään yksi agents.config.{name}.* -muistitietue kuvaa tätä runtimea",
5433
5454
  "declare_services": "Agentti ilmoittaa tarjoamansa palvelut (valinnainen)"
5434
5455
  },
5435
5456
  "errors": {
@@ -886,13 +886,14 @@ Some steps auto-validate when you GET /v1/agents/me/onboarding. The test task au
886
886
 
887
887
  ### Memory — Write
888
888
 
889
+ For agent command catalogues, publish only the owner-facing slash commands the agent can actually understand and answer from AIMEAT Messages. This is not the MCP tool list and not a copied sample. The command list may be long if the runtime exposes many stable commands.
890
+
889
891
  ```
890
892
  POST /v1/memory
891
893
  {
892
894
  "key": "agents.my-agent.commands",
893
895
  "value": [
894
- { "name": "/status", "description": "Show agent status", "category": "general" },
895
- { "name": "/inbox", "description": "Check inbox", "category": "tasks" }
896
+ { "name": "/<actual-command>", "description": "<what this command makes the agent do>", "category": "<category>" }
896
897
  ],
897
898
  "visibility": "owner"
898
899
  }
@@ -900,6 +901,12 @@ POST /v1/memory
900
901
  The value for commands MUST be a flat array of `{ name, description, category }`. Each name starts with `/`.
901
902
  Visibility: `private` (only you), `owner` (you + owner), `public` (everyone)
902
903
 
904
+ For agent config visible in the Agent Config tab, write actual config files, hook files, route files, or connector descriptors under `agents.config.*`. If the agent only uses `aimeat connect serve`, describe that connector accurately; do not invent a watchdog file.
905
+
906
+ If the owner assigns shared tags in the Data Access tab, use `agents.tag.<tag>.*` keys for same-owner handoff notes, project state, queues, and team context. Write shared entries with `visibility: "owner"` and `tags: ["<tag>"]`; list them with `owner_scope=true`, `prefix=agents.tag.<tag>.`, and the same tag filter. Do not put private agent-local secrets in shared tag memory.
907
+
908
+ For structured research or reusable knowledge, use the Knowledge Package import flow below instead of a placeholder `research.*` memory key.
909
+
903
910
  ### Inbox — Poll
904
911
 
905
912
  ```
@@ -1114,6 +1121,7 @@ GET {{BASE_URL}}/v1/memory/:gaii/:key — Read another agent's public/shared mem
1114
1121
  - Keys use dot notation (e.g., "service.settings", "user.preferences")
1115
1122
  - Visibility: "private" (default, only you), "owner" (your owner can see), "public" (anyone can read)
1116
1123
  - Tags are optional string arrays for categorization
1124
+ - Same-owner shared tag areas use `agents.tag.<tag>.*` keys with visibility "owner" and tags ["<tag>"]. List them with `GET /v1/memory?owner_scope=true&prefix=agents.tag.<tag>.&tags=<tag>` or the equivalent memory-list tool parameters.
1117
1125
  - ttl_hours: auto-delete after N hours (optional)
1118
1126
  - Version increments on each update
1119
1127
 
@@ -1461,6 +1469,9 @@ GET {{BASE_URL}}/v1/catalogue/knowledge/:id — Knowledge package detail
1461
1469
  Knowledge packages are the primary way to share structured information on AIMEAT.
1462
1470
  A package has a **manifest** (metadata: name, tags, content type, synthesis level,
1463
1471
  entry list) and **entries** (the actual content, each with its own visibility).
1472
+ When an agent produces research, documentation, datasets, or reusable knowledge,
1473
+ import it as a knowledge package instead of storing it as an arbitrary `research.*`
1474
+ memory placeholder.
1464
1475
 
1465
1476
  #### Key design: manifest-first discovery
1466
1477
 
@@ -95,14 +95,17 @@ export default function AgentCard({ agent, onboarding, expanded, onToggle, sessi
95
95
  </div>
96
96
 
97
97
  <!-- Capabilities -->
98
- ${(agent.technical_capabilities?.length > 0 || agent.domain_capabilities?.length > 0) && html`
98
+ ${(agent.technical_capabilities?.length > 0 || agent.domain_capabilities?.length > 0 || agent.languages?.length > 0) && html`
99
99
  <div class="pf-agd-capabilities">
100
100
  ${(agent.technical_capabilities || []).map(c => html`
101
101
  <span key=${c.name || c} class="pf-agd-cap-badge pf-agd-cap-badge--tech">${c.name || c}</span>
102
102
  `)}
103
- ${(agent.domain_capabilities || []).map(c => html`
103
+ ${(agent.domain_capabilities || []).filter(c => !String(c).startsWith('Language: ')).map(c => html`
104
104
  <span key=${c} class="pf-agd-cap-badge pf-agd-cap-badge--domain">${c}</span>
105
105
  `)}
106
+ ${(agent.languages || []).map(l => html`
107
+ <span key=${'lang-' + l} class="pf-agd-cap-badge pf-agd-cap-badge--domain">${'Language: ' + l}</span>
108
+ `)}
106
109
  </div>
107
110
  `}
108
111
 
@@ -3,6 +3,7 @@
3
3
  * @description Enhanced Activity tab with governance filter and category badges.
4
4
  * Wraps the existing activity subtab with additional filter pills.
5
5
  * @version-history
6
+ * v1.5.0 -- 2026-05-28 -- Fix governance card: telemetry response field is `events` (not `entries`), and per-event tokens live in e.data.tokens_used / e.data.tokens_in+out
6
7
  * v1.4.0 -- 2026-05-24 -- Audit fix: two-line event layout with secondary detail row
7
8
  * v1.3.0 -- 2026-05-24 -- Wire up MCP status in delivery health from agent data
8
9
  * v1.2.0 -- 2026-05-24 -- Fix: F17 task breakdown, F18 violation red badge, M5 governance i18n namespace
@@ -30,8 +31,14 @@ const FILTERS = [
30
31
  ];
31
32
 
32
33
  function eventCategory(event) {
34
+ // Task-lifecycle events come back from /activity/log with a non-empty
35
+ // taskId set by the route. Use that as the primary signal -- the event
36
+ // type itself is whatever the agent set ("progress") or the lifecycle
37
+ // emitted ("completed", "failed"), none of which include "task" as a
38
+ // substring. Fall back to type-substring checks for everything else.
39
+ if (event.taskId) return 'tasks';
33
40
  const type = (event.type || event.event || '').toLowerCase();
34
- if (type.includes('task') || type.includes('todo')) return 'tasks';
41
+ if (type.includes('todo')) return 'tasks';
35
42
  if (type.includes('message') || type.includes('msg')) return 'messages';
36
43
  if (type.includes('approve') || type.includes('scope') || type.includes('permission') || type.includes('governance') || type.includes('policy') || type.includes('readiness') || type.includes('override')) return 'governance';
37
44
  return 'system';
@@ -71,11 +78,18 @@ export default function TabActivity({ agent, agentName, session, showToast }) {
71
78
  const tasksFailed = taskEvents.filter(e => { const tp = (e.type || '').toLowerCase(); return tp.includes('failed') || tp.includes('error'); }).length;
72
79
  const budget = dirResp?.data?.budget_limits;
73
80
  const wh = whResp?.data?.webhook;
74
- const telemetryEntries = telResp?.data?.entries || [];
81
+ // GET /v1/agents/:name/telemetry returns { events, count, per_page }, and per-event
82
+ // numbers live inside event.data ({ tokens_used } OR { tokens_in + tokens_out }).
83
+ const telemetryEntries = telResp?.data?.events || telResp?.data?.entries || [];
84
+ const eventTokens = (e) => {
85
+ const d = e?.data || {};
86
+ const used = Number(d.tokens_used) || 0;
87
+ return used > 0 ? used : (Number(d.tokens_in) || 0) + (Number(d.tokens_out) || 0);
88
+ };
75
89
 
76
90
  setGovernance({
77
91
  budget,
78
- tokensUsedToday: telemetryEntries.reduce((sum, e) => sum + (e.tokens_used || 0), 0),
92
+ tokensUsedToday: telemetryEntries.reduce((sum, e) => sum + eventTokens(e), 0),
79
93
  tasksToday: taskEvents.length,
80
94
  tasksCompleted,
81
95
  tasksActive,
@@ -4,6 +4,9 @@
4
4
  * during onboarding or production status (connection, platform, readiness,
5
5
  * identity, delivery log) after completion.
6
6
  * @version-history
7
+ * v1.4.0 -- 2026-05-28 -- Treat webhook with empty url as polling: status dot, label, and
8
+ * the webhook section all key off (webhook && webhook.url), not just
9
+ * the webhook object existing. A record with url="" is still polling.
7
10
  * v1.0.0 -- 2026-05-24 -- Initial creation for Agent Detail Tab-View
8
11
  * v1.1.0 -- 2026-05-24 -- Fix 9 UI audit findings: pending icon, readiness score, webhook edit,
9
12
  * strengths/gaps, last validated, roles badge, platform version, bundle update, copy install cmd
@@ -31,6 +34,7 @@ export default function TabIntegration({ agent, onboarding, session, showToast,
31
34
  const [webhook, setWebhook] = useState(null);
32
35
  const [bundleVersion, setBundleVersion] = useState(null);
33
36
  const [deliveries, setDeliveries] = useState([]);
37
+ const [postChecklist, setPostChecklist] = useState(null);
34
38
  const [loading, setLoading] = useState(true);
35
39
  const [testing, setTesting] = useState(false);
36
40
  const [rerunning, setRerunning] = useState(false);
@@ -47,14 +51,16 @@ export default function TabIntegration({ agent, onboarding, session, showToast,
47
51
  async function loadData() {
48
52
  setLoading(true);
49
53
  try {
50
- const [whResp, sbResp, dlResp] = await Promise.all([
54
+ const [whResp, sbResp, dlResp, obResp] = await Promise.all([
51
55
  getWebhookConfig(agentName).catch(() => null),
52
56
  getSkillBundleVersion(agentName).catch(() => null),
53
57
  getDeliveryLog(agentName, 10).catch(() => null),
58
+ getOnboarding(agentName).catch(() => null),
54
59
  ]);
55
60
  setWebhook(whResp?.data || null);
56
61
  setBundleVersion(sbResp?.data || null);
57
62
  setDeliveries(dlResp?.data?.deliveries || []);
63
+ setPostChecklist(obResp?.data?.post_onboarding_checklist || null);
58
64
  } catch { /* silent */ }
59
65
  setLoading(false);
60
66
  }
@@ -212,7 +218,7 @@ curl -H "Authorization: Bearer <jwt>" -o skill-bundle.zip "${url}" && unzip skil
212
218
 
213
219
  const displayDeliveries = showAllDeliveries && allDeliveries ? allDeliveries : deliveries;
214
220
 
215
- return renderProductionView(agent, onboarding, webhook, bundleVersion, displayDeliveries, handleTestWebhook, testing, handleRerun, rerunning, handleCopyInstall, copiedCmd, handleShowAll, showAllDeliveries, editingWebhook, webhookDraft, setWebhookDraft, handleEditWebhook, handleSaveWebhook, handleCancelWebhook, savingWebhook, handleUpdateBundle, updatingBundle, handleCopyInstallCommand, copiedInstall, handleCopyAgentPrompt, copiedPrompt);
221
+ return renderProductionView(agent, onboarding, webhook, bundleVersion, displayDeliveries, handleTestWebhook, testing, handleRerun, rerunning, handleCopyInstall, copiedCmd, handleShowAll, showAllDeliveries, editingWebhook, webhookDraft, setWebhookDraft, handleEditWebhook, handleSaveWebhook, handleCancelWebhook, savingWebhook, handleUpdateBundle, updatingBundle, handleCopyInstallCommand, copiedInstall, handleCopyAgentPrompt, copiedPrompt, postChecklist);
216
222
  }
217
223
 
218
224
  function renderOnboardingView(onboarding, agentName, handleRerun, rerunning, handleCopyInstall, copiedCmd, handleCopyInstallCommand, copiedInstall, handleCopyAgentPrompt, copiedPrompt) {
@@ -279,7 +285,7 @@ function renderOnboardingView(onboarding, agentName, handleRerun, rerunning, han
279
285
  `;
280
286
  }
281
287
 
282
- function renderProductionView(agent, onboarding, webhook, bundleVersion, displayDeliveries, handleTestWebhook, testing, handleRerun, rerunning, handleCopyInstall, copiedCmd, handleShowAll, showAllDeliveries, editingWebhook, webhookDraft, setWebhookDraft, handleEditWebhook, handleSaveWebhook, handleCancelWebhook, savingWebhook, handleUpdateBundle, updatingBundle, handleCopyInstallCommand, copiedInstall, handleCopyAgentPrompt, copiedPrompt) {
288
+ function renderProductionView(agent, onboarding, webhook, bundleVersion, displayDeliveries, handleTestWebhook, testing, handleRerun, rerunning, handleCopyInstall, copiedCmd, handleShowAll, showAllDeliveries, editingWebhook, webhookDraft, setWebhookDraft, handleEditWebhook, handleSaveWebhook, handleCancelWebhook, savingWebhook, handleUpdateBundle, updatingBundle, handleCopyInstallCommand, copiedInstall, handleCopyAgentPrompt, copiedPrompt, postChecklist) {
283
289
  const steps = onboarding?.steps || [];
284
290
  const agentName = agent.name;
285
291
 
@@ -307,8 +313,8 @@ function renderProductionView(agent, onboarding, webhook, bundleVersion, display
307
313
  <div class="pf-agd-info-row">
308
314
  <span class="pf-agd-info-label">${t('profile.agents.detail.integration.deliveryMethod')}</span>
309
315
  <span class="pf-agd-info-value">
310
- <span class="pf-agd-status-dot ${webhook && (webhook.failCount ?? 0) < 5 ? 'pf-agd-status-dot--active' : webhook && (webhook.failCount ?? 0) >= 5 ? 'pf-agd-status-dot--error' : 'pf-agd-status-dot--inactive'}"></span>
311
- ${webhook ? t('profile.agents.detail.deliveryWebhook') : t('profile.agents.detail.deliveryPolling')}
316
+ <span class="pf-agd-status-dot ${(webhook && webhook.url && (webhook.failCount ?? 0) < 5) ? 'pf-agd-status-dot--active' : (webhook && webhook.url && (webhook.failCount ?? 0) >= 5) ? 'pf-agd-status-dot--error' : 'pf-agd-status-dot--inactive'}"></span>
317
+ ${(webhook && webhook.url) ? t('profile.agents.detail.deliveryWebhook') : t('profile.agents.detail.deliveryPolling')}
312
318
  </span>
313
319
  </div>
314
320
  ${webhook ? html`
@@ -434,6 +440,43 @@ function renderProductionView(agent, onboarding, webhook, bundleVersion, display
434
440
  </div>
435
441
  </div>
436
442
 
443
+ <!-- POST-ONBOARDING SETUP -->
444
+ ${postChecklist && html`
445
+ <div class="pf-agd-section">
446
+ <div class="pf-agd-section-label">${t('profile.agents.detail.integration.postOnboardingSetup')}</div>
447
+ <div class="pf-agd-info-row">
448
+ <span class="pf-agd-info-label">${t('profile.agents.detail.integration.commandsRegistered')}</span>
449
+ <span class="pf-agd-info-value">
450
+ <span class="pf-agd-status-dot ${postChecklist.commands_registered ? 'pf-agd-status-dot--active' : 'pf-agd-status-dot--inactive'}"></span>
451
+ ${postChecklist.commands_registered ? t('common.yes') : t('common.no')}
452
+ </span>
453
+ </div>
454
+ <div class="pf-agd-info-row">
455
+ <span class="pf-agd-info-label">${t('profile.agents.detail.integration.configPublished')}</span>
456
+ <span class="pf-agd-info-value">
457
+ <span class="pf-agd-status-dot ${postChecklist.config_published ? 'pf-agd-status-dot--active' : 'pf-agd-status-dot--inactive'}"></span>
458
+ ${postChecklist.config_published ? t('common.yes') : t('common.no')}
459
+ </span>
460
+ </div>
461
+ <div class="pf-agd-info-row">
462
+ <span class="pf-agd-info-label">${t('profile.agents.detail.integration.sharedTagsInUse')}</span>
463
+ <span class="pf-agd-info-value">
464
+ ${postChecklist.shared_tags_in_use === null
465
+ ? html`<span class="pf-agd-status-dot pf-agd-status-dot--inactive"></span> ${t('profile.agents.detail.integration.notApplicable')}`
466
+ : html`<span class="pf-agd-status-dot ${postChecklist.shared_tags_in_use ? 'pf-agd-status-dot--active' : 'pf-agd-status-dot--inactive'}"></span> ${postChecklist.shared_tags_in_use ? t('common.yes') : t('common.no')}`
467
+ }
468
+ </span>
469
+ </div>
470
+ <div class="pf-agd-info-row">
471
+ <span class="pf-agd-info-label">${t('profile.agents.detail.integration.knowledgePackages')}</span>
472
+ <span class="pf-agd-info-value">
473
+ <span class="pf-agd-status-dot ${postChecklist.knowledge_packages_published ? 'pf-agd-status-dot--active' : 'pf-agd-status-dot--inactive'}"></span>
474
+ ${postChecklist.knowledge_packages_published ? t('common.yes') : t('common.no')}
475
+ </span>
476
+ </div>
477
+ </div>
478
+ `}
479
+
437
480
  <!-- IDENTITY -->
438
481
  <div class="pf-agd-section">
439
482
  <div class="pf-agd-section-label">${t('profile.agents.detail.identity')}</div>