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
@@ -0,0 +1,70 @@
1
+ import type { AimeatConfig } from '../config.js';
2
+ import type { Storage } from '../storage/interface.js';
3
+ import type { PeerInfo } from './federation.js';
4
+ export declare const FEDERATION_BOOK_GAII = "__federation_book__";
5
+ export declare const FEDERATION_BOOK_KEY = "federation-book.active";
6
+ export interface NodeCardOperator {
7
+ ghii: string;
8
+ display_name: string;
9
+ avatar: string | null;
10
+ }
11
+ export interface NodeCardResources {
12
+ actions: number;
13
+ agents: number;
14
+ boards: number;
15
+ csms: number;
16
+ highlights: string[];
17
+ }
18
+ export interface NodeCard {
19
+ node_id: string;
20
+ url: string;
21
+ listed: boolean;
22
+ software_version?: string;
23
+ node_type?: string;
24
+ capabilities?: string[];
25
+ settings?: Record<string, unknown>;
26
+ operators?: NodeCardOperator[];
27
+ resources?: NodeCardResources;
28
+ node_card_hash?: string;
29
+ computed_at?: string;
30
+ }
31
+ export interface FederationBook {
32
+ book_version: number;
33
+ issued_by: string;
34
+ issued_at: string;
35
+ signature?: string;
36
+ nodes: NodeCard[];
37
+ }
38
+ /** Canonical string the primary signs (and leaves verify) for a book — excludes `signature`. */
39
+ export declare function bookSignString(book: FederationBook): string;
40
+ /**
41
+ * Build THIS node's card. When the node opts out of listing (config.federationBookListed=false)
42
+ * the card carries only `{ node_id, url, listed:false }` — no operator identities.
43
+ */
44
+ export declare function buildNodeCard(config: AimeatConfig, storage: Storage): Promise<NodeCard>;
45
+ /** Read the active book from storage (no module cache — safe across in-process node instances). */
46
+ export declare function getActiveBook(storage: Storage): Promise<FederationBook | null>;
47
+ export declare function storeActiveBook(storage: Storage, book: FederationBook): Promise<void>;
48
+ /**
49
+ * PRIMARY: assemble the book from active federation peers' node-cards + this node's own card,
50
+ * sign it, and store it. Bumps book_version only when the node set actually changed (so leaves
51
+ * don't re-pull unchanged books). Returns the stored book (or the unchanged current one).
52
+ */
53
+ export declare function assembleBook(config: AimeatConfig, storage: Storage, peers: Map<string, PeerInfo>): Promise<FederationBook>;
54
+ export interface BookPullResult {
55
+ ok: boolean;
56
+ status: number;
57
+ code?: string;
58
+ message?: string;
59
+ applied?: boolean;
60
+ reason?: string;
61
+ book_version?: number;
62
+ nodes?: number;
63
+ }
64
+ /**
65
+ * LEAF: fetch the book from a source (genesis), verify its signature against the issuing peer's
66
+ * known key (peer record or key cache), version-gate, and store. Shared by the operator pull
67
+ * endpoint and the leaf auto-sync timer.
68
+ */
69
+ export declare function pullBook(config: AimeatConfig, storage: Storage, peers: Map<string, PeerInfo>, sourceUrl?: string): Promise<BookPullResult>;
70
+ //# sourceMappingURL=federation-book.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-book.d.ts","sourceRoot":"","sources":["../../../src/services/federation-book.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAQhD,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAC1D,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAC/F,MAAM,WAAW,iBAAiB;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE;AAE1H,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAG3D;AAMD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4C7F;AAED,mGAAmG;AACnG,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAMpF;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3F;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAsChI;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6BhJ"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * @file federation-book.ts
3
+ * @description The "federation book" — a phone-book of the federation: per node, its operator
4
+ * GHIIs, the resources it offers (counts + a few highlights), its AIMEAT version, and curated
5
+ * behaviour settings. The PRIMARY (genesis/anchor — a node with no genesisUrl) assembles the book
6
+ * from its peers' node-cards + its own, signs it, and serves it; leaf nodes pull + verify + cache
7
+ * + serve it, so EVERY node shows the full federation (not just its direct peers).
8
+ *
9
+ * Reuses the signed-doc pattern from network-policy.ts: read straight from storage (no module
10
+ * cache → safe for multiple node instances in one test process); sign/verify with the node key.
11
+ * @structure
12
+ * - NodeCard / FederationBook types
13
+ * - buildNodeCard(config, storage) — this node's card (or { listed:false } when opted out)
14
+ * - bookSignString() · getActiveBook() · storeActiveBook()
15
+ * - assembleBook(config, storage, peers) — primary: fetch peer cards + own → sign → store
16
+ * @usage import { buildNodeCard, assembleBook, getActiveBook } from './federation-book.js';
17
+ * @version-history
18
+ * v1.0.0 — 2026-06-19 — Initial federation book (node-card + primary assembly + signed doc).
19
+ */
20
+ import { createHash } from 'node:crypto';
21
+ import { buildNodeDescriptor } from '../utils/node-descriptor.js';
22
+ import { computeServiceSummary } from '../utils/service-summary.js';
23
+ import { validateOutboundUrl } from '../utils/url-validator.js';
24
+ import { sign, verify } from '../auth/keypair.js';
25
+ import { peerKeyCache } from './federation-helpers.js';
26
+ import { logger } from '../utils/logger.js';
27
+ export const FEDERATION_BOOK_GAII = '__federation_book__';
28
+ export const FEDERATION_BOOK_KEY = 'federation-book.active';
29
+ /** Canonical string the primary signs (and leaves verify) for a book — excludes `signature`. */
30
+ export function bookSignString(book) {
31
+ const { signature: _sig, ...rest } = book;
32
+ return JSON.stringify(rest);
33
+ }
34
+ function sha256(s) {
35
+ return createHash('sha256').update(s).digest('hex');
36
+ }
37
+ /**
38
+ * Build THIS node's card. When the node opts out of listing (config.federationBookListed=false)
39
+ * the card carries only `{ node_id, url, listed:false }` — no operator identities.
40
+ */
41
+ export async function buildNodeCard(config, storage) {
42
+ if (!config.federationBookListed) {
43
+ return { node_id: config.nodeId, url: config.baseUrl, listed: false };
44
+ }
45
+ const desc = buildNodeDescriptor(config);
46
+ const operators = [];
47
+ try {
48
+ for (const o of await storage.listOwners()) {
49
+ if (o.name === 'anonymous' || !o.roles?.includes('operator'))
50
+ continue;
51
+ const ghii = await storage.getGHIIByOwner(o.name).catch(() => null);
52
+ operators.push({
53
+ ghii: ghii?.ghii ?? `${o.name}@${config.nodeId}`,
54
+ display_name: ghii?.displayName ?? o.displayName ?? o.name,
55
+ avatar: ghii?.avatar ?? null,
56
+ });
57
+ }
58
+ }
59
+ catch { /* operators best-effort */ }
60
+ let resources = { actions: 0, agents: 0, boards: 0, csms: 0, highlights: [] };
61
+ try {
62
+ const s = await computeServiceSummary(config, storage);
63
+ const highlights = [
64
+ ...(s.actions ?? []).slice(0, 3).map(a => a.displayName),
65
+ ...(s.csms ?? []).slice(0, 2).map(c => c.name),
66
+ ].filter(Boolean).slice(0, 5);
67
+ resources = { actions: s.actions?.length ?? 0, agents: s.agents?.length ?? 0, boards: s.boards?.length ?? 0, csms: s.csms?.length ?? 0, highlights };
68
+ }
69
+ catch { /* resources best-effort */ }
70
+ const card = {
71
+ node_id: config.nodeId,
72
+ url: config.baseUrl,
73
+ listed: true,
74
+ software_version: desc.software_version,
75
+ node_type: desc.node_type,
76
+ capabilities: desc.capabilities,
77
+ settings: desc.settings,
78
+ operators,
79
+ resources,
80
+ computed_at: new Date().toISOString(),
81
+ };
82
+ const { node_card_hash: _h, computed_at: _c, ...stable } = card;
83
+ card.node_card_hash = sha256(JSON.stringify(stable));
84
+ return card;
85
+ }
86
+ /** Read the active book from storage (no module cache — safe across in-process node instances). */
87
+ export async function getActiveBook(storage) {
88
+ try {
89
+ const rec = await storage.getMemory(FEDERATION_BOOK_GAII, FEDERATION_BOOK_KEY);
90
+ if (rec)
91
+ return rec.value;
92
+ }
93
+ catch { /* none */ }
94
+ return null;
95
+ }
96
+ export async function storeActiveBook(storage, book) {
97
+ const now = new Date().toISOString();
98
+ const existing = await storage.getMemory(FEDERATION_BOOK_GAII, FEDERATION_BOOK_KEY).catch(() => null);
99
+ await storage.setMemory({
100
+ key: FEDERATION_BOOK_KEY,
101
+ ownerGaii: FEDERATION_BOOK_GAII,
102
+ value: book,
103
+ visibility: 'public',
104
+ tags: ['federation', 'federation-book'],
105
+ ttlHours: null,
106
+ version: (existing?.version ?? 0) + 1,
107
+ createdAt: existing?.createdAt ?? now,
108
+ updatedAt: now,
109
+ });
110
+ }
111
+ /**
112
+ * PRIMARY: assemble the book from active federation peers' node-cards + this node's own card,
113
+ * sign it, and store it. Bumps book_version only when the node set actually changed (so leaves
114
+ * don't re-pull unchanged books). Returns the stored book (or the unchanged current one).
115
+ */
116
+ export async function assembleBook(config, storage, peers) {
117
+ const nodes = [];
118
+ const self = await buildNodeCard(config, storage);
119
+ if (self.listed)
120
+ nodes.push(self);
121
+ const active = [...peers.values()].filter(p => p.status === 'active' && p.peerMode !== 'private');
122
+ for (const peer of active) {
123
+ try {
124
+ const check = await validateOutboundUrl(peer.url);
125
+ if (!check.valid)
126
+ continue;
127
+ const resp = await fetch(`${peer.url}/v1/federation/node-card`, { signal: AbortSignal.timeout(config.federationTimeoutMs ?? 5_000) });
128
+ if (!resp.ok)
129
+ continue;
130
+ const body = await resp.json();
131
+ const card = body?.data;
132
+ if (card && card.listed) {
133
+ nodes.push(card);
134
+ const p = peers.get(peer.nodeId);
135
+ if (p && card.node_card_hash)
136
+ p.nodeCardHash = card.node_card_hash;
137
+ }
138
+ }
139
+ catch { /* skip unreachable peer */ }
140
+ }
141
+ nodes.sort((a, b) => a.node_id.localeCompare(b.node_id));
142
+ const current = await getActiveBook(storage);
143
+ const contentChanged = !current || JSON.stringify(current.nodes) !== JSON.stringify(nodes);
144
+ if (!contentChanged)
145
+ return current;
146
+ const book = {
147
+ book_version: (current?.book_version ?? 0) + 1,
148
+ issued_by: config.nodeId,
149
+ issued_at: new Date().toISOString(),
150
+ nodes,
151
+ };
152
+ const nodeKey = await storage.getNodeKey();
153
+ if (nodeKey)
154
+ book.signature = await sign(nodeKey.privateKey, bookSignString(book));
155
+ await storeActiveBook(storage, book);
156
+ logger.info('Federation book assembled', { nodes: nodes.length, version: book.book_version });
157
+ return book;
158
+ }
159
+ /**
160
+ * LEAF: fetch the book from a source (genesis), verify its signature against the issuing peer's
161
+ * known key (peer record or key cache), version-gate, and store. Shared by the operator pull
162
+ * endpoint and the leaf auto-sync timer.
163
+ */
164
+ export async function pullBook(config, storage, peers, sourceUrl) {
165
+ const source = sourceUrl || config.genesisUrl;
166
+ if (!source)
167
+ return { ok: false, status: 400, code: 'INVALID_INPUT', message: 'No genesis/source URL configured' };
168
+ const urlCheck = await validateOutboundUrl(source);
169
+ if (!urlCheck.valid)
170
+ return { ok: false, status: 400, code: 'INVALID_URL', message: urlCheck.reason ?? 'source URL failed validation' };
171
+ let book;
172
+ try {
173
+ const resp = await fetch(`${source.replace(/\/+$/, '')}/v1/federation/book`, { signal: AbortSignal.timeout(config.federationTimeoutMs ?? 5_000) });
174
+ if (!resp.ok)
175
+ return { ok: false, status: 502, code: 'FETCH_FAILED', message: `Source returned ${resp.status}` };
176
+ const body = await resp.json();
177
+ book = body?.data?.book;
178
+ if (!book || !Array.isArray(book.nodes))
179
+ return { ok: false, status: 502, code: 'FETCH_FAILED', message: 'Source returned no book' };
180
+ }
181
+ catch (e) {
182
+ return { ok: false, status: 502, code: 'FETCH_FAILED', message: e instanceof Error ? e.message : 'fetch failed' };
183
+ }
184
+ const issuer = peers.get(book.issued_by) ?? [...peers.values()].find(p => p.nodeId === book.issued_by);
185
+ const issuerKey = issuer?.publicKey || peerKeyCache.get(book.issued_by)?.publicKey;
186
+ if (!issuerKey)
187
+ return { ok: false, status: 403, code: 'UNKNOWN_ISSUER', message: `Book issuer ${book.issued_by} is not a known peer` };
188
+ const sigOk = book.signature ? await verify(issuerKey, bookSignString(book), book.signature).catch(() => false) : false;
189
+ if (!sigOk)
190
+ return { ok: false, status: 401, code: 'INVALID_SIGNATURE', message: 'Book signature verification failed' };
191
+ const current = await getActiveBook(storage);
192
+ if (current && book.book_version <= current.book_version) {
193
+ return { ok: true, status: 200, applied: false, reason: 'not_newer', book_version: current.book_version };
194
+ }
195
+ await storeActiveBook(storage, book);
196
+ return { ok: true, status: 200, applied: true, book_version: book.book_version, nodes: book.nodes.length };
197
+ }
198
+ //# sourceMappingURL=federation-book.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-book.js","sourceRoot":"","sources":["../../../src/services/federation-book.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @file federation-tiers.ts
3
+ * @description Single source of truth for federation peer TIERS and the permission
4
+ * flags each tier grants. A peer's `tier` decides what it may do on the network;
5
+ * `deriveTierFlags(tier)` returns the canonical flag set so the literals live in
6
+ * exactly one place (they were previously duplicated across the approve,
7
+ * direct-add, and key-exchange paths in federation-peer.ts).
8
+ *
9
+ * Tiers:
10
+ * - `visiting` — low-trust self-join tier. Can browse/discover (catalogue read,
11
+ * directory, presence) and originate paid work as a REQUESTER, but is never a
12
+ * provider-of-record, relay, memory-replication target, or federated-auth
13
+ * issuer. This is the "feel the federation immediately" tier.
14
+ * - `member` — today's full peer (all flags on except federated auth, which stays
15
+ * opt-in). A visiting peer reaches `member` only via a local operator's
16
+ * deliberate promotion ("vouch").
17
+ * - `genesis` — the anchor/genesis relationship; same capabilities as member,
18
+ * tagged distinctly for display.
19
+ * @structure deriveTierFlags(tier) · coerceTier(raw) · PeerTier type
20
+ * @usage import { deriveTierFlags, coerceTier } from '../services/federation-tiers.js';
21
+ * @version-history
22
+ * v1.0.0 — 2026-06-19 — Initial tier model (visiting/member/genesis) + flag derivation.
23
+ */
24
+ export type PeerTier = 'genesis' | 'member' | 'visiting';
25
+ /** The permission flags a tier grants. Mirrors the flag fields on PeerInfo/FederationPeerRecord. */
26
+ export interface TierFlags {
27
+ shareCatalogue: boolean;
28
+ replicateMemory: boolean;
29
+ allowRouting: boolean;
30
+ peerMode: 'federation' | 'private';
31
+ allowFederatedAuth: boolean;
32
+ federationAuthScopes: string[];
33
+ }
34
+ /**
35
+ * Map a (possibly missing/invalid) tier value to a valid one. Existing peers and
36
+ * legacy records have no tier → treated as `member` (full capability, back-compat).
37
+ */
38
+ export declare function coerceTier(raw: unknown): PeerTier;
39
+ /**
40
+ * Canonical permission flags for a tier. The ONLY place these literals live.
41
+ * - visiting: discovery + paid-requester only; no provider/relay/replication/auth.
42
+ * - member/genesis: full federation capability; federated auth stays opt-in.
43
+ */
44
+ export declare function deriveTierFlags(tier: PeerTier): TierFlags;
45
+ //# sourceMappingURL=federation-tiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-tiers.d.ts","sourceRoot":"","sources":["../../../src/services/federation-tiers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEzD,oGAAoG;AACpG,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,CAoBzD"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @file federation-tiers.ts
3
+ * @description Single source of truth for federation peer TIERS and the permission
4
+ * flags each tier grants. A peer's `tier` decides what it may do on the network;
5
+ * `deriveTierFlags(tier)` returns the canonical flag set so the literals live in
6
+ * exactly one place (they were previously duplicated across the approve,
7
+ * direct-add, and key-exchange paths in federation-peer.ts).
8
+ *
9
+ * Tiers:
10
+ * - `visiting` — low-trust self-join tier. Can browse/discover (catalogue read,
11
+ * directory, presence) and originate paid work as a REQUESTER, but is never a
12
+ * provider-of-record, relay, memory-replication target, or federated-auth
13
+ * issuer. This is the "feel the federation immediately" tier.
14
+ * - `member` — today's full peer (all flags on except federated auth, which stays
15
+ * opt-in). A visiting peer reaches `member` only via a local operator's
16
+ * deliberate promotion ("vouch").
17
+ * - `genesis` — the anchor/genesis relationship; same capabilities as member,
18
+ * tagged distinctly for display.
19
+ * @structure deriveTierFlags(tier) · coerceTier(raw) · PeerTier type
20
+ * @usage import { deriveTierFlags, coerceTier } from '../services/federation-tiers.js';
21
+ * @version-history
22
+ * v1.0.0 — 2026-06-19 — Initial tier model (visiting/member/genesis) + flag derivation.
23
+ */
24
+ const VALID_TIERS = new Set(['genesis', 'member', 'visiting']);
25
+ /**
26
+ * Map a (possibly missing/invalid) tier value to a valid one. Existing peers and
27
+ * legacy records have no tier → treated as `member` (full capability, back-compat).
28
+ */
29
+ export function coerceTier(raw) {
30
+ return VALID_TIERS.has(raw) ? raw : 'member';
31
+ }
32
+ /**
33
+ * Canonical permission flags for a tier. The ONLY place these literals live.
34
+ * - visiting: discovery + paid-requester only; no provider/relay/replication/auth.
35
+ * - member/genesis: full federation capability; federated auth stays opt-in.
36
+ */
37
+ export function deriveTierFlags(tier) {
38
+ if (tier === 'visiting') {
39
+ return {
40
+ shareCatalogue: true, // may READ our catalogue summary (browse/discover)
41
+ replicateMemory: false, // not a replication target
42
+ allowRouting: false, // not a provider-of-record / relay
43
+ peerMode: 'federation',
44
+ allowFederatedAuth: false,
45
+ federationAuthScopes: [],
46
+ };
47
+ }
48
+ // member + genesis: today's full-peer defaults
49
+ return {
50
+ shareCatalogue: true,
51
+ replicateMemory: true,
52
+ allowRouting: true,
53
+ peerMode: 'federation',
54
+ allowFederatedAuth: false, // opt-in even for members (unchanged from today)
55
+ federationAuthScopes: [],
56
+ };
57
+ }
58
+ //# sourceMappingURL=federation-tiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-tiers.js","sourceRoot":"","sources":["../../../src/services/federation-tiers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAcH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEzE;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,OAAO,WAAW,CAAC,GAAG,CAAC,GAAe,CAAC,CAAC,CAAC,CAAC,GAAe,CAAC,CAAC,CAAC,QAAQ,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,cAAc,EAAE,IAAI,EAAQ,mDAAmD;YAC/E,eAAe,EAAE,KAAK,EAAM,2BAA2B;YACvD,YAAY,EAAE,KAAK,EAAS,mCAAmC;YAC/D,QAAQ,EAAE,YAAY;YACtB,kBAAkB,EAAE,KAAK;YACzB,oBAAoB,EAAE,EAAE;SACzB,CAAC;IACJ,CAAC;IACD,+CAA+C;IAC/C,OAAO;QACL,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,YAAY;QACtB,kBAAkB,EAAE,KAAK,EAAK,iDAAiD;QAC/E,oBAAoB,EAAE,EAAE;KACzB,CAAC;AACJ,CAAC"}
@@ -18,6 +18,21 @@ export interface PeerInfo {
18
18
  peerMode: 'federation' | 'private';
19
19
  allowFederatedAuth: boolean;
20
20
  federationAuthScopes: string[];
21
+ /** Trust tier: 'genesis' | 'member' | 'visiting' (see services/federation-tiers.ts). Absent → 'member'. */
22
+ tier?: 'genesis' | 'member' | 'visiting';
23
+ /** Availability label derived from heartbeat uptime (Phase B): 'temporary' | 'permanent' | 'unknown'. */
24
+ availability?: 'temporary' | 'permanent' | 'unknown';
25
+ /** Optional expiry for time-limited visiting peers (populated/enforced in Phase B). */
26
+ expiresAt?: string | null;
27
+ /** Lifetime successful / attempted heartbeats + windowed availability (Phase B). */
28
+ heartbeatOk?: number;
29
+ heartbeatTotal?: number;
30
+ availabilityWindow?: string | null;
31
+ availabilityPct?: number | null;
32
+ /** Peer's AIMEAT software version (from heartbeat) — federation version visibility. */
33
+ softwareVersion?: string | null;
34
+ /** Hash of the peer's node-card, for change-detection when assembling the federation book. */
35
+ nodeCardHash?: string | null;
21
36
  }
22
37
  /**
23
38
  * Resolve which node hosts a GAII. Checks local cache first, then local storage,
@@ -1 +1 @@
1
- {"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../../src/services/federation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAUlE,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC7B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAkDrE;AAcD,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAEpE;AAoBD,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAC/C,UAAU,CAAC,OAAO,WAAW,CAAC,CAmLhC"}
1
+ {"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../../src/services/federation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAKvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAUlE,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,2GAA2G;IAC3G,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IACzC,yGAAyG;IACzG,YAAY,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;IACrD,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,uFAAuF;IACvF,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC7B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAkDrE;AAcD,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAEpE;AAoBD,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAC/C,UAAU,CAAC,OAAO,WAAW,CAAC,CA8LhC"}
@@ -5,6 +5,8 @@
5
5
  import { createHash } from 'node:crypto';
6
6
  import { sign } from '../auth/keypair.js';
7
7
  import { computeCatalogueHash } from '../utils/catalogue-hash.js';
8
+ import { recordHeartbeatOutcome } from './federation-availability.js';
9
+ import { getSoftwareVersion } from '../utils/version.js';
8
10
  import { logger } from '../utils/logger.js';
9
11
  /** Cache of resolved GAIIs to their hosting node URL. TTL: 5 minutes. */
10
12
  const gaiiCache = new Map();
@@ -116,6 +118,12 @@ export function startHeartbeatJob(config, storage, peers, networkDirectory) {
116
118
  const nodeKey = await storage.getNodeKey();
117
119
  const agents = await storage.listAgents();
118
120
  const actions = await storage.listActions();
121
+ // Availability-measurement options (Phase B uptime tracking)
122
+ const availOpts = {
123
+ windowDays: config.federationAvailabilityWindowDays,
124
+ permanentThreshold: config.federationAvailabilityPermanentThreshold,
125
+ minSamples: config.federationAvailabilityMinSamples,
126
+ };
119
127
  for (const [key, peer] of activePeers) {
120
128
  // Per-peer stagger: skip this peer if not yet due
121
129
  const stagger = peerStaggerMs(config.nodeId, peer.nodeId, BASE_INTERVAL_MS);
@@ -127,6 +135,7 @@ export function startHeartbeatJob(config, storage, peers, networkDirectory) {
127
135
  node_id: config.nodeId,
128
136
  timestamp: new Date().toISOString(),
129
137
  version: 'v1',
138
+ software_version: getSoftwareVersion(),
130
139
  stats: {
131
140
  agents_active: agents.length,
132
141
  actions_published: actions.length,
@@ -150,6 +159,7 @@ export function startHeartbeatJob(config, storage, peers, networkDirectory) {
150
159
  peer.lastSeen = new Date().toISOString();
151
160
  peer.status = 'active';
152
161
  peerFailures.set(key, 0);
162
+ recordHeartbeatOutcome(peer, true, new Date(), availOpts);
153
163
  storage.saveFederationPeer(peer).catch(() => { });
154
164
  // Detect catalogue hash mismatch for sync triggering
155
165
  const cachedHash = peerCatalogueHashes.get(key);
@@ -220,6 +230,7 @@ export function startHeartbeatJob(config, storage, peers, networkDirectory) {
220
230
  peer.status = 'degraded';
221
231
  logger.warn(`Peer ${peer.nodeId} degraded after ${failures} consecutive failures`);
222
232
  }
233
+ recordHeartbeatOutcome(peer, false, new Date(), availOpts);
223
234
  storage.saveFederationPeer(peer).catch(() => { });
224
235
  }
225
236
  }
@@ -235,6 +246,7 @@ export function startHeartbeatJob(config, storage, peers, networkDirectory) {
235
246
  else if (failures >= 3) {
236
247
  peer.status = 'degraded';
237
248
  }
249
+ recordHeartbeatOutcome(peer, false, new Date(), availOpts);
238
250
  storage.saveFederationPeer(peer).catch(() => { });
239
251
  }
240
252
  }
@@ -1 +1 @@
1
- {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../../src/services/federation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../../src/services/federation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,yEAAyE;AACzE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkE,CAAC;AAC5F,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC;AAEhC,kEAAkE;AAClE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;AAgC/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,IAAY,EACZ,MAAoB,EACpB,OAAgB,EAChB,KAA4B;IAE5B,iBAAiB;IACjB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;IACtG,CAAC;IAED,iBAAiB;IACjB,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3E,CAAC;IAED,qDAAqD;IACrD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;IACxD,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC;YAC1G,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACxE,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;QAC3F,IAAI,IAAI,EAAE,CAAC;YACP,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC;YACnG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACjE,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IAC3E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,cAAc,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE;gBAC1E,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;aACrC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACV,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC;gBACtG,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACpE,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,wBAAwB;QAC5B,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,2DAA2D;AAC3D,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEtD,uCAAuC;AACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B;;;GAGG;AACH,IAAI,cAAc,GAAsC,IAAI,CAAC;AAE7D,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,EAA4B;IAC1D,cAAc,GAAG,EAAE,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,WAAmB,EAAE,UAAkB,EAAE,UAAkB;IAC9E,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IACjD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,mEAAmE;AACnE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEpD,MAAM,UAAU,iBAAiB,CAC7B,MAAoB,EACpB,OAAgB,EAChB,KAA4B,EAC5B,gBAA8C;IAE9C,MAAM,gBAAgB,GAAG,CAAC,GAAG,MAAM,CAAC;IACpC,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAE9C,KAAK,UAAU,cAAc;QACzB,4CAA4C;QAC5C,MAAM,cAAc,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACxF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAI,IAA+C,CAAC,cAAc,CAAC;YACjF,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAClD,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC9B,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,+CAA+C,CAAC,CAAC;YACpF,CAAC;QACL,CAAC;QAED,wCAAwC;QACxC,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QAC7G,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAErC,+BAA+B;QAC/B,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;QAE5C,6DAA6D;QAC7D,MAAM,SAAS,GAAG;YACd,UAAU,EAAE,MAAM,CAAC,gCAAgC;YACnD,kBAAkB,EAAE,MAAM,CAAC,wCAAwC;YACnE,UAAU,EAAE,MAAM,CAAC,gCAAgC;SACtD,CAAC;QAEF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;YACpC,kDAAkD;YAClD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;YACjD,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,gBAAgB,GAAG,GAAG;gBAAE,SAAS;YAEtE,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG;oBACZ,OAAO,EAAE,MAAM,CAAC,MAAM;oBACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,OAAO,EAAE,IAAI;oBACb,gBAAgB,EAAE,kBAAkB,EAAE;oBACtC,KAAK,EAAE;wBACH,aAAa,EAAE,MAAM,CAAC,MAAM;wBAC5B,iBAAiB,EAAE,OAAO,CAAC,MAAM;wBACjC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,SAAS;wBAClD,cAAc,EAAE,aAAa;qBAChC;iBACJ,CAAC;gBAEF,+CAA+C;gBAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,SAAS,GAAG,OAAO;oBACrB,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC;oBAC7C,CAAC,CAAC,SAAS,CAAC;gBAEhB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,qBAAqB,EAAE;oBACvD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;oBAC/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;iBAC1C,CAAC,CAAC;gBAEH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;oBACV,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;oBACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBACzC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;oBACvB,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACzB,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;oBAC1D,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAEjD,qDAAqD;oBACrD,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChD,IAAI,UAAU,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;wBAC7C,MAAM,CAAC,IAAI,CAAC,mCAAmC,IAAI,CAAC,MAAM,sBAAsB,CAAC,CAAC;oBACtF,CAAC;oBACD,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;oBAE5C,+DAA+D;oBAC/D,IAAI,gBAAgB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBACzE,IAAI,CAAC;4BACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAE/B,CAAC;4BACF,MAAM,iBAAiB,GAAG,QAAQ,EAAE,IAAI,EAAE,oBAAoB,CAAC;4BAE/D,IAAI,iBAAiB,EAAE,CAAC;gCACpB,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gCAErD,IAAI,iBAAiB,KAAK,iBAAiB,EAAE,CAAC;oCAC1C,mDAAmD;oCACnD,MAAM,CAAC,IAAI,CAAC,yCAAyC,IAAI,CAAC,MAAM,oBAAoB,CAAC,CAAC;oCACtF,IAAI,CAAC;wCACD,MAAM,WAAW,GAAG,MAAM,KAAK,CAC3B,GAAG,IAAI,CAAC,GAAG,gCAAgC,EAC3C;4CACI,OAAO,EAAE;gDACL,QAAQ,EAAE,kBAAkB;gDAC5B,eAAe,EAAE,MAAM,CAAC,MAAM;6CACjC;4CACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;yCAC1C,CACJ,CAAC;wCAEF,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;4CACjB,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,IAAI,EAEzC,CAAC;4CAEF,IAAI,WAAW,EAAE,IAAI,EAAE,CAAC;gDACpB,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;gDAC5C,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;gDAC9C,MAAM,CAAC,IAAI,CAAC,sCAAsC,IAAI,CAAC,MAAM,EAAE,EAAE;oDAC7D,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;oDAC9C,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;oDAC5C,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;oDAC5C,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;iDAC3C,CAAC,CAAC;4CACP,CAAC;wCACL,CAAC;oCACL,CAAC;oCAAC,OAAO,UAAU,EAAE,CAAC;wCAClB,MAAM,CAAC,IAAI,CAAC,6CAA6C,IAAI,CAAC,MAAM,EAAE,EAAE;4CACpE,KAAK,EAAE,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;yCAC/E,CAAC,CAAC;oCACP,CAAC;gCACL,CAAC;4BACL,CAAC;wBACL,CAAC;wBAAC,MAAM,CAAC;4BACL,2DAA2D;wBAC/D,CAAC;oBACL,CAAC;oBAED,4DAA4D;oBAC5D,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,aAAa,CAAC,IAAI,cAAc,EAAE,CAAC;wBACvF,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,mBAAmB,cAAc,sBAAsB,CAAC,CAAC;wBACxF,cAAc,CAAC,GAAG,CAAC,CAAC;oBACxB,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,MAAM,QAAQ,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBAClD,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAChC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;wBACjB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;wBACxB,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC9B,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,kBAAkB,QAAQ,uBAAuB,CAAC,CAAC;oBACtF,CAAC;yBAAM,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;wBACvB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;wBACzB,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,mBAAmB,QAAQ,uBAAuB,CAAC,CAAC;oBACvF,CAAC;oBACD,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;oBAC3D,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACrD,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,MAAM,QAAQ,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClD,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAChC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;oBACjB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;oBACxB,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC9B,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,kBAAkB,QAAQ,uBAAuB,CAAC,CAAC;gBACtF,CAAC;qBAAM,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;gBAC7B,CAAC;gBACD,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;gBAC3D,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrD,CAAC;QACL,CAAC;IACL,CAAC;IAED,oDAAoD;IACpD,SAAS,YAAY;QACjB,MAAM,MAAM,GAAG,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,CAAC;QAC3D,UAAU,CAAC,GAAG,EAAE;YACZ,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACzB,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;YACH,YAAY,EAAE,CAAC;QACnB,CAAC,EAAE,MAAM,CAAC,CAAC;IACf,CAAC;IAED,YAAY,EAAE,CAAC;IAEf,0FAA0F;IAC1F,OAAO,WAAW,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @file librarian.ts
3
+ * @description Tier-1 "librarian" retrieval: a single ranked full-text search fanned across ALL of
4
+ * a viewer's own memory (their GHII + every agent + every ecosystem app), so one query reaches
5
+ * every organism they have contributed to plus their personal notebook content. Built on the
6
+ * generic `storage.searchText()` FTS primitive (SQLite FTS5 / MongoDB $text); this service adds
7
+ * the fan-across identity set, key→organism/workspace annotation, title extraction and snippeting.
8
+ * Auth is implicit: only the viewer's OWN data is searched, so there is no cross-member read to
9
+ * gate. (Cross-member organism content readable via consent is a deliberate follow-up — see the
10
+ * design doc §5.)
11
+ * @structure
12
+ * - librarianSearch() — resolve identity set → searchText → annotate → LibrarianHit[]
13
+ * - annotate()/titleOf()/snippetOf() — presentation helpers
14
+ * @usage
15
+ * const { hits } = await librarianSearch(storage, config, { ownerName, isOwnerSession, viewerGaii, query });
16
+ * @version-history
17
+ * v1.0.0 — 2026-06-19 — Initial: fan-across-organisms full-text librarian over searchText().
18
+ */
19
+ import type { Storage } from '../storage/interface.js';
20
+ import type { AimeatConfig } from '../config.js';
21
+ export interface LibrarianHit {
22
+ key: string;
23
+ ownerGaii: string;
24
+ title: string;
25
+ snippet: string;
26
+ score: number;
27
+ visibility: string;
28
+ tags: string[];
29
+ organismId?: string;
30
+ workspaceId?: string;
31
+ space?: string;
32
+ updatedAt: string;
33
+ /** Original producer (= ownerGaii); meaningful in the public scope where it is someone else. */
34
+ producer: string;
35
+ /** What the hit is, for the badge + the right "open" target. */
36
+ kind: 'knowledge' | 'document' | 'memory';
37
+ /** Knowledge-package id (kind==='knowledge'), parsed from the `packages/{id}/…` key. */
38
+ packageId?: string;
39
+ /** Knowledge content type (kind==='knowledge'), if present on the manifest. */
40
+ contentType?: string;
41
+ }
42
+ /**
43
+ * Run a single ranked full-text query.
44
+ * - scope 'own' (default): fanned across every identity the viewer owns (GHII + agents + ecosystem
45
+ * apps; an agent session is scoped to itself).
46
+ * - scope 'public': across the WHOLE node, restricted to public-visibility content — knowledge
47
+ * packages, public workspace documents and public memory — so you can find what others (and
48
+ * their agents) have published, with the producer kept on each hit.
49
+ */
50
+ export declare function librarianSearch(storage: Storage, config: AimeatConfig, opts: {
51
+ ownerName: string;
52
+ isOwnerSession: boolean;
53
+ viewerGaii: string;
54
+ query: string;
55
+ limit?: number;
56
+ keyPrefix?: string;
57
+ scope?: 'own' | 'public';
58
+ }): Promise<{
59
+ hits: LibrarianHit[];
60
+ ownersSearched: number;
61
+ }>;
62
+ //# sourceMappingURL=librarian.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"librarian.d.ts","sourceRoot":"","sources":["../../../src/services/librarian.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,gGAAgG;IAChG,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAuED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;CAAE,GACpJ,OAAO,CAAC;IAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAmD3D"}