@indexnetwork/protocol 3.13.0-rc.288.1 → 4.1.1-rc.290.1

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 (116) hide show
  1. package/dist/chat/chat.prompt.js +25 -25
  2. package/dist/chat/chat.prompt.js.map +1 -1
  3. package/dist/chat/chat.prompt.modules.js +8 -8
  4. package/dist/chat/chat.prompt.modules.js.map +1 -1
  5. package/dist/chat/tests/chat.graph.mocks.d.ts +1 -7
  6. package/dist/chat/tests/chat.graph.mocks.d.ts.map +1 -1
  7. package/dist/chat/tests/chat.graph.mocks.js +1 -2
  8. package/dist/chat/tests/chat.graph.mocks.js.map +1 -1
  9. package/dist/contact/contact.tools.js +3 -3
  10. package/dist/contact/contact.tools.js.map +1 -1
  11. package/dist/{profile/profile.enricher.d.ts → enrichment/enrichment.enricher.d.ts} +1 -1
  12. package/dist/enrichment/enrichment.enricher.d.ts.map +1 -0
  13. package/dist/{profile/profile.enricher.js → enrichment/enrichment.enricher.js} +1 -1
  14. package/dist/enrichment/enrichment.enricher.js.map +1 -0
  15. package/dist/{profile/profile.generator.d.ts → enrichment/enrichment.generator.d.ts} +3 -3
  16. package/dist/enrichment/enrichment.generator.d.ts.map +1 -0
  17. package/dist/{profile/profile.generator.js → enrichment/enrichment.generator.js} +6 -6
  18. package/dist/enrichment/enrichment.generator.js.map +1 -0
  19. package/dist/{profile/profile.graph.d.ts → enrichment/enrichment.graph.d.ts} +61 -201
  20. package/dist/enrichment/enrichment.graph.d.ts.map +1 -0
  21. package/dist/{profile/profile.graph.js → enrichment/enrichment.graph.js} +7 -7
  22. package/dist/enrichment/enrichment.graph.js.map +1 -0
  23. package/dist/{profile/profile.state.d.ts → enrichment/enrichment.state.d.ts} +8 -32
  24. package/dist/enrichment/enrichment.state.d.ts.map +1 -0
  25. package/dist/{profile/profile.state.js → enrichment/enrichment.state.js} +2 -2
  26. package/dist/enrichment/enrichment.state.js.map +1 -0
  27. package/dist/enrichment/enrichment.tools.d.ts +3 -0
  28. package/dist/enrichment/enrichment.tools.d.ts.map +1 -0
  29. package/dist/{profile/profile.tools.js → enrichment/enrichment.tools.js} +119 -132
  30. package/dist/enrichment/enrichment.tools.js.map +1 -0
  31. package/dist/index.d.ts +4 -4
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +3 -3
  34. package/dist/index.js.map +1 -1
  35. package/dist/intent/intent.graph.d.ts.map +1 -1
  36. package/dist/intent/intent.graph.js +7 -6
  37. package/dist/intent/intent.graph.js.map +1 -1
  38. package/dist/intent/intent.tools.js +5 -5
  39. package/dist/intent/intent.tools.js.map +1 -1
  40. package/dist/mcp/mcp.server.d.ts +1 -1
  41. package/dist/mcp/mcp.server.d.ts.map +1 -1
  42. package/dist/mcp/mcp.server.js +12 -4
  43. package/dist/mcp/mcp.server.js.map +1 -1
  44. package/dist/negotiation/negotiation.tools.js +1 -1
  45. package/dist/negotiation/negotiation.tools.js.map +1 -1
  46. package/dist/network/network.tools.js +2 -2
  47. package/dist/network/network.tools.js.map +1 -1
  48. package/dist/opportunity/opportunity.graph.d.ts +9 -15
  49. package/dist/opportunity/opportunity.graph.d.ts.map +1 -1
  50. package/dist/opportunity/opportunity.graph.js +12 -29
  51. package/dist/opportunity/opportunity.graph.js.map +1 -1
  52. package/dist/opportunity/opportunity.presenter.d.ts.map +1 -1
  53. package/dist/opportunity/opportunity.presenter.js +3 -11
  54. package/dist/opportunity/opportunity.presenter.js.map +1 -1
  55. package/dist/opportunity/opportunity.state.d.ts +4 -10
  56. package/dist/opportunity/opportunity.state.d.ts.map +1 -1
  57. package/dist/opportunity/opportunity.state.js +1 -1
  58. package/dist/opportunity/opportunity.state.js.map +1 -1
  59. package/dist/opportunity/opportunity.tools.js +8 -8
  60. package/dist/opportunity/opportunity.tools.js.map +1 -1
  61. package/dist/questioner/questioner.presets.js +1 -1
  62. package/dist/questioner/questioner.presets.js.map +1 -1
  63. package/dist/questioner/questioner.tools.d.ts +1 -1
  64. package/dist/questioner/questioner.tools.js +2 -2
  65. package/dist/questioner/questioner.tools.js.map +1 -1
  66. package/dist/shared/agent/tool.factory.js +6 -6
  67. package/dist/shared/agent/tool.factory.js.map +1 -1
  68. package/dist/shared/agent/tool.helpers.d.ts +8 -8
  69. package/dist/shared/agent/tool.helpers.d.ts.map +1 -1
  70. package/dist/shared/agent/tool.helpers.js.map +1 -1
  71. package/dist/shared/agent/tool.registry.d.ts.map +1 -1
  72. package/dist/shared/agent/tool.registry.js +28 -2
  73. package/dist/shared/agent/tool.registry.js.map +1 -1
  74. package/dist/shared/agent/tool.runtime.d.ts.map +1 -1
  75. package/dist/shared/agent/tool.runtime.js +6 -0
  76. package/dist/shared/agent/tool.runtime.js.map +1 -1
  77. package/dist/shared/agent/utility.tools.js +5 -5
  78. package/dist/shared/agent/utility.tools.js.map +1 -1
  79. package/dist/shared/hyde/hyde.graph.d.ts +6 -6
  80. package/dist/shared/hyde/hyde.state.d.ts +2 -2
  81. package/dist/shared/hyde/hyde.state.js.map +1 -1
  82. package/dist/shared/interfaces/database.interface.d.ts +16 -16
  83. package/dist/shared/interfaces/database.interface.d.ts.map +1 -1
  84. package/dist/shared/interfaces/database.interface.js.map +1 -1
  85. package/dist/shared/interfaces/{profile-run.interface.d.ts → enrichment-run.interface.d.ts} +21 -21
  86. package/dist/shared/interfaces/enrichment-run.interface.d.ts.map +1 -0
  87. package/dist/shared/interfaces/enrichment-run.interface.js +2 -0
  88. package/dist/shared/interfaces/enrichment-run.interface.js.map +1 -0
  89. package/dist/shared/schemas/discovery-question.schema.d.ts +2 -2
  90. package/dist/shared/schemas/identity.schema.d.ts +45 -0
  91. package/dist/shared/schemas/identity.schema.d.ts.map +1 -0
  92. package/dist/shared/schemas/identity.schema.js +20 -0
  93. package/dist/shared/schemas/identity.schema.js.map +1 -0
  94. package/dist/shared/schemas/question.schema.d.ts +4 -4
  95. package/dist/shared/schemas/question.schema.d.ts.map +1 -1
  96. package/dist/shared/schemas/question.schema.js +1 -1
  97. package/dist/shared/schemas/question.schema.js.map +1 -1
  98. package/package.json +1 -1
  99. package/dist/profile/profile.enricher.d.ts.map +0 -1
  100. package/dist/profile/profile.enricher.js.map +0 -1
  101. package/dist/profile/profile.generator.d.ts.map +0 -1
  102. package/dist/profile/profile.generator.js.map +0 -1
  103. package/dist/profile/profile.graph.d.ts.map +0 -1
  104. package/dist/profile/profile.graph.js.map +0 -1
  105. package/dist/profile/profile.state.d.ts.map +0 -1
  106. package/dist/profile/profile.state.js.map +0 -1
  107. package/dist/profile/profile.tools.d.ts +0 -3
  108. package/dist/profile/profile.tools.d.ts.map +0 -1
  109. package/dist/profile/profile.tools.js.map +0 -1
  110. package/dist/shared/interfaces/profile-run.interface.d.ts.map +0 -1
  111. package/dist/shared/interfaces/profile-run.interface.js +0 -2
  112. package/dist/shared/interfaces/profile-run.interface.js.map +0 -1
  113. package/dist/shared/schemas/profile.schema.d.ts +0 -100
  114. package/dist/shared/schemas/profile.schema.d.ts.map +0 -1
  115. package/dist/shared/schemas/profile.schema.js +0 -26
  116. package/dist/shared/schemas/profile.schema.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"network.tools.js","sourceRoot":"/","sources":["network/network.tools.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nimport { requestContext } from \"../shared/observability/request-context.js\";\nimport { renderNetworkContext } from '../shared/network/metadata.renderer.js';\n\nimport type { DefineTool, ToolDeps } from \"../shared/agent/tool.helpers.js\";\nimport { success, error, UUID_REGEX } from \"../shared/agent/tool.helpers.js\";\nimport { NetworkRecommender } from \"./network.recommender.js\";\n\n// Lazy singleton — only instantiated on first onboarding ranking call so that\n// importing this module does not require OPENROUTER_API_KEY at load time.\nlet recommender: NetworkRecommender | undefined;\n\nexport function createNetworkTools(defineTool: DefineTool, deps: ToolDeps) {\n const { graphs, userDb, systemDb } = deps;\n\n const enrichWithContext = (networks: Array<Record<string, unknown>>) =>\n networks.map((n) => ({\n ...n,\n renderedContext: renderNetworkContext({\n type: (n.type as string) ?? 'community',\n title: (n.title as string) ?? '',\n prompt: n.prompt as string | undefined,\n metadata: (n.metadata as Record<string, unknown>) ?? {},\n }),\n }));\n\n const readIndexes = defineTool({\n name: \"read_networks\",\n description:\n \"Lists the authenticated user's networks (communities), including ones they own and public communities they can join.\\n\\n\" +\n \"**When to use:** To find network IDs for scoping other operations (read_intents, discover_opportunities, read_network_memberships), \" +\n \"or to show the user which communities they belong to.\\n\\n\" +\n \"**Returns:** Up to three lists — `memberOf` (networks the user joined), `owns` (networks the user created), and `publicNetworks` \" +\n \"(publicly joinable communities the user is not yet a member of). Entries in `memberOf` include `isPersonal` set to `true` for the user's \" +\n \"personal network.\\n\\n\" +\n \"**Note:** In index-scoped chats, only the scoped network is returned. During onboarding, `orderedNetworkIds` \" +\n \"may be returned alongside `publicNetworks` \\u2014 a ranked array of network IDs ordered by relevance to the user's profile (omitted when ranking is unavailable or fails).\",\n querySchema: z.object({\n userId: z.string().optional().describe(\"Must be the current user's ID or omitted. Cannot list another user's indexes.\"),\n }),\n handler: async ({ context, query }) => {\n if (query.userId && query.userId.trim() !== context.userId) {\n return error(\"You can only list your own indexes. Omit userId to see the current user's indexes.\");\n }\n\n const _readIndexGraphStart = Date.now();\n const _readIndexTraceEmitter = requestContext.getStore()?.traceEmitter;\n _readIndexTraceEmitter?.({ type: \"graph_start\", name: \"index\" });\n const result = await graphs.index.invoke({\n userId: context.userId,\n networkId: context.networkId || undefined,\n operationMode: 'read' as const,\n showAll: false, // Never allow bypass - strict scope enforcement\n });\n const _readIndexGraphMs = Date.now() - _readIndexGraphStart;\n _readIndexTraceEmitter?.({ type: \"graph_end\", name: \"index\", durationMs: _readIndexGraphMs });\n\n if (result.error) {\n return error(result.error);\n }\n if (result.readResult) {\n const rr = result.readResult as Record<string, unknown>;\n const enriched = {\n ...rr,\n ...(Array.isArray(rr.memberOf) ? { memberOf: enrichWithContext(rr.memberOf as Array<Record<string, unknown>>) } : {}),\n ...(Array.isArray(rr.owns) ? { owns: enrichWithContext(rr.owns as Array<Record<string, unknown>>) } : {}),\n ...(Array.isArray(rr.publicNetworks) ? { publicNetworks: enrichWithContext(rr.publicNetworks as Array<Record<string, unknown>>) } : {}),\n };\n\n // When scoped, add clear metadata so model knows results are limited\n if (context.networkId) {\n return success({\n ...enriched,\n scopeRestriction: {\n isScoped: true,\n scopedToIndex: context.indexName ?? context.networkId,\n message: `Results are limited to \"${context.indexName ?? 'this index'}\" because this chat is scoped to that community. The user may belong to other communities not shown here.`,\n },\n _graphTimings: [{ name: 'index', durationMs: _readIndexGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n // Onboarding-only: rank public networks by relevance to the user's global\n // user_context paragraph (the profile-replacing identity text). Guard: only\n // when isOnboarding, not scoped, there are public networks to rank, and a\n // user_context is resolvable (generated on demand by the injected resolver).\n let orderedNetworkIds: string[] | undefined;\n const userContext = deps.getUserContextText ? await deps.getUserContextText(context.userId) : \"\";\n if (\n context.isOnboarding &&\n userContext &&\n Array.isArray(enriched.publicNetworks) &&\n (enriched.publicNetworks as Array<Record<string, unknown>>).length > 0\n ) {\n // Cap at 50 to bound LLM context window usage (matches the UI's discoverPublicIndexes(1, 50)).\n const publicNetworksForRanking = (enriched.publicNetworks as Array<Record<string, unknown>>)\n .slice(0, 50)\n .map((n) => ({\n networkId: n.networkId as string,\n renderedContext: (n.renderedContext as string) ?? `## ${n.title as string}`,\n }));\n const rankFn = deps.networkRanker ?? (async (input) => {\n try {\n recommender ??= new NetworkRecommender();\n return await recommender.invoke(input);\n } catch (err) {\n // e.g. missing OPENROUTER_API_KEY — degrade gracefully, omit orderedNetworkIds\n console.warn(\"[read_networks] NetworkRecommender unavailable, skipping ranking:\", err);\n return null;\n }\n });\n const rankingResult = await rankFn({\n userContext,\n networks: publicNetworksForRanking,\n }).catch((err: unknown) => {\n // Catches errors from a custom deps.networkRanker (the default fallback\n // handles its own errors internally). Degrade gracefully: omit orderedNetworkIds.\n console.warn(\"[read_networks] networkRanker threw, skipping ranking:\", err);\n deps.reportToolError?.(err, { operation: \"network-ranking\", toolName: \"read_networks\", userId: context.userId });\n return null;\n });\n if (rankingResult) {\n // Normalize LLM output against the ranked slice (top 50):\n // keep only IDs from the input set, de-dupe preserving order, then\n // append any slice IDs the model omitted. Networks beyond the top-50\n // slice are not in orderedNetworkIds and will sort to the tail in the\n // frontend (consistent with the UI's own 50-item page size).\n const inputIds = publicNetworksForRanking.map((n) => n.networkId);\n const inputIdSet = new Set(inputIds);\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const id of rankingResult.rankedNetworkIds) {\n if (inputIdSet.has(id) && !seen.has(id)) {\n normalized.push(id);\n seen.add(id);\n }\n }\n for (const id of inputIds) {\n if (!seen.has(id)) normalized.push(id);\n }\n orderedNetworkIds = normalized;\n }\n }\n\n return success({\n ...enriched,\n ...(orderedNetworkIds !== undefined ? { orderedNetworkIds } : {}),\n _graphTimings: [{ name: 'index', durationMs: _readIndexGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n return error(\"Failed to fetch index information.\");\n },\n });\n\n const readIndexMemberships = defineTool({\n name: \"read_network_memberships\",\n description:\n \"Reads index membership information — who is in which community. Essential for understanding the social graph before \" +\n \"creating introductions or exploring intents.\\n\\n\" +\n \"**Usage modes:**\\n\" +\n \"- With `networkId` only: lists ALL members of that index — returns userId, name, avatar, permissions (owner/member), intentCount, and joinedAt. \" +\n \"Use this to see who's in a community before browsing their intents or creating introductions.\\n\" +\n \"- With `userId` only (or omit for self): lists all indexes that user belongs to — returns networkId, networkTitle, permissions, joinedAt.\\n\" +\n \"- With both `networkId` and `userId`: checks whether that specific user is a member of that specific index (returns isMember boolean).\\n\\n\" +\n \"**When to use:** Before creating introductions (need to verify shared index membership), to explore community members, \" +\n \"or to check if a user belongs to a specific index.\\n\\n\" +\n \"**Returns:** Member list with user details, or membership list with index details, or a membership check result.\\n\\n\" +\n \"**Personal index semantics.** The personal index (`isPersonal: true` on the membership) is the user's \" +\n \"contact list — members of that index are the user's contacts. For another user, this tool only reveals the \" +\n \"indexes you already share with them.\\n\\n\" +\n \"**Shared-context pattern.** To find overlap with another user: (1) omit `userId` to read your own \" +\n \"memberships, (2) call this tool with the other person's actual `userId` to get the shared indexes, \" +\n \"(3) call read_intents for each shared network to see what each is looking for there, (4) call \" +\n \"read_user_profiles for the other party. That sequence gives you enough to decide whether to propose a \" +\n \"direct connection or an introduction.\",\n querySchema: z.object({\n networkId: z.string().optional().describe(\"Index UUID — lists all members of this index. Get from read_networks. In index-scoped chats, only the scoped index can be queried.\"),\n userId: z.string().optional().describe(\"User ID — lists that user's index memberships. Omit to get the current user's memberships. When combined with networkId, checks if this user is in that specific index.\"),\n }),\n handler: async ({ context, query }) => {\n const networkId = query.networkId?.trim() || undefined;\n const userId = query.userId?.trim() || undefined;\n\n if (networkId && !UUID_REGEX.test(networkId)) {\n return error(\"Invalid index ID format. Use the exact UUID from read_networks.\");\n }\n\n // Mode 1: list members of an index\n if (networkId && !userId) {\n // Enforce strict scope: when chat is index-scoped, only allow querying that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only query members of this index.`\n );\n }\n\n const _readMembersGraphStart = Date.now();\n const _readMembersTraceEmitter = requestContext.getStore()?.traceEmitter;\n _readMembersTraceEmitter?.({ type: \"graph_start\", name: \"network_membership\" });\n const result = await graphs.networkMembership.invoke({\n userId: context.userId,\n networkId,\n operationMode: 'read' as const,\n });\n const _readMembersGraphMs = Date.now() - _readMembersGraphStart;\n _readMembersTraceEmitter?.({ type: \"graph_end\", name: \"network_membership\", durationMs: _readMembersGraphMs });\n\n if (result.error) {\n return error(result.error);\n }\n if (result.readResult) {\n return success({ ...result.readResult, _graphTimings: [{ name: 'network_membership', durationMs: _readMembersGraphMs, agents: result.agentTimings ?? [] }] });\n }\n return error(\"Failed to fetch index members.\");\n }\n\n // Mode 2: list a user's memberships (indexes they belong to)\n const targetUserId = userId || context.userId;\n\n // Use userDb for own memberships, but systemDb access is implicit through shared index scope\n let memberships: Awaited<ReturnType<typeof userDb.getNetworkMemberships>>;\n if (targetUserId !== context.userId) {\n // Cross-user access: systemDb will validate shared index membership\n const callerMemberships = await userDb.getNetworkMemberships();\n if (networkId) {\n // Strict scope enforcement: when chat is index-scoped, only allow querying that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only query membership in this community.`\n );\n }\n\n const callerInIndex = callerMemberships.some((m) => m.networkId === networkId);\n if (!callerInIndex) {\n return error(\n \"Unauthorized: you can only view another user's membership in an index you belong to. Provide your own userId or omit userId for your memberships.\",\n );\n }\n // Check if target user is in the index (systemDb validates scope)\n const isMember = await systemDb.isNetworkMember(networkId, targetUserId);\n if (isMember) {\n return success({ isMember: true, userId: targetUserId, networkId });\n }\n return success({ isMember: false, userId: targetUserId, networkId, message: \"User is not a member of this index.\" });\n } else {\n // Strict scope enforcement: when chat is index-scoped, only check the scoped index\n if (context.networkId) {\n const isMember = await systemDb.isNetworkMember(context.networkId, targetUserId);\n if (isMember) {\n return success({\n isMember: true,\n userId: targetUserId,\n networkId: context.networkId,\n scopeRestriction: {\n isScoped: true,\n scopedToIndex: context.indexName ?? context.networkId,\n message: `This chat is scoped to \"${context.indexName ?? 'this index'}\". Only membership in this community is shown.`,\n },\n });\n }\n return success({\n isMember: false,\n userId: targetUserId,\n networkId: context.networkId,\n message: \"User is not a member of this community.\",\n scopeRestriction: {\n isScoped: true,\n scopedToIndex: context.indexName ?? context.networkId,\n message: `This chat is scoped to \"${context.indexName ?? 'this index'}\". Only membership in this community was checked.`,\n },\n });\n }\n\n // Unscoped chat: show overlap with shared indexes (intersection of caller and target memberships)\n const sharedIndexes: typeof callerMemberships = [];\n for (const m of callerMemberships) {\n if (await systemDb.isNetworkMember(m.networkId, targetUserId)) {\n sharedIndexes.push(m);\n }\n }\n if (sharedIndexes.length === 0) {\n return error(\n \"Unauthorized: you can only view another user's memberships if you share at least one index, or request your own memberships.\",\n );\n }\n // Return only the indexes that are shared\n return success({\n userId: targetUserId,\n count: sharedIndexes.length,\n memberships: sharedIndexes.map((m) => ({\n networkId: m.networkId,\n networkTitle: m.networkTitle,\n })),\n note: \"Only showing shared indexes.\",\n });\n }\n } else {\n // Own memberships - use userDb\n memberships = await userDb.getNetworkMemberships();\n\n // NOTE: context.networkId here is the *focus* of the scoped chat — it filters\n // what we show, not what we can reach. indexScope is the reach; the bound\n // network is one element of it. See IND-306 for the equivalent in read_intents.\n // Strict scope enforcement: when chat is index-scoped, only return the scoped index membership\n if (context.networkId && !networkId) {\n memberships = memberships.filter((m) => m.networkId === context.networkId);\n }\n }\n\n // If both networkId and userId: filter to that specific membership\n if (networkId) {\n // Strict scope enforcement: when chat is index-scoped, only allow querying that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only query membership in this community.`\n );\n }\n\n const callerMemberships = await userDb.getNetworkMemberships();\n const callerInIndex =\n targetUserId === context.userId ||\n callerMemberships.some((m) => m.networkId === networkId);\n if (!callerInIndex) {\n return error(\n \"Unauthorized: you can only view membership in an index you belong to.\",\n );\n }\n const match = memberships.find((m) => m.networkId === networkId);\n if (!match) {\n return success({ isMember: false, userId: targetUserId, networkId, message: \"User is not a member of this index.\" });\n }\n return success({\n isMember: true,\n userId: targetUserId,\n networkId,\n networkTitle: match.networkTitle,\n permissions: match.permissions,\n joinedAt: match.joinedAt,\n });\n }\n\n // When scoped, add clear metadata so model knows results are limited\n if (context.networkId && targetUserId === context.userId) {\n return success({\n userId: targetUserId,\n count: memberships.length,\n memberships: memberships.map((m) => ({\n networkId: m.networkId,\n networkTitle: m.networkTitle,\n permissions: m.permissions,\n joinedAt: m.joinedAt,\n })),\n scopeRestriction: {\n isScoped: true,\n scopedToIndex: context.indexName ?? context.networkId,\n message: `Results are limited to \"${context.indexName ?? 'this index'}\" because this chat is scoped to that community. The user may belong to other communities not shown here.`,\n },\n });\n }\n\n return success({\n userId: targetUserId,\n count: memberships.length,\n memberships: memberships.map((m) => ({\n networkId: m.networkId,\n networkTitle: m.networkTitle,\n permissions: m.permissions,\n joinedAt: m.joinedAt,\n })),\n });\n },\n });\n\n const updateNetworkSettingsSchema = z.object({\n title: z.string().optional(),\n prompt: z.string().nullable().optional(),\n imageUrl: z.string().url().nullable().optional(),\n joinPolicy: z.enum(['anyone', 'invite_only']).optional(),\n allowGuestVibeCheck: z.boolean().optional(),\n }).strict();\n\n const updateNetwork = defineTool({\n name: \"update_network\",\n description:\n \"Updates settings of an existing index (community). Only the index owner can perform updates.\\n\\n\" +\n \"**Updatable fields:** title (display name), prompt (purpose description used for intent auto-assignment), \" +\n \"imageUrl (community avatar), joinPolicy ('anyone' for open or 'invite_only'), allowGuestVibeCheck (allow non-members to preview).\\n\\n\" +\n \"**When to use:** When an index owner wants to change their community's settings — e.g. update the purpose description, \" +\n \"change from invite-only to open, or update the community image.\\n\\n\" +\n \"**Important:** Changing the prompt affects how future intents are evaluated for auto-assignment to this index. \" +\n \"Existing intent-index links are not re-evaluated automatically.\\n\\n\" +\n \"**Returns:** Confirmation with the list of settings that were updated.\",\n querySchema: z.object({\n networkId: z.string().optional().describe(\"Index UUID to update. Get from read_networks. Defaults to the scoped index in index-scoped chats.\"),\n settings: updateNetworkSettingsSchema.describe(\"Object with fields to update. All fields are optional — only include the ones to change. title: display name. prompt: purpose description (used for intent auto-assignment). imageUrl: community image URL (null to remove). joinPolicy: 'anyone' or 'invite_only'. allowGuestVibeCheck: boolean.\"),\n }),\n handler: async ({ context, query }) => {\n const effectiveIndexId = (query.networkId?.trim() || context.networkId) ?? null;\n if (!effectiveIndexId || !UUID_REGEX.test(effectiveIndexId)) {\n return error(\"Valid networkId required.\");\n }\n\n // Strict scope enforcement: when chat is index-scoped, only allow updating that index\n if (context.networkId && effectiveIndexId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only update this community's settings.`\n );\n }\n\n const _updateNetworkGraphStart = Date.now();\n const _updateNetworkTraceEmitter = requestContext.getStore()?.traceEmitter;\n _updateNetworkTraceEmitter?.({ type: \"graph_start\", name: \"index\" });\n const result = await graphs.index.invoke({\n userId: context.userId,\n networkId: effectiveIndexId,\n operationMode: 'update' as const,\n updateInput: query.settings,\n });\n const _updateNetworkGraphMs = Date.now() - _updateNetworkGraphStart;\n _updateNetworkTraceEmitter?.({ type: \"graph_end\", name: \"index\", durationMs: _updateNetworkGraphMs });\n\n if (result.mutationResult && !result.mutationResult.success) {\n return error(result.mutationResult.error || \"Failed to update index.\");\n }\n return success({ message: \"Index updated.\", settings: Object.keys(query.settings), _graphTimings: [{ name: 'index', durationMs: _updateNetworkGraphMs, agents: result.agentTimings ?? [] }] });\n },\n });\n\n const createNetwork = defineTool({\n name: \"create_network\",\n description:\n \"Creates a new index (community/group). The authenticated user becomes the owner with full control over settings and membership.\\n\\n\" +\n \"**What is an index?** A shared space where members post intents (what they're looking for) and the system discovers opportunities \" +\n \"(complementary matches) between members. The index's prompt guides what kinds of intents belong.\\n\\n\" +\n \"**When to use:** When the user wants to create a new community — e.g. a professional network, interest group, or project team.\\n\\n\" +\n \"**Returns:** The new index's networkId (UUID) and title. Use the networkId to add members (create_network_membership), \" +\n \"link intents (create_intent_index), or run discovery (discover_opportunities with networkId).\",\n querySchema: z.object({\n title: z.string().describe(\"Display name of the index (e.g. 'AI Founders Berlin', 'Design Co-op'). Required.\"),\n prompt: z.string().optional().describe(\"Description of what this community is about (e.g. 'Early-stage AI/ML founders in Berlin looking for co-founders, advisors, and investors'). Used by the system to evaluate which intents belong in this index. Highly recommended for better auto-assignment.\"),\n imageUrl: z.string().url().optional().describe(\"URL for the community's avatar/image. Optional.\"),\n joinPolicy: z.enum(['anyone', 'invite_only']).optional().describe(\"'anyone' = open (any user can self-join), 'invite_only' = only the owner can add members. Defaults to 'invite_only'.\"),\n }),\n handler: async ({ context, query }) => {\n if (!query.title?.trim()) {\n return error(\"Title is required.\");\n }\n\n const _createNetworkGraphStart = Date.now();\n const _createNetworkTraceEmitter = requestContext.getStore()?.traceEmitter;\n _createNetworkTraceEmitter?.({ type: \"graph_start\", name: \"index\" });\n const result = await graphs.index.invoke({\n userId: context.userId,\n operationMode: 'create' as const,\n createInput: {\n title: query.title.trim(),\n prompt: query.prompt?.trim() || undefined,\n imageUrl: query.imageUrl || undefined,\n joinPolicy: query.joinPolicy,\n },\n });\n const _createNetworkGraphMs = Date.now() - _createNetworkGraphStart;\n _createNetworkTraceEmitter?.({ type: \"graph_end\", name: \"index\", durationMs: _createNetworkGraphMs });\n\n if (result.mutationResult) {\n if (result.mutationResult.success) {\n return success({\n created: true,\n networkId: result.mutationResult.networkId,\n title: result.mutationResult.title,\n message: result.mutationResult.message,\n _graphTimings: [{ name: 'index', durationMs: _createNetworkGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n return error(result.mutationResult.error || \"Failed to create index.\");\n }\n return error(\"Failed to create index.\");\n },\n });\n\n const deleteNetwork = defineTool({\n name: \"delete_network\",\n description:\n \"Permanently deletes an index (community). Only the owner can delete, and the index must have no other members \" +\n \"(remove all members first with delete_network_membership). Personal indexes cannot be deleted.\\n\\n\" +\n \"**When to use:** When the owner wants to disband a community. This is irreversible — all intent-index links to this index are removed.\\n\\n\" +\n \"**Prerequisites:** Must be the owner. Must be the sole remaining member (remove others first).\\n\\n\" +\n \"**Returns:** Confirmation that the index was deleted.\",\n querySchema: z.object({\n networkId: z.string().optional().describe(\"Index UUID to delete. Get from read_networks. Defaults to the scoped index in index-scoped chats. Cannot be a personal index.\"),\n }),\n handler: async ({ context, query }) => {\n const networkId = query.networkId?.trim() || context.networkId;\n if (!networkId || !UUID_REGEX.test(networkId)) {\n return error(\"Valid networkId required.\");\n }\n\n // Strict scope enforcement: when chat is index-scoped, only allow deleting that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only delete this community.`\n );\n }\n\n const _deleteNetworkGraphStart = Date.now();\n const _deleteNetworkTraceEmitter = requestContext.getStore()?.traceEmitter;\n _deleteNetworkTraceEmitter?.({ type: \"graph_start\", name: \"index\" });\n const result = await graphs.index.invoke({\n userId: context.userId,\n networkId,\n operationMode: 'delete' as const,\n });\n const _deleteNetworkGraphMs = Date.now() - _deleteNetworkGraphStart;\n _deleteNetworkTraceEmitter?.({ type: \"graph_end\", name: \"index\", durationMs: _deleteNetworkGraphMs });\n\n if (result.mutationResult && !result.mutationResult.success) {\n return error(result.mutationResult.error || \"Failed to delete index.\");\n }\n return success({ message: \"Network deleted.\", _graphTimings: [{ name: 'index', durationMs: _deleteNetworkGraphMs, agents: result.agentTimings ?? [] }] });\n },\n });\n\n const createNetworkMembership = defineTool({\n name: \"create_network_membership\",\n description:\n \"Adds a user as a member of an index (community). Membership enables the user to post intents in the index and be discovered \" +\n \"by other members through opportunity matching.\\n\\n\" +\n \"**Usage modes:**\\n\" +\n \"- Omit userId: self-join (only works for indexes with joinPolicy 'anyone').\\n\" +\n \"- With userId: add another user (only the index owner can do this for 'invite_only' indexes).\\n\\n\" +\n \"**When to use:** When the user wants to join an open community, or when an index owner wants to invite someone.\\n\\n\" +\n \"**Returns:** Confirmation that the member was added (or a note that they were already a member). \" +\n \"After joining, the user's existing intents with autoAssign=true may be evaluated against the new index.\",\n querySchema: z.object({\n userId: z.string().optional().describe(\"User ID to add as a member. Omit to join the index yourself. Get user IDs from read_user_profiles(query=name) or read_network_memberships.\"),\n networkId: z.string().optional().describe(\"Index UUID to add the member to. Get from read_networks. Defaults to the scoped index in index-scoped chats.\"),\n }),\n handler: async ({ context, query }) => {\n const networkId = query.networkId?.trim() || context.networkId;\n const targetUserId = query.userId?.trim() || context.userId;\n if (!networkId || !UUID_REGEX.test(networkId)) {\n return error(\"Invalid index ID format. Use the exact UUID from read_networks.\");\n }\n\n // Strict scope enforcement: when chat is index-scoped, only allow adding to that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only add members to this community.`\n );\n }\n\n const _createMembershipGraphStart = Date.now();\n const _createMembershipTraceEmitter = requestContext.getStore()?.traceEmitter;\n _createMembershipTraceEmitter?.({ type: \"graph_start\", name: \"network_membership\" });\n const result = await graphs.networkMembership.invoke({\n userId: context.userId,\n networkId,\n targetUserId,\n operationMode: 'create' as const,\n });\n const _createMembershipGraphMs = Date.now() - _createMembershipGraphStart;\n _createMembershipTraceEmitter?.({ type: \"graph_end\", name: \"network_membership\", durationMs: _createMembershipGraphMs });\n\n if (result.mutationResult) {\n if (result.mutationResult.success) {\n const alreadyMember = result.mutationResult.message?.includes(\"already\");\n return success({\n created: !alreadyMember,\n message: result.mutationResult.message,\n _graphTimings: [{ name: 'network_membership', durationMs: _createMembershipGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n return error(result.mutationResult.error || \"Failed to add member.\");\n }\n return error(\"Failed to add member.\");\n },\n });\n\n const deleteNetworkMembership = defineTool({\n name: \"delete_network_membership\",\n description:\n \"Removes a user from an index (community). After removal, the user's intents are unlinked from this index \" +\n \"and they can no longer participate in opportunity discovery within it.\\n\\n\" +\n \"**Permissions:** Only the index owner can remove members. The owner themselves cannot be removed (delete the index instead).\\n\\n\" +\n \"**When to use:** When an index owner wants to remove a member from the community. \" +\n \"Use read_network_memberships(networkId) first to get the userId of the member to remove.\\n\\n\" +\n \"**Returns:** Confirmation that the member was removed.\",\n querySchema: z.object({\n userId: z.string().describe(\"User ID of the member to remove. Get from read_network_memberships(networkId). Cannot be the index owner.\"),\n networkId: z.string().optional().describe(\"Index UUID to remove the member from. Get from read_networks. Defaults to the scoped index in index-scoped chats.\"),\n }),\n handler: async ({ context, query }) => {\n const networkId = query.networkId?.trim() || context.networkId;\n const targetUserId = query.userId?.trim();\n\n if (!networkId || !UUID_REGEX.test(networkId)) {\n return error(\"Valid networkId required. Use the exact UUID from read_networks.\");\n }\n if (!targetUserId) {\n return error(\"userId is required.\");\n }\n\n // Strict scope enforcement: when chat is index-scoped, only allow that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only manage members of this community.`\n );\n }\n\n const _deleteMembershipGraphStart = Date.now();\n const _deleteMembershipTraceEmitter = requestContext.getStore()?.traceEmitter;\n _deleteMembershipTraceEmitter?.({ type: \"graph_start\", name: \"network_membership\" });\n const result = await graphs.networkMembership.invoke({\n userId: context.userId,\n networkId,\n targetUserId,\n operationMode: 'delete' as const,\n });\n const _deleteMembershipGraphMs = Date.now() - _deleteMembershipGraphStart;\n _deleteMembershipTraceEmitter?.({ type: \"graph_end\", name: \"network_membership\", durationMs: _deleteMembershipGraphMs });\n\n if (result.mutationResult) {\n if (result.mutationResult.success) {\n return success({\n removed: true,\n message: result.mutationResult.message,\n _graphTimings: [{ name: 'network_membership', durationMs: _deleteMembershipGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n return error(result.mutationResult.error || \"Failed to remove member.\");\n }\n return error(\"Failed to remove member.\");\n },\n });\n\n return [readIndexes, readIndexMemberships, updateNetwork, createNetwork, deleteNetwork, createNetworkMembership, deleteNetworkMembership] as const;\n}\n"]}
1
+ {"version":3,"file":"network.tools.js","sourceRoot":"/","sources":["network/network.tools.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nimport { requestContext } from \"../shared/observability/request-context.js\";\nimport { renderNetworkContext } from '../shared/network/metadata.renderer.js';\n\nimport type { DefineTool, ToolDeps } from \"../shared/agent/tool.helpers.js\";\nimport { success, error, UUID_REGEX } from \"../shared/agent/tool.helpers.js\";\nimport { NetworkRecommender } from \"./network.recommender.js\";\n\n// Lazy singleton — only instantiated on first onboarding ranking call so that\n// importing this module does not require OPENROUTER_API_KEY at load time.\nlet recommender: NetworkRecommender | undefined;\n\nexport function createNetworkTools(defineTool: DefineTool, deps: ToolDeps) {\n const { graphs, userDb, systemDb } = deps;\n\n const enrichWithContext = (networks: Array<Record<string, unknown>>) =>\n networks.map((n) => ({\n ...n,\n renderedContext: renderNetworkContext({\n type: (n.type as string) ?? 'community',\n title: (n.title as string) ?? '',\n prompt: n.prompt as string | undefined,\n metadata: (n.metadata as Record<string, unknown>) ?? {},\n }),\n }));\n\n const readIndexes = defineTool({\n name: \"read_networks\",\n description:\n \"Lists the authenticated user's networks (communities), including ones they own and public communities they can join.\\n\\n\" +\n \"**When to use:** To find network IDs for scoping other operations (read_intents, discover_opportunities, read_network_memberships), \" +\n \"or to show the user which communities they belong to.\\n\\n\" +\n \"**Returns:** Up to three lists — `memberOf` (networks the user joined), `owns` (networks the user created), and `publicNetworks` \" +\n \"(publicly joinable communities the user is not yet a member of). Entries in `memberOf` include `isPersonal` set to `true` for the user's \" +\n \"personal network.\\n\\n\" +\n \"**Note:** In index-scoped chats, only the scoped network is returned. During onboarding, `orderedNetworkIds` \" +\n \"may be returned alongside `publicNetworks` \\u2014 a ranked array of network IDs ordered by relevance to the user's profile (omitted when ranking is unavailable or fails).\",\n querySchema: z.object({\n userId: z.string().optional().describe(\"Must be the current user's ID or omitted. Cannot list another user's indexes.\"),\n }),\n handler: async ({ context, query }) => {\n if (query.userId && query.userId.trim() !== context.userId) {\n return error(\"You can only list your own indexes. Omit userId to see the current user's indexes.\");\n }\n\n const _readIndexGraphStart = Date.now();\n const _readIndexTraceEmitter = requestContext.getStore()?.traceEmitter;\n _readIndexTraceEmitter?.({ type: \"graph_start\", name: \"index\" });\n const result = await graphs.index.invoke({\n userId: context.userId,\n networkId: context.networkId || undefined,\n operationMode: 'read' as const,\n showAll: false, // Never allow bypass - strict scope enforcement\n });\n const _readIndexGraphMs = Date.now() - _readIndexGraphStart;\n _readIndexTraceEmitter?.({ type: \"graph_end\", name: \"index\", durationMs: _readIndexGraphMs });\n\n if (result.error) {\n return error(result.error);\n }\n if (result.readResult) {\n const rr = result.readResult as Record<string, unknown>;\n const enriched = {\n ...rr,\n ...(Array.isArray(rr.memberOf) ? { memberOf: enrichWithContext(rr.memberOf as Array<Record<string, unknown>>) } : {}),\n ...(Array.isArray(rr.owns) ? { owns: enrichWithContext(rr.owns as Array<Record<string, unknown>>) } : {}),\n ...(Array.isArray(rr.publicNetworks) ? { publicNetworks: enrichWithContext(rr.publicNetworks as Array<Record<string, unknown>>) } : {}),\n };\n\n // When scoped, add clear metadata so model knows results are limited\n if (context.networkId) {\n return success({\n ...enriched,\n scopeRestriction: {\n isScoped: true,\n scopedToIndex: context.indexName ?? context.networkId,\n message: `Results are limited to \"${context.indexName ?? 'this index'}\" because this chat is scoped to that community. The user may belong to other communities not shown here.`,\n },\n _graphTimings: [{ name: 'index', durationMs: _readIndexGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n // Onboarding-only: rank public networks by relevance to the user's global\n // user_context paragraph (the profile-replacing identity text). Guard: only\n // when isOnboarding, not scoped, there are public networks to rank, and a\n // user_context is resolvable (generated on demand by the injected resolver).\n let orderedNetworkIds: string[] | undefined;\n const userContext = deps.getUserContextText ? await deps.getUserContextText(context.userId) : \"\";\n if (\n context.isOnboarding &&\n userContext &&\n Array.isArray(enriched.publicNetworks) &&\n (enriched.publicNetworks as Array<Record<string, unknown>>).length > 0\n ) {\n // Cap at 50 to bound LLM context window usage (matches the UI's discoverPublicIndexes(1, 50)).\n const publicNetworksForRanking = (enriched.publicNetworks as Array<Record<string, unknown>>)\n .slice(0, 50)\n .map((n) => ({\n networkId: n.networkId as string,\n renderedContext: (n.renderedContext as string) ?? `## ${n.title as string}`,\n }));\n const rankFn = deps.networkRanker ?? (async (input) => {\n try {\n recommender ??= new NetworkRecommender();\n return await recommender.invoke(input);\n } catch (err) {\n // e.g. missing OPENROUTER_API_KEY — degrade gracefully, omit orderedNetworkIds\n console.warn(\"[read_networks] NetworkRecommender unavailable, skipping ranking:\", err);\n return null;\n }\n });\n const rankingResult = await rankFn({\n userContext,\n networks: publicNetworksForRanking,\n }).catch((err: unknown) => {\n // Catches errors from a custom deps.networkRanker (the default fallback\n // handles its own errors internally). Degrade gracefully: omit orderedNetworkIds.\n console.warn(\"[read_networks] networkRanker threw, skipping ranking:\", err);\n deps.reportToolError?.(err, { operation: \"network-ranking\", toolName: \"read_networks\", userId: context.userId });\n return null;\n });\n if (rankingResult) {\n // Normalize LLM output against the ranked slice (top 50):\n // keep only IDs from the input set, de-dupe preserving order, then\n // append any slice IDs the model omitted. Networks beyond the top-50\n // slice are not in orderedNetworkIds and will sort to the tail in the\n // frontend (consistent with the UI's own 50-item page size).\n const inputIds = publicNetworksForRanking.map((n) => n.networkId);\n const inputIdSet = new Set(inputIds);\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const id of rankingResult.rankedNetworkIds) {\n if (inputIdSet.has(id) && !seen.has(id)) {\n normalized.push(id);\n seen.add(id);\n }\n }\n for (const id of inputIds) {\n if (!seen.has(id)) normalized.push(id);\n }\n orderedNetworkIds = normalized;\n }\n }\n\n return success({\n ...enriched,\n ...(orderedNetworkIds !== undefined ? { orderedNetworkIds } : {}),\n _graphTimings: [{ name: 'index', durationMs: _readIndexGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n return error(\"Failed to fetch index information.\");\n },\n });\n\n const readIndexMemberships = defineTool({\n name: \"read_network_memberships\",\n description:\n \"Reads index membership information — who is in which community. Essential for understanding the social graph before \" +\n \"creating introductions or exploring intents.\\n\\n\" +\n \"**Usage modes:**\\n\" +\n \"- With `networkId` only: lists ALL members of that index — returns userId, name, avatar, permissions (owner/member), intentCount, and joinedAt. \" +\n \"Use this to see who's in a community before browsing their intents or creating introductions.\\n\" +\n \"- With `userId` only (or omit for self): lists all indexes that user belongs to — returns networkId, networkTitle, permissions, joinedAt.\\n\" +\n \"- With both `networkId` and `userId`: checks whether that specific user is a member of that specific index (returns isMember boolean).\\n\\n\" +\n \"**When to use:** Before creating introductions (need to verify shared index membership), to explore community members, \" +\n \"or to check if a user belongs to a specific index.\\n\\n\" +\n \"**Returns:** Member list with user details, or membership list with index details, or a membership check result.\\n\\n\" +\n \"**Personal index semantics.** The personal index (`isPersonal: true` on the membership) is the user's \" +\n \"contact list — members of that index are the user's contacts. For another user, this tool only reveals the \" +\n \"indexes you already share with them.\\n\\n\" +\n \"**Shared-context pattern.** To find overlap with another user: (1) omit `userId` to read your own \" +\n \"memberships, (2) call this tool with the other person's actual `userId` to get the shared indexes, \" +\n \"(3) call read_intents for each shared network to see what each is looking for there, (4) call \" +\n \"read_user_contexts for the other party. That sequence gives you enough to decide whether to propose a \" +\n \"direct connection or an introduction.\",\n querySchema: z.object({\n networkId: z.string().optional().describe(\"Index UUID — lists all members of this index. Get from read_networks. In index-scoped chats, only the scoped index can be queried.\"),\n userId: z.string().optional().describe(\"User ID — lists that user's index memberships. Omit to get the current user's memberships. When combined with networkId, checks if this user is in that specific index.\"),\n }),\n handler: async ({ context, query }) => {\n const networkId = query.networkId?.trim() || undefined;\n const userId = query.userId?.trim() || undefined;\n\n if (networkId && !UUID_REGEX.test(networkId)) {\n return error(\"Invalid index ID format. Use the exact UUID from read_networks.\");\n }\n\n // Mode 1: list members of an index\n if (networkId && !userId) {\n // Enforce strict scope: when chat is index-scoped, only allow querying that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only query members of this index.`\n );\n }\n\n const _readMembersGraphStart = Date.now();\n const _readMembersTraceEmitter = requestContext.getStore()?.traceEmitter;\n _readMembersTraceEmitter?.({ type: \"graph_start\", name: \"network_membership\" });\n const result = await graphs.networkMembership.invoke({\n userId: context.userId,\n networkId,\n operationMode: 'read' as const,\n });\n const _readMembersGraphMs = Date.now() - _readMembersGraphStart;\n _readMembersTraceEmitter?.({ type: \"graph_end\", name: \"network_membership\", durationMs: _readMembersGraphMs });\n\n if (result.error) {\n return error(result.error);\n }\n if (result.readResult) {\n return success({ ...result.readResult, _graphTimings: [{ name: 'network_membership', durationMs: _readMembersGraphMs, agents: result.agentTimings ?? [] }] });\n }\n return error(\"Failed to fetch index members.\");\n }\n\n // Mode 2: list a user's memberships (indexes they belong to)\n const targetUserId = userId || context.userId;\n\n // Use userDb for own memberships, but systemDb access is implicit through shared index scope\n let memberships: Awaited<ReturnType<typeof userDb.getNetworkMemberships>>;\n if (targetUserId !== context.userId) {\n // Cross-user access: systemDb will validate shared index membership\n const callerMemberships = await userDb.getNetworkMemberships();\n if (networkId) {\n // Strict scope enforcement: when chat is index-scoped, only allow querying that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only query membership in this community.`\n );\n }\n\n const callerInIndex = callerMemberships.some((m) => m.networkId === networkId);\n if (!callerInIndex) {\n return error(\n \"Unauthorized: you can only view another user's membership in an index you belong to. Provide your own userId or omit userId for your memberships.\",\n );\n }\n // Check if target user is in the index (systemDb validates scope)\n const isMember = await systemDb.isNetworkMember(networkId, targetUserId);\n if (isMember) {\n return success({ isMember: true, userId: targetUserId, networkId });\n }\n return success({ isMember: false, userId: targetUserId, networkId, message: \"User is not a member of this index.\" });\n } else {\n // Strict scope enforcement: when chat is index-scoped, only check the scoped index\n if (context.networkId) {\n const isMember = await systemDb.isNetworkMember(context.networkId, targetUserId);\n if (isMember) {\n return success({\n isMember: true,\n userId: targetUserId,\n networkId: context.networkId,\n scopeRestriction: {\n isScoped: true,\n scopedToIndex: context.indexName ?? context.networkId,\n message: `This chat is scoped to \"${context.indexName ?? 'this index'}\". Only membership in this community is shown.`,\n },\n });\n }\n return success({\n isMember: false,\n userId: targetUserId,\n networkId: context.networkId,\n message: \"User is not a member of this community.\",\n scopeRestriction: {\n isScoped: true,\n scopedToIndex: context.indexName ?? context.networkId,\n message: `This chat is scoped to \"${context.indexName ?? 'this index'}\". Only membership in this community was checked.`,\n },\n });\n }\n\n // Unscoped chat: show overlap with shared indexes (intersection of caller and target memberships)\n const sharedIndexes: typeof callerMemberships = [];\n for (const m of callerMemberships) {\n if (await systemDb.isNetworkMember(m.networkId, targetUserId)) {\n sharedIndexes.push(m);\n }\n }\n if (sharedIndexes.length === 0) {\n return error(\n \"Unauthorized: you can only view another user's memberships if you share at least one index, or request your own memberships.\",\n );\n }\n // Return only the indexes that are shared\n return success({\n userId: targetUserId,\n count: sharedIndexes.length,\n memberships: sharedIndexes.map((m) => ({\n networkId: m.networkId,\n networkTitle: m.networkTitle,\n })),\n note: \"Only showing shared indexes.\",\n });\n }\n } else {\n // Own memberships - use userDb\n memberships = await userDb.getNetworkMemberships();\n\n // NOTE: context.networkId here is the *focus* of the scoped chat — it filters\n // what we show, not what we can reach. indexScope is the reach; the bound\n // network is one element of it. See IND-306 for the equivalent in read_intents.\n // Strict scope enforcement: when chat is index-scoped, only return the scoped index membership\n if (context.networkId && !networkId) {\n memberships = memberships.filter((m) => m.networkId === context.networkId);\n }\n }\n\n // If both networkId and userId: filter to that specific membership\n if (networkId) {\n // Strict scope enforcement: when chat is index-scoped, only allow querying that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only query membership in this community.`\n );\n }\n\n const callerMemberships = await userDb.getNetworkMemberships();\n const callerInIndex =\n targetUserId === context.userId ||\n callerMemberships.some((m) => m.networkId === networkId);\n if (!callerInIndex) {\n return error(\n \"Unauthorized: you can only view membership in an index you belong to.\",\n );\n }\n const match = memberships.find((m) => m.networkId === networkId);\n if (!match) {\n return success({ isMember: false, userId: targetUserId, networkId, message: \"User is not a member of this index.\" });\n }\n return success({\n isMember: true,\n userId: targetUserId,\n networkId,\n networkTitle: match.networkTitle,\n permissions: match.permissions,\n joinedAt: match.joinedAt,\n });\n }\n\n // When scoped, add clear metadata so model knows results are limited\n if (context.networkId && targetUserId === context.userId) {\n return success({\n userId: targetUserId,\n count: memberships.length,\n memberships: memberships.map((m) => ({\n networkId: m.networkId,\n networkTitle: m.networkTitle,\n permissions: m.permissions,\n joinedAt: m.joinedAt,\n })),\n scopeRestriction: {\n isScoped: true,\n scopedToIndex: context.indexName ?? context.networkId,\n message: `Results are limited to \"${context.indexName ?? 'this index'}\" because this chat is scoped to that community. The user may belong to other communities not shown here.`,\n },\n });\n }\n\n return success({\n userId: targetUserId,\n count: memberships.length,\n memberships: memberships.map((m) => ({\n networkId: m.networkId,\n networkTitle: m.networkTitle,\n permissions: m.permissions,\n joinedAt: m.joinedAt,\n })),\n });\n },\n });\n\n const updateNetworkSettingsSchema = z.object({\n title: z.string().optional(),\n prompt: z.string().nullable().optional(),\n imageUrl: z.string().url().nullable().optional(),\n joinPolicy: z.enum(['anyone', 'invite_only']).optional(),\n allowGuestVibeCheck: z.boolean().optional(),\n }).strict();\n\n const updateNetwork = defineTool({\n name: \"update_network\",\n description:\n \"Updates settings of an existing index (community). Only the index owner can perform updates.\\n\\n\" +\n \"**Updatable fields:** title (display name), prompt (purpose description used for intent auto-assignment), \" +\n \"imageUrl (community avatar), joinPolicy ('anyone' for open or 'invite_only'), allowGuestVibeCheck (allow non-members to preview).\\n\\n\" +\n \"**When to use:** When an index owner wants to change their community's settings — e.g. update the purpose description, \" +\n \"change from invite-only to open, or update the community image.\\n\\n\" +\n \"**Important:** Changing the prompt affects how future intents are evaluated for auto-assignment to this index. \" +\n \"Existing intent-index links are not re-evaluated automatically.\\n\\n\" +\n \"**Returns:** Confirmation with the list of settings that were updated.\",\n querySchema: z.object({\n networkId: z.string().optional().describe(\"Index UUID to update. Get from read_networks. Defaults to the scoped index in index-scoped chats.\"),\n settings: updateNetworkSettingsSchema.describe(\"Object with fields to update. All fields are optional — only include the ones to change. title: display name. prompt: purpose description (used for intent auto-assignment). imageUrl: community image URL (null to remove). joinPolicy: 'anyone' or 'invite_only'. allowGuestVibeCheck: boolean.\"),\n }),\n handler: async ({ context, query }) => {\n const effectiveIndexId = (query.networkId?.trim() || context.networkId) ?? null;\n if (!effectiveIndexId || !UUID_REGEX.test(effectiveIndexId)) {\n return error(\"Valid networkId required.\");\n }\n\n // Strict scope enforcement: when chat is index-scoped, only allow updating that index\n if (context.networkId && effectiveIndexId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only update this community's settings.`\n );\n }\n\n const _updateNetworkGraphStart = Date.now();\n const _updateNetworkTraceEmitter = requestContext.getStore()?.traceEmitter;\n _updateNetworkTraceEmitter?.({ type: \"graph_start\", name: \"index\" });\n const result = await graphs.index.invoke({\n userId: context.userId,\n networkId: effectiveIndexId,\n operationMode: 'update' as const,\n updateInput: query.settings,\n });\n const _updateNetworkGraphMs = Date.now() - _updateNetworkGraphStart;\n _updateNetworkTraceEmitter?.({ type: \"graph_end\", name: \"index\", durationMs: _updateNetworkGraphMs });\n\n if (result.mutationResult && !result.mutationResult.success) {\n return error(result.mutationResult.error || \"Failed to update index.\");\n }\n return success({ message: \"Index updated.\", settings: Object.keys(query.settings), _graphTimings: [{ name: 'index', durationMs: _updateNetworkGraphMs, agents: result.agentTimings ?? [] }] });\n },\n });\n\n const createNetwork = defineTool({\n name: \"create_network\",\n description:\n \"Creates a new index (community/group). The authenticated user becomes the owner with full control over settings and membership.\\n\\n\" +\n \"**What is an index?** A shared space where members post intents (what they're looking for) and the system discovers opportunities \" +\n \"(complementary matches) between members. The index's prompt guides what kinds of intents belong.\\n\\n\" +\n \"**When to use:** When the user wants to create a new community — e.g. a professional network, interest group, or project team.\\n\\n\" +\n \"**Returns:** The new index's networkId (UUID) and title. Use the networkId to add members (create_network_membership), \" +\n \"link intents (create_intent_index), or run discovery (discover_opportunities with networkId).\",\n querySchema: z.object({\n title: z.string().describe(\"Display name of the index (e.g. 'AI Founders Berlin', 'Design Co-op'). Required.\"),\n prompt: z.string().optional().describe(\"Description of what this community is about (e.g. 'Early-stage AI/ML founders in Berlin looking for co-founders, advisors, and investors'). Used by the system to evaluate which intents belong in this index. Highly recommended for better auto-assignment.\"),\n imageUrl: z.string().url().optional().describe(\"URL for the community's avatar/image. Optional.\"),\n joinPolicy: z.enum(['anyone', 'invite_only']).optional().describe(\"'anyone' = open (any user can self-join), 'invite_only' = only the owner can add members. Defaults to 'invite_only'.\"),\n }),\n handler: async ({ context, query }) => {\n if (!query.title?.trim()) {\n return error(\"Title is required.\");\n }\n\n const _createNetworkGraphStart = Date.now();\n const _createNetworkTraceEmitter = requestContext.getStore()?.traceEmitter;\n _createNetworkTraceEmitter?.({ type: \"graph_start\", name: \"index\" });\n const result = await graphs.index.invoke({\n userId: context.userId,\n operationMode: 'create' as const,\n createInput: {\n title: query.title.trim(),\n prompt: query.prompt?.trim() || undefined,\n imageUrl: query.imageUrl || undefined,\n joinPolicy: query.joinPolicy,\n },\n });\n const _createNetworkGraphMs = Date.now() - _createNetworkGraphStart;\n _createNetworkTraceEmitter?.({ type: \"graph_end\", name: \"index\", durationMs: _createNetworkGraphMs });\n\n if (result.mutationResult) {\n if (result.mutationResult.success) {\n return success({\n created: true,\n networkId: result.mutationResult.networkId,\n title: result.mutationResult.title,\n message: result.mutationResult.message,\n _graphTimings: [{ name: 'index', durationMs: _createNetworkGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n return error(result.mutationResult.error || \"Failed to create index.\");\n }\n return error(\"Failed to create index.\");\n },\n });\n\n const deleteNetwork = defineTool({\n name: \"delete_network\",\n description:\n \"Permanently deletes an index (community). Only the owner can delete, and the index must have no other members \" +\n \"(remove all members first with delete_network_membership). Personal indexes cannot be deleted.\\n\\n\" +\n \"**When to use:** When the owner wants to disband a community. This is irreversible — all intent-index links to this index are removed.\\n\\n\" +\n \"**Prerequisites:** Must be the owner. Must be the sole remaining member (remove others first).\\n\\n\" +\n \"**Returns:** Confirmation that the index was deleted.\",\n querySchema: z.object({\n networkId: z.string().optional().describe(\"Index UUID to delete. Get from read_networks. Defaults to the scoped index in index-scoped chats. Cannot be a personal index.\"),\n }),\n handler: async ({ context, query }) => {\n const networkId = query.networkId?.trim() || context.networkId;\n if (!networkId || !UUID_REGEX.test(networkId)) {\n return error(\"Valid networkId required.\");\n }\n\n // Strict scope enforcement: when chat is index-scoped, only allow deleting that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only delete this community.`\n );\n }\n\n const _deleteNetworkGraphStart = Date.now();\n const _deleteNetworkTraceEmitter = requestContext.getStore()?.traceEmitter;\n _deleteNetworkTraceEmitter?.({ type: \"graph_start\", name: \"index\" });\n const result = await graphs.index.invoke({\n userId: context.userId,\n networkId,\n operationMode: 'delete' as const,\n });\n const _deleteNetworkGraphMs = Date.now() - _deleteNetworkGraphStart;\n _deleteNetworkTraceEmitter?.({ type: \"graph_end\", name: \"index\", durationMs: _deleteNetworkGraphMs });\n\n if (result.mutationResult && !result.mutationResult.success) {\n return error(result.mutationResult.error || \"Failed to delete index.\");\n }\n return success({ message: \"Network deleted.\", _graphTimings: [{ name: 'index', durationMs: _deleteNetworkGraphMs, agents: result.agentTimings ?? [] }] });\n },\n });\n\n const createNetworkMembership = defineTool({\n name: \"create_network_membership\",\n description:\n \"Adds a user as a member of an index (community). Membership enables the user to post intents in the index and be discovered \" +\n \"by other members through opportunity matching.\\n\\n\" +\n \"**Usage modes:**\\n\" +\n \"- Omit userId: self-join (only works for indexes with joinPolicy 'anyone').\\n\" +\n \"- With userId: add another user (only the index owner can do this for 'invite_only' indexes).\\n\\n\" +\n \"**When to use:** When the user wants to join an open community, or when an index owner wants to invite someone.\\n\\n\" +\n \"**Returns:** Confirmation that the member was added (or a note that they were already a member). \" +\n \"After joining, the user's existing intents with autoAssign=true may be evaluated against the new index.\",\n querySchema: z.object({\n userId: z.string().optional().describe(\"User ID to add as a member. Omit to join the index yourself. Get user IDs from read_user_contexts(query=name) or read_network_memberships.\"),\n networkId: z.string().optional().describe(\"Index UUID to add the member to. Get from read_networks. Defaults to the scoped index in index-scoped chats.\"),\n }),\n handler: async ({ context, query }) => {\n const networkId = query.networkId?.trim() || context.networkId;\n const targetUserId = query.userId?.trim() || context.userId;\n if (!networkId || !UUID_REGEX.test(networkId)) {\n return error(\"Invalid index ID format. Use the exact UUID from read_networks.\");\n }\n\n // Strict scope enforcement: when chat is index-scoped, only allow adding to that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only add members to this community.`\n );\n }\n\n const _createMembershipGraphStart = Date.now();\n const _createMembershipTraceEmitter = requestContext.getStore()?.traceEmitter;\n _createMembershipTraceEmitter?.({ type: \"graph_start\", name: \"network_membership\" });\n const result = await graphs.networkMembership.invoke({\n userId: context.userId,\n networkId,\n targetUserId,\n operationMode: 'create' as const,\n });\n const _createMembershipGraphMs = Date.now() - _createMembershipGraphStart;\n _createMembershipTraceEmitter?.({ type: \"graph_end\", name: \"network_membership\", durationMs: _createMembershipGraphMs });\n\n if (result.mutationResult) {\n if (result.mutationResult.success) {\n const alreadyMember = result.mutationResult.message?.includes(\"already\");\n return success({\n created: !alreadyMember,\n message: result.mutationResult.message,\n _graphTimings: [{ name: 'network_membership', durationMs: _createMembershipGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n return error(result.mutationResult.error || \"Failed to add member.\");\n }\n return error(\"Failed to add member.\");\n },\n });\n\n const deleteNetworkMembership = defineTool({\n name: \"delete_network_membership\",\n description:\n \"Removes a user from an index (community). After removal, the user's intents are unlinked from this index \" +\n \"and they can no longer participate in opportunity discovery within it.\\n\\n\" +\n \"**Permissions:** Only the index owner can remove members. The owner themselves cannot be removed (delete the index instead).\\n\\n\" +\n \"**When to use:** When an index owner wants to remove a member from the community. \" +\n \"Use read_network_memberships(networkId) first to get the userId of the member to remove.\\n\\n\" +\n \"**Returns:** Confirmation that the member was removed.\",\n querySchema: z.object({\n userId: z.string().describe(\"User ID of the member to remove. Get from read_network_memberships(networkId). Cannot be the index owner.\"),\n networkId: z.string().optional().describe(\"Index UUID to remove the member from. Get from read_networks. Defaults to the scoped index in index-scoped chats.\"),\n }),\n handler: async ({ context, query }) => {\n const networkId = query.networkId?.trim() || context.networkId;\n const targetUserId = query.userId?.trim();\n\n if (!networkId || !UUID_REGEX.test(networkId)) {\n return error(\"Valid networkId required. Use the exact UUID from read_networks.\");\n }\n if (!targetUserId) {\n return error(\"userId is required.\");\n }\n\n // Strict scope enforcement: when chat is index-scoped, only allow that index\n if (context.networkId && networkId !== context.networkId) {\n return error(\n `This chat is scoped to ${context.indexName ?? 'this index'}. You can only manage members of this community.`\n );\n }\n\n const _deleteMembershipGraphStart = Date.now();\n const _deleteMembershipTraceEmitter = requestContext.getStore()?.traceEmitter;\n _deleteMembershipTraceEmitter?.({ type: \"graph_start\", name: \"network_membership\" });\n const result = await graphs.networkMembership.invoke({\n userId: context.userId,\n networkId,\n targetUserId,\n operationMode: 'delete' as const,\n });\n const _deleteMembershipGraphMs = Date.now() - _deleteMembershipGraphStart;\n _deleteMembershipTraceEmitter?.({ type: \"graph_end\", name: \"network_membership\", durationMs: _deleteMembershipGraphMs });\n\n if (result.mutationResult) {\n if (result.mutationResult.success) {\n return success({\n removed: true,\n message: result.mutationResult.message,\n _graphTimings: [{ name: 'network_membership', durationMs: _deleteMembershipGraphMs, agents: result.agentTimings ?? [] }],\n });\n }\n return error(result.mutationResult.error || \"Failed to remove member.\");\n }\n return error(\"Failed to remove member.\");\n },\n });\n\n return [readIndexes, readIndexMemberships, updateNetwork, createNetwork, deleteNetwork, createNetworkMembership, deleteNetworkMembership] as const;\n}\n"]}
@@ -136,7 +136,7 @@ export declare class OpportunityGraphFactory {
136
136
  userNetworks: Id<"networks">[];
137
137
  targetNetworks: TargetNetwork[];
138
138
  indexRelevancyScores: Record<string, number>;
139
- discoverySource: "intent" | "profile";
139
+ discoverySource: "intent" | "context";
140
140
  resolvedTriggerIntentId: Id<"intents"> | undefined;
141
141
  sourceProfile: SourceProfileData | null;
142
142
  sourcePremises: {
@@ -228,7 +228,7 @@ export declare class OpportunityGraphFactory {
228
228
  userNetworks?: Id<"networks">[] | import("@langchain/langgraph").OverwriteValue<Id<"networks">[]> | undefined;
229
229
  targetNetworks?: TargetNetwork[] | import("@langchain/langgraph").OverwriteValue<TargetNetwork[]> | undefined;
230
230
  indexRelevancyScores?: Record<string, number> | import("@langchain/langgraph").OverwriteValue<Record<string, number>> | undefined;
231
- discoverySource?: "intent" | "profile" | import("@langchain/langgraph").OverwriteValue<"intent" | "profile"> | undefined;
231
+ discoverySource?: "intent" | "context" | import("@langchain/langgraph").OverwriteValue<"intent" | "context"> | undefined;
232
232
  resolvedTriggerIntentId?: Id<"intents"> | import("@langchain/langgraph").OverwriteValue<Id<"intents"> | undefined> | undefined;
233
233
  sourceProfile?: SourceProfileData | import("@langchain/langgraph").OverwriteValue<SourceProfileData | null> | null | undefined;
234
234
  sourcePremises?: {
@@ -362,7 +362,7 @@ export declare class OpportunityGraphFactory {
362
362
  userNetworks: import("@langchain/langgraph").BaseChannel<Id<"networks">[], Id<"networks">[] | import("@langchain/langgraph").OverwriteValue<Id<"networks">[]>, unknown>;
363
363
  targetNetworks: import("@langchain/langgraph").BaseChannel<TargetNetwork[], TargetNetwork[] | import("@langchain/langgraph").OverwriteValue<TargetNetwork[]>, unknown>;
364
364
  indexRelevancyScores: import("@langchain/langgraph").BaseChannel<Record<string, number>, Record<string, number> | import("@langchain/langgraph").OverwriteValue<Record<string, number>>, unknown>;
365
- discoverySource: import("@langchain/langgraph").BaseChannel<"intent" | "profile", "intent" | "profile" | import("@langchain/langgraph").OverwriteValue<"intent" | "profile">, unknown>;
365
+ discoverySource: import("@langchain/langgraph").BaseChannel<"intent" | "context", "intent" | "context" | import("@langchain/langgraph").OverwriteValue<"intent" | "context">, unknown>;
366
366
  resolvedTriggerIntentId: import("@langchain/langgraph").BaseChannel<Id<"intents"> | undefined, Id<"intents"> | import("@langchain/langgraph").OverwriteValue<Id<"intents"> | undefined> | undefined, unknown>;
367
367
  sourceProfile: import("@langchain/langgraph").BaseChannel<SourceProfileData | null, SourceProfileData | import("@langchain/langgraph").OverwriteValue<SourceProfileData | null> | null, unknown>;
368
368
  sourcePremises: import("@langchain/langgraph").BaseChannel<{
@@ -533,7 +533,7 @@ export declare class OpportunityGraphFactory {
533
533
  userNetworks: import("@langchain/langgraph").BaseChannel<Id<"networks">[], Id<"networks">[] | import("@langchain/langgraph").OverwriteValue<Id<"networks">[]>, unknown>;
534
534
  targetNetworks: import("@langchain/langgraph").BaseChannel<TargetNetwork[], TargetNetwork[] | import("@langchain/langgraph").OverwriteValue<TargetNetwork[]>, unknown>;
535
535
  indexRelevancyScores: import("@langchain/langgraph").BaseChannel<Record<string, number>, Record<string, number> | import("@langchain/langgraph").OverwriteValue<Record<string, number>>, unknown>;
536
- discoverySource: import("@langchain/langgraph").BaseChannel<"intent" | "profile", "intent" | "profile" | import("@langchain/langgraph").OverwriteValue<"intent" | "profile">, unknown>;
536
+ discoverySource: import("@langchain/langgraph").BaseChannel<"intent" | "context", "intent" | "context" | import("@langchain/langgraph").OverwriteValue<"intent" | "context">, unknown>;
537
537
  resolvedTriggerIntentId: import("@langchain/langgraph").BaseChannel<Id<"intents"> | undefined, Id<"intents"> | import("@langchain/langgraph").OverwriteValue<Id<"intents"> | undefined> | undefined, unknown>;
538
538
  sourceProfile: import("@langchain/langgraph").BaseChannel<SourceProfileData | null, SourceProfileData | import("@langchain/langgraph").OverwriteValue<SourceProfileData | null> | null, unknown>;
539
539
  sourcePremises: import("@langchain/langgraph").BaseChannel<{
@@ -685,13 +685,7 @@ export declare class OpportunityGraphFactory {
685
685
  bio: string;
686
686
  location: string;
687
687
  };
688
- narrative: {
689
- context: string;
690
- };
691
- attributes: {
692
- interests: string[];
693
- skills: string[];
694
- };
688
+ context: string;
695
689
  } | null;
696
690
  sourcePremises: {
697
691
  premiseId: Id<"premises">;
@@ -763,19 +757,19 @@ export declare class OpportunityGraphFactory {
763
757
  resolve: {
764
758
  resolvedTriggerIntentId: Id<"intents">;
765
759
  resolvedIntentInIndex: boolean;
766
- discoverySource: "intent" | "profile";
760
+ discoverySource: "intent" | "context";
767
761
  error?: undefined;
768
762
  trace?: undefined;
769
763
  } | {
770
764
  resolvedTriggerIntentId: undefined;
771
765
  resolvedIntentInIndex: boolean;
772
- discoverySource: "profile";
766
+ discoverySource: "context";
773
767
  error?: undefined;
774
768
  trace?: undefined;
775
769
  } | {
776
770
  resolvedTriggerIntentId: undefined;
777
771
  resolvedIntentInIndex: boolean;
778
- discoverySource: "profile";
772
+ discoverySource: "context";
779
773
  error: string;
780
774
  trace: {
781
775
  node: string;
@@ -985,7 +979,7 @@ export declare class OpportunityGraphFactory {
985
979
  userNetworks: import("@langchain/langgraph").BaseChannel<Id<"networks">[], Id<"networks">[] | import("@langchain/langgraph").OverwriteValue<Id<"networks">[]>, unknown>;
986
980
  targetNetworks: import("@langchain/langgraph").BaseChannel<TargetNetwork[], TargetNetwork[] | import("@langchain/langgraph").OverwriteValue<TargetNetwork[]>, unknown>;
987
981
  indexRelevancyScores: import("@langchain/langgraph").BaseChannel<Record<string, number>, Record<string, number> | import("@langchain/langgraph").OverwriteValue<Record<string, number>>, unknown>;
988
- discoverySource: import("@langchain/langgraph").BaseChannel<"intent" | "profile", "intent" | "profile" | import("@langchain/langgraph").OverwriteValue<"intent" | "profile">, unknown>;
982
+ discoverySource: import("@langchain/langgraph").BaseChannel<"intent" | "context", "intent" | "context" | import("@langchain/langgraph").OverwriteValue<"intent" | "context">, unknown>;
989
983
  resolvedTriggerIntentId: import("@langchain/langgraph").BaseChannel<Id<"intents"> | undefined, Id<"intents"> | import("@langchain/langgraph").OverwriteValue<Id<"intents"> | undefined> | undefined, unknown>;
990
984
  sourceProfile: import("@langchain/langgraph").BaseChannel<SourceProfileData | null, SourceProfileData | import("@langchain/langgraph").OverwriteValue<SourceProfileData | null> | null, unknown>;
991
985
  sourcePremises: import("@langchain/langgraph").BaseChannel<{
@@ -1 +1 @@
1
- {"version":3,"file":"opportunity.graph.d.ts","sourceRoot":"/","sources":["opportunity/opportunity.graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opportunity.graph.d.ts","sourceRoot":"/","sources":["opportunity/opportunity.graph.ts"],"names":[],"mappings":"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"}
@@ -62,18 +62,14 @@ export function buildDiscovererContext(profile, intents) {
62
62
  const lines = [];
63
63
  if (profile) {
64
64
  const identity = profile.identity;
65
- const attrs = profile.attributes;
66
65
  if (identity?.name || identity?.bio) {
67
66
  lines.push(`Profile: ${[identity.name, identity.bio].filter(Boolean).join(', ')}`);
68
67
  }
69
68
  if (identity?.location) {
70
69
  lines.push(`Location: ${identity.location}`);
71
70
  }
72
- if (attrs?.skills?.length) {
73
- lines.push(`Skills: ${attrs.skills.join(', ')}`);
74
- }
75
- if (attrs?.interests?.length) {
76
- lines.push(`Interests: ${attrs.interests.join(', ')}`);
71
+ if (profile.context) {
72
+ lines.push(`Context: ${profile.context}`);
77
73
  }
78
74
  }
79
75
  if (intents?.length) {
@@ -208,8 +204,7 @@ export class OpportunityGraphFactory {
208
204
  const sourceProfile = profile
209
205
  ? {
210
206
  identity: profile.identity ?? undefined,
211
- narrative: profile.narrative ?? undefined,
212
- attributes: profile.attributes ?? undefined,
207
+ context: profile.context ?? undefined,
213
208
  }
214
209
  : null;
215
210
  // Source premises are loaded after scope is resolved so premise discovery
@@ -442,7 +437,7 @@ export class OpportunityGraphFactory {
442
437
  const inTarget = inNetwork.some((id) => targetIndexIds.includes(id));
443
438
  resolvedIntentId = state.triggerIntentId;
444
439
  const resolvedIntentInIndex = inTarget;
445
- const discoverySource = resolvedIntentInIndex ? 'intent' : 'profile';
440
+ const discoverySource = resolvedIntentInIndex ? 'intent' : 'context';
446
441
  return {
447
442
  resolvedTriggerIntentId: resolvedIntentId,
448
443
  resolvedIntentInIndex,
@@ -456,7 +451,7 @@ export class OpportunityGraphFactory {
456
451
  resolvedIntentId = matched.intentId;
457
452
  const inNetwork = await this.database.getNetworkIdsForIntent(matched.intentId);
458
453
  const resolvedIntentInIndex = inNetwork.some((id) => targetIndexIds.includes(id));
459
- const discoverySource = resolvedIntentInIndex ? 'intent' : 'profile';
454
+ const discoverySource = resolvedIntentInIndex ? 'intent' : 'context';
460
455
  return {
461
456
  resolvedTriggerIntentId: resolvedIntentId,
462
457
  resolvedIntentInIndex,
@@ -471,7 +466,7 @@ export class OpportunityGraphFactory {
471
466
  return {
472
467
  resolvedTriggerIntentId: undefined,
473
468
  resolvedIntentInIndex: false,
474
- discoverySource: 'profile',
469
+ discoverySource: 'context',
475
470
  };
476
471
  }
477
472
  catch (err) {
@@ -484,7 +479,7 @@ export class OpportunityGraphFactory {
484
479
  return {
485
480
  resolvedTriggerIntentId: undefined,
486
481
  resolvedIntentInIndex: false,
487
- discoverySource: 'profile',
482
+ discoverySource: 'context',
488
483
  error: errMsg || 'Resolve failed',
489
484
  trace: [{
490
485
  node: "resolve_fatal",
@@ -633,10 +628,10 @@ export class OpportunityGraphFactory {
633
628
  const perIndexLimit = 80;
634
629
  // Similarity threshold for recall (0.30 = 30% similarity)
635
630
  const minScore = 0.3;
636
- if (state.discoverySource === 'profile') {
637
- // Profile-context discovery: HyDE (when search query exists) + premise-to-premise.
631
+ if (state.discoverySource === 'context') {
632
+ // Context discovery: HyDE (when search query exists) + premise-to-premise.
638
633
  if (state.searchQuery?.trim()) {
639
- logger.verbose('[Graph:Discovery] Profile source with searchQuery → running query HyDE + premise paths', {
634
+ logger.verbose('[Graph:Discovery] Context source with searchQuery → running query HyDE + premise paths', {
640
635
  searchQuery: state.searchQuery.trim().substring(0, 80),
641
636
  });
642
637
  const queryCandidates = await runQueryHydeDiscovery();
@@ -1310,9 +1305,7 @@ export class OpportunityGraphFactory {
1310
1305
  name: sourceProfile?.identity?.name,
1311
1306
  bio: sourceProfile?.identity?.bio,
1312
1307
  location: sourceProfile?.identity?.location,
1313
- interests: sourceProfile?.attributes?.interests,
1314
- skills: sourceProfile?.attributes?.skills,
1315
- context: sourceProfile?.narrative?.context,
1308
+ context: sourceProfile?.context,
1316
1309
  },
1317
1310
  intents: state.indexedIntents.slice(0, 5).map((i) => ({
1318
1311
  intentId: i.intentId,
@@ -1342,9 +1335,7 @@ export class OpportunityGraphFactory {
1342
1335
  name: profile?.identity?.name,
1343
1336
  bio: profile?.identity?.bio,
1344
1337
  location: profile?.identity?.location,
1345
- interests: profile?.attributes?.interests,
1346
- skills: profile?.attributes?.skills,
1347
- context: profile?.narrative?.context,
1338
+ context: profile?.context,
1348
1339
  },
1349
1340
  intents: c.candidateIntentId != null
1350
1341
  ? [{ intentId: c.candidateIntentId, payload: intentPayload ?? '', summary: intentSummary }]
@@ -1705,8 +1696,6 @@ export class OpportunityGraphFactory {
1705
1696
  name: state.sourceProfile?.identity?.name ?? sourceAccount?.name,
1706
1697
  bio: state.sourceProfile?.identity?.bio ?? sourceAccount?.intro ?? undefined,
1707
1698
  location: state.sourceProfile?.identity?.location ?? sourceAccount?.location ?? undefined,
1708
- skills: state.sourceProfile?.attributes?.skills,
1709
- interests: state.sourceProfile?.attributes?.interests,
1710
1699
  },
1711
1700
  };
1712
1701
  // Build candidates from persisted opportunities. Each opportunity carries its DB id
@@ -1782,8 +1771,6 @@ export class OpportunityGraphFactory {
1782
1771
  name: profile?.identity?.name ?? user?.name,
1783
1772
  bio: profile?.identity?.bio ?? user?.intro ?? undefined,
1784
1773
  location: profile?.identity?.location ?? user?.location ?? undefined,
1785
- skills: profile?.attributes?.skills,
1786
- interests: profile?.attributes?.interests,
1787
1774
  },
1788
1775
  },
1789
1776
  };
@@ -3155,8 +3142,6 @@ export class OpportunityGraphFactory {
3155
3142
  name: sourceProfile?.identity?.name ?? sourceUserAccount?.name,
3156
3143
  bio: sourceProfile?.identity?.bio ?? sourceUserAccount?.intro ?? undefined,
3157
3144
  location: sourceProfile?.identity?.location ?? sourceUserAccount?.location ?? undefined,
3158
- skills: sourceProfile?.attributes?.skills,
3159
- interests: sourceProfile?.attributes?.interests,
3160
3145
  },
3161
3146
  };
3162
3147
  const candidateIntentsForNeg = candidateIntents.slice(0, 5).map(toNegIntent);
@@ -3173,8 +3158,6 @@ export class OpportunityGraphFactory {
3173
3158
  name: candidateProfile?.identity?.name ?? candidateAccount?.name,
3174
3159
  bio: candidateProfile?.identity?.bio ?? candidateAccount?.intro ?? undefined,
3175
3160
  location: candidateProfile?.identity?.location ?? candidateAccount?.location ?? undefined,
3176
- skills: candidateProfile?.attributes?.skills,
3177
- interests: candidateProfile?.attributes?.interests,
3178
3161
  },
3179
3162
  },
3180
3163
  };