@raytio/mcp-server 1.16.1 → 1.17.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.
Files changed (145) hide show
  1. package/dist/ppm/__fixtures__/work-item.d.ts.map +1 -1
  2. package/dist/ppm/__fixtures__/work-item.js +1 -0
  3. package/dist/ppm/__fixtures__/work-item.js.map +1 -1
  4. package/dist/ppm/projection.d.ts.map +1 -1
  5. package/dist/ppm/projection.js +1 -0
  6. package/dist/ppm/projection.js.map +1 -1
  7. package/dist/ppm/types.d.ts +1 -0
  8. package/dist/ppm/types.d.ts.map +1 -1
  9. package/dist/raytio/api-client.d.ts +20 -1
  10. package/dist/raytio/api-client.d.ts.map +1 -1
  11. package/dist/raytio/api-client.js +18 -1
  12. package/dist/raytio/api-client.js.map +1 -1
  13. package/dist/sfa/filters.d.ts +34 -0
  14. package/dist/sfa/filters.d.ts.map +1 -0
  15. package/dist/sfa/filters.js +64 -0
  16. package/dist/sfa/filters.js.map +1 -0
  17. package/dist/sfa/projection.d.ts +8 -0
  18. package/dist/sfa/projection.d.ts.map +1 -0
  19. package/dist/sfa/projection.js +49 -0
  20. package/dist/sfa/projection.js.map +1 -0
  21. package/dist/sfa/types.d.ts +93 -0
  22. package/dist/sfa/types.d.ts.map +1 -0
  23. package/dist/sfa/types.js +2 -0
  24. package/dist/sfa/types.js.map +1 -0
  25. package/dist/tools/domains.d.ts.map +1 -1
  26. package/dist/tools/domains.js +19 -0
  27. package/dist/tools/domains.js.map +1 -1
  28. package/dist/tools/ppm/work-item-create.d.ts.map +1 -1
  29. package/dist/tools/ppm/work-item-create.js +2 -1
  30. package/dist/tools/ppm/work-item-create.js.map +1 -1
  31. package/dist/tools/ppm/work-item-update.d.ts.map +1 -1
  32. package/dist/tools/ppm/work-item-update.js +1 -0
  33. package/dist/tools/ppm/work-item-update.js.map +1 -1
  34. package/dist/tools/role-mapping.d.ts.map +1 -1
  35. package/dist/tools/role-mapping.js +6 -0
  36. package/dist/tools/role-mapping.js.map +1 -1
  37. package/dist/tools/sfa/activity-create.d.ts +3 -0
  38. package/dist/tools/sfa/activity-create.d.ts.map +1 -0
  39. package/dist/tools/sfa/activity-create.js +49 -0
  40. package/dist/tools/sfa/activity-create.js.map +1 -0
  41. package/dist/tools/sfa/activity-list.d.ts +3 -0
  42. package/dist/tools/sfa/activity-list.d.ts.map +1 -0
  43. package/dist/tools/sfa/activity-list.js +47 -0
  44. package/dist/tools/sfa/activity-list.js.map +1 -0
  45. package/dist/tools/sfa/deal-advance-stage.d.ts +13 -0
  46. package/dist/tools/sfa/deal-advance-stage.d.ts.map +1 -0
  47. package/dist/tools/sfa/deal-advance-stage.js +48 -0
  48. package/dist/tools/sfa/deal-advance-stage.js.map +1 -0
  49. package/dist/tools/sfa/deal-create.d.ts +3 -0
  50. package/dist/tools/sfa/deal-create.d.ts.map +1 -0
  51. package/dist/tools/sfa/deal-create.js +51 -0
  52. package/dist/tools/sfa/deal-create.js.map +1 -0
  53. package/dist/tools/sfa/deal-get.d.ts +3 -0
  54. package/dist/tools/sfa/deal-get.d.ts.map +1 -0
  55. package/dist/tools/sfa/deal-get.js +24 -0
  56. package/dist/tools/sfa/deal-get.js.map +1 -0
  57. package/dist/tools/sfa/deal-line-create.d.ts +3 -0
  58. package/dist/tools/sfa/deal-line-create.d.ts.map +1 -0
  59. package/dist/tools/sfa/deal-line-create.js +37 -0
  60. package/dist/tools/sfa/deal-line-create.js.map +1 -0
  61. package/dist/tools/sfa/deal-line-list.d.ts +3 -0
  62. package/dist/tools/sfa/deal-line-list.d.ts.map +1 -0
  63. package/dist/tools/sfa/deal-line-list.js +44 -0
  64. package/dist/tools/sfa/deal-line-list.js.map +1 -0
  65. package/dist/tools/sfa/deal-list.d.ts +3 -0
  66. package/dist/tools/sfa/deal-list.d.ts.map +1 -0
  67. package/dist/tools/sfa/deal-list.js +40 -0
  68. package/dist/tools/sfa/deal-list.js.map +1 -0
  69. package/dist/tools/sfa/deal-update.d.ts +3 -0
  70. package/dist/tools/sfa/deal-update.d.ts.map +1 -0
  71. package/dist/tools/sfa/deal-update.js +56 -0
  72. package/dist/tools/sfa/deal-update.js.map +1 -0
  73. package/dist/tools/sfa/index.d.ts +3 -0
  74. package/dist/tools/sfa/index.d.ts.map +1 -0
  75. package/dist/tools/sfa/index.js +38 -0
  76. package/dist/tools/sfa/index.js.map +1 -0
  77. package/dist/tools/sfa/lead-convert.d.ts +15 -0
  78. package/dist/tools/sfa/lead-convert.d.ts.map +1 -0
  79. package/dist/tools/sfa/lead-convert.js +57 -0
  80. package/dist/tools/sfa/lead-convert.js.map +1 -0
  81. package/dist/tools/sfa/lead-create.d.ts +3 -0
  82. package/dist/tools/sfa/lead-create.d.ts.map +1 -0
  83. package/dist/tools/sfa/lead-create.js +52 -0
  84. package/dist/tools/sfa/lead-create.js.map +1 -0
  85. package/dist/tools/sfa/lead-get.d.ts +3 -0
  86. package/dist/tools/sfa/lead-get.d.ts.map +1 -0
  87. package/dist/tools/sfa/lead-get.js +24 -0
  88. package/dist/tools/sfa/lead-get.js.map +1 -0
  89. package/dist/tools/sfa/lead-list.d.ts +3 -0
  90. package/dist/tools/sfa/lead-list.d.ts.map +1 -0
  91. package/dist/tools/sfa/lead-list.js +40 -0
  92. package/dist/tools/sfa/lead-list.js.map +1 -0
  93. package/dist/tools/sfa/lead-source-list.d.ts +3 -0
  94. package/dist/tools/sfa/lead-source-list.d.ts.map +1 -0
  95. package/dist/tools/sfa/lead-source-list.js +45 -0
  96. package/dist/tools/sfa/lead-source-list.js.map +1 -0
  97. package/dist/tools/sfa/lead-update.d.ts +3 -0
  98. package/dist/tools/sfa/lead-update.d.ts.map +1 -0
  99. package/dist/tools/sfa/lead-update.js +56 -0
  100. package/dist/tools/sfa/lead-update.js.map +1 -0
  101. package/dist/tools/sfa/pipeline-list.d.ts +3 -0
  102. package/dist/tools/sfa/pipeline-list.d.ts.map +1 -0
  103. package/dist/tools/sfa/pipeline-list.js +44 -0
  104. package/dist/tools/sfa/pipeline-list.js.map +1 -0
  105. package/dist/tools/types.d.ts +2 -0
  106. package/dist/tools/types.d.ts.map +1 -1
  107. package/dist/tools/types.js +2 -0
  108. package/dist/tools/types.js.map +1 -1
  109. package/package.json +1 -1
  110. package/dist/tools/create-access-app.d.ts +0 -10
  111. package/dist/tools/create-access-app.d.ts.map +0 -1
  112. package/dist/tools/create-access-app.js +0 -20
  113. package/dist/tools/create-access-app.js.map +0 -1
  114. package/dist/tools/create-form.d.ts +0 -41
  115. package/dist/tools/create-form.d.ts.map +0 -1
  116. package/dist/tools/create-form.js +0 -81
  117. package/dist/tools/create-form.js.map +0 -1
  118. package/dist/tools/list-schemas.d.ts +0 -7
  119. package/dist/tools/list-schemas.d.ts.map +0 -1
  120. package/dist/tools/list-schemas.js +0 -19
  121. package/dist/tools/list-schemas.js.map +0 -1
  122. package/dist/tools/poll-and-retrieve.d.ts +0 -9
  123. package/dist/tools/poll-and-retrieve.d.ts.map +0 -1
  124. package/dist/tools/poll-and-retrieve.js +0 -48
  125. package/dist/tools/poll-and-retrieve.js.map +0 -1
  126. package/dist/tools/ppm/role-memory-create.d.ts +0 -3
  127. package/dist/tools/ppm/role-memory-create.d.ts.map +0 -1
  128. package/dist/tools/ppm/role-memory-create.js +0 -38
  129. package/dist/tools/ppm/role-memory-create.js.map +0 -1
  130. package/dist/tools/ppm/role-memory-get.d.ts +0 -3
  131. package/dist/tools/ppm/role-memory-get.d.ts.map +0 -1
  132. package/dist/tools/ppm/role-memory-get.js +0 -24
  133. package/dist/tools/ppm/role-memory-get.js.map +0 -1
  134. package/dist/tools/ppm/role-memory-list.d.ts +0 -3
  135. package/dist/tools/ppm/role-memory-list.d.ts.map +0 -1
  136. package/dist/tools/ppm/role-memory-list.js +0 -55
  137. package/dist/tools/ppm/role-memory-list.js.map +0 -1
  138. package/dist/tools/ppm/role-memory-update.d.ts +0 -3
  139. package/dist/tools/ppm/role-memory-update.d.ts.map +0 -1
  140. package/dist/tools/ppm/role-memory-update.js +0 -42
  141. package/dist/tools/ppm/role-memory-update.js.map +0 -1
  142. package/dist/tools/send-request.d.ts +0 -11
  143. package/dist/tools/send-request.d.ts.map +0 -1
  144. package/dist/tools/send-request.js +0 -24
  145. package/dist/tools/send-request.js.map +0 -1
@@ -18,6 +18,9 @@ const ROLE_TO_DOMAINS = {
18
18
  DATA_SHARING_ADMINISTRATOR: ['dsm'],
19
19
  WORKER_ADMINISTRATOR: ['wrm', 'prm'],
20
20
  WORKER_VIEWER: ['wrm-readonly'],
21
+ SALES_USER: ['sfa', 'prm'],
22
+ SALES_ADMINISTRATOR: ['sfa', 'prm'],
23
+ SALES_VIEWER: ['sfa-readonly'],
21
24
  };
22
25
  /**
23
26
  * Given a list of user group codes, resolve the set of tool domain IDs
@@ -41,6 +44,9 @@ export function mapRolesToDomains(groupCodes) {
41
44
  if (domains.has('wrm') && domains.has('wrm-readonly')) {
42
45
  domains.delete('wrm-readonly');
43
46
  }
47
+ if (domains.has('sfa') && domains.has('sfa-readonly')) {
48
+ domains.delete('sfa-readonly');
49
+ }
44
50
  return [...domains];
45
51
  }
46
52
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"role-mapping.js","sourceRoot":"","sources":["../../src/tools/role-mapping.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;GAWG;AACH,MAAM,eAAe,GAA6B;IAChD,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IAC5B,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAC5C,cAAc,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;IAChD,iBAAiB,EAAE,CAAC,KAAK,CAAC;IAC1B,0BAA0B,EAAE,CAAC,KAAK,CAAC;IACnC,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IACpC,aAAa,EAAE,CAAC,cAAc,CAAC;CAChC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAoB;IACpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAA0B;IAE1B,OAAO,SAAS,CAAC,IAAI,CAAc,kCAAkC,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAA0B;IAE1B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"role-mapping.js","sourceRoot":"","sources":["../../src/tools/role-mapping.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;GAWG;AACH,MAAM,eAAe,GAA6B;IAChD,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IAC5B,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAC5C,cAAc,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;IAChD,iBAAiB,EAAE,CAAC,KAAK,CAAC;IAC1B,0BAA0B,EAAE,CAAC,KAAK,CAAC;IACnC,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IACpC,aAAa,EAAE,CAAC,cAAc,CAAC;IAC/B,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IAC1B,mBAAmB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IACnC,YAAY,EAAE,CAAC,cAAc,CAAC;CAC/B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAoB;IACpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAA0B;IAE1B,OAAO,SAAS,CAAC,IAAI,CAAc,kCAAkC,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAA0B;IAE1B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const activityCreateTool: Tool;
3
+ //# sourceMappingURL=activity-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/activity-create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAUtC,eAAO,MAAM,kBAAkB,EAAE,IA2ChC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, SFA_VALIDATION, API_ERROR } from '../types.js';
3
+ import { SFA_ACTIVITY_SELECT } from '../../sfa/projection.js';
4
+ const OPTIONAL_FIELDS = [
5
+ 'activity_type', 'activity_body', 'activity_data',
6
+ 'due_date', 'completed_date', 'metadata',
7
+ ];
8
+ export const activityCreateTool = {
9
+ name: 'sfa_activity_create',
10
+ description: 'Create an SFA activity attached to exactly one lead or one deal.',
11
+ inputSchema: z.object({
12
+ lead_id: z.string().optional().describe('UUID of the parent lead (exclusive with deal_id)'),
13
+ deal_id: z.string().optional().describe('UUID of the parent deal (exclusive with lead_id)'),
14
+ activity_type: z.string().optional()
15
+ .describe('Activity type (validated against SFA_ACTIVITY_TYPE lookup)'),
16
+ activity_body: z.string().optional().describe('Free-text body / notes'),
17
+ activity_data: z.record(z.unknown()).optional()
18
+ .describe('Structured payload (JSONB) — e.g. participants, call duration'),
19
+ due_date: z.string().optional().describe('Due timestamp (ISO 8601)'),
20
+ completed_date: z.string().optional().describe('Completion timestamp (ISO 8601)'),
21
+ metadata: z.record(z.unknown()).optional()
22
+ .describe('Arbitrary JSON metadata object'),
23
+ }),
24
+ handler: async (args, ctx) => {
25
+ const input = args;
26
+ const hasLead = !!input.lead_id;
27
+ const hasDeal = !!input.deal_id;
28
+ if (hasLead === hasDeal) {
29
+ return errorResponse(SFA_VALIDATION, 'Activity must reference exactly one of lead_id or deal_id');
30
+ }
31
+ try {
32
+ const body = {};
33
+ if (hasLead)
34
+ body.lead_id = input.lead_id;
35
+ if (hasDeal)
36
+ body.deal_id = input.deal_id;
37
+ for (const field of OPTIONAL_FIELDS) {
38
+ if (input[field] !== undefined)
39
+ body[field] = input[field];
40
+ }
41
+ const items = await ctx.apiClient.post(`${ctx.apiClient.dbBasePath}/sfa_activities?select=${SFA_ACTIVITY_SELECT}`, body, { headers: { Prefer: 'return=representation' } });
42
+ return successResponse(items[0]);
43
+ }
44
+ catch (error) {
45
+ return errorResponse(API_ERROR, `Failed to create SFA activity: ${error.message}`);
46
+ }
47
+ },
48
+ };
49
+ //# sourceMappingURL=activity-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-create.js","sourceRoot":"","sources":["../../../src/tools/sfa/activity-create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const activityListTool: Tool;
3
+ //# sourceMappingURL=activity-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-list.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/activity-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,gBAAgB,EAAE,IA2C9B,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, API_ERROR } from '../types.js';
3
+ import { SFA_ACTIVITY_SELECT } from '../../sfa/projection.js';
4
+ export const activityListTool = {
5
+ name: 'sfa_activity_list',
6
+ description: 'List SFA activities (calls, emails, meetings, tasks) attached to a lead or a deal',
7
+ inputSchema: z.object({
8
+ lead_id: z.string().optional().describe('Filter to activities on this lead UUID'),
9
+ deal_id: z.string().optional().describe('Filter to activities on this deal UUID'),
10
+ activity_type: z.string().optional().describe('Filter by activity_type'),
11
+ active: z.boolean().optional().describe('Filter by active flag (default true)'),
12
+ limit: z.number().optional().describe('Max results (default 50, max 200)'),
13
+ offset: z.number().optional().describe('Offset for pagination'),
14
+ order_by: z.string().optional()
15
+ .describe('PostgREST order clause (default: due_date.desc)'),
16
+ }),
17
+ handler: async (args, ctx) => {
18
+ const input = args;
19
+ try {
20
+ const parts = [];
21
+ if (input.lead_id)
22
+ parts.push(`lead_id=eq.${input.lead_id}`);
23
+ if (input.deal_id)
24
+ parts.push(`deal_id=eq.${input.deal_id}`);
25
+ if (input.activity_type)
26
+ parts.push(`activity_type=eq.${input.activity_type}`);
27
+ const active = input.active ?? true;
28
+ parts.push(`active=eq.${active}`);
29
+ const limit = Math.min(input.limit ?? 50, 200);
30
+ parts.push(`limit=${limit}`);
31
+ if (input.offset)
32
+ parts.push(`offset=${input.offset}`);
33
+ parts.push(`order=${input.order_by ?? 'due_date.desc'}`);
34
+ const items = await ctx.apiClient.get(`${ctx.apiClient.dbBasePath}/sfa_activities?select=${SFA_ACTIVITY_SELECT}&${parts.join('&')}`, { headers: { Prefer: 'count=exact' } });
35
+ const offset = input.offset ?? 0;
36
+ return successResponse({
37
+ items,
38
+ count: items.length,
39
+ next_offset: items.length === limit ? offset + limit : null,
40
+ });
41
+ }
42
+ catch (error) {
43
+ return errorResponse(API_ERROR, `Failed to list SFA activities: ${error.message}`);
44
+ }
45
+ },
46
+ };
47
+ //# sourceMappingURL=activity-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-list.js","sourceRoot":"","sources":["../../../src/tools/sfa/activity-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Tool } from '../registry.js';
2
+ /**
3
+ * Calls the sfa-deal-advance-stage persist-functions Lambda
4
+ * (POST /persist/v2/sfa/deal/advance-stage).
5
+ *
6
+ * Advancing a stage is a domain-aware operation: in addition to setting
7
+ * `stage_id`, the Lambda may update `deal_status`, `actual_close_date`,
8
+ * `probability`, and log a stage-transition activity in a single
9
+ * transaction. Use this tool instead of patching `stage_id` directly so
10
+ * those side-effects fire consistently.
11
+ */
12
+ export declare const dealAdvanceStageTool: Tool;
13
+ //# sourceMappingURL=deal-advance-stage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-advance-stage.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-advance-stage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,EAAE,IAoClC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, API_ERROR } from '../types.js';
3
+ /**
4
+ * Calls the sfa-deal-advance-stage persist-functions Lambda
5
+ * (POST /persist/v2/sfa/deal/advance-stage).
6
+ *
7
+ * Advancing a stage is a domain-aware operation: in addition to setting
8
+ * `stage_id`, the Lambda may update `deal_status`, `actual_close_date`,
9
+ * `probability`, and log a stage-transition activity in a single
10
+ * transaction. Use this tool instead of patching `stage_id` directly so
11
+ * those side-effects fire consistently.
12
+ */
13
+ export const dealAdvanceStageTool = {
14
+ name: 'sfa_deal_advance_stage',
15
+ description: 'Advance an SFA deal to a target stage. Calls the sfa-deal-advance-stage Lambda which applies the stage transition plus any status/close-date/probability side-effects atomically.',
16
+ inputSchema: z.object({
17
+ deal_id: z.string().describe('UUID of the deal to advance'),
18
+ stage_id: z.string().describe('UUID of the target stage'),
19
+ deal_status: z.string().optional()
20
+ .describe('Override deal_status (e.g. WON, LOST). Otherwise derived from stage_category.'),
21
+ actual_close_date: z.string().optional()
22
+ .describe('Override actual close date (ISO 8601); only relevant for WON/LOST transitions'),
23
+ lost_reason: z.string().optional()
24
+ .describe('Reason captured when transitioning to a LOST stage'),
25
+ activity_body: z.string().optional()
26
+ .describe('Optional note recorded on the stage-transition activity'),
27
+ }),
28
+ handler: async (args, ctx) => {
29
+ const input = args;
30
+ try {
31
+ const body = {
32
+ deal_id: input.deal_id,
33
+ stage_id: input.stage_id,
34
+ };
35
+ const optional = ['deal_status', 'actual_close_date', 'lost_reason', 'activity_body'];
36
+ for (const field of optional) {
37
+ if (input[field] !== undefined)
38
+ body[field] = input[field];
39
+ }
40
+ const result = await ctx.apiClient.postLambda('/sfa/deal/advance-stage', body);
41
+ return successResponse(result);
42
+ }
43
+ catch (error) {
44
+ return errorResponse(API_ERROR, `Failed to advance SFA deal stage: ${error.message}`);
45
+ }
46
+ },
47
+ };
48
+ //# sourceMappingURL=deal-advance-stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-advance-stage.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-advance-stage.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,oBAAoB,GAAS;IACxC,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,mLAAmL;IACrL,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC3D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACzD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,QAAQ,CAAC,+EAA+E,CAAC;QAC5F,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aACrC,QAAQ,CAAC,+EAA+E,CAAC;QAC5F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC/B,QAAQ,CAAC,oDAAoD,CAAC;QACjE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aACjC,QAAQ,CAAC,yDAAyD,CAAC;KACvE,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,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC;YACF,MAAM,QAAQ,GAAG,CAAC,aAAa,EAAE,mBAAmB,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;YACtF,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,yBAAyB,EACzB,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,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const dealCreateTool: Tool;
3
+ //# sourceMappingURL=deal-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAYtC,eAAO,MAAM,cAAc,EAAE,IA0C5B,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, API_ERROR } from '../types.js';
3
+ import { SFA_DEAL_SELECT } from '../../sfa/projection.js';
4
+ const OPTIONAL_FIELDS = [
5
+ 'pipeline_id', 'stage_id', 'deal_status',
6
+ 'amount', 'currency_code', 'probability',
7
+ 'expected_close_date', 'assigned_to', 'source_lead_id',
8
+ 'metadata',
9
+ ];
10
+ export const dealCreateTool = {
11
+ name: 'sfa_deal_create',
12
+ description: 'Create a new SFA deal',
13
+ inputSchema: z.object({
14
+ deal_name: z.string().describe('Display name of the deal'),
15
+ party_id: z.string().describe('UUID of the PRM party this deal is for'),
16
+ pipeline_id: z.string().optional().describe('Pipeline UUID FK'),
17
+ stage_id: z.string().optional().describe('Stage UUID FK'),
18
+ deal_status: z.string().optional()
19
+ .describe('Deal status (validated against SFA_DEAL_STATUS lookup)'),
20
+ amount: z.number().optional().describe('Deal amount'),
21
+ currency_code: z.string().optional().describe('ISO currency code'),
22
+ probability: z.number().min(0).max(100).optional()
23
+ .describe('Win probability percent (0-100)'),
24
+ expected_close_date: z.string().optional()
25
+ .describe('Expected close date (ISO 8601)'),
26
+ assigned_to: z.string().optional().describe('UUID of the assigned user'),
27
+ source_lead_id: z.string().optional()
28
+ .describe('Originating SFA lead UUID, when sourced from a lead'),
29
+ metadata: z.record(z.unknown()).optional()
30
+ .describe('Arbitrary JSON metadata object'),
31
+ }),
32
+ handler: async (args, ctx) => {
33
+ const input = args;
34
+ try {
35
+ const body = {
36
+ deal_name: input.deal_name,
37
+ party_id: input.party_id,
38
+ };
39
+ for (const field of OPTIONAL_FIELDS) {
40
+ if (input[field] !== undefined)
41
+ body[field] = input[field];
42
+ }
43
+ const items = await ctx.apiClient.post(`${ctx.apiClient.dbBasePath}/sfa_deals?select=${SFA_DEAL_SELECT}`, body, { headers: { Prefer: 'return=representation' } });
44
+ return successResponse(items[0]);
45
+ }
46
+ catch (error) {
47
+ return errorResponse(API_ERROR, `Failed to create SFA deal: ${error.message}`);
48
+ }
49
+ },
50
+ };
51
+ //# sourceMappingURL=deal-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-create.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const dealGetTool: Tool;
3
+ //# sourceMappingURL=deal-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-get.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-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_DEAL_SELECT } from '../../sfa/projection.js';
4
+ export const dealGetTool = {
5
+ name: 'sfa_deal_get',
6
+ description: 'Get a single SFA deal by ID (UUID)',
7
+ inputSchema: z.object({
8
+ id: z.string().describe('UUID of the deal'),
9
+ }),
10
+ handler: async (args, ctx) => {
11
+ const { id } = args;
12
+ try {
13
+ const items = await ctx.apiClient.get(`${ctx.apiClient.dbBasePath}/sfa_deals?id=eq.${id}&select=${SFA_DEAL_SELECT}`);
14
+ if (!items || items.length === 0) {
15
+ return errorResponse(SFA_NOT_FOUND, `Deal ${id} not found`);
16
+ }
17
+ return successResponse(items[0]);
18
+ }
19
+ catch (error) {
20
+ return errorResponse(API_ERROR, `Failed to get SFA deal: ${error.message}`);
21
+ }
22
+ },
23
+ };
24
+ //# sourceMappingURL=deal-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-get.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-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,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const dealLineCreateTool: Tool;
3
+ //# sourceMappingURL=deal-line-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-line-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-line-create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAStC,eAAO,MAAM,kBAAkB,EAAE,IA+BhC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, API_ERROR } from '../types.js';
3
+ import { SFA_DEAL_LINE_SELECT } from '../../sfa/projection.js';
4
+ const OPTIONAL_FIELDS = [
5
+ 'gpm_item_id', 'quantity', 'unit_price', 'discount_pct', 'line_order', 'metadata',
6
+ ];
7
+ export const dealLineCreateTool = {
8
+ name: 'sfa_deal_line_create',
9
+ description: 'Create an SFA deal line item. line_amount is a generated column derived from quantity, unit_price, and discount_pct; the parent deal amount roll-up is computed by DB triggers.',
10
+ inputSchema: z.object({
11
+ deal_id: z.string().describe('UUID of the parent deal'),
12
+ gpm_item_id: z.string().optional().describe('UUID of the GPM item being sold'),
13
+ quantity: z.number().optional().describe('Quantity'),
14
+ unit_price: z.number().optional().describe('Unit price'),
15
+ discount_pct: z.number().min(0).max(100).optional()
16
+ .describe('Discount percent (0-100)'),
17
+ line_order: z.number().optional().describe('Ordering integer within the deal'),
18
+ metadata: z.record(z.unknown()).optional()
19
+ .describe('Arbitrary JSON metadata object'),
20
+ }),
21
+ handler: async (args, ctx) => {
22
+ const input = args;
23
+ try {
24
+ const body = { deal_id: input.deal_id };
25
+ for (const field of OPTIONAL_FIELDS) {
26
+ if (input[field] !== undefined)
27
+ body[field] = input[field];
28
+ }
29
+ const items = await ctx.apiClient.post(`${ctx.apiClient.dbBasePath}/sfa_deal_lines?select=${SFA_DEAL_LINE_SELECT}`, body, { headers: { Prefer: 'return=representation' } });
30
+ return successResponse(items[0]);
31
+ }
32
+ catch (error) {
33
+ return errorResponse(API_ERROR, `Failed to create SFA deal line: ${error.message}`);
34
+ }
35
+ },
36
+ };
37
+ //# sourceMappingURL=deal-line-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-line-create.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-line-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,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,MAAM,eAAe,GAAG;IACtB,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU;CAClF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAS;IACtC,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,iLAAiL;IAC9L,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC9E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QACpD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;aAChD,QAAQ,CAAC,0BAA0B,CAAC;QACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC9E,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,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YAC7D,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,0BAA0B,oBAAoB,EAAE,EAC3E,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,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const dealLineListTool: Tool;
3
+ //# sourceMappingURL=deal-line-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-line-list.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-line-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,gBAAgB,EAAE,IAyC9B,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { z } from 'zod';
2
+ import { successResponse, errorResponse, API_ERROR } from '../types.js';
3
+ import { SFA_DEAL_LINE_SELECT } from '../../sfa/projection.js';
4
+ export const dealLineListTool = {
5
+ name: 'sfa_deal_line_list',
6
+ description: 'List SFA deal line items (typically scoped to a single deal)',
7
+ inputSchema: z.object({
8
+ deal_id: z.string().optional().describe('Filter by parent deal UUID'),
9
+ gpm_item_id: z.string().optional().describe('Filter by GPM item UUID'),
10
+ active: z.boolean().optional().describe('Filter by active flag (default true)'),
11
+ limit: z.number().optional().describe('Max results (default 50, max 200)'),
12
+ offset: z.number().optional().describe('Offset for pagination'),
13
+ order_by: z.string().optional()
14
+ .describe('PostgREST order clause (default: line_order.asc)'),
15
+ }),
16
+ handler: async (args, ctx) => {
17
+ const input = args;
18
+ try {
19
+ const parts = [];
20
+ if (input.deal_id)
21
+ parts.push(`deal_id=eq.${input.deal_id}`);
22
+ if (input.gpm_item_id)
23
+ parts.push(`gpm_item_id=eq.${input.gpm_item_id}`);
24
+ const active = input.active ?? true;
25
+ parts.push(`active=eq.${active}`);
26
+ const limit = Math.min(input.limit ?? 50, 200);
27
+ parts.push(`limit=${limit}`);
28
+ if (input.offset)
29
+ parts.push(`offset=${input.offset}`);
30
+ parts.push(`order=${input.order_by ?? 'line_order.asc'}`);
31
+ const items = await ctx.apiClient.get(`${ctx.apiClient.dbBasePath}/sfa_deal_lines?select=${SFA_DEAL_LINE_SELECT}&${parts.join('&')}`, { headers: { Prefer: 'count=exact' } });
32
+ const offset = input.offset ?? 0;
33
+ return successResponse({
34
+ items,
35
+ count: items.length,
36
+ next_offset: items.length === limit ? offset + limit : null,
37
+ });
38
+ }
39
+ catch (error) {
40
+ return errorResponse(API_ERROR, `Failed to list SFA deal lines: ${error.message}`);
41
+ }
42
+ },
43
+ };
44
+ //# sourceMappingURL=deal-line-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-line-list.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-line-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,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,8DAA8D;IAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACrE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACtE,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,kDAAkD,CAAC;KAChE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,IAAI,KAAK,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;YAElC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;YAC7B,IAAI,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,QAAQ,IAAI,gBAAgB,EAAE,CAAC,CAAC;YAE1D,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CACnC,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,0BAA0B,oBAAoB,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAC9F,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,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const dealListTool: Tool;
3
+ //# sourceMappingURL=deal-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-list.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-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_DEAL_SELECT } from '../../sfa/projection.js';
4
+ import { buildDealQuery } from '../../sfa/filters.js';
5
+ export const dealListTool = {
6
+ name: 'sfa_deal_list',
7
+ description: 'List/filter SFA deals',
8
+ inputSchema: z.object({
9
+ deal_status: z.union([z.string(), z.array(z.string())]).optional()
10
+ .describe('Filter by deal_status (single or array)'),
11
+ pipeline_id: z.string().optional().describe('Filter by pipeline UUID'),
12
+ stage_id: z.string().optional().describe('Filter by stage UUID'),
13
+ party_id: z.string().optional().describe('Filter by party UUID'),
14
+ assigned_to: z.string().optional().describe('Filter by assigned user UUID'),
15
+ source_lead_id: z.string().optional().describe('Filter by originating lead UUID'),
16
+ search: z.string().optional().describe('Search across deal_name (case-insensitive)'),
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: expected_close_date.asc)'),
22
+ }),
23
+ handler: async (args, ctx) => {
24
+ const input = args;
25
+ try {
26
+ const { query, limit } = buildDealQuery(input);
27
+ const items = await ctx.apiClient.get(`${ctx.apiClient.dbBasePath}/sfa_deals?select=${SFA_DEAL_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 deals: ${error.message}`);
37
+ }
38
+ },
39
+ };
40
+ //# sourceMappingURL=deal-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-list.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-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,uBAAuB;IACpC,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,yBAAyB,CAAC;QACtE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAChE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAChE,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,iCAAiC,CAAC;QACjF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACpF,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,2DAA2D,CAAC;KACzE,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,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const dealUpdateTool: Tool;
3
+ //# sourceMappingURL=deal-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deal-update.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAYtC,eAAO,MAAM,cAAc,EAAE,IAuD5B,CAAC"}
@@ -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,3 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const sfaTools: Tool[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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;AAkBtC,eAAO,MAAM,QAAQ,EAAE,IAAI,EAoB1B,CAAC"}