@datalayer/agent-runtimes 1.3.114 → 1.4.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 (73) hide show
  1. package/dist-embed/chunks/{ChatView-D41Nx5rC.js → ChatView-BpKZPdcp.js} +4 -4
  2. package/dist-embed/datalayer-app-main.js +150 -150
  3. package/lib/apps/apps/appspec.d.ts +13 -0
  4. package/lib/apps/apps/appspec.js +71 -0
  5. package/lib/apps/apps/checks.d.ts +1 -1
  6. package/lib/apps/apps/checks.js +2 -2
  7. package/lib/apps/apps/customComponents.js +1 -1
  8. package/lib/apps/core/canvasBlocks.d.ts +3 -3
  9. package/lib/apps/core/canvasParts.d.ts +6 -4
  10. package/lib/apps/embed/AppEmbed.js +3 -7
  11. package/lib/apps/embed/embedSession.d.ts +8 -4
  12. package/lib/apps/embed/embedSession.js +16 -9
  13. package/lib/apps/plugins/a2ui-surface/AnswerShows.d.ts +21 -0
  14. package/lib/apps/plugins/a2ui-surface/AnswerShows.js +29 -0
  15. package/lib/apps/plugins/a2ui-surface/SurfaceToolResult.js +4 -7
  16. package/lib/apps/plugins/a2ui-surface/index.d.ts +2 -1
  17. package/lib/apps/plugins/a2ui-surface/index.js +10 -1
  18. package/lib/apps/plugins/a2ui-surface/toolResult.d.ts +20 -11
  19. package/lib/apps/plugins/a2ui-surface/toolResult.js +27 -11
  20. package/lib/apps/plugins/app-components/index.d.ts +1 -1
  21. package/lib/apps/plugins/app-components/index.js +2 -2
  22. package/lib/apps/plugins/app-elements/AppElements.d.ts +3 -3
  23. package/lib/apps/plugins/app-elements/AppElements.js +5 -20
  24. package/lib/apps/plugins/app-elements/QuestionView.d.ts +28 -0
  25. package/lib/apps/plugins/app-elements/QuestionView.js +57 -0
  26. package/lib/apps/plugins/app-elements/index.d.ts +7 -4
  27. package/lib/apps/plugins/app-elements/index.js +14 -5
  28. package/lib/apps/plugins/canvas-blocks/index.d.ts +13 -13
  29. package/lib/apps/plugins/canvas-blocks/index.js +24 -24
  30. package/lib/apps/plugins/canvas-parts/index.d.ts +7 -1
  31. package/lib/apps/plugins/canvas-parts/index.js +36 -0
  32. package/lib/apps/plugins/chat/ChatView.js +7 -0
  33. package/lib/chat/base/ChatBase.js +234 -43
  34. package/lib/chat/base/loopElement.d.ts +16 -17
  35. package/lib/chat/base/loopElement.js +11 -27
  36. package/lib/chat/base/loopStep.d.ts +15 -15
  37. package/lib/chat/base/loopStep.js +10 -13
  38. package/lib/chat/base/loopWindow.d.ts +15 -20
  39. package/lib/chat/base/loopWindow.js +26 -27
  40. package/lib/chat/base/uiOps.d.ts +96 -0
  41. package/lib/chat/base/uiOps.js +251 -0
  42. package/lib/chat/messages/ChatMessageList.d.ts +8 -1
  43. package/lib/chat/messages/ChatMessageList.js +4 -4
  44. package/lib/components/a2ui/datalayer/Chart.d.ts +1 -1
  45. package/lib/components/a2ui/datalayer/schema.js +1 -1
  46. package/lib/components/teams/AnswerSurfaces.d.ts +3 -2
  47. package/lib/components/teams/AnswerSurfaces.js +7 -7
  48. package/lib/components/teams/useA2ATeam.d.ts +1 -1
  49. package/lib/config/AgentConfiguration.d.ts +1 -1
  50. package/lib/protocols/AGUIAdapter.d.ts +7 -0
  51. package/lib/protocols/AGUIAdapter.js +43 -3
  52. package/lib/specs/agents/agents.js +338 -169
  53. package/lib/specs/apps.js +47 -0
  54. package/lib/specs/appspecSchema.js +16 -0
  55. package/lib/specs/cogs.js +6 -3
  56. package/lib/specs/index.d.ts +2 -1
  57. package/lib/specs/index.js +2 -1
  58. package/lib/specs/protocols.d.ts +24 -0
  59. package/lib/specs/protocols.js +197 -0
  60. package/lib/specs/ui.d.ts +21 -0
  61. package/lib/specs/{uiPlugins.js → ui.js} +14 -14
  62. package/lib/types/agentspecs.d.ts +51 -5
  63. package/lib/types/messages.d.ts +7 -0
  64. package/lib/types/protocol.d.ts +8 -0
  65. package/package.json +2 -2
  66. package/scripts/codegen/generate_agents.py +43 -8
  67. package/scripts/codegen/generate_protocols.py +207 -0
  68. package/scripts/codegen/generate_sandbox_agents.py +1 -1
  69. package/scripts/codegen/{generate_ui_plugins.py → generate_ui.py} +40 -40
  70. package/scripts/gen_workers.py +2 -2
  71. package/lib/chat/base/loopMessage.d.ts +0 -37
  72. package/lib/chat/base/loopMessage.js +0 -37
  73. package/lib/specs/uiPlugins.d.ts +0 -21
package/lib/specs/apps.js CHANGED
@@ -27,6 +27,8 @@ export const ACCOUNTING_APP_0_0_1 = {
27
27
  only: [],
28
28
  },
29
29
  ],
30
+ protocols: [],
31
+ ui: [],
30
32
  rules: [
31
33
  {
32
34
  action: 'Read the books',
@@ -180,6 +182,8 @@ export const CHANGE_DETECTION_APP_0_0_1 = {
180
182
  only: [],
181
183
  },
182
184
  ],
185
+ protocols: [],
186
+ ui: [],
183
187
  rules: [
184
188
  {
185
189
  action: 'Search and read the imagery',
@@ -336,6 +340,8 @@ export const CROP_MONITORING_APP_0_0_1 = {
336
340
  only: [],
337
341
  },
338
342
  ],
343
+ protocols: [],
344
+ ui: [],
339
345
  rules: [
340
346
  {
341
347
  action: 'Search and read the imagery',
@@ -489,6 +495,8 @@ export const CUSTOMER_INTERVIEW_APP_0_0_1 = {
489
495
  context: ['customer-research:0.0.1'],
490
496
  contents: [],
491
497
  connections: [],
498
+ protocols: [],
499
+ ui: [],
492
500
  rules: [
493
501
  {
494
502
  action: 'Send the summary by email',
@@ -697,6 +705,8 @@ export const DATA_QUALITY_APP_0_0_1 = {
697
705
  context: [],
698
706
  contents: ['The dataset under investigation'],
699
707
  connections: [],
708
+ protocols: [],
709
+ ui: [],
700
710
  rules: [],
701
711
  permissions: {
702
712
  spaces: [],
@@ -888,6 +898,8 @@ export const DECIDE_APP_0_0_1 = {
888
898
  context: [],
889
899
  contents: [],
890
900
  connections: [],
901
+ protocols: [],
902
+ ui: [],
891
903
  rules: [
892
904
  {
893
905
  action: 'Ask a decision',
@@ -1023,6 +1035,8 @@ export const DISASTER_ASSESSMENT_APP_0_0_1 = {
1023
1035
  only: [],
1024
1036
  },
1025
1037
  ],
1038
+ protocols: [],
1039
+ ui: [],
1026
1040
  rules: [
1027
1041
  {
1028
1042
  action: 'Search and read the imagery',
@@ -1172,6 +1186,8 @@ export const EVENT_RESPONSE_APP_0_0_1 = {
1172
1186
  context: [],
1173
1187
  contents: [],
1174
1188
  connections: [],
1189
+ protocols: [],
1190
+ ui: [],
1175
1191
  rules: [],
1176
1192
  permissions: {
1177
1193
  spaces: [],
@@ -1328,6 +1344,8 @@ export const EXCHANGE_DESK_APP_0_0_1 = {
1328
1344
  context: [],
1329
1345
  contents: [],
1330
1346
  connections: [],
1347
+ protocols: ['pap'],
1348
+ ui: [],
1331
1349
  pap: {
1332
1350
  connections: [],
1333
1351
  company: {
@@ -1465,6 +1483,8 @@ export const INBOX_TRIAGE_APP_0_0_1 = {
1465
1483
  only: ['*gmail*'],
1466
1484
  },
1467
1485
  ],
1486
+ protocols: [],
1487
+ ui: [],
1468
1488
  rules: [
1469
1489
  {
1470
1490
  action: 'Label and archive a message',
@@ -1657,6 +1677,8 @@ export const MODEL_CHOICE_APP_0_0_1 = {
1657
1677
  'The Models page: how each model is billed (standard or credits) and who hosts it',
1658
1678
  ],
1659
1679
  connections: [],
1680
+ protocols: [],
1681
+ ui: [],
1660
1682
  rules: [],
1661
1683
  permissions: {
1662
1684
  spaces: [],
@@ -1906,6 +1928,8 @@ export const MONTH_END_CLOSE_APP_0_0_1 = {
1906
1928
  only: [],
1907
1929
  },
1908
1930
  ],
1931
+ protocols: [],
1932
+ ui: [],
1909
1933
  rules: [
1910
1934
  {
1911
1935
  action: 'Read the books',
@@ -2059,6 +2083,8 @@ export const ORDER_DESK_APP_0_0_1 = {
2059
2083
  context: [],
2060
2084
  contents: [],
2061
2085
  connections: [],
2086
+ protocols: ['pap'],
2087
+ ui: [],
2062
2088
  pap: {
2063
2089
  connections: [
2064
2090
  {
@@ -2218,6 +2244,8 @@ export const PIPELINE_REPORT_APP_0_0_1 = {
2218
2244
  context: ['datalayer:0.0.1'],
2219
2245
  contents: ['Sales pipeline export'],
2220
2246
  connections: [],
2247
+ protocols: [],
2248
+ ui: [],
2221
2249
  rules: [
2222
2250
  {
2223
2251
  action: 'Send the report',
@@ -2512,6 +2540,8 @@ export const QUOTE_CALCULATOR_APP_0_0_1 = {
2512
2540
  context: [],
2513
2541
  contents: ['Price list'],
2514
2542
  connections: [],
2543
+ protocols: [],
2544
+ ui: [],
2515
2545
  rules: [],
2516
2546
  permissions: {
2517
2547
  spaces: [],
@@ -2782,6 +2812,8 @@ export const REPORT_FROM_A_FILE_APP_0_0_1 = {
2782
2812
  context: [],
2783
2813
  contents: [],
2784
2814
  connections: [],
2815
+ protocols: [],
2816
+ ui: [],
2785
2817
  rules: [
2786
2818
  {
2787
2819
  action: 'Send the report by email',
@@ -3056,6 +3088,8 @@ export const SALES_APP_0_0_1 = {
3056
3088
  context: [],
3057
3089
  contents: [],
3058
3090
  connections: [],
3091
+ protocols: [],
3092
+ ui: [],
3059
3093
  rules: [],
3060
3094
  permissions: {
3061
3095
  spaces: [],
@@ -3189,6 +3223,8 @@ export const SHIP_OR_FIX_APP_0_0_1 = {
3189
3223
  context: [],
3190
3224
  contents: ['The benchmark run: task results, traces, cost and latency'],
3191
3225
  connections: [],
3226
+ protocols: [],
3227
+ ui: [],
3192
3228
  rules: [],
3193
3229
  permissions: {
3194
3230
  spaces: [],
@@ -3404,6 +3440,8 @@ export const SUPPLIER_COMPARISON_APP_0_0_1 = {
3404
3440
  context: [],
3405
3441
  contents: ['Order history', 'Supplier price lists', 'Delivery records'],
3406
3442
  connections: [],
3443
+ protocols: [],
3444
+ ui: [],
3407
3445
  rules: [],
3408
3446
  permissions: {
3409
3447
  spaces: [],
@@ -3606,6 +3644,8 @@ export const SUPPORT_DESK_APP_0_0_1 = {
3606
3644
  context: [],
3607
3645
  contents: ['Product documentation', 'Returns policy'],
3608
3646
  connections: [],
3647
+ protocols: [],
3648
+ ui: [],
3609
3649
  rules: [],
3610
3650
  permissions: {
3611
3651
  spaces: [],
@@ -3922,6 +3962,8 @@ export const TRAVEL_DESK_APP_0_0_1 = {
3922
3962
  context: [],
3923
3963
  contents: [],
3924
3964
  connections: [],
3965
+ protocols: ['pact'],
3966
+ ui: [],
3925
3967
  pact: {
3926
3968
  connections: [
3927
3969
  {
@@ -4070,6 +4112,8 @@ export const WEB_RESEARCH_APP_0_0_1 = {
4070
4112
  only: [],
4071
4113
  },
4072
4114
  ],
4115
+ protocols: [],
4116
+ ui: [],
4073
4117
  rules: [],
4074
4118
  permissions: {
4075
4119
  spaces: [],
@@ -5033,6 +5077,7 @@ export const APP_SOURCES = {
5033
5077
  does: ['write'],
5034
5078
  },
5035
5079
  ],
5080
+ protocols: ['pap'],
5036
5081
  pap: {
5037
5082
  company: {
5038
5083
  enabled: true,
@@ -5498,6 +5543,7 @@ export const APP_SOURCES = {
5498
5543
  owner: 'Datalayer <info@datalayer.io>',
5499
5544
  agent: 'cog-crawler:0.0.1',
5500
5545
  instructions: 'You work with Manzanita Outfitters for the person you talk to, through its tools. Ask the shop before saying anything about an order; when it asks the person to sign in, say so and wait. Never confirm what the shop proposes on your own: the person approves it, word for word, on Waiting for you.',
5546
+ protocols: ['pap'],
5501
5547
  pap: {
5502
5548
  connections: [
5503
5549
  {
@@ -6826,6 +6872,7 @@ export const APP_SOURCES = {
6826
6872
  owner: 'Datalayer <info@datalayer.io>',
6827
6873
  agent: 'cog-crawler:0.0.1',
6828
6874
  instructions: "You ask Example Air's own agent for the person you talk to, through its tools. Ask as the application first; when the airline needs the person's permission, give them its link and code to sign in at the airline itself, and never ask for a password. Change a booking only when the person asked.",
6875
+ protocols: ['pact'],
6829
6876
  pact: {
6830
6877
  connections: [
6831
6878
  {
@@ -2267,6 +2267,22 @@ export const APPSPEC_SCHEMA = {
2267
2267
  title: 'Connections',
2268
2268
  type: 'array',
2269
2269
  },
2270
+ protocols: {
2271
+ 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',
2272
+ items: {
2273
+ type: 'string',
2274
+ },
2275
+ title: 'Protocols',
2276
+ type: 'array',
2277
+ },
2278
+ ui: {
2279
+ description: 'The UI its answers render in, ids of `agentspecs/ui` (AGENT_PROTOCOLS PS-04): each once, and one that is not enabled only while it is not offered',
2280
+ items: {
2281
+ type: 'string',
2282
+ },
2283
+ title: 'Ui',
2284
+ type: 'array',
2285
+ },
2270
2286
  pap: {
2271
2287
  $ref: '#/$defs/AppPap',
2272
2288
  description: 'Personal Agent Protocol: companies it works with, or being one',
package/lib/specs/cogs.js CHANGED
@@ -216,7 +216,8 @@ Check your output against every Guard before you hand it over, and say which you
216
216
  { id: 'research.gather' },
217
217
  ],
218
218
  protocol: undefined,
219
- uiPlugin: undefined,
219
+ ui: undefined,
220
+ protocols: [],
220
221
  trigger: undefined,
221
222
  modelConfig: undefined,
222
223
  mcpServerTools: undefined,
@@ -378,7 +379,8 @@ Check your output against every Guard before you hand it over, and say which you
378
379
  { id: 'support.respond' },
379
380
  ],
380
381
  protocol: 'vercel-ai',
381
- uiPlugin: 'a2ui',
382
+ ui: 'a2ui',
383
+ protocols: [],
382
384
  trigger: undefined,
383
385
  modelConfig: { temperature: 0.7, max_tokens: 4096 },
384
386
  mcpServerTools: undefined,
@@ -557,7 +559,8 @@ Check your output against every Guard before you hand it over, and say which you
557
559
  { id: 'report.author' },
558
560
  ],
559
561
  protocol: undefined,
560
- uiPlugin: undefined,
562
+ ui: undefined,
563
+ protocols: [],
561
564
  trigger: undefined,
562
565
  modelConfig: undefined,
563
566
  mcpServerTools: undefined,
@@ -19,7 +19,8 @@ export * from './outputs';
19
19
  export * from './skills';
20
20
  export * from './backendTools';
21
21
  export * from './triggers';
22
- export * from './uiPlugins';
22
+ export * from './ui';
23
+ export * from './protocols';
23
24
  export * from './frames';
24
25
  export * from './cogs';
25
26
  export * from './guards';
@@ -23,7 +23,8 @@ export * from './outputs';
23
23
  export * from './skills';
24
24
  export * from './backendTools';
25
25
  export * from './triggers';
26
- export * from './uiPlugins';
26
+ export * from './ui';
27
+ export * from './protocols';
27
28
  export * from './frames';
28
29
  export * from './cogs';
29
30
  export * from './guards';
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Protocol Catalog.
3
+ *
4
+ * The agent protocols Datalayer targets (AGENT_PROTOCOLS PS-01).
5
+ *
6
+ * This file is AUTO-GENERATED from YAML specifications.
7
+ * DO NOT EDIT MANUALLY - run 'make specs' to regenerate.
8
+ */
9
+ import type { ProtocolSpec } from '../types/agentspecs';
10
+ export declare const A2A_PROTOCOL_0_0_1: ProtocolSpec;
11
+ export declare const A2UI_PROTOCOL_0_0_1: ProtocolSpec;
12
+ export declare const ACP_PROTOCOL_0_0_1: ProtocolSpec;
13
+ export declare const AG_UI_PROTOCOL_0_0_1: ProtocolSpec;
14
+ export declare const MCP_PROTOCOL_0_0_1: ProtocolSpec;
15
+ export declare const PACT_PROTOCOL_0_0_1: ProtocolSpec;
16
+ export declare const PAP_PROTOCOL_0_0_1: ProtocolSpec;
17
+ export declare const TAP_PROTOCOL_0_0_1: ProtocolSpec;
18
+ export declare const UCP_PROTOCOL_0_0_1: ProtocolSpec;
19
+ export declare const WEB_BOT_AUTH_PROTOCOL_0_0_1: ProtocolSpec;
20
+ export declare const PROTOCOL_CATALOGUE: Record<string, ProtocolSpec>;
21
+ /** A protocol by id. */
22
+ export declare function getProtocol(protocolId: string): ProtocolSpec | undefined;
23
+ /** Every protocol of the catalogue. */
24
+ export declare function listProtocolSpecs(): ProtocolSpec[];
@@ -0,0 +1,197 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ export const A2A_PROTOCOL_0_0_1 = {
6
+ id: 'a2a',
7
+ version: '0.0.1',
8
+ name: 'Agent2Agent',
9
+ description: "How agents talk to agents: teams and scenes talk over it, an application's route serves it, and its Agent Card advertises its extensions.",
10
+ publisher: 'Google, now the Linux Foundation',
11
+ layer: 'transport',
12
+ specUrl: 'https://a2a-protocol.org',
13
+ specVersion: '1.0',
14
+ status: 'shipped',
15
+ connects: 'Other agents, each at its address with its Agent Card',
16
+ packages: {
17
+ python: ['fasta2a', 'a2a-sdk'],
18
+ typescript: ['@a2a-js/sdk'],
19
+ },
20
+ protocolTools: [],
21
+ appspecBlock: 'a2a',
22
+ };
23
+ export const A2UI_PROTOCOL_0_0_1 = {
24
+ id: 'a2ui',
25
+ version: '0.0.1',
26
+ name: 'A2UI',
27
+ description: "How an agent's answer becomes an interface: components the host renders from a declarative surface.",
28
+ publisher: 'Google',
29
+ layer: 'ui',
30
+ specUrl: 'https://a2ui.org',
31
+ specVersion: '0.9',
32
+ status: 'shipped',
33
+ connects: 'The person, through components an answer draws',
34
+ packages: {
35
+ python: ['agent-runtimes'],
36
+ typescript: ['@a2ui/react', '@a2ui/web_core'],
37
+ },
38
+ protocolTools: [],
39
+ };
40
+ export const ACP_PROTOCOL_0_0_1 = {
41
+ id: 'acp',
42
+ version: '0.0.1',
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.',
45
+ publisher: 'OpenAI, Stripe',
46
+ layer: 'commerce',
47
+ specUrl: 'https://github.com/agentic-commerce-protocol/agentic-commerce-protocol',
48
+ specVersion: '2026-04-17',
49
+ status: 'planned',
50
+ connects: 'Sellers, to check out with a delegated payment',
51
+ packages: {
52
+ python: ['agent-runtimes'],
53
+ typescript: ['@datalayer/agent-runtimes'],
54
+ },
55
+ protocolTools: ['agentic-commerce'],
56
+ };
57
+ export const AG_UI_PROTOCOL_0_0_1 = {
58
+ id: 'ag-ui',
59
+ version: '0.0.1',
60
+ name: 'AG-UI',
61
+ description: 'How an agent streams its run to a page: messages, tool calls and state as events.',
62
+ publisher: 'CopilotKit',
63
+ layer: 'ui',
64
+ specUrl: 'https://docs.ag-ui.com',
65
+ specVersion: '0.0.57 (@ag-ui/core)',
66
+ status: 'shipped',
67
+ connects: 'The page a person talks to the agent on',
68
+ packages: {
69
+ python: ['ag-ui-protocol'],
70
+ typescript: ['@ag-ui/client', '@ag-ui/core'],
71
+ },
72
+ protocolTools: [],
73
+ };
74
+ export const MCP_PROTOCOL_0_0_1 = {
75
+ id: 'mcp',
76
+ version: '0.0.1',
77
+ name: 'Model Context Protocol',
78
+ description: 'How an agent calls tools and reads resources: clients and servers in both languages, and the MCP gateway every connection goes through.',
79
+ publisher: 'Anthropic',
80
+ layer: 'transport',
81
+ specUrl: 'https://modelcontextprotocol.io/specification',
82
+ specVersion: '2026-07-28 (Python), 2025-11-25 (TypeScript)',
83
+ status: 'shipped',
84
+ connects: 'Tools, resources and prompts served by MCP servers',
85
+ packages: {
86
+ python: ['mcp'],
87
+ typescript: ['@modelcontextprotocol/sdk', '@mcp-ui/client'],
88
+ },
89
+ protocolTools: [],
90
+ };
91
+ export const PACT_PROTOCOL_0_0_1 = {
92
+ id: 'pact',
93
+ version: '0.0.1',
94
+ name: 'Personal Agent Consent & Trust',
95
+ description: "A personal agent asking a business's agent over A2A, first as itself, then for a person who delegated some of their permissions.",
96
+ publisher: 'Decagon, Instinct',
97
+ layer: 'consent',
98
+ specUrl: 'https://openpactprotocol.org',
99
+ specVersion: '1.0',
100
+ status: 'shipped',
101
+ connects: "Businesses' agents, asked for a person with their delegation",
102
+ packages: {
103
+ python: ['agent-runtimes'],
104
+ typescript: ['@datalayer/agent-runtimes'],
105
+ },
106
+ protocolTools: ['pact'],
107
+ appspecBlock: 'pact',
108
+ };
109
+ export const PAP_PROTOCOL_0_0_1 = {
110
+ id: 'pap',
111
+ version: '0.0.1',
112
+ name: 'Personal Agent Protocol',
113
+ description: "A person's agent working with a company for them — signed out, then signed in at the company, its changes confirmed by the person — and an application being a company personal agents reach.",
114
+ publisher: 'Sierra, Meta',
115
+ layer: 'consent',
116
+ specUrl: 'https://poppy.md',
117
+ specVersion: 'draft 0.1',
118
+ status: 'shipped',
119
+ connects: "Companies, as a person's agent there, or being one",
120
+ packages: {
121
+ python: ['personal-agent-protocol'],
122
+ typescript: ['@datalayer/personal-agent-protocol'],
123
+ },
124
+ protocolTools: ['pap'],
125
+ appspecBlock: 'pap',
126
+ };
127
+ export const TAP_PROTOCOL_0_0_1 = {
128
+ id: 'tap',
129
+ version: '0.0.1',
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.',
132
+ publisher: 'Visa',
133
+ layer: 'identity',
134
+ specUrl: 'https://developer.visa.com',
135
+ specVersion: 'none yet',
136
+ status: 'planned',
137
+ connects: 'Merchants that recognise an agent by its signature',
138
+ packages: {
139
+ python: [],
140
+ typescript: [],
141
+ },
142
+ protocolTools: [],
143
+ };
144
+ export const UCP_PROTOCOL_0_0_1 = {
145
+ id: 'ucp',
146
+ version: '0.0.1',
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.',
149
+ publisher: 'Google, with Shopify and retailers',
150
+ layer: 'commerce',
151
+ specUrl: 'https://github.com/Universal-Commerce-Protocol/ucp',
152
+ specVersion: '2026-08-25',
153
+ status: 'planned',
154
+ connects: 'Merchants, to search, check out and follow orders',
155
+ packages: {
156
+ python: ['ucp-sdk', 'agent-runtimes'],
157
+ typescript: ['@ucp-js/sdk', '@datalayer/agent-runtimes'],
158
+ },
159
+ protocolTools: ['ucp'],
160
+ };
161
+ export const WEB_BOT_AUTH_PROTOCOL_0_0_1 = {
162
+ id: 'web-bot-auth',
163
+ version: '0.0.1',
164
+ name: 'Web Bot Auth',
165
+ description: 'Signed outbound requests (RFC 9421) and the key directory a website checks them against.',
166
+ publisher: 'Cloudflare (IETF draft)',
167
+ layer: 'identity',
168
+ specUrl: 'https://datatracker.ietf.org/doc/draft-ietf-webbotauth-httpsig-protocol/',
169
+ specVersion: 'draft-ietf-webbotauth-httpsig-protocol-00',
170
+ status: 'shipped',
171
+ connects: "Websites, which can tell the application's requests from someone pretending",
172
+ packages: {
173
+ python: ['agent-runtimes'],
174
+ typescript: ['@datalayer/agent-runtimes', 'web-bot-auth'],
175
+ },
176
+ protocolTools: [],
177
+ };
178
+ export const PROTOCOL_CATALOGUE = {
179
+ a2a: A2A_PROTOCOL_0_0_1,
180
+ a2ui: A2UI_PROTOCOL_0_0_1,
181
+ acp: ACP_PROTOCOL_0_0_1,
182
+ 'ag-ui': AG_UI_PROTOCOL_0_0_1,
183
+ mcp: MCP_PROTOCOL_0_0_1,
184
+ pact: PACT_PROTOCOL_0_0_1,
185
+ pap: PAP_PROTOCOL_0_0_1,
186
+ tap: TAP_PROTOCOL_0_0_1,
187
+ ucp: UCP_PROTOCOL_0_0_1,
188
+ 'web-bot-auth': WEB_BOT_AUTH_PROTOCOL_0_0_1,
189
+ };
190
+ /** A protocol by id. */
191
+ export function getProtocol(protocolId) {
192
+ return PROTOCOL_CATALOGUE[protocolId];
193
+ }
194
+ /** Every protocol of the catalogue. */
195
+ export function listProtocolSpecs() {
196
+ return Object.values(PROTOCOL_CATALOGUE);
197
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * UI Catalog.
3
+ *
4
+ * How an agent's answer becomes an interface: the protocols a host renders.
5
+ *
6
+ * This file is AUTO-GENERATED from YAML specifications.
7
+ * DO NOT EDIT MANUALLY - run 'make specs' to regenerate.
8
+ */
9
+ import type { ComponentSpec, UISpec } from '../types/agentspecs';
10
+ export declare const A2UI_UI_0_0_1: UISpec;
11
+ export declare const MCP_APPS_UI_0_0_1: UISpec;
12
+ export declare const MCP_UI_UI_0_0_1: UISpec;
13
+ export declare const UI_CATALOGUE: Record<string, UISpec>;
14
+ /** The UI an agent spec's `ui` names, or undefined. */
15
+ export declare function getUI(pluginId: string): UISpec | undefined;
16
+ export declare function listUI(): UISpec[];
17
+ /** The visual components the enabled UI specs render, by the name a surface gives them (LOOP C-13). */
18
+ export declare const COMPONENT_CATALOGUE: Record<string, ComponentSpec>;
19
+ /** The component a layout names, or undefined. */
20
+ export declare function getComponent(name: string): ComponentSpec | undefined;
21
+ export declare function listComponents(): ComponentSpec[];
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) 2025-2026 Datalayer, Inc.
3
3
  * Distributed under the terms of the Modified BSD License.
4
4
  */
5
- export const A2UI_UI_PLUGIN_0_0_1 = {
5
+ export const A2UI_UI_0_0_1 = {
6
6
  id: 'a2ui',
7
7
  version: '0.0.1',
8
8
  name: 'A2UI',
@@ -1055,7 +1055,7 @@ export const A2UI_UI_PLUGIN_0_0_1 = {
1055
1055
  },
1056
1056
  ],
1057
1057
  };
1058
- export const MCP_APPS_UI_PLUGIN_0_0_1 = {
1058
+ export const MCP_APPS_UI_0_0_1 = {
1059
1059
  id: 'mcp-apps',
1060
1060
  version: '0.0.1',
1061
1061
  name: 'MCP Apps',
@@ -1065,7 +1065,7 @@ export const MCP_APPS_UI_PLUGIN_0_0_1 = {
1065
1065
  catalog: '',
1066
1066
  components: [],
1067
1067
  };
1068
- export const MCP_UI_UI_PLUGIN_0_0_1 = {
1068
+ export const MCP_UI_UI_0_0_1 = {
1069
1069
  id: 'mcp-ui',
1070
1070
  version: '0.0.1',
1071
1071
  name: 'MCP UI',
@@ -1075,20 +1075,20 @@ export const MCP_UI_UI_PLUGIN_0_0_1 = {
1075
1075
  catalog: '',
1076
1076
  components: [],
1077
1077
  };
1078
- export const UI_PLUGIN_CATALOGUE = {
1079
- a2ui: A2UI_UI_PLUGIN_0_0_1,
1080
- 'mcp-apps': MCP_APPS_UI_PLUGIN_0_0_1,
1081
- 'mcp-ui': MCP_UI_UI_PLUGIN_0_0_1,
1078
+ export const UI_CATALOGUE = {
1079
+ a2ui: A2UI_UI_0_0_1,
1080
+ 'mcp-apps': MCP_APPS_UI_0_0_1,
1081
+ 'mcp-ui': MCP_UI_UI_0_0_1,
1082
1082
  };
1083
- /** The plugin an agent spec's `uiPlugin` names, or undefined. */
1084
- export function getUIPlugin(pluginId) {
1085
- return UI_PLUGIN_CATALOGUE[pluginId];
1083
+ /** The UI an agent spec's `ui` names, or undefined. */
1084
+ export function getUI(pluginId) {
1085
+ return UI_CATALOGUE[pluginId];
1086
1086
  }
1087
- export function listUIPlugins() {
1088
- return Object.values(UI_PLUGIN_CATALOGUE);
1087
+ export function listUI() {
1088
+ return Object.values(UI_CATALOGUE);
1089
1089
  }
1090
- /** The visual components the enabled UI plugins render, by the name a surface gives them (LOOP C-13). */
1091
- export const COMPONENT_CATALOGUE = Object.fromEntries(Object.values(UI_PLUGIN_CATALOGUE)
1090
+ /** The visual components the enabled UI specs render, by the name a surface gives them (LOOP C-13). */
1091
+ export const COMPONENT_CATALOGUE = Object.fromEntries(Object.values(UI_CATALOGUE)
1092
1092
  .filter(plugin => plugin.enabled)
1093
1093
  .flatMap(plugin => plugin.components.map(component => [component.id, component])));
1094
1094
  /** The component a layout names, or undefined. */
@@ -107,10 +107,10 @@ export interface ComponentSpec {
107
107
  }
108
108
  /**
109
109
  * How an agent's answer becomes an interface: a protocol the host renders
110
- * (`agentspecs/ui-plugins`). An agent spec's `uiPlugin` names one.
110
+ * (`agentspecs/ui`). An agent spec's `ui` names one.
111
111
  */
112
- export interface UIPluginSpec {
113
- /** What an agent spec's `uiPlugin` names (e.g. 'a2ui'). */
112
+ export interface UISpec {
113
+ /** What an agent spec's `ui` names (e.g. 'a2ui'). */
114
114
  id: string;
115
115
  version: string;
116
116
  name: string;
@@ -125,6 +125,39 @@ export interface UIPluginSpec {
125
125
  /** The visual components it renders (LOOP C-13). */
126
126
  components: ComponentSpec[];
127
127
  }
128
+ /** The layer of an agent's visit a protocol answers (AGENT_PROTOCOLS §1). */
129
+ export type ProtocolLayer = 'transport' | 'consent' | 'identity' | 'commerce' | 'ui';
130
+ /**
131
+ * An agent protocol Datalayer targets (`agentspecs/protocols`, AGENT_PROTOCOLS
132
+ * PS-01). An agent spec's or an application's `protocols` names the ones it speaks.
133
+ */
134
+ export interface ProtocolSpec {
135
+ /** What `protocols` lists (e.g. 'pap'). */
136
+ id: string;
137
+ version: string;
138
+ name: string;
139
+ description: string;
140
+ /** Who publishes the specification. */
141
+ publisher: string;
142
+ layer: ProtocolLayer;
143
+ /** The specification. */
144
+ specUrl: string;
145
+ /** The version implemented. */
146
+ specVersion: string;
147
+ /** Implemented by agent-runtimes today, or only planned: an application cannot ship a planned one. */
148
+ status: 'shipped' | 'planned';
149
+ /** What it connects an agent to. */
150
+ connects: string;
151
+ /** The packages implementing it, by language. */
152
+ packages: {
153
+ python: string[];
154
+ typescript: string[];
155
+ };
156
+ /** Its tools' action-class tables (`agentspecs/protocol-tools`). */
157
+ protocolTools: string[];
158
+ /** The Appspec block it configures, if any: refused unless `protocols` lists it. */
159
+ appspecBlock?: 'pap' | 'pact' | 'a2a';
160
+ }
128
161
  /** A check a Frame requires of the output of work done under it. */
129
162
  export interface FrameGuardSpec {
130
163
  id: string;
@@ -1082,6 +1115,14 @@ export interface AppSpec {
1082
1115
  /** The documents and datasets it answers from. */
1083
1116
  contents: string[];
1084
1117
  connections: AppConnectionSpec[];
1118
+ /**
1119
+ * The agent protocols it speaks, ids of `agentspecs/protocols` (AGENT_PROTOCOLS
1120
+ * PS-02): its `pap`, `pact` and `a2a` blocks are refused unless their protocol
1121
+ * is listed, and a planned one only while it is not offered.
1122
+ */
1123
+ protocols: string[];
1124
+ /** The UI its answers render in, ids of `agentspecs/ui` (AGENT_PROTOCOLS PS-04). */
1125
+ ui: string[];
1085
1126
  /** Personal Agent Protocol; absent, the application has none. */
1086
1127
  pap?: AppPapSpec;
1087
1128
  /** PACT: the businesses it asks for each person (AGENT_PROTOCOLS PI-01). */
@@ -1208,8 +1249,13 @@ export interface Agentspec {
1208
1249
  delegable?: AgentCapability[];
1209
1250
  /** Communication protocol (e.g., 'ag-ui', 'acp', 'a2a', 'vercel-ai') */
1210
1251
  protocol?: string;
1211
- /** UI plugin (e.g., 'a2ui', 'mcp-apps'), one of the `UI_PLUGIN_CATALOGUE`. */
1212
- uiPlugin?: string;
1252
+ /**
1253
+ * The agent protocols it speaks, ids of `agentspecs/protocols` (AGENT_PROTOCOLS
1254
+ * PS-02). `protocol` says how a page reaches it; this, what it speaks to the world.
1255
+ */
1256
+ protocols?: string[];
1257
+ /** The UI its answers render in (e.g., 'a2ui', 'mcp-apps'), one of the `UI_CATALOGUE`. */
1258
+ ui?: string;
1213
1259
  /** Trigger configuration (type, cron, event source, prompt) */
1214
1260
  trigger?: AgentTriggerConfig;
1215
1261
  /** Model configuration (temperature, max_tokens) */