@curless/sinocare-demo 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # @curless/sinocare-demo
2
+
3
+ A demo "Sinocare" storefront MCP server. Browses Sinocare resorts worldwide
4
+ (Alps & Japan ski; Mediterranean, Indian Ocean, Caribbean & Americas sun) and
5
+ books them through [agentbank](https://gitlab.com/robin-ruan/agentbank)
6
+ acquiring (ACP). For demos/testing only.
7
+
8
+ ## Use (Claude Desktop / any MCP client)
9
+
10
+ ```json
11
+ {
12
+ "mcpServers": {
13
+ "sinocare": {
14
+ "command": "npx",
15
+ "args": ["-y", "@curless/sinocare-demo"],
16
+ "env": {
17
+ "AGENTBANK_AGENT_TOKEN": "agb_test_..."
18
+ }
19
+ }
20
+ }
21
+ }
22
+ ```
23
+
24
+ `AGENTBANK_AGENT_TOKEN` is an agentbank agent key (`agb_...`) with `agent:execute`.
25
+ The server talks to `https://mcp.curless.ai` by default — no need to configure it.
26
+
27
+ ## Tools
28
+
29
+ - `list_sinocare_products` — browse resorts worldwide (Alps & Japan ski;
30
+ Mediterranean, Indian Ocean, Caribbean & Americas sun — filter by country /
31
+ ski|sun); shows the per-person/week price.
32
+ - `get_sinocare_product` — one resort by sku.
33
+ - `buy_sinocare_product_acp` — book over **ACP** (Agentic Commerce Protocol):
34
+ the merchant backend (`mcp.curless.ai/sinocare`) opens a merchant-quoted
35
+ checkout session, then this buyer agent completes it with its own card token —
36
+ a real charge on the configured rail. The buyer never touches the merchant's
37
+ keys.
38
+ - `buy_sinocare_product_ucp` — book over **UCP** (Universal Commerce Protocol):
39
+ same card settlement, but the merchant returns a signed AP2 CartMandate and the
40
+ buyer completes with an AP2 PaymentMandate bound to it (programmatic, no human
41
+ handoff).
42
+ - `buy_sinocare_product_x402` — book over **x402**: the merchant prices it in
43
+ USDC; the buyer signs an EIP-3009 authorization and pays on-chain.
44
+ - `list_my_orders` — your bookings + their status.
45
+ - `request_refund` — open a refund request on one of your orders (Sinocare then
46
+ approves/rejects).
47
+ - `authorize_agent_budget` / `agent_budget_status` / `revoke_agent_budget` —
48
+ AP2 delegated buying: sign a standing IntentMandate (a per-booking spend cap +
49
+ time window) once, and `buy_sinocare_product_ucp` completes within it without a
50
+ per-booking confirm; over-cap is rejected by the gateway. (UCP path only.)
51
+ - `x402_buyer_wallet` — show the wallet that pays x402 (USDC) bookings + its
52
+ balance, and where to top it up.
53
+
54
+ Optional env:
55
+ - `AGENTBANK_API_URL` — override the gateway base URL (default
56
+ `https://mcp.curless.ai`); set to `http://localhost:3000` for local dev.
57
+ - `AGENTBANK_PAYMENT_TOKEN` — the card token the buyer pays with (default
58
+ `pm_card_visa`, the Stripe sandbox test card).
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=checkout-card.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout-card.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/checkout-card.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,315 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { describe, expect, test } from 'vitest';
4
+ // The card runs inside an MCP Apps host and cannot be exercised without one —
5
+ // it will not even boot standalone (`bridge connect 失败`). These read its
6
+ // source instead, because both rules below broke in ways only a person looking
7
+ // at the screen could catch.
8
+ const CARD = readFileSync(join(import.meta.dirname, '..', '..', 'widget', 'src', 'checkout.ts'), 'utf8');
9
+ describe('the checkout card', () => {
10
+ test('a tool result for a DIFFERENT resort replaces what is on screen', () => {
11
+ // The host reuses ONE widget instance for the conversation, so the second
12
+ // checkout arrives at a card that has already rendered. A blanket one-shot
13
+ // guard dropped it silently: the previous resort's receipt stayed up while
14
+ // the agent talked about a new one, which reads as the wrong hotel being
15
+ // booked.
16
+ expect(CARD).toMatch(/app\.ontoolresult\s*=\s*\(params: Any\) =>\s*render\([^)]*,\s*true\)/);
17
+ expect(CARD).toContain('renderedSku');
18
+ });
19
+ test('a NEW resort arriving via ontoolinput re-renders, even after this card has rendered', () => {
20
+ // The host reuses ONE widget instance for the conversation, and
21
+ // `ontoolresult` only arrives for the FIRST call. On the second checkout
22
+ // `ontoolinput` is the only signal that anything happened — guarded solely
23
+ // by `rendered`, it was dropped, and the card kept showing the previous
24
+ // resort's BOOKED receipt while the agent talked about a new one.
25
+ expect(CARD).toContain('namesAnotherResort');
26
+ const handler = CARD.slice(CARD.indexOf('app.ontoolinput'), CARD.indexOf('app.onhostcontextchanged'));
27
+ expect(handler).toMatch(/namesAnotherResort\(args\)/);
28
+ // …and it must re-fill WITHOUT claiming rehydrate, or a resort booked
29
+ // earlier comes back as that old receipt instead of the payment picker.
30
+ expect(handler).toMatch(/fill\(args, false\)/);
31
+ });
32
+ test('only a self-heal claims __rehydrate', () => {
33
+ const fill = CARD.slice(CARD.indexOf('const fill ='), CARD.indexOf('const fill =') + 900);
34
+ expect(fill).toMatch(/selfHeal \? \{ __rehydrate: 1 \} : \{\}/);
35
+ });
36
+ test('a self-heal asks for THIS card’s resort, not whatever was last', () => {
37
+ // The server's last-checkout is global to the process, so a no-argument
38
+ // fill drifts to whichever resort another card opened most recently.
39
+ expect(CARD).toMatch(/fill\(myArgs \?\? \{\}\)/);
40
+ });
41
+ test('the self-heal path does NOT force — a late replay must not wipe a receipt', () => {
42
+ // fill() re-invokes the instantiating tool to fill an empty card. Forcing
43
+ // there would let a stale replay overwrite a booking just paid for.
44
+ const start = CARD.indexOf('const fill =');
45
+ expect(start).toBeGreaterThan(-1);
46
+ const fill = CARD.slice(start, start + 1400);
47
+ expect(fill).toMatch(/render\(sc\)/);
48
+ expect(fill).not.toMatch(/render\(sc,\s*true\)/);
49
+ });
50
+ });
51
+ describe('checkout state across restarts', () => {
52
+ const SRC = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
53
+ test('lastCheckout is NOT restored from disk', () => {
54
+ // It exists for one case: a card self-healing with NO arguments, where the
55
+ // server replays the last pick so the widget fills instead of hanging.
56
+ // Restored from disk it does that to a card belonging to a DIFFERENT
57
+ // resort — restart the app, ask for a new hotel, and the card renders the
58
+ // previous booking's receipt, which reads as having booked something you
59
+ // did not.
60
+ expect(SRC).not.toMatch(/lastCheckout\s*=\s*saved\.lastCheckout/);
61
+ });
62
+ test('bookings ARE restored — they are keyed by sku, so they cannot land on the wrong card', () => {
63
+ expect(SRC).toMatch(/for \(const \[k, v\] of saved\.bookings \?\? \[\]\) completedBookings\.set/);
64
+ });
65
+ });
66
+ describe('paying from the wallet', () => {
67
+ const SRC = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
68
+ test('records the WALLET owner as the buyer, not SINOCARE_BUYER_EMAIL', () => {
69
+ // "我的订单" is joined on the email the order was placed with. Filed under
70
+ // the env's buyer, a wallet-paid order never appears in that wallet.
71
+ expect(SRC).toContain('walletBuyer()');
72
+ expect(SRC).toMatch(/walletBuyer\(\)\s*\?\?\s*\(BUYER \? \{ buyer: BUYER \} : \{\}\)/);
73
+ });
74
+ });
75
+ // Every tool that can finish a payment must record the booking through
76
+ // finishBooking. That is what writes the receipt, flips lastCheckout.booked and
77
+ // persists state — and therefore what makes the card rehydrate to a receipt
78
+ // instead of the payment picker.
79
+ //
80
+ // Three payment paths were added and none of them called it. The card had no
81
+ // idea the holiday had been bought, so it came back as a picker and the same
82
+ // week was paid for three times. A tool that takes money and returns a plain
83
+ // object is indistinguishable from one that works, right up until you look at
84
+ // the orders list.
85
+ describe('every paying tool records the booking', () => {
86
+ const SRC = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
87
+ /** The body of one `if (req.params.name === 'x') { … }` branch. */
88
+ const branchOf = (tool) => {
89
+ const head = `if (req.params.name === '${tool}')`;
90
+ const start = SRC.indexOf(head);
91
+ expect(start, `${tool} has no dispatch branch`).toBeGreaterThan(-1);
92
+ let depth = 0;
93
+ let i = SRC.indexOf('{', start);
94
+ const from = i;
95
+ for (; i < SRC.length; i++) {
96
+ if (SRC[i] === '{')
97
+ depth++;
98
+ else if (SRC[i] === '}' && --depth === 0)
99
+ break;
100
+ }
101
+ return SRC.slice(from, i);
102
+ };
103
+ test.each([
104
+ // Completes an ACP checkout with a credential minted elsewhere.
105
+ 'pay_sinocare_with_token',
106
+ // The hosted approval happens in a browser, so this is the ONLY moment the
107
+ // demo learns the money moved. Miss it here and it is never recorded.
108
+ 'get_sinocare_order_status',
109
+ ])('%s goes through finishBooking', (tool) => {
110
+ expect(branchOf(tool)).toContain('finishBooking(');
111
+ });
112
+ test('what a checkout was for is read off the checkout, not remembered', () => {
113
+ // finishBooking needs a sku, and by the time payment is confirmed all these
114
+ // paths hold is a session id. Keeping the answer in this process fails in
115
+ // the two cases that matter — a later process confirms it, or the person
116
+ // approves in a browser and comes back after a restart — and then the
117
+ // receipt they just saw turns back into a payment picker.
118
+ for (const tool of ['pay_sinocare_with_token', 'get_sinocare_order_status']) {
119
+ expect(branchOf(tool), `${tool} does not read the session`).toContain('purchaseOf(');
120
+ }
121
+ const SRC_ALL = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
122
+ expect(SRC_ALL, 'an in-memory session map came back').not.toContain('openSessions');
123
+ });
124
+ });
125
+ // A receipt has to say what PAID, and the wallet paths have to refuse rather
126
+ // than let the booking settle some other way.
127
+ //
128
+ // Both were learned the same afternoon: four real charges appeared in the
129
+ // orders list attributed to the Curless wallet, on a wallet that had never
130
+ // been signed in. The person clicked "wallet", the wallet could not pay, the
131
+ // booking went through on the agent's credential, and the card labelled the
132
+ // receipt with the button rather than the fact.
133
+ describe('a receipt names the method that actually paid', () => {
134
+ const SRC = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
135
+ const CARD = readFileSync(join(import.meta.dirname, '..', '..', 'widget', 'src', 'checkout.ts'), 'utf8');
136
+ test('finishBooking requires a payer, so a new path cannot omit one', () => {
137
+ expect(SRC).toMatch(/payer: string;/);
138
+ });
139
+ test('the card renders the server’s payer, not the clicked action', () => {
140
+ expect(CARD).toContain('data.payer');
141
+ // The old line built the receipt from `action.display` — the button.
142
+ expect(CARD).not.toMatch(/已通过 \$\{action\?\.display/);
143
+ });
144
+ test('the wallet handoff tells the model not to substitute another method', () => {
145
+ const tool = SRC.slice(SRC.indexOf("name: 'start_sinocare_wallet_handoff'"));
146
+ const desc = tool.slice(0, tool.indexOf('inputSchema'));
147
+ expect(desc).toMatch(/do not book this another way/i);
148
+ });
149
+ });
150
+ // Whether the card shows a receipt or the payment picker is decided by THIS
151
+ // checkout, not by whether the resort has ever been bought.
152
+ //
153
+ // It used to be answered by looking the sku up in the saved bookings. A demo
154
+ // account that has booked 42 of 44 resorts therefore saw an already-paid
155
+ // receipt the moment almost any card self-healed — before clicking anything —
156
+ // and the payment options were hidden behind an order from days earlier.
157
+ describe('a receipt belongs to a checkout, not to a resort', () => {
158
+ const SRC = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
159
+ const decision = (() => {
160
+ const at = SRC.indexOf('const rehydratedReceipt =');
161
+ return SRC.slice(at, SRC.indexOf(';', at));
162
+ })();
163
+ test('the receipt is only shown for the checkout that was actually paid', () => {
164
+ // Same resort AND the pick we had open AND that pick was paid — all three,
165
+ // or it is a new order and the person gets to choose how to pay for it.
166
+ expect(decision).toContain('lastCheckout?.sku === resort.sku');
167
+ expect(decision).toContain('lastCheckout.booked');
168
+ });
169
+ test('a bare sku lookup can no longer decide it', () => {
170
+ // `completedBookings.get(sku)` still supplies the receipt's CONTENTS, but
171
+ // must never be what decides that there is one.
172
+ expect(decision).not.toMatch(/rehydrate\s*(&&\s*!?\w+\s*)?\?\s*completedBookings\.get/);
173
+ });
174
+ test('opening a checkout clears the paid flag, so booking again shows the picker', () => {
175
+ const open = SRC.slice(SRC.indexOf('lastCheckout = {', SRC.indexOf('const rehydratedReceipt =')));
176
+ expect(open.slice(0, open.indexOf('};'))).toContain('booked: rehydratedReceipt ? true : undefined');
177
+ });
178
+ });
179
+ // The host caches the card's HTML by its ui:// URI. Ship new widget code under
180
+ // the old URI and every existing conversation keeps rendering the previous
181
+ // build — the server returns corrected data and the old JS draws the old
182
+ // picture, which is indistinguishable from "the fix did not work".
183
+ //
184
+ // That happened three times in one day. The generated card and the URI are
185
+ // both committed, so the two can be compared: if the built HTML changes, the
186
+ // version in the URI has to change with it.
187
+ describe('the card URI moves when the card does', () => {
188
+ test('the URI carries a version that can be bumped', () => {
189
+ const src = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
190
+ const uri = src.match(/const CHECKOUT_URI = '([^']+)'/)?.[1];
191
+ expect(uri, 'CHECKOUT_URI missing').toBeTruthy();
192
+ expect(uri, 'CHECKOUT_URI needs a -vN version to bump').toMatch(/-v\d+\.html$/);
193
+ });
194
+ test('it is not the version the last released card shipped under', () => {
195
+ // A crude but honest tripwire: v17 is the URI three un-bumped widget
196
+ // changes went out under. Reaching for it again means the bump was missed.
197
+ const src = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
198
+ expect(src).not.toContain('ui://sinocare/card-v17.html');
199
+ });
200
+ });
201
+ // On a screen about money, a result that says nothing must never render as a
202
+ // completed purchase.
203
+ //
204
+ // The card's failure check read "no `booked` and no `status` → success". The
205
+ // tools that merely OPEN a checkout return neither, so clicking one drew a
206
+ // 已预订 receipt while the order sat at pending_payment — four of them, in the
207
+ // orders list, all unpaid, every one reported to the person as booked.
208
+ describe('opening a checkout is not paying for one', () => {
209
+ const SRC = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
210
+ const CARD = readFileSync(join(import.meta.dirname, '..', '..', 'widget', 'src', 'checkout.ts'), 'utf8');
211
+ test.each(['start_sinocare_wallet_handoff', 'pay_sinocare_hosted'])('%s says plainly that nothing was paid', (tool) => {
212
+ const head = SRC.indexOf(`if (req.params.name === '${tool}')`);
213
+ const branch = SRC.slice(head, SRC.indexOf('\n }\n', head));
214
+ expect(branch).toContain('booked: false');
215
+ expect(branch).toContain('awaitingPayment: true');
216
+ });
217
+ test('the card has somewhere to put "opened, not paid" that is not a receipt', () => {
218
+ expect(CARD).toContain('data.awaitingPayment');
219
+ expect(CARD).toContain('还差一步');
220
+ });
221
+ test('a result with no booked and no status is NOT treated as settled', () => {
222
+ // The old form was `Boolean(data.status && data.status !== 'captured' …)`,
223
+ // which is false when status is absent — i.e. success by default.
224
+ // Two `const failed` exist; the one under test is the result check, which
225
+ // is the only one that reads res?.isError.
226
+ const at = CARD.indexOf('const failed =\n res?.isError');
227
+ expect(at, 'result-check `failed` not found').toBeGreaterThan(-1);
228
+ const expr = CARD.slice(at, CARD.indexOf(';', at));
229
+ expect(expr).not.toMatch(/Boolean\(data\.status &&/);
230
+ expect(expr).toContain("data.status !== 'captured'");
231
+ });
232
+ });
233
+ // The three payment shapes end in three different places, and the card has to
234
+ // be honest about which is which.
235
+ describe('each payment method ends where it actually can', () => {
236
+ const SRC = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
237
+ const CARD = readFileSync(join(import.meta.dirname, '..', '..', 'widget', 'src', 'checkout.ts'), 'utf8');
238
+ test('the separate-connector row hands off to the conversation', () => {
239
+ // A widget can only call tools on the server that gave it — callServerTool
240
+ // takes a name and no server — so the credential in another connector is
241
+ // out of reach. It used to render a dead "还差一步" with nothing to press.
242
+ expect(CARD).toContain('chat: true');
243
+ expect(CARD).toContain('handOffToChat');
244
+ });
245
+ test('the handoff puts machine data in context, not in the conversation', () => {
246
+ // The session id, the merchant and the exact next calls belong in the
247
+ // model's context. Written into the message instead, the person appears to
248
+ // have typed a line of tool syntax at themselves.
249
+ const at = CARD.indexOf('const handOffToChat');
250
+ const fn = CARD.slice(at, CARD.indexOf('const bookInCard', at));
251
+ expect(fn).toContain('updateModelContext');
252
+ expect(fn).toMatch(/sessionId: \$\{d\.sessionId\}/);
253
+ // When context IS delivered, the chat message is one human sentence.
254
+ expect(fn).toContain("contextDelivered ? '用我的 Curless 钱包连接器付这笔'");
255
+ });
256
+ test('a host without updateModelContext still gets the details', () => {
257
+ // It is an OPTIONAL capability of the MCP Apps extension — ChatGPT's app
258
+ // surface is a different API entirely. Calling it blind and swallowing the
259
+ // rejection would send the trigger sentence with no session id attached,
260
+ // and the model would have nothing to act on: a handoff that hands nothing
261
+ // over, looking exactly like one that did nothing at all.
262
+ const at = CARD.indexOf('const handOffToChat');
263
+ const fn = CARD.slice(at, CARD.indexOf('const bookInCard', at));
264
+ expect(fn).toContain('getHostCapabilities()?.updateModelContext');
265
+ expect(fn).toContain('contextDelivered');
266
+ // The fallback puts the same brief in the message rather than dropping it.
267
+ expect(fn).toMatch(/contextDelivered \?[^:]+: brief/);
268
+ });
269
+ test('the handoff opens the checkout itself rather than asking the model to', () => {
270
+ // start_sinocare_wallet_handoff is THIS server's tool, so the card can call
271
+ // it; only the credential is out of reach.
272
+ const at = CARD.indexOf('const handOffToChat');
273
+ const fn = CARD.slice(at, CARD.indexOf('const bookInCard', at));
274
+ expect(fn).toContain('callServerTool');
275
+ });
276
+ test('the hosted row waits for the browser instead of stopping at 去付款', () => {
277
+ // get_sinocare_order_status belongs to THIS server, which is exactly why the
278
+ // hosted flow can finish in the card and the connector one cannot.
279
+ expect(CARD).toContain('pollHostedPayment');
280
+ expect(CARD).toContain("name: 'get_sinocare_order_status'");
281
+ // The tool has to return what the poll needs to ask with.
282
+ const head = SRC.indexOf("if (req.params.name === 'pay_sinocare_hosted')");
283
+ const branch = SRC.slice(head, SRC.indexOf('\n }\n', head));
284
+ expect(branch).toContain('sessionId:');
285
+ expect(branch).toContain('merchantId:');
286
+ });
287
+ // The `next` round-trip (and its open-redirect guard) used to be asserted
288
+ // here by READING apps/api's source and matching the text of the check. That
289
+ // is a test of a string, not of a behaviour: it broke the moment the guard
290
+ // was moved into a shared helper — while the guard itself still worked — and
291
+ // it would have stayed green had someone kept the line and inverted it.
292
+ // It now lives in apps/api's own suite, where it can be exercised:
293
+ // `next` returns you to the payment, and only to a same-host one.
294
+ });
295
+ // Two tools both called "wallet login" reported different things at the same
296
+ // moment, and the model — correctly — called it a contradiction. Neither was
297
+ // wrong: they hold different sessions. Nothing said so.
298
+ describe('the storefront’s wallet session is not the connector’s', () => {
299
+ const SRC = readFileSync(join(import.meta.dirname, '..', 'index.ts'), 'utf8');
300
+ test('the status tool says WHOSE session it is reporting', () => {
301
+ const head = SRC.indexOf("if (req.params.name === 'curless_wallet_login_status')");
302
+ const branch = SRC.slice(head, SRC.indexOf('\n }\n', head));
303
+ expect(branch).toContain("wallet: 'storefront'");
304
+ expect(branch).toMatch(/separately-installed/i);
305
+ });
306
+ test('"nobody started one" is not reported as "expired"', () => {
307
+ // `expired: !pending` was true both before anyone began and after a timeout,
308
+ // so a person who had never been given a code was told theirs had run out.
309
+ const head = SRC.indexOf("if (req.params.name === 'curless_wallet_login_status')");
310
+ const branch = SRC.slice(head, SRC.indexOf('\n }\n', head));
311
+ expect(branch).toContain('neverStarted');
312
+ expect(branch).toContain('expired: !pending && loginEverStarted');
313
+ });
314
+ });
315
+ //# sourceMappingURL=checkout-card.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout-card.test.js","sourceRoot":"","sources":["../../src/__tests__/checkout-card.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const CHECKOUT_CARD_HTML: string;
2
+ //# sourceMappingURL=checkout-card.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout-card.generated.d.ts","sourceRoot":"","sources":["../src/checkout-card.generated.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,EAAE,MAGf,CAAC"}