@raytio/mcp-server 10.5.0 → 10.7.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/capabilities/tool-capability.d.ts.map +1 -1
- package/dist/capabilities/tool-capability.js +9 -0
- package/dist/capabilities/tool-capability.js.map +1 -1
- package/dist/raytio/api-client.d.ts.map +1 -1
- package/dist/raytio/api-client.js +3 -0
- package/dist/raytio/api-client.js.map +1 -1
- package/dist/tools/_shared/idempotent-create.d.ts +11 -0
- package/dist/tools/_shared/idempotent-create.d.ts.map +1 -0
- package/dist/tools/_shared/idempotent-create.js +26 -0
- package/dist/tools/_shared/idempotent-create.js.map +1 -0
- package/dist/tools/_shared/side-effect.d.ts +3 -8
- package/dist/tools/_shared/side-effect.d.ts.map +1 -1
- package/dist/tools/_shared/side-effect.js +5 -10
- package/dist/tools/_shared/side-effect.js.map +1 -1
- package/dist/tools/domains.js +1 -1
- package/dist/tools/domains.js.map +1 -1
- package/dist/tools/fgl/journal-batch-create.d.ts.map +1 -1
- package/dist/tools/fgl/journal-batch-create.js +24 -78
- package/dist/tools/fgl/journal-batch-create.js.map +1 -1
- package/dist/tools/fxm/fxm-funds-account-consent-grant.d.ts +2 -3
- package/dist/tools/fxm/fxm-funds-account-consent-grant.d.ts.map +1 -1
- package/dist/tools/fxm/fxm-funds-account-consent-grant.js +9 -11
- package/dist/tools/fxm/fxm-funds-account-consent-grant.js.map +1 -1
- package/dist/tools/fxm/fxm-payment-method-register.d.ts +1 -3
- package/dist/tools/fxm/fxm-payment-method-register.d.ts.map +1 -1
- package/dist/tools/fxm/fxm-payment-method-register.js +8 -11
- package/dist/tools/fxm/fxm-payment-method-register.js.map +1 -1
- package/dist/tools/ixn/ixn-message-send.d.ts +8 -3
- package/dist/tools/ixn/ixn-message-send.d.ts.map +1 -1
- package/dist/tools/ixn/ixn-message-send.js +28 -13
- package/dist/tools/ixn/ixn-message-send.js.map +1 -1
- package/dist/tools/ppm/template-instantiate.d.ts.map +1 -1
- package/dist/tools/ppm/template-instantiate.js +9 -5
- package/dist/tools/ppm/template-instantiate.js.map +1 -1
- package/dist/tools/ppm/work-item-create.d.ts.map +1 -1
- package/dist/tools/ppm/work-item-create.js +6 -2
- package/dist/tools/ppm/work-item-create.js.map +1 -1
- package/dist/tools/prm/prm-party-create.d.ts.map +1 -1
- package/dist/tools/prm/prm-party-create.js +6 -2
- package/dist/tools/prm/prm-party-create.js.map +1 -1
- package/dist/tools/sfa/deal-create.d.ts.map +1 -1
- package/dist/tools/sfa/deal-create.js +6 -2
- package/dist/tools/sfa/deal-create.js.map +1 -1
- package/dist/tools/sfa/deal-line-create.d.ts.map +1 -1
- package/dist/tools/sfa/deal-line-create.js +6 -2
- package/dist/tools/sfa/deal-line-create.js.map +1 -1
- package/dist/tools/sfa/lead-create.d.ts.map +1 -1
- package/dist/tools/sfa/lead-create.js +6 -2
- package/dist/tools/sfa/lead-create.js.map +1 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +3 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/wrm/wrm-agent-run-create.d.ts.map +1 -1
- package/dist/tools/wrm/wrm-agent-run-create.js +9 -3
- package/dist/tools/wrm/wrm-agent-run-create.js.map +1 -1
- package/dist/tools/wrm/wrm-credential-request-create.d.ts.map +1 -1
- package/dist/tools/wrm/wrm-credential-request-create.js +30 -78
- package/dist/tools/wrm/wrm-credential-request-create.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { idempotentCreate } from '../_shared/idempotent-create.js';
|
|
1
2
|
import { z } from 'zod';
|
|
2
3
|
import { API_ERROR, errorResponse, successResponse } from '../types.js';
|
|
3
4
|
import { cap } from '../../capabilities/tool-capability.js';
|
|
4
5
|
import { redactRow } from '../../generated-reads/guardrails.js';
|
|
5
|
-
import { confirmFlagSchema, idempotencyKeySchema,
|
|
6
|
+
import { confirmFlagSchema, idempotencyKeySchema, } from '../_shared/side-effect.js';
|
|
6
7
|
/**
|
|
7
8
|
* Register an external-payer payment method (`fxm_external_payer_payment_methods`).
|
|
8
9
|
*
|
|
@@ -14,16 +15,13 @@ import { confirmFlagSchema, idempotencyKeySchema, writeHeadersWithIdempotency, }
|
|
|
14
15
|
* card numbers, IBAN, and fingerprints are refused by the schema and
|
|
15
16
|
* would be redacted from the response even if the backend surfaced them.
|
|
16
17
|
*
|
|
17
|
-
*
|
|
18
|
-
* registering the same non-primary instrument twice creates two rows,
|
|
19
|
-
* and it ignores the `Idempotency-Key` header (WI-0008817).
|
|
18
|
+
* Retries with an idempotency key return the original payment method.
|
|
20
19
|
*/
|
|
21
20
|
export const fxmPaymentMethodRegisterTool = {
|
|
22
21
|
name: 'fxm_external_payer_payment_method_register',
|
|
23
22
|
description: 'Register an external-payer payment method (fxm_external_payer_payment_methods). ' +
|
|
24
23
|
'Stores a pointer to the processor-held instrument; the raw PAN never touches this ' +
|
|
25
|
-
'server. Requires confirm=true.
|
|
26
|
-
'payment method, so check fxm_external_payer_payment_methods_list before retrying.',
|
|
24
|
+
'server. Requires confirm=true. With idempotency_key, retries return the original payment method.',
|
|
27
25
|
inputSchema: z.object({
|
|
28
26
|
customer_id: z.string().min(1).describe('UUID of the FAR customer'),
|
|
29
27
|
payer_payment_method_type: z
|
|
@@ -60,13 +58,12 @@ export const fxmPaymentMethodRegisterTool = {
|
|
|
60
58
|
start_date: z.string().min(1).optional().describe('ISO 8601 effective start'),
|
|
61
59
|
end_date: z.string().min(1).optional().describe('ISO 8601 planned end date'),
|
|
62
60
|
confirm: confirmFlagSchema,
|
|
63
|
-
idempotency_key: idempotencyKeySchema
|
|
64
|
-
'yet, so a retry can still create a duplicate.'),
|
|
61
|
+
idempotency_key: idempotencyKeySchema,
|
|
65
62
|
}),
|
|
66
63
|
capabilities: [cap('fxm_external_payer_payment_methods', 'INSERT')],
|
|
67
64
|
sideEffect: 'provisioning',
|
|
68
65
|
confirmation: 'caller_confirms',
|
|
69
|
-
idempotency: '
|
|
66
|
+
idempotency: 'explicit_key',
|
|
70
67
|
handler: async (args, ctx) => {
|
|
71
68
|
const input = args;
|
|
72
69
|
const body = {
|
|
@@ -91,8 +88,8 @@ export const fxmPaymentMethodRegisterTool = {
|
|
|
91
88
|
body[field] = input[field];
|
|
92
89
|
}
|
|
93
90
|
try {
|
|
94
|
-
const
|
|
95
|
-
return successResponse(redactRow(
|
|
91
|
+
const row = await idempotentCreate(ctx.apiClient, 'fxm_external_payer_payment_methods', body, input.idempotency_key, '*');
|
|
92
|
+
return successResponse(redactRow(row));
|
|
96
93
|
}
|
|
97
94
|
catch (error) {
|
|
98
95
|
return errorResponse(API_ERROR, `Failed to register FXM payment method: ${error.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fxm-payment-method-register.js","sourceRoot":"","sources":["../../../src/tools/fxm/fxm-payment-method-register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,GAAG,EAAE,MAAM,uCAAuC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"fxm-payment-method-register.js","sourceRoot":"","sources":["../../../src/tools/fxm/fxm-payment-method-register.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,14 @@ import { Tool } from '../registry.js';
|
|
|
7
7
|
*
|
|
8
8
|
* - `confirm: true` to prevent accidental invocation.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
* `ixn_messages
|
|
12
|
-
*
|
|
10
|
+
* Retry-safe with a key (WI-0009396): the insert goes through the
|
|
11
|
+
* Persist `fnd_idempotent_create('ixn_messages', payload, key)` RPC
|
|
12
|
+
* (WI-0009395). The same key with the same payload returns the original
|
|
13
|
+
* message without inserting again, so the delivery trigger does not
|
|
14
|
+
* enqueue a second outbound job. The same key with a different payload
|
|
15
|
+
* raises IDEMPOTENCY_CONFLICT, which is surfaced and never retried as
|
|
16
|
+
* an unkeyed send. Without a key the RPC does an ordinary insert, as
|
|
17
|
+
* the database contract defines, so a repeat call sends again.
|
|
13
18
|
*
|
|
14
19
|
* `direction` is force-set to `OUTBOUND`, the exact value the
|
|
15
20
|
* `IXN_MESSAGES_DIRECTION` lookup holds and the only value the delivery
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ixn-message-send.d.ts","sourceRoot":"","sources":["../../../src/tools/ixn/ixn-message-send.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ixn-message-send.d.ts","sourceRoot":"","sources":["../../../src/tools/ixn/ixn-message-send.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAMtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,kBAAkB,EAAE,IA4EhC,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { API_ERROR, errorResponse, successResponse } from '../types.js';
|
|
3
3
|
import { cap } from '../../capabilities/tool-capability.js';
|
|
4
|
-
import { confirmFlagSchema,
|
|
4
|
+
import { confirmFlagSchema, idempotencyKeySchema } from '../_shared/side-effect.js';
|
|
5
|
+
import { idempotentCreate } from '../_shared/idempotent-create.js';
|
|
5
6
|
/**
|
|
6
7
|
* Communication semantic tool: dispatch an outbound message on an
|
|
7
8
|
* existing conversation (`ixn_messages`). The row this creates is
|
|
@@ -10,9 +11,14 @@ import { confirmFlagSchema, unenforcedIdempotencyKeySchema, writeHeadersWithIdem
|
|
|
10
11
|
*
|
|
11
12
|
* - `confirm: true` to prevent accidental invocation.
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
* `ixn_messages
|
|
15
|
-
*
|
|
14
|
+
* Retry-safe with a key (WI-0009396): the insert goes through the
|
|
15
|
+
* Persist `fnd_idempotent_create('ixn_messages', payload, key)` RPC
|
|
16
|
+
* (WI-0009395). The same key with the same payload returns the original
|
|
17
|
+
* message without inserting again, so the delivery trigger does not
|
|
18
|
+
* enqueue a second outbound job. The same key with a different payload
|
|
19
|
+
* raises IDEMPOTENCY_CONFLICT, which is surfaced and never retried as
|
|
20
|
+
* an unkeyed send. Without a key the RPC does an ordinary insert, as
|
|
21
|
+
* the database contract defines, so a repeat call sends again.
|
|
16
22
|
*
|
|
17
23
|
* `direction` is force-set to `OUTBOUND`, the exact value the
|
|
18
24
|
* `IXN_MESSAGES_DIRECTION` lookup holds and the only value the delivery
|
|
@@ -32,8 +38,10 @@ export const ixnMessageSendTool = {
|
|
|
32
38
|
description: 'Dispatch an outbound message on an existing IXN conversation (ixn_messages). ' +
|
|
33
39
|
'Requires confirm=true, conversation_id, sender_identity and body_text. direction is ' +
|
|
34
40
|
'forced to OUTBOUND. delivery_status is server-assigned; poll status via ixn_messages_get ' +
|
|
35
|
-
'on the returned row id.
|
|
36
|
-
'
|
|
41
|
+
'on the returned row id. Pass an idempotency_key to make a retry safe: the same key and ' +
|
|
42
|
+
'inputs return the original message without sending again, and different inputs return ' +
|
|
43
|
+
'IDEMPOTENCY_CONFLICT (use a new key, never retry without one). Without a key, calling it ' +
|
|
44
|
+
'again sends the message again, so check ixn_messages_list filtered on conversation_id first.',
|
|
37
45
|
inputSchema: z.object({
|
|
38
46
|
conversation_id: z
|
|
39
47
|
.string()
|
|
@@ -62,15 +70,17 @@ export const ixnMessageSendTool = {
|
|
|
62
70
|
.describe('UUID of the hrm_organizations_c row this send is scoped to'),
|
|
63
71
|
metadata: z.record(z.unknown()).optional(),
|
|
64
72
|
confirm: confirmFlagSchema,
|
|
65
|
-
idempotency_key:
|
|
73
|
+
idempotency_key: idempotencyKeySchema.describe('Optional, recommended. Reusing the same key with the same inputs returns the original ' +
|
|
74
|
+
'message and sends nothing. Different inputs raise IDEMPOTENCY_CONFLICT. Without a key, ' +
|
|
75
|
+
'each call sends a message. Must be a URL-safe token of 8–128 characters.'),
|
|
66
76
|
}),
|
|
67
77
|
capabilities: [cap('ixn_messages', 'INSERT')],
|
|
68
78
|
sideEffect: 'communication',
|
|
69
79
|
confirmation: 'caller_confirms',
|
|
70
|
-
idempotency: '
|
|
80
|
+
idempotency: 'explicit_key',
|
|
71
81
|
handler: async (args, ctx) => {
|
|
72
82
|
const input = args;
|
|
73
|
-
const
|
|
83
|
+
const payload = {
|
|
74
84
|
conversation_id: input.conversation_id,
|
|
75
85
|
sender_identity: input.sender_identity,
|
|
76
86
|
body_text: input.body_text,
|
|
@@ -78,14 +88,19 @@ export const ixnMessageSendTool = {
|
|
|
78
88
|
};
|
|
79
89
|
for (const field of ['channel_msg_id', 'sent_by_worker_id', 'org_id', 'metadata']) {
|
|
80
90
|
if (input[field] !== undefined)
|
|
81
|
-
|
|
91
|
+
payload[field] = input[field];
|
|
82
92
|
}
|
|
83
93
|
try {
|
|
84
|
-
|
|
85
|
-
return successResponse(
|
|
94
|
+
// The full row, marked `replayed`; a replay the caller can no longer see returns only its id.
|
|
95
|
+
return successResponse(await idempotentCreate(ctx.apiClient, 'ixn_messages', payload, input.idempotency_key, '*'));
|
|
86
96
|
}
|
|
87
97
|
catch (error) {
|
|
88
|
-
|
|
98
|
+
const message = error?.message ?? '';
|
|
99
|
+
if (message.includes('IDEMPOTENCY_CONFLICT')) {
|
|
100
|
+
return errorResponse('IDEMPOTENCY_CONFLICT', 'This idempotency_key was already used with different inputs. Use a new key for a ' +
|
|
101
|
+
'different message; do not retry without a key.');
|
|
102
|
+
}
|
|
103
|
+
return errorResponse(API_ERROR, `Failed to send IXN outbound message: ${message}`);
|
|
89
104
|
}
|
|
90
105
|
},
|
|
91
106
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ixn-message-send.js","sourceRoot":"","sources":["../../../src/tools/ixn/ixn-message-send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,GAAG,EAAE,MAAM,uCAAuC,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"ixn-message-send.js","sourceRoot":"","sources":["../../../src/tools/ixn/ixn-message-send.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-instantiate.d.ts","sourceRoot":"","sources":["../../../src/tools/ppm/template-instantiate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"template-instantiate.d.ts","sourceRoot":"","sources":["../../../src/tools/ppm/template-instantiate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAItC,eAAO,MAAM,uBAAuB,EAAE,IA8CrC,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { idempotencyKeySchema } from '../_shared/side-effect.js';
|
|
1
2
|
import { z } from 'zod';
|
|
2
3
|
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
4
|
import { rpcCap } from '../../capabilities/tool-capability.js';
|
|
4
5
|
export const templateInstantiateTool = {
|
|
5
6
|
name: 'ppm_template_instantiate',
|
|
6
7
|
description: 'Instantiate a PPM epic template, creating an epic with child work items from the template slots',
|
|
8
|
+
idempotency: 'explicit_key',
|
|
7
9
|
inputSchema: z.object({
|
|
10
|
+
idempotency_key: idempotencyKeySchema,
|
|
8
11
|
template_code: z.string().describe('Code of the template to instantiate (e.g. NEW_MCP_TOOL)'),
|
|
9
12
|
epic_name: z.string().describe('Name for the new epic'),
|
|
10
13
|
project_id: z.string().optional().describe('UUID of the project to create the epic in'),
|
|
@@ -18,15 +21,16 @@ export const templateInstantiateTool = {
|
|
|
18
21
|
const input = args;
|
|
19
22
|
try {
|
|
20
23
|
const body = {
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
p_idempotency_key: input.idempotency_key ?? null,
|
|
25
|
+
p_template_code: input.template_code,
|
|
26
|
+
p_epic_name: input.epic_name,
|
|
23
27
|
};
|
|
24
28
|
if (input.project_id !== undefined)
|
|
25
|
-
body.
|
|
29
|
+
body.p_project_id = input.project_id;
|
|
26
30
|
if (input.epic_description !== undefined)
|
|
27
|
-
body.
|
|
31
|
+
body.p_epic_description = input.epic_description;
|
|
28
32
|
if (input.metadata !== undefined)
|
|
29
|
-
body.
|
|
33
|
+
body.p_metadata = input.metadata;
|
|
30
34
|
const result = await ctx.apiClient.post('/db/v1/rpc/ppm_instantiate_epic_template', body);
|
|
31
35
|
return successResponse(result);
|
|
32
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-instantiate.js","sourceRoot":"","sources":["../../../src/tools/ppm/template-instantiate.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,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,MAAM,CAAC,MAAM,uBAAuB,GAAS;IAC3C,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,iGAAiG;IAC9G,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;QAC7F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACvD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACvF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAChF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;KACtH,CAAC;IACF,YAAY,EAAE;QACZ,GAAG,MAAM,CAAC,+BAA+B,CAAC;KAC3C;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"template-instantiate.js","sourceRoot":"","sources":["../../../src/tools/ppm/template-instantiate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,MAAM,CAAC,MAAM,uBAAuB,GAAS;IAC3C,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,iGAAiG;IAC9G,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,eAAe,EAAE,oBAAoB;QACrC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;QAC7F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACvD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACvF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAChF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;KACtH,CAAC;IACF,YAAY,EAAE;QACZ,GAAG,MAAM,CAAC,+BAA+B,CAAC;KAC3C;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAOb,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,GAAwB;gBAChC,iBAAiB,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;gBAChD,eAAe,EAAE,KAAK,CAAC,aAAa;gBACpC,WAAW,EAAE,KAAK,CAAC,SAAS;aAC7B,CAAC;YAEF,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;gBAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC;YACzE,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS;gBAAE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,gBAAgB,CAAC;YAC3F,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;gBAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC;YAEnE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CACrC,0CAA0C,EAC1C,IAAI,CACL,CAAC;YAEF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work-item-create.d.ts","sourceRoot":"","sources":["../../../src/tools/ppm/work-item-create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"work-item-create.d.ts","sourceRoot":"","sources":["../../../src/tools/ppm/work-item-create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAMtC,eAAO,MAAM,kBAAkB,EAAE,IAoDhC,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { idempotencyKeySchema } from '../_shared/side-effect.js';
|
|
2
|
+
import { idempotentCreate } from '../_shared/idempotent-create.js';
|
|
1
3
|
import { z } from 'zod';
|
|
2
4
|
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
5
|
import { WORK_ITEM_SELECT } from '../../ppm/projection.js';
|
|
@@ -7,6 +9,7 @@ export const workItemCreateTool = {
|
|
|
7
9
|
name: 'ppm_work_item_create',
|
|
8
10
|
description: 'Create a new PPM work item',
|
|
9
11
|
inputSchema: z.object({
|
|
12
|
+
idempotency_key: idempotencyKeySchema,
|
|
10
13
|
project_id: z.string().optional().describe('Project ID'),
|
|
11
14
|
work_item_type: z.string().describe('Type: EPIC, ISSUE, TASK, BUG, or SUB_TASK'),
|
|
12
15
|
work_item_name: z.string().describe('Name/title of the work item'),
|
|
@@ -28,6 +31,7 @@ export const workItemCreateTool = {
|
|
|
28
31
|
capabilities: [
|
|
29
32
|
cap('ppm_work_items', 'INSERT'),
|
|
30
33
|
],
|
|
34
|
+
idempotency: 'explicit_key',
|
|
31
35
|
handler: async (args, ctx) => {
|
|
32
36
|
const input = args;
|
|
33
37
|
try {
|
|
@@ -45,8 +49,8 @@ export const workItemCreateTool = {
|
|
|
45
49
|
if (input[field] !== undefined)
|
|
46
50
|
body[field] = input[field];
|
|
47
51
|
}
|
|
48
|
-
const
|
|
49
|
-
return successResponse(
|
|
52
|
+
const row = await idempotentCreate(ctx.apiClient, 'ppm_work_items', body, input.idempotency_key, WORK_ITEM_SELECT);
|
|
53
|
+
return successResponse(row);
|
|
50
54
|
}
|
|
51
55
|
catch (error) {
|
|
52
56
|
return errorResponse(API_ERROR, `Failed to create work item: ${error.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work-item-create.js","sourceRoot":"","sources":["../../../src/tools/ppm/work-item-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,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"work-item-create.js","sourceRoot":"","sources":["../../../src/tools/ppm/work-item-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prm-party-create.d.ts","sourceRoot":"","sources":["../../../src/tools/prm/prm-party-create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prm-party-create.d.ts","sourceRoot":"","sources":["../../../src/tools/prm/prm-party-create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,eAAe,EAAE,IAkC7B,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { idempotencyKeySchema } from '../_shared/side-effect.js';
|
|
2
|
+
import { idempotentCreate } from '../_shared/idempotent-create.js';
|
|
1
3
|
import { z } from 'zod';
|
|
2
4
|
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
5
|
import { PRM_PARTY_SELECT } from '../../prm/projection.js';
|
|
@@ -6,6 +8,7 @@ export const partyCreateTool = {
|
|
|
6
8
|
name: 'prm_party_create',
|
|
7
9
|
description: 'Create a new PRM party (organisation, group, or person)',
|
|
8
10
|
inputSchema: z.object({
|
|
11
|
+
idempotency_key: idempotencyKeySchema,
|
|
9
12
|
party_name: z.string().describe('Display name of the party'),
|
|
10
13
|
party_description: z.string().optional().describe('Description of the party'),
|
|
11
14
|
party_type: z.string().optional().describe('Party type (validated against PRM_PARTIES_PARTY_TYPE lookup)'),
|
|
@@ -15,6 +18,7 @@ export const partyCreateTool = {
|
|
|
15
18
|
capabilities: [
|
|
16
19
|
cap('prm_parties', 'INSERT'),
|
|
17
20
|
],
|
|
21
|
+
idempotency: 'explicit_key',
|
|
18
22
|
handler: async (args, ctx) => {
|
|
19
23
|
const input = args;
|
|
20
24
|
try {
|
|
@@ -26,8 +30,8 @@ export const partyCreateTool = {
|
|
|
26
30
|
if (input[field] !== undefined)
|
|
27
31
|
body[field] = input[field];
|
|
28
32
|
}
|
|
29
|
-
const
|
|
30
|
-
return successResponse(
|
|
33
|
+
const row = await idempotentCreate(ctx.apiClient, 'prm_parties', body, input.idempotency_key, PRM_PARTY_SELECT);
|
|
34
|
+
return successResponse(row);
|
|
31
35
|
}
|
|
32
36
|
catch (error) {
|
|
33
37
|
return errorResponse(API_ERROR, `Failed to create PRM party: ${error.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prm-party-create.js","sourceRoot":"","sources":["../../../src/tools/prm/prm-party-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,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"prm-party-create.js","sourceRoot":"","sources":["../../../src/tools/prm/prm-party-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,uCAAuC,CAAC;AAE5D,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,yDAAyD;IACtE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,eAAe,EAAE,oBAAoB;QACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC5D,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAC7E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QAC1G,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACnF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KACnF,CAAC;IACF,YAAY,EAAE;QACZ,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC;KAC7B;IACD,WAAW,EAAE,cAAc;IAC3B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAwB;gBAChC,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC;YAEF,MAAM,cAAc,GAAG,CAAC,mBAAmB,EAAE,YAAY,EAAE,sBAAsB,EAAE,UAAU,CAAC,CAAC;YAC/F,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACnC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;YAEhH,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9B,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deal-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deal-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAYtC,eAAO,MAAM,cAAc,EAAE,IAyC5B,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { idempotencyKeySchema } from '../_shared/side-effect.js';
|
|
2
|
+
import { idempotentCreate } from '../_shared/idempotent-create.js';
|
|
1
3
|
import { z } from 'zod';
|
|
2
4
|
import { cap } from '../../capabilities/tool-capability.js';
|
|
3
5
|
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
@@ -13,6 +15,7 @@ export const dealCreateTool = {
|
|
|
13
15
|
description: 'Create a new SFA deal',
|
|
14
16
|
capabilities: [cap('sfa_deals', 'INSERT')],
|
|
15
17
|
inputSchema: z.object({
|
|
18
|
+
idempotency_key: idempotencyKeySchema,
|
|
16
19
|
deal_name: z.string().describe('Display name of the deal'),
|
|
17
20
|
party_id: z.string().describe('UUID of the PRM party this deal is for'),
|
|
18
21
|
pipeline_id: z.string().optional().describe('Pipeline UUID FK'),
|
|
@@ -31,6 +34,7 @@ export const dealCreateTool = {
|
|
|
31
34
|
metadata: z.record(z.unknown()).optional()
|
|
32
35
|
.describe('Arbitrary JSON metadata object'),
|
|
33
36
|
}),
|
|
37
|
+
idempotency: 'explicit_key',
|
|
34
38
|
handler: async (args, ctx) => {
|
|
35
39
|
const input = args;
|
|
36
40
|
try {
|
|
@@ -42,8 +46,8 @@ export const dealCreateTool = {
|
|
|
42
46
|
if (input[field] !== undefined)
|
|
43
47
|
body[field] = input[field];
|
|
44
48
|
}
|
|
45
|
-
const
|
|
46
|
-
return successResponse(
|
|
49
|
+
const row = await idempotentCreate(ctx.apiClient, 'sfa_deals', body, input.idempotency_key, SFA_DEAL_SELECT);
|
|
50
|
+
return successResponse(row);
|
|
47
51
|
}
|
|
48
52
|
catch (error) {
|
|
49
53
|
return errorResponse(API_ERROR, `Failed to create SFA deal: ${error.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deal-create.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,GAAG,EAAE,MAAM,uCAAuC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"deal-create.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deal-line-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-line-create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deal-line-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/deal-line-create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAStC,eAAO,MAAM,kBAAkB,EAAE,IA8BhC,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { idempotencyKeySchema } from '../_shared/side-effect.js';
|
|
2
|
+
import { idempotentCreate } from '../_shared/idempotent-create.js';
|
|
1
3
|
import { z } from 'zod';
|
|
2
4
|
import { cap } from '../../capabilities/tool-capability.js';
|
|
3
5
|
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
@@ -10,6 +12,7 @@ export const dealLineCreateTool = {
|
|
|
10
12
|
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.',
|
|
11
13
|
capabilities: [cap('sfa_deal_lines', 'INSERT')],
|
|
12
14
|
inputSchema: z.object({
|
|
15
|
+
idempotency_key: idempotencyKeySchema,
|
|
13
16
|
deal_id: z.string().describe('UUID of the parent deal'),
|
|
14
17
|
gpm_item_id: z.string().optional().describe('UUID of the GPM item being sold'),
|
|
15
18
|
quantity: z.number().optional().describe('Quantity'),
|
|
@@ -20,6 +23,7 @@ export const dealLineCreateTool = {
|
|
|
20
23
|
metadata: z.record(z.unknown()).optional()
|
|
21
24
|
.describe('Arbitrary JSON metadata object'),
|
|
22
25
|
}),
|
|
26
|
+
idempotency: 'explicit_key',
|
|
23
27
|
handler: async (args, ctx) => {
|
|
24
28
|
const input = args;
|
|
25
29
|
try {
|
|
@@ -28,8 +32,8 @@ export const dealLineCreateTool = {
|
|
|
28
32
|
if (input[field] !== undefined)
|
|
29
33
|
body[field] = input[field];
|
|
30
34
|
}
|
|
31
|
-
const
|
|
32
|
-
return successResponse(
|
|
35
|
+
const row = await idempotentCreate(ctx.apiClient, 'sfa_deal_lines', body, input.idempotency_key, SFA_DEAL_LINE_SELECT);
|
|
36
|
+
return successResponse(row);
|
|
33
37
|
}
|
|
34
38
|
catch (error) {
|
|
35
39
|
return errorResponse(API_ERROR, `Failed to create SFA deal line: ${error.message}`);
|
|
@@ -1 +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,GAAG,EAAE,MAAM,uCAAuC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"deal-line-create.js","sourceRoot":"","sources":["../../../src/tools/sfa/deal-line-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,GAAG,EAAE,MAAM,uCAAuC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/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,YAAY,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,eAAe,EAAE,oBAAoB;QACrC,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,WAAW,EAAE,cAAc;IAC3B,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,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACvH,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9B,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lead-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lead-create.d.ts","sourceRoot":"","sources":["../../../src/tools/sfa/lead-create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAatC,eAAO,MAAM,cAAc,EAAE,IAyC5B,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { idempotencyKeySchema } from '../_shared/side-effect.js';
|
|
2
|
+
import { idempotentCreate } from '../_shared/idempotent-create.js';
|
|
1
3
|
import { z } from 'zod';
|
|
2
4
|
import { cap } from '../../capabilities/tool-capability.js';
|
|
3
5
|
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
@@ -14,6 +16,7 @@ export const leadCreateTool = {
|
|
|
14
16
|
description: 'Create a new SFA sales lead',
|
|
15
17
|
capabilities: [cap('sfa_leads', 'INSERT')],
|
|
16
18
|
inputSchema: z.object({
|
|
19
|
+
idempotency_key: idempotencyKeySchema,
|
|
17
20
|
lead_name: z.string().describe('Display name of the lead'),
|
|
18
21
|
first_name: z.string().optional().describe('First name'),
|
|
19
22
|
last_name: z.string().optional().describe('Last name'),
|
|
@@ -35,6 +38,7 @@ export const leadCreateTool = {
|
|
|
35
38
|
metadata: z.record(z.unknown()).optional()
|
|
36
39
|
.describe('Arbitrary JSON metadata object'),
|
|
37
40
|
}),
|
|
41
|
+
idempotency: 'explicit_key',
|
|
38
42
|
handler: async (args, ctx) => {
|
|
39
43
|
const input = args;
|
|
40
44
|
try {
|
|
@@ -43,8 +47,8 @@ export const leadCreateTool = {
|
|
|
43
47
|
if (input[field] !== undefined)
|
|
44
48
|
body[field] = input[field];
|
|
45
49
|
}
|
|
46
|
-
const
|
|
47
|
-
return successResponse(
|
|
50
|
+
const row = await idempotentCreate(ctx.apiClient, 'sfa_leads', body, input.idempotency_key, SFA_LEAD_SELECT);
|
|
51
|
+
return successResponse(row);
|
|
48
52
|
}
|
|
49
53
|
catch (error) {
|
|
50
54
|
return errorResponse(API_ERROR, `Failed to create SFA lead: ${error.message}`);
|
|
@@ -1 +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,GAAG,EAAE,MAAM,uCAAuC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"lead-create.js","sourceRoot":"","sources":["../../../src/tools/sfa/lead-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;CACH;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAE3D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;CACH;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAE3D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,YAAY,CAIxF;AAGD,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,SAAS,cAAc,CAAC"}
|
package/dist/tools/types.js
CHANGED
|
@@ -2,7 +2,9 @@ export function successResponse(data) {
|
|
|
2
2
|
return { success: true, data };
|
|
3
3
|
}
|
|
4
4
|
export function errorResponse(code, message, details) {
|
|
5
|
-
|
|
5
|
+
const resolvedCode = code === API_ERROR && message.includes('IDEMPOTENCY_CONFLICT')
|
|
6
|
+
? 'IDEMPOTENCY_CONFLICT' : code;
|
|
7
|
+
return { success: false, error: { code: resolvedCode, message, details } };
|
|
6
8
|
}
|
|
7
9
|
// Error codes
|
|
8
10
|
export const PPM_NOT_FOUND = 'PPM_NOT_FOUND';
|
package/dist/tools/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,eAAe,CAAI,IAAO;IACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe,EAAE,OAAa;IACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,eAAe,CAAI,IAAO;IACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe,EAAE,OAAa;IACxE,MAAM,YAAY,GAAG,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACjF,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,cAAc;AACd,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrm-agent-run-create.d.ts","sourceRoot":"","sources":["../../../src/tools/wrm/wrm-agent-run-create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wrm-agent-run-create.d.ts","sourceRoot":"","sources":["../../../src/tools/wrm/wrm-agent-run-create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,kBAAkB,EAAE,IA6ChC,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { idempotencyKeySchema } from '../_shared/side-effect.js';
|
|
2
|
+
import { idempotentCreate } from '../_shared/idempotent-create.js';
|
|
1
3
|
import { z } from 'zod';
|
|
2
4
|
import { successResponse, errorResponse, API_ERROR } from '../types.js';
|
|
3
5
|
import { WRM_AGENT_RUN_SELECT } from '../../wrm/projection.js';
|
|
@@ -6,6 +8,7 @@ export const agentRunCreateTool = {
|
|
|
6
8
|
name: 'wrm_agent_run_create',
|
|
7
9
|
description: 'Create a new agent run record with status=RUNNING.',
|
|
8
10
|
inputSchema: z.object({
|
|
11
|
+
idempotency_key: idempotencyKeySchema,
|
|
9
12
|
worker_id: z.string().describe('UUID of the worker instance'),
|
|
10
13
|
backend_id: z.string().uuid().describe('UUID of the backend (wrm_backends.id)'),
|
|
11
14
|
work_item_id: z.string().optional().describe('UUID of the PPM work item'),
|
|
@@ -13,12 +16,13 @@ export const agentRunCreateTool = {
|
|
|
13
16
|
model_id: z.string().optional().describe('UUID of the model (wrm_models.id)'),
|
|
14
17
|
provider_id: z.string().optional().describe('UUID of the provider (wrm_providers.id)'),
|
|
15
18
|
branch_name: z.string().optional().describe('Git branch created'),
|
|
16
|
-
run_started_at: z.string().optional().describe('Run start timestamp (
|
|
19
|
+
run_started_at: z.string().optional().describe('Run start timestamp (ISO 8601). Left empty if omitted: Persist sets no default'),
|
|
17
20
|
metadata: z.record(z.unknown()).optional().describe('Backend-specific metadata (JSONB)'),
|
|
18
21
|
}),
|
|
19
22
|
capabilities: [
|
|
20
23
|
cap('wrm_agent_runs', 'INSERT'),
|
|
21
24
|
],
|
|
25
|
+
idempotency: 'explicit_key',
|
|
22
26
|
handler: async (args, ctx) => {
|
|
23
27
|
const input = args;
|
|
24
28
|
try {
|
|
@@ -35,8 +39,10 @@ export const agentRunCreateTool = {
|
|
|
35
39
|
if (input[field] !== undefined)
|
|
36
40
|
body[field] = input[field];
|
|
37
41
|
}
|
|
38
|
-
const
|
|
39
|
-
return successResponse(
|
|
42
|
+
const row = await idempotentCreate(ctx.apiClient, 'wrm_agent_runs', body, input.idempotency_key, WRM_AGENT_RUN_SELECT);
|
|
43
|
+
return successResponse(row.record === null
|
|
44
|
+
? row
|
|
45
|
+
: { id: row.id, run_status: row.run_status, replayed: row.replayed });
|
|
40
46
|
}
|
|
41
47
|
catch (error) {
|
|
42
48
|
return errorResponse(API_ERROR, `Failed to create agent run: ${error.message}`);
|