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,23 @@
1
+ /**
2
+ * @file run.ts
3
+ * @description The discovery orchestrator — the domain-agnostic core of `/v1/discover`. It iterates a
4
+ * `DiscoveryRegistry`, fans `enumerate()` across every registered source, maps rows to
5
+ * `DiscoveryEntry` via each source's `toEntry()`, applies the gating pass (§6 — Phase 1 covers
6
+ * scope=own/public; cross-member `workspace`/`consent` gating arrives in Phase 3), then filters,
7
+ * ranks and returns the unified set. Contains NO domain-specific logic — that all lives in adapters.
8
+ * @structure
9
+ * - runDiscovery() — registry + context → ranked DiscoveryEntry[]
10
+ * - rankEntries() — relevance (score) then recency
11
+ * @usage const entries = await runDiscovery(registry, ctx);
12
+ * @version-history
13
+ * v0.1.0 — 2026-06-23 — Phase 1: fan-out + filter + rank (design doc 2026-06-23). Phase-3 gating TODO.
14
+ */
15
+ import type { DiscoveryContext, DiscoveryEntry } from './types.js';
16
+ import type { DiscoveryRegistry } from './registry.js';
17
+ /**
18
+ * Fan across all registered sources and return the gated, filtered, ranked entry set.
19
+ * Phase 1: gating is satisfied at the source (own = caller-owned; public = visibility-filtered).
20
+ * Phase 3 will insert a per-hit `canReadWorkspace`/consent pass here for scope=shared.
21
+ */
22
+ export declare function runDiscovery(registry: DiscoveryRegistry, ctx: DiscoveryContext): Promise<DiscoveryEntry[]>;
23
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../src/services/discovery/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAQvD;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,cAAc,EAAE,CAAC,CAU3B"}
@@ -0,0 +1,20 @@
1
+ import { applyFilters } from './facets.js';
2
+ /** Rank by relevance (FTS score desc) then recency (updatedAt desc). */
3
+ function rankEntries(entries) {
4
+ return entries.sort((a, b) => b.score - a.score || (a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0));
5
+ }
6
+ /**
7
+ * Fan across all registered sources and return the gated, filtered, ranked entry set.
8
+ * Phase 1: gating is satisfied at the source (own = caller-owned; public = visibility-filtered).
9
+ * Phase 3 will insert a per-hit `canReadWorkspace`/consent pass here for scope=shared.
10
+ */
11
+ export async function runDiscovery(registry, ctx) {
12
+ const sources = registry.all();
13
+ const perSource = await Promise.all(sources.map(async (src) => {
14
+ const raws = await src.enumerate(ctx);
15
+ return raws.map(raw => src.toEntry(raw, ctx));
16
+ }));
17
+ const all = perSource.flat();
18
+ return rankEntries(applyFilters(all, ctx.filters));
19
+ }
20
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/services/discovery/run.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,wEAAwE;AACxE,SAAS,WAAW,CAAC,OAAyB;IAC5C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3H,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA2B,EAC3B,GAAqB;IAErB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CACH,CAAC;IACF,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @file setup.ts
3
+ * @description Builds the canonical `DiscoveryRegistry` with every production source registered, so
4
+ * the REST route (`/v1/discover`) and the MCP tool (`aimeat_discover`) share ONE source list and
5
+ * can never drift. Adding a content type = add one `register()` here (design §7) and both surfaces
6
+ * pick it up.
7
+ * @structure buildDiscoveryRegistry(storage, config) → DiscoveryRegistry (memory + capabilities + apps + agent-tasks)
8
+ * @usage const registry = buildDiscoveryRegistry(storage, config);
9
+ * @version-history
10
+ * v0.1.0 — 2026-06-23 — Phase 4: shared registry builder for REST + MCP surfaces (design doc 2026-06-23).
11
+ */
12
+ import type { AimeatConfig } from '../../config.js';
13
+ import type { Storage } from '../../storage/interface.js';
14
+ import { type DiscoveryRegistry } from './registry.js';
15
+ export declare function buildDiscoveryRegistry(storage: Storage, config: AimeatConfig): DiscoveryRegistry;
16
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/services/discovery/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAIvE,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,iBAAiB,CAOhG"}
@@ -0,0 +1,12 @@
1
+ import { createRegistry } from './registry.js';
2
+ import { createMemorySource } from './sources/memory-source.js';
3
+ import { createCapabilitiesSource, createAppsSource, createAgentTasksSource } from './sources/table-sources.js';
4
+ export function buildDiscoveryRegistry(storage, config) {
5
+ const registry = createRegistry();
6
+ registry.register(createMemorySource(storage, config)); // all memory-backed domains
7
+ registry.register(createCapabilitiesSource(storage, config)); // capabilities table
8
+ registry.register(createAppsSource(storage, config)); // apps table
9
+ registry.register(createAgentTasksSource(storage, config)); // agent_tasks table
10
+ return registry;
11
+ }
12
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/services/discovery/setup.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,cAAc,EAA0B,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEhH,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,MAAoB;IAC3E,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAQ,4BAA4B;IAC3F,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAE,qBAAqB;IACpF,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAU,aAAa;IAC5E,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAI,oBAAoB;IACnF,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @file memory-source.ts
3
+ * @description The FTS/memory `DiscoverySource` adapter — the Phase 1 workhorse that surfaces every
4
+ * memory-backed domain (knowledge, documents, decisions, workflows, companies, offerings, research,
5
+ * material, plain memory) in one place. Query path uses the `storage.searchText()` FTS primitive;
6
+ * no-query path (map/browse mode) lists memory. Identity resolution implements the ratified agent
7
+ * scope rule (§11.3): an agent sees the FULL owner identity set, but only if it holds `memory:read`
8
+ * — otherwise it is restricted to its own GAII. Each row is classified + normalized into a
9
+ * `DiscoveryEntry` via the shared pure helpers.
10
+ * @structure
11
+ * - createMemorySource(storage, config) → DiscoverySource
12
+ * - resolveOwnerSet() — identity set per scope + agent read-scope (§11.3)
13
+ * - enumerate() — searchText (q) or listing (no-q) → MemHit[]
14
+ * - toEntry() — classify + normalize → DiscoveryEntry
15
+ * @usage registry.register(createMemorySource(storage, config));
16
+ * @version-history
17
+ * v0.1.0 — 2026-06-23 — Phase 1: memory/FTS source over searchText + listing (design doc 2026-06-23).
18
+ */
19
+ import type { AimeatConfig } from '../../../config.js';
20
+ import type { Storage } from '../../../storage/interface.js';
21
+ import type { DiscoverySource } from '../types.js';
22
+ export declare const MEMORY_SOURCE_ID = "memory-fts";
23
+ export declare function createMemorySource(storage: Storage, config: AimeatConfig): DiscoverySource;
24
+ //# sourceMappingURL=memory-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-source.d.ts","sourceRoot":"","sources":["../../../../../src/services/discovery/sources/memory-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,+BAA+B,CAAC;AAE3F,OAAO,KAAK,EAAoC,eAAe,EAAU,MAAM,aAAa,CAAC;AAI7F,eAAO,MAAM,gBAAgB,eAAe,CAAC;AA6I7C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,eAAe,CA4D1F"}
@@ -0,0 +1,183 @@
1
+ import { canReadWorkspace } from '../../workspace-access.js';
2
+ import { classifyMemoryKey } from '../classify.js';
3
+ import { bestTitle, bestDescription, normalizeTags, normalizeVisibility, toFullOwner } from '../normalize.js';
4
+ export const MEMORY_SOURCE_ID = 'memory-fts';
5
+ const MAX_LIMIT = 100;
6
+ /** Plain searchable text of a value (string leaves joined) — for a fallback description. */
7
+ function flattenText(value) {
8
+ if (value == null)
9
+ return '';
10
+ if (typeof value === 'string')
11
+ return value;
12
+ if (typeof value === 'number' || typeof value === 'boolean')
13
+ return String(value);
14
+ if (Array.isArray(value))
15
+ return value.map(flattenText).join(' ');
16
+ if (typeof value === 'object') {
17
+ const v = value;
18
+ if (typeof v.markdown === 'string')
19
+ return v.markdown;
20
+ return Object.values(v).map(flattenText).join(' ');
21
+ }
22
+ return '';
23
+ }
24
+ function clip(s, max) {
25
+ const one = s.replace(/\s+/g, ' ').trim();
26
+ return one.length > max ? one.slice(0, max - 1) + '…' : one;
27
+ }
28
+ function contentTypeOf(key, value) {
29
+ if (!key.endsWith('/manifest'))
30
+ return undefined;
31
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
32
+ const ct = value.content_type;
33
+ if (typeof ct === 'string')
34
+ return ct;
35
+ }
36
+ return undefined;
37
+ }
38
+ function toMemHit(rec, score) {
39
+ return {
40
+ key: rec.key,
41
+ ownerGaii: rec.ownerGaii,
42
+ value: rec.value,
43
+ visibility: rec.visibility,
44
+ tags: rec.tags ?? [],
45
+ updatedAt: rec.updatedAt,
46
+ score,
47
+ flagCount: rec.flagCount ?? 0,
48
+ contentType: contentTypeOf(rec.key, rec.value),
49
+ };
50
+ }
51
+ /**
52
+ * Resolve which owner identities to search for the `own` scope, honoring the agent read-scope rule.
53
+ * Returns null for the public scope (caller wants whole-node public content, not an owner set).
54
+ */
55
+ async function resolveOwnerSet(storage, config, ctx) {
56
+ if (ctx.scope === 'public')
57
+ return null;
58
+ const ghii = `${ctx.caller.ownerName}@${config.nodeId}`;
59
+ const fullSet = ctx.caller.isOwnerSession || ctx.caller.scopes.includes('memory:read');
60
+ if (!fullSet)
61
+ return [ctx.caller.gaii]; // agent without memory:read → its own content only (§11.3)
62
+ const [agents, ecoApps] = await Promise.all([
63
+ storage.getAgentsByOwner(ctx.caller.ownerName),
64
+ storage.getEcosystemAppsByOwner(ctx.caller.ownerName),
65
+ ]);
66
+ return [ghii, ...agents.map(a => a.gaii), ...ecoApps.map(a => a.geai)];
67
+ }
68
+ const WS_KEY = /^organism\.([^.]+)\.w\.([^.]+)\.([^.]+)/; // organism.{id}.w.{ws}.{space}…
69
+ /**
70
+ * Shared scope (design §6, the security-critical path): surface content in organisms the caller is an
71
+ * ACTIVE member of, but only the workspaces they are actually allowed to read. Every candidate hit is
72
+ * gated by `canReadWorkspace()` — the SAME gate as the REST workspace read — so nothing leaks. The
73
+ * decision is memoized per `(organism, workspace)` so a workspace with N hits costs ONE gate check.
74
+ */
75
+ async function enumerateShared(storage, config, ctx) {
76
+ if (!ctx.caller.ownerName)
77
+ return [];
78
+ const limit = Math.min(ctx.filters.limit ?? 50, MAX_LIMIT);
79
+ const q = ctx.filters.q?.trim();
80
+ const memberships = (await storage.listMembershipsByGhii(ctx.caller.ownerName)).filter(m => m.status === 'active');
81
+ if (memberships.length === 0)
82
+ return [];
83
+ const orgCache = new Map();
84
+ const gateCache = new Map();
85
+ const out = [];
86
+ for (const mem of memberships) {
87
+ const orgId = mem.organismId;
88
+ const prefix = `organism.${orgId}.w.`;
89
+ let pairs;
90
+ if (q) {
91
+ const raw = await storage.searchText(q, { keyPrefix: prefix, limit, maxFlags: 0 });
92
+ pairs = raw.map(r => ({ rec: r.record, score: r.score }));
93
+ }
94
+ else {
95
+ const { items } = await storage.listAllMemory({ prefix, limit });
96
+ pairs = items.filter(r => (r.flagCount ?? 0) === 0).map(rec => ({ rec, score: 0 }));
97
+ }
98
+ for (const { rec, score } of pairs) {
99
+ const m = WS_KEY.exec(rec.key);
100
+ if (!m)
101
+ continue;
102
+ const ws = m[2];
103
+ const space = m[3];
104
+ if (space === 'meta')
105
+ continue; // skip manifests / workspace meta / comments
106
+ if (rec.key.includes('.history.'))
107
+ continue; // skip version history
108
+ const gk = `${orgId}|${ws}`;
109
+ let allowed = gateCache.get(gk);
110
+ if (allowed === undefined) {
111
+ let org = orgCache.get(orgId);
112
+ if (org === undefined) {
113
+ org = await storage.getOrganism(orgId);
114
+ orgCache.set(orgId, org);
115
+ }
116
+ allowed = org
117
+ ? await canReadWorkspace(storage, config, org, ctx.caller.sub, ctx.caller.ownerName, ctx.caller.gaii, ws)
118
+ : false;
119
+ gateCache.set(gk, allowed);
120
+ }
121
+ if (allowed)
122
+ out.push(toMemHit(rec, score));
123
+ }
124
+ }
125
+ return out;
126
+ }
127
+ export function createMemorySource(storage, config) {
128
+ return {
129
+ id: MEMORY_SOURCE_ID,
130
+ gating: 'visibility',
131
+ async enumerate(ctx) {
132
+ if (ctx.scope === 'shared') {
133
+ const shared = await enumerateShared(storage, config, ctx);
134
+ return shared.map(h => ({ sourceId: MEMORY_SOURCE_ID, record: h, score: h.score }));
135
+ }
136
+ const limit = Math.min(ctx.filters.limit ?? 50, MAX_LIMIT);
137
+ const q = ctx.filters.q?.trim();
138
+ const ownerGaiis = await resolveOwnerSet(storage, config, ctx);
139
+ let hits;
140
+ if (q) {
141
+ // Query path: ranked FTS. Public scope restricts to public visibility node-wide.
142
+ const raw = await storage.searchText(q, {
143
+ ownerGaiis: ownerGaiis ?? undefined,
144
+ visibility: ownerGaiis ? undefined : 'public',
145
+ limit,
146
+ maxFlags: 0,
147
+ });
148
+ hits = raw.map(({ record, score }) => toMemHit(record, score));
149
+ }
150
+ else if (ownerGaiis) {
151
+ // No-query own scope: list each identity's memory, merge, slice.
152
+ const lists = await Promise.all(ownerGaiis.map(gaii => storage.listMemory(gaii, { maxFlags: 0 })));
153
+ hits = lists.flat().map(rec => toMemHit(rec, 0));
154
+ }
155
+ else {
156
+ // No-query public scope: list public memory node-wide.
157
+ const { items } = await storage.listAllMemory({ visibility: 'public', limit });
158
+ hits = items.filter(r => (r.flagCount ?? 0) === 0).map(rec => toMemHit(rec, 0));
159
+ }
160
+ return hits.map(h => ({ sourceId: MEMORY_SOURCE_ID, record: h, score: h.score }));
161
+ },
162
+ toEntry(raw, _ctx) {
163
+ const h = raw.record;
164
+ const { type, segment } = classifyMemoryKey(h.key, { tags: h.tags, contentType: h.contentType });
165
+ const description = bestDescription(h.value) || clip(flattenText(h.value), 240);
166
+ return {
167
+ type,
168
+ segment,
169
+ id: h.key,
170
+ title: bestTitle(h.value, h.key.split('.').pop() || h.key),
171
+ description,
172
+ tags: normalizeTags({ tags: h.tags }),
173
+ visibility: normalizeVisibility(h.visibility),
174
+ owner: toFullOwner(h.ownerGaii, config.nodeId),
175
+ node: config.nodeId,
176
+ score: h.score,
177
+ updatedAt: h.updatedAt,
178
+ href: `/v1/memory/${encodeURIComponent(h.key)}`,
179
+ };
180
+ },
181
+ };
182
+ }
183
+ //# sourceMappingURL=memory-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-source.js","sourceRoot":"","sources":["../../../../../src/services/discovery/sources/memory-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @file table-sources.ts
3
+ * @description The Phase 2 table-backed `DiscoverySource` adapters — capabilities, apps, and agent
4
+ * tasks. These domains live in dedicated SQL tables (outside the memory FTS index), so each adapter
5
+ * enumerates via the domain's existing list method and maps rows into the shared `DiscoveryEntry`
6
+ * shape. Registering them alongside the memory source (Phase 1) proves the registry pattern with
7
+ * heterogeneous sources — the `/v1/discover` handler does not change. Scope handling: `own` lists
8
+ * the caller's own records; `public` lists publicly-visible records node-wide (agent tasks are
9
+ * owner-only and never appear in the public scope).
10
+ * @structure
11
+ * - createCapabilitiesSource() — capabilities table → type 'capability'
12
+ * - createAppsSource() — apps table (latest version per app) → type 'app'
13
+ * - createAgentTasksSource() — agent_tasks table → type 'material'
14
+ * @usage registry.register(createCapabilitiesSource(storage, config)); …
15
+ * @version-history
16
+ * v0.1.0 — 2026-06-23 — Phase 2: capabilities / apps / agent-task adapters (design doc 2026-06-23).
17
+ */
18
+ import type { AimeatConfig } from '../../../config.js';
19
+ import type { Storage } from '../../../storage/interface.js';
20
+ import type { DiscoverySource } from '../types.js';
21
+ export declare const CAPABILITIES_SOURCE_ID = "capabilities";
22
+ export declare const APPS_SOURCE_ID = "apps";
23
+ export declare const AGENT_TASKS_SOURCE_ID = "agent-tasks";
24
+ export declare function createCapabilitiesSource(storage: Storage, config: AimeatConfig): DiscoverySource;
25
+ export declare function createAppsSource(storage: Storage, config: AimeatConfig): DiscoverySource;
26
+ export declare function createAgentTasksSource(storage: Storage, config: AimeatConfig): DiscoverySource;
27
+ //# sourceMappingURL=table-sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-sources.d.ts","sourceRoot":"","sources":["../../../../../src/services/discovery/sources/table-sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAgD,MAAM,+BAA+B,CAAC;AAE3G,OAAO,KAAK,EAAoC,eAAe,EAAU,MAAM,aAAa,CAAC;AAG7F,eAAO,MAAM,sBAAsB,iBAAiB,CAAC;AACrD,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAOnD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,eAAe,CAiChG;AAcD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,eAAe,CAgCxF;AAGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,eAAe,CAkC9F"}
@@ -0,0 +1,128 @@
1
+ import { parseGaiiLoose } from '../../../utils/gaii.js';
2
+ import { normalizeTags, normalizeVisibility, parkedToVisibility, toFullOwner } from '../normalize.js';
3
+ export const CAPABILITIES_SOURCE_ID = 'capabilities';
4
+ export const APPS_SOURCE_ID = 'apps';
5
+ export const AGENT_TASKS_SOURCE_ID = 'agent-tasks';
6
+ const MAX = 100;
7
+ const limitOf = (ctx) => Math.min(ctx.filters.limit ?? 50, MAX);
8
+ const ghiiOf = (ctx, config) => `${ctx.caller.ownerName}@${config.nodeId}`;
9
+ // ── Capabilities ──────────────────────────────────────────────────────────────
10
+ export function createCapabilitiesSource(storage, config) {
11
+ return {
12
+ id: CAPABILITIES_SOURCE_ID,
13
+ gating: 'visibility',
14
+ async enumerate(ctx) {
15
+ // No per-member capability sharing model — shared scope adds nothing here.
16
+ if (ctx.scope === 'shared')
17
+ return [];
18
+ const perPage = limitOf(ctx);
19
+ const search = ctx.filters.q?.trim() || undefined; // honor free-text query (native FTS-ish filter)
20
+ const filter = ctx.scope === 'public'
21
+ ? { visibility: 'public', status: 'active', search, perPage }
22
+ : { ownerGhii: ghiiOf(ctx, config), search, perPage };
23
+ const { capabilities } = await storage.listCapabilities(filter);
24
+ return capabilities.map(c => ({ sourceId: CAPABILITIES_SOURCE_ID, record: c, score: 0 }));
25
+ },
26
+ toEntry(raw) {
27
+ const c = raw.record;
28
+ return {
29
+ type: 'capability',
30
+ segment: c.source?.type ?? null,
31
+ id: c.id,
32
+ title: c.name,
33
+ description: c.summary ?? '',
34
+ tags: normalizeTags({ tags: c.tags }),
35
+ visibility: normalizeVisibility(c.visibility),
36
+ owner: toFullOwner(c.ownerGhii, config.nodeId),
37
+ node: config.nodeId,
38
+ score: 0,
39
+ updatedAt: c.updatedAt,
40
+ href: `/v1/capabilities/${encodeURIComponent(c.id)}`,
41
+ };
42
+ },
43
+ };
44
+ }
45
+ // ── Apps ───────────────────────────────────────────────────────────────────────
46
+ /** Keep one row per app (owner+filename), preferring the highest version number. */
47
+ function latestApps(apps) {
48
+ const best = new Map();
49
+ for (const a of apps) {
50
+ const key = `${a.ownerGaii}/${a.filename}`;
51
+ const cur = best.get(key);
52
+ if (!cur || a.versionNumber > cur.versionNumber)
53
+ best.set(key, a);
54
+ }
55
+ return [...best.values()];
56
+ }
57
+ export function createAppsSource(storage, config) {
58
+ return {
59
+ id: APPS_SOURCE_ID,
60
+ gating: 'visibility',
61
+ async enumerate(ctx) {
62
+ if (ctx.scope === 'shared')
63
+ return [];
64
+ const limit = limitOf(ctx);
65
+ const q = ctx.filters.q?.trim() || undefined; // honor free-text query
66
+ const opts = ctx.scope === 'public'
67
+ ? { q, limit }
68
+ : { ownerGaii: ghiiOf(ctx, config), viewerGhii: ghiiOf(ctx, config), q, limit };
69
+ const { apps } = await storage.listApps(opts);
70
+ return latestApps(apps).map(a => ({ sourceId: APPS_SOURCE_ID, record: a, score: 0 }));
71
+ },
72
+ toEntry(raw) {
73
+ const a = raw.record;
74
+ return {
75
+ type: 'app',
76
+ segment: a.manifest.category || null,
77
+ id: `${a.ownerGaii}/${a.filename}`,
78
+ title: a.manifest.name || a.filename,
79
+ description: a.manifest.description ?? '',
80
+ tags: normalizeTags({ tags: a.manifest.tags }),
81
+ visibility: parkedToVisibility(a.parked),
82
+ owner: toFullOwner(a.ownerGaii, config.nodeId),
83
+ node: config.nodeId,
84
+ score: 0,
85
+ updatedAt: a.createdAt,
86
+ href: `/v1/apps/${encodeURIComponent(a.ownerName)}/${encodeURIComponent(a.filename)}`,
87
+ };
88
+ },
89
+ };
90
+ }
91
+ // ── Agent tasks (produced material) ──────────────────────────────────────────────
92
+ export function createAgentTasksSource(storage, config) {
93
+ return {
94
+ id: AGENT_TASKS_SOURCE_ID,
95
+ gating: 'none', // owner-scoped records; never surfaced in the public scope
96
+ async enumerate(ctx) {
97
+ // Owner-only records: present in the owner's own scope, never in public or shared.
98
+ if (ctx.scope !== 'own' || !ctx.caller.ownerName)
99
+ return [];
100
+ const { tasks } = await storage.listAgentTasksByOwner(ghiiOf(ctx, config), { perPage: limitOf(ctx) });
101
+ // No native text search on tasks — apply the free-text query client-side over title/description.
102
+ const q = ctx.filters.q?.trim().toLowerCase();
103
+ const matched = q
104
+ ? tasks.filter(t => `${t.title} ${t.description}`.toLowerCase().includes(q))
105
+ : tasks;
106
+ return matched.map(t => ({ sourceId: AGENT_TASKS_SOURCE_ID, record: t, score: 0 }));
107
+ },
108
+ toEntry(raw) {
109
+ const t = raw.record;
110
+ const agentName = parseGaiiLoose(t.agentGaii).agent || 'agent';
111
+ return {
112
+ type: 'material',
113
+ segment: t.rating?.context ?? t.status ?? null,
114
+ id: t.id,
115
+ title: t.title,
116
+ description: t.description ?? '',
117
+ tags: [],
118
+ visibility: 'owner',
119
+ owner: toFullOwner(t.ownerGaii, config.nodeId),
120
+ node: config.nodeId,
121
+ score: 0,
122
+ updatedAt: t.updatedAt,
123
+ href: `/v1/agents/${encodeURIComponent(agentName)}/tasks/${encodeURIComponent(t.id)}`,
124
+ };
125
+ },
126
+ };
127
+ }
128
+ //# sourceMappingURL=table-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-sources.js","sourceRoot":"","sources":["../../../../../src/services/discovery/sources/table-sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * @file types.ts
3
+ * @description Core types for the unified cross-domain "master directory" discovery system.
4
+ * Defines the normalized `DiscoveryEntry` shape every domain maps into, the `DiscoverySource`
5
+ * adapter interface (the extension seam — adding a content type = registering one adapter), the
6
+ * per-call `DiscoveryContext`, query `DiscoveryFilters`, and the canonical type/visibility/gating
7
+ * enums. Pure types + enums only — no runtime logic, no storage access.
8
+ * @structure
9
+ * - DiscoveryType / CanonicalVisibility / GatingKind — the controlled vocabularies
10
+ * - DiscoveryEntry — the one shape callers see
11
+ * - DiscoveryFilters / DiscoveryContext — query inputs
12
+ * - RawHit / DiscoverySource — the adapter contract (§7 of the design doc)
13
+ * @usage
14
+ * import type { DiscoverySource, DiscoveryEntry } from '../discovery/types.js';
15
+ * @version-history
16
+ * v0.1.0 — 2026-06-23 — Phase 0: initial contract (design doc 2026-06-23-master-directory-discovery).
17
+ */
18
+ /** The taxonomy an LLM filters on. Extend here + add an llms.txt word when a new kind ships (§7.3). */
19
+ export type DiscoveryType = 'capability' | 'workflow' | 'knowledge' | 'decision' | 'research' | 'material' | 'company' | 'offering' | 'document' | 'organism' | 'app' | 'memory';
20
+ /** Canonical visibility ladder; every domain's native enum collapses into this (design §5). */
21
+ export type CanonicalVisibility = 'private' | 'owner' | 'shared' | 'unlisted' | 'public';
22
+ /** How a hit from a source must be access-checked before it can enter a result (design §6). */
23
+ export type GatingKind = 'none' | 'visibility' | 'workspace' | 'consent';
24
+ /** The single normalized shape returned by `/v1/discover` regardless of source domain. */
25
+ export interface DiscoveryEntry {
26
+ type: DiscoveryType;
27
+ /** Coarse area within the type (e.g. knowledge content_type, app category); null when none. */
28
+ segment: string | null;
29
+ /** Stable id within the type. */
30
+ id: string;
31
+ title: string;
32
+ /** Best-available human text: description | summary | ask | snippet. */
33
+ description: string;
34
+ /** Normalized, deduped tags (sourced from native `tags[]` / `interests[]`). */
35
+ tags: string[];
36
+ visibility: CanonicalVisibility;
37
+ /** Always a full GHII `owner@node-id` (never a bare name). */
38
+ owner: string;
39
+ /** Origin node id (self in v1; federation later). */
40
+ node: string;
41
+ /** FTS rank for memory hits; recency-derived or 0 for table hits. */
42
+ score: number;
43
+ updatedAt: string;
44
+ /** Canonical fetch URL for the full record. */
45
+ href: string;
46
+ /** Set when an entry was deduped from another representation (e.g. a company-listed offer that
47
+ * originates from a specific agent). Names the underlying producer. */
48
+ provenance?: string;
49
+ }
50
+ /** Filters parsed from the query string; all optional. */
51
+ export interface DiscoveryFilters {
52
+ q?: string;
53
+ types?: DiscoveryType[];
54
+ segments?: string[];
55
+ /** ALL-match: an entry must carry every listed tag. */
56
+ tags?: string[];
57
+ owner?: string;
58
+ limit?: number;
59
+ }
60
+ /** Resolved caller identity + scope for one discovery call. */
61
+ export interface DiscoveryContext {
62
+ caller: {
63
+ /** Bare owner name. */
64
+ ownerName: string;
65
+ /** Raw auth subject (`req.auth.sub`) — bare owner for owner sessions, full GAII for agents.
66
+ * Needed by the workspace gate to match org agent membership. */
67
+ sub: string;
68
+ /** Full GAII (agent) or GHII (owner session) — `resolveIdentity` result. */
69
+ gaii: string;
70
+ isOwnerSession: boolean;
71
+ /** Granted read-scopes — used to filter an agent's view of the owner set (design §11.3). */
72
+ scopes: string[];
73
+ };
74
+ scope: 'own' | 'public' | 'shared';
75
+ filters: DiscoveryFilters;
76
+ nodeId: string;
77
+ }
78
+ /** A source-native candidate row, pre-normalization. `record` is the domain's own record. */
79
+ export interface RawHit {
80
+ sourceId: string;
81
+ record: unknown;
82
+ /** FTS score if applicable; adapters without ranking set 0. */
83
+ score?: number;
84
+ /** Per-hit gating override (may be stricter than the source default). */
85
+ gating?: GatingKind;
86
+ }
87
+ /**
88
+ * A discovery source adapter — the extension seam. Adding a new content type to AIMEAT means
89
+ * implementing this interface and registering it (design §7). The `/v1/discover` handler contains
90
+ * no domain-specific logic; it iterates registered sources.
91
+ */
92
+ export interface DiscoverySource {
93
+ /** Stable source id, e.g. "memory-fts", "capabilities", "apps". */
94
+ id: string;
95
+ /** Enumerate candidate rows for this caller + scope. Cheap; gating happens later. */
96
+ enumerate(ctx: DiscoveryContext): Promise<RawHit[]>;
97
+ /** Map one raw row → a normalized DiscoveryEntry. */
98
+ toEntry(raw: RawHit, ctx: DiscoveryContext): DiscoveryEntry;
99
+ /** Default gating requirement for hits from this source. */
100
+ gating: GatingKind;
101
+ }
102
+ /** A facet bucket for map mode (`/v1/discover/facets`). */
103
+ export interface FacetCount {
104
+ value: string;
105
+ count: number;
106
+ }
107
+ /** The map-mode response shape (design §4.3). */
108
+ export interface DiscoveryFacets {
109
+ types: FacetCount[];
110
+ segments: Array<{
111
+ type: DiscoveryType;
112
+ segment: string;
113
+ count: number;
114
+ }>;
115
+ tags: FacetCount[];
116
+ }
117
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/discovery/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @file types.ts
3
+ * @description Core types for the unified cross-domain "master directory" discovery system.
4
+ * Defines the normalized `DiscoveryEntry` shape every domain maps into, the `DiscoverySource`
5
+ * adapter interface (the extension seam — adding a content type = registering one adapter), the
6
+ * per-call `DiscoveryContext`, query `DiscoveryFilters`, and the canonical type/visibility/gating
7
+ * enums. Pure types + enums only — no runtime logic, no storage access.
8
+ * @structure
9
+ * - DiscoveryType / CanonicalVisibility / GatingKind — the controlled vocabularies
10
+ * - DiscoveryEntry — the one shape callers see
11
+ * - DiscoveryFilters / DiscoveryContext — query inputs
12
+ * - RawHit / DiscoverySource — the adapter contract (§7 of the design doc)
13
+ * @usage
14
+ * import type { DiscoverySource, DiscoveryEntry } from '../discovery/types.js';
15
+ * @version-history
16
+ * v0.1.0 — 2026-06-23 — Phase 0: initial contract (design doc 2026-06-23-master-directory-discovery).
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=types.js.map