aimeat 1.23.3 → 1.24.1

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 (163) hide show
  1. package/dist/locales/en.json +53 -1
  2. package/dist/locales/fi.json +53 -1
  3. package/dist/public/css/views/profile.css +21 -0
  4. package/dist/public/css/views/workflows.css +116 -0
  5. package/dist/public/js/services/organisms.js +18 -0
  6. package/dist/public/js/services/workflows.js +62 -0
  7. package/dist/public/llms-template.txt +7 -0
  8. package/dist/public/spa.html +3 -1
  9. package/dist/public/views/profile/landing-page.js +1 -0
  10. package/dist/public/views/profile/organisms-tab.js +51 -0
  11. package/dist/public/views/profile/workflows-form.js +220 -0
  12. package/dist/public/views/profile/workflows-tab.js +300 -0
  13. package/dist/public/views/profile.js +2 -0
  14. package/dist/src/cli/connect/mcp/tools/index.d.ts.map +1 -1
  15. package/dist/src/cli/connect/mcp/tools/index.js +2 -0
  16. package/dist/src/cli/connect/mcp/tools/index.js.map +1 -1
  17. package/dist/src/cli/connect/mcp/tools/workflows.d.ts +12 -0
  18. package/dist/src/cli/connect/mcp/tools/workflows.d.ts.map +1 -0
  19. package/dist/src/cli/connect/mcp/tools/workflows.js +37 -0
  20. package/dist/src/cli/connect/mcp/tools/workflows.js.map +1 -0
  21. package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
  22. package/dist/src/cli/connect/tool-call.js +37 -0
  23. package/dist/src/cli/connect/tool-call.js.map +1 -1
  24. package/dist/src/generated/api-types.d.ts +866 -12
  25. package/dist/src/generated/api-types.d.ts.map +1 -1
  26. package/dist/src/mcp/annotations.d.ts.map +1 -1
  27. package/dist/src/mcp/annotations.js +5 -0
  28. package/dist/src/mcp/annotations.js.map +1 -1
  29. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  30. package/dist/src/mcp/catalog/definitions.js +44 -0
  31. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  32. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  33. package/dist/src/mcp/catalog/scopes.js +5 -1
  34. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  35. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  36. package/dist/src/mcp/catalog/surfaces.js +4 -3
  37. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  38. package/dist/src/mcp/index.d.ts.map +1 -1
  39. package/dist/src/mcp/index.js +2 -0
  40. package/dist/src/mcp/index.js.map +1 -1
  41. package/dist/src/mcp/workflows.d.ts +18 -0
  42. package/dist/src/mcp/workflows.d.ts.map +1 -0
  43. package/dist/src/mcp/workflows.js +68 -0
  44. package/dist/src/mcp/workflows.js.map +1 -0
  45. package/dist/src/mcp/workspaces.d.ts +3 -0
  46. package/dist/src/mcp/workspaces.d.ts.map +1 -1
  47. package/dist/src/mcp/workspaces.js +17 -0
  48. package/dist/src/mcp/workspaces.js.map +1 -1
  49. package/dist/src/models/agent-onboarding-schemas.d.ts +1 -1
  50. package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -1
  51. package/dist/src/models/agent-onboarding-schemas.js +12 -0
  52. package/dist/src/models/agent-onboarding-schemas.js.map +1 -1
  53. package/dist/src/models/offer-schemas.d.ts +7 -0
  54. package/dist/src/models/offer-schemas.d.ts.map +1 -1
  55. package/dist/src/models/offer-schemas.js +14 -0
  56. package/dist/src/models/offer-schemas.js.map +1 -1
  57. package/dist/src/models/workflow-schemas.d.ts +220 -0
  58. package/dist/src/models/workflow-schemas.d.ts.map +1 -0
  59. package/dist/src/models/workflow-schemas.js +102 -0
  60. package/dist/src/models/workflow-schemas.js.map +1 -0
  61. package/dist/src/routes/agent-skill-bundle.d.ts +1 -0
  62. package/dist/src/routes/agent-skill-bundle.d.ts.map +1 -1
  63. package/dist/src/routes/agent-skill-bundle.js +3 -2
  64. package/dist/src/routes/agent-skill-bundle.js.map +1 -1
  65. package/dist/src/routes/agent-tasks.d.ts.map +1 -1
  66. package/dist/src/routes/agent-tasks.js +16 -0
  67. package/dist/src/routes/agent-tasks.js.map +1 -1
  68. package/dist/src/routes/memory.d.ts.map +1 -1
  69. package/dist/src/routes/memory.js +9 -21
  70. package/dist/src/routes/memory.js.map +1 -1
  71. package/dist/src/routes/organisms.d.ts +4 -0
  72. package/dist/src/routes/organisms.d.ts.map +1 -1
  73. package/dist/src/routes/organisms.js +76 -0
  74. package/dist/src/routes/organisms.js.map +1 -1
  75. package/dist/src/routes/prompts.d.ts +4 -0
  76. package/dist/src/routes/prompts.d.ts.map +1 -1
  77. package/dist/src/routes/prompts.js +50 -0
  78. package/dist/src/routes/prompts.js.map +1 -1
  79. package/dist/src/routes/stats.d.ts.map +1 -1
  80. package/dist/src/routes/stats.js +13 -0
  81. package/dist/src/routes/stats.js.map +1 -1
  82. package/dist/src/routes/workflows.d.ts +30 -0
  83. package/dist/src/routes/workflows.d.ts.map +1 -0
  84. package/dist/src/routes/workflows.js +190 -0
  85. package/dist/src/routes/workflows.js.map +1 -0
  86. package/dist/src/server-bootstrap/routes-loader.d.ts +2 -0
  87. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  88. package/dist/src/server-bootstrap/routes-loader.js +7 -1
  89. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  90. package/dist/src/server-bootstrap/service-init.d.ts +2 -0
  91. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  92. package/dist/src/server-bootstrap/service-init.js +6 -0
  93. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  94. package/dist/src/server.d.ts.map +1 -1
  95. package/dist/src/server.js +1 -0
  96. package/dist/src/server.js.map +1 -1
  97. package/dist/src/services/apps-backup-export.d.ts.map +1 -1
  98. package/dist/src/services/apps-backup-export.js +3 -2
  99. package/dist/src/services/apps-backup-export.js.map +1 -1
  100. package/dist/src/services/draft-offer-prompt.d.ts +19 -0
  101. package/dist/src/services/draft-offer-prompt.d.ts.map +1 -0
  102. package/dist/src/services/draft-offer-prompt.js +80 -0
  103. package/dist/src/services/draft-offer-prompt.js.map +1 -0
  104. package/dist/src/services/handbooks/agent.d.ts +6 -1
  105. package/dist/src/services/handbooks/agent.d.ts.map +1 -1
  106. package/dist/src/services/handbooks/agent.js +29 -0
  107. package/dist/src/services/handbooks/agent.js.map +1 -1
  108. package/dist/src/services/offerings-handbook.d.ts +17 -0
  109. package/dist/src/services/offerings-handbook.d.ts.map +1 -0
  110. package/dist/src/services/offerings-handbook.js +75 -0
  111. package/dist/src/services/offerings-handbook.js.map +1 -0
  112. package/dist/src/services/onboarding-validator.d.ts.map +1 -1
  113. package/dist/src/services/onboarding-validator.js +73 -0
  114. package/dist/src/services/onboarding-validator.js.map +1 -1
  115. package/dist/src/services/organism-export.d.ts.map +1 -1
  116. package/dist/src/services/organism-export.js +3 -2
  117. package/dist/src/services/organism-export.js.map +1 -1
  118. package/dist/src/services/owner-memory.d.ts +32 -0
  119. package/dist/src/services/owner-memory.d.ts.map +1 -0
  120. package/dist/src/services/owner-memory.js +37 -0
  121. package/dist/src/services/owner-memory.js.map +1 -0
  122. package/dist/src/services/package-zip.d.ts +1 -0
  123. package/dist/src/services/package-zip.d.ts.map +1 -1
  124. package/dist/src/services/package-zip.js +3 -2
  125. package/dist/src/services/package-zip.js.map +1 -1
  126. package/dist/src/services/scheduler.d.ts +6 -0
  127. package/dist/src/services/scheduler.d.ts.map +1 -1
  128. package/dist/src/services/scheduler.js +22 -0
  129. package/dist/src/services/scheduler.js.map +1 -1
  130. package/dist/src/services/schema-validator.d.ts +9 -0
  131. package/dist/src/services/schema-validator.d.ts.map +1 -1
  132. package/dist/src/services/schema-validator.js +16 -0
  133. package/dist/src/services/schema-validator.js.map +1 -1
  134. package/dist/src/services/structure-overview.d.ts +87 -0
  135. package/dist/src/services/structure-overview.d.ts.map +1 -0
  136. package/dist/src/services/structure-overview.js +234 -0
  137. package/dist/src/services/structure-overview.js.map +1 -0
  138. package/dist/src/services/workflow/engine.d.ts +91 -0
  139. package/dist/src/services/workflow/engine.d.ts.map +1 -0
  140. package/dist/src/services/workflow/engine.js +574 -0
  141. package/dist/src/services/workflow/engine.js.map +1 -0
  142. package/dist/src/services/workflow/eval-context.d.ts +27 -0
  143. package/dist/src/services/workflow/eval-context.d.ts.map +1 -0
  144. package/dist/src/services/workflow/eval-context.js +58 -0
  145. package/dist/src/services/workflow/eval-context.js.map +1 -0
  146. package/dist/src/services/workflow/lifecycle.d.ts +38 -0
  147. package/dist/src/services/workflow/lifecycle.d.ts.map +1 -0
  148. package/dist/src/services/workflow/lifecycle.js +99 -0
  149. package/dist/src/services/workflow/lifecycle.js.map +1 -0
  150. package/dist/src/services/workflow/signal-eval.d.ts +70 -0
  151. package/dist/src/services/workflow/signal-eval.d.ts.map +1 -0
  152. package/dist/src/services/workflow/signal-eval.js +174 -0
  153. package/dist/src/services/workflow/signal-eval.js.map +1 -0
  154. package/dist/src/services/workflow/store.d.ts +89 -0
  155. package/dist/src/services/workflow/store.d.ts.map +1 -0
  156. package/dist/src/services/workflow/store.js +284 -0
  157. package/dist/src/services/workflow/store.js.map +1 -0
  158. package/dist/src/services/workspace-export.d.ts.map +1 -1
  159. package/dist/src/services/workspace-export.js +3 -2
  160. package/dist/src/services/workspace-export.js.map +1 -1
  161. package/dist/src/storage/interface.d.ts +2 -2
  162. package/dist/src/storage/interface.d.ts.map +1 -1
  163. package/package.json +27 -28
@@ -1,6 +1,52 @@
1
1
  {
2
2
  "profile.landing.home": "Home",
3
3
  "profile.landing.menu": "Menu",
4
+ "profile.tabs.workflows": "Workflows",
5
+ "profile.workflows.title": "Workflows",
6
+ "profile.workflows.desc": "Declared, ordered agent pipelines with per-step health checks — they show whether each step actually produced, not just that it fired.",
7
+ "profile.workflows.loading": "Loading workflows…",
8
+ "profile.workflows.empty": "No workflows yet. An agent or the API can define one; it will appear here.",
9
+ "profile.workflows.trigger.schedule": "schedule",
10
+ "profile.workflows.trigger.event": "event",
11
+ "profile.workflows.trigger.manual": "manual",
12
+ "profile.workflows.stepCount": "{count} steps",
13
+ "profile.workflows.lastRun": "last run",
14
+ "profile.workflows.check": "Check",
15
+ "profile.workflows.run": "Run",
16
+ "profile.workflows.runStarted": "Run started",
17
+ "profile.workflows.back": "Back",
18
+ "profile.workflows.blueprint": "Blueprint",
19
+ "profile.workflows.after": "after",
20
+ "profile.workflows.recentRuns": "Recent runs",
21
+ "profile.workflows.noRuns": "No runs yet.",
22
+ "profile.workflows.attempt": "attempt",
23
+ "profile.workflows.health.title": "Per-step health over recent runs (green = produced, red = failed)",
24
+ "profile.workflows.inspectorDispatched": "{count} inspector task(s) dispatched",
25
+ "profile.workflows.new": "New",
26
+ "profile.workflows.edit": "Edit",
27
+ "profile.workflows.form.newTitle": "New workflow",
28
+ "profile.workflows.form.editTitle": "Edit workflow",
29
+ "profile.workflows.form.id": "Id (slug)",
30
+ "profile.workflows.form.idHint": "Id must be a lowercase slug (a-z, 0-9, hyphens).",
31
+ "profile.workflows.form.titleField": "Title",
32
+ "profile.workflows.form.description": "Description",
33
+ "profile.workflows.form.trigger": "Trigger",
34
+ "profile.workflows.form.matchKey": "match key (glob)",
35
+ "profile.workflows.form.matchOffer": "match offer id",
36
+ "profile.workflows.form.vars": "Variables",
37
+ "profile.workflows.form.addVar": "var",
38
+ "profile.workflows.form.steps": "Steps",
39
+ "profile.workflows.form.addStep": "step",
40
+ "profile.workflows.form.pickAgent": "agent…",
41
+ "profile.workflows.form.pickOffer": "offer…",
42
+ "profile.workflows.form.noCompatibleOffers": "This agent has no workflow-compatible offers (must publish success_signal + required_to_function + deliverable.location).",
43
+ "profile.workflows.form.noInput": "no input gate",
44
+ "profile.workflows.form.llmApproved": "Allow the node LLM to evaluate llm signal leaves in this workflow",
45
+ "profile.workflows.form.cancel": "Cancel",
46
+ "profile.workflows.form.save": "Save",
47
+ "profile.workflows.form.saved": "Workflow saved",
48
+ "profile.workflows.cancelRun": "Cancel run",
49
+ "profile.workflows.cancelled": "Run cancelled",
4
50
  "profile.tabs.scheduler": "Scheduler",
5
51
  "profile.agents.detail.tabs.schedules": "Schedules",
6
52
  "profile.scheduler.title": "Scheduler",
@@ -5853,6 +5899,9 @@
5853
5899
  "moreActions": "More actions",
5854
5900
  "policyLabel": "Join policy",
5855
5901
  "tabWorkspaces": "Workspaces",
5902
+ "structureOverviewOrg": "Organism structure overview",
5903
+ "structureOverviewWs": "Workspace structure overview",
5904
+ "structEmpty": "No structure to show yet.",
5856
5905
  "tabMembers": "Members",
5857
5906
  "tabAgents": "Agents",
5858
5907
  "tabBoard": "Board",
@@ -6358,7 +6407,10 @@
6358
6407
  "complete_test_task": "Agent executes and completes the test task",
6359
6408
  "publish_commands": "agents.{name}.commands memory has a non-empty array of { name, description, category }",
6360
6409
  "publish_config": "At least one agents.config.{name}.* memory entry exists describing this runtime",
6361
- "declare_services": "Agent declares offered services (optional)"
6410
+ "declare_services": "Agent declares offered services (optional)",
6411
+ "declare_offerings": "Agent publishes at least one offer (id + title + ask) to agents.{name}.offers so the owner can find what it does (optional)",
6412
+ "make_workflow_compatible": "At least one offer declares success_signal + required_to_function + deliverable.location, so it can be a step in an Agent Workflow (optional)",
6413
+ "price_offer": "At least one offer is sellable cross-owner: price + visibility public + a callable binding (optional)"
6362
6414
  },
6363
6415
  "errors": {
6364
6416
  "accessDenied": "Access denied",
@@ -1,6 +1,52 @@
1
1
  {
2
2
  "profile.landing.home": "Etusivu",
3
3
  "profile.landing.menu": "Valikko",
4
+ "profile.tabs.workflows": "Työnkulut",
5
+ "profile.workflows.title": "Työnkulut",
6
+ "profile.workflows.desc": "Määritellyt, järjestetyt agenttiketjut askelkohtaisilla terveystarkistuksilla — ne näyttävät tuottiko jokainen askel oikeasti tuloksen, ei vain että se käynnistyi.",
7
+ "profile.workflows.loading": "Ladataan työnkulkuja…",
8
+ "profile.workflows.empty": "Ei työnkulkuja vielä. Agentti tai API voi määritellä sellaisen; se ilmestyy tähän.",
9
+ "profile.workflows.trigger.schedule": "ajastus",
10
+ "profile.workflows.trigger.event": "tapahtuma",
11
+ "profile.workflows.trigger.manual": "manuaalinen",
12
+ "profile.workflows.stepCount": "{count} askelta",
13
+ "profile.workflows.lastRun": "viimeisin ajo",
14
+ "profile.workflows.check": "Tarkista",
15
+ "profile.workflows.run": "Aja",
16
+ "profile.workflows.runStarted": "Ajo käynnistetty",
17
+ "profile.workflows.back": "Takaisin",
18
+ "profile.workflows.blueprint": "Rakennekaavio",
19
+ "profile.workflows.after": "jälkeen",
20
+ "profile.workflows.recentRuns": "Viimeisimmät ajot",
21
+ "profile.workflows.noRuns": "Ei ajoja vielä.",
22
+ "profile.workflows.attempt": "yritys",
23
+ "profile.workflows.health.title": "Askelkohtainen terveys viime ajoista (vihreä = tuotti, punainen = epäonnistui)",
24
+ "profile.workflows.inspectorDispatched": "{count} tarkastustaskia lähetetty",
25
+ "profile.workflows.new": "Uusi",
26
+ "profile.workflows.edit": "Muokkaa",
27
+ "profile.workflows.form.newTitle": "Uusi työnkulku",
28
+ "profile.workflows.form.editTitle": "Muokkaa työnkulkua",
29
+ "profile.workflows.form.id": "Tunnus (slug)",
30
+ "profile.workflows.form.idHint": "Tunnuksen on oltava pienaakkos-slug (a-z, 0-9, väliviivat).",
31
+ "profile.workflows.form.titleField": "Otsikko",
32
+ "profile.workflows.form.description": "Kuvaus",
33
+ "profile.workflows.form.trigger": "Liipaisin",
34
+ "profile.workflows.form.matchKey": "osuma-avain (glob)",
35
+ "profile.workflows.form.matchOffer": "osuma-offer-id",
36
+ "profile.workflows.form.vars": "Muuttujat",
37
+ "profile.workflows.form.addVar": "muuttuja",
38
+ "profile.workflows.form.steps": "Askeleet",
39
+ "profile.workflows.form.addStep": "askel",
40
+ "profile.workflows.form.pickAgent": "agentti…",
41
+ "profile.workflows.form.pickOffer": "offer…",
42
+ "profile.workflows.form.noCompatibleOffers": "Tällä agentilla ei ole työnkulku-yhteensopivia offereita (täytyy julkaista success_signal + required_to_function + deliverable.location).",
43
+ "profile.workflows.form.noInput": "ei syöteporttia",
44
+ "profile.workflows.form.llmApproved": "Salli node-LLM:n arvioida llm-signaalilehdet tässä työnkulussa",
45
+ "profile.workflows.form.cancel": "Peruuta",
46
+ "profile.workflows.form.save": "Tallenna",
47
+ "profile.workflows.form.saved": "Työnkulku tallennettu",
48
+ "profile.workflows.cancelRun": "Keskeytä ajo",
49
+ "profile.workflows.cancelled": "Ajo keskeytetty",
4
50
  "profile.tabs.scheduler": "Ajastin",
5
51
  "profile.agents.detail.tabs.schedules": "Ajastukset",
6
52
  "profile.scheduler.title": "Ajastin",
@@ -5853,6 +5899,9 @@
5853
5899
  "moreActions": "Lisätoiminnot",
5854
5900
  "policyLabel": "Liittymiskäytäntö",
5855
5901
  "tabWorkspaces": "Työtilat",
5902
+ "structureOverviewOrg": "Organismin rakenteen yleiskuva",
5903
+ "structureOverviewWs": "Työtilan rakenteen yleiskuva",
5904
+ "structEmpty": "Ei vielä rakennetta näytettäväksi.",
5856
5905
  "tabMembers": "Jäsenet",
5857
5906
  "tabAgents": "Agentit",
5858
5907
  "tabBoard": "Taulu",
@@ -6358,7 +6407,10 @@
6358
6407
  "complete_test_task": "Agentti suorittaa ja viimeistelee testitehtävän",
6359
6408
  "publish_commands": "agents.{name}.commands -muistissa on epätyhjä { name, description, category } -taulu",
6360
6409
  "publish_config": "Vähintään yksi agents.config.{name}.* -muistitietue kuvaa tätä runtimea",
6361
- "declare_services": "Agentti ilmoittaa tarjoamansa palvelut (valinnainen)"
6410
+ "declare_services": "Agentti ilmoittaa tarjoamansa palvelut (valinnainen)",
6411
+ "declare_offerings": "Agentti julkaisee vähintään yhden tarjouksen (id + title + ask) avaimeen agents.{name}.offers, jotta omistaja löytää mitä se tekee (valinnainen)",
6412
+ "make_workflow_compatible": "Vähintään yksi tarjous määrittää success_signal + required_to_function + deliverable.location, jolloin se voi olla työnkulun vaihe (valinnainen)",
6413
+ "price_offer": "Vähintään yksi tarjous on myytävissä omistajien välillä: price + visibility public + kutsuttava sidonta (valinnainen)"
6362
6414
  },
6363
6415
  "errors": {
6364
6416
  "accessDenied": "Pääsy estetty",
@@ -2492,6 +2492,27 @@
2492
2492
  .pj-org-tab-count { color: var(--muted); font-size: 0.75rem; margin-left: 0.3rem; }
2493
2493
  .pj-org-boardrow { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
2494
2494
 
2495
+ /* ── OKF-style structure overview (collapsible Markdown map of an organism / workspace) ── */
2496
+ .pj-struct-overview { margin: 0.4rem 0 0.8rem; }
2497
+ .pj-struct-toggle { display: inline-flex; align-items: center; gap: 0.4rem; background: none; border: none; padding: 0.3rem 0; font-size: 0.85rem; color: var(--text-dim); cursor: pointer; }
2498
+ .pj-struct-toggle:hover { color: var(--text); }
2499
+ .pj-struct-caret { color: var(--muted); font-size: 0.8rem; width: 0.8rem; }
2500
+ .pj-struct-body { margin-top: 0.4rem; max-height: 32rem; overflow: auto; padding: 0.75rem 0.9rem; }
2501
+ /* Compact, on-theme typography so the rendered map reads as part of the dashboard, not a raw doc. */
2502
+ .pj-struct-body .md-body { font-size: 0.85rem; color: var(--text); line-height: 1.5; }
2503
+ .pj-struct-body .md-body > :first-child { margin-top: 0; }
2504
+ .pj-struct-body .md-body h1 { font-size: 1rem; font-weight: 700; margin: 0 0 0.3rem; color: var(--text); }
2505
+ .pj-struct-body .md-body h2 { font-size: 0.92rem; font-weight: 700; margin: 0.95rem 0 0.35rem; padding-top: 0.55rem; border-top: 1px solid var(--border); color: var(--text); }
2506
+ .pj-struct-body .md-body h3 { font-size: 0.83rem; font-weight: 600; margin: 0.55rem 0 0.2rem; color: var(--text-dim); text-transform: none; }
2507
+ .pj-struct-body .md-body p { margin: 0.2rem 0; }
2508
+ .pj-struct-body .md-body blockquote { margin: 0.2rem 0; padding: 0 0 0 0.6rem; border-left: 2px solid var(--border); color: var(--muted); font-size: 0.8rem; }
2509
+ .pj-struct-body .md-body blockquote p { margin: 0.1rem 0; }
2510
+ .pj-struct-body .md-body ul { margin: 0.2rem 0 0.4rem; padding-left: 1.15rem; }
2511
+ .pj-struct-body .md-body li { margin: 0.12rem 0; }
2512
+ .pj-struct-body .md-body code { background: var(--bg-dim); border: 1px solid var(--border); border-radius: 4px; padding: 0.02rem 0.32rem; font-size: 0.78rem; }
2513
+ .pj-struct-body .md-body strong { font-weight: 600; }
2514
+ .pj-struct-body .md-body em { color: var(--muted); font-style: normal; }
2515
+
2495
2516
  /* ── Workspace renew (phase 2): header actions, review banner, add-space tab ── */
2496
2517
  .pj-ws-head-actions { margin-left: auto; display: flex; gap: 0.4rem; align-items: center; }
2497
2518
  .pj-ws-banner { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; border: 1px solid var(--border); border-left: 3px solid var(--warn, var(--accent)); border-radius: 10px; background: var(--card); padding: 0.55rem 0.75rem; margin: 0.6rem 0 0.2rem; }
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @file workflows.css
3
+ * @description Styles for Profile › Workflows (workflows-tab.js): the list of workflows with a
4
+ * health sparkline, the blueprint graph + recent runs detail, and the single-run per-step
5
+ * timeline. Prefix: wf-. Theme-token driven (no hardcoded colors) so it flips with dark/light.
6
+ * @version-history
7
+ * v1.0.0 -- 2026-06-13 -- Phase 9: initial workflows tab styles.
8
+ */
9
+
10
+ .wf-tab { display: flex; flex-direction: column; gap: 1.1rem; }
11
+ .wf-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }
12
+ .wf-loading, .wf-empty { color: var(--text-dim); padding: 0.75rem 0; font-size: 0.92rem; }
13
+ .wf-error {
14
+ background: var(--danger-bg); color: var(--danger-fg);
15
+ border: 1px solid var(--danger-border, var(--border)); border-radius: var(--radius-sm); padding: 0.6rem 0.85rem;
16
+ }
17
+ .wf-muted { color: var(--text-dim); font-size: 0.82rem; }
18
+ .wf-section-title { font-size: 1rem; font-weight: 700; color: var(--text); margin: 0.5rem 0 0.1rem; }
19
+
20
+ /* ── badges ── */
21
+ .wf-badge {
22
+ display: inline-block; padding: 0.1rem 0.5rem; border-radius: var(--radius-full, 999px);
23
+ font-size: 0.72rem; font-weight: 700; line-height: 1.5;
24
+ }
25
+ .wf-badge--ok { background: var(--success-bg); color: var(--success-fg); }
26
+ .wf-badge--err { background: var(--danger-bg); color: var(--danger-fg); }
27
+ .wf-badge--run { background: var(--info-bg); color: var(--info-fg); }
28
+ .wf-badge--muted { background: var(--bg-dim); color: var(--text-dim); }
29
+
30
+ /* ── list ── */
31
+ .wf-card-list { display: flex; flex-direction: column; gap: 0.75rem; }
32
+ .wf-card {
33
+ display: flex; align-items: center; justify-content: space-between; gap: 1rem;
34
+ background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); padding: 0.85rem 1rem;
35
+ }
36
+ .wf-card-main { flex: 1; cursor: pointer; display: flex; flex-direction: column; gap: 0.25rem; }
37
+ .wf-card-title { font-weight: 700; color: var(--text); display: flex; align-items: center; gap: 0.5rem; }
38
+ .wf-card-meta { font-size: 0.82rem; color: var(--text-dim); }
39
+ .wf-card-actions { display: flex; gap: 0.4rem; white-space: nowrap; }
40
+
41
+ /* ── sparkline ── */
42
+ .wf-spark { display: inline-flex; gap: 2px; margin-top: 0.2rem; align-items: flex-end; }
43
+ .wf-spark-bar { width: 7px; height: 14px; border-radius: 2px; display: inline-block; }
44
+ .wf-spark-bar--ok { background: var(--success-fg); }
45
+ .wf-spark-bar--err { background: var(--danger-fg); }
46
+ .wf-spark-bar--none { background: var(--bg-dim); }
47
+
48
+ /* ── detail ── */
49
+ .wf-detail-head { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; }
50
+ .wf-detail-titlebox { flex: 1; display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; }
51
+ .wf-detail-title { font-size: 1.1rem; font-weight: 700; color: var(--text); }
52
+ .wf-detail-sub { font-size: 0.8rem; color: var(--text-dim); }
53
+ .wf-detail-sub code { font-family: var(--font-mono, monospace); }
54
+ .wf-detail-desc { color: var(--text-dim); font-size: 0.9rem; margin: -0.3rem 0 0.3rem; }
55
+ .wf-detail-actions { display: flex; gap: 0.4rem; }
56
+ .wf-node-desc { font-weight: 400; color: var(--text-dim); font-size: 0.85rem; }
57
+
58
+ .wf-graph { display: flex; flex-direction: column; gap: 0.5rem; }
59
+ .wf-node {
60
+ background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-sm);
61
+ padding: 0.6rem 0.8rem; display: flex; flex-direction: column; gap: 0.15rem;
62
+ }
63
+ .wf-node-id { font-weight: 700; color: var(--text); }
64
+ .wf-node-agent { font-size: 0.82rem; color: var(--text-dim); }
65
+ .wf-node-io { font-size: 0.78rem; color: var(--text-dim); font-family: var(--font-mono, monospace); }
66
+ .wf-node-dep { font-size: 0.74rem; color: var(--accent); }
67
+
68
+ .wf-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; }
69
+ .wf-table td { padding: 0.5rem 0.6rem; border-bottom: 1px solid var(--border); color: var(--text); }
70
+ .wf-run-row { cursor: pointer; }
71
+ .wf-run-row:hover { background: var(--bg-dim); }
72
+
73
+ /* ── run timeline ── */
74
+ .wf-steps { display: flex; flex-direction: column; gap: 0.5rem; }
75
+ .wf-step {
76
+ background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.55rem 0.8rem;
77
+ }
78
+ .wf-step-row { display: flex; align-items: center; gap: 0.6rem; }
79
+ .wf-step-id { font-weight: 600; color: var(--text); }
80
+ .wf-observed {
81
+ margin: 0.4rem 0 0; padding: 0.5rem 0.65rem; background: var(--bg-dim); border-radius: var(--radius-sm);
82
+ font-size: 0.76rem; color: var(--text-dim); overflow-x: auto; white-space: pre-wrap;
83
+ }
84
+ .wf-inspections {
85
+ margin-top: 0.5rem; padding: 0.5rem 0.7rem; background: var(--warn-bg); color: var(--warn-fg);
86
+ border-radius: var(--radius-sm); font-size: 0.82rem;
87
+ }
88
+
89
+ /* ── create/edit form ── */
90
+ .wf-form { display: flex; flex-direction: column; gap: 0.8rem; }
91
+ .wf-field { display: flex; flex-direction: column; gap: 0.25rem; }
92
+ .wf-field > span { font-size: 0.82rem; font-weight: 600; color: var(--text-dim); }
93
+ .wf-field input[type="text"], .wf-field input[type="number"], .wf-field select,
94
+ .wf-field-row input, .wf-field-row select {
95
+ background: var(--bg-input, var(--bg-dim)); color: var(--text);
96
+ border: 1px solid var(--border); border-radius: var(--radius-sm);
97
+ padding: 0.4rem 0.55rem; font: inherit;
98
+ }
99
+ .wf-field-row { display: flex; gap: 0.5rem; align-items: center; flex-wrap: wrap; }
100
+ .wf-field-row > input, .wf-field-row > select { flex: 1; min-width: 8rem; }
101
+ .wf-form-section {
102
+ border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.7rem 0.85rem;
103
+ display: flex; flex-direction: column; gap: 0.55rem;
104
+ }
105
+ .wf-form-section-head { display: flex; justify-content: space-between; align-items: center; font-weight: 700; color: var(--text); }
106
+ .wf-step-edit {
107
+ border-left: 2px solid var(--accent-soft, var(--border)); padding-left: 0.7rem;
108
+ display: flex; flex-direction: column; gap: 0.4rem;
109
+ }
110
+ .wf-step-opts { font-size: 0.82rem; color: var(--text-dim); }
111
+ .wf-step-after { display: flex; flex-wrap: wrap; gap: 0.6rem; align-items: center; font-size: 0.82rem; }
112
+ .wf-inline { display: inline-flex; align-items: center; gap: 0.3rem; color: var(--text); }
113
+ .wf-inline input[type="number"] { width: 4.5rem; background: var(--bg-input, var(--bg-dim)); color: var(--text); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.2rem 0.4rem; }
114
+ .wf-llm-toggle { margin-top: 0.2rem; font-size: 0.9rem; }
115
+ .wf-form-actions { display: flex; justify-content: flex-end; gap: 0.5rem; margin-top: 0.4rem; }
116
+ .wf-err-list { margin: 0; padding-left: 1.1rem; }
@@ -491,6 +491,24 @@ export async function getWorkspace(orgId, wsId) {
491
491
  return resp?.data || null;
492
492
  }
493
493
 
494
+ /** OKF-style STRUCTURE OVERVIEW (Markdown) of the whole organism — every workspace's space
495
+ * breakdown + totals, deterministic, size-bounded. Returns '' on failure (caller shows a notice). */
496
+ export async function getOrganismOverview(orgId) {
497
+ try {
498
+ const r = await apiGet(`/v1/organisms/${encodeURIComponent(orgId)}/overview`);
499
+ return r?.data?.markdown || '';
500
+ } catch { return ''; }
501
+ }
502
+
503
+ /** OKF-style STRUCTURE OVERVIEW (Markdown) of ONE workspace — per space the most-recent entries
504
+ * (ids + titles) and totals. Returns '' on failure. */
505
+ export async function getWorkspaceOverview(orgId, wsId) {
506
+ try {
507
+ const r = await apiGet(`/v1/organisms/${encodeURIComponent(orgId)}/workspace/overview?ws=${encodeURIComponent(wsId)}`);
508
+ return r?.data?.markdown || '';
509
+ } catch { return ''; }
510
+ }
511
+
494
512
  /** Overwrite a workspace's manifest (e.g. edited name/summary/policy from Settings). */
495
513
  export async function saveManifest(orgId, wsId, manifest) {
496
514
  return apiPost('/v1/memory', { key: `${wsRoot(orgId, wsId)}.meta.manifest`, value: manifest, visibility: 'private' });
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @file workflows.js
3
+ * @description Frontend API service for Agent Workflows (Profile › Workflows tab). Wraps the
4
+ * /v1/workflows endpoints (list / get / blueprint / runs / run / health). All functions return
5
+ * the AIMEAT envelope; callers read `res.data`.
6
+ * @usage import { listWorkflows, getBlueprint, runWorkflow } from '/js/services/workflows.js';
7
+ * @version-history
8
+ * v1.0.0 -- 2026-06-13 -- Phase 9: initial workflows service for the profile tab.
9
+ */
10
+ import { apiGet, apiPost, apiPut, apiDelete } from '/js/api.js';
11
+
12
+ /** Create/update a workflow definition (PUT /v1/workflows/:id). Returns the envelope. */
13
+ export async function putWorkflow(id, def) {
14
+ return apiPut(`/v1/workflows/${encodeURIComponent(id)}`, def);
15
+ }
16
+
17
+ export async function deleteWorkflow(id) {
18
+ return apiDelete(`/v1/workflows/${encodeURIComponent(id)}`);
19
+ }
20
+
21
+ /** Read one agent's published offers (to pick a workflow-compatible offer in the form). */
22
+ export async function getAgentOffers(agentName) {
23
+ return apiGet(`/v1/agents/${encodeURIComponent(agentName)}/offers`);
24
+ }
25
+
26
+ /** List the owner's workflow definitions: { workflows, count }. */
27
+ export async function listWorkflows() {
28
+ return apiGet('/v1/workflows');
29
+ }
30
+
31
+ export async function getWorkflow(id) {
32
+ return apiGet(`/v1/workflows/${encodeURIComponent(id)}`);
33
+ }
34
+
35
+ /** Derived structural graph: { workflowId, nodes, edges }. */
36
+ export async function getBlueprint(id) {
37
+ return apiGet(`/v1/workflows/${encodeURIComponent(id)}/blueprint`);
38
+ }
39
+
40
+ /** Run-health trend over recent runs: { sample, lastStatus, steps:[{stepId,green,red}] , … }. */
41
+ export async function getHealth(id) {
42
+ return apiGet(`/v1/workflows/${encodeURIComponent(id)}/health`);
43
+ }
44
+
45
+ /** List runs (newest first): { runs, count }. */
46
+ export async function listRuns(id) {
47
+ return apiGet(`/v1/workflows/${encodeURIComponent(id)}/runs`);
48
+ }
49
+
50
+ export async function getRun(id, runId) {
51
+ return apiGet(`/v1/workflows/${encodeURIComponent(id)}/runs/${encodeURIComponent(runId)}`);
52
+ }
53
+
54
+ /** Start a run. mode: 'signals-only' | 'full'. Returns { runId, mode }. */
55
+ export async function runWorkflow(id, mode, vars) {
56
+ return apiPost(`/v1/workflows/${encodeURIComponent(id)}/run`, { mode, ...(vars ? { vars } : {}) });
57
+ }
58
+
59
+ /** Cancel an in-flight run (stuck / gone wrong). */
60
+ export async function cancelRun(id, runId) {
61
+ return apiPost(`/v1/workflows/${encodeURIComponent(id)}/runs/${encodeURIComponent(runId)}/cancel`, {});
62
+ }
@@ -385,6 +385,13 @@ for completeness but are NOT needed for typical app building:
385
385
  - Packages (versioned bundles), Knowledge packages
386
386
  - Federation (node peering, cross-node routing)
387
387
  - Agent collaboration (shared memory, organisms)
388
+ - Agent Workflows: declared, ordered agent pipelines with per-step input/output signals checked
389
+ after each step, so the owner sees whether each step PRODUCED (not just fired). One trigger
390
+ (schedule / manual / event) drives the chain; each step names an agent + an offer and inherits
391
+ that offer's signals + deliverable location. Connected agents use aimeat_workflow_save / _get /
392
+ _run (signals-only = check vs memory, no dispatch; full = execute). Stored in owner memory
393
+ (workflows.def.* / workflows.run.*); API under /v1/workflows. Plan:
394
+ docs/plans/2026-06-13-agent-workflows-node-plan.md.
388
395
  - Organism workspaces: an organism can hold manifest-driven workspaces of markdown documents
389
396
  (a wiki) and schema-locked record lists, with a draft -> publish -> version flow. Connected
390
397
  agents use the aimeat_workspace_* MCP tools (list / read / write / publish / object_delete /
@@ -84,6 +84,7 @@
84
84
  <link rel="stylesheet" href="/css/views/capabilities.css">
85
85
  <link rel="stylesheet" href="/css/views/agents-detail.css">
86
86
  <link rel="stylesheet" href="/css/views/scheduler.css">
87
+ <link rel="stylesheet" href="/css/views/workflows.css">
87
88
  <link rel="stylesheet" href="/css/views/admin.css">
88
89
  <link rel="stylesheet" href="/css/views/admin-agent-integration.css">
89
90
  <link rel="stylesheet" href="/css/views/public-knowledge-viewer.css">
@@ -199,7 +200,8 @@
199
200
  "/js/services/agent-messages.js": "/js/services/agent-messages.js",
200
201
  "/js/services/agent-integration.js": "/js/services/agent-integration.js",
201
202
  "/js/services/admin-agent-integration.js": "/js/services/admin-agent-integration.js",
202
- "/js/services/schedules.js": "/js/services/schedules.js"
203
+ "/js/services/schedules.js": "/js/services/schedules.js",
204
+ "/js/services/workflows.js": "/js/services/workflows.js"
203
205
  }
204
206
  }
205
207
  </script>
@@ -755,6 +755,7 @@ const SIDEBAR_GROUPS = [
755
755
  { id: 'agents', icon: '\u{1F916}', labelKey: 'profile.tabs.agents' },
756
756
  { id: 'offers', icon: '\u{1F9F0}', labelKey: 'profile.tabs.offers' },
757
757
  { id: 'scheduler', icon: '⏰', labelKey: 'profile.tabs.scheduler' },
758
+ { id: 'workflows', icon: '\u{1F500}', labelKey: 'profile.tabs.workflows' },
758
759
  { id: 'actions', icon: '\u{1F6E0}️', labelKey: 'profile.tabs.services' },
759
760
  { id: 'mcp', icon: '\u{1F517}', labelKey: 'profile.tabs.mcp' },
760
761
  ] },
@@ -148,6 +148,11 @@
148
148
  * auto-activates; §7c) — the agent joins/provisions its own spaces and the task completion is
149
149
  * the ack. An agent already working in THIS workspace (per the participants data) shows a
150
150
  * "✓ active here" badge instead of Adopt. Convention agreed with the crewaimeat side 2026-06-10.
151
+ * v1.29.0 — 2026-06-13 — OKF-style structure overview: a collapsible <${'StructureOverview'}> panel in
152
+ * OrganismHome (📐 Organism structure overview — every workspace's space breakdown + totals) and in
153
+ * Workspace (📐 Workspace structure overview — per-space recent ids + titles). Lazy-loads a
154
+ * deterministic Markdown map from the server (orgService.getOrganismOverview / getWorkspaceOverview)
155
+ * and renders it via the safe Markdown component. Collapsed by default (no cost until opened).
151
156
  * v1.28.0 — 2026-06-12 — Overview landing tab: the whole workspace on one vertical scroll — a
152
157
  * "what happened here" strip (last 8 activity events, humanized + clickable) above every
153
158
  * manifest space stacked in order (records: compact rows max 5 + "Show all N →"; documents:
@@ -237,6 +242,46 @@ function KebabMenu({ items, label, trigger, btnClass }) {
237
242
 
238
243
  /** Tag chips + inline input — Enter/comma adds, × or Backspace-on-empty removes, blur commits.
239
244
  * Shows immediately how the value parses (vs. a raw "comma separated" text field). */
245
+ /** Collapsible OKF-style structure-overview panel. A button that, on first expand, lazy-loads a
246
+ * deterministic Markdown structure map (server projection — never persisted) and renders it via the
247
+ * safe Markdown component. Used at organism level (every workspace's space breakdown) and workspace
248
+ * level (per-space recent ids + titles). Collapsed by default so it costs nothing until asked for. */
249
+ function StructureOverview({ load, label }) {
250
+ const [open, setOpen] = useState(false);
251
+ const [md, setMd] = useState(null); // null = not loaded yet; '' = loaded but empty/failed
252
+ const [busy, setBusy] = useState(false);
253
+ const toggle = async () => {
254
+ const next = !open;
255
+ setOpen(next);
256
+ if (next && md === null && !busy) {
257
+ setBusy(true);
258
+ // For the human view, strip the OKF YAML frontmatter (machine metadata — kept in the raw
259
+ // server/MCP output) AND the leading "# … — structure overview" H1 (the panel toggle already
260
+ // names it; the page header already shows the org/workspace name). The body starts at the
261
+ // description / totals line.
262
+ try {
263
+ const raw = (await load()) || '';
264
+ setMd(raw.replace(/^---\n[\s\S]*?\n---\n+/, '').replace(/^#\s+.*\n+/, ''));
265
+ } finally { setBusy(false); }
266
+ }
267
+ };
268
+ return html`
269
+ <div class="pj-struct-overview">
270
+ <button class="pj-struct-toggle" aria-expanded=${open} onClick=${toggle}>
271
+ <span class="pj-struct-caret">${open ? '▾' : '▸'}</span>
272
+ <span>${'📐 '}${label}</span>
273
+ </button>
274
+ ${open ? html`
275
+ <div class="pj-struct-body card-detail">
276
+ ${busy
277
+ ? html`<${Spinner} text=${t('organisms.loading') || 'Loading...'} />`
278
+ : (md
279
+ ? html`<${Markdown} text=${md} />`
280
+ : html`<div class="section-desc">${t('organisms.structEmpty') || 'No structure to show yet.'}</div>`)}
281
+ </div>` : null}
282
+ </div>`;
283
+ }
284
+
240
285
  function TagInput({ tags, onChange, placeholder }) {
241
286
  const [val, setVal] = useState('');
242
287
  const add = () => { const v = val.trim().replace(/,+$/, ''); if (v && !tags.includes(v)) onChange([...tags, v]); setVal(''); };
@@ -1413,6 +1458,9 @@ function OrganismHome({ org, ghii, showToast, initialSettings, onOpenWs, onBack,
1413
1458
  </div>
1414
1459
  </div>
1415
1460
 
1461
+ <${StructureOverview} label=${t('organisms.structureOverviewOrg') || 'Organism structure overview'}
1462
+ load=${() => orgService.getOrganismOverview(org.id)} />
1463
+
1416
1464
  <div class="pj-org-tabs" role="tablist">
1417
1465
  ${tabs.map(tb => html`
1418
1466
  <button class="pj-org-tab ${activeHomeTab === tb.id ? 'active' : ''}" role="tab" aria-selected=${activeHomeTab === tb.id} key=${tb.id}
@@ -2951,6 +2999,9 @@ function Workspace({ org, wsId, showToast, onBack, onBackToList }) {
2951
2999
  </div>
2952
3000
  ${ws.manifest?.summary ? html`<div class="section-desc">${(ws.manifest.summary)}</div>` : null}
2953
3001
 
3002
+ <${StructureOverview} label=${t('organisms.structureOverviewWs') || 'Workspace structure overview'}
3003
+ load=${() => orgService.getWorkspaceOverview(orgId, wsId)} />
3004
+
2954
3005
  ${approvals.length > 0 && activeTab !== 'review' ? html`
2955
3006
  <div class="pj-ws-banner" role="status">
2956
3007
  <span class="pj-ws-banner-text">