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.
- package/dist/locales/en.json +246 -1
- package/dist/locales/fi.json +246 -1
- package/dist/public/components/InboxLink.js +29 -0
- package/dist/public/components/offer-card-view.js +87 -0
- package/dist/public/css/views/companies.css +65 -0
- package/dist/public/css/views/inbox.css +153 -1
- package/dist/public/css/views/members.css +33 -0
- package/dist/public/css/views/my-company.css +315 -0
- package/dist/public/css/views/profile.css +22 -0
- package/dist/public/js/services/messages.js +21 -3
- package/dist/public/js/services/notebook.js +16 -6
- package/dist/public/llms-template.txt +7 -0
- package/dist/public/spa.html +14 -0
- package/dist/public/views/companies.js +190 -0
- package/dist/public/views/members.js +42 -0
- package/dist/public/views/my-company.js +664 -0
- package/dist/public/views/portfolio-themes.js +77 -0
- package/dist/public/views/profile/agents-tab.js +4 -1
- package/dist/public/views/profile/discover-tab.js +118 -0
- package/dist/public/views/profile/inbox-tab.js +663 -16
- package/dist/public/views/profile/landing-page.js +2 -1
- package/dist/public/views/profile/notebook-card.js +11 -3
- package/dist/public/views/profile/offers-tab.js +5 -24
- package/dist/public/views/profile/organisms/home.js +5 -3
- package/dist/public/views/profile/organisms/mindmap.js +14 -3
- package/dist/public/views/profile/organisms/workspace.js +5 -2
- package/dist/public/views/profile/organisms-tab.js +12 -4
- package/dist/public/views/profile.js +2 -0
- package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.js +34 -0
- package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts +1 -0
- package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/dm-messages.js +23 -0
- package/dist/src/cli/connect/mcp/tools/dm-messages.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/organisms.js +31 -0
- package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/workspaces.js +4 -0
- package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
- package/dist/src/generated/api-types.d.ts +249 -0
- package/dist/src/generated/api-types.d.ts.map +1 -1
- package/dist/src/generated/prisma-postgres/edge.js +6 -3
- package/dist/src/generated/prisma-postgres/index-browser.js +3 -0
- package/dist/src/generated/prisma-postgres/index.d.ts +112 -1
- package/dist/src/generated/prisma-postgres/index.js +6 -3
- package/dist/src/generated/prisma-postgres/package.json +1 -1
- package/dist/src/generated/prisma-postgres/schema.prisma +4 -0
- package/dist/src/generated/prisma-postgres/wasm.js +6 -3
- package/dist/src/mcp/annotations.d.ts.map +1 -1
- package/dist/src/mcp/annotations.js +2 -0
- package/dist/src/mcp/annotations.js.map +1 -1
- package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions.js +33 -1
- package/dist/src/mcp/catalog/definitions.js.map +1 -1
- package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
- package/dist/src/mcp/catalog/scopes.js +1 -0
- package/dist/src/mcp/catalog/scopes.js.map +1 -1
- package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
- package/dist/src/mcp/catalog/surfaces.js +7 -4
- package/dist/src/mcp/catalog/surfaces.js.map +1 -1
- package/dist/src/mcp/core.d.ts.map +1 -1
- package/dist/src/mcp/core.js +49 -0
- package/dist/src/mcp/core.js.map +1 -1
- package/dist/src/mcp/dm-messages.d.ts +2 -0
- package/dist/src/mcp/dm-messages.d.ts.map +1 -1
- package/dist/src/mcp/dm-messages.js +45 -1
- package/dist/src/mcp/dm-messages.js.map +1 -1
- package/dist/src/models/message-schemas.d.ts +140 -2
- package/dist/src/models/message-schemas.d.ts.map +1 -1
- package/dist/src/models/message-schemas.js +60 -3
- package/dist/src/models/message-schemas.js.map +1 -1
- package/dist/src/routes/bootstrap.d.ts.map +1 -1
- package/dist/src/routes/bootstrap.js +3 -0
- package/dist/src/routes/bootstrap.js.map +1 -1
- package/dist/src/routes/discover.d.ts +22 -0
- package/dist/src/routes/discover.d.ts.map +1 -0
- package/dist/src/routes/discover.js +123 -0
- package/dist/src/routes/discover.js.map +1 -0
- package/dist/src/routes/federation-sync.d.ts.map +1 -1
- package/dist/src/routes/federation-sync.js +69 -2
- package/dist/src/routes/federation-sync.js.map +1 -1
- package/dist/src/routes/messages.d.ts.map +1 -1
- package/dist/src/routes/messages.js +102 -3
- package/dist/src/routes/messages.js.map +1 -1
- package/dist/src/routes/organisms.d.ts +3 -0
- package/dist/src/routes/organisms.d.ts.map +1 -1
- package/dist/src/routes/organisms.js +11 -32
- package/dist/src/routes/organisms.js.map +1 -1
- package/dist/src/routes/portal.d.ts.map +1 -1
- package/dist/src/routes/portal.js +3 -0
- package/dist/src/routes/portal.js.map +1 -1
- package/dist/src/routes/portfolio.d.ts.map +1 -1
- package/dist/src/routes/portfolio.js +30 -0
- package/dist/src/routes/portfolio.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +2 -0
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/services/connect-tunnel.d.ts +3 -0
- package/dist/src/services/connect-tunnel.d.ts.map +1 -1
- package/dist/src/services/connect-tunnel.js +6 -0
- package/dist/src/services/connect-tunnel.js.map +1 -1
- package/dist/src/services/discovery/__tests__/discovery.test.d.ts +2 -0
- package/dist/src/services/discovery/__tests__/discovery.test.d.ts.map +1 -0
- package/dist/src/services/discovery/__tests__/discovery.test.js +178 -0
- package/dist/src/services/discovery/__tests__/discovery.test.js.map +1 -0
- package/dist/src/services/discovery/classify.d.ts +36 -0
- package/dist/src/services/discovery/classify.d.ts.map +1 -0
- package/dist/src/services/discovery/classify.js +61 -0
- package/dist/src/services/discovery/classify.js.map +1 -0
- package/dist/src/services/discovery/facets.d.ts +21 -0
- package/dist/src/services/discovery/facets.d.ts.map +1 -0
- package/dist/src/services/discovery/facets.js +0 -0
- package/dist/src/services/discovery/facets.js.map +1 -0
- package/dist/src/services/discovery/index.d.ts +22 -0
- package/dist/src/services/discovery/index.d.ts.map +1 -0
- package/dist/src/services/discovery/index.js +22 -0
- package/dist/src/services/discovery/index.js.map +1 -0
- package/dist/src/services/discovery/normalize.d.ts +25 -0
- package/dist/src/services/discovery/normalize.d.ts.map +1 -0
- package/dist/src/services/discovery/normalize.js +108 -0
- package/dist/src/services/discovery/normalize.js.map +1 -0
- package/dist/src/services/discovery/registry.d.ts +30 -0
- package/dist/src/services/discovery/registry.d.ts.map +1 -0
- package/dist/src/services/discovery/registry.js +31 -0
- package/dist/src/services/discovery/registry.js.map +1 -0
- package/dist/src/services/discovery/run.d.ts +23 -0
- package/dist/src/services/discovery/run.d.ts.map +1 -0
- package/dist/src/services/discovery/run.js +20 -0
- package/dist/src/services/discovery/run.js.map +1 -0
- package/dist/src/services/discovery/setup.d.ts +16 -0
- package/dist/src/services/discovery/setup.d.ts.map +1 -0
- package/dist/src/services/discovery/setup.js +12 -0
- package/dist/src/services/discovery/setup.js.map +1 -0
- package/dist/src/services/discovery/sources/memory-source.d.ts +24 -0
- package/dist/src/services/discovery/sources/memory-source.d.ts.map +1 -0
- package/dist/src/services/discovery/sources/memory-source.js +183 -0
- package/dist/src/services/discovery/sources/memory-source.js.map +1 -0
- package/dist/src/services/discovery/sources/table-sources.d.ts +27 -0
- package/dist/src/services/discovery/sources/table-sources.d.ts.map +1 -0
- package/dist/src/services/discovery/sources/table-sources.js +128 -0
- package/dist/src/services/discovery/sources/table-sources.js.map +1 -0
- package/dist/src/services/discovery/types.d.ts +117 -0
- package/dist/src/services/discovery/types.d.ts.map +1 -0
- package/dist/src/services/discovery/types.js +19 -0
- package/dist/src/services/discovery/types.js.map +1 -0
- package/dist/src/services/handbooks/agent.d.ts +1 -1
- package/dist/src/services/handbooks/agent.d.ts.map +1 -1
- package/dist/src/services/handbooks/agent.js +9 -3
- package/dist/src/services/handbooks/agent.js.map +1 -1
- package/dist/src/services/message-broadcast.d.ts +49 -0
- package/dist/src/services/message-broadcast.d.ts.map +1 -0
- package/dist/src/services/message-broadcast.js +116 -0
- package/dist/src/services/message-broadcast.js.map +1 -0
- package/dist/src/services/message-delivery.d.ts.map +1 -1
- package/dist/src/services/message-delivery.js +3 -0
- package/dist/src/services/message-delivery.js.map +1 -1
- package/dist/src/services/message-send.d.ts +9 -1
- package/dist/src/services/message-send.d.ts.map +1 -1
- package/dist/src/services/message-send.js +11 -5
- package/dist/src/services/message-send.js.map +1 -1
- package/dist/src/services/presence.d.ts +8 -0
- package/dist/src/services/presence.d.ts.map +1 -1
- package/dist/src/services/presence.js +38 -0
- package/dist/src/services/presence.js.map +1 -1
- package/dist/src/services/workspace-enrichment.d.ts +15 -5
- package/dist/src/services/workspace-enrichment.d.ts.map +1 -1
- package/dist/src/services/workspace-enrichment.js +52 -14
- package/dist/src/services/workspace-enrichment.js.map +1 -1
- package/dist/src/storage/interface.d.ts +49 -0
- package/dist/src/storage/interface.d.ts.map +1 -1
- package/dist/src/storage/providers/mongodb/index.d.ts +1 -0
- package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
- package/dist/src/storage/providers/mongodb/index.js +16 -0
- package/dist/src/storage/providers/mongodb/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/index.d.ts +1 -0
- package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/index.js +3 -0
- package/dist/src/storage/providers/sqlite/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts +3 -0
- package/dist/src/storage/providers/sqlite/repos/direct-message.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/direct-message.js +15 -2
- package/dist/src/storage/providers/sqlite/repos/direct-message.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +10 -0
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/dist/src/storage/repositories/direct-message.repository.d.ts +3 -0
- package/dist/src/storage/repositories/direct-message.repository.d.ts.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.postgres.prisma +4 -0
- 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 ``. 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
|
|
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 ``. 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,
|
|
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\` → \`\`. 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.** \`
|
|
85
|
-
|
|
86
|
-
|
|
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
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA8B5C,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAgB,EAAE,UAAkB,EAAE,GAAqB;IAC/F,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,KAAK;YAAE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,GAAG,CAAC,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAG,4DAA4D;QAC3G,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,IAAI,CAAC,CAAC,IAAI;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,8BAA8B;IACtD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC;AAED;oGACoG;AACpG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAgB,EAAE,KAAqB;IACzE,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;IAClD,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,aAAa,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,aAAa,KAAK,KAAK,CAAC,UAAU;YAAE,SAAS;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE;gBAC1C,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,aAAa;gBACb,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;gBACtB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,WAAW;gBACX,WAAW;gBACX,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,EAAE;gBAAE,IAAI,EAAE,CAAC;;gBACjB,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC;AAED;;;8DAG8D;AAC9D,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAgB,EAChB,KAAuI;IAEvI,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IACvC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAClG,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG;gBACd,WAAW,EAAE,MAAM,CAAC,MAAM;gBAC1B,SAAS,EAAE;oBACT,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;oBACtB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;oBACtC,WAAW,EAAE,KAAK,CAAC,IAAI,KAAK,cAAc;oBAC1C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5G,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,0BAA0B,EAAE;gBAC9D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;gBAC/E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;gBAC/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,IAAI,IAAI,CAAC;aAChE,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE;gBAAE,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -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;
|
|
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":"
|
|
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
|
-
|
|
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
|
|
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":"AAAA
|
|
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;
|