@sensigo/realm 0.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 (222) hide show
  1. package/README.md +150 -0
  2. package/dist/adapters/adapter-utils.d.ts +14 -0
  3. package/dist/adapters/adapter-utils.d.ts.map +1 -0
  4. package/dist/adapters/adapter-utils.js +18 -0
  5. package/dist/adapters/adapter-utils.js.map +1 -0
  6. package/dist/adapters/airtable-adapter.d.ts +51 -0
  7. package/dist/adapters/airtable-adapter.d.ts.map +1 -0
  8. package/dist/adapters/airtable-adapter.js +425 -0
  9. package/dist/adapters/airtable-adapter.js.map +1 -0
  10. package/dist/adapters/file-adapter.d.ts +14 -0
  11. package/dist/adapters/file-adapter.d.ts.map +1 -0
  12. package/dist/adapters/file-adapter.js +89 -0
  13. package/dist/adapters/file-adapter.js.map +1 -0
  14. package/dist/adapters/github-adapter.d.ts +40 -0
  15. package/dist/adapters/github-adapter.d.ts.map +1 -0
  16. package/dist/adapters/github-adapter.js +286 -0
  17. package/dist/adapters/github-adapter.js.map +1 -0
  18. package/dist/adapters/gorgias-adapter.d.ts +40 -0
  19. package/dist/adapters/gorgias-adapter.d.ts.map +1 -0
  20. package/dist/adapters/gorgias-adapter.js +300 -0
  21. package/dist/adapters/gorgias-adapter.js.map +1 -0
  22. package/dist/adapters/http-adapter.d.ts +28 -0
  23. package/dist/adapters/http-adapter.d.ts.map +1 -0
  24. package/dist/adapters/http-adapter.js +97 -0
  25. package/dist/adapters/http-adapter.js.map +1 -0
  26. package/dist/adapters/mock-adapter.d.ts +16 -0
  27. package/dist/adapters/mock-adapter.d.ts.map +1 -0
  28. package/dist/adapters/mock-adapter.js +61 -0
  29. package/dist/adapters/mock-adapter.js.map +1 -0
  30. package/dist/adapters/notion-adapter.d.ts +54 -0
  31. package/dist/adapters/notion-adapter.d.ts.map +1 -0
  32. package/dist/adapters/notion-adapter.js +751 -0
  33. package/dist/adapters/notion-adapter.js.map +1 -0
  34. package/dist/adapters/parcelpanel-adapter.d.ts +60 -0
  35. package/dist/adapters/parcelpanel-adapter.d.ts.map +1 -0
  36. package/dist/adapters/parcelpanel-adapter.js +251 -0
  37. package/dist/adapters/parcelpanel-adapter.js.map +1 -0
  38. package/dist/adapters/rate-limiter.d.ts +26 -0
  39. package/dist/adapters/rate-limiter.d.ts.map +1 -0
  40. package/dist/adapters/rate-limiter.js +3 -0
  41. package/dist/adapters/rate-limiter.js.map +1 -0
  42. package/dist/adapters/shopify-adapter.d.ts +92 -0
  43. package/dist/adapters/shopify-adapter.d.ts.map +1 -0
  44. package/dist/adapters/shopify-adapter.js +415 -0
  45. package/dist/adapters/shopify-adapter.js.map +1 -0
  46. package/dist/adapters/slack-adapter.d.ts +18 -0
  47. package/dist/adapters/slack-adapter.d.ts.map +1 -0
  48. package/dist/adapters/slack-adapter.js +81 -0
  49. package/dist/adapters/slack-adapter.js.map +1 -0
  50. package/dist/adapters/token-bucket.d.ts +27 -0
  51. package/dist/adapters/token-bucket.d.ts.map +1 -0
  52. package/dist/adapters/token-bucket.js +109 -0
  53. package/dist/adapters/token-bucket.js.map +1 -0
  54. package/dist/config/secrets.d.ts +15 -0
  55. package/dist/config/secrets.d.ts.map +1 -0
  56. package/dist/config/secrets.js +33 -0
  57. package/dist/config/secrets.js.map +1 -0
  58. package/dist/engine/eligibility.d.ts +50 -0
  59. package/dist/engine/eligibility.d.ts.map +1 -0
  60. package/dist/engine/eligibility.js +267 -0
  61. package/dist/engine/eligibility.js.map +1 -0
  62. package/dist/engine/error-resolution.d.ts +20 -0
  63. package/dist/engine/error-resolution.d.ts.map +1 -0
  64. package/dist/engine/error-resolution.js +32 -0
  65. package/dist/engine/error-resolution.js.map +1 -0
  66. package/dist/engine/execution-loop.d.ts +101 -0
  67. package/dist/engine/execution-loop.d.ts.map +1 -0
  68. package/dist/engine/execution-loop.js +1156 -0
  69. package/dist/engine/execution-loop.js.map +1 -0
  70. package/dist/engine/lifecycle.d.ts +14 -0
  71. package/dist/engine/lifecycle.d.ts.map +1 -0
  72. package/dist/engine/lifecycle.js +17 -0
  73. package/dist/engine/lifecycle.js.map +1 -0
  74. package/dist/engine/precondition.d.ts +30 -0
  75. package/dist/engine/precondition.d.ts.map +1 -0
  76. package/dist/engine/precondition.js +125 -0
  77. package/dist/engine/precondition.js.map +1 -0
  78. package/dist/engine/prompt-template.d.ts +25 -0
  79. package/dist/engine/prompt-template.d.ts.map +1 -0
  80. package/dist/engine/prompt-template.js +66 -0
  81. package/dist/engine/prompt-template.js.map +1 -0
  82. package/dist/engine/render-template.d.ts +52 -0
  83. package/dist/engine/render-template.d.ts.map +1 -0
  84. package/dist/engine/render-template.js +548 -0
  85. package/dist/engine/render-template.js.map +1 -0
  86. package/dist/engine/state-guard.d.ts +15 -0
  87. package/dist/engine/state-guard.d.ts.map +1 -0
  88. package/dist/engine/state-guard.js +40 -0
  89. package/dist/engine/state-guard.js.map +1 -0
  90. package/dist/engine/trace-normalizer.d.ts +36 -0
  91. package/dist/engine/trace-normalizer.d.ts.map +1 -0
  92. package/dist/engine/trace-normalizer.js +146 -0
  93. package/dist/engine/trace-normalizer.js.map +1 -0
  94. package/dist/engine/trace-policy.d.ts +53 -0
  95. package/dist/engine/trace-policy.d.ts.map +1 -0
  96. package/dist/engine/trace-policy.js +35 -0
  97. package/dist/engine/trace-policy.js.map +1 -0
  98. package/dist/engine/workflow-context-loader.d.ts +9 -0
  99. package/dist/engine/workflow-context-loader.d.ts.map +1 -0
  100. package/dist/engine/workflow-context-loader.js +41 -0
  101. package/dist/engine/workflow-context-loader.js.map +1 -0
  102. package/dist/evidence/snapshot.d.ts +38 -0
  103. package/dist/evidence/snapshot.d.ts.map +1 -0
  104. package/dist/evidence/snapshot.js +53 -0
  105. package/dist/evidence/snapshot.js.map +1 -0
  106. package/dist/extensions/default-registry.d.ts +19 -0
  107. package/dist/extensions/default-registry.d.ts.map +1 -0
  108. package/dist/extensions/default-registry.js +31 -0
  109. package/dist/extensions/default-registry.js.map +1 -0
  110. package/dist/extensions/processor.d.ts +13 -0
  111. package/dist/extensions/processor.d.ts.map +1 -0
  112. package/dist/extensions/processor.js +3 -0
  113. package/dist/extensions/processor.js.map +1 -0
  114. package/dist/extensions/registry.d.ts +25 -0
  115. package/dist/extensions/registry.d.ts.map +1 -0
  116. package/dist/extensions/registry.js +43 -0
  117. package/dist/extensions/registry.js.map +1 -0
  118. package/dist/extensions/service-adapter.d.ts +35 -0
  119. package/dist/extensions/service-adapter.d.ts.map +1 -0
  120. package/dist/extensions/service-adapter.js +3 -0
  121. package/dist/extensions/service-adapter.js.map +1 -0
  122. package/dist/extensions/step-handler.d.ts +28 -0
  123. package/dist/extensions/step-handler.d.ts.map +1 -0
  124. package/dist/extensions/step-handler.js +3 -0
  125. package/dist/extensions/step-handler.js.map +1 -0
  126. package/dist/handlers/primitives/compare-strings.d.ts +13 -0
  127. package/dist/handlers/primitives/compare-strings.d.ts.map +1 -0
  128. package/dist/handlers/primitives/compare-strings.js +28 -0
  129. package/dist/handlers/primitives/compare-strings.js.map +1 -0
  130. package/dist/handlers/primitives/count-results.d.ts +21 -0
  131. package/dist/handlers/primitives/count-results.d.ts.map +1 -0
  132. package/dist/handlers/primitives/count-results.js +23 -0
  133. package/dist/handlers/primitives/count-results.js.map +1 -0
  134. package/dist/handlers/primitives/partition-by-substring.d.ts +18 -0
  135. package/dist/handlers/primitives/partition-by-substring.d.ts.map +1 -0
  136. package/dist/handlers/primitives/partition-by-substring.js +28 -0
  137. package/dist/handlers/primitives/partition-by-substring.js.map +1 -0
  138. package/dist/handlers/primitives/resolve-resource.d.ts +13 -0
  139. package/dist/handlers/primitives/resolve-resource.d.ts.map +1 -0
  140. package/dist/handlers/primitives/resolve-resource.js +21 -0
  141. package/dist/handlers/primitives/resolve-resource.js.map +1 -0
  142. package/dist/handlers/primitives/walk-field.d.ts +11 -0
  143. package/dist/handlers/primitives/walk-field.d.ts.map +1 -0
  144. package/dist/handlers/primitives/walk-field.js +31 -0
  145. package/dist/handlers/primitives/walk-field.js.map +1 -0
  146. package/dist/handlers/validate-field-match.d.ts +11 -0
  147. package/dist/handlers/validate-field-match.d.ts.map +1 -0
  148. package/dist/handlers/validate-field-match.js +39 -0
  149. package/dist/handlers/validate-field-match.js.map +1 -0
  150. package/dist/handlers/validate-verbatim-quotes.d.ts +11 -0
  151. package/dist/handlers/validate-verbatim-quotes.d.ts.map +1 -0
  152. package/dist/handlers/validate-verbatim-quotes.js +37 -0
  153. package/dist/handlers/validate-verbatim-quotes.js.map +1 -0
  154. package/dist/index.d.ts +57 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +45 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/pipeline/processing-pipeline.d.ts +24 -0
  159. package/dist/pipeline/processing-pipeline.d.ts.map +1 -0
  160. package/dist/pipeline/processing-pipeline.js +53 -0
  161. package/dist/pipeline/processing-pipeline.js.map +1 -0
  162. package/dist/processors/compute-hash.d.ts +4 -0
  163. package/dist/processors/compute-hash.d.ts.map +1 -0
  164. package/dist/processors/compute-hash.js +14 -0
  165. package/dist/processors/compute-hash.js.map +1 -0
  166. package/dist/processors/normalize-text.d.ts +8 -0
  167. package/dist/processors/normalize-text.d.ts.map +1 -0
  168. package/dist/processors/normalize-text.js +47 -0
  169. package/dist/processors/normalize-text.js.map +1 -0
  170. package/dist/store/json-file-store.d.ts +24 -0
  171. package/dist/store/json-file-store.d.ts.map +1 -0
  172. package/dist/store/json-file-store.js +210 -0
  173. package/dist/store/json-file-store.js.map +1 -0
  174. package/dist/store/store-interface.d.ts +33 -0
  175. package/dist/store/store-interface.d.ts.map +1 -0
  176. package/dist/store/store-interface.js +2 -0
  177. package/dist/store/store-interface.js.map +1 -0
  178. package/dist/store/trace-buffer-store.d.ts +55 -0
  179. package/dist/store/trace-buffer-store.d.ts.map +1 -0
  180. package/dist/store/trace-buffer-store.js +113 -0
  181. package/dist/store/trace-buffer-store.js.map +1 -0
  182. package/dist/types/mcp-types.d.ts +17 -0
  183. package/dist/types/mcp-types.d.ts.map +1 -0
  184. package/dist/types/mcp-types.js +5 -0
  185. package/dist/types/mcp-types.js.map +1 -0
  186. package/dist/types/response-envelope.d.ts +96 -0
  187. package/dist/types/response-envelope.d.ts.map +1 -0
  188. package/dist/types/response-envelope.js +2 -0
  189. package/dist/types/response-envelope.js.map +1 -0
  190. package/dist/types/run-record.d.ts +169 -0
  191. package/dist/types/run-record.d.ts.map +1 -0
  192. package/dist/types/run-record.js +2 -0
  193. package/dist/types/run-record.js.map +1 -0
  194. package/dist/types/workflow-definition.d.ts +292 -0
  195. package/dist/types/workflow-definition.d.ts.map +1 -0
  196. package/dist/types/workflow-definition.js +2 -0
  197. package/dist/types/workflow-definition.js.map +1 -0
  198. package/dist/types/workflow-error.d.ts +26 -0
  199. package/dist/types/workflow-error.d.ts.map +1 -0
  200. package/dist/types/workflow-error.js +28 -0
  201. package/dist/types/workflow-error.js.map +1 -0
  202. package/dist/utils/schema-skeleton.d.ts +11 -0
  203. package/dist/utils/schema-skeleton.d.ts.map +1 -0
  204. package/dist/utils/schema-skeleton.js +40 -0
  205. package/dist/utils/schema-skeleton.js.map +1 -0
  206. package/dist/validation/input-schema.d.ts +26 -0
  207. package/dist/validation/input-schema.d.ts.map +1 -0
  208. package/dist/validation/input-schema.js +67 -0
  209. package/dist/validation/input-schema.js.map +1 -0
  210. package/dist/workflow/registrar.d.ts +20 -0
  211. package/dist/workflow/registrar.d.ts.map +1 -0
  212. package/dist/workflow/registrar.js +61 -0
  213. package/dist/workflow/registrar.js.map +1 -0
  214. package/dist/workflow/template-resolver.d.ts +25 -0
  215. package/dist/workflow/template-resolver.d.ts.map +1 -0
  216. package/dist/workflow/template-resolver.js +112 -0
  217. package/dist/workflow/template-resolver.js.map +1 -0
  218. package/dist/workflow/yaml-loader.d.ts +15 -0
  219. package/dist/workflow/yaml-loader.d.ts.map +1 -0
  220. package/dist/workflow/yaml-loader.js +408 -0
  221. package/dist/workflow/yaml-loader.js.map +1 -0
  222. package/package.json +61 -0
@@ -0,0 +1,415 @@
1
+ // ShopifyAdapter — communicates with the Shopify Admin GraphQL API.
2
+ import { WorkflowError } from '../types/workflow-error.js';
3
+ import { parseRetryAfterHeader } from './adapter-utils.js';
4
+ const SHOPIFY_DEFAULT_API_VERSION = '2024-04';
5
+ const ORDERS_BY_NAME_QUERY = `
6
+ query OrderByName($query: String!) {
7
+ orders(first: 1, query: $query) {
8
+ edges {
9
+ node {
10
+ id
11
+ legacyResourceId
12
+ number
13
+ name
14
+ displayFinancialStatus
15
+ displayFulfillmentStatus
16
+ cancelledAt
17
+ cancelReason
18
+ createdAt
19
+ customer {
20
+ firstName
21
+ lastName
22
+ email
23
+ }
24
+ currentTotalPriceSet {
25
+ shopMoney { amount currencyCode }
26
+ }
27
+ currentSubtotalPriceSet {
28
+ shopMoney { amount }
29
+ }
30
+ currentShippingPriceSet {
31
+ shopMoney { amount }
32
+ }
33
+ discountCodes
34
+ lineItems(first: 50) {
35
+ edges {
36
+ node {
37
+ name
38
+ quantity
39
+ originalUnitPriceSet {
40
+ shopMoney { amount }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+ `.trim();
50
+ /**
51
+ * ShopifyAdapter communicates with the Shopify Admin GraphQL API.
52
+ *
53
+ * Supported operations:
54
+ * fetch('get_order', { store, order_name }) — POST /admin/api/{version}/graphql.json
55
+ */
56
+ export class ShopifyAdapter {
57
+ id;
58
+ defaultRetryAfterSeconds = 30;
59
+ apiVersion;
60
+ baseUrlOverride;
61
+ stores;
62
+ constructor(id, config) {
63
+ const storeEntries = Object.entries(config.stores);
64
+ if (storeEntries.length === 0) {
65
+ throw new Error('ShopifyAdapter: stores must not be empty');
66
+ }
67
+ for (const [key, store] of storeEntries) {
68
+ if (key === '') {
69
+ throw new Error('ShopifyAdapter: store key must not be an empty string');
70
+ }
71
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9-]*\.myshopify\.com$/.test(store.shop_domain)) {
72
+ throw new Error(`ShopifyAdapter: invalid shop_domain for store "${key}"`);
73
+ }
74
+ if (store.access_token === '') {
75
+ throw new Error(`ShopifyAdapter: access_token must not be empty for store "${key}"`);
76
+ }
77
+ }
78
+ if (config.api_version !== undefined && !/^\d{4}-\d{2}$/.test(config.api_version)) {
79
+ throw new Error('ShopifyAdapter: invalid api_version');
80
+ }
81
+ this.id = id;
82
+ this.stores = config.stores;
83
+ this.apiVersion = config.api_version ?? SHOPIFY_DEFAULT_API_VERSION;
84
+ this.baseUrlOverride = config.base_url?.replace(/\/$/, '');
85
+ }
86
+ checkAborted(signal) {
87
+ if (signal?.aborted === true) {
88
+ throw new WorkflowError('Adapter request aborted', {
89
+ code: 'STEP_ABORTED',
90
+ category: 'ENGINE',
91
+ agentAction: 'report_to_user',
92
+ retryable: false,
93
+ });
94
+ }
95
+ }
96
+ async executeRequest(url, options, signal) {
97
+ this.checkAborted(signal);
98
+ let response;
99
+ try {
100
+ response = await fetch(url, { ...options, signal: signal ?? null });
101
+ }
102
+ catch (err) {
103
+ if (err instanceof Error && err.name === 'AbortError') {
104
+ throw new WorkflowError('Adapter request aborted', {
105
+ code: 'STEP_ABORTED',
106
+ category: 'ENGINE',
107
+ agentAction: 'report_to_user',
108
+ retryable: false,
109
+ });
110
+ }
111
+ const message = err instanceof Error ? err.message : String(err);
112
+ throw new WorkflowError(message, {
113
+ code: 'NETWORK_UNREACHABLE',
114
+ category: 'NETWORK',
115
+ agentAction: 'wait_for_human',
116
+ retryable: true,
117
+ });
118
+ }
119
+ return response;
120
+ }
121
+ async throwHttpError(response, operation) {
122
+ // Read body as text first — avoids "body already consumed" if JSON.parse fails.
123
+ const rawText = await response.text();
124
+ let body;
125
+ try {
126
+ body = JSON.parse(rawText);
127
+ }
128
+ catch {
129
+ body = rawText;
130
+ }
131
+ const status = response.status;
132
+ const details = { status, operation, body };
133
+ if (status === 429) {
134
+ const retryAfterFromHeader = parseRetryAfterHeader(response.headers.get('Retry-After'));
135
+ throw new WorkflowError('Rate limited by Shopify API', {
136
+ code: 'SERVICE_RATE_LIMITED',
137
+ category: 'SERVICE',
138
+ agentAction: 'wait_and_proceed',
139
+ retryable: true,
140
+ ...(retryAfterFromHeader !== undefined ? { retry_after: retryAfterFromHeader } : {}),
141
+ details,
142
+ });
143
+ }
144
+ if (status === 401) {
145
+ throw new WorkflowError('Shopify authentication failed — check access token', {
146
+ code: 'SERVICE_AUTH_FAILED',
147
+ category: 'SERVICE',
148
+ agentAction: 'stop',
149
+ retryable: false,
150
+ details,
151
+ });
152
+ }
153
+ if (status >= 400 && status < 500) {
154
+ throw new WorkflowError(`HTTP ${status}: ${response.statusText}`, {
155
+ code: 'SERVICE_HTTP_4XX',
156
+ category: 'SERVICE',
157
+ agentAction: 'stop',
158
+ retryable: false,
159
+ details,
160
+ });
161
+ }
162
+ // 5xx
163
+ throw new WorkflowError(`Shopify server error (HTTP ${status})`, {
164
+ code: 'SERVICE_HTTP_5XX',
165
+ category: 'SERVICE',
166
+ agentAction: 'report_to_user',
167
+ retryable: true,
168
+ details,
169
+ });
170
+ }
171
+ normalizeOrder(node, store, normalizedOrderName) {
172
+ if (typeof node.id !== 'string' || node.id === '') {
173
+ throw new WorkflowError('ShopifyAdapter: missing order id in response', {
174
+ code: 'SERVICE_RESPONSE_INVALID',
175
+ category: 'SERVICE',
176
+ agentAction: 'report_to_user',
177
+ retryable: false,
178
+ });
179
+ }
180
+ if (typeof node.number !== 'number') {
181
+ throw new WorkflowError('ShopifyAdapter: missing order number in response', {
182
+ code: 'SERVICE_RESPONSE_INVALID',
183
+ category: 'SERVICE',
184
+ agentAction: 'report_to_user',
185
+ retryable: false,
186
+ });
187
+ }
188
+ if (typeof node.displayFulfillmentStatus !== 'string' || node.displayFulfillmentStatus === '') {
189
+ throw new WorkflowError('ShopifyAdapter: missing fulfillment_status in response', {
190
+ code: 'SERVICE_RESPONSE_INVALID',
191
+ category: 'SERVICE',
192
+ agentAction: 'report_to_user',
193
+ retryable: false,
194
+ });
195
+ }
196
+ if (typeof node.createdAt !== 'string') {
197
+ throw new WorkflowError('ShopifyAdapter: missing created_at in response', {
198
+ code: 'SERVICE_RESPONSE_INVALID',
199
+ category: 'SERVICE',
200
+ agentAction: 'report_to_user',
201
+ retryable: false,
202
+ });
203
+ }
204
+ const totalPrice = node.currentTotalPriceSet?.shopMoney?.amount;
205
+ if (typeof totalPrice !== 'string') {
206
+ throw new WorkflowError('ShopifyAdapter: missing total_price in response', {
207
+ code: 'SERVICE_RESPONSE_INVALID',
208
+ category: 'SERVICE',
209
+ agentAction: 'report_to_user',
210
+ retryable: false,
211
+ });
212
+ }
213
+ const subtotalPrice = node.currentSubtotalPriceSet?.shopMoney?.amount;
214
+ if (typeof subtotalPrice !== 'string') {
215
+ throw new WorkflowError('ShopifyAdapter: missing subtotal_price in response', {
216
+ code: 'SERVICE_RESPONSE_INVALID',
217
+ category: 'SERVICE',
218
+ agentAction: 'report_to_user',
219
+ retryable: false,
220
+ });
221
+ }
222
+ const customer = node.customer != null
223
+ ? {
224
+ first_name: node.customer.firstName,
225
+ last_name: node.customer.lastName,
226
+ email: node.customer.email || null,
227
+ }
228
+ : null;
229
+ const lineItems = (node.lineItems?.edges ?? []).map((edge) => ({
230
+ name: edge.node.name,
231
+ quantity: edge.node.quantity,
232
+ price: edge.node.originalUnitPriceSet?.shopMoney?.amount ?? '0.00',
233
+ }));
234
+ void store;
235
+ void normalizedOrderName;
236
+ return {
237
+ id: node.id,
238
+ legacy_id: String(node.legacyResourceId ?? ''),
239
+ order_number: node.number,
240
+ name: String(node.name ?? ''),
241
+ financial_status: typeof node.displayFinancialStatus === 'string' ? node.displayFinancialStatus : null,
242
+ fulfillment_status: node.displayFulfillmentStatus,
243
+ cancelled_at: typeof node.cancelledAt === 'string' ? node.cancelledAt : null,
244
+ cancel_reason: typeof node.cancelReason === 'string' ? node.cancelReason : null,
245
+ created_at: node.createdAt,
246
+ customer,
247
+ total_price: totalPrice,
248
+ subtotal_price: subtotalPrice,
249
+ shipping_total: node.currentShippingPriceSet?.shopMoney?.amount ?? '0.00',
250
+ currency: node.currentTotalPriceSet?.shopMoney?.currencyCode ?? '',
251
+ discount_codes: Array.isArray(node.discountCodes) ? node.discountCodes : [],
252
+ line_items: lineItems,
253
+ };
254
+ }
255
+ async fetch(operation, params, _config, signal) {
256
+ // config.auth is ignored — auth is set at construction time via stores map
257
+ if (operation === 'get_order') {
258
+ // Validate store param
259
+ const store = params['store'];
260
+ if (typeof store !== 'string') {
261
+ throw new WorkflowError('ShopifyAdapter: store param must be a string', {
262
+ code: 'ADAPTER_VALIDATION_FAILED',
263
+ category: 'ENGINE',
264
+ agentAction: 'provide_input',
265
+ retryable: false,
266
+ });
267
+ }
268
+ const storeConfig = this.stores[store];
269
+ if (storeConfig === undefined) {
270
+ throw new WorkflowError(`ShopifyAdapter: unknown store "${store}"`, {
271
+ code: 'ADAPTER_VALIDATION_FAILED',
272
+ category: 'ENGINE',
273
+ agentAction: 'provide_input',
274
+ retryable: false,
275
+ details: { store },
276
+ });
277
+ }
278
+ // Validate order_name
279
+ const rawOrderName = params['order_name'];
280
+ if (typeof rawOrderName !== 'string' || rawOrderName === '') {
281
+ throw new WorkflowError('ShopifyAdapter: order_name param must be a non-empty string', {
282
+ code: 'ADAPTER_VALIDATION_FAILED',
283
+ category: 'ENGINE',
284
+ agentAction: 'provide_input',
285
+ retryable: false,
286
+ });
287
+ }
288
+ // Normalize order_name
289
+ let normalizedOrderName = rawOrderName.trim();
290
+ if (!normalizedOrderName.startsWith('#')) {
291
+ normalizedOrderName = '#' + normalizedOrderName;
292
+ }
293
+ if (!/^#.+$/.test(normalizedOrderName)) {
294
+ throw new WorkflowError('ShopifyAdapter: order_name is invalid after normalization', {
295
+ code: 'ADAPTER_VALIDATION_FAILED',
296
+ category: 'ENGINE',
297
+ agentAction: 'provide_input',
298
+ retryable: false,
299
+ });
300
+ }
301
+ const base = this.baseUrlOverride ?? `https://${storeConfig.shop_domain}`;
302
+ const url = `${base}/admin/api/${this.apiVersion}/graphql.json`;
303
+ const requestOptions = {
304
+ method: 'POST',
305
+ headers: {
306
+ 'X-Shopify-Access-Token': storeConfig.access_token,
307
+ 'Content-Type': 'application/json',
308
+ Accept: 'application/json',
309
+ },
310
+ body: JSON.stringify({
311
+ query: ORDERS_BY_NAME_QUERY,
312
+ variables: { query: `name:${normalizedOrderName}` },
313
+ }),
314
+ };
315
+ const response = await this.executeRequest(url, requestOptions, signal);
316
+ if (!response.ok) {
317
+ await this.throwHttpError(response, 'get_order');
318
+ }
319
+ // Parse JSON response
320
+ let gqlBody;
321
+ try {
322
+ gqlBody = await response.json();
323
+ }
324
+ catch {
325
+ throw new WorkflowError('ShopifyAdapter: failed to parse GraphQL response', {
326
+ code: 'SERVICE_RESPONSE_INVALID',
327
+ category: 'SERVICE',
328
+ agentAction: 'report_to_user',
329
+ retryable: false,
330
+ });
331
+ }
332
+ const body = gqlBody;
333
+ // Check for GraphQL errors
334
+ if (Array.isArray(body['errors']) && body['errors'].length > 0) {
335
+ const errors = body['errors'];
336
+ const firstError = errors[0];
337
+ const extensions = firstError?.['extensions'];
338
+ if (extensions?.['code'] === 'THROTTLED') {
339
+ throw new WorkflowError('Shopify GraphQL rate limited', {
340
+ code: 'SERVICE_RATE_LIMITED',
341
+ category: 'SERVICE',
342
+ agentAction: 'wait_and_proceed',
343
+ retryable: true,
344
+ retry_after: 2,
345
+ });
346
+ }
347
+ throw new WorkflowError('ShopifyAdapter: GraphQL errors in response', {
348
+ code: 'SERVICE_RESPONSE_INVALID',
349
+ category: 'SERVICE',
350
+ agentAction: 'report_to_user',
351
+ retryable: false,
352
+ details: { errors: body['errors'] },
353
+ });
354
+ }
355
+ // Validate edges shape
356
+ const data = body['data'];
357
+ const orders = data?.['orders'];
358
+ const edges = orders?.['edges'];
359
+ if (!Array.isArray(edges)) {
360
+ throw new WorkflowError('ShopifyAdapter: unexpected response shape — edges not an array', {
361
+ code: 'SERVICE_RESPONSE_INVALID',
362
+ category: 'SERVICE',
363
+ agentAction: 'report_to_user',
364
+ retryable: false,
365
+ });
366
+ }
367
+ if (edges.length === 0) {
368
+ throw new WorkflowError('ShopifyAdapter: order not found', {
369
+ code: 'SERVICE_NOT_FOUND',
370
+ category: 'SERVICE',
371
+ agentAction: 'provide_input',
372
+ retryable: false,
373
+ details: { store, order_name: normalizedOrderName },
374
+ });
375
+ }
376
+ if (edges.length > 1) {
377
+ throw new WorkflowError('ShopifyAdapter: unexpected multiple edges for first:1 query', {
378
+ code: 'SERVICE_RESPONSE_INVALID',
379
+ category: 'SERVICE',
380
+ agentAction: 'report_to_user',
381
+ retryable: false,
382
+ });
383
+ }
384
+ const edge = edges[0];
385
+ const normalizedOrder = this.normalizeOrder(edge.node, store, normalizedOrderName);
386
+ return { status: 200, data: normalizedOrder };
387
+ }
388
+ throw new WorkflowError(`ShopifyAdapter: unsupported fetch operation '${operation}'`, {
389
+ code: 'ADAPTER_OP_UNSUPPORTED',
390
+ category: 'ENGINE',
391
+ agentAction: 'report_to_user',
392
+ retryable: false,
393
+ details: { operation },
394
+ });
395
+ }
396
+ async create(operation, _params, _config, _signal) {
397
+ throw new WorkflowError(`ShopifyAdapter: unsupported create operation: ${operation}`, {
398
+ code: 'ADAPTER_OP_UNSUPPORTED',
399
+ category: 'ENGINE',
400
+ agentAction: 'report_to_user',
401
+ retryable: false,
402
+ details: { operation },
403
+ });
404
+ }
405
+ async update(operation, _params, _config, _signal) {
406
+ throw new WorkflowError(`ShopifyAdapter: unsupported update operation: ${operation}`, {
407
+ code: 'ADAPTER_OP_UNSUPPORTED',
408
+ category: 'ENGINE',
409
+ agentAction: 'report_to_user',
410
+ retryable: false,
411
+ details: { operation },
412
+ });
413
+ }
414
+ }
415
+ //# sourceMappingURL=shopify-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shopify-adapter.js","sourceRoot":"","sources":["../../src/adapters/shopify-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ServiceAdapter, ServiceResponse } from '../extensions/service-adapter.js';
2
+ export interface SlackAdapterConfig {
3
+ webhook_url: string;
4
+ }
5
+ /**
6
+ * SlackAdapter posts messages to a Slack channel via Incoming Webhooks.
7
+ * Only the `create` method is supported; `fetch` and `update` throw WorkflowError.
8
+ * Supported operations: 'post_message' — POSTs { text, blocks? } to the webhook URL.
9
+ */
10
+ export declare class SlackAdapter implements ServiceAdapter {
11
+ readonly id: string;
12
+ private readonly config;
13
+ constructor(id: string, config: SlackAdapterConfig);
14
+ fetch(_operation: string, _params: Record<string, unknown>, _config: Record<string, unknown>, _signal?: AbortSignal): Promise<ServiceResponse>;
15
+ create(operation: string, params: Record<string, unknown>, _config: Record<string, unknown>, signal?: AbortSignal): Promise<ServiceResponse>;
16
+ update(_operation: string, _params: Record<string, unknown>, _config: Record<string, unknown>, _signal?: AbortSignal): Promise<ServiceResponse>;
17
+ }
18
+ //# sourceMappingURL=slack-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/slack-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExF,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,qBAAa,YAAa,YAAW,cAAc;aAE/B,EAAE,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADP,EAAE,EAAE,MAAM,EACT,MAAM,EAAE,kBAAkB;IAGvC,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,eAAe,CAAC;IASrB,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,eAAe,CAAC;IAsDrB,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,eAAe,CAAC;CAQ5B"}
@@ -0,0 +1,81 @@
1
+ // SlackAdapter — posts messages to a Slack channel via Incoming Webhooks.
2
+ import { WorkflowError } from '../types/workflow-error.js';
3
+ /**
4
+ * SlackAdapter posts messages to a Slack channel via Incoming Webhooks.
5
+ * Only the `create` method is supported; `fetch` and `update` throw WorkflowError.
6
+ * Supported operations: 'post_message' — POSTs { text, blocks? } to the webhook URL.
7
+ */
8
+ export class SlackAdapter {
9
+ id;
10
+ config;
11
+ constructor(id, config) {
12
+ this.id = id;
13
+ this.config = config;
14
+ }
15
+ async fetch(_operation, _params, _config, _signal) {
16
+ throw new WorkflowError('SlackAdapter does not support fetch', {
17
+ code: 'ADAPTER_OP_UNSUPPORTED',
18
+ category: 'ENGINE',
19
+ agentAction: 'report_to_user',
20
+ retryable: false,
21
+ });
22
+ }
23
+ async create(operation, params, _config, signal) {
24
+ if (operation !== 'post_message') {
25
+ throw new WorkflowError(`SlackAdapter: unsupported operation: ${operation}`, {
26
+ code: 'ADAPTER_OP_UNSUPPORTED',
27
+ category: 'ENGINE',
28
+ agentAction: 'report_to_user',
29
+ retryable: false,
30
+ });
31
+ }
32
+ if (typeof params['text'] !== 'string') {
33
+ throw new WorkflowError('SlackAdapter: text is required for post_message', {
34
+ code: 'ADAPTER_VALIDATION_FAILED',
35
+ category: 'ENGINE',
36
+ agentAction: 'provide_input',
37
+ retryable: false,
38
+ });
39
+ }
40
+ const body = { text: params['text'] };
41
+ if (params['blocks'] !== undefined) {
42
+ body['blocks'] = params['blocks'];
43
+ }
44
+ let response;
45
+ try {
46
+ response = await fetch(this.config.webhook_url, {
47
+ method: 'POST',
48
+ headers: { 'Content-Type': 'application/json' },
49
+ body: JSON.stringify(body),
50
+ signal: signal ?? null,
51
+ });
52
+ }
53
+ catch (err) {
54
+ const message = err instanceof Error ? err.message : String(err);
55
+ throw new WorkflowError(`Slack webhook request failed: ${message}`, {
56
+ code: 'ADAPTER_REQUEST_FAILED',
57
+ category: 'ENGINE',
58
+ agentAction: 'report_to_user',
59
+ retryable: false,
60
+ });
61
+ }
62
+ if (response.status !== 200) {
63
+ throw new WorkflowError(`Slack webhook returned HTTP ${response.status}`, {
64
+ code: 'ADAPTER_REQUEST_FAILED',
65
+ category: 'ENGINE',
66
+ agentAction: 'report_to_user',
67
+ retryable: false,
68
+ });
69
+ }
70
+ return { status: response.status, data: { ok: true } };
71
+ }
72
+ async update(_operation, _params, _config, _signal) {
73
+ throw new WorkflowError('SlackAdapter does not support update', {
74
+ code: 'ADAPTER_OP_UNSUPPORTED',
75
+ category: 'ENGINE',
76
+ agentAction: 'report_to_user',
77
+ retryable: false,
78
+ });
79
+ }
80
+ }
81
+ //# sourceMappingURL=slack-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-adapter.js","sourceRoot":"","sources":["../../src/adapters/slack-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { RateLimiter } from './rate-limiter.js';
2
+ /**
3
+ * Token-bucket rate limiter.
4
+ *
5
+ * Starts full (burst tokens). Refills at one token per intervalMs.
6
+ * `pause()` stops refill and drains tokens; on resume, exactly 1 token is
7
+ * issued immediately and the refill timer restarts.
8
+ */
9
+ export declare class TokenBucketRateLimiter implements RateLimiter {
10
+ private tokens;
11
+ private readonly capacity;
12
+ private readonly intervalMs;
13
+ private refillTimer;
14
+ private resumeTimer;
15
+ private resumeAt;
16
+ private readonly waiters;
17
+ private readonly now;
18
+ constructor(config: {
19
+ requests_per_second: number;
20
+ burst: number;
21
+ }, now?: () => number);
22
+ acquire(signal?: AbortSignal): Promise<void>;
23
+ pause(seconds: number): void;
24
+ private startRefill;
25
+ private serveOneWaiter;
26
+ }
27
+ //# sourceMappingURL=token-bucket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-bucket.d.ts","sourceRoot":"","sources":["../../src/adapters/token-bucket.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOrD;;;;;;GAMG;AACH,qBAAa,sBAAuB,YAAW,WAAW;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,MAAM,EAAE;QAAE,mBAAmB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,CAAC,EAAE,MAAM,MAAM;IAQtF,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C5C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAuB5B,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,cAAc;CAMvB"}