@unifiedcommerce/core 0.1.0 → 0.2.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 (245) hide show
  1. package/dist/auth/setup.d.ts.map +1 -1
  2. package/dist/auth/setup.js +8 -3
  3. package/dist/config/types.d.ts +3 -1
  4. package/dist/config/types.d.ts.map +1 -1
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/interfaces/mcp/server.d.ts +3 -5
  9. package/dist/interfaces/mcp/server.d.ts.map +1 -1
  10. package/dist/interfaces/mcp/server.js +25 -510
  11. package/dist/interfaces/mcp/tool-builder.d.ts +120 -0
  12. package/dist/interfaces/mcp/tool-builder.d.ts.map +1 -0
  13. package/dist/interfaces/mcp/tool-builder.js +224 -0
  14. package/dist/interfaces/mcp/tools/analytics.d.ts +42 -0
  15. package/dist/interfaces/mcp/tools/analytics.d.ts.map +1 -0
  16. package/dist/interfaces/mcp/tools/analytics.js +70 -0
  17. package/dist/interfaces/mcp/tools/cart.d.ts +14 -0
  18. package/dist/interfaces/mcp/tools/cart.d.ts.map +1 -0
  19. package/dist/interfaces/mcp/tools/cart.js +47 -0
  20. package/dist/interfaces/mcp/tools/catalog.d.ts +53 -0
  21. package/dist/interfaces/mcp/tools/catalog.d.ts.map +1 -0
  22. package/dist/interfaces/mcp/tools/catalog.js +284 -0
  23. package/dist/interfaces/mcp/tools/index.d.ts +3 -0
  24. package/dist/interfaces/mcp/tools/index.d.ts.map +1 -0
  25. package/dist/interfaces/mcp/tools/index.js +20 -0
  26. package/dist/interfaces/mcp/tools/inventory.d.ts +27 -0
  27. package/dist/interfaces/mcp/tools/inventory.d.ts.map +1 -0
  28. package/dist/interfaces/mcp/tools/inventory.js +143 -0
  29. package/dist/interfaces/mcp/tools/orders.d.ts +18 -0
  30. package/dist/interfaces/mcp/tools/orders.d.ts.map +1 -0
  31. package/dist/interfaces/mcp/tools/orders.js +82 -0
  32. package/dist/interfaces/mcp/tools/pricing.d.ts +29 -0
  33. package/dist/interfaces/mcp/tools/pricing.d.ts.map +1 -0
  34. package/dist/interfaces/mcp/tools/pricing.js +90 -0
  35. package/dist/interfaces/mcp/tools/promotions.d.ts +44 -0
  36. package/dist/interfaces/mcp/tools/promotions.d.ts.map +1 -0
  37. package/dist/interfaces/mcp/tools/promotions.js +109 -0
  38. package/dist/interfaces/mcp/tools/registry.d.ts +32 -0
  39. package/dist/interfaces/mcp/tools/registry.d.ts.map +1 -0
  40. package/dist/interfaces/mcp/tools/registry.js +55 -0
  41. package/dist/interfaces/mcp/tools/search.d.ts +14 -0
  42. package/dist/interfaces/mcp/tools/search.d.ts.map +1 -0
  43. package/dist/interfaces/mcp/tools/search.js +39 -0
  44. package/dist/interfaces/mcp/tools/webhooks.d.ts +15 -0
  45. package/dist/interfaces/mcp/tools/webhooks.d.ts.map +1 -0
  46. package/dist/interfaces/mcp/tools/webhooks.js +48 -0
  47. package/dist/interfaces/mcp/transport.d.ts +17 -2
  48. package/dist/interfaces/mcp/transport.d.ts.map +1 -1
  49. package/dist/interfaces/mcp/transport.js +91 -44
  50. package/dist/interfaces/rest/router.d.ts.map +1 -1
  51. package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
  52. package/dist/interfaces/rest/routes/checkout.js +1 -1
  53. package/dist/interfaces/rest/routes/promotions.d.ts.map +1 -1
  54. package/dist/interfaces/rest/routes/promotions.js +3 -2
  55. package/dist/kernel/database/adapter.d.ts +8 -0
  56. package/dist/kernel/database/adapter.d.ts.map +1 -1
  57. package/dist/kernel/factory/repository-factory.d.ts.map +1 -1
  58. package/dist/kernel/factory/repository-factory.js +3 -1
  59. package/dist/kernel/local-api.d.ts.map +1 -1
  60. package/dist/kernel/local-api.js +2 -0
  61. package/dist/kernel/plugin/manifest.d.ts +3 -3
  62. package/dist/kernel/plugin/manifest.d.ts.map +1 -1
  63. package/dist/kernel/plugin/manifest.js +36 -7
  64. package/dist/runtime/kernel.d.ts +1 -2
  65. package/dist/runtime/kernel.d.ts.map +1 -1
  66. package/dist/runtime/kernel.js +16 -8
  67. package/dist/runtime/server.d.ts.map +1 -1
  68. package/dist/runtime/server.js +8 -3
  69. package/dist/test-utils/create-pglite-adapter.d.ts.map +1 -1
  70. package/dist/test-utils/create-pglite-adapter.js +7 -6
  71. package/dist/tsconfig.tsbuildinfo +1 -0
  72. package/package.json +2 -2
  73. package/src/adapters/console-email.ts +0 -43
  74. package/src/auth/access.ts +0 -187
  75. package/src/auth/auth-schema.ts +0 -139
  76. package/src/auth/middleware.ts +0 -161
  77. package/src/auth/org.ts +0 -41
  78. package/src/auth/permissions.ts +0 -28
  79. package/src/auth/setup.ts +0 -169
  80. package/src/auth/system-actor.ts +0 -19
  81. package/src/auth/types.ts +0 -10
  82. package/src/config/defaults.ts +0 -82
  83. package/src/config/define-config.ts +0 -53
  84. package/src/config/types.ts +0 -299
  85. package/src/generated/plugin-capabilities.d.ts +0 -20
  86. package/src/generated/plugin-manifest.ts +0 -23
  87. package/src/generated/plugin-repositories.d.ts +0 -20
  88. package/src/hooks/checkout-completion.ts +0 -262
  89. package/src/hooks/checkout.ts +0 -677
  90. package/src/hooks/order-emails.ts +0 -62
  91. package/src/index.ts +0 -214
  92. package/src/interfaces/mcp/agent-prompt.ts +0 -174
  93. package/src/interfaces/mcp/context-enrichment.ts +0 -177
  94. package/src/interfaces/mcp/server.ts +0 -617
  95. package/src/interfaces/mcp/transport.ts +0 -68
  96. package/src/interfaces/rest/customer-portal.ts +0 -299
  97. package/src/interfaces/rest/index.ts +0 -74
  98. package/src/interfaces/rest/router.ts +0 -334
  99. package/src/interfaces/rest/routes/admin-jobs.ts +0 -58
  100. package/src/interfaces/rest/routes/audit.ts +0 -50
  101. package/src/interfaces/rest/routes/carts.ts +0 -89
  102. package/src/interfaces/rest/routes/catalog.ts +0 -493
  103. package/src/interfaces/rest/routes/checkout.ts +0 -283
  104. package/src/interfaces/rest/routes/inventory.ts +0 -70
  105. package/src/interfaces/rest/routes/media.ts +0 -86
  106. package/src/interfaces/rest/routes/orders.ts +0 -78
  107. package/src/interfaces/rest/routes/payments.ts +0 -60
  108. package/src/interfaces/rest/routes/pricing.ts +0 -57
  109. package/src/interfaces/rest/routes/promotions.ts +0 -92
  110. package/src/interfaces/rest/routes/search.ts +0 -71
  111. package/src/interfaces/rest/routes/webhooks.ts +0 -46
  112. package/src/interfaces/rest/schemas/admin-jobs.ts +0 -40
  113. package/src/interfaces/rest/schemas/audit.ts +0 -46
  114. package/src/interfaces/rest/schemas/carts.ts +0 -125
  115. package/src/interfaces/rest/schemas/catalog.ts +0 -450
  116. package/src/interfaces/rest/schemas/checkout.ts +0 -66
  117. package/src/interfaces/rest/schemas/customer-portal.ts +0 -195
  118. package/src/interfaces/rest/schemas/inventory.ts +0 -138
  119. package/src/interfaces/rest/schemas/media.ts +0 -75
  120. package/src/interfaces/rest/schemas/orders.ts +0 -104
  121. package/src/interfaces/rest/schemas/pricing.ts +0 -80
  122. package/src/interfaces/rest/schemas/promotions.ts +0 -110
  123. package/src/interfaces/rest/schemas/responses.ts +0 -85
  124. package/src/interfaces/rest/schemas/search.ts +0 -58
  125. package/src/interfaces/rest/schemas/shared.ts +0 -62
  126. package/src/interfaces/rest/schemas/webhooks.ts +0 -68
  127. package/src/interfaces/rest/utils.ts +0 -104
  128. package/src/interfaces/rest/webhook-router.ts +0 -50
  129. package/src/kernel/compensation/executor.ts +0 -61
  130. package/src/kernel/compensation/types.ts +0 -26
  131. package/src/kernel/database/adapter.ts +0 -13
  132. package/src/kernel/database/drizzle-db.ts +0 -56
  133. package/src/kernel/database/migrate.ts +0 -76
  134. package/src/kernel/database/plugin-types.ts +0 -34
  135. package/src/kernel/database/schema.ts +0 -49
  136. package/src/kernel/database/scoped-db.ts +0 -68
  137. package/src/kernel/database/tx-context.ts +0 -46
  138. package/src/kernel/error-mapper.ts +0 -15
  139. package/src/kernel/errors.ts +0 -89
  140. package/src/kernel/factory/repository-factory.ts +0 -242
  141. package/src/kernel/hooks/create-context.ts +0 -43
  142. package/src/kernel/hooks/executor.ts +0 -88
  143. package/src/kernel/hooks/registry.ts +0 -74
  144. package/src/kernel/hooks/types.ts +0 -52
  145. package/src/kernel/http-error.ts +0 -44
  146. package/src/kernel/jobs/adapter.ts +0 -36
  147. package/src/kernel/jobs/drizzle-adapter.ts +0 -58
  148. package/src/kernel/jobs/runner.ts +0 -153
  149. package/src/kernel/jobs/schema.ts +0 -46
  150. package/src/kernel/jobs/types.ts +0 -30
  151. package/src/kernel/local-api.ts +0 -185
  152. package/src/kernel/plugin/manifest.ts +0 -253
  153. package/src/kernel/query/executor.ts +0 -184
  154. package/src/kernel/query/registry.ts +0 -46
  155. package/src/kernel/result.ts +0 -33
  156. package/src/kernel/schema/extra-columns.ts +0 -37
  157. package/src/kernel/service-registry.ts +0 -76
  158. package/src/kernel/service-timing.ts +0 -89
  159. package/src/kernel/state-machine/machine.ts +0 -101
  160. package/src/modules/analytics/drizzle-adapter.ts +0 -426
  161. package/src/modules/analytics/hooks.ts +0 -11
  162. package/src/modules/analytics/models.ts +0 -125
  163. package/src/modules/analytics/repository/index.ts +0 -6
  164. package/src/modules/analytics/service.ts +0 -245
  165. package/src/modules/analytics/types.ts +0 -180
  166. package/src/modules/audit/hooks.ts +0 -78
  167. package/src/modules/audit/schema.ts +0 -33
  168. package/src/modules/audit/service.ts +0 -151
  169. package/src/modules/cart/access.ts +0 -27
  170. package/src/modules/cart/matcher.ts +0 -26
  171. package/src/modules/cart/repository/index.ts +0 -234
  172. package/src/modules/cart/schema.ts +0 -42
  173. package/src/modules/cart/schemas.ts +0 -38
  174. package/src/modules/cart/service.ts +0 -541
  175. package/src/modules/catalog/repository/index.ts +0 -772
  176. package/src/modules/catalog/schema.ts +0 -203
  177. package/src/modules/catalog/schemas.ts +0 -104
  178. package/src/modules/catalog/service.ts +0 -1544
  179. package/src/modules/customers/repository/index.ts +0 -327
  180. package/src/modules/customers/schema.ts +0 -64
  181. package/src/modules/customers/service.ts +0 -171
  182. package/src/modules/fulfillment/repository/index.ts +0 -426
  183. package/src/modules/fulfillment/schema.ts +0 -101
  184. package/src/modules/fulfillment/service.ts +0 -555
  185. package/src/modules/fulfillment/types.ts +0 -59
  186. package/src/modules/inventory/repository/index.ts +0 -509
  187. package/src/modules/inventory/schema.ts +0 -94
  188. package/src/modules/inventory/schemas.ts +0 -38
  189. package/src/modules/inventory/service.ts +0 -490
  190. package/src/modules/media/adapter.ts +0 -17
  191. package/src/modules/media/repository/index.ts +0 -274
  192. package/src/modules/media/schema.ts +0 -41
  193. package/src/modules/media/service.ts +0 -151
  194. package/src/modules/orders/repository/index.ts +0 -287
  195. package/src/modules/orders/schema.ts +0 -66
  196. package/src/modules/orders/service.ts +0 -619
  197. package/src/modules/orders/stale-order-cleanup.ts +0 -76
  198. package/src/modules/organization/service.ts +0 -191
  199. package/src/modules/payments/adapter.ts +0 -47
  200. package/src/modules/payments/repository/index.ts +0 -6
  201. package/src/modules/payments/service.ts +0 -107
  202. package/src/modules/pricing/repository/index.ts +0 -291
  203. package/src/modules/pricing/schema.ts +0 -71
  204. package/src/modules/pricing/schemas.ts +0 -38
  205. package/src/modules/pricing/service.ts +0 -494
  206. package/src/modules/promotions/repository/index.ts +0 -325
  207. package/src/modules/promotions/schema.ts +0 -62
  208. package/src/modules/promotions/schemas.ts +0 -38
  209. package/src/modules/promotions/service.ts +0 -598
  210. package/src/modules/search/adapter.ts +0 -57
  211. package/src/modules/search/hooks.ts +0 -12
  212. package/src/modules/search/repository/index.ts +0 -6
  213. package/src/modules/search/service.ts +0 -315
  214. package/src/modules/shipping/calculator.ts +0 -188
  215. package/src/modules/shipping/repository/index.ts +0 -6
  216. package/src/modules/shipping/service.ts +0 -51
  217. package/src/modules/tax/adapter.ts +0 -60
  218. package/src/modules/tax/repository/index.ts +0 -6
  219. package/src/modules/tax/service.ts +0 -53
  220. package/src/modules/webhooks/hook.ts +0 -34
  221. package/src/modules/webhooks/repository/index.ts +0 -278
  222. package/src/modules/webhooks/schema.ts +0 -56
  223. package/src/modules/webhooks/service.ts +0 -117
  224. package/src/modules/webhooks/signing.ts +0 -6
  225. package/src/modules/webhooks/ssrf-guard.ts +0 -71
  226. package/src/modules/webhooks/tasks.ts +0 -52
  227. package/src/modules/webhooks/worker.ts +0 -134
  228. package/src/runtime/commerce.ts +0 -145
  229. package/src/runtime/kernel.ts +0 -419
  230. package/src/runtime/logger.ts +0 -36
  231. package/src/runtime/server.ts +0 -349
  232. package/src/runtime/shutdown.ts +0 -43
  233. package/src/test-utils/create-pglite-adapter.ts +0 -129
  234. package/src/test-utils/create-plugin-test-app.ts +0 -128
  235. package/src/test-utils/create-repository-test-harness.ts +0 -16
  236. package/src/test-utils/create-test-config.ts +0 -190
  237. package/src/test-utils/create-test-kernel.ts +0 -7
  238. package/src/test-utils/create-test-plugin-context.ts +0 -75
  239. package/src/test-utils/rest-api-test-utils.ts +0 -265
  240. package/src/test-utils/test-actors.ts +0 -62
  241. package/src/test-utils/typed-hooks.ts +0 -54
  242. package/src/types/commerce-types.ts +0 -34
  243. package/src/utils/id.ts +0 -3
  244. package/src/utils/logger.ts +0 -18
  245. package/src/utils/pagination.ts +0 -22
@@ -1,262 +0,0 @@
1
- import type { Step } from "../kernel/compensation/types.js";
2
- import type { CheckoutData } from "./checkout.js";
3
- import { Ok, Err } from "../kernel/result.js";
4
- import { CommerceValidationError } from "../kernel/errors.js";
5
-
6
- // Service type narrowing — these mirror the actual service interfaces
7
- // without creating circular imports.
8
-
9
- interface InventoryServiceLike {
10
- reserve(input: {
11
- entityId: string;
12
- variantId?: string;
13
- quantity: number;
14
- orderId: string;
15
- performedBy: string;
16
- }): Promise<{ ok: boolean; error?: { message: string } }>;
17
- release(input: {
18
- entityId: string;
19
- variantId?: string;
20
- quantity: number;
21
- orderId: string;
22
- performedBy: string;
23
- }): Promise<unknown>;
24
- }
25
-
26
- interface PaymentsServiceLike {
27
- capture(
28
- paymentIntentId: string,
29
- amount?: number,
30
- ): Promise<{ ok: boolean; error?: { message: string } }>;
31
- refund(
32
- paymentId: string,
33
- amount: number,
34
- reason?: string,
35
- ): Promise<unknown>;
36
- }
37
-
38
- interface OrdersServiceLike {
39
- updateStatus?(
40
- orderId: string,
41
- status: string,
42
- reason?: string,
43
- ): Promise<unknown>;
44
- }
45
-
46
- /**
47
- * Reservation record produced by the reserve-inventory step.
48
- * Passed to compensate() so it knows exactly what to undo.
49
- */
50
- export interface InventoryReservation {
51
- entityId: string;
52
- variantId: string | undefined;
53
- quantity: number;
54
- orderId: string;
55
- }
56
-
57
- /**
58
- * Step 1: Reserve inventory.
59
- *
60
- * Output: the list of reservations created.
61
- * Compensate: release each reservation.
62
- *
63
- * Inventory reservation runs BEFORE payment capture. This is deliberate:
64
- * if stock is unavailable, we should find out before charging the customer.
65
- * The compensation for this step releases the reserved quantities.
66
- */
67
- export const reserveInventoryStep: Step<
68
- CheckoutData,
69
- InventoryReservation[]
70
- > = {
71
- id: "reserve-inventory",
72
-
73
- async run(data, ctx) {
74
- const inventory = ctx.hook.services.inventory as InventoryServiceLike;
75
- const reservations: InventoryReservation[] = [];
76
- const performedBy = ctx.hook.actor?.userId ?? "system";
77
-
78
- for (const item of data.lineItems) {
79
- const result = await inventory.reserve({
80
- entityId: item.entityId,
81
- ...(item.variantId != null ? { variantId: item.variantId } : {}),
82
- quantity: item.quantity,
83
- orderId: data.checkoutId,
84
- performedBy,
85
- });
86
-
87
- if (!result.ok) {
88
- return Err(
89
- new CommerceValidationError(
90
- `Inventory reservation failed for ${item.title ?? item.entityId}: ${result.error?.message ?? "unknown"}`,
91
- ),
92
- );
93
- }
94
-
95
- reservations.push({
96
- entityId: item.entityId,
97
- variantId: item.variantId,
98
- quantity: item.quantity,
99
- orderId: data.checkoutId,
100
- });
101
- }
102
-
103
- return Ok(reservations);
104
- },
105
-
106
- async compensate(reservations, ctx) {
107
- const inventory = ctx.hook.services.inventory as InventoryServiceLike;
108
- const performedBy = ctx.hook.actor?.userId ?? "system";
109
-
110
- for (const r of reservations) {
111
- await inventory.release({
112
- entityId: r.entityId,
113
- ...(r.variantId != null ? { variantId: r.variantId } : {}),
114
- quantity: r.quantity,
115
- orderId: r.orderId,
116
- performedBy,
117
- });
118
- }
119
- },
120
- };
121
-
122
- /**
123
- * Step 2: Capture payment.
124
- *
125
- * Output: the captured payment intent ID and amount.
126
- * Compensate: issue a full refund via the payments service.
127
- *
128
- * Runs AFTER inventory reservation. If capture fails, inventory reservations
129
- * are released by the compensation chain. If capture succeeds but a later step
130
- * fails, a refund is issued.
131
- */
132
- export const capturePaymentStep: Step<
133
- CheckoutData,
134
- { paymentIntentId: string; amount: number }
135
- > = {
136
- id: "capture-payment",
137
-
138
- async run(data, ctx) {
139
- if (!data.paymentIntentId) {
140
- return Err(
141
- new CommerceValidationError(
142
- "No authorized payment intent to capture.",
143
- ),
144
- );
145
- }
146
-
147
- const payments = ctx.hook.services.payments as PaymentsServiceLike;
148
- const result = await payments.capture(data.paymentIntentId);
149
-
150
- if (!result.ok) {
151
- return Err(
152
- new CommerceValidationError(
153
- `Payment capture failed: ${result.error?.message ?? "unknown"}`,
154
- ),
155
- );
156
- }
157
-
158
- return Ok({ paymentIntentId: data.paymentIntentId, amount: data.total });
159
- },
160
-
161
- async compensate({ paymentIntentId, amount }, ctx) {
162
- const payments = ctx.hook.services.payments as PaymentsServiceLike;
163
- await payments.refund(
164
- paymentIntentId,
165
- amount,
166
- "Checkout compensation: downstream step failed after payment capture",
167
- );
168
- },
169
- };
170
-
171
- /**
172
- * Step 3: Initiate fulfillment.
173
- *
174
- * Output: the order ID (for logging).
175
- * No compensate: fulfillment initiation is best-effort and idempotent.
176
- * A failed fulfillment should be retried through the job queue, not
177
- * compensated by rolling back the entire checkout.
178
- */
179
- export const initiateFulfillmentStep: Step<
180
- CheckoutData,
181
- { orderId: string }
182
- > = {
183
- id: "initiate-fulfillment",
184
-
185
- async run(data, ctx) {
186
- const fulfillment = ctx.hook.services.fulfillment as {
187
- fulfillOrder(orderId: string, actor?: unknown): Promise<unknown>;
188
- };
189
-
190
- try {
191
- await fulfillment.fulfillOrder(data.checkoutId, ctx.hook.actor);
192
- } catch (error) {
193
- // Fulfillment initiation failure should not fail the checkout.
194
- // The order is paid and inventory is reserved — fulfillment can be retried.
195
- ctx.hook.logger.warn(
196
- `Fulfillment initiation failed for order ${data.checkoutId}. Will need manual retry.`,
197
- { error },
198
- );
199
- }
200
-
201
- return Ok({ orderId: data.checkoutId });
202
- },
203
-
204
- // No compensate — fulfillment is best-effort at this stage
205
- };
206
-
207
- /**
208
- * Step 4: Send confirmation email.
209
- *
210
- * Output: void (best-effort).
211
- * No compensate: you cannot unsend an email.
212
- */
213
- export const sendConfirmationStep: Step<
214
- CheckoutData,
215
- { sent: boolean }
216
- > = {
217
- id: "send-confirmation",
218
-
219
- async run(data, ctx) {
220
- const customers = ctx.hook.services.customers as {
221
- getByUserId(
222
- userId: string,
223
- actor?: unknown,
224
- ): Promise<{ ok: boolean; value?: { email?: string } }>;
225
- };
226
- const email = ctx.hook.services.email as
227
- | {
228
- send(input: {
229
- template: string;
230
- to: string;
231
- data?: Record<string, unknown>;
232
- }): Promise<void>;
233
- }
234
- | undefined;
235
-
236
- if (!data.customerId || !email?.send) {
237
- return Ok({ sent: false });
238
- }
239
-
240
- try {
241
- const customer = await customers.getByUserId(data.customerId, ctx.hook.actor);
242
- if (customer.ok && customer.value?.email) {
243
- await email.send({
244
- template: "order-confirmation",
245
- to: customer.value.email,
246
- data: { orderId: data.checkoutId, total: data.total, currency: data.currency },
247
- });
248
- return Ok({ sent: true });
249
- }
250
- } catch (error) {
251
- // Email failure should not fail checkout
252
- ctx.hook.logger.warn(
253
- `Confirmation email failed for order ${data.checkoutId}.`,
254
- { error },
255
- );
256
- }
257
-
258
- return Ok({ sent: false });
259
- },
260
-
261
- // No compensate — cannot unsend an email
262
- };