@indexnetwork/protocol 4.3.3-rc.308.1 → 4.3.4-rc.309.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 (69) hide show
  1. package/dist/chat/chat.agent.d.ts.map +1 -1
  2. package/dist/chat/chat.agent.js +11 -1
  3. package/dist/chat/chat.agent.js.map +1 -1
  4. package/dist/chat/chat.graph.d.ts +16 -0
  5. package/dist/chat/chat.graph.d.ts.map +1 -1
  6. package/dist/chat/chat.graph.js +5 -2
  7. package/dist/chat/chat.graph.js.map +1 -1
  8. package/dist/chat/chat.prompt.d.ts.map +1 -1
  9. package/dist/chat/chat.prompt.js +19 -12
  10. package/dist/chat/chat.prompt.js.map +1 -1
  11. package/dist/chat/chat.state.d.ts +6 -3
  12. package/dist/chat/chat.state.d.ts.map +1 -1
  13. package/dist/chat/chat.state.js +12 -3
  14. package/dist/chat/chat.state.js.map +1 -1
  15. package/dist/chat/chat.streamer.d.ts +5 -0
  16. package/dist/chat/chat.streamer.d.ts.map +1 -1
  17. package/dist/chat/chat.streamer.js +13 -4
  18. package/dist/chat/chat.streamer.js.map +1 -1
  19. package/dist/enrichment/enrichment.tools.d.ts.map +1 -1
  20. package/dist/enrichment/enrichment.tools.js +16 -19
  21. package/dist/enrichment/enrichment.tools.js.map +1 -1
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/intent/intent.graph.d.ts.map +1 -1
  27. package/dist/intent/intent.state.d.ts +1 -1
  28. package/dist/intent/intent.state.js +1 -1
  29. package/dist/intent/intent.state.js.map +1 -1
  30. package/dist/intent/intent.tools.d.ts.map +1 -1
  31. package/dist/intent/intent.tools.js +60 -43
  32. package/dist/intent/intent.tools.js.map +1 -1
  33. package/dist/mcp/mcp.server.d.ts +3 -5
  34. package/dist/mcp/mcp.server.d.ts.map +1 -1
  35. package/dist/mcp/mcp.server.js +7 -16
  36. package/dist/mcp/mcp.server.js.map +1 -1
  37. package/dist/negotiation/negotiation.tools.d.ts.map +1 -1
  38. package/dist/negotiation/negotiation.tools.js +11 -7
  39. package/dist/negotiation/negotiation.tools.js.map +1 -1
  40. package/dist/network/network.tools.d.ts.map +1 -1
  41. package/dist/network/network.tools.js +50 -38
  42. package/dist/network/network.tools.js.map +1 -1
  43. package/dist/opportunity/opportunity.graph.js +1 -1
  44. package/dist/opportunity/opportunity.graph.js.map +1 -1
  45. package/dist/opportunity/opportunity.tools.d.ts.map +1 -1
  46. package/dist/opportunity/opportunity.tools.js +25 -29
  47. package/dist/opportunity/opportunity.tools.js.map +1 -1
  48. package/dist/questioner/questioner.tools.d.ts +1 -1
  49. package/dist/questioner/questioner.tools.d.ts.map +1 -1
  50. package/dist/questioner/questioner.tools.js +4 -5
  51. package/dist/questioner/questioner.tools.js.map +1 -1
  52. package/dist/shared/agent/tool.factory.d.ts.map +1 -1
  53. package/dist/shared/agent/tool.factory.js +9 -10
  54. package/dist/shared/agent/tool.factory.js.map +1 -1
  55. package/dist/shared/agent/tool.registry.js +1 -1
  56. package/dist/shared/agent/tool.registry.js.map +1 -1
  57. package/dist/shared/agent/tool.scope.d.ts +12 -0
  58. package/dist/shared/agent/tool.scope.d.ts.map +1 -1
  59. package/dist/shared/agent/tool.scope.js +14 -0
  60. package/dist/shared/agent/tool.scope.js.map +1 -1
  61. package/dist/shared/interfaces/auth.interface.d.ts +3 -3
  62. package/dist/shared/interfaces/auth.interface.js.map +1 -1
  63. package/dist/shared/interfaces/discovery-run.interface.d.ts +1 -1
  64. package/dist/shared/interfaces/discovery-run.interface.d.ts.map +1 -1
  65. package/dist/shared/interfaces/discovery-run.interface.js.map +1 -1
  66. package/dist/shared/interfaces/enrichment-run.interface.d.ts +1 -1
  67. package/dist/shared/interfaces/enrichment-run.interface.d.ts.map +1 -1
  68. package/dist/shared/interfaces/enrichment-run.interface.js.map +1 -1
  69. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"negotiation.tools.js","sourceRoot":"/","sources":["negotiation/negotiation.tools.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\n\nimport type { DefineTool, ToolDeps } from '../shared/agent/tool.helpers.js';\nimport { success, error } from '../shared/agent/tool.helpers.js';\nimport { IndexNegotiator } from './negotiation.agent.js';\nimport type { NegotiationTurn, UserNegotiationContext, SeedAssessment, NegotiationOutcome } from './negotiation.state.js';\nimport type { NegotiationTurnPayload } from '../shared/interfaces/agent-dispatcher.interface.js';\nimport { protocolLogger } from '../shared/observability/protocol.logger.js';\n\nconst logger = protocolLogger('NegotiationTools');\n\n/**\n * Default park-window budget for ambient (background) negotiations. When a personal\n * agent is fresh, the dispatcher parks the turn and this is how long we wait before\n * the system agent takes over as a fallback.\n *\n * Short enough that ambient opportunities materialize in minutes (not hours),\n * long enough to cover two full polling cycles (30s * 2 = 60s) plus an agent\n * subagent turn. 5 minutes gives generous headroom.\n */\nexport const AMBIENT_PARK_WINDOW_MS = 5 * 60 * 1000;\n\n/**\n * Pulls the negotiation's network from task metadata. Tasks created after the\n * scope hardening carry `metadata.networkId` directly; older tasks only have\n * the network embedded in the parked `turnContext.indexContext.networkId`.\n * Returns `null` for legacy tasks where neither field is present — callers\n * scoped by `context.networkId` must reject these defensively rather than\n * fall through to a global view.\n */\nfunction readTaskNetworkId(meta: {\n networkId?: string;\n turnContext?: { indexContext?: { networkId?: string } };\n} | null): string | null {\n if (!meta) return null;\n if (typeof meta.networkId === 'string' && meta.networkId.trim()) return meta.networkId;\n const fromTurnContext = meta.turnContext?.indexContext?.networkId;\n if (typeof fromTurnContext === 'string' && fromTurnContext.trim()) return fromTurnContext;\n return null;\n}\n\nconst SCOPE_DENIAL = 'Access denied: this negotiation is not in your bound network scope.';\n\n/** Extracts the ordered NegotiationTurn list from A2A message data parts. */\nfunction turnsFromMessages(messages: Array<{ parts: unknown[] }>): NegotiationTurn[] {\n return messages\n .map((m) => {\n const dp = (m.parts as Array<{ kind?: string; data?: unknown }>)?.find((p) => p.kind === 'data');\n return dp?.data as NegotiationTurn;\n })\n .filter(Boolean);\n}\n\n/**\n * Creates negotiation MCP tools for external agent access.\n * Exposes negotiation state for listing, reading, and responding to bilateral negotiations.\n */\nexport function createNegotiationTools(defineTool: DefineTool, deps: ToolDeps) {\n const { negotiationDatabase } = deps;\n\n const list_negotiations = defineTool({\n name: 'list_negotiations',\n description:\n 'List bilateral negotiations the authenticated user is involved in, either as the source (initiator) or candidate (responder). ' +\n 'Negotiations are turn-based exchanges where two AI agents negotiate on behalf of their users to determine if there is a ' +\n 'mutual opportunity for collaboration.\\n\\n' +\n '**Statuses:**\\n' +\n '- `active` — Negotiation is in progress, agents are exchanging turns.\\n' +\n '- `waiting_for_agent` — The graph has yielded and is waiting for an agent response (e.g. from the user via respond_to_negotiation) or a timeout.\\n' +\n '- `completed` — Negotiation has concluded (accepted, rejected, or reached turn cap).\\n\\n' +\n '**When to use:** To see ongoing and past negotiations, check which negotiations need attention, ' +\n 'or find a negotiation ID for get_negotiation or respond_to_negotiation.',\n querySchema: z.object({\n status: z.enum(['active', 'waiting_for_agent', 'completed', 'all']).optional()\n .describe('Filter by negotiation status. Omit or use \"all\" to return all negotiations.'),\n since: z.string().datetime().optional()\n .describe('ISO 8601 date-time. Only return negotiations created at or after this timestamp.'),\n limit: z.number().int().min(1).max(100).optional()\n .describe('Maximum negotiations to return per page (1-100). Omit to return all.'),\n page: z.number().int().min(1).optional()\n .describe('Page number (1-based). Only used when limit is provided. Defaults to 1.'),\n detail: z.enum(['summary', 'narrative']).optional()\n .describe(\n 'Response detail level. Omit or use \"summary\" for the default fields. ' +\n 'Use \"narrative\" to receive additional context per negotiation suitable for ' +\n 'composing a digest or field report: indexContext (the community/network prompt ' +\n 'that seeded the negotiation), recentTurns (last 3 turns with action + message), ' +\n 'and outcome (for completed negotiations). These fields are populated from data ' +\n 'already loaded for the listing, so the extra cost is minimal.',\n ),\n }),\n handler: async ({ context, query }) => {\n try {\n // Map tool status filter to task state query\n const stateFilter = query.status && query.status !== 'all' ? query.status : undefined;\n // For 'active', query 'working' state tasks\n const dbState = stateFilter === 'active' ? 'working'\n : stateFilter === 'waiting_for_agent' ? 'waiting_for_agent'\n : stateFilter === 'completed' ? 'completed'\n : undefined;\n\n const tasks = await negotiationDatabase.getTasksForUser(context.userId, dbState ? { state: dbState } : undefined);\n\n const negotiations = await Promise.all(tasks.map(async (task) => {\n const meta = task.metadata as {\n sourceUserId?: string;\n candidateUserId?: string;\n type?: string;\n maxTurns?: number;\n networkId?: string;\n turnContext?: { indexContext?: { networkId?: string; prompt?: string } };\n isContinuation?: boolean;\n priorTurnCount?: number;\n } | null;\n if (meta?.type !== 'negotiation') return null;\n\n // Network-scope filter: when caller's API key carries a network-bound\n // agent, drop tasks whose network differs (or whose network we cannot\n // determine — defense in depth for legacy tasks).\n if (context.networkId) {\n const taskNetworkId = readTaskNetworkId(meta);\n if (taskNetworkId !== context.networkId) return null;\n }\n\n const isSource = meta.sourceUserId === context.userId;\n const counterpartyId = isSource ? meta.candidateUserId : meta.sourceUserId;\n\n // Get messages for preview (and turns when narrative detail requested)\n const messages = await negotiationDatabase.getMessagesForConversation(task.conversationId);\n const lastMessage = messages[messages.length - 1];\n const lastTurnData = lastMessage\n ? ((lastMessage.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data')?.data as { action?: string; assessment?: { reasoning?: string }; message?: string | null } | undefined)\n : undefined;\n\n // Determine whose turn it is based on message count (alternating source/candidate)\n const turnCount = messages.length;\n const currentSpeaker = turnCount % 2 === 0 ? 'source' : 'candidate';\n\n // Map task state to tool status\n const status = task.state === 'working' ? 'active'\n : task.state === 'waiting_for_agent' ? 'waiting_for_agent'\n : task.state === 'completed' ? 'completed'\n : task.state;\n\n const isUsersTurn = status !== 'completed' &&\n ((isSource && currentSpeaker === 'source') || (!isSource && currentSpeaker === 'candidate'));\n\n const base = {\n id: task.id,\n counterpartyId: counterpartyId ?? 'unknown',\n role: isSource ? 'source' : 'candidate',\n turnCount,\n status,\n isUsersTurn,\n isContinuation: meta.isContinuation ?? false,\n priorTurnCount: meta.priorTurnCount ?? 0,\n latestAction: lastTurnData?.action ?? null,\n latestMessagePreview: lastTurnData?.message ?? null,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n };\n\n if (query.detail !== 'narrative') return base;\n\n // ── Narrative extras (messages already loaded — no extra DB cost) ──\n\n const RECENT_TURNS_LIMIT = 3;\n const recentMessages = messages.slice(-RECENT_TURNS_LIMIT);\n const recentTurns = recentMessages.map((m, sliceIdx) => {\n const absoluteIdx = messages.length - recentMessages.length + sliceIdx;\n const speaker = absoluteIdx % 2 === 0 ? 'source' : 'candidate';\n const td = ((m.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data')?.data as { action?: string; message?: string | null } | undefined);\n return {\n turnNumber: absoluteIdx + 1,\n speaker,\n role: speaker === (isSource ? 'source' : 'candidate') ? 'own' : 'other',\n action: td?.action ?? 'unknown',\n message: td?.message ?? null,\n };\n });\n\n const indexContext = meta.turnContext?.indexContext ?? null;\n\n // Outcome artifact — only meaningful for completed negotiations\n let outcome: unknown = null;\n if (status === 'completed') {\n const artifacts = await negotiationDatabase.getArtifactsForTask(task.id);\n const outcomeArtifact = artifacts.find(a => a.name === 'negotiation-outcome');\n outcome = outcomeArtifact\n ? ((outcomeArtifact.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data')?.data ?? null)\n : null;\n }\n\n return { ...base, indexContext, recentTurns, outcome };\n }));\n\n let filtered = negotiations.filter(Boolean);\n\n if (query.since) {\n const sinceMs = new Date(query.since).getTime();\n filtered = filtered.filter(n => new Date(n!.createdAt).getTime() >= sinceMs);\n }\n\n const shouldPaginate = query.limit !== undefined;\n if (shouldPaginate) {\n const limit = query.limit!;\n const page = query.page ?? 1;\n const offset = (page - 1) * limit;\n const paged = filtered.slice(offset, offset + limit);\n return success({\n count: paged.length,\n totalCount: filtered.length,\n limit,\n page,\n totalPages: Math.ceil(filtered.length / limit),\n negotiations: paged,\n });\n }\n\n return success({\n count: filtered.length,\n negotiations: filtered,\n });\n } catch (err) {\n logger.error('Failed to list negotiations', { err });\n return error('Failed to list negotiations. Please try again.');\n }\n },\n });\n\n const get_negotiation = defineTool({\n name: 'get_negotiation',\n description:\n 'Get the full details of a specific negotiation, including all turns, messages, counterparty info, and current state. ' +\n 'Negotiations are bilateral exchanges where two AI agents negotiate on behalf of users. Each turn contains an action ' +\n '(propose, accept, reject, counter, question), an assessment with reasoning and suggested roles, and an optional message.\\n\\n' +\n '**Access control:** You must be a party to the negotiation (source or candidate) to view it.\\n\\n' +\n '**Statuses:** `active` — in progress. `waiting_for_agent` — waiting for an agent response or timeout. `completed` — concluded.\\n\\n' +\n '**When to use:** To review the full negotiation history before responding, to understand why a negotiation was ' +\n 'accepted or rejected, or to see the current state of an active negotiation.\\n\\n' +\n '**Negotiation-turn-mode usage.** If you are running as a silent background subagent (dispatched by the ' +\n \"openclaw runtime's poller in response to a claimed negotiation turn), call this tool FIRST with the \" +\n 'negotiationId from your task prompt. This returns the current state, both parties\\' context, and the ' +\n 'history of turns so far. Ground your response in the caller\\'s profile (read_user_contexts) and intents ' +\n '(read_intents) before deciding on a turn action. Do not produce user-facing output in this mode.',\n querySchema: z.object({\n negotiationId: z.string().describe('The negotiation task ID (from list_negotiations results).'),\n }),\n handler: async ({ context, query }) => {\n try {\n const task = await negotiationDatabase.getTask(query.negotiationId);\n if (!task) {\n return error('Negotiation not found.');\n }\n\n const meta = task.metadata as {\n sourceUserId?: string;\n candidateUserId?: string;\n type?: string;\n maxTurns?: number;\n opportunityId?: string;\n networkId?: string;\n isContinuation?: boolean;\n priorTurnCount?: number;\n turnContext?: {\n sourceUser: UserNegotiationContext;\n candidateUser: UserNegotiationContext;\n indexContext: { networkId: string; prompt?: string };\n seedAssessment: SeedAssessment;\n discoveryQuery?: string;\n };\n } | null;\n if (meta?.type !== 'negotiation') {\n return error('Negotiation not found.');\n }\n\n // Network-scope check: a network-bound agent must not read negotiations\n // outside its bound network. Run before the participant check so we\n // don't leak existence-vs-membership signal across scopes.\n if (context.networkId) {\n const taskNetworkId = readTaskNetworkId(meta);\n if (taskNetworkId !== context.networkId) {\n return error(SCOPE_DENIAL);\n }\n }\n\n // Access control: user must be source or candidate\n const isSource = meta.sourceUserId === context.userId;\n const isCandidate = meta.candidateUserId === context.userId;\n if (!isSource && !isCandidate) {\n return error('Access denied: you are not a party to this negotiation.');\n }\n\n const counterpartyId = isSource ? meta.candidateUserId : meta.sourceUserId;\n\n // Project absolute turn context (source/candidate) into own/other\n // perspective for the caller. Mirrors what the in-process system\n // agent receives as NegotiationAgentInput — identical context means\n // identical deliberation on both paths.\n let negotiationContext: {\n ownUser: UserNegotiationContext;\n otherUser: UserNegotiationContext;\n indexContext: { networkId: string; prompt?: string };\n seedAssessment: SeedAssessment;\n isDiscoverer: boolean;\n discoveryQuery?: string;\n } | null = null;\n if (meta.turnContext) {\n const tc = meta.turnContext;\n negotiationContext = {\n ownUser: isSource ? tc.sourceUser : tc.candidateUser,\n otherUser: isSource ? tc.candidateUser : tc.sourceUser,\n indexContext: tc.indexContext,\n seedAssessment: tc.seedAssessment,\n isDiscoverer: isSource,\n ...(tc.discoveryQuery && { discoveryQuery: tc.discoveryQuery }),\n };\n }\n\n // Load messages and artifacts\n const [messages, artifacts] = await Promise.all([\n negotiationDatabase.getMessagesForConversation(task.conversationId),\n negotiationDatabase.getArtifactsForTask(task.id),\n ]);\n\n // Parse turns from messages\n const turns = messages.map((m, idx) => {\n const dataPart = (m.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data');\n const turnData = dataPart?.data as {\n action?: string;\n assessment?: { reasoning?: string; suggestedRoles?: unknown };\n message?: string;\n } | undefined;\n\n const turnNumber = idx + 1;\n const speaker = turnNumber % 2 === 1 ? 'source' : 'candidate';\n\n return {\n turnNumber,\n speaker,\n senderId: m.senderId,\n action: turnData?.action ?? 'unknown',\n reasoning: turnData?.assessment?.reasoning ?? null,\n suggestedRoles: turnData?.assessment?.suggestedRoles ?? null,\n message: turnData?.message ?? null,\n createdAt: m.createdAt,\n };\n });\n\n // Extract outcome from artifacts if completed\n const outcomeArtifact = artifacts.find(a => a.name === 'negotiation-outcome');\n const outcome = outcomeArtifact\n ? (outcomeArtifact.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data')?.data\n : null;\n\n // Determine whose turn it is\n const turnCount = messages.length;\n const currentSpeaker = turnCount % 2 === 0 ? 'source' : 'candidate';\n\n const status = task.state === 'working' ? 'active'\n : task.state === 'waiting_for_agent' ? 'waiting_for_agent'\n : task.state === 'completed' ? 'completed'\n : task.state;\n\n const isUsersTurn = status !== 'completed' &&\n ((isSource && currentSpeaker === 'source') || (!isSource && currentSpeaker === 'candidate'));\n\n const isContinuation = meta.isContinuation ?? false;\n const priorTurnCount = meta.priorTurnCount ?? 0;\n\n return success({\n id: task.id,\n conversationId: task.conversationId,\n status,\n role: isSource ? 'source' : 'candidate',\n counterpartyId: counterpartyId ?? 'unknown',\n turnCount,\n isUsersTurn,\n isContinuation,\n priorTurnCount,\n turnsAdded: turnCount - priorTurnCount,\n turns,\n outcome,\n context: negotiationContext,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n });\n } catch (err) {\n logger.error('Failed to get negotiation', { err });\n return error('Failed to get negotiation. Please try again.');\n }\n },\n });\n\n const respond_to_negotiation = defineTool({\n name: 'respond_to_negotiation',\n description:\n 'Respond to a negotiation that is waiting for agent input. This tool allows users to influence the negotiation ' +\n 'by accepting, rejecting, countering, or asking a clarifying question.\\n\\n' +\n '**Turn-based model:** Negotiations alternate between source and candidate agents. When the graph yields with ' +\n '`waiting_for_agent` status, the user whose turn it is can respond.\\n\\n' +\n '**Valid actions:**\\n' +\n '- `accept` — Accept the current proposal. The negotiation will be finalized as an opportunity.\\n' +\n '- `reject` — Reject the current proposal. The negotiation will end without creating an opportunity.\\n' +\n '- `counter` — Counter the proposal with a message (message is required). The negotiation will continue.\\n' +\n '- `question` — Ask the counterparty a clarifying question (message is required). The negotiation will continue.\\n\\n' +\n '**What happens after:** Accept/reject finalizes the negotiation immediately. Counter/question continues the negotiation — ' +\n 'if the counterparty has an agent, the negotiation yields again; otherwise the AI agent responds inline.\\n\\n' +\n '**Silent-subagent response contract.** In negotiation-turn mode, submit exactly ONE call to this tool ' +\n 'per dispatch with the action (propose | counter | accept | reject | question) and the assessment ' +\n '(reasoning + suggestedRoles). If the decision is ambiguous, pick the most conservative action — usually ' +\n '`counter` with specific objections, or `reject` with clear reasoning. On the first turn of a negotiation ' +\n '(turnCount === 0) the action MUST be `propose`. Do not ask the user clarifying questions; you are ' +\n 'authorized to act on their behalf within the scope granted to your agent.',\n querySchema: z.object({\n negotiationId: z.string().describe('The negotiation task ID to respond to.'),\n action: z.enum(['propose', 'accept', 'reject', 'counter', 'question']).describe('The response action. On the first turn (turnCount === 0) this MUST be \"propose\".'),\n reasoning: z.string().describe('Why you are taking this action — your assessment of the opportunity.'),\n suggestedRoles: z.object({\n ownUser: z.enum(['agent', 'patient', 'peer']).describe('Suggested role for your user in this opportunity.'),\n otherUser: z.enum(['agent', 'patient', 'peer']).describe('Suggested role for the other user in this opportunity.'),\n }).describe('Role suggestions for both parties.'),\n message: z.string().optional().describe('Required for \"counter\" and \"question\" actions. Your message explaining what you want to change or clarify.'),\n }),\n handler: async ({ context, query }) => {\n try {\n const task = await negotiationDatabase.getTask(query.negotiationId);\n if (!task) {\n return error('Negotiation not found.');\n }\n\n const meta = task.metadata as {\n sourceUserId?: string;\n candidateUserId?: string;\n type?: string;\n maxTurns?: number;\n networkId?: string;\n turnContext?: { indexContext?: { networkId?: string } };\n } | null;\n if (meta?.type !== 'negotiation') {\n return error('Negotiation not found.');\n }\n\n // Network-scope check (mirrors get_negotiation): a network-bound agent\n // must not act on negotiations outside its bound network.\n if (context.networkId) {\n const taskNetworkId = readTaskNetworkId(meta);\n if (taskNetworkId !== context.networkId) {\n return error(SCOPE_DENIAL);\n }\n }\n\n // Validate negotiation is waiting for agent input (or claimed via polling)\n if (task.state !== 'waiting_for_agent' && task.state !== 'claimed') {\n return error(`Negotiation is not waiting for a response. Current status: ${task.state}`);\n }\n\n // Access control: user must be a party\n const isSource = meta.sourceUserId === context.userId;\n const isCandidate = meta.candidateUserId === context.userId;\n if (!isSource && !isCandidate) {\n return error('Access denied: you are not a party to this negotiation.');\n }\n\n // Determine whose turn it is\n const messages = await negotiationDatabase.getMessagesForConversation(task.conversationId);\n const turnCount = messages.length;\n const currentSpeaker = turnCount % 2 === 0 ? 'source' : 'candidate';\n const isUsersTurn = (isSource && currentSpeaker === 'source') || (!isSource && currentSpeaker === 'candidate');\n\n if (!isUsersTurn) {\n return error('It is not your turn to respond in this negotiation.');\n }\n\n // Validate counter/question has a message\n if ((query.action === 'counter' || query.action === 'question') && !query.message?.trim()) {\n return error(`A message is required when using \"${query.action}\". Explain what you want to change or clarify.`);\n }\n\n // ── Cancel pending timeout ──\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.cancelTimeout(task.id);\n }\n\n // ── Build and persist the external agent's turn ──\n const turnData: NegotiationTurn = {\n action: query.action,\n assessment: {\n reasoning: query.reasoning,\n suggestedRoles: query.suggestedRoles,\n },\n ...(query.message ? { message: query.message } : {}),\n };\n\n const senderId = `agent:${context.userId}`;\n const turnMessage = await negotiationDatabase.createMessage({\n conversationId: task.conversationId,\n senderId,\n role: 'agent',\n parts: [{ kind: 'data' as const, data: turnData }],\n taskId: task.id,\n });\n\n const newTurnCount = turnCount + 1;\n\n // ── Handle accept/reject: finalize immediately ──\n if (query.action === 'accept' || query.action === 'reject') {\n const allMessages = [...messages, { id: turnMessage.id, senderId: turnMessage.senderId, role: turnMessage.role, parts: turnMessage.parts as unknown[], createdAt: turnMessage.createdAt }];\n const history: NegotiationTurn[] = turnsFromMessages(allMessages);\n\n const nextSpeaker = currentSpeaker === 'source' ? 'candidate' : 'source';\n const outcome = buildNegotiationOutcome(history, newTurnCount, query.action, meta.sourceUserId!, meta.candidateUserId!, nextSpeaker);\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: outcome.hasOpportunity, turnCount: newTurnCount },\n });\n\n return success({\n message: query.action === 'accept'\n ? 'Negotiation accepted. An opportunity has been created.'\n : 'Negotiation rejected.',\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n outcome,\n });\n }\n\n // ── Handle counter/question: check if under max turns ──\n const maxTurns = meta.maxTurns ?? 6; // Read from task metadata; fallback to system default\n if (newTurnCount >= maxTurns) {\n // Max turns reached — finalize with turn_cap\n const allMessages = [...messages, { id: turnMessage.id, senderId: turnMessage.senderId, role: turnMessage.role, parts: turnMessage.parts as unknown[], createdAt: turnMessage.createdAt }];\n const history: NegotiationTurn[] = turnsFromMessages(allMessages);\n\n const nextSpeakerForCap = currentSpeaker === 'source' ? 'candidate' : 'source';\n const outcome = buildNegotiationOutcome(history, newTurnCount, 'counter', meta.sourceUserId!, meta.candidateUserId!, nextSpeakerForCap);\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: false, turnCount: newTurnCount },\n });\n\n return success({\n message: 'Maximum turns reached. Negotiation finalized without opportunity.',\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n outcome,\n });\n }\n\n // ── Counter/question under max turns: dispatch to counterparty's agent ──\n const counterpartyUserId = isSource ? meta.candidateUserId! : meta.sourceUserId!;\n const counterpartySpeaker = isSource ? 'candidate' : 'source';\n\n // Build the current turn history for dispatcher payload\n const allMessagesWithTurn = [...messages, { id: turnMessage.id, senderId: turnMessage.senderId, role: turnMessage.role, parts: turnMessage.parts as unknown[], createdAt: turnMessage.createdAt }];\n const historyForDispatch: NegotiationTurn[] = turnsFromMessages(allMessagesWithTurn);\n\n const isFinalTurn = newTurnCount + 1 >= maxTurns;\n\n const ownUserCtx: UserNegotiationContext = { id: counterpartyUserId, intents: [], profile: {} };\n const otherUserCtx: UserNegotiationContext = { id: context.userId, intents: [], profile: {} };\n const seedAssessment: SeedAssessment = { reasoning: 'Continued negotiation', valencyRole: 'peer' };\n\n const dispatchPayload: NegotiationTurnPayload = {\n negotiationId: task.id,\n ownUser: ownUserCtx,\n otherUser: otherUserCtx,\n indexContext: { networkId: '' },\n seedAssessment,\n history: historyForDispatch,\n isFinalTurn,\n isDiscoverer: false,\n };\n\n const scope = { action: 'negotiation.respond', scopeType: 'negotiation', scopeId: task.id };\n const timeoutMs = AMBIENT_PARK_WINDOW_MS;\n\n const dispatchResult = await deps.agentDispatcher?.dispatch(counterpartyUserId, scope, dispatchPayload, { timeoutMs });\n\n if (dispatchResult?.handled === false && dispatchResult.reason === 'waiting') {\n // Counterparty's agent acknowledged — yield and wait\n await negotiationDatabase.updateTaskState(task.id, 'waiting_for_agent');\n\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, newTurnCount, timeoutMs);\n }\n\n return success({\n message: `${query.action === 'question' ? 'Question' : query.action === 'propose' ? 'Proposal' : 'Counter-proposal'} submitted. Waiting for counterparty response.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n waitingForAgent: true,\n });\n }\n\n let aiTurn: NegotiationTurn;\n\n if (dispatchResult?.handled === true) {\n // Dispatcher returned an agent turn directly\n aiTurn = dispatchResult.turn;\n } else {\n // No agent or timeout — run the system AI agent inline.\n // The agent honors a per-turn LLM timeout (AbortSignal), so invoke\n // can reject. Mirror the graph turnNode's reject-shaped fallback so\n // a timed-out or failed call degrades gracefully instead of leaving\n // the task pinned in `working` while the outer catch returns a bare\n // error to the user.\n await negotiationDatabase.updateTaskState(task.id, 'working');\n\n const agent = new IndexNegotiator();\n try {\n aiTurn = await agent.invoke({\n ownUser: ownUserCtx,\n otherUser: otherUserCtx,\n indexContext: { networkId: '' },\n seedAssessment,\n history: historyForDispatch,\n isFinalTurn,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n const errName = (err as { name?: string })?.name ?? '';\n const isTimeout = errName === 'TimeoutError' || /timeout|abort/i.test(errMsg);\n // Log the raw error for ops, but keep the persisted/returned\n // reasoning generic — this string round-trips back to the caller\n // via counterpartyResponse.reasoning and ends up in the negotiation\n // history visible through get_negotiation, so we don't want raw\n // provider messages (URLs, request IDs, internal stack hints) on\n // the wire.\n logger.warn('System negotiator inline invoke failed; treating as reject', {\n taskId: task.id,\n isTimeout,\n error: errMsg,\n });\n aiTurn = {\n action: 'reject',\n assessment: {\n reasoning: isTimeout\n ? 'Negotiator response timed out.'\n : 'Negotiator failed to produce a response.',\n suggestedRoles: { ownUser: 'peer', otherUser: 'peer' },\n },\n };\n }\n }\n\n // Persist the counterparty's turn (from dispatcher or inline AI)\n const aiSenderId = `agent:${counterpartyUserId}`;\n await negotiationDatabase.createMessage({\n conversationId: task.conversationId,\n senderId: aiSenderId,\n role: 'agent',\n parts: [{ kind: 'data' as const, data: aiTurn }],\n taskId: task.id,\n });\n\n const finalTurnCount = newTurnCount + 1;\n\n // Evaluate response\n if (aiTurn.action === 'accept' || aiTurn.action === 'reject') {\n const fullHistory = [...historyForDispatch, aiTurn];\n const outcome = buildNegotiationOutcome(fullHistory, finalTurnCount, aiTurn.action, meta.sourceUserId!, meta.candidateUserId!, counterpartySpeaker === 'source' ? 'candidate' : 'source');\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: outcome.hasOpportunity, turnCount: finalTurnCount },\n });\n\n return success({\n message: `${query.action === 'question' ? 'Question' : query.action === 'propose' ? 'Proposal' : 'Counter'} submitted. Counterparty responded with ${aiTurn.action}.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n outcome,\n });\n }\n\n // Counterparty countered/questioned — check if max turns reached\n if (finalTurnCount >= maxTurns) {\n const fullHistory = [...historyForDispatch, aiTurn];\n const outcome = buildNegotiationOutcome(fullHistory, finalTurnCount, 'counter', meta.sourceUserId!, meta.candidateUserId!, counterpartySpeaker === 'source' ? 'candidate' : 'source');\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: false, turnCount: finalTurnCount },\n });\n\n return success({\n message: 'Counterparty responded but max turns reached. Negotiation finalized.',\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n outcome,\n });\n }\n\n // Counterparty countered/questioned, now user's turn again — dispatch to user's agent\n const userDispatchPayload: NegotiationTurnPayload = {\n negotiationId: task.id,\n ownUser: { id: context.userId, intents: [], profile: {} },\n otherUser: { id: counterpartyUserId, intents: [], profile: {} },\n indexContext: { networkId: '' },\n seedAssessment,\n history: [...historyForDispatch, aiTurn],\n isFinalTurn: finalTurnCount + 1 >= maxTurns,\n isDiscoverer: true,\n };\n\n const userDispatchResult = await deps.agentDispatcher?.dispatch(context.userId, scope, userDispatchPayload, { timeoutMs });\n\n if (!userDispatchResult || (userDispatchResult.handled === false && userDispatchResult.reason === 'no_agent')) {\n // No agent for user — set back to waiting_for_agent so they can use respond_to_negotiation\n await negotiationDatabase.updateTaskState(task.id, 'waiting_for_agent');\n\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, finalTurnCount, timeoutMs);\n }\n\n return success({\n message: `${query.action === 'question' ? 'Question' : 'Counter'} submitted. Counterparty responded. Your turn to respond.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n waitingForAgent: true,\n });\n }\n\n if (userDispatchResult.handled === false && userDispatchResult.reason === 'waiting') {\n // User's agent acknowledged — yield and wait\n await negotiationDatabase.updateTaskState(task.id, 'waiting_for_agent');\n\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, finalTurnCount, timeoutMs);\n }\n\n return success({\n message: `${query.action === 'question' ? 'Question' : 'Counter'} submitted. Counterparty countered back. Waiting for your agent's response.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n waitingForAgent: true,\n });\n }\n\n if (userDispatchResult.handled === true) {\n // User's agent returned a turn directly — persist, evaluate, and continue\n const userAgentTurn: NegotiationTurn = userDispatchResult.turn;\n const userAgentSenderId = `agent:${context.userId}`;\n await negotiationDatabase.createMessage({\n conversationId: task.conversationId,\n senderId: userAgentSenderId,\n role: 'agent',\n parts: [{ kind: 'data' as const, data: userAgentTurn }],\n taskId: task.id,\n });\n\n const userTurnCount = finalTurnCount + 1;\n\n if (userAgentTurn.action === 'accept' || userAgentTurn.action === 'reject') {\n const fullHistory = [...historyForDispatch, aiTurn, userAgentTurn];\n const userSpeaker = isSource ? 'source' : 'candidate';\n const outcome = buildNegotiationOutcome(fullHistory, userTurnCount, userAgentTurn.action, meta.sourceUserId!, meta.candidateUserId!, userSpeaker === 'source' ? 'candidate' : 'source');\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: outcome.hasOpportunity, turnCount: userTurnCount },\n });\n\n return success({\n message: `Your agent ${userAgentTurn.action}ed the counterparty's response.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n outcome,\n });\n }\n\n if (userTurnCount >= maxTurns) {\n const fullHistory = [...historyForDispatch, aiTurn, userAgentTurn];\n const outcome = buildNegotiationOutcome(fullHistory, userTurnCount, 'counter', meta.sourceUserId!, meta.candidateUserId!, isSource ? 'candidate' : 'source');\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: false, turnCount: userTurnCount },\n });\n\n return success({\n message: 'Your agent responded but max turns reached. Negotiation finalized.',\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n outcome,\n });\n }\n\n // User's agent countered/questioned — arm timeout for counterparty's next turn\n await negotiationDatabase.updateTaskState(task.id, 'waiting_for_agent');\n\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, userTurnCount, timeoutMs);\n }\n\n return success({\n message: `Your agent responded with ${userAgentTurn.action}. Waiting for counterparty.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n waitingForAgent: true,\n });\n }\n\n // No agent / timeout — set back to working so graph can continue\n await negotiationDatabase.updateTaskState(task.id, 'working');\n\n return success({\n message: `${query.action === 'question' ? 'Question' : 'Counter'} submitted. Counterparty countered back. Negotiation continues.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n });\n } catch (err) {\n logger.error('Failed to respond to negotiation', { err });\n return error('Failed to respond to negotiation. Please try again.');\n }\n },\n });\n\n return [list_negotiations, get_negotiation, respond_to_negotiation] as const;\n}\n\n/**\n * Build a NegotiationOutcome from the full turn history.\n * Mirrors the logic in the graph's finalizeNode for consistency.\n *\n * @param history - All negotiation turns\n * @param turnCount - Total number of turns\n * @param lastAction - The last turn's action (accept/reject/counter)\n * @param sourceUserId - Source user ID\n * @param candidateUserId - Candidate user ID\n * @param currentSpeaker - Who would speak next (the person after the accepter/rejector)\n */\nfunction buildNegotiationOutcome(\n history: NegotiationTurn[],\n turnCount: number,\n lastAction: string,\n sourceUserId: string,\n candidateUserId: string,\n currentSpeaker: string,\n): NegotiationOutcome {\n const hasOpportunity = lastAction === 'accept';\n const atCap = lastAction === 'counter';\n\n let agreedRoles: NegotiationOutcome['agreedRoles'] = [];\n if (hasOpportunity && history.length >= 2) {\n const acceptTurn = history[history.length - 1];\n const precedingTurn = history[history.length - 2];\n const accepterIsSource = currentSpeaker === 'candidate';\n const [sourceRole, candidateRole] = accepterIsSource\n ? [acceptTurn.assessment.suggestedRoles.ownUser, precedingTurn.assessment.suggestedRoles.ownUser]\n : [precedingTurn.assessment.suggestedRoles.ownUser, acceptTurn.assessment.suggestedRoles.ownUser];\n agreedRoles = [\n { userId: sourceUserId, role: sourceRole },\n { userId: candidateUserId, role: candidateRole },\n ];\n }\n\n return {\n hasOpportunity,\n agreedRoles,\n reasoning: history[history.length - 1]?.assessment.reasoning ?? '',\n turnCount,\n ...(atCap && { reason: 'turn_cap' }),\n };\n}\n"]}
1
+ {"version":3,"file":"negotiation.tools.js","sourceRoot":"/","sources":["negotiation/negotiation.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,MAAM,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC;AAElD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpD;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,IAGnB;IACN,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC;IACvF,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC;IAClE,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,EAAE;QAAE,OAAO,eAAe,CAAC;IAC1F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,YAAY,GAAG,qEAAqE,CAAC;AAE3F,6EAA6E;AAC7E,SAAS,iBAAiB,CAAC,QAAqC;IAC9D,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,EAAE,GAAI,CAAC,CAAC,KAAkD,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACjG,OAAO,EAAE,EAAE,IAAuB,CAAC;IACrC,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAsB,EAAE,IAAc;IAC3E,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAErC,MAAM,iBAAiB,GAAG,UAAU,CAAC;QACnC,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,gIAAgI;YAChI,0HAA0H;YAC1H,2CAA2C;YAC3C,iBAAiB;YACjB,yEAAyE;YACzE,oJAAoJ;YACpJ,0FAA0F;YAC1F,kGAAkG;YAClG,yEAAyE;QAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,mBAAmB,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;iBAC3E,QAAQ,CAAC,6EAA6E,CAAC;YAC1F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;iBACpC,QAAQ,CAAC,kFAAkF,CAAC;YAC/F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;iBAC/C,QAAQ,CAAC,sEAAsE,CAAC;YACnF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACrC,QAAQ,CAAC,yEAAyE,CAAC;YACtF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;iBAChD,QAAQ,CACP,uEAAuE;gBACvE,6EAA6E;gBAC7E,iFAAiF;gBACjF,kFAAkF;gBAClF,iFAAiF;gBACjF,+DAA+D,CAChE;SACJ,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;YACpC,IAAI,CAAC;gBACH,6CAA6C;gBAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtF,4CAA4C;gBAC5C,MAAM,OAAO,GAAG,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS;oBAClD,CAAC,CAAC,WAAW,KAAK,mBAAmB,CAAC,CAAC,CAAC,mBAAmB;wBAC3D,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW;4BAC3C,CAAC,CAAC,SAAS,CAAC;gBAEd,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAClH,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAElD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,QASV,CAAC;oBACT,IAAI,IAAI,EAAE,IAAI,KAAK,aAAa;wBAAE,OAAO,IAAI,CAAC;oBAE9C,sEAAsE;oBACtE,sEAAsE;oBACtE,kDAAkD;oBAClD,IAAI,eAAe,EAAE,CAAC;wBACpB,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;wBAC9C,IAAI,aAAa,KAAK,eAAe;4BAAE,OAAO,IAAI,CAAC;oBACrD,CAAC;oBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC;oBACtD,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;oBAE3E,uEAAuE;oBACvE,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC3F,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAClD,MAAM,YAAY,GAAG,WAAW;wBAC9B,CAAC,CAAG,WAAW,CAAC,KAAkD,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAsG;wBACxM,CAAC,CAAC,SAAS,CAAC;oBAEd,mFAAmF;oBACnF,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;oBAClC,MAAM,cAAc,GAAG,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;oBAEpE,gCAAgC;oBAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ;wBAChD,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,mBAAmB,CAAC,CAAC,CAAC,mBAAmB;4BAC1D,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW;gCAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;oBAEf,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW;wBACxC,CAAC,CAAC,QAAQ,IAAI,cAAc,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC;oBAE/F,MAAM,IAAI,GAAG;wBACX,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,cAAc,EAAE,cAAc,IAAI,SAAS;wBAC3C,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;wBACvC,SAAS;wBACT,MAAM;wBACN,WAAW;wBACX,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,KAAK;wBAC5C,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,CAAC;wBACxC,YAAY,EAAE,YAAY,EAAE,MAAM,IAAI,IAAI;wBAC1C,oBAAoB,EAAE,YAAY,EAAE,OAAO,IAAI,IAAI;wBACnD,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;qBAC1B,CAAC;oBAEF,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;wBAAE,OAAO,IAAI,CAAC;oBAE9C,sEAAsE;oBAEtE,MAAM,kBAAkB,GAAG,CAAC,CAAC;oBAC7B,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC;oBAC3D,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE;wBACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,GAAG,QAAQ,CAAC;wBACvE,MAAM,OAAO,GAAG,WAAW,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;wBAC/D,MAAM,EAAE,GAAK,CAAC,CAAC,KAAkD,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAiE,CAAC;wBACnK,OAAO;4BACL,UAAU,EAAE,WAAW,GAAG,CAAC;4BAC3B,OAAO;4BACP,IAAI,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;4BACvE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,SAAS;4BAC/B,OAAO,EAAE,EAAE,EAAE,OAAO,IAAI,IAAI;yBAC7B,CAAC;oBACJ,CAAC,CAAC,CAAC;oBAEH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,IAAI,IAAI,CAAC;oBAE5D,gEAAgE;oBAChE,IAAI,OAAO,GAAY,IAAI,CAAC;oBAC5B,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;wBAC3B,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACzE,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC;wBAC9E,OAAO,GAAG,eAAe;4BACvB,CAAC,CAAC,CAAE,eAAe,CAAC,KAAkD,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;4BACnH,CAAC,CAAC,IAAI,CAAC;oBACX,CAAC;oBAED,OAAO,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;gBACzD,CAAC,CAAC,CAAC,CAAC;gBAEJ,IAAI,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAE5C,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;oBAChD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,CAAC;gBAC/E,CAAC;gBAED,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC;gBACjD,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAM,CAAC;oBAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;oBAC7B,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;oBAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;oBACrD,OAAO,OAAO,CAAC;wBACb,KAAK,EAAE,KAAK,CAAC,MAAM;wBACnB,UAAU,EAAE,QAAQ,CAAC,MAAM;wBAC3B,KAAK;wBACL,IAAI;wBACJ,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;wBAC9C,YAAY,EAAE,KAAK;qBACpB,CAAC,CAAC;gBACL,CAAC;gBAED,OAAO,OAAO,CAAC;oBACb,KAAK,EAAE,QAAQ,CAAC,MAAM;oBACtB,YAAY,EAAE,QAAQ;iBACvB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBACrD,OAAO,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,UAAU,CAAC;QACjC,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,uHAAuH;YACvH,sHAAsH;YACtH,8HAA8H;YAC9H,kGAAkG;YAClG,oIAAoI;YACpI,iHAAiH;YACjH,iFAAiF;YACjF,yGAAyG;YACzG,sGAAsG;YACtG,uGAAuG;YACvG,0GAA0G;YAC1G,kGAAkG;QACpG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;SAChG,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;YACpC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACpE,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACzC,CAAC;gBAED,MAAM,IAAI,GAAG,IAAI,CAAC,QAgBV,CAAC;gBACT,IAAI,IAAI,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;oBACjC,OAAO,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACzC,CAAC;gBAED,wEAAwE;gBACxE,oEAAoE;gBACpE,2DAA2D;gBAC3D,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBAC9C,IAAI,aAAa,KAAK,eAAe,EAAE,CAAC;wBACtC,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;gBAED,mDAAmD;gBACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC;gBACtD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC;gBAC5D,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC9B,OAAO,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBAC1E,CAAC;gBAED,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;gBAE3E,kEAAkE;gBAClE,iEAAiE;gBACjE,oEAAoE;gBACpE,wCAAwC;gBACxC,IAAI,kBAAkB,GAOX,IAAI,CAAC;gBAChB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;oBAC5B,kBAAkB,GAAG;wBACnB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa;wBACpD,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU;wBACtD,YAAY,EAAE,EAAE,CAAC,YAAY;wBAC7B,cAAc,EAAE,EAAE,CAAC,cAAc;wBACjC,YAAY,EAAE,QAAQ;wBACtB,GAAG,CAAC,EAAE,CAAC,cAAc,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC;qBAChE,CAAC;gBACJ,CAAC;gBAED,8BAA8B;gBAC9B,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAC9C,mBAAmB,CAAC,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC;oBACnE,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;iBACjD,CAAC,CAAC;gBAEH,4BAA4B;gBAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;oBACpC,MAAM,QAAQ,GAAI,CAAC,CAAC,KAAkD,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;oBACrG,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAId,CAAC;oBAEd,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,CAAC;oBAC3B,MAAM,OAAO,GAAG,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;oBAE9D,OAAO;wBACL,UAAU;wBACV,OAAO;wBACP,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,SAAS;wBACrC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,IAAI,IAAI;wBAClD,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,IAAI,IAAI;wBAC5D,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI;wBAClC,SAAS,EAAE,CAAC,CAAC,SAAS;qBACvB,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,8CAA8C;gBAC9C,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC;gBAC9E,MAAM,OAAO,GAAG,eAAe;oBAC7B,CAAC,CAAE,eAAe,CAAC,KAAkD,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI;oBACzG,CAAC,CAAC,IAAI,CAAC;gBAET,6BAA6B;gBAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAClC,MAAM,cAAc,GAAG,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;gBAEpE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ;oBAChD,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,mBAAmB,CAAC,CAAC,CAAC,mBAAmB;wBAC1D,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW;4BAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAEf,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW;oBACxC,CAAC,CAAC,QAAQ,IAAI,cAAc,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC;gBAE/F,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC;gBACpD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;gBAEhD,OAAO,OAAO,CAAC;oBACb,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,MAAM;oBACN,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;oBACvC,cAAc,EAAE,cAAc,IAAI,SAAS;oBAC3C,SAAS;oBACT,WAAW;oBACX,cAAc;oBACd,cAAc;oBACd,UAAU,EAAE,SAAS,GAAG,cAAc;oBACtC,KAAK;oBACL,OAAO;oBACP,OAAO,EAAE,kBAAkB;oBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBACnD,OAAO,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAAG,UAAU,CAAC;QACxC,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,gHAAgH;YAChH,2EAA2E;YAC3E,+GAA+G;YAC/G,wEAAwE;YACxE,sBAAsB;YACtB,kGAAkG;YAClG,uGAAuG;YACvG,2GAA2G;YAC3G,qHAAqH;YACrH,4HAA4H;YAC5H,6GAA6G;YAC7G,wGAAwG;YACxG,mGAAmG;YACnG,0GAA0G;YAC1G,2GAA2G;YAC3G,oGAAoG;YACpG,2EAA2E;QAC7E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YAC5E,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,kFAAkF,CAAC;YACnK,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;YACtG,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC;gBACvB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;gBAC3G,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,wDAAwD,CAAC;aACnH,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACjD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4GAA4G,CAAC;SACtJ,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;YACpC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACpE,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACzC,CAAC;gBAED,MAAM,IAAI,GAAG,IAAI,CAAC,QAOV,CAAC;gBACT,IAAI,IAAI,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;oBACjC,OAAO,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACzC,CAAC;gBAED,uEAAuE;gBACvE,0DAA0D;gBAC1D,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBAC9C,IAAI,aAAa,KAAK,eAAe,EAAE,CAAC;wBACtC,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;gBAED,2EAA2E;gBAC3E,IAAI,IAAI,CAAC,KAAK,KAAK,mBAAmB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACnE,OAAO,KAAK,CAAC,8DAA8D,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC3F,CAAC;gBAED,uCAAuC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC;gBACtD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC;gBAC5D,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC9B,OAAO,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBAC1E,CAAC;gBAED,6BAA6B;gBAC7B,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC3F,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAClC,MAAM,cAAc,GAAG,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;gBACpE,MAAM,WAAW,GAAG,CAAC,QAAQ,IAAI,cAAc,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,cAAc,KAAK,WAAW,CAAC,CAAC;gBAE/G,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,OAAO,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACtE,CAAC;gBAED,0CAA0C;gBAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;oBAC1F,OAAO,KAAK,CAAC,qCAAqC,KAAK,CAAC,MAAM,gDAAgD,CAAC,CAAC;gBAClH,CAAC;gBAED,+BAA+B;gBAC/B,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACjC,MAAM,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5D,CAAC;gBAED,oDAAoD;gBACpD,MAAM,QAAQ,GAAoB;oBAChC,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,UAAU,EAAE;wBACV,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC;oBACD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrD,CAAC;gBAEF,MAAM,QAAQ,GAAG,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC3C,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,aAAa,CAAC;oBAC1D,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,QAAQ;oBACR,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;oBAClD,MAAM,EAAE,IAAI,CAAC,EAAE;iBAChB,CAAC,CAAC;gBAEH,MAAM,YAAY,GAAG,SAAS,GAAG,CAAC,CAAC;gBAEnC,mDAAmD;gBACnD,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC3D,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAkB,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;oBAC3L,MAAM,OAAO,GAAsB,iBAAiB,CAAC,WAAW,CAAC,CAAC;oBAElE,MAAM,WAAW,GAAG,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;oBACzE,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,YAAa,EAAE,IAAI,CAAC,eAAgB,EAAE,WAAW,CAAC,CAAC;oBAErI,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBAChE,MAAM,mBAAmB,CAAC,cAAc,CAAC;wBACvC,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,IAAI,EAAE,qBAAqB;wBAC3B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;wBACxC,QAAQ,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE;qBAC9E,CAAC,CAAC;oBAEH,OAAO,OAAO,CAAC;wBACb,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,QAAQ;4BAChC,CAAC,CAAC,wDAAwD;4BAC1D,CAAC,CAAC,uBAAuB;wBAC3B,aAAa,EAAE,IAAI,CAAC,EAAE;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE,YAAY;wBACxB,OAAO;qBACR,CAAC,CAAC;gBACL,CAAC;gBAED,0DAA0D;gBAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,sDAAsD;gBAC3F,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;oBAC7B,6CAA6C;oBAC7C,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAkB,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;oBAC3L,MAAM,OAAO,GAAsB,iBAAiB,CAAC,WAAW,CAAC,CAAC;oBAElE,MAAM,iBAAiB,GAAG,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC/E,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,YAAa,EAAE,IAAI,CAAC,eAAgB,EAAE,iBAAiB,CAAC,CAAC;oBAExI,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBAChE,MAAM,mBAAmB,CAAC,cAAc,CAAC;wBACvC,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,IAAI,EAAE,qBAAqB;wBAC3B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;wBACxC,QAAQ,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE;qBAC7D,CAAC,CAAC;oBAEH,OAAO,OAAO,CAAC;wBACb,OAAO,EAAE,mEAAmE;wBAC5E,aAAa,EAAE,IAAI,CAAC,EAAE;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE,YAAY;wBACxB,OAAO;qBACR,CAAC,CAAC;gBACL,CAAC;gBAED,2EAA2E;gBAC3E,MAAM,kBAAkB,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAa,CAAC;gBACjF,MAAM,mBAAmB,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAE9D,wDAAwD;gBACxD,MAAM,mBAAmB,GAAG,CAAC,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAkB,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;gBACnM,MAAM,kBAAkB,GAAsB,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;gBAErF,MAAM,WAAW,GAAG,YAAY,GAAG,CAAC,IAAI,QAAQ,CAAC;gBAEjD,MAAM,UAAU,GAA2B,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;gBAChG,MAAM,YAAY,GAA2B,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;gBAC9F,MAAM,cAAc,GAAmB,EAAE,SAAS,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;gBAEnG,MAAM,eAAe,GAA2B;oBAC9C,aAAa,EAAE,IAAI,CAAC,EAAE;oBACtB,OAAO,EAAE,UAAU;oBACnB,SAAS,EAAE,YAAY;oBACvB,YAAY,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;oBAC/B,cAAc;oBACd,OAAO,EAAE,kBAAkB;oBAC3B,WAAW;oBACX,YAAY,EAAE,KAAK;iBACpB,CAAC;gBAEF,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,qBAAqB,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;gBAC5F,MAAM,SAAS,GAAG,sBAAsB,CAAC;gBAEzC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,kBAAkB,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBAEvH,IAAI,cAAc,EAAE,OAAO,KAAK,KAAK,IAAI,cAAc,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC7E,qDAAqD;oBACrD,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;oBAExE,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;wBACjC,MAAM,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;oBACtF,CAAC;oBAED,OAAO,OAAO,CAAC;wBACb,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,gDAAgD;wBACnK,aAAa,EAAE,IAAI,CAAC,EAAE;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE,YAAY;wBACxB,eAAe,EAAE,IAAI;qBACtB,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,MAAuB,CAAC;gBAE5B,IAAI,cAAc,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrC,6CAA6C;oBAC7C,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,wDAAwD;oBACxD,mEAAmE;oBACnE,oEAAoE;oBACpE,oEAAoE;oBACpE,oEAAoE;oBACpE,qBAAqB;oBACrB,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;oBAE9D,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;4BAC1B,OAAO,EAAE,UAAU;4BACnB,SAAS,EAAE,YAAY;4BACvB,YAAY,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;4BAC/B,cAAc;4BACd,OAAO,EAAE,kBAAkB;4BAC3B,WAAW;yBACZ,CAAC,CAAC;oBACL,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAChE,MAAM,OAAO,GAAI,GAAyB,EAAE,IAAI,IAAI,EAAE,CAAC;wBACvD,MAAM,SAAS,GAAG,OAAO,KAAK,cAAc,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC9E,6DAA6D;wBAC7D,iEAAiE;wBACjE,oEAAoE;wBACpE,gEAAgE;wBAChE,iEAAiE;wBACjE,YAAY;wBACZ,MAAM,CAAC,IAAI,CAAC,4DAA4D,EAAE;4BACxE,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,SAAS;4BACT,KAAK,EAAE,MAAM;yBACd,CAAC,CAAC;wBACH,MAAM,GAAG;4BACP,MAAM,EAAE,QAAQ;4BAChB,UAAU,EAAE;gCACV,SAAS,EAAE,SAAS;oCAClB,CAAC,CAAC,gCAAgC;oCAClC,CAAC,CAAC,0CAA0C;gCAC9C,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;6BACvD;yBACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,iEAAiE;gBACjE,MAAM,UAAU,GAAG,SAAS,kBAAkB,EAAE,CAAC;gBACjD,MAAM,mBAAmB,CAAC,aAAa,CAAC;oBACtC,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,QAAQ,EAAE,UAAU;oBACpB,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBAChD,MAAM,EAAE,IAAI,CAAC,EAAE;iBAChB,CAAC,CAAC;gBAEH,MAAM,cAAc,GAAG,YAAY,GAAG,CAAC,CAAC;gBAExC,oBAAoB;gBACpB,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC7D,MAAM,WAAW,GAAG,CAAC,GAAG,kBAAkB,EAAE,MAAM,CAAC,CAAC;oBACpD,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAa,EAAE,IAAI,CAAC,eAAgB,EAAE,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBAE1L,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBAChE,MAAM,mBAAmB,CAAC,cAAc,CAAC;wBACvC,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,IAAI,EAAE,qBAAqB;wBAC3B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;wBACxC,QAAQ,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE;qBAChF,CAAC,CAAC;oBAEH,OAAO,OAAO,CAAC;wBACb,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,2CAA2C,MAAM,CAAC,MAAM,GAAG;wBACrK,aAAa,EAAE,IAAI,CAAC,EAAE;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE,YAAY;wBACxB,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;wBACxH,OAAO;qBACR,CAAC,CAAC;gBACL,CAAC;gBAED,iEAAiE;gBACjE,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;oBAC/B,MAAM,WAAW,GAAG,CAAC,GAAG,kBAAkB,EAAE,MAAM,CAAC,CAAC;oBACpD,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,YAAa,EAAE,IAAI,CAAC,eAAgB,EAAE,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBAEtL,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBAChE,MAAM,mBAAmB,CAAC,cAAc,CAAC;wBACvC,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,IAAI,EAAE,qBAAqB;wBAC3B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;wBACxC,QAAQ,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE;qBAC/D,CAAC,CAAC;oBAEH,OAAO,OAAO,CAAC;wBACb,OAAO,EAAE,sEAAsE;wBAC/E,aAAa,EAAE,IAAI,CAAC,EAAE;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE,YAAY;wBACxB,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;wBACxH,OAAO;qBACR,CAAC,CAAC;gBACL,CAAC;gBAED,sFAAsF;gBACtF,MAAM,mBAAmB,GAA2B;oBAClD,aAAa,EAAE,IAAI,CAAC,EAAE;oBACtB,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;oBACzD,SAAS,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;oBAC/D,YAAY,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;oBAC/B,cAAc;oBACd,OAAO,EAAE,CAAC,GAAG,kBAAkB,EAAE,MAAM,CAAC;oBACxC,WAAW,EAAE,cAAc,GAAG,CAAC,IAAI,QAAQ;oBAC3C,YAAY,EAAE,IAAI;iBACnB,CAAC;gBAEF,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBAE3H,IAAI,CAAC,kBAAkB,IAAI,CAAC,kBAAkB,CAAC,OAAO,KAAK,KAAK,IAAI,kBAAkB,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;oBAC9G,2FAA2F;oBAC3F,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;oBAExE,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;wBACjC,MAAM,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;oBACxF,CAAC;oBAED,OAAO,OAAO,CAAC;wBACb,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,2DAA2D;wBAC3H,aAAa,EAAE,IAAI,CAAC,EAAE;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE,YAAY;wBACxB,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;wBACxH,eAAe,EAAE,IAAI;qBACtB,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,kBAAkB,CAAC,OAAO,KAAK,KAAK,IAAI,kBAAkB,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACpF,6CAA6C;oBAC7C,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;oBAExE,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;wBACjC,MAAM,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;oBACxF,CAAC;oBAED,OAAO,OAAO,CAAC;wBACb,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,6EAA6E;wBAC7I,aAAa,EAAE,IAAI,CAAC,EAAE;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE,YAAY;wBACxB,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;wBACxH,eAAe,EAAE,IAAI;qBACtB,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,kBAAkB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;oBACxC,0EAA0E;oBAC1E,MAAM,aAAa,GAAoB,kBAAkB,CAAC,IAAI,CAAC;oBAC/D,MAAM,iBAAiB,GAAG,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpD,MAAM,mBAAmB,CAAC,aAAa,CAAC;wBACtC,cAAc,EAAE,IAAI,CAAC,cAAc;wBACnC,QAAQ,EAAE,iBAAiB;wBAC3B,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;wBACvD,MAAM,EAAE,IAAI,CAAC,EAAE;qBAChB,CAAC,CAAC;oBAEH,MAAM,aAAa,GAAG,cAAc,GAAG,CAAC,CAAC;oBAEzC,IAAI,aAAa,CAAC,MAAM,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC3E,MAAM,WAAW,GAAG,CAAC,GAAG,kBAAkB,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;wBACnE,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;wBACtD,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,YAAa,EAAE,IAAI,CAAC,eAAgB,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;wBAExL,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;wBAChE,MAAM,mBAAmB,CAAC,cAAc,CAAC;4BACvC,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,IAAI,EAAE,qBAAqB;4BAC3B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;4BACxC,QAAQ,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE;yBAC/E,CAAC,CAAC;wBAEH,OAAO,OAAO,CAAC;4BACb,OAAO,EAAE,cAAc,aAAa,CAAC,MAAM,iCAAiC;4BAC5E,aAAa,EAAE,IAAI,CAAC,EAAE;4BACtB,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,UAAU,EAAE,YAAY;4BACxB,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;4BACxH,OAAO;yBACR,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,aAAa,IAAI,QAAQ,EAAE,CAAC;wBAC9B,MAAM,WAAW,GAAG,CAAC,GAAG,kBAAkB,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;wBACnE,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,YAAa,EAAE,IAAI,CAAC,eAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;wBAE7J,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;wBAChE,MAAM,mBAAmB,CAAC,cAAc,CAAC;4BACvC,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,IAAI,EAAE,qBAAqB;4BAC3B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;4BACxC,QAAQ,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE;yBAC9D,CAAC,CAAC;wBAEH,OAAO,OAAO,CAAC;4BACb,OAAO,EAAE,oEAAoE;4BAC7E,aAAa,EAAE,IAAI,CAAC,EAAE;4BACtB,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,UAAU,EAAE,YAAY;4BACxB,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;4BACxH,OAAO;yBACR,CAAC,CAAC;oBACL,CAAC;oBAED,+EAA+E;oBAC/E,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;oBAExE,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;wBACjC,MAAM,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;oBACvF,CAAC;oBAED,OAAO,OAAO,CAAC;wBACb,OAAO,EAAE,6BAA6B,aAAa,CAAC,MAAM,6BAA6B;wBACvF,aAAa,EAAE,IAAI,CAAC,EAAE;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,UAAU,EAAE,YAAY;wBACxB,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;wBACxH,eAAe,EAAE,IAAI;qBACtB,CAAC,CAAC;gBACL,CAAC;gBAED,iEAAiE;gBACjE,MAAM,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAE9D,OAAO,OAAO,CAAC;oBACb,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,iEAAiE;oBACjI,aAAa,EAAE,IAAI,CAAC,EAAE;oBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,UAAU,EAAE,YAAY;oBACxB,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;iBACzH,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC1D,OAAO,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,iBAAiB,EAAE,eAAe,EAAE,sBAAsB,CAAU,CAAC;AAC/E,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,uBAAuB,CAC9B,OAA0B,EAC1B,SAAiB,EACjB,UAAkB,EAClB,YAAoB,EACpB,eAAuB,EACvB,cAAsB;IAEtB,MAAM,cAAc,GAAG,UAAU,KAAK,QAAQ,CAAC;IAC/C,MAAM,KAAK,GAAG,UAAU,KAAK,SAAS,CAAC;IAEvC,IAAI,WAAW,GAAsC,EAAE,CAAC;IACxD,IAAI,cAAc,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,gBAAgB,GAAG,cAAc,KAAK,WAAW,CAAC;QACxD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,gBAAgB;YAClD,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC;YACjG,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACpG,WAAW,GAAG;YACZ,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE;YAC1C,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE;SACjD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc;QACd,WAAW;QACX,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,SAAS,IAAI,EAAE;QAClE,SAAS;QACT,GAAG,CAAC,KAAK,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;KACrC,CAAC;AACJ,CAAC","sourcesContent":["import { z } from 'zod';\n\nimport type { DefineTool, ToolDeps } from '../shared/agent/tool.helpers.js';\nimport { success, error } from '../shared/agent/tool.helpers.js';\nimport { IndexNegotiator } from './negotiation.agent.js';\nimport type { NegotiationTurn, UserNegotiationContext, SeedAssessment, NegotiationOutcome } from './negotiation.state.js';\nimport type { NegotiationTurnPayload } from '../shared/interfaces/agent-dispatcher.interface.js';\nimport { protocolLogger } from '../shared/observability/protocol.logger.js';\nimport { focusedNetworkId } from '../shared/agent/tool.scope.js';\n\nconst logger = protocolLogger('NegotiationTools');\n\n/**\n * Default park-window budget for ambient (background) negotiations. When a personal\n * agent is fresh, the dispatcher parks the turn and this is how long we wait before\n * the system agent takes over as a fallback.\n *\n * Short enough that ambient opportunities materialize in minutes (not hours),\n * long enough to cover two full polling cycles (30s * 2 = 60s) plus an agent\n * subagent turn. 5 minutes gives generous headroom.\n */\nexport const AMBIENT_PARK_WINDOW_MS = 5 * 60 * 1000;\n\n/**\n * Pulls the negotiation's network from task metadata. Tasks created after the\n * scope hardening carry `metadata.networkId` directly; older tasks only have\n * the network embedded in the parked `turnContext.indexContext.networkId`.\n * Returns `null` for legacy tasks where neither field is present — callers\n * scoped by the request scope envelope must reject these defensively rather than\n * fall through to a global view.\n */\nfunction readTaskNetworkId(meta: {\n networkId?: string;\n turnContext?: { indexContext?: { networkId?: string } };\n} | null): string | null {\n if (!meta) return null;\n if (typeof meta.networkId === 'string' && meta.networkId.trim()) return meta.networkId;\n const fromTurnContext = meta.turnContext?.indexContext?.networkId;\n if (typeof fromTurnContext === 'string' && fromTurnContext.trim()) return fromTurnContext;\n return null;\n}\n\nconst SCOPE_DENIAL = 'Access denied: this negotiation is not in your bound network scope.';\n\n/** Extracts the ordered NegotiationTurn list from A2A message data parts. */\nfunction turnsFromMessages(messages: Array<{ parts: unknown[] }>): NegotiationTurn[] {\n return messages\n .map((m) => {\n const dp = (m.parts as Array<{ kind?: string; data?: unknown }>)?.find((p) => p.kind === 'data');\n return dp?.data as NegotiationTurn;\n })\n .filter(Boolean);\n}\n\n/**\n * Creates negotiation MCP tools for external agent access.\n * Exposes negotiation state for listing, reading, and responding to bilateral negotiations.\n */\nexport function createNegotiationTools(defineTool: DefineTool, deps: ToolDeps) {\n const { negotiationDatabase } = deps;\n\n const list_negotiations = defineTool({\n name: 'list_negotiations',\n description:\n 'List bilateral negotiations the authenticated user is involved in, either as the source (initiator) or candidate (responder). ' +\n 'Negotiations are turn-based exchanges where two AI agents negotiate on behalf of their users to determine if there is a ' +\n 'mutual opportunity for collaboration.\\n\\n' +\n '**Statuses:**\\n' +\n '- `active` — Negotiation is in progress, agents are exchanging turns.\\n' +\n '- `waiting_for_agent` — The graph has yielded and is waiting for an agent response (e.g. from the user via respond_to_negotiation) or a timeout.\\n' +\n '- `completed` — Negotiation has concluded (accepted, rejected, or reached turn cap).\\n\\n' +\n '**When to use:** To see ongoing and past negotiations, check which negotiations need attention, ' +\n 'or find a negotiation ID for get_negotiation or respond_to_negotiation.',\n querySchema: z.object({\n status: z.enum(['active', 'waiting_for_agent', 'completed', 'all']).optional()\n .describe('Filter by negotiation status. Omit or use \"all\" to return all negotiations.'),\n since: z.string().datetime().optional()\n .describe('ISO 8601 date-time. Only return negotiations created at or after this timestamp.'),\n limit: z.number().int().min(1).max(100).optional()\n .describe('Maximum negotiations to return per page (1-100). Omit to return all.'),\n page: z.number().int().min(1).optional()\n .describe('Page number (1-based). Only used when limit is provided. Defaults to 1.'),\n detail: z.enum(['summary', 'narrative']).optional()\n .describe(\n 'Response detail level. Omit or use \"summary\" for the default fields. ' +\n 'Use \"narrative\" to receive additional context per negotiation suitable for ' +\n 'composing a digest or field report: indexContext (the community/network prompt ' +\n 'that seeded the negotiation), recentTurns (last 3 turns with action + message), ' +\n 'and outcome (for completed negotiations). These fields are populated from data ' +\n 'already loaded for the listing, so the extra cost is minimal.',\n ),\n }),\n handler: async ({ context, query }) => {\n try {\n // Map tool status filter to task state query\n const stateFilter = query.status && query.status !== 'all' ? query.status : undefined;\n // For 'active', query 'working' state tasks\n const dbState = stateFilter === 'active' ? 'working'\n : stateFilter === 'waiting_for_agent' ? 'waiting_for_agent'\n : stateFilter === 'completed' ? 'completed'\n : undefined;\n\n const tasks = await negotiationDatabase.getTasksForUser(context.userId, dbState ? { state: dbState } : undefined);\n const scopedNetworkId = focusedNetworkId(context);\n\n const negotiations = await Promise.all(tasks.map(async (task) => {\n const meta = task.metadata as {\n sourceUserId?: string;\n candidateUserId?: string;\n type?: string;\n maxTurns?: number;\n networkId?: string;\n turnContext?: { indexContext?: { networkId?: string; prompt?: string } };\n isContinuation?: boolean;\n priorTurnCount?: number;\n } | null;\n if (meta?.type !== 'negotiation') return null;\n\n // Network-scope filter: when caller's API key carries a network-bound\n // agent, drop tasks whose network differs (or whose network we cannot\n // determine — defense in depth for legacy tasks).\n if (scopedNetworkId) {\n const taskNetworkId = readTaskNetworkId(meta);\n if (taskNetworkId !== scopedNetworkId) return null;\n }\n\n const isSource = meta.sourceUserId === context.userId;\n const counterpartyId = isSource ? meta.candidateUserId : meta.sourceUserId;\n\n // Get messages for preview (and turns when narrative detail requested)\n const messages = await negotiationDatabase.getMessagesForConversation(task.conversationId);\n const lastMessage = messages[messages.length - 1];\n const lastTurnData = lastMessage\n ? ((lastMessage.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data')?.data as { action?: string; assessment?: { reasoning?: string }; message?: string | null } | undefined)\n : undefined;\n\n // Determine whose turn it is based on message count (alternating source/candidate)\n const turnCount = messages.length;\n const currentSpeaker = turnCount % 2 === 0 ? 'source' : 'candidate';\n\n // Map task state to tool status\n const status = task.state === 'working' ? 'active'\n : task.state === 'waiting_for_agent' ? 'waiting_for_agent'\n : task.state === 'completed' ? 'completed'\n : task.state;\n\n const isUsersTurn = status !== 'completed' &&\n ((isSource && currentSpeaker === 'source') || (!isSource && currentSpeaker === 'candidate'));\n\n const base = {\n id: task.id,\n counterpartyId: counterpartyId ?? 'unknown',\n role: isSource ? 'source' : 'candidate',\n turnCount,\n status,\n isUsersTurn,\n isContinuation: meta.isContinuation ?? false,\n priorTurnCount: meta.priorTurnCount ?? 0,\n latestAction: lastTurnData?.action ?? null,\n latestMessagePreview: lastTurnData?.message ?? null,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n };\n\n if (query.detail !== 'narrative') return base;\n\n // ── Narrative extras (messages already loaded — no extra DB cost) ──\n\n const RECENT_TURNS_LIMIT = 3;\n const recentMessages = messages.slice(-RECENT_TURNS_LIMIT);\n const recentTurns = recentMessages.map((m, sliceIdx) => {\n const absoluteIdx = messages.length - recentMessages.length + sliceIdx;\n const speaker = absoluteIdx % 2 === 0 ? 'source' : 'candidate';\n const td = ((m.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data')?.data as { action?: string; message?: string | null } | undefined);\n return {\n turnNumber: absoluteIdx + 1,\n speaker,\n role: speaker === (isSource ? 'source' : 'candidate') ? 'own' : 'other',\n action: td?.action ?? 'unknown',\n message: td?.message ?? null,\n };\n });\n\n const indexContext = meta.turnContext?.indexContext ?? null;\n\n // Outcome artifact — only meaningful for completed negotiations\n let outcome: unknown = null;\n if (status === 'completed') {\n const artifacts = await negotiationDatabase.getArtifactsForTask(task.id);\n const outcomeArtifact = artifacts.find(a => a.name === 'negotiation-outcome');\n outcome = outcomeArtifact\n ? ((outcomeArtifact.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data')?.data ?? null)\n : null;\n }\n\n return { ...base, indexContext, recentTurns, outcome };\n }));\n\n let filtered = negotiations.filter(Boolean);\n\n if (query.since) {\n const sinceMs = new Date(query.since).getTime();\n filtered = filtered.filter(n => new Date(n!.createdAt).getTime() >= sinceMs);\n }\n\n const shouldPaginate = query.limit !== undefined;\n if (shouldPaginate) {\n const limit = query.limit!;\n const page = query.page ?? 1;\n const offset = (page - 1) * limit;\n const paged = filtered.slice(offset, offset + limit);\n return success({\n count: paged.length,\n totalCount: filtered.length,\n limit,\n page,\n totalPages: Math.ceil(filtered.length / limit),\n negotiations: paged,\n });\n }\n\n return success({\n count: filtered.length,\n negotiations: filtered,\n });\n } catch (err) {\n logger.error('Failed to list negotiations', { err });\n return error('Failed to list negotiations. Please try again.');\n }\n },\n });\n\n const get_negotiation = defineTool({\n name: 'get_negotiation',\n description:\n 'Get the full details of a specific negotiation, including all turns, messages, counterparty info, and current state. ' +\n 'Negotiations are bilateral exchanges where two AI agents negotiate on behalf of users. Each turn contains an action ' +\n '(propose, accept, reject, counter, question), an assessment with reasoning and suggested roles, and an optional message.\\n\\n' +\n '**Access control:** You must be a party to the negotiation (source or candidate) to view it.\\n\\n' +\n '**Statuses:** `active` — in progress. `waiting_for_agent` — waiting for an agent response or timeout. `completed` — concluded.\\n\\n' +\n '**When to use:** To review the full negotiation history before responding, to understand why a negotiation was ' +\n 'accepted or rejected, or to see the current state of an active negotiation.\\n\\n' +\n '**Negotiation-turn-mode usage.** If you are running as a silent background subagent (dispatched by the ' +\n \"openclaw runtime's poller in response to a claimed negotiation turn), call this tool FIRST with the \" +\n 'negotiationId from your task prompt. This returns the current state, both parties\\' context, and the ' +\n 'history of turns so far. Ground your response in the caller\\'s profile (read_user_contexts) and intents ' +\n '(read_intents) before deciding on a turn action. Do not produce user-facing output in this mode.',\n querySchema: z.object({\n negotiationId: z.string().describe('The negotiation task ID (from list_negotiations results).'),\n }),\n handler: async ({ context, query }) => {\n try {\n const task = await negotiationDatabase.getTask(query.negotiationId);\n if (!task) {\n return error('Negotiation not found.');\n }\n\n const meta = task.metadata as {\n sourceUserId?: string;\n candidateUserId?: string;\n type?: string;\n maxTurns?: number;\n opportunityId?: string;\n networkId?: string;\n isContinuation?: boolean;\n priorTurnCount?: number;\n turnContext?: {\n sourceUser: UserNegotiationContext;\n candidateUser: UserNegotiationContext;\n indexContext: { networkId: string; prompt?: string };\n seedAssessment: SeedAssessment;\n discoveryQuery?: string;\n };\n } | null;\n if (meta?.type !== 'negotiation') {\n return error('Negotiation not found.');\n }\n\n // Network-scope check: a network-bound agent must not read negotiations\n // outside its bound network. Run before the participant check so we\n // don't leak existence-vs-membership signal across scopes.\n const scopedNetworkId = focusedNetworkId(context);\n if (scopedNetworkId) {\n const taskNetworkId = readTaskNetworkId(meta);\n if (taskNetworkId !== scopedNetworkId) {\n return error(SCOPE_DENIAL);\n }\n }\n\n // Access control: user must be source or candidate\n const isSource = meta.sourceUserId === context.userId;\n const isCandidate = meta.candidateUserId === context.userId;\n if (!isSource && !isCandidate) {\n return error('Access denied: you are not a party to this negotiation.');\n }\n\n const counterpartyId = isSource ? meta.candidateUserId : meta.sourceUserId;\n\n // Project absolute turn context (source/candidate) into own/other\n // perspective for the caller. Mirrors what the in-process system\n // agent receives as NegotiationAgentInput — identical context means\n // identical deliberation on both paths.\n let negotiationContext: {\n ownUser: UserNegotiationContext;\n otherUser: UserNegotiationContext;\n indexContext: { networkId: string; prompt?: string };\n seedAssessment: SeedAssessment;\n isDiscoverer: boolean;\n discoveryQuery?: string;\n } | null = null;\n if (meta.turnContext) {\n const tc = meta.turnContext;\n negotiationContext = {\n ownUser: isSource ? tc.sourceUser : tc.candidateUser,\n otherUser: isSource ? tc.candidateUser : tc.sourceUser,\n indexContext: tc.indexContext,\n seedAssessment: tc.seedAssessment,\n isDiscoverer: isSource,\n ...(tc.discoveryQuery && { discoveryQuery: tc.discoveryQuery }),\n };\n }\n\n // Load messages and artifacts\n const [messages, artifacts] = await Promise.all([\n negotiationDatabase.getMessagesForConversation(task.conversationId),\n negotiationDatabase.getArtifactsForTask(task.id),\n ]);\n\n // Parse turns from messages\n const turns = messages.map((m, idx) => {\n const dataPart = (m.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data');\n const turnData = dataPart?.data as {\n action?: string;\n assessment?: { reasoning?: string; suggestedRoles?: unknown };\n message?: string;\n } | undefined;\n\n const turnNumber = idx + 1;\n const speaker = turnNumber % 2 === 1 ? 'source' : 'candidate';\n\n return {\n turnNumber,\n speaker,\n senderId: m.senderId,\n action: turnData?.action ?? 'unknown',\n reasoning: turnData?.assessment?.reasoning ?? null,\n suggestedRoles: turnData?.assessment?.suggestedRoles ?? null,\n message: turnData?.message ?? null,\n createdAt: m.createdAt,\n };\n });\n\n // Extract outcome from artifacts if completed\n const outcomeArtifact = artifacts.find(a => a.name === 'negotiation-outcome');\n const outcome = outcomeArtifact\n ? (outcomeArtifact.parts as Array<{ kind?: string; data?: unknown }>)?.find(p => p.kind === 'data')?.data\n : null;\n\n // Determine whose turn it is\n const turnCount = messages.length;\n const currentSpeaker = turnCount % 2 === 0 ? 'source' : 'candidate';\n\n const status = task.state === 'working' ? 'active'\n : task.state === 'waiting_for_agent' ? 'waiting_for_agent'\n : task.state === 'completed' ? 'completed'\n : task.state;\n\n const isUsersTurn = status !== 'completed' &&\n ((isSource && currentSpeaker === 'source') || (!isSource && currentSpeaker === 'candidate'));\n\n const isContinuation = meta.isContinuation ?? false;\n const priorTurnCount = meta.priorTurnCount ?? 0;\n\n return success({\n id: task.id,\n conversationId: task.conversationId,\n status,\n role: isSource ? 'source' : 'candidate',\n counterpartyId: counterpartyId ?? 'unknown',\n turnCount,\n isUsersTurn,\n isContinuation,\n priorTurnCount,\n turnsAdded: turnCount - priorTurnCount,\n turns,\n outcome,\n context: negotiationContext,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n });\n } catch (err) {\n logger.error('Failed to get negotiation', { err });\n return error('Failed to get negotiation. Please try again.');\n }\n },\n });\n\n const respond_to_negotiation = defineTool({\n name: 'respond_to_negotiation',\n description:\n 'Respond to a negotiation that is waiting for agent input. This tool allows users to influence the negotiation ' +\n 'by accepting, rejecting, countering, or asking a clarifying question.\\n\\n' +\n '**Turn-based model:** Negotiations alternate between source and candidate agents. When the graph yields with ' +\n '`waiting_for_agent` status, the user whose turn it is can respond.\\n\\n' +\n '**Valid actions:**\\n' +\n '- `accept` — Accept the current proposal. The negotiation will be finalized as an opportunity.\\n' +\n '- `reject` — Reject the current proposal. The negotiation will end without creating an opportunity.\\n' +\n '- `counter` — Counter the proposal with a message (message is required). The negotiation will continue.\\n' +\n '- `question` — Ask the counterparty a clarifying question (message is required). The negotiation will continue.\\n\\n' +\n '**What happens after:** Accept/reject finalizes the negotiation immediately. Counter/question continues the negotiation — ' +\n 'if the counterparty has an agent, the negotiation yields again; otherwise the AI agent responds inline.\\n\\n' +\n '**Silent-subagent response contract.** In negotiation-turn mode, submit exactly ONE call to this tool ' +\n 'per dispatch with the action (propose | counter | accept | reject | question) and the assessment ' +\n '(reasoning + suggestedRoles). If the decision is ambiguous, pick the most conservative action — usually ' +\n '`counter` with specific objections, or `reject` with clear reasoning. On the first turn of a negotiation ' +\n '(turnCount === 0) the action MUST be `propose`. Do not ask the user clarifying questions; you are ' +\n 'authorized to act on their behalf within the scope granted to your agent.',\n querySchema: z.object({\n negotiationId: z.string().describe('The negotiation task ID to respond to.'),\n action: z.enum(['propose', 'accept', 'reject', 'counter', 'question']).describe('The response action. On the first turn (turnCount === 0) this MUST be \"propose\".'),\n reasoning: z.string().describe('Why you are taking this action — your assessment of the opportunity.'),\n suggestedRoles: z.object({\n ownUser: z.enum(['agent', 'patient', 'peer']).describe('Suggested role for your user in this opportunity.'),\n otherUser: z.enum(['agent', 'patient', 'peer']).describe('Suggested role for the other user in this opportunity.'),\n }).describe('Role suggestions for both parties.'),\n message: z.string().optional().describe('Required for \"counter\" and \"question\" actions. Your message explaining what you want to change or clarify.'),\n }),\n handler: async ({ context, query }) => {\n try {\n const task = await negotiationDatabase.getTask(query.negotiationId);\n if (!task) {\n return error('Negotiation not found.');\n }\n\n const meta = task.metadata as {\n sourceUserId?: string;\n candidateUserId?: string;\n type?: string;\n maxTurns?: number;\n networkId?: string;\n turnContext?: { indexContext?: { networkId?: string } };\n } | null;\n if (meta?.type !== 'negotiation') {\n return error('Negotiation not found.');\n }\n\n // Network-scope check (mirrors get_negotiation): a network-bound agent\n // must not act on negotiations outside its bound network.\n const scopedNetworkId = focusedNetworkId(context);\n if (scopedNetworkId) {\n const taskNetworkId = readTaskNetworkId(meta);\n if (taskNetworkId !== scopedNetworkId) {\n return error(SCOPE_DENIAL);\n }\n }\n\n // Validate negotiation is waiting for agent input (or claimed via polling)\n if (task.state !== 'waiting_for_agent' && task.state !== 'claimed') {\n return error(`Negotiation is not waiting for a response. Current status: ${task.state}`);\n }\n\n // Access control: user must be a party\n const isSource = meta.sourceUserId === context.userId;\n const isCandidate = meta.candidateUserId === context.userId;\n if (!isSource && !isCandidate) {\n return error('Access denied: you are not a party to this negotiation.');\n }\n\n // Determine whose turn it is\n const messages = await negotiationDatabase.getMessagesForConversation(task.conversationId);\n const turnCount = messages.length;\n const currentSpeaker = turnCount % 2 === 0 ? 'source' : 'candidate';\n const isUsersTurn = (isSource && currentSpeaker === 'source') || (!isSource && currentSpeaker === 'candidate');\n\n if (!isUsersTurn) {\n return error('It is not your turn to respond in this negotiation.');\n }\n\n // Validate counter/question has a message\n if ((query.action === 'counter' || query.action === 'question') && !query.message?.trim()) {\n return error(`A message is required when using \"${query.action}\". Explain what you want to change or clarify.`);\n }\n\n // ── Cancel pending timeout ──\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.cancelTimeout(task.id);\n }\n\n // ── Build and persist the external agent's turn ──\n const turnData: NegotiationTurn = {\n action: query.action,\n assessment: {\n reasoning: query.reasoning,\n suggestedRoles: query.suggestedRoles,\n },\n ...(query.message ? { message: query.message } : {}),\n };\n\n const senderId = `agent:${context.userId}`;\n const turnMessage = await negotiationDatabase.createMessage({\n conversationId: task.conversationId,\n senderId,\n role: 'agent',\n parts: [{ kind: 'data' as const, data: turnData }],\n taskId: task.id,\n });\n\n const newTurnCount = turnCount + 1;\n\n // ── Handle accept/reject: finalize immediately ──\n if (query.action === 'accept' || query.action === 'reject') {\n const allMessages = [...messages, { id: turnMessage.id, senderId: turnMessage.senderId, role: turnMessage.role, parts: turnMessage.parts as unknown[], createdAt: turnMessage.createdAt }];\n const history: NegotiationTurn[] = turnsFromMessages(allMessages);\n\n const nextSpeaker = currentSpeaker === 'source' ? 'candidate' : 'source';\n const outcome = buildNegotiationOutcome(history, newTurnCount, query.action, meta.sourceUserId!, meta.candidateUserId!, nextSpeaker);\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: outcome.hasOpportunity, turnCount: newTurnCount },\n });\n\n return success({\n message: query.action === 'accept'\n ? 'Negotiation accepted. An opportunity has been created.'\n : 'Negotiation rejected.',\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n outcome,\n });\n }\n\n // ── Handle counter/question: check if under max turns ──\n const maxTurns = meta.maxTurns ?? 6; // Read from task metadata; fallback to system default\n if (newTurnCount >= maxTurns) {\n // Max turns reached — finalize with turn_cap\n const allMessages = [...messages, { id: turnMessage.id, senderId: turnMessage.senderId, role: turnMessage.role, parts: turnMessage.parts as unknown[], createdAt: turnMessage.createdAt }];\n const history: NegotiationTurn[] = turnsFromMessages(allMessages);\n\n const nextSpeakerForCap = currentSpeaker === 'source' ? 'candidate' : 'source';\n const outcome = buildNegotiationOutcome(history, newTurnCount, 'counter', meta.sourceUserId!, meta.candidateUserId!, nextSpeakerForCap);\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: false, turnCount: newTurnCount },\n });\n\n return success({\n message: 'Maximum turns reached. Negotiation finalized without opportunity.',\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n outcome,\n });\n }\n\n // ── Counter/question under max turns: dispatch to counterparty's agent ──\n const counterpartyUserId = isSource ? meta.candidateUserId! : meta.sourceUserId!;\n const counterpartySpeaker = isSource ? 'candidate' : 'source';\n\n // Build the current turn history for dispatcher payload\n const allMessagesWithTurn = [...messages, { id: turnMessage.id, senderId: turnMessage.senderId, role: turnMessage.role, parts: turnMessage.parts as unknown[], createdAt: turnMessage.createdAt }];\n const historyForDispatch: NegotiationTurn[] = turnsFromMessages(allMessagesWithTurn);\n\n const isFinalTurn = newTurnCount + 1 >= maxTurns;\n\n const ownUserCtx: UserNegotiationContext = { id: counterpartyUserId, intents: [], profile: {} };\n const otherUserCtx: UserNegotiationContext = { id: context.userId, intents: [], profile: {} };\n const seedAssessment: SeedAssessment = { reasoning: 'Continued negotiation', valencyRole: 'peer' };\n\n const dispatchPayload: NegotiationTurnPayload = {\n negotiationId: task.id,\n ownUser: ownUserCtx,\n otherUser: otherUserCtx,\n indexContext: { networkId: '' },\n seedAssessment,\n history: historyForDispatch,\n isFinalTurn,\n isDiscoverer: false,\n };\n\n const scope = { action: 'negotiation.respond', scopeType: 'negotiation', scopeId: task.id };\n const timeoutMs = AMBIENT_PARK_WINDOW_MS;\n\n const dispatchResult = await deps.agentDispatcher?.dispatch(counterpartyUserId, scope, dispatchPayload, { timeoutMs });\n\n if (dispatchResult?.handled === false && dispatchResult.reason === 'waiting') {\n // Counterparty's agent acknowledged — yield and wait\n await negotiationDatabase.updateTaskState(task.id, 'waiting_for_agent');\n\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, newTurnCount, timeoutMs);\n }\n\n return success({\n message: `${query.action === 'question' ? 'Question' : query.action === 'propose' ? 'Proposal' : 'Counter-proposal'} submitted. Waiting for counterparty response.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n waitingForAgent: true,\n });\n }\n\n let aiTurn: NegotiationTurn;\n\n if (dispatchResult?.handled === true) {\n // Dispatcher returned an agent turn directly\n aiTurn = dispatchResult.turn;\n } else {\n // No agent or timeout — run the system AI agent inline.\n // The agent honors a per-turn LLM timeout (AbortSignal), so invoke\n // can reject. Mirror the graph turnNode's reject-shaped fallback so\n // a timed-out or failed call degrades gracefully instead of leaving\n // the task pinned in `working` while the outer catch returns a bare\n // error to the user.\n await negotiationDatabase.updateTaskState(task.id, 'working');\n\n const agent = new IndexNegotiator();\n try {\n aiTurn = await agent.invoke({\n ownUser: ownUserCtx,\n otherUser: otherUserCtx,\n indexContext: { networkId: '' },\n seedAssessment,\n history: historyForDispatch,\n isFinalTurn,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n const errName = (err as { name?: string })?.name ?? '';\n const isTimeout = errName === 'TimeoutError' || /timeout|abort/i.test(errMsg);\n // Log the raw error for ops, but keep the persisted/returned\n // reasoning generic — this string round-trips back to the caller\n // via counterpartyResponse.reasoning and ends up in the negotiation\n // history visible through get_negotiation, so we don't want raw\n // provider messages (URLs, request IDs, internal stack hints) on\n // the wire.\n logger.warn('System negotiator inline invoke failed; treating as reject', {\n taskId: task.id,\n isTimeout,\n error: errMsg,\n });\n aiTurn = {\n action: 'reject',\n assessment: {\n reasoning: isTimeout\n ? 'Negotiator response timed out.'\n : 'Negotiator failed to produce a response.',\n suggestedRoles: { ownUser: 'peer', otherUser: 'peer' },\n },\n };\n }\n }\n\n // Persist the counterparty's turn (from dispatcher or inline AI)\n const aiSenderId = `agent:${counterpartyUserId}`;\n await negotiationDatabase.createMessage({\n conversationId: task.conversationId,\n senderId: aiSenderId,\n role: 'agent',\n parts: [{ kind: 'data' as const, data: aiTurn }],\n taskId: task.id,\n });\n\n const finalTurnCount = newTurnCount + 1;\n\n // Evaluate response\n if (aiTurn.action === 'accept' || aiTurn.action === 'reject') {\n const fullHistory = [...historyForDispatch, aiTurn];\n const outcome = buildNegotiationOutcome(fullHistory, finalTurnCount, aiTurn.action, meta.sourceUserId!, meta.candidateUserId!, counterpartySpeaker === 'source' ? 'candidate' : 'source');\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: outcome.hasOpportunity, turnCount: finalTurnCount },\n });\n\n return success({\n message: `${query.action === 'question' ? 'Question' : query.action === 'propose' ? 'Proposal' : 'Counter'} submitted. Counterparty responded with ${aiTurn.action}.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n outcome,\n });\n }\n\n // Counterparty countered/questioned — check if max turns reached\n if (finalTurnCount >= maxTurns) {\n const fullHistory = [...historyForDispatch, aiTurn];\n const outcome = buildNegotiationOutcome(fullHistory, finalTurnCount, 'counter', meta.sourceUserId!, meta.candidateUserId!, counterpartySpeaker === 'source' ? 'candidate' : 'source');\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: false, turnCount: finalTurnCount },\n });\n\n return success({\n message: 'Counterparty responded but max turns reached. Negotiation finalized.',\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n outcome,\n });\n }\n\n // Counterparty countered/questioned, now user's turn again — dispatch to user's agent\n const userDispatchPayload: NegotiationTurnPayload = {\n negotiationId: task.id,\n ownUser: { id: context.userId, intents: [], profile: {} },\n otherUser: { id: counterpartyUserId, intents: [], profile: {} },\n indexContext: { networkId: '' },\n seedAssessment,\n history: [...historyForDispatch, aiTurn],\n isFinalTurn: finalTurnCount + 1 >= maxTurns,\n isDiscoverer: true,\n };\n\n const userDispatchResult = await deps.agentDispatcher?.dispatch(context.userId, scope, userDispatchPayload, { timeoutMs });\n\n if (!userDispatchResult || (userDispatchResult.handled === false && userDispatchResult.reason === 'no_agent')) {\n // No agent for user — set back to waiting_for_agent so they can use respond_to_negotiation\n await negotiationDatabase.updateTaskState(task.id, 'waiting_for_agent');\n\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, finalTurnCount, timeoutMs);\n }\n\n return success({\n message: `${query.action === 'question' ? 'Question' : 'Counter'} submitted. Counterparty responded. Your turn to respond.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n waitingForAgent: true,\n });\n }\n\n if (userDispatchResult.handled === false && userDispatchResult.reason === 'waiting') {\n // User's agent acknowledged — yield and wait\n await negotiationDatabase.updateTaskState(task.id, 'waiting_for_agent');\n\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, finalTurnCount, timeoutMs);\n }\n\n return success({\n message: `${query.action === 'question' ? 'Question' : 'Counter'} submitted. Counterparty countered back. Waiting for your agent's response.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n waitingForAgent: true,\n });\n }\n\n if (userDispatchResult.handled === true) {\n // User's agent returned a turn directly — persist, evaluate, and continue\n const userAgentTurn: NegotiationTurn = userDispatchResult.turn;\n const userAgentSenderId = `agent:${context.userId}`;\n await negotiationDatabase.createMessage({\n conversationId: task.conversationId,\n senderId: userAgentSenderId,\n role: 'agent',\n parts: [{ kind: 'data' as const, data: userAgentTurn }],\n taskId: task.id,\n });\n\n const userTurnCount = finalTurnCount + 1;\n\n if (userAgentTurn.action === 'accept' || userAgentTurn.action === 'reject') {\n const fullHistory = [...historyForDispatch, aiTurn, userAgentTurn];\n const userSpeaker = isSource ? 'source' : 'candidate';\n const outcome = buildNegotiationOutcome(fullHistory, userTurnCount, userAgentTurn.action, meta.sourceUserId!, meta.candidateUserId!, userSpeaker === 'source' ? 'candidate' : 'source');\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: outcome.hasOpportunity, turnCount: userTurnCount },\n });\n\n return success({\n message: `Your agent ${userAgentTurn.action}ed the counterparty's response.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n outcome,\n });\n }\n\n if (userTurnCount >= maxTurns) {\n const fullHistory = [...historyForDispatch, aiTurn, userAgentTurn];\n const outcome = buildNegotiationOutcome(fullHistory, userTurnCount, 'counter', meta.sourceUserId!, meta.candidateUserId!, isSource ? 'candidate' : 'source');\n\n await negotiationDatabase.updateTaskState(task.id, 'completed');\n await negotiationDatabase.createArtifact({\n taskId: task.id,\n name: 'negotiation-outcome',\n parts: [{ kind: 'data', data: outcome }],\n metadata: { hasOpportunity: false, turnCount: userTurnCount },\n });\n\n return success({\n message: 'Your agent responded but max turns reached. Negotiation finalized.',\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n outcome,\n });\n }\n\n // User's agent countered/questioned — arm timeout for counterparty's next turn\n await negotiationDatabase.updateTaskState(task.id, 'waiting_for_agent');\n\n if (deps.negotiationTimeoutQueue) {\n await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, userTurnCount, timeoutMs);\n }\n\n return success({\n message: `Your agent responded with ${userAgentTurn.action}. Waiting for counterparty.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n waitingForAgent: true,\n });\n }\n\n // No agent / timeout — set back to working so graph can continue\n await negotiationDatabase.updateTaskState(task.id, 'working');\n\n return success({\n message: `${query.action === 'question' ? 'Question' : 'Counter'} submitted. Counterparty countered back. Negotiation continues.`,\n negotiationId: task.id,\n action: query.action,\n turnNumber: newTurnCount,\n counterpartyResponse: { action: aiTurn.action, reasoning: aiTurn.assessment.reasoning, message: aiTurn.message ?? null },\n });\n } catch (err) {\n logger.error('Failed to respond to negotiation', { err });\n return error('Failed to respond to negotiation. Please try again.');\n }\n },\n });\n\n return [list_negotiations, get_negotiation, respond_to_negotiation] as const;\n}\n\n/**\n * Build a NegotiationOutcome from the full turn history.\n * Mirrors the logic in the graph's finalizeNode for consistency.\n *\n * @param history - All negotiation turns\n * @param turnCount - Total number of turns\n * @param lastAction - The last turn's action (accept/reject/counter)\n * @param sourceUserId - Source user ID\n * @param candidateUserId - Candidate user ID\n * @param currentSpeaker - Who would speak next (the person after the accepter/rejector)\n */\nfunction buildNegotiationOutcome(\n history: NegotiationTurn[],\n turnCount: number,\n lastAction: string,\n sourceUserId: string,\n candidateUserId: string,\n currentSpeaker: string,\n): NegotiationOutcome {\n const hasOpportunity = lastAction === 'accept';\n const atCap = lastAction === 'counter';\n\n let agreedRoles: NegotiationOutcome['agreedRoles'] = [];\n if (hasOpportunity && history.length >= 2) {\n const acceptTurn = history[history.length - 1];\n const precedingTurn = history[history.length - 2];\n const accepterIsSource = currentSpeaker === 'candidate';\n const [sourceRole, candidateRole] = accepterIsSource\n ? [acceptTurn.assessment.suggestedRoles.ownUser, precedingTurn.assessment.suggestedRoles.ownUser]\n : [precedingTurn.assessment.suggestedRoles.ownUser, acceptTurn.assessment.suggestedRoles.ownUser];\n agreedRoles = [\n { userId: sourceUserId, role: sourceRole },\n { userId: candidateUserId, role: candidateRole },\n ];\n }\n\n return {\n hasOpportunity,\n agreedRoles,\n reasoning: history[history.length - 1]?.assessment.reasoning ?? '',\n turnCount,\n ...(atCap && { reason: 'turn_cap' }),\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"network.tools.d.ts","sourceRoot":"/","sources":["network/network.tools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAQ5E,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,gDA+mBxE"}
1
+ {"version":3,"file":"network.tools.d.ts","sourceRoot":"/","sources":["network/network.tools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAS5E,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,gDA2nBxE"}
@@ -2,6 +2,7 @@ import { z } from "zod";
2
2
  import { requestContext } from "../shared/observability/request-context.js";
3
3
  import { renderNetworkContext } from '../shared/network/metadata.renderer.js';
4
4
  import { success, error, UUID_REGEX } from "../shared/agent/tool.helpers.js";
5
+ import { focusedNetworkId, focusedNetworkLabel } from "../shared/agent/tool.scope.js";
5
6
  import { NetworkRecommender } from "./network.recommender.js";
6
7
  // Lazy singleton — only instantiated on first onboarding ranking call so that
7
8
  // importing this module does not require OPENROUTER_API_KEY at load time.
@@ -34,12 +35,14 @@ export function createNetworkTools(defineTool, deps) {
34
35
  if (query.userId && query.userId.trim() !== context.userId) {
35
36
  return error("You can only list your own indexes. Omit userId to see the current user's indexes.");
36
37
  }
38
+ const scopedNetworkId = focusedNetworkId(context);
39
+ const scopedIndexLabel = focusedNetworkLabel(context);
37
40
  const _readIndexGraphStart = Date.now();
38
41
  const _readIndexTraceEmitter = requestContext.getStore()?.traceEmitter;
39
42
  _readIndexTraceEmitter?.({ type: "graph_start", name: "index" });
40
43
  const result = await graphs.index.invoke({
41
44
  userId: context.userId,
42
- networkId: context.networkId || undefined,
45
+ networkId: scopedNetworkId,
43
46
  operationMode: 'read',
44
47
  showAll: false, // Never allow bypass - strict scope enforcement
45
48
  });
@@ -57,13 +60,13 @@ export function createNetworkTools(defineTool, deps) {
57
60
  ...(Array.isArray(rr.publicNetworks) ? { publicNetworks: enrichWithContext(rr.publicNetworks) } : {}),
58
61
  };
59
62
  // When scoped, add clear metadata so model knows results are limited
60
- if (context.networkId) {
63
+ if (scopedNetworkId) {
61
64
  return success({
62
65
  ...enriched,
63
66
  scopeRestriction: {
64
67
  isScoped: true,
65
- scopedToIndex: context.indexName ?? context.networkId,
66
- 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.`,
68
+ scopedToIndex: scopedIndexLabel,
69
+ message: `Results are limited to "${scopedIndexLabel}" because this chat is scoped to that community. The user may belong to other communities not shown here.`,
67
70
  },
68
71
  _graphTimings: [{ name: 'index', durationMs: _readIndexGraphMs, agents: result.agentTimings ?? [] }],
69
72
  });
@@ -163,6 +166,8 @@ export function createNetworkTools(defineTool, deps) {
163
166
  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."),
164
167
  }),
165
168
  handler: async ({ context, query }) => {
169
+ const scopedNetworkId = focusedNetworkId(context);
170
+ const scopedIndexLabel = focusedNetworkLabel(context);
166
171
  const networkId = query.networkId?.trim() || undefined;
167
172
  const userId = query.userId?.trim() || undefined;
168
173
  if (networkId && !UUID_REGEX.test(networkId)) {
@@ -171,8 +176,8 @@ export function createNetworkTools(defineTool, deps) {
171
176
  // Mode 1: list members of an index
172
177
  if (networkId && !userId) {
173
178
  // Enforce strict scope: when chat is index-scoped, only allow querying that index
174
- if (context.networkId && networkId !== context.networkId) {
175
- return error(`This chat is scoped to ${context.indexName ?? 'this index'}. You can only query members of this index.`);
179
+ if (scopedNetworkId && networkId !== scopedNetworkId) {
180
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only query members of this index.`);
176
181
  }
177
182
  const _readMembersGraphStart = Date.now();
178
183
  const _readMembersTraceEmitter = requestContext.getStore()?.traceEmitter;
@@ -201,8 +206,8 @@ export function createNetworkTools(defineTool, deps) {
201
206
  const callerMemberships = await userDb.getNetworkMemberships();
202
207
  if (networkId) {
203
208
  // Strict scope enforcement: when chat is index-scoped, only allow querying that index
204
- if (context.networkId && networkId !== context.networkId) {
205
- return error(`This chat is scoped to ${context.indexName ?? 'this index'}. You can only query membership in this community.`);
209
+ if (scopedNetworkId && networkId !== scopedNetworkId) {
210
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only query membership in this community.`);
206
211
  }
207
212
  const callerInIndex = callerMemberships.some((m) => m.networkId === networkId);
208
213
  if (!callerInIndex) {
@@ -217,29 +222,29 @@ export function createNetworkTools(defineTool, deps) {
217
222
  }
218
223
  else {
219
224
  // Strict scope enforcement: when chat is index-scoped, only check the scoped index
220
- if (context.networkId) {
221
- const isMember = await systemDb.isNetworkMember(context.networkId, targetUserId);
225
+ if (scopedNetworkId) {
226
+ const isMember = await systemDb.isNetworkMember(scopedNetworkId, targetUserId);
222
227
  if (isMember) {
223
228
  return success({
224
229
  isMember: true,
225
230
  userId: targetUserId,
226
- networkId: context.networkId,
231
+ networkId: scopedNetworkId,
227
232
  scopeRestriction: {
228
233
  isScoped: true,
229
- scopedToIndex: context.indexName ?? context.networkId,
230
- message: `This chat is scoped to "${context.indexName ?? 'this index'}". Only membership in this community is shown.`,
234
+ scopedToIndex: scopedIndexLabel,
235
+ message: `This chat is scoped to "${scopedIndexLabel}". Only membership in this community is shown.`,
231
236
  },
232
237
  });
233
238
  }
234
239
  return success({
235
240
  isMember: false,
236
241
  userId: targetUserId,
237
- networkId: context.networkId,
242
+ networkId: scopedNetworkId,
238
243
  message: "User is not a member of this community.",
239
244
  scopeRestriction: {
240
245
  isScoped: true,
241
- scopedToIndex: context.indexName ?? context.networkId,
242
- message: `This chat is scoped to "${context.indexName ?? 'this index'}". Only membership in this community was checked.`,
246
+ scopedToIndex: scopedIndexLabel,
247
+ message: `This chat is scoped to "${scopedIndexLabel}". Only membership in this community was checked.`,
243
248
  },
244
249
  });
245
250
  }
@@ -268,19 +273,18 @@ export function createNetworkTools(defineTool, deps) {
268
273
  else {
269
274
  // Own memberships - use userDb
270
275
  memberships = await userDb.getNetworkMemberships();
271
- // NOTE: context.networkId here is the *focus* of the scoped chat — it filters
272
- // what we show, not what we can reach. indexScope is the reach; the bound
273
- // network is one element of it. See IND-306 for the equivalent in read_intents.
276
+ // The scope envelope's network id is the focus of the scoped chat — it filters
277
+ // what we show, not what we can reach. Concrete reach is derived separately.
274
278
  // Strict scope enforcement: when chat is index-scoped, only return the scoped index membership
275
- if (context.networkId && !networkId) {
276
- memberships = memberships.filter((m) => m.networkId === context.networkId);
279
+ if (scopedNetworkId && !networkId) {
280
+ memberships = memberships.filter((m) => m.networkId === scopedNetworkId);
277
281
  }
278
282
  }
279
283
  // If both networkId and userId: filter to that specific membership
280
284
  if (networkId) {
281
285
  // Strict scope enforcement: when chat is index-scoped, only allow querying that index
282
- if (context.networkId && networkId !== context.networkId) {
283
- return error(`This chat is scoped to ${context.indexName ?? 'this index'}. You can only query membership in this community.`);
286
+ if (scopedNetworkId && networkId !== scopedNetworkId) {
287
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only query membership in this community.`);
284
288
  }
285
289
  const callerMemberships = await userDb.getNetworkMemberships();
286
290
  const callerInIndex = targetUserId === context.userId ||
@@ -302,7 +306,7 @@ export function createNetworkTools(defineTool, deps) {
302
306
  });
303
307
  }
304
308
  // When scoped, add clear metadata so model knows results are limited
305
- if (context.networkId && targetUserId === context.userId) {
309
+ if (scopedNetworkId && targetUserId === context.userId) {
306
310
  return success({
307
311
  userId: targetUserId,
308
312
  count: memberships.length,
@@ -314,8 +318,8 @@ export function createNetworkTools(defineTool, deps) {
314
318
  })),
315
319
  scopeRestriction: {
316
320
  isScoped: true,
317
- scopedToIndex: context.indexName ?? context.networkId,
318
- 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.`,
321
+ scopedToIndex: scopedIndexLabel,
322
+ message: `Results are limited to "${scopedIndexLabel}" because this chat is scoped to that community. The user may belong to other communities not shown here.`,
319
323
  },
320
324
  });
321
325
  }
@@ -353,13 +357,15 @@ export function createNetworkTools(defineTool, deps) {
353
357
  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."),
354
358
  }),
355
359
  handler: async ({ context, query }) => {
356
- const effectiveIndexId = (query.networkId?.trim() || context.networkId) ?? null;
360
+ const scopedNetworkId = focusedNetworkId(context);
361
+ const scopedIndexLabel = focusedNetworkLabel(context);
362
+ const effectiveIndexId = (query.networkId?.trim() || scopedNetworkId) ?? null;
357
363
  if (!effectiveIndexId || !UUID_REGEX.test(effectiveIndexId)) {
358
364
  return error("Valid networkId required.");
359
365
  }
360
366
  // Strict scope enforcement: when chat is index-scoped, only allow updating that index
361
- if (context.networkId && effectiveIndexId !== context.networkId) {
362
- return error(`This chat is scoped to ${context.indexName ?? 'this index'}. You can only update this community's settings.`);
367
+ if (scopedNetworkId && effectiveIndexId !== scopedNetworkId) {
368
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only update this community's settings.`);
363
369
  }
364
370
  const _updateNetworkGraphStart = Date.now();
365
371
  const _updateNetworkTraceEmitter = requestContext.getStore()?.traceEmitter;
@@ -437,13 +443,15 @@ export function createNetworkTools(defineTool, deps) {
437
443
  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."),
438
444
  }),
439
445
  handler: async ({ context, query }) => {
440
- const networkId = query.networkId?.trim() || context.networkId;
446
+ const scopedNetworkId = focusedNetworkId(context);
447
+ const scopedIndexLabel = focusedNetworkLabel(context);
448
+ const networkId = query.networkId?.trim() || scopedNetworkId;
441
449
  if (!networkId || !UUID_REGEX.test(networkId)) {
442
450
  return error("Valid networkId required.");
443
451
  }
444
452
  // Strict scope enforcement: when chat is index-scoped, only allow deleting that index
445
- if (context.networkId && networkId !== context.networkId) {
446
- return error(`This chat is scoped to ${context.indexName ?? 'this index'}. You can only delete this community.`);
453
+ if (scopedNetworkId && networkId !== scopedNetworkId) {
454
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only delete this community.`);
447
455
  }
448
456
  const _deleteNetworkGraphStart = Date.now();
449
457
  const _deleteNetworkTraceEmitter = requestContext.getStore()?.traceEmitter;
@@ -476,14 +484,16 @@ export function createNetworkTools(defineTool, deps) {
476
484
  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."),
477
485
  }),
478
486
  handler: async ({ context, query }) => {
479
- const networkId = query.networkId?.trim() || context.networkId;
487
+ const scopedNetworkId = focusedNetworkId(context);
488
+ const scopedIndexLabel = focusedNetworkLabel(context);
489
+ const networkId = query.networkId?.trim() || scopedNetworkId;
480
490
  const targetUserId = query.userId?.trim() || context.userId;
481
491
  if (!networkId || !UUID_REGEX.test(networkId)) {
482
492
  return error("Invalid index ID format. Use the exact UUID from read_networks.");
483
493
  }
484
494
  // Strict scope enforcement: when chat is index-scoped, only allow adding to that index
485
- if (context.networkId && networkId !== context.networkId) {
486
- return error(`This chat is scoped to ${context.indexName ?? 'this index'}. You can only add members to this community.`);
495
+ if (scopedNetworkId && networkId !== scopedNetworkId) {
496
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only add members to this community.`);
487
497
  }
488
498
  const _createMembershipGraphStart = Date.now();
489
499
  const _createMembershipTraceEmitter = requestContext.getStore()?.traceEmitter;
@@ -523,7 +533,9 @@ export function createNetworkTools(defineTool, deps) {
523
533
  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."),
524
534
  }),
525
535
  handler: async ({ context, query }) => {
526
- const networkId = query.networkId?.trim() || context.networkId;
536
+ const scopedNetworkId = focusedNetworkId(context);
537
+ const scopedIndexLabel = focusedNetworkLabel(context);
538
+ const networkId = query.networkId?.trim() || scopedNetworkId;
527
539
  const targetUserId = query.userId?.trim();
528
540
  if (!networkId || !UUID_REGEX.test(networkId)) {
529
541
  return error("Valid networkId required. Use the exact UUID from read_networks.");
@@ -532,8 +544,8 @@ export function createNetworkTools(defineTool, deps) {
532
544
  return error("userId is required.");
533
545
  }
534
546
  // Strict scope enforcement: when chat is index-scoped, only allow that index
535
- if (context.networkId && networkId !== context.networkId) {
536
- return error(`This chat is scoped to ${context.indexName ?? 'this index'}. You can only manage members of this community.`);
547
+ if (scopedNetworkId && networkId !== scopedNetworkId) {
548
+ return error(`This chat is scoped to ${scopedIndexLabel}. You can only manage members of this community.`);
537
549
  }
538
550
  const _deleteMembershipGraphStart = Date.now();
539
551
  const _deleteMembershipTraceEmitter = requestContext.getStore()?.traceEmitter;