@nordsym/apiclaw 1.2.8 → 1.2.9
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/dist/confirmation.d.ts +50 -0
- package/dist/confirmation.d.ts.map +1 -0
- package/dist/confirmation.js +214 -0
- package/dist/confirmation.js.map +1 -0
- package/dist/index.js +91 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/confirmation.ts +264 -0
- package/src/index.ts +106 -7
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw Confirmation System
|
|
3
|
+
* For actions that cost money or have side effects
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. Agent calls action → gets preview + token
|
|
7
|
+
* 2. Agent shows preview to user
|
|
8
|
+
* 3. User confirms → agent calls confirm with token
|
|
9
|
+
* 4. APIClaw executes the actual action
|
|
10
|
+
*/
|
|
11
|
+
export interface PendingAction {
|
|
12
|
+
token: string;
|
|
13
|
+
provider: string;
|
|
14
|
+
action: string;
|
|
15
|
+
params: Record<string, any>;
|
|
16
|
+
preview: Record<string, any>;
|
|
17
|
+
createdAt: number;
|
|
18
|
+
expiresAt: number;
|
|
19
|
+
userId?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const CONFIRMATION_REQUIRED: Record<string, string[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if an action requires confirmation
|
|
24
|
+
*/
|
|
25
|
+
export declare function requiresConfirmation(provider: string, action: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Generate a confirmation token and store the pending action
|
|
28
|
+
*/
|
|
29
|
+
export declare function createPendingAction(provider: string, action: string, params: Record<string, any>, preview: Record<string, any>, userId?: string): PendingAction;
|
|
30
|
+
/**
|
|
31
|
+
* Get a pending action by token (and validate it)
|
|
32
|
+
*/
|
|
33
|
+
export declare function getPendingAction(token: string): PendingAction | null;
|
|
34
|
+
/**
|
|
35
|
+
* Consume a pending action (use it and remove from store)
|
|
36
|
+
*/
|
|
37
|
+
export declare function consumePendingAction(token: string): PendingAction | null;
|
|
38
|
+
/**
|
|
39
|
+
* Generate a human-readable preview for an action
|
|
40
|
+
*/
|
|
41
|
+
export declare function generatePreview(provider: string, action: string, params: Record<string, any>): Record<string, any>;
|
|
42
|
+
/**
|
|
43
|
+
* Validate params before creating preview
|
|
44
|
+
* Returns { valid: true } or { valid: false, errors: [...] }
|
|
45
|
+
*/
|
|
46
|
+
export declare function validateParams(provider: string, action: string, params: Record<string, any>): {
|
|
47
|
+
valid: boolean;
|
|
48
|
+
errors?: string[];
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=confirmation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation.d.ts","sourceRoot":"","sources":["../src/confirmation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAU1D,CAAC;AAKF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAG9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,MAAM,CAAC,EAAE,MAAM,GACd,aAAa,CAoBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAapE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQxE;AAcD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAarB;AA6DD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAiDvC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw Confirmation System
|
|
3
|
+
* For actions that cost money or have side effects
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. Agent calls action → gets preview + token
|
|
7
|
+
* 2. Agent shows preview to user
|
|
8
|
+
* 3. User confirms → agent calls confirm with token
|
|
9
|
+
* 4. APIClaw executes the actual action
|
|
10
|
+
*/
|
|
11
|
+
import { randomBytes } from 'crypto';
|
|
12
|
+
// In-memory store for pending confirmations (in production, use Redis)
|
|
13
|
+
const pendingActions = new Map();
|
|
14
|
+
// Actions that require confirmation before execution
|
|
15
|
+
export const CONFIRMATION_REQUIRED = {
|
|
16
|
+
// Invoicing - costs money per send
|
|
17
|
+
coaccept: ['send_invoice', 'send_reminder'],
|
|
18
|
+
// SMS - costs money per message
|
|
19
|
+
'46elks': ['send_sms'],
|
|
20
|
+
twilio: ['send_sms'],
|
|
21
|
+
// Email sends (less critical but still good to confirm)
|
|
22
|
+
resend: ['send_email'],
|
|
23
|
+
};
|
|
24
|
+
// Token expiry time (5 minutes)
|
|
25
|
+
const TOKEN_EXPIRY_MS = 5 * 60 * 1000;
|
|
26
|
+
/**
|
|
27
|
+
* Check if an action requires confirmation
|
|
28
|
+
*/
|
|
29
|
+
export function requiresConfirmation(provider, action) {
|
|
30
|
+
const actions = CONFIRMATION_REQUIRED[provider];
|
|
31
|
+
return actions?.includes(action) ?? false;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generate a confirmation token and store the pending action
|
|
35
|
+
*/
|
|
36
|
+
export function createPendingAction(provider, action, params, preview, userId) {
|
|
37
|
+
// Clean up expired tokens
|
|
38
|
+
cleanupExpired();
|
|
39
|
+
const token = randomBytes(16).toString('hex');
|
|
40
|
+
const now = Date.now();
|
|
41
|
+
const pending = {
|
|
42
|
+
token,
|
|
43
|
+
provider,
|
|
44
|
+
action,
|
|
45
|
+
params,
|
|
46
|
+
preview,
|
|
47
|
+
createdAt: now,
|
|
48
|
+
expiresAt: now + TOKEN_EXPIRY_MS,
|
|
49
|
+
userId,
|
|
50
|
+
};
|
|
51
|
+
pendingActions.set(token, pending);
|
|
52
|
+
return pending;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get a pending action by token (and validate it)
|
|
56
|
+
*/
|
|
57
|
+
export function getPendingAction(token) {
|
|
58
|
+
const pending = pendingActions.get(token);
|
|
59
|
+
if (!pending) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (Date.now() > pending.expiresAt) {
|
|
63
|
+
pendingActions.delete(token);
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return pending;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Consume a pending action (use it and remove from store)
|
|
70
|
+
*/
|
|
71
|
+
export function consumePendingAction(token) {
|
|
72
|
+
const pending = getPendingAction(token);
|
|
73
|
+
if (pending) {
|
|
74
|
+
pendingActions.delete(token);
|
|
75
|
+
}
|
|
76
|
+
return pending;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Clean up expired tokens
|
|
80
|
+
*/
|
|
81
|
+
function cleanupExpired() {
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
for (const [token, pending] of pendingActions.entries()) {
|
|
84
|
+
if (now > pending.expiresAt) {
|
|
85
|
+
pendingActions.delete(token);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Generate a human-readable preview for an action
|
|
91
|
+
*/
|
|
92
|
+
export function generatePreview(provider, action, params) {
|
|
93
|
+
// Provider-specific preview generators
|
|
94
|
+
switch (provider) {
|
|
95
|
+
case 'coaccept':
|
|
96
|
+
return generateCoAcceptPreview(action, params);
|
|
97
|
+
case '46elks':
|
|
98
|
+
case 'twilio':
|
|
99
|
+
return generateSMSPreview(params);
|
|
100
|
+
case 'resend':
|
|
101
|
+
return generateEmailPreview(params);
|
|
102
|
+
default:
|
|
103
|
+
return { action, params };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function generateCoAcceptPreview(action, params) {
|
|
107
|
+
if (action === 'send_invoice') {
|
|
108
|
+
const items = params.items || [];
|
|
109
|
+
const totalAmount = items.reduce((sum, item) => sum + (item.amount || 0), 0);
|
|
110
|
+
return {
|
|
111
|
+
type: 'invoice',
|
|
112
|
+
recipient: {
|
|
113
|
+
name: params.recipient_name,
|
|
114
|
+
email: params.recipient_email,
|
|
115
|
+
org_number: params.recipient_org_nr,
|
|
116
|
+
},
|
|
117
|
+
amount: {
|
|
118
|
+
subtotal: totalAmount,
|
|
119
|
+
vat_rate: params.vat_rate || 25,
|
|
120
|
+
vat_amount: totalAmount * ((params.vat_rate || 25) / 100),
|
|
121
|
+
total: totalAmount * (1 + (params.vat_rate || 25) / 100),
|
|
122
|
+
currency: params.currency || 'SEK',
|
|
123
|
+
},
|
|
124
|
+
due_date: params.due_date,
|
|
125
|
+
items: items.map((item) => ({
|
|
126
|
+
description: item.description,
|
|
127
|
+
quantity: item.quantity || 1,
|
|
128
|
+
unit_price: item.unit_price || item.amount,
|
|
129
|
+
amount: item.amount,
|
|
130
|
+
})),
|
|
131
|
+
payment_method: 'SMS + Swish/Card (CoAccept)',
|
|
132
|
+
estimated_cost: '~2-5 SEK per invoice',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return { action, params };
|
|
136
|
+
}
|
|
137
|
+
function generateSMSPreview(params) {
|
|
138
|
+
const messageLength = (params.message || '').length;
|
|
139
|
+
const segments = Math.ceil(messageLength / 160);
|
|
140
|
+
return {
|
|
141
|
+
type: 'sms',
|
|
142
|
+
to: params.to,
|
|
143
|
+
from: params.from || 'NordSym',
|
|
144
|
+
message: params.message,
|
|
145
|
+
message_length: messageLength,
|
|
146
|
+
segments,
|
|
147
|
+
estimated_cost: `~${(segments * 0.35).toFixed(2)} SEK`,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function generateEmailPreview(params) {
|
|
151
|
+
return {
|
|
152
|
+
type: 'email',
|
|
153
|
+
to: params.to,
|
|
154
|
+
from: params.from || 'noreply@nordsym.com',
|
|
155
|
+
subject: params.subject,
|
|
156
|
+
preview: (params.message || params.html || '').substring(0, 200) + '...',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Validate params before creating preview
|
|
161
|
+
* Returns { valid: true } or { valid: false, errors: [...] }
|
|
162
|
+
*/
|
|
163
|
+
export function validateParams(provider, action, params) {
|
|
164
|
+
const errors = [];
|
|
165
|
+
switch (provider) {
|
|
166
|
+
case 'coaccept':
|
|
167
|
+
if (action === 'send_invoice') {
|
|
168
|
+
if (!params.recipient_name)
|
|
169
|
+
errors.push('Missing: recipient_name');
|
|
170
|
+
if (!params.recipient_email)
|
|
171
|
+
errors.push('Missing: recipient_email');
|
|
172
|
+
if (!params.items || !Array.isArray(params.items) || params.items.length === 0) {
|
|
173
|
+
errors.push('Missing: items (at least one invoice item required)');
|
|
174
|
+
}
|
|
175
|
+
if (!params.due_date)
|
|
176
|
+
errors.push('Missing: due_date (YYYY-MM-DD)');
|
|
177
|
+
// Validate email format
|
|
178
|
+
if (params.recipient_email && !params.recipient_email.includes('@')) {
|
|
179
|
+
errors.push('Invalid: recipient_email format');
|
|
180
|
+
}
|
|
181
|
+
// Validate due date is not in past
|
|
182
|
+
if (params.due_date) {
|
|
183
|
+
const dueDate = new Date(params.due_date);
|
|
184
|
+
const today = new Date();
|
|
185
|
+
today.setHours(0, 0, 0, 0);
|
|
186
|
+
if (dueDate < today) {
|
|
187
|
+
errors.push('Invalid: due_date cannot be in the past');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
break;
|
|
192
|
+
case '46elks':
|
|
193
|
+
case 'twilio':
|
|
194
|
+
if (!params.to)
|
|
195
|
+
errors.push('Missing: to (phone number)');
|
|
196
|
+
if (!params.message)
|
|
197
|
+
errors.push('Missing: message');
|
|
198
|
+
// Validate phone format (basic check)
|
|
199
|
+
if (params.to && !params.to.startsWith('+')) {
|
|
200
|
+
errors.push('Invalid: phone number must start with + (e.g., +46701234567)');
|
|
201
|
+
}
|
|
202
|
+
break;
|
|
203
|
+
case 'resend':
|
|
204
|
+
if (!params.to)
|
|
205
|
+
errors.push('Missing: to (email address)');
|
|
206
|
+
if (!params.subject)
|
|
207
|
+
errors.push('Missing: subject');
|
|
208
|
+
if (!params.message && !params.html)
|
|
209
|
+
errors.push('Missing: message or html content');
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
return errors.length > 0 ? { valid: false, errors } : { valid: true };
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=confirmation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../src/confirmation.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,7 @@ import { hasRealCredentials } from './credentials.js';
|
|
|
19
19
|
import { executeAPICall, getConnectedProviders } from './execute.js';
|
|
20
20
|
import { logAPICall } from './analytics.js';
|
|
21
21
|
import { isOpenAPI, executeOpenAPI, listOpenAPIs } from './open-apis.js';
|
|
22
|
+
import { requiresConfirmation, createPendingAction, consumePendingAction, generatePreview, validateParams } from './confirmation.js';
|
|
22
23
|
// Default agent ID for MVP (in production, this would come from auth)
|
|
23
24
|
const DEFAULT_AGENT_ID = 'agent_default';
|
|
24
25
|
/**
|
|
@@ -160,17 +161,17 @@ const tools = [
|
|
|
160
161
|
},
|
|
161
162
|
{
|
|
162
163
|
name: 'call_api',
|
|
163
|
-
description: 'Execute an API call through APIClaw
|
|
164
|
+
description: 'Execute an API call through APIClaw. For actions that cost money (invoices, SMS), you will get a preview first and must confirm with the returned token. For free actions, executes immediately.',
|
|
164
165
|
inputSchema: {
|
|
165
166
|
type: 'object',
|
|
166
167
|
properties: {
|
|
167
168
|
provider: {
|
|
168
169
|
type: 'string',
|
|
169
|
-
description: 'Provider ID (e.g., "46elks", "brave_search", "resend", "openrouter", "elevenlabs", "twilio", "coaccept")'
|
|
170
|
+
description: 'Provider ID (e.g., "46elks", "brave_search", "resend", "openrouter", "elevenlabs", "twilio", "coaccept", "frankfurter")'
|
|
170
171
|
},
|
|
171
172
|
action: {
|
|
172
173
|
type: 'string',
|
|
173
|
-
description: 'Action to perform (e.g., "send_sms", "search", "send_email", "chat", "
|
|
174
|
+
description: 'Action to perform (e.g., "send_sms", "search", "send_email", "chat", "send_invoice", "convert")'
|
|
174
175
|
},
|
|
175
176
|
params: {
|
|
176
177
|
type: 'object',
|
|
@@ -178,10 +179,14 @@ const tools = [
|
|
|
178
179
|
},
|
|
179
180
|
customer_key: {
|
|
180
181
|
type: 'string',
|
|
181
|
-
description: 'Optional: Your own API key for providers that require customer authentication
|
|
182
|
+
description: 'Optional: Your own API key for providers that require customer authentication (e.g., CoAccept).'
|
|
183
|
+
},
|
|
184
|
+
confirm_token: {
|
|
185
|
+
type: 'string',
|
|
186
|
+
description: 'Confirmation token from a previous call. Required to execute actions that cost money after reviewing the preview.'
|
|
182
187
|
}
|
|
183
188
|
},
|
|
184
|
-
required: ['provider', 'action'
|
|
189
|
+
required: ['provider', 'action']
|
|
185
190
|
}
|
|
186
191
|
},
|
|
187
192
|
{
|
|
@@ -438,16 +443,95 @@ Docs: https://apiclaw.nordsym.com
|
|
|
438
443
|
const provider = args?.provider;
|
|
439
444
|
const action = args?.action;
|
|
440
445
|
const params = args?.params || {};
|
|
446
|
+
const confirmToken = args?.confirm_token;
|
|
441
447
|
const startTime = Date.now();
|
|
442
448
|
let result;
|
|
443
449
|
let apiType;
|
|
444
|
-
// Check if this is
|
|
450
|
+
// Check if this is a confirmation of a pending action
|
|
451
|
+
if (confirmToken) {
|
|
452
|
+
const pending = consumePendingAction(confirmToken);
|
|
453
|
+
if (!pending) {
|
|
454
|
+
return {
|
|
455
|
+
content: [{
|
|
456
|
+
type: 'text',
|
|
457
|
+
text: JSON.stringify({
|
|
458
|
+
status: 'error',
|
|
459
|
+
error: 'Invalid or expired confirmation token. Please start over.',
|
|
460
|
+
}, null, 2)
|
|
461
|
+
}],
|
|
462
|
+
isError: true
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
// Execute the confirmed action
|
|
466
|
+
apiType = 'direct';
|
|
467
|
+
const customerKey = args?.customer_key || getCustomerKey(pending.provider);
|
|
468
|
+
result = await executeAPICall(pending.provider, pending.action, pending.params, DEFAULT_AGENT_ID, customerKey);
|
|
469
|
+
// Log the confirmed API call
|
|
470
|
+
logAPICall({
|
|
471
|
+
timestamp: new Date().toISOString(),
|
|
472
|
+
provider: pending.provider,
|
|
473
|
+
action: pending.action,
|
|
474
|
+
type: apiType,
|
|
475
|
+
userId: DEFAULT_AGENT_ID,
|
|
476
|
+
success: result.success,
|
|
477
|
+
latencyMs: Date.now() - startTime,
|
|
478
|
+
error: result.error,
|
|
479
|
+
});
|
|
480
|
+
return {
|
|
481
|
+
content: [{
|
|
482
|
+
type: 'text',
|
|
483
|
+
text: JSON.stringify({
|
|
484
|
+
status: result.success ? 'success' : 'error',
|
|
485
|
+
provider: result.provider,
|
|
486
|
+
action: result.action,
|
|
487
|
+
confirmed: true,
|
|
488
|
+
...(result.success ? { data: result.data } : { error: result.error }),
|
|
489
|
+
}, null, 2)
|
|
490
|
+
}],
|
|
491
|
+
isError: !result.success
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
// Check if this action requires confirmation
|
|
495
|
+
if (requiresConfirmation(provider, action)) {
|
|
496
|
+
// Validate params first
|
|
497
|
+
const validation = validateParams(provider, action, params);
|
|
498
|
+
if (!validation.valid) {
|
|
499
|
+
return {
|
|
500
|
+
content: [{
|
|
501
|
+
type: 'text',
|
|
502
|
+
text: JSON.stringify({
|
|
503
|
+
status: 'error',
|
|
504
|
+
error: 'Validation failed',
|
|
505
|
+
missing_or_invalid: validation.errors,
|
|
506
|
+
hint: 'Please provide all required fields before sending.',
|
|
507
|
+
}, null, 2)
|
|
508
|
+
}],
|
|
509
|
+
isError: true
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
// Generate preview and create pending action
|
|
513
|
+
const preview = generatePreview(provider, action, params);
|
|
514
|
+
const pending = createPendingAction(provider, action, params, preview, DEFAULT_AGENT_ID);
|
|
515
|
+
return {
|
|
516
|
+
content: [{
|
|
517
|
+
type: 'text',
|
|
518
|
+
text: JSON.stringify({
|
|
519
|
+
status: 'requires_confirmation',
|
|
520
|
+
message: '⚠️ This action costs money. Please review and confirm.',
|
|
521
|
+
preview,
|
|
522
|
+
confirm_token: pending.token,
|
|
523
|
+
expires_in_seconds: 300,
|
|
524
|
+
how_to_confirm: `Call again with confirm_token: "${pending.token}"`,
|
|
525
|
+
}, null, 2)
|
|
526
|
+
}]
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
// Regular execution (no confirmation needed)
|
|
445
530
|
if (isOpenAPI(provider)) {
|
|
446
531
|
apiType = 'open';
|
|
447
532
|
result = await executeOpenAPI(provider, action, params);
|
|
448
533
|
}
|
|
449
534
|
else {
|
|
450
|
-
// Direct Call - check for customer-provided API key
|
|
451
535
|
apiType = 'direct';
|
|
452
536
|
const customerKey = args?.customer_key || getCustomerKey(provider);
|
|
453
537
|
result = await executeAPICall(provider, action, params, DEFAULT_AGENT_ID, customerKey);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw Confirmation System
|
|
3
|
+
* For actions that cost money or have side effects
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. Agent calls action → gets preview + token
|
|
7
|
+
* 2. Agent shows preview to user
|
|
8
|
+
* 3. User confirms → agent calls confirm with token
|
|
9
|
+
* 4. APIClaw executes the actual action
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { randomBytes } from 'crypto';
|
|
13
|
+
|
|
14
|
+
export interface PendingAction {
|
|
15
|
+
token: string;
|
|
16
|
+
provider: string;
|
|
17
|
+
action: string;
|
|
18
|
+
params: Record<string, any>;
|
|
19
|
+
preview: Record<string, any>;
|
|
20
|
+
createdAt: number;
|
|
21
|
+
expiresAt: number;
|
|
22
|
+
userId?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// In-memory store for pending confirmations (in production, use Redis)
|
|
26
|
+
const pendingActions = new Map<string, PendingAction>();
|
|
27
|
+
|
|
28
|
+
// Actions that require confirmation before execution
|
|
29
|
+
export const CONFIRMATION_REQUIRED: Record<string, string[]> = {
|
|
30
|
+
// Invoicing - costs money per send
|
|
31
|
+
coaccept: ['send_invoice', 'send_reminder'],
|
|
32
|
+
|
|
33
|
+
// SMS - costs money per message
|
|
34
|
+
'46elks': ['send_sms'],
|
|
35
|
+
twilio: ['send_sms'],
|
|
36
|
+
|
|
37
|
+
// Email sends (less critical but still good to confirm)
|
|
38
|
+
resend: ['send_email'],
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// Token expiry time (5 minutes)
|
|
42
|
+
const TOKEN_EXPIRY_MS = 5 * 60 * 1000;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Check if an action requires confirmation
|
|
46
|
+
*/
|
|
47
|
+
export function requiresConfirmation(provider: string, action: string): boolean {
|
|
48
|
+
const actions = CONFIRMATION_REQUIRED[provider];
|
|
49
|
+
return actions?.includes(action) ?? false;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Generate a confirmation token and store the pending action
|
|
54
|
+
*/
|
|
55
|
+
export function createPendingAction(
|
|
56
|
+
provider: string,
|
|
57
|
+
action: string,
|
|
58
|
+
params: Record<string, any>,
|
|
59
|
+
preview: Record<string, any>,
|
|
60
|
+
userId?: string
|
|
61
|
+
): PendingAction {
|
|
62
|
+
// Clean up expired tokens
|
|
63
|
+
cleanupExpired();
|
|
64
|
+
|
|
65
|
+
const token = randomBytes(16).toString('hex');
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
|
|
68
|
+
const pending: PendingAction = {
|
|
69
|
+
token,
|
|
70
|
+
provider,
|
|
71
|
+
action,
|
|
72
|
+
params,
|
|
73
|
+
preview,
|
|
74
|
+
createdAt: now,
|
|
75
|
+
expiresAt: now + TOKEN_EXPIRY_MS,
|
|
76
|
+
userId,
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
pendingActions.set(token, pending);
|
|
80
|
+
return pending;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get a pending action by token (and validate it)
|
|
85
|
+
*/
|
|
86
|
+
export function getPendingAction(token: string): PendingAction | null {
|
|
87
|
+
const pending = pendingActions.get(token);
|
|
88
|
+
|
|
89
|
+
if (!pending) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (Date.now() > pending.expiresAt) {
|
|
94
|
+
pendingActions.delete(token);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return pending;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Consume a pending action (use it and remove from store)
|
|
103
|
+
*/
|
|
104
|
+
export function consumePendingAction(token: string): PendingAction | null {
|
|
105
|
+
const pending = getPendingAction(token);
|
|
106
|
+
|
|
107
|
+
if (pending) {
|
|
108
|
+
pendingActions.delete(token);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return pending;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Clean up expired tokens
|
|
116
|
+
*/
|
|
117
|
+
function cleanupExpired(): void {
|
|
118
|
+
const now = Date.now();
|
|
119
|
+
for (const [token, pending] of pendingActions.entries()) {
|
|
120
|
+
if (now > pending.expiresAt) {
|
|
121
|
+
pendingActions.delete(token);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Generate a human-readable preview for an action
|
|
128
|
+
*/
|
|
129
|
+
export function generatePreview(
|
|
130
|
+
provider: string,
|
|
131
|
+
action: string,
|
|
132
|
+
params: Record<string, any>
|
|
133
|
+
): Record<string, any> {
|
|
134
|
+
// Provider-specific preview generators
|
|
135
|
+
switch (provider) {
|
|
136
|
+
case 'coaccept':
|
|
137
|
+
return generateCoAcceptPreview(action, params);
|
|
138
|
+
case '46elks':
|
|
139
|
+
case 'twilio':
|
|
140
|
+
return generateSMSPreview(params);
|
|
141
|
+
case 'resend':
|
|
142
|
+
return generateEmailPreview(params);
|
|
143
|
+
default:
|
|
144
|
+
return { action, params };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function generateCoAcceptPreview(action: string, params: Record<string, any>): Record<string, any> {
|
|
149
|
+
if (action === 'send_invoice') {
|
|
150
|
+
const items = params.items || [];
|
|
151
|
+
const totalAmount = items.reduce((sum: number, item: any) => sum + (item.amount || 0), 0);
|
|
152
|
+
|
|
153
|
+
return {
|
|
154
|
+
type: 'invoice',
|
|
155
|
+
recipient: {
|
|
156
|
+
name: params.recipient_name,
|
|
157
|
+
email: params.recipient_email,
|
|
158
|
+
org_number: params.recipient_org_nr,
|
|
159
|
+
},
|
|
160
|
+
amount: {
|
|
161
|
+
subtotal: totalAmount,
|
|
162
|
+
vat_rate: params.vat_rate || 25,
|
|
163
|
+
vat_amount: totalAmount * ((params.vat_rate || 25) / 100),
|
|
164
|
+
total: totalAmount * (1 + (params.vat_rate || 25) / 100),
|
|
165
|
+
currency: params.currency || 'SEK',
|
|
166
|
+
},
|
|
167
|
+
due_date: params.due_date,
|
|
168
|
+
items: items.map((item: any) => ({
|
|
169
|
+
description: item.description,
|
|
170
|
+
quantity: item.quantity || 1,
|
|
171
|
+
unit_price: item.unit_price || item.amount,
|
|
172
|
+
amount: item.amount,
|
|
173
|
+
})),
|
|
174
|
+
payment_method: 'SMS + Swish/Card (CoAccept)',
|
|
175
|
+
estimated_cost: '~2-5 SEK per invoice',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return { action, params };
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function generateSMSPreview(params: Record<string, any>): Record<string, any> {
|
|
183
|
+
const messageLength = (params.message || '').length;
|
|
184
|
+
const segments = Math.ceil(messageLength / 160);
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
type: 'sms',
|
|
188
|
+
to: params.to,
|
|
189
|
+
from: params.from || 'NordSym',
|
|
190
|
+
message: params.message,
|
|
191
|
+
message_length: messageLength,
|
|
192
|
+
segments,
|
|
193
|
+
estimated_cost: `~${(segments * 0.35).toFixed(2)} SEK`,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function generateEmailPreview(params: Record<string, any>): Record<string, any> {
|
|
198
|
+
return {
|
|
199
|
+
type: 'email',
|
|
200
|
+
to: params.to,
|
|
201
|
+
from: params.from || 'noreply@nordsym.com',
|
|
202
|
+
subject: params.subject,
|
|
203
|
+
preview: (params.message || params.html || '').substring(0, 200) + '...',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Validate params before creating preview
|
|
209
|
+
* Returns { valid: true } or { valid: false, errors: [...] }
|
|
210
|
+
*/
|
|
211
|
+
export function validateParams(
|
|
212
|
+
provider: string,
|
|
213
|
+
action: string,
|
|
214
|
+
params: Record<string, any>
|
|
215
|
+
): { valid: boolean; errors?: string[] } {
|
|
216
|
+
const errors: string[] = [];
|
|
217
|
+
|
|
218
|
+
switch (provider) {
|
|
219
|
+
case 'coaccept':
|
|
220
|
+
if (action === 'send_invoice') {
|
|
221
|
+
if (!params.recipient_name) errors.push('Missing: recipient_name');
|
|
222
|
+
if (!params.recipient_email) errors.push('Missing: recipient_email');
|
|
223
|
+
if (!params.items || !Array.isArray(params.items) || params.items.length === 0) {
|
|
224
|
+
errors.push('Missing: items (at least one invoice item required)');
|
|
225
|
+
}
|
|
226
|
+
if (!params.due_date) errors.push('Missing: due_date (YYYY-MM-DD)');
|
|
227
|
+
|
|
228
|
+
// Validate email format
|
|
229
|
+
if (params.recipient_email && !params.recipient_email.includes('@')) {
|
|
230
|
+
errors.push('Invalid: recipient_email format');
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Validate due date is not in past
|
|
234
|
+
if (params.due_date) {
|
|
235
|
+
const dueDate = new Date(params.due_date);
|
|
236
|
+
const today = new Date();
|
|
237
|
+
today.setHours(0, 0, 0, 0);
|
|
238
|
+
if (dueDate < today) {
|
|
239
|
+
errors.push('Invalid: due_date cannot be in the past');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
break;
|
|
244
|
+
|
|
245
|
+
case '46elks':
|
|
246
|
+
case 'twilio':
|
|
247
|
+
if (!params.to) errors.push('Missing: to (phone number)');
|
|
248
|
+
if (!params.message) errors.push('Missing: message');
|
|
249
|
+
|
|
250
|
+
// Validate phone format (basic check)
|
|
251
|
+
if (params.to && !params.to.startsWith('+')) {
|
|
252
|
+
errors.push('Invalid: phone number must start with + (e.g., +46701234567)');
|
|
253
|
+
}
|
|
254
|
+
break;
|
|
255
|
+
|
|
256
|
+
case 'resend':
|
|
257
|
+
if (!params.to) errors.push('Missing: to (email address)');
|
|
258
|
+
if (!params.subject) errors.push('Missing: subject');
|
|
259
|
+
if (!params.message && !params.html) errors.push('Missing: message or html content');
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return errors.length > 0 ? { valid: false, errors } : { valid: true };
|
|
264
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -32,6 +32,13 @@ import { hasRealCredentials } from './credentials.js';
|
|
|
32
32
|
import { executeAPICall, getConnectedProviders } from './execute.js';
|
|
33
33
|
import { logAPICall } from './analytics.js';
|
|
34
34
|
import { isOpenAPI, executeOpenAPI, listOpenAPIs, getOpenAPIActions } from './open-apis.js';
|
|
35
|
+
import {
|
|
36
|
+
requiresConfirmation,
|
|
37
|
+
createPendingAction,
|
|
38
|
+
consumePendingAction,
|
|
39
|
+
generatePreview,
|
|
40
|
+
validateParams
|
|
41
|
+
} from './confirmation.js';
|
|
35
42
|
|
|
36
43
|
// Default agent ID for MVP (in production, this would come from auth)
|
|
37
44
|
const DEFAULT_AGENT_ID = 'agent_default';
|
|
@@ -179,17 +186,17 @@ const tools: Tool[] = [
|
|
|
179
186
|
},
|
|
180
187
|
{
|
|
181
188
|
name: 'call_api',
|
|
182
|
-
description: 'Execute an API call through APIClaw
|
|
189
|
+
description: 'Execute an API call through APIClaw. For actions that cost money (invoices, SMS), you will get a preview first and must confirm with the returned token. For free actions, executes immediately.',
|
|
183
190
|
inputSchema: {
|
|
184
191
|
type: 'object',
|
|
185
192
|
properties: {
|
|
186
193
|
provider: {
|
|
187
194
|
type: 'string',
|
|
188
|
-
description: 'Provider ID (e.g., "46elks", "brave_search", "resend", "openrouter", "elevenlabs", "twilio", "coaccept")'
|
|
195
|
+
description: 'Provider ID (e.g., "46elks", "brave_search", "resend", "openrouter", "elevenlabs", "twilio", "coaccept", "frankfurter")'
|
|
189
196
|
},
|
|
190
197
|
action: {
|
|
191
198
|
type: 'string',
|
|
192
|
-
description: 'Action to perform (e.g., "send_sms", "search", "send_email", "chat", "
|
|
199
|
+
description: 'Action to perform (e.g., "send_sms", "search", "send_email", "chat", "send_invoice", "convert")'
|
|
193
200
|
},
|
|
194
201
|
params: {
|
|
195
202
|
type: 'object',
|
|
@@ -197,10 +204,14 @@ const tools: Tool[] = [
|
|
|
197
204
|
},
|
|
198
205
|
customer_key: {
|
|
199
206
|
type: 'string',
|
|
200
|
-
description: 'Optional: Your own API key for providers that require customer authentication
|
|
207
|
+
description: 'Optional: Your own API key for providers that require customer authentication (e.g., CoAccept).'
|
|
208
|
+
},
|
|
209
|
+
confirm_token: {
|
|
210
|
+
type: 'string',
|
|
211
|
+
description: 'Confirmation token from a previous call. Required to execute actions that cost money after reviewing the preview.'
|
|
201
212
|
}
|
|
202
213
|
},
|
|
203
|
-
required: ['provider', 'action'
|
|
214
|
+
required: ['provider', 'action']
|
|
204
215
|
}
|
|
205
216
|
},
|
|
206
217
|
{
|
|
@@ -485,17 +496,105 @@ Docs: https://apiclaw.nordsym.com
|
|
|
485
496
|
const provider = args?.provider as string;
|
|
486
497
|
const action = args?.action as string;
|
|
487
498
|
const params = (args?.params as Record<string, any>) || {};
|
|
499
|
+
const confirmToken = args?.confirm_token as string | undefined;
|
|
488
500
|
|
|
489
501
|
const startTime = Date.now();
|
|
490
502
|
let result: { success: boolean; provider: string; action: string; data?: any; error?: string; cost?: number };
|
|
491
503
|
let apiType: 'direct' | 'open';
|
|
492
504
|
|
|
493
|
-
// Check if this is
|
|
505
|
+
// Check if this is a confirmation of a pending action
|
|
506
|
+
if (confirmToken) {
|
|
507
|
+
const pending = consumePendingAction(confirmToken);
|
|
508
|
+
|
|
509
|
+
if (!pending) {
|
|
510
|
+
return {
|
|
511
|
+
content: [{
|
|
512
|
+
type: 'text',
|
|
513
|
+
text: JSON.stringify({
|
|
514
|
+
status: 'error',
|
|
515
|
+
error: 'Invalid or expired confirmation token. Please start over.',
|
|
516
|
+
}, null, 2)
|
|
517
|
+
}],
|
|
518
|
+
isError: true
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// Execute the confirmed action
|
|
523
|
+
apiType = 'direct';
|
|
524
|
+
const customerKey = (args?.customer_key as string) || getCustomerKey(pending.provider);
|
|
525
|
+
result = await executeAPICall(pending.provider, pending.action, pending.params, DEFAULT_AGENT_ID, customerKey);
|
|
526
|
+
|
|
527
|
+
// Log the confirmed API call
|
|
528
|
+
logAPICall({
|
|
529
|
+
timestamp: new Date().toISOString(),
|
|
530
|
+
provider: pending.provider,
|
|
531
|
+
action: pending.action,
|
|
532
|
+
type: apiType,
|
|
533
|
+
userId: DEFAULT_AGENT_ID,
|
|
534
|
+
success: result.success,
|
|
535
|
+
latencyMs: Date.now() - startTime,
|
|
536
|
+
error: result.error,
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
return {
|
|
540
|
+
content: [{
|
|
541
|
+
type: 'text',
|
|
542
|
+
text: JSON.stringify({
|
|
543
|
+
status: result.success ? 'success' : 'error',
|
|
544
|
+
provider: result.provider,
|
|
545
|
+
action: result.action,
|
|
546
|
+
confirmed: true,
|
|
547
|
+
...(result.success ? { data: result.data } : { error: result.error }),
|
|
548
|
+
}, null, 2)
|
|
549
|
+
}],
|
|
550
|
+
isError: !result.success
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// Check if this action requires confirmation
|
|
555
|
+
if (requiresConfirmation(provider, action)) {
|
|
556
|
+
// Validate params first
|
|
557
|
+
const validation = validateParams(provider, action, params);
|
|
558
|
+
|
|
559
|
+
if (!validation.valid) {
|
|
560
|
+
return {
|
|
561
|
+
content: [{
|
|
562
|
+
type: 'text',
|
|
563
|
+
text: JSON.stringify({
|
|
564
|
+
status: 'error',
|
|
565
|
+
error: 'Validation failed',
|
|
566
|
+
missing_or_invalid: validation.errors,
|
|
567
|
+
hint: 'Please provide all required fields before sending.',
|
|
568
|
+
}, null, 2)
|
|
569
|
+
}],
|
|
570
|
+
isError: true
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// Generate preview and create pending action
|
|
575
|
+
const preview = generatePreview(provider, action, params);
|
|
576
|
+
const pending = createPendingAction(provider, action, params, preview, DEFAULT_AGENT_ID);
|
|
577
|
+
|
|
578
|
+
return {
|
|
579
|
+
content: [{
|
|
580
|
+
type: 'text',
|
|
581
|
+
text: JSON.stringify({
|
|
582
|
+
status: 'requires_confirmation',
|
|
583
|
+
message: '⚠️ This action costs money. Please review and confirm.',
|
|
584
|
+
preview,
|
|
585
|
+
confirm_token: pending.token,
|
|
586
|
+
expires_in_seconds: 300,
|
|
587
|
+
how_to_confirm: `Call again with confirm_token: "${pending.token}"`,
|
|
588
|
+
}, null, 2)
|
|
589
|
+
}]
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// Regular execution (no confirmation needed)
|
|
494
594
|
if (isOpenAPI(provider)) {
|
|
495
595
|
apiType = 'open';
|
|
496
596
|
result = await executeOpenAPI(provider, action, params);
|
|
497
597
|
} else {
|
|
498
|
-
// Direct Call - check for customer-provided API key
|
|
499
598
|
apiType = 'direct';
|
|
500
599
|
const customerKey = (args?.customer_key as string) || getCustomerKey(provider);
|
|
501
600
|
result = await executeAPICall(provider, action, params, DEFAULT_AGENT_ID, customerKey);
|