@sendinel/mcp-server 1.0.145 → 1.0.147

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/build/lib/action-approvals.js +3 -1
  2. package/build/lib/db-error.d.ts +39 -6
  3. package/build/lib/db-error.js +221 -11
  4. package/build/lib/tags.d.ts +10 -0
  5. package/build/lib/tags.js +29 -0
  6. package/build/server.js +5 -3
  7. package/build/tools/ab-testing.js +4 -3
  8. package/build/tools/advisor.js +2 -2
  9. package/build/tools/ai-work.js +14 -13
  10. package/build/tools/analytics.js +26 -26
  11. package/build/tools/approvals.js +3 -1
  12. package/build/tools/automations.js +12 -11
  13. package/build/tools/brand-kit.js +4 -3
  14. package/build/tools/campaign-sets.js +11 -10
  15. package/build/tools/campaigns.js +73 -74
  16. package/build/tools/compound.js +7 -6
  17. package/build/tools/connector.js +4 -3
  18. package/build/tools/contacts.js +116 -86
  19. package/build/tools/content.js +16 -16
  20. package/build/tools/convert-imported.js +8 -7
  21. package/build/tools/data-proposals.js +8 -7
  22. package/build/tools/data.js +39 -38
  23. package/build/tools/delivery-ops.js +32 -32
  24. package/build/tools/drafts.js +10 -9
  25. package/build/tools/forms.js +5 -4
  26. package/build/tools/gdpr.js +10 -9
  27. package/build/tools/landing-pages.js +3 -3
  28. package/build/tools/lists.js +21 -20
  29. package/build/tools/newsletters.js +26 -25
  30. package/build/tools/org.js +26 -23
  31. package/build/tools/segments.js +4 -5
  32. package/build/tools/short-links.js +7 -6
  33. package/build/tools/signatures.js +10 -9
  34. package/build/tools/sites.js +9 -8
  35. package/build/tools/sms.js +14 -13
  36. package/build/tools/social-posts.js +20 -19
  37. package/build/tools/social-replies.js +7 -6
  38. package/build/tools/surveys.js +10 -9
  39. package/build/tools/templates.js +14 -13
  40. package/build/tools/warmup.js +5 -4
  41. package/build/tools/webhooks.js +5 -4
  42. package/package.json +1 -1
  43. package/build/lib/db-errors.d.ts +0 -12
  44. package/build/lib/db-errors.js +0 -20
@@ -6,6 +6,7 @@ import { getProjectId } from '../project.js';
6
6
  import { buildVoicePrompt, deriveTemplateVariables } from '../lib/voice.js';
7
7
  import { parseModelJson, getAnthropicFastModelId } from '../anthropic-model.js';
8
8
  import { BLOCK_GENERATION_SCHEMA, blocksToHtml, blocksToText, normalizeComposerBlocks } from '../lib/composer-blocks.js';
9
+ import { dbToolError } from '../lib/db-error.js';
9
10
  // Haiku 5.5 (fast role) thinks before answering; thinking counts toward max_tokens (#4193).
10
11
  const FAST_MIN_MAX_TOKENS = 8000;
11
12
  const j = (data) => ({ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] });
@@ -128,13 +129,13 @@ Respond with a JSON array.`,
128
129
  .select('id')
129
130
  .single();
130
131
  if (templateErr)
131
- return j({ error: `Template creation failed: ${templateErr.message}` });
132
+ return j({ error: `Template creation failed: ${dbToolError(templateErr).error}` });
132
133
  const { data: campaign, error: campaignErr } = await sb.from('campaigns')
133
134
  .insert({ name: campaign_name, site_id, project_id: projectId, type: campaign_type, status: 'draft' })
134
135
  .select('id, name, status')
135
136
  .single();
136
137
  if (campaignErr)
137
- return j({ error: `Campaign creation failed: ${campaignErr.message}` });
138
+ return j({ error: `Campaign creation failed: ${dbToolError(campaignErr).error}` });
138
139
  const createdSteps = [];
139
140
  for (let i = 0; i < steps.length; i++) {
140
141
  const step = steps[i];
@@ -153,7 +154,7 @@ Respond with a JSON array.`,
153
154
  .select('id, step_order, subject')
154
155
  .single();
155
156
  if (error)
156
- return j({ error: `Step ${i + 1} creation failed: ${error.message}`, campaign_id: campaign.id });
157
+ return j({ error: `Step ${i + 1} creation failed: ${dbToolError(error).error}`, campaign_id: campaign.id });
157
158
  createdSteps.push(data);
158
159
  }
159
160
  return j({
@@ -236,7 +237,7 @@ Respond with JSON: { "subject": "...", "blocks": [...], "body_text": "..." }`,
236
237
  .select('id, name, subject_hint, created_at')
237
238
  .single();
238
239
  if (error)
239
- return j({ error: error.message });
240
+ return j(dbToolError(error));
240
241
  return j({ ok: true, template, preview: generated });
241
242
  });
242
243
  server.registerTool('diagnose_delivery_issue', {
@@ -354,7 +355,7 @@ Identify the most likely root cause and give 3-5 concise actionable next steps.`
354
355
  .select('id, name, provider, status, dns_records')
355
356
  .single();
356
357
  if (domainErr)
357
- return j({ error: `Domain registration failed: ${domainErr.message}` });
358
+ return j({ error: `Domain registration failed: ${dbToolError(domainErr).error}` });
358
359
  const { data: site, error: siteErr } = await sb.from('sites')
359
360
  .insert({
360
361
  project_id: projectId,
@@ -372,7 +373,7 @@ Identify the most likely root cause and give 3-5 concise actionable next steps.`
372
373
  .select('id, name, slug, sending_domain, from_name, from_email, provider, created_at')
373
374
  .single();
374
375
  if (siteErr)
375
- return j({ error: `Site creation failed: ${siteErr.message}` });
376
+ return j({ error: `Site creation failed: ${dbToolError(siteErr).error}` });
376
377
  const warmupPlan = [];
377
378
  let volume = Math.max(10, Math.floor(daily_send_volume * 0.05));
378
379
  for (let day = 1; day <= 14; day += 3) {
@@ -4,6 +4,7 @@ import { getProjectId } from '../project.js';
4
4
  import { listConnectorTablesFromDb } from '../lib/connector-table-discovery.js';
5
5
  import { callSendinelV1 } from '../lib/v1-client.js';
6
6
  import { assertChannelCanExecute, checkApproval, currentChannelContext, requestApproval, } from '../lib/action-approvals.js';
7
+ import { dbToolError } from '../lib/db-error.js';
7
8
  const j = (data) => ({ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] });
8
9
  const SECRET_RESPONSE_KEYS = new Set([
9
10
  'connector_supabase_key_enc',
@@ -144,7 +145,7 @@ export function registerConnectorTools(server) {
144
145
  data = await getConnectorStatus();
145
146
  }
146
147
  catch (error) {
147
- return j({ error: error instanceof Error ? error.message : 'Connector status query failed' });
148
+ return j({ error: error instanceof Error ? dbToolError(error).error : 'Connector status query failed' });
148
149
  }
149
150
  if (!data || typeof data !== 'object' || typeof data.viewInstalled !== 'boolean') {
150
151
  return j({ error: 'Connector status did not include the required viewInstalled boolean.' });
@@ -166,7 +167,7 @@ export function registerConnectorTools(server) {
166
167
  const { data: project, error } = await adminDb().schema('email').from('projects')
167
168
  .select('connector_type').eq('id', projectId).maybeSingle();
168
169
  if (error)
169
- return j({ error: error.message });
170
+ return j(dbToolError(error));
170
171
  if (project?.connector_type !== 'byod') {
171
172
  return j({ error: 'Connect your Supabase database in Settings before importing from it.' });
172
173
  }
@@ -174,7 +175,7 @@ export function registerConnectorTools(server) {
174
175
  return j({ tables: await listConnectorTablesFromDb(db()) });
175
176
  }
176
177
  catch (tableError) {
177
- return j({ error: tableError instanceof Error ? tableError.message : 'Could not list database tables' });
178
+ return j({ error: tableError instanceof Error ? dbToolError(tableError).error : 'Could not list database tables' });
178
179
  }
179
180
  });
180
181
  server.registerTool('install_connector_schema', {