@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.
@@ -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 Direct Call. No API keys needed - we handle authentication. For providers that require customer authentication (like CoAccept), pass your own API key via customer_key.',
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", "text_to_speech")'
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. If not provided, uses APIClaw shared credentials (where available).'
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', 'params']
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 an Open API (free, no auth needed)
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":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAgC,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAEL,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EAGlB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAqB,MAAM,gBAAgB,CAAC;AAE5F,sEAAsE;AACtE,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC;;;GAGG;AACH,SAAS,cAAc,CAAC,UAAkB;IACxC,yDAAyD;IACzD,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;IAC1E,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG;QACjB,GAAG,UAAU,CAAC,WAAW,EAAE,UAAU;QACrC,GAAG,UAAU,CAAC,WAAW,EAAE,MAAM;QACjC,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU;KACxD,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mBAAmB;AACnB,MAAM,KAAK,GAAW;IACpB;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,iFAAiF;QAC9F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6HAA6H;iBAC3I;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+CAA+C;oBAC5D,IAAI,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC;iBACxC;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kDAAkD;oBAC/D,OAAO,EAAE,CAAC;iBACX;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+CAA+C;iBAC7D;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,qGAAqG;QAClH,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8DAA8D;iBAC5E;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,0FAA0F;QACvG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2CAA2C;iBACzD;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oCAAoC;iBAClD;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gEAAgE;iBAC9E;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;SACnC;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,0DAA0D;QACvE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gEAAgE;iBAC9E;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,0DAA0D;QACvE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sCAAsC;iBACpD;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gEAAgE;iBAC9E;aACF;YACD,QAAQ,EAAE,CAAC,YAAY,CAAC;SACzB;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,oCAAoC;QACjD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,6MAA6M;QAC1N,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0GAA0G;iBACxH;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wFAAwF;iBACtG;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uDAAuD;iBACrE;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oJAAoJ;iBAClK;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC;SAC3C;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,8DAA8D;QAC3E,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;CACF,CAAC;AAEF,gBAAgB;AAChB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,oBAAoB;AACpB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC;QACH,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCxB,CAAC;gBACM,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;iBAC5C,CAAC;YACJ,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,EAAE,KAAe,CAAC;gBACpC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAA8B,CAAC;gBACtD,MAAM,UAAU,GAAI,IAAI,EAAE,WAAsB,IAAI,CAAC,CAAC;gBACtD,MAAM,MAAM,GAAG,IAAI,EAAE,MAA4B,CAAC;gBAElD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;gBACtE,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;gBAE3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,MAAM,EAAE,YAAY;oCACpB,OAAO,EAAE,2BAA2B,KAAK,0EAA0E;oCACnH,oBAAoB,EAAE,aAAa,EAAE;iCACtC,EAAE,IAAI,EAAE,CAAC,CAAC;6BACZ;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,SAAS;gCACjB,KAAK;gCACL,aAAa,EAAE,OAAO,CAAC,MAAM;gCAC7B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oCACzB,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE;oCACjB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI;oCACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW;oCACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ;oCAC7B,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY;oCACrC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK;oCACvC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS;oCAC3C,kBAAkB,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB;oCACjD,eAAe,EAAE,CAAC,CAAC,eAAe;oCAClC,aAAa,EAAE,CAAC,CAAC,aAAa;iCAC/B,CAAC,CAAC;6BACJ,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,KAAK,GAAG,IAAI,EAAE,MAAgB,CAAC;gBACrC,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;gBAEjC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,MAAM,EAAE,OAAO;oCACf,OAAO,EAAE,kBAAkB,KAAK,EAAE;oCAClC,cAAc,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iCAC5C,EAAE,IAAI,EAAE,CAAC,CAAC;6BACZ;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,SAAS;gCACjB,GAAG;6BACJ,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,KAAK,GAAG,IAAI,EAAE,MAAgB,CAAC;gBACrC,MAAM,SAAS,GAAG,IAAI,EAAE,UAAoB,CAAC;gBAC7C,MAAM,OAAO,GAAI,IAAI,EAAE,QAAmB,IAAI,gBAAgB,CAAC;gBAE/D,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBAE5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACnB,MAAM,EAAE,OAAO;oCACf,OAAO,EAAE,MAAM,CAAC,KAAK;iCACtB,EAAE,IAAI,EAAE,CAAC,CAAC;6BACZ;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;gBAEjC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,SAAS;gCACjB,OAAO,EAAE,oCAAoC,KAAK,EAAE;gCACpD,QAAQ,EAAE;oCACR,EAAE,EAAE,MAAM,CAAC,QAAS,CAAC,EAAE;oCACvB,QAAQ,EAAE,KAAK;oCACf,eAAe,EAAE,SAAS;oCAC1B,gBAAgB,EAAE,MAAM,CAAC,QAAS,CAAC,iBAAiB;oCACpD,MAAM,EAAE,MAAM,CAAC,QAAS,CAAC,MAAM;oCAC/B,gBAAgB,EAAE,kBAAkB,CAAC,KAAK,CAAC;iCAC5C;gCACD,WAAW,EAAE,MAAM,CAAC,QAAS,CAAC,WAAW;gCACzC,MAAM,EAAE;oCACN,QAAQ,EAAE,GAAG,EAAE,QAAQ;oCACvB,QAAQ,EAAE,GAAG,EAAE,QAAQ;oCACvB,SAAS,EAAE,GAAG,EAAE,SAAS;iCAC1B;6BACF,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,OAAO,GAAI,IAAI,EAAE,QAAmB,IAAI,gBAAgB,CAAC;gBAC/D,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAE3C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,SAAS;gCACjB,QAAQ,EAAE,OAAO;gCACjB,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW;gCACxC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;gCAClC,eAAe,EAAE,OAAO,CAAC,eAAe;gCACxC,yBAAyB,EAAE,OAAO,CAAC,0BAA0B;gCAC7D,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oCACnD,EAAE,EAAE,CAAC,CAAC,EAAE;oCACR,QAAQ,EAAE,CAAC,CAAC,WAAW;oCACvB,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;oCACtC,MAAM,EAAE,CAAC,CAAC,MAAM;oCAChB,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC;iCACpD,CAAC,CAAC;6BACJ,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,SAAS,GAAG,IAAI,EAAE,UAAoB,CAAC;gBAC7C,MAAM,OAAO,GAAI,IAAI,EAAE,QAAmB,IAAI,gBAAgB,CAAC;gBAE/D,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAE/C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,SAAS;gCACjB,OAAO,EAAE,UAAU,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB;gCACzD,eAAe,EAAE,OAAO,CAAC,WAAW;6BACrC,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;gBACnC,MAAM,cAAc,GAA6B,EAAE,CAAC;gBAEpD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC7B,cAAc,CAAC,GAAG,CAAC,GAAG,UAAU,EAAE;yBAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC;yBAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpB,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,SAAS;gCACjB,UAAU,EAAE,cAAc;6BAC3B,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAkB,CAAC;gBAC1C,MAAM,MAAM,GAAG,IAAI,EAAE,MAAgB,CAAC;gBACtC,MAAM,MAAM,GAAI,IAAI,EAAE,MAA8B,IAAI,EAAE,CAAC;gBAE3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,IAAI,MAAyG,CAAC;gBAC9G,IAAI,OAA0B,CAAC;gBAE/B,sDAAsD;gBACtD,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxB,OAAO,GAAG,MAAM,CAAC;oBACjB,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC1D,CAAC;qBAAM,CAAC;oBACN,oDAAoD;oBACpD,OAAO,GAAG,QAAQ,CAAC;oBACnB,MAAM,WAAW,GAAI,IAAI,EAAE,YAAuB,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;oBAC/E,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;gBACzF,CAAC;gBAED,iCAAiC;gBACjC,UAAU,CAAC;oBACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,QAAQ;oBACR,MAAM;oBACN,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,gBAAgB;oBACxB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACjC,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;gCAC5C,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gCACrB,IAAI,EAAE,OAAO;gCACb,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;gCACrE,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;6BAChE,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;oBACD,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO;iBACzB,CAAC;YACJ,CAAC;YAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;gBAChD,MAAM,aAAa,GAAG,YAAY,EAAE,CAAC;gBAErC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,SAAS;gCACjB,OAAO,EAAE,4DAA4D;gCACrE,WAAW,EAAE;oCACX,WAAW,EAAE,qCAAqC;oCAClD,SAAS,EAAE,eAAe;iCAC3B;gCACD,SAAS,EAAE;oCACT,WAAW,EAAE,oCAAoC;oCACjD,SAAS,EAAE,aAAa;iCACzB;gCACD,KAAK,EAAE,kEAAkE;6BAC1E,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;iBACF,CAAC;YACJ,CAAC;YAED;gBACE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,MAAM,EAAE,OAAO;gCACf,OAAO,EAAE,iBAAiB,IAAI,EAAE;6BACjC,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,MAAM,EAAE,OAAO;wBACf,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAClE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,YAAY,EAAE,CAAC;IAEf,kCAAkC;IAClC,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;CAmBf,CAAC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nordsym/apiclaw",
3
- "version": "1.2.8",
3
+ "version": "1.2.9",
4
4
  "description": "Agent-native API discovery and Direct Call execution via MCP",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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 Direct Call. No API keys needed - we handle authentication. For providers that require customer authentication (like CoAccept), pass your own API key via customer_key.',
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", "text_to_speech")'
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. If not provided, uses APIClaw shared credentials (where available).'
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', 'params']
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 an Open API (free, no auth needed)
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);