@raytio/mcp-server 1.16.1 → 1.18.0
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/ppm/__fixtures__/work-item.d.ts.map +1 -1
- package/dist/ppm/__fixtures__/work-item.js +1 -0
- package/dist/ppm/__fixtures__/work-item.js.map +1 -1
- package/dist/ppm/projection.d.ts.map +1 -1
- package/dist/ppm/projection.js +1 -0
- package/dist/ppm/projection.js.map +1 -1
- package/dist/ppm/types.d.ts +1 -0
- package/dist/ppm/types.d.ts.map +1 -1
- package/dist/raytio/api-client.d.ts +20 -1
- package/dist/raytio/api-client.d.ts.map +1 -1
- package/dist/raytio/api-client.js +18 -1
- package/dist/raytio/api-client.js.map +1 -1
- package/dist/sfa/filters.d.ts +49 -0
- package/dist/sfa/filters.d.ts.map +1 -0
- package/dist/sfa/filters.js +93 -0
- package/dist/sfa/filters.js.map +1 -0
- package/dist/sfa/projection.d.ts +9 -0
- package/dist/sfa/projection.d.ts.map +1 -0
- package/dist/sfa/projection.js +57 -0
- package/dist/sfa/projection.js.map +1 -0
- package/dist/sfa/types.d.ts +107 -0
- package/dist/sfa/types.d.ts.map +1 -0
- package/dist/sfa/types.js +2 -0
- package/dist/sfa/types.js.map +1 -0
- package/dist/tools/domains.d.ts.map +1 -1
- package/dist/tools/domains.js +21 -0
- package/dist/tools/domains.js.map +1 -1
- package/dist/tools/ppm/work-item-create.d.ts.map +1 -1
- package/dist/tools/ppm/work-item-create.js +2 -1
- package/dist/tools/ppm/work-item-create.js.map +1 -1
- package/dist/tools/ppm/work-item-update.d.ts.map +1 -1
- package/dist/tools/ppm/work-item-update.js +1 -0
- package/dist/tools/ppm/work-item-update.js.map +1 -1
- package/dist/tools/role-mapping.d.ts.map +1 -1
- package/dist/tools/role-mapping.js +6 -0
- package/dist/tools/role-mapping.js.map +1 -1
- package/dist/tools/sfa/activity-create.d.ts +3 -0
- package/dist/tools/sfa/activity-create.d.ts.map +1 -0
- package/dist/tools/sfa/activity-create.js +49 -0
- package/dist/tools/sfa/activity-create.js.map +1 -0
- package/dist/tools/sfa/activity-list.d.ts +3 -0
- package/dist/tools/sfa/activity-list.d.ts.map +1 -0
- package/dist/tools/sfa/activity-list.js +47 -0
- package/dist/tools/sfa/activity-list.js.map +1 -0
- package/dist/tools/sfa/deal-advance-stage.d.ts +13 -0
- package/dist/tools/sfa/deal-advance-stage.d.ts.map +1 -0
- package/dist/tools/sfa/deal-advance-stage.js +48 -0
- package/dist/tools/sfa/deal-advance-stage.js.map +1 -0
- package/dist/tools/sfa/deal-create.d.ts +3 -0
- package/dist/tools/sfa/deal-create.d.ts.map +1 -0
- package/dist/tools/sfa/deal-create.js +51 -0
- package/dist/tools/sfa/deal-create.js.map +1 -0
- package/dist/tools/sfa/deal-get.d.ts +3 -0
- package/dist/tools/sfa/deal-get.d.ts.map +1 -0
- package/dist/tools/sfa/deal-get.js +24 -0
- package/dist/tools/sfa/deal-get.js.map +1 -0
- package/dist/tools/sfa/deal-line-create.d.ts +3 -0
- package/dist/tools/sfa/deal-line-create.d.ts.map +1 -0
- package/dist/tools/sfa/deal-line-create.js +37 -0
- package/dist/tools/sfa/deal-line-create.js.map +1 -0
- package/dist/tools/sfa/deal-line-list.d.ts +3 -0
- package/dist/tools/sfa/deal-line-list.d.ts.map +1 -0
- package/dist/tools/sfa/deal-line-list.js +44 -0
- package/dist/tools/sfa/deal-line-list.js.map +1 -0
- package/dist/tools/sfa/deal-list.d.ts +3 -0
- package/dist/tools/sfa/deal-list.d.ts.map +1 -0
- package/dist/tools/sfa/deal-list.js +40 -0
- package/dist/tools/sfa/deal-list.js.map +1 -0
- package/dist/tools/sfa/deal-update.d.ts +3 -0
- package/dist/tools/sfa/deal-update.d.ts.map +1 -0
- package/dist/tools/sfa/deal-update.js +56 -0
- package/dist/tools/sfa/deal-update.js.map +1 -0
- package/dist/tools/sfa/index.d.ts +3 -0
- package/dist/tools/sfa/index.d.ts.map +1 -0
- package/dist/tools/sfa/index.js +49 -0
- package/dist/tools/sfa/index.js.map +1 -0
- package/dist/tools/sfa/lead-convert.d.ts +15 -0
- package/dist/tools/sfa/lead-convert.d.ts.map +1 -0
- package/dist/tools/sfa/lead-convert.js +57 -0
- package/dist/tools/sfa/lead-convert.js.map +1 -0
- package/dist/tools/sfa/lead-create.d.ts +3 -0
- package/dist/tools/sfa/lead-create.d.ts.map +1 -0
- package/dist/tools/sfa/lead-create.js +52 -0
- package/dist/tools/sfa/lead-create.js.map +1 -0
- package/dist/tools/sfa/lead-dedup.d.ts +13 -0
- package/dist/tools/sfa/lead-dedup.d.ts.map +1 -0
- package/dist/tools/sfa/lead-dedup.js +43 -0
- package/dist/tools/sfa/lead-dedup.js.map +1 -0
- package/dist/tools/sfa/lead-get.d.ts +3 -0
- package/dist/tools/sfa/lead-get.d.ts.map +1 -0
- package/dist/tools/sfa/lead-get.js +24 -0
- package/dist/tools/sfa/lead-get.js.map +1 -0
- package/dist/tools/sfa/lead-import.d.ts +13 -0
- package/dist/tools/sfa/lead-import.d.ts.map +1 -0
- package/dist/tools/sfa/lead-import.js +55 -0
- package/dist/tools/sfa/lead-import.js.map +1 -0
- package/dist/tools/sfa/lead-list.d.ts +3 -0
- package/dist/tools/sfa/lead-list.d.ts.map +1 -0
- package/dist/tools/sfa/lead-list.js +40 -0
- package/dist/tools/sfa/lead-list.js.map +1 -0
- package/dist/tools/sfa/lead-promote.d.ts +14 -0
- package/dist/tools/sfa/lead-promote.d.ts.map +1 -0
- package/dist/tools/sfa/lead-promote.js +42 -0
- package/dist/tools/sfa/lead-promote.js.map +1 -0
- package/dist/tools/sfa/lead-source-list.d.ts +3 -0
- package/dist/tools/sfa/lead-source-list.d.ts.map +1 -0
- package/dist/tools/sfa/lead-source-list.js +45 -0
- package/dist/tools/sfa/lead-source-list.js.map +1 -0
- package/dist/tools/sfa/lead-staging-get.d.ts +3 -0
- package/dist/tools/sfa/lead-staging-get.d.ts.map +1 -0
- package/dist/tools/sfa/lead-staging-get.js +24 -0
- package/dist/tools/sfa/lead-staging-get.js.map +1 -0
- package/dist/tools/sfa/lead-staging-list.d.ts +3 -0
- package/dist/tools/sfa/lead-staging-list.d.ts.map +1 -0
- package/dist/tools/sfa/lead-staging-list.js +41 -0
- package/dist/tools/sfa/lead-staging-list.js.map +1 -0
- package/dist/tools/sfa/lead-update.d.ts +3 -0
- package/dist/tools/sfa/lead-update.d.ts.map +1 -0
- package/dist/tools/sfa/lead-update.js +56 -0
- package/dist/tools/sfa/lead-update.js.map +1 -0
- package/dist/tools/sfa/pipeline-list.d.ts +3 -0
- package/dist/tools/sfa/pipeline-list.d.ts.map +1 -0
- package/dist/tools/sfa/pipeline-list.js +44 -0
- package/dist/tools/sfa/pipeline-list.js.map +1 -0
- package/dist/tools/types.d.ts +2 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/tools/create-access-app.d.ts +0 -10
- package/dist/tools/create-access-app.d.ts.map +0 -1
- package/dist/tools/create-access-app.js +0 -20
- package/dist/tools/create-access-app.js.map +0 -1
- package/dist/tools/create-form.d.ts +0 -41
- package/dist/tools/create-form.d.ts.map +0 -1
- package/dist/tools/create-form.js +0 -81
- package/dist/tools/create-form.js.map +0 -1
- package/dist/tools/list-schemas.d.ts +0 -7
- package/dist/tools/list-schemas.d.ts.map +0 -1
- package/dist/tools/list-schemas.js +0 -19
- package/dist/tools/list-schemas.js.map +0 -1
- package/dist/tools/poll-and-retrieve.d.ts +0 -9
- package/dist/tools/poll-and-retrieve.d.ts.map +0 -1
- package/dist/tools/poll-and-retrieve.js +0 -48
- package/dist/tools/poll-and-retrieve.js.map +0 -1
- package/dist/tools/ppm/role-memory-create.d.ts +0 -3
- package/dist/tools/ppm/role-memory-create.d.ts.map +0 -1
- package/dist/tools/ppm/role-memory-create.js +0 -38
- package/dist/tools/ppm/role-memory-create.js.map +0 -1
- package/dist/tools/ppm/role-memory-get.d.ts +0 -3
- package/dist/tools/ppm/role-memory-get.d.ts.map +0 -1
- package/dist/tools/ppm/role-memory-get.js +0 -24
- package/dist/tools/ppm/role-memory-get.js.map +0 -1
- package/dist/tools/ppm/role-memory-list.d.ts +0 -3
- package/dist/tools/ppm/role-memory-list.d.ts.map +0 -1
- package/dist/tools/ppm/role-memory-list.js +0 -55
- package/dist/tools/ppm/role-memory-list.js.map +0 -1
- package/dist/tools/ppm/role-memory-update.d.ts +0 -3
- package/dist/tools/ppm/role-memory-update.d.ts.map +0 -1
- package/dist/tools/ppm/role-memory-update.js +0 -42
- package/dist/tools/ppm/role-memory-update.js.map +0 -1
- package/dist/tools/send-request.d.ts +0 -11
- package/dist/tools/send-request.d.ts.map +0 -1
- package/dist/tools/send-request.js +0 -24
- package/dist/tools/send-request.js.map +0 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { successResponse, errorResponse, SFA_NOT_FOUND, SFA_VALIDATION, API_ERROR, } from '../types.js';
|
|
3
|
+
import { SFA_DEAL_SELECT } from '../../sfa/projection.js';
|
|
4
|
+
const UUID_FIELDS = new Set([
|
|
5
|
+
'id', 'party_id', 'pipeline_id', 'stage_id', 'assigned_to', 'source_lead_id',
|
|
6
|
+
]);
|
|
7
|
+
export const dealUpdateTool = {
|
|
8
|
+
name: 'sfa_deal_update',
|
|
9
|
+
description: 'Update an SFA deal (generic CRUD). Pass null for a nullable field to clear it; omit the field to leave it unchanged.',
|
|
10
|
+
inputSchema: z.object({
|
|
11
|
+
id: z.string().describe('UUID of the deal'),
|
|
12
|
+
deal_name: z.string().optional().describe('Display name'),
|
|
13
|
+
party_id: z.string().optional().describe('UUID of the PRM party'),
|
|
14
|
+
pipeline_id: z.string().nullable().optional().describe('Pipeline UUID (null to clear)'),
|
|
15
|
+
stage_id: z.string().nullable().optional().describe('Stage UUID (null to clear)'),
|
|
16
|
+
deal_status: z.string().nullable().optional().describe('Deal status (null to clear)'),
|
|
17
|
+
amount: z.number().nullable().optional().describe('Deal amount (null to clear)'),
|
|
18
|
+
currency_code: z.string().nullable().optional().describe('ISO currency code (null to clear)'),
|
|
19
|
+
probability: z.number().min(0).max(100).nullable().optional()
|
|
20
|
+
.describe('Win probability percent (null to clear)'),
|
|
21
|
+
expected_close_date: z.string().nullable().optional()
|
|
22
|
+
.describe('Expected close date ISO 8601 (null to clear)'),
|
|
23
|
+
actual_close_date: z.string().nullable().optional()
|
|
24
|
+
.describe('Actual close date ISO 8601 (null to clear)'),
|
|
25
|
+
lost_reason: z.string().nullable().optional().describe('Reason lost (null to clear)'),
|
|
26
|
+
assigned_to: z.string().nullable().optional().describe('Assigned user UUID (null to clear)'),
|
|
27
|
+
active: z.boolean().optional().describe('Set to false for soft-delete'),
|
|
28
|
+
metadata: z.record(z.unknown()).nullable().optional()
|
|
29
|
+
.describe('Arbitrary JSON metadata object (null to clear)'),
|
|
30
|
+
}),
|
|
31
|
+
handler: async (args, ctx) => {
|
|
32
|
+
const { id, ...updates } = args;
|
|
33
|
+
for (const field of UUID_FIELDS) {
|
|
34
|
+
const value = field === 'id' ? id : updates[field];
|
|
35
|
+
if (value === '') {
|
|
36
|
+
return errorResponse(SFA_VALIDATION, `${field} must be a valid UUID, not an empty string`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const body = {};
|
|
41
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
42
|
+
if (value !== undefined)
|
|
43
|
+
body[key] = value;
|
|
44
|
+
}
|
|
45
|
+
const items = await ctx.apiClient.patch(`${ctx.apiClient.dbBasePath}/sfa_deals?id=eq.${id}&select=${SFA_DEAL_SELECT}`, body, { headers: { Prefer: 'return=representation' } });
|
|
46
|
+
if (!items || items.length === 0) {
|
|
47
|
+
return errorResponse(SFA_NOT_FOUND, `Deal ${id} not found`);
|
|
48
|
+
}
|
|
49
|
+
return successResponse(items[0]);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return errorResponse(API_ERROR, `Failed to update SFA deal: ${error.message}`);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=deal-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deal-update.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAuBtC,eAAO,MAAM,QAAQ,EAAE,IAAI,EA0B1B,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { leadListTool } from './lead-list.js';
|
|
2
|
+
import { leadGetTool } from './lead-get.js';
|
|
3
|
+
import { leadCreateTool } from './lead-create.js';
|
|
4
|
+
import { leadUpdateTool } from './lead-update.js';
|
|
5
|
+
import { leadConvertTool } from './lead-convert.js';
|
|
6
|
+
import { leadStagingListTool } from './lead-staging-list.js';
|
|
7
|
+
import { leadStagingGetTool } from './lead-staging-get.js';
|
|
8
|
+
import { leadImportTool } from './lead-import.js';
|
|
9
|
+
import { leadDedupTool } from './lead-dedup.js';
|
|
10
|
+
import { leadPromoteTool } from './lead-promote.js';
|
|
11
|
+
import { dealListTool } from './deal-list.js';
|
|
12
|
+
import { dealGetTool } from './deal-get.js';
|
|
13
|
+
import { dealCreateTool } from './deal-create.js';
|
|
14
|
+
import { dealUpdateTool } from './deal-update.js';
|
|
15
|
+
import { dealAdvanceStageTool } from './deal-advance-stage.js';
|
|
16
|
+
import { dealLineListTool } from './deal-line-list.js';
|
|
17
|
+
import { dealLineCreateTool } from './deal-line-create.js';
|
|
18
|
+
import { activityListTool } from './activity-list.js';
|
|
19
|
+
import { activityCreateTool } from './activity-create.js';
|
|
20
|
+
import { pipelineListTool } from './pipeline-list.js';
|
|
21
|
+
import { leadSourceListTool } from './lead-source-list.js';
|
|
22
|
+
export const sfaTools = [
|
|
23
|
+
// Read tools
|
|
24
|
+
leadListTool,
|
|
25
|
+
leadGetTool,
|
|
26
|
+
leadStagingListTool,
|
|
27
|
+
leadStagingGetTool,
|
|
28
|
+
dealListTool,
|
|
29
|
+
dealGetTool,
|
|
30
|
+
dealLineListTool,
|
|
31
|
+
activityListTool,
|
|
32
|
+
pipelineListTool,
|
|
33
|
+
leadSourceListTool,
|
|
34
|
+
// Authoring tools
|
|
35
|
+
leadCreateTool,
|
|
36
|
+
leadUpdateTool,
|
|
37
|
+
dealCreateTool,
|
|
38
|
+
dealUpdateTool,
|
|
39
|
+
dealLineCreateTool,
|
|
40
|
+
activityCreateTool,
|
|
41
|
+
// Lambda-backed semantic tools
|
|
42
|
+
leadConvertTool,
|
|
43
|
+
dealAdvanceStageTool,
|
|
44
|
+
// Lambda-backed sourcing pipeline tools
|
|
45
|
+
leadImportTool,
|
|
46
|
+
leadDedupTool,
|
|
47
|
+
leadPromoteTool,
|
|
48
|
+
];
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/sfa/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,CAAC,MAAM,QAAQ,GAAW;IAC9B,aAAa;IACb,YAAY;IACZ,WAAW;IACX,mBAAmB;IACnB,kBAAkB;IAClB,YAAY;IACZ,WAAW;IACX,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,kBAAkB;IAClB,kBAAkB;IAClB,+BAA+B;IAC/B,eAAe;IACf,oBAAoB;IACpB,wCAAwC;IACxC,cAAc;IACd,aAAa;IACb,eAAe;CAChB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Tool } from '../registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calls the sfa-lead-convert persist-functions Lambda
|
|
4
|
+
* (POST /persist/v2/sfa/lead/convert), gated on the SFA.CONVERT permission.
|
|
5
|
+
*
|
|
6
|
+
* Atomically:
|
|
7
|
+
* 1. Resolves or creates a `prm_party` (with contact points) for the lead.
|
|
8
|
+
* 2. Resolves or creates a `sfa_deal` (or attaches to an open deal).
|
|
9
|
+
* 3. Links the deal back to the party via `sfa_deal_contacts`.
|
|
10
|
+
* 4. Stamps the lead as `CONVERTED` and records `converted_party_id`,
|
|
11
|
+
* `converted_deal_id`, `converted_date`.
|
|
12
|
+
* 5. Logs a `CONVERTED` activity on the new deal.
|
|
13
|
+
*/
|
|
14
|
+
export declare const leadConvertTool: Tool;
|
|
15
|
+
//# sourceMappingURL=lead-convert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-convert.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-convert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,EAAE,IA2C7B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Calls the sfa-lead-convert persist-functions Lambda
|
|
5
|
+
* (POST /persist/v2/sfa/lead/convert), gated on the SFA.CONVERT permission.
|
|
6
|
+
*
|
|
7
|
+
* Atomically:
|
|
8
|
+
* 1. Resolves or creates a `prm_party` (with contact points) for the lead.
|
|
9
|
+
* 2. Resolves or creates a `sfa_deal` (or attaches to an open deal).
|
|
10
|
+
* 3. Links the deal back to the party via `sfa_deal_contacts`.
|
|
11
|
+
* 4. Stamps the lead as `CONVERTED` and records `converted_party_id`,
|
|
12
|
+
* `converted_deal_id`, `converted_date`.
|
|
13
|
+
* 5. Logs a `CONVERTED` activity on the new deal.
|
|
14
|
+
*/
|
|
15
|
+
export const leadConvertTool = {
|
|
16
|
+
name: 'sfa_lead_convert',
|
|
17
|
+
description: 'Convert an SFA lead to a PRM party + SFA deal in a single transaction. Calls the sfa-lead-convert Lambda; requires SFA.CONVERT permission.',
|
|
18
|
+
inputSchema: z.object({
|
|
19
|
+
lead_id: z.string().describe('UUID of the lead to convert'),
|
|
20
|
+
pipeline_id: z.string().optional()
|
|
21
|
+
.describe('Pipeline for the new deal (defaults to tenant default)'),
|
|
22
|
+
stage_id: z.string().optional().describe('Initial stage UUID for the new deal'),
|
|
23
|
+
deal_name: z.string().optional()
|
|
24
|
+
.describe('Override deal name (defaults to the lead name)'),
|
|
25
|
+
amount: z.number().optional().describe('Deal amount'),
|
|
26
|
+
currency_code: z.string().optional().describe('ISO currency code for the deal'),
|
|
27
|
+
probability: z.number().min(0).max(100).optional()
|
|
28
|
+
.describe('Win probability percent (0-100)'),
|
|
29
|
+
expected_close_date: z.string().optional()
|
|
30
|
+
.describe('Expected close date (ISO 8601)'),
|
|
31
|
+
party_type: z.string().optional()
|
|
32
|
+
.describe('party_type for a newly-created party (e.g. ORGANISATION)'),
|
|
33
|
+
attach_to_existing_open_deal: z.boolean().optional()
|
|
34
|
+
.describe('When true and the party has an open deal, reuse it instead of creating a new one'),
|
|
35
|
+
}),
|
|
36
|
+
handler: async (args, ctx) => {
|
|
37
|
+
const input = args;
|
|
38
|
+
try {
|
|
39
|
+
const body = { lead_id: input.lead_id };
|
|
40
|
+
const optional = [
|
|
41
|
+
'pipeline_id', 'stage_id', 'deal_name',
|
|
42
|
+
'amount', 'currency_code', 'probability',
|
|
43
|
+
'expected_close_date', 'party_type', 'attach_to_existing_open_deal',
|
|
44
|
+
];
|
|
45
|
+
for (const field of optional) {
|
|
46
|
+
if (input[field] !== undefined)
|
|
47
|
+
body[field] = input[field];
|
|
48
|
+
}
|
|
49
|
+
const result = await ctx.apiClient.postLambda('/sfa/lead/convert', body);
|
|
50
|
+
return successResponse(result);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return errorResponse(API_ERROR, `Failed to convert SFA lead: ${error.message}`);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=lead-convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-convert.js","sourceRoot":"","sources":["../../../src/tools/sfa/lead-convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,4IAA4I;IAC9I,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC3D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,QAAQ,CAAC,wDAAwD,CAAC;QACrE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAC/E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC7B,QAAQ,CAAC,gDAAgD,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC/E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;aAC/C,QAAQ,CAAC,iCAAiC,CAAC;QAC9C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aACvC,QAAQ,CAAC,gCAAgC,CAAC;QAC7C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC9B,QAAQ,CAAC,0DAA0D,CAAC;QACvE,4BAA4B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aACjD,QAAQ,CAAC,kFAAkF,CAAC;KAChG,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAwB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG;gBACf,aAAa,EAAE,UAAU,EAAE,WAAW;gBACtC,QAAQ,EAAE,eAAe,EAAE,aAAa;gBACxC,qBAAqB,EAAE,YAAY,EAAE,8BAA8B;aACpE,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,CAC3C,mBAAmB,EACnB,IAAI,CACL,CAAC;YACF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAatC,eAAO,MAAM,cAAc,EAAE,IA0C5B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
|
+
import { SFA_LEAD_SELECT } from '../../sfa/projection.js';
|
|
4
|
+
const OPTIONAL_FIELDS = [
|
|
5
|
+
'first_name', 'last_name', 'company_name', 'job_title',
|
|
6
|
+
'email', 'phone',
|
|
7
|
+
'lead_status', 'lead_rating', 'lead_score',
|
|
8
|
+
'lead_source_id', 'party_id', 'assigned_to',
|
|
9
|
+
'enrichment', 'metadata',
|
|
10
|
+
];
|
|
11
|
+
export const leadCreateTool = {
|
|
12
|
+
name: 'sfa_lead_create',
|
|
13
|
+
description: 'Create a new SFA sales lead',
|
|
14
|
+
inputSchema: z.object({
|
|
15
|
+
lead_name: z.string().describe('Display name of the lead'),
|
|
16
|
+
first_name: z.string().optional().describe('First name'),
|
|
17
|
+
last_name: z.string().optional().describe('Last name'),
|
|
18
|
+
company_name: z.string().optional().describe('Company name'),
|
|
19
|
+
job_title: z.string().optional().describe('Job title'),
|
|
20
|
+
email: z.string().optional().describe('Email address'),
|
|
21
|
+
phone: z.string().optional().describe('Phone number'),
|
|
22
|
+
lead_status: z.string().optional()
|
|
23
|
+
.describe('Lead status (validated against SFA_LEAD_STATUS lookup)'),
|
|
24
|
+
lead_rating: z.string().optional()
|
|
25
|
+
.describe('Lead rating (validated against SFA_LEAD_RATING lookup)'),
|
|
26
|
+
lead_score: z.number().optional().describe('Lead score (integer)'),
|
|
27
|
+
lead_source_id: z.string().optional().describe('Lead source UUID FK'),
|
|
28
|
+
party_id: z.string().optional()
|
|
29
|
+
.describe('Linked PRM party UUID FK (existing thin party reference)'),
|
|
30
|
+
assigned_to: z.string().optional().describe('UUID of the user assigned to the lead'),
|
|
31
|
+
enrichment: z.record(z.unknown()).optional()
|
|
32
|
+
.describe('Lead enrichment payload (JSONB)'),
|
|
33
|
+
metadata: z.record(z.unknown()).optional()
|
|
34
|
+
.describe('Arbitrary JSON metadata object'),
|
|
35
|
+
}),
|
|
36
|
+
handler: async (args, ctx) => {
|
|
37
|
+
const input = args;
|
|
38
|
+
try {
|
|
39
|
+
const body = { lead_name: input.lead_name };
|
|
40
|
+
for (const field of OPTIONAL_FIELDS) {
|
|
41
|
+
if (input[field] !== undefined)
|
|
42
|
+
body[field] = input[field];
|
|
43
|
+
}
|
|
44
|
+
const items = await ctx.apiClient.post(`${ctx.apiClient.dbBasePath}/sfa_leads?select=${SFA_LEAD_SELECT}`, body, { headers: { Prefer: 'return=representation' } });
|
|
45
|
+
return successResponse(items[0]);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return errorResponse(API_ERROR, `Failed to create SFA lead: ${error.message}`);
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=lead-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-create.js","sourceRoot":"","sources":["../../../src/tools/sfa/lead-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,MAAM,eAAe,GAAG;IACtB,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW;IACtD,OAAO,EAAE,OAAO;IAChB,aAAa,EAAE,aAAa,EAAE,YAAY;IAC1C,gBAAgB,EAAE,UAAU,EAAE,aAAa;IAC3C,YAAY,EAAE,UAAU;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAC1D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACtD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACrD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,QAAQ,CAAC,wDAAwD,CAAC;QACrE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,QAAQ,CAAC,wDAAwD,CAAC;QACrE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAClE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACrE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC5B,QAAQ,CAAC,0DAA0D,CAAC;QACvE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACpF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;aACzC,QAAQ,CAAC,iCAAiC,CAAC;QAC9C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;aACvC,QAAQ,CAAC,gCAAgC,CAAC;KAC9C,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAwB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;YACjE,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CACpC,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,qBAAqB,eAAe,EAAE,EACjE,IAAI,EACJ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,EAAE,CACjD,CAAC;YACF,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Tool } from '../registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calls the sfa-lead-dedup persist-functions Lambda
|
|
4
|
+
* (POST /persist/v2/sfa/lead/dedup).
|
|
5
|
+
*
|
|
6
|
+
* Runs fuzzy deduplication on PENDING `t_sfa_lead_staging` rows using
|
|
7
|
+
* `pg_trgm` similarity over identifying fields. Stamps `dedup_status`
|
|
8
|
+
* (NEW/MATCHED/REJECTED), `dedup_score`, and matched lead/party IDs
|
|
9
|
+
* back on each staging row. On success it enqueues a follow-up
|
|
10
|
+
* `sfa_lead_promote` job (unless `trigger_promote=false`).
|
|
11
|
+
*/
|
|
12
|
+
export declare const leadDedupTool: Tool;
|
|
13
|
+
//# sourceMappingURL=lead-dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-dedup.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-dedup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,EAAE,IA+B3B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Calls the sfa-lead-dedup persist-functions Lambda
|
|
5
|
+
* (POST /persist/v2/sfa/lead/dedup).
|
|
6
|
+
*
|
|
7
|
+
* Runs fuzzy deduplication on PENDING `t_sfa_lead_staging` rows using
|
|
8
|
+
* `pg_trgm` similarity over identifying fields. Stamps `dedup_status`
|
|
9
|
+
* (NEW/MATCHED/REJECTED), `dedup_score`, and matched lead/party IDs
|
|
10
|
+
* back on each staging row. On success it enqueues a follow-up
|
|
11
|
+
* `sfa_lead_promote` job (unless `trigger_promote=false`).
|
|
12
|
+
*/
|
|
13
|
+
export const leadDedupTool = {
|
|
14
|
+
name: 'sfa_lead_dedup',
|
|
15
|
+
description: 'Trigger SFA lead-staging deduplication. Calls the sfa-lead-dedup Lambda which fuzzy-matches PENDING staging rows against existing leads + parties via pg_trgm, then (by default) chains into promote. Requires SFA.INSERT permission.',
|
|
16
|
+
inputSchema: z.object({
|
|
17
|
+
staging_ids: z.array(z.string()).optional()
|
|
18
|
+
.describe('Explicit list of staging row UUIDs to dedup. Omit to process all PENDING rows for the tenant up to limit.'),
|
|
19
|
+
match_threshold: z.number().min(0).max(1).optional()
|
|
20
|
+
.describe('Minimum pg_trgm similarity (0–1) to mark a row MATCHED (default 0.80)'),
|
|
21
|
+
limit: z.number().int().min(1).max(1000).optional()
|
|
22
|
+
.describe('Max PENDING rows to process when no staging_ids list is provided (default 100, max 1000)'),
|
|
23
|
+
trigger_promote: z.boolean().optional()
|
|
24
|
+
.describe('When TRUE (default), enqueue a sfa_lead_promote job after a batch with NEW/MATCHED rows'),
|
|
25
|
+
}),
|
|
26
|
+
handler: async (args, ctx) => {
|
|
27
|
+
const input = args;
|
|
28
|
+
try {
|
|
29
|
+
const body = {};
|
|
30
|
+
const optional = ['staging_ids', 'match_threshold', 'limit', 'trigger_promote'];
|
|
31
|
+
for (const field of optional) {
|
|
32
|
+
if (input[field] !== undefined)
|
|
33
|
+
body[field] = input[field];
|
|
34
|
+
}
|
|
35
|
+
const result = await ctx.apiClient.postLambda('/sfa/lead/dedup', body);
|
|
36
|
+
return successResponse(result);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return errorResponse(API_ERROR, `Failed to trigger SFA lead dedup: ${error.message}`);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=lead-dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-dedup.js","sourceRoot":"","sources":["../../../src/tools/sfa/lead-dedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,uOAAuO;IACzO,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aACxC,QAAQ,CAAC,2GAA2G,CAAC;QACxH,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;aACjD,QAAQ,CAAC,uEAAuE,CAAC;QACpF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;aAChD,QAAQ,CAAC,0FAA0F,CAAC;QACvG,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aACpC,QAAQ,CAAC,yFAAyF,CAAC;KACvG,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAwB,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,CAAC,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;YAChF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,CAC3C,iBAAiB,EACjB,IAAI,CACL,CAAC;YACF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-get.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,WAAW,EAAE,IAoBzB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { successResponse, errorResponse, SFA_NOT_FOUND, API_ERROR } from '../types.js';
|
|
3
|
+
import { SFA_LEAD_SELECT } from '../../sfa/projection.js';
|
|
4
|
+
export const leadGetTool = {
|
|
5
|
+
name: 'sfa_lead_get',
|
|
6
|
+
description: 'Get a single SFA lead by ID (UUID)',
|
|
7
|
+
inputSchema: z.object({
|
|
8
|
+
id: z.string().describe('UUID of the lead'),
|
|
9
|
+
}),
|
|
10
|
+
handler: async (args, ctx) => {
|
|
11
|
+
const { id } = args;
|
|
12
|
+
try {
|
|
13
|
+
const items = await ctx.apiClient.get(`${ctx.apiClient.dbBasePath}/sfa_leads?id=eq.${id}&select=${SFA_LEAD_SELECT}`);
|
|
14
|
+
if (!items || items.length === 0) {
|
|
15
|
+
return errorResponse(SFA_NOT_FOUND, `Lead ${id} not found`);
|
|
16
|
+
}
|
|
17
|
+
return successResponse(items[0]);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
return errorResponse(API_ERROR, `Failed to get SFA lead: ${error.message}`);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=lead-get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-get.js","sourceRoot":"","sources":["../../../src/tools/sfa/lead-get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oCAAoC;IACjD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC5C,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,EAAE,EAAE,EAAE,GAAG,IAAsB,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACnC,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,oBAAoB,EAAE,WAAW,eAAe,EAAE,CAC9E,CAAC;YACF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,aAAa,CAAC,aAAa,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Tool } from '../registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calls the sfa-lead-import persist-functions Lambda
|
|
4
|
+
* (POST /persist/v2/sfa/lead/import).
|
|
5
|
+
*
|
|
6
|
+
* Triggers a CSV-from-S3 ingestion run: the Lambda reads the CSV, applies
|
|
7
|
+
* the provided column mapping to each record, and inserts one
|
|
8
|
+
* `t_sfa_lead_staging` row per record with `source_type='IMPORT'`. On
|
|
9
|
+
* success it enqueues a follow-up `sfa_lead_dedup` job to fire the
|
|
10
|
+
* dedup → promote chain.
|
|
11
|
+
*/
|
|
12
|
+
export declare const leadImportTool: Tool;
|
|
13
|
+
//# sourceMappingURL=lead-import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-import.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-import.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,IA2C5B,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Calls the sfa-lead-import persist-functions Lambda
|
|
5
|
+
* (POST /persist/v2/sfa/lead/import).
|
|
6
|
+
*
|
|
7
|
+
* Triggers a CSV-from-S3 ingestion run: the Lambda reads the CSV, applies
|
|
8
|
+
* the provided column mapping to each record, and inserts one
|
|
9
|
+
* `t_sfa_lead_staging` row per record with `source_type='IMPORT'`. On
|
|
10
|
+
* success it enqueues a follow-up `sfa_lead_dedup` job to fire the
|
|
11
|
+
* dedup → promote chain.
|
|
12
|
+
*/
|
|
13
|
+
export const leadImportTool = {
|
|
14
|
+
name: 'sfa_lead_import',
|
|
15
|
+
description: 'Trigger an SFA lead import from a CSV in S3. Calls the sfa-lead-import Lambda which stages one row per CSV record and (by default) chains into dedup → promote. Requires SFA.INSERT permission.',
|
|
16
|
+
inputSchema: z.object({
|
|
17
|
+
tenant_id: z.string().describe('Tenant the staging rows belong to'),
|
|
18
|
+
s3_bucket: z.string().describe('S3 bucket containing the CSV'),
|
|
19
|
+
s3_key: z.string().describe('S3 object key for the CSV'),
|
|
20
|
+
column_mapping: z.record(z.string()).optional()
|
|
21
|
+
.describe('Mapping of CSV header → staging lead field. Unmapped columns are still kept on raw_payload.raw.'),
|
|
22
|
+
source_ref: z.string().optional()
|
|
23
|
+
.describe('Override for source_ref (defaults to the S3 key)'),
|
|
24
|
+
delimiter: z.string().optional().describe('CSV delimiter (default ",")'),
|
|
25
|
+
encoding: z.string().optional().describe('CSV file encoding (default "utf-8-sig")'),
|
|
26
|
+
trigger_dedup: z.boolean().optional()
|
|
27
|
+
.describe('When TRUE (default), enqueue a sfa_lead_dedup job on success'),
|
|
28
|
+
metadata: z.record(z.unknown()).optional()
|
|
29
|
+
.describe('Optional metadata stamped on every staging row'),
|
|
30
|
+
}),
|
|
31
|
+
handler: async (args, ctx) => {
|
|
32
|
+
const input = args;
|
|
33
|
+
try {
|
|
34
|
+
const body = {
|
|
35
|
+
tenant_id: input.tenant_id,
|
|
36
|
+
s3_bucket: input.s3_bucket,
|
|
37
|
+
s3_key: input.s3_key,
|
|
38
|
+
};
|
|
39
|
+
const optional = [
|
|
40
|
+
'column_mapping', 'source_ref', 'delimiter', 'encoding',
|
|
41
|
+
'trigger_dedup', 'metadata',
|
|
42
|
+
];
|
|
43
|
+
for (const field of optional) {
|
|
44
|
+
if (input[field] !== undefined)
|
|
45
|
+
body[field] = input[field];
|
|
46
|
+
}
|
|
47
|
+
const result = await ctx.apiClient.postLambda('/sfa/lead/import', body);
|
|
48
|
+
return successResponse(result);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return errorResponse(API_ERROR, `Failed to trigger SFA lead import: ${error.message}`);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=lead-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-import.js","sourceRoot":"","sources":["../../../src/tools/sfa/lead-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,iMAAiM;IACnM,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACnE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC9D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACxD,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aAC5C,QAAQ,CAAC,iGAAiG,CAAC;QAC9G,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC9B,QAAQ,CAAC,kDAAkD,CAAC;QAC/D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACxE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QACnF,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aAClC,QAAQ,CAAC,8DAA8D,CAAC;QAC3E,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;aACvC,QAAQ,CAAC,gDAAgD,CAAC;KAC9D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAwB;gBAChC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC;YACF,MAAM,QAAQ,GAAG;gBACf,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU;gBACvD,eAAe,EAAE,UAAU;aAC5B,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,CAC3C,kBAAkB,EAClB,IAAI,CACL,CAAC;YACF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-list.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAMtC,eAAO,MAAM,YAAY,EAAE,IAoC1B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
|
+
import { SFA_LEAD_SELECT } from '../../sfa/projection.js';
|
|
4
|
+
import { buildLeadQuery } from '../../sfa/filters.js';
|
|
5
|
+
export const leadListTool = {
|
|
6
|
+
name: 'sfa_lead_list',
|
|
7
|
+
description: 'List/filter SFA sales leads',
|
|
8
|
+
inputSchema: z.object({
|
|
9
|
+
lead_status: z.union([z.string(), z.array(z.string())]).optional()
|
|
10
|
+
.describe('Filter by lead_status (single or array)'),
|
|
11
|
+
lead_rating: z.string().optional().describe('Filter by lead_rating'),
|
|
12
|
+
assigned_to: z.string().optional().describe('Filter by assigned user UUID'),
|
|
13
|
+
lead_source_id: z.string().optional().describe('Filter by lead source UUID'),
|
|
14
|
+
party_id: z.string().optional().describe('Filter by linked party UUID'),
|
|
15
|
+
search: z.string().optional()
|
|
16
|
+
.describe('Search across lead_name, company_name, and email'),
|
|
17
|
+
active: z.boolean().optional().describe('Filter by active flag (default true)'),
|
|
18
|
+
limit: z.number().optional().describe('Max results (default 50, max 200)'),
|
|
19
|
+
offset: z.number().optional().describe('Offset for pagination'),
|
|
20
|
+
order_by: z.string().optional()
|
|
21
|
+
.describe('PostgREST order clause (default: lead_name.asc)'),
|
|
22
|
+
}),
|
|
23
|
+
handler: async (args, ctx) => {
|
|
24
|
+
const input = args;
|
|
25
|
+
try {
|
|
26
|
+
const { query, limit } = buildLeadQuery(input);
|
|
27
|
+
const items = await ctx.apiClient.get(`${ctx.apiClient.dbBasePath}/sfa_leads?select=${SFA_LEAD_SELECT}&${query}`, { headers: { Prefer: 'count=exact' } });
|
|
28
|
+
const offset = input.offset ?? 0;
|
|
29
|
+
return successResponse({
|
|
30
|
+
items,
|
|
31
|
+
count: items.length,
|
|
32
|
+
next_offset: items.length === limit ? offset + limit : null,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return errorResponse(API_ERROR, `Failed to list SFA leads: ${error.message}`);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=lead-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-list.js","sourceRoot":"","sources":["../../../src/tools/sfa/lead-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;aAC/D,QAAQ,CAAC,yCAAyC,CAAC;QACtD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACpE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC3E,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAC5E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACvE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC1B,QAAQ,CAAC,kDAAkD,CAAC;QAC/D,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC1E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC5B,QAAQ,CAAC,iDAAiD,CAAC;KAC/D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACnC,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,qBAAqB,eAAe,IAAI,KAAK,EAAE,EAC1E,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CACvC,CAAC;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACjC,OAAO,eAAe,CAAC;gBACrB,KAAK;gBACL,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,WAAW,EAAE,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI;aAC5D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Tool } from '../registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calls the sfa-lead-promote persist-functions Lambda
|
|
4
|
+
* (POST /persist/v2/sfa/lead/promote).
|
|
5
|
+
*
|
|
6
|
+
* Final stage of the SFA lead sourcing pipeline. Reads NEW/MATCHED rows
|
|
7
|
+
* from `t_sfa_lead_staging` and either inserts a new `t_sfa_leads` row
|
|
8
|
+
* (NEW or MATCHED+party_id) or attaches to an existing matched lead
|
|
9
|
+
* (MATCHED+lead_id). Each staging row is committed in its own savepoint
|
|
10
|
+
* so a single bad row never aborts the batch; archived rows are flagged
|
|
11
|
+
* `active=FALSE` with promotion outcome recorded on `metadata`.
|
|
12
|
+
*/
|
|
13
|
+
export declare const leadPromoteTool: Tool;
|
|
14
|
+
//# sourceMappingURL=lead-promote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-promote.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-promote.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,EAAE,IA6B7B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Calls the sfa-lead-promote persist-functions Lambda
|
|
5
|
+
* (POST /persist/v2/sfa/lead/promote).
|
|
6
|
+
*
|
|
7
|
+
* Final stage of the SFA lead sourcing pipeline. Reads NEW/MATCHED rows
|
|
8
|
+
* from `t_sfa_lead_staging` and either inserts a new `t_sfa_leads` row
|
|
9
|
+
* (NEW or MATCHED+party_id) or attaches to an existing matched lead
|
|
10
|
+
* (MATCHED+lead_id). Each staging row is committed in its own savepoint
|
|
11
|
+
* so a single bad row never aborts the batch; archived rows are flagged
|
|
12
|
+
* `active=FALSE` with promotion outcome recorded on `metadata`.
|
|
13
|
+
*/
|
|
14
|
+
export const leadPromoteTool = {
|
|
15
|
+
name: 'sfa_lead_promote',
|
|
16
|
+
description: 'Trigger SFA lead-staging promotion. Calls the sfa-lead-promote Lambda which inserts/attaches t_sfa_leads rows from NEW/MATCHED staging rows and archives the staging row. Requires SFA.INSERT permission.',
|
|
17
|
+
inputSchema: z.object({
|
|
18
|
+
staging_ids: z.array(z.string()).optional()
|
|
19
|
+
.describe('Explicit list of staging row UUIDs to promote. Omit to process all active NEW/MATCHED rows for the tenant up to limit.'),
|
|
20
|
+
limit: z.number().int().min(1).max(1000).optional()
|
|
21
|
+
.describe('Max staging rows to process when no staging_ids list is provided (default 100, max 1000)'),
|
|
22
|
+
trigger_chain: z.boolean().optional()
|
|
23
|
+
.describe('When TRUE, enqueue a follow-up downstream job after a successful batch (reserved; default false)'),
|
|
24
|
+
}),
|
|
25
|
+
handler: async (args, ctx) => {
|
|
26
|
+
const input = args;
|
|
27
|
+
try {
|
|
28
|
+
const body = {};
|
|
29
|
+
const optional = ['staging_ids', 'limit', 'trigger_chain'];
|
|
30
|
+
for (const field of optional) {
|
|
31
|
+
if (input[field] !== undefined)
|
|
32
|
+
body[field] = input[field];
|
|
33
|
+
}
|
|
34
|
+
const result = await ctx.apiClient.postLambda('/sfa/lead/promote', body);
|
|
35
|
+
return successResponse(result);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return errorResponse(API_ERROR, `Failed to trigger SFA lead promote: ${error.message}`);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=lead-promote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-promote.js","sourceRoot":"","sources":["../../../src/tools/sfa/lead-promote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,2MAA2M;IAC7M,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aACxC,QAAQ,CAAC,wHAAwH,CAAC;QACrI,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;aAChD,QAAQ,CAAC,0FAA0F,CAAC;QACvG,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aAClC,QAAQ,CAAC,kGAAkG,CAAC;KAChH,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAwB,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;YAC3D,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,CAC3C,mBAAmB,EACnB,IAAI,CACL,CAAC;YACF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAAC,SAAS,EAAE,uCAAuC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lead-source-list.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-source-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,kBAAkB,EAAE,IA0ChC,CAAC"}
|