@datalayer/agent-runtimes 1.3.86 → 1.3.88
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/a2ui/datalayer/Download.d.ts +21 -0
- package/lib/components/a2ui/datalayer/Download.js +66 -0
- package/lib/components/a2ui/datalayer/drawn.d.ts +1 -1
- package/lib/components/a2ui/datalayer/drawn.js +1 -0
- package/lib/components/a2ui/datalayer/index.d.ts +2 -1
- package/lib/components/a2ui/datalayer/index.js +3 -0
- package/lib/components/inspector/a2aSpans.d.ts +9 -0
- package/lib/components/inspector/a2aSpans.js +11 -1
- package/lib/components/teams/A2ATeamGraph.d.ts +2 -2
- package/lib/components/teams/A2ATeamGraph.js +39 -22
- package/lib/components/teams/AnswerSurfaces.d.ts +56 -0
- package/lib/components/teams/AnswerSurfaces.js +27 -0
- package/lib/components/teams/AnswerSurfacesView.d.ts +14 -0
- package/lib/components/teams/AnswerSurfacesView.js +30 -0
- package/lib/components/teams/index.d.ts +1 -0
- package/lib/components/teams/index.js +1 -0
- package/lib/components/teams/useA2ATeam.d.ts +56 -2
- package/lib/components/teams/useA2ATeam.js +122 -3
- package/lib/hooks/useAgentRuntimes.d.ts +13 -0
- package/lib/hooks/useAgentRuntimes.js +11 -1
- package/lib/loop/apps/AppFeedback.js +11 -2
- package/lib/loop/apps/AppRenderer.d.ts +13 -1
- package/lib/loop/apps/AppRenderer.js +34 -1
- package/lib/loop/apps/AppRuntimePlugins.d.ts +8 -0
- package/lib/loop/apps/AppRuntimePlugins.js +87 -0
- package/lib/loop/apps/feedback.d.ts +7 -0
- package/lib/loop/apps/feedback.js +3 -0
- package/lib/loop/apps/pluginPair.d.ts +60 -0
- package/lib/loop/apps/pluginPair.js +44 -0
- package/lib/loop/apps/threads.d.ts +35 -0
- package/lib/loop/apps/threads.js +79 -0
- package/lib/loop/embed/LoopEmbed.d.ts +4 -3
- package/lib/loop/embed/hostBridge.d.ts +27 -0
- package/lib/loop/embed/hostBridge.js +47 -0
- package/lib/loop/index.d.ts +1 -1
- package/lib/loop/index.js +1 -1
- package/lib/loop/plugins/agent-capacity/index.d.ts +7 -0
- package/lib/loop/plugins/agent-capacity/index.js +3 -2
- package/lib/loop/plugins/agents/DatalayerAgentBridge.js +11 -0
- package/lib/loop/plugins/agents/appLaunch.d.ts +15 -0
- package/lib/loop/plugins/agents/appLaunch.js +28 -0
- package/lib/loop/plugins/chat/ChatView.js +177 -109
- package/lib/loop/shell/LoopWorkspace.d.ts +3 -3
- package/lib/loop/shell/LoopWorkspace.js +1 -1
- package/lib/runtimes/__tests__/fixtures/accounting-agent-card.json +10 -2
- package/lib/runtimes/actions.js +23 -0
- package/lib/runtimes/apis.d.ts +18 -0
- package/lib/runtimes/browser/a2aPeer.d.ts +19 -2
- package/lib/runtimes/browser/a2aPeer.js +13 -7
- package/lib/specs/apps.js +102 -30
- package/lib/specs/envvars.d.ts +2 -0
- package/lib/specs/envvars.js +22 -0
- package/lib/specs/outputs.d.ts +1 -0
- package/lib/specs/outputs.js +12 -0
- package/lib/specs/sceneSchema.d.ts +8 -0
- package/lib/specs/sceneSchema.js +863 -0
- package/lib/specs/scenes.js +238 -121
- package/lib/specs/teams/teams.js +23 -7
- package/lib/specs/uiPlugins.js +55 -0
- package/lib/stores/agentRuntimeStore.js +4 -0
- package/lib/types/chat.d.ts +6 -0
- package/lib/types/scenes.d.ts +7 -1
- package/package.json +1 -1
- package/scripts/codegen/generate_envvars.py +1 -1
- package/scripts/codegen/generate_mcp_servers.py +11 -7
- package/scripts/codegen/generate_scenes.py +43 -1
|
@@ -0,0 +1,863 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
export const SCENE_SCHEMA = {
|
|
6
|
+
$defs: {
|
|
7
|
+
ActionClass: {
|
|
8
|
+
description: 'What a tool does to the world.',
|
|
9
|
+
enum: ['read', 'write', 'send', 'buy', 'delete', 'publish'],
|
|
10
|
+
title: 'ActionClass',
|
|
11
|
+
type: 'string',
|
|
12
|
+
},
|
|
13
|
+
AnswerKind: {
|
|
14
|
+
description: 'What kind of answer comes back, and what the page shows.',
|
|
15
|
+
enum: [
|
|
16
|
+
'words',
|
|
17
|
+
'table',
|
|
18
|
+
'chart',
|
|
19
|
+
'notebook',
|
|
20
|
+
'map',
|
|
21
|
+
'file',
|
|
22
|
+
'image',
|
|
23
|
+
'sources',
|
|
24
|
+
'choice',
|
|
25
|
+
'approval',
|
|
26
|
+
],
|
|
27
|
+
title: 'AnswerKind',
|
|
28
|
+
type: 'string',
|
|
29
|
+
},
|
|
30
|
+
AppVerified: {
|
|
31
|
+
additionalProperties: false,
|
|
32
|
+
description: 'What was verified, and how, each in a sentence a person reads (LOOP E-14).\n\nAn example says it on its card and on its page: what was tried live,\nwhat runs on recorded data instead, and what is not verified yet. Said\nby whoever tried it; nothing here is computed.',
|
|
33
|
+
properties: {
|
|
34
|
+
live: {
|
|
35
|
+
description: 'What was tried live, where and when',
|
|
36
|
+
items: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
},
|
|
39
|
+
title: 'Live',
|
|
40
|
+
type: 'array',
|
|
41
|
+
},
|
|
42
|
+
recorded: {
|
|
43
|
+
description: 'What runs on recorded data, not on live calls',
|
|
44
|
+
items: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
},
|
|
47
|
+
title: 'Recorded',
|
|
48
|
+
type: 'array',
|
|
49
|
+
},
|
|
50
|
+
unverified: {
|
|
51
|
+
description: 'What is not verified yet',
|
|
52
|
+
items: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
},
|
|
55
|
+
title: 'Unverified',
|
|
56
|
+
type: 'array',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
title: 'AppVerified',
|
|
60
|
+
type: 'object',
|
|
61
|
+
},
|
|
62
|
+
Inspector: {
|
|
63
|
+
description: 'The inspectors a page may offer under a scene.',
|
|
64
|
+
enum: ['agent', 'tools', 'a2a', 'notebook', 'cost'],
|
|
65
|
+
title: 'Inspector',
|
|
66
|
+
type: 'string',
|
|
67
|
+
},
|
|
68
|
+
Pace: {
|
|
69
|
+
description: 'How fast a beat plays for the audience.',
|
|
70
|
+
enum: ['quick', 'steady', 'slow'],
|
|
71
|
+
title: 'Pace',
|
|
72
|
+
type: 'string',
|
|
73
|
+
},
|
|
74
|
+
RehearsalBeat: {
|
|
75
|
+
additionalProperties: false,
|
|
76
|
+
description: "What a beat's transcript must look like.",
|
|
77
|
+
properties: {
|
|
78
|
+
beat: {
|
|
79
|
+
description: 'The beat, by id',
|
|
80
|
+
title: 'Beat',
|
|
81
|
+
type: 'string',
|
|
82
|
+
},
|
|
83
|
+
lines: {
|
|
84
|
+
description: 'The shape, in order: `Sales → Accounting`, `Accounting → Odoo: odoo_accounting_*`, `Accounting: a table`',
|
|
85
|
+
items: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
},
|
|
88
|
+
title: 'Lines',
|
|
89
|
+
type: 'array',
|
|
90
|
+
},
|
|
91
|
+
must_say: {
|
|
92
|
+
description: 'Words that must appear',
|
|
93
|
+
items: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
},
|
|
96
|
+
title: 'Must Say',
|
|
97
|
+
type: 'array',
|
|
98
|
+
},
|
|
99
|
+
must_not_say: {
|
|
100
|
+
description: 'Words that must not',
|
|
101
|
+
items: {
|
|
102
|
+
type: 'string',
|
|
103
|
+
},
|
|
104
|
+
title: 'Must Not Say',
|
|
105
|
+
type: 'array',
|
|
106
|
+
},
|
|
107
|
+
within: {
|
|
108
|
+
default: '',
|
|
109
|
+
description: 'The time the beat may take',
|
|
110
|
+
pattern: '^(?:[1-9]\\d*(?:ms|s|m|h))?$',
|
|
111
|
+
title: 'Within',
|
|
112
|
+
type: 'string',
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
required: ['beat'],
|
|
116
|
+
title: 'RehearsalBeat',
|
|
117
|
+
type: 'object',
|
|
118
|
+
},
|
|
119
|
+
SceneAudience: {
|
|
120
|
+
additionalProperties: false,
|
|
121
|
+
description: 'Who may watch and ask, and what an ask may cost.',
|
|
122
|
+
properties: {
|
|
123
|
+
who: {
|
|
124
|
+
$ref: '#/$defs/Watchers',
|
|
125
|
+
default: 'signed-in',
|
|
126
|
+
description: '`visitors`, `signed-in`, or `nobody`',
|
|
127
|
+
},
|
|
128
|
+
ceiling_per_ask: {
|
|
129
|
+
default: 0,
|
|
130
|
+
description: "What one ask may cost, in USD; the site's when 0",
|
|
131
|
+
minimum: 0,
|
|
132
|
+
title: 'Ceiling Per Ask',
|
|
133
|
+
type: 'number',
|
|
134
|
+
},
|
|
135
|
+
asks_a_day: {
|
|
136
|
+
default: 0,
|
|
137
|
+
description: "How many asks a visitor gets a day; the site's when 0",
|
|
138
|
+
minimum: 0,
|
|
139
|
+
title: 'Asks A Day',
|
|
140
|
+
type: 'integer',
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
title: 'SceneAudience',
|
|
144
|
+
type: 'object',
|
|
145
|
+
},
|
|
146
|
+
SceneBeat: {
|
|
147
|
+
additionalProperties: false,
|
|
148
|
+
description: 'One beat of the script.',
|
|
149
|
+
properties: {
|
|
150
|
+
id: {
|
|
151
|
+
description: 'Its id: what the rehearsal and a branch name',
|
|
152
|
+
title: 'Id',
|
|
153
|
+
type: 'string',
|
|
154
|
+
},
|
|
155
|
+
cue: {
|
|
156
|
+
$ref: '#/$defs/SceneCue',
|
|
157
|
+
description: 'What starts it',
|
|
158
|
+
},
|
|
159
|
+
narration: {
|
|
160
|
+
default: '',
|
|
161
|
+
description: 'One line for the audience, read in the transcript',
|
|
162
|
+
title: 'Narration',
|
|
163
|
+
type: 'string',
|
|
164
|
+
},
|
|
165
|
+
moves: {
|
|
166
|
+
description: 'Who asks whom over what, in order',
|
|
167
|
+
items: {
|
|
168
|
+
$ref: '#/$defs/SceneMove',
|
|
169
|
+
},
|
|
170
|
+
title: 'Moves',
|
|
171
|
+
type: 'array',
|
|
172
|
+
},
|
|
173
|
+
expect: {
|
|
174
|
+
description: 'What should happen, in words',
|
|
175
|
+
title: 'Expect',
|
|
176
|
+
type: 'string',
|
|
177
|
+
},
|
|
178
|
+
shows: {
|
|
179
|
+
description: 'What the page shows: the answers to the audience when unsaid',
|
|
180
|
+
items: {
|
|
181
|
+
$ref: '#/$defs/AnswerKind',
|
|
182
|
+
},
|
|
183
|
+
title: 'Shows',
|
|
184
|
+
type: 'array',
|
|
185
|
+
},
|
|
186
|
+
pace: {
|
|
187
|
+
anyOf: [
|
|
188
|
+
{
|
|
189
|
+
$ref: '#/$defs/Pace',
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
type: 'null',
|
|
193
|
+
},
|
|
194
|
+
],
|
|
195
|
+
default: null,
|
|
196
|
+
description: "Its pace; the stage's when unsaid",
|
|
197
|
+
},
|
|
198
|
+
branch: {
|
|
199
|
+
description: 'What it does instead, on a decision',
|
|
200
|
+
items: {
|
|
201
|
+
$ref: '#/$defs/SceneBranch',
|
|
202
|
+
},
|
|
203
|
+
title: 'Branch',
|
|
204
|
+
type: 'array',
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
required: ['id', 'cue', 'expect'],
|
|
208
|
+
title: 'SceneBeat',
|
|
209
|
+
type: 'object',
|
|
210
|
+
},
|
|
211
|
+
SceneBranch: {
|
|
212
|
+
additionalProperties: false,
|
|
213
|
+
description: 'What a beat does instead when a decision holds.',
|
|
214
|
+
properties: {
|
|
215
|
+
decision: {
|
|
216
|
+
description: 'When, in words: *the books hold no open invoice*',
|
|
217
|
+
title: 'Decision',
|
|
218
|
+
type: 'string',
|
|
219
|
+
},
|
|
220
|
+
expect: {
|
|
221
|
+
default: '',
|
|
222
|
+
description: 'What happens then, in words',
|
|
223
|
+
title: 'Expect',
|
|
224
|
+
type: 'string',
|
|
225
|
+
},
|
|
226
|
+
moves: {
|
|
227
|
+
description: 'The moves then, when they differ',
|
|
228
|
+
items: {
|
|
229
|
+
$ref: '#/$defs/SceneMove',
|
|
230
|
+
},
|
|
231
|
+
title: 'Moves',
|
|
232
|
+
type: 'array',
|
|
233
|
+
},
|
|
234
|
+
then: {
|
|
235
|
+
default: '',
|
|
236
|
+
description: 'The beat that follows, by id, when the script goes on elsewhere',
|
|
237
|
+
title: 'Then',
|
|
238
|
+
type: 'string',
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
required: ['decision'],
|
|
242
|
+
title: 'SceneBranch',
|
|
243
|
+
type: 'object',
|
|
244
|
+
},
|
|
245
|
+
SceneCastMember: {
|
|
246
|
+
additionalProperties: false,
|
|
247
|
+
description: 'A member of the cast.\n\nOn a staged team, it names a member of the team (`member`) and says only\nhow it appears here (`persona`) and what it is for in this scene\n(`brief`). Written inline — a scene with no `team` — it is the member:\nwhat it is (`app`, `ref` or `server`), its `role`, where it `runs_in`\nand whom it `talks_to`, as a team member says them.',
|
|
248
|
+
properties: {
|
|
249
|
+
member: {
|
|
250
|
+
description: 'Its id: in the team, or in this cast',
|
|
251
|
+
title: 'Member',
|
|
252
|
+
type: 'string',
|
|
253
|
+
},
|
|
254
|
+
app: {
|
|
255
|
+
default: '',
|
|
256
|
+
description: 'Inline: the application it is, `id` or `id:version`',
|
|
257
|
+
title: 'App',
|
|
258
|
+
type: 'string',
|
|
259
|
+
},
|
|
260
|
+
ref: {
|
|
261
|
+
default: '',
|
|
262
|
+
description: 'Inline: the agent it is, `id` or `id:version`',
|
|
263
|
+
title: 'Ref',
|
|
264
|
+
type: 'string',
|
|
265
|
+
},
|
|
266
|
+
server: {
|
|
267
|
+
default: '',
|
|
268
|
+
description: 'Inline: the MCP server it is, a system of the scene',
|
|
269
|
+
title: 'Server',
|
|
270
|
+
type: 'string',
|
|
271
|
+
},
|
|
272
|
+
role: {
|
|
273
|
+
anyOf: [
|
|
274
|
+
{
|
|
275
|
+
$ref: '#/$defs/TeamRole',
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
type: 'null',
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
default: null,
|
|
282
|
+
description: 'Inline: what it is for, structurally',
|
|
283
|
+
},
|
|
284
|
+
runs_in: {
|
|
285
|
+
anyOf: [
|
|
286
|
+
{
|
|
287
|
+
$ref: '#/$defs/TeamPlace',
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
type: 'null',
|
|
291
|
+
},
|
|
292
|
+
],
|
|
293
|
+
default: null,
|
|
294
|
+
description: 'Inline: `browser` or `runtime`',
|
|
295
|
+
},
|
|
296
|
+
talks_to: {
|
|
297
|
+
description: 'Inline: whom it asks, and over what',
|
|
298
|
+
items: {
|
|
299
|
+
$ref: '#/$defs/TeamLink',
|
|
300
|
+
},
|
|
301
|
+
title: 'Talks To',
|
|
302
|
+
type: 'array',
|
|
303
|
+
},
|
|
304
|
+
persona: {
|
|
305
|
+
$ref: '#/$defs/ScenePersona',
|
|
306
|
+
description: 'How it appears on stage',
|
|
307
|
+
},
|
|
308
|
+
brief: {
|
|
309
|
+
default: '',
|
|
310
|
+
description: "What it is for in this scene, over its application's instructions",
|
|
311
|
+
title: 'Brief',
|
|
312
|
+
type: 'string',
|
|
313
|
+
},
|
|
314
|
+
},
|
|
315
|
+
required: ['member'],
|
|
316
|
+
title: 'SceneCastMember',
|
|
317
|
+
type: 'object',
|
|
318
|
+
},
|
|
319
|
+
SceneCue: {
|
|
320
|
+
additionalProperties: false,
|
|
321
|
+
description: 'What starts a beat: something the audience says, a schedule, or an event.',
|
|
322
|
+
properties: {
|
|
323
|
+
say: {
|
|
324
|
+
default: '',
|
|
325
|
+
description: "An opener the audience may say: the entry's suggestion on the page",
|
|
326
|
+
title: 'Say',
|
|
327
|
+
type: 'string',
|
|
328
|
+
},
|
|
329
|
+
schedule: {
|
|
330
|
+
default: '',
|
|
331
|
+
description: 'A schedule, when the beat starts by itself',
|
|
332
|
+
title: 'Schedule',
|
|
333
|
+
type: 'string',
|
|
334
|
+
},
|
|
335
|
+
event: {
|
|
336
|
+
default: '',
|
|
337
|
+
description: 'An event, when something happening starts it',
|
|
338
|
+
title: 'Event',
|
|
339
|
+
type: 'string',
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
title: 'SceneCue',
|
|
343
|
+
type: 'object',
|
|
344
|
+
},
|
|
345
|
+
SceneDeployment: {
|
|
346
|
+
additionalProperties: false,
|
|
347
|
+
description: 'Where the scene plays.',
|
|
348
|
+
properties: {
|
|
349
|
+
account: {
|
|
350
|
+
default: '',
|
|
351
|
+
description: 'Under which account the scene plays: `demo`',
|
|
352
|
+
title: 'Account',
|
|
353
|
+
type: 'string',
|
|
354
|
+
},
|
|
355
|
+
page: {
|
|
356
|
+
default: '',
|
|
357
|
+
description: "The page it plays on: the entry's address",
|
|
358
|
+
title: 'Page',
|
|
359
|
+
type: 'string',
|
|
360
|
+
},
|
|
361
|
+
addresses: {
|
|
362
|
+
additionalProperties: {
|
|
363
|
+
type: 'string',
|
|
364
|
+
},
|
|
365
|
+
description: 'For each member on a runtime, the variable its address is read from at build',
|
|
366
|
+
title: 'Addresses',
|
|
367
|
+
type: 'object',
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
title: 'SceneDeployment',
|
|
371
|
+
type: 'object',
|
|
372
|
+
},
|
|
373
|
+
SceneMove: {
|
|
374
|
+
additionalProperties: false,
|
|
375
|
+
description: 'One member asking another over a protocol, or answering the audience.',
|
|
376
|
+
properties: {
|
|
377
|
+
who: {
|
|
378
|
+
description: 'The member moving, by its id in the cast',
|
|
379
|
+
title: 'Who',
|
|
380
|
+
type: 'string',
|
|
381
|
+
},
|
|
382
|
+
asks: {
|
|
383
|
+
default: '',
|
|
384
|
+
description: 'Whom: a member or a system; nobody when it answers the audience',
|
|
385
|
+
title: 'Asks',
|
|
386
|
+
type: 'string',
|
|
387
|
+
},
|
|
388
|
+
over: {
|
|
389
|
+
anyOf: [
|
|
390
|
+
{
|
|
391
|
+
$ref: '#/$defs/TeamProtocol',
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
type: 'null',
|
|
395
|
+
},
|
|
396
|
+
],
|
|
397
|
+
default: null,
|
|
398
|
+
description: '`a2a` to a member, `mcp` to a system',
|
|
399
|
+
},
|
|
400
|
+
what: {
|
|
401
|
+
default: '',
|
|
402
|
+
description: 'What it asks for, or what it answers, in words',
|
|
403
|
+
title: 'What',
|
|
404
|
+
type: 'string',
|
|
405
|
+
},
|
|
406
|
+
tool: {
|
|
407
|
+
default: '',
|
|
408
|
+
description: 'Over `mcp`: the tool, by name or pattern (`odoo_accounting_*`)',
|
|
409
|
+
title: 'Tool',
|
|
410
|
+
type: 'string',
|
|
411
|
+
},
|
|
412
|
+
does: {
|
|
413
|
+
anyOf: [
|
|
414
|
+
{
|
|
415
|
+
$ref: '#/$defs/ActionClass',
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
type: 'null',
|
|
419
|
+
},
|
|
420
|
+
],
|
|
421
|
+
default: null,
|
|
422
|
+
description: 'The kind of tool: `read`, `write`, …',
|
|
423
|
+
},
|
|
424
|
+
answers: {
|
|
425
|
+
anyOf: [
|
|
426
|
+
{
|
|
427
|
+
$ref: '#/$defs/AnswerKind',
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
type: 'null',
|
|
431
|
+
},
|
|
432
|
+
],
|
|
433
|
+
default: null,
|
|
434
|
+
description: 'What kind of answer comes back',
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
required: ['who'],
|
|
438
|
+
title: 'SceneMove',
|
|
439
|
+
type: 'object',
|
|
440
|
+
},
|
|
441
|
+
ScenePersona: {
|
|
442
|
+
additionalProperties: false,
|
|
443
|
+
description: 'How a member appears to the audience, in this scene.',
|
|
444
|
+
properties: {
|
|
445
|
+
name: {
|
|
446
|
+
default: '',
|
|
447
|
+
description: "The name the audience sees; its application's when unsaid",
|
|
448
|
+
title: 'Name',
|
|
449
|
+
type: 'string',
|
|
450
|
+
},
|
|
451
|
+
face: {
|
|
452
|
+
default: '',
|
|
453
|
+
description: "One emoji; its application's when unsaid",
|
|
454
|
+
title: 'Face',
|
|
455
|
+
type: 'string',
|
|
456
|
+
},
|
|
457
|
+
line: {
|
|
458
|
+
default: '',
|
|
459
|
+
description: 'One line of *who I am here*',
|
|
460
|
+
title: 'Line',
|
|
461
|
+
type: 'string',
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
title: 'ScenePersona',
|
|
465
|
+
type: 'object',
|
|
466
|
+
},
|
|
467
|
+
SceneRecording: {
|
|
468
|
+
additionalProperties: false,
|
|
469
|
+
description: 'A transcript recorded once, played when the scene cannot play live (LOOP H-08).',
|
|
470
|
+
properties: {
|
|
471
|
+
path: {
|
|
472
|
+
description: 'Its file, beside the scenes: `sales-and-accounting/recording.json`',
|
|
473
|
+
title: 'Path',
|
|
474
|
+
type: 'string',
|
|
475
|
+
},
|
|
476
|
+
taken: {
|
|
477
|
+
default: '',
|
|
478
|
+
description: 'When it was recorded',
|
|
479
|
+
title: 'Taken',
|
|
480
|
+
type: 'string',
|
|
481
|
+
},
|
|
482
|
+
note: {
|
|
483
|
+
default: '',
|
|
484
|
+
description: 'What the audience is told: *recorded on 2026-10-07*',
|
|
485
|
+
title: 'Note',
|
|
486
|
+
type: 'string',
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
required: ['path'],
|
|
490
|
+
title: 'SceneRecording',
|
|
491
|
+
type: 'object',
|
|
492
|
+
},
|
|
493
|
+
SceneRehearsal: {
|
|
494
|
+
additionalProperties: false,
|
|
495
|
+
description: "The scene's tests: a passing rehearsal is the gallery's *Live*.",
|
|
496
|
+
properties: {
|
|
497
|
+
beats: {
|
|
498
|
+
description: "Each beat's expected shape",
|
|
499
|
+
items: {
|
|
500
|
+
$ref: '#/$defs/RehearsalBeat',
|
|
501
|
+
},
|
|
502
|
+
title: 'Beats',
|
|
503
|
+
type: 'array',
|
|
504
|
+
},
|
|
505
|
+
within: {
|
|
506
|
+
default: '',
|
|
507
|
+
description: 'The time the whole scene may take',
|
|
508
|
+
pattern: '^(?:[1-9]\\d*(?:ms|s|m|h))?$',
|
|
509
|
+
title: 'Within',
|
|
510
|
+
type: 'string',
|
|
511
|
+
},
|
|
512
|
+
recording: {
|
|
513
|
+
anyOf: [
|
|
514
|
+
{
|
|
515
|
+
$ref: '#/$defs/SceneRecording',
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
type: 'null',
|
|
519
|
+
},
|
|
520
|
+
],
|
|
521
|
+
default: null,
|
|
522
|
+
description: 'A recording, for when it cannot play live',
|
|
523
|
+
},
|
|
524
|
+
verified: {
|
|
525
|
+
$ref: '#/$defs/AppVerified',
|
|
526
|
+
description: 'What was verified live, what runs on recorded data, and what is not verified yet',
|
|
527
|
+
},
|
|
528
|
+
},
|
|
529
|
+
title: 'SceneRehearsal',
|
|
530
|
+
type: 'object',
|
|
531
|
+
},
|
|
532
|
+
SceneSetting: {
|
|
533
|
+
additionalProperties: false,
|
|
534
|
+
description: 'The stage: what is on it, and what the audience is told.',
|
|
535
|
+
properties: {
|
|
536
|
+
systems: {
|
|
537
|
+
description: 'The systems the cast reaches',
|
|
538
|
+
items: {
|
|
539
|
+
$ref: '#/$defs/SceneSystem',
|
|
540
|
+
},
|
|
541
|
+
title: 'Systems',
|
|
542
|
+
type: 'array',
|
|
543
|
+
},
|
|
544
|
+
frames: {
|
|
545
|
+
description: "The Frames the scene plays under, over the team's",
|
|
546
|
+
items: {
|
|
547
|
+
type: 'string',
|
|
548
|
+
},
|
|
549
|
+
title: 'Frames',
|
|
550
|
+
type: 'array',
|
|
551
|
+
},
|
|
552
|
+
contents: {
|
|
553
|
+
description: 'The data in play: documents and datasets',
|
|
554
|
+
items: {
|
|
555
|
+
type: 'string',
|
|
556
|
+
},
|
|
557
|
+
title: 'Contents',
|
|
558
|
+
type: 'array',
|
|
559
|
+
},
|
|
560
|
+
period: {
|
|
561
|
+
default: '',
|
|
562
|
+
description: 'When the scene plays, in words: *March 2026*',
|
|
563
|
+
title: 'Period',
|
|
564
|
+
type: 'string',
|
|
565
|
+
},
|
|
566
|
+
language: {
|
|
567
|
+
default: '',
|
|
568
|
+
description: 'The language it plays in, `en`',
|
|
569
|
+
pattern: '^(?:[a-z]{2,3}(?:-[A-Z]{2})?)?$',
|
|
570
|
+
title: 'Language',
|
|
571
|
+
type: 'string',
|
|
572
|
+
},
|
|
573
|
+
assumes: {
|
|
574
|
+
default: '',
|
|
575
|
+
description: 'What the audience is told before it starts, one line',
|
|
576
|
+
title: 'Assumes',
|
|
577
|
+
type: 'string',
|
|
578
|
+
},
|
|
579
|
+
},
|
|
580
|
+
title: 'SceneSetting',
|
|
581
|
+
type: 'object',
|
|
582
|
+
},
|
|
583
|
+
SceneStage: {
|
|
584
|
+
additionalProperties: false,
|
|
585
|
+
description: 'Directions for the page.',
|
|
586
|
+
properties: {
|
|
587
|
+
positions: {
|
|
588
|
+
additionalProperties: {
|
|
589
|
+
$ref: '#/$defs/StagePosition',
|
|
590
|
+
},
|
|
591
|
+
description: 'Where each member stands',
|
|
592
|
+
title: 'Positions',
|
|
593
|
+
type: 'object',
|
|
594
|
+
},
|
|
595
|
+
opens_first: {
|
|
596
|
+
default: '',
|
|
597
|
+
description: "Whose balloon opens first; the entry's when unsaid",
|
|
598
|
+
title: 'Opens First',
|
|
599
|
+
type: 'string',
|
|
600
|
+
},
|
|
601
|
+
transcript: {
|
|
602
|
+
$ref: '#/$defs/SceneTranscript',
|
|
603
|
+
description: 'What the transcript shows',
|
|
604
|
+
},
|
|
605
|
+
inspectors: {
|
|
606
|
+
description: 'The inspectors offered',
|
|
607
|
+
items: {
|
|
608
|
+
$ref: '#/$defs/Inspector',
|
|
609
|
+
},
|
|
610
|
+
title: 'Inspectors',
|
|
611
|
+
type: 'array',
|
|
612
|
+
},
|
|
613
|
+
rests_after: {
|
|
614
|
+
default: '',
|
|
615
|
+
description: 'How long the scene plays before it rests',
|
|
616
|
+
pattern: '^(?:[1-9]\\d*(?:ms|s|m|h))?$',
|
|
617
|
+
title: 'Rests After',
|
|
618
|
+
type: 'string',
|
|
619
|
+
},
|
|
620
|
+
pace: {
|
|
621
|
+
$ref: '#/$defs/Pace',
|
|
622
|
+
default: 'steady',
|
|
623
|
+
description: 'The pace of the beats that say none',
|
|
624
|
+
},
|
|
625
|
+
},
|
|
626
|
+
title: 'SceneStage',
|
|
627
|
+
type: 'object',
|
|
628
|
+
},
|
|
629
|
+
SceneSystem: {
|
|
630
|
+
additionalProperties: false,
|
|
631
|
+
description: 'A system on stage: an MCP server of the catalogue the cast reaches.',
|
|
632
|
+
properties: {
|
|
633
|
+
server: {
|
|
634
|
+
description: 'An MCP server of the catalogue, `id` or `id:version`',
|
|
635
|
+
title: 'Server',
|
|
636
|
+
type: 'string',
|
|
637
|
+
},
|
|
638
|
+
as: {
|
|
639
|
+
default: '',
|
|
640
|
+
description: 'The name the audience reads on the graph and in the transcript',
|
|
641
|
+
title: 'As',
|
|
642
|
+
type: 'string',
|
|
643
|
+
},
|
|
644
|
+
holds: {
|
|
645
|
+
default: '',
|
|
646
|
+
description: "What it holds in this scene: *Datalayer's own books, March 2026*",
|
|
647
|
+
title: 'Holds',
|
|
648
|
+
type: 'string',
|
|
649
|
+
},
|
|
650
|
+
},
|
|
651
|
+
required: ['server'],
|
|
652
|
+
title: 'SceneSystem',
|
|
653
|
+
type: 'object',
|
|
654
|
+
},
|
|
655
|
+
SceneTranscript: {
|
|
656
|
+
additionalProperties: false,
|
|
657
|
+
description: 'What the transcript shows.',
|
|
658
|
+
properties: {
|
|
659
|
+
tools: {
|
|
660
|
+
default: true,
|
|
661
|
+
description: 'Whether tool lines are shown',
|
|
662
|
+
title: 'Tools',
|
|
663
|
+
type: 'boolean',
|
|
664
|
+
},
|
|
665
|
+
narration: {
|
|
666
|
+
default: true,
|
|
667
|
+
description: "Whether the beats' narration is read in it",
|
|
668
|
+
title: 'Narration',
|
|
669
|
+
type: 'boolean',
|
|
670
|
+
},
|
|
671
|
+
withhold: {
|
|
672
|
+
description: 'Words withheld: credentials, ids, …',
|
|
673
|
+
items: {
|
|
674
|
+
$ref: '#/$defs/Withheld',
|
|
675
|
+
},
|
|
676
|
+
title: 'Withhold',
|
|
677
|
+
type: 'array',
|
|
678
|
+
},
|
|
679
|
+
},
|
|
680
|
+
title: 'SceneTranscript',
|
|
681
|
+
type: 'object',
|
|
682
|
+
},
|
|
683
|
+
StagePosition: {
|
|
684
|
+
additionalProperties: false,
|
|
685
|
+
description: 'Where a member stands: fractions of the box, left to right and top to bottom.',
|
|
686
|
+
properties: {
|
|
687
|
+
x: {
|
|
688
|
+
maximum: 1,
|
|
689
|
+
minimum: 0,
|
|
690
|
+
title: 'X',
|
|
691
|
+
type: 'number',
|
|
692
|
+
},
|
|
693
|
+
y: {
|
|
694
|
+
maximum: 1,
|
|
695
|
+
minimum: 0,
|
|
696
|
+
title: 'Y',
|
|
697
|
+
type: 'number',
|
|
698
|
+
},
|
|
699
|
+
},
|
|
700
|
+
required: ['x', 'y'],
|
|
701
|
+
title: 'StagePosition',
|
|
702
|
+
type: 'object',
|
|
703
|
+
},
|
|
704
|
+
TeamLink: {
|
|
705
|
+
description: 'One member asking another, directly, over a protocol.\n\nDistinct from `depends_on`, which orders work: a link says who may ask\nwhom while the work runs, in either order and as often as it needs.',
|
|
706
|
+
properties: {
|
|
707
|
+
member: {
|
|
708
|
+
description: 'The member asked, by its id in this team',
|
|
709
|
+
title: 'Member',
|
|
710
|
+
type: 'string',
|
|
711
|
+
},
|
|
712
|
+
over: {
|
|
713
|
+
$ref: '#/$defs/TeamProtocol',
|
|
714
|
+
default: 'a2a',
|
|
715
|
+
description: 'The protocol it is asked over: `a2a` to an agent or an application, `mcp` to a server',
|
|
716
|
+
},
|
|
717
|
+
},
|
|
718
|
+
required: ['member'],
|
|
719
|
+
title: 'TeamLink',
|
|
720
|
+
type: 'object',
|
|
721
|
+
},
|
|
722
|
+
TeamPlace: {
|
|
723
|
+
description: "Where a member's loop turns.\n\nA team of applications can be split between the person's page and a\nruntime: what reads the person's screen and talks to them turns in their\nbrowser, what reaches a company's systems turns on a runtime, where its\nconnections and its credentials are.",
|
|
724
|
+
enum: ['browser', 'runtime'],
|
|
725
|
+
title: 'TeamPlace',
|
|
726
|
+
type: 'string',
|
|
727
|
+
},
|
|
728
|
+
TeamProtocol: {
|
|
729
|
+
description: 'How one member talks to another.',
|
|
730
|
+
enum: ['a2a', 'mcp'],
|
|
731
|
+
title: 'TeamProtocol',
|
|
732
|
+
type: 'string',
|
|
733
|
+
},
|
|
734
|
+
TeamRole: {
|
|
735
|
+
description: 'What a member is *for*, structurally.\n\nDeliberately about position in the work rather than about subject matter: a\nteam of analysts and a team of reviewers have the same shape, and a runtime\nscheduling them cares which member opens the work and which closes it, not\nwhat the work is about.',
|
|
736
|
+
enum: [
|
|
737
|
+
'coordinator',
|
|
738
|
+
'initiator',
|
|
739
|
+
'contributor',
|
|
740
|
+
'reviewer',
|
|
741
|
+
'finalizer',
|
|
742
|
+
],
|
|
743
|
+
title: 'TeamRole',
|
|
744
|
+
type: 'string',
|
|
745
|
+
},
|
|
746
|
+
Watchers: {
|
|
747
|
+
description: 'Who may watch and ask.',
|
|
748
|
+
enum: ['visitors', 'signed-in', 'nobody'],
|
|
749
|
+
title: 'Watchers',
|
|
750
|
+
type: 'string',
|
|
751
|
+
},
|
|
752
|
+
Withheld: {
|
|
753
|
+
description: 'What the transcript does not show.',
|
|
754
|
+
enum: ['credentials', 'ids', 'addresses', 'amounts'],
|
|
755
|
+
title: 'Withheld',
|
|
756
|
+
type: 'string',
|
|
757
|
+
},
|
|
758
|
+
},
|
|
759
|
+
additionalProperties: false,
|
|
760
|
+
description: 'Specification for a scene: a team, staged.',
|
|
761
|
+
properties: {
|
|
762
|
+
schema: {
|
|
763
|
+
description: 'The version of the spec itself',
|
|
764
|
+
title: 'Schema',
|
|
765
|
+
const: 'loop.scene/v1',
|
|
766
|
+
default: 'loop.scene/v1',
|
|
767
|
+
},
|
|
768
|
+
id: {
|
|
769
|
+
description: 'Unique scene identifier',
|
|
770
|
+
title: 'Id',
|
|
771
|
+
type: 'string',
|
|
772
|
+
},
|
|
773
|
+
version: {
|
|
774
|
+
default: '0.0.1',
|
|
775
|
+
description: 'Scene version',
|
|
776
|
+
title: 'Version',
|
|
777
|
+
type: 'string',
|
|
778
|
+
},
|
|
779
|
+
name: {
|
|
780
|
+
description: "Display name: the tab's",
|
|
781
|
+
title: 'Name',
|
|
782
|
+
type: 'string',
|
|
783
|
+
},
|
|
784
|
+
description: {
|
|
785
|
+
default: '',
|
|
786
|
+
description: 'What happens in it, in a sentence',
|
|
787
|
+
title: 'Description',
|
|
788
|
+
type: 'string',
|
|
789
|
+
},
|
|
790
|
+
tags: {
|
|
791
|
+
items: {
|
|
792
|
+
type: 'string',
|
|
793
|
+
},
|
|
794
|
+
title: 'Tags',
|
|
795
|
+
type: 'array',
|
|
796
|
+
},
|
|
797
|
+
icon: {
|
|
798
|
+
default: 'people',
|
|
799
|
+
description: 'Icon identifier',
|
|
800
|
+
title: 'Icon',
|
|
801
|
+
type: 'string',
|
|
802
|
+
},
|
|
803
|
+
emoji: {
|
|
804
|
+
default: '👀',
|
|
805
|
+
description: 'Its face: one emoji, drawn before its name',
|
|
806
|
+
title: 'Emoji',
|
|
807
|
+
type: 'string',
|
|
808
|
+
},
|
|
809
|
+
team: {
|
|
810
|
+
default: '',
|
|
811
|
+
description: 'The team it stages, `id` or `id:version`',
|
|
812
|
+
title: 'Team',
|
|
813
|
+
type: 'string',
|
|
814
|
+
},
|
|
815
|
+
entry: {
|
|
816
|
+
default: '',
|
|
817
|
+
description: "The member the audience talks to; the team's entry when unsaid",
|
|
818
|
+
title: 'Entry',
|
|
819
|
+
type: 'string',
|
|
820
|
+
},
|
|
821
|
+
cast: {
|
|
822
|
+
description: 'The cast: personas and briefs, or the members',
|
|
823
|
+
items: {
|
|
824
|
+
$ref: '#/$defs/SceneCastMember',
|
|
825
|
+
},
|
|
826
|
+
title: 'Cast',
|
|
827
|
+
type: 'array',
|
|
828
|
+
},
|
|
829
|
+
setting: {
|
|
830
|
+
$ref: '#/$defs/SceneSetting',
|
|
831
|
+
description: 'The stage',
|
|
832
|
+
},
|
|
833
|
+
script: {
|
|
834
|
+
description: 'The beats, in order',
|
|
835
|
+
items: {
|
|
836
|
+
$ref: '#/$defs/SceneBeat',
|
|
837
|
+
},
|
|
838
|
+
title: 'Script',
|
|
839
|
+
type: 'array',
|
|
840
|
+
},
|
|
841
|
+
stage: {
|
|
842
|
+
$ref: '#/$defs/SceneStage',
|
|
843
|
+
description: 'Directions for the page',
|
|
844
|
+
},
|
|
845
|
+
audience: {
|
|
846
|
+
$ref: '#/$defs/SceneAudience',
|
|
847
|
+
description: 'Who may watch and ask',
|
|
848
|
+
},
|
|
849
|
+
rehearsal: {
|
|
850
|
+
$ref: '#/$defs/SceneRehearsal',
|
|
851
|
+
description: 'Its tests',
|
|
852
|
+
},
|
|
853
|
+
deployment: {
|
|
854
|
+
$ref: '#/$defs/SceneDeployment',
|
|
855
|
+
description: 'Where it plays',
|
|
856
|
+
},
|
|
857
|
+
},
|
|
858
|
+
required: ['id', 'name'],
|
|
859
|
+
title: 'Scene spec',
|
|
860
|
+
type: 'object',
|
|
861
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
862
|
+
$id: 'https://agentspecs.datalayer.tech/schemas/loop.scene/v1.json',
|
|
863
|
+
};
|