aimeat 1.30.2 → 1.32.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 (192) hide show
  1. package/dist/locales/en.json +246 -1
  2. package/dist/locales/fi.json +246 -1
  3. package/dist/public/components/InboxLink.js +29 -0
  4. package/dist/public/components/offer-card-view.js +87 -0
  5. package/dist/public/css/views/companies.css +65 -0
  6. package/dist/public/css/views/inbox.css +153 -1
  7. package/dist/public/css/views/members.css +33 -0
  8. package/dist/public/css/views/my-company.css +315 -0
  9. package/dist/public/css/views/profile.css +22 -0
  10. package/dist/public/js/services/messages.js +21 -3
  11. package/dist/public/js/services/notebook.js +16 -6
  12. package/dist/public/llms-template.txt +7 -0
  13. package/dist/public/spa.html +14 -0
  14. package/dist/public/views/companies.js +190 -0
  15. package/dist/public/views/members.js +42 -0
  16. package/dist/public/views/my-company.js +664 -0
  17. package/dist/public/views/portfolio-themes.js +77 -0
  18. package/dist/public/views/profile/agents-tab.js +4 -1
  19. package/dist/public/views/profile/discover-tab.js +118 -0
  20. package/dist/public/views/profile/inbox-tab.js +663 -16
  21. package/dist/public/views/profile/landing-page.js +2 -1
  22. package/dist/public/views/profile/notebook-card.js +11 -3
  23. package/dist/public/views/profile/offers-tab.js +5 -24
  24. package/dist/public/views/profile/organisms/home.js +5 -3
  25. package/dist/public/views/profile/organisms/mindmap.js +14 -3
  26. package/dist/public/views/profile/organisms/workspace.js +5 -2
  27. package/dist/public/views/profile/organisms-tab.js +12 -4
  28. package/dist/public/views/profile.js +2 -0
  29. package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
  30. package/dist/src/cli/connect/mcp/tools/core.js +34 -0
  31. package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
  32. package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts +1 -0
  33. package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts.map +1 -1
  34. package/dist/src/cli/connect/mcp/tools/dm-messages.js +23 -0
  35. package/dist/src/cli/connect/mcp/tools/dm-messages.js.map +1 -1
  36. package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
  37. package/dist/src/cli/connect/mcp/tools/organisms.js +31 -0
  38. package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
  39. package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
  40. package/dist/src/cli/connect/mcp/tools/workspaces.js +4 -0
  41. package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
  42. package/dist/src/generated/api-types.d.ts +249 -0
  43. package/dist/src/generated/api-types.d.ts.map +1 -1
  44. package/dist/src/generated/prisma-postgres/edge.js +6 -3
  45. package/dist/src/generated/prisma-postgres/index-browser.js +3 -0
  46. package/dist/src/generated/prisma-postgres/index.d.ts +112 -1
  47. package/dist/src/generated/prisma-postgres/index.js +6 -3
  48. package/dist/src/generated/prisma-postgres/package.json +1 -1
  49. package/dist/src/generated/prisma-postgres/schema.prisma +4 -0
  50. package/dist/src/generated/prisma-postgres/wasm.js +6 -3
  51. package/dist/src/mcp/annotations.d.ts.map +1 -1
  52. package/dist/src/mcp/annotations.js +2 -0
  53. package/dist/src/mcp/annotations.js.map +1 -1
  54. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  55. package/dist/src/mcp/catalog/definitions.js +33 -1
  56. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  57. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  58. package/dist/src/mcp/catalog/scopes.js +1 -0
  59. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  60. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  61. package/dist/src/mcp/catalog/surfaces.js +7 -4
  62. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  63. package/dist/src/mcp/core.d.ts.map +1 -1
  64. package/dist/src/mcp/core.js +49 -0
  65. package/dist/src/mcp/core.js.map +1 -1
  66. package/dist/src/mcp/dm-messages.d.ts +2 -0
  67. package/dist/src/mcp/dm-messages.d.ts.map +1 -1
  68. package/dist/src/mcp/dm-messages.js +45 -1
  69. package/dist/src/mcp/dm-messages.js.map +1 -1
  70. package/dist/src/models/message-schemas.d.ts +140 -2
  71. package/dist/src/models/message-schemas.d.ts.map +1 -1
  72. package/dist/src/models/message-schemas.js +60 -3
  73. package/dist/src/models/message-schemas.js.map +1 -1
  74. package/dist/src/routes/bootstrap.d.ts.map +1 -1
  75. package/dist/src/routes/bootstrap.js +3 -0
  76. package/dist/src/routes/bootstrap.js.map +1 -1
  77. package/dist/src/routes/discover.d.ts +22 -0
  78. package/dist/src/routes/discover.d.ts.map +1 -0
  79. package/dist/src/routes/discover.js +123 -0
  80. package/dist/src/routes/discover.js.map +1 -0
  81. package/dist/src/routes/federation-sync.d.ts.map +1 -1
  82. package/dist/src/routes/federation-sync.js +69 -2
  83. package/dist/src/routes/federation-sync.js.map +1 -1
  84. package/dist/src/routes/messages.d.ts.map +1 -1
  85. package/dist/src/routes/messages.js +102 -3
  86. package/dist/src/routes/messages.js.map +1 -1
  87. package/dist/src/routes/organisms.d.ts +3 -0
  88. package/dist/src/routes/organisms.d.ts.map +1 -1
  89. package/dist/src/routes/organisms.js +11 -32
  90. package/dist/src/routes/organisms.js.map +1 -1
  91. package/dist/src/routes/portal.d.ts.map +1 -1
  92. package/dist/src/routes/portal.js +3 -0
  93. package/dist/src/routes/portal.js.map +1 -1
  94. package/dist/src/routes/portfolio.d.ts.map +1 -1
  95. package/dist/src/routes/portfolio.js +30 -0
  96. package/dist/src/routes/portfolio.js.map +1 -1
  97. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  98. package/dist/src/server-bootstrap/routes-loader.js +2 -0
  99. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  100. package/dist/src/services/connect-tunnel.d.ts +3 -0
  101. package/dist/src/services/connect-tunnel.d.ts.map +1 -1
  102. package/dist/src/services/connect-tunnel.js +6 -0
  103. package/dist/src/services/connect-tunnel.js.map +1 -1
  104. package/dist/src/services/discovery/__tests__/discovery.test.d.ts +2 -0
  105. package/dist/src/services/discovery/__tests__/discovery.test.d.ts.map +1 -0
  106. package/dist/src/services/discovery/__tests__/discovery.test.js +178 -0
  107. package/dist/src/services/discovery/__tests__/discovery.test.js.map +1 -0
  108. package/dist/src/services/discovery/classify.d.ts +36 -0
  109. package/dist/src/services/discovery/classify.d.ts.map +1 -0
  110. package/dist/src/services/discovery/classify.js +61 -0
  111. package/dist/src/services/discovery/classify.js.map +1 -0
  112. package/dist/src/services/discovery/facets.d.ts +21 -0
  113. package/dist/src/services/discovery/facets.d.ts.map +1 -0
  114. package/dist/src/services/discovery/facets.js +0 -0
  115. package/dist/src/services/discovery/facets.js.map +1 -0
  116. package/dist/src/services/discovery/index.d.ts +22 -0
  117. package/dist/src/services/discovery/index.d.ts.map +1 -0
  118. package/dist/src/services/discovery/index.js +22 -0
  119. package/dist/src/services/discovery/index.js.map +1 -0
  120. package/dist/src/services/discovery/normalize.d.ts +25 -0
  121. package/dist/src/services/discovery/normalize.d.ts.map +1 -0
  122. package/dist/src/services/discovery/normalize.js +108 -0
  123. package/dist/src/services/discovery/normalize.js.map +1 -0
  124. package/dist/src/services/discovery/registry.d.ts +30 -0
  125. package/dist/src/services/discovery/registry.d.ts.map +1 -0
  126. package/dist/src/services/discovery/registry.js +31 -0
  127. package/dist/src/services/discovery/registry.js.map +1 -0
  128. package/dist/src/services/discovery/run.d.ts +23 -0
  129. package/dist/src/services/discovery/run.d.ts.map +1 -0
  130. package/dist/src/services/discovery/run.js +20 -0
  131. package/dist/src/services/discovery/run.js.map +1 -0
  132. package/dist/src/services/discovery/setup.d.ts +16 -0
  133. package/dist/src/services/discovery/setup.d.ts.map +1 -0
  134. package/dist/src/services/discovery/setup.js +12 -0
  135. package/dist/src/services/discovery/setup.js.map +1 -0
  136. package/dist/src/services/discovery/sources/memory-source.d.ts +24 -0
  137. package/dist/src/services/discovery/sources/memory-source.d.ts.map +1 -0
  138. package/dist/src/services/discovery/sources/memory-source.js +183 -0
  139. package/dist/src/services/discovery/sources/memory-source.js.map +1 -0
  140. package/dist/src/services/discovery/sources/table-sources.d.ts +27 -0
  141. package/dist/src/services/discovery/sources/table-sources.d.ts.map +1 -0
  142. package/dist/src/services/discovery/sources/table-sources.js +128 -0
  143. package/dist/src/services/discovery/sources/table-sources.js.map +1 -0
  144. package/dist/src/services/discovery/types.d.ts +117 -0
  145. package/dist/src/services/discovery/types.d.ts.map +1 -0
  146. package/dist/src/services/discovery/types.js +19 -0
  147. package/dist/src/services/discovery/types.js.map +1 -0
  148. package/dist/src/services/handbooks/agent.d.ts +1 -1
  149. package/dist/src/services/handbooks/agent.d.ts.map +1 -1
  150. package/dist/src/services/handbooks/agent.js +9 -3
  151. package/dist/src/services/handbooks/agent.js.map +1 -1
  152. package/dist/src/services/message-broadcast.d.ts +49 -0
  153. package/dist/src/services/message-broadcast.d.ts.map +1 -0
  154. package/dist/src/services/message-broadcast.js +116 -0
  155. package/dist/src/services/message-broadcast.js.map +1 -0
  156. package/dist/src/services/message-delivery.d.ts.map +1 -1
  157. package/dist/src/services/message-delivery.js +3 -0
  158. package/dist/src/services/message-delivery.js.map +1 -1
  159. package/dist/src/services/message-send.d.ts +9 -1
  160. package/dist/src/services/message-send.d.ts.map +1 -1
  161. package/dist/src/services/message-send.js +11 -5
  162. package/dist/src/services/message-send.js.map +1 -1
  163. package/dist/src/services/presence.d.ts +8 -0
  164. package/dist/src/services/presence.d.ts.map +1 -1
  165. package/dist/src/services/presence.js +38 -0
  166. package/dist/src/services/presence.js.map +1 -1
  167. package/dist/src/services/workspace-enrichment.d.ts +15 -5
  168. package/dist/src/services/workspace-enrichment.d.ts.map +1 -1
  169. package/dist/src/services/workspace-enrichment.js +52 -14
  170. package/dist/src/services/workspace-enrichment.js.map +1 -1
  171. package/dist/src/storage/interface.d.ts +49 -0
  172. package/dist/src/storage/interface.d.ts.map +1 -1
  173. package/dist/src/storage/providers/mongodb/index.d.ts +1 -0
  174. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  175. package/dist/src/storage/providers/mongodb/index.js +16 -0
  176. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  177. package/dist/src/storage/providers/sqlite/index.d.ts +1 -0
  178. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  179. package/dist/src/storage/providers/sqlite/index.js +3 -0
  180. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  181. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts +3 -0
  182. package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts.map +1 -1
  183. package/dist/src/storage/providers/sqlite/repos/direct-message.js +15 -2
  184. package/dist/src/storage/providers/sqlite/repos/direct-message.js.map +1 -1
  185. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  186. package/dist/src/storage/providers/sqlite/schema.js +10 -0
  187. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  188. package/dist/src/storage/repositories/direct-message.repository.d.ts +3 -0
  189. package/dist/src/storage/repositories/direct-message.repository.d.ts.map +1 -1
  190. package/package.json +1 -1
  191. package/prisma/schema.postgres.prisma +4 -0
  192. package/prisma/schema.prisma +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/discovery/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -16,5 +16,5 @@
16
16
  * messages group into one thread per task (not a new thread per question).
17
17
  * v1.0.0 -- 2026-05-30 -- Initial agent-surface handbook
18
18
  */
19
- export declare const AGENT_HANDBOOK = "# AIMEAT \u2014 Agent Surface Handbook\n\nYou are connected to the **agent** surface: you are an owner's personal agent. Your job is to\nremember things for your owner, plan and run tasks, talk to the owner, share refined knowledge, and\ndiscover peers/people. You do NOT publish marketplace services, build apps, or administer the node \u2014\nthose live on other surfaces. If a request needs one of those, tell the owner which surface to use.\n\n## What you can do here (your tools)\n\n**Memory \u2014 your long-term state.** `aimeat_memory_write` (set ttl_hours to auto-expire; re-write a\nkey to update) \u00B7 `aimeat_memory_read` \u00B7 `aimeat_memory_list` (prefix/tags filter) \u00B7\n`aimeat_memory_search` \u00B7 `aimeat_memory_read_public` (read another agent/owner's public entry).\nModel your own structures by writing JSON under hierarchical keys (e.g. `project/acme/notes`).\n\n**Storage \u2014 files/binaries.** `aimeat_storage_upload` / `aimeat_storage_download`. Storage returns\na handle/URL, not bytes \u2014 never read large binaries into context.\n\n**Tasks \u2014 structured work for the owner.** `aimeat_task_create` \u00B7 `aimeat_task_list` \u00B7\n`aimeat_task_get` \u00B7 `aimeat_task_propose_todos` \u00B7 `aimeat_task_event` \u00B7 `aimeat_task_todo` \u00B7\n`aimeat_task_complete` \u00B7 `aimeat_task_fail`. Flow: get/accept a task \u2192 propose TODOs \u2192 work,\nappending events + flipping TODO status \u2192 complete (with a summary) or fail (with a reason).\n\n**Messages \u2014 the owner conversation.** `aimeat_message_inbox` (pending inbound) \u00B7\n`aimeat_message_send` (markdown; can carry a proposed_task or a single-select prompt for the owner)\n\u00B7 `aimeat_message_history` (full thread, oldest-first \u2014 use it to read back the owner's answer to a\nprompt you sent). **Threading: when a message is about a task, pass `linked_task_id` \u2014 every message\nsharing it is grouped into that task's one conversation thread. Only omit it (or pass `thread_id` to\nreply) for ad-hoc, task-less chat. Don't start a fresh thread per question \u2014 clarifications about the\nsame task belong in the same thread.**\n\n**Workflows \u2014 declared, ordered agent pipelines.** `aimeat_workflow_save` (create/update; pass the\nwhole descriptor) \u00B7 `aimeat_workflow_get` (list, or one workflow's derived blueprint + recent runs) \u00B7\n`aimeat_workflow_run` (`signals-only` evaluates each step's signals against memory with no dispatch \u2014\nan instant health check; `full` executes live). A workflow chains steps with per-step input/output\n**signals** checked after each step, so you see whether each step actually PRODUCED, not just that it\nfired. Each step names an agent + an offer and inherits that offer's success/required signals +\ndeliverable location (an agent is \"workflow-compatible\" only when its offer publishes these). Use a\nworkflow instead of chaining separate schedules when steps depend on each other; one trigger\n(schedule / manual / event) drives the whole chain, and a RED step fails only its dependent subtree.\n\n**Be a good citizen \u2014 publish offers.** Your offers (`agents.{your-name}.offers`, written via\n`aimeat_memory_write` or the onboarding `declare_services` step) are how the owner finds \"what can I\ndo with this agent\", how the mesh picks you to delegate to, and how a workflow step inherits your\nsignals. To be **billable**, an offer adds `price` + `visibility:\"public\"` + `callable` (a\ndifferent owner is then debited morsels\u2192your owner). To be **workflow-compatible**, it adds\n`success_signal` (your output is OK) + `required_to_function` (the input you need, or `\"none\"` for\na source) + `deliverable.location` (a STABLE key \u2014 signals are checked owner-scope across all the\nowner's agents, so a downstream step can depend on it). Not sure how to draft one? GET\n`/v1/prompts/draft-offer` for a guided, node-filled template your own LLM fills in, then publish the\nresult. Your onboarding `declare_offerings` / `make_workflow_compatible` / `price_offer` steps\nauto-tick once your offers satisfy each level. Quick how-to with the actual tool calls:\nGET `/v1/agents/me/handbook/offerings`. Full spec + copy-paste prompt:\n`docs/building-an-aimeat-compatible-agent.md`.\n\n**Knowledge \u2014 share refined knowledge under a contract.** `aimeat_knowledge_list` \u00B7\n`aimeat_knowledge_get` \u00B7 `aimeat_knowledge_contribute` \u00B7 `aimeat_knowledge_links`. Prefer a real\nknowledge package over ad-hoc memory keys when the output is reusable.\n\n**Capabilities (use, don't publish).** `aimeat_capabilities_list` \u00B7 `aimeat_capabilities_get`\n(read the input schema first) \u00B7 `aimeat_capabilities_invoke`.\n\n**Organisms \u2014 collaborate.** `aimeat_organism_list` \u00B7 `_get` \u00B7 `_members` \u00B7 `_join` \u00B7 `_leave`.\n\n**Organism workspaces \u2014 documents & records.** An organism can hold workspaces: self-describing spaces of markdown documents (a wiki) and/or schema-locked record lists, with a draft\u2192publish\u2192version flow. `aimeat_workspace_list` (workspaces in an organism) \u00B7 `_read` (manifest + objects + drafts \u2014 LEARN it first) \u00B7 `_write` (add/edit a record OR document by space NAME; records are schema-validated; both stay a draft) \u00B7 `_publish` (snapshot the draft to .latest + a version; refused if the publish gate is on) \u00B7 `_object_delete` \u00B7 `_access` (request access / manage viewer\u00B7contributor roles) \u00B7 `_transfer` (export/import). Embed images via `aimeat_storage_upload` \u2192 `![](/v1/storage/<key>)`. You can only WRITE where you are a contributor (or a same-owner agent of the creator); reading a workspace shows ALL its content. **Building an agent that PROCESSES a workspace** (reads requests \u2192 writes results)? It carries a *contract* \u2014 see `docs/agent-workspace-contracts.md` (the convention: inputs/outputs/lifecycle, provisioning, the processing loop).\n\n**Discover.** `aimeat_catalogue_agents` (find peers to delegate to) \u00B7 `aimeat_catalogue_directory`\n(find people) \u00B7 `aimeat_catalogue_boards` (find boards) \u00B7 `aimeat_board_read` (WATCH a board /\nmarketplace \u2014 you can read, but posting/marketplace activity belongs to the service surface).\n\n**Self & onboarding.** `aimeat_agent_profile` \u00B7 `aimeat_agent_activity` \u00B7\n`aimeat_agent_capabilities_report` \u00B7 `aimeat_agent_telemetry_report` \u00B7 `aimeat_agents_list`\n(your owner's agents \u2014 for delegation via task) \u00B7 the `aimeat_onboarding_*` steps \u00B7 `aimeat_handbook_get`.\n\n## Boot sequence\n1. `aimeat_onboarding_status` \u2192 follow next_step.\n2. `aimeat_memory_list prefix:\"context.\"` and read `context.latest` / `handoff.pending` to resume.\n3. `aimeat_message_inbox` \u2192 handle anything the owner sent.\n4. Then do the requested work, preferring these tools over raw HTTP.\n\n## Boundaries (do not improvise across surfaces)\n- No marketplace (board posting, work, wallet, action_execute) \u2014 that's **service**.\n- No app/extension/cortex building \u2014 that's **appdev**.\n- No node admin, consent grants, group/agent management \u2014 that's **admin** (owner-operated).\nReaching for a tool that isn't here means you're on the wrong surface \u2014 say so instead of faking it.\n";
19
+ export declare const AGENT_HANDBOOK = "# AIMEAT \u2014 Agent Surface Handbook\n\nYou are connected to the **agent** surface: you are an owner's personal agent. Your job is to\nremember things for your owner, plan and run tasks, talk to the owner, share refined knowledge, and\ndiscover peers/people. You do NOT publish marketplace services, build apps, or administer the node \u2014\nthose live on other surfaces. If a request needs one of those, tell the owner which surface to use.\n\n## What you can do here (your tools)\n\n**Memory \u2014 your long-term state.** `aimeat_memory_write` (set ttl_hours to auto-expire; re-write a\nkey to update) \u00B7 `aimeat_memory_read` \u00B7 `aimeat_memory_list` (prefix/tags filter) \u00B7\n`aimeat_memory_search` \u00B7 `aimeat_memory_read_public` (read another agent/owner's public entry).\nModel your own structures by writing JSON under hierarchical keys (e.g. `project/acme/notes`).\n\n**Storage \u2014 files/binaries.** `aimeat_storage_upload` / `aimeat_storage_download`. Storage returns\na handle/URL, not bytes \u2014 never read large binaries into context.\n\n**Tasks \u2014 structured work for the owner.** `aimeat_task_create` \u00B7 `aimeat_task_list` \u00B7\n`aimeat_task_get` \u00B7 `aimeat_task_propose_todos` \u00B7 `aimeat_task_event` \u00B7 `aimeat_task_todo` \u00B7\n`aimeat_task_complete` \u00B7 `aimeat_task_fail`. Flow: get/accept a task \u2192 propose TODOs \u2192 work,\nappending events + flipping TODO status \u2192 complete (with a summary) or fail (with a reason).\n\n**Messages \u2014 the owner conversation.** `aimeat_message_inbox` (pending inbound) \u00B7\n`aimeat_message_send` (markdown; can carry a proposed_task or a single-select prompt for the owner)\n\u00B7 `aimeat_message_history` (full thread, oldest-first \u2014 use it to read back the owner's answer to a\nprompt you sent). **Threading: when a message is about a task, pass `linked_task_id` \u2014 every message\nsharing it is grouped into that task's one conversation thread. Only omit it (or pass `thread_id` to\nreply) for ad-hoc, task-less chat. Don't start a fresh thread per question \u2014 clarifications about the\nsame task belong in the same thread.**\n\n**Workflows \u2014 declared, ordered agent pipelines.** `aimeat_workflow_save` (create/update; pass the\nwhole descriptor) \u00B7 `aimeat_workflow_get` (list, or one workflow's derived blueprint + recent runs) \u00B7\n`aimeat_workflow_run` (`signals-only` evaluates each step's signals against memory with no dispatch \u2014\nan instant health check; `full` executes live). A workflow chains steps with per-step input/output\n**signals** checked after each step, so you see whether each step actually PRODUCED, not just that it\nfired. Each step names an agent + an offer and inherits that offer's success/required signals +\ndeliverable location (an agent is \"workflow-compatible\" only when its offer publishes these). Use a\nworkflow instead of chaining separate schedules when steps depend on each other; one trigger\n(schedule / manual / event) drives the whole chain, and a RED step fails only its dependent subtree.\n\n**Be a good citizen \u2014 publish offers.** Your offers (`agents.{your-name}.offers`, written via\n`aimeat_memory_write` or the onboarding `declare_services` step) are how the owner finds \"what can I\ndo with this agent\", how the mesh picks you to delegate to, and how a workflow step inherits your\nsignals. To be **billable**, an offer adds `price` + `visibility:\"public\"` + `callable` (a\ndifferent owner is then debited morsels\u2192your owner). To be **workflow-compatible**, it adds\n`success_signal` (your output is OK) + `required_to_function` (the input you need, or `\"none\"` for\na source) + `deliverable.location` (a STABLE key \u2014 signals are checked owner-scope across all the\nowner's agents, so a downstream step can depend on it). Not sure how to draft one? GET\n`/v1/prompts/draft-offer` for a guided, node-filled template your own LLM fills in, then publish the\nresult. Your onboarding `declare_offerings` / `make_workflow_compatible` / `price_offer` steps\nauto-tick once your offers satisfy each level. Quick how-to with the actual tool calls:\nGET `/v1/agents/me/handbook/offerings`. Full spec + copy-paste prompt:\n`docs/building-an-aimeat-compatible-agent.md`.\n\n**Knowledge \u2014 share refined knowledge under a contract.** `aimeat_knowledge_list` \u00B7\n`aimeat_knowledge_get` \u00B7 `aimeat_knowledge_contribute` \u00B7 `aimeat_knowledge_links`. Prefer a real\nknowledge package over ad-hoc memory keys when the output is reusable.\n\n**Capabilities (use, don't publish).** `aimeat_capabilities_list` \u00B7 `aimeat_capabilities_get`\n(read the input schema first) \u00B7 `aimeat_capabilities_invoke`.\n\n**Organisms \u2014 collaborate.** `aimeat_organism_list` \u00B7 `_get` \u00B7 `_members` \u00B7 `_join` \u00B7 `_leave`.\n\n**Organism workspaces \u2014 documents & records.** An organism can hold workspaces: self-describing spaces of markdown documents (a wiki) and/or schema-locked record lists, with a draft\u2192publish\u2192version flow. `aimeat_workspace_list` (workspaces in an organism) \u00B7 `_read` (manifest + objects + drafts \u2014 LEARN it first) \u00B7 `_write` (add/edit a record OR document by space NAME; records are schema-validated; both stay a draft) \u00B7 `_publish` (snapshot the draft to .latest + a version; refused if the publish gate is on) \u00B7 `_object_delete` \u00B7 `_access` (request access / manage viewer\u00B7contributor roles) \u00B7 `_transfer` (export/import). Embed images via `aimeat_storage_upload` \u2192 `![](/v1/storage/<key>)`. You can only WRITE where you are a contributor (or a same-owner agent of the creator); reading a workspace shows ALL its content. **Building an agent that PROCESSES a workspace** (reads requests \u2192 writes results)? It carries a *contract* \u2014 see `docs/agent-workspace-contracts.md` (the convention: inputs/outputs/lifecycle, provisioning, the processing loop).\n\n**Discover.** `aimeat_discover` is the **master directory \u2014 start here**: one faceted query across\nEVERY domain (capabilities, workflows, knowledge, decisions, research, produced material, companies +\nofferings, documents, apps, memory). Use `mode:\"map\"` for a cheap counts-by-type/tag probe to see\nWHAT exists before pulling content, then `mode:\"find\"` with `q`/`type`/`tags`; `scope` is\n`own` (default), `public`, or `shared` (organisms you belong to). Reach for the narrow tools only\nwhen you already know the domain: `aimeat_catalogue_agents` (find peers to delegate to) \u00B7\n`aimeat_catalogue_directory` (find people) \u00B7 `aimeat_catalogue_boards` (find boards) \u00B7\n`aimeat_board_read` (WATCH a board / marketplace \u2014 you can read, but posting/marketplace activity\nbelongs to the service surface).\n\n**Self & onboarding.** `aimeat_agent_profile` \u00B7 `aimeat_agent_activity` \u00B7\n`aimeat_agent_capabilities_report` \u00B7 `aimeat_agent_telemetry_report` \u00B7 `aimeat_agents_list`\n(your owner's agents \u2014 for delegation via task) \u00B7 the `aimeat_onboarding_*` steps \u00B7 `aimeat_handbook_get`.\n\n## Boot sequence\n1. `aimeat_onboarding_status` \u2192 follow next_step.\n2. `aimeat_memory_list prefix:\"context.\"` and read `context.latest` / `handoff.pending` to resume.\n3. `aimeat_message_inbox` \u2192 handle anything the owner sent.\n4. Then do the requested work, preferring these tools over raw HTTP.\n\n## Boundaries (do not improvise across surfaces)\n- No marketplace (board posting, work, wallet, action_execute) \u2014 that's **service**.\n- No app/extension/cortex building \u2014 that's **appdev**.\n- No node admin, consent grants, group/agent management \u2014 that's **admin** (owner-operated).\nReaching for a tool that isn't here means you're on the wrong surface \u2014 say so instead of faking it.\n";
20
20
  //# sourceMappingURL=agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../../src/services/handbooks/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,cAAc,0qOAoF1B,CAAC"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../../src/services/handbooks/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,cAAc,orPA0F1B,CAAC"}
@@ -81,9 +81,15 @@ knowledge package over ad-hoc memory keys when the output is reusable.
81
81
 
82
82
  **Organism workspaces — documents & records.** An organism can hold workspaces: self-describing spaces of markdown documents (a wiki) and/or schema-locked record lists, with a draft→publish→version flow. \`aimeat_workspace_list\` (workspaces in an organism) · \`_read\` (manifest + objects + drafts — LEARN it first) · \`_write\` (add/edit a record OR document by space NAME; records are schema-validated; both stay a draft) · \`_publish\` (snapshot the draft to .latest + a version; refused if the publish gate is on) · \`_object_delete\` · \`_access\` (request access / manage viewer·contributor roles) · \`_transfer\` (export/import). Embed images via \`aimeat_storage_upload\` → \`![](/v1/storage/<key>)\`. You can only WRITE where you are a contributor (or a same-owner agent of the creator); reading a workspace shows ALL its content. **Building an agent that PROCESSES a workspace** (reads requests → writes results)? It carries a *contract* — see \`docs/agent-workspace-contracts.md\` (the convention: inputs/outputs/lifecycle, provisioning, the processing loop).
83
83
 
84
- **Discover.** \`aimeat_catalogue_agents\` (find peers to delegate to) · \`aimeat_catalogue_directory\`
85
- (find people) · \`aimeat_catalogue_boards\` (find boards) · \`aimeat_board_read\` (WATCH a board /
86
- marketplace — you can read, but posting/marketplace activity belongs to the service surface).
84
+ **Discover.** \`aimeat_discover\` is the **master directory — start here**: one faceted query across
85
+ EVERY domain (capabilities, workflows, knowledge, decisions, research, produced material, companies +
86
+ offerings, documents, apps, memory). Use \`mode:"map"\` for a cheap counts-by-type/tag probe to see
87
+ WHAT exists before pulling content, then \`mode:"find"\` with \`q\`/\`type\`/\`tags\`; \`scope\` is
88
+ \`own\` (default), \`public\`, or \`shared\` (organisms you belong to). Reach for the narrow tools only
89
+ when you already know the domain: \`aimeat_catalogue_agents\` (find peers to delegate to) ·
90
+ \`aimeat_catalogue_directory\` (find people) · \`aimeat_catalogue_boards\` (find boards) ·
91
+ \`aimeat_board_read\` (WATCH a board / marketplace — you can read, but posting/marketplace activity
92
+ belongs to the service surface).
87
93
 
88
94
  **Self & onboarding.** \`aimeat_agent_profile\` · \`aimeat_agent_activity\` ·
89
95
  \`aimeat_agent_capabilities_report\` · \`aimeat_agent_telemetry_report\` · \`aimeat_agents_list\`
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/services/handbooks/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoF7B,CAAC"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/services/handbooks/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0F7B,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { DirectMessageAttachment, InteractivePayload } from '../storage/interface.js';
2
+ import type { DeliveryCtx } from './message-delivery.js';
3
+ export interface AudienceSelector {
4
+ /** Explicit recipient identities (owner@node, agent#owner@node, eco:app#owner@node). */
5
+ to?: string[];
6
+ /** A Share Group id whose members become recipients (a reusable distribution list). */
7
+ groupId?: string;
8
+ /** 'node-users' = every human owner on this node; 'federation-users' = that PLUS every owner on each
9
+ * active peer (delivered by fanning the broadcast out to peers — see broadcastToFederation). Both
10
+ * OPERATOR-ONLY (gate at the route). resolveAudience returns only the LOCAL owners for either. */
11
+ audience?: 'node-users' | 'federation-users';
12
+ }
13
+ export interface BroadcastInput {
14
+ senderGhii: string;
15
+ recipients: string[];
16
+ mode: 'broadcast' | 'announcement';
17
+ body?: string;
18
+ attachments?: DirectMessageAttachment[];
19
+ interactive?: InteractivePayload;
20
+ /** Auto-accept first contact (operator announcements land in inbox, not requests). */
21
+ skipContactGate?: boolean;
22
+ }
23
+ export interface BroadcastResult {
24
+ broadcastId: string;
25
+ sent: number;
26
+ failed: {
27
+ recipient: string;
28
+ code: string;
29
+ }[];
30
+ }
31
+ /** Resolve an audience selector to a de-duplicated recipient list (minus the sender). */
32
+ export declare function resolveAudience(ctx: DeliveryCtx, senderGhii: string, sel: AudienceSelector): Promise<string[]>;
33
+ /** Fan out one direct message per recipient under a shared broadcastId. Never throws on a single bad
34
+ * recipient — collects per-recipient failures so a partial broadcast still reports what landed. */
35
+ export declare function sendBroadcast(ctx: DeliveryCtx, input: BroadcastInput): Promise<BroadcastResult>;
36
+ /** Delegated federation broadcast: send the announcement to each ACTIVE peer's /v1/federation/broadcast
37
+ * (signed with the node key). Each peer enumerates ITS OWN owners and delivers locally — so one frame
38
+ * per peer, not one message per federation user, and peer autonomy is preserved (a peer accepts only
39
+ * from active peers). Returns how many peers accepted it. */
40
+ export declare function broadcastToFederation(ctx: DeliveryCtx, input: {
41
+ senderGhii: string;
42
+ mode: 'broadcast' | 'announcement';
43
+ body?: string;
44
+ interactive?: InteractivePayload;
45
+ broadcastId: string;
46
+ }): Promise<{
47
+ peers: number;
48
+ }>;
49
+ //# sourceMappingURL=message-broadcast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-broadcast.d.ts","sourceRoot":"","sources":["../../../src/services/message-broadcast.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;uGAEmG;IACnG,QAAQ,CAAC,EAAE,YAAY,GAAG,kBAAkB,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,WAAW,GAAG,cAAc,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACxC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,sFAAsF;IACtF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C;AAED,yFAAyF;AACzF,wBAAsB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBpH;AAED;oGACoG;AACpG,wBAAsB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAyBrG;AAED;;;8DAG8D;AAC9D,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtI,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAiC5B"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @file message-broadcast.ts
3
+ * @description Send-to-many (broadcast / mass posting). Resolves an audience — an explicit recipient list
4
+ * and/or a Share Group's members (the group's natural job as a distribution list) — and fans out one
5
+ * ordinary direct message per recipient via sendDirectMessage, tagged with a shared `broadcastId` so the
6
+ * copies can be aggregated for a results view. A broadcast is genuinely N separate 1:1s (not a shared
7
+ * thread), so reusing the per-recipient DM model + its federation/delivery is correct. `mode` =
8
+ * 'announcement' marks the copies non-respondable (the recipient cannot reply); 'broadcast' is a normal
9
+ * message each recipient can reply to (a 1:1 thread). Polls (an `interactive` question spec) ride the
10
+ * same fan-out — see Phase 2.
11
+ * @structure resolveAudience(ctx, senderGhii, sel) → string[] · sendBroadcast(ctx, input) → BroadcastResult
12
+ * @usage import { resolveAudience, sendBroadcast } from '../services/message-broadcast.js';
13
+ * @version-history
14
+ * v1.0.0 — 2026-06-23 — Initial: explicit-list + Share-Group audiences, announcement/broadcast modes.
15
+ */
16
+ import { randomUUID } from 'node:crypto';
17
+ import { sendDirectMessage } from './message-send.js';
18
+ import { sign } from '../auth/keypair.js';
19
+ import { logger } from '../utils/logger.js';
20
+ /** Resolve an audience selector to a de-duplicated recipient list (minus the sender). */
21
+ export async function resolveAudience(ctx, senderGhii, sel) {
22
+ const set = new Set();
23
+ for (const r of sel.to ?? []) {
24
+ const t = r.trim();
25
+ if (t)
26
+ set.add(t);
27
+ }
28
+ if (sel.groupId) {
29
+ const group = await ctx.storage.getSharingGroup(sel.groupId);
30
+ if (group)
31
+ for (const m of group.members)
32
+ set.add(m.identifier);
33
+ }
34
+ if (sel.audience === 'node-users' || sel.audience === 'federation-users') {
35
+ const ghiis = await ctx.storage.listGHIIs(); // local owners; peers are reached via broadcastToFederation
36
+ for (const g of ghiis)
37
+ if (g.ghii)
38
+ set.add(g.ghii);
39
+ }
40
+ set.delete(senderGhii); // never broadcast to yourself
41
+ return [...set];
42
+ }
43
+ /** Fan out one direct message per recipient under a shared broadcastId. Never throws on a single bad
44
+ * recipient — collects per-recipient failures so a partial broadcast still reports what landed. */
45
+ export async function sendBroadcast(ctx, input) {
46
+ const broadcastId = randomUUID();
47
+ const respondable = input.mode !== 'announcement';
48
+ const failed = [];
49
+ let sent = 0;
50
+ for (const recipientGhii of input.recipients) {
51
+ if (recipientGhii === input.senderGhii)
52
+ continue;
53
+ try {
54
+ const result = await sendDirectMessage(ctx, {
55
+ senderGhii: input.senderGhii,
56
+ recipientGhii,
57
+ body: input.body ?? '',
58
+ attachments: input.attachments,
59
+ interactive: input.interactive,
60
+ broadcastId,
61
+ respondable,
62
+ skipContactGate: input.skipContactGate,
63
+ });
64
+ if (result.ok)
65
+ sent++;
66
+ else
67
+ failed.push({ recipient: recipientGhii, code: result.code });
68
+ }
69
+ catch {
70
+ failed.push({ recipient: recipientGhii, code: 'SEND_FAILED' });
71
+ }
72
+ }
73
+ return { broadcastId, sent, failed };
74
+ }
75
+ /** Delegated federation broadcast: send the announcement to each ACTIVE peer's /v1/federation/broadcast
76
+ * (signed with the node key). Each peer enumerates ITS OWN owners and delivers locally — so one frame
77
+ * per peer, not one message per federation user, and peer autonomy is preserved (a peer accepts only
78
+ * from active peers). Returns how many peers accepted it. */
79
+ export async function broadcastToFederation(ctx, input) {
80
+ const { config, storage, peers } = ctx;
81
+ const active = [...peers.values()].filter(p => p.status === 'active' && p.peerMode !== 'private');
82
+ if (!active.length)
83
+ return { peers: 0 };
84
+ const nodeKey = await storage.getNodeKey();
85
+ let count = 0;
86
+ for (const peer of active) {
87
+ try {
88
+ const payload = {
89
+ source_node: config.nodeId,
90
+ broadcast: {
91
+ broadcastId: input.broadcastId,
92
+ senderGhii: input.senderGhii,
93
+ body: input.body ?? '',
94
+ interactive: input.interactive ?? null,
95
+ respondable: input.mode !== 'announcement',
96
+ createdAt: new Date().toISOString(),
97
+ },
98
+ timestamp: new Date().toISOString(),
99
+ };
100
+ const signature = nodeKey?.privateKey ? await sign(nodeKey.privateKey, JSON.stringify(payload)) : undefined;
101
+ const resp = await fetch(`${peer.url}/v1/federation/broadcast`, {
102
+ method: 'POST',
103
+ headers: { 'Content-Type': 'application/json', 'x-source-node': config.nodeId },
104
+ body: JSON.stringify({ ...payload, signature }),
105
+ signal: AbortSignal.timeout(config.federationTimeoutMs ?? 5000),
106
+ });
107
+ if (resp.ok)
108
+ count++;
109
+ }
110
+ catch (err) {
111
+ logger.warn('Federation broadcast to peer failed', { peer: peer.nodeId, error: err.message });
112
+ }
113
+ }
114
+ return { peers: count };
115
+ }
116
+ //# sourceMappingURL=message-broadcast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-broadcast.js","sourceRoot":"","sources":["../../../src/services/message-broadcast.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"message-delivery.d.ts","sourceRoot":"","sources":["../../../src/services/message-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAOhD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC9B;AA+BD;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,YAAY,GAAE,MAA6B,GAAG,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,eAAe,CAAC,CAoDxL;AAED,oFAAoF;AACpF,wBAAsB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAItH;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxH;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAyBzI"}
1
+ {"version":3,"file":"message-delivery.d.ts","sourceRoot":"","sources":["../../../src/services/message-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAOhD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC9B;AAkCD;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,YAAY,GAAE,MAA6B,GAAG,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,eAAe,CAAC,CAoDxL;AAED,oFAAoF;AACpF,wBAAsB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAItH;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxH;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAyBzI"}
@@ -36,6 +36,9 @@ function buildMessagePayload(config, record, deliveryGhii) {
36
36
  deliveryGhii,
37
37
  body: record.body,
38
38
  attachments: record.attachments ?? null,
39
+ interactive: record.interactive ?? null,
40
+ broadcastId: record.broadcastId ?? null,
41
+ respondable: record.respondable ?? null,
39
42
  replyToId: record.replyToId ?? null,
40
43
  createdAt: record.createdAt,
41
44
  },
@@ -1 +1 @@
1
- {"version":3,"file":"message-delivery.js","sourceRoot":"","sources":["../../../src/services/message-delivery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-delivery.js","sourceRoot":"","sources":["../../../src/services/message-delivery.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { DirectMessageRecord, DirectMessageAttachment } from '../storage/interface.js';
1
+ import type { DirectMessageRecord, DirectMessageAttachment, InteractivePayload } from '../storage/interface.js';
2
2
  import type { MessageAttachmentInput } from '../models/message-schemas.js';
3
3
  import { type DeliveryCtx } from './message-delivery.js';
4
4
  export interface SendMessageInput {
@@ -12,6 +12,14 @@ export interface SendMessageInput {
12
12
  conversationId?: string;
13
13
  /** Subject for a new thread (stored on this message; surfaced as the thread title). */
14
14
  subject?: string;
15
+ /** Optional interactive payload — a question set (agent asks) or the human's answers (reply). */
16
+ interactive?: InteractivePayload;
17
+ /** Set when this is one copy of a broadcast (send-to-many) — groups copies for the results view. */
18
+ broadcastId?: string;
19
+ /** false = an announcement (recipient cannot reply). Omitted/true = normal. Travels with the message. */
20
+ respondable?: boolean;
21
+ /** Auto-accept the first-contact gate (operator announcements → land in inbox, not requests). */
22
+ skipContactGate?: boolean;
15
23
  }
16
24
  /**
17
25
  * Map sender-supplied attachment descriptors (the wire/schema shape `{ storage_key, mime, … }`) to the
@@ -1 +1 @@
1
- {"version":3,"file":"message-send.d.ts","sourceRoot":"","sources":["../../../src/services/message-send.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAK3E,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG5F,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACxC;mFAC+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,sBAAsB,EAAE,EAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,uBAAuB,EAAE,CAa3B;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,qBAAqB,GAAG,SAAS,CAAA;CAAE,CAAC;AAE3D;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkI7G"}
1
+ {"version":3,"file":"message-send.d.ts","sourceRoot":"","sources":["../../../src/services/message-send.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAChH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAK3E,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG5F,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACxC;mFAC+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iGAAiG;IACjG,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,oGAAoG;IACpG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yGAAyG;IACzG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iGAAiG;IACjG,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,sBAAsB,EAAE,EAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,uBAAuB,EAAE,CAa3B;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,qBAAqB,GAAG,SAAS,CAAA;CAAE,CAAC;AAE3D;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsI7G"}
@@ -13,6 +13,8 @@
13
13
  * v1.1.0 — 2026-06-21 — Allow replying to an AGENT/eco identity that messaged you: the stored copy +
14
14
  * conversation keep the agent GAII (so the thread is intact), but delivery is routed to the agent's
15
15
  * OWNER human inbox (the owner reads + acts on their agent's DMs) — works on un-upgraded peers too.
16
+ * v1.2.0 — 2026-06-23 — Carry the optional `interactive` payload (federated AskUserQuestion) onto every
17
+ * stored copy + the dm.inbound push (as the role) so questions/answers survive send + delivery.
16
18
  */
17
19
  import { randomUUID } from 'node:crypto';
18
20
  import { isSameOwner, parseGaiiLoose } from '../utils/gaii.js';
@@ -49,7 +51,7 @@ export function mapMessageAttachments(input, senderGhii, nodeId) {
49
51
  */
50
52
  export async function sendDirectMessage(ctx, input) {
51
53
  const { config, storage } = ctx;
52
- const { senderGhii, recipientGhii, body, replyToId, attachments, subject } = input;
54
+ const { senderGhii, recipientGhii, body, replyToId, attachments, subject, interactive, broadcastId, respondable } = input;
53
55
  // recipientGhii is what the thread is WITH (may be an agent/eco GAII). deliveryGhii is where the
54
56
  // message physically lands (the owner's human GHII for an agent/eco recipient; itself for a human).
55
57
  const deliveryGhii = deliveryTargetFor(recipientGhii);
@@ -72,7 +74,7 @@ export async function sendDirectMessage(ctx, input) {
72
74
  // Record the sender's own copy as undeliverable; do not deliver to the recipient.
73
75
  await storage.createDirectMessage({
74
76
  id, ownerGhii: senderGhii, conversationId, subject, senderGhii, recipientGhii,
75
- body, attachments, status: 'undeliverable', direction: 'outbound',
77
+ body, attachments, interactive, broadcastId, respondable, status: 'undeliverable', direction: 'outbound',
76
78
  replyToId, origin: 'local', originNodeId: config.nodeId,
77
79
  error: 'blocked', createdAt: now,
78
80
  });
@@ -82,7 +84,7 @@ export async function sendDirectMessage(ctx, input) {
82
84
  // Sender's outbound copy.
83
85
  const senderCopy = {
84
86
  id, ownerGhii: senderGhii, conversationId, subject, senderGhii, recipientGhii,
85
- body, attachments,
87
+ body, attachments, interactive, broadcastId, respondable,
86
88
  status: isLocal ? 'delivered' : 'queued',
87
89
  direction: 'outbound', replyToId,
88
90
  origin: 'local', originNodeId: config.nodeId,
@@ -107,7 +109,9 @@ export async function sendDirectMessage(ctx, input) {
107
109
  // Resolve / seed the recipient-side contact state (first-contact gate) under the OWNER's inbox.
108
110
  let contact = await storage.getContact(deliveryGhii, senderGhii);
109
111
  if (!contact) {
110
- const autoAccept = isSameOwner(senderGhii, deliveryGhii);
112
+ // skipContactGate (operator announcements) auto-accepts so a node/federation-wide notice lands
113
+ // in the inbox instead of the first-contact requests bucket.
114
+ const autoAccept = isSameOwner(senderGhii, deliveryGhii) || !!input.skipContactGate;
111
115
  contact = await storage.setContactState(deliveryGhii, senderGhii, autoAccept ? 'accepted' : 'pending', id);
112
116
  }
113
117
  isRequest = contact.state === 'pending';
@@ -116,7 +120,7 @@ export async function sendDirectMessage(ctx, input) {
116
120
  // mailbox it lands in (the owner, or the agent itself for your own agent — see above).
117
121
  await storage.createDirectMessage({
118
122
  id, ownerGhii: inboundOwner, conversationId, subject, senderGhii, recipientGhii,
119
- body, attachments, status: 'delivered', direction: 'inbound',
123
+ body, attachments, interactive, broadcastId, respondable, status: 'delivered', direction: 'inbound',
120
124
  replyToId, origin: 'local', originNodeId: config.nodeId,
121
125
  createdAt: now, deliveredAt: now,
122
126
  });
@@ -154,6 +158,8 @@ export async function sendDirectMessage(ctx, input) {
154
158
  payload: {
155
159
  id, conversationId, subject: subject ?? null, senderGhii,
156
160
  preview: messagePreview(body), attachments: attachments?.length ?? 0, createdAt: now,
161
+ // Let the woken agent distinguish a question it should answer from a normal/answer DM.
162
+ interactive: interactive?.role ?? null,
157
163
  },
158
164
  });
159
165
  }
@@ -1 +1 @@
1
- {"version":3,"file":"message-send.js","sourceRoot":"","sources":["../../../src/services/message-send.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAoB,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAe1E;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAA+B,EAC/B,UAAkB,EAClB,MAAc;IAEd,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,SAAS,EAAE,UAAU;QACrB,YAAY,EAAE,MAAM;QACpB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAC;AACN,CAAC;AAMD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAgB,EAAE,KAAuB;IAC/E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAChC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAEnF,iGAAiG;IACjG,oGAAoG;IACpG,MAAM,YAAY,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,OAAO,GAAG,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC;IAEhD,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,sGAAsG;IACtG,wGAAwG;IACxG,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc;WACtC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IAE7E,+FAA+F;IAC/F,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,cAAc,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACnE,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YACjC,kFAAkF;YAClF,MAAM,OAAO,CAAC,mBAAmB,CAAC;gBAChC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa;gBAC7E,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU;gBACjE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM;gBACvD,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG;aACjC,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,UAAU,GAAwB;QACtC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa;QAC7E,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;QACxC,SAAS,EAAE,UAAU,EAAE,SAAS;QAChC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM;QAC5C,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;KACvD,CAAC;IACF,MAAM,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAE9C,qGAAqG;IACrG,oFAAoF;IACpF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC1E,IAAI,aAAa,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,OAAO,CAAC,eAAe,CAAC,UAAU,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,mGAAmG;QACnG,qGAAqG;QACrG,iGAAiG;QACjG,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,YAAY,KAAK,UAAU,CAAC;QAC7C,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;QAE7D,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,gGAAgG;YAChG,IAAI,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACjE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBACzD,OAAO,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC7G,CAAC;YACD,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC;QAC1C,CAAC;QAED,mGAAmG;QACnG,uFAAuF;QACvF,MAAM,OAAO,CAAC,mBAAmB,CAAC;YAChC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa;YAC/E,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS;YAC5D,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM;YACvD,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;SACjC,CAAC,CAAC;QAEH,oGAAoG;QACpG,sGAAsG;QACtG,yDAAyD;QACzD,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,IAAI,WAAW,EAAE,MAAM,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YACjE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,MAAM,2BAA2B,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC1E,IAAI,GAAG,CAAC,OAAO;oBAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE;gBAClC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,gBAAgB;gBAC7D,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,uBAAuB,CAAC,CAAC,CAAC,oBAAoB,UAAU,EAAE;gBAC1F,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,qBAAqB,cAAc,EAAE;aACvF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3H,UAAU,CAAC,UAAU,CAAC,CAAC;QAEvB,oGAAoG;QACpG,kGAAkG;QAClG,oGAAoG;QACpG,+FAA+F;QAC/F,IAAI,aAAa,KAAK,YAAY,EAAE,CAAC;YACnC,YAAY,CAAC;gBACX,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE;gBAC7C,qGAAqG;gBACrG,mGAAmG;gBACnG,mGAAmG;gBACnG,OAAO,EAAE;oBACP,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,UAAU;oBACxD,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG;iBACrF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,kGAAkG;QAClG,iGAAiG;QACjG,wFAAwF;QACxF,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QAC1E,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;QAC5B,IAAI,OAAO,KAAK,WAAW;YAAE,UAAU,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/E,UAAU,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"message-send.js","sourceRoot":"","sources":["../../../src/services/message-send.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,9 @@
29
29
  * @usage import { presence } from '../services/presence.js';
30
30
  * @version-history
31
31
  * v1.0.0 — 2026-06-19 — Initial presence feature (local + federated, change-driven push).
32
+ * v1.1.0 — 2026-06-23 — Agent/app (GAII/GEAI) presence: a principal now reports its OWN liveness, not
33
+ * its owner's — a live connect-tunnel socket → available, recently-seen (lastSeen) → away, else
34
+ * offline (LOCAL principals only). Previously a GAII fell through to `unknown`.
32
35
  */
33
36
  import type { AimeatConfig } from '../config.js';
34
37
  import type { Storage } from '../storage/interface.js';
@@ -71,6 +74,7 @@ export declare class PresenceTracker {
71
74
  private lastBroadcast;
72
75
  private dirty;
73
76
  private configCache;
77
+ private agentSeenCache;
74
78
  private remote;
75
79
  private snapshottedPeers;
76
80
  /** Wire runtime deps and start the throttled flush loop. Idempotent. */
@@ -92,6 +96,10 @@ export declare class PresenceTracker {
92
96
  /** Viewer-scoped status of a single target. */
93
97
  getVisible(viewerGhii: string, targetGhii: string): Promise<PresenceView>;
94
98
  getVisibleMany(viewerGhii: string, targets: string[]): Promise<PresenceView[]>;
99
+ /** Liveness of an agent/app principal (GAII/GEAI). LOCAL only — a remote node owns its principals'
100
+ * state, so a remote GAII is `unknown` (presence reads are always local). */
101
+ private getAgentStatus;
102
+ private getAgentLastSeen;
95
103
  private isContact;
96
104
  private isPeerActive;
97
105
  /** Apply a batch of presence updates pushed by a peer node. */
@@ -1 +1 @@
1
- {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../../src/services/presence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../../src/services/presence.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { sign } from '../auth/keypair.js';
2
2
  import { validateOutboundUrl } from '../utils/url-validator.js';
3
3
  import { emitChange } from './event-bus.js';
4
4
  import { parseGaiiLoose } from '../utils/gaii.js';
5
+ import { getActiveConnectTunnelManager } from './connect-tunnel.js';
5
6
  import { logger } from '../utils/logger.js';
6
7
  /** Memory key under the owner's GHII namespace that stores their presence config. */
7
8
  export const PRESENCE_CONFIG_KEY = 'presence.config';
@@ -15,6 +16,8 @@ const MANUAL_STATUSES = new Set(['available', 'busy', 'away', 'invisible']);
15
16
  const VISIBILITIES = new Set(['everyone', 'contacts', 'nobody']);
16
17
  const CONFIG_CACHE_TTL_MS = 30_000;
17
18
  const FLUSH_INTERVAL_MS = 60_000; // "at most once a minute" per the federation design
19
+ const AGENT_RECENT_MS = 5 * 60_000; // no live socket but seen within this → 'away' (amber)
20
+ const AGENT_SEEN_CACHE_TTL_MS = 15_000; // cache an agent's lastSeen briefly (avoid per-refresh DB hits)
18
21
  /** Canonical string that a node signs (and a receiver verifies) for a presence push. */
19
22
  export function presenceSignString(fromNodeId, timestamp, updates) {
20
23
  return `${fromNodeId}|${timestamp}|${JSON.stringify(updates)}`;
@@ -40,6 +43,7 @@ export class PresenceTracker {
40
43
  lastBroadcast = new Map(); // ghii → last status pushed to peers
41
44
  dirty = new Set(); // local ghiis with a pending delta
42
45
  configCache = new Map();
46
+ agentSeenCache = new Map(); // agent GAII → lastSeen
43
47
  // ── Remote (federated) cache ──
44
48
  remote = new Map(); // full ghii (owner@remoteNode) → entry
45
49
  snapshottedPeers = new Set(); // peer nodeIds we've sent a full snapshot to
@@ -163,6 +167,10 @@ export class PresenceTracker {
163
167
  async getVisible(viewerGhii, targetGhii) {
164
168
  if (viewerGhii === targetGhii)
165
169
  return this.getOwnStatus(targetGhii);
170
+ // An agent/app principal (GAII/GEAI, has '#') reports its OWN liveness, not its owner's: a connected
171
+ // tunnel socket → available; recently seen → away; else offline. Only LOCAL principals are knowable.
172
+ if (targetGhii.includes('#'))
173
+ return this.getAgentStatus(targetGhii);
166
174
  if (this.isLocalGhii(targetGhii)) {
167
175
  const cfg = await this.getConfig(targetGhii);
168
176
  const raw = this.rawStatus(cfg, this.isOnline(targetGhii));
@@ -184,6 +192,36 @@ export class PresenceTracker {
184
192
  async getVisibleMany(viewerGhii, targets) {
185
193
  return Promise.all(targets.map(t => this.getVisible(viewerGhii, t)));
186
194
  }
195
+ /** Liveness of an agent/app principal (GAII/GEAI). LOCAL only — a remote node owns its principals'
196
+ * state, so a remote GAII is `unknown` (presence reads are always local). */
197
+ async getAgentStatus(gaii) {
198
+ const { node } = parseGaiiLoose(gaii);
199
+ if (!this.config || node !== this.config.nodeId)
200
+ return { ghii: gaii, status: 'unknown', since: null };
201
+ // A live tunnel socket is the strongest "running right now" signal (in-memory, no DB).
202
+ if (getActiveConnectTunnelManager()?.isConnected(gaii))
203
+ return { ghii: gaii, status: 'available', since: null };
204
+ // No socket: recently-seen (last heartbeat/activity) → away; otherwise offline.
205
+ const lastSeen = await this.getAgentLastSeen(gaii);
206
+ if (lastSeen && Date.now() - new Date(lastSeen).getTime() < AGENT_RECENT_MS) {
207
+ return { ghii: gaii, status: 'away', since: lastSeen };
208
+ }
209
+ return { ghii: gaii, status: 'offline', since: lastSeen };
210
+ }
211
+ async getAgentLastSeen(gaii) {
212
+ const cached = this.agentSeenCache.get(gaii);
213
+ if (cached && cached.exp > Date.now())
214
+ return cached.lastSeen;
215
+ let lastSeen = null;
216
+ if (this.storage) {
217
+ try {
218
+ lastSeen = (await this.storage.getAgent(gaii))?.lastSeen ?? null;
219
+ }
220
+ catch { /* none */ }
221
+ }
222
+ this.agentSeenCache.set(gaii, { lastSeen, exp: Date.now() + AGENT_SEEN_CACHE_TTL_MS });
223
+ return lastSeen;
224
+ }
187
225
  async isContact(targetGhii, viewerGhii) {
188
226
  if (!this.storage)
189
227
  return false;