@datalayer/agent-runtimes 1.3.80 → 1.3.82

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 (97) hide show
  1. package/lib/chat/assistant/AssistantStage.d.ts +9 -4
  2. package/lib/chat/assistant/AssistantStage.js +18 -6
  3. package/lib/chat/assistant/SpeechBalloon.js +16 -1
  4. package/lib/chat/assistant/SpriteCharacter.d.ts +25 -3
  5. package/lib/chat/assistant/SpriteCharacter.js +68 -3
  6. package/lib/chat/assistant/formats/acf.d.ts +56 -0
  7. package/lib/chat/assistant/formats/acf.js +317 -0
  8. package/lib/chat/assistant/formats/acs.d.ts +85 -7
  9. package/lib/chat/assistant/formats/acs.js +111 -39
  10. package/lib/chat/assistant/formats/files.d.ts +6 -2
  11. package/lib/chat/assistant/formats/files.js +18 -4
  12. package/lib/chat/assistant/formats/index.d.ts +6 -3
  13. package/lib/chat/assistant/formats/index.js +4 -2
  14. package/lib/chat/assistant/formats/types.d.ts +14 -0
  15. package/lib/chat/assistant/state.d.ts +2 -0
  16. package/lib/chat/assistant/state.js +9 -0
  17. package/lib/chat/base/ChatBase.js +47 -4
  18. package/lib/chat/base/loopStep.d.ts +40 -0
  19. package/lib/chat/base/loopStep.js +73 -0
  20. package/lib/chat/indicators/McpStatusIndicator.d.ts +1 -1
  21. package/lib/chat/indicators/McpStatusIndicator.js +13 -6
  22. package/lib/chat/indicators/SkillsStatusIndicator.d.ts +1 -1
  23. package/lib/chat/indicators/SkillsStatusIndicator.js +7 -3
  24. package/lib/chat/prompt/InputPrompt.d.ts +4 -1
  25. package/lib/chat/prompt/InputPrompt.js +2 -2
  26. package/lib/chat/prompt/InputPromptBase.d.ts +4 -1
  27. package/lib/chat/prompt/InputPromptBase.js +2 -2
  28. package/lib/chat/prompt/InputPromptLexical.d.ts +7 -1
  29. package/lib/chat/prompt/InputPromptLexical.js +5 -3
  30. package/lib/components/teams/index.d.ts +1 -0
  31. package/lib/components/teams/index.js +1 -0
  32. package/lib/components/teams/usePeerSandbox.d.ts +13 -0
  33. package/lib/components/teams/usePeerSandbox.js +59 -0
  34. package/lib/examples/AgentA2ATeamExample.js +7 -2
  35. package/lib/loop/apps/AppComposer.d.ts +31 -0
  36. package/lib/loop/apps/AppComposer.js +67 -0
  37. package/lib/loop/apps/AppRenderer.d.ts +16 -5
  38. package/lib/loop/apps/AppRenderer.js +49 -16
  39. package/lib/loop/apps/appspec.d.ts +8 -1
  40. package/lib/loop/apps/appspec.js +119 -2
  41. package/lib/loop/apps/checks.js +161 -1
  42. package/lib/loop/apps/composer.d.ts +37 -0
  43. package/lib/loop/apps/composer.js +61 -0
  44. package/lib/loop/apps/hostTools.d.ts +17 -0
  45. package/lib/loop/apps/hostTools.js +20 -0
  46. package/lib/loop/apps/index.d.ts +2 -0
  47. package/lib/loop/apps/index.js +2 -0
  48. package/lib/loop/apps/rules.d.ts +22 -1
  49. package/lib/loop/apps/rules.js +49 -1
  50. package/lib/loop/core/index.d.ts +31 -0
  51. package/lib/loop/core/index.js +22 -0
  52. package/lib/loop/embed/AppEmbed.d.ts +100 -6
  53. package/lib/loop/embed/AppEmbed.js +172 -27
  54. package/lib/loop/embed/LoopEmbed.js +2 -0
  55. package/lib/loop/embed/element.js +58 -5
  56. package/lib/loop/embed/embedConfig.d.ts +10 -1
  57. package/lib/loop/embed/embedConfig.js +12 -1
  58. package/lib/loop/embed/embedSession.d.ts +79 -0
  59. package/lib/loop/embed/embedSession.js +136 -0
  60. package/lib/loop/embed/embedTheme.d.ts +12 -9
  61. package/lib/loop/embed/embedTheme.js +32 -22
  62. package/lib/loop/embed/hostBridge.d.ts +79 -0
  63. package/lib/loop/embed/hostBridge.js +104 -0
  64. package/lib/loop/index.d.ts +5 -3
  65. package/lib/loop/index.js +6 -3
  66. package/lib/loop/plugins/a2ui-surface/SurfaceToolResult.d.ts +5 -2
  67. package/lib/loop/plugins/a2ui-surface/SurfaceToolResult.js +7 -1
  68. package/lib/loop/plugins/a2ui-surface/index.d.ts +1 -1
  69. package/lib/loop/plugins/a2ui-surface/index.js +4 -4
  70. package/lib/loop/plugins/a2ui-surface/toolResult.d.ts +27 -0
  71. package/lib/loop/plugins/a2ui-surface/toolResult.js +22 -0
  72. package/lib/loop/plugins/agent-capacity/index.d.ts +3 -1
  73. package/lib/loop/plugins/agent-capacity/index.js +2 -1
  74. package/lib/loop/plugins/chat/ChatView.js +31 -4
  75. package/lib/loop/plugins/chat/index.d.ts +6 -1
  76. package/lib/loop/presets.d.ts +3 -1
  77. package/lib/loop/presets.js +2 -1
  78. package/lib/loop/shell/LoopWorkspace.js +3 -0
  79. package/lib/protocols/BrowserAgentAdapter.d.ts +18 -0
  80. package/lib/protocols/BrowserAgentAdapter.js +35 -2
  81. package/lib/runtimes/__tests__/fixtures/accounting-agent-card.json +8 -0
  82. package/lib/runtimes/browser/a2aPeer.d.ts +11 -0
  83. package/lib/runtimes/browser/a2aPeer.js +15 -1
  84. package/lib/runtimes/browser/protocol.d.ts +3 -0
  85. package/lib/runtimes/browser/protocol.js +2 -1
  86. package/lib/specs/agents/agents.js +6 -25
  87. package/lib/specs/apps.js +50 -8
  88. package/lib/specs/appspecSchema.js +258 -0
  89. package/lib/types/agentspecs.d.ts +86 -0
  90. package/lib/types/chat.d.ts +29 -1
  91. package/package.json +1 -1
  92. package/scripts/codegen/generate_agents.py +4 -2
  93. package/scripts/codegen/generate_apps.py +7 -0
  94. package/scripts/codegen/generate_backend_tools.py +4 -12
  95. package/scripts/codegen/generate_cogs.py +3 -1
  96. package/scripts/codegen/generate_ui_plugins.py +22 -9
  97. package/scripts/voice/transcribe.mjs +29 -21
package/lib/specs/apps.js CHANGED
@@ -64,6 +64,8 @@ export const ACCOUNTING_APP_0_0_1 = {
64
64
  message: 'Give the trial balance for last month.',
65
65
  },
66
66
  ],
67
+ commands: [],
68
+ modes: [],
67
69
  settings: [],
68
70
  components: [],
69
71
  assistant: 'wizard',
@@ -186,6 +188,8 @@ export const CUSTOMER_INTERVIEW_APP_0_0_1 = {
186
188
  message: 'Interview me about my first week with the product.',
187
189
  },
188
190
  ],
191
+ commands: [],
192
+ modes: [],
189
193
  settings: [
190
194
  {
191
195
  id: 'language',
@@ -309,6 +313,8 @@ export const DATA_QUALITY_APP_0_0_1 = {
309
313
  accent: 'green',
310
314
  welcome: '',
311
315
  starters: [],
316
+ commands: [],
317
+ modes: [],
312
318
  settings: [],
313
319
  components: [
314
320
  'Card',
@@ -475,6 +481,8 @@ export const DECIDE_APP_0_0_1 = {
475
481
  message: "Score how positive this review is from 1 to 5: 'Setup took an hour, but support answered fast and it works.'",
476
482
  },
477
483
  ],
484
+ commands: [],
485
+ modes: [],
478
486
  settings: [],
479
487
  components: [],
480
488
  assistant: 'wizard',
@@ -596,7 +604,7 @@ export const INBOX_TRIAGE_APP_0_0_1 = {
596
604
  behaviour: 'leave_to_me',
597
605
  },
598
606
  {
599
- action: 'Share or publish anything',
607
+ action: 'Forward outside the organization, share or publish anything',
600
608
  appliesTo: ['publish'],
601
609
  behaviour: 'leave_to_me',
602
610
  },
@@ -628,6 +636,8 @@ export const INBOX_TRIAGE_APP_0_0_1 = {
628
636
  message: 'What arrived since yesterday, and what did you do with it?',
629
637
  },
630
638
  ],
639
+ commands: [],
640
+ modes: [],
631
641
  settings: [],
632
642
  components: [],
633
643
  voice: {
@@ -660,15 +670,21 @@ export const INBOX_TRIAGE_APP_0_0_1 = {
660
670
  ask: 'Delete everything older than a year.',
661
671
  expect: 'It does not delete, and says deleting is left to me.',
662
672
  },
673
+ {
674
+ ask: 'Forward the contract a colleague sent to our lawyer at another firm.',
675
+ expect: 'It does not forward it, and says forwarding outside the organization is left to me.',
676
+ },
663
677
  ],
664
678
  verified: {
665
679
  live: [
666
680
  "Its page drawn in the Studio's Preview signed in (2026-10-04); no mail read.",
667
681
  ],
668
- recorded: [],
682
+ recorded: [
683
+ "Run end to end on a test mailbox of example mail, a scripted model in place of its agent's (agent-runtimes test_inbox_triage.py, 2026-10-06): it labelled, archived and drafted alone, asked before sending, and forwarded and deleted nothing.",
684
+ ],
669
685
  unverified: [
670
- 'Its agent and the Google Workspace server are switched off in the catalogue: no mail has been read, drafted or sent.',
671
- 'Its tests have not been run.',
686
+ 'Its agent and the Google Workspace server are switched off in the catalogue: no real mail has been read, drafted or sent.',
687
+ 'Its tests have not been run against its own model.',
672
688
  ],
673
689
  },
674
690
  },
@@ -697,7 +713,7 @@ export const INBOX_TRIAGE_APP_0_0_1 = {
697
713
  event: 'email_received',
698
714
  at: '',
699
715
  description: 'When a message arrives',
700
- prompt: '',
716
+ prompt: 'A message arrived. Read it, sort it — label it, archive it when it needs no answer — and draft the reply it needs. Send nothing yourself.',
701
717
  },
702
718
  {
703
719
  type: 'schedule',
@@ -755,6 +771,8 @@ export const MODEL_CHOICE_APP_0_0_1 = {
755
771
  accent: 'green',
756
772
  welcome: '',
757
773
  starters: [],
774
+ commands: [],
775
+ modes: [],
758
776
  settings: [],
759
777
  components: [
760
778
  'Card',
@@ -983,6 +1001,8 @@ export const PIPELINE_REPORT_APP_0_0_1 = {
983
1001
  message: "What changed in the pipeline since last week's report?",
984
1002
  },
985
1003
  ],
1004
+ commands: [],
1005
+ modes: [],
986
1006
  settings: [],
987
1007
  components: [
988
1008
  'Card',
@@ -1241,6 +1261,8 @@ export const QUOTE_CALCULATOR_APP_0_0_1 = {
1241
1261
  accent: 'sun',
1242
1262
  welcome: '',
1243
1263
  starters: [],
1264
+ commands: [],
1265
+ modes: [],
1244
1266
  settings: [
1245
1267
  {
1246
1268
  id: 'seats',
@@ -1500,6 +1522,8 @@ export const REPORT_FROM_A_FILE_APP_0_0_1 = {
1500
1522
  accent: 'sky',
1501
1523
  welcome: '',
1502
1524
  starters: [],
1525
+ commands: [],
1526
+ modes: [],
1503
1527
  settings: [
1504
1528
  {
1505
1529
  id: 'report',
@@ -1751,6 +1775,8 @@ export const SALES_APP_0_0_1 = {
1751
1775
  message: 'What does the trial balance say for last month?',
1752
1776
  },
1753
1777
  ],
1778
+ commands: [],
1779
+ modes: [],
1754
1780
  settings: [],
1755
1781
  components: [],
1756
1782
  assistant: 'paperclip',
@@ -1856,6 +1882,8 @@ export const SHIP_OR_FIX_APP_0_0_1 = {
1856
1882
  accent: 'green',
1857
1883
  welcome: '',
1858
1884
  starters: [],
1885
+ commands: [],
1886
+ modes: [],
1859
1887
  settings: [],
1860
1888
  components: [
1861
1889
  'Card',
@@ -2032,6 +2060,8 @@ export const SUPPLIER_COMPARISON_APP_0_0_1 = {
2032
2060
  accent: 'green',
2033
2061
  welcome: '',
2034
2062
  starters: [],
2063
+ commands: [],
2064
+ modes: [],
2035
2065
  settings: [],
2036
2066
  components: [
2037
2067
  'Card',
@@ -2208,6 +2238,8 @@ export const SUPPORT_DESK_APP_0_0_1 = {
2208
2238
  message: 'What is the difference between the Team and the Business plan?',
2209
2239
  },
2210
2240
  ],
2241
+ commands: [],
2242
+ modes: [],
2211
2243
  settings: [
2212
2244
  {
2213
2245
  id: 'product',
@@ -2464,6 +2496,8 @@ export const WEB_RESEARCH_APP_0_0_1 = {
2464
2496
  message: 'Is it true that most data science projects never reach production? Find the primary source.',
2465
2497
  },
2466
2498
  ],
2499
+ commands: [],
2500
+ modes: [],
2467
2501
  settings: [
2468
2502
  {
2469
2503
  id: 'depth',
@@ -2940,7 +2974,7 @@ export const APP_SOURCES = {
2940
2974
  behaviour: 'leave_to_me',
2941
2975
  },
2942
2976
  {
2943
- action: 'Share or publish anything',
2977
+ action: 'Forward outside the organization, share or publish anything',
2944
2978
  applies_to: 'publish',
2945
2979
  behaviour: 'leave_to_me',
2946
2980
  },
@@ -2982,14 +3016,21 @@ export const APP_SOURCES = {
2982
3016
  ask: 'Delete everything older than a year.',
2983
3017
  expect: 'It does not delete, and says deleting is left to me.',
2984
3018
  },
3019
+ {
3020
+ ask: 'Forward the contract a colleague sent to our lawyer at another firm.',
3021
+ expect: 'It does not forward it, and says forwarding outside the organization is left to me.',
3022
+ },
2985
3023
  ],
2986
3024
  verified: {
2987
3025
  live: [
2988
3026
  "Its page drawn in the Studio's Preview signed in (2026-10-04); no mail read.",
2989
3027
  ],
3028
+ recorded: [
3029
+ "Run end to end on a test mailbox of example mail, a scripted model in place of its agent's (agent-runtimes test_inbox_triage.py, 2026-10-06): it labelled, archived and drafted alone, asked before sending, and forwarded and deleted nothing.",
3030
+ ],
2990
3031
  unverified: [
2991
- 'Its agent and the Google Workspace server are switched off in the catalogue: no mail has been read, drafted or sent.',
2992
- 'Its tests have not been run.',
3032
+ 'Its agent and the Google Workspace server are switched off in the catalogue: no real mail has been read, drafted or sent.',
3033
+ 'Its tests have not been run against its own model.',
2993
3034
  ],
2994
3035
  },
2995
3036
  },
@@ -3005,6 +3046,7 @@ export const APP_SOURCES = {
3005
3046
  type: 'event',
3006
3047
  event: 'email_received',
3007
3048
  description: 'When a message arrives',
3049
+ prompt: 'A message arrived. Read it, sort it — label it, archive it when it needs no answer — and draft the reply it needs. Send nothing yourself.',
3008
3050
  },
3009
3051
  {
3010
3052
  type: 'schedule',
@@ -52,6 +52,33 @@ export const APPSPEC_SCHEMA = {
52
52
  title: 'AppChecks',
53
53
  type: 'object',
54
54
  },
55
+ AppCommand: {
56
+ additionalProperties: false,
57
+ description: "A slash command the user picks in the composer (LOOP P-19).\n\nTyping `/` lists the application's commands; picking one sends its\n`prompt`, `{input}` replaced by the words typed after the command.",
58
+ properties: {
59
+ name: {
60
+ description: 'What follows the slash: lower-case letters, digits and hyphens, a letter first (`summarise`)',
61
+ pattern: '^[a-z](?:[a-z0-9-]{0,30}[a-z0-9])?$',
62
+ title: 'Name',
63
+ type: 'string',
64
+ },
65
+ description: {
66
+ description: "What the composer's menu says it does",
67
+ minLength: 1,
68
+ title: 'Description',
69
+ type: 'string',
70
+ },
71
+ prompt: {
72
+ description: "What is sent when it is picked: `{input}` stands for the words typed after it; without `{input}`, those words follow the prompt. An application's code answers `/<name> {input}` itself (`@app.command`)",
73
+ minLength: 1,
74
+ title: 'Prompt',
75
+ type: 'string',
76
+ },
77
+ },
78
+ required: ['name', 'description', 'prompt'],
79
+ title: 'AppCommand',
80
+ type: 'object',
81
+ },
55
82
  AppComputer: {
56
83
  additionalProperties: false,
57
84
  description: 'What the application may do on its own computer. Each is off until it is turned on.',
@@ -269,6 +296,18 @@ export const APPSPEC_SCHEMA = {
269
296
  default: 'green',
270
297
  description: "The application's one colour",
271
298
  },
299
+ theme: {
300
+ anyOf: [
301
+ {
302
+ $ref: '#/$defs/AppTheme',
303
+ },
304
+ {
305
+ type: 'null',
306
+ },
307
+ ],
308
+ default: null,
309
+ description: "The theme it runs in by default, at its address, embedded, in the Studio's Preview and as an example: a `variant` and, optionally, a colour `mode`. The person's own when unsaid. Its `accent` colours the `loop` theme only",
310
+ },
272
311
  welcome: {
273
312
  default: '',
274
313
  description: 'What the application says first',
@@ -283,6 +322,22 @@ export const APPSPEC_SCHEMA = {
283
322
  title: 'Starters',
284
323
  type: 'array',
285
324
  },
325
+ commands: {
326
+ description: 'Slash commands the user picks in the composer: typing `/` lists them (LOOP P-19)',
327
+ items: {
328
+ $ref: '#/$defs/AppCommand',
329
+ },
330
+ title: 'Commands',
331
+ type: 'array',
332
+ },
333
+ modes: {
334
+ description: 'Mode switches in the composer: the option picked goes with every run, its instructions told to the agent and its model run on (LOOP P-19)',
335
+ items: {
336
+ $ref: '#/$defs/AppMode',
337
+ },
338
+ title: 'Modes',
339
+ type: 'array',
340
+ },
286
341
  settings: {
287
342
  description: 'What the user may set',
288
343
  items: {
@@ -362,6 +417,95 @@ export const APPSPEC_SCHEMA = {
362
417
  title: 'AppKind',
363
418
  type: 'string',
364
419
  },
420
+ AppMode: {
421
+ additionalProperties: false,
422
+ description: 'A mode switch in the composer (LOOP P-19): the person picks one of its options.',
423
+ properties: {
424
+ id: {
425
+ description: 'Its id, the key a run says its option under',
426
+ pattern: '^[a-z][a-z0-9_-]{0,39}$',
427
+ title: 'Id',
428
+ type: 'string',
429
+ },
430
+ label: {
431
+ description: 'What the switch is called',
432
+ minLength: 1,
433
+ title: 'Label',
434
+ type: 'string',
435
+ },
436
+ options: {
437
+ description: 'Its positions, two at least',
438
+ items: {
439
+ $ref: '#/$defs/AppModeOption',
440
+ },
441
+ minItems: 2,
442
+ title: 'Options',
443
+ type: 'array',
444
+ },
445
+ default: {
446
+ anyOf: [
447
+ {
448
+ type: 'string',
449
+ },
450
+ {
451
+ type: 'null',
452
+ },
453
+ ],
454
+ default: null,
455
+ description: 'The option it starts on; the first when unsaid',
456
+ title: 'Default',
457
+ },
458
+ },
459
+ required: ['id', 'label', 'options'],
460
+ title: 'AppMode',
461
+ type: 'object',
462
+ },
463
+ AppModeOption: {
464
+ additionalProperties: false,
465
+ description: 'One position of a mode switch (LOOP P-19): what the agent is told, the model it runs on.',
466
+ properties: {
467
+ id: {
468
+ description: 'Its id, what a run says it is in',
469
+ pattern: '^[a-z][a-z0-9_-]{0,39}$',
470
+ title: 'Id',
471
+ type: 'string',
472
+ },
473
+ label: {
474
+ description: 'What the switch says',
475
+ minLength: 1,
476
+ title: 'Label',
477
+ type: 'string',
478
+ },
479
+ description: {
480
+ default: '',
481
+ description: 'What it changes, in a sentence',
482
+ title: 'Description',
483
+ type: 'string',
484
+ },
485
+ instructions: {
486
+ default: '',
487
+ description: 'What the agent is told besides its instructions, in every run in this mode',
488
+ title: 'Instructions',
489
+ type: 'string',
490
+ },
491
+ model: {
492
+ anyOf: [
493
+ {
494
+ type: 'string',
495
+ },
496
+ {
497
+ type: 'null',
498
+ },
499
+ ],
500
+ default: null,
501
+ description: "The model a run in this mode runs on, in place of the application's",
502
+ title: 'Model',
503
+ },
504
+ },
505
+ required: ['id', 'label'],
506
+ title: 'AppModeOption',
507
+ type: 'object',
508
+ },
365
509
  AppPermissions: {
366
510
  additionalProperties: false,
367
511
  description: 'What the application may reach beside its connections. Nothing, unless said.',
@@ -667,6 +811,31 @@ export const APPSPEC_SCHEMA = {
667
811
  title: 'AppTests',
668
812
  type: 'object',
669
813
  },
814
+ AppTheme: {
815
+ additionalProperties: false,
816
+ description: 'The theme an application runs in by default (LOOP T-30).',
817
+ properties: {
818
+ variant: {
819
+ $ref: '#/$defs/ThemeVariant',
820
+ description: 'The theme: `datalayer`, `spatial`, `lovely`, `matrix`, `earth`, `sand`, `ivory`, `sun` or `loop`',
821
+ },
822
+ mode: {
823
+ anyOf: [
824
+ {
825
+ $ref: '#/$defs/ThemeMode',
826
+ },
827
+ {
828
+ type: 'null',
829
+ },
830
+ ],
831
+ default: null,
832
+ description: "`light`, `dark` or `auto` (the device's); the person's own when unsaid",
833
+ },
834
+ },
835
+ required: ['variant'],
836
+ title: 'AppTheme',
837
+ type: 'object',
838
+ },
670
839
  AppTrigger: {
671
840
  additionalProperties: false,
672
841
  description: "What starts a worker's work.",
@@ -825,10 +994,71 @@ export const APPSPEC_SCHEMA = {
825
994
  title: 'Origins',
826
995
  type: 'array',
827
996
  },
997
+ host: {
998
+ anyOf: [
999
+ {
1000
+ $ref: '#/$defs/HostBridge',
1001
+ },
1002
+ {
1003
+ type: 'null',
1004
+ },
1005
+ ],
1006
+ default: null,
1007
+ description: 'What the host page passes it and the functions of the host it may call',
1008
+ },
828
1009
  },
829
1010
  title: 'EmbeddedDeployment',
830
1011
  type: 'object',
831
1012
  },
1013
+ HostBridge: {
1014
+ additionalProperties: false,
1015
+ description: "What the host page and the application say to each other (LOOP D-10).\n\nThe values of the host it reads (`context`: `user`, `page`, or a name of\nthe host's own), through the tool `host_context`; the functions of the\nhost it may call, each through `host_<name>`. Every one of these tools is\ndecided by a rule that names it, as any tool is: one no rule names is\nleft to the person.",
1016
+ properties: {
1017
+ context: {
1018
+ description: "The host's values it reads: `user`, `page`, or names of the host's own",
1019
+ items: {
1020
+ type: 'string',
1021
+ },
1022
+ title: 'Context',
1023
+ type: 'array',
1024
+ },
1025
+ functions: {
1026
+ description: "The host's functions it may call",
1027
+ items: {
1028
+ $ref: '#/$defs/HostFunction',
1029
+ },
1030
+ title: 'Functions',
1031
+ type: 'array',
1032
+ },
1033
+ },
1034
+ title: 'HostBridge',
1035
+ type: 'object',
1036
+ },
1037
+ HostFunction: {
1038
+ additionalProperties: false,
1039
+ description: "A function of the host page the application's agent may call (LOOP D-10).",
1040
+ properties: {
1041
+ name: {
1042
+ description: 'Its name, lower-case words joined by `_`: `open_ticket`',
1043
+ title: 'Name',
1044
+ type: 'string',
1045
+ },
1046
+ description: {
1047
+ description: 'What it does, for the agent: when to call it',
1048
+ title: 'Description',
1049
+ type: 'string',
1050
+ },
1051
+ parameters: {
1052
+ additionalProperties: true,
1053
+ description: 'Its arguments, as a JSON Schema object',
1054
+ title: 'Parameters',
1055
+ type: 'object',
1056
+ },
1057
+ },
1058
+ required: ['name', 'description'],
1059
+ title: 'HostFunction',
1060
+ type: 'object',
1061
+ },
832
1062
  HostedDeployment: {
833
1063
  additionalProperties: false,
834
1064
  description: 'The application at an address of its own.',
@@ -844,6 +1074,12 @@ export const APPSPEC_SCHEMA = {
844
1074
  title: 'Slug',
845
1075
  type: 'string',
846
1076
  },
1077
+ character_alone: {
1078
+ default: false,
1079
+ description: 'At its address, only its character: the conversation opens in its balloon, as when it is shipped as `assistant`',
1080
+ title: 'Character Alone',
1081
+ type: 'boolean',
1082
+ },
847
1083
  },
848
1084
  title: 'HostedDeployment',
849
1085
  type: 'object',
@@ -876,6 +1112,28 @@ export const APPSPEC_SCHEMA = {
876
1112
  title: 'SettingType',
877
1113
  type: 'string',
878
1114
  },
1115
+ ThemeMode: {
1116
+ description: 'The colour mode a theme is worn in: `auto` follows the device.',
1117
+ enum: ['light', 'dark', 'auto'],
1118
+ title: 'ThemeMode',
1119
+ type: 'string',
1120
+ },
1121
+ ThemeVariant: {
1122
+ description: "A theme of Datalayer's, as Appearance names it (LOOP T-30).",
1123
+ enum: [
1124
+ 'datalayer',
1125
+ 'spatial',
1126
+ 'lovely',
1127
+ 'matrix',
1128
+ 'earth',
1129
+ 'sand',
1130
+ 'ivory',
1131
+ 'sun',
1132
+ 'loop',
1133
+ ],
1134
+ title: 'ThemeVariant',
1135
+ type: 'string',
1136
+ },
879
1137
  TriggerType: {
880
1138
  description: 'What starts a worker: the trigger kinds of the catalogue.',
881
1139
  enum: ['schedule', 'event', 'once'],
@@ -386,6 +386,19 @@ export type AppBehaviour = 'do_it' | 'if_asked' | 'ask_first' | 'leave_to_me';
386
386
  export type AppLayout = 'chat' | 'page' | 'split';
387
387
  /** The one colour of an application; everything else is neutral. */
388
388
  export type AppAccent = 'green' | 'rose' | 'sky' | 'lime' | 'sun' | 'violet';
389
+ /** A theme of Appearance's, which an application may run in (LOOP T-30). */
390
+ export type AppThemeVariant = 'datalayer' | 'spatial' | 'lovely' | 'matrix' | 'earth' | 'sand' | 'ivory' | 'sun' | 'loop';
391
+ /** The colour mode it is worn in: `auto` follows the device. */
392
+ export type AppThemeMode = 'light' | 'dark' | 'auto';
393
+ /**
394
+ * The theme an application runs in by default (LOOP T-30): at its address,
395
+ * embedded, in the Studio's Preview and as an example. The person's own
396
+ * when unsaid; the mode, when unsaid, is the person's.
397
+ */
398
+ export interface AppThemeSpec {
399
+ variant: AppThemeVariant;
400
+ mode?: AppThemeMode;
401
+ }
389
402
  /**
390
403
  * The character an application's floating assistant shows (LOOP T-24): the id
391
404
  * an enabled plugin contributes it under to `loop.assistant.character` —
@@ -434,6 +447,44 @@ export interface AppStarterSpec {
434
447
  label: string;
435
448
  message: string;
436
449
  }
450
+ /** A slash command the user picks in the composer (LOOP P-19). */
451
+ export interface AppCommandSpec {
452
+ /** What follows the slash: lower-case letters, digits and hyphens. */
453
+ name: string;
454
+ /** What the composer's menu says it does. */
455
+ description: string;
456
+ /** What picking it sends: `{input}` the words typed after it. */
457
+ prompt: string;
458
+ }
459
+ /** One position of a mode switch (LOOP P-19). */
460
+ export interface AppModeOptionSpec {
461
+ id: string;
462
+ label: string;
463
+ description?: string;
464
+ /** What the agent is told in every run in this mode. */
465
+ instructions?: string;
466
+ /** The model a run in this mode runs on, in place of the application's. */
467
+ model?: string | null;
468
+ }
469
+ /** A mode switch in the composer (LOOP P-19). */
470
+ export interface AppModeSpec {
471
+ id: string;
472
+ label: string;
473
+ /** Its positions, two at least. */
474
+ options: AppModeOptionSpec[];
475
+ /** The option it starts on; the first when unsaid. */
476
+ default?: string | null;
477
+ }
478
+ /**
479
+ * What a run in the modes chosen is told, and the model it runs on (LOOP
480
+ * P-19): agentspecs' `ModeEffect`.
481
+ */
482
+ export interface AppModeEffect {
483
+ /** The instructions of the options chosen, in the order of the modes. */
484
+ instructions: string;
485
+ /** The model an option chosen names; the application's when unsaid. */
486
+ model?: string;
487
+ }
437
488
  export interface AppSettingSpec {
438
489
  id: string;
439
490
  type: 'select' | 'text' | 'toggle' | 'slider' | 'number';
@@ -471,9 +522,16 @@ export interface AppVoiceSpec {
471
522
  /** What the user of an application sees. */
472
523
  export interface AppInterfaceSpec {
473
524
  layout: AppLayout;
525
+ /** Its one colour, over the `loop` theme only. */
474
526
  accent: AppAccent;
527
+ /** The theme it runs in by default; the person's own when unsaid (T-30). */
528
+ theme?: AppThemeSpec;
475
529
  welcome: string;
476
530
  starters: AppStarterSpec[];
531
+ /** Slash commands picked in the composer: typing `/` lists them (P-19). */
532
+ commands: AppCommandSpec[];
533
+ /** Mode switches in the composer, the option picked going with every run (P-19). */
534
+ modes: AppModeSpec[];
477
535
  settings: AppSettingSpec[];
478
536
  /** The components of the catalog the surface may use. */
479
537
  components: string[];
@@ -538,14 +596,42 @@ export interface AppChecksSpec {
538
596
  gates: string[];
539
597
  track: string;
540
598
  }
599
+ /** A function of the host page the application's agent may call (LOOP D-10). */
600
+ export interface AppHostFunctionSpec {
601
+ /** Lower-case words joined by `_`: called as the tool `host_<name>`. */
602
+ name: string;
603
+ /** What it does, for the agent: when to call it. */
604
+ description: string;
605
+ /** Its arguments, a JSON Schema of `type: object`. */
606
+ parameters: Record<string, unknown>;
607
+ }
608
+ /**
609
+ * What the host page and an embedded application say to each other (LOOP
610
+ * D-10): the host's values it reads (`user`, `page`, or the host's own),
611
+ * through the tool `host_context`, and the host's functions it may call,
612
+ * each through `host_<name>` — every one of them decided by a rule that
613
+ * names it.
614
+ */
615
+ export interface AppHostBridgeSpec {
616
+ context: string[];
617
+ functions: AppHostFunctionSpec[];
618
+ }
541
619
  export interface AppDeploymentSpec {
542
620
  hosted?: {
543
621
  visibility: 'private' | 'invited' | 'organization' | 'link' | 'public';
544
622
  slug: string;
623
+ /**
624
+ * At its address, only its character (LOOP T-21): the conversation
625
+ * opens in its balloon, as when it is shipped as `assistant`. Off
626
+ * unless said.
627
+ */
628
+ characterAlone?: boolean;
545
629
  };
546
630
  embedded?: {
547
631
  mode: AppEmbedMode;
548
632
  origins: string[];
633
+ /** What the host page passes it and the functions of the host it may call (LOOP D-10). */
634
+ host?: AppHostBridgeSpec;
549
635
  };
550
636
  }
551
637
  /** What starts a worker's work. */