@indexnetwork/protocol 4.3.4-rc.309.1 → 4.3.4-rc.310.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 (100) hide show
  1. package/IMPLEMENTATION.md +2 -2
  2. package/dist/chat/chat.agent.d.ts +1 -1
  3. package/dist/chat/chat.agent.js +1 -1
  4. package/dist/chat/chat.agent.js.map +1 -1
  5. package/dist/chat/chat.prompt.js +30 -30
  6. package/dist/chat/chat.prompt.js.map +1 -1
  7. package/dist/chat/chat.prompt.modules.js +8 -8
  8. package/dist/chat/chat.prompt.modules.js.map +1 -1
  9. package/dist/chat/chat.state.d.ts +1 -1
  10. package/dist/chat/chat.state.d.ts.map +1 -1
  11. package/dist/chat/chat.state.js.map +1 -1
  12. package/dist/chat/tests/chat.graph.mocks.d.ts +1 -1
  13. package/dist/chat/tests/chat.graph.mocks.js +1 -1
  14. package/dist/chat/tests/chat.graph.mocks.js.map +1 -1
  15. package/dist/contact/contact.tools.js +6 -6
  16. package/dist/contact/contact.tools.js.map +1 -1
  17. package/dist/enrichment/enrichment.tools.js +7 -7
  18. package/dist/enrichment/enrichment.tools.js.map +1 -1
  19. package/dist/integration/integration.tools.js +1 -1
  20. package/dist/integration/integration.tools.js.map +1 -1
  21. package/dist/intent/intent.graph.d.ts.map +1 -1
  22. package/dist/intent/intent.graph.js +9 -9
  23. package/dist/intent/intent.graph.js.map +1 -1
  24. package/dist/intent/intent.indexer.d.ts +1 -1
  25. package/dist/intent/intent.indexer.js +4 -4
  26. package/dist/intent/intent.indexer.js.map +1 -1
  27. package/dist/intent/intent.state.d.ts +7 -7
  28. package/dist/intent/intent.state.js +7 -7
  29. package/dist/intent/intent.state.js.map +1 -1
  30. package/dist/intent/intent.tools.js +26 -26
  31. package/dist/intent/intent.tools.js.map +1 -1
  32. package/dist/maintenance/maintenance.graph.d.ts +2 -2
  33. package/dist/maintenance/maintenance.graph.d.ts.map +1 -1
  34. package/dist/maintenance/maintenance.graph.js.map +1 -1
  35. package/dist/mcp/mcp.server.d.ts +2 -2
  36. package/dist/mcp/mcp.server.js +4 -4
  37. package/dist/mcp/mcp.server.js.map +1 -1
  38. package/dist/network/indexer/indexer.graph.d.ts +2 -2
  39. package/dist/network/indexer/indexer.graph.d.ts.map +1 -1
  40. package/dist/network/indexer/indexer.graph.js +13 -13
  41. package/dist/network/indexer/indexer.graph.js.map +1 -1
  42. package/dist/network/indexer/indexer.state.d.ts +3 -3
  43. package/dist/network/indexer/indexer.state.d.ts.map +1 -1
  44. package/dist/network/indexer/indexer.state.js +4 -4
  45. package/dist/network/indexer/indexer.state.js.map +1 -1
  46. package/dist/network/membership/membership.graph.d.ts +1 -1
  47. package/dist/network/membership/membership.graph.js +21 -21
  48. package/dist/network/membership/membership.graph.js.map +1 -1
  49. package/dist/network/membership/membership.state.d.ts +2 -2
  50. package/dist/network/membership/membership.state.js +2 -2
  51. package/dist/network/membership/membership.state.js.map +1 -1
  52. package/dist/network/network.graph.d.ts +1 -1
  53. package/dist/network/network.graph.d.ts.map +1 -1
  54. package/dist/network/network.graph.js +13 -13
  55. package/dist/network/network.graph.js.map +1 -1
  56. package/dist/network/network.state.d.ts +3 -3
  57. package/dist/network/network.state.d.ts.map +1 -1
  58. package/dist/network/network.state.js +3 -3
  59. package/dist/network/network.state.js.map +1 -1
  60. package/dist/network/network.tools.d.ts.map +1 -1
  61. package/dist/network/network.tools.js +95 -107
  62. package/dist/network/network.tools.js.map +1 -1
  63. package/dist/opportunity/opportunity.discover.d.ts +1 -1
  64. package/dist/opportunity/opportunity.discover.d.ts.map +1 -1
  65. package/dist/opportunity/opportunity.discover.js +1 -1
  66. package/dist/opportunity/opportunity.discover.js.map +1 -1
  67. package/dist/opportunity/opportunity.graph.js +10 -10
  68. package/dist/opportunity/opportunity.graph.js.map +1 -1
  69. package/dist/opportunity/opportunity.introducer.d.ts +3 -3
  70. package/dist/opportunity/opportunity.introducer.d.ts.map +1 -1
  71. package/dist/opportunity/opportunity.introducer.js +2 -2
  72. package/dist/opportunity/opportunity.introducer.js.map +1 -1
  73. package/dist/opportunity/opportunity.state.d.ts +1 -1
  74. package/dist/opportunity/opportunity.state.js +1 -1
  75. package/dist/opportunity/opportunity.state.js.map +1 -1
  76. package/dist/opportunity/opportunity.tools.js +18 -18
  77. package/dist/opportunity/opportunity.tools.js.map +1 -1
  78. package/dist/premise/premise.indexer.d.ts +1 -1
  79. package/dist/premise/premise.indexer.js +5 -5
  80. package/dist/premise/premise.indexer.js.map +1 -1
  81. package/dist/questioner/questioner.tools.js +1 -1
  82. package/dist/questioner/questioner.tools.js.map +1 -1
  83. package/dist/shared/agent/tool.factory.d.ts +1 -1
  84. package/dist/shared/agent/tool.factory.js +1 -1
  85. package/dist/shared/agent/tool.factory.js.map +1 -1
  86. package/dist/shared/agent/tool.helpers.d.ts +6 -6
  87. package/dist/shared/agent/tool.helpers.d.ts.map +1 -1
  88. package/dist/shared/agent/tool.helpers.js +2 -2
  89. package/dist/shared/agent/tool.helpers.js.map +1 -1
  90. package/dist/shared/agent/tool.scope.js +1 -1
  91. package/dist/shared/agent/tool.scope.js.map +1 -1
  92. package/dist/shared/agent/utility.tools.js +20 -20
  93. package/dist/shared/agent/utility.tools.js.map +1 -1
  94. package/dist/shared/interfaces/database.interface.d.ts +59 -59
  95. package/dist/shared/interfaces/database.interface.d.ts.map +1 -1
  96. package/dist/shared/interfaces/database.interface.js.map +1 -1
  97. package/dist/shared/interfaces/embedder.interface.d.ts +2 -2
  98. package/dist/shared/interfaces/embedder.interface.d.ts.map +1 -1
  99. package/dist/shared/interfaces/embedder.interface.js.map +1 -1
  100. package/package.json +1 -1
@@ -2,7 +2,7 @@ import { Annotation } from "@langchain/langgraph";
2
2
  /**
3
3
  * Intent Index Graph State.
4
4
  * Handles CRUD for the intent_indexes junction table (linking intents to indexes).
5
- * Absorbs the old Index Graph's evaluate-based assignment flow.
5
+ * Absorbs the old Network Graph's evaluate-based assignment flow.
6
6
  *
7
7
  * Flow:
8
8
  * START → router → {
@@ -33,13 +33,13 @@ export const IntentNetworkGraphState = Annotation.Root({
33
33
  // --- Create Mode Controls ---
34
34
  /**
35
35
  * When true, skip LLM evaluation and assign directly.
36
- * (Migrated from old Index Graph.)
36
+ * (Migrated from old Network Graph.)
37
37
  */
38
38
  skipEvaluation: Annotation({
39
39
  reducer: (_, next) => next,
40
40
  default: () => true,
41
41
  }),
42
- // --- Intermediate State (populated by nodes, migrated from old Index Graph) ---
42
+ // --- Intermediate State (populated by nodes, migrated from old Network Graph) ---
43
43
  /** Intent payload and metadata. Null if intent not found. */
44
44
  intent: Annotation({
45
45
  reducer: (_, next) => next,
@@ -55,7 +55,7 @@ export const IntentNetworkGraphState = Annotation.Root({
55
55
  reducer: (_, next) => next,
56
56
  default: () => null,
57
57
  }),
58
- /** Final decision: should intent be in this index? */
58
+ /** Final decision: should intent be in this network? */
59
59
  shouldAssign: Annotation({
60
60
  reducer: (_, next) => next,
61
61
  default: () => undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.state.js","sourceRoot":"/","sources":["network/indexer/indexer.state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Annotation } from \"@langchain/langgraph\";\nimport type { IntentIndexerOutput } from \"../../intent/intent.indexer.js\";\nimport type { DebugMetaAgent } from '../../chat/chat-streaming.types.js';\n\n/**\n * Intent payload and metadata loaded for index evaluation.\n * (Migrated from the old index.graph.state.ts)\n */\nexport interface IntentForIndexing {\n id: string;\n payload: string;\n userId: string;\n sourceType: string | null;\n sourceId: string | null;\n}\n\n/**\n * Index and member prompts for a single index (user must be member with autoAssign).\n * (Migrated from the old index.graph.state.ts)\n */\nexport interface IndexMemberContext {\n networkId: string;\n indexPrompt: string | null;\n memberPrompt: string | null;\n}\n\n/**\n * Result of executing an assignment decision.\n * (Migrated from the old index.graph.state.ts)\n */\nexport interface AssignmentResult {\n networkId: string;\n assigned: boolean;\n success: boolean;\n error?: string;\n}\n\n/**\n * Intent Index Graph State.\n * Handles CRUD for the intent_indexes junction table (linking intents to indexes).\n * Absorbs the old Index Graph's evaluate-based assignment flow.\n *\n * Flow:\n * START → router → {\n * create: assignNode (direct or evaluated) → END\n * read: readNode → END\n * delete: unassignNode → END\n * }\n */\nexport const IntentNetworkGraphState = Annotation.Root({\n // --- Core Inputs (from ChatGraph via ToolContext) ---\n\n /** User performing the action. Always required. */\n userId: Annotation<string>,\n\n /** Target index for assign/read-by-index. From ChatGraph or tool arg. */\n networkId: Annotation<string | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Target intent for assign/read-by-intent. From tool arg. */\n intentId: Annotation<string | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Operation mode. */\n operationMode: Annotation<'create' | 'read' | 'delete'>({\n reducer: (curr, next) => next ?? curr,\n default: () => 'read' as const,\n }),\n\n // --- Create Mode Controls ---\n\n /**\n * When true, skip LLM evaluation and assign directly.\n * (Migrated from old Index Graph.)\n */\n skipEvaluation: Annotation<boolean>({\n reducer: (_, next) => next,\n default: () => true,\n }),\n\n // --- Intermediate State (populated by nodes, migrated from old Index Graph) ---\n\n /** Intent payload and metadata. Null if intent not found. */\n intent: Annotation<IntentForIndexing | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n /** Index + member context. Null if user not eligible. */\n indexContext: Annotation<IndexMemberContext | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n /** LLM evaluation result. Null if skipped. */\n evaluation: Annotation<IntentIndexerOutput | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n /** Final decision: should intent be in this index? */\n shouldAssign: Annotation<boolean | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Final score used for decision (0–1). */\n finalScore: Annotation<number | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Result of the assignment operation. */\n assignmentResult: Annotation<AssignmentResult | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n // --- Read Mode Outputs ---\n\n /** For read-by-intent: pass userId when listing an intent's indexes (omit for read-by-index). */\n queryUserId: Annotation<string | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Output for read mode. */\n readResult: Annotation<{\n links: Array<{\n intentId: string;\n networkId: string;\n intentTitle?: string;\n networkTitle?: string;\n userId?: string;\n userName?: string;\n createdAt?: Date;\n relevancyScore?: number | null;\n }>;\n count: number;\n mode: string;\n note?: string;\n } | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Output for create/delete modes. */\n mutationResult: Annotation<{\n success: boolean;\n message?: string;\n error?: string;\n } | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Error message. */\n error: Annotation<string | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n /** Timing records for each agent invocation within this graph run. */\n agentTimings: Annotation<DebugMetaAgent[]>({\n reducer: (acc, val) => [...acc, ...val],\n default: () => [],\n }),\n});\n"]}
1
+ {"version":3,"file":"indexer.state.js","sourceRoot":"/","sources":["network/indexer/indexer.state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Annotation } from \"@langchain/langgraph\";\nimport type { IntentIndexerOutput } from \"../../intent/intent.indexer.js\";\nimport type { DebugMetaAgent } from '../../chat/chat-streaming.types.js';\n\n/**\n * Intent payload and metadata loaded for index evaluation.\n * (Migrated from the old index.graph.state.ts)\n */\nexport interface IntentForIndexing {\n id: string;\n payload: string;\n userId: string;\n sourceType: string | null;\n sourceId: string | null;\n}\n\n/**\n * Index and member prompts for a single index (user must be member with autoAssign).\n * (Migrated from the old index.graph.state.ts)\n */\nexport interface IndexMemberContext {\n networkId: string;\n indexPrompt: string | null;\n memberPrompt: string | null;\n}\n\n/**\n * Result of executing an assignment decision.\n * (Migrated from the old index.graph.state.ts)\n */\nexport interface AssignmentResult {\n networkId: string;\n assigned: boolean;\n success: boolean;\n error?: string;\n}\n\n/**\n * Intent Index Graph State.\n * Handles CRUD for the intent_indexes junction table (linking intents to indexes).\n * Absorbs the old Network Graph's evaluate-based assignment flow.\n *\n * Flow:\n * START → router → {\n * create: assignNode (direct or evaluated) → END\n * read: readNode → END\n * delete: unassignNode → END\n * }\n */\nexport const IntentNetworkGraphState = Annotation.Root({\n // --- Core Inputs (from ChatGraph via ToolContext) ---\n\n /** User performing the action. Always required. */\n userId: Annotation<string>,\n\n /** Target index for assign/read-by-index. From ChatGraph or tool arg. */\n networkId: Annotation<string | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Target intent for assign/read-by-intent. From tool arg. */\n intentId: Annotation<string | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Operation mode. */\n operationMode: Annotation<'create' | 'read' | 'delete'>({\n reducer: (curr, next) => next ?? curr,\n default: () => 'read' as const,\n }),\n\n // --- Create Mode Controls ---\n\n /**\n * When true, skip LLM evaluation and assign directly.\n * (Migrated from old Network Graph.)\n */\n skipEvaluation: Annotation<boolean>({\n reducer: (_, next) => next,\n default: () => true,\n }),\n\n // --- Intermediate State (populated by nodes, migrated from old Network Graph) ---\n\n /** Intent payload and metadata. Null if intent not found. */\n intent: Annotation<IntentForIndexing | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n /** Index + member context. Null if user not eligible. */\n indexContext: Annotation<IndexMemberContext | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n /** LLM evaluation result. Null if skipped. */\n evaluation: Annotation<IntentIndexerOutput | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n /** Final decision: should intent be in this network? */\n shouldAssign: Annotation<boolean | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Final score used for decision (0–1). */\n finalScore: Annotation<number | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Result of the assignment operation. */\n assignmentResult: Annotation<AssignmentResult | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n // --- Read Mode Outputs ---\n\n /** For read-by-intent: pass userId when listing an intent's indexes (omit for read-by-index). */\n queryUserId: Annotation<string | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Output for read mode. */\n readResult: Annotation<{\n links: Array<{\n intentId: string;\n networkId: string;\n intentTitle?: string;\n networkTitle?: string;\n userId?: string;\n userName?: string;\n createdAt?: Date;\n relevancyScore?: number | null;\n }>;\n count: number;\n mode: string;\n note?: string;\n } | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Output for create/delete modes. */\n mutationResult: Annotation<{\n success: boolean;\n message?: string;\n error?: string;\n } | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Error message. */\n error: Annotation<string | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n\n /** Timing records for each agent invocation within this graph run. */\n agentTimings: Annotation<DebugMetaAgent[]>({\n reducer: (acc, val) => [...acc, ...val],\n default: () => [],\n }),\n});\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { NetworkMembershipGraphDatabase } from "../../shared/interfaces/database.interface.js";
2
2
  /**
3
- * Factory class to build and compile the Index Membership Graph.
3
+ * Factory class to build and compile the Network Membership Graph.
4
4
  *
5
5
  * Handles CRUD operations for the index_members table:
6
6
  * - create: Add a member to an index (validates join policy and ownership)
@@ -4,7 +4,7 @@ import { timed } from "../../shared/observability/performance.js";
4
4
  import { NetworkMembershipGraphState } from "./membership.state.js";
5
5
  const logger = protocolLogger("NetworkMembershipGraphFactory");
6
6
  /**
7
- * Factory class to build and compile the Index Membership Graph.
7
+ * Factory class to build and compile the Network Membership Graph.
8
8
  *
9
9
  * Handles CRUD operations for the index_members table:
10
10
  * - create: Add a member to an index (validates join policy and ownership)
@@ -20,7 +20,7 @@ export class NetworkMembershipGraphFactory {
20
20
  /**
21
21
  * Add Member Node: Add a user as a member of an index.
22
22
  * Handles two cases:
23
- * 1. Self-join (targetUserId === userId): Only allowed for public indexes (joinPolicy 'anyone')
23
+ * 1. Self-join (targetUserId === userId): Only allowed for public networks (joinPolicy 'anyone')
24
24
  * 2. Invite others (targetUserId !== userId): Requires caller to be member; owner-only for invite_only
25
25
  */
26
26
  const addMemberNode = async (state) => {
@@ -41,37 +41,37 @@ export class NetworkMembershipGraphFactory {
41
41
  const joinPolicy = indexRecord.permissions.joinPolicy;
42
42
  const isSelfJoin = state.targetUserId === state.userId;
43
43
  if (isSelfJoin) {
44
- // Self-join: only allowed for public indexes
44
+ // Self-join: only allowed for public networks
45
45
  if (joinPolicy !== 'anyone') {
46
46
  return {
47
47
  mutationResult: {
48
48
  success: false,
49
- error: "This index is invite-only. You cannot join without an invitation from an existing member.",
49
+ error: "This network is invite-only. You cannot join without an invitation from an existing member.",
50
50
  },
51
51
  };
52
52
  }
53
53
  const result = await this.database.addMemberToNetwork(state.networkId, state.targetUserId, 'member');
54
54
  if (result.alreadyMember) {
55
- return { mutationResult: { success: true, message: "You are already a member of this index." } };
55
+ return { mutationResult: { success: true, message: "You are already a member of this network." } };
56
56
  }
57
57
  return { mutationResult: { success: true, message: `You have joined "${indexRecord.title}".` } };
58
58
  }
59
59
  // Inviting others: must be a member first
60
60
  const isMember = await this.database.isNetworkMember(state.networkId, state.userId);
61
61
  if (!isMember) {
62
- return { mutationResult: { success: false, error: "You must be a member of that index to add others." } };
62
+ return { mutationResult: { success: false, error: "You must be a member of that network to add others." } };
63
63
  }
64
64
  if (joinPolicy === 'invite_only') {
65
65
  const isOwner = await this.database.isIndexOwner(state.networkId, state.userId);
66
66
  if (!isOwner) {
67
- return { mutationResult: { success: false, error: "Only the index owner can add members when the index is invite-only." } };
67
+ return { mutationResult: { success: false, error: "Only the network owner can add members when the network is invite-only." } };
68
68
  }
69
69
  }
70
70
  const result = await this.database.addMemberToNetwork(state.networkId, state.targetUserId, 'member');
71
71
  if (result.alreadyMember) {
72
- return { mutationResult: { success: true, message: "That user is already a member of this index." } };
72
+ return { mutationResult: { success: true, message: "That user is already a member of this network." } };
73
73
  }
74
- return { mutationResult: { success: true, message: "Member added to the index." } };
74
+ return { mutationResult: { success: true, message: "Member added to the network." } };
75
75
  }
76
76
  catch (err) {
77
77
  logger.error("Add member failed", { error: err });
@@ -85,12 +85,12 @@ export class NetworkMembershipGraphFactory {
85
85
  });
86
86
  };
87
87
  /**
88
- * List Members Node: List all members of an index.
88
+ * List Members Node: List all members of a network.
89
89
  * Validates caller is a member.
90
90
  */
91
91
  const listMembersNode = async (state) => {
92
92
  return timed("NetworkMembershipGraph.listMembers", async () => {
93
- logger.verbose("List index members", {
93
+ logger.verbose("List network members", {
94
94
  userId: state.userId,
95
95
  networkId: state.networkId,
96
96
  });
@@ -103,7 +103,7 @@ export class NetworkMembershipGraphFactory {
103
103
  count: 0,
104
104
  members: [],
105
105
  },
106
- error: "Index not found or you are not a member.",
106
+ error: "Network not found or you are not a member.",
107
107
  };
108
108
  }
109
109
  const members = await this.database.getNetworkMembersForMember(state.networkId, state.userId);
@@ -124,19 +124,19 @@ export class NetworkMembershipGraphFactory {
124
124
  }
125
125
  catch (err) {
126
126
  logger.error("List members failed", { error: err });
127
- if (err instanceof Error && err.message === "Access denied: Not a member of this index") {
128
- return { error: "You must be a member of that index." };
127
+ if (err instanceof Error && err.message === "Access denied: Not a member of this network") {
128
+ return { error: "You must be a member of that network." };
129
129
  }
130
- return { error: "Failed to fetch index members." };
130
+ return { error: "Failed to fetch network members." };
131
131
  }
132
132
  });
133
133
  };
134
134
  /**
135
- * Remove Member Node: Remove a member from an index (owner only).
135
+ * Remove Member Node: Remove a member from a network (owner only).
136
136
  */
137
137
  const removeMemberNode = async (state) => {
138
138
  return timed("NetworkMembershipGraph.removeMember", async () => {
139
- logger.verbose("Remove member from index", {
139
+ logger.verbose("Remove member from network", {
140
140
  userId: state.userId,
141
141
  networkId: state.networkId,
142
142
  targetUserId: state.targetUserId,
@@ -146,19 +146,19 @@ export class NetworkMembershipGraphFactory {
146
146
  }
147
147
  // Cannot remove yourself via this flow
148
148
  if (state.targetUserId === state.userId) {
149
- return { mutationResult: { success: false, error: "You cannot remove yourself. Use 'leave index' instead." } };
149
+ return { mutationResult: { success: false, error: "You cannot remove yourself. Use 'leave network' instead." } };
150
150
  }
151
151
  try {
152
152
  const isOwner = await this.database.isIndexOwner(state.networkId, state.userId);
153
153
  if (!isOwner) {
154
- return { mutationResult: { success: false, error: "Only the index owner can remove members." } };
154
+ return { mutationResult: { success: false, error: "Only the network owner can remove members." } };
155
155
  }
156
156
  const result = await this.database.removeMemberFromIndex(state.networkId, state.targetUserId);
157
157
  if (result.wasOwner) {
158
- return { mutationResult: { success: false, error: "Cannot remove the index owner." } };
158
+ return { mutationResult: { success: false, error: "Cannot remove the network owner." } };
159
159
  }
160
160
  if (result.notMember) {
161
- return { mutationResult: { success: false, error: "User is not a member of this index." } };
161
+ return { mutationResult: { success: false, error: "User is not a member of this network." } };
162
162
  }
163
163
  if (!result.success) {
164
164
  return { mutationResult: { success: false, error: "Failed to remove member." } };
@@ -1 +1 @@
1
- {"version":3,"file":"membership.graph.js","sourceRoot":"/","sources":["network/membership/membership.graph.ts"],"names":[],"mappings":"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","sourcesContent":["import { StateGraph, START, END } from \"@langchain/langgraph\";\nimport type { NetworkMembershipGraphDatabase } from \"../../shared/interfaces/database.interface.js\";\nimport { protocolLogger } from \"../../shared/observability/protocol.logger.js\";\nimport { timed } from \"../../shared/observability/performance.js\";\nimport { NetworkMembershipGraphState } from \"./membership.state.js\";\n\nconst logger = protocolLogger(\"NetworkMembershipGraphFactory\");\n\n/**\n * Factory class to build and compile the Index Membership Graph.\n *\n * Handles CRUD operations for the index_members table:\n * - create: Add a member to an index (validates join policy and ownership)\n * - read: List members of an index (validates caller is member)\n * - delete: Remove a member from an index (future, validates ownership)\n */\nexport class NetworkMembershipGraphFactory {\n constructor(private database: NetworkMembershipGraphDatabase) {}\n\n public createGraph() {\n // --- NODE DEFINITIONS ---\n\n /**\n * Add Member Node: Add a user as a member of an index.\n * Handles two cases:\n * 1. Self-join (targetUserId === userId): Only allowed for public indexes (joinPolicy 'anyone')\n * 2. Invite others (targetUserId !== userId): Requires caller to be member; owner-only for invite_only\n */\n const addMemberNode = async (state: typeof NetworkMembershipGraphState.State) => {\n return timed(\"NetworkMembershipGraph.addMember\", async () => {\n logger.verbose(\"Add member to index\", {\n userId: state.userId,\n networkId: state.networkId,\n targetUserId: state.targetUserId,\n });\n\n if (!state.targetUserId) {\n return { mutationResult: { success: false, error: \"targetUserId is required.\" } };\n }\n\n try {\n const indexRecord = await this.database.getNetworkWithPermissions(state.networkId);\n if (!indexRecord) {\n return { mutationResult: { success: false, error: \"Index not found.\" } };\n }\n\n const joinPolicy = indexRecord.permissions.joinPolicy;\n const isSelfJoin = state.targetUserId === state.userId;\n\n if (isSelfJoin) {\n // Self-join: only allowed for public indexes\n if (joinPolicy !== 'anyone') {\n return {\n mutationResult: {\n success: false,\n error: \"This index is invite-only. You cannot join without an invitation from an existing member.\",\n },\n };\n }\n\n const result = await this.database.addMemberToNetwork(state.networkId, state.targetUserId, 'member');\n if (result.alreadyMember) {\n return { mutationResult: { success: true, message: \"You are already a member of this index.\" } };\n }\n\n return { mutationResult: { success: true, message: `You have joined \"${indexRecord.title}\".` } };\n }\n\n // Inviting others: must be a member first\n const isMember = await this.database.isNetworkMember(state.networkId, state.userId);\n if (!isMember) {\n return { mutationResult: { success: false, error: \"You must be a member of that index to add others.\" } };\n }\n\n if (joinPolicy === 'invite_only') {\n const isOwner = await this.database.isIndexOwner(state.networkId, state.userId);\n if (!isOwner) {\n return { mutationResult: { success: false, error: \"Only the index owner can add members when the index is invite-only.\" } };\n }\n }\n\n const result = await this.database.addMemberToNetwork(state.networkId, state.targetUserId, 'member');\n if (result.alreadyMember) {\n return { mutationResult: { success: true, message: \"That user is already a member of this index.\" } };\n }\n\n return { mutationResult: { success: true, message: \"Member added to the index.\" } };\n } catch (err) {\n logger.error(\"Add member failed\", { error: err });\n return {\n mutationResult: {\n success: false,\n error: err instanceof Error ? err.message : \"Failed to add member.\",\n },\n };\n }\n });\n };\n\n /**\n * List Members Node: List all members of an index.\n * Validates caller is a member.\n */\n const listMembersNode = async (state: typeof NetworkMembershipGraphState.State) => {\n return timed(\"NetworkMembershipGraph.listMembers\", async () => {\n logger.verbose(\"List index members\", {\n userId: state.userId,\n networkId: state.networkId,\n });\n\n try {\n const isMember = await this.database.isNetworkMember(state.networkId, state.userId);\n if (!isMember) {\n return {\n readResult: {\n networkId: state.networkId,\n count: 0,\n members: [],\n },\n error: \"Index not found or you are not a member.\",\n };\n }\n\n const members = await this.database.getNetworkMembersForMember(state.networkId, state.userId);\n return {\n readResult: {\n networkId: state.networkId,\n count: members.length,\n members: members.map((m) => ({\n userId: m.userId,\n name: m.name,\n avatar: m.avatar,\n permissions: m.permissions,\n intentCount: m.intentCount,\n joinedAt: m.joinedAt,\n })),\n },\n };\n } catch (err) {\n logger.error(\"List members failed\", { error: err });\n if (err instanceof Error && err.message === \"Access denied: Not a member of this index\") {\n return { error: \"You must be a member of that index.\" };\n }\n return { error: \"Failed to fetch index members.\" };\n }\n });\n };\n\n /**\n * Remove Member Node: Remove a member from an index (owner only).\n */\n const removeMemberNode = async (state: typeof NetworkMembershipGraphState.State) => {\n return timed(\"NetworkMembershipGraph.removeMember\", async () => {\n logger.verbose(\"Remove member from index\", {\n userId: state.userId,\n networkId: state.networkId,\n targetUserId: state.targetUserId,\n });\n\n if (!state.targetUserId) {\n return { mutationResult: { success: false, error: \"targetUserId is required.\" } };\n }\n\n // Cannot remove yourself via this flow\n if (state.targetUserId === state.userId) {\n return { mutationResult: { success: false, error: \"You cannot remove yourself. Use 'leave index' instead.\" } };\n }\n\n try {\n const isOwner = await this.database.isIndexOwner(state.networkId, state.userId);\n if (!isOwner) {\n return { mutationResult: { success: false, error: \"Only the index owner can remove members.\" } };\n }\n\n const result = await this.database.removeMemberFromIndex(state.networkId, state.targetUserId);\n\n if (result.wasOwner) {\n return { mutationResult: { success: false, error: \"Cannot remove the index owner.\" } };\n }\n if (result.notMember) {\n return { mutationResult: { success: false, error: \"User is not a member of this index.\" } };\n }\n if (!result.success) {\n return { mutationResult: { success: false, error: \"Failed to remove member.\" } };\n }\n\n return {\n mutationResult: {\n success: true,\n message: \"Member removed from the index.\",\n },\n };\n } catch (err) {\n logger.error(\"Remove member failed\", { error: err });\n return { mutationResult: { success: false, error: \"Failed to remove member.\" } };\n }\n });\n };\n\n // --- CONDITIONAL ROUTING ---\n\n const routeByMode = (state: typeof NetworkMembershipGraphState.State): string => {\n switch (state.operationMode) {\n case 'create': return 'add_member';\n case 'read': return 'list_members';\n case 'delete': return 'remove_member';\n default: return 'list_members';\n }\n };\n\n // --- GRAPH ASSEMBLY ---\n\n const workflow = new StateGraph(NetworkMembershipGraphState)\n .addNode(\"add_member\", addMemberNode)\n .addNode(\"list_members\", listMembersNode)\n .addNode(\"remove_member\", removeMemberNode)\n .addConditionalEdges(START, routeByMode, {\n add_member: \"add_member\",\n list_members: \"list_members\",\n remove_member: \"remove_member\",\n })\n .addEdge(\"add_member\", END)\n .addEdge(\"list_members\", END)\n .addEdge(\"remove_member\", END);\n\n return workflow.compile();\n }\n}\n"]}
1
+ {"version":3,"file":"membership.graph.js","sourceRoot":"/","sources":["network/membership/membership.graph.ts"],"names":[],"mappings":"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","sourcesContent":["import { StateGraph, START, END } from \"@langchain/langgraph\";\nimport type { NetworkMembershipGraphDatabase } from \"../../shared/interfaces/database.interface.js\";\nimport { protocolLogger } from \"../../shared/observability/protocol.logger.js\";\nimport { timed } from \"../../shared/observability/performance.js\";\nimport { NetworkMembershipGraphState } from \"./membership.state.js\";\n\nconst logger = protocolLogger(\"NetworkMembershipGraphFactory\");\n\n/**\n * Factory class to build and compile the Network Membership Graph.\n *\n * Handles CRUD operations for the index_members table:\n * - create: Add a member to an index (validates join policy and ownership)\n * - read: List members of an index (validates caller is member)\n * - delete: Remove a member from an index (future, validates ownership)\n */\nexport class NetworkMembershipGraphFactory {\n constructor(private database: NetworkMembershipGraphDatabase) {}\n\n public createGraph() {\n // --- NODE DEFINITIONS ---\n\n /**\n * Add Member Node: Add a user as a member of an index.\n * Handles two cases:\n * 1. Self-join (targetUserId === userId): Only allowed for public networks (joinPolicy 'anyone')\n * 2. Invite others (targetUserId !== userId): Requires caller to be member; owner-only for invite_only\n */\n const addMemberNode = async (state: typeof NetworkMembershipGraphState.State) => {\n return timed(\"NetworkMembershipGraph.addMember\", async () => {\n logger.verbose(\"Add member to index\", {\n userId: state.userId,\n networkId: state.networkId,\n targetUserId: state.targetUserId,\n });\n\n if (!state.targetUserId) {\n return { mutationResult: { success: false, error: \"targetUserId is required.\" } };\n }\n\n try {\n const indexRecord = await this.database.getNetworkWithPermissions(state.networkId);\n if (!indexRecord) {\n return { mutationResult: { success: false, error: \"Index not found.\" } };\n }\n\n const joinPolicy = indexRecord.permissions.joinPolicy;\n const isSelfJoin = state.targetUserId === state.userId;\n\n if (isSelfJoin) {\n // Self-join: only allowed for public networks\n if (joinPolicy !== 'anyone') {\n return {\n mutationResult: {\n success: false,\n error: \"This network is invite-only. You cannot join without an invitation from an existing member.\",\n },\n };\n }\n\n const result = await this.database.addMemberToNetwork(state.networkId, state.targetUserId, 'member');\n if (result.alreadyMember) {\n return { mutationResult: { success: true, message: \"You are already a member of this network.\" } };\n }\n\n return { mutationResult: { success: true, message: `You have joined \"${indexRecord.title}\".` } };\n }\n\n // Inviting others: must be a member first\n const isMember = await this.database.isNetworkMember(state.networkId, state.userId);\n if (!isMember) {\n return { mutationResult: { success: false, error: \"You must be a member of that network to add others.\" } };\n }\n\n if (joinPolicy === 'invite_only') {\n const isOwner = await this.database.isIndexOwner(state.networkId, state.userId);\n if (!isOwner) {\n return { mutationResult: { success: false, error: \"Only the network owner can add members when the network is invite-only.\" } };\n }\n }\n\n const result = await this.database.addMemberToNetwork(state.networkId, state.targetUserId, 'member');\n if (result.alreadyMember) {\n return { mutationResult: { success: true, message: \"That user is already a member of this network.\" } };\n }\n\n return { mutationResult: { success: true, message: \"Member added to the network.\" } };\n } catch (err) {\n logger.error(\"Add member failed\", { error: err });\n return {\n mutationResult: {\n success: false,\n error: err instanceof Error ? err.message : \"Failed to add member.\",\n },\n };\n }\n });\n };\n\n /**\n * List Members Node: List all members of a network.\n * Validates caller is a member.\n */\n const listMembersNode = async (state: typeof NetworkMembershipGraphState.State) => {\n return timed(\"NetworkMembershipGraph.listMembers\", async () => {\n logger.verbose(\"List network members\", {\n userId: state.userId,\n networkId: state.networkId,\n });\n\n try {\n const isMember = await this.database.isNetworkMember(state.networkId, state.userId);\n if (!isMember) {\n return {\n readResult: {\n networkId: state.networkId,\n count: 0,\n members: [],\n },\n error: \"Network not found or you are not a member.\",\n };\n }\n\n const members = await this.database.getNetworkMembersForMember(state.networkId, state.userId);\n return {\n readResult: {\n networkId: state.networkId,\n count: members.length,\n members: members.map((m) => ({\n userId: m.userId,\n name: m.name,\n avatar: m.avatar,\n permissions: m.permissions,\n intentCount: m.intentCount,\n joinedAt: m.joinedAt,\n })),\n },\n };\n } catch (err) {\n logger.error(\"List members failed\", { error: err });\n if (err instanceof Error && err.message === \"Access denied: Not a member of this network\") {\n return { error: \"You must be a member of that network.\" };\n }\n return { error: \"Failed to fetch network members.\" };\n }\n });\n };\n\n /**\n * Remove Member Node: Remove a member from a network (owner only).\n */\n const removeMemberNode = async (state: typeof NetworkMembershipGraphState.State) => {\n return timed(\"NetworkMembershipGraph.removeMember\", async () => {\n logger.verbose(\"Remove member from network\", {\n userId: state.userId,\n networkId: state.networkId,\n targetUserId: state.targetUserId,\n });\n\n if (!state.targetUserId) {\n return { mutationResult: { success: false, error: \"targetUserId is required.\" } };\n }\n\n // Cannot remove yourself via this flow\n if (state.targetUserId === state.userId) {\n return { mutationResult: { success: false, error: \"You cannot remove yourself. Use 'leave network' instead.\" } };\n }\n\n try {\n const isOwner = await this.database.isIndexOwner(state.networkId, state.userId);\n if (!isOwner) {\n return { mutationResult: { success: false, error: \"Only the network owner can remove members.\" } };\n }\n\n const result = await this.database.removeMemberFromIndex(state.networkId, state.targetUserId);\n\n if (result.wasOwner) {\n return { mutationResult: { success: false, error: \"Cannot remove the network owner.\" } };\n }\n if (result.notMember) {\n return { mutationResult: { success: false, error: \"User is not a member of this network.\" } };\n }\n if (!result.success) {\n return { mutationResult: { success: false, error: \"Failed to remove member.\" } };\n }\n\n return {\n mutationResult: {\n success: true,\n message: \"Member removed from the index.\",\n },\n };\n } catch (err) {\n logger.error(\"Remove member failed\", { error: err });\n return { mutationResult: { success: false, error: \"Failed to remove member.\" } };\n }\n });\n };\n\n // --- CONDITIONAL ROUTING ---\n\n const routeByMode = (state: typeof NetworkMembershipGraphState.State): string => {\n switch (state.operationMode) {\n case 'create': return 'add_member';\n case 'read': return 'list_members';\n case 'delete': return 'remove_member';\n default: return 'list_members';\n }\n };\n\n // --- GRAPH ASSEMBLY ---\n\n const workflow = new StateGraph(NetworkMembershipGraphState)\n .addNode(\"add_member\", addMemberNode)\n .addNode(\"list_members\", listMembersNode)\n .addNode(\"remove_member\", removeMemberNode)\n .addConditionalEdges(START, routeByMode, {\n add_member: \"add_member\",\n list_members: \"list_members\",\n remove_member: \"remove_member\",\n })\n .addEdge(\"add_member\", END)\n .addEdge(\"list_members\", END)\n .addEdge(\"remove_member\", END);\n\n return workflow.compile();\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Index Membership Graph State.
3
- * Handles CRUD operations for index memberships (index_members table).
2
+ * Network Membership Graph State.
3
+ * Handles CRUD operations for network memberships (index_members table).
4
4
  *
5
5
  * Flow:
6
6
  * START → routerNode → {addMemberNode | listMembersNode | removeMemberNode} → END
@@ -1,7 +1,7 @@
1
1
  import { Annotation } from "@langchain/langgraph";
2
2
  /**
3
- * Index Membership Graph State.
4
- * Handles CRUD operations for index memberships (index_members table).
3
+ * Network Membership Graph State.
4
+ * Handles CRUD operations for network memberships (index_members table).
5
5
  *
6
6
  * Flow:
7
7
  * START → routerNode → {addMemberNode | listMembersNode | removeMemberNode} → END
@@ -1 +1 @@
1
- {"version":3,"file":"membership.state.js","sourceRoot":"/","sources":["network/membership/membership.state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAC,IAAI,CAAC;IACzD,uDAAuD;IAEvD,+DAA+D;IAC/D,MAAM,EAAE,CAAA,UAAkB,CAAA;IAE1B,iDAAiD;IACjD,SAAS,EAAE,CAAA,UAAkB,CAAA;IAE7B,sBAAsB;IACtB,aAAa,EAAE,UAAU,CAA+B;QACtD,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI;QACrC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAe;KAC/B,CAAC;IAEF,+BAA+B;IAE/B,uDAAuD;IACvD,YAAY,EAAE,UAAU,CAAqB;QAC3C,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACzB,CAAC;IAEF,kBAAkB;IAElB,6CAA6C;IAC7C,UAAU,EAAE,UAAU,CAWP;QACb,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACzB,CAAC;IAEF,sCAAsC;IACtC,cAAc,EAAE,UAAU,CAIX;QACb,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACzB,CAAC;IAEF,iDAAiD;IACjD,KAAK,EAAE,UAAU,CAAgB;QAC/B,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;KACpB,CAAC;CACH,CAAC,CAAC","sourcesContent":["import { Annotation } from \"@langchain/langgraph\";\n\n/**\n * Index Membership Graph State.\n * Handles CRUD operations for index memberships (index_members table).\n *\n * Flow:\n * START → routerNode → {addMemberNode | listMembersNode | removeMemberNode} → END\n */\nexport const NetworkMembershipGraphState = Annotation.Root({\n // --- Core Inputs (from ChatGraph via ToolContext) ---\n\n /** User performing the action (the actor). Always required. */\n userId: Annotation<string>,\n\n /** Target index. Required for all operations. */\n networkId: Annotation<string>,\n\n /** Operation mode. */\n operationMode: Annotation<'create' | 'read' | 'delete'>({\n reducer: (curr, next) => next ?? curr,\n default: () => 'read' as const,\n }),\n\n // --- Mode-Specific Inputs ---\n\n /** For create/delete: the user being added/removed. */\n targetUserId: Annotation<string | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n // --- Outputs ---\n\n /** Output for read mode: list of members. */\n readResult: Annotation<{\n networkId: string;\n count: number;\n members: Array<{\n userId: string;\n name: string;\n avatar: string | null;\n permissions: string[];\n intentCount: number;\n joinedAt: Date;\n }>;\n } | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Output for create/delete modes. */\n mutationResult: Annotation<{\n success: boolean;\n message?: string;\n error?: string;\n } | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Error message if graph could not complete. */\n error: Annotation<string | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n});\n"]}
1
+ {"version":3,"file":"membership.state.js","sourceRoot":"/","sources":["network/membership/membership.state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAC,IAAI,CAAC;IACzD,uDAAuD;IAEvD,+DAA+D;IAC/D,MAAM,EAAE,CAAA,UAAkB,CAAA;IAE1B,iDAAiD;IACjD,SAAS,EAAE,CAAA,UAAkB,CAAA;IAE7B,sBAAsB;IACtB,aAAa,EAAE,UAAU,CAA+B;QACtD,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI;QACrC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAe;KAC/B,CAAC;IAEF,+BAA+B;IAE/B,uDAAuD;IACvD,YAAY,EAAE,UAAU,CAAqB;QAC3C,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACzB,CAAC;IAEF,kBAAkB;IAElB,6CAA6C;IAC7C,UAAU,EAAE,UAAU,CAWP;QACb,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACzB,CAAC;IAEF,sCAAsC;IACtC,cAAc,EAAE,UAAU,CAIX;QACb,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACzB,CAAC;IAEF,iDAAiD;IACjD,KAAK,EAAE,UAAU,CAAgB;QAC/B,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;KACpB,CAAC;CACH,CAAC,CAAC","sourcesContent":["import { Annotation } from \"@langchain/langgraph\";\n\n/**\n * Network Membership Graph State.\n * Handles CRUD operations for network memberships (index_members table).\n *\n * Flow:\n * START → routerNode → {addMemberNode | listMembersNode | removeMemberNode} → END\n */\nexport const NetworkMembershipGraphState = Annotation.Root({\n // --- Core Inputs (from ChatGraph via ToolContext) ---\n\n /** User performing the action (the actor). Always required. */\n userId: Annotation<string>,\n\n /** Target index. Required for all operations. */\n networkId: Annotation<string>,\n\n /** Operation mode. */\n operationMode: Annotation<'create' | 'read' | 'delete'>({\n reducer: (curr, next) => next ?? curr,\n default: () => 'read' as const,\n }),\n\n // --- Mode-Specific Inputs ---\n\n /** For create/delete: the user being added/removed. */\n targetUserId: Annotation<string | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n // --- Outputs ---\n\n /** Output for read mode: list of members. */\n readResult: Annotation<{\n networkId: string;\n count: number;\n members: Array<{\n userId: string;\n name: string;\n avatar: string | null;\n permissions: string[];\n intentCount: number;\n joinedAt: Date;\n }>;\n } | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Output for create/delete modes. */\n mutationResult: Annotation<{\n success: boolean;\n message?: string;\n error?: string;\n } | undefined>({\n reducer: (_, next) => next,\n default: () => undefined,\n }),\n\n /** Error message if graph could not complete. */\n error: Annotation<string | null>({\n reducer: (_, next) => next,\n default: () => null,\n }),\n});\n"]}
@@ -3,7 +3,7 @@ import { NetworkGraphDatabase } from "../shared/interfaces/database.interface.js
3
3
  * Factory class to build and compile the Index (CRUD) Graph.
4
4
  *
5
5
  * Handles create, read, update, and delete operations for indexes.
6
- * Membership and intent-index assignment operations are handled by
6
+ * Membership and intent-network assignment operations are handled by
7
7
  * separate graphs (NetworkMembershipGraph and IntentNetworkGraph).
8
8
  *
9
9
  * Flow:
@@ -1 +1 @@
1
- {"version":3,"file":"network.graph.d.ts","sourceRoot":"/","sources":["network/network.graph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAQlF;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,oBAAoB;IAE3C,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAmCuD,CAAC;yBACrD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADmD,CAAC;yBACrD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADmD,CAAC;yBACrD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADmD,CAAC;yBACrD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADmD,CAAC;yBACrD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADmD,CAAC;yBACrD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADmD,CAAC;yBACrD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADmD,CAAC;yBACrD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADmD,CAAC;yBACrD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqOvB"}
1
+ {"version":3,"file":"network.graph.d.ts","sourceRoot":"/","sources":["network/network.graph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAQlF;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,oBAAoB;IAE3C,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAmCyD,CAAC;yBACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADqD,CAAC;yBACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADqD,CAAC;yBACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADqD,CAAC;yBACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADqD,CAAC;yBACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADqD,CAAC;yBACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADqD,CAAC;yBACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADqD,CAAC;yBACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCADqD,CAAC;yBACvD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqOvB"}
@@ -7,7 +7,7 @@ const logger = protocolLogger("NetworkGraphFactory");
7
7
  * Factory class to build and compile the Index (CRUD) Graph.
8
8
  *
9
9
  * Handles create, read, update, and delete operations for indexes.
10
- * Membership and intent-index assignment operations are handled by
10
+ * Membership and intent-network assignment operations are handled by
11
11
  * separate graphs (NetworkMembershipGraph and IntentNetworkGraph).
12
12
  *
13
13
  * Flow:
@@ -20,11 +20,11 @@ export class NetworkGraphFactory {
20
20
  createGraph() {
21
21
  // --- NODE DEFINITIONS ---
22
22
  /**
23
- * Read Node: List indexes the user belongs to and owns.
23
+ * Read Node: List networks the user belongs to and owns.
24
24
  */
25
25
  const readNode = async (state) => {
26
26
  return timed("NetworkGraph.read", async () => {
27
- logger.verbose("Read indexes", { userId: state.userId, networkId: state.networkId, showAll: state.showAll });
27
+ logger.verbose("Read networks", { userId: state.userId, networkId: state.networkId, showAll: state.showAll });
28
28
  // Shared projections for both the scoped and unscoped read paths.
29
29
  const projectMembership = (m) => ({
30
30
  networkId: m.networkId,
@@ -48,12 +48,12 @@ export class NetworkGraphFactory {
48
48
  this.database.getOwnedIndexes(state.userId),
49
49
  this.database.getPublicIndexesNotJoined(state.userId),
50
50
  ]);
51
- // If index-scoped and not showAll, return just that index plus the
52
- // user's personal index (their contacts). The personal index is part
51
+ // If network-scoped and not showAll, return just that index plus the
52
+ // user's personal network (their contacts). The personal network is part
53
53
  // of every allowed-network reach calculation for network-bound agents,
54
54
  // and a user clicked into a community-scoped
55
55
  // chat still owns their contact list — so surfacing it here keeps
56
- // tools that operate on the personal index (add_contact, list_contacts,
56
+ // tools that operate on the personal network (add_contact, list_contacts,
57
57
  // import_*_contacts) discoverable. Other community memberships are
58
58
  // still hidden, and `publicNetworks` is omitted.
59
59
  const scopeToCurrentIndex = state.networkId && !state.showAll;
@@ -92,7 +92,7 @@ export class NetworkGraphFactory {
92
92
  stats: {
93
93
  memberOfCount: memberOf.length,
94
94
  ownsCount: owns.length,
95
- scopeNote: "Showing current index and your personal index. Use showAll: true for all indexes.",
95
+ scopeNote: "Showing current network and your personal network. Use showAll: true for all networks.",
96
96
  },
97
97
  },
98
98
  };
@@ -115,7 +115,7 @@ export class NetworkGraphFactory {
115
115
  };
116
116
  }
117
117
  catch (err) {
118
- logger.error("Read indexes failed", { error: err });
118
+ logger.error("Read networks failed", { error: err });
119
119
  return { error: "Failed to fetch network information." };
120
120
  }
121
121
  });
@@ -125,7 +125,7 @@ export class NetworkGraphFactory {
125
125
  */
126
126
  const createNode = async (state) => {
127
127
  return timed("NetworkGraph.create", async () => {
128
- logger.verbose("Create index", { userId: state.userId, createInput: state.createInput });
128
+ logger.verbose("Create network", { userId: state.userId, createInput: state.createInput });
129
129
  if (!state.createInput?.title?.trim()) {
130
130
  return { mutationResult: { success: false, error: "Title is required." } };
131
131
  }
@@ -157,7 +157,7 @@ export class NetworkGraphFactory {
157
157
  };
158
158
  }
159
159
  catch (err) {
160
- logger.error("Create index failed", { error: err });
160
+ logger.error("Create network failed", { error: err });
161
161
  if (createdIndexId) {
162
162
  try {
163
163
  await this.database.softDeleteNetwork(createdIndexId);
@@ -204,12 +204,12 @@ export class NetworkGraphFactory {
204
204
  });
205
205
  };
206
206
  /**
207
- * Delete Node: Soft-delete an index (owner only, sole member).
207
+ * Delete Node: Soft-delete a network (owner only, sole member).
208
208
  */
209
209
  const deleteNode = async (state) => {
210
210
  return timed("NetworkGraph.delete", async () => {
211
211
  const networkId = state.networkId;
212
- logger.verbose("Delete index", { userId: state.userId, networkId });
212
+ logger.verbose("Delete network", { userId: state.userId, networkId });
213
213
  if (!networkId) {
214
214
  return { mutationResult: { success: false, error: "networkId is required for delete." } };
215
215
  }
@@ -232,7 +232,7 @@ export class NetworkGraphFactory {
232
232
  };
233
233
  }
234
234
  catch (err) {
235
- logger.error("Delete index failed", { error: err });
235
+ logger.error("Delete network failed", { error: err });
236
236
  return { mutationResult: { success: false, error: "Failed to delete network." } };
237
237
  }
238
238
  });
@@ -1 +1 @@
1
- {"version":3,"file":"network.graph.js","sourceRoot":"/","sources":["network/network.graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,OAAO,mBAAmB;IAC9B,YAAoB,QAA8B;QAA9B,aAAQ,GAAR,QAAQ,CAAsB;IAAG,CAAC;IAE/C,WAAW;QAChB,2BAA2B;QAE3B;;WAEG;QACH,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YAC/D,OAAO,KAAK,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;gBAC3C,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAE7G,kEAAkE;gBAClE,MAAM,iBAAiB,GAAG,CAAC,CAA0E,EAAE,EAAE,CAAC,CAAC;oBACzG,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,KAAK,EAAE,CAAC,CAAC,YAAY;oBACrB,MAAM,EAAE,CAAC,CAAC,WAAW;oBACrB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,CAAC,CAAC;gBACH,MAAM,YAAY,GAAG,CAAC,CAAoE,EAAE,EAAE,CAAC,CAAC;oBAC9F,SAAS,EAAE,CAAC,CAAC,EAAE;oBACf,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,UAAU;iBACrC,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,mBAAmB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;wBAC5E,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;wBACjD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC;wBAC3C,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC;qBACtD,CAAC,CAAC;oBAEH,mEAAmE;oBACnE,qEAAqE;oBACrE,uEAAuE;oBACvE,6CAA6C;oBAC7C,kEAAkE;oBAClE,wEAAwE;oBACxE,mEAAmE;oBACnE,iDAAiD;oBACjD,MAAM,mBAAmB,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC9D,IAAI,mBAAmB,EAAE,CAAC;wBACxB,MAAM,SAAS,GAAG,KAAK,CAAC,SAAU,CAAC;wBACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;wBAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACd,OAAO;gCACL,UAAU,EAAE;oCACV,QAAQ,EAAE,EAAE;oCACZ,IAAI,EAAE,EAAE;oCACR,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,4CAA4C,EAAE;iCACnG;6BACF,CAAC;wBACJ,CAAC;wBACD,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;wBAC/E,MAAM,kBAAkB,GAAG,gBAAgB,EAAE,UAAU;4BACrD,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;wBAC7C,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;wBACjE,MAAM,aAAa,GAAG,kBAAkB;4BACtC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,kBAAkB,CAAC,SAAS,CAAC;4BACjE,CAAC,CAAC,SAAS,CAAC;wBACd,MAAM,QAAQ,GAAG;4BACf,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4BAClE,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;yBACvE,CAAC;wBACF,MAAM,IAAI,GAAG;4BACX,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4BACnD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;yBACxD,CAAC;wBACF,OAAO;4BACL,UAAU,EAAE;gCACV,QAAQ;gCACR,IAAI;gCACJ,KAAK,EAAE;oCACL,aAAa,EAAE,QAAQ,CAAC,MAAM;oCAC9B,SAAS,EAAE,IAAI,CAAC,MAAM;oCACtB,SAAS,EAAE,mFAAmF;iCAC/F;6BACF;yBACF,CAAC;oBACJ,CAAC;oBAED,4CAA4C;oBAC5C,MAAM,cAAc,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBAChE,SAAS,EAAE,GAAG,CAAC,EAAE;wBACjB,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,WAAW,EAAE,GAAG,CAAC,WAAW;wBAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;qBACjB,CAAC,CAAC,CAAC;oBAEJ,OAAO;wBACL,UAAU,EAAE;4BACV,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC;4BAC/C,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;4BACpC,cAAc;4BACd,KAAK,EAAE,EAAE,aAAa,EAAE,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,MAAM,EAAE;yBAC5H;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBACpD,OAAO,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;gBAC3D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,UAAU,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YACjE,OAAO,KAAK,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;gBAC7C,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;gBAEzF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;oBACtC,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,CAAC;gBAC7E,CAAC;gBAED,IAAI,cAAkC,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;wBAC9C,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE;wBACrC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS;wBACrD,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,IAAI,SAAS;wBACjD,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU;qBACzC,CAAC,CAAC;oBACH,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC;oBAE1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBACtF,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;wBACnB,MAAM,CAAC,KAAK,CAAC,yDAAyD,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;wBACjG,IAAI,CAAC;4BAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;wBACjE,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sDAAsD,EAAE,EAAE,CAAC;oBAC/G,CAAC;oBAED,OAAO;wBACL,cAAc,EAAE;4BACd,OAAO,EAAE,IAAI;4BACb,SAAS,EAAE,KAAK,CAAC,EAAE;4BACnB,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,OAAO,EAAE,YAAY,KAAK,CAAC,KAAK,+BAA+B;yBAChE;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBACpD,IAAI,cAAc,EAAE,CAAC;wBACnB,IAAI,CAAC;4BAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;oBACzE,CAAC;oBACD,OAAO;wBACL,cAAc,EAAE;4BACd,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B;yBACxE;qBACF,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,UAAU,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YACjE,OAAO,KAAK,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;gBAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;gBAClC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;gBAEpG,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,EAAE,CAAC;gBAC5F,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,CAAC;oBAChG,CAAC;oBAED,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;oBAE1F,OAAO;wBACL,cAAc,EAAE;4BACd,OAAO,EAAE,IAAI;4BACb,SAAS;4BACT,OAAO,EAAE,2BAA2B;yBACrC;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBACpD,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,CAAC;gBACpF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,UAAU,GAAG,KAAK,EAAE,KAAqC,EAAE,EAAE;YACjE,OAAO,KAAK,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;gBAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;gBAClC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAEpE,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,EAAE,CAAC;gBAC5F,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,CAAC;oBAChG,CAAC;oBAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;oBACnE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;wBACd,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iEAAiE,EAAE,EAAE,CAAC;oBAC1H,CAAC;oBAED,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;oBAEjD,OAAO;wBACL,cAAc,EAAE;4BACd,OAAO,EAAE,IAAI;4BACb,SAAS;4BACT,OAAO,EAAE,kBAAkB;yBAC5B;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBACpD,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,CAAC;gBACpF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,8BAA8B;QAE9B,MAAM,WAAW,GAAG,CAAC,KAAqC,EAAU,EAAE;YACpE,QAAQ,KAAK,CAAC,aAAa,EAAE,CAAC;gBAC5B,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;gBAC/B,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC;gBAC3B,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;gBAC/B,KAAK,QAAQ,CAAC,CAAC,OAAO,YAAY,CAAC;gBACnC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;YACzB,CAAC;QACH,CAAC,CAAC;QAEF,yBAAyB;QAEzB,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC;aAC/C,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC;aACzB,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;aAC7B,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;aAC7B,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC;aACjC,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE;YACvC,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,YAAY;SACzB,CAAC;aACD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAE9B,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;CACF","sourcesContent":["import { StateGraph, START, END } from \"@langchain/langgraph\";\n\nimport { NetworkGraphDatabase } from \"../shared/interfaces/database.interface.js\";\nimport { protocolLogger } from \"../shared/observability/protocol.logger.js\";\nimport { timed } from \"../shared/observability/performance.js\";\n\nimport { NetworkGraphState } from \"./network.state.js\";\n\nconst logger = protocolLogger(\"NetworkGraphFactory\");\n\n/**\n * Factory class to build and compile the Index (CRUD) Graph.\n *\n * Handles create, read, update, and delete operations for indexes.\n * Membership and intent-index assignment operations are handled by\n * separate graphs (NetworkMembershipGraph and IntentNetworkGraph).\n *\n * Flow:\n * START → routerNode → {createNode | readNode | updateNode | deleteNode} → END\n */\nexport class NetworkGraphFactory {\n constructor(private database: NetworkGraphDatabase) {}\n\n public createGraph() {\n // --- NODE DEFINITIONS ---\n\n /**\n * Read Node: List indexes the user belongs to and owns.\n */\n const readNode = async (state: typeof NetworkGraphState.State) => {\n return timed(\"NetworkGraph.read\", async () => {\n logger.verbose(\"Read indexes\", { userId: state.userId, networkId: state.networkId, showAll: state.showAll });\n\n // Shared projections for both the scoped and unscoped read paths.\n const projectMembership = (m: Awaited<ReturnType<typeof this.database.getNetworkMemberships>>[number]) => ({\n networkId: m.networkId,\n title: m.networkTitle,\n prompt: m.indexPrompt,\n autoAssign: m.autoAssign,\n isPersonal: m.isPersonal,\n joinedAt: m.joinedAt,\n });\n const projectOwned = (o: Awaited<ReturnType<typeof this.database.getOwnedIndexes>>[number]) => ({\n networkId: o.id,\n title: o.title,\n prompt: o.prompt,\n memberCount: o.memberCount,\n intentCount: o.intentCount,\n joinPolicy: o.permissions.joinPolicy,\n });\n\n try {\n const [allMemberships, ownedIndexes, publicIndexesResult] = await Promise.all([\n this.database.getNetworkMemberships(state.userId),\n this.database.getOwnedIndexes(state.userId),\n this.database.getPublicIndexesNotJoined(state.userId),\n ]);\n\n // If index-scoped and not showAll, return just that index plus the\n // user's personal index (their contacts). The personal index is part\n // of every allowed-network reach calculation for network-bound agents,\n // and a user clicked into a community-scoped\n // chat still owns their contact list — so surfacing it here keeps\n // tools that operate on the personal index (add_contact, list_contacts,\n // import_*_contacts) discoverable. Other community memberships are\n // still hidden, and `publicNetworks` is omitted.\n const scopeToCurrentIndex = state.networkId && !state.showAll;\n if (scopeToCurrentIndex) {\n const networkId = state.networkId!;\n const isMember = await this.database.isNetworkMember(networkId, state.userId);\n if (!isMember) {\n return {\n readResult: {\n memberOf: [],\n owns: [],\n stats: { memberOfCount: 0, ownsCount: 0, scopeNote: \"Network not found or you are not a member.\" },\n },\n };\n }\n const scopedMembership = allMemberships.find((m) => m.networkId === networkId);\n const personalMembership = scopedMembership?.isPersonal\n ? undefined\n : allMemberships.find((m) => m.isPersonal);\n const scopedOwned = ownedIndexes.find((o) => o.id === networkId);\n const personalOwned = personalMembership\n ? ownedIndexes.find((o) => o.id === personalMembership.networkId)\n : undefined;\n const memberOf = [\n ...(scopedMembership ? [projectMembership(scopedMembership)] : []),\n ...(personalMembership ? [projectMembership(personalMembership)] : []),\n ];\n const owns = [\n ...(scopedOwned ? [projectOwned(scopedOwned)] : []),\n ...(personalOwned ? [projectOwned(personalOwned)] : []),\n ];\n return {\n readResult: {\n memberOf,\n owns,\n stats: {\n memberOfCount: memberOf.length,\n ownsCount: owns.length,\n scopeNote: \"Showing current index and your personal index. Use showAll: true for all indexes.\",\n },\n },\n };\n }\n\n // Include public networks available to join\n const publicNetworks = publicIndexesResult.networks.map((idx) => ({\n networkId: idx.id,\n title: idx.title,\n prompt: idx.prompt,\n memberCount: idx.memberCount,\n owner: idx.owner,\n }));\n\n return {\n readResult: {\n memberOf: allMemberships.map(projectMembership),\n owns: ownedIndexes.map(projectOwned),\n publicNetworks,\n stats: { memberOfCount: allMemberships.length, ownsCount: ownedIndexes.length, publicNetworksCount: publicNetworks.length },\n },\n };\n } catch (err) {\n logger.error(\"Read indexes failed\", { error: err });\n return { error: \"Failed to fetch network information.\" };\n }\n });\n };\n\n /**\n * Create Node: Create a new index and add user as owner.\n */\n const createNode = async (state: typeof NetworkGraphState.State) => {\n return timed(\"NetworkGraph.create\", async () => {\n logger.verbose(\"Create index\", { userId: state.userId, createInput: state.createInput });\n\n if (!state.createInput?.title?.trim()) {\n return { mutationResult: { success: false, error: \"Title is required.\" } };\n }\n\n let createdIndexId: string | undefined;\n try {\n const index = await this.database.createNetwork({\n title: state.createInput.title.trim(),\n prompt: state.createInput.prompt?.trim() || undefined,\n imageUrl: state.createInput.imageUrl ?? undefined,\n joinPolicy: state.createInput.joinPolicy,\n });\n createdIndexId = index.id;\n\n const added = await this.database.addMemberToNetwork(index.id, state.userId, 'owner');\n if (!added.success) {\n logger.error(\"addMemberToNetwork failed; cleaning up orphaned network\", { networkId: index.id });\n try { await this.database.softDeleteNetwork(index.id); } catch {}\n return { mutationResult: { success: false, error: \"Failed to set you as owner. Network was not created.\" } };\n }\n\n return {\n mutationResult: {\n success: true,\n networkId: index.id,\n title: index.title,\n message: `Network \"${index.title}\" created. You are the owner.`,\n },\n };\n } catch (err) {\n logger.error(\"Create index failed\", { error: err });\n if (createdIndexId) {\n try { await this.database.softDeleteNetwork(createdIndexId); } catch {}\n }\n return {\n mutationResult: {\n success: false,\n error: err instanceof Error ? err.message : \"Failed to create network.\",\n },\n };\n }\n });\n };\n\n /**\n * Update Node: Update index settings (owner only).\n */\n const updateNode = async (state: typeof NetworkGraphState.State) => {\n return timed(\"NetworkGraph.update\", async () => {\n const networkId = state.networkId;\n logger.verbose(\"Update index\", { userId: state.userId, networkId, updateInput: state.updateInput });\n\n if (!networkId) {\n return { mutationResult: { success: false, error: \"networkId is required for update.\" } };\n }\n\n try {\n const isOwner = await this.database.isIndexOwner(networkId, state.userId);\n if (!isOwner) {\n return { mutationResult: { success: false, error: \"You can only modify networks you own.\" } };\n }\n\n await this.database.updateIndexSettings(networkId, state.userId, state.updateInput ?? {});\n\n return {\n mutationResult: {\n success: true,\n networkId,\n message: \"Network settings updated.\",\n },\n };\n } catch (err) {\n logger.error(\"Update index failed\", { error: err });\n return { mutationResult: { success: false, error: \"Failed to update network.\" } };\n }\n });\n };\n\n /**\n * Delete Node: Soft-delete an index (owner only, sole member).\n */\n const deleteNode = async (state: typeof NetworkGraphState.State) => {\n return timed(\"NetworkGraph.delete\", async () => {\n const networkId = state.networkId;\n logger.verbose(\"Delete index\", { userId: state.userId, networkId });\n\n if (!networkId) {\n return { mutationResult: { success: false, error: \"networkId is required for delete.\" } };\n }\n\n try {\n const isOwner = await this.database.isIndexOwner(networkId, state.userId);\n if (!isOwner) {\n return { mutationResult: { success: false, error: \"You can only delete networks you own.\" } };\n }\n\n const count = await this.database.getNetworkMemberCount(networkId);\n if (count > 1) {\n return { mutationResult: { success: false, error: \"Cannot delete network with other members. Remove members first.\" } };\n }\n\n await this.database.softDeleteNetwork(networkId);\n\n return {\n mutationResult: {\n success: true,\n networkId,\n message: \"Network deleted.\",\n },\n };\n } catch (err) {\n logger.error(\"Delete index failed\", { error: err });\n return { mutationResult: { success: false, error: \"Failed to delete network.\" } };\n }\n });\n };\n\n // --- CONDITIONAL ROUTING ---\n\n const routeByMode = (state: typeof NetworkGraphState.State): string => {\n switch (state.operationMode) {\n case 'create': return 'create';\n case 'read': return 'read';\n case 'update': return 'update';\n case 'delete': return 'delete_idx';\n default: return 'read';\n }\n };\n\n // --- GRAPH ASSEMBLY ---\n\n const workflow = new StateGraph(NetworkGraphState)\n .addNode(\"read\", readNode)\n .addNode(\"create\", createNode)\n .addNode(\"update\", updateNode)\n .addNode(\"delete_idx\", deleteNode)\n .addConditionalEdges(START, routeByMode, {\n read: \"read\",\n create: \"create\",\n update: \"update\",\n delete_idx: \"delete_idx\",\n })\n .addEdge(\"read\", END)\n .addEdge(\"create\", END)\n .addEdge(\"update\", END)\n .addEdge(\"delete_idx\", END);\n\n return workflow.compile();\n }\n}\n"]}
1
+ {"version":3,"file":"network.graph.js","sourceRoot":"/","sources":["network/network.graph.ts"],"names":[],"mappings":"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","sourcesContent":["import { StateGraph, START, END } from \"@langchain/langgraph\";\n\nimport { NetworkGraphDatabase } from \"../shared/interfaces/database.interface.js\";\nimport { protocolLogger } from \"../shared/observability/protocol.logger.js\";\nimport { timed } from \"../shared/observability/performance.js\";\n\nimport { NetworkGraphState } from \"./network.state.js\";\n\nconst logger = protocolLogger(\"NetworkGraphFactory\");\n\n/**\n * Factory class to build and compile the Index (CRUD) Graph.\n *\n * Handles create, read, update, and delete operations for indexes.\n * Membership and intent-network assignment operations are handled by\n * separate graphs (NetworkMembershipGraph and IntentNetworkGraph).\n *\n * Flow:\n * START → routerNode → {createNode | readNode | updateNode | deleteNode} → END\n */\nexport class NetworkGraphFactory {\n constructor(private database: NetworkGraphDatabase) {}\n\n public createGraph() {\n // --- NODE DEFINITIONS ---\n\n /**\n * Read Node: List networks the user belongs to and owns.\n */\n const readNode = async (state: typeof NetworkGraphState.State) => {\n return timed(\"NetworkGraph.read\", async () => {\n logger.verbose(\"Read networks\", { userId: state.userId, networkId: state.networkId, showAll: state.showAll });\n\n // Shared projections for both the scoped and unscoped read paths.\n const projectMembership = (m: Awaited<ReturnType<typeof this.database.getNetworkMemberships>>[number]) => ({\n networkId: m.networkId,\n title: m.networkTitle,\n prompt: m.indexPrompt,\n autoAssign: m.autoAssign,\n isPersonal: m.isPersonal,\n joinedAt: m.joinedAt,\n });\n const projectOwned = (o: Awaited<ReturnType<typeof this.database.getOwnedIndexes>>[number]) => ({\n networkId: o.id,\n title: o.title,\n prompt: o.prompt,\n memberCount: o.memberCount,\n intentCount: o.intentCount,\n joinPolicy: o.permissions.joinPolicy,\n });\n\n try {\n const [allMemberships, ownedIndexes, publicIndexesResult] = await Promise.all([\n this.database.getNetworkMemberships(state.userId),\n this.database.getOwnedIndexes(state.userId),\n this.database.getPublicIndexesNotJoined(state.userId),\n ]);\n\n // If network-scoped and not showAll, return just that index plus the\n // user's personal network (their contacts). The personal network is part\n // of every allowed-network reach calculation for network-bound agents,\n // and a user clicked into a community-scoped\n // chat still owns their contact list — so surfacing it here keeps\n // tools that operate on the personal network (add_contact, list_contacts,\n // import_*_contacts) discoverable. Other community memberships are\n // still hidden, and `publicNetworks` is omitted.\n const scopeToCurrentIndex = state.networkId && !state.showAll;\n if (scopeToCurrentIndex) {\n const networkId = state.networkId!;\n const isMember = await this.database.isNetworkMember(networkId, state.userId);\n if (!isMember) {\n return {\n readResult: {\n memberOf: [],\n owns: [],\n stats: { memberOfCount: 0, ownsCount: 0, scopeNote: \"Network not found or you are not a member.\" },\n },\n };\n }\n const scopedMembership = allMemberships.find((m) => m.networkId === networkId);\n const personalMembership = scopedMembership?.isPersonal\n ? undefined\n : allMemberships.find((m) => m.isPersonal);\n const scopedOwned = ownedIndexes.find((o) => o.id === networkId);\n const personalOwned = personalMembership\n ? ownedIndexes.find((o) => o.id === personalMembership.networkId)\n : undefined;\n const memberOf = [\n ...(scopedMembership ? [projectMembership(scopedMembership)] : []),\n ...(personalMembership ? [projectMembership(personalMembership)] : []),\n ];\n const owns = [\n ...(scopedOwned ? [projectOwned(scopedOwned)] : []),\n ...(personalOwned ? [projectOwned(personalOwned)] : []),\n ];\n return {\n readResult: {\n memberOf,\n owns,\n stats: {\n memberOfCount: memberOf.length,\n ownsCount: owns.length,\n scopeNote: \"Showing current network and your personal network. Use showAll: true for all networks.\",\n },\n },\n };\n }\n\n // Include public networks available to join\n const publicNetworks = publicIndexesResult.networks.map((idx) => ({\n networkId: idx.id,\n title: idx.title,\n prompt: idx.prompt,\n memberCount: idx.memberCount,\n owner: idx.owner,\n }));\n\n return {\n readResult: {\n memberOf: allMemberships.map(projectMembership),\n owns: ownedIndexes.map(projectOwned),\n publicNetworks,\n stats: { memberOfCount: allMemberships.length, ownsCount: ownedIndexes.length, publicNetworksCount: publicNetworks.length },\n },\n };\n } catch (err) {\n logger.error(\"Read networks failed\", { error: err });\n return { error: \"Failed to fetch network information.\" };\n }\n });\n };\n\n /**\n * Create Node: Create a new index and add user as owner.\n */\n const createNode = async (state: typeof NetworkGraphState.State) => {\n return timed(\"NetworkGraph.create\", async () => {\n logger.verbose(\"Create network\", { userId: state.userId, createInput: state.createInput });\n\n if (!state.createInput?.title?.trim()) {\n return { mutationResult: { success: false, error: \"Title is required.\" } };\n }\n\n let createdIndexId: string | undefined;\n try {\n const index = await this.database.createNetwork({\n title: state.createInput.title.trim(),\n prompt: state.createInput.prompt?.trim() || undefined,\n imageUrl: state.createInput.imageUrl ?? undefined,\n joinPolicy: state.createInput.joinPolicy,\n });\n createdIndexId = index.id;\n\n const added = await this.database.addMemberToNetwork(index.id, state.userId, 'owner');\n if (!added.success) {\n logger.error(\"addMemberToNetwork failed; cleaning up orphaned network\", { networkId: index.id });\n try { await this.database.softDeleteNetwork(index.id); } catch {}\n return { mutationResult: { success: false, error: \"Failed to set you as owner. Network was not created.\" } };\n }\n\n return {\n mutationResult: {\n success: true,\n networkId: index.id,\n title: index.title,\n message: `Network \"${index.title}\" created. You are the owner.`,\n },\n };\n } catch (err) {\n logger.error(\"Create network failed\", { error: err });\n if (createdIndexId) {\n try { await this.database.softDeleteNetwork(createdIndexId); } catch {}\n }\n return {\n mutationResult: {\n success: false,\n error: err instanceof Error ? err.message : \"Failed to create network.\",\n },\n };\n }\n });\n };\n\n /**\n * Update Node: Update index settings (owner only).\n */\n const updateNode = async (state: typeof NetworkGraphState.State) => {\n return timed(\"NetworkGraph.update\", async () => {\n const networkId = state.networkId;\n logger.verbose(\"Update index\", { userId: state.userId, networkId, updateInput: state.updateInput });\n\n if (!networkId) {\n return { mutationResult: { success: false, error: \"networkId is required for update.\" } };\n }\n\n try {\n const isOwner = await this.database.isIndexOwner(networkId, state.userId);\n if (!isOwner) {\n return { mutationResult: { success: false, error: \"You can only modify networks you own.\" } };\n }\n\n await this.database.updateIndexSettings(networkId, state.userId, state.updateInput ?? {});\n\n return {\n mutationResult: {\n success: true,\n networkId,\n message: \"Network settings updated.\",\n },\n };\n } catch (err) {\n logger.error(\"Update index failed\", { error: err });\n return { mutationResult: { success: false, error: \"Failed to update network.\" } };\n }\n });\n };\n\n /**\n * Delete Node: Soft-delete a network (owner only, sole member).\n */\n const deleteNode = async (state: typeof NetworkGraphState.State) => {\n return timed(\"NetworkGraph.delete\", async () => {\n const networkId = state.networkId;\n logger.verbose(\"Delete network\", { userId: state.userId, networkId });\n\n if (!networkId) {\n return { mutationResult: { success: false, error: \"networkId is required for delete.\" } };\n }\n\n try {\n const isOwner = await this.database.isIndexOwner(networkId, state.userId);\n if (!isOwner) {\n return { mutationResult: { success: false, error: \"You can only delete networks you own.\" } };\n }\n\n const count = await this.database.getNetworkMemberCount(networkId);\n if (count > 1) {\n return { mutationResult: { success: false, error: \"Cannot delete network with other members. Remove members first.\" } };\n }\n\n await this.database.softDeleteNetwork(networkId);\n\n return {\n mutationResult: {\n success: true,\n networkId,\n message: \"Network deleted.\",\n },\n };\n } catch (err) {\n logger.error(\"Delete network failed\", { error: err });\n return { mutationResult: { success: false, error: \"Failed to delete network.\" } };\n }\n });\n };\n\n // --- CONDITIONAL ROUTING ---\n\n const routeByMode = (state: typeof NetworkGraphState.State): string => {\n switch (state.operationMode) {\n case 'create': return 'create';\n case 'read': return 'read';\n case 'update': return 'update';\n case 'delete': return 'delete_idx';\n default: return 'read';\n }\n };\n\n // --- GRAPH ASSEMBLY ---\n\n const workflow = new StateGraph(NetworkGraphState)\n .addNode(\"read\", readNode)\n .addNode(\"create\", createNode)\n .addNode(\"update\", updateNode)\n .addNode(\"delete_idx\", deleteNode)\n .addConditionalEdges(START, routeByMode, {\n read: \"read\",\n create: \"create\",\n update: \"update\",\n delete_idx: \"delete_idx\",\n })\n .addEdge(\"read\", END)\n .addEdge(\"create\", END)\n .addEdge(\"update\", END)\n .addEdge(\"delete_idx\", END);\n\n return workflow.compile();\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Index Graph State.
2
+ * Network Graph State.
3
3
  * Handles CRUD operations for indexes (communities).
4
4
  *
5
5
  * Flow:
@@ -12,7 +12,7 @@ export declare const NetworkGraphState: import("@langchain/langgraph").Annotatio
12
12
  (): import("@langchain/langgraph").LastValue<string>;
13
13
  Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
14
14
  };
15
- /** Target index ID. Required for read/update/delete. From ChatGraph or tool arg. */
15
+ /** Target network ID. Required for read/update/delete. From ChatGraph or tool arg. */
16
16
  networkId: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
17
17
  /** Operation mode. */
18
18
  operationMode: import("@langchain/langgraph").BaseChannel<"update" | "create" | "delete" | "read", "update" | "create" | "delete" | "read" | import("@langchain/langgraph").OverwriteValue<"update" | "create" | "delete" | "read">, unknown>;
@@ -53,7 +53,7 @@ export declare const NetworkGraphState: import("@langchain/langgraph").Annotatio
53
53
  joinPolicy?: "anyone" | "invite_only";
54
54
  allowGuestVibeCheck?: boolean;
55
55
  } | undefined> | undefined, unknown>;
56
- /** When true and index-scoped, read returns all user indexes (not just scoped one). */
56
+ /** When true and network-scoped, read returns all user indexes (not just scoped one). */
57
57
  showAll: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
58
58
  /** Output for read mode. */
59
59
  readResult: import("@langchain/langgraph").BaseChannel<{
@@ -1 +1 @@
1
- {"version":3,"file":"network.state.d.ts","sourceRoot":"/","sources":["network/network.state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"network.state.d.ts","sourceRoot":"/","sources":["network/network.state.ts"],"names":[],"mappings":"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"}