aimeat 1.25.0 → 1.26.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 (252) hide show
  1. package/README.md +8 -1
  2. package/dist/locales/en.json +144 -0
  3. package/dist/locales/fi.json +144 -0
  4. package/dist/public/components/ImageDeliverable.js +2 -1
  5. package/dist/public/components/Modal.js +3 -2
  6. package/dist/public/components/NotificationBell.js +2 -1
  7. package/dist/public/components/PresenceDot.js +53 -0
  8. package/dist/public/css/components/markdown.css +67 -0
  9. package/dist/public/css/theme.css +30 -0
  10. package/dist/public/css/views/notebook.css +195 -0
  11. package/dist/public/css/views/profile.css +15 -0
  12. package/dist/public/js/api.js +5 -3
  13. package/dist/public/js/components/auth-image.js +3 -2
  14. package/dist/public/js/components/tag-cloud.js +1 -1
  15. package/dist/public/js/components/tag-editor.js +1 -1
  16. package/dist/public/js/hooks.js +1 -2
  17. package/dist/public/js/presence-store.js +97 -0
  18. package/dist/public/js/services/admin.js +14 -5
  19. package/dist/public/js/services/boards.js +1 -1
  20. package/dist/public/js/services/ecosystem.js +1 -1
  21. package/dist/public/js/services/foundry-prompts-base.js +2 -2
  22. package/dist/public/js/services/foundry-smoke.js +2 -1
  23. package/dist/public/js/services/foundry-validate.js +6 -8
  24. package/dist/public/js/services/foundry.js +4 -3
  25. package/dist/public/js/services/generator-prompts-base.js +2 -2
  26. package/dist/public/js/services/generator-smoke.js +2 -1
  27. package/dist/public/js/services/generator-validate.js +5 -7
  28. package/dist/public/js/services/generator.js +2 -1
  29. package/dist/public/js/services/memory.js +13 -0
  30. package/dist/public/js/services/messages.js +2 -1
  31. package/dist/public/js/services/notebook.js +124 -0
  32. package/dist/public/js/services/packages.js +3 -2
  33. package/dist/public/js/services/presence.js +35 -0
  34. package/dist/public/js/style-testbed.js +6 -5
  35. package/dist/public/lib/minidenticons.min.js +1 -0
  36. package/dist/public/lib/yaml.mjs +1 -0
  37. package/dist/public/spa.html +90 -8
  38. package/dist/public/types/aimeat-globals.d.ts +52 -0
  39. package/dist/public/types/vendored-libs.d.ts +56 -0
  40. package/dist/public/views/_template.js +3 -1
  41. package/dist/public/views/admin/agent-integration-tab.js +4 -3
  42. package/dist/public/views/admin/agents-tab.js +3 -2
  43. package/dist/public/views/admin/config-tab.js +4 -3
  44. package/dist/public/views/admin/economy-tab.js +4 -3
  45. package/dist/public/views/admin/federation-tab.js +138 -1
  46. package/dist/public/views/admin/maintenance-tab.js +1 -1
  47. package/dist/public/views/admin/messages-tab.js +115 -0
  48. package/dist/public/views/admin/overview-tab.js +4 -3
  49. package/dist/public/views/admin/portal-tab.js +90 -2
  50. package/dist/public/views/admin/push-tab.js +8 -6
  51. package/dist/public/views/admin/security-tab.js +7 -7
  52. package/dist/public/views/admin.js +29 -9
  53. package/dist/public/views/doc-solo.js +3 -1
  54. package/dist/public/views/guides.js +8 -4
  55. package/dist/public/views/hobbies.js +4 -2
  56. package/dist/public/views/marketplace.js +10 -9
  57. package/dist/public/views/openclaw.js +1 -1
  58. package/dist/public/views/portal-dev.js +5 -2
  59. package/dist/public/views/portal.js +3 -2
  60. package/dist/public/views/profile/agents/shared-board.js +4 -2
  61. package/dist/public/views/profile/agents/tab-messages.js +13 -11
  62. package/dist/public/views/profile/agents-messages-subtab.js +2 -1
  63. package/dist/public/views/profile/apps-tab.js +2 -1
  64. package/dist/public/views/profile/boards-tab.js +3 -2
  65. package/dist/public/views/profile/calibrator-batch.js +3 -2
  66. package/dist/public/views/profile/data-wallet-tab.js +2 -1
  67. package/dist/public/views/profile/extensions-tab.js +4 -3
  68. package/dist/public/views/profile/federation-tab.js +4 -0
  69. package/dist/public/views/profile/foundry-dashboard/use-autopilot.js +3 -2
  70. package/dist/public/views/profile/foundry-detail.js +1 -1
  71. package/dist/public/views/profile/generator-detail.js +1 -1
  72. package/dist/public/views/profile/inbox-tab.js +7 -3
  73. package/dist/public/views/profile/inline-panels.js +3 -1
  74. package/dist/public/views/profile/knowledge-tab.js +2 -1
  75. package/dist/public/views/profile/landing-page.js +88 -0
  76. package/dist/public/views/profile/memory-tab.js +6 -5
  77. package/dist/public/views/profile/notebook-tab.js +500 -0
  78. package/dist/public/views/profile/organisms/activity-panel.js +135 -0
  79. package/dist/public/views/profile/organisms/agents.js +141 -0
  80. package/dist/public/views/profile/organisms/document.js +274 -0
  81. package/dist/public/views/profile/organisms/helpers.js +61 -0
  82. package/dist/public/views/profile/organisms/home.js +315 -0
  83. package/dist/public/views/profile/organisms/members.js +220 -0
  84. package/dist/public/views/profile/organisms/panels.js +173 -0
  85. package/dist/public/views/profile/organisms/participants-panel.js +160 -0
  86. package/dist/public/views/profile/organisms/schema-form.js +127 -0
  87. package/dist/public/views/profile/organisms/sources-panel.js +164 -0
  88. package/dist/public/views/profile/organisms/widgets.js +58 -0
  89. package/dist/public/views/profile/organisms/workspace-comments.js +99 -0
  90. package/dist/public/views/profile/organisms/workspace-list.js +268 -0
  91. package/dist/public/views/profile/organisms/workspace.js +1272 -0
  92. package/dist/public/views/profile/organisms-tab.js +456 -3819
  93. package/dist/public/views/profile/shared.js +64 -2
  94. package/dist/public/views/profile/workflows-form.js +1 -1
  95. package/dist/public/views/profile.js +16 -14
  96. package/dist/public/views/public-knowledge-viewer.js +3 -2
  97. package/dist/public/views/public-workspace-viewer.js +2 -1
  98. package/dist/scripts/check-importmap.d.ts +2 -0
  99. package/dist/scripts/check-importmap.d.ts.map +1 -0
  100. package/dist/scripts/check-importmap.js +102 -0
  101. package/dist/scripts/check-importmap.js.map +1 -0
  102. package/dist/src/cli/scaffold.d.ts +26 -3
  103. package/dist/src/cli/scaffold.d.ts.map +1 -1
  104. package/dist/src/cli/scaffold.js +33 -3
  105. package/dist/src/cli/scaffold.js.map +1 -1
  106. package/dist/src/config.d.ts +10 -0
  107. package/dist/src/config.d.ts.map +1 -1
  108. package/dist/src/config.js +5 -0
  109. package/dist/src/config.js.map +1 -1
  110. package/dist/src/generated/api-types.d.ts +927 -11
  111. package/dist/src/generated/api-types.d.ts.map +1 -1
  112. package/dist/src/generated/prisma-postgres/edge.js +32 -6
  113. package/dist/src/generated/prisma-postgres/index-browser.js +29 -3
  114. package/dist/src/generated/prisma-postgres/index.d.ts +1970 -160
  115. package/dist/src/generated/prisma-postgres/index.js +32 -6
  116. package/dist/src/generated/prisma-postgres/package.json +1 -1
  117. package/dist/src/generated/prisma-postgres/schema.prisma +45 -12
  118. package/dist/src/generated/prisma-postgres/wasm.js +32 -6
  119. package/dist/src/index.js +36 -4
  120. package/dist/src/index.js.map +1 -1
  121. package/dist/src/routes/admin-monitoring.d.ts.map +1 -1
  122. package/dist/src/routes/admin-monitoring.js +8 -0
  123. package/dist/src/routes/admin-monitoring.js.map +1 -1
  124. package/dist/src/routes/federation-peer.d.ts.map +1 -1
  125. package/dist/src/routes/federation-peer.js +327 -43
  126. package/dist/src/routes/federation-peer.js.map +1 -1
  127. package/dist/src/routes/federation-sync.d.ts +2 -0
  128. package/dist/src/routes/federation-sync.d.ts.map +1 -1
  129. package/dist/src/routes/federation-sync.js +20 -1
  130. package/dist/src/routes/federation-sync.js.map +1 -1
  131. package/dist/src/routes/librarian.d.ts +18 -0
  132. package/dist/src/routes/librarian.d.ts.map +1 -0
  133. package/dist/src/routes/librarian.js +88 -0
  134. package/dist/src/routes/librarian.js.map +1 -0
  135. package/dist/src/routes/messages.d.ts.map +1 -1
  136. package/dist/src/routes/messages.js +2 -1
  137. package/dist/src/routes/messages.js.map +1 -1
  138. package/dist/src/routes/portal.d.ts.map +1 -1
  139. package/dist/src/routes/portal.js +9 -1
  140. package/dist/src/routes/portal.js.map +1 -1
  141. package/dist/src/routes/presence.d.ts +23 -0
  142. package/dist/src/routes/presence.d.ts.map +1 -0
  143. package/dist/src/routes/presence.js +88 -0
  144. package/dist/src/routes/presence.js.map +1 -0
  145. package/dist/src/routes/site.d.ts +12 -0
  146. package/dist/src/routes/site.d.ts.map +1 -1
  147. package/dist/src/routes/site.js +45 -1
  148. package/dist/src/routes/site.js.map +1 -1
  149. package/dist/src/routes/sse.d.ts +2 -0
  150. package/dist/src/routes/sse.d.ts.map +1 -1
  151. package/dist/src/routes/sse.js +9 -0
  152. package/dist/src/routes/sse.js.map +1 -1
  153. package/dist/src/routes/wellknown.d.ts.map +1 -1
  154. package/dist/src/routes/wellknown.js +5 -0
  155. package/dist/src/routes/wellknown.js.map +1 -1
  156. package/dist/src/routes/work.d.ts.map +1 -1
  157. package/dist/src/routes/work.js +6 -0
  158. package/dist/src/routes/work.js.map +1 -1
  159. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  160. package/dist/src/server-bootstrap/routes-loader.js +13 -0
  161. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  162. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  163. package/dist/src/server-bootstrap/service-init.js +34 -0
  164. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  165. package/dist/src/services/config-schema.d.ts.map +1 -1
  166. package/dist/src/services/config-schema.js +2 -0
  167. package/dist/src/services/config-schema.js.map +1 -1
  168. package/dist/src/services/federation-availability.d.ts +28 -0
  169. package/dist/src/services/federation-availability.d.ts.map +1 -0
  170. package/dist/src/services/federation-availability.js +58 -0
  171. package/dist/src/services/federation-availability.js.map +1 -0
  172. package/dist/src/services/federation-book.d.ts +70 -0
  173. package/dist/src/services/federation-book.d.ts.map +1 -0
  174. package/dist/src/services/federation-book.js +198 -0
  175. package/dist/src/services/federation-book.js.map +1 -0
  176. package/dist/src/services/federation-tiers.d.ts +45 -0
  177. package/dist/src/services/federation-tiers.d.ts.map +1 -0
  178. package/dist/src/services/federation-tiers.js +58 -0
  179. package/dist/src/services/federation-tiers.js.map +1 -0
  180. package/dist/src/services/federation.d.ts +15 -0
  181. package/dist/src/services/federation.d.ts.map +1 -1
  182. package/dist/src/services/federation.js +12 -0
  183. package/dist/src/services/federation.js.map +1 -1
  184. package/dist/src/services/librarian.d.ts +62 -0
  185. package/dist/src/services/librarian.d.ts.map +1 -0
  186. package/dist/src/services/librarian.js +135 -0
  187. package/dist/src/services/librarian.js.map +1 -0
  188. package/dist/src/services/message-delivery.d.ts +3 -1
  189. package/dist/src/services/message-delivery.d.ts.map +1 -1
  190. package/dist/src/services/message-delivery.js +23 -2
  191. package/dist/src/services/message-delivery.js.map +1 -1
  192. package/dist/src/services/network-policy.d.ts +88 -0
  193. package/dist/src/services/network-policy.d.ts.map +1 -0
  194. package/dist/src/services/network-policy.js +154 -0
  195. package/dist/src/services/network-policy.js.map +1 -0
  196. package/dist/src/services/notebook-classify-prompt.d.ts +15 -0
  197. package/dist/src/services/notebook-classify-prompt.d.ts.map +1 -0
  198. package/dist/src/services/notebook-classify-prompt.js +39 -0
  199. package/dist/src/services/notebook-classify-prompt.js.map +1 -0
  200. package/dist/src/services/notebook-classify.d.ts +80 -0
  201. package/dist/src/services/notebook-classify.d.ts.map +1 -0
  202. package/dist/src/services/notebook-classify.js +150 -0
  203. package/dist/src/services/notebook-classify.js.map +1 -0
  204. package/dist/src/services/presence.d.ts +108 -0
  205. package/dist/src/services/presence.d.ts.map +1 -0
  206. package/dist/src/services/presence.js +304 -0
  207. package/dist/src/services/presence.js.map +1 -0
  208. package/dist/src/services/prompt-defaults.d.ts.map +1 -1
  209. package/dist/src/services/prompt-defaults.js +13 -0
  210. package/dist/src/services/prompt-defaults.js.map +1 -1
  211. package/dist/src/services/site.d.ts +20 -0
  212. package/dist/src/services/site.d.ts.map +1 -1
  213. package/dist/src/services/site.js +70 -0
  214. package/dist/src/services/site.js.map +1 -1
  215. package/dist/src/storage/interface.d.ts +48 -0
  216. package/dist/src/storage/interface.d.ts.map +1 -1
  217. package/dist/src/storage/interface.js.map +1 -1
  218. package/dist/src/storage/providers/mongodb/index.d.ts +11 -1
  219. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  220. package/dist/src/storage/providers/mongodb/index.js +128 -2
  221. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  222. package/dist/src/storage/providers/sqlite/index.d.ts +7 -1
  223. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  224. package/dist/src/storage/providers/sqlite/index.js +27 -2
  225. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  226. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts +5 -1
  227. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts.map +1 -1
  228. package/dist/src/storage/providers/sqlite/repos/direct-message.js +48 -0
  229. package/dist/src/storage/providers/sqlite/repos/direct-message.js.map +1 -1
  230. package/dist/src/storage/providers/sqlite/repos/memory.d.ts +2 -0
  231. package/dist/src/storage/providers/sqlite/repos/memory.d.ts.map +1 -1
  232. package/dist/src/storage/providers/sqlite/repos/memory.js +55 -0
  233. package/dist/src/storage/providers/sqlite/repos/memory.js.map +1 -1
  234. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  235. package/dist/src/storage/providers/sqlite/schema.js +61 -0
  236. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  237. package/dist/src/storage/repositories/direct-message.repository.d.ts +5 -1
  238. package/dist/src/storage/repositories/direct-message.repository.d.ts.map +1 -1
  239. package/dist/src/storage/repositories/memory.repository.d.ts +25 -0
  240. package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
  241. package/dist/src/utils/node-descriptor.d.ts +34 -0
  242. package/dist/src/utils/node-descriptor.d.ts.map +1 -0
  243. package/dist/src/utils/node-descriptor.js +42 -0
  244. package/dist/src/utils/node-descriptor.js.map +1 -0
  245. package/dist/src/utils/version.d.ts +3 -0
  246. package/dist/src/utils/version.d.ts.map +1 -0
  247. package/dist/src/utils/version.js +40 -0
  248. package/dist/src/utils/version.js.map +1 -0
  249. package/dist/static/app-catalog.html +643 -4
  250. package/package.json +5 -2
  251. package/prisma/schema.postgres.prisma +51 -18
  252. package/prisma/schema.prisma +29 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aimeat",
3
- "version": "1.25.0",
3
+ "version": "1.26.0",
4
4
  "description": "AIME AT - AI Memory Exchange and Action Transfer - reference implementation",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -87,6 +87,7 @@
87
87
  "@types/yauzl": "^3.3.0",
88
88
  "@vitest/coverage-v8": "^4.1.8",
89
89
  "eslint": "^10.5.0",
90
+ "eslint-plugin-react-hooks": "^7.1.1",
90
91
  "openapi-typescript": "^7.8.0",
91
92
  "prisma": "^6.9.0",
92
93
  "tsx": "^4.22.4",
@@ -162,8 +163,10 @@
162
163
  "test:e2e:all-backends": "node --env-file=.env.test.sqlite --import tsx test/run-e2e-ci.ts --all && node --env-file=.env.test.mongodb --import tsx test/run-e2e-ci.ts --all && node --env-file=.env.test.postgres --import tsx test/run-e2e-ci.ts --all",
163
164
  "test:e2e:ci": "node --import tsx test/run-e2e-ci.ts --all",
164
165
  "test:e2e:ci:filter": "node --import tsx test/run-e2e-ci.ts",
165
- "lint": "eslint src/",
166
+ "lint": "eslint src/ public/",
166
167
  "typecheck": "tsc --noEmit",
168
+ "typecheck:frontend": "tsc --noEmit -p tsconfig.frontend.json",
169
+ "check:importmap": "tsx scripts/check-importmap.ts",
167
170
  "generate:types": "openapi-typescript ../openapi.yaml -o src/generated/api-types.ts",
168
171
  "db:generate": "prisma generate",
169
172
  "db:generate:postgres": "prisma generate --schema prisma/schema.postgres.prisma",
@@ -1,20 +1,20 @@
1
- // AIMEAT — PostgreSQL Prisma schema (GENERATED — do not edit by hand).
2
- // Source of truth: prisma/schema.prisma (MongoDB). Regenerate with:
3
- // node scripts/gen-postgres-schema.mjs
4
- // MIRROR NOTE: models & fields are identical to schema.prisma; only the id
5
- // strategy (cuid() vs ObjectId) and the generator/datasource blocks differ.
6
-
7
- generator client {
8
- provider = "prisma-client-js"
9
- output = "../src/generated/prisma-postgres"
10
- }
11
-
12
- datasource db {
13
- provider = "postgresql"
14
- url = env("DATABASE_URL")
15
- }
16
-
17
-
1
+ // AIMEAT — PostgreSQL Prisma schema (GENERATED — do not edit by hand).
2
+ // Source of truth: prisma/schema.prisma (MongoDB). Regenerate with:
3
+ // node scripts/gen-postgres-schema.mjs
4
+ // MIRROR NOTE: models & fields are identical to schema.prisma; only the id
5
+ // strategy (cuid() vs ObjectId) and the generator/datasource blocks differ.
6
+
7
+ generator client {
8
+ provider = "prisma-client-js"
9
+ output = "../src/generated/prisma-postgres"
10
+ }
11
+
12
+ datasource db {
13
+ provider = "postgresql"
14
+ url = env("DATABASE_URL")
15
+ }
16
+
17
+
18
18
 
19
19
  model Owner {
20
20
  id String @id @default(cuid())
@@ -77,6 +77,11 @@ model Memory {
77
77
  flagCount Int @default(0)
78
78
  allowedOrigins String[]
79
79
  groupId String?
80
+ // Flattened searchable text (key + string leaves of value + tags), maintained on every write.
81
+ // A MongoDB `$text` index on this field is created at startup (see MongoStorage.init) — Tier-1
82
+ // librarian full-text search. SQLite indexes the value directly via FTS5, so this field is
83
+ // MongoDB/Postgres-only. See docs/internal/design-organism-notebook-and-librarian.md §4.
84
+ searchBlob String?
80
85
  createdAt DateTime @default(now())
81
86
  updatedAt DateTime @updatedAt
82
87
 
@@ -784,6 +789,15 @@ model FederationPeer {
784
789
  peerMode String @default("federation")
785
790
  allowFederatedAuth Boolean @default(false)
786
791
  federationAuthScopes String[] @default([])
792
+ tier String @default("member")
793
+ availability String?
794
+ expiresAt DateTime?
795
+ heartbeatOk Int @default(0)
796
+ heartbeatTotal Int @default(0)
797
+ availabilityWindow String?
798
+ availabilityPct Int?
799
+ softwareVersion String?
800
+ nodeCardHash String?
787
801
 
788
802
  @@index([status])
789
803
  }
@@ -1063,7 +1077,8 @@ model DeviceAuth {
1063
1077
  mode String?
1064
1078
  }
1065
1079
 
1066
- // Ecosystem application (GEAI) principal — mirror of Agent, minus task/agent-only fields.
1080
+ // Ecosystem application (GEAI) principal — mirror of Agent, minus task/agent-only fields,
1081
+ // plus the ecosystem binding fields (app, boundRef, dataAreas, status).
1067
1082
  model EcosystemApp {
1068
1083
  id String @id @default(cuid())
1069
1084
  geai String @unique
@@ -1079,6 +1094,7 @@ model EcosystemApp {
1079
1094
  morselBalance Int @default(0)
1080
1095
  capabilities Json?
1081
1096
  automation Json?
1097
+ setup Json?
1082
1098
  createdAt DateTime @default(now())
1083
1099
  lastSeen DateTime @default(now())
1084
1100
 
@@ -1107,6 +1123,7 @@ model EcoAuth {
1107
1123
  validationResult Json?
1108
1124
  capabilities Json?
1109
1125
  automation Json?
1126
+ setup Json?
1110
1127
  appCredentials Json?
1111
1128
  }
1112
1129
 
@@ -1406,6 +1423,7 @@ model AgentTask {
1406
1423
  deliverableKey String?
1407
1424
  rating Json?
1408
1425
  triage String?
1426
+ automation Json?
1409
1427
 
1410
1428
  @@index([agentGaii, status])
1411
1429
  @@index([ownerGaii])
@@ -1578,3 +1596,18 @@ model ContactConsent {
1578
1596
 
1579
1597
  @@index([ownerGhii, state])
1580
1598
  }
1599
+
1600
+ model MessageDeliveryLog {
1601
+ id String @id
1602
+ messageId String
1603
+ origin String
1604
+ targetNodeId String
1605
+ status String
1606
+ httpStatus Int?
1607
+ errorMessage String?
1608
+ latencyMs Int @default(0)
1609
+ createdAt DateTime @default(now())
1610
+
1611
+ @@index([createdAt])
1612
+ @@index([status])
1613
+ }
@@ -75,6 +75,11 @@ model Memory {
75
75
  flagCount Int @default(0)
76
76
  allowedOrigins String[]
77
77
  groupId String?
78
+ // Flattened searchable text (key + string leaves of value + tags), maintained on every write.
79
+ // A MongoDB `$text` index on this field is created at startup (see MongoStorage.init) — Tier-1
80
+ // librarian full-text search. SQLite indexes the value directly via FTS5, so this field is
81
+ // MongoDB/Postgres-only. See docs/internal/design-organism-notebook-and-librarian.md §4.
82
+ searchBlob String?
78
83
  createdAt DateTime @default(now())
79
84
  updatedAt DateTime @updatedAt
80
85
 
@@ -782,6 +787,15 @@ model FederationPeer {
782
787
  peerMode String @default("federation")
783
788
  allowFederatedAuth Boolean @default(false)
784
789
  federationAuthScopes String[] @default([])
790
+ tier String @default("member")
791
+ availability String?
792
+ expiresAt DateTime?
793
+ heartbeatOk Int @default(0)
794
+ heartbeatTotal Int @default(0)
795
+ availabilityWindow String?
796
+ availabilityPct Int?
797
+ softwareVersion String?
798
+ nodeCardHash String?
785
799
 
786
800
  @@index([status])
787
801
  }
@@ -1580,3 +1594,18 @@ model ContactConsent {
1580
1594
 
1581
1595
  @@index([ownerGhii, state])
1582
1596
  }
1597
+
1598
+ model MessageDeliveryLog {
1599
+ id String @id @map("_id")
1600
+ messageId String
1601
+ origin String
1602
+ targetNodeId String
1603
+ status String
1604
+ httpStatus Int?
1605
+ errorMessage String?
1606
+ latencyMs Int @default(0)
1607
+ createdAt DateTime @default(now())
1608
+
1609
+ @@index([createdAt])
1610
+ @@index([status])
1611
+ }