@raytio/mcp-server 9.4.0 → 10.1.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 (65) hide show
  1. package/contracts/persist/mcp_resource_contract.json +52 -23
  2. package/dist/authorization.d.ts.map +1 -1
  3. package/dist/authorization.js +2 -0
  4. package/dist/authorization.js.map +1 -1
  5. package/dist/tools/_shared/finance-idempotency.d.ts +1 -1
  6. package/dist/tools/_shared/finance-idempotency.js +1 -1
  7. package/dist/tools/_shared/side-effect.d.ts +25 -2
  8. package/dist/tools/_shared/side-effect.d.ts.map +1 -1
  9. package/dist/tools/_shared/side-effect.js +29 -4
  10. package/dist/tools/_shared/side-effect.js.map +1 -1
  11. package/dist/tools/bkm/bkm-adapter-configuration-update.d.ts +17 -0
  12. package/dist/tools/bkm/bkm-adapter-configuration-update.d.ts.map +1 -0
  13. package/dist/tools/bkm/bkm-adapter-configuration-update.js +79 -0
  14. package/dist/tools/bkm/bkm-adapter-configuration-update.js.map +1 -0
  15. package/dist/tools/bkm/bkm-availability-search-start.d.ts +20 -0
  16. package/dist/tools/bkm/bkm-availability-search-start.d.ts.map +1 -0
  17. package/dist/tools/bkm/bkm-availability-search-start.js +110 -0
  18. package/dist/tools/bkm/bkm-availability-search-start.js.map +1 -0
  19. package/dist/tools/bkm/bkm-provider-item-mapping-create.d.ts +15 -0
  20. package/dist/tools/bkm/bkm-provider-item-mapping-create.d.ts.map +1 -0
  21. package/dist/tools/bkm/bkm-provider-item-mapping-create.js +62 -0
  22. package/dist/tools/bkm/bkm-provider-item-mapping-create.js.map +1 -0
  23. package/dist/tools/bkm/generated-reads.d.ts +5 -0
  24. package/dist/tools/bkm/generated-reads.d.ts.map +1 -0
  25. package/dist/tools/bkm/generated-reads.js +33 -0
  26. package/dist/tools/bkm/generated-reads.js.map +1 -0
  27. package/dist/tools/bkm/index.d.ts +5 -0
  28. package/dist/tools/bkm/index.d.ts.map +1 -0
  29. package/dist/tools/bkm/index.js +13 -0
  30. package/dist/tools/bkm/index.js.map +1 -0
  31. package/dist/tools/dcm/dcm-device-command-dispatch.d.ts +28 -0
  32. package/dist/tools/dcm/dcm-device-command-dispatch.d.ts.map +1 -0
  33. package/dist/tools/dcm/dcm-device-command-dispatch.js +96 -0
  34. package/dist/tools/dcm/dcm-device-command-dispatch.js.map +1 -0
  35. package/dist/tools/dcm/dcm-device-register.d.ts +22 -0
  36. package/dist/tools/dcm/dcm-device-register.d.ts.map +1 -0
  37. package/dist/tools/dcm/dcm-device-register.js +86 -0
  38. package/dist/tools/dcm/dcm-device-register.js.map +1 -0
  39. package/dist/tools/dcm/dcm-device-slot-configure.d.ts +13 -0
  40. package/dist/tools/dcm/dcm-device-slot-configure.d.ts.map +1 -0
  41. package/dist/tools/dcm/dcm-device-slot-configure.js +68 -0
  42. package/dist/tools/dcm/dcm-device-slot-configure.js.map +1 -0
  43. package/dist/tools/dcm/dcm-device-update.d.ts +13 -0
  44. package/dist/tools/dcm/dcm-device-update.d.ts.map +1 -0
  45. package/dist/tools/dcm/dcm-device-update.js +55 -0
  46. package/dist/tools/dcm/dcm-device-update.js.map +1 -0
  47. package/dist/tools/dcm/generated-reads.d.ts +5 -0
  48. package/dist/tools/dcm/generated-reads.d.ts.map +1 -0
  49. package/dist/tools/dcm/generated-reads.js +30 -0
  50. package/dist/tools/dcm/generated-reads.js.map +1 -0
  51. package/dist/tools/dcm/index.d.ts +5 -0
  52. package/dist/tools/dcm/index.d.ts.map +1 -0
  53. package/dist/tools/dcm/index.js +15 -0
  54. package/dist/tools/dcm/index.js.map +1 -0
  55. package/dist/tools/domains.d.ts.map +1 -1
  56. package/dist/tools/domains.js +18 -0
  57. package/dist/tools/domains.js.map +1 -1
  58. package/dist/tools/far/far-cash-receipt-record.d.ts +5 -10
  59. package/dist/tools/far/far-cash-receipt-record.d.ts.map +1 -1
  60. package/dist/tools/far/far-cash-receipt-record.js +6 -11
  61. package/dist/tools/far/far-cash-receipt-record.js.map +1 -1
  62. package/dist/tools/role-mapping.d.ts.map +1 -1
  63. package/dist/tools/role-mapping.js +12 -0
  64. package/dist/tools/role-mapping.js.map +1 -1
  65. package/package.json +1 -1
@@ -0,0 +1,110 @@
1
+ import { z } from 'zod';
2
+ import { API_ERROR, errorResponse, successResponse } from '../types.js';
3
+ import { cap } from '../../capabilities/tool-capability.js';
4
+ import { confirmFlagSchema, unenforcedIdempotencyKeySchema, writeHeadersWithIdempotency, } from '../_shared/side-effect.js';
5
+ /**
6
+ * External-synchronisation semantic tool: start a real-time
7
+ * availability search (`bkm_availability_searches`). Kicks off
8
+ * concurrent fetches against every connected third-party booking
9
+ * provider, so the tool requires:
10
+ *
11
+ * - `confirm: true` to prevent accidental provider load;
12
+ * - a bounded search radius / time window.
13
+ *
14
+ * This tool is NOT retry-safe: nothing identifies a repeat call and
15
+ * Persist ignores `Idempotency-Key` (WI-0008817), so a retry starts a
16
+ * second wave of provider calls. The created row's `id` is the polling
17
+ * handle — callers use `bkm_availability_searches_get`
18
+ * to watch `status` and `providers_completed` transition to a
19
+ * terminal state, then list `bkm_availability_slots?search_id=eq.<id>`
20
+ * for the results.
21
+ */
22
+ export const bkmAvailabilitySearchStartTool = {
23
+ name: 'bkm_availability_search_start',
24
+ description: 'Start a real-time BKM availability search (bkm_availability_searches). Fans out to every ' +
25
+ 'connected booking provider. Requires confirm=true. Poll status via ' +
26
+ 'bkm_availability_searches_get; fetch results via bkm_availability_slots_list ' +
27
+ 'filtered by search_id. Not deduplicated: calling it again starts another search, so ' +
28
+ 'check bkm_availability_searches_list before retrying.',
29
+ inputSchema: z.object({
30
+ base_latitude: z
31
+ .number()
32
+ .min(-90)
33
+ .max(90)
34
+ .describe('Latitude of the search origin (WGS84 degrees)'),
35
+ base_longitude: z
36
+ .number()
37
+ .min(-180)
38
+ .max(180)
39
+ .describe('Longitude of the search origin (WGS84 degrees)'),
40
+ search_radius: z
41
+ .number()
42
+ .positive()
43
+ .describe('Search radius (unit set by search_radius_unit; defaults to KM)'),
44
+ search_radius_unit: z
45
+ .string()
46
+ .max(8)
47
+ .optional()
48
+ .describe('Radius unit from the BKM_SEARCH_RADIUS_UNIT lookup (KM, MI, M); defaults per provider config'),
49
+ search_time: z
50
+ .number()
51
+ .int()
52
+ .positive()
53
+ .describe('Time window before the search returns (unit set by search_time_unit)'),
54
+ search_time_unit: z
55
+ .string()
56
+ .max(8)
57
+ .optional()
58
+ .describe('Time window unit from the BKM_SEARCH_TIME_UNIT lookup (DAYS, HOURS, WEEKS); defaults per provider config'),
59
+ item_ids: z
60
+ .array(z.string().min(1))
61
+ .optional()
62
+ .describe('Restrict search to specific gpm_items UUIDs'),
63
+ item_keys: z
64
+ .array(z.string().min(1))
65
+ .optional()
66
+ .describe('Restrict search to specific item business keys'),
67
+ merchant_ids: z
68
+ .array(z.string().min(1))
69
+ .optional()
70
+ .describe('Restrict search to specific merchants (xrm_merchants UUIDs)'),
71
+ party_site_ids: z
72
+ .array(z.string().min(1))
73
+ .optional()
74
+ .describe('Restrict search to specific party sites (prm_party_sites UUIDs)'),
75
+ confirm: confirmFlagSchema,
76
+ idempotency_key: unenforcedIdempotencyKeySchema,
77
+ }),
78
+ capabilities: [cap('bkm_availability_searches', 'INSERT')],
79
+ sideEffect: 'command',
80
+ confirmation: 'caller_confirms',
81
+ idempotency: 'not_idempotent',
82
+ handler: async (args, ctx) => {
83
+ const input = args;
84
+ const body = {
85
+ base_latitude: input.base_latitude,
86
+ base_longitude: input.base_longitude,
87
+ search_radius: input.search_radius,
88
+ search_time: input.search_time,
89
+ };
90
+ for (const field of [
91
+ 'search_radius_unit',
92
+ 'search_time_unit',
93
+ 'item_ids',
94
+ 'item_keys',
95
+ 'merchant_ids',
96
+ 'party_site_ids',
97
+ ]) {
98
+ if (input[field] !== undefined)
99
+ body[field] = input[field];
100
+ }
101
+ try {
102
+ const rows = await ctx.apiClient.post(`${ctx.apiClient.dbBasePath}/bkm_availability_searches?select=*`, body, { headers: writeHeadersWithIdempotency(input.idempotency_key) });
103
+ return successResponse(rows[0]);
104
+ }
105
+ catch (error) {
106
+ return errorResponse(API_ERROR, `Failed to start BKM availability search: ${error.message}`);
107
+ }
108
+ },
109
+ };
110
+ //# sourceMappingURL=bkm-availability-search-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bkm-availability-search-start.js","sourceRoot":"","sources":["../../../src/tools/bkm/bkm-availability-search-start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Tool } from '../registry.js';
2
+ /**
3
+ * Explicit-schema create for `bkm_provider_item_mappings`. Registers
4
+ * the translation between an internal `xrm_merchant_items` row and
5
+ * the provider-specific codes needed for the booking API integration.
6
+ * Not a "command" — no external call fires at create time — but it
7
+ * shapes how downstream availability searches route requests, so the
8
+ * mapping is validated at the MCP boundary. Unique key:
9
+ * `t_bkm_provider_item_mappings_unique_mapping` (merchant_item_id,
10
+ * provider_category_code, provider_service_code,
11
+ * provider_location_code, tenant_id), so a retry with the same values
12
+ * fails with a duplicate-key error.
13
+ */
14
+ export declare const bkmProviderItemMappingCreateTool: Tool;
15
+ //# sourceMappingURL=bkm-provider-item-mapping-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bkm-provider-item-mapping-create.d.ts","sourceRoot":"","sources":["../../../src/tools/bkm/bkm-provider-item-mapping-create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAQtC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gCAAgC,EAAE,IAkD9C,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { z } from 'zod';
2
+ import { API_ERROR, errorResponse, successResponse } from '../types.js';
3
+ import { cap } from '../../capabilities/tool-capability.js';
4
+ import { unenforcedIdempotencyKeySchema, writeHeadersWithIdempotency, } from '../_shared/side-effect.js';
5
+ /**
6
+ * Explicit-schema create for `bkm_provider_item_mappings`. Registers
7
+ * the translation between an internal `xrm_merchant_items` row and
8
+ * the provider-specific codes needed for the booking API integration.
9
+ * Not a "command" — no external call fires at create time — but it
10
+ * shapes how downstream availability searches route requests, so the
11
+ * mapping is validated at the MCP boundary. Unique key:
12
+ * `t_bkm_provider_item_mappings_unique_mapping` (merchant_item_id,
13
+ * provider_category_code, provider_service_code,
14
+ * provider_location_code, tenant_id), so a retry with the same values
15
+ * fails with a duplicate-key error.
16
+ */
17
+ export const bkmProviderItemMappingCreateTool = {
18
+ name: 'bkm_provider_item_mapping_create',
19
+ description: 'Create a BKM provider item mapping (bkm_provider_item_mappings). Registers the ' +
20
+ 'provider-side codes for a merchant item so future availability searches route ' +
21
+ 'correctly. One mapping per merchant_item_id, provider_category_code, ' +
22
+ 'provider_service_code and provider_location_code: a retry with the same values fails ' +
23
+ 'with a duplicate-key error instead of creating a second mapping.',
24
+ inputSchema: z.object({
25
+ merchant_item_id: z
26
+ .string()
27
+ .min(1)
28
+ .describe('UUID of the xrm_merchant_items row this mapping is for'),
29
+ provider_service_code: z
30
+ .string()
31
+ .min(1)
32
+ .max(64)
33
+ .describe('Provider service code (part of the unique key)'),
34
+ provider_category_code: z.string().max(64).optional(),
35
+ provider_location_code: z.string().max(64).optional(),
36
+ metadata: z.record(z.unknown()).optional(),
37
+ idempotency_key: unenforcedIdempotencyKeySchema,
38
+ }),
39
+ capabilities: [cap('bkm_provider_item_mappings', 'INSERT')],
40
+ sideEffect: 'state_change',
41
+ confirmation: 'none',
42
+ idempotency: 'natural_key',
43
+ handler: async (args, ctx) => {
44
+ const input = args;
45
+ const body = {
46
+ merchant_item_id: input.merchant_item_id,
47
+ provider_service_code: input.provider_service_code,
48
+ };
49
+ for (const field of ['provider_category_code', 'provider_location_code', 'metadata']) {
50
+ if (input[field] !== undefined)
51
+ body[field] = input[field];
52
+ }
53
+ try {
54
+ const rows = await ctx.apiClient.post(`${ctx.apiClient.dbBasePath}/bkm_provider_item_mappings?select=*`, body, { headers: writeHeadersWithIdempotency(input.idempotency_key) });
55
+ return successResponse(rows[0]);
56
+ }
57
+ catch (error) {
58
+ return errorResponse(API_ERROR, `Failed to create BKM provider item mapping: ${error.message}`);
59
+ }
60
+ },
61
+ };
62
+ //# sourceMappingURL=bkm-provider-item-mapping-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bkm-provider-item-mapping-create.js","sourceRoot":"","sources":["../../../src/tools/bkm/bkm-provider-item-mapping-create.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,EACL,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAS;IACpD,IAAI,EAAE,kCAAkC;IACxC,WAAW,EACT,iFAAiF;QACjF,gFAAgF;QAChF,uEAAuE;QACvE,uFAAuF;QACvF,kEAAkE;IACpE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,gBAAgB,EAAE,CAAC;aAChB,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,wDAAwD,CAAC;QACrE,qBAAqB,EAAE,CAAC;aACrB,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,QAAQ,CAAC,gDAAgD,CAAC;QAC7D,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACrD,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC1C,eAAe,EAAE,8BAA8B;KAChD,CAAC;IACF,YAAY,EAAE,CAAC,GAAG,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAC;IAC3D,UAAU,EAAE,cAAc;IAC1B,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,MAAM,IAAI,GAAwB;YAChC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;SACnD,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,CAAC,wBAAwB,EAAE,wBAAwB,EAAE,UAAU,CAAC,EAAE,CAAC;YACrF,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CACnC,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,sCAAsC,EACjE,IAAI,EACJ,EAAE,OAAO,EAAE,2BAA2B,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAChE,CAAC;YACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAClB,SAAS,EACT,+CAA+C,KAAK,CAAC,OAAO,EAAE,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Tool } from '../registry.js';
2
+ import { CatalogueReport } from '../../generated-reads/index.js';
3
+ export declare const bkmGeneratedReadReport: CatalogueReport;
4
+ export declare const bkmGeneratedReadTools: Tool[];
5
+ //# sourceMappingURL=generated-reads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-reads.d.ts","sourceRoot":"","sources":["../../../src/tools/bkm/generated-reads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAGL,eAAe,EAChB,MAAM,gCAAgC,CAAC;AAiCxC,eAAO,MAAM,sBAAsB,EAAE,eAC8B,CAAC;AAEpE,eAAO,MAAM,qBAAqB,EAAE,IAAI,EAGvC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { buildGeneratedReadCatalogue, buildGeneratedReadCatalogueReport, } from '../../generated-reads/index.js';
2
+ import { loadPersistResourceContract } from '../../contracts/persist-resource-contract.js';
3
+ /**
4
+ * Bounded read tools for the BKM module (WI-0003509).
5
+ *
6
+ * The schema-driven catalogue (WI-0003500) emits describe/list/get for
7
+ * every `normal`-sensitivity BKM resource that declares a read
8
+ * operation and has no side effects. The pinned Persist contract does
9
+ * not classify any BKM resource as sensitive, so no `includeSensitive`
10
+ * opt-in is needed. Connector credentials are stored in tables not
11
+ * declared in the resource contract (Persist keeps them behind the
12
+ * credential guardrail) and are therefore not surfaced here.
13
+ *
14
+ * The catalogue emits `_describe` / `_list` / `_get` tools for:
15
+ *
16
+ * - `bkm_adapter_configurations` — third-party booking adapter
17
+ * connection/sync configuration (excludes credential columns).
18
+ * - `bkm_availability_searches` — the caller's own availability
19
+ * search requests and their status (used for polling after
20
+ * `bkm_availability_search_start`).
21
+ * - `bkm_availability_slots` — scraped/fetched availability
22
+ * slot inventory used by downstream booking flows.
23
+ * - `bkm_provider_item_mappings` — internal-to-provider item code
24
+ * mappings that drive the booking API integration.
25
+ *
26
+ * Every write on these tables lives in a dedicated hand-written tool
27
+ * with an explicit safety envelope (see `bkm-availability-*`,
28
+ * `bkm-provider-item-*`, `bkm-adapter-configuration-update`).
29
+ */
30
+ const contract = loadPersistResourceContract();
31
+ export const bkmGeneratedReadReport = buildGeneratedReadCatalogueReport(contract, { modules: ['bkm'] });
32
+ export const bkmGeneratedReadTools = buildGeneratedReadCatalogue(contract, { modules: ['bkm'] });
33
+ //# sourceMappingURL=generated-reads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-reads.js","sourceRoot":"","sources":["../../../src/tools/bkm/generated-reads.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAC3B,iCAAiC,GAElC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAE3F;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;AAE/C,MAAM,CAAC,MAAM,sBAAsB,GACjC,iCAAiC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,qBAAqB,GAAW,2BAA2B,CACtE,QAAQ,EACR,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CACrB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Tool } from '../registry.js';
2
+ export declare const bkmTools: Tool[];
3
+ /** Read-only slice used by the `bkm-readonly` selectable sub-domain. */
4
+ export declare const bkmReadOnlyTools: Tool[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/bkm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAYtC,eAAO,MAAM,QAAQ,EAAE,IAAI,EAAiD,CAAC;AAE7E,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,IAAI,EAA0B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { bkmGeneratedReadTools } from './generated-reads.js';
2
+ import { bkmAvailabilitySearchStartTool } from './bkm-availability-search-start.js';
3
+ import { bkmProviderItemMappingCreateTool } from './bkm-provider-item-mapping-create.js';
4
+ import { bkmAdapterConfigurationUpdateTool } from './bkm-adapter-configuration-update.js';
5
+ const bkmWriteTools = [
6
+ bkmAvailabilitySearchStartTool,
7
+ bkmProviderItemMappingCreateTool,
8
+ bkmAdapterConfigurationUpdateTool,
9
+ ];
10
+ export const bkmTools = [...bkmGeneratedReadTools, ...bkmWriteTools];
11
+ /** Read-only slice used by the `bkm-readonly` selectable sub-domain. */
12
+ export const bkmReadOnlyTools = bkmGeneratedReadTools;
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/bkm/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,EAAE,iCAAiC,EAAE,MAAM,uCAAuC,CAAC;AAE1F,MAAM,aAAa,GAAW;IAC5B,8BAA8B;IAC9B,gCAAgC;IAChC,iCAAiC;CAClC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAW,CAAC,GAAG,qBAAqB,EAAE,GAAG,aAAa,CAAC,CAAC;AAE7E,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAW,qBAAqB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Tool } from '../registry.js';
2
+ /**
3
+ * Command semantic tool: dispatch a control message to a registered
4
+ * device through `POST /persist/v2/dcm/devices/{id}/command`. The
5
+ * endpoint rejects a device that is not ONLINE, validates the slot and
6
+ * session-start item, and records `requested_by`. A direct insert into
7
+ * `dcm_device_commands` gets none of that: the send job has no ONLINE
8
+ * check of its own, so a command for an offline device would still
9
+ * report SENT.
10
+ *
11
+ * The tool requires `confirm: true` and a `command_type_code`, which is
12
+ * validated at the boundary for shape only; persist rejects unknown
13
+ * codes. `correlation_id` is server-assigned.
14
+ *
15
+ * ACKNOWLEDGED means the device replied, not that the command worked: a
16
+ * device that does not support a command still acknowledges it, with
17
+ * `success: false` in `response_payload`.
18
+ *
19
+ * This tool is NOT retry-safe. Nothing identifies a repeat call, so a
20
+ * retry sends the command to the device again. It takes no
21
+ * `idempotency_key` because the endpoint would ignore it (WI-0009332).
22
+ *
23
+ * Internal command queues (`fnd_http_outbox`, `ixn_queues`) are
24
+ * EXCLUDED from the MCP surface by the queue guardrail and must not
25
+ * be surfaced by this or any other tool.
26
+ */
27
+ export declare const dcmDeviceCommandDispatchTool: Tool;
28
+ //# sourceMappingURL=dcm-device-command-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dcm-device-command-dispatch.d.ts","sourceRoot":"","sources":["../../../src/tools/dcm/dcm-device-command-dispatch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAKtC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,4BAA4B,EAAE,IA0E1C,CAAC"}
@@ -0,0 +1,96 @@
1
+ import { z } from 'zod';
2
+ import { API_ERROR, errorResponse, successResponse } from '../types.js';
3
+ import { cap } from '../../capabilities/tool-capability.js';
4
+ import { confirmFlagSchema } from '../_shared/side-effect.js';
5
+ /**
6
+ * Command semantic tool: dispatch a control message to a registered
7
+ * device through `POST /persist/v2/dcm/devices/{id}/command`. The
8
+ * endpoint rejects a device that is not ONLINE, validates the slot and
9
+ * session-start item, and records `requested_by`. A direct insert into
10
+ * `dcm_device_commands` gets none of that: the send job has no ONLINE
11
+ * check of its own, so a command for an offline device would still
12
+ * report SENT.
13
+ *
14
+ * The tool requires `confirm: true` and a `command_type_code`, which is
15
+ * validated at the boundary for shape only; persist rejects unknown
16
+ * codes. `correlation_id` is server-assigned.
17
+ *
18
+ * ACKNOWLEDGED means the device replied, not that the command worked: a
19
+ * device that does not support a command still acknowledges it, with
20
+ * `success: false` in `response_payload`.
21
+ *
22
+ * This tool is NOT retry-safe. Nothing identifies a repeat call, so a
23
+ * retry sends the command to the device again. It takes no
24
+ * `idempotency_key` because the endpoint would ignore it (WI-0009332).
25
+ *
26
+ * Internal command queues (`fnd_http_outbox`, `ixn_queues`) are
27
+ * EXCLUDED from the MCP surface by the queue guardrail and must not
28
+ * be surfaced by this or any other tool.
29
+ */
30
+ export const dcmDeviceCommandDispatchTool = {
31
+ name: 'dcm_device_command_dispatch',
32
+ description: 'Send a control command to a registered DCM device. Fails if the device is not ONLINE. ' +
33
+ 'Requires confirm=true and command_type_code. Poll dcm_device_commands_get with the ' +
34
+ 'returned command_id: ACKNOWLEDGED only means the device replied, so also check ' +
35
+ 'response_payload.success. Not deduplicated: calling it again sends the command to the ' +
36
+ 'device again, so check dcm_device_commands_list filtered on device_id before retrying.',
37
+ inputSchema: z.object({
38
+ device_id: z.string().min(1).describe('UUID of the target device'),
39
+ command_type_code: z
40
+ .string()
41
+ .min(1)
42
+ .max(64)
43
+ .describe('Command from the DCM_COMMAND_TYPE lookup (e.g. GET_STATUS, HALT_STATUS, DISPENSE). ' +
44
+ 'Validated at persist. Not every device supports every command.'),
45
+ command_payload: z
46
+ .record(z.unknown())
47
+ .optional()
48
+ .describe('Command-specific payload sent to the device'),
49
+ slot_id: z
50
+ .string()
51
+ .min(1)
52
+ .optional()
53
+ .describe('Optional UUID of a dcm_device_slots row on this device'),
54
+ item_id: z
55
+ .string()
56
+ .min(1)
57
+ .optional()
58
+ .describe('Optional UUID of an item in the slot catalogue, for session-start commands ' +
59
+ '(SET_STATUS, SELECT_PRODUCT, SELECT_TIMER). Requires slot_id.'),
60
+ timeout_seconds: z
61
+ .number()
62
+ .int()
63
+ .positive()
64
+ .max(3600)
65
+ .optional()
66
+ .describe('Command timeout in seconds (defaults per command type)'),
67
+ metadata: z.record(z.unknown()).optional(),
68
+ confirm: confirmFlagSchema,
69
+ }),
70
+ capabilities: [cap('dcm_device_commands', 'INSERT')],
71
+ sideEffect: 'command',
72
+ confirmation: 'caller_confirms',
73
+ idempotency: 'not_idempotent',
74
+ handler: async (args, ctx) => {
75
+ const input = args;
76
+ const body = { command_type_code: input.command_type_code };
77
+ for (const field of [
78
+ 'command_payload',
79
+ 'slot_id',
80
+ 'item_id',
81
+ 'timeout_seconds',
82
+ 'metadata',
83
+ ]) {
84
+ if (input[field] !== undefined)
85
+ body[field] = input[field];
86
+ }
87
+ try {
88
+ const result = await ctx.apiClient.postLambda(`/dcm/devices/${encodeURIComponent(input.device_id)}/command`, body);
89
+ return successResponse(result);
90
+ }
91
+ catch (error) {
92
+ return errorResponse(API_ERROR, `Failed to dispatch DCM device command: ${error.message}`);
93
+ }
94
+ },
95
+ };
96
+ //# sourceMappingURL=dcm-device-command-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dcm-device-command-dispatch.js","sourceRoot":"","sources":["../../../src/tools/dcm/dcm-device-command-dispatch.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,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAS;IAChD,IAAI,EAAE,6BAA6B;IACnC,WAAW,EACT,wFAAwF;QACxF,qFAAqF;QACrF,iFAAiF;QACjF,wFAAwF;QACxF,wFAAwF;IAC1F,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAClE,iBAAiB,EAAE,CAAC;aACjB,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,QAAQ,CACP,qFAAqF;YACnF,gEAAgE,CACnE;QACH,eAAe,EAAE,CAAC;aACf,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;aACnB,QAAQ,EAAE;aACV,QAAQ,CAAC,6CAA6C,CAAC;QAC1D,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,EAAE;aACV,QAAQ,CAAC,wDAAwD,CAAC;QACrE,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,EAAE;aACV,QAAQ,CACP,6EAA6E;YAC3E,+DAA+D,CAClE;QACH,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,GAAG,CAAC,IAAI,CAAC;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,wDAAwD,CAAC;QACrE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC1C,OAAO,EAAE,iBAAiB;KAC3B,CAAC;IACF,YAAY,EAAE,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;IACpD,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,iBAAiB;IAC/B,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAA2B,CAAC;QAC1C,MAAM,IAAI,GAAwB,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC;QACjF,KAAK,MAAM,KAAK,IAAI;YAClB,iBAAiB;YACjB,SAAS;YACT,SAAS;YACT,iBAAiB;YACjB,UAAU;SACX,EAAE,CAAC;YACF,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,CAC3C,gBAAgB,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAC7D,IAAI,CACL,CAAC;YACF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,aAAa,CAClB,SAAS,EACT,0CAA0C,KAAK,CAAC,OAAO,EAAE,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Tool } from '../registry.js';
2
+ /**
3
+ * Provisioning semantic tool: register a new IoT device on the tenant
4
+ * (`dcm_devices`). Creating a device provisions an IoT identity and
5
+ * causes downstream cloud resources to be allocated on the caller's
6
+ * behalf, so the tool requires:
7
+ *
8
+ * - `confirm: true` to prevent accidental invocation;
9
+ * - a `device_key`. `t_dcm_devices_key_tenant_uk` makes it unique per
10
+ * tenant, so a retry fails with a duplicate-key error rather than
11
+ * provisioning a second device.
12
+ *
13
+ * `device_status_code`, `firmware_version`, `iot_endpoint_name`,
14
+ * `iot_thing_name`, `shadow_state`, and `last_seen_at` are read-only
15
+ * per the pinned contract — persist assigns them during
16
+ * provisioning, and MCP does not attempt to write them.
17
+ *
18
+ * Certificate material (`dcm_device_certificates`) is EXCLUDED from
19
+ * the MCP surface by the credentials guardrail and is never returned.
20
+ */
21
+ export declare const dcmDeviceRegisterTool: Tool;
22
+ //# sourceMappingURL=dcm-device-register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dcm-device-register.d.ts","sourceRoot":"","sources":["../../../src/tools/dcm/dcm-device-register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAStC;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,qBAAqB,EAAE,IAgEnC,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { z } from 'zod';
2
+ import { API_ERROR, errorResponse, successResponse } from '../types.js';
3
+ import { cap } from '../../capabilities/tool-capability.js';
4
+ import { confirmFlagSchema, unenforcedIdempotencyKeySchema, writeHeadersWithIdempotency, } from '../_shared/side-effect.js';
5
+ /**
6
+ * Provisioning semantic tool: register a new IoT device on the tenant
7
+ * (`dcm_devices`). Creating a device provisions an IoT identity and
8
+ * causes downstream cloud resources to be allocated on the caller's
9
+ * behalf, so the tool requires:
10
+ *
11
+ * - `confirm: true` to prevent accidental invocation;
12
+ * - a `device_key`. `t_dcm_devices_key_tenant_uk` makes it unique per
13
+ * tenant, so a retry fails with a duplicate-key error rather than
14
+ * provisioning a second device.
15
+ *
16
+ * `device_status_code`, `firmware_version`, `iot_endpoint_name`,
17
+ * `iot_thing_name`, `shadow_state`, and `last_seen_at` are read-only
18
+ * per the pinned contract — persist assigns them during
19
+ * provisioning, and MCP does not attempt to write them.
20
+ *
21
+ * Certificate material (`dcm_device_certificates`) is EXCLUDED from
22
+ * the MCP surface by the credentials guardrail and is never returned.
23
+ */
24
+ export const dcmDeviceRegisterTool = {
25
+ name: 'dcm_device_register',
26
+ description: 'Provision a new IoT device on the tenant (dcm_devices). Requires confirm=true and ' +
27
+ 'a device_key. Certificate material is never returned. device_key is unique within ' +
28
+ 'the tenant: a retry fails with a duplicate-key error instead of registering a second device.',
29
+ inputSchema: z.object({
30
+ device_key: z
31
+ .string()
32
+ .min(1)
33
+ .max(128)
34
+ .describe('Stable device identifier, unique within the tenant'),
35
+ device_name: z.string().min(1).max(256).describe('Human-readable device name'),
36
+ device_type_code: z.string().max(64).optional(),
37
+ party_id: z
38
+ .string()
39
+ .min(1)
40
+ .optional()
41
+ .describe('UUID of the PRM party (merchant) this device is owned by'),
42
+ location_id: z.string().min(1).optional().describe('UUID of the PRM location'),
43
+ is_public: z
44
+ .boolean()
45
+ .optional()
46
+ .describe('Whether this device is discoverable via the anonymous public view'),
47
+ iot_thing_arn: z
48
+ .string()
49
+ .max(2048)
50
+ .optional()
51
+ .describe('Optional pre-provisioned AWS IoT thing ARN'),
52
+ metadata: z.record(z.unknown()).optional(),
53
+ confirm: confirmFlagSchema,
54
+ idempotency_key: unenforcedIdempotencyKeySchema,
55
+ }),
56
+ capabilities: [cap('dcm_devices', 'INSERT')],
57
+ sideEffect: 'provisioning',
58
+ confirmation: 'caller_confirms',
59
+ idempotency: 'natural_key',
60
+ handler: async (args, ctx) => {
61
+ const input = args;
62
+ const body = {
63
+ device_key: input.device_key,
64
+ device_name: input.device_name,
65
+ };
66
+ for (const field of [
67
+ 'device_type_code',
68
+ 'party_id',
69
+ 'location_id',
70
+ 'is_public',
71
+ 'iot_thing_arn',
72
+ 'metadata',
73
+ ]) {
74
+ if (input[field] !== undefined)
75
+ body[field] = input[field];
76
+ }
77
+ try {
78
+ const rows = await ctx.apiClient.post(`${ctx.apiClient.dbBasePath}/dcm_devices?select=*`, body, { headers: writeHeadersWithIdempotency(input.idempotency_key) });
79
+ return successResponse(rows[0]);
80
+ }
81
+ catch (error) {
82
+ return errorResponse(API_ERROR, `Failed to register DCM device: ${error.message}`);
83
+ }
84
+ },
85
+ };
86
+ //# sourceMappingURL=dcm-device-register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dcm-device-register.js","sourceRoot":"","sources":["../../../src/tools/dcm/dcm-device-register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Tool } from '../registry.js';
2
+ /**
3
+ * Explicit-schema update for a DCM device slot (`dcm_device_slots`).
4
+ * Configures the assigned item, quantity, and capacity so slot-level
5
+ * inventory state stays in sync with reality. `slot_state` and
6
+ * `device_id` / `slot_number` are read-only per the pinned contract
7
+ * and cannot be reassigned through this tool (delete + recreate the
8
+ * slot for that).
9
+ *
10
+ * Retry-safe (converges on the same target state).
11
+ */
12
+ export declare const dcmDeviceSlotConfigureTool: Tool;
13
+ //# sourceMappingURL=dcm-device-slot-configure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dcm-device-slot-configure.d.ts","sourceRoot":"","sources":["../../../src/tools/dcm/dcm-device-slot-configure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAQtC;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,EAAE,IAoExC,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ import { API_ERROR, errorResponse, successResponse } from '../types.js';
3
+ import { cap } from '../../capabilities/tool-capability.js';
4
+ import { unenforcedIdempotencyKeySchema, writeHeadersWithIdempotency, } from '../_shared/side-effect.js';
5
+ /**
6
+ * Explicit-schema update for a DCM device slot (`dcm_device_slots`).
7
+ * Configures the assigned item, quantity, and capacity so slot-level
8
+ * inventory state stays in sync with reality. `slot_state` and
9
+ * `device_id` / `slot_number` are read-only per the pinned contract
10
+ * and cannot be reassigned through this tool (delete + recreate the
11
+ * slot for that).
12
+ *
13
+ * Retry-safe (converges on the same target state).
14
+ */
15
+ export const dcmDeviceSlotConfigureTool = {
16
+ name: 'dcm_device_slot_configure',
17
+ description: 'Configure a DCM device slot (dcm_device_slots): assigned item, quantity, capacity, ' +
18
+ 'status, and UoM. slot_state, device_id, and slot_number are read-only. Retry-safe.',
19
+ inputSchema: z
20
+ .object({
21
+ id: z.string().min(1).describe('UUID of the dcm_device_slots row'),
22
+ item_id: z
23
+ .string()
24
+ .min(1)
25
+ .nullable()
26
+ .optional()
27
+ .describe('UUID of the gpm_items row assigned to this slot; null to clear'),
28
+ quantity: z.number().nonnegative().optional(),
29
+ capacity: z.number().positive().optional(),
30
+ slot_status_code: z.string().max(64).optional(),
31
+ slot_uom: z.string().max(3).optional(),
32
+ slot_name: z.string().max(256).optional(),
33
+ metadata: z.record(z.unknown()).nullable().optional(),
34
+ idempotency_key: unenforcedIdempotencyKeySchema,
35
+ })
36
+ .refine((v) => v.item_id !== undefined ||
37
+ v.quantity !== undefined ||
38
+ v.capacity !== undefined ||
39
+ v.slot_status_code !== undefined ||
40
+ v.slot_uom !== undefined ||
41
+ v.slot_name !== undefined ||
42
+ v.metadata !== undefined, {
43
+ message: 'supply at least one field to change.',
44
+ }),
45
+ capabilities: [cap('dcm_device_slots', 'UPDATE')],
46
+ sideEffect: 'state_change',
47
+ confirmation: 'none',
48
+ idempotency: 'natural_key',
49
+ handler: async (args, ctx) => {
50
+ const { id, idempotency_key, ...rest } = args;
51
+ const body = {};
52
+ for (const [k, v] of Object.entries(rest)) {
53
+ if (v !== undefined)
54
+ body[k] = v;
55
+ }
56
+ try {
57
+ const rows = await ctx.apiClient.patch(`${ctx.apiClient.dbBasePath}/dcm_device_slots?id=eq.${id}&select=*`, body, { headers: writeHeadersWithIdempotency(idempotency_key) });
58
+ if (!rows || rows.length === 0) {
59
+ return errorResponse(API_ERROR, `DCM device slot ${id} not found or not accessible`);
60
+ }
61
+ return successResponse(rows[0]);
62
+ }
63
+ catch (error) {
64
+ return errorResponse(API_ERROR, `Failed to configure DCM device slot: ${error.message}`);
65
+ }
66
+ },
67
+ };
68
+ //# sourceMappingURL=dcm-device-slot-configure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dcm-device-slot-configure.js","sourceRoot":"","sources":["../../../src/tools/dcm/dcm-device-slot-configure.ts"],"names":[],"mappings":"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"}