@datalayer/agent-runtimes 1.5.8 → 1.5.10

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.
@@ -1114,6 +1114,24 @@ export const APPSPEC_SCHEMA = {
1114
1114
  title: 'AppPageOutput',
1115
1115
  type: 'object',
1116
1116
  },
1117
+ AppPair: {
1118
+ additionalProperties: false,
1119
+ description: "One of a pair of examples, a PACT business and the personal agent that asks it\n(AGENT_PROTOCOLS PR-13, E-02; decided 2026-10-13).\n\nA personal agent's issuer is its own application's, known only once a copy\nexists: when a person has copied both of a pair, the Studio registers the\npersonal agent's copy with the business's copy (`pact.business.registered_agents`)\nand points the personal agent at the business's own domain.",
1120
+ properties: {
1121
+ id: {
1122
+ description: "The pair's id, the same on both of its applications",
1123
+ title: 'Id',
1124
+ type: 'string',
1125
+ },
1126
+ role: {
1127
+ $ref: '#/$defs/PairRole',
1128
+ description: '`business`, or `personal_agent`: the one that asks it',
1129
+ },
1130
+ },
1131
+ required: ['id', 'role'],
1132
+ title: 'AppPair',
1133
+ type: 'object',
1134
+ },
1117
1135
  AppPap: {
1118
1136
  additionalProperties: false,
1119
1137
  description: 'Personal Agent Protocol: the companies it works with, and whether it is one.\n\nA `pap` block names the profile it is written for (PAP_DATALAYER S-03): one\nDatalayer speaks, or it is refused in a sentence. An application without the\nblock has none.',
@@ -1276,7 +1294,7 @@ export const APPSPEC_SCHEMA = {
1276
1294
  },
1277
1295
  AppPapOperation: {
1278
1296
  additionalProperties: false,
1279
- description: "Something a personal agent may ask the application to do for the person,\ndone only once they confirm its exact terms (PAP_DATALAYER B-04, Operations v1).\n\nAsked by a personal agent, the application's agent does not call `tool`:\nthe call is proposed, its arguments the terms, and the person confirms\nthat revision before the tool runs, with those arguments and only once.",
1297
+ description: "Something a personal agent may ask the application to do for the person,\ndone only once they confirm its exact terms (PAP_DATALAYER B-04, Operations v1).\n\nAsked by a personal agent, the application's agent does not call `tool`:\nthe call is proposed, its arguments the terms, and the person confirms\nthat revision before the tool runs, with those arguments and only once.\nAn operation that `allows` instead gives a standing permission once the\nperson confirms it (R-07): it calls no tool, and is asked for through the\napplication's API or its server for agents.",
1280
1298
  properties: {
1281
1299
  action: {
1282
1300
  description: "The action's name at this company, e.g. `orders.exchange`",
@@ -1284,9 +1302,29 @@ export const APPSPEC_SCHEMA = {
1284
1302
  type: 'string',
1285
1303
  },
1286
1304
  tool: {
1305
+ anyOf: [
1306
+ {
1307
+ type: 'string',
1308
+ },
1309
+ {
1310
+ type: 'null',
1311
+ },
1312
+ ],
1313
+ default: null,
1287
1314
  description: "The application's tool that does it, called with the terms",
1288
1315
  title: 'Tool',
1289
- type: 'string',
1316
+ },
1317
+ allows: {
1318
+ anyOf: [
1319
+ {
1320
+ $ref: '#/$defs/AppPapStanding',
1321
+ },
1322
+ {
1323
+ type: 'null',
1324
+ },
1325
+ ],
1326
+ default: null,
1327
+ description: 'Instead of a tool: the standing permission confirming it gives (R-07)',
1290
1328
  },
1291
1329
  summary: {
1292
1330
  description: 'What the person is shown, with `{term}` for each term, e.g. `Exchange order {order_id} for size {size}`; never written by the model',
@@ -1300,10 +1338,86 @@ export const APPSPEC_SCHEMA = {
1300
1338
  type: 'boolean',
1301
1339
  },
1302
1340
  },
1303
- required: ['action', 'tool', 'summary'],
1341
+ required: ['action', 'summary'],
1304
1342
  title: 'AppPapOperation',
1305
1343
  type: 'object',
1306
1344
  },
1345
+ AppPapStanding: {
1346
+ additionalProperties: false,
1347
+ description: "An operation whose effect is a standing permission (PAP_DATALAYER R-07, the Ledgerly pattern).\n\nConfirmed by the person, it is recorded as the approval in advance they\nwould give in Datalayer: this application may confirm, at the company of\none of its own connections and in the person's account there, operations\nof that class whose terms stay within these limits, so many times, for so\nmany days — and the person reads it back and withdraws it there.",
1348
+ properties: {
1349
+ connection: {
1350
+ description: 'The id of its own company connection the permission is used at',
1351
+ title: 'Connection',
1352
+ type: 'string',
1353
+ },
1354
+ action: {
1355
+ $ref: '#/$defs/PapStandingAction',
1356
+ description: 'What confirming there does: `write`, or `buy`',
1357
+ },
1358
+ limits: {
1359
+ description: 'Every term bounded, 1 to 20',
1360
+ items: {
1361
+ $ref: '#/$defs/AppPapStandingLimit',
1362
+ },
1363
+ title: 'Limits',
1364
+ type: 'array',
1365
+ },
1366
+ uses: {
1367
+ description: 'The term of this operation giving how many times, at most',
1368
+ title: 'Uses',
1369
+ type: 'string',
1370
+ },
1371
+ days: {
1372
+ description: 'The term of this operation giving for how many days, at most 90',
1373
+ title: 'Days',
1374
+ type: 'string',
1375
+ },
1376
+ },
1377
+ required: ['connection', 'action', 'limits', 'uses', 'days'],
1378
+ title: 'AppPapStanding',
1379
+ type: 'object',
1380
+ },
1381
+ AppPapStandingLimit: {
1382
+ additionalProperties: false,
1383
+ description: "One bound of a standing permission: a term of the other company's operations,\nbounded by a term of this one — its maximum, or the one value allowed.",
1384
+ properties: {
1385
+ path: {
1386
+ description: "The other company's term, by its dotted path: `amount.amount`, `payee`",
1387
+ title: 'Path',
1388
+ type: 'string',
1389
+ },
1390
+ maximum: {
1391
+ anyOf: [
1392
+ {
1393
+ type: 'string',
1394
+ },
1395
+ {
1396
+ type: 'null',
1397
+ },
1398
+ ],
1399
+ default: null,
1400
+ description: 'The term of this operation giving its maximum',
1401
+ title: 'Maximum',
1402
+ },
1403
+ allowed: {
1404
+ anyOf: [
1405
+ {
1406
+ type: 'string',
1407
+ },
1408
+ {
1409
+ type: 'null',
1410
+ },
1411
+ ],
1412
+ default: null,
1413
+ description: 'The term of this operation giving the value allowed',
1414
+ title: 'Allowed',
1415
+ },
1416
+ },
1417
+ required: ['path'],
1418
+ title: 'AppPapStandingLimit',
1419
+ type: 'object',
1420
+ },
1307
1421
  AppPermissions: {
1308
1422
  additionalProperties: false,
1309
1423
  description: 'What the application may reach beside its connections. Nothing, unless said.',
@@ -1556,6 +1670,41 @@ export const APPSPEC_SCHEMA = {
1556
1670
  title: 'AppScenario',
1557
1671
  type: 'object',
1558
1672
  },
1673
+ AppSignedFetch: {
1674
+ additionalProperties: false,
1675
+ description: 'Signed fetch: the sites it reads pages of, signed with its Web Bot Auth key (AGENT_PROTOCOLS EX-11).',
1676
+ properties: {
1677
+ sites: {
1678
+ description: 'Sites, each by its exact domain: read with GET only, every request signed',
1679
+ items: {
1680
+ $ref: '#/$defs/AppSignedFetchSite',
1681
+ },
1682
+ title: 'Sites',
1683
+ type: 'array',
1684
+ },
1685
+ },
1686
+ title: 'AppSignedFetch',
1687
+ type: 'object',
1688
+ },
1689
+ AppSignedFetchSite: {
1690
+ additionalProperties: false,
1691
+ description: "A website the application reads pages of, each request signed (AGENT_PROTOCOLS EX-11).\n\nDecided 2026-10-13: a *signed fetch* names exact sites, an allow-list.\nDatalayer's gateway reads a page there with `GET` only, on its safe\negress path (public addresses only), each request signed with the\napplication's own Web Bot Auth key and recorded; reading is under the\napplication's Rules like any read. Named by its domain: no other host is\nreached, and no credential is ever part of a spec.",
1692
+ properties: {
1693
+ id: {
1694
+ description: 'Stable within the application: `example-verifier`',
1695
+ title: 'Id',
1696
+ type: 'string',
1697
+ },
1698
+ site: {
1699
+ description: "The site's domain, exactly: `verify.examples.datalayer.run`",
1700
+ title: 'Site',
1701
+ type: 'string',
1702
+ },
1703
+ },
1704
+ required: ['id', 'site'],
1705
+ title: 'AppSignedFetchSite',
1706
+ type: 'object',
1707
+ },
1559
1708
  AppSpaceGrant: {
1560
1709
  additionalProperties: false,
1561
1710
  description: 'A Space the application may reach.',
@@ -2264,6 +2413,12 @@ export const APPSPEC_SCHEMA = {
2264
2413
  title: 'Layout',
2265
2414
  type: 'string',
2266
2415
  },
2416
+ PairRole: {
2417
+ description: 'Which side of a pair of examples an application is (AGENT_PROTOCOLS PR-13).',
2418
+ enum: ['business', 'personal_agent'],
2419
+ title: 'PairRole',
2420
+ type: 'string',
2421
+ },
2267
2422
  PapAgents: {
2268
2423
  description: 'Which personal agents a company application accepts.',
2269
2424
  enum: ['any', 'registered'],
@@ -2282,6 +2437,12 @@ export const APPSPEC_SCHEMA = {
2282
2437
  title: 'PapSignIn',
2283
2438
  type: 'string',
2284
2439
  },
2440
+ PapStandingAction: {
2441
+ description: "What a standing permission lets the application confirm at another company (R-02's classes).",
2442
+ enum: ['write', 'buy'],
2443
+ title: 'PapStandingAction',
2444
+ type: 'string',
2445
+ },
2285
2446
  RecordItem: {
2286
2447
  description: 'What an application may keep of what it did.',
2287
2448
  enum: [
@@ -2465,7 +2626,7 @@ export const APPSPEC_SCHEMA = {
2465
2626
  type: 'array',
2466
2627
  },
2467
2628
  protocols: {
2468
- 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',
2629
+ description: 'The agent protocols it speaks, ids of the protocols catalogue (AGENT_PROTOCOLS PS-02): its `pap`, `pact`, `signed_fetch` 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',
2469
2630
  items: {
2470
2631
  type: 'string',
2471
2632
  },
@@ -2492,6 +2653,22 @@ export const APPSPEC_SCHEMA = {
2492
2653
  $ref: '#/$defs/AppCommerce',
2493
2654
  description: 'UCP and ACP: merchants it shops at for each person',
2494
2655
  },
2656
+ signed_fetch: {
2657
+ $ref: '#/$defs/AppSignedFetch',
2658
+ description: 'Web Bot Auth: the sites it reads pages of, GET only, each request signed with its key',
2659
+ },
2660
+ pair: {
2661
+ anyOf: [
2662
+ {
2663
+ $ref: '#/$defs/AppPair',
2664
+ },
2665
+ {
2666
+ type: 'null',
2667
+ },
2668
+ ],
2669
+ default: null,
2670
+ description: 'One of a pair of examples: a PACT business, or the personal agent that asks it',
2671
+ },
2495
2672
  a2a: {
2496
2673
  $ref: '#/$defs/AppA2A',
2497
2674
  description: 'A2A: the extensions its Agent Card advertises',
@@ -128,16 +128,16 @@ export const TAP_PROTOCOL_0_0_1 = {
128
128
  id: 'tap',
129
129
  version: '0.0.1',
130
130
  name: 'Trusted Agent Protocol',
131
- description: 'An agent-recognition profile over Web Bot Auth for merchants. Planned: nothing is built until its profile is confirmed.',
131
+ description: "An agent-recognition profile over Web Bot Auth for merchants: a signature tagged agent-browser-auth to browse or agent-payer-auth to pay. Built as a draft from Visa's public Merchant Specifications (2026-10-13) in agent-runtimes; planned for applications until Visa confirms it.",
132
132
  publisher: 'Visa',
133
133
  layer: 'identity',
134
- specUrl: 'https://developer.visa.com',
135
- specVersion: 'none yet',
134
+ specUrl: 'https://developer.visa.com/capabilities/trusted-agent-protocol/trusted-agent-protocol-specifications',
135
+ specVersion: 'draft (Merchant Specifications, read 2026-10-13)',
136
136
  status: 'planned',
137
137
  connects: 'Merchants that recognise an agent by its signature',
138
138
  packages: {
139
- python: [],
140
- typescript: [],
139
+ python: ['agent-runtimes'],
140
+ typescript: ['@datalayer/agent-runtimes', 'http-message-sig'],
141
141
  },
142
142
  protocolTools: [],
143
143
  };
@@ -162,7 +162,7 @@ export const WEB_BOT_AUTH_PROTOCOL_0_0_1 = {
162
162
  id: 'web-bot-auth',
163
163
  version: '0.0.1',
164
164
  name: 'Web Bot Auth',
165
- description: 'Signed outbound requests (RFC 9421) and the key directory a website checks them against.',
165
+ description: 'Signed outbound requests (RFC 9421) and the key directory a website checks them against. In applications, every request to a company, business or merchant is signed, and a signed fetch reads pages at the sites an application names, GET only (decided 2026-10-13).',
166
166
  publisher: 'Cloudflare (IETF draft)',
167
167
  layer: 'identity',
168
168
  specUrl: 'https://datatracker.ietf.org/doc/draft-ietf-webbotauth-httpsig-protocol/',
@@ -173,7 +173,8 @@ export const WEB_BOT_AUTH_PROTOCOL_0_0_1 = {
173
173
  python: ['agent-runtimes'],
174
174
  typescript: ['@datalayer/agent-runtimes', 'web-bot-auth'],
175
175
  },
176
- protocolTools: [],
176
+ protocolTools: ['signed-fetch'],
177
+ appspecBlock: 'signed_fetch',
177
178
  };
178
179
  export const PROTOCOL_CATALOGUE = {
179
180
  a2a: A2A_PROTOCOL_0_0_1,
@@ -156,7 +156,7 @@ export interface ProtocolSpec {
156
156
  /** Its tools' action-class tables (`agentspecs/protocol-tools`). */
157
157
  protocolTools: string[];
158
158
  /** The Appspec block it configures, if any: refused unless `protocols` lists it. */
159
- appspecBlock?: 'pap' | 'pact' | 'a2a';
159
+ appspecBlock?: 'pap' | 'pact' | 'a2a' | 'signed_fetch';
160
160
  }
161
161
  /** A check a Frame requires of the output of work done under it. */
162
162
  export interface FrameGuardSpec {
@@ -499,16 +499,48 @@ export interface AppPapCompanySpec {
499
499
  */
500
500
  operations: AppPapOperationSpec[];
501
501
  }
502
+ /**
503
+ * One bound of a standing permission (PAP_DATALAYER R-07): a term of the other
504
+ * company's operations, by its dotted path, bounded by a term of this one —
505
+ * its maximum, or the one value allowed (one of the two).
506
+ */
507
+ export interface AppPapStandingLimitSpec {
508
+ path: string;
509
+ maximum?: string;
510
+ allowed?: string;
511
+ }
512
+ /**
513
+ * What an operation gives instead of calling a tool (PAP_DATALAYER R-07, the
514
+ * Ledgerly pattern): once the person confirms it, the application may confirm,
515
+ * at one of its own company connections and in their account there, what stays
516
+ * within these bounds — recorded as the approval in advance they would give in
517
+ * Datalayer.
518
+ */
519
+ export interface AppPapStandingSpec {
520
+ /** The id of one of its own company connections (`as: user`, `write`). */
521
+ connection: string;
522
+ /** What confirming there does. */
523
+ action: 'write' | 'buy';
524
+ /** Every term bounded, 1 to 20. */
525
+ limits: AppPapStandingLimitSpec[];
526
+ /** The term of this operation giving how many times, at most. */
527
+ uses: string;
528
+ /** The term of this operation giving for how many days, at most 90. */
529
+ days: string;
530
+ }
502
531
  /**
503
532
  * Something a personal agent may ask the application to do for the person,
504
533
  * done only once they confirm its exact terms (PAP_DATALAYER B-04): the call
505
- * of `tool` is proposed instead of made, its arguments the terms.
534
+ * of `tool` is proposed instead of made, its arguments the terms — or, for one
535
+ * that `allows`, a standing permission given (R-07).
506
536
  */
507
537
  export interface AppPapOperationSpec {
508
538
  /** The action's name at this company: `orders.exchange`. */
509
539
  action: string;
510
- /** The application's tool that does it, called with the terms. */
540
+ /** The application's tool that does it, called with the terms; `''` for one that `allows`. */
511
541
  tool: string;
542
+ /** Instead of a tool: the standing permission confirming it gives (R-07). */
543
+ allows?: AppPapStandingSpec;
512
544
  /** What the person is shown, `{term}` for each term; never the model's. */
513
545
  summary: string;
514
546
  /** Whether only the person may confirm it, never an approval in advance. */
@@ -598,6 +630,34 @@ export interface AppCommerceMerchantSpec {
598
630
  export interface AppCommerceSpec {
599
631
  merchants: AppCommerceMerchantSpec[];
600
632
  }
633
+ /**
634
+ * A website the application reads pages of, each request signed with its
635
+ * own Web Bot Auth key (AGENT_PROTOCOLS EX-11, decided 2026-10-13): the
636
+ * gateway's `signed-fetch` toolset reads there with GET only. Never a
637
+ * credential.
638
+ */
639
+ export interface AppSignedFetchSiteSpec {
640
+ /** Stable within the application: `example-verifier`. */
641
+ id: string;
642
+ /** The site's domain, exactly: `verify.examples.datalayer.run`. */
643
+ site: string;
644
+ }
645
+ /** Signed fetch: the exact sites it reads pages of, an allow-list. */
646
+ export interface AppSignedFetchSpec {
647
+ sites: AppSignedFetchSiteSpec[];
648
+ }
649
+ /**
650
+ * One of a pair of examples, a PACT business and the personal agent that
651
+ * asks it (AGENT_PROTOCOLS PR-13; decided 2026-10-13): when a person has
652
+ * copied both, the Studio registers the personal agent's copy with the
653
+ * business's copy and points the personal agent there.
654
+ */
655
+ export interface AppPairSpec {
656
+ /** The pair's id, the same on both of its applications. */
657
+ id: string;
658
+ /** Which side of the pair it is. */
659
+ role: 'business' | 'personal_agent';
660
+ }
601
661
  /**
602
662
  * An A2A extension the application's Agent Card advertises, beside the
603
663
  * runtime's own (AGENT_PROTOCOLS PR-02). Its params are public: never a
@@ -1205,6 +1265,10 @@ export interface AppSpec {
1205
1265
  pact?: AppPactSpec;
1206
1266
  /** UCP and ACP: the merchants it shops at for each person (AGENT_PROTOCOLS PI-01). */
1207
1267
  commerce?: AppCommerceSpec;
1268
+ /** Signed fetch: the sites it reads pages of, each request signed (AGENT_PROTOCOLS EX-11). */
1269
+ signed_fetch?: AppSignedFetchSpec;
1270
+ /** One of a pair of examples: a PACT business, or the personal agent that asks it (PR-13). */
1271
+ pair?: AppPairSpec;
1208
1272
  /** A2A: the extensions its Agent Card advertises (AGENT_PROTOCOLS PR-02). */
1209
1273
  a2a?: AppA2ASpec;
1210
1274
  rules: AppRuleSpec[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datalayer/agent-runtimes",
3
- "version": "1.5.8",
3
+ "version": "1.5.10",
4
4
  "type": "module",
5
5
  "workspaces": [
6
6
  ".",
@@ -188,6 +188,7 @@
188
188
  "@lumino/widgets": "^2.7.3",
189
189
  "@mcp-ui/client": "^5.17.1",
190
190
  "@modelcontextprotocol/ext-apps": "^0.2.2",
191
+ "@modelcontextprotocol/sdk": "^1.32.1",
191
192
  "@primer/behaviors": "^1.8.4",
192
193
  "@primer/brand-primitives": "^0.51.0",
193
194
  "@primer/css": "^21.5.1",
@@ -242,6 +243,7 @@
242
243
  "embla-carousel-react": "^8.6.0",
243
244
  "fuse.js": "^7.0.0",
244
245
  "html2canvas": "^1.4.1",
246
+ "http-message-sig": "0.3.0",
245
247
  "input-otp": "^1.4.2",
246
248
  "jose": "^6.2.12",
247
249
  "jwt-decode": "^2.2.0",
@@ -156,8 +156,8 @@ def load_specs(specs_dir: Path) -> tuple[list[dict[str, Any]], dict[str, Any]]:
156
156
  mode="json", by_alias=True
157
157
  ):
158
158
  spec.pop("pap")
159
- # PACT, commerce and A2A's extensions the same way (AGENT_PROTOCOLS PI-01, PR-02).
160
- for block in ("pact", "commerce", "a2a"):
159
+ # PACT, commerce, signed fetch and A2A's extensions the same way (AGENT_PROTOCOLS PI-01, PR-02, EX-11).
160
+ for block in ("pact", "commerce", "signed_fetch", "a2a"):
161
161
  if block in spec and spec[block] == type(getattr(app, block))().model_dump(
162
162
  mode="json", by_alias=True
163
163
  ):
@@ -26,7 +26,7 @@ from versioning import ensure_spec_version, version_suffix
26
26
 
27
27
  LAYERS = ("transport", "consent", "identity", "commerce", "ui")
28
28
  STATUSES = ("shipped", "planned")
29
- BLOCKS = ("pap", "pact", "a2a")
29
+ BLOCKS = ("pap", "pact", "a2a", "signed_fetch")
30
30
 
31
31
 
32
32
  def load_protocol_specs(specs_dir: Path) -> list[dict[str, Any]]: