aimeat 1.2.6 → 1.3.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 (128) hide show
  1. package/dist/.env.example +4 -0
  2. package/dist/locales/en.json +74 -2
  3. package/dist/locales/fi.json +74 -2
  4. package/dist/public/css/views/capabilities.css +211 -0
  5. package/dist/public/llms-template.txt +152 -89
  6. package/dist/public/spa.html +1 -0
  7. package/dist/public/views/admin/capabilities-tab.js +114 -0
  8. package/dist/public/views/admin.js +2 -0
  9. package/dist/public/views/aimeat-os.js +194 -34
  10. package/dist/public/views/profile/capabilities-tab.js +252 -0
  11. package/dist/public/views/profile/extensions-tab.js +404 -50
  12. package/dist/public/views/profile/landing-page.js +2 -0
  13. package/dist/public/views/profile.js +2 -0
  14. package/dist/src/config.d.ts +11 -0
  15. package/dist/src/config.d.ts.map +1 -1
  16. package/dist/src/config.js +11 -0
  17. package/dist/src/config.js.map +1 -1
  18. package/dist/src/mcp/apps.d.ts +18 -0
  19. package/dist/src/mcp/apps.d.ts.map +1 -0
  20. package/dist/src/mcp/apps.js +241 -0
  21. package/dist/src/mcp/apps.js.map +1 -0
  22. package/dist/src/mcp/capabilities.d.ts +12 -0
  23. package/dist/src/mcp/capabilities.d.ts.map +1 -0
  24. package/dist/src/mcp/capabilities.js +187 -0
  25. package/dist/src/mcp/capabilities.js.map +1 -0
  26. package/dist/src/mcp/cortex.d.ts +17 -0
  27. package/dist/src/mcp/cortex.d.ts.map +1 -0
  28. package/dist/src/mcp/cortex.js +237 -0
  29. package/dist/src/mcp/cortex.js.map +1 -0
  30. package/dist/src/mcp/extensions.d.ts +4 -3
  31. package/dist/src/mcp/extensions.d.ts.map +1 -1
  32. package/dist/src/mcp/extensions.js +233 -3
  33. package/dist/src/mcp/extensions.js.map +1 -1
  34. package/dist/src/mcp/index.d.ts.map +1 -1
  35. package/dist/src/mcp/index.js +6 -0
  36. package/dist/src/mcp/index.js.map +1 -1
  37. package/dist/src/routes/admin-capabilities.d.ts +11 -0
  38. package/dist/src/routes/admin-capabilities.d.ts.map +1 -0
  39. package/dist/src/routes/admin-capabilities.js +54 -0
  40. package/dist/src/routes/admin-capabilities.js.map +1 -0
  41. package/dist/src/routes/capabilities.d.ts +11 -0
  42. package/dist/src/routes/capabilities.d.ts.map +1 -0
  43. package/dist/src/routes/capabilities.js +289 -0
  44. package/dist/src/routes/capabilities.js.map +1 -0
  45. package/dist/src/routes/cortex.d.ts.map +1 -1
  46. package/dist/src/routes/cortex.js +2 -0
  47. package/dist/src/routes/cortex.js.map +1 -1
  48. package/dist/src/routes/extensions.d.ts.map +1 -1
  49. package/dist/src/routes/extensions.js +9 -0
  50. package/dist/src/routes/extensions.js.map +1 -1
  51. package/dist/src/routes/lib-capabilities.d.ts +9 -0
  52. package/dist/src/routes/lib-capabilities.d.ts.map +1 -0
  53. package/dist/src/routes/lib-capabilities.js +190 -0
  54. package/dist/src/routes/lib-capabilities.js.map +1 -0
  55. package/dist/src/routes/libs.d.ts.map +1 -1
  56. package/dist/src/routes/libs.js +13 -0
  57. package/dist/src/routes/libs.js.map +1 -1
  58. package/dist/src/routes/verification.d.ts +10 -1
  59. package/dist/src/routes/verification.d.ts.map +1 -1
  60. package/dist/src/routes/verification.js +174 -24
  61. package/dist/src/routes/verification.js.map +1 -1
  62. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  63. package/dist/src/server-bootstrap/routes-loader.js +35 -2
  64. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  65. package/dist/src/services/capability-aggregator.d.ts +8 -0
  66. package/dist/src/services/capability-aggregator.d.ts.map +1 -0
  67. package/dist/src/services/capability-aggregator.js +239 -0
  68. package/dist/src/services/capability-aggregator.js.map +1 -0
  69. package/dist/src/services/capability-invoke.d.ts +20 -0
  70. package/dist/src/services/capability-invoke.d.ts.map +1 -0
  71. package/dist/src/services/capability-invoke.js +95 -0
  72. package/dist/src/services/capability-invoke.js.map +1 -0
  73. package/dist/src/services/config-schema.d.ts.map +1 -1
  74. package/dist/src/services/config-schema.js +4 -0
  75. package/dist/src/services/config-schema.js.map +1 -1
  76. package/dist/src/services/core-jobs.d.ts.map +1 -1
  77. package/dist/src/services/core-jobs.js +16 -0
  78. package/dist/src/services/core-jobs.js.map +1 -1
  79. package/dist/src/services/did-document.d.ts +25 -0
  80. package/dist/src/services/did-document.d.ts.map +1 -0
  81. package/dist/src/services/did-document.js +31 -0
  82. package/dist/src/services/did-document.js.map +1 -0
  83. package/dist/src/services/eudiw.d.ts +11 -1
  84. package/dist/src/services/eudiw.d.ts.map +1 -1
  85. package/dist/src/services/eudiw.js +43 -48
  86. package/dist/src/services/eudiw.js.map +1 -1
  87. package/dist/src/services/extension-runtime.d.ts.map +1 -1
  88. package/dist/src/services/extension-runtime.js +8 -5
  89. package/dist/src/services/extension-runtime.js.map +1 -1
  90. package/dist/src/services/job-seeding.d.ts.map +1 -1
  91. package/dist/src/services/job-seeding.js +4 -0
  92. package/dist/src/services/job-seeding.js.map +1 -1
  93. package/dist/src/services/oidc-client.d.ts +32 -0
  94. package/dist/src/services/oidc-client.d.ts.map +1 -0
  95. package/dist/src/services/oidc-client.js +67 -0
  96. package/dist/src/services/oidc-client.js.map +1 -0
  97. package/dist/src/services/sd-jwt.d.ts +21 -0
  98. package/dist/src/services/sd-jwt.d.ts.map +1 -0
  99. package/dist/src/services/sd-jwt.js +87 -0
  100. package/dist/src/services/sd-jwt.js.map +1 -0
  101. package/dist/src/services/vc-issuer.d.ts +20 -1
  102. package/dist/src/services/vc-issuer.d.ts.map +1 -1
  103. package/dist/src/services/vc-issuer.js +75 -15
  104. package/dist/src/services/vc-issuer.js.map +1 -1
  105. package/dist/src/storage/interface.d.ts +118 -1
  106. package/dist/src/storage/interface.d.ts.map +1 -1
  107. package/dist/src/storage/providers/mongodb/index.d.ts +37 -1
  108. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  109. package/dist/src/storage/providers/mongodb/index.js +282 -0
  110. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  111. package/dist/src/storage/providers/sqlite/index.d.ts +37 -1
  112. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  113. package/dist/src/storage/providers/sqlite/index.js +241 -0
  114. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  115. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  116. package/dist/src/storage/providers/sqlite/schema.js +77 -0
  117. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  118. package/dist/src/storage/repositories/capability.repository.d.ts +35 -0
  119. package/dist/src/storage/repositories/capability.repository.d.ts.map +1 -0
  120. package/dist/src/storage/repositories/capability.repository.js +2 -0
  121. package/dist/src/storage/repositories/capability.repository.js.map +1 -0
  122. package/dist/src/storage/repositories/index.d.ts +1 -0
  123. package/dist/src/storage/repositories/index.d.ts.map +1 -1
  124. package/dist/src/storage/repositories/node.repository.d.ts +5 -1
  125. package/dist/src/storage/repositories/node.repository.d.ts.map +1 -1
  126. package/dist/static/app-catalog.html +156 -29
  127. package/package.json +6 -1
  128. package/prisma/schema.prisma +86 -0
package/dist/.env.example CHANGED
@@ -177,7 +177,11 @@ AIMEAT_PORT=40050
177
177
  # AIMEAT_EUDIW_REDIRECT_URI="https://your-node.example/v1/ghii/verify/eudiw/callback"
178
178
  # AIMEAT_FTN_ENABLED=false
179
179
  # AIMEAT_FTN_PROVIDER_URL="https://tunnistautuminen.suomi.fi"
180
+ # AIMEAT_FTN_CLIENT_ID="" # OIDC client_id from FTN broker
181
+ # AIMEAT_FTN_CLIENT_SECRET="" # OIDC client_secret from FTN broker
180
182
  # AIMEAT_VC_ISSUER_DID="did:web:your-node.example"
183
+ # AIMEAT_NONCE_TTL_SECONDS=300 # verification nonce TTL (60-3600)
184
+ # AIMEAT_NATIONAL_EID_PID_CLAIM="personal_identity_code" # FI: personal_identity_code, SE: personalNumber, DK: dk.cpr
181
185
 
182
186
  # ── Consul (optional fleet management) ───────────────────────
183
187
  # Connect to HashiCorp Consul for centralized config management across nodes.
@@ -676,8 +676,8 @@
676
676
  "launch": "Launch"
677
677
  },
678
678
  "v8ext": {
679
- "title": "V8 Extensions",
680
- "desc": "Sandboxed JavaScript extensions that run server-side. Each extension provides actions that can be called via API or from apps.",
679
+ "title": "Server Extensions",
680
+ "desc": "Sandboxed JavaScript extensions that run server-side in a secure isolate. Each extension provides actions that can be called via API or from apps.",
681
681
  "back": "Back",
682
682
  "author": "Author",
683
683
  "statusActive": "Active",
@@ -4562,5 +4562,77 @@
4562
4562
  "copyBtn": "Copy to clipboard",
4563
4563
  "copied": "Copied!",
4564
4564
  "loadError": "Failed to load help prompt."
4565
+ },
4566
+ "capabilities": {
4567
+ "title": "Capabilities",
4568
+ "tabLabel": "Capabilities",
4569
+ "create": "Create Capability",
4570
+ "edit": "Edit",
4571
+ "delete": "Delete",
4572
+ "name": "Name",
4573
+ "summary": "Summary",
4574
+ "status": "Status",
4575
+ "visibility": "Visibility",
4576
+ "source": "Source",
4577
+ "sourceType": "Source Type",
4578
+ "callable": "Callable",
4579
+ "tags": "Tags",
4580
+ "invocations": "Invocations",
4581
+ "errors": "Errors",
4582
+ "successRate": "Success Rate",
4583
+ "lastInvoked": "Last Invoked",
4584
+ "avgResponseMs": "Avg Response",
4585
+ "vouch": "Vouch",
4586
+ "unvouch": "Remove Vouch",
4587
+ "vouchCount": "Vouches",
4588
+ "pendingReview": "Pending Review",
4589
+ "approve": "Approve",
4590
+ "reject": "Reject",
4591
+ "disable": "Disable",
4592
+ "enable": "Enable",
4593
+ "test": "Test",
4594
+ "invoke": "Invoke",
4595
+ "logs": "Logs",
4596
+ "override": "Override",
4597
+ "operatorNotes": "Operator Notes",
4598
+ "noCapabilities": "No capabilities found",
4599
+ "browserOnly": "Browser only",
4600
+ "discoveryOnly": "Discovery only",
4601
+ "owner": "Owner",
4602
+ "authRequired": "Auth Required",
4603
+ "cost": "Cost",
4604
+ "deprecated": "Deprecated",
4605
+ "manual": "Manual",
4606
+ "auto": "Auto-aggregated",
4607
+ "createSuccess": "Capability created",
4608
+ "deleteSuccess": "Capability deleted",
4609
+ "deleteConfirm": "Delete this capability?",
4610
+ "vouchSuccess": "Vouched!",
4611
+ "cannotVouchOwn": "Cannot vouch for your own capability",
4612
+ "testResult": "Test Result",
4613
+ "adminTitle": "All Capabilities",
4614
+ "nodeCapabilities": "Node Capabilities",
4615
+ "nodeCapabilitiesDesc": "These are all the capabilities currently available on this node. Capabilities are created automatically when you activate extensions or cortex modules.",
4616
+ "howCreated": "How capabilities are created",
4617
+ "howCreatedDesc": "Install and activate extensions (Extensions tab) or cortex modules to automatically register capabilities. You can also create manual capabilities if the node policy allows it.",
4618
+ "policyTitle": "Capability Policy",
4619
+ "policyPublishing": "Publishing",
4620
+ "policyPublishers": "Publishers",
4621
+ "policyWebhooks": "Webhooks",
4622
+ "policyDisabled": "Disabled",
4623
+ "policySelfOnly": "Self only (private)",
4624
+ "policyModerated": "Moderated (operator review)",
4625
+ "policyOpen": "Open",
4626
+ "policyAllUsers": "All users",
4627
+ "policyTrustedOnly": "Trusted users only",
4628
+ "policyAllowlist": "Allowlist only",
4629
+ "policyAllowlistOnly": "Allowlist only",
4630
+ "extension": "Extension",
4631
+ "cortex": "Cortex",
4632
+ "action": "Action",
4633
+ "allTypes": "All types",
4634
+ "filterByType": "Filter by source",
4635
+ "myCapabilities": "My Capabilities",
4636
+ "totalCount": "{count} capabilities"
4565
4637
  }
4566
4638
  }
@@ -676,8 +676,8 @@
676
676
  "launch": "Käynnistä"
677
677
  },
678
678
  "v8ext": {
679
- "title": "V8-laajennukset",
680
- "desc": "Hiekkalaatikoituja JavaScript-laajennuksia jotka ajavat palvelimella. Jokainen laajennus tarjoaa toimintoja joita voi kutsua API:n kautta tai sovelluksista.",
679
+ "title": "Palvelinlaajennukset",
680
+ "desc": "Hiekkalaatikoituja JavaScript-laajennuksia jotka ajavat palvelimella turvallisessa eristysympäristössä. Jokainen laajennus tarjoaa toimintoja joita voi kutsua API:n kautta tai sovelluksista.",
681
681
  "back": "Takaisin",
682
682
  "author": "Tekijä",
683
683
  "statusActive": "Aktiivinen",
@@ -4562,5 +4562,77 @@
4562
4562
  "copyBtn": "Kopioi leikepöydälle",
4563
4563
  "copied": "Kopioitu!",
4564
4564
  "loadError": "Apukehotteen lataaminen epäonnistui."
4565
+ },
4566
+ "capabilities": {
4567
+ "title": "Kyvykkyydet",
4568
+ "tabLabel": "Kyvykkyydet",
4569
+ "create": "Luo kyvykkyys",
4570
+ "edit": "Muokkaa",
4571
+ "delete": "Poista",
4572
+ "name": "Nimi",
4573
+ "summary": "Kuvaus",
4574
+ "status": "Tila",
4575
+ "visibility": "Näkyvyys",
4576
+ "source": "Lähde",
4577
+ "sourceType": "Lähdetyyppi",
4578
+ "callable": "Kutsuttava",
4579
+ "tags": "Tagit",
4580
+ "invocations": "Kutsut",
4581
+ "errors": "Virheet",
4582
+ "successRate": "Onnistumis-%",
4583
+ "lastInvoked": "Viimeksi kutsuttu",
4584
+ "avgResponseMs": "Keskiarvo",
4585
+ "vouch": "Suosittele",
4586
+ "unvouch": "Peru suositus",
4587
+ "vouchCount": "Suositukset",
4588
+ "pendingReview": "Odottaa tarkistusta",
4589
+ "approve": "Hyväksy",
4590
+ "reject": "Hylkää",
4591
+ "disable": "Poista käytöstä",
4592
+ "enable": "Ota käyttöön",
4593
+ "test": "Testaa",
4594
+ "invoke": "Kutsu",
4595
+ "logs": "Lokit",
4596
+ "override": "Ohitus",
4597
+ "operatorNotes": "Operaattorin muistiinpanot",
4598
+ "noCapabilities": "Kyvykkyyksiä ei löytynyt",
4599
+ "browserOnly": "Vain selain",
4600
+ "discoveryOnly": "Vain löydettävissä",
4601
+ "owner": "Omistaja",
4602
+ "authRequired": "Vaatii autentikoinnin",
4603
+ "cost": "Hinta",
4604
+ "deprecated": "Vanhentunut",
4605
+ "manual": "Manuaalinen",
4606
+ "auto": "Automaattisesti kerätty",
4607
+ "createSuccess": "Kyvykkyys luotu",
4608
+ "deleteSuccess": "Kyvykkyys poistettu",
4609
+ "deleteConfirm": "Poista tämä kyvykkyys?",
4610
+ "vouchSuccess": "Suositeltu!",
4611
+ "cannotVouchOwn": "Et voi suositella omaa kyvykkyyttäsi",
4612
+ "testResult": "Testitulos",
4613
+ "adminTitle": "Kaikki kyvykkyydet",
4614
+ "nodeCapabilities": "Noden kyvykkyydet",
4615
+ "nodeCapabilitiesDesc": "Kaikki tällä hetkellä käytettävissä olevat kyvykkyydet tällä nodella. Kyvykkyydet luodaan automaattisesti kun aktivoit extensioneja tai cortex-moduuleja.",
4616
+ "howCreated": "Miten kyvykkyydet luodaan",
4617
+ "howCreatedDesc": "Asenna ja aktivoi extensioneja (Extensions-välilehti) tai cortex-moduuleja, niin kyvykkyydet rekisteröityvät automaattisesti. Voit myös luoda manuaalisia kyvykkyyksiä jos noden käytäntö sallii sen.",
4618
+ "policyTitle": "Kyvykkyyskäytäntö",
4619
+ "policyPublishing": "Julkaisu",
4620
+ "policyPublishers": "Julkaisijat",
4621
+ "policyWebhooks": "Webhookit",
4622
+ "policyDisabled": "Pois käytöstä",
4623
+ "policySelfOnly": "Vain itselle (yksityinen)",
4624
+ "policyModerated": "Moderoitu (operaattori tarkistaa)",
4625
+ "policyOpen": "Avoin",
4626
+ "policyAllUsers": "Kaikki käyttäjät",
4627
+ "policyTrustedOnly": "Vain luotetut käyttäjät",
4628
+ "policyAllowlist": "Vain sallitut",
4629
+ "policyAllowlistOnly": "Vain sallitut",
4630
+ "extension": "Extensio",
4631
+ "cortex": "Cortex",
4632
+ "action": "Toiminto",
4633
+ "allTypes": "Kaikki tyypit",
4634
+ "filterByType": "Suodata lähteen mukaan",
4635
+ "myCapabilities": "Omat kyvykkyydet",
4636
+ "totalCount": "{count} kyvykkyyttä"
4565
4637
  }
4566
4638
  }
@@ -0,0 +1,211 @@
1
+ /**
2
+ * @file capabilities.css
3
+ * @description Styles for the profile capabilities tab
4
+ * @version-history
5
+ * v1.0.0 — 2026-05-02 — Initial styles
6
+ */
7
+
8
+ .cap-filter-bar {
9
+ display: flex;
10
+ gap: 8px;
11
+ margin: 12px 0;
12
+ flex-wrap: wrap;
13
+ }
14
+ .cap-search-input {
15
+ flex: 1;
16
+ min-width: 160px;
17
+ padding: 6px 12px;
18
+ border: 1px solid var(--border);
19
+ border-radius: 6px;
20
+ background: var(--card);
21
+ color: var(--text);
22
+ font-size: .85rem;
23
+ }
24
+ .cap-filter-select {
25
+ padding: 6px 12px;
26
+ border: 1px solid var(--border);
27
+ border-radius: 6px;
28
+ background: var(--card);
29
+ color: var(--text);
30
+ font-size: .85rem;
31
+ min-width: 140px;
32
+ }
33
+
34
+ .cap-item {
35
+ padding: 10px 14px;
36
+ border: 1px solid var(--border);
37
+ border-radius: 8px;
38
+ margin-bottom: 6px;
39
+ cursor: pointer;
40
+ transition: border-color .15s;
41
+ background: var(--card);
42
+ }
43
+ .cap-item:hover {
44
+ border-color: var(--accent);
45
+ }
46
+ .cap-item-selected {
47
+ border-color: var(--accent);
48
+ background: var(--surface);
49
+ }
50
+ .cap-item-header {
51
+ display: flex;
52
+ justify-content: space-between;
53
+ align-items: center;
54
+ gap: 8px;
55
+ }
56
+ .cap-item-name {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 6px;
60
+ flex-wrap: wrap;
61
+ }
62
+ .cap-source-icon {
63
+ font-size: .9rem;
64
+ }
65
+ .cap-item-stats {
66
+ display: flex;
67
+ gap: 12px;
68
+ font-size: .75rem;
69
+ color: var(--text-muted);
70
+ white-space: nowrap;
71
+ }
72
+ .cap-item-summary {
73
+ font-size: .8rem;
74
+ color: var(--text-dim);
75
+ margin-top: 4px;
76
+ }
77
+ .cap-item-tags {
78
+ display: flex;
79
+ gap: 4px;
80
+ margin-top: 6px;
81
+ flex-wrap: wrap;
82
+ }
83
+ .cap-tag {
84
+ font-size: .7rem;
85
+ padding: 1px 6px;
86
+ border-radius: 4px;
87
+ background: var(--bg-dim);
88
+ color: var(--text-dim);
89
+ }
90
+ .cap-badge {
91
+ font-size: .7rem;
92
+ padding: 1px 6px;
93
+ border-radius: 4px;
94
+ }
95
+ .cap-badge-callable {
96
+ background: var(--bg-dim);
97
+ color: var(--accent);
98
+ }
99
+ .cap-badge-browser {
100
+ background: var(--bg-dim);
101
+ color: var(--text-muted);
102
+ }
103
+ .cap-badge-status {
104
+ background: var(--surface);
105
+ color: var(--text-muted);
106
+ }
107
+
108
+ .cap-detail {
109
+ margin-top: 10px;
110
+ padding-top: 10px;
111
+ border-top: 1px solid var(--border);
112
+ font-size: .82rem;
113
+ }
114
+ .cap-detail-row {
115
+ margin-bottom: 4px;
116
+ line-height: 1.5;
117
+ }
118
+ .cap-detail-label {
119
+ font-weight: 600;
120
+ color: var(--text-dim);
121
+ }
122
+ .cap-detail-code {
123
+ font-family: var(--mono);
124
+ font-size: .78rem;
125
+ background: var(--bg-dim);
126
+ padding: 1px 5px;
127
+ border-radius: 3px;
128
+ word-break: break-all;
129
+ }
130
+ .cap-schema-details {
131
+ margin-top: 6px;
132
+ }
133
+ .cap-schema-details summary {
134
+ cursor: pointer;
135
+ font-size: .8rem;
136
+ color: var(--accent);
137
+ }
138
+ .cap-schema-pre {
139
+ font-family: var(--mono);
140
+ font-size: .75rem;
141
+ background: var(--bg-dim);
142
+ padding: 8px;
143
+ border-radius: 6px;
144
+ max-height: 200px;
145
+ overflow: auto;
146
+ margin-top: 4px;
147
+ }
148
+
149
+ .cap-info-section {
150
+ margin-top: 20px;
151
+ padding: 14px;
152
+ border: 1px solid var(--border);
153
+ border-radius: 8px;
154
+ background: var(--surface);
155
+ }
156
+ .cap-info-title {
157
+ font-weight: 600;
158
+ font-size: .85rem;
159
+ margin-bottom: 4px;
160
+ }
161
+ .cap-info-desc {
162
+ font-size: .8rem;
163
+ color: var(--text-dim);
164
+ line-height: 1.5;
165
+ }
166
+
167
+ .cap-policy-grid {
168
+ display: grid;
169
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
170
+ gap: 8px;
171
+ margin-top: 8px;
172
+ }
173
+ .cap-policy-item {
174
+ display: flex;
175
+ flex-direction: column;
176
+ gap: 2px;
177
+ }
178
+ .cap-policy-label {
179
+ font-size: .75rem;
180
+ color: var(--text-muted);
181
+ text-transform: uppercase;
182
+ letter-spacing: .03em;
183
+ }
184
+ .cap-policy-value {
185
+ font-size: .82rem;
186
+ font-weight: 500;
187
+ }
188
+
189
+ .cap-create-section {
190
+ margin-top: 20px;
191
+ }
192
+ .cap-create-form {
193
+ display: grid;
194
+ gap: 8px;
195
+ max-width: 400px;
196
+ margin-top: 10px;
197
+ }
198
+ .cap-form-input {
199
+ padding: 6px 10px;
200
+ border: 1px solid var(--border);
201
+ border-radius: 6px;
202
+ background: var(--card);
203
+ color: var(--text);
204
+ font-size: .85rem;
205
+ }
206
+ .cap-form-checkbox {
207
+ display: flex;
208
+ align-items: center;
209
+ gap: 6px;
210
+ font-size: .85rem;
211
+ }
@@ -10,41 +10,114 @@ downloadedFrom: {{BASE_URL}}/llms.txt
10
10
  - Node ID: {{NODE_ID}}
11
11
  - Protocol: AIMEAT v1
12
12
 
13
- ## For AI assistants reading this
14
-
15
- You are helping a human user, not connecting as an agent yourself.
16
- When building apps, the user is a human (GHII identity), not an AI
17
- agent (GAII). The aimeat-auth.js library handles human login and
18
- registration. Do not use device authorization or agent auth flows
19
- when building apps.
20
-
21
- Users share this URL when they want to build apps, use features, or
22
- connect to this AIMEAT node. Start by asking what they want to do.
23
-
24
- If the user pastes only this URL with no question, ask what kind of
25
- app or feature they would like to build on this node.
26
-
27
- Quick routing by user intent:
28
-
29
- - **Build an app** (most common): Go to "Building Apps on AIMEAT" for
30
- starter templates with login bar, SDK libraries, and code examples.
31
- Three templates: standard (memory), realtime (multiplayer/chat),
32
- storage (drawing/files). The login bar (aimeat-auth.js) handles
33
- human registration and login automatically via GHII identity.
34
- - **Try it out anonymously**: `POST /v1/auth/anonymous` gives a JWT
35
- with no registration. Good for quick experiments.
36
- - **Use the portal as a registered user**: Register at `/v1/portal`
37
- to get full access: profile, wallet (100 morsel welcome bonus),
38
- agents, apps, boards, knowledge, and all features.
39
- - **Browse what is on this node**: `GET /v1/catalogue` (public
40
- actions, agents, boards), `GET /v1/apps` (downloadable apps),
41
- `GET /v1/stats` (node statistics). No auth needed.
42
- - **Connect an AI agent** (different from building apps): "Connecting: Device Authorization" for
43
- persistent agent identity, or "Connecting: MCP" for MCP platforms.
44
-
45
- A document summary usually isn't what the user wants. The API
46
- reference and app templates below are. Skip summarizing unless
47
- they ask.
13
+ ## Table of Contents
14
+
15
+ 1. **For AI assistants** - Starter template, SDK libraries, key rules
16
+ 2. **What is AIMEAT** - Protocol overview
17
+ 3. **What You Can Build** - App examples
18
+ 4. **Two Ways to Start** - Anonymous or registered
19
+ 5. **Core Capabilities for App Building** - Memory, Storage, Realtime, Boards
20
+ 6. **Building Apps on AIMEAT** - Data layer guide, detailed templates, SDK API reference
21
+ 7. **Core Concepts** - GHII, GAII, Morsels, Scopes
22
+ 8. **Connecting: Device Authorization** - AI agent connection flow
23
+ 9. **Connecting: MCP** - OAuth 2.1 for MCP platforms
24
+ 10. **API Rules** - Response envelope, error format
25
+ 11. **Endpoints** - Full API reference with request/response examples
26
+
27
+ ## For AI assistants: How to help the user
28
+
29
+ You are helping a human build an app. Not connecting as an agent.
30
+ Ask what they want to build, then use the template below to start.
31
+
32
+ Apps are single-file HTML pages. The user describes an idea, you
33
+ write the HTML using the starter template and SDK libraries below.
34
+ Do not ask about deployment, cortex, extensions, CSM, or
35
+ architecture. Just ask what the app should do and start building.
36
+
37
+ ### Starter Template (use this for every app)
38
+
39
+ ```html
40
+ <!-- AIMEAT App Manifest
41
+ name: my-app
42
+ version: 1.0.0
43
+ description: What this app does
44
+ entry: index.html
45
+ -->
46
+ <!DOCTYPE html>
47
+ <html lang="en">
48
+ <head>
49
+ <meta charset="UTF-8">
50
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
51
+ <title>App Name</title>
52
+ <link href="https://cdn.jsdelivr.net/npm/daisyui@5" rel="stylesheet" />
53
+ <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
54
+ </head>
55
+ <body class="bg-base-100 min-h-screen flex flex-col">
56
+ <nav class="navbar bg-base-200 shadow-sm px-4">
57
+ <div class="flex-1"><span class="text-lg font-bold">App Name</span></div>
58
+ <div class="flex-none"><span id="header-auth"></span></div>
59
+ </nav>
60
+ <div id="app" class="flex-1 p-4">Loading...</div>
61
+ <script>
62
+ function loadScript(src) {
63
+ return new Promise((resolve, reject) => {
64
+ const s = document.createElement('script');
65
+ s.src = src; s.onload = resolve; s.onerror = reject;
66
+ document.head.appendChild(s);
67
+ });
68
+ }
69
+ async function boot() {
70
+ await loadScript('/v1/libs/aimeat-auth.js');
71
+ await loadScript('/v1/libs/aimeat-data.js');
72
+ // Add more libs as needed:
73
+ // await loadScript('/v1/libs/aimeat-storage.js'); // file uploads
74
+ // await loadScript('/lib/realtime.js'); // multiplayer/P2P
75
+
76
+ AIMEAT.auth.mountLoginButton('#header-auth', {
77
+ onLogin: (session) => startApp(session),
78
+ onLogout: () => location.reload(),
79
+ });
80
+ const session = await AIMEAT.auth.login();
81
+ if (session) startApp(session);
82
+ }
83
+ async function startApp(session) {
84
+ // YOUR APP CODE HERE
85
+ // Use AIMEAT.data.get(key), AIMEAT.data.set(key, value) for data
86
+ // Use session.fetch(path, opts) for raw API calls (returns parsed JSON)
87
+ document.getElementById('app').innerHTML = '<h2>Hello!</h2>';
88
+ }
89
+ boot();
90
+ </script>
91
+ </body>
92
+ </html>
93
+ ```
94
+
95
+ ### SDK Libraries (add to boot() as needed)
96
+
97
+ | Library | Load with | Use for |
98
+ |---------|-----------|---------|
99
+ | aimeat-auth | Always loaded | Login bar, session |
100
+ | aimeat-data | Always loaded | `AIMEAT.data.get/set/search/list/delete` |
101
+ | aimeat-storage | `loadScript('/v1/libs/aimeat-storage.js')` | `AIMEAT.storage.upload/download/list` |
102
+ | AimeatRealtime | `loadScript('/lib/realtime.js')` | P2P rooms, multiplayer, chat |
103
+ | aimeat-social | `loadScript('/v1/libs/aimeat-social.js')` | Discussion boards |
104
+ | aimeat-wallet | `loadScript('/v1/libs/aimeat-wallet.js')` | Morsel balance display |
105
+
106
+ ### Key rules
107
+
108
+ - `session.fetch()` returns already-parsed JSON. Do NOT call `.json()` on it.
109
+ - All API paths must be relative (start with `/`), never absolute URLs.
110
+ - Do NOT add manual token entry or API URL fields. Auth lib handles it.
111
+ - Storage: ALL endpoints require auth. To display images, fetch with auth,
112
+ convert to blob, use `URL.createObjectURL(blob)` as img src.
113
+ - Realtime: register `rt.on()` handlers BEFORE `rt.connect()`. Throttle
114
+ high-frequency events (pointermove etc.) to ~30ms batches.
115
+
116
+ ### Other options (not app building)
117
+
118
+ - Browse this node: `GET /v1/catalogue`, `GET /v1/apps`, `GET /v1/stats`
119
+ - Connect as AI agent: see "Connecting: Device Authorization" section below
120
+ - Anonymous quick test: `POST /v1/auth/anonymous`
48
121
 
49
122
  ## What is AIMEAT
50
123
 
@@ -60,14 +133,18 @@ Each AIMEAT node is independently operated. This node ({{NODE_ID}}) is one node
60
133
 
61
134
  ## What You Can Build
62
135
 
63
- This node is a platform for building AI-powered apps and services. Examples:
136
+ Apps are single-file HTML pages with a login bar and AIMEAT SDK libraries.
137
+ The user describes an idea, you build it using the templates below.
138
+
139
+ Examples of apps people build:
64
140
 
65
- - **Personal memory app** - Store notes, summaries, and data persistently across AI chat sessions using the memory API
66
- - **Hobby community** - People discover each other by interests and location, AI helps with matching via the directory and match engine
67
- - **Knowledge base** - Multiple AI agents contribute structured knowledge with review workflows using knowledge packages
68
- - **Agent marketplace** - Agents publish callable services (actions), other agents request work, payment via morsels with escrow protection
69
- - **Real-time dashboard** - Monitor node data with live updates via SSE (server-sent events)
70
- - **Multi-agent automation** - Agents collaborate through shared memory (visibility: owner) and work queues, coordinating tasks across platforms
141
+ - **Note-taking / journal app** - Save and load data with Memory API
142
+ - **Weather / info dashboard** - Fetch external APIs, display with nice UI
143
+ - **Multiplayer drawing board** - Real-time P2P with AimeatRealtime + Storage
144
+ - **Chat room** - Real-time messaging with AimeatRealtime
145
+ - **Photo gallery** - Upload and browse images with Storage
146
+ - **Hobby community board** - Discussion with Boards API
147
+ - **Habit / expense tracker** - Structured data with Memory API
71
148
 
72
149
  ## Two Ways to Start
73
150
 
@@ -106,53 +183,39 @@ For persistent agent identity with full capabilities:
106
183
  2. Connect your AI agent via device authorization (see "Connecting: Device Authorization" section below) or MCP (see "Connecting: MCP" section below)
107
184
  3. Agent receives its own GAII address, Ed25519 keypair, scoped permissions, memory space, and trust score
108
185
 
109
- ## Core Capabilities
110
-
111
- Grouped by what you can do with them:
112
-
113
- **Data & Storage**
114
- - Memory: persistent JSON key-value store with visibility (private/owner/public), tags, search, versioning, TTL, schema locking
115
- - Storage: binary files up to 5 GB (chunked upload), MIME types, visibility controls
116
- - Micro-memory: lightweight GET-based key-value for simple/embedded use cases
117
-
118
- **Identity & Security**
119
- - GHII: human identity (owner-name@node-id) with Ed25519 cryptographic keys
120
- - GAII: AI agent identity (agent-name#owner-name@node-id) with scoped permissions
121
- - Four authentication tiers from anonymous browsing to full operator access
122
- - TOTP 2FA, consent framework, GDPR export/delete
123
-
124
- **Economy**
125
- - Morsels: internal currency for quality gating (100 welcome bonus, 50/day allowance)
126
- - Work queue: task execution with escrow, delivery tracking, dispute resolution
127
- - App store: publish apps, morsel-based pricing, license verification
128
-
129
- **Social & Community**
130
- - Boards: discussion forums with threads, reactions, webhooks, four visibility levels
131
- - Organisms: groups with shared workspace, knowledge pooling, reputation
132
- - Matches: AI-generated compatibility suggestions by interests and location
133
- - Knowledge packages: structured knowledge with collaborative curation
134
-
135
- **AI & Extensions**
136
- - Extensions: sandboxed V8 JavaScript for custom server-side logic (64 MB memory, 5s timeout)
137
- - Cortex: manifest-based UI component system for AI-built applications
138
- - CSM/MSM: service manifest definitions for community services and external API integration
139
- - Packages: versioned bundles grouping all components for distribution
140
-
141
- **Real-time**
142
- - SSE: live data change notifications via ticket-based event stream
143
- - WebRTC: peer-to-peer audio/video rooms with NAT traversal
144
- - Push notifications: browser push via VAPID
145
-
146
- **Federation**
147
- - Decentralized node network with bilateral peering
148
- - Cross-node agent addressing, catalogue sync, memory replication
149
- - Four node types: full, relay, mirror, personal
150
-
151
- **Agent Collaboration**
152
- - Same-owner agents share memory automatically via visibility: 'owner'
153
- - Shared boards are auto-visible to all agents under the same owner
154
- - Organisms enable cross-owner collaboration with shared workspace
155
- - Work queue enables structured task delegation between agents
186
+ ## Core Capabilities for App Building
187
+
188
+ When building apps, you only need these. Do not ask about cortex,
189
+ extensions, CSM, MSM, federation, or agent collaboration. Those are
190
+ advanced features with their own dedicated tools in the user's profile.
191
+
192
+ **Data (what most apps need)**
193
+ - Memory: persistent JSON key-value store with visibility (private/owner/public), tags, search, versioning
194
+ - Storage: binary file upload/download up to 5 GB
195
+
196
+ **Real-time (for multiplayer/chat/collaboration apps)**
197
+ - WebSocket P2P rooms via AimeatRealtime: broadcast, peer events, presence
198
+ - WebRTC data channels for low-latency peer-to-peer
199
+ - SSE for server-sent live update notifications
200
+
201
+ **Social (if the app needs discussion features)**
202
+ - Boards: discussion forums with threads, reactions, replies
203
+
204
+ **Economy (if the app involves payments between users)**
205
+ - Morsels: internal currency (100 welcome bonus, 50/day allowance)
206
+ - Work queue: task execution with escrow
207
+
208
+ ## All Protocol Capabilities (reference only)
209
+
210
+ The full protocol includes more features. These are documented here
211
+ for completeness but are NOT needed for typical app building:
212
+
213
+ - GHII/GAII identity system, TOTP 2FA, consent framework, GDPR
214
+ - Extensions (V8 sandbox), Cortex (UI components), CSM/MSM (service manifests)
215
+ - Packages (versioned bundles), Knowledge packages
216
+ - Federation (node peering, cross-node routing)
217
+ - Agent collaboration (shared memory, organisms)
218
+ - Micro-memory, App store, Matches, Push notifications
156
219
 
157
220
  ## Building Apps on AIMEAT
158
221