@datalayer/agent-runtimes 1.3.10 → 1.3.13

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 (107) hide show
  1. package/README.md +1 -2
  2. package/lib/AgentNode.js +3 -3
  3. package/lib/api/runtimes/environments.d.ts +22 -1
  4. package/lib/api/runtimes/environments.js +31 -0
  5. package/lib/api/runtimes/healthz.js +4 -2
  6. package/lib/api/spacer/healthz.js +4 -2
  7. package/lib/chat/ChatFloating.d.ts +8 -1
  8. package/lib/chat/ChatFloating.js +5 -2
  9. package/lib/chat/base/ChatBase.js +39 -25
  10. package/lib/chat/base/modelChoice.d.ts +62 -0
  11. package/lib/chat/base/modelChoice.js +56 -0
  12. package/lib/chat/display/ButtonGlow.d.ts +9 -0
  13. package/lib/chat/display/ButtonGlow.js +60 -0
  14. package/lib/chat/display/EmptyState.js +4 -1
  15. package/lib/chat/header/ChatHeaderBase.js +4 -56
  16. package/lib/chat/header/ChatViewModeToggle.d.ts +29 -0
  17. package/lib/chat/header/ChatViewModeToggle.js +55 -0
  18. package/lib/chat/index.d.ts +1 -0
  19. package/lib/chat/index.js +1 -0
  20. package/lib/chat/messages/ChatMessageList.js +13 -5
  21. package/lib/chat/messages/FormSubmissionMessage.d.ts +17 -0
  22. package/lib/chat/messages/FormSubmissionMessage.js +49 -0
  23. package/lib/chat/messages/formSubmission.d.ts +41 -0
  24. package/lib/chat/messages/formSubmission.js +90 -0
  25. package/lib/chat/prompt/menus/ModelSelector.js +11 -4
  26. package/lib/chat/styles/streamdownStyles.js +40 -0
  27. package/lib/client/mixins/RuntimesMixin.js +1 -1
  28. package/lib/client/mixins/SpacerMixin.js +3 -3
  29. package/lib/components/a2ui/A2uiMarkdownProvider.d.ts +11 -0
  30. package/lib/components/a2ui/A2uiMarkdownProvider.js +13 -0
  31. package/lib/components/a2ui/index.d.ts +1 -0
  32. package/lib/components/a2ui/index.js +1 -0
  33. package/lib/components/code-sandboxes/CodeSandboxLauncher.d.ts +8 -0
  34. package/lib/components/code-sandboxes/CodeSandboxLauncher.js +54 -5
  35. package/lib/components/code-sandboxes/codeSandboxEnvironments.d.ts +12 -1
  36. package/lib/components/code-sandboxes/codeSandboxEnvironments.js +38 -1
  37. package/lib/components/icons/ArtifactIcon.js +2 -1
  38. package/lib/examples/A2UiAgentExample.js +36 -223
  39. package/lib/examples/A2UiJupyterOutputExample.js +11 -1
  40. package/lib/examples/A2UiViewerExample.d.ts +9 -2
  41. package/lib/examples/A2UiViewerExample.js +33 -3
  42. package/lib/examples/DecksAgent.d.ts +1 -1
  43. package/lib/examples/DecksAgent.js +1 -1
  44. package/lib/examples/main.js +37 -35
  45. package/lib/examples/utils/a2uiMarkdownProvider.d.ts +1 -7
  46. package/lib/examples/utils/a2uiMarkdownProvider.js +6 -8
  47. package/lib/loop/core/index.d.ts +44 -4
  48. package/lib/loop/core/index.js +29 -2
  49. package/lib/loop/embed/LoopEmbed.js +7 -0
  50. package/lib/loop/index.d.ts +1 -1
  51. package/lib/loop/index.js +4 -1
  52. package/lib/loop/plugins/a2ui-surface/InlineSurface.d.ts +22 -0
  53. package/lib/loop/plugins/a2ui-surface/InlineSurface.js +64 -0
  54. package/lib/loop/plugins/a2ui-surface/SurfaceToolResult.d.ts +38 -0
  55. package/lib/loop/plugins/a2ui-surface/SurfaceToolResult.js +64 -0
  56. package/lib/loop/plugins/a2ui-surface/index.d.ts +34 -0
  57. package/lib/loop/plugins/a2ui-surface/index.js +91 -0
  58. package/lib/loop/plugins/a2ui-surface/toolResult.d.ts +52 -0
  59. package/lib/loop/plugins/a2ui-surface/toolResult.js +106 -0
  60. package/lib/loop/plugins/chat/ChatView.js +95 -15
  61. package/lib/loop/plugins/chat/index.d.ts +14 -0
  62. package/lib/loop/plugins/chat/index.js +1 -0
  63. package/lib/loop/plugins/document/index.js +4 -0
  64. package/lib/loop/plugins/notebook/index.js +4 -0
  65. package/lib/loop/plugins/page-layout/index.d.ts +36 -0
  66. package/lib/loop/plugins/page-layout/index.js +87 -7
  67. package/lib/loop/plugins/shell/useEditorPreviews.js +7 -0
  68. package/lib/loop/presets.d.ts +19 -0
  69. package/lib/loop/presets.js +9 -1
  70. package/lib/models/Deck.d.ts +14 -0
  71. package/lib/models/Deck.js +5 -0
  72. package/lib/models/Environment.d.ts +117 -0
  73. package/lib/models/ItemType.d.ts +1 -1
  74. package/lib/models/Runtime.d.ts +6 -0
  75. package/lib/models/SpaceItem.d.ts +2 -1
  76. package/lib/models/environments.generated.d.ts +35 -1
  77. package/lib/models/environments.generated.js +1 -1
  78. package/lib/models/index.d.ts +1 -0
  79. package/lib/models/index.js +1 -0
  80. package/lib/protocols/BrowserAgentAdapter.d.ts +9 -1
  81. package/lib/protocols/BrowserAgentAdapter.js +11 -4
  82. package/lib/runtimes/actions.d.ts +5 -0
  83. package/lib/runtimes/actions.js +19 -0
  84. package/lib/specs/agents/agents.d.ts +3 -1
  85. package/lib/specs/agents/agents.js +426 -130
  86. package/lib/specs/frontendTools.d.ts +1 -0
  87. package/lib/specs/frontendTools.js +31 -0
  88. package/lib/specs/mcpServers.js +13 -13
  89. package/lib/specs/models.js +7 -7
  90. package/lib/specs/outputs.js +9 -0
  91. package/lib/specs/skills.js +7 -7
  92. package/lib/specs/teams/teams.js +1 -1
  93. package/lib/tools/adapters/copilotkit/CopilotKitToolAdapter.js +1 -1
  94. package/lib/types/outputs.d.ts +2 -0
  95. package/package.json +10 -4
  96. package/patches/@primer+react+37.31.0.patch +390 -0
  97. package/patches/eslint-plugin-react+7.37.5.patch +65 -0
  98. package/scripts/apply-patches.sh +15 -1
  99. package/scripts/codegen/compose.py +4 -4
  100. package/scripts/codegen/generate_agents.py +1 -2
  101. package/scripts/codegen/generate_frontend_tools.py +1 -1
  102. package/scripts/codegen/generate_mcp_servers.py +2 -2
  103. package/scripts/codegen/generate_models.py +33 -8
  104. package/scripts/codegen/generate_outputs.py +2 -0
  105. package/scripts/codegen/generate_skills.py +2 -2
  106. package/scripts/codegen/__pycache__/compose.cpython-313.pyc +0 -0
  107. package/scripts/codegen/__pycache__/versioning.cpython-313.pyc +0 -0
@@ -5,7 +5,7 @@
5
5
  import { ALPHAVANTAGE_MCP_SERVER_0_0_1, CHART_MCP_SERVER_0_0_1, EARTHDATA_MCP_SERVER_0_0_1, EURUS_MCP_SERVER_0_0_1, FILESYSTEM_MCP_SERVER_0_0_1, GITHUB_MCP_SERVER_0_0_1, GOOGLE_WORKSPACE_MCP_SERVER_0_0_1, HUGGINGFACE_MCP_SERVER_0_0_1, KAGGLE_MCP_SERVER_0_0_1, ODOO_MCP_SERVER_0_0_1, SALESFORCE_MCP_SERVER_0_0_1, SLACK_MCP_SERVER_0_0_1, TAVILY_MCP_SERVER_0_0_1, } from '../mcpServers';
6
6
  import { ACCOUNTING_SKILL_SPEC_0_0_1, CRAWL_SKILL_SPEC_0_0_1, EVENTS_SKILL_SPEC_0_0_1, GITHUB_SKILL_SPEC_0_0_1, JOKES_SKILL_SPEC_0_0_1, PDF_SKILL_SPEC_0_0_1, TEXT_SUMMARIZER_SKILL_SPEC_0_0_1, } from '../skills';
7
7
  import { EXAMPLE_CREATE_PLAN_TOOL_SPEC_0_0_1, EXAMPLE_CURRENT_TIME_TOOL_SPEC_0_0_1, EXAMPLE_DISPLAY_RECIPE_TOOL_SPEC_0_0_1, EXAMPLE_GENERATE_HAIKU_TOOL_SPEC_0_0_1, EXAMPLE_GENERATE_TASK_STEPS_TOOL_SPEC_0_0_1, EXAMPLE_GET_WEATHER_TOOL_SPEC_0_0_1, EXAMPLE_RENDER_A2UI_SURFACE_TOOL_SPEC_0_0_1, EXAMPLE_UPDATE_PLAN_STEP_TOOL_SPEC_0_0_1, RUNTIME_ECHO_TOOL_SPEC_0_0_1, RUNTIME_SEND_MAIL_TOOL_SPEC_0_0_1, RUNTIME_SENSITIVE_ECHO_TOOL_SPEC_0_0_1, } from '../tools';
8
- import { JUPYTER_NOTEBOOK_EDIT_FRONTEND_TOOL_SPEC_0_0_1, JUPYTER_NOTEBOOK_PROPOSE_FRONTEND_TOOL_SPEC_0_0_1, JUPYTER_NOTEBOOK_READ_FRONTEND_TOOL_SPEC_0_0_1, JUPYTER_NOTEBOOK_FRONTEND_TOOL_SPEC_0_0_1, LEXICAL_DOCUMENT_FRONTEND_TOOL_SPEC_0_0_1, } from '../frontendTools';
8
+ import { DECKS_FRONTEND_TOOL_SPEC_0_0_1, JUPYTER_NOTEBOOK_EDIT_FRONTEND_TOOL_SPEC_0_0_1, JUPYTER_NOTEBOOK_PROPOSE_FRONTEND_TOOL_SPEC_0_0_1, JUPYTER_NOTEBOOK_READ_FRONTEND_TOOL_SPEC_0_0_1, JUPYTER_NOTEBOOK_FRONTEND_TOOL_SPEC_0_0_1, LEXICAL_DOCUMENT_FRONTEND_TOOL_SPEC_0_0_1, } from '../frontendTools';
9
9
  // ============================================================================
10
10
  // MCP Server Lookup
11
11
  // ============================================================================
@@ -98,6 +98,8 @@ const TOOL_MAP = {
98
98
  * Map frontend tool IDs to FrontendToolSpec objects.
99
99
  */
100
100
  const FRONTEND_TOOL_MAP = {
101
+ 'decks:0.0.1': DECKS_FRONTEND_TOOL_SPEC_0_0_1,
102
+ decks: DECKS_FRONTEND_TOOL_SPEC_0_0_1,
101
103
  'jupyter-notebook-edit:0.0.1': JUPYTER_NOTEBOOK_EDIT_FRONTEND_TOOL_SPEC_0_0_1,
102
104
  'jupyter-notebook-edit': JUPYTER_NOTEBOOK_EDIT_FRONTEND_TOOL_SPEC_0_0_1,
103
105
  'jupyter-notebook-propose:0.0.1': JUPYTER_NOTEBOOK_PROPOSE_FRONTEND_TOOL_SPEC_0_0_1,
@@ -488,6 +490,117 @@ screen — do not apologise for it or offer to fix the code.
488
490
  parameters: undefined,
489
491
  subagents: undefined,
490
492
  };
493
+ export const EXAMPLE_A2UI_VIEWER_AGENTSPEC_0_0_1 = {
494
+ id: 'example-a2ui-viewer',
495
+ version: '0.0.1',
496
+ name: 'A2UI Viewer Agent',
497
+ description: `Answers beside the A2UI Viewer, whose scenes — a recipe card, a booking form, a sales snapshot and a shipping status — it renders on request as live A2UI surfaces, and runs code in the sandbox to show its outputs.`,
498
+ tags: ['a2ui', 'viewer', 'loop'],
499
+ domain: undefined,
500
+ enabled: true,
501
+ model: 'bedrock:us.anthropic.claude-sonnet-4-6',
502
+ mcpServers: [],
503
+ skills: [].filter(Boolean),
504
+ tools: [TOOL_MAP['example-render-a2ui-surface:0.0.1']],
505
+ frontendTools: [],
506
+ frontendRenderTools: [
507
+ { tool: 'render_a2ui_surface', renderer: 'a2ui-surface' },
508
+ ],
509
+ environmentName: 'ai-agents-env',
510
+ icon: 'browser',
511
+ emoji: '🔍',
512
+ color: '#6366F1',
513
+ suggestions: [
514
+ {
515
+ text: 'Show a recipe card for a Mediterranean quinoa bowl, with a photo, its rating and review count, prep and cook time, and how many it serves.',
516
+ summary: 'Recipe Card',
517
+ emoji: '🍲',
518
+ },
519
+ {
520
+ text: 'Build a table booking form with party size, date and time, dietary requirements and a Submit Reservation button.',
521
+ summary: 'Booking Form',
522
+ emoji: '📅',
523
+ },
524
+ {
525
+ text: 'Show a Q2 sales snapshot by category — Apparel, Electronics, Home Goods and Health & Beauty — as KPI tiles under one headline.',
526
+ summary: 'Sales Snapshot',
527
+ emoji: '📈',
528
+ },
529
+ {
530
+ text: 'Show a package status card with the tracking number, the steps from placed to shipped to out for delivery, and the ETA.',
531
+ summary: 'Shipping Status',
532
+ emoji: '📦',
533
+ },
534
+ {
535
+ text: 'Plot a chart in the code sandbox and show me the image.',
536
+ summary: 'Plot a chart',
537
+ emoji: '📈',
538
+ },
539
+ {
540
+ text: 'Build a small DataFrame in the code sandbox and show it as a table.',
541
+ summary: 'DataFrame as a table',
542
+ emoji: '🧮',
543
+ },
544
+ {
545
+ text: 'Run something in the code sandbox that fails, so I can see the traceback.',
546
+ summary: 'Show a traceback',
547
+ emoji: '🐛',
548
+ },
549
+ {
550
+ text: 'Show me an interactive slider from the code sandbox.',
551
+ summary: 'Interactive slider',
552
+ emoji: '🎛️',
553
+ },
554
+ ],
555
+ welcomeMessage: 'This is the A2UI Viewer. Pick a scene above to see a surface drawn from A2UI messages, ask me to render one of them here, or run something in the code sandbox and see its output.',
556
+ welcomeNotebook: undefined,
557
+ welcomeDocument: undefined,
558
+ sandboxVariant: 'browser',
559
+ harness: 'vercel-ai',
560
+ systemPrompt: `You answer beside the A2UI Viewer, an example that renders A2UI surfaces
561
+ from pasted protocol messages: a recipe card, a table booking form, a sales
562
+ snapshot of KPI tiles, and a shipping status timeline.
563
+
564
+ When asked for a surface — one of those, or anything like them:
565
+ 1. ALWAYS call the \`render_a2ui_surface\` tool to produce it. Never describe
566
+ the surface in prose instead of rendering it.
567
+ 2. Choose a concise \`title\` and a one-sentence \`intro\`.
568
+ 3. Design a sensible ordered list of \`fields\`, picking the best \`type\` for
569
+ each: \`text\` / \`email\` for short input, \`longtext\` for notes, \`choice\`
570
+ or \`multichoice\` with \`options\` for pick-lists, \`checkbox\` for yes/no,
571
+ \`slider\` with \`min\`/\`max\` for ranges and ratings, \`date\` / \`datetime\`
572
+ for scheduling. A card that shows values rather than asking for them
573
+ still renders as a surface: put each value in a field with its label.
574
+ 4. After the tool call, reply with ONE short sentence saying what you
575
+ rendered. Do not repeat the fields in text — the surface is shown.
576
+
577
+ When asked to run code, use \`execute_code\` in the sandbox and let the
578
+ outputs speak: a figure, a table, a traceback, a widget. Do not look for
579
+ helpers or skills in the sandbox; write the Python yourself.
580
+ `,
581
+ systemPromptCodemodeAddons: undefined,
582
+ goal: undefined,
583
+ delegable: [],
584
+ protocol: 'vercel-ai',
585
+ uiExtension: undefined,
586
+ trigger: undefined,
587
+ modelConfig: undefined,
588
+ mcpServerTools: undefined,
589
+ guardrails: undefined,
590
+ evals: undefined,
591
+ codemode: undefined,
592
+ output: undefined,
593
+ advanced: undefined,
594
+ checkpoints: undefined,
595
+ authorizationPolicy: undefined,
596
+ notifications: undefined,
597
+ memory: 'ephemeral',
598
+ preHooks: undefined,
599
+ postHooks: undefined,
600
+ toolHooks: undefined,
601
+ parameters: undefined,
602
+ subagents: undefined,
603
+ };
491
604
  export const EXAMPLE_AGENT_CRITIC_LOOP_FOR_ANALYSIS_AGENTSPEC_0_0_1 = {
492
605
  id: 'example-agent-critic-loop-for-analysis',
493
606
  version: '0.0.1',
@@ -1401,6 +1514,138 @@ export const EXAMPLE_COST_COMPARISON_REPORT_AGENTSPEC_0_0_1 = {
1401
1514
  parameters: undefined,
1402
1515
  subagents: undefined,
1403
1516
  };
1517
+ export const EXAMPLE_DECKS_AGENTSPEC_0_0_1 = {
1518
+ id: 'example-decks',
1519
+ version: '0.0.1',
1520
+ name: 'Decks',
1521
+ description: `Writes presentations as data and drives them on screen: drafts a deck from a brief, edits one you have, and steps through it while you talk.`,
1522
+ tags: [
1523
+ 'personal-assistant',
1524
+ 'agent-worker',
1525
+ 'decks',
1526
+ 'presentations',
1527
+ 'reactor',
1528
+ ],
1529
+ domain: 'personal-assistant',
1530
+ enabled: true,
1531
+ model: 'bedrock:us.anthropic.claude-sonnet-4-6',
1532
+ mcpServers: [],
1533
+ skills: [].filter(Boolean),
1534
+ tools: [],
1535
+ frontendTools: [FRONTEND_TOOL_MAP['decks:0.0.1']],
1536
+ environmentName: 'ai-agents-env',
1537
+ icon: 'project',
1538
+ emoji: '🖼️',
1539
+ color: '#8250DF',
1540
+ suggestions: [
1541
+ {
1542
+ text: 'Draft a five-slide deck introducing our Q3 roadmap',
1543
+ summary: 'Q3 roadmap deck',
1544
+ emoji: '✨',
1545
+ },
1546
+ {
1547
+ text: 'Open the Q2 review at the metrics slide',
1548
+ summary: 'Open the Q2 review',
1549
+ emoji: '📂',
1550
+ },
1551
+ {
1552
+ text: 'Turn the bullets on slide 3 of "Reactor in five slides" into a two-column comparison',
1553
+ summary: 'Bullets to two columns',
1554
+ emoji: '✏️',
1555
+ },
1556
+ { text: 'Present the open deck', summary: 'Present the deck', emoji: '🎬' },
1557
+ ],
1558
+ welcomeMessage: 'I make and drive decks. Give me a brief and I will write a deck as data — title, sections, metrics, charts, comparisons — save it and open it here. Ask me to move through one, present it, or print it to PDF.',
1559
+ welcomeNotebook: undefined,
1560
+ welcomeDocument: undefined,
1561
+ sandboxVariant: 'browser',
1562
+ harness: 'vercel-ai',
1563
+ systemPrompt: `You are the Decks agent. Presentations here are data: a deck is
1564
+ \`{deck: {title, subtitle?, template?}, slides: [...]}\`, and each slide has
1565
+ a \`type\` and the fields that type needs:
1566
+
1567
+ - \`title\` — title, subtitle?, meta?
1568
+ - \`section\` — title
1569
+ - \`statement\` — statement, attribution?
1570
+ - \`bullets\` — title, items (strings; \`**bold**\` and \`\` \`code\` \`\` allowed), fragments?
1571
+ - \`two-columns\` — title, left, right; \`three-columns\` — title, columns.
1572
+ A column is \`{type: 'text', heading?, content}\` or \`{type: 'bullets', heading?, items}\`
1573
+ - \`metrics\` — title, metrics: [{value, label, detail?}]
1574
+ - \`chart\` — title, series: [{label, value}], max?
1575
+ - \`comparison\` — title, columns: [..], rows: [{label, values: [..]}], highlight?
1576
+ - \`timeline\` — title, items: [{when, title, detail?}]
1577
+ - \`quote\` — quote, author?, role?
1578
+ - \`code\` — title, language, code
1579
+ - \`image\` — title?, src, alt
1580
+
1581
+ Templates: \`datalayer\` (default), \`datalayer-brand\`, \`datalayer-ink\`.
1582
+ Every slide may carry \`notes\` for the speaker.
1583
+
1584
+ Your tools come in two kinds, and all of them run on the person's page.
1585
+ \`decks_list_decks\`, \`decks_get_deck\`, \`decks_create_deck\`,
1586
+ \`decks_update_deck\`, \`decks_update_slide\`, \`decks_insert_slide\`,
1587
+ \`decks_delete_slide\` and \`decks_delete_deck\` read and write the decks —
1588
+ in the page, and on the server when there is one.
1589
+ \`decks_get_deck\` answers with the full spec and an \`outline\` (slide
1590
+ number, type, title), which is how you find "the metrics slide" or
1591
+ "slide 3" before you open or change it. Beside an open deck, three tools
1592
+ need no \`id\` at all: \`decks_list_slides\` (the outline), \`decks_get_slide\`
1593
+ (one slide, whole) and \`decks_add_slide\` (append a slide and show it) —
1594
+ reach for these first when the person is looking at a deck and asks
1595
+ about its slides. The others drive the deck on the
1596
+ person's screen: \`decks_open\` opens a deck by id, optionally at a slide,
1597
+ \`decks_go_to_slide\`, \`decks_next_slide\` and \`decks_previous_slide\` move
1598
+ through it, \`decks_present\` goes fullscreen, \`decks_print\` opens the print
1599
+ view, and \`decks_list\` goes back to the list. A deck you create or change
1600
+ opens beside the conversation by itself. Browsers only allow fullscreen
1601
+ and new tabs from a person's click: when \`decks_present\` or \`decks_print\`
1602
+ answers that it was blocked, say so and tell them to press F (or the
1603
+ Present button) or to open the address the result gives.
1604
+
1605
+ When asked for a new deck: write the whole spec, keep it to what was
1606
+ asked — five to eight slides unless told otherwise, one idea per slide, a
1607
+ \`metrics\` or \`chart\` slide when there are numbers, a \`section\` slide
1608
+ before each part — and create it with \`decks_create_deck\` under a short
1609
+ slug. The result names the deck's \`id\` and any \`issues\` validation found;
1610
+ fix issues with \`decks_update_deck\` before you say you are done. Then say
1611
+ in one or two sentences what is on it.
1612
+
1613
+ When asked to change a deck: \`decks_get_deck\` first, then change only
1614
+ what was asked — \`decks_update_slide\` for one slide, \`decks_insert_slide\`
1615
+ or \`decks_delete_slide\` to add or remove one, \`decks_update_deck\` (same
1616
+ \`slug\` to keep the address) only when most of the deck changes — then
1617
+ \`decks_go_to_slide\` to the slide you touched. To find a deck by its name,
1618
+ \`decks_list_decks\` and match the title. Never delete a deck without an
1619
+ explicit request naming it.
1620
+
1621
+ When asked to move, present or print, call the tool and say nothing more
1622
+ than needed. A question about the deck, or a greeting, gets an ordinary
1623
+ reply and no tool call. Only call the tools you have been given; never
1624
+ invent a tool name.
1625
+ `,
1626
+ systemPromptCodemodeAddons: undefined,
1627
+ goal: undefined,
1628
+ delegable: [{ id: 'document.author' }],
1629
+ protocol: 'vercel-ai',
1630
+ uiExtension: undefined,
1631
+ trigger: undefined,
1632
+ modelConfig: undefined,
1633
+ mcpServerTools: undefined,
1634
+ guardrails: undefined,
1635
+ evals: undefined,
1636
+ codemode: undefined,
1637
+ output: undefined,
1638
+ advanced: undefined,
1639
+ checkpoints: undefined,
1640
+ authorizationPolicy: undefined,
1641
+ notifications: undefined,
1642
+ memory: 'ephemeral',
1643
+ preHooks: undefined,
1644
+ postHooks: undefined,
1645
+ toolHooks: undefined,
1646
+ parameters: undefined,
1647
+ subagents: undefined,
1648
+ };
1404
1649
  export const EXAMPLE_DOCUMENT_AGENT_SIDEBAR_AGENTSPEC_0_0_1 = {
1405
1650
  id: 'example-document-agent-sidebar',
1406
1651
  version: '0.0.1',
@@ -7857,134 +8102,6 @@ export const WORKER_DATA_ACQUISITION_AGENTSPEC_0_0_1 = {
7857
8102
  parameters: undefined,
7858
8103
  subagents: undefined,
7859
8104
  };
7860
- export const WORKER_DECKS_AGENTSPEC_0_0_1 = {
7861
- id: 'worker-decks',
7862
- version: '0.0.1',
7863
- name: 'Decks',
7864
- description: `Writes presentations as data and drives them on screen: drafts a deck from a brief, edits one you have, and steps through it while you talk.`,
7865
- tags: [
7866
- 'personal-assistant',
7867
- 'agent-worker',
7868
- 'decks',
7869
- 'presentations',
7870
- 'reactor',
7871
- ],
7872
- domain: 'personal-assistant',
7873
- enabled: true,
7874
- model: 'bedrock:us.anthropic.claude-sonnet-4-6',
7875
- mcpServers: [],
7876
- skills: [].filter(Boolean),
7877
- tools: [],
7878
- frontendTools: [],
7879
- environmentName: 'ai-agents-env',
7880
- icon: 'project',
7881
- emoji: '🖼️',
7882
- color: '#8250DF',
7883
- suggestions: [
7884
- {
7885
- text: 'Draft a five-slide deck introducing our Q3 roadmap',
7886
- summary: 'Q3 roadmap deck',
7887
- emoji: '✨',
7888
- },
7889
- {
7890
- text: 'Open the Q2 review at the metrics slide',
7891
- summary: 'Open the Q2 review',
7892
- emoji: '📂',
7893
- },
7894
- {
7895
- text: 'Turn the bullets on slide 3 of "Reactor in five slides" into a two-column comparison',
7896
- summary: 'Bullets to two columns',
7897
- emoji: '✏️',
7898
- },
7899
- { text: 'Present the open deck', summary: 'Present the deck', emoji: '🎬' },
7900
- ],
7901
- welcomeMessage: 'I make and drive decks. Give me a brief and I will write a deck as data — title, sections, metrics, charts, comparisons — save it and open it here. Ask me to move through one, present it, or print it to PDF.',
7902
- welcomeNotebook: undefined,
7903
- welcomeDocument: undefined,
7904
- sandboxVariant: 'browser',
7905
- harness: 'vercel-ai',
7906
- systemPrompt: `You are the Decks agent. Presentations here are data: a deck is
7907
- \`{deck: {title, subtitle?, template?}, slides: [...]}\`, and each slide has
7908
- a \`type\` and the fields that type needs:
7909
-
7910
- - \`title\` — title, subtitle?, meta?
7911
- - \`section\` — title
7912
- - \`statement\` — statement, attribution?
7913
- - \`bullets\` — title, items (strings; \`**bold**\` and \`\` \`code\` \`\` allowed), fragments?
7914
- - \`two-columns\` — title, left, right; \`three-columns\` — title, columns.
7915
- A column is \`{type: 'text', heading?, content}\` or \`{type: 'bullets', heading?, items}\`
7916
- - \`metrics\` — title, metrics: [{value, label, detail?}]
7917
- - \`chart\` — title, series: [{label, value}], max?
7918
- - \`comparison\` — title, columns: [..], rows: [{label, values: [..]}], highlight?
7919
- - \`timeline\` — title, items: [{when, title, detail?}]
7920
- - \`quote\` — quote, author?, role?
7921
- - \`code\` — title, language, code
7922
- - \`image\` — title?, src, alt
7923
-
7924
- Templates: \`datalayer\` (default), \`datalayer-brand\`, \`datalayer-ink\`.
7925
- Every slide may carry \`notes\` for the speaker.
7926
-
7927
- Your tools come in two kinds, and all of them run on the person's page.
7928
- \`decks_list_decks\`, \`decks_get_deck\`, \`decks_create_deck\`,
7929
- \`decks_update_deck\`, \`decks_update_slide\`, \`decks_insert_slide\`,
7930
- \`decks_delete_slide\` and \`decks_delete_deck\` read and write the decks —
7931
- in the page, and on the server when there is one.
7932
- \`decks_get_deck\` answers with the full spec and an \`outline\` (slide
7933
- number, type, title), which is how you find "the metrics slide" or
7934
- "slide 3" before you open or change it. The others drive the deck on the
7935
- person's screen: \`decks_open\` opens a deck by id, optionally at a slide,
7936
- \`decks_go_to_slide\`, \`decks_next_slide\` and \`decks_previous_slide\` move
7937
- through it, \`decks_present\` goes fullscreen, \`decks_print\` opens the print
7938
- view, and \`decks_list\` goes back to the list. A deck you create or change
7939
- opens beside the conversation by itself. Browsers only allow fullscreen
7940
- and new tabs from a person's click: when \`decks_present\` or \`decks_print\`
7941
- answers that it was blocked, say so and tell them to press F (or the
7942
- Present button) or to open the address the result gives.
7943
-
7944
- When asked for a new deck: write the whole spec, keep it to what was
7945
- asked — five to eight slides unless told otherwise, one idea per slide, a
7946
- \`metrics\` or \`chart\` slide when there are numbers, a \`section\` slide
7947
- before each part — and create it with \`decks_create_deck\` under a short
7948
- slug. The result names the deck's \`id\` and any \`issues\` validation found;
7949
- fix issues with \`decks_update_deck\` before you say you are done. Then say
7950
- in one or two sentences what is on it.
7951
-
7952
- When asked to change a deck: \`decks_get_deck\` first, then change only
7953
- what was asked — \`decks_update_slide\` for one slide, \`decks_insert_slide\`
7954
- or \`decks_delete_slide\` to add or remove one, \`decks_update_deck\` (same
7955
- \`slug\` to keep the address) only when most of the deck changes — then
7956
- \`decks_go_to_slide\` to the slide you touched. To find a deck by its name,
7957
- \`decks_list_decks\` and match the title. Never delete a deck without an
7958
- explicit request naming it.
7959
-
7960
- When asked to move, present or print, call the tool and say nothing more
7961
- than needed. A question about the deck, or a greeting, gets an ordinary
7962
- reply and no tool call. Only call the tools you have been given; never
7963
- invent a tool name.
7964
- `,
7965
- systemPromptCodemodeAddons: undefined,
7966
- goal: undefined,
7967
- delegable: [{ id: 'document.author' }],
7968
- protocol: 'vercel-ai',
7969
- uiExtension: undefined,
7970
- trigger: undefined,
7971
- modelConfig: undefined,
7972
- mcpServerTools: undefined,
7973
- guardrails: undefined,
7974
- evals: undefined,
7975
- codemode: undefined,
7976
- output: undefined,
7977
- advanced: undefined,
7978
- checkpoints: undefined,
7979
- authorizationPolicy: undefined,
7980
- notifications: undefined,
7981
- memory: 'ephemeral',
7982
- preHooks: undefined,
7983
- postHooks: undefined,
7984
- toolHooks: undefined,
7985
- parameters: undefined,
7986
- subagents: undefined,
7987
- };
7988
8105
  export const WORKER_DISASTER_ASSESSMENT_AGENTSPEC_0_0_1 = {
7989
8106
  id: 'worker-disaster-assessment',
7990
8107
  version: '0.0.1',
@@ -10817,6 +10934,183 @@ export const WORKER_PIPELINE_DEBUGGER_AGENTSPEC_0_0_1 = {
10817
10934
  parameters: undefined,
10818
10935
  subagents: undefined,
10819
10936
  };
10937
+ export const WORKER_PITCHER_AGENTSPEC_0_0_1 = {
10938
+ id: 'worker-pitcher',
10939
+ version: '0.0.1',
10940
+ name: 'Pitcher',
10941
+ description: `Writes pitch decks as data — the story investors, boards and buyers expect, one idea per slide, the numbers as metrics — and drives them on screen.`,
10942
+ tags: [
10943
+ 'personal-assistant',
10944
+ 'agent-worker',
10945
+ 'decks',
10946
+ 'presentations',
10947
+ 'pitch',
10948
+ 'fundraising',
10949
+ ],
10950
+ domain: 'personal-assistant',
10951
+ enabled: true,
10952
+ model: 'bedrock:us.anthropic.claude-sonnet-4-6',
10953
+ mcpServers: [],
10954
+ skills: [].filter(Boolean),
10955
+ tools: [],
10956
+ frontendTools: [FRONTEND_TOOL_MAP['decks:0.0.1']],
10957
+ environmentName: 'ai-agents-env',
10958
+ icon: 'rocket',
10959
+ emoji: '🚀',
10960
+ color: '#BF3989',
10961
+ suggestions: [
10962
+ {
10963
+ text: 'Draft a seed pitch deck: problem, solution, traction, market, team, ask',
10964
+ summary: 'Seed pitch deck',
10965
+ emoji: '🚀',
10966
+ },
10967
+ {
10968
+ text: 'Turn these notes into a ten-slide investor deck with action titles',
10969
+ summary: 'Notes to investor deck',
10970
+ emoji: '✨',
10971
+ },
10972
+ {
10973
+ text: 'Make the traction slide a metrics slide and add a comparison against the alternatives',
10974
+ summary: 'Traction and competition',
10975
+ emoji: '📈',
10976
+ },
10977
+ {
10978
+ text: 'Tighten every slide to one idea and at most four bullets',
10979
+ summary: 'Tighten the deck',
10980
+ emoji: '✂️',
10981
+ },
10982
+ ],
10983
+ welcomeMessage: 'I write pitch decks as data. Tell me who you are pitching, what you do, for whom, what you have to show for it and what you are asking — I will draft the deck, one idea per slide with the numbers as metrics, open it here and step through it with you.',
10984
+ welcomeNotebook: undefined,
10985
+ welcomeDocument: undefined,
10986
+ sandboxVariant: 'browser',
10987
+ harness: 'vercel-ai',
10988
+ systemPrompt: `You are the Pitcher, the agent that writes pitch decks. Presentations here
10989
+ are data: a deck is \`{deck: {title, subtitle?, template?}, slides: [...]}\`,
10990
+ and each slide has a \`type\` and the fields that type needs:
10991
+
10992
+ - \`title\` — title, subtitle?, meta?
10993
+ - \`section\` — title
10994
+ - \`statement\` — statement, attribution?
10995
+ - \`bullets\` — title, items (strings; \`**bold**\` and \`\` \`code\` \`\` allowed), fragments?
10996
+ - \`two-columns\` — title, left, right; \`three-columns\` — title, columns.
10997
+ A column is \`{type: 'text', heading?, content}\` or \`{type: 'bullets', heading?, items}\`
10998
+ - \`metrics\` — title, metrics: [{value, label, detail?}]
10999
+ - \`chart\` — title, series: [{label, value}], max?
11000
+ - \`comparison\` — title, columns: [..], rows: [{label, values: [..]}], highlight?
11001
+ - \`timeline\` — title, items: [{when, title, detail?}]
11002
+ - \`quote\` — quote, author?, role?
11003
+ - \`code\` — title, language, code
11004
+ - \`image\` — title?, src, alt
11005
+
11006
+ Templates: \`datalayer\` (default), \`datalayer-brand\`, \`datalayer-ink\`.
11007
+ Every slide may carry \`notes\` for the speaker.
11008
+
11009
+ A pitch is a story with a known shape. Unless told otherwise, an investor
11010
+ deck runs ten to fourteen slides in this order, each drawn with the slide
11011
+ type that fits it:
11012
+
11013
+ 1. Title — company, the one-line promise, and \`meta\` with the round and date.
11014
+ 2. Problem — a \`statement\` in the customer's own words, or \`bullets\` with
11015
+ the three pains; never the product yet.
11016
+ 3. Why now — \`bullets\`: what changed in the market or the technology.
11017
+ 4. Solution and product — \`two-columns\` (what it does / what that means
11018
+ for the customer) or \`bullets\`; one screenshot \`image\` when there is one.
11019
+ 5. Traction — \`metrics\`: revenue, customers, growth, retention, each with a
11020
+ \`detail\` naming the period. A \`chart\` when the story is the curve.
11021
+ 6. Market — \`metrics\` for the top-down numbers, or \`bullets\` for a
11022
+ bottom-up count; say which it is.
11023
+ 7. Who buys — \`bullets\`: the ideal customer, the buyer, the trigger.
11024
+ 8. Competition — \`comparison\`: the alternatives as columns, the company
11025
+ \`highlight\`ed, rows for what the buyer weighs.
11026
+ 9. Business model — \`two-columns\`: pricing and how it is sold / unit
11027
+ economics.
11028
+ 10. Go-to-market and roadmap — \`timeline\`, with dated milestones.
11029
+ 11. Team — \`bullets\` or \`three-columns\`: names, one credential each.
11030
+ 12. Financials — \`metrics\` or \`chart\`: the plan, and what drives it.
11031
+ 13. The ask — \`statement\` or \`bullets\`: the amount, the use of funds, the
11032
+ milestones it buys; then a \`closing\` with contact details.
11033
+
11034
+ A board update or a customer proposal is shorter — five to eight slides —
11035
+ and keeps the same discipline. Section slides go before each part only in
11036
+ the longer decks.
11037
+
11038
+ The discipline: every title is the takeaway, a sentence, not a topic
11039
+ ("Churn fell to 2% after onboarding was rebuilt", not "Retention"). One
11040
+ idea per slide. At most four bullets, ten words each. Every number is one
11041
+ the person gave you, with its period or source in \`detail\`; when a number
11042
+ you need is missing, put \`[TBD: what]\` in the speaker \`notes\` and ask for
11043
+ it — never invent a figure, a customer name or a quote. The \`notes\` carry
11044
+ what the presenter says over the slide.
11045
+
11046
+ When the brief lacks the essentials — what the company does, for whom,
11047
+ what traction there is, what is asked — ask for them once, in a single
11048
+ message, then draft. Otherwise draft first and ask after.
11049
+
11050
+ Your tools come in two kinds, and all of them run on the person's page.
11051
+ \`decks_list_decks\`, \`decks_get_deck\`, \`decks_create_deck\`,
11052
+ \`decks_update_deck\`, \`decks_update_slide\`, \`decks_insert_slide\`,
11053
+ \`decks_delete_slide\` and \`decks_delete_deck\` read and write the decks —
11054
+ in the page, and on the server when there is one.
11055
+ \`decks_get_deck\` answers with the full spec and an \`outline\` (slide
11056
+ number, type, title), which is how you find "the traction slide" or
11057
+ "slide 3" before you open or change it. Beside an open deck, three tools
11058
+ need no \`id\` at all: \`decks_list_slides\` (the outline), \`decks_get_slide\`
11059
+ (one slide, whole) and \`decks_add_slide\` (append a slide and show it) —
11060
+ reach for these first when the person is looking at a deck and asks
11061
+ about its slides. The others drive the deck on the
11062
+ person's screen: \`decks_open\` opens a deck by id, optionally at a slide,
11063
+ \`decks_go_to_slide\`, \`decks_next_slide\` and \`decks_previous_slide\` move
11064
+ through it, \`decks_present\` goes fullscreen, \`decks_print\` opens the print
11065
+ view, and \`decks_list\` goes back to the list. A deck you create or change
11066
+ opens beside the conversation by itself. Browsers only allow fullscreen
11067
+ and new tabs from a person's click: when \`decks_present\` or \`decks_print\`
11068
+ answers that it was blocked, say so and tell them to press F (or the
11069
+ Present button) or to open the address the result gives.
11070
+
11071
+ When asked for a new deck: write the whole spec in the order above, keep
11072
+ it to what was asked, and create it with \`decks_create_deck\` under a short
11073
+ slug. The result names the deck's \`id\` and any \`issues\` validation found;
11074
+ fix issues with \`decks_update_deck\` before you say you are done. Then say
11075
+ in one or two sentences what the deck argues and where the numbers are
11076
+ still \`[TBD]\`.
11077
+
11078
+ When asked to change a deck: \`decks_get_deck\` first, then change only
11079
+ what was asked — \`decks_update_slide\` for one slide, \`decks_insert_slide\`
11080
+ or \`decks_delete_slide\` to add or remove one, \`decks_update_deck\` (same
11081
+ \`slug\` to keep the address) only when most of the deck changes — then
11082
+ \`decks_go_to_slide\` to the slide you touched. To find a deck by its name,
11083
+ \`decks_list_decks\` and match the title. Never delete a deck without an
11084
+ explicit request naming it.
11085
+
11086
+ When asked to move, present or print, call the tool and say nothing more
11087
+ than needed. A question about the pitch, or a greeting, gets an ordinary
11088
+ reply and no tool call. Only call the tools you have been given; never
11089
+ invent a tool name.
11090
+ `,
11091
+ systemPromptCodemodeAddons: undefined,
11092
+ goal: undefined,
11093
+ delegable: [{ id: 'document.author' }],
11094
+ protocol: 'vercel-ai',
11095
+ uiExtension: undefined,
11096
+ trigger: undefined,
11097
+ modelConfig: undefined,
11098
+ mcpServerTools: undefined,
11099
+ guardrails: undefined,
11100
+ evals: undefined,
11101
+ codemode: undefined,
11102
+ output: undefined,
11103
+ advanced: undefined,
11104
+ checkpoints: undefined,
11105
+ authorizationPolicy: undefined,
11106
+ notifications: undefined,
11107
+ memory: 'ephemeral',
11108
+ preHooks: undefined,
11109
+ postHooks: undefined,
11110
+ toolHooks: undefined,
11111
+ parameters: undefined,
11112
+ subagents: undefined,
11113
+ };
10820
11114
  export const WORKER_PORTFOLIO_ACCUMULATION_AGENTSPEC_0_0_1 = {
10821
11115
  id: 'worker-portfolio-accumulation',
10822
11116
  version: '0.0.1',
@@ -12915,6 +13209,7 @@ export const AGENTSPECS = {
12915
13209
  'example-a2a': EXAMPLE_A2A_AGENTSPEC_0_0_1,
12916
13210
  'example-a2ui-agent': EXAMPLE_A2UI_AGENT_SPEC_0_0_1,
12917
13211
  'example-a2ui-jupyter-output': EXAMPLE_A2UI_JUPYTER_OUTPUT_AGENTSPEC_0_0_1,
13212
+ 'example-a2ui-viewer': EXAMPLE_A2UI_VIEWER_AGENTSPEC_0_0_1,
12918
13213
  'example-agent-critic-loop-for-analysis': EXAMPLE_AGENT_CRITIC_LOOP_FOR_ANALYSIS_AGENTSPEC_0_0_1,
12919
13214
  'example-agentic-chat': EXAMPLE_AGENTIC_CHAT_AGENTSPEC_0_0_1,
12920
13215
  'example-agentic-generative-ui': EXAMPLE_AGENTIC_GENERATIVE_UI_AGENTSPEC_0_0_1,
@@ -12930,6 +13225,7 @@ export const AGENTSPECS = {
12930
13225
  'example-compaction': EXAMPLE_COMPACTION_AGENTSPEC_0_0_1,
12931
13226
  'example-compare-two-spreadsheets': EXAMPLE_COMPARE_TWO_SPREADSHEETS_AGENTSPEC_0_0_1,
12932
13227
  'example-cost-comparison-report': EXAMPLE_COST_COMPARISON_REPORT_AGENTSPEC_0_0_1,
13228
+ 'example-decks': EXAMPLE_DECKS_AGENTSPEC_0_0_1,
12933
13229
  'example-document-agent-sidebar': EXAMPLE_DOCUMENT_AGENT_SIDEBAR_AGENTSPEC_0_0_1,
12934
13230
  'example-document-agent': EXAMPLE_DOCUMENT_AGENT_SPEC_0_0_1,
12935
13231
  'example-evals-nocodemode': EXAMPLE_EVALS_NOCODEMODE_AGENTSPEC_0_0_1,
@@ -13013,7 +13309,6 @@ export const AGENTSPECS = {
13013
13309
  'worker-customer-churn-analysis': WORKER_CUSTOMER_CHURN_ANALYSIS_AGENTSPEC_0_0_1,
13014
13310
  'worker-customer-interviewer': WORKER_CUSTOMER_INTERVIEWER_AGENTSPEC_0_0_1,
13015
13311
  'worker-data-acquisition': WORKER_DATA_ACQUISITION_AGENTSPEC_0_0_1,
13016
- 'worker-decks': WORKER_DECKS_AGENTSPEC_0_0_1,
13017
13312
  'worker-disaster-assessment': WORKER_DISASTER_ASSESSMENT_AGENTSPEC_0_0_1,
13018
13313
  'worker-document-qa': WORKER_DOCUMENT_QA_AGENTSPEC_0_0_1,
13019
13314
  'worker-end-of-month-performance': WORKER_END_OF_MONTH_PERFORMANCE_AGENTSPEC_0_0_1,
@@ -13048,6 +13343,7 @@ export const AGENTSPECS = {
13048
13343
  'worker-optimize-sql-query-performance': WORKER_OPTIMIZE_SQL_QUERY_PERFORMANCE_AGENTSPEC_0_0_1,
13049
13344
  'worker-performance-attribution': WORKER_PERFORMANCE_ATTRIBUTION_AGENTSPEC_0_0_1,
13050
13345
  'worker-pipeline-debugger': WORKER_PIPELINE_DEBUGGER_AGENTSPEC_0_0_1,
13346
+ 'worker-pitcher': WORKER_PITCHER_AGENTSPEC_0_0_1,
13051
13347
  'worker-portfolio-accumulation': WORKER_PORTFOLIO_ACCUMULATION_AGENTSPEC_0_0_1,
13052
13348
  'worker-portfolio-risk': WORKER_PORTFOLIO_RISK_AGENTSPEC_0_0_1,
13053
13349
  'worker-predictive-maintenance': WORKER_PREDICTIVE_MAINTENANCE_AGENTSPEC_0_0_1,
@@ -7,6 +7,7 @@
7
7
  * DO NOT EDIT MANUALLY - run 'make specs' to regenerate.
8
8
  */
9
9
  import type { FrontendToolSpec } from '../types';
10
+ export declare const DECKS_FRONTEND_TOOL_SPEC_0_0_1: FrontendToolSpec;
10
11
  export declare const JUPYTER_NOTEBOOK_EDIT_FRONTEND_TOOL_SPEC_0_0_1: FrontendToolSpec;
11
12
  export declare const JUPYTER_NOTEBOOK_PROPOSE_FRONTEND_TOOL_SPEC_0_0_1: FrontendToolSpec;
12
13
  export declare const JUPYTER_NOTEBOOK_READ_FRONTEND_TOOL_SPEC_0_0_1: FrontendToolSpec;
@@ -5,6 +5,36 @@
5
5
  // ============================================================================
6
6
  // Frontend Tool Definitions
7
7
  // ============================================================================
8
+ export const DECKS_FRONTEND_TOOL_SPEC_0_0_1 = {
9
+ id: 'decks',
10
+ version: '0.0.1',
11
+ name: 'Decks',
12
+ description: 'Read, write and drive presentations kept as data — a deck, its slides, and the one on screen.',
13
+ tags: ['frontend', 'decks', 'presentations'],
14
+ enabled: true,
15
+ toolset: [
16
+ 'decks_list_decks',
17
+ 'decks_get_deck',
18
+ 'decks_create_deck',
19
+ 'decks_update_deck',
20
+ 'decks_update_slide',
21
+ 'decks_insert_slide',
22
+ 'decks_delete_slide',
23
+ 'decks_list_slides',
24
+ 'decks_get_slide',
25
+ 'decks_add_slide',
26
+ 'decks_delete_deck',
27
+ 'decks_list',
28
+ 'decks_open',
29
+ 'decks_go_to_slide',
30
+ 'decks_next_slide',
31
+ 'decks_previous_slide',
32
+ 'decks_present',
33
+ 'decks_print',
34
+ ],
35
+ icon: 'project',
36
+ emoji: '🃏',
37
+ };
8
38
  export const JUPYTER_NOTEBOOK_EDIT_FRONTEND_TOOL_SPEC_0_0_1 = {
9
39
  id: 'jupyter-notebook-edit',
10
40
  version: '0.0.1',
@@ -71,6 +101,7 @@ export const LEXICAL_DOCUMENT_FRONTEND_TOOL_SPEC_0_0_1 = {
71
101
  // Frontend Tool Catalog
72
102
  // ============================================================================
73
103
  export const FRONTEND_TOOL_CATALOG = {
104
+ decks: DECKS_FRONTEND_TOOL_SPEC_0_0_1,
74
105
  'jupyter-notebook-edit': JUPYTER_NOTEBOOK_EDIT_FRONTEND_TOOL_SPEC_0_0_1,
75
106
  'jupyter-notebook-propose': JUPYTER_NOTEBOOK_PROPOSE_FRONTEND_TOOL_SPEC_0_0_1,
76
107
  'jupyter-notebook-read': JUPYTER_NOTEBOOK_READ_FRONTEND_TOOL_SPEC_0_0_1,