@indexnetwork/protocol 0.3.3 → 0.4.0-rc.12.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.
- package/README.md +8 -3
- package/dist/contact/contact.tools.d.ts.map +1 -1
- package/dist/contact/contact.tools.js +37 -22
- package/dist/contact/contact.tools.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integration/integration.tools.d.ts.map +1 -1
- package/dist/integration/integration.tools.js +10 -8
- package/dist/integration/integration.tools.js.map +1 -1
- package/dist/intent/intent.tools.d.ts.map +1 -1
- package/dist/intent/intent.tools.js +112 -23
- package/dist/intent/intent.tools.js.map +1 -1
- package/dist/mcp/mcp.server.d.ts.map +1 -1
- package/dist/mcp/mcp.server.js +2 -1
- package/dist/mcp/mcp.server.js.map +1 -1
- package/dist/negotiation/negotiation.graph.d.ts +37 -1
- package/dist/negotiation/negotiation.graph.d.ts.map +1 -1
- package/dist/negotiation/negotiation.graph.js +48 -6
- package/dist/negotiation/negotiation.graph.js.map +1 -1
- package/dist/negotiation/negotiation.state.d.ts +12 -0
- package/dist/negotiation/negotiation.state.d.ts.map +1 -1
- package/dist/negotiation/negotiation.state.js +16 -0
- package/dist/negotiation/negotiation.state.js.map +1 -1
- package/dist/negotiation/negotiation.tools.d.ts +7 -0
- package/dist/negotiation/negotiation.tools.d.ts.map +1 -0
- package/dist/negotiation/negotiation.tools.js +547 -0
- package/dist/negotiation/negotiation.tools.js.map +1 -0
- package/dist/network/network.tools.d.ts.map +1 -1
- package/dist/network/network.tools.js +65 -21
- package/dist/network/network.tools.js.map +1 -1
- package/dist/opportunity/opportunity.graph.d.ts.map +1 -1
- package/dist/opportunity/opportunity.graph.js +4 -2
- package/dist/opportunity/opportunity.graph.js.map +1 -1
- package/dist/opportunity/opportunity.tools.d.ts.map +1 -1
- package/dist/opportunity/opportunity.tools.js +50 -26
- package/dist/opportunity/opportunity.tools.js.map +1 -1
- package/dist/profile/profile.graph.d.ts +12 -12
- package/dist/profile/profile.graph.d.ts.map +1 -1
- package/dist/profile/profile.graph.js +22 -15
- package/dist/profile/profile.graph.js.map +1 -1
- package/dist/profile/profile.tools.d.ts.map +1 -1
- package/dist/profile/profile.tools.js +50 -18
- package/dist/profile/profile.tools.js.map +1 -1
- package/dist/shared/agent/tool.factory.d.ts.map +1 -1
- package/dist/shared/agent/tool.factory.js +12 -1
- package/dist/shared/agent/tool.factory.js.map +1 -1
- package/dist/shared/agent/tool.helpers.d.ts +22 -0
- package/dist/shared/agent/tool.helpers.d.ts.map +1 -1
- package/dist/shared/agent/tool.helpers.js.map +1 -1
- package/dist/shared/agent/tool.registry.d.ts.map +1 -1
- package/dist/shared/agent/tool.registry.js +4 -0
- package/dist/shared/agent/tool.registry.js.map +1 -1
- package/dist/shared/agent/utility.tools.d.ts.map +1 -1
- package/dist/shared/agent/utility.tools.js +215 -46
- package/dist/shared/agent/utility.tools.js.map +1 -1
- package/dist/shared/interfaces/database.interface.d.ts +52 -0
- package/dist/shared/interfaces/database.interface.d.ts.map +1 -1
- package/dist/shared/interfaces/negotiation-events.interface.d.ts +58 -0
- package/dist/shared/interfaces/negotiation-events.interface.d.ts.map +1 -0
- package/dist/shared/interfaces/negotiation-events.interface.js +7 -0
- package/dist/shared/interfaces/negotiation-events.interface.js.map +1 -0
- package/dist/shared/interfaces/webhook.interface.d.ts +25 -0
- package/dist/shared/interfaces/webhook.interface.d.ts.map +1 -0
- package/dist/shared/interfaces/webhook.interface.js +2 -0
- package/dist/shared/interfaces/webhook.interface.js.map +1 -0
- package/dist/webhook/webhook.tools.d.ts +7 -0
- package/dist/webhook/webhook.tools.d.ts.map +1 -0
- package/dist/webhook/webhook.tools.js +127 -0
- package/dist/webhook/webhook.tools.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { success, error } from '../shared/agent/tool.helpers.js';
|
|
3
|
+
import { NegotiationProposer } from './negotiation.proposer.js';
|
|
4
|
+
import { NegotiationResponder } from './negotiation.responder.js';
|
|
5
|
+
import { protocolLogger } from '../shared/observability/protocol.logger.js';
|
|
6
|
+
const logger = protocolLogger('NegotiationTools');
|
|
7
|
+
/**
|
|
8
|
+
* Creates negotiation MCP tools for external agent access.
|
|
9
|
+
* Exposes negotiation state for listing, reading, and responding to bilateral negotiations.
|
|
10
|
+
*/
|
|
11
|
+
export function createNegotiationTools(defineTool, deps) {
|
|
12
|
+
const { negotiationDatabase } = deps;
|
|
13
|
+
const list_negotiations = defineTool({
|
|
14
|
+
name: 'list_negotiations',
|
|
15
|
+
description: 'List bilateral negotiations the authenticated user is involved in, either as the source (initiator) or candidate (responder). ' +
|
|
16
|
+
'Negotiations are turn-based exchanges where two AI agents negotiate on behalf of their users to determine if there is a ' +
|
|
17
|
+
'mutual opportunity for collaboration.\n\n' +
|
|
18
|
+
'**Statuses:**\n' +
|
|
19
|
+
'- `active` — Negotiation is in progress, agents are exchanging turns.\n' +
|
|
20
|
+
'- `waiting_for_external` — The graph has yielded and is waiting for an external response (e.g. from the user via respond_to_negotiation) or a timeout.\n' +
|
|
21
|
+
'- `completed` — Negotiation has concluded (accepted, rejected, or reached turn cap).\n\n' +
|
|
22
|
+
'**When to use:** To see ongoing and past negotiations, check which negotiations need attention, ' +
|
|
23
|
+
'or find a negotiation ID for get_negotiation or respond_to_negotiation.',
|
|
24
|
+
querySchema: z.object({
|
|
25
|
+
status: z.enum(['active', 'waiting_for_external', 'completed', 'all']).optional()
|
|
26
|
+
.describe('Filter by negotiation status. Omit or use "all" to return all negotiations.'),
|
|
27
|
+
}),
|
|
28
|
+
handler: async ({ context, query }) => {
|
|
29
|
+
try {
|
|
30
|
+
// Map tool status filter to task state query
|
|
31
|
+
const stateFilter = query.status && query.status !== 'all' ? query.status : undefined;
|
|
32
|
+
// For 'active', query 'working' state tasks
|
|
33
|
+
const dbState = stateFilter === 'active' ? 'working'
|
|
34
|
+
: stateFilter === 'waiting_for_external' ? 'waiting_for_external'
|
|
35
|
+
: stateFilter === 'completed' ? 'completed'
|
|
36
|
+
: undefined;
|
|
37
|
+
const tasks = await negotiationDatabase.getTasksForUser(context.userId, dbState ? { state: dbState } : undefined);
|
|
38
|
+
const negotiations = await Promise.all(tasks.map(async (task) => {
|
|
39
|
+
const meta = task.metadata;
|
|
40
|
+
if (meta?.type !== 'negotiation')
|
|
41
|
+
return null;
|
|
42
|
+
const isSource = meta.sourceUserId === context.userId;
|
|
43
|
+
const counterpartyId = isSource ? meta.candidateUserId : meta.sourceUserId;
|
|
44
|
+
// Get latest message for preview
|
|
45
|
+
const messages = await negotiationDatabase.getMessagesForConversation(task.conversationId);
|
|
46
|
+
const lastMessage = messages[messages.length - 1];
|
|
47
|
+
const lastTurnData = lastMessage
|
|
48
|
+
? lastMessage.parts?.find(p => p.kind === 'data')?.data
|
|
49
|
+
: undefined;
|
|
50
|
+
// Determine whose turn it is based on message count (alternating source/candidate)
|
|
51
|
+
const turnCount = messages.length;
|
|
52
|
+
const currentSpeaker = turnCount % 2 === 0 ? 'source' : 'candidate';
|
|
53
|
+
const isUsersTurn = (isSource && currentSpeaker === 'source') || (!isSource && currentSpeaker === 'candidate');
|
|
54
|
+
// Map task state to tool status
|
|
55
|
+
const status = task.state === 'working' ? 'active'
|
|
56
|
+
: task.state === 'waiting_for_external' ? 'waiting_for_external'
|
|
57
|
+
: task.state === 'completed' ? 'completed'
|
|
58
|
+
: task.state;
|
|
59
|
+
return {
|
|
60
|
+
id: task.id,
|
|
61
|
+
counterpartyId: counterpartyId ?? 'unknown',
|
|
62
|
+
role: isSource ? 'source' : 'candidate',
|
|
63
|
+
turnCount,
|
|
64
|
+
status,
|
|
65
|
+
isUsersTurn,
|
|
66
|
+
latestAction: lastTurnData?.action ?? null,
|
|
67
|
+
latestMessagePreview: lastTurnData?.assessment?.reasoning
|
|
68
|
+
? lastTurnData.assessment.reasoning.substring(0, 150) + (lastTurnData.assessment.reasoning.length > 150 ? '...' : '')
|
|
69
|
+
: null,
|
|
70
|
+
createdAt: task.createdAt,
|
|
71
|
+
updatedAt: task.updatedAt,
|
|
72
|
+
};
|
|
73
|
+
}));
|
|
74
|
+
const filtered = negotiations.filter(Boolean);
|
|
75
|
+
return success({
|
|
76
|
+
count: filtered.length,
|
|
77
|
+
negotiations: filtered,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
return error(`Failed to list negotiations: ${err instanceof Error ? err.message : String(err)}`);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
const get_negotiation = defineTool({
|
|
86
|
+
name: 'get_negotiation',
|
|
87
|
+
description: 'Get the full details of a specific negotiation, including all turns, messages, counterparty info, and current state. ' +
|
|
88
|
+
'Negotiations are bilateral exchanges where two AI agents negotiate on behalf of users. Each turn contains an action ' +
|
|
89
|
+
'(propose, accept, reject, counter) and an assessment with a fit score, reasoning, and suggested roles.\n\n' +
|
|
90
|
+
'**Access control:** You must be a party to the negotiation (source or candidate) to view it.\n\n' +
|
|
91
|
+
'**When to use:** To review the full negotiation history before responding, to understand why a negotiation was ' +
|
|
92
|
+
'accepted or rejected, or to see the current state of an active negotiation.',
|
|
93
|
+
querySchema: z.object({
|
|
94
|
+
negotiationId: z.string().describe('The negotiation task ID (from list_negotiations results).'),
|
|
95
|
+
}),
|
|
96
|
+
handler: async ({ context, query }) => {
|
|
97
|
+
try {
|
|
98
|
+
const task = await negotiationDatabase.getTask(query.negotiationId);
|
|
99
|
+
if (!task) {
|
|
100
|
+
return error('Negotiation not found.');
|
|
101
|
+
}
|
|
102
|
+
const meta = task.metadata;
|
|
103
|
+
if (meta?.type !== 'negotiation') {
|
|
104
|
+
return error('Negotiation not found.');
|
|
105
|
+
}
|
|
106
|
+
// Access control: user must be source or candidate
|
|
107
|
+
const isSource = meta.sourceUserId === context.userId;
|
|
108
|
+
const isCandidate = meta.candidateUserId === context.userId;
|
|
109
|
+
if (!isSource && !isCandidate) {
|
|
110
|
+
return error('Access denied: you are not a party to this negotiation.');
|
|
111
|
+
}
|
|
112
|
+
const counterpartyId = isSource ? meta.candidateUserId : meta.sourceUserId;
|
|
113
|
+
// Load messages and artifacts
|
|
114
|
+
const [messages, artifacts] = await Promise.all([
|
|
115
|
+
negotiationDatabase.getMessagesForConversation(task.conversationId),
|
|
116
|
+
negotiationDatabase.getArtifactsForTask(task.id),
|
|
117
|
+
]);
|
|
118
|
+
// Parse turns from messages
|
|
119
|
+
const turns = messages.map((m, idx) => {
|
|
120
|
+
const dataPart = m.parts?.find(p => p.kind === 'data');
|
|
121
|
+
const turnData = dataPart?.data;
|
|
122
|
+
const turnNumber = idx + 1;
|
|
123
|
+
const speaker = turnNumber % 2 === 1 ? 'source' : 'candidate';
|
|
124
|
+
return {
|
|
125
|
+
turnNumber,
|
|
126
|
+
speaker,
|
|
127
|
+
senderId: m.senderId,
|
|
128
|
+
action: turnData?.action ?? 'unknown',
|
|
129
|
+
fitScore: turnData?.assessment?.fitScore ?? null,
|
|
130
|
+
reasoning: turnData?.assessment?.reasoning ?? null,
|
|
131
|
+
suggestedRoles: turnData?.assessment?.suggestedRoles ?? null,
|
|
132
|
+
createdAt: m.createdAt,
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
// Extract outcome from artifacts if completed
|
|
136
|
+
const outcomeArtifact = artifacts.find(a => a.name === 'negotiation-outcome');
|
|
137
|
+
const outcome = outcomeArtifact
|
|
138
|
+
? outcomeArtifact.parts?.find(p => p.kind === 'data')?.data
|
|
139
|
+
: null;
|
|
140
|
+
// Determine whose turn it is
|
|
141
|
+
const turnCount = messages.length;
|
|
142
|
+
const currentSpeaker = turnCount % 2 === 0 ? 'source' : 'candidate';
|
|
143
|
+
const isUsersTurn = (isSource && currentSpeaker === 'source') || (!isSource && currentSpeaker === 'candidate');
|
|
144
|
+
const status = task.state === 'working' ? 'active'
|
|
145
|
+
: task.state === 'waiting_for_external' ? 'waiting_for_external'
|
|
146
|
+
: task.state === 'completed' ? 'completed'
|
|
147
|
+
: task.state;
|
|
148
|
+
return success({
|
|
149
|
+
id: task.id,
|
|
150
|
+
conversationId: task.conversationId,
|
|
151
|
+
status,
|
|
152
|
+
role: isSource ? 'source' : 'candidate',
|
|
153
|
+
counterpartyId: counterpartyId ?? 'unknown',
|
|
154
|
+
turnCount,
|
|
155
|
+
isUsersTurn,
|
|
156
|
+
turns,
|
|
157
|
+
outcome,
|
|
158
|
+
createdAt: task.createdAt,
|
|
159
|
+
updatedAt: task.updatedAt,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
return error(`Failed to get negotiation: ${err instanceof Error ? err.message : String(err)}`);
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
const respond_to_negotiation = defineTool({
|
|
168
|
+
name: 'respond_to_negotiation',
|
|
169
|
+
description: 'Respond to a negotiation that is waiting for external input. This tool allows users to influence the negotiation ' +
|
|
170
|
+
'by accepting, rejecting, or countering the current proposal.\n\n' +
|
|
171
|
+
'**Turn-based model:** Negotiations alternate between source and candidate agents. When the graph yields with ' +
|
|
172
|
+
'`waiting_for_external` status, the user whose turn it is can respond.\n\n' +
|
|
173
|
+
'**Valid actions:**\n' +
|
|
174
|
+
'- `accept` — Accept the current proposal. The negotiation will be finalized as an opportunity.\n' +
|
|
175
|
+
'- `reject` — Reject the current proposal. The negotiation will end without creating an opportunity.\n' +
|
|
176
|
+
'- `counter` — Counter the proposal with a message (message is required for counter). The negotiation will continue.\n\n' +
|
|
177
|
+
'**What happens after:** Accept/reject finalizes the negotiation immediately. Counter continues the negotiation — ' +
|
|
178
|
+
'if the counterparty has an external agent, the negotiation yields again; otherwise the AI agent responds inline.',
|
|
179
|
+
querySchema: z.object({
|
|
180
|
+
negotiationId: z.string().describe('The negotiation task ID to respond to.'),
|
|
181
|
+
action: z.enum(['accept', 'reject', 'counter']).describe('The response action: accept the proposal, reject it, or counter with a new message.'),
|
|
182
|
+
message: z.string().optional().describe('Required for "counter" action. Your counter-proposal message explaining what you want to change.'),
|
|
183
|
+
fitScore: z.number().min(0).max(100).optional().describe('Optional fit score (0-100) for your assessment. Defaults to 100 for accept, 0 for reject, 50 for counter.'),
|
|
184
|
+
}),
|
|
185
|
+
handler: async ({ context, query }) => {
|
|
186
|
+
try {
|
|
187
|
+
const task = await negotiationDatabase.getTask(query.negotiationId);
|
|
188
|
+
if (!task) {
|
|
189
|
+
return error('Negotiation not found.');
|
|
190
|
+
}
|
|
191
|
+
const meta = task.metadata;
|
|
192
|
+
if (meta?.type !== 'negotiation') {
|
|
193
|
+
return error('Negotiation not found.');
|
|
194
|
+
}
|
|
195
|
+
// Validate negotiation is waiting for external input
|
|
196
|
+
if (task.state !== 'waiting_for_external') {
|
|
197
|
+
return error(`Negotiation is not waiting for a response. Current status: ${task.state}`);
|
|
198
|
+
}
|
|
199
|
+
// Access control: user must be a party
|
|
200
|
+
const isSource = meta.sourceUserId === context.userId;
|
|
201
|
+
const isCandidate = meta.candidateUserId === context.userId;
|
|
202
|
+
if (!isSource && !isCandidate) {
|
|
203
|
+
return error('Access denied: you are not a party to this negotiation.');
|
|
204
|
+
}
|
|
205
|
+
// Determine whose turn it is
|
|
206
|
+
const messages = await negotiationDatabase.getMessagesForConversation(task.conversationId);
|
|
207
|
+
const turnCount = messages.length;
|
|
208
|
+
const currentSpeaker = turnCount % 2 === 0 ? 'source' : 'candidate';
|
|
209
|
+
const isUsersTurn = (isSource && currentSpeaker === 'source') || (!isSource && currentSpeaker === 'candidate');
|
|
210
|
+
if (!isUsersTurn) {
|
|
211
|
+
return error('It is not your turn to respond in this negotiation.');
|
|
212
|
+
}
|
|
213
|
+
// Validate counter has a message
|
|
214
|
+
if (query.action === 'counter' && !query.message?.trim()) {
|
|
215
|
+
return error('A message is required when countering a proposal. Explain what you want to change.');
|
|
216
|
+
}
|
|
217
|
+
// ── Cancel pending timeout ──
|
|
218
|
+
if (deps.negotiationTimeoutQueue) {
|
|
219
|
+
await deps.negotiationTimeoutQueue.cancelTimeout(task.id);
|
|
220
|
+
}
|
|
221
|
+
// ── Build and persist the external agent's turn ──
|
|
222
|
+
const defaultFitScore = query.action === 'accept' ? 100 : query.action === 'reject' ? 0 : 50;
|
|
223
|
+
const turnData = {
|
|
224
|
+
action: query.action,
|
|
225
|
+
assessment: {
|
|
226
|
+
fitScore: query.fitScore ?? defaultFitScore,
|
|
227
|
+
reasoning: query.message ?? `User ${query.action}ed the proposal.`,
|
|
228
|
+
suggestedRoles: { ownUser: 'peer', otherUser: 'peer' },
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
const senderId = `agent:${context.userId}`;
|
|
232
|
+
const turnMessage = await negotiationDatabase.createMessage({
|
|
233
|
+
conversationId: task.conversationId,
|
|
234
|
+
senderId,
|
|
235
|
+
role: 'agent',
|
|
236
|
+
parts: [{ kind: 'data', data: turnData }],
|
|
237
|
+
taskId: task.id,
|
|
238
|
+
});
|
|
239
|
+
const newTurnCount = turnCount + 1;
|
|
240
|
+
// ── Handle accept/reject: finalize immediately ──
|
|
241
|
+
if (query.action === 'accept' || query.action === 'reject') {
|
|
242
|
+
const allMessages = [...messages, { id: turnMessage.id, senderId: turnMessage.senderId, role: turnMessage.role, parts: turnMessage.parts, createdAt: turnMessage.createdAt }];
|
|
243
|
+
const history = allMessages.map(m => {
|
|
244
|
+
const dp = m.parts?.find(p => p.kind === 'data');
|
|
245
|
+
return dp?.data;
|
|
246
|
+
}).filter(Boolean);
|
|
247
|
+
const nextSpeaker = currentSpeaker === 'source' ? 'candidate' : 'source';
|
|
248
|
+
const outcome = buildNegotiationOutcome(history, newTurnCount, query.action, meta.sourceUserId, meta.candidateUserId, nextSpeaker);
|
|
249
|
+
await negotiationDatabase.updateTaskState(task.id, 'completed');
|
|
250
|
+
await negotiationDatabase.createArtifact({
|
|
251
|
+
taskId: task.id,
|
|
252
|
+
name: 'negotiation-outcome',
|
|
253
|
+
parts: [{ kind: 'data', data: outcome }],
|
|
254
|
+
metadata: { hasOpportunity: outcome.hasOpportunity, turnCount: newTurnCount },
|
|
255
|
+
});
|
|
256
|
+
// Emit completed event for both parties
|
|
257
|
+
if (deps.negotiationEvents) {
|
|
258
|
+
const outcomeStr = query.action === 'accept' ? 'accepted' : 'rejected';
|
|
259
|
+
deps.negotiationEvents.emitCompleted({
|
|
260
|
+
negotiationId: task.id,
|
|
261
|
+
userId: meta.sourceUserId,
|
|
262
|
+
outcome: outcomeStr,
|
|
263
|
+
finalScore: outcome.finalScore,
|
|
264
|
+
turnCount: newTurnCount,
|
|
265
|
+
});
|
|
266
|
+
deps.negotiationEvents.emitCompleted({
|
|
267
|
+
negotiationId: task.id,
|
|
268
|
+
userId: meta.candidateUserId,
|
|
269
|
+
outcome: outcomeStr,
|
|
270
|
+
finalScore: outcome.finalScore,
|
|
271
|
+
turnCount: newTurnCount,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
return success({
|
|
275
|
+
message: query.action === 'accept'
|
|
276
|
+
? 'Negotiation accepted. An opportunity has been created.'
|
|
277
|
+
: 'Negotiation rejected.',
|
|
278
|
+
negotiationId: task.id,
|
|
279
|
+
action: query.action,
|
|
280
|
+
turnNumber: newTurnCount,
|
|
281
|
+
outcome,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
// ── Handle counter: check if under max turns ──
|
|
285
|
+
const maxTurns = 6; // Default max turns (matches graph default)
|
|
286
|
+
if (newTurnCount >= maxTurns) {
|
|
287
|
+
// Max turns reached — finalize with turn_cap
|
|
288
|
+
const allMessages = [...messages, { id: turnMessage.id, senderId: turnMessage.senderId, role: turnMessage.role, parts: turnMessage.parts, createdAt: turnMessage.createdAt }];
|
|
289
|
+
const history = allMessages.map(m => {
|
|
290
|
+
const dp = m.parts?.find(p => p.kind === 'data');
|
|
291
|
+
return dp?.data;
|
|
292
|
+
}).filter(Boolean);
|
|
293
|
+
const nextSpeakerForCap = currentSpeaker === 'source' ? 'candidate' : 'source';
|
|
294
|
+
const outcome = buildNegotiationOutcome(history, newTurnCount, 'counter', meta.sourceUserId, meta.candidateUserId, nextSpeakerForCap);
|
|
295
|
+
await negotiationDatabase.updateTaskState(task.id, 'completed');
|
|
296
|
+
await negotiationDatabase.createArtifact({
|
|
297
|
+
taskId: task.id,
|
|
298
|
+
name: 'negotiation-outcome',
|
|
299
|
+
parts: [{ kind: 'data', data: outcome }],
|
|
300
|
+
metadata: { hasOpportunity: false, turnCount: newTurnCount },
|
|
301
|
+
});
|
|
302
|
+
if (deps.negotiationEvents) {
|
|
303
|
+
deps.negotiationEvents.emitCompleted({
|
|
304
|
+
negotiationId: task.id,
|
|
305
|
+
userId: meta.sourceUserId,
|
|
306
|
+
outcome: 'turn_cap',
|
|
307
|
+
finalScore: 0,
|
|
308
|
+
turnCount: newTurnCount,
|
|
309
|
+
});
|
|
310
|
+
deps.negotiationEvents.emitCompleted({
|
|
311
|
+
negotiationId: task.id,
|
|
312
|
+
userId: meta.candidateUserId,
|
|
313
|
+
outcome: 'turn_cap',
|
|
314
|
+
finalScore: 0,
|
|
315
|
+
turnCount: newTurnCount,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
return success({
|
|
319
|
+
message: 'Maximum turns reached. Negotiation finalized without opportunity.',
|
|
320
|
+
negotiationId: task.id,
|
|
321
|
+
action: 'counter',
|
|
322
|
+
turnNumber: newTurnCount,
|
|
323
|
+
outcome,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
// ── Counter under max turns: determine counterparty's next turn ──
|
|
327
|
+
const counterpartyUserId = isSource ? meta.candidateUserId : meta.sourceUserId;
|
|
328
|
+
const counterpartySpeaker = isSource ? 'candidate' : 'source';
|
|
329
|
+
// Check if counterparty has an external agent
|
|
330
|
+
const counterpartyHasWebhook = deps.webhookLookup
|
|
331
|
+
? await deps.webhookLookup.hasWebhookForEvent(counterpartyUserId, 'negotiation.turn_received')
|
|
332
|
+
: false;
|
|
333
|
+
if (counterpartyHasWebhook) {
|
|
334
|
+
// Yield again for the counterparty's external agent
|
|
335
|
+
await negotiationDatabase.updateTaskState(task.id, 'waiting_for_external');
|
|
336
|
+
const deadline = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();
|
|
337
|
+
if (deps.negotiationEvents) {
|
|
338
|
+
deps.negotiationEvents.emitTurnReceived({
|
|
339
|
+
negotiationId: task.id,
|
|
340
|
+
userId: counterpartyUserId,
|
|
341
|
+
turnNumber: newTurnCount + 1,
|
|
342
|
+
counterpartyAction: 'counter',
|
|
343
|
+
counterpartyMessage: query.message,
|
|
344
|
+
deadline,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
if (deps.negotiationTimeoutQueue) {
|
|
348
|
+
await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, newTurnCount, 24 * 60 * 60 * 1000);
|
|
349
|
+
}
|
|
350
|
+
return success({
|
|
351
|
+
message: 'Counter-proposal submitted. Waiting for counterparty response.',
|
|
352
|
+
negotiationId: task.id,
|
|
353
|
+
action: 'counter',
|
|
354
|
+
turnNumber: newTurnCount,
|
|
355
|
+
waitingForExternal: true,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
// ── No external agent for counterparty: run AI agent inline ──
|
|
359
|
+
await negotiationDatabase.updateTaskState(task.id, 'working');
|
|
360
|
+
const allMessages = [...messages, { id: turnMessage.id, senderId: turnMessage.senderId, role: turnMessage.role, parts: turnMessage.parts, createdAt: turnMessage.createdAt }];
|
|
361
|
+
const history = allMessages.map(m => {
|
|
362
|
+
const dp = m.parts?.find(p => p.kind === 'data');
|
|
363
|
+
return dp?.data;
|
|
364
|
+
}).filter(Boolean);
|
|
365
|
+
// Build user contexts from task metadata for AI agent invocation
|
|
366
|
+
// Note: we use minimal context here since we don't have full user profiles in the tool.
|
|
367
|
+
// The AI agent will work with the history which contains all the reasoning.
|
|
368
|
+
const counterpartyIsSource = counterpartySpeaker === 'source';
|
|
369
|
+
const agent = counterpartyIsSource ? new NegotiationProposer() : new NegotiationResponder();
|
|
370
|
+
const ownUserCtx = { id: counterpartyUserId, intents: [], profile: {} };
|
|
371
|
+
const otherUserCtx = { id: context.userId, intents: [], profile: {} };
|
|
372
|
+
const seedAssessment = { score: 50, reasoning: 'Continued negotiation', valencyRole: 'peer' };
|
|
373
|
+
const aiTurn = await agent.invoke({
|
|
374
|
+
ownUser: ownUserCtx,
|
|
375
|
+
otherUser: otherUserCtx,
|
|
376
|
+
indexContext: { networkId: '', prompt: '' },
|
|
377
|
+
seedAssessment,
|
|
378
|
+
history,
|
|
379
|
+
});
|
|
380
|
+
// Persist AI turn
|
|
381
|
+
const aiSenderId = `agent:${counterpartyUserId}`;
|
|
382
|
+
await negotiationDatabase.createMessage({
|
|
383
|
+
conversationId: task.conversationId,
|
|
384
|
+
senderId: aiSenderId,
|
|
385
|
+
role: 'agent',
|
|
386
|
+
parts: [{ kind: 'data', data: aiTurn }],
|
|
387
|
+
taskId: task.id,
|
|
388
|
+
});
|
|
389
|
+
const finalTurnCount = newTurnCount + 1;
|
|
390
|
+
// Evaluate AI response
|
|
391
|
+
if (aiTurn.action === 'accept' || aiTurn.action === 'reject') {
|
|
392
|
+
const fullHistory = [...history, aiTurn];
|
|
393
|
+
const outcome = buildNegotiationOutcome(fullHistory, finalTurnCount, aiTurn.action, meta.sourceUserId, meta.candidateUserId, counterpartySpeaker === 'source' ? 'candidate' : 'source');
|
|
394
|
+
await negotiationDatabase.updateTaskState(task.id, 'completed');
|
|
395
|
+
await negotiationDatabase.createArtifact({
|
|
396
|
+
taskId: task.id,
|
|
397
|
+
name: 'negotiation-outcome',
|
|
398
|
+
parts: [{ kind: 'data', data: outcome }],
|
|
399
|
+
metadata: { hasOpportunity: outcome.hasOpportunity, turnCount: finalTurnCount },
|
|
400
|
+
});
|
|
401
|
+
if (deps.negotiationEvents) {
|
|
402
|
+
const outcomeStr = aiTurn.action === 'accept' ? 'accepted' : 'rejected';
|
|
403
|
+
deps.negotiationEvents.emitCompleted({
|
|
404
|
+
negotiationId: task.id,
|
|
405
|
+
userId: meta.sourceUserId,
|
|
406
|
+
outcome: outcomeStr,
|
|
407
|
+
finalScore: outcome.finalScore,
|
|
408
|
+
turnCount: finalTurnCount,
|
|
409
|
+
});
|
|
410
|
+
deps.negotiationEvents.emitCompleted({
|
|
411
|
+
negotiationId: task.id,
|
|
412
|
+
userId: meta.candidateUserId,
|
|
413
|
+
outcome: outcomeStr,
|
|
414
|
+
finalScore: outcome.finalScore,
|
|
415
|
+
turnCount: finalTurnCount,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
return success({
|
|
419
|
+
message: `Counter submitted. AI agent responded with ${aiTurn.action}.`,
|
|
420
|
+
negotiationId: task.id,
|
|
421
|
+
action: query.action,
|
|
422
|
+
turnNumber: newTurnCount,
|
|
423
|
+
aiResponse: { action: aiTurn.action, fitScore: aiTurn.assessment.fitScore, reasoning: aiTurn.assessment.reasoning },
|
|
424
|
+
outcome,
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
// AI countered — check if max turns reached
|
|
428
|
+
if (finalTurnCount >= maxTurns) {
|
|
429
|
+
const fullHistory = [...history, aiTurn];
|
|
430
|
+
const outcome = buildNegotiationOutcome(fullHistory, finalTurnCount, 'counter', meta.sourceUserId, meta.candidateUserId, counterpartySpeaker === 'source' ? 'candidate' : 'source');
|
|
431
|
+
await negotiationDatabase.updateTaskState(task.id, 'completed');
|
|
432
|
+
await negotiationDatabase.createArtifact({
|
|
433
|
+
taskId: task.id,
|
|
434
|
+
name: 'negotiation-outcome',
|
|
435
|
+
parts: [{ kind: 'data', data: outcome }],
|
|
436
|
+
metadata: { hasOpportunity: false, turnCount: finalTurnCount },
|
|
437
|
+
});
|
|
438
|
+
if (deps.negotiationEvents) {
|
|
439
|
+
deps.negotiationEvents.emitCompleted({
|
|
440
|
+
negotiationId: task.id,
|
|
441
|
+
userId: meta.sourceUserId,
|
|
442
|
+
outcome: 'turn_cap',
|
|
443
|
+
finalScore: 0,
|
|
444
|
+
turnCount: finalTurnCount,
|
|
445
|
+
});
|
|
446
|
+
deps.negotiationEvents.emitCompleted({
|
|
447
|
+
negotiationId: task.id,
|
|
448
|
+
userId: meta.candidateUserId,
|
|
449
|
+
outcome: 'turn_cap',
|
|
450
|
+
finalScore: 0,
|
|
451
|
+
turnCount: finalTurnCount,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
return success({
|
|
455
|
+
message: 'AI agent countered but max turns reached. Negotiation finalized.',
|
|
456
|
+
negotiationId: task.id,
|
|
457
|
+
action: query.action,
|
|
458
|
+
turnNumber: newTurnCount,
|
|
459
|
+
aiResponse: { action: aiTurn.action, fitScore: aiTurn.assessment.fitScore, reasoning: aiTurn.assessment.reasoning },
|
|
460
|
+
outcome,
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
// AI countered, user's turn again — check if user has webhook to yield
|
|
464
|
+
const userHasWebhook = deps.webhookLookup
|
|
465
|
+
? await deps.webhookLookup.hasWebhookForEvent(context.userId, 'negotiation.turn_received')
|
|
466
|
+
: false;
|
|
467
|
+
if (userHasWebhook) {
|
|
468
|
+
await negotiationDatabase.updateTaskState(task.id, 'waiting_for_external');
|
|
469
|
+
const deadline = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();
|
|
470
|
+
if (deps.negotiationEvents) {
|
|
471
|
+
deps.negotiationEvents.emitTurnReceived({
|
|
472
|
+
negotiationId: task.id,
|
|
473
|
+
userId: context.userId,
|
|
474
|
+
turnNumber: finalTurnCount + 1,
|
|
475
|
+
counterpartyAction: aiTurn.action,
|
|
476
|
+
counterpartyMessage: aiTurn.assessment.reasoning,
|
|
477
|
+
deadline,
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
if (deps.negotiationTimeoutQueue) {
|
|
481
|
+
await deps.negotiationTimeoutQueue.enqueueTimeout(task.id, finalTurnCount, 24 * 60 * 60 * 1000);
|
|
482
|
+
}
|
|
483
|
+
return success({
|
|
484
|
+
message: 'Counter submitted. AI agent countered back. Waiting for your next response.',
|
|
485
|
+
negotiationId: task.id,
|
|
486
|
+
action: query.action,
|
|
487
|
+
turnNumber: newTurnCount,
|
|
488
|
+
aiResponse: { action: aiTurn.action, fitScore: aiTurn.assessment.fitScore, reasoning: aiTurn.assessment.reasoning },
|
|
489
|
+
waitingForExternal: true,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
// No webhook for user either — set back to working so graph can continue
|
|
493
|
+
await negotiationDatabase.updateTaskState(task.id, 'working');
|
|
494
|
+
return success({
|
|
495
|
+
message: 'Counter submitted. AI agent countered back. Negotiation continues.',
|
|
496
|
+
negotiationId: task.id,
|
|
497
|
+
action: query.action,
|
|
498
|
+
turnNumber: newTurnCount,
|
|
499
|
+
aiResponse: { action: aiTurn.action, fitScore: aiTurn.assessment.fitScore, reasoning: aiTurn.assessment.reasoning },
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
catch (err) {
|
|
503
|
+
return error(`Failed to respond to negotiation: ${err instanceof Error ? err.message : String(err)}`);
|
|
504
|
+
}
|
|
505
|
+
},
|
|
506
|
+
});
|
|
507
|
+
return [list_negotiations, get_negotiation, respond_to_negotiation];
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Build a NegotiationOutcome from the full turn history.
|
|
511
|
+
* Mirrors the logic in the graph's finalizeNode for consistency.
|
|
512
|
+
*
|
|
513
|
+
* @param history - All negotiation turns
|
|
514
|
+
* @param turnCount - Total number of turns
|
|
515
|
+
* @param lastAction - The last turn's action (accept/reject/counter)
|
|
516
|
+
* @param sourceUserId - Source user ID
|
|
517
|
+
* @param candidateUserId - Candidate user ID
|
|
518
|
+
* @param currentSpeaker - Who would speak next (the person after the accepter/rejector)
|
|
519
|
+
*/
|
|
520
|
+
function buildNegotiationOutcome(history, turnCount, lastAction, sourceUserId, candidateUserId, currentSpeaker) {
|
|
521
|
+
const hasOpportunity = lastAction === 'accept';
|
|
522
|
+
const atCap = lastAction === 'counter';
|
|
523
|
+
const scores = history.map(t => t.assessment.fitScore);
|
|
524
|
+
const avgScore = scores.length > 0 ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length) : 0;
|
|
525
|
+
let agreedRoles = [];
|
|
526
|
+
if (hasOpportunity && history.length >= 2) {
|
|
527
|
+
const acceptTurn = history[history.length - 1];
|
|
528
|
+
const precedingTurn = history[history.length - 2];
|
|
529
|
+
const accepterIsSource = currentSpeaker === 'candidate';
|
|
530
|
+
const [sourceRole, candidateRole] = accepterIsSource
|
|
531
|
+
? [acceptTurn.assessment.suggestedRoles.ownUser, precedingTurn.assessment.suggestedRoles.ownUser]
|
|
532
|
+
: [precedingTurn.assessment.suggestedRoles.ownUser, acceptTurn.assessment.suggestedRoles.ownUser];
|
|
533
|
+
agreedRoles = [
|
|
534
|
+
{ userId: sourceUserId, role: sourceRole },
|
|
535
|
+
{ userId: candidateUserId, role: candidateRole },
|
|
536
|
+
];
|
|
537
|
+
}
|
|
538
|
+
return {
|
|
539
|
+
hasOpportunity,
|
|
540
|
+
finalScore: hasOpportunity ? avgScore : 0,
|
|
541
|
+
agreedRoles,
|
|
542
|
+
reasoning: history[history.length - 1]?.assessment.reasoning ?? '',
|
|
543
|
+
turnCount,
|
|
544
|
+
...(atCap && { reason: 'turn_cap' }),
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
//# sourceMappingURL=negotiation.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"negotiation.tools.js","sourceRoot":"","sources":["../../src/negotiation/negotiation.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.tools.d.ts","sourceRoot":"","sources":["../../src/network/network.tools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAG5E,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"network.tools.d.ts","sourceRoot":"","sources":["../../src/network/network.tools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAG5E,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,gDA+gBxE"}
|