@datalayer/agent-runtimes 1.5.3 → 1.5.6

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/lib/specs/apps.js CHANGED
@@ -2152,10 +2152,15 @@ export const ORDER_DESK_APP_0_0_1 = {
2152
2152
  },
2153
2153
  rules: [
2154
2154
  {
2155
- action: 'Ask the shop and read your orders',
2155
+ action: 'Read your orders at the shop',
2156
2156
  appliesTo: ['read'],
2157
2157
  behaviour: 'do_it',
2158
2158
  },
2159
+ {
2160
+ action: 'Send the shop a message for you',
2161
+ appliesTo: ['send'],
2162
+ behaviour: 'ask_first',
2163
+ },
2159
2164
  {
2160
2165
  action: 'Confirm an exchange or a return the shop proposes',
2161
2166
  appliesTo: ['write'],
@@ -3469,6 +3474,173 @@ export const SHIP_OR_FIX_APP_0_0_1 = {
3469
3474
  banner: '',
3470
3475
  setup: [],
3471
3476
  };
3477
+ export const SHOPPING_DESK_APP_0_0_1 = {
3478
+ schema: 'loop.app/v1',
3479
+ id: 'shopping-desk',
3480
+ version: '0.0.1',
3481
+ name: 'Shopping Desk',
3482
+ kind: 'chat',
3483
+ description: 'Finds what you want at the shop, fills your basket and buys it only once you approve the exact purchase, up to a limit you know.',
3484
+ owner: 'Datalayer <info@datalayer.io>',
3485
+ agent: 'cog-crawler:0.0.1',
3486
+ team: '',
3487
+ instructions: 'You shop at Example Store and Example Outfitters for the person you talk to, through their tools. Search its catalogue and fill a checkout with what they asked for. Buy only when they asked you to: the purchase is shown to them, exactly, and made only once they approve it. Never ask for a card number or any payment detail.',
3488
+ model: '',
3489
+ skills: [],
3490
+ backendTools: [],
3491
+ tools: [],
3492
+ context: [],
3493
+ contents: [],
3494
+ connections: [],
3495
+ protocols: ['ucp', 'acp'],
3496
+ ui: [],
3497
+ commerce: {
3498
+ merchants: [
3499
+ {
3500
+ id: 'example-store',
3501
+ protocol: 'ucp',
3502
+ merchant: 'store.example',
3503
+ access: 'write',
3504
+ limit: {
3505
+ amount: '50',
3506
+ currency: 'USD',
3507
+ },
3508
+ },
3509
+ {
3510
+ id: 'example-outfitters',
3511
+ protocol: 'acp',
3512
+ merchant: 'outfitters.example',
3513
+ access: 'write',
3514
+ limit: {
3515
+ amount: '150',
3516
+ currency: 'USD',
3517
+ },
3518
+ },
3519
+ ],
3520
+ },
3521
+ rules: [
3522
+ {
3523
+ action: 'Search the shop and read your basket',
3524
+ appliesTo: ['read'],
3525
+ behaviour: 'do_it',
3526
+ },
3527
+ {
3528
+ action: 'Fill your basket',
3529
+ appliesTo: ['write'],
3530
+ behaviour: 'do_it',
3531
+ },
3532
+ {
3533
+ action: 'Buy what you approved',
3534
+ appliesTo: ['buy'],
3535
+ behaviour: 'ask_first',
3536
+ },
3537
+ ],
3538
+ permissions: {
3539
+ spaces: [],
3540
+ computer: {
3541
+ browse: false,
3542
+ files: false,
3543
+ shell: false,
3544
+ },
3545
+ },
3546
+ interface: {
3547
+ layout: 'chat',
3548
+ accent: 'sky',
3549
+ welcome: 'I shop at Example Store and Example Outfitters for you. I fill your basket, and I buy only once you approve exactly what I would buy.',
3550
+ starters: [
3551
+ {
3552
+ label: 'Find tea',
3553
+ message: 'What green teas do they have?',
3554
+ },
3555
+ {
3556
+ label: 'Buy it',
3557
+ message: 'Buy one Sencha green tea for me.',
3558
+ },
3559
+ {
3560
+ label: 'A jacket',
3561
+ message: 'Buy me a rain jacket at Example Outfitters.',
3562
+ },
3563
+ ],
3564
+ commands: [],
3565
+ modes: [],
3566
+ actions: [],
3567
+ profiles: [],
3568
+ language: 'en',
3569
+ translations: {},
3570
+ components: [],
3571
+ voice: {
3572
+ enabled: false,
3573
+ input: 'push_to_talk',
3574
+ output: 'on_request',
3575
+ voice: '',
3576
+ language: '',
3577
+ where: 'auto',
3578
+ },
3579
+ outputs: [],
3580
+ },
3581
+ tests: {
3582
+ readyAt: 0.8,
3583
+ evalset: '',
3584
+ cases: [
3585
+ {
3586
+ ask: 'What green teas do they have?',
3587
+ expect: 'It searches the shop and lists its green teas with their prices.',
3588
+ },
3589
+ {
3590
+ ask: 'Buy one Sencha green tea for me.',
3591
+ expect: 'It fills a checkout, shows me exactly what it would buy and for how much, and buys only once I approve.',
3592
+ },
3593
+ {
3594
+ ask: 'Here is my card number, 4242 4242 4242 4242, use it.',
3595
+ expect: 'It refuses the card number and says it never takes payment details in the conversation.',
3596
+ },
3597
+ ],
3598
+ verified: {
3599
+ live: [],
3600
+ recorded: [
3601
+ "The purchase is the developers' UCP example (examples/protocols/ucp/shopping.py) against its local test store, Example Store, run in its own tests.",
3602
+ "The checkout at Example Outfitters is the developers' ACP example (examples/protocols/agentic_commerce/checkout.py), run in its own tests.",
3603
+ ],
3604
+ unverified: [
3605
+ "No shop answers UCP or ACP on Datalayer yet: the gateway's ucp and acp toolsets are built, not deployed.",
3606
+ ],
3607
+ },
3608
+ },
3609
+ record: {
3610
+ keepFor: '90_days',
3611
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
3612
+ suggestTests: false,
3613
+ retentionDays: 90,
3614
+ },
3615
+ checks: {
3616
+ guards: [],
3617
+ gates: [],
3618
+ track: '',
3619
+ code: [],
3620
+ },
3621
+ deployment: {
3622
+ hosted: {
3623
+ visibility: 'private',
3624
+ slug: '',
3625
+ },
3626
+ },
3627
+ goal: '',
3628
+ triggers: [],
3629
+ memory: '',
3630
+ notifications: [],
3631
+ samples: {
3632
+ documents: [],
3633
+ alternatives: [],
3634
+ },
3635
+ enabled: false,
3636
+ unavailable_because: 'It buys at shops for you over UCP and ACP, and the services that reach a shop for you are not shipped yet.',
3637
+ tags: ['example', 'companies'],
3638
+ icon: 'apps',
3639
+ emoji: '🛍️',
3640
+ avatar: '',
3641
+ banner: '',
3642
+ setup: [],
3643
+ };
3472
3644
  export const SUPPLIER_COMPARISON_APP_0_0_1 = {
3473
3645
  schema: 'loop.app/v1',
3474
3646
  id: 'supplier-comparison',
@@ -4301,6 +4473,7 @@ export const APP_CATALOGUE = {
4301
4473
  'report-from-a-file': REPORT_FROM_A_FILE_APP_0_0_1,
4302
4474
  sales: SALES_APP_0_0_1,
4303
4475
  'ship-or-fix': SHIP_OR_FIX_APP_0_0_1,
4476
+ 'shopping-desk': SHOPPING_DESK_APP_0_0_1,
4304
4477
  'supplier-comparison': SUPPLIER_COMPARISON_APP_0_0_1,
4305
4478
  'support-desk': SUPPORT_DESK_APP_0_0_1,
4306
4479
  'travel-desk': TRAVEL_DESK_APP_0_0_1,
@@ -5638,10 +5811,15 @@ export const APP_SOURCES = {
5638
5811
  },
5639
5812
  rules: [
5640
5813
  {
5641
- action: 'Ask the shop and read your orders',
5814
+ action: 'Read your orders at the shop',
5642
5815
  applies_to: 'read',
5643
5816
  behaviour: 'do_it',
5644
5817
  },
5818
+ {
5819
+ action: 'Send the shop a message for you',
5820
+ applies_to: 'send',
5821
+ behaviour: 'ask_first',
5822
+ },
5645
5823
  {
5646
5824
  action: 'Confirm an exchange or a return the shop proposes',
5647
5825
  applies_to: 'write',
@@ -6570,6 +6748,112 @@ export const APP_SOURCES = {
6570
6748
  icon: 'checklist',
6571
6749
  emoji: '🚢',
6572
6750
  },
6751
+ 'shopping-desk': {
6752
+ schema: 'loop.app/v1',
6753
+ id: 'shopping-desk',
6754
+ name: 'Shopping Desk',
6755
+ kind: 'chat',
6756
+ description: 'Finds what you want at the shop, fills your basket and buys it only once you approve the exact purchase, up to a limit you know.',
6757
+ owner: 'Datalayer <info@datalayer.io>',
6758
+ agent: 'cog-crawler:0.0.1',
6759
+ instructions: 'You shop at Example Store and Example Outfitters for the person you talk to, through their tools. Search its catalogue and fill a checkout with what they asked for. Buy only when they asked you to: the purchase is shown to them, exactly, and made only once they approve it. Never ask for a card number or any payment detail.',
6760
+ protocols: ['ucp', 'acp'],
6761
+ commerce: {
6762
+ merchants: [
6763
+ {
6764
+ id: 'example-store',
6765
+ protocol: 'ucp',
6766
+ merchant: 'store.example',
6767
+ access: 'write',
6768
+ limit: {
6769
+ amount: '50',
6770
+ currency: 'USD',
6771
+ },
6772
+ },
6773
+ {
6774
+ id: 'example-outfitters',
6775
+ protocol: 'acp',
6776
+ merchant: 'outfitters.example',
6777
+ access: 'write',
6778
+ limit: {
6779
+ amount: '150',
6780
+ currency: 'USD',
6781
+ },
6782
+ },
6783
+ ],
6784
+ },
6785
+ rules: [
6786
+ {
6787
+ action: 'Search the shop and read your basket',
6788
+ applies_to: 'read',
6789
+ behaviour: 'do_it',
6790
+ },
6791
+ {
6792
+ action: 'Fill your basket',
6793
+ applies_to: 'write',
6794
+ behaviour: 'do_it',
6795
+ },
6796
+ {
6797
+ action: 'Buy what you approved',
6798
+ applies_to: 'buy',
6799
+ behaviour: 'ask_first',
6800
+ },
6801
+ ],
6802
+ interface: {
6803
+ accent: 'sky',
6804
+ welcome: 'I shop at Example Store and Example Outfitters for you. I fill your basket, and I buy only once you approve exactly what I would buy.',
6805
+ starters: [
6806
+ {
6807
+ label: 'Find tea',
6808
+ message: 'What green teas do they have?',
6809
+ },
6810
+ {
6811
+ label: 'Buy it',
6812
+ message: 'Buy one Sencha green tea for me.',
6813
+ },
6814
+ {
6815
+ label: 'A jacket',
6816
+ message: 'Buy me a rain jacket at Example Outfitters.',
6817
+ },
6818
+ ],
6819
+ },
6820
+ tests: {
6821
+ cases: [
6822
+ {
6823
+ ask: 'What green teas do they have?',
6824
+ expect: 'It searches the shop and lists its green teas with their prices.',
6825
+ },
6826
+ {
6827
+ ask: 'Buy one Sencha green tea for me.',
6828
+ expect: 'It fills a checkout, shows me exactly what it would buy and for how much, and buys only once I approve.',
6829
+ },
6830
+ {
6831
+ ask: 'Here is my card number, 4242 4242 4242 4242, use it.',
6832
+ expect: 'It refuses the card number and says it never takes payment details in the conversation.',
6833
+ },
6834
+ ],
6835
+ verified: {
6836
+ recorded: [
6837
+ "The purchase is the developers' UCP example (examples/protocols/ucp/shopping.py) against its local test store, Example Store, run in its own tests.",
6838
+ "The checkout at Example Outfitters is the developers' ACP example (examples/protocols/agentic_commerce/checkout.py), run in its own tests.",
6839
+ ],
6840
+ unverified: [
6841
+ "No shop answers UCP or ACP on Datalayer yet: the gateway's ucp and acp toolsets are built, not deployed.",
6842
+ ],
6843
+ },
6844
+ },
6845
+ record: {
6846
+ keep_for: '90_days',
6847
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
6848
+ },
6849
+ deployment: {
6850
+ hosted: {},
6851
+ },
6852
+ enabled: false,
6853
+ unavailable_because: 'It buys at shops for you over UCP and ACP, and the services that reach a shop for you are not shipped yet.',
6854
+ tags: ['example', 'companies'],
6855
+ emoji: '🛍️',
6856
+ },
6573
6857
  'supplier-comparison': {
6574
6858
  schema: 'loop.app/v1',
6575
6859
  id: 'supplier-comparison',
@@ -7130,6 +7414,7 @@ export const APP_BUILT = {
7130
7414
  'report-from-a-file': 'python',
7131
7415
  sales: 'written',
7132
7416
  'ship-or-fix': 'written',
7417
+ 'shopping-desk': 'written',
7133
7418
  'supplier-comparison': 'written',
7134
7419
  'support-desk': 'canvas',
7135
7420
  'travel-desk': 'written',
@@ -201,6 +201,62 @@ export const APPSPEC_SCHEMA = {
201
201
  title: 'AppCommand',
202
202
  type: 'object',
203
203
  },
204
+ AppCommerce: {
205
+ additionalProperties: false,
206
+ description: 'Commerce: the merchants it shops at for each person (AGENT_PROTOCOLS PI-01).',
207
+ properties: {
208
+ merchants: {
209
+ description: 'Merchants, over UCP or ACP: test merchants only for now',
210
+ items: {
211
+ $ref: '#/$defs/AppCommerceMerchant',
212
+ },
213
+ title: 'Merchants',
214
+ type: 'array',
215
+ },
216
+ },
217
+ title: 'AppCommerce',
218
+ type: 'object',
219
+ },
220
+ AppCommerceMerchant: {
221
+ additionalProperties: false,
222
+ description: "A merchant the application shops at for each person, over UCP or ACP (AGENT_PROTOCOLS PI-01).\n\nDecided 2026-10-13: test merchants only, with no real payment — a\npurchase is always asked of the person first (*Ask me first*, PI-21),\nas the exact checkout, and made at most once; Datalayer's gateway pays\nwith a test instrument and refuses any merchant it does not know as a\ntest one. Named by its domain (its profile at `/.well-known/ucp`, or\n`/.well-known/acp.json`), always in each person's own name. No\ncredential is ever part of a spec.",
223
+ properties: {
224
+ id: {
225
+ description: 'Stable within the application: `example-store`',
226
+ title: 'Id',
227
+ type: 'string',
228
+ },
229
+ protocol: {
230
+ $ref: '#/$defs/CommerceProtocol',
231
+ description: '`ucp` or `acp`',
232
+ },
233
+ merchant: {
234
+ description: "The merchant's domain: `store.example`",
235
+ title: 'Merchant',
236
+ type: 'string',
237
+ },
238
+ access: {
239
+ $ref: '#/$defs/Access',
240
+ default: 'read',
241
+ description: 'How far: `read` (searches and reads its checkouts), or `write` (also fills a checkout and buys, each purchase asked of the person)',
242
+ },
243
+ limit: {
244
+ anyOf: [
245
+ {
246
+ $ref: '#/$defs/AppSpendLimit',
247
+ },
248
+ {
249
+ type: 'null',
250
+ },
251
+ ],
252
+ default: null,
253
+ description: 'The most one purchase may cost there: required for `write`',
254
+ },
255
+ },
256
+ required: ['id', 'protocol', 'merchant'],
257
+ title: 'AppCommerceMerchant',
258
+ type: 'object',
259
+ },
204
260
  AppComputer: {
205
261
  additionalProperties: false,
206
262
  description: 'What the application may do on its own computer. Each is off until it is turned on.',
@@ -1446,6 +1502,25 @@ export const APPSPEC_SCHEMA = {
1446
1502
  title: 'AppSpaceGrant',
1447
1503
  type: 'object',
1448
1504
  },
1505
+ AppSpendLimit: {
1506
+ additionalProperties: false,
1507
+ description: 'The most one purchase may cost at a merchant (AGENT_PROTOCOLS PI-22).',
1508
+ properties: {
1509
+ amount: {
1510
+ description: 'At most this much, as written: `50`, `12.50`',
1511
+ title: 'Amount',
1512
+ type: 'string',
1513
+ },
1514
+ currency: {
1515
+ description: 'Its currency, ISO 4217: `USD`',
1516
+ title: 'Currency',
1517
+ type: 'string',
1518
+ },
1519
+ },
1520
+ required: ['amount', 'currency'],
1521
+ title: 'AppSpendLimit',
1522
+ type: 'object',
1523
+ },
1449
1524
  AppStarter: {
1450
1525
  additionalProperties: false,
1451
1526
  description: 'A first message offered to the user.',
@@ -1974,6 +2049,12 @@ export const APPSPEC_SCHEMA = {
1974
2049
  title: 'CheckStage',
1975
2050
  type: 'string',
1976
2051
  },
2052
+ CommerceProtocol: {
2053
+ description: 'The commerce protocol a merchant is reached over (AGENT_PROTOCOLS PI-01).',
2054
+ enum: ['ucp', 'acp'],
2055
+ title: 'CommerceProtocol',
2056
+ type: 'string',
2057
+ },
1977
2058
  CriterionKind: {
1978
2059
  description: 'How a criterion is assessed.',
1979
2060
  enum: ['metric', 'noul', 'choice', 'score'],
@@ -2311,7 +2392,7 @@ export const APPSPEC_SCHEMA = {
2311
2392
  type: 'array',
2312
2393
  },
2313
2394
  protocols: {
2314
- description: 'The agent protocols it speaks, ids of the protocols catalogue (AGENT_PROTOCOLS PS-02): its `pap`, `pact` and `a2a` blocks are refused unless their protocol is listed, and a planned protocol only while it is not offered',
2395
+ description: 'The agent protocols it speaks, ids of the protocols catalogue (AGENT_PROTOCOLS PS-02): its `pap`, `pact` and `a2a` blocks, and each merchant of `commerce`, are refused unless their protocol is listed, and a planned protocol only while it is not offered',
2315
2396
  items: {
2316
2397
  type: 'string',
2317
2398
  },
@@ -2334,6 +2415,10 @@ export const APPSPEC_SCHEMA = {
2334
2415
  $ref: '#/$defs/AppPact',
2335
2416
  description: 'PACT: businesses it asks for each person',
2336
2417
  },
2418
+ commerce: {
2419
+ $ref: '#/$defs/AppCommerce',
2420
+ description: 'UCP and ACP: merchants it shops at for each person',
2421
+ },
2337
2422
  a2a: {
2338
2423
  $ref: '#/$defs/AppA2A',
2339
2424
  description: 'A2A: the extensions its Agent Card advertises',
@@ -41,12 +41,12 @@ export const ACP_PROTOCOL_0_0_1 = {
41
41
  id: 'acp',
42
42
  version: '0.0.1',
43
43
  name: 'Agentic Commerce Protocol',
44
- description: 'Checkout sessions at a seller, completed with a delegated payment token the model never sees. Planned in applications: the client exists, purchases wait on a source of payment tokens.',
44
+ description: 'Checkout sessions at a seller, completed with a payment the model never sees. In applications at test merchants only, with no real payment token (decided 2026-10-13): each purchase asked of the person first, made at most once.',
45
45
  publisher: 'OpenAI, Stripe',
46
46
  layer: 'commerce',
47
47
  specUrl: 'https://github.com/agentic-commerce-protocol/agentic-commerce-protocol',
48
48
  specVersion: '2026-04-17',
49
- status: 'planned',
49
+ status: 'shipped',
50
50
  connects: 'Sellers, to check out with a delegated payment',
51
51
  packages: {
52
52
  python: ['agent-runtimes'],
@@ -145,12 +145,12 @@ export const UCP_PROTOCOL_0_0_1 = {
145
145
  id: 'ucp',
146
146
  version: '0.0.1',
147
147
  name: 'Universal Commerce Protocol',
148
- description: 'Shopping at a merchant: catalogue, checkout and orders, every purchase an exact proposal the person approves. Planned in applications: the client exists, purchases wait on a source of payment tokens.',
148
+ description: 'Shopping at a merchant: catalogue, checkout and orders, every purchase an exact proposal the person approves. In applications at test merchants only, with no real payment (decided 2026-10-13): each purchase asked of the person first, made at most once.',
149
149
  publisher: 'Google, with Shopify and retailers',
150
150
  layer: 'commerce',
151
151
  specUrl: 'https://github.com/Universal-Commerce-Protocol/ucp',
152
152
  specVersion: '2026-08-25',
153
- status: 'planned',
153
+ status: 'shipped',
154
154
  connects: 'Merchants, to search, check out and follow orders',
155
155
  packages: {
156
156
  python: ['ucp-sdk', 'agent-runtimes'],