@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.
- package/build/lib/action-approvals.js +3 -1
- package/build/lib/db-error.d.ts +39 -6
- package/build/lib/db-error.js +221 -11
- package/build/lib/tags.d.ts +10 -0
- package/build/lib/tags.js +29 -0
- package/build/server.js +5 -3
- package/build/tools/ab-testing.js +4 -3
- package/build/tools/advisor.js +2 -2
- package/build/tools/ai-work.js +14 -13
- package/build/tools/analytics.js +26 -26
- package/build/tools/approvals.js +3 -1
- package/build/tools/automations.js +12 -11
- package/build/tools/brand-kit.js +4 -3
- package/build/tools/campaign-sets.js +11 -10
- package/build/tools/campaigns.js +73 -74
- package/build/tools/compound.js +7 -6
- package/build/tools/connector.js +4 -3
- package/build/tools/contacts.js +116 -86
- package/build/tools/content.js +16 -16
- package/build/tools/convert-imported.js +8 -7
- package/build/tools/data-proposals.js +8 -7
- package/build/tools/data.js +39 -38
- package/build/tools/delivery-ops.js +32 -32
- package/build/tools/drafts.js +10 -9
- package/build/tools/forms.js +5 -4
- package/build/tools/gdpr.js +10 -9
- package/build/tools/landing-pages.js +3 -3
- package/build/tools/lists.js +21 -20
- package/build/tools/newsletters.js +26 -25
- package/build/tools/org.js +26 -23
- package/build/tools/segments.js +4 -5
- package/build/tools/short-links.js +7 -6
- package/build/tools/signatures.js +10 -9
- package/build/tools/sites.js +9 -8
- package/build/tools/sms.js +14 -13
- package/build/tools/social-posts.js +20 -19
- package/build/tools/social-replies.js +7 -6
- package/build/tools/surveys.js +10 -9
- package/build/tools/templates.js +14 -13
- package/build/tools/warmup.js +5 -4
- package/build/tools/webhooks.js +5 -4
- package/package.json +1 -1
- package/build/lib/db-errors.d.ts +0 -12
- package/build/lib/db-errors.js +0 -20
package/build/tools/compound.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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(
|
|
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.
|
|
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.
|
|
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) {
|
package/build/tools/connector.js
CHANGED
|
@@ -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.
|
|
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(
|
|
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.
|
|
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', {
|