@pragma-sh/constants 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/package.json +42 -0
- package/schema.json +4440 -0
- package/src/generated/constants.ts +2883 -0
- package/src/index.ts +174 -0
- package/values.json +361 -0
package/schema.json
ADDED
|
@@ -0,0 +1,4440 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Constants",
|
|
4
|
+
"description": "Shared compile-time constants. Single source of truth for both the TypeScript frontend (src) and the Rust backend (src-tauri). Edit values.json; never edit generated code.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"app",
|
|
9
|
+
"window",
|
|
10
|
+
"editorLaunchers",
|
|
11
|
+
"scripts",
|
|
12
|
+
"agents",
|
|
13
|
+
"daemon",
|
|
14
|
+
"gateway",
|
|
15
|
+
"platform",
|
|
16
|
+
"protocol",
|
|
17
|
+
"github",
|
|
18
|
+
"plugins",
|
|
19
|
+
"theme",
|
|
20
|
+
"tunnel",
|
|
21
|
+
"keybindings",
|
|
22
|
+
"agentStatus",
|
|
23
|
+
"terminalDefaults",
|
|
24
|
+
"tabs",
|
|
25
|
+
"bench",
|
|
26
|
+
"files",
|
|
27
|
+
"scratchpads",
|
|
28
|
+
"whiteboards",
|
|
29
|
+
"fanout",
|
|
30
|
+
"updates",
|
|
31
|
+
"onboarding"
|
|
32
|
+
],
|
|
33
|
+
"properties": {
|
|
34
|
+
"app": {
|
|
35
|
+
"$ref": "#/definitions/AppInfo"
|
|
36
|
+
},
|
|
37
|
+
"window": {
|
|
38
|
+
"$ref": "#/definitions/WindowDefaults"
|
|
39
|
+
},
|
|
40
|
+
"editorLaunchers": {
|
|
41
|
+
"$ref": "#/definitions/EditorLaunchers"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"$ref": "#/definitions/Scripts"
|
|
45
|
+
},
|
|
46
|
+
"agents": {
|
|
47
|
+
"$ref": "#/definitions/Agents"
|
|
48
|
+
},
|
|
49
|
+
"platform": {
|
|
50
|
+
"$ref": "#/definitions/Platform"
|
|
51
|
+
},
|
|
52
|
+
"daemon": {
|
|
53
|
+
"$ref": "#/definitions/Daemon"
|
|
54
|
+
},
|
|
55
|
+
"gateway": {
|
|
56
|
+
"$ref": "#/definitions/Gateway"
|
|
57
|
+
},
|
|
58
|
+
"protocol": {
|
|
59
|
+
"$ref": "#/definitions/Protocol"
|
|
60
|
+
},
|
|
61
|
+
"github": {
|
|
62
|
+
"$ref": "#/definitions/GitHub"
|
|
63
|
+
},
|
|
64
|
+
"plugins": {
|
|
65
|
+
"$ref": "#/definitions/Plugins"
|
|
66
|
+
},
|
|
67
|
+
"theme": {
|
|
68
|
+
"$ref": "#/definitions/Theme"
|
|
69
|
+
},
|
|
70
|
+
"tunnel": {
|
|
71
|
+
"$ref": "#/definitions/Tunnel"
|
|
72
|
+
},
|
|
73
|
+
"keybindings": {
|
|
74
|
+
"$ref": "#/definitions/KeybindingsFiles"
|
|
75
|
+
},
|
|
76
|
+
"agentStatus": {
|
|
77
|
+
"$ref": "#/definitions/AgentStatusDefaults"
|
|
78
|
+
},
|
|
79
|
+
"terminalDefaults": {
|
|
80
|
+
"$ref": "#/definitions/TerminalDefaults"
|
|
81
|
+
},
|
|
82
|
+
"tabs": {
|
|
83
|
+
"$ref": "#/definitions/TabDefaults"
|
|
84
|
+
},
|
|
85
|
+
"bench": {
|
|
86
|
+
"$ref": "#/definitions/Bench"
|
|
87
|
+
},
|
|
88
|
+
"files": {
|
|
89
|
+
"$ref": "#/definitions/FileReadLimits"
|
|
90
|
+
},
|
|
91
|
+
"scratchpads": {
|
|
92
|
+
"$ref": "#/definitions/Scratchpads"
|
|
93
|
+
},
|
|
94
|
+
"whiteboards": {
|
|
95
|
+
"$ref": "#/definitions/WhiteboardDefaults"
|
|
96
|
+
},
|
|
97
|
+
"fanout": {
|
|
98
|
+
"$ref": "#/definitions/FanoutDefaults"
|
|
99
|
+
},
|
|
100
|
+
"updates": {
|
|
101
|
+
"$ref": "#/definitions/Updates"
|
|
102
|
+
},
|
|
103
|
+
"onboarding": {
|
|
104
|
+
"$ref": "#/definitions/Onboarding"
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"definitions": {
|
|
108
|
+
"ProtocolRpcMethod": {
|
|
109
|
+
"title": "ProtocolRpcMethod",
|
|
110
|
+
"description": "Top-level request/response RPC domains served by pragma-server over the Unix-socket frame protocol.",
|
|
111
|
+
"type": "string",
|
|
112
|
+
"enum": [
|
|
113
|
+
"git",
|
|
114
|
+
"filesystem",
|
|
115
|
+
"database",
|
|
116
|
+
"kanban",
|
|
117
|
+
"worktrees",
|
|
118
|
+
"projects",
|
|
119
|
+
"tabs",
|
|
120
|
+
"settings",
|
|
121
|
+
"github",
|
|
122
|
+
"ai",
|
|
123
|
+
"exec",
|
|
124
|
+
"automations",
|
|
125
|
+
"plugins",
|
|
126
|
+
"tunnel",
|
|
127
|
+
"ports",
|
|
128
|
+
"scratchpads",
|
|
129
|
+
"whiteboards",
|
|
130
|
+
"wsl",
|
|
131
|
+
"fanouts"
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
"ProtocolEventKind": {
|
|
135
|
+
"title": "ProtocolEventKind",
|
|
136
|
+
"description": "Snapshot-then-delta subscription event streams served by pragma-server.",
|
|
137
|
+
"type": "string",
|
|
138
|
+
"enum": [
|
|
139
|
+
"agentStatus",
|
|
140
|
+
"worktreeChanged",
|
|
141
|
+
"kanbanChanged",
|
|
142
|
+
"tabsChanged",
|
|
143
|
+
"fileChanged",
|
|
144
|
+
"echoMode",
|
|
145
|
+
"automationPending",
|
|
146
|
+
"automationsChanged",
|
|
147
|
+
"workspace",
|
|
148
|
+
"fanouts"
|
|
149
|
+
]
|
|
150
|
+
},
|
|
151
|
+
"ProtocolErrorCode": {
|
|
152
|
+
"title": "ProtocolErrorCode",
|
|
153
|
+
"description": "Stable protocol-level RPC error codes.",
|
|
154
|
+
"type": "string",
|
|
155
|
+
"enum": [
|
|
156
|
+
"invalidPayload",
|
|
157
|
+
"unsupportedMethod",
|
|
158
|
+
"notFound",
|
|
159
|
+
"staleWrite",
|
|
160
|
+
"permissionDenied",
|
|
161
|
+
"internal"
|
|
162
|
+
]
|
|
163
|
+
},
|
|
164
|
+
"FanoutDefaults": {
|
|
165
|
+
"title": "FanoutDefaults",
|
|
166
|
+
"description": "Shipped defaults for fanout orchestration: the host state file, attempt branch naming, the member floor, and follow-up delivery timeouts. Both `pragma-server` and the desktop read these instead of hard-coding either side.",
|
|
167
|
+
"type": "object",
|
|
168
|
+
"additionalProperties": false,
|
|
169
|
+
"required": [
|
|
170
|
+
"stateFile",
|
|
171
|
+
"branchPrefix",
|
|
172
|
+
"minMembers",
|
|
173
|
+
"defaultJobs",
|
|
174
|
+
"deliveryTimeoutMs",
|
|
175
|
+
"envFanoutId",
|
|
176
|
+
"envMemberId"
|
|
177
|
+
],
|
|
178
|
+
"properties": {
|
|
179
|
+
"stateFile": {
|
|
180
|
+
"type": "string",
|
|
181
|
+
"description": "Owner-only durable fanout record, written beside the server socket."
|
|
182
|
+
},
|
|
183
|
+
"branchPrefix": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"description": "Leading segment of every generated attempt branch (`<prefix>/<fanout>/<member>`)."
|
|
186
|
+
},
|
|
187
|
+
"minMembers": {
|
|
188
|
+
"type": "integer",
|
|
189
|
+
"minimum": 2,
|
|
190
|
+
"description": "Fewest attempts a fanout may have. A single attempt is an ordinary agent launch."
|
|
191
|
+
},
|
|
192
|
+
"defaultJobs": {
|
|
193
|
+
"type": "integer",
|
|
194
|
+
"minimum": 1,
|
|
195
|
+
"description": "Default bound on concurrently launching attempts."
|
|
196
|
+
},
|
|
197
|
+
"deliveryTimeoutMs": {
|
|
198
|
+
"type": "integer",
|
|
199
|
+
"minimum": 1,
|
|
200
|
+
"description": "How long a waiting follow-up send waits for each member's delivery receipt."
|
|
201
|
+
},
|
|
202
|
+
"envFanoutId": {
|
|
203
|
+
"type": "string",
|
|
204
|
+
"description": "Environment variable exported into every attempt session with the owning fanout id."
|
|
205
|
+
},
|
|
206
|
+
"envMemberId": {
|
|
207
|
+
"type": "string",
|
|
208
|
+
"description": "Environment variable exported into every attempt session with its member id."
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
"FanoutStatus": {
|
|
213
|
+
"title": "FanoutStatus",
|
|
214
|
+
"description": "Lifecycle of one fanout. Deliberately separate from agent runtime status: an attempt's agent may be idle while the fanout is still `active`.",
|
|
215
|
+
"type": "string",
|
|
216
|
+
"enum": [
|
|
217
|
+
"provisioning",
|
|
218
|
+
"active",
|
|
219
|
+
"attention",
|
|
220
|
+
"partial",
|
|
221
|
+
"ready",
|
|
222
|
+
"failed",
|
|
223
|
+
"interrupted",
|
|
224
|
+
"cancelled",
|
|
225
|
+
"finalizing",
|
|
226
|
+
"needsResolution",
|
|
227
|
+
"cleanupFailed",
|
|
228
|
+
"completed"
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
"FanoutMemberStatus": {
|
|
232
|
+
"title": "FanoutMemberStatus",
|
|
233
|
+
"description": "Lifecycle of one fanout attempt. `interrupted` means the host restarted while the attempt was live; its prompt is never replayed automatically.",
|
|
234
|
+
"type": "string",
|
|
235
|
+
"enum": [
|
|
236
|
+
"pending",
|
|
237
|
+
"provisioning",
|
|
238
|
+
"running",
|
|
239
|
+
"attention",
|
|
240
|
+
"done",
|
|
241
|
+
"failed",
|
|
242
|
+
"interrupted",
|
|
243
|
+
"cancelled",
|
|
244
|
+
"selected"
|
|
245
|
+
]
|
|
246
|
+
},
|
|
247
|
+
"FanoutFinalizeStage": {
|
|
248
|
+
"title": "FanoutFinalizeStage",
|
|
249
|
+
"description": "Durable progress marker for the destructive pick transaction. Persisted after every successful step so a retry resumes at the first incomplete stage instead of repeating a destructive one.",
|
|
250
|
+
"type": "string",
|
|
251
|
+
"enum": [
|
|
252
|
+
"validating",
|
|
253
|
+
"committingWinner",
|
|
254
|
+
"merging",
|
|
255
|
+
"promotingScratchpads",
|
|
256
|
+
"stoppingSessions",
|
|
257
|
+
"cleaningUp",
|
|
258
|
+
"completed"
|
|
259
|
+
]
|
|
260
|
+
},
|
|
261
|
+
"FanoutFailureCode": {
|
|
262
|
+
"title": "FanoutFailureCode",
|
|
263
|
+
"description": "Machine-readable reason a fanout operation failed, preserved through the CLI, the gateway, and the SDK so callers branch on a code rather than on message text.",
|
|
264
|
+
"type": "string",
|
|
265
|
+
"enum": [
|
|
266
|
+
"invalidSelector",
|
|
267
|
+
"unknownAgent",
|
|
268
|
+
"unknownModel",
|
|
269
|
+
"unknownReasoning",
|
|
270
|
+
"activeFanoutExists",
|
|
271
|
+
"dirtyParent",
|
|
272
|
+
"worktreeCreateFailed",
|
|
273
|
+
"setupFailed",
|
|
274
|
+
"launchFailed",
|
|
275
|
+
"notFound",
|
|
276
|
+
"conflict",
|
|
277
|
+
"descendantWorktree",
|
|
278
|
+
"commitMessageFailed",
|
|
279
|
+
"mergeConflict",
|
|
280
|
+
"promotionFailed",
|
|
281
|
+
"cleanupFailed",
|
|
282
|
+
"internal"
|
|
283
|
+
]
|
|
284
|
+
},
|
|
285
|
+
"FanoutFailure": {
|
|
286
|
+
"title": "FanoutFailure",
|
|
287
|
+
"description": "One failure attached to a fanout or a single member.",
|
|
288
|
+
"type": "object",
|
|
289
|
+
"additionalProperties": false,
|
|
290
|
+
"required": ["code", "message"],
|
|
291
|
+
"properties": {
|
|
292
|
+
"code": {
|
|
293
|
+
"$ref": "#/definitions/FanoutFailureCode"
|
|
294
|
+
},
|
|
295
|
+
"message": {
|
|
296
|
+
"type": "string"
|
|
297
|
+
},
|
|
298
|
+
"memberId": {
|
|
299
|
+
"type": ["string", "null"],
|
|
300
|
+
"description": "Member the failure belongs to, or null for a fanout-wide failure."
|
|
301
|
+
},
|
|
302
|
+
"stage": {
|
|
303
|
+
"description": "Finalize stage the failure happened in, when it happened during a pick.",
|
|
304
|
+
"anyOf": [
|
|
305
|
+
{
|
|
306
|
+
"$ref": "#/definitions/FanoutFinalizeStage"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"type": "null"
|
|
310
|
+
}
|
|
311
|
+
]
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
"FanoutMemberSelector": {
|
|
316
|
+
"title": "FanoutMemberSelector",
|
|
317
|
+
"description": "One requested attempt before resolution. `selector` is the raw `agent[.model[.reasoning]]` text a CLI caller typed; a structured caller may instead set the fields directly. Duplicate selectors are valid \u2014 sampling one model twice is a supported use.",
|
|
318
|
+
"type": "object",
|
|
319
|
+
"additionalProperties": false,
|
|
320
|
+
"required": ["selector"],
|
|
321
|
+
"properties": {
|
|
322
|
+
"selector": {
|
|
323
|
+
"type": "string",
|
|
324
|
+
"description": "Raw selector text: a catalog agent id optionally followed by `.<modelId>` and `.<reasoningId>`."
|
|
325
|
+
},
|
|
326
|
+
"modelId": {
|
|
327
|
+
"type": ["string", "null"],
|
|
328
|
+
"description": "Explicit model id, overriding anything parsed out of `selector`."
|
|
329
|
+
},
|
|
330
|
+
"reasoningId": {
|
|
331
|
+
"type": ["string", "null"],
|
|
332
|
+
"description": "Explicit reasoning id, overriding both `selector` and the request-wide default."
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
"FanoutMember": {
|
|
337
|
+
"title": "FanoutMember",
|
|
338
|
+
"description": "One durable fanout attempt: a worktree branched from the fanout's captured base commit, plus the agent-owned terminal tab running in it.",
|
|
339
|
+
"type": "object",
|
|
340
|
+
"additionalProperties": false,
|
|
341
|
+
"required": [
|
|
342
|
+
"id",
|
|
343
|
+
"ordinal",
|
|
344
|
+
"selector",
|
|
345
|
+
"catalogAgentId",
|
|
346
|
+
"runtimeAgentId",
|
|
347
|
+
"modelId",
|
|
348
|
+
"reasoningId",
|
|
349
|
+
"branch",
|
|
350
|
+
"worktreeId",
|
|
351
|
+
"tabId",
|
|
352
|
+
"priorTabIds",
|
|
353
|
+
"status",
|
|
354
|
+
"failure"
|
|
355
|
+
],
|
|
356
|
+
"properties": {
|
|
357
|
+
"id": {
|
|
358
|
+
"type": "string"
|
|
359
|
+
},
|
|
360
|
+
"ordinal": {
|
|
361
|
+
"type": "integer",
|
|
362
|
+
"minimum": 0,
|
|
363
|
+
"description": "Stable creation order, so the comparison grid column order never shuffles."
|
|
364
|
+
},
|
|
365
|
+
"selector": {
|
|
366
|
+
"type": "string",
|
|
367
|
+
"description": "The selector text this member was created from, retained for retry and display."
|
|
368
|
+
},
|
|
369
|
+
"catalogAgentId": {
|
|
370
|
+
"type": "string",
|
|
371
|
+
"description": "Fully qualified plugin catalog id (`plugin.agent`) used to resolve launch metadata."
|
|
372
|
+
},
|
|
373
|
+
"runtimeAgentId": {
|
|
374
|
+
"type": "string",
|
|
375
|
+
"description": "Runtime reporter/watcher id the agent event stream is keyed by. Never derive this at a call site \u2014 the host resolves it from the plugin's watcher metadata."
|
|
376
|
+
},
|
|
377
|
+
"modelId": {
|
|
378
|
+
"type": ["string", "null"]
|
|
379
|
+
},
|
|
380
|
+
"reasoningId": {
|
|
381
|
+
"type": ["string", "null"]
|
|
382
|
+
},
|
|
383
|
+
"branch": {
|
|
384
|
+
"type": "string"
|
|
385
|
+
},
|
|
386
|
+
"worktreeId": {
|
|
387
|
+
"type": ["string", "null"]
|
|
388
|
+
},
|
|
389
|
+
"tabId": {
|
|
390
|
+
"type": ["string", "null"]
|
|
391
|
+
},
|
|
392
|
+
"priorTabIds": {
|
|
393
|
+
"type": "array",
|
|
394
|
+
"items": {
|
|
395
|
+
"type": "string"
|
|
396
|
+
},
|
|
397
|
+
"description": "Tabs this member previously ran in. A retry moves the current tab id here."
|
|
398
|
+
},
|
|
399
|
+
"status": {
|
|
400
|
+
"$ref": "#/definitions/FanoutMemberStatus"
|
|
401
|
+
},
|
|
402
|
+
"failure": {
|
|
403
|
+
"anyOf": [
|
|
404
|
+
{
|
|
405
|
+
"$ref": "#/definitions/FanoutFailure"
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
"type": "null"
|
|
409
|
+
}
|
|
410
|
+
]
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
"Fanout": {
|
|
415
|
+
"title": "Fanout",
|
|
416
|
+
"description": "One durable fanout: a single parent worktree, an immutable base commit, one shared prompt, and N isolated attempts. A parent may own at most one fanout that is not in a terminal state.",
|
|
417
|
+
"type": "object",
|
|
418
|
+
"additionalProperties": false,
|
|
419
|
+
"required": [
|
|
420
|
+
"id",
|
|
421
|
+
"projectId",
|
|
422
|
+
"parentWorktreeId",
|
|
423
|
+
"sourceWorktreeId",
|
|
424
|
+
"ownsParent",
|
|
425
|
+
"baseCommit",
|
|
426
|
+
"title",
|
|
427
|
+
"prompt",
|
|
428
|
+
"status",
|
|
429
|
+
"winningMemberId",
|
|
430
|
+
"finalizeStage",
|
|
431
|
+
"members",
|
|
432
|
+
"createdAt",
|
|
433
|
+
"updatedAt"
|
|
434
|
+
],
|
|
435
|
+
"properties": {
|
|
436
|
+
"id": {
|
|
437
|
+
"type": "string"
|
|
438
|
+
},
|
|
439
|
+
"projectId": {
|
|
440
|
+
"type": "string"
|
|
441
|
+
},
|
|
442
|
+
"parentWorktreeId": {
|
|
443
|
+
"type": "string"
|
|
444
|
+
},
|
|
445
|
+
"sourceWorktreeId": {
|
|
446
|
+
"type": ["string", "null"],
|
|
447
|
+
"description": "Worktree a newly-created coordination parent was branched from; null when an existing parent was used."
|
|
448
|
+
},
|
|
449
|
+
"ownsParent": {
|
|
450
|
+
"type": "boolean",
|
|
451
|
+
"description": "True when this fanout created its own parent worktree."
|
|
452
|
+
},
|
|
453
|
+
"baseCommit": {
|
|
454
|
+
"type": "string",
|
|
455
|
+
"description": "Exact parent HEAD captured at creation. Every attempt branches from it and every comparison diffs against it, even after the parent moves on."
|
|
456
|
+
},
|
|
457
|
+
"title": {
|
|
458
|
+
"type": "string"
|
|
459
|
+
},
|
|
460
|
+
"prompt": {
|
|
461
|
+
"type": "string"
|
|
462
|
+
},
|
|
463
|
+
"status": {
|
|
464
|
+
"$ref": "#/definitions/FanoutStatus"
|
|
465
|
+
},
|
|
466
|
+
"winningMemberId": {
|
|
467
|
+
"type": ["string", "null"]
|
|
468
|
+
},
|
|
469
|
+
"finalizeStage": {
|
|
470
|
+
"anyOf": [
|
|
471
|
+
{
|
|
472
|
+
"$ref": "#/definitions/FanoutFinalizeStage"
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
"type": "null"
|
|
476
|
+
}
|
|
477
|
+
]
|
|
478
|
+
},
|
|
479
|
+
"failure": {
|
|
480
|
+
"anyOf": [
|
|
481
|
+
{
|
|
482
|
+
"$ref": "#/definitions/FanoutFailure"
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
"type": "null"
|
|
486
|
+
}
|
|
487
|
+
]
|
|
488
|
+
},
|
|
489
|
+
"members": {
|
|
490
|
+
"type": "array",
|
|
491
|
+
"items": {
|
|
492
|
+
"$ref": "#/definitions/FanoutMember"
|
|
493
|
+
}
|
|
494
|
+
},
|
|
495
|
+
"createdAt": {
|
|
496
|
+
"type": "string"
|
|
497
|
+
},
|
|
498
|
+
"updatedAt": {
|
|
499
|
+
"type": "string"
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
},
|
|
503
|
+
"FanoutExistingParent": {
|
|
504
|
+
"title": "FanoutExistingParent",
|
|
505
|
+
"type": "object",
|
|
506
|
+
"additionalProperties": false,
|
|
507
|
+
"required": ["kind", "worktreeId"],
|
|
508
|
+
"properties": {
|
|
509
|
+
"kind": {
|
|
510
|
+
"type": "string",
|
|
511
|
+
"enum": ["existing"]
|
|
512
|
+
},
|
|
513
|
+
"worktreeId": {
|
|
514
|
+
"type": "string"
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
},
|
|
518
|
+
"FanoutNewParent": {
|
|
519
|
+
"title": "FanoutNewParent",
|
|
520
|
+
"type": "object",
|
|
521
|
+
"additionalProperties": false,
|
|
522
|
+
"required": ["kind", "sourceWorktreeId", "branch"],
|
|
523
|
+
"properties": {
|
|
524
|
+
"kind": {
|
|
525
|
+
"type": "string",
|
|
526
|
+
"enum": ["new"]
|
|
527
|
+
},
|
|
528
|
+
"sourceWorktreeId": {
|
|
529
|
+
"type": "string"
|
|
530
|
+
},
|
|
531
|
+
"branch": {
|
|
532
|
+
"type": "string"
|
|
533
|
+
},
|
|
534
|
+
"title": {
|
|
535
|
+
"type": ["string", "null"]
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
"FanoutParentSpec": {
|
|
540
|
+
"title": "FanoutParentSpec",
|
|
541
|
+
"description": "Where a fanout's single parent comes from: an existing worktree, or a fresh coordination worktree created from a source worktree.",
|
|
542
|
+
"anyOf": [
|
|
543
|
+
{
|
|
544
|
+
"$ref": "#/definitions/FanoutExistingParent"
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"$ref": "#/definitions/FanoutNewParent"
|
|
548
|
+
}
|
|
549
|
+
]
|
|
550
|
+
},
|
|
551
|
+
"FanoutCreateRequest": {
|
|
552
|
+
"title": "FanoutCreateRequest",
|
|
553
|
+
"type": "object",
|
|
554
|
+
"additionalProperties": false,
|
|
555
|
+
"required": ["projectId", "parent", "prompt", "members"],
|
|
556
|
+
"properties": {
|
|
557
|
+
"projectId": {
|
|
558
|
+
"type": "string"
|
|
559
|
+
},
|
|
560
|
+
"parent": {
|
|
561
|
+
"$ref": "#/definitions/FanoutParentSpec"
|
|
562
|
+
},
|
|
563
|
+
"prompt": {
|
|
564
|
+
"type": "string"
|
|
565
|
+
},
|
|
566
|
+
"title": {
|
|
567
|
+
"type": ["string", "null"],
|
|
568
|
+
"description": "Display title. Derived from the prompt's first line when omitted."
|
|
569
|
+
},
|
|
570
|
+
"defaultReasoningId": {
|
|
571
|
+
"type": ["string", "null"],
|
|
572
|
+
"description": "Reasoning effort applied to every member that does not name its own."
|
|
573
|
+
},
|
|
574
|
+
"members": {
|
|
575
|
+
"type": "array",
|
|
576
|
+
"items": {
|
|
577
|
+
"$ref": "#/definitions/FanoutMemberSelector"
|
|
578
|
+
}
|
|
579
|
+
},
|
|
580
|
+
"jobs": {
|
|
581
|
+
"type": ["integer", "null"],
|
|
582
|
+
"minimum": 1,
|
|
583
|
+
"description": "Bound on concurrently launching attempts. Git worktree mutations are serialized regardless."
|
|
584
|
+
},
|
|
585
|
+
"idempotencyKey": {
|
|
586
|
+
"type": ["string", "null"],
|
|
587
|
+
"description": "Repeating a create with the same key returns the existing fanout instead of provisioning a second one."
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
},
|
|
591
|
+
"FanoutRef": {
|
|
592
|
+
"title": "FanoutRef",
|
|
593
|
+
"description": "Addresses one fanout by exactly one of its id or any worktree that belongs to it (its parent, or any attempt).",
|
|
594
|
+
"type": "object",
|
|
595
|
+
"additionalProperties": false,
|
|
596
|
+
"properties": {
|
|
597
|
+
"fanoutId": {
|
|
598
|
+
"type": ["string", "null"]
|
|
599
|
+
},
|
|
600
|
+
"worktreeId": {
|
|
601
|
+
"type": ["string", "null"]
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
},
|
|
605
|
+
"FanoutReadRequest": {
|
|
606
|
+
"title": "FanoutReadRequest",
|
|
607
|
+
"type": "object",
|
|
608
|
+
"additionalProperties": false,
|
|
609
|
+
"properties": {
|
|
610
|
+
"fanoutId": {
|
|
611
|
+
"type": ["string", "null"]
|
|
612
|
+
},
|
|
613
|
+
"worktreeId": {
|
|
614
|
+
"type": ["string", "null"]
|
|
615
|
+
},
|
|
616
|
+
"memberId": {
|
|
617
|
+
"type": ["string", "null"]
|
|
618
|
+
},
|
|
619
|
+
"all": {
|
|
620
|
+
"type": ["boolean", "null"]
|
|
621
|
+
},
|
|
622
|
+
"lines": {
|
|
623
|
+
"type": ["integer", "null"],
|
|
624
|
+
"minimum": 1
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
},
|
|
628
|
+
"FanoutReadTarget": {
|
|
629
|
+
"title": "FanoutReadTarget",
|
|
630
|
+
"description": "One member's terminal output. `text` is the escape-stripped rendering; `data` is the same bounded window as base64 raw bytes, which the SDK decodes to a Uint8Array.",
|
|
631
|
+
"type": "object",
|
|
632
|
+
"additionalProperties": false,
|
|
633
|
+
"required": ["memberId", "worktreeId", "tabId", "runtimeAgentId", "bytes", "text", "data"],
|
|
634
|
+
"properties": {
|
|
635
|
+
"memberId": {
|
|
636
|
+
"type": "string"
|
|
637
|
+
},
|
|
638
|
+
"worktreeId": {
|
|
639
|
+
"type": "string"
|
|
640
|
+
},
|
|
641
|
+
"tabId": {
|
|
642
|
+
"type": "string"
|
|
643
|
+
},
|
|
644
|
+
"runtimeAgentId": {
|
|
645
|
+
"type": "string"
|
|
646
|
+
},
|
|
647
|
+
"bytes": {
|
|
648
|
+
"type": "integer",
|
|
649
|
+
"minimum": 0
|
|
650
|
+
},
|
|
651
|
+
"text": {
|
|
652
|
+
"type": "string"
|
|
653
|
+
},
|
|
654
|
+
"data": {
|
|
655
|
+
"type": "string"
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
},
|
|
659
|
+
"FanoutReadResult": {
|
|
660
|
+
"title": "FanoutReadResult",
|
|
661
|
+
"type": "object",
|
|
662
|
+
"additionalProperties": false,
|
|
663
|
+
"required": ["fanoutId", "targets"],
|
|
664
|
+
"properties": {
|
|
665
|
+
"fanoutId": {
|
|
666
|
+
"type": "string"
|
|
667
|
+
},
|
|
668
|
+
"targets": {
|
|
669
|
+
"type": "array",
|
|
670
|
+
"items": {
|
|
671
|
+
"$ref": "#/definitions/FanoutReadTarget"
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
},
|
|
676
|
+
"FanoutSendTarget": {
|
|
677
|
+
"title": "FanoutSendTarget",
|
|
678
|
+
"description": "Who a follow-up goes to: every live member, or one stable member id.",
|
|
679
|
+
"type": "object",
|
|
680
|
+
"additionalProperties": false,
|
|
681
|
+
"required": ["kind"],
|
|
682
|
+
"properties": {
|
|
683
|
+
"kind": {
|
|
684
|
+
"type": "string",
|
|
685
|
+
"enum": ["all", "member"]
|
|
686
|
+
},
|
|
687
|
+
"memberId": {
|
|
688
|
+
"type": ["string", "null"]
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
},
|
|
692
|
+
"FanoutSendRequest": {
|
|
693
|
+
"title": "FanoutSendRequest",
|
|
694
|
+
"type": "object",
|
|
695
|
+
"additionalProperties": false,
|
|
696
|
+
"required": ["target", "message"],
|
|
697
|
+
"properties": {
|
|
698
|
+
"fanoutId": {
|
|
699
|
+
"type": ["string", "null"]
|
|
700
|
+
},
|
|
701
|
+
"worktreeId": {
|
|
702
|
+
"type": ["string", "null"]
|
|
703
|
+
},
|
|
704
|
+
"target": {
|
|
705
|
+
"$ref": "#/definitions/FanoutSendTarget"
|
|
706
|
+
},
|
|
707
|
+
"message": {
|
|
708
|
+
"type": "string"
|
|
709
|
+
},
|
|
710
|
+
"messageId": {
|
|
711
|
+
"type": ["string", "null"],
|
|
712
|
+
"description": "Caller-supplied id making a retry idempotent: a message already delivered under this id is not typed twice."
|
|
713
|
+
},
|
|
714
|
+
"waitForDelivery": {
|
|
715
|
+
"type": ["boolean", "null"],
|
|
716
|
+
"description": "Wait for bounded per-member receipts (the default) instead of returning after durable enqueue."
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
},
|
|
720
|
+
"FanoutDeliveryState": {
|
|
721
|
+
"title": "FanoutDeliveryState",
|
|
722
|
+
"description": "Follow-up delivery outcome per member: `accepted` is the fire-and-forget terminal state, the rest are only observable when waiting.",
|
|
723
|
+
"type": "string",
|
|
724
|
+
"enum": ["accepted", "delivered", "failed", "timedOut"]
|
|
725
|
+
},
|
|
726
|
+
"FanoutDeliveryReceipt": {
|
|
727
|
+
"title": "FanoutDeliveryReceipt",
|
|
728
|
+
"type": "object",
|
|
729
|
+
"additionalProperties": false,
|
|
730
|
+
"required": ["memberId", "worktreeId", "tabId", "runtimeAgentId", "messageId", "state"],
|
|
731
|
+
"properties": {
|
|
732
|
+
"memberId": {
|
|
733
|
+
"type": "string"
|
|
734
|
+
},
|
|
735
|
+
"worktreeId": {
|
|
736
|
+
"type": "string"
|
|
737
|
+
},
|
|
738
|
+
"tabId": {
|
|
739
|
+
"type": "string"
|
|
740
|
+
},
|
|
741
|
+
"runtimeAgentId": {
|
|
742
|
+
"type": "string"
|
|
743
|
+
},
|
|
744
|
+
"messageId": {
|
|
745
|
+
"type": "string"
|
|
746
|
+
},
|
|
747
|
+
"state": {
|
|
748
|
+
"$ref": "#/definitions/FanoutDeliveryState"
|
|
749
|
+
},
|
|
750
|
+
"error": {
|
|
751
|
+
"type": ["string", "null"]
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
},
|
|
755
|
+
"FanoutSendResult": {
|
|
756
|
+
"title": "FanoutSendResult",
|
|
757
|
+
"type": "object",
|
|
758
|
+
"additionalProperties": false,
|
|
759
|
+
"required": ["fanoutId", "messageId", "receipts"],
|
|
760
|
+
"properties": {
|
|
761
|
+
"fanoutId": {
|
|
762
|
+
"type": "string"
|
|
763
|
+
},
|
|
764
|
+
"messageId": {
|
|
765
|
+
"type": "string"
|
|
766
|
+
},
|
|
767
|
+
"receipts": {
|
|
768
|
+
"type": "array",
|
|
769
|
+
"items": {
|
|
770
|
+
"$ref": "#/definitions/FanoutDeliveryReceipt"
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
},
|
|
775
|
+
"FanoutMemberRequest": {
|
|
776
|
+
"title": "FanoutMemberRequest",
|
|
777
|
+
"description": "Addresses one member of one fanout \u2014 used by retry and pick.",
|
|
778
|
+
"type": "object",
|
|
779
|
+
"additionalProperties": false,
|
|
780
|
+
"required": ["memberId"],
|
|
781
|
+
"properties": {
|
|
782
|
+
"fanoutId": {
|
|
783
|
+
"type": ["string", "null"]
|
|
784
|
+
},
|
|
785
|
+
"worktreeId": {
|
|
786
|
+
"type": ["string", "null"]
|
|
787
|
+
},
|
|
788
|
+
"memberId": {
|
|
789
|
+
"type": "string"
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
},
|
|
793
|
+
"FanoutResult": {
|
|
794
|
+
"title": "FanoutResult",
|
|
795
|
+
"description": "The durable fanout after a mutation, plus any failures that did not abort it. `partial` is true when at least one member failed while others stayed healthy.",
|
|
796
|
+
"type": "object",
|
|
797
|
+
"additionalProperties": false,
|
|
798
|
+
"required": ["fanout", "partial", "failures"],
|
|
799
|
+
"properties": {
|
|
800
|
+
"fanout": {
|
|
801
|
+
"$ref": "#/definitions/Fanout"
|
|
802
|
+
},
|
|
803
|
+
"partial": {
|
|
804
|
+
"type": "boolean"
|
|
805
|
+
},
|
|
806
|
+
"failures": {
|
|
807
|
+
"type": "array",
|
|
808
|
+
"items": {
|
|
809
|
+
"$ref": "#/definitions/FanoutFailure"
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
},
|
|
814
|
+
"FanoutPickResult": {
|
|
815
|
+
"title": "FanoutPickResult",
|
|
816
|
+
"description": "Outcome of the destructive pick transaction. A conflicted or partly-cleaned pick still returns the durable fanout so a caller can resume from `stage`.",
|
|
817
|
+
"type": "object",
|
|
818
|
+
"additionalProperties": false,
|
|
819
|
+
"required": [
|
|
820
|
+
"fanout",
|
|
821
|
+
"stage",
|
|
822
|
+
"winningMemberId",
|
|
823
|
+
"promotedScratchpads",
|
|
824
|
+
"deletedWorktreeIds",
|
|
825
|
+
"survivingWorktreeIds",
|
|
826
|
+
"failures"
|
|
827
|
+
],
|
|
828
|
+
"properties": {
|
|
829
|
+
"fanout": {
|
|
830
|
+
"$ref": "#/definitions/Fanout"
|
|
831
|
+
},
|
|
832
|
+
"stage": {
|
|
833
|
+
"$ref": "#/definitions/FanoutFinalizeStage"
|
|
834
|
+
},
|
|
835
|
+
"winningMemberId": {
|
|
836
|
+
"type": "string"
|
|
837
|
+
},
|
|
838
|
+
"commit": {
|
|
839
|
+
"type": ["string", "null"],
|
|
840
|
+
"description": "Commit created from the winner's uncommitted changes, when there were any."
|
|
841
|
+
},
|
|
842
|
+
"promotedScratchpads": {
|
|
843
|
+
"type": "array",
|
|
844
|
+
"items": {
|
|
845
|
+
"type": "string"
|
|
846
|
+
},
|
|
847
|
+
"description": "Parent-relative paths the winner's scratchpads were promoted to."
|
|
848
|
+
},
|
|
849
|
+
"deletedWorktreeIds": {
|
|
850
|
+
"type": "array",
|
|
851
|
+
"items": {
|
|
852
|
+
"type": "string"
|
|
853
|
+
}
|
|
854
|
+
},
|
|
855
|
+
"survivingWorktreeIds": {
|
|
856
|
+
"type": "array",
|
|
857
|
+
"items": {
|
|
858
|
+
"type": "string"
|
|
859
|
+
},
|
|
860
|
+
"description": "Attempt worktrees cleanup could not remove. Non-empty means `cleanupFailed`, never `completed`."
|
|
861
|
+
},
|
|
862
|
+
"failures": {
|
|
863
|
+
"type": "array",
|
|
864
|
+
"items": {
|
|
865
|
+
"$ref": "#/definitions/FanoutFailure"
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
},
|
|
870
|
+
"FanoutSubscriptionPayload": {
|
|
871
|
+
"title": "FanoutSubscriptionPayload",
|
|
872
|
+
"description": "Snapshot and delta payload of the `fanouts` subscription. v1 keeps deltas trivial: every delta is a full replacement of the host's fanout set.",
|
|
873
|
+
"type": "object",
|
|
874
|
+
"additionalProperties": false,
|
|
875
|
+
"required": ["fanouts"],
|
|
876
|
+
"properties": {
|
|
877
|
+
"fanouts": {
|
|
878
|
+
"type": "array",
|
|
879
|
+
"items": {
|
|
880
|
+
"$ref": "#/definitions/Fanout"
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
},
|
|
885
|
+
"ControlMethod": {
|
|
886
|
+
"title": "ControlMethod",
|
|
887
|
+
"description": "Brokered control operations routed by pragma-server to the running app (the single controller). The CLI publishes these; the app executes the matching Tauri command and returns a ControlResult. Direct-to-server reads (tab read, agent status, agent report) are not ControlMethods.",
|
|
888
|
+
"type": "string",
|
|
889
|
+
"enum": [
|
|
890
|
+
"worktreesList",
|
|
891
|
+
"worktreeCreate",
|
|
892
|
+
"worktreeRename",
|
|
893
|
+
"worktreeSetHidden",
|
|
894
|
+
"worktreeDelete",
|
|
895
|
+
"worktreeStatus",
|
|
896
|
+
"tabsList",
|
|
897
|
+
"tabOpen",
|
|
898
|
+
"tabClose",
|
|
899
|
+
"tabRename",
|
|
900
|
+
"tabExec",
|
|
901
|
+
"splitList",
|
|
902
|
+
"splitSet",
|
|
903
|
+
"splitAddTab",
|
|
904
|
+
"splitClear",
|
|
905
|
+
"browserNavigate",
|
|
906
|
+
"browserBack",
|
|
907
|
+
"browserForward",
|
|
908
|
+
"browserReload",
|
|
909
|
+
"browserClose",
|
|
910
|
+
"browserScroll",
|
|
911
|
+
"browserFocus",
|
|
912
|
+
"browserClick",
|
|
913
|
+
"browserEval",
|
|
914
|
+
"browserScreenshot",
|
|
915
|
+
"agentStart",
|
|
916
|
+
"agentSessionLaunch",
|
|
917
|
+
"boardDraftCreate",
|
|
918
|
+
"scratchpadCreate"
|
|
919
|
+
]
|
|
920
|
+
},
|
|
921
|
+
"Protocol": {
|
|
922
|
+
"title": "Protocol",
|
|
923
|
+
"type": "object",
|
|
924
|
+
"additionalProperties": false,
|
|
925
|
+
"description": "Shared schema source of truth for the host-server RPC and subscription protocol. The frame codec itself lives in `pragma-protocol`; these values name the cross-language methods, events, and errors.",
|
|
926
|
+
"required": ["rpcMethods", "events", "errors"],
|
|
927
|
+
"properties": {
|
|
928
|
+
"rpcMethods": {
|
|
929
|
+
"type": "array",
|
|
930
|
+
"items": {
|
|
931
|
+
"$ref": "#/definitions/ProtocolRpcMethod"
|
|
932
|
+
},
|
|
933
|
+
"uniqueItems": true
|
|
934
|
+
},
|
|
935
|
+
"events": {
|
|
936
|
+
"type": "array",
|
|
937
|
+
"items": {
|
|
938
|
+
"$ref": "#/definitions/ProtocolEventKind"
|
|
939
|
+
},
|
|
940
|
+
"uniqueItems": true
|
|
941
|
+
},
|
|
942
|
+
"errors": {
|
|
943
|
+
"type": "array",
|
|
944
|
+
"items": {
|
|
945
|
+
"$ref": "#/definitions/ProtocolErrorCode"
|
|
946
|
+
},
|
|
947
|
+
"uniqueItems": true
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
},
|
|
951
|
+
"AutomationScope": {
|
|
952
|
+
"title": "AutomationScope",
|
|
953
|
+
"description": "Where an automation file was discovered.",
|
|
954
|
+
"type": "string",
|
|
955
|
+
"enum": ["global", "local"]
|
|
956
|
+
},
|
|
957
|
+
"AutomationTrust": {
|
|
958
|
+
"title": "AutomationTrust",
|
|
959
|
+
"description": "Server trust state for an automation file.",
|
|
960
|
+
"type": "string",
|
|
961
|
+
"enum": ["trusted", "approved", "pending", "rejected"]
|
|
962
|
+
},
|
|
963
|
+
"AutomationTriggerKind": {
|
|
964
|
+
"title": "AutomationTriggerKind",
|
|
965
|
+
"description": "Automation trigger family.",
|
|
966
|
+
"type": "string",
|
|
967
|
+
"enum": ["cron", "event", "unknown"]
|
|
968
|
+
},
|
|
969
|
+
"AutomationStatus": {
|
|
970
|
+
"title": "AutomationStatus",
|
|
971
|
+
"description": "Runtime load/run state surfaced by the host automation runner.",
|
|
972
|
+
"type": "string",
|
|
973
|
+
"enum": ["pending", "loaded", "running", "idle", "rejected", "error"]
|
|
974
|
+
},
|
|
975
|
+
"AutomationInfo": {
|
|
976
|
+
"title": "AutomationInfo",
|
|
977
|
+
"description": "Automation metadata shared by the server and app UI.",
|
|
978
|
+
"type": "object",
|
|
979
|
+
"additionalProperties": false,
|
|
980
|
+
"required": [
|
|
981
|
+
"id",
|
|
982
|
+
"name",
|
|
983
|
+
"description",
|
|
984
|
+
"path",
|
|
985
|
+
"relativePath",
|
|
986
|
+
"sourceVersion",
|
|
987
|
+
"scope",
|
|
988
|
+
"trust",
|
|
989
|
+
"triggerKind",
|
|
990
|
+
"status",
|
|
991
|
+
"projectId",
|
|
992
|
+
"worktreeId",
|
|
993
|
+
"worktreeLabel",
|
|
994
|
+
"lastRunAt",
|
|
995
|
+
"nextRunAt",
|
|
996
|
+
"error"
|
|
997
|
+
],
|
|
998
|
+
"properties": {
|
|
999
|
+
"id": {
|
|
1000
|
+
"type": "string"
|
|
1001
|
+
},
|
|
1002
|
+
"name": {
|
|
1003
|
+
"type": "string"
|
|
1004
|
+
},
|
|
1005
|
+
"description": {
|
|
1006
|
+
"type": "string"
|
|
1007
|
+
},
|
|
1008
|
+
"path": {
|
|
1009
|
+
"type": "string",
|
|
1010
|
+
"description": "Absolute host path to the automation source file."
|
|
1011
|
+
},
|
|
1012
|
+
"relativePath": {
|
|
1013
|
+
"type": "string",
|
|
1014
|
+
"description": "Path relative to the automation root, suitable for editor tabs when local."
|
|
1015
|
+
},
|
|
1016
|
+
"sourceVersion": {
|
|
1017
|
+
"type": "string",
|
|
1018
|
+
"description": "Changes whenever the automation source file contents change."
|
|
1019
|
+
},
|
|
1020
|
+
"scope": {
|
|
1021
|
+
"$ref": "#/definitions/AutomationScope"
|
|
1022
|
+
},
|
|
1023
|
+
"trust": {
|
|
1024
|
+
"$ref": "#/definitions/AutomationTrust"
|
|
1025
|
+
},
|
|
1026
|
+
"triggerKind": {
|
|
1027
|
+
"$ref": "#/definitions/AutomationTriggerKind"
|
|
1028
|
+
},
|
|
1029
|
+
"status": {
|
|
1030
|
+
"$ref": "#/definitions/AutomationStatus"
|
|
1031
|
+
},
|
|
1032
|
+
"projectId": {
|
|
1033
|
+
"type": ["string", "null"]
|
|
1034
|
+
},
|
|
1035
|
+
"worktreeId": {
|
|
1036
|
+
"type": ["string", "null"]
|
|
1037
|
+
},
|
|
1038
|
+
"worktreeLabel": {
|
|
1039
|
+
"type": ["string", "null"]
|
|
1040
|
+
},
|
|
1041
|
+
"lastRunAt": {
|
|
1042
|
+
"type": ["string", "null"]
|
|
1043
|
+
},
|
|
1044
|
+
"nextRunAt": {
|
|
1045
|
+
"type": ["string", "null"]
|
|
1046
|
+
},
|
|
1047
|
+
"error": {
|
|
1048
|
+
"type": ["string", "null"]
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
},
|
|
1052
|
+
"AutomationRootRegistration": {
|
|
1053
|
+
"title": "AutomationRootRegistration",
|
|
1054
|
+
"description": "Project/worktree roots the app registers with the host server so local automations can run while the app is closed.",
|
|
1055
|
+
"type": "object",
|
|
1056
|
+
"additionalProperties": false,
|
|
1057
|
+
"required": ["projectId", "projectPath", "worktrees"],
|
|
1058
|
+
"properties": {
|
|
1059
|
+
"projectId": {
|
|
1060
|
+
"type": "string"
|
|
1061
|
+
},
|
|
1062
|
+
"projectPath": {
|
|
1063
|
+
"type": "string"
|
|
1064
|
+
},
|
|
1065
|
+
"worktrees": {
|
|
1066
|
+
"type": "array",
|
|
1067
|
+
"items": {
|
|
1068
|
+
"$ref": "#/definitions/AutomationWorktreeRoot"
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
},
|
|
1073
|
+
"AutomationWorktreeRoot": {
|
|
1074
|
+
"title": "AutomationWorktreeRoot",
|
|
1075
|
+
"description": "One worktree path registered for automation discovery.",
|
|
1076
|
+
"type": "object",
|
|
1077
|
+
"additionalProperties": false,
|
|
1078
|
+
"required": ["worktreeId", "path", "label", "isMain"],
|
|
1079
|
+
"properties": {
|
|
1080
|
+
"worktreeId": {
|
|
1081
|
+
"type": "string"
|
|
1082
|
+
},
|
|
1083
|
+
"path": {
|
|
1084
|
+
"type": "string"
|
|
1085
|
+
},
|
|
1086
|
+
"label": {
|
|
1087
|
+
"type": "string"
|
|
1088
|
+
},
|
|
1089
|
+
"isMain": {
|
|
1090
|
+
"type": "boolean"
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
},
|
|
1094
|
+
"AutomationPendingPayload": {
|
|
1095
|
+
"title": "AutomationPendingPayload",
|
|
1096
|
+
"description": "Delta payload broadcast when a local automation needs approval.",
|
|
1097
|
+
"type": "object",
|
|
1098
|
+
"additionalProperties": false,
|
|
1099
|
+
"required": ["automation"],
|
|
1100
|
+
"properties": {
|
|
1101
|
+
"automation": {
|
|
1102
|
+
"$ref": "#/definitions/AutomationInfo"
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
},
|
|
1106
|
+
"AutomationsChangedPayload": {
|
|
1107
|
+
"title": "AutomationsChangedPayload",
|
|
1108
|
+
"description": "Delta payload broadcast when automation list or runtime state changes.",
|
|
1109
|
+
"type": "object",
|
|
1110
|
+
"additionalProperties": false,
|
|
1111
|
+
"required": ["automations"],
|
|
1112
|
+
"properties": {
|
|
1113
|
+
"automations": {
|
|
1114
|
+
"type": "array",
|
|
1115
|
+
"items": {
|
|
1116
|
+
"$ref": "#/definitions/AutomationInfo"
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
},
|
|
1121
|
+
"GitHub": {
|
|
1122
|
+
"title": "GitHub",
|
|
1123
|
+
"type": "object",
|
|
1124
|
+
"additionalProperties": false,
|
|
1125
|
+
"description": "GitHub integration contract: the secret-free OAuth Device Flow client id, scopes, and the endpoint URLs shared by the Rust backend (device flow + token exchange) and the frontend Octokit client.",
|
|
1126
|
+
"required": [
|
|
1127
|
+
"oauthClientId",
|
|
1128
|
+
"scopes",
|
|
1129
|
+
"deviceCodeUrl",
|
|
1130
|
+
"deviceVerifyUrl",
|
|
1131
|
+
"accessTokenUrl",
|
|
1132
|
+
"apiBaseUrl",
|
|
1133
|
+
"homepageUrl",
|
|
1134
|
+
"prSignature"
|
|
1135
|
+
],
|
|
1136
|
+
"properties": {
|
|
1137
|
+
"oauthClientId": {
|
|
1138
|
+
"type": "string",
|
|
1139
|
+
"description": "Client id of the registered Pragma GitHub OAuth App (device flow enabled). No client secret \u2014 a distributed desktop app can't keep one secret."
|
|
1140
|
+
},
|
|
1141
|
+
"scopes": {
|
|
1142
|
+
"type": "array",
|
|
1143
|
+
"items": {
|
|
1144
|
+
"type": "string"
|
|
1145
|
+
},
|
|
1146
|
+
"description": "OAuth scopes requested during the device flow (e.g. `repo`)."
|
|
1147
|
+
},
|
|
1148
|
+
"deviceCodeUrl": {
|
|
1149
|
+
"type": "string",
|
|
1150
|
+
"format": "uri",
|
|
1151
|
+
"description": "Endpoint that issues a device + user code (`POST https://github.com/login/device/code`)."
|
|
1152
|
+
},
|
|
1153
|
+
"deviceVerifyUrl": {
|
|
1154
|
+
"type": "string",
|
|
1155
|
+
"format": "uri",
|
|
1156
|
+
"description": "Page the user opens to enter the user code (`https://github.com/login/device`)."
|
|
1157
|
+
},
|
|
1158
|
+
"accessTokenUrl": {
|
|
1159
|
+
"type": "string",
|
|
1160
|
+
"format": "uri",
|
|
1161
|
+
"description": "Endpoint polled to exchange an authorized device code for an access token."
|
|
1162
|
+
},
|
|
1163
|
+
"apiBaseUrl": {
|
|
1164
|
+
"type": "string",
|
|
1165
|
+
"format": "uri",
|
|
1166
|
+
"description": "Base URL for the GitHub REST/GraphQL API (Octokit `baseUrl`)."
|
|
1167
|
+
},
|
|
1168
|
+
"homepageUrl": {
|
|
1169
|
+
"type": "string",
|
|
1170
|
+
"format": "uri",
|
|
1171
|
+
"description": "Pragma's public GitHub home page, linked from the pull-request signature footer."
|
|
1172
|
+
},
|
|
1173
|
+
"prSignature": {
|
|
1174
|
+
"$ref": "#/definitions/PrSignature"
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
},
|
|
1178
|
+
"PrSignature": {
|
|
1179
|
+
"title": "PrSignature",
|
|
1180
|
+
"type": "object",
|
|
1181
|
+
"additionalProperties": false,
|
|
1182
|
+
"description": "The \"Created with Pragma\" footer appended to pull requests Pragma opens. The markers delimit the block so Pragma can strip it again when it renders a PR body, and so a body written by an older Pragma is still recognised.",
|
|
1183
|
+
"required": ["enabled", "startMarker", "endMarker", "linkLabel", "openUrl"],
|
|
1184
|
+
"properties": {
|
|
1185
|
+
"enabled": {
|
|
1186
|
+
"type": "boolean",
|
|
1187
|
+
"description": "Whether the footer is appended when the user has not configured `github.prSignature`."
|
|
1188
|
+
},
|
|
1189
|
+
"startMarker": {
|
|
1190
|
+
"type": "string",
|
|
1191
|
+
"description": "HTML comment opening the footer block. Everything from here to `endMarker` is Pragma-owned and is stripped before the body is shown in Pragma."
|
|
1192
|
+
},
|
|
1193
|
+
"endMarker": {
|
|
1194
|
+
"type": "string",
|
|
1195
|
+
"description": "HTML comment closing the footer block."
|
|
1196
|
+
},
|
|
1197
|
+
"linkLabel": {
|
|
1198
|
+
"type": "string",
|
|
1199
|
+
"description": "Text of the small \"Open worktree\" link rendered under the footer heading."
|
|
1200
|
+
},
|
|
1201
|
+
"openUrl": {
|
|
1202
|
+
"type": "string",
|
|
1203
|
+
"format": "uri",
|
|
1204
|
+
"description": "Web redirector the badge links to, which forwards its query string to the `pragma://open` deep link. GitHub's markdown sanitizer keeps only `http`/`https`/`mailto` hrefs, so a `pragma://` URL would render as inert text."
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
},
|
|
1208
|
+
"GitHubSettings": {
|
|
1209
|
+
"title": "GitHubSettings",
|
|
1210
|
+
"type": "object",
|
|
1211
|
+
"additionalProperties": false,
|
|
1212
|
+
"description": "Persisted `github` block of the global `.pragma/config.json`. Global-only: there is no project layer, matching the rest of the GitHub settings. Every field is optional; a missing one means the shipped default.",
|
|
1213
|
+
"properties": {
|
|
1214
|
+
"prSignature": {
|
|
1215
|
+
"type": "boolean",
|
|
1216
|
+
"description": "Whether Pragma appends the \"Created with Pragma\" footer to pull requests it opens."
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
},
|
|
1220
|
+
"OtherSettings": {
|
|
1221
|
+
"title": "OtherSettings",
|
|
1222
|
+
"type": "object",
|
|
1223
|
+
"additionalProperties": false,
|
|
1224
|
+
"description": "Persisted `other` block of global `.pragma/config.json`. Global-only. Every field is optional; missing values use shipped updater defaults.",
|
|
1225
|
+
"properties": {
|
|
1226
|
+
"serverUrl": {
|
|
1227
|
+
"type": "string",
|
|
1228
|
+
"description": "Override for server providing update metadata. Empty/omitted uses shipped production or dev default."
|
|
1229
|
+
},
|
|
1230
|
+
"autoDownload": {
|
|
1231
|
+
"type": "boolean",
|
|
1232
|
+
"description": "When true, Pragma polls on launch, on an interval, and when the window becomes visible. When false, only Check now runs. The download itself starts when the user clicks Install Update."
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
},
|
|
1236
|
+
"GitHubUser": {
|
|
1237
|
+
"title": "GitHubUser",
|
|
1238
|
+
"type": "object",
|
|
1239
|
+
"additionalProperties": false,
|
|
1240
|
+
"description": "The authenticated GitHub user, as surfaced to the UI.",
|
|
1241
|
+
"required": ["login", "name", "avatarUrl"],
|
|
1242
|
+
"properties": {
|
|
1243
|
+
"login": {
|
|
1244
|
+
"type": "string",
|
|
1245
|
+
"description": "GitHub username (login)."
|
|
1246
|
+
},
|
|
1247
|
+
"name": {
|
|
1248
|
+
"type": ["string", "null"],
|
|
1249
|
+
"description": "Display name; null when the user has not set one."
|
|
1250
|
+
},
|
|
1251
|
+
"avatarUrl": {
|
|
1252
|
+
"type": "string",
|
|
1253
|
+
"description": "Avatar image URL."
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
},
|
|
1257
|
+
"GitHubAuthMethod": {
|
|
1258
|
+
"title": "GitHubAuthMethod",
|
|
1259
|
+
"type": "string",
|
|
1260
|
+
"description": "How the stored GitHub token was obtained: the OAuth device flow or adoption of the gh CLI's token.",
|
|
1261
|
+
"enum": ["deviceFlow", "cli"]
|
|
1262
|
+
},
|
|
1263
|
+
"GitHubAuthStatus": {
|
|
1264
|
+
"title": "GitHubAuthStatus",
|
|
1265
|
+
"type": "object",
|
|
1266
|
+
"additionalProperties": false,
|
|
1267
|
+
"description": "Drives the setup modal and the Pull Request subtab: whether a token is stored, whether the gh CLI is an option, the signed-in user, and whether setup was skipped.",
|
|
1268
|
+
"required": ["authenticated", "ghAvailable", "user", "authMethod", "setupDismissed"],
|
|
1269
|
+
"properties": {
|
|
1270
|
+
"authenticated": {
|
|
1271
|
+
"type": "boolean",
|
|
1272
|
+
"description": "True when a usable GitHub token is stored in the backend's 0600 plaintext token file under the app data dir (not the OS keychain; see src-tauri/src/github.rs)."
|
|
1273
|
+
},
|
|
1274
|
+
"ghAvailable": {
|
|
1275
|
+
"type": "boolean",
|
|
1276
|
+
"description": "True when the `gh` CLI is installed and authenticated, so the CLI login option can be shown."
|
|
1277
|
+
},
|
|
1278
|
+
"user": {
|
|
1279
|
+
"description": "The authenticated user, or null when not authenticated.",
|
|
1280
|
+
"anyOf": [
|
|
1281
|
+
{
|
|
1282
|
+
"$ref": "#/definitions/GitHubUser"
|
|
1283
|
+
},
|
|
1284
|
+
{
|
|
1285
|
+
"type": "null"
|
|
1286
|
+
}
|
|
1287
|
+
]
|
|
1288
|
+
},
|
|
1289
|
+
"authMethod": {
|
|
1290
|
+
"description": "How the stored token was obtained, or null when not authenticated (or stored by a build that predates method tracking).",
|
|
1291
|
+
"anyOf": [
|
|
1292
|
+
{
|
|
1293
|
+
"$ref": "#/definitions/GitHubAuthMethod"
|
|
1294
|
+
},
|
|
1295
|
+
{
|
|
1296
|
+
"type": "null"
|
|
1297
|
+
}
|
|
1298
|
+
]
|
|
1299
|
+
},
|
|
1300
|
+
"setupDismissed": {
|
|
1301
|
+
"type": "boolean",
|
|
1302
|
+
"description": "True once the user has skipped the setup modal; the modal never returns while true."
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
},
|
|
1306
|
+
"BranchSyncStatus": {
|
|
1307
|
+
"title": "BranchSyncStatus",
|
|
1308
|
+
"type": "object",
|
|
1309
|
+
"additionalProperties": false,
|
|
1310
|
+
"description": "Result of a fetch + ahead/behind comparison against the upstream of a worktree's branch \u2014 the create-PR pre-flight.",
|
|
1311
|
+
"required": ["branch", "ahead", "behind", "hasUpstream"],
|
|
1312
|
+
"properties": {
|
|
1313
|
+
"branch": {
|
|
1314
|
+
"type": "string",
|
|
1315
|
+
"description": "The worktree's current branch."
|
|
1316
|
+
},
|
|
1317
|
+
"ahead": {
|
|
1318
|
+
"type": "integer",
|
|
1319
|
+
"minimum": 0,
|
|
1320
|
+
"description": "Commits the local branch is ahead of its upstream."
|
|
1321
|
+
},
|
|
1322
|
+
"behind": {
|
|
1323
|
+
"type": "integer",
|
|
1324
|
+
"minimum": 0,
|
|
1325
|
+
"description": "Commits the local branch is behind its upstream. Non-zero blocks PR creation."
|
|
1326
|
+
},
|
|
1327
|
+
"hasUpstream": {
|
|
1328
|
+
"type": "boolean",
|
|
1329
|
+
"description": "True when the branch already tracks a remote upstream; false means it must be pushed first."
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
},
|
|
1333
|
+
"GitHubRepoRef": {
|
|
1334
|
+
"title": "GitHubRepoRef",
|
|
1335
|
+
"type": "object",
|
|
1336
|
+
"additionalProperties": false,
|
|
1337
|
+
"description": "Owner/repo plus branch context parsed from a worktree's `origin` remote, used to address the GitHub API.",
|
|
1338
|
+
"required": ["owner", "repo", "defaultBranch", "headBranch", "parentBranch"],
|
|
1339
|
+
"properties": {
|
|
1340
|
+
"owner": {
|
|
1341
|
+
"type": "string",
|
|
1342
|
+
"description": "Repository owner (user or org)."
|
|
1343
|
+
},
|
|
1344
|
+
"repo": {
|
|
1345
|
+
"type": "string",
|
|
1346
|
+
"description": "Repository name (no `.git`)."
|
|
1347
|
+
},
|
|
1348
|
+
"defaultBranch": {
|
|
1349
|
+
"type": "string",
|
|
1350
|
+
"description": "The repo's default branch (PR base)."
|
|
1351
|
+
},
|
|
1352
|
+
"headBranch": {
|
|
1353
|
+
"type": "string",
|
|
1354
|
+
"description": "The worktree's current branch (PR head)."
|
|
1355
|
+
},
|
|
1356
|
+
"parentBranch": {
|
|
1357
|
+
"type": ["string", "null"],
|
|
1358
|
+
"description": "The branch of the worktree's parent worktree \u2014 the branch this worktree was created to merge back into, used as the default PR base. Null for the main/parentless worktree."
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
},
|
|
1362
|
+
"TerminalBackend": {
|
|
1363
|
+
"title": "TerminalBackend",
|
|
1364
|
+
"type": "string",
|
|
1365
|
+
"enum": ["native", "wsl"],
|
|
1366
|
+
"description": "Which world a terminal session's shell lives in. `native` runs the host's own shell through the host's PTY (a pseudo-terminal on macOS and Linux, ConPTY on Windows). `wsl` runs a Linux shell inside a WSL distribution, served by a Linux `pragma-server` running in that distribution. Only Windows offers a real choice; macOS and Linux always resolve to `native`."
|
|
1367
|
+
},
|
|
1368
|
+
"ShellProfile": {
|
|
1369
|
+
"title": "ShellProfile",
|
|
1370
|
+
"type": "object",
|
|
1371
|
+
"additionalProperties": false,
|
|
1372
|
+
"required": ["backend"],
|
|
1373
|
+
"description": "One concrete choice of shell world for a terminal session: the resolved form of a `TerminalSettings` default, or the profile a single tab was opened with. Carried on the spawn request so the session layer launches the same shell the picker named, and persisted on the tab so a respawned session keeps it.",
|
|
1374
|
+
"properties": {
|
|
1375
|
+
"backend": {
|
|
1376
|
+
"$ref": "#/definitions/TerminalBackend"
|
|
1377
|
+
},
|
|
1378
|
+
"distro": {
|
|
1379
|
+
"type": ["string", "null"],
|
|
1380
|
+
"description": "WSL distribution launched when `backend` is `wsl`. Null uses the distribution WSL itself marks as default. Always null for `native`."
|
|
1381
|
+
}
|
|
1382
|
+
}
|
|
1383
|
+
},
|
|
1384
|
+
"Platform": {
|
|
1385
|
+
"title": "Platform",
|
|
1386
|
+
"type": "object",
|
|
1387
|
+
"additionalProperties": false,
|
|
1388
|
+
"required": ["shells", "wsl", "defaultBackend"],
|
|
1389
|
+
"description": "Per-operating-system launch defaults shared by the Rust session layer and the TypeScript settings UI. Values here are defaults only: a project may override them in its `.pragma/config.json`.",
|
|
1390
|
+
"properties": {
|
|
1391
|
+
"shells": {
|
|
1392
|
+
"$ref": "#/definitions/DefaultShells"
|
|
1393
|
+
},
|
|
1394
|
+
"wsl": {
|
|
1395
|
+
"$ref": "#/definitions/Wsl"
|
|
1396
|
+
},
|
|
1397
|
+
"defaultBackend": {
|
|
1398
|
+
"$ref": "#/definitions/TerminalBackend"
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
},
|
|
1402
|
+
"DefaultShells": {
|
|
1403
|
+
"title": "DefaultShells",
|
|
1404
|
+
"type": "object",
|
|
1405
|
+
"additionalProperties": false,
|
|
1406
|
+
"required": ["macos", "linux", "windows"],
|
|
1407
|
+
"description": "Fallback shell used when the environment names none. On macOS and Linux the `SHELL` environment variable wins when it is set; Windows has no such convention, so the candidate list is probed in order instead.",
|
|
1408
|
+
"properties": {
|
|
1409
|
+
"macos": {
|
|
1410
|
+
"type": "string",
|
|
1411
|
+
"description": "Shell launched on macOS when `SHELL` is unset."
|
|
1412
|
+
},
|
|
1413
|
+
"linux": {
|
|
1414
|
+
"type": "string",
|
|
1415
|
+
"description": "Shell launched on Linux when `SHELL` is unset."
|
|
1416
|
+
},
|
|
1417
|
+
"windows": {
|
|
1418
|
+
"type": "array",
|
|
1419
|
+
"minItems": 1,
|
|
1420
|
+
"items": {
|
|
1421
|
+
"type": "string"
|
|
1422
|
+
},
|
|
1423
|
+
"description": "Windows shell candidates, probed in order and resolved against `PATH`. PowerShell 7+ (`pwsh.exe`) is preferred over the in-box Windows PowerShell (`powershell.exe`) because it ships the modern ConPTY behaviour; the last entry must be a shell that is present on every Windows install so resolution cannot fail."
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
},
|
|
1427
|
+
"Wsl": {
|
|
1428
|
+
"title": "Wsl",
|
|
1429
|
+
"type": "object",
|
|
1430
|
+
"additionalProperties": false,
|
|
1431
|
+
"required": ["launcher", "listArgs", "serverBinary"],
|
|
1432
|
+
"description": "How the Windows client reaches a Linux `pragma-server` running inside a WSL distribution. The Windows side never translates `\\\\wsl$\\` paths: the Linux server owns its own filesystem world and is addressed exactly like a remote host.",
|
|
1433
|
+
"properties": {
|
|
1434
|
+
"launcher": {
|
|
1435
|
+
"type": "string",
|
|
1436
|
+
"description": "Executable used to run a command inside a WSL distribution."
|
|
1437
|
+
},
|
|
1438
|
+
"listArgs": {
|
|
1439
|
+
"type": "array",
|
|
1440
|
+
"items": {
|
|
1441
|
+
"type": "string"
|
|
1442
|
+
},
|
|
1443
|
+
"description": "Arguments that list installed distributions with their state and WSL version. The output is UTF-16LE encoded, which the parser has to decode before splitting."
|
|
1444
|
+
},
|
|
1445
|
+
"serverBinary": {
|
|
1446
|
+
"type": "string",
|
|
1447
|
+
"description": "Name of the Linux `pragma-server` executable expected on the distribution's PATH, or installed by Pragma into the distribution when it is missing."
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
},
|
|
1451
|
+
"Daemon": {
|
|
1452
|
+
"title": "Daemon",
|
|
1453
|
+
"type": "object",
|
|
1454
|
+
"additionalProperties": false,
|
|
1455
|
+
"required": ["protocolVersion", "socketFile", "lockFile", "logFile"],
|
|
1456
|
+
"description": "Contract between the Pragma app and the detached PTY daemon.",
|
|
1457
|
+
"properties": {
|
|
1458
|
+
"protocolVersion": {
|
|
1459
|
+
"type": "string",
|
|
1460
|
+
"description": "Internal daemon wire-protocol SemVer, spoken on Hello, `gateway.json` and `/v1/health`. Mirrored from crates/pragma-protocol's package version by `bun run generate`; do not edit by hand. Comparison is exact equality, and that is load-bearing: every peer here ships in one bundle, so a version that no longer matches is a stale process to evict, not a peer to negotiate with. Remote clients use `gateway.apiVersion` instead."
|
|
1461
|
+
},
|
|
1462
|
+
"socketFile": {
|
|
1463
|
+
"type": "string",
|
|
1464
|
+
"description": "File name of the server's local IPC endpoint inside the server directory. A Unix-domain socket on every supported platform: macOS and Linux use the kernel's AF_UNIX, Windows uses the AF_UNIX support present since Windows 10 build 17063. The server binds it and every native client connects to it, so the name must never be spelled out by hand on either side of the language boundary."
|
|
1465
|
+
},
|
|
1466
|
+
"lockFile": {
|
|
1467
|
+
"type": "string",
|
|
1468
|
+
"description": "File name of the startup lock the server holds inside the server directory, used to keep a second server from binding over a live one."
|
|
1469
|
+
},
|
|
1470
|
+
"logFile": {
|
|
1471
|
+
"type": "string",
|
|
1472
|
+
"description": "File name the detached server writes its stdout and stderr to inside the server directory."
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
},
|
|
1476
|
+
"Plugins": {
|
|
1477
|
+
"title": "Plugins",
|
|
1478
|
+
"type": "object",
|
|
1479
|
+
"additionalProperties": false,
|
|
1480
|
+
"required": ["configFileName", "storageScopes"],
|
|
1481
|
+
"description": "Plugin-system constants shared by the Rust config reader and the TypeScript loader.",
|
|
1482
|
+
"properties": {
|
|
1483
|
+
"configFileName": {
|
|
1484
|
+
"type": "string",
|
|
1485
|
+
"description": "Relative path of the Pragma config file that declares plugin entries. Resolved against the home directory for global plugins and against the project root for project plugins."
|
|
1486
|
+
},
|
|
1487
|
+
"storageScopes": {
|
|
1488
|
+
"type": "array",
|
|
1489
|
+
"items": {
|
|
1490
|
+
"type": "string",
|
|
1491
|
+
"enum": ["global", "project"]
|
|
1492
|
+
},
|
|
1493
|
+
"uniqueItems": true,
|
|
1494
|
+
"description": "Plugin storage scopes supported by the host runtime. v1 persists global plugin key/value state; project scope is reserved for project-addressed plugin config/storage layers."
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
},
|
|
1498
|
+
"Theme": {
|
|
1499
|
+
"title": "Theme",
|
|
1500
|
+
"type": "object",
|
|
1501
|
+
"additionalProperties": false,
|
|
1502
|
+
"required": ["fileName", "modes"],
|
|
1503
|
+
"description": "Optional color-theme override file read by the desktop app. Shared so the Rust reader/writer and the TypeScript theme runtime agree on the file location and the color-scheme blocks it may declare.",
|
|
1504
|
+
"properties": {
|
|
1505
|
+
"fileName": {
|
|
1506
|
+
"type": "string",
|
|
1507
|
+
"description": "Relative path of the optional theme file. Resolved against the home directory for the global theme and against the project root for a project theme \u2014 the same layout rule as `plugins.configFileName`. Both files are optional; the app merges built-in defaults <- global <- project per token."
|
|
1508
|
+
},
|
|
1509
|
+
"modes": {
|
|
1510
|
+
"type": "array",
|
|
1511
|
+
"items": {
|
|
1512
|
+
"type": "string",
|
|
1513
|
+
"enum": ["light", "dark"]
|
|
1514
|
+
},
|
|
1515
|
+
"uniqueItems": true,
|
|
1516
|
+
"description": "Color-scheme blocks a theme file may declare under `colors`. Each maps to the matching CSS variable block in the app stylesheet (`:root` for light, `.dark` for dark)."
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
},
|
|
1520
|
+
"Gateway": {
|
|
1521
|
+
"title": "Gateway",
|
|
1522
|
+
"type": "object",
|
|
1523
|
+
"additionalProperties": false,
|
|
1524
|
+
"required": [
|
|
1525
|
+
"apiVersion",
|
|
1526
|
+
"discoveryFile",
|
|
1527
|
+
"tokenFile",
|
|
1528
|
+
"devicesFile",
|
|
1529
|
+
"tokenHeader",
|
|
1530
|
+
"deviceHeaders",
|
|
1531
|
+
"push",
|
|
1532
|
+
"web"
|
|
1533
|
+
],
|
|
1534
|
+
"description": "Local HTTP gateway discovery and authentication constants shared by Rust gateway code and TypeScript clients.",
|
|
1535
|
+
"properties": {
|
|
1536
|
+
"apiVersion": {
|
|
1537
|
+
"type": "string",
|
|
1538
|
+
"description": "SemVer of the client-facing gateway HTTP contract, advertised in the pairing payload so a remote client can reject an incompatible host before it stores a connection. Deliberately NOT `daemon.protocolVersion`: that one is the internal daemon frame protocol and is bumped by every desktop release, whereas Pragma Go and the web build embed their copy of this value at build time and ship on their own cadence. Comparison is exact equality, so bump this only on a breaking change to the `/v1` API, and only in the same release as a client build that embeds the new value \u2014 a client that never launches cannot be updated first."
|
|
1539
|
+
},
|
|
1540
|
+
"discoveryFile": {
|
|
1541
|
+
"type": "string",
|
|
1542
|
+
"description": "Filename written beside daemon.sock with gateway port, token, pid, and protocol version."
|
|
1543
|
+
},
|
|
1544
|
+
"tokenFile": {
|
|
1545
|
+
"type": "string",
|
|
1546
|
+
"description": "Filename written beside daemon.sock holding the persistent 0600 bearer token, so the token survives gateway restarts and stays stable across paired devices until explicitly regenerated."
|
|
1547
|
+
},
|
|
1548
|
+
"devicesFile": {
|
|
1549
|
+
"type": "string",
|
|
1550
|
+
"description": "Filename written beside daemon.sock holding devices that successfully authenticated with the gateway."
|
|
1551
|
+
},
|
|
1552
|
+
"tokenHeader": {
|
|
1553
|
+
"type": "string",
|
|
1554
|
+
"description": "HTTP authorization header name used for bearer-token authentication."
|
|
1555
|
+
},
|
|
1556
|
+
"deviceHeaders": {
|
|
1557
|
+
"type": "object",
|
|
1558
|
+
"additionalProperties": false,
|
|
1559
|
+
"required": ["id", "name", "platform", "appVersion"],
|
|
1560
|
+
"properties": {
|
|
1561
|
+
"id": {
|
|
1562
|
+
"type": "string"
|
|
1563
|
+
},
|
|
1564
|
+
"name": {
|
|
1565
|
+
"type": "string"
|
|
1566
|
+
},
|
|
1567
|
+
"platform": {
|
|
1568
|
+
"type": "string"
|
|
1569
|
+
},
|
|
1570
|
+
"appVersion": {
|
|
1571
|
+
"type": "string"
|
|
1572
|
+
}
|
|
1573
|
+
},
|
|
1574
|
+
"description": "HTTP headers carrying installation-scoped mobile device metadata."
|
|
1575
|
+
},
|
|
1576
|
+
"push": {
|
|
1577
|
+
"$ref": "#/definitions/GatewayPush"
|
|
1578
|
+
},
|
|
1579
|
+
"web": {
|
|
1580
|
+
"$ref": "#/definitions/GatewayWeb"
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
},
|
|
1584
|
+
"GatewayWeb": {
|
|
1585
|
+
"title": "GatewayWeb",
|
|
1586
|
+
"type": "object",
|
|
1587
|
+
"additionalProperties": false,
|
|
1588
|
+
"required": ["enabled", "basePath", "manifestFile", "resourceDir"],
|
|
1589
|
+
"description": "Where the gateway serves the Pragma Go web bundle from, and how that bundle is staged. Shared so the Expo export, the staging script, the Rust static-file routes, and the desktop's shareable link all agree on one path.",
|
|
1590
|
+
"properties": {
|
|
1591
|
+
"enabled": {
|
|
1592
|
+
"type": "boolean",
|
|
1593
|
+
"description": "Default access state for the public Pragma Go browser bundle. Users override it with gateway.webEnabled in the global config file."
|
|
1594
|
+
},
|
|
1595
|
+
"basePath": {
|
|
1596
|
+
"type": "string",
|
|
1597
|
+
"description": "URL prefix the exported web bundle is deployed and served under. Passed to Expo as `EXPO_BASE_URL` at export time so the asset URLs baked into `index.html` match the routes the gateway answers."
|
|
1598
|
+
},
|
|
1599
|
+
"manifestFile": {
|
|
1600
|
+
"type": "string",
|
|
1601
|
+
"description": "Filename inside the staged bundle listing every servable asset with its URL path, content type, and encoding. The gateway serves only what this manifest names, so a request path is looked up as a map key and never joined onto a filesystem path."
|
|
1602
|
+
},
|
|
1603
|
+
"resourceDir": {
|
|
1604
|
+
"type": "string",
|
|
1605
|
+
"description": "Directory name under the desktop app's Tauri resources holding the staged bundle."
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
},
|
|
1609
|
+
"GatewayPush": {
|
|
1610
|
+
"title": "GatewayPush",
|
|
1611
|
+
"type": "object",
|
|
1612
|
+
"additionalProperties": false,
|
|
1613
|
+
"required": ["sendUrl", "batchSize", "presenceTtlMs", "tokenPrefixes"],
|
|
1614
|
+
"description": "Expo push delivery constants. The gateway watches the agent status stream and pushes to every registered phone; the mobile app registers its Expo token through `/v1/push/tokens`.",
|
|
1615
|
+
"properties": {
|
|
1616
|
+
"sendUrl": {
|
|
1617
|
+
"type": "string",
|
|
1618
|
+
"description": "Expo push service endpoint the gateway POSTs batches of messages to."
|
|
1619
|
+
},
|
|
1620
|
+
"batchSize": {
|
|
1621
|
+
"type": "integer",
|
|
1622
|
+
"minimum": 1,
|
|
1623
|
+
"description": "Largest number of messages sent in one request; Expo documents 100 per call."
|
|
1624
|
+
},
|
|
1625
|
+
"presenceTtlMs": {
|
|
1626
|
+
"type": "integer",
|
|
1627
|
+
"minimum": 1,
|
|
1628
|
+
"description": "How long a desktop presence heartbeat counts as current. While a heartbeat says the desktop is focused, phone pushes are suppressed \u2014 the user is already looking at the alert. A desktop that dies without blurring stops suppressing after this window."
|
|
1629
|
+
},
|
|
1630
|
+
"tokenPrefixes": {
|
|
1631
|
+
"type": "array",
|
|
1632
|
+
"items": {
|
|
1633
|
+
"type": "string"
|
|
1634
|
+
},
|
|
1635
|
+
"uniqueItems": true,
|
|
1636
|
+
"description": "Accepted Expo push token prefixes. A token that matches none is rejected at registration rather than failing later inside Expo."
|
|
1637
|
+
}
|
|
1638
|
+
}
|
|
1639
|
+
},
|
|
1640
|
+
"Tunnel": {
|
|
1641
|
+
"title": "Tunnel",
|
|
1642
|
+
"type": "object",
|
|
1643
|
+
"additionalProperties": false,
|
|
1644
|
+
"required": ["defaultCommand", "defaultUrlPattern"],
|
|
1645
|
+
"description": "Defaults for the remote-access tunnel that exposes the local HTTP gateway to a paired mobile device. A user overrides these per-install via the `tunnel` key in `~/.pragma/config.json`. Shared so the Rust tunnel supervisor and any TypeScript config UI agree on the shipped defaults.",
|
|
1646
|
+
"properties": {
|
|
1647
|
+
"defaultCommand": {
|
|
1648
|
+
"type": "string",
|
|
1649
|
+
"description": "Default tunnel command template. `{port}` is the only substitution and is replaced with the live gateway port. Ships targeting ngrok's JSON log output."
|
|
1650
|
+
},
|
|
1651
|
+
"defaultUrlPattern": {
|
|
1652
|
+
"type": "string",
|
|
1653
|
+
"description": "Default regular expression whose first capture group is the public tunnel URL, matched against both stdout and stderr lines. Covers ngrok's JSON `\"url\":\"https://\u2026\"` log and plain `https://\u2026` URLs (e.g. cloudflared)."
|
|
1654
|
+
}
|
|
1655
|
+
}
|
|
1656
|
+
},
|
|
1657
|
+
"KeybindingsFiles": {
|
|
1658
|
+
"title": "KeybindingsFiles",
|
|
1659
|
+
"type": "object",
|
|
1660
|
+
"additionalProperties": false,
|
|
1661
|
+
"required": ["configFileName"],
|
|
1662
|
+
"description": "Location of the editable keybindings file. Resolved against the home directory for global bindings and against the project root for project bindings, so Rust and the Settings UI agree on one path.",
|
|
1663
|
+
"properties": {
|
|
1664
|
+
"configFileName": {
|
|
1665
|
+
"type": "string",
|
|
1666
|
+
"description": "Relative path of the keybindings file (e.g. `.pragma/keybindings.json`). A project file only needs the actions it overrides; missing actions fall back to the global file, then to the built-in defaults."
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
},
|
|
1670
|
+
"Bench": {
|
|
1671
|
+
"title": "Bench",
|
|
1672
|
+
"type": "object",
|
|
1673
|
+
"additionalProperties": false,
|
|
1674
|
+
"required": ["hookGlobal", "runnerGlobal", "markerPrefix", "tabTitle"],
|
|
1675
|
+
"description": "Names the terminal benchmark (`@pragma-sh/bench`) and the desktop app agree on. The app installs the hook global in dev builds only; the benchmark's injected runner reads it back by the same name.",
|
|
1676
|
+
"properties": {
|
|
1677
|
+
"hookGlobal": {
|
|
1678
|
+
"type": "string",
|
|
1679
|
+
"description": "`window` property under which a dev build exposes read-only access to its live xterm instances. Absent in production builds."
|
|
1680
|
+
},
|
|
1681
|
+
"runnerGlobal": {
|
|
1682
|
+
"type": "string",
|
|
1683
|
+
"description": "`window` property the benchmark installs its own injected scenario runner under. Owned by the benchmark, never by the app."
|
|
1684
|
+
},
|
|
1685
|
+
"markerPrefix": {
|
|
1686
|
+
"type": "string",
|
|
1687
|
+
"description": "Leading token of the status line the `pragma-bench tui` payload paints on its first row. The runner scans painted frames for it to learn which input the terminal has finished rendering."
|
|
1688
|
+
},
|
|
1689
|
+
"tabTitle": {
|
|
1690
|
+
"type": "string",
|
|
1691
|
+
"description": "Title given to the terminal tab the benchmark opens, so a run is identifiable in the UI and reclaimable after a crash."
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1694
|
+
},
|
|
1695
|
+
"AgentStatusDefaults": {
|
|
1696
|
+
"title": "AgentStatusDefaults",
|
|
1697
|
+
"type": "object",
|
|
1698
|
+
"additionalProperties": false,
|
|
1699
|
+
"required": [
|
|
1700
|
+
"soundsDirName",
|
|
1701
|
+
"maxSoundSeconds",
|
|
1702
|
+
"maxSoundBytes",
|
|
1703
|
+
"soundExtensions",
|
|
1704
|
+
"notificationsEnabled",
|
|
1705
|
+
"notificationText"
|
|
1706
|
+
],
|
|
1707
|
+
"description": "Shipped defaults and limits for agent alert notifications and sounds. A user overrides these per install/project via the `agentStatus` key of `.pragma/config.json`.",
|
|
1708
|
+
"properties": {
|
|
1709
|
+
"soundsDirName": {
|
|
1710
|
+
"type": "string",
|
|
1711
|
+
"description": "Relative directory scanned for alert sounds. Resolved against the home directory for global sounds and against the project root for project sounds."
|
|
1712
|
+
},
|
|
1713
|
+
"maxSoundSeconds": {
|
|
1714
|
+
"type": "number",
|
|
1715
|
+
"exclusiveMinimum": 0,
|
|
1716
|
+
"description": "Longest allowed alert clip. Longer uploads are rejected rather than truncated."
|
|
1717
|
+
},
|
|
1718
|
+
"maxSoundBytes": {
|
|
1719
|
+
"type": "integer",
|
|
1720
|
+
"minimum": 1,
|
|
1721
|
+
"description": "Largest allowed alert clip in bytes, bounding what crosses IPC when a clip is imported or played."
|
|
1722
|
+
},
|
|
1723
|
+
"soundExtensions": {
|
|
1724
|
+
"type": "array",
|
|
1725
|
+
"items": {
|
|
1726
|
+
"type": "string"
|
|
1727
|
+
},
|
|
1728
|
+
"uniqueItems": true,
|
|
1729
|
+
"description": "Lower-case file extensions (no dot) treated as alert sounds when listing the sounds directory."
|
|
1730
|
+
},
|
|
1731
|
+
"notificationsEnabled": {
|
|
1732
|
+
"type": "boolean",
|
|
1733
|
+
"description": "Whether platform notifications fire for agent alerts when the user has not configured `agentStatus.notificationsEnabled`."
|
|
1734
|
+
},
|
|
1735
|
+
"notificationText": {
|
|
1736
|
+
"$ref": "#/definitions/AgentNotificationText"
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1739
|
+
},
|
|
1740
|
+
"TabDefaults": {
|
|
1741
|
+
"title": "TabDefaults",
|
|
1742
|
+
"type": "object",
|
|
1743
|
+
"additionalProperties": false,
|
|
1744
|
+
"required": ["defaultTitles"],
|
|
1745
|
+
"description": "Shipped tab defaults shared by the desktop app and any host that has to reason about a tab's name.",
|
|
1746
|
+
"properties": {
|
|
1747
|
+
"defaultTitles": {
|
|
1748
|
+
"type": "object",
|
|
1749
|
+
"additionalProperties": false,
|
|
1750
|
+
"required": [
|
|
1751
|
+
"fallback",
|
|
1752
|
+
"browser",
|
|
1753
|
+
"log",
|
|
1754
|
+
"scratchpad",
|
|
1755
|
+
"whiteboard",
|
|
1756
|
+
"prReview",
|
|
1757
|
+
"pluginWebview"
|
|
1758
|
+
],
|
|
1759
|
+
"description": "Fallback title per tab kind, used for a tab whose shell or page has not named itself. A tab still carrying its default title has no name worth showing in a notification, so both languages compare against these.",
|
|
1760
|
+
"properties": {
|
|
1761
|
+
"fallback": {
|
|
1762
|
+
"type": "string"
|
|
1763
|
+
},
|
|
1764
|
+
"browser": {
|
|
1765
|
+
"type": "string"
|
|
1766
|
+
},
|
|
1767
|
+
"log": {
|
|
1768
|
+
"type": "string"
|
|
1769
|
+
},
|
|
1770
|
+
"scratchpad": {
|
|
1771
|
+
"type": "string"
|
|
1772
|
+
},
|
|
1773
|
+
"whiteboard": {
|
|
1774
|
+
"type": "string"
|
|
1775
|
+
},
|
|
1776
|
+
"prReview": {
|
|
1777
|
+
"type": "string"
|
|
1778
|
+
},
|
|
1779
|
+
"pluginWebview": {
|
|
1780
|
+
"type": "string"
|
|
1781
|
+
}
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1785
|
+
},
|
|
1786
|
+
"AgentNotificationText": {
|
|
1787
|
+
"title": "AgentNotificationText",
|
|
1788
|
+
"type": "object",
|
|
1789
|
+
"additionalProperties": false,
|
|
1790
|
+
"required": [
|
|
1791
|
+
"doneTitle",
|
|
1792
|
+
"attentionTitle",
|
|
1793
|
+
"questionTitle",
|
|
1794
|
+
"commandTitle",
|
|
1795
|
+
"locationSeparator",
|
|
1796
|
+
"tabSuffix",
|
|
1797
|
+
"unknownLocation"
|
|
1798
|
+
],
|
|
1799
|
+
"description": "Templates for the text of an agent alert. Rendered identically by the desktop toast, the desktop platform notification, and the Expo push the gateway sends to a paired phone, so all three read the same. `{agent}`, `{project}`, `{worktree}`, and `{tab}` are substituted; no other placeholder is recognised.",
|
|
1800
|
+
"properties": {
|
|
1801
|
+
"doneTitle": {
|
|
1802
|
+
"type": "string",
|
|
1803
|
+
"description": "Title when the agent finished its turn. Takes `{agent}`."
|
|
1804
|
+
},
|
|
1805
|
+
"attentionTitle": {
|
|
1806
|
+
"type": "string",
|
|
1807
|
+
"description": "Title when the agent needs attention for an unclassified reason. Takes `{agent}`."
|
|
1808
|
+
},
|
|
1809
|
+
"questionTitle": {
|
|
1810
|
+
"type": "string",
|
|
1811
|
+
"description": "Title when the agent is waiting for an answer. Takes `{agent}`."
|
|
1812
|
+
},
|
|
1813
|
+
"commandTitle": {
|
|
1814
|
+
"type": "string",
|
|
1815
|
+
"description": "Title when the agent is asking to run a command. Takes `{agent}`."
|
|
1816
|
+
},
|
|
1817
|
+
"locationSeparator": {
|
|
1818
|
+
"type": "string",
|
|
1819
|
+
"description": "Joins the project and worktree names in the body line."
|
|
1820
|
+
},
|
|
1821
|
+
"tabSuffix": {
|
|
1822
|
+
"type": "string",
|
|
1823
|
+
"description": "Appended to the body when the reporting tab has a name of its own. Takes `{tab}`."
|
|
1824
|
+
},
|
|
1825
|
+
"unknownLocation": {
|
|
1826
|
+
"type": "string",
|
|
1827
|
+
"description": "Body used when neither the project nor the worktree could be resolved \u2014 a report can arrive for a worktree the client has not loaded yet."
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
},
|
|
1831
|
+
"AgentStatusSettings": {
|
|
1832
|
+
"title": "AgentStatusSettings",
|
|
1833
|
+
"type": "object",
|
|
1834
|
+
"additionalProperties": false,
|
|
1835
|
+
"description": "Persisted `agentStatus` block of a global or project `.pragma/config.json`. Every field is optional: a project value overrides the global one, which overrides AgentStatusDefaults.",
|
|
1836
|
+
"properties": {
|
|
1837
|
+
"notificationsEnabled": {
|
|
1838
|
+
"type": "boolean",
|
|
1839
|
+
"description": "Whether an agent alert raises a platform notification."
|
|
1840
|
+
},
|
|
1841
|
+
"soundName": {
|
|
1842
|
+
"type": ["string", "null"],
|
|
1843
|
+
"description": "File name (not a path) of the clip in the sounds directory played on every agent alert. Null plays the built-in chime instead."
|
|
1844
|
+
}
|
|
1845
|
+
}
|
|
1846
|
+
},
|
|
1847
|
+
"TerminalDefaults": {
|
|
1848
|
+
"title": "TerminalDefaults",
|
|
1849
|
+
"type": "object",
|
|
1850
|
+
"additionalProperties": false,
|
|
1851
|
+
"required": [
|
|
1852
|
+
"hiddenDistros",
|
|
1853
|
+
"rememberLastShell",
|
|
1854
|
+
"maxDroppedFileBytes",
|
|
1855
|
+
"droppedFilesDirName",
|
|
1856
|
+
"droppedFilesMaxAgeMs"
|
|
1857
|
+
],
|
|
1858
|
+
"description": "Shipped defaults for terminal launching. A user overrides these per install/project via the `terminal` key of `.pragma/config.json` (`TerminalSettings`).",
|
|
1859
|
+
"properties": {
|
|
1860
|
+
"hiddenDistros": {
|
|
1861
|
+
"type": "array",
|
|
1862
|
+
"items": {
|
|
1863
|
+
"type": "string"
|
|
1864
|
+
},
|
|
1865
|
+
"uniqueItems": true,
|
|
1866
|
+
"description": "WSL distribution names hidden from the shell picker by default because they back other tools rather than interactive shells (Docker Desktop's VM distros)."
|
|
1867
|
+
},
|
|
1868
|
+
"rememberLastShell": {
|
|
1869
|
+
"type": "boolean",
|
|
1870
|
+
"description": "Whether a plain new tab defaults to the shell profile most recently picked for that project instead of the configured default terminal."
|
|
1871
|
+
},
|
|
1872
|
+
"maxDroppedFileBytes": {
|
|
1873
|
+
"type": "integer",
|
|
1874
|
+
"minimum": 1,
|
|
1875
|
+
"description": "Largest file (typically an image) that may be dropped onto a terminal. The bytes are copied to the host that runs the PTY in one `filesystem` RPC, so this plus its base64 expansion must stay inside the protocol's frame limit."
|
|
1876
|
+
},
|
|
1877
|
+
"droppedFilesDirName": {
|
|
1878
|
+
"type": "string",
|
|
1879
|
+
"minLength": 1,
|
|
1880
|
+
"description": "Directory under the host's temporary directory that holds copies of files dropped onto a terminal, whose absolute paths are pasted into the PTY."
|
|
1881
|
+
},
|
|
1882
|
+
"droppedFilesMaxAgeMs": {
|
|
1883
|
+
"type": "integer",
|
|
1884
|
+
"minimum": 1,
|
|
1885
|
+
"description": "How long a per-drop directory under `droppedFilesDirName` may sit on disk before a sweep deletes it. The host sweeps once at startup and on a fixed interval after that (`DROPPED_FILES_SWEEP_INTERVAL` in `pragma-server`), so a drop is retained for at most this age plus one sweep interval."
|
|
1886
|
+
}
|
|
1887
|
+
}
|
|
1888
|
+
},
|
|
1889
|
+
"TerminalSettings": {
|
|
1890
|
+
"title": "TerminalSettings",
|
|
1891
|
+
"type": "object",
|
|
1892
|
+
"additionalProperties": false,
|
|
1893
|
+
"description": "Persisted `terminal` block of a global or project `.pragma/config.json`. Every field is optional: a project value overrides the global one, which overrides TerminalDefaults. Only meaningful on Windows, where both a native shell and WSL distributions are launchable; macOS and Linux always resolve to the native shell.",
|
|
1894
|
+
"properties": {
|
|
1895
|
+
"shell": {
|
|
1896
|
+
"type": "string",
|
|
1897
|
+
"description": "Native shell program (name on PATH or absolute path) launched for terminal sessions. On Windows this picks between the candidate shells (e.g. `pwsh.exe` vs `powershell.exe`); on macOS/Linux it wins over the `SHELL` environment variable."
|
|
1898
|
+
},
|
|
1899
|
+
"backend": {
|
|
1900
|
+
"$ref": "#/definitions/TerminalBackend",
|
|
1901
|
+
"description": "Which world the default terminal lives in: the host's own shell, or a Linux shell inside a WSL distribution."
|
|
1902
|
+
},
|
|
1903
|
+
"distro": {
|
|
1904
|
+
"type": ["string", "null"],
|
|
1905
|
+
"description": "WSL distribution launched when `backend` is `wsl`. Null uses the distribution WSL itself marks as default."
|
|
1906
|
+
},
|
|
1907
|
+
"hiddenDistros": {
|
|
1908
|
+
"type": "array",
|
|
1909
|
+
"items": {
|
|
1910
|
+
"type": "string"
|
|
1911
|
+
},
|
|
1912
|
+
"description": "WSL distribution names omitted from the shell picker. Replaces the shipped TerminalDefaults list rather than merging with it."
|
|
1913
|
+
},
|
|
1914
|
+
"rememberLastShell": {
|
|
1915
|
+
"type": "boolean",
|
|
1916
|
+
"description": "Whether a plain new tab defaults to the shell profile most recently picked for that project instead of the configured default terminal."
|
|
1917
|
+
}
|
|
1918
|
+
}
|
|
1919
|
+
},
|
|
1920
|
+
"WslDistro": {
|
|
1921
|
+
"title": "WslDistro",
|
|
1922
|
+
"type": "object",
|
|
1923
|
+
"additionalProperties": false,
|
|
1924
|
+
"required": ["name", "running", "version", "default"],
|
|
1925
|
+
"description": "One installed WSL distribution, parsed from `wsl.exe --list --verbose`.",
|
|
1926
|
+
"properties": {
|
|
1927
|
+
"name": {
|
|
1928
|
+
"type": "string",
|
|
1929
|
+
"description": "Distribution name as WSL reports it (e.g. `Ubuntu-24.04`)."
|
|
1930
|
+
},
|
|
1931
|
+
"running": {
|
|
1932
|
+
"type": "boolean",
|
|
1933
|
+
"description": "Whether the distribution is currently running."
|
|
1934
|
+
},
|
|
1935
|
+
"version": {
|
|
1936
|
+
"type": "integer",
|
|
1937
|
+
"minimum": 1,
|
|
1938
|
+
"description": "WSL version the distribution runs under (1 or 2)."
|
|
1939
|
+
},
|
|
1940
|
+
"default": {
|
|
1941
|
+
"type": "boolean",
|
|
1942
|
+
"description": "Whether WSL treats this distribution as its default."
|
|
1943
|
+
}
|
|
1944
|
+
}
|
|
1945
|
+
},
|
|
1946
|
+
"WslDistroList": {
|
|
1947
|
+
"title": "WslDistroList",
|
|
1948
|
+
"type": "object",
|
|
1949
|
+
"additionalProperties": false,
|
|
1950
|
+
"required": ["isWindows", "distros"],
|
|
1951
|
+
"description": "Result of probing WSL availability on the host that owns a worktree \u2014 the desktop machine for a local project, the remote daemon's machine for an SSH one. `distros` is empty on non-Windows hosts and on Windows installs without WSL.",
|
|
1952
|
+
"properties": {
|
|
1953
|
+
"isWindows": {
|
|
1954
|
+
"type": "boolean",
|
|
1955
|
+
"description": "Whether the host that answered the probe runs Windows, the only platform where WSL distributions can exist."
|
|
1956
|
+
},
|
|
1957
|
+
"distros": {
|
|
1958
|
+
"type": "array",
|
|
1959
|
+
"items": {
|
|
1960
|
+
"$ref": "#/definitions/WslDistro"
|
|
1961
|
+
},
|
|
1962
|
+
"description": "Installed WSL distributions, before any user-configured hiding."
|
|
1963
|
+
}
|
|
1964
|
+
}
|
|
1965
|
+
},
|
|
1966
|
+
"SettingsScope": {
|
|
1967
|
+
"title": "SettingsScope",
|
|
1968
|
+
"description": "Which `.pragma` layer a setting or asset belongs to: the user's home directory or the selected project.",
|
|
1969
|
+
"type": "string",
|
|
1970
|
+
"enum": ["global", "project"]
|
|
1971
|
+
},
|
|
1972
|
+
"AgentSound": {
|
|
1973
|
+
"title": "AgentSound",
|
|
1974
|
+
"type": "object",
|
|
1975
|
+
"additionalProperties": false,
|
|
1976
|
+
"required": ["name", "scope"],
|
|
1977
|
+
"description": "One alert clip discovered in a scope's sounds directory.",
|
|
1978
|
+
"properties": {
|
|
1979
|
+
"name": {
|
|
1980
|
+
"type": "string",
|
|
1981
|
+
"description": "File name including extension, unique within its directory."
|
|
1982
|
+
},
|
|
1983
|
+
"scope": {
|
|
1984
|
+
"$ref": "#/definitions/SettingsScope",
|
|
1985
|
+
"description": "Which sounds directory the clip was found in."
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
},
|
|
1989
|
+
"AgentSoundList": {
|
|
1990
|
+
"title": "AgentSoundList",
|
|
1991
|
+
"type": "object",
|
|
1992
|
+
"additionalProperties": false,
|
|
1993
|
+
"required": ["dir", "sounds"],
|
|
1994
|
+
"description": "Contents of one scope's sounds directory, plus the directory path to show in Settings.",
|
|
1995
|
+
"properties": {
|
|
1996
|
+
"dir": {
|
|
1997
|
+
"type": "string",
|
|
1998
|
+
"description": "Host-resolved absolute path of the scanned sounds directory (it may not exist yet)."
|
|
1999
|
+
},
|
|
2000
|
+
"sounds": {
|
|
2001
|
+
"type": "array",
|
|
2002
|
+
"items": {
|
|
2003
|
+
"$ref": "#/definitions/AgentSound"
|
|
2004
|
+
}
|
|
2005
|
+
}
|
|
2006
|
+
}
|
|
2007
|
+
},
|
|
2008
|
+
"AgentReasoning": {
|
|
2009
|
+
"title": "AgentReasoning",
|
|
2010
|
+
"type": "object",
|
|
2011
|
+
"additionalProperties": false,
|
|
2012
|
+
"required": ["id", "name"],
|
|
2013
|
+
"description": "One selectable reasoning-effort level for an agent model. Promoted from @pragma-sh/plugin so the catalog wire type has one source of truth.",
|
|
2014
|
+
"properties": {
|
|
2015
|
+
"id": {
|
|
2016
|
+
"type": "string"
|
|
2017
|
+
},
|
|
2018
|
+
"name": {
|
|
2019
|
+
"type": "string"
|
|
2020
|
+
}
|
|
2021
|
+
}
|
|
2022
|
+
},
|
|
2023
|
+
"AgentModelEntry": {
|
|
2024
|
+
"title": "AgentModelEntry",
|
|
2025
|
+
"type": "object",
|
|
2026
|
+
"additionalProperties": false,
|
|
2027
|
+
"required": ["id", "name"],
|
|
2028
|
+
"description": "One selectable model for an agent, with optional reasoning levels.",
|
|
2029
|
+
"properties": {
|
|
2030
|
+
"id": {
|
|
2031
|
+
"type": "string"
|
|
2032
|
+
},
|
|
2033
|
+
"name": {
|
|
2034
|
+
"type": "string"
|
|
2035
|
+
},
|
|
2036
|
+
"reasoning": {
|
|
2037
|
+
"type": "array",
|
|
2038
|
+
"items": {
|
|
2039
|
+
"$ref": "#/definitions/AgentReasoning"
|
|
2040
|
+
}
|
|
2041
|
+
}
|
|
2042
|
+
}
|
|
2043
|
+
},
|
|
2044
|
+
"AgentIcon": {
|
|
2045
|
+
"title": "AgentIcon",
|
|
2046
|
+
"type": "object",
|
|
2047
|
+
"additionalProperties": false,
|
|
2048
|
+
"required": ["hash", "mime"],
|
|
2049
|
+
"description": "Reference to a plugin-contributed agent icon asset, fetched by content hash through the gateway `/v1/assets/{hash}` route.",
|
|
2050
|
+
"properties": {
|
|
2051
|
+
"hash": {
|
|
2052
|
+
"type": "string",
|
|
2053
|
+
"description": "Lowercase-hex sha256 of the icon bytes; also the ETag and cache key."
|
|
2054
|
+
},
|
|
2055
|
+
"mime": {
|
|
2056
|
+
"type": "string",
|
|
2057
|
+
"description": "Icon MIME type (e.g. `image/svg+xml`)."
|
|
2058
|
+
}
|
|
2059
|
+
}
|
|
2060
|
+
},
|
|
2061
|
+
"AgentFeature": {
|
|
2062
|
+
"title": "AgentFeature",
|
|
2063
|
+
"type": "string",
|
|
2064
|
+
"description": "Optional agent capability used to exclude unsupported agent-verification scenarios.",
|
|
2065
|
+
"enum": [
|
|
2066
|
+
"questions",
|
|
2067
|
+
"commandApproval",
|
|
2068
|
+
"commands",
|
|
2069
|
+
"subagents",
|
|
2070
|
+
"abort",
|
|
2071
|
+
"interrupt",
|
|
2072
|
+
"usageLimits",
|
|
2073
|
+
"sessionName"
|
|
2074
|
+
]
|
|
2075
|
+
},
|
|
2076
|
+
"CatalogAgent": {
|
|
2077
|
+
"title": "CatalogAgent",
|
|
2078
|
+
"type": "object",
|
|
2079
|
+
"additionalProperties": false,
|
|
2080
|
+
"required": ["id", "name", "pluginId", "models", "launch"],
|
|
2081
|
+
"description": "One launchable agent in the resolved plugin catalog.",
|
|
2082
|
+
"properties": {
|
|
2083
|
+
"id": {
|
|
2084
|
+
"type": "string"
|
|
2085
|
+
},
|
|
2086
|
+
"name": {
|
|
2087
|
+
"type": "string"
|
|
2088
|
+
},
|
|
2089
|
+
"pluginId": {
|
|
2090
|
+
"type": "string",
|
|
2091
|
+
"description": "Id of the plugin that contributed this agent."
|
|
2092
|
+
},
|
|
2093
|
+
"scope": {
|
|
2094
|
+
"type": ["string", "null"],
|
|
2095
|
+
"enum": ["global", "project", null],
|
|
2096
|
+
"description": "Where the contributing plugin was resolved from. A `project` agent belongs to exactly one project root and must not be offered to another one."
|
|
2097
|
+
},
|
|
2098
|
+
"root": {
|
|
2099
|
+
"type": ["string", "null"],
|
|
2100
|
+
"description": "Absolute root the contributing plugin was resolved from: the project root for `project` scope or the home directory for `global`."
|
|
2101
|
+
},
|
|
2102
|
+
"runtimeAgentId": {
|
|
2103
|
+
"type": ["string", "null"],
|
|
2104
|
+
"description": "Runtime reporter/watcher id the agent event stream is keyed by, when the plugin declares a watcher. Callers must use this rather than re-deriving an id from the dotted catalog id."
|
|
2105
|
+
},
|
|
2106
|
+
"icon": {
|
|
2107
|
+
"anyOf": [
|
|
2108
|
+
{
|
|
2109
|
+
"$ref": "#/definitions/AgentIcon"
|
|
2110
|
+
},
|
|
2111
|
+
{
|
|
2112
|
+
"type": "null"
|
|
2113
|
+
}
|
|
2114
|
+
]
|
|
2115
|
+
},
|
|
2116
|
+
"models": {
|
|
2117
|
+
"type": "array",
|
|
2118
|
+
"items": {
|
|
2119
|
+
"$ref": "#/definitions/AgentModelEntry"
|
|
2120
|
+
}
|
|
2121
|
+
},
|
|
2122
|
+
"excludeFeatures": {
|
|
2123
|
+
"type": "array",
|
|
2124
|
+
"description": "Capabilities the agent declares unsupported; agent verification skips matching scenarios.",
|
|
2125
|
+
"items": {
|
|
2126
|
+
"$ref": "#/definitions/AgentFeature"
|
|
2127
|
+
},
|
|
2128
|
+
"uniqueItems": true
|
|
2129
|
+
},
|
|
2130
|
+
"launch": {
|
|
2131
|
+
"$ref": "#/definitions/AgentLaunchConfig"
|
|
2132
|
+
}
|
|
2133
|
+
}
|
|
2134
|
+
},
|
|
2135
|
+
"AgentLaunchConfig": {
|
|
2136
|
+
"title": "AgentLaunchConfig",
|
|
2137
|
+
"type": "object",
|
|
2138
|
+
"additionalProperties": false,
|
|
2139
|
+
"required": ["commands"],
|
|
2140
|
+
"description": "Resolved launch commands and terminal-input behavior needed by the persistent host to start an agent without a desktop webview.",
|
|
2141
|
+
"properties": {
|
|
2142
|
+
"commands": {
|
|
2143
|
+
"type": "array",
|
|
2144
|
+
"items": {
|
|
2145
|
+
"$ref": "#/definitions/AgentLaunchCommand"
|
|
2146
|
+
}
|
|
2147
|
+
},
|
|
2148
|
+
"startupInput": {
|
|
2149
|
+
"type": "array",
|
|
2150
|
+
"items": {
|
|
2151
|
+
"$ref": "#/definitions/AgentStartupInput"
|
|
2152
|
+
}
|
|
2153
|
+
},
|
|
2154
|
+
"prefillDelayMs": {
|
|
2155
|
+
"type": "integer",
|
|
2156
|
+
"minimum": 0
|
|
2157
|
+
},
|
|
2158
|
+
"prefillMode": {
|
|
2159
|
+
"enum": ["bracketed", "plain"]
|
|
2160
|
+
},
|
|
2161
|
+
"prefillSubmit": {
|
|
2162
|
+
"type": "string"
|
|
2163
|
+
},
|
|
2164
|
+
"prefillSubmitDelayMs": {
|
|
2165
|
+
"type": "integer",
|
|
2166
|
+
"minimum": 0
|
|
2167
|
+
}
|
|
2168
|
+
}
|
|
2169
|
+
},
|
|
2170
|
+
"AgentLaunchCommand": {
|
|
2171
|
+
"title": "AgentLaunchCommand",
|
|
2172
|
+
"type": "object",
|
|
2173
|
+
"additionalProperties": false,
|
|
2174
|
+
"required": ["modelId", "reasoningId", "command"],
|
|
2175
|
+
"properties": {
|
|
2176
|
+
"modelId": {
|
|
2177
|
+
"type": ["string", "null"]
|
|
2178
|
+
},
|
|
2179
|
+
"reasoningId": {
|
|
2180
|
+
"type": ["string", "null"]
|
|
2181
|
+
},
|
|
2182
|
+
"command": {
|
|
2183
|
+
"type": "array",
|
|
2184
|
+
"items": {
|
|
2185
|
+
"type": "string"
|
|
2186
|
+
}
|
|
2187
|
+
}
|
|
2188
|
+
}
|
|
2189
|
+
},
|
|
2190
|
+
"AgentStartupInput": {
|
|
2191
|
+
"title": "AgentStartupInput",
|
|
2192
|
+
"type": "object",
|
|
2193
|
+
"additionalProperties": false,
|
|
2194
|
+
"required": ["delayMs", "data"],
|
|
2195
|
+
"properties": {
|
|
2196
|
+
"delayMs": {
|
|
2197
|
+
"type": "integer",
|
|
2198
|
+
"minimum": 0
|
|
2199
|
+
},
|
|
2200
|
+
"data": {
|
|
2201
|
+
"type": "string"
|
|
2202
|
+
}
|
|
2203
|
+
}
|
|
2204
|
+
},
|
|
2205
|
+
"AgentCatalog": {
|
|
2206
|
+
"title": "AgentCatalog",
|
|
2207
|
+
"type": "object",
|
|
2208
|
+
"additionalProperties": false,
|
|
2209
|
+
"required": ["agents"],
|
|
2210
|
+
"description": "The resolved set of launchable agents contributed by all loaded plugins, assembled by the pragma-plugins sidecar and cached by pragma-server.",
|
|
2211
|
+
"properties": {
|
|
2212
|
+
"agents": {
|
|
2213
|
+
"type": "array",
|
|
2214
|
+
"items": {
|
|
2215
|
+
"$ref": "#/definitions/CatalogAgent"
|
|
2216
|
+
}
|
|
2217
|
+
}
|
|
2218
|
+
}
|
|
2219
|
+
},
|
|
2220
|
+
"PairingPayload": {
|
|
2221
|
+
"title": "PairingPayload",
|
|
2222
|
+
"type": "object",
|
|
2223
|
+
"additionalProperties": false,
|
|
2224
|
+
"required": ["url", "token", "protocolVersion", "hostName"],
|
|
2225
|
+
"description": "The QR-encoded payload a desktop shows so a mobile client can connect to this host's gateway through the remote-access tunnel.",
|
|
2226
|
+
"properties": {
|
|
2227
|
+
"url": {
|
|
2228
|
+
"type": "string",
|
|
2229
|
+
"description": "Public tunnel base URL of the local HTTP gateway."
|
|
2230
|
+
},
|
|
2231
|
+
"token": {
|
|
2232
|
+
"type": "string",
|
|
2233
|
+
"description": "Gateway bearer token the paired device must present."
|
|
2234
|
+
},
|
|
2235
|
+
"protocolVersion": {
|
|
2236
|
+
"type": "string",
|
|
2237
|
+
"description": "pragma-protocol SemVer the host speaks, so the client can reject an incompatible host early."
|
|
2238
|
+
},
|
|
2239
|
+
"hostName": {
|
|
2240
|
+
"type": "string",
|
|
2241
|
+
"description": "Human-readable name of the host, shown on the paired device."
|
|
2242
|
+
}
|
|
2243
|
+
}
|
|
2244
|
+
},
|
|
2245
|
+
"AppInfo": {
|
|
2246
|
+
"title": "AppInfo",
|
|
2247
|
+
"type": "object",
|
|
2248
|
+
"additionalProperties": false,
|
|
2249
|
+
"required": ["name", "identifier", "version"],
|
|
2250
|
+
"properties": {
|
|
2251
|
+
"name": {
|
|
2252
|
+
"type": "string",
|
|
2253
|
+
"description": "Human-readable product name."
|
|
2254
|
+
},
|
|
2255
|
+
"identifier": {
|
|
2256
|
+
"type": "string",
|
|
2257
|
+
"description": "Reverse-DNS bundle identifier."
|
|
2258
|
+
},
|
|
2259
|
+
"version": {
|
|
2260
|
+
"type": "string",
|
|
2261
|
+
"description": "Semantic version string."
|
|
2262
|
+
}
|
|
2263
|
+
}
|
|
2264
|
+
},
|
|
2265
|
+
"WindowDefaults": {
|
|
2266
|
+
"title": "WindowDefaults",
|
|
2267
|
+
"type": "object",
|
|
2268
|
+
"additionalProperties": false,
|
|
2269
|
+
"required": [
|
|
2270
|
+
"defaultWidth",
|
|
2271
|
+
"defaultHeight",
|
|
2272
|
+
"minWidth",
|
|
2273
|
+
"minHeight",
|
|
2274
|
+
"titlebarHeight",
|
|
2275
|
+
"trafficLightInset"
|
|
2276
|
+
],
|
|
2277
|
+
"properties": {
|
|
2278
|
+
"defaultWidth": {
|
|
2279
|
+
"type": "integer",
|
|
2280
|
+
"minimum": 1
|
|
2281
|
+
},
|
|
2282
|
+
"defaultHeight": {
|
|
2283
|
+
"type": "integer",
|
|
2284
|
+
"minimum": 1
|
|
2285
|
+
},
|
|
2286
|
+
"minWidth": {
|
|
2287
|
+
"type": "integer",
|
|
2288
|
+
"minimum": 1
|
|
2289
|
+
},
|
|
2290
|
+
"minHeight": {
|
|
2291
|
+
"type": "integer",
|
|
2292
|
+
"minimum": 1
|
|
2293
|
+
},
|
|
2294
|
+
"titlebarHeight": {
|
|
2295
|
+
"type": "integer",
|
|
2296
|
+
"minimum": 0,
|
|
2297
|
+
"description": "Height in px of the custom draggable titlebar strip the frontend reserves above the content. Must clear the inset macOS traffic lights."
|
|
2298
|
+
},
|
|
2299
|
+
"trafficLightInset": {
|
|
2300
|
+
"type": "integer",
|
|
2301
|
+
"minimum": 0,
|
|
2302
|
+
"description": "macOS traffic-light button inset in px from the top-left window corner, applied via tauri-plugin-decorum so the controls center vertically within the custom titlebar."
|
|
2303
|
+
}
|
|
2304
|
+
}
|
|
2305
|
+
},
|
|
2306
|
+
"EditorLaunchers": {
|
|
2307
|
+
"title": "EditorLaunchers",
|
|
2308
|
+
"type": "object",
|
|
2309
|
+
"additionalProperties": false,
|
|
2310
|
+
"required": ["defaultEditorId", "options"],
|
|
2311
|
+
"properties": {
|
|
2312
|
+
"defaultEditorId": {
|
|
2313
|
+
"type": "string"
|
|
2314
|
+
},
|
|
2315
|
+
"options": {
|
|
2316
|
+
"type": "array",
|
|
2317
|
+
"items": {
|
|
2318
|
+
"$ref": "#/definitions/EditorLauncher"
|
|
2319
|
+
}
|
|
2320
|
+
}
|
|
2321
|
+
}
|
|
2322
|
+
},
|
|
2323
|
+
"EditorLauncher": {
|
|
2324
|
+
"title": "EditorLauncher",
|
|
2325
|
+
"type": "object",
|
|
2326
|
+
"additionalProperties": false,
|
|
2327
|
+
"required": ["id", "name", "brandIcon", "brandColor", "cliCommand"],
|
|
2328
|
+
"properties": {
|
|
2329
|
+
"id": {
|
|
2330
|
+
"type": "string"
|
|
2331
|
+
},
|
|
2332
|
+
"name": {
|
|
2333
|
+
"type": "string"
|
|
2334
|
+
},
|
|
2335
|
+
"brandIcon": {
|
|
2336
|
+
"type": "string",
|
|
2337
|
+
"description": "Iconify icon name, preferably from the simple-icons namespace for branded editors."
|
|
2338
|
+
},
|
|
2339
|
+
"brandColor": {
|
|
2340
|
+
"type": "string",
|
|
2341
|
+
"description": "Hex color used to render the monochrome Iconify brand glyph."
|
|
2342
|
+
},
|
|
2343
|
+
"cliCommand": {
|
|
2344
|
+
"type": ["string", "null"],
|
|
2345
|
+
"description": "Executable name used to launch the editor with the worktree path. Null uses the system file explorer."
|
|
2346
|
+
}
|
|
2347
|
+
}
|
|
2348
|
+
},
|
|
2349
|
+
"Scripts": {
|
|
2350
|
+
"title": "Scripts",
|
|
2351
|
+
"type": "object",
|
|
2352
|
+
"additionalProperties": false,
|
|
2353
|
+
"description": "Shared script execution limits used by project lifecycle scripts.",
|
|
2354
|
+
"required": [
|
|
2355
|
+
"maxConcurrentCommands",
|
|
2356
|
+
"configPath",
|
|
2357
|
+
"migrationSources",
|
|
2358
|
+
"migrationCommitMessage"
|
|
2359
|
+
],
|
|
2360
|
+
"properties": {
|
|
2361
|
+
"maxConcurrentCommands": {
|
|
2362
|
+
"type": "integer",
|
|
2363
|
+
"minimum": 1,
|
|
2364
|
+
"description": "Maximum number of headless project script commands Pragma runs at once. Interactive run scripts create terminal tabs and are not limited by this value."
|
|
2365
|
+
},
|
|
2366
|
+
"configPath": {
|
|
2367
|
+
"type": "string",
|
|
2368
|
+
"minLength": 1,
|
|
2369
|
+
"description": "Project-root-relative POSIX path of the optional project script config file. Read by the Rust backend and matched against worktree file-watch events by the frontend to hot-reload script buttons."
|
|
2370
|
+
},
|
|
2371
|
+
"migrationSources": {
|
|
2372
|
+
"type": "array",
|
|
2373
|
+
"items": {
|
|
2374
|
+
"$ref": "#/definitions/ScriptMigrationSource"
|
|
2375
|
+
},
|
|
2376
|
+
"description": "Other agent orchestrators whose checked-in lifecycle-script config Pragma can import into `.pragma/scripts.json`. Order is the detection priority: when a project carries more than one, the first match wins."
|
|
2377
|
+
},
|
|
2378
|
+
"migrationCommitMessage": {
|
|
2379
|
+
"type": "string",
|
|
2380
|
+
"minLength": 1,
|
|
2381
|
+
"description": "Conventional-commit subject for the generated `.pragma/scripts.json` commit, written when the import prompt's commit toggle is on. The commit carries no trailers: the user is its sole author."
|
|
2382
|
+
}
|
|
2383
|
+
}
|
|
2384
|
+
},
|
|
2385
|
+
"ScriptMigrationSource": {
|
|
2386
|
+
"title": "ScriptMigrationSource",
|
|
2387
|
+
"type": "object",
|
|
2388
|
+
"additionalProperties": false,
|
|
2389
|
+
"description": "One importable foreign script config: its identifier, display name, and the project-root-relative paths that identify it.",
|
|
2390
|
+
"required": ["id", "label", "configPaths"],
|
|
2391
|
+
"properties": {
|
|
2392
|
+
"id": {
|
|
2393
|
+
"type": "string",
|
|
2394
|
+
"minLength": 1,
|
|
2395
|
+
"description": "Stable identifier the frontend sends back over IPC to import this source. Never a display string."
|
|
2396
|
+
},
|
|
2397
|
+
"label": {
|
|
2398
|
+
"type": "string",
|
|
2399
|
+
"minLength": 1,
|
|
2400
|
+
"description": "Tool name shown in the import prompt."
|
|
2401
|
+
},
|
|
2402
|
+
"configPaths": {
|
|
2403
|
+
"type": "array",
|
|
2404
|
+
"minItems": 1,
|
|
2405
|
+
"items": {
|
|
2406
|
+
"type": "string",
|
|
2407
|
+
"minLength": 1
|
|
2408
|
+
},
|
|
2409
|
+
"description": "Project-root-relative POSIX paths this tool stores its lifecycle scripts in, in probe order."
|
|
2410
|
+
}
|
|
2411
|
+
}
|
|
2412
|
+
},
|
|
2413
|
+
"Agents": {
|
|
2414
|
+
"title": "Agents",
|
|
2415
|
+
"type": "object",
|
|
2416
|
+
"additionalProperties": false,
|
|
2417
|
+
"description": "Shared agent-launch timing used by both the frontend's terminal-write scheduling and the Rust CLI/broker launch path.",
|
|
2418
|
+
"required": ["startDelayMs", "altScreenExtraWaitMs", "altScreenSettleMs"],
|
|
2419
|
+
"properties": {
|
|
2420
|
+
"startDelayMs": {
|
|
2421
|
+
"type": "integer",
|
|
2422
|
+
"minimum": 0,
|
|
2423
|
+
"description": "Delay before writing an agent's start command to a freshly spawned PTY, giving the shell time to become ready. There is no readiness signal from the PTY, so this is a best-effort fixed delay."
|
|
2424
|
+
},
|
|
2425
|
+
"altScreenExtraWaitMs": {
|
|
2426
|
+
"type": "integer",
|
|
2427
|
+
"minimum": 0,
|
|
2428
|
+
"description": "Maximum extra wait for a bracketed-prefill agent to enter its alternate screen before the prompt is sent anyway."
|
|
2429
|
+
},
|
|
2430
|
+
"altScreenSettleMs": {
|
|
2431
|
+
"type": "integer",
|
|
2432
|
+
"minimum": 0,
|
|
2433
|
+
"description": "Delay after a late alternate-screen entry before sending the prompt, allowing the TUI input widget to mount."
|
|
2434
|
+
}
|
|
2435
|
+
}
|
|
2436
|
+
},
|
|
2437
|
+
"ProjectScriptsConfig": {
|
|
2438
|
+
"title": "ProjectScriptsConfig",
|
|
2439
|
+
"type": "object",
|
|
2440
|
+
"additionalProperties": false,
|
|
2441
|
+
"description": "Project-owned `.pragma/scripts.json` lifecycle scripts. The file is optional; omitted keys behave as empty.",
|
|
2442
|
+
"properties": {
|
|
2443
|
+
"setup": {
|
|
2444
|
+
"type": "array",
|
|
2445
|
+
"items": {
|
|
2446
|
+
"type": "string"
|
|
2447
|
+
},
|
|
2448
|
+
"description": "Headless commands run after a worktree is created, from the new worktree root."
|
|
2449
|
+
},
|
|
2450
|
+
"runScripts": {
|
|
2451
|
+
"type": "object",
|
|
2452
|
+
"additionalProperties": {
|
|
2453
|
+
"$ref": "#/definitions/RunScriptDefinition"
|
|
2454
|
+
},
|
|
2455
|
+
"description": "Interactive scripts opened from the workspace header as terminal tabs and optional split layouts, keyed by name. The `run` and `build` keys are the default entries the header always reserves buttons for; any other key is a custom script and renders its own header button."
|
|
2456
|
+
},
|
|
2457
|
+
"teardown": {
|
|
2458
|
+
"type": "array",
|
|
2459
|
+
"items": {
|
|
2460
|
+
"type": "string"
|
|
2461
|
+
},
|
|
2462
|
+
"description": "Headless commands run before a worktree is deleted, from the target worktree root. Failures block deletion."
|
|
2463
|
+
}
|
|
2464
|
+
}
|
|
2465
|
+
},
|
|
2466
|
+
"RunScriptDefinition": {
|
|
2467
|
+
"title": "RunScriptDefinition",
|
|
2468
|
+
"type": "object",
|
|
2469
|
+
"additionalProperties": false,
|
|
2470
|
+
"required": ["command"],
|
|
2471
|
+
"description": "One named interactive script: the commands it opens and the icon its header button uses.",
|
|
2472
|
+
"properties": {
|
|
2473
|
+
"command": {
|
|
2474
|
+
"type": "array",
|
|
2475
|
+
"items": {
|
|
2476
|
+
"$ref": "#/definitions/RunScriptEntry"
|
|
2477
|
+
},
|
|
2478
|
+
"description": "Interactive commands opened as terminal tabs and optional split layouts."
|
|
2479
|
+
},
|
|
2480
|
+
"icon": {
|
|
2481
|
+
"type": ["string", "null"],
|
|
2482
|
+
"description": "Iconify icon name shown on the script's header button. Omitted for `run`/`build` falls back to the built-in play/hammer icons; omitted for a custom script falls back to a generic terminal icon."
|
|
2483
|
+
}
|
|
2484
|
+
}
|
|
2485
|
+
},
|
|
2486
|
+
"RunScriptEntry": {
|
|
2487
|
+
"title": "RunScriptEntry",
|
|
2488
|
+
"description": "One interactive run-script entry: either a single command string or a split layout tree.",
|
|
2489
|
+
"anyOf": [
|
|
2490
|
+
{
|
|
2491
|
+
"type": "string"
|
|
2492
|
+
},
|
|
2493
|
+
{
|
|
2494
|
+
"$ref": "#/definitions/RunScriptSplit"
|
|
2495
|
+
}
|
|
2496
|
+
]
|
|
2497
|
+
},
|
|
2498
|
+
"RunScriptNode": {
|
|
2499
|
+
"title": "RunScriptNode",
|
|
2500
|
+
"description": "A command string leaf or a nested split layout node.",
|
|
2501
|
+
"anyOf": [
|
|
2502
|
+
{
|
|
2503
|
+
"type": "string"
|
|
2504
|
+
},
|
|
2505
|
+
{
|
|
2506
|
+
"$ref": "#/definitions/RunScriptSplit"
|
|
2507
|
+
}
|
|
2508
|
+
]
|
|
2509
|
+
},
|
|
2510
|
+
"RunScriptSplit": {
|
|
2511
|
+
"title": "RunScriptSplit",
|
|
2512
|
+
"description": "A binary split node. Use exactly one axis: left/right for horizontal, or top/bottom for vertical.",
|
|
2513
|
+
"oneOf": [
|
|
2514
|
+
{
|
|
2515
|
+
"$ref": "#/definitions/RunScriptHorizontalSplit"
|
|
2516
|
+
},
|
|
2517
|
+
{
|
|
2518
|
+
"$ref": "#/definitions/RunScriptVerticalSplit"
|
|
2519
|
+
}
|
|
2520
|
+
]
|
|
2521
|
+
},
|
|
2522
|
+
"RunScriptHorizontalSplit": {
|
|
2523
|
+
"title": "RunScriptHorizontalSplit",
|
|
2524
|
+
"type": "object",
|
|
2525
|
+
"additionalProperties": false,
|
|
2526
|
+
"required": ["left", "right"],
|
|
2527
|
+
"properties": {
|
|
2528
|
+
"left": {
|
|
2529
|
+
"$ref": "#/definitions/RunScriptNode"
|
|
2530
|
+
},
|
|
2531
|
+
"right": {
|
|
2532
|
+
"$ref": "#/definitions/RunScriptNode"
|
|
2533
|
+
}
|
|
2534
|
+
}
|
|
2535
|
+
},
|
|
2536
|
+
"RunScriptVerticalSplit": {
|
|
2537
|
+
"title": "RunScriptVerticalSplit",
|
|
2538
|
+
"type": "object",
|
|
2539
|
+
"additionalProperties": false,
|
|
2540
|
+
"required": ["top", "bottom"],
|
|
2541
|
+
"properties": {
|
|
2542
|
+
"top": {
|
|
2543
|
+
"$ref": "#/definitions/RunScriptNode"
|
|
2544
|
+
},
|
|
2545
|
+
"bottom": {
|
|
2546
|
+
"$ref": "#/definitions/RunScriptNode"
|
|
2547
|
+
}
|
|
2548
|
+
}
|
|
2549
|
+
},
|
|
2550
|
+
"SplitTabLeaf": {
|
|
2551
|
+
"title": "SplitTabLeaf",
|
|
2552
|
+
"description": "A leaf pane in a shared SplitNode tree: a tab spec. `kind` selects the tab type; `command` seeds a terminal tab, `url` a browser tab, `file` an editor/diff tab. This intentionally diverges from RunScriptSplit (whose leaves are bare command strings) so the CLI split tree describes tabs, not commands.",
|
|
2553
|
+
"type": "object",
|
|
2554
|
+
"additionalProperties": false,
|
|
2555
|
+
"required": ["kind"],
|
|
2556
|
+
"properties": {
|
|
2557
|
+
"kind": {
|
|
2558
|
+
"$ref": "#/definitions/TabKind"
|
|
2559
|
+
},
|
|
2560
|
+
"command": {
|
|
2561
|
+
"type": ["string", "null"],
|
|
2562
|
+
"description": "Start command for a terminal tab leaf."
|
|
2563
|
+
},
|
|
2564
|
+
"url": {
|
|
2565
|
+
"type": ["string", "null"],
|
|
2566
|
+
"description": "Starting URL for a browser tab leaf."
|
|
2567
|
+
},
|
|
2568
|
+
"file": {
|
|
2569
|
+
"type": ["string", "null"],
|
|
2570
|
+
"description": "Worktree-relative path for an editor/diff tab leaf."
|
|
2571
|
+
}
|
|
2572
|
+
}
|
|
2573
|
+
},
|
|
2574
|
+
"SplitHorizontal": {
|
|
2575
|
+
"title": "SplitHorizontal",
|
|
2576
|
+
"description": "A horizontal split node in a shared SplitNode tree (left/right panes).",
|
|
2577
|
+
"type": "object",
|
|
2578
|
+
"additionalProperties": false,
|
|
2579
|
+
"required": ["left", "right"],
|
|
2580
|
+
"properties": {
|
|
2581
|
+
"left": {
|
|
2582
|
+
"$ref": "#/definitions/SplitNode"
|
|
2583
|
+
},
|
|
2584
|
+
"right": {
|
|
2585
|
+
"$ref": "#/definitions/SplitNode"
|
|
2586
|
+
}
|
|
2587
|
+
}
|
|
2588
|
+
},
|
|
2589
|
+
"SplitVertical": {
|
|
2590
|
+
"title": "SplitVertical",
|
|
2591
|
+
"description": "A vertical split node in a shared SplitNode tree (top/bottom panes).",
|
|
2592
|
+
"type": "object",
|
|
2593
|
+
"additionalProperties": false,
|
|
2594
|
+
"required": ["top", "bottom"],
|
|
2595
|
+
"properties": {
|
|
2596
|
+
"top": {
|
|
2597
|
+
"$ref": "#/definitions/SplitNode"
|
|
2598
|
+
},
|
|
2599
|
+
"bottom": {
|
|
2600
|
+
"$ref": "#/definitions/SplitNode"
|
|
2601
|
+
}
|
|
2602
|
+
}
|
|
2603
|
+
},
|
|
2604
|
+
"SplitSplit": {
|
|
2605
|
+
"title": "SplitSplit",
|
|
2606
|
+
"description": "A binary split node: exactly one axis, horizontal (left/right) or vertical (top/bottom). Mirrors RunScriptSplit.",
|
|
2607
|
+
"oneOf": [
|
|
2608
|
+
{
|
|
2609
|
+
"$ref": "#/definitions/SplitHorizontal"
|
|
2610
|
+
},
|
|
2611
|
+
{
|
|
2612
|
+
"$ref": "#/definitions/SplitVertical"
|
|
2613
|
+
}
|
|
2614
|
+
]
|
|
2615
|
+
},
|
|
2616
|
+
"SplitNode": {
|
|
2617
|
+
"title": "SplitNode",
|
|
2618
|
+
"description": "Shared recursive split-pane tree. A node is either a tab-spec leaf or a binary split (left/right for horizontal, top/bottom for vertical). The CLI split layout and the live frontend split layout both use this shape.",
|
|
2619
|
+
"anyOf": [
|
|
2620
|
+
{
|
|
2621
|
+
"$ref": "#/definitions/SplitTabLeaf"
|
|
2622
|
+
},
|
|
2623
|
+
{
|
|
2624
|
+
"$ref": "#/definitions/SplitSplit"
|
|
2625
|
+
}
|
|
2626
|
+
]
|
|
2627
|
+
},
|
|
2628
|
+
"ScriptRunStatus": {
|
|
2629
|
+
"title": "ScriptRunStatus",
|
|
2630
|
+
"description": "Runtime status for a frontend-managed interactive run-script session.",
|
|
2631
|
+
"type": "string",
|
|
2632
|
+
"enum": ["idle", "running", "stopping"]
|
|
2633
|
+
},
|
|
2634
|
+
"Project": {
|
|
2635
|
+
"title": "Project",
|
|
2636
|
+
"type": "object",
|
|
2637
|
+
"additionalProperties": false,
|
|
2638
|
+
"required": ["id", "name", "path", "iconEmoji", "orderIndex", "createdAt"],
|
|
2639
|
+
"properties": {
|
|
2640
|
+
"id": {
|
|
2641
|
+
"type": "string"
|
|
2642
|
+
},
|
|
2643
|
+
"name": {
|
|
2644
|
+
"type": "string"
|
|
2645
|
+
},
|
|
2646
|
+
"path": {
|
|
2647
|
+
"type": "string"
|
|
2648
|
+
},
|
|
2649
|
+
"iconEmoji": {
|
|
2650
|
+
"type": ["string", "null"],
|
|
2651
|
+
"description": "User-chosen emoji shown in the project switcher; null falls back to a favicon found in the checkout, then to the project name's initial."
|
|
2652
|
+
},
|
|
2653
|
+
"orderIndex": {
|
|
2654
|
+
"type": "integer"
|
|
2655
|
+
},
|
|
2656
|
+
"createdAt": {
|
|
2657
|
+
"type": "string"
|
|
2658
|
+
}
|
|
2659
|
+
}
|
|
2660
|
+
},
|
|
2661
|
+
"Worktree": {
|
|
2662
|
+
"title": "Worktree",
|
|
2663
|
+
"type": "object",
|
|
2664
|
+
"additionalProperties": false,
|
|
2665
|
+
"required": [
|
|
2666
|
+
"id",
|
|
2667
|
+
"projectId",
|
|
2668
|
+
"parentId",
|
|
2669
|
+
"branch",
|
|
2670
|
+
"title",
|
|
2671
|
+
"path",
|
|
2672
|
+
"isMain",
|
|
2673
|
+
"hidden",
|
|
2674
|
+
"createdAt"
|
|
2675
|
+
],
|
|
2676
|
+
"properties": {
|
|
2677
|
+
"id": {
|
|
2678
|
+
"type": "string"
|
|
2679
|
+
},
|
|
2680
|
+
"projectId": {
|
|
2681
|
+
"type": "string"
|
|
2682
|
+
},
|
|
2683
|
+
"parentId": {
|
|
2684
|
+
"type": ["string", "null"]
|
|
2685
|
+
},
|
|
2686
|
+
"branch": {
|
|
2687
|
+
"type": "string"
|
|
2688
|
+
},
|
|
2689
|
+
"title": {
|
|
2690
|
+
"type": ["string", "null"]
|
|
2691
|
+
},
|
|
2692
|
+
"path": {
|
|
2693
|
+
"type": "string"
|
|
2694
|
+
},
|
|
2695
|
+
"isMain": {
|
|
2696
|
+
"type": "boolean"
|
|
2697
|
+
},
|
|
2698
|
+
"hidden": {
|
|
2699
|
+
"type": "boolean",
|
|
2700
|
+
"description": "True when the user has hidden this worktree from the sidebar. Persists across restarts."
|
|
2701
|
+
},
|
|
2702
|
+
"createdAt": {
|
|
2703
|
+
"type": "string"
|
|
2704
|
+
}
|
|
2705
|
+
}
|
|
2706
|
+
},
|
|
2707
|
+
"OpenPort": {
|
|
2708
|
+
"title": "OpenPort",
|
|
2709
|
+
"description": "A TCP listening port owned by a process descended from a live Pragma terminal tab shell.",
|
|
2710
|
+
"type": "object",
|
|
2711
|
+
"additionalProperties": false,
|
|
2712
|
+
"required": ["port", "process", "pid", "tabId", "worktreeId"],
|
|
2713
|
+
"properties": {
|
|
2714
|
+
"port": {
|
|
2715
|
+
"type": "integer",
|
|
2716
|
+
"minimum": 1,
|
|
2717
|
+
"maximum": 65535
|
|
2718
|
+
},
|
|
2719
|
+
"process": {
|
|
2720
|
+
"type": "string"
|
|
2721
|
+
},
|
|
2722
|
+
"pid": {
|
|
2723
|
+
"type": "integer",
|
|
2724
|
+
"minimum": 1
|
|
2725
|
+
},
|
|
2726
|
+
"tabId": {
|
|
2727
|
+
"type": "string"
|
|
2728
|
+
},
|
|
2729
|
+
"worktreeId": {
|
|
2730
|
+
"type": "string"
|
|
2731
|
+
}
|
|
2732
|
+
}
|
|
2733
|
+
},
|
|
2734
|
+
"TabKind": {
|
|
2735
|
+
"title": "TabKind",
|
|
2736
|
+
"description": "Discriminates what a tab hosts: a shell terminal, an embedded browser, a file editor, a scratchpad, a whiteboard, a read-only diff, the read-only daemon log viewer, a pull-request review, or a plugin web view.",
|
|
2737
|
+
"type": "string",
|
|
2738
|
+
"enum": [
|
|
2739
|
+
"terminal",
|
|
2740
|
+
"browser",
|
|
2741
|
+
"editor",
|
|
2742
|
+
"scratchpad",
|
|
2743
|
+
"whiteboard",
|
|
2744
|
+
"diff",
|
|
2745
|
+
"log",
|
|
2746
|
+
"pr-review",
|
|
2747
|
+
"plugin-webview"
|
|
2748
|
+
]
|
|
2749
|
+
},
|
|
2750
|
+
"Scratchpads": {
|
|
2751
|
+
"title": "Scratchpads",
|
|
2752
|
+
"description": "Managed scratchpad file contract shared by the CLI, desktop host, and editor.",
|
|
2753
|
+
"type": "object",
|
|
2754
|
+
"additionalProperties": false,
|
|
2755
|
+
"required": ["directory", "extension", "frontmatterKey", "version"],
|
|
2756
|
+
"properties": {
|
|
2757
|
+
"directory": {
|
|
2758
|
+
"type": "string"
|
|
2759
|
+
},
|
|
2760
|
+
"extension": {
|
|
2761
|
+
"type": "string"
|
|
2762
|
+
},
|
|
2763
|
+
"frontmatterKey": {
|
|
2764
|
+
"type": "string"
|
|
2765
|
+
},
|
|
2766
|
+
"version": {
|
|
2767
|
+
"type": "integer",
|
|
2768
|
+
"minimum": 1
|
|
2769
|
+
}
|
|
2770
|
+
}
|
|
2771
|
+
},
|
|
2772
|
+
"ScratchpadSummary": {
|
|
2773
|
+
"title": "ScratchpadSummary",
|
|
2774
|
+
"description": "A managed scratchpad file discovered on disk, independent of whether it currently has an open tab.",
|
|
2775
|
+
"type": "object",
|
|
2776
|
+
"additionalProperties": false,
|
|
2777
|
+
"required": ["id", "title", "filePath"],
|
|
2778
|
+
"properties": {
|
|
2779
|
+
"id": {
|
|
2780
|
+
"type": "string"
|
|
2781
|
+
},
|
|
2782
|
+
"title": {
|
|
2783
|
+
"type": "string"
|
|
2784
|
+
},
|
|
2785
|
+
"filePath": {
|
|
2786
|
+
"type": "string",
|
|
2787
|
+
"description": "Worktree-relative POSIX path to the scratchpad's MDX file."
|
|
2788
|
+
}
|
|
2789
|
+
}
|
|
2790
|
+
},
|
|
2791
|
+
"ScratchpadFile": {
|
|
2792
|
+
"title": "ScratchpadFile",
|
|
2793
|
+
"description": "A managed scratchpad plus its MDX source and attached-agent metadata, as served by the host's `scratchpads` RPC to clients that render the document themselves.",
|
|
2794
|
+
"type": "object",
|
|
2795
|
+
"additionalProperties": false,
|
|
2796
|
+
"required": ["id", "title", "filePath", "contents", "agentTabId", "agentId", "createdAt"],
|
|
2797
|
+
"properties": {
|
|
2798
|
+
"id": {
|
|
2799
|
+
"type": "string"
|
|
2800
|
+
},
|
|
2801
|
+
"title": {
|
|
2802
|
+
"type": "string"
|
|
2803
|
+
},
|
|
2804
|
+
"filePath": {
|
|
2805
|
+
"type": "string",
|
|
2806
|
+
"description": "Worktree-relative POSIX path to the scratchpad's MDX file."
|
|
2807
|
+
},
|
|
2808
|
+
"contents": {
|
|
2809
|
+
"type": "string",
|
|
2810
|
+
"description": "The full MDX source, frontmatter included."
|
|
2811
|
+
},
|
|
2812
|
+
"agentTabId": {
|
|
2813
|
+
"type": ["string", "null"],
|
|
2814
|
+
"description": "Terminal tab id this scratchpad prompts, or null when nothing is attached."
|
|
2815
|
+
},
|
|
2816
|
+
"agentId": {
|
|
2817
|
+
"type": ["string", "null"],
|
|
2818
|
+
"description": "Catalog agent id of the attached tab, or null when nothing is attached."
|
|
2819
|
+
},
|
|
2820
|
+
"createdAt": {
|
|
2821
|
+
"type": "number",
|
|
2822
|
+
"description": "Epoch milliseconds the scratchpad was created, from its managed frontmatter."
|
|
2823
|
+
}
|
|
2824
|
+
}
|
|
2825
|
+
},
|
|
2826
|
+
"WhiteboardDefaults": {
|
|
2827
|
+
"title": "WhiteboardDefaults",
|
|
2828
|
+
"description": "Host persistence and validation limits for worktree-scoped whiteboards.",
|
|
2829
|
+
"type": "object",
|
|
2830
|
+
"additionalProperties": false,
|
|
2831
|
+
"required": [
|
|
2832
|
+
"databaseFile",
|
|
2833
|
+
"defaultTitle",
|
|
2834
|
+
"maxTitleChars",
|
|
2835
|
+
"maxSceneBytes",
|
|
2836
|
+
"maxRenderDimension"
|
|
2837
|
+
],
|
|
2838
|
+
"properties": {
|
|
2839
|
+
"databaseFile": {
|
|
2840
|
+
"type": "string"
|
|
2841
|
+
},
|
|
2842
|
+
"defaultTitle": {
|
|
2843
|
+
"type": "string"
|
|
2844
|
+
},
|
|
2845
|
+
"maxTitleChars": {
|
|
2846
|
+
"type": "integer",
|
|
2847
|
+
"minimum": 1
|
|
2848
|
+
},
|
|
2849
|
+
"maxSceneBytes": {
|
|
2850
|
+
"type": "integer",
|
|
2851
|
+
"minimum": 1
|
|
2852
|
+
},
|
|
2853
|
+
"maxRenderDimension": {
|
|
2854
|
+
"type": "integer",
|
|
2855
|
+
"minimum": 1
|
|
2856
|
+
}
|
|
2857
|
+
}
|
|
2858
|
+
},
|
|
2859
|
+
"ExcalidrawScene": {
|
|
2860
|
+
"title": "ExcalidrawScene",
|
|
2861
|
+
"description": "Serializable Excalidraw scene. Core fields are validated while element, app-state, and binary-file extensions remain forward compatible with Excalidraw releases.",
|
|
2862
|
+
"type": "object",
|
|
2863
|
+
"additionalProperties": false,
|
|
2864
|
+
"required": ["type", "version", "elements", "appState", "files"],
|
|
2865
|
+
"properties": {
|
|
2866
|
+
"type": {
|
|
2867
|
+
"type": "string",
|
|
2868
|
+
"enum": ["excalidraw"]
|
|
2869
|
+
},
|
|
2870
|
+
"version": {
|
|
2871
|
+
"type": "integer",
|
|
2872
|
+
"minimum": 1
|
|
2873
|
+
},
|
|
2874
|
+
"source": {
|
|
2875
|
+
"type": "string"
|
|
2876
|
+
},
|
|
2877
|
+
"elements": {
|
|
2878
|
+
"type": "array",
|
|
2879
|
+
"items": {
|
|
2880
|
+
"type": "object",
|
|
2881
|
+
"additionalProperties": true,
|
|
2882
|
+
"required": ["id", "type"],
|
|
2883
|
+
"properties": {
|
|
2884
|
+
"id": {
|
|
2885
|
+
"type": "string"
|
|
2886
|
+
},
|
|
2887
|
+
"type": {
|
|
2888
|
+
"type": "string"
|
|
2889
|
+
}
|
|
2890
|
+
}
|
|
2891
|
+
}
|
|
2892
|
+
},
|
|
2893
|
+
"appState": {
|
|
2894
|
+
"type": "object",
|
|
2895
|
+
"additionalProperties": true
|
|
2896
|
+
},
|
|
2897
|
+
"files": {
|
|
2898
|
+
"type": "object",
|
|
2899
|
+
"additionalProperties": true
|
|
2900
|
+
}
|
|
2901
|
+
}
|
|
2902
|
+
},
|
|
2903
|
+
"Whiteboard": {
|
|
2904
|
+
"title": "Whiteboard",
|
|
2905
|
+
"description": "One durable worktree-scoped Excalidraw document.",
|
|
2906
|
+
"type": "object",
|
|
2907
|
+
"additionalProperties": false,
|
|
2908
|
+
"required": ["id", "worktreeId", "title", "scene", "version", "createdAt", "updatedAt"],
|
|
2909
|
+
"properties": {
|
|
2910
|
+
"id": {
|
|
2911
|
+
"type": "string"
|
|
2912
|
+
},
|
|
2913
|
+
"worktreeId": {
|
|
2914
|
+
"type": "string"
|
|
2915
|
+
},
|
|
2916
|
+
"title": {
|
|
2917
|
+
"type": "string"
|
|
2918
|
+
},
|
|
2919
|
+
"scene": {
|
|
2920
|
+
"$ref": "#/definitions/ExcalidrawScene"
|
|
2921
|
+
},
|
|
2922
|
+
"version": {
|
|
2923
|
+
"type": "integer",
|
|
2924
|
+
"minimum": 1
|
|
2925
|
+
},
|
|
2926
|
+
"createdAt": {
|
|
2927
|
+
"type": "integer",
|
|
2928
|
+
"minimum": 0
|
|
2929
|
+
},
|
|
2930
|
+
"updatedAt": {
|
|
2931
|
+
"type": "integer",
|
|
2932
|
+
"minimum": 0
|
|
2933
|
+
}
|
|
2934
|
+
}
|
|
2935
|
+
},
|
|
2936
|
+
"WhiteboardCreateInput": {
|
|
2937
|
+
"title": "WhiteboardCreateInput",
|
|
2938
|
+
"type": "object",
|
|
2939
|
+
"additionalProperties": false,
|
|
2940
|
+
"required": ["worktreeId", "title", "scene"],
|
|
2941
|
+
"properties": {
|
|
2942
|
+
"worktreeId": {
|
|
2943
|
+
"type": "string"
|
|
2944
|
+
},
|
|
2945
|
+
"title": {
|
|
2946
|
+
"type": "string"
|
|
2947
|
+
},
|
|
2948
|
+
"scene": {
|
|
2949
|
+
"$ref": "#/definitions/ExcalidrawScene"
|
|
2950
|
+
}
|
|
2951
|
+
}
|
|
2952
|
+
},
|
|
2953
|
+
"WhiteboardEditInput": {
|
|
2954
|
+
"title": "WhiteboardEditInput",
|
|
2955
|
+
"type": "object",
|
|
2956
|
+
"additionalProperties": false,
|
|
2957
|
+
"required": ["worktreeId", "id", "title", "scene", "expectedVersion"],
|
|
2958
|
+
"properties": {
|
|
2959
|
+
"worktreeId": {
|
|
2960
|
+
"type": "string"
|
|
2961
|
+
},
|
|
2962
|
+
"id": {
|
|
2963
|
+
"type": "string"
|
|
2964
|
+
},
|
|
2965
|
+
"title": {
|
|
2966
|
+
"type": "string"
|
|
2967
|
+
},
|
|
2968
|
+
"scene": {
|
|
2969
|
+
"$ref": "#/definitions/ExcalidrawScene"
|
|
2970
|
+
},
|
|
2971
|
+
"expectedVersion": {
|
|
2972
|
+
"type": "integer",
|
|
2973
|
+
"minimum": 1
|
|
2974
|
+
}
|
|
2975
|
+
}
|
|
2976
|
+
},
|
|
2977
|
+
"WhiteboardListInput": {
|
|
2978
|
+
"title": "WhiteboardListInput",
|
|
2979
|
+
"type": "object",
|
|
2980
|
+
"additionalProperties": false,
|
|
2981
|
+
"required": ["worktreeId"],
|
|
2982
|
+
"properties": {
|
|
2983
|
+
"worktreeId": {
|
|
2984
|
+
"type": "string"
|
|
2985
|
+
},
|
|
2986
|
+
"query": {
|
|
2987
|
+
"type": "string"
|
|
2988
|
+
}
|
|
2989
|
+
}
|
|
2990
|
+
},
|
|
2991
|
+
"WhiteboardIdInput": {
|
|
2992
|
+
"title": "WhiteboardIdInput",
|
|
2993
|
+
"type": "object",
|
|
2994
|
+
"additionalProperties": false,
|
|
2995
|
+
"required": ["worktreeId", "id"],
|
|
2996
|
+
"properties": {
|
|
2997
|
+
"worktreeId": {
|
|
2998
|
+
"type": "string"
|
|
2999
|
+
},
|
|
3000
|
+
"id": {
|
|
3001
|
+
"type": "string"
|
|
3002
|
+
}
|
|
3003
|
+
}
|
|
3004
|
+
},
|
|
3005
|
+
"WhiteboardViewResult": {
|
|
3006
|
+
"title": "WhiteboardViewResult",
|
|
3007
|
+
"description": "Base64-encoded PNG rendering of one whiteboard.",
|
|
3008
|
+
"type": "object",
|
|
3009
|
+
"additionalProperties": false,
|
|
3010
|
+
"required": ["data"],
|
|
3011
|
+
"properties": {
|
|
3012
|
+
"data": {
|
|
3013
|
+
"type": "string"
|
|
3014
|
+
}
|
|
3015
|
+
}
|
|
3016
|
+
},
|
|
3017
|
+
"AgentStatus": {
|
|
3018
|
+
"title": "AgentStatus",
|
|
3019
|
+
"description": "Runtime status an external agent reports for a terminal tab. `cleared` is a transient signal that removes the agent's indicator entirely (used when the agent process exits), as opposed to `done`, which leaves a green \"finished, go look\" dot.",
|
|
3020
|
+
"type": "string",
|
|
3021
|
+
"enum": ["running", "attention", "done", "cleared"]
|
|
3022
|
+
},
|
|
3023
|
+
"AgentReportKind": {
|
|
3024
|
+
"title": "AgentReportKind",
|
|
3025
|
+
"description": "CLI report command names; each maps to an AgentStatus, except `session-name`, which renames the session without changing status.",
|
|
3026
|
+
"type": "string",
|
|
3027
|
+
"enum": ["started", "stopped", "attention", "cleared", "session-name"]
|
|
3028
|
+
},
|
|
3029
|
+
"AgentAttentionKind": {
|
|
3030
|
+
"title": "AgentAttentionKind",
|
|
3031
|
+
"description": "Reason an agent needs the user's attention.",
|
|
3032
|
+
"type": "string",
|
|
3033
|
+
"enum": ["question", "command"]
|
|
3034
|
+
},
|
|
3035
|
+
"AgentMessageKind": {
|
|
3036
|
+
"title": "AgentMessageKind",
|
|
3037
|
+
"description": "Agent event stream message frame kind.",
|
|
3038
|
+
"type": "string",
|
|
3039
|
+
"enum": ["message"]
|
|
3040
|
+
},
|
|
3041
|
+
"AgentMessageRole": {
|
|
3042
|
+
"title": "AgentMessageRole",
|
|
3043
|
+
"description": "Role/source for one rich agent message entry.",
|
|
3044
|
+
"type": "string",
|
|
3045
|
+
"enum": ["assistant", "tool", "user", "system"]
|
|
3046
|
+
},
|
|
3047
|
+
"AgentToolCallStatus": {
|
|
3048
|
+
"title": "AgentToolCallStatus",
|
|
3049
|
+
"description": "Lifecycle status for a tool call reported inside an AgentMessage.",
|
|
3050
|
+
"type": "string",
|
|
3051
|
+
"enum": ["running", "done", "error"]
|
|
3052
|
+
},
|
|
3053
|
+
"AgentFileChangeKind": {
|
|
3054
|
+
"title": "AgentFileChangeKind",
|
|
3055
|
+
"description": "File interaction kind reported inside an AgentMessage.",
|
|
3056
|
+
"type": "string",
|
|
3057
|
+
"enum": ["read", "edited", "created", "deleted"]
|
|
3058
|
+
},
|
|
3059
|
+
"AgentToolCall": {
|
|
3060
|
+
"title": "AgentToolCall",
|
|
3061
|
+
"description": "One tool call surfaced by an agent message.",
|
|
3062
|
+
"type": "object",
|
|
3063
|
+
"additionalProperties": false,
|
|
3064
|
+
"required": ["id", "name", "status"],
|
|
3065
|
+
"properties": {
|
|
3066
|
+
"id": {
|
|
3067
|
+
"type": "string"
|
|
3068
|
+
},
|
|
3069
|
+
"name": {
|
|
3070
|
+
"type": "string"
|
|
3071
|
+
},
|
|
3072
|
+
"status": {
|
|
3073
|
+
"$ref": "#/definitions/AgentToolCallStatus"
|
|
3074
|
+
},
|
|
3075
|
+
"summary": {
|
|
3076
|
+
"type": "string"
|
|
3077
|
+
}
|
|
3078
|
+
}
|
|
3079
|
+
},
|
|
3080
|
+
"AgentFileChange": {
|
|
3081
|
+
"title": "AgentFileChange",
|
|
3082
|
+
"description": "A path touched by an agent, without file contents.",
|
|
3083
|
+
"type": "object",
|
|
3084
|
+
"additionalProperties": false,
|
|
3085
|
+
"required": ["path", "change"],
|
|
3086
|
+
"properties": {
|
|
3087
|
+
"path": {
|
|
3088
|
+
"type": "string"
|
|
3089
|
+
},
|
|
3090
|
+
"change": {
|
|
3091
|
+
"$ref": "#/definitions/AgentFileChangeKind"
|
|
3092
|
+
}
|
|
3093
|
+
}
|
|
3094
|
+
},
|
|
3095
|
+
"AgentMessage": {
|
|
3096
|
+
"title": "AgentMessage",
|
|
3097
|
+
"description": "Append-only rich message entry reported by an agent. Consumers upsert by id when tool-call state changes.",
|
|
3098
|
+
"type": "object",
|
|
3099
|
+
"additionalProperties": false,
|
|
3100
|
+
"required": ["agent", "worktreeId", "tabId", "id", "role", "subAgentsActive", "ts"],
|
|
3101
|
+
"properties": {
|
|
3102
|
+
"agent": {
|
|
3103
|
+
"type": "string"
|
|
3104
|
+
},
|
|
3105
|
+
"worktreeId": {
|
|
3106
|
+
"type": "string"
|
|
3107
|
+
},
|
|
3108
|
+
"tabId": {
|
|
3109
|
+
"type": "string"
|
|
3110
|
+
},
|
|
3111
|
+
"id": {
|
|
3112
|
+
"type": "string"
|
|
3113
|
+
},
|
|
3114
|
+
"role": {
|
|
3115
|
+
"$ref": "#/definitions/AgentMessageRole"
|
|
3116
|
+
},
|
|
3117
|
+
"text": {
|
|
3118
|
+
"type": "string"
|
|
3119
|
+
},
|
|
3120
|
+
"toolCalls": {
|
|
3121
|
+
"type": "array",
|
|
3122
|
+
"items": {
|
|
3123
|
+
"$ref": "#/definitions/AgentToolCall"
|
|
3124
|
+
}
|
|
3125
|
+
},
|
|
3126
|
+
"files": {
|
|
3127
|
+
"type": "array",
|
|
3128
|
+
"items": {
|
|
3129
|
+
"$ref": "#/definitions/AgentFileChange"
|
|
3130
|
+
}
|
|
3131
|
+
},
|
|
3132
|
+
"subAgentsActive": {
|
|
3133
|
+
"type": "integer",
|
|
3134
|
+
"minimum": 0,
|
|
3135
|
+
"description": "Count of active sub-agents visible to the reporting plugin; no nested transcript is carried."
|
|
3136
|
+
},
|
|
3137
|
+
"ts": {
|
|
3138
|
+
"type": "integer",
|
|
3139
|
+
"minimum": 0,
|
|
3140
|
+
"description": "Emitter timestamp in milliseconds since Unix epoch."
|
|
3141
|
+
}
|
|
3142
|
+
}
|
|
3143
|
+
},
|
|
3144
|
+
"AgentReportPayload": {
|
|
3145
|
+
"title": "AgentReportPayload",
|
|
3146
|
+
"description": "Status report sent by pragma-cli through pragma-server to native clients.",
|
|
3147
|
+
"type": "object",
|
|
3148
|
+
"additionalProperties": false,
|
|
3149
|
+
"required": ["agent", "worktreeId", "tabId", "status"],
|
|
3150
|
+
"properties": {
|
|
3151
|
+
"agent": {
|
|
3152
|
+
"type": "string"
|
|
3153
|
+
},
|
|
3154
|
+
"worktreeId": {
|
|
3155
|
+
"type": "string"
|
|
3156
|
+
},
|
|
3157
|
+
"tabId": {
|
|
3158
|
+
"type": "string"
|
|
3159
|
+
},
|
|
3160
|
+
"status": {
|
|
3161
|
+
"anyOf": [
|
|
3162
|
+
{
|
|
3163
|
+
"$ref": "#/definitions/AgentStatus"
|
|
3164
|
+
},
|
|
3165
|
+
{
|
|
3166
|
+
"type": "null"
|
|
3167
|
+
}
|
|
3168
|
+
],
|
|
3169
|
+
"description": "New agent status, or null for a status-less report (e.g. a `session-name` rename) that must leave the stored status untouched."
|
|
3170
|
+
},
|
|
3171
|
+
"sessionName": {
|
|
3172
|
+
"type": "string",
|
|
3173
|
+
"description": "Human-readable name of the agent's active session. Reported on session create/rename/switch; the client renames the hosting tab unless the user renamed it manually."
|
|
3174
|
+
},
|
|
3175
|
+
"attentionKind": {
|
|
3176
|
+
"anyOf": [
|
|
3177
|
+
{
|
|
3178
|
+
"$ref": "#/definitions/AgentAttentionKind"
|
|
3179
|
+
},
|
|
3180
|
+
{
|
|
3181
|
+
"type": "null"
|
|
3182
|
+
}
|
|
3183
|
+
]
|
|
3184
|
+
},
|
|
3185
|
+
"command": {
|
|
3186
|
+
"type": "string",
|
|
3187
|
+
"description": "The command (or tool invocation) the agent is asking permission to run. Set when attentionKind is `command` so a non-terminal client can show it and approve remotely."
|
|
3188
|
+
},
|
|
3189
|
+
"question": {
|
|
3190
|
+
"type": "string",
|
|
3191
|
+
"description": "The question the agent is asking. Set when attentionKind is `question` so a non-terminal client can show it and answer remotely."
|
|
3192
|
+
},
|
|
3193
|
+
"options": {
|
|
3194
|
+
"type": "array",
|
|
3195
|
+
"items": {
|
|
3196
|
+
"$ref": "#/definitions/QuestionOption"
|
|
3197
|
+
},
|
|
3198
|
+
"description": "Answer choices for a `question` attention. Empty/omitted when the question is free-text only or when attentionKind is `command`."
|
|
3199
|
+
},
|
|
3200
|
+
"questions": {
|
|
3201
|
+
"type": "array",
|
|
3202
|
+
"items": {
|
|
3203
|
+
"$ref": "#/definitions/AgentQuestion"
|
|
3204
|
+
},
|
|
3205
|
+
"description": "Multiple questions for a `question` attention. When present, clients render a back/next question wizard and submit every answer together; the legacy `question`/`options` fields are still used for a single question."
|
|
3206
|
+
},
|
|
3207
|
+
"requestId": {
|
|
3208
|
+
"type": "string",
|
|
3209
|
+
"description": "Correlation id for a command-approval or question round-trip. The reporter sets it on a `command`/`question` attention report and waits for a matching AgentDecision/AgentAnswer before proceeding."
|
|
3210
|
+
}
|
|
3211
|
+
}
|
|
3212
|
+
},
|
|
3213
|
+
"AgentQuestion": {
|
|
3214
|
+
"title": "AgentQuestion",
|
|
3215
|
+
"description": "One question in a multi-question attention request. Each entry carries its own prompt and optional answer choices.",
|
|
3216
|
+
"type": "object",
|
|
3217
|
+
"additionalProperties": false,
|
|
3218
|
+
"required": ["question"],
|
|
3219
|
+
"properties": {
|
|
3220
|
+
"question": {
|
|
3221
|
+
"type": "string",
|
|
3222
|
+
"description": "The question the agent is asking."
|
|
3223
|
+
},
|
|
3224
|
+
"options": {
|
|
3225
|
+
"type": "array",
|
|
3226
|
+
"items": {
|
|
3227
|
+
"$ref": "#/definitions/QuestionOption"
|
|
3228
|
+
},
|
|
3229
|
+
"description": "Answer choices for this question. Empty/omitted when the question is free-text only."
|
|
3230
|
+
}
|
|
3231
|
+
}
|
|
3232
|
+
},
|
|
3233
|
+
"QuestionOption": {
|
|
3234
|
+
"title": "QuestionOption",
|
|
3235
|
+
"description": "A selectable answer to an agent question.",
|
|
3236
|
+
"type": "object",
|
|
3237
|
+
"additionalProperties": false,
|
|
3238
|
+
"required": ["label"],
|
|
3239
|
+
"properties": {
|
|
3240
|
+
"label": {
|
|
3241
|
+
"type": "string",
|
|
3242
|
+
"description": "Answer text sent back to the agent when selected."
|
|
3243
|
+
},
|
|
3244
|
+
"description": {
|
|
3245
|
+
"type": "string",
|
|
3246
|
+
"description": "Optional explanation shown beneath the answer label."
|
|
3247
|
+
}
|
|
3248
|
+
}
|
|
3249
|
+
},
|
|
3250
|
+
"AgentDecision": {
|
|
3251
|
+
"title": "AgentDecision",
|
|
3252
|
+
"description": "Approve/deny verdict for a command-approval request, published by the controlling client and fanned out to agent subscribers. The waiting reporter (a blocking harness hook or a plugin watcher) matches it by requestId.",
|
|
3253
|
+
"type": "object",
|
|
3254
|
+
"additionalProperties": false,
|
|
3255
|
+
"required": ["agent", "worktreeId", "tabId", "requestId", "approved"],
|
|
3256
|
+
"properties": {
|
|
3257
|
+
"agent": {
|
|
3258
|
+
"type": "string"
|
|
3259
|
+
},
|
|
3260
|
+
"worktreeId": {
|
|
3261
|
+
"type": "string"
|
|
3262
|
+
},
|
|
3263
|
+
"tabId": {
|
|
3264
|
+
"type": "string"
|
|
3265
|
+
},
|
|
3266
|
+
"requestId": {
|
|
3267
|
+
"type": "string"
|
|
3268
|
+
},
|
|
3269
|
+
"approved": {
|
|
3270
|
+
"type": "boolean",
|
|
3271
|
+
"description": "true to run the command, false to reject it."
|
|
3272
|
+
}
|
|
3273
|
+
}
|
|
3274
|
+
},
|
|
3275
|
+
"AgentAnswer": {
|
|
3276
|
+
"title": "AgentAnswer",
|
|
3277
|
+
"description": "Reply to a `question` attention request, published by the controlling client and fanned out to agent subscribers. The waiting reporter (a blocking harness hook or a plugin watcher) matches it by requestId.",
|
|
3278
|
+
"type": "object",
|
|
3279
|
+
"additionalProperties": false,
|
|
3280
|
+
"required": ["agent", "worktreeId", "tabId", "requestId", "dismissed"],
|
|
3281
|
+
"properties": {
|
|
3282
|
+
"agent": {
|
|
3283
|
+
"type": "string"
|
|
3284
|
+
},
|
|
3285
|
+
"worktreeId": {
|
|
3286
|
+
"type": "string"
|
|
3287
|
+
},
|
|
3288
|
+
"tabId": {
|
|
3289
|
+
"type": "string"
|
|
3290
|
+
},
|
|
3291
|
+
"requestId": {
|
|
3292
|
+
"type": "string"
|
|
3293
|
+
},
|
|
3294
|
+
"answer": {
|
|
3295
|
+
"type": "string",
|
|
3296
|
+
"description": "The reply text. Present when the question was answered; omitted when dismissed."
|
|
3297
|
+
},
|
|
3298
|
+
"dismissed": {
|
|
3299
|
+
"type": "boolean",
|
|
3300
|
+
"description": "true when the question was dismissed without an answer."
|
|
3301
|
+
}
|
|
3302
|
+
}
|
|
3303
|
+
},
|
|
3304
|
+
"AgentInput": {
|
|
3305
|
+
"title": "AgentInput",
|
|
3306
|
+
"description": "Free-form input (an interjection) sent by the controlling client to a running agent and fanned out to agent subscribers. A blocking harness hook or a plugin watcher delivers `text` into the agent's turn (via a harness input API, or by writing it to the tab's PTY). Unlike AgentDecision/AgentAnswer this is not tied to an outstanding request; `requestId` is optional and only set when the interjection answers a specific prompt.",
|
|
3307
|
+
"type": "object",
|
|
3308
|
+
"additionalProperties": false,
|
|
3309
|
+
"required": ["agent", "worktreeId", "tabId", "text"],
|
|
3310
|
+
"properties": {
|
|
3311
|
+
"agent": {
|
|
3312
|
+
"type": "string"
|
|
3313
|
+
},
|
|
3314
|
+
"worktreeId": {
|
|
3315
|
+
"type": "string"
|
|
3316
|
+
},
|
|
3317
|
+
"tabId": {
|
|
3318
|
+
"type": "string"
|
|
3319
|
+
},
|
|
3320
|
+
"text": {
|
|
3321
|
+
"type": "string",
|
|
3322
|
+
"description": "The message text to deliver to the running agent."
|
|
3323
|
+
},
|
|
3324
|
+
"requestId": {
|
|
3325
|
+
"type": "string",
|
|
3326
|
+
"description": "Optional correlation id when the interjection answers a specific outstanding prompt."
|
|
3327
|
+
}
|
|
3328
|
+
}
|
|
3329
|
+
},
|
|
3330
|
+
"AgentInterrupt": {
|
|
3331
|
+
"title": "AgentInterrupt",
|
|
3332
|
+
"description": "Transient request to interrupt a running agent's current turn, published by the controlling client and fanned out to agent subscribers. Delivery is best-effort with no replay buffer: a watcher subscribed to the matching tab sends an interrupt (ESC) to the agent's PTY. Unlike AgentDecision/AgentAnswer it is not required to carry a requestId.",
|
|
3333
|
+
"type": "object",
|
|
3334
|
+
"additionalProperties": false,
|
|
3335
|
+
"required": ["agent", "worktreeId", "tabId"],
|
|
3336
|
+
"properties": {
|
|
3337
|
+
"agent": {
|
|
3338
|
+
"type": "string"
|
|
3339
|
+
},
|
|
3340
|
+
"worktreeId": {
|
|
3341
|
+
"type": "string"
|
|
3342
|
+
},
|
|
3343
|
+
"tabId": {
|
|
3344
|
+
"type": "string"
|
|
3345
|
+
},
|
|
3346
|
+
"requestId": {
|
|
3347
|
+
"type": "string",
|
|
3348
|
+
"description": "Optional correlation id when the interrupt targets a specific outstanding request."
|
|
3349
|
+
}
|
|
3350
|
+
}
|
|
3351
|
+
},
|
|
3352
|
+
"WorkspaceSnapshot": {
|
|
3353
|
+
"title": "WorkspaceSnapshot",
|
|
3354
|
+
"description": "Mirror of the desktop app's entire workspace state (all projects, worktrees, and tabs), published to pragma-server so remote clients (e.g. a paired phone) can render the session launcher without registering as the controller. The desktop publishes the full snapshot on every mutation; v1 keeps deltas trivial (every delta is a full replacement).",
|
|
3355
|
+
"type": "object",
|
|
3356
|
+
"additionalProperties": false,
|
|
3357
|
+
"required": ["projects", "worktrees", "tabs"],
|
|
3358
|
+
"properties": {
|
|
3359
|
+
"projects": {
|
|
3360
|
+
"type": "array",
|
|
3361
|
+
"items": {
|
|
3362
|
+
"$ref": "#/definitions/Project"
|
|
3363
|
+
}
|
|
3364
|
+
},
|
|
3365
|
+
"worktrees": {
|
|
3366
|
+
"type": "array",
|
|
3367
|
+
"items": {
|
|
3368
|
+
"$ref": "#/definitions/Worktree"
|
|
3369
|
+
}
|
|
3370
|
+
},
|
|
3371
|
+
"tabs": {
|
|
3372
|
+
"type": "array",
|
|
3373
|
+
"items": {
|
|
3374
|
+
"$ref": "#/definitions/Tab"
|
|
3375
|
+
}
|
|
3376
|
+
}
|
|
3377
|
+
}
|
|
3378
|
+
},
|
|
3379
|
+
"AgentSessionLaunchPayload": {
|
|
3380
|
+
"title": "AgentSessionLaunchPayload",
|
|
3381
|
+
"description": "Payload for the brokered `agentSessionLaunch` control method. The desktop creates or resolves the target worktree + tab, replies with `{ worktreeId, tabId }` immediately, then asynchronously spawns the agent + watcher through the proven Kanban background-launch sequence. Either an existing `worktreeId` or a `newWorktree` spec must be provided.",
|
|
3382
|
+
"type": "object",
|
|
3383
|
+
"additionalProperties": false,
|
|
3384
|
+
"required": ["projectId", "agentId", "worktreeId", "newWorktree"],
|
|
3385
|
+
"properties": {
|
|
3386
|
+
"projectId": {
|
|
3387
|
+
"type": "string"
|
|
3388
|
+
},
|
|
3389
|
+
"worktreeId": {
|
|
3390
|
+
"type": ["string", "null"],
|
|
3391
|
+
"description": "Id of an existing worktree to launch into. Mutually exclusive with `newWorktree`."
|
|
3392
|
+
},
|
|
3393
|
+
"newWorktree": {
|
|
3394
|
+
"description": "Describes a fresh worktree to create when `worktreeId` is absent. Mutually exclusive with `worktreeId`.",
|
|
3395
|
+
"anyOf": [
|
|
3396
|
+
{
|
|
3397
|
+
"$ref": "#/definitions/NewWorktreeSpec"
|
|
3398
|
+
},
|
|
3399
|
+
{
|
|
3400
|
+
"type": "null"
|
|
3401
|
+
}
|
|
3402
|
+
]
|
|
3403
|
+
},
|
|
3404
|
+
"agentId": {
|
|
3405
|
+
"type": "string"
|
|
3406
|
+
},
|
|
3407
|
+
"modelId": {
|
|
3408
|
+
"type": ["string", "null"]
|
|
3409
|
+
},
|
|
3410
|
+
"reasoningId": {
|
|
3411
|
+
"type": ["string", "null"]
|
|
3412
|
+
},
|
|
3413
|
+
"modelCmd": {
|
|
3414
|
+
"type": ["string", "null"],
|
|
3415
|
+
"description": "Raw shell snippet appended to the agent's base launch command instead of catalog model/reasoning args (for example `--model moonshot/kimi-k3`). Overrides `modelId`/`reasoningId` when set."
|
|
3416
|
+
},
|
|
3417
|
+
"prompt": {
|
|
3418
|
+
"type": ["string", "null"]
|
|
3419
|
+
},
|
|
3420
|
+
"headless": {
|
|
3421
|
+
"type": ["boolean", "null"],
|
|
3422
|
+
"description": "When true, the host server launches the session itself (PTY + watcher, no desktop tab) even while a desktop controller is connected. Used by `pragma-cli agent verify` so scenario sessions do not open a desktop tab per step."
|
|
3423
|
+
}
|
|
3424
|
+
}
|
|
3425
|
+
},
|
|
3426
|
+
"NewWorktreeSpec": {
|
|
3427
|
+
"title": "NewWorktreeSpec",
|
|
3428
|
+
"description": "Spec for creating a fresh worktree as part of an `agentSessionLaunch` request. Omitted/optional fields fall back to Pragma defaults.",
|
|
3429
|
+
"type": "object",
|
|
3430
|
+
"additionalProperties": false,
|
|
3431
|
+
"required": ["parentWorktreeId", "branch"],
|
|
3432
|
+
"properties": {
|
|
3433
|
+
"parentWorktreeId": {
|
|
3434
|
+
"type": "string"
|
|
3435
|
+
},
|
|
3436
|
+
"branch": {
|
|
3437
|
+
"type": "string"
|
|
3438
|
+
},
|
|
3439
|
+
"title": {
|
|
3440
|
+
"type": ["string", "null"]
|
|
3441
|
+
}
|
|
3442
|
+
}
|
|
3443
|
+
},
|
|
3444
|
+
"Tab": {
|
|
3445
|
+
"title": "Tab",
|
|
3446
|
+
"type": "object",
|
|
3447
|
+
"additionalProperties": false,
|
|
3448
|
+
"required": [
|
|
3449
|
+
"id",
|
|
3450
|
+
"projectId",
|
|
3451
|
+
"worktreeId",
|
|
3452
|
+
"kind",
|
|
3453
|
+
"title",
|
|
3454
|
+
"url",
|
|
3455
|
+
"filePath",
|
|
3456
|
+
"whiteboardId",
|
|
3457
|
+
"diffSide",
|
|
3458
|
+
"diffCommit",
|
|
3459
|
+
"prNumber",
|
|
3460
|
+
"pluginId",
|
|
3461
|
+
"pluginViewId",
|
|
3462
|
+
"pluginPayload",
|
|
3463
|
+
"pluginDedupeKey",
|
|
3464
|
+
"agentId",
|
|
3465
|
+
"userRenamed",
|
|
3466
|
+
"orderIndex",
|
|
3467
|
+
"createdAt"
|
|
3468
|
+
],
|
|
3469
|
+
"properties": {
|
|
3470
|
+
"id": {
|
|
3471
|
+
"type": "string"
|
|
3472
|
+
},
|
|
3473
|
+
"projectId": {
|
|
3474
|
+
"type": "string"
|
|
3475
|
+
},
|
|
3476
|
+
"worktreeId": {
|
|
3477
|
+
"type": "string"
|
|
3478
|
+
},
|
|
3479
|
+
"kind": {
|
|
3480
|
+
"$ref": "#/definitions/TabKind"
|
|
3481
|
+
},
|
|
3482
|
+
"title": {
|
|
3483
|
+
"type": ["string", "null"]
|
|
3484
|
+
},
|
|
3485
|
+
"url": {
|
|
3486
|
+
"type": ["string", "null"],
|
|
3487
|
+
"description": "The current page URL for browser tabs; null for terminal tabs."
|
|
3488
|
+
},
|
|
3489
|
+
"filePath": {
|
|
3490
|
+
"type": ["string", "null"],
|
|
3491
|
+
"description": "Worktree-relative path for editor/diff tabs; null for terminal/browser tabs."
|
|
3492
|
+
},
|
|
3493
|
+
"whiteboardId": {
|
|
3494
|
+
"type": ["string", "null"],
|
|
3495
|
+
"description": "Durable whiteboard id for whiteboard tabs; null for every other tab kind."
|
|
3496
|
+
},
|
|
3497
|
+
"diffSide": {
|
|
3498
|
+
"description": "Which diff side a diff tab shows; null for non-diff tabs.",
|
|
3499
|
+
"anyOf": [
|
|
3500
|
+
{
|
|
3501
|
+
"$ref": "#/definitions/DiffSide"
|
|
3502
|
+
},
|
|
3503
|
+
{
|
|
3504
|
+
"type": "null"
|
|
3505
|
+
}
|
|
3506
|
+
]
|
|
3507
|
+
},
|
|
3508
|
+
"diffCommit": {
|
|
3509
|
+
"type": ["string", "null"],
|
|
3510
|
+
"description": "Commit hash a commit-scoped diff tab shows (first parent \u2192 commit); null for range diffs and non-diff tabs."
|
|
3511
|
+
},
|
|
3512
|
+
"prNumber": {
|
|
3513
|
+
"type": ["integer", "null"],
|
|
3514
|
+
"description": "Pull-request number a pr-review tab reviews; null for non-PR tabs."
|
|
3515
|
+
},
|
|
3516
|
+
"pluginId": {
|
|
3517
|
+
"type": ["string", "null"],
|
|
3518
|
+
"description": "Owning plugin id for plugin-webview tabs; null for non-plugin tabs."
|
|
3519
|
+
},
|
|
3520
|
+
"pluginViewId": {
|
|
3521
|
+
"type": ["string", "null"],
|
|
3522
|
+
"description": "Plugin-defined web view id for plugin-webview tabs; null for non-plugin tabs."
|
|
3523
|
+
},
|
|
3524
|
+
"pluginPayload": {
|
|
3525
|
+
"type": ["string", "null"],
|
|
3526
|
+
"description": "JSON-encoded payload supplied when opening a plugin-webview tab; null when omitted or for non-plugin tabs."
|
|
3527
|
+
},
|
|
3528
|
+
"pluginDedupeKey": {
|
|
3529
|
+
"type": ["string", "null"],
|
|
3530
|
+
"description": "Optional dedupe key used to focus an existing plugin-webview tab instead of opening another."
|
|
3531
|
+
},
|
|
3532
|
+
"agentId": {
|
|
3533
|
+
"type": ["string", "null"],
|
|
3534
|
+
"description": "Catalog id of the agent launched into this terminal tab, set at launch time. Drives the tab's agent icon and default title; null for tabs without an agent."
|
|
3535
|
+
},
|
|
3536
|
+
"userRenamed": {
|
|
3537
|
+
"type": "boolean",
|
|
3538
|
+
"description": "True once the user has manually renamed a terminal tab via double-click/context menu. Shell-emitted title updates (OSC 0/2) and agent session-name renames are ignored while this is true. Always false for non-terminal tabs."
|
|
3539
|
+
},
|
|
3540
|
+
"fanoutId": {
|
|
3541
|
+
"type": ["string", "null"],
|
|
3542
|
+
"description": "Fanout this terminal tab is an attempt of. Optional rather than nullable: absent on every tab that is not a fanout attempt."
|
|
3543
|
+
},
|
|
3544
|
+
"fanoutMemberId": {
|
|
3545
|
+
"type": ["string", "null"],
|
|
3546
|
+
"description": "Fanout member this terminal tab runs. Always set together with `fanoutId`."
|
|
3547
|
+
},
|
|
3548
|
+
"shell": {
|
|
3549
|
+
"description": "Shell profile this terminal tab was opened with, so a session respawned after a daemon restart returns to the same shell instead of the current default. Optional rather than nullable: absent on every tab created before shell selection existed, and on non-terminal tabs.",
|
|
3550
|
+
"anyOf": [
|
|
3551
|
+
{
|
|
3552
|
+
"$ref": "#/definitions/ShellProfile"
|
|
3553
|
+
},
|
|
3554
|
+
{
|
|
3555
|
+
"type": "null"
|
|
3556
|
+
}
|
|
3557
|
+
]
|
|
3558
|
+
},
|
|
3559
|
+
"orderIndex": {
|
|
3560
|
+
"type": "integer"
|
|
3561
|
+
},
|
|
3562
|
+
"createdAt": {
|
|
3563
|
+
"type": "string"
|
|
3564
|
+
}
|
|
3565
|
+
}
|
|
3566
|
+
},
|
|
3567
|
+
"DirEntry": {
|
|
3568
|
+
"title": "DirEntry",
|
|
3569
|
+
"description": "A single entry in a worktree directory listing.",
|
|
3570
|
+
"type": "object",
|
|
3571
|
+
"additionalProperties": false,
|
|
3572
|
+
"required": ["name", "path", "isDir"],
|
|
3573
|
+
"properties": {
|
|
3574
|
+
"name": {
|
|
3575
|
+
"type": "string",
|
|
3576
|
+
"description": "The entry's file name (no directory part)."
|
|
3577
|
+
},
|
|
3578
|
+
"path": {
|
|
3579
|
+
"type": "string",
|
|
3580
|
+
"description": "Worktree-relative POSIX path (forward slashes) to the entry."
|
|
3581
|
+
},
|
|
3582
|
+
"isDir": {
|
|
3583
|
+
"type": "boolean"
|
|
3584
|
+
}
|
|
3585
|
+
}
|
|
3586
|
+
},
|
|
3587
|
+
"DiffSide": {
|
|
3588
|
+
"title": "DiffSide",
|
|
3589
|
+
"description": "Which axis of change a diff/listing record refers to. committed (base branch \u2192 HEAD), staged (HEAD \u2192 index), and unstaged (index \u2192 working tree) are the three listing axes. worktree (base branch \u2192 working tree) is the unified review side every Changes-sidebar click opens \u2014 it compares the file's current on-disk content against what used to be on the worktree at its fork point, regardless of which list the file appears in.",
|
|
3590
|
+
"type": "string",
|
|
3591
|
+
"enum": ["committed", "staged", "unstaged", "worktree"]
|
|
3592
|
+
},
|
|
3593
|
+
"ChangeStatus": {
|
|
3594
|
+
"title": "ChangeStatus",
|
|
3595
|
+
"description": "How a file changed relative to the diff base.",
|
|
3596
|
+
"type": "string",
|
|
3597
|
+
"enum": ["added", "modified", "deleted", "renamed", "untracked"]
|
|
3598
|
+
},
|
|
3599
|
+
"ChangedFile": {
|
|
3600
|
+
"title": "ChangedFile",
|
|
3601
|
+
"type": "object",
|
|
3602
|
+
"additionalProperties": false,
|
|
3603
|
+
"required": ["path", "oldPath", "status", "side", "additions", "deletions"],
|
|
3604
|
+
"properties": {
|
|
3605
|
+
"path": {
|
|
3606
|
+
"type": "string",
|
|
3607
|
+
"description": "Worktree-relative POSIX path of the changed file."
|
|
3608
|
+
},
|
|
3609
|
+
"oldPath": {
|
|
3610
|
+
"type": ["string", "null"],
|
|
3611
|
+
"description": "Previous path for a rename; null otherwise."
|
|
3612
|
+
},
|
|
3613
|
+
"status": {
|
|
3614
|
+
"$ref": "#/definitions/ChangeStatus"
|
|
3615
|
+
},
|
|
3616
|
+
"side": {
|
|
3617
|
+
"$ref": "#/definitions/DiffSide"
|
|
3618
|
+
},
|
|
3619
|
+
"additions": {
|
|
3620
|
+
"type": ["integer", "null"],
|
|
3621
|
+
"minimum": 0,
|
|
3622
|
+
"description": "Lines added in this file's diff on its side. Null for binary files (git reports -/-) and for untracked files whose on-disk line count could not be determined."
|
|
3623
|
+
},
|
|
3624
|
+
"deletions": {
|
|
3625
|
+
"type": ["integer", "null"],
|
|
3626
|
+
"minimum": 0,
|
|
3627
|
+
"description": "Lines removed in this file's diff on its side. Null for binary files and for untracked files. 0 for untracked files (a brand-new file has nothing to remove)."
|
|
3628
|
+
}
|
|
3629
|
+
}
|
|
3630
|
+
},
|
|
3631
|
+
"WorktreeChanges": {
|
|
3632
|
+
"title": "WorktreeChanges",
|
|
3633
|
+
"type": "object",
|
|
3634
|
+
"additionalProperties": false,
|
|
3635
|
+
"required": ["committed", "staged", "unstaged"],
|
|
3636
|
+
"properties": {
|
|
3637
|
+
"committed": {
|
|
3638
|
+
"type": "array",
|
|
3639
|
+
"items": {
|
|
3640
|
+
"$ref": "#/definitions/ChangedFile"
|
|
3641
|
+
}
|
|
3642
|
+
},
|
|
3643
|
+
"staged": {
|
|
3644
|
+
"type": "array",
|
|
3645
|
+
"items": {
|
|
3646
|
+
"$ref": "#/definitions/ChangedFile"
|
|
3647
|
+
}
|
|
3648
|
+
},
|
|
3649
|
+
"unstaged": {
|
|
3650
|
+
"type": "array",
|
|
3651
|
+
"items": {
|
|
3652
|
+
"$ref": "#/definitions/ChangedFile"
|
|
3653
|
+
}
|
|
3654
|
+
}
|
|
3655
|
+
}
|
|
3656
|
+
},
|
|
3657
|
+
"WorktreeCommit": {
|
|
3658
|
+
"title": "WorktreeCommit",
|
|
3659
|
+
"description": "One commit on a worktree's branch since its fork point with the parent branch, with the files it changed.",
|
|
3660
|
+
"type": "object",
|
|
3661
|
+
"additionalProperties": false,
|
|
3662
|
+
"required": ["hash", "shortHash", "subject", "authors", "files"],
|
|
3663
|
+
"properties": {
|
|
3664
|
+
"hash": {
|
|
3665
|
+
"type": "string",
|
|
3666
|
+
"description": "The full commit hash."
|
|
3667
|
+
},
|
|
3668
|
+
"shortHash": {
|
|
3669
|
+
"type": "string",
|
|
3670
|
+
"description": "The abbreviated commit hash."
|
|
3671
|
+
},
|
|
3672
|
+
"subject": {
|
|
3673
|
+
"type": "string",
|
|
3674
|
+
"description": "The commit subject (first message line)."
|
|
3675
|
+
},
|
|
3676
|
+
"authors": {
|
|
3677
|
+
"type": "array",
|
|
3678
|
+
"description": "The author name followed by any Co-authored-by trailer names, deduplicated.",
|
|
3679
|
+
"items": {
|
|
3680
|
+
"type": "string"
|
|
3681
|
+
}
|
|
3682
|
+
},
|
|
3683
|
+
"files": {
|
|
3684
|
+
"type": "array",
|
|
3685
|
+
"description": "Files this commit changed relative to its first parent.",
|
|
3686
|
+
"items": {
|
|
3687
|
+
"$ref": "#/definitions/ChangedFile"
|
|
3688
|
+
}
|
|
3689
|
+
}
|
|
3690
|
+
}
|
|
3691
|
+
},
|
|
3692
|
+
"WorktreeCommitList": {
|
|
3693
|
+
"title": "WorktreeCommitList",
|
|
3694
|
+
"description": "A page of a worktree's commits since its fork point, newest first.",
|
|
3695
|
+
"type": "object",
|
|
3696
|
+
"additionalProperties": false,
|
|
3697
|
+
"required": ["commits", "totalCount"],
|
|
3698
|
+
"properties": {
|
|
3699
|
+
"commits": {
|
|
3700
|
+
"type": "array",
|
|
3701
|
+
"items": {
|
|
3702
|
+
"$ref": "#/definitions/WorktreeCommit"
|
|
3703
|
+
}
|
|
3704
|
+
},
|
|
3705
|
+
"totalCount": {
|
|
3706
|
+
"type": "integer",
|
|
3707
|
+
"minimum": 0,
|
|
3708
|
+
"description": "Total commits in the fork-point range, independent of the requested page size."
|
|
3709
|
+
}
|
|
3710
|
+
}
|
|
3711
|
+
},
|
|
3712
|
+
"FileDiff": {
|
|
3713
|
+
"title": "FileDiff",
|
|
3714
|
+
"type": "object",
|
|
3715
|
+
"additionalProperties": false,
|
|
3716
|
+
"required": ["path", "oldText", "newText", "binary"],
|
|
3717
|
+
"properties": {
|
|
3718
|
+
"path": {
|
|
3719
|
+
"type": "string"
|
|
3720
|
+
},
|
|
3721
|
+
"oldText": {
|
|
3722
|
+
"type": "string",
|
|
3723
|
+
"description": "The base-side text; empty when the file was added or is binary."
|
|
3724
|
+
},
|
|
3725
|
+
"newText": {
|
|
3726
|
+
"type": "string",
|
|
3727
|
+
"description": "The new-side text; empty when the file was deleted or is binary."
|
|
3728
|
+
},
|
|
3729
|
+
"binary": {
|
|
3730
|
+
"type": "boolean",
|
|
3731
|
+
"description": "True when git reports the file as binary; old/new text are empty."
|
|
3732
|
+
}
|
|
3733
|
+
}
|
|
3734
|
+
},
|
|
3735
|
+
"FileChangeKind": {
|
|
3736
|
+
"title": "FileChangeKind",
|
|
3737
|
+
"description": "How a watched entry changed on disk, as reported by the pragma-server worktree filesystem watcher.",
|
|
3738
|
+
"type": "string",
|
|
3739
|
+
"enum": ["created", "modified", "removed"]
|
|
3740
|
+
},
|
|
3741
|
+
"FileChange": {
|
|
3742
|
+
"title": "FileChange",
|
|
3743
|
+
"description": "A single filesystem change delivered over a `fileChanged` subscription by the pragma-server worktree watcher. Drives live file previews on the client.",
|
|
3744
|
+
"type": "object",
|
|
3745
|
+
"additionalProperties": false,
|
|
3746
|
+
"required": ["path", "kind"],
|
|
3747
|
+
"properties": {
|
|
3748
|
+
"path": {
|
|
3749
|
+
"type": "string",
|
|
3750
|
+
"description": "Worktree-relative POSIX path (forward slashes) of the changed entry."
|
|
3751
|
+
},
|
|
3752
|
+
"kind": {
|
|
3753
|
+
"$ref": "#/definitions/FileChangeKind"
|
|
3754
|
+
}
|
|
3755
|
+
}
|
|
3756
|
+
},
|
|
3757
|
+
"FileReadLimits": {
|
|
3758
|
+
"title": "FileReadLimits",
|
|
3759
|
+
"type": "object",
|
|
3760
|
+
"additionalProperties": false,
|
|
3761
|
+
"required": ["chunkBytes", "maxBinaryBytes"],
|
|
3762
|
+
"description": "Limits for reading a binary file in chunks over the `filesystem` RPC. A single chunk plus its base64 expansion must stay well inside the protocol's frame limit, so the host rejects any request for more than `chunkBytes` at once and the frontend loops until the whole file is read.",
|
|
3763
|
+
"properties": {
|
|
3764
|
+
"chunkBytes": {
|
|
3765
|
+
"type": "integer",
|
|
3766
|
+
"minimum": 1,
|
|
3767
|
+
"description": "Largest number of raw bytes one `readBytesRange` request may return. Base64 inflates this by 4/3 on the wire."
|
|
3768
|
+
},
|
|
3769
|
+
"maxBinaryBytes": {
|
|
3770
|
+
"type": "integer",
|
|
3771
|
+
"minimum": 1,
|
|
3772
|
+
"description": "Largest binary file a viewer will assemble in memory from chunks. Bigger files are refused with a message instead of exhausting the webview's heap."
|
|
3773
|
+
}
|
|
3774
|
+
}
|
|
3775
|
+
},
|
|
3776
|
+
"FileChunk": {
|
|
3777
|
+
"title": "FileChunk",
|
|
3778
|
+
"type": "object",
|
|
3779
|
+
"additionalProperties": false,
|
|
3780
|
+
"required": ["base64", "offset", "byteSize", "eof"],
|
|
3781
|
+
"description": "One base64-encoded slice of a binary file, returned by a chunked read.",
|
|
3782
|
+
"properties": {
|
|
3783
|
+
"base64": {
|
|
3784
|
+
"type": "string",
|
|
3785
|
+
"description": "The slice's bytes, base64-encoded. Empty once the offset is at or past the end of the file."
|
|
3786
|
+
},
|
|
3787
|
+
"offset": {
|
|
3788
|
+
"type": "integer",
|
|
3789
|
+
"minimum": 0,
|
|
3790
|
+
"description": "Byte offset the slice was read from."
|
|
3791
|
+
},
|
|
3792
|
+
"byteSize": {
|
|
3793
|
+
"type": "integer",
|
|
3794
|
+
"minimum": 0,
|
|
3795
|
+
"description": "Total on-disk size of the file in bytes, so a caller can size its buffer from the first chunk."
|
|
3796
|
+
},
|
|
3797
|
+
"eof": {
|
|
3798
|
+
"type": "boolean",
|
|
3799
|
+
"description": "True when this slice reaches the end of the file and no further request is needed."
|
|
3800
|
+
}
|
|
3801
|
+
}
|
|
3802
|
+
},
|
|
3803
|
+
"FileContents": {
|
|
3804
|
+
"title": "FileContents",
|
|
3805
|
+
"type": "object",
|
|
3806
|
+
"additionalProperties": false,
|
|
3807
|
+
"required": ["path", "text", "binary", "truncated", "byteSize"],
|
|
3808
|
+
"properties": {
|
|
3809
|
+
"path": {
|
|
3810
|
+
"type": "string"
|
|
3811
|
+
},
|
|
3812
|
+
"text": {
|
|
3813
|
+
"type": "string",
|
|
3814
|
+
"description": "The decoded UTF-8 text; empty when binary or truncated."
|
|
3815
|
+
},
|
|
3816
|
+
"binary": {
|
|
3817
|
+
"type": "boolean",
|
|
3818
|
+
"description": "True when the bytes are not valid UTF-8."
|
|
3819
|
+
},
|
|
3820
|
+
"truncated": {
|
|
3821
|
+
"type": "boolean",
|
|
3822
|
+
"description": "True when the file exceeds the read cap and was not read."
|
|
3823
|
+
},
|
|
3824
|
+
"byteSize": {
|
|
3825
|
+
"type": "integer",
|
|
3826
|
+
"minimum": 0,
|
|
3827
|
+
"description": "On-disk size in bytes from the file metadata."
|
|
3828
|
+
}
|
|
3829
|
+
}
|
|
3830
|
+
},
|
|
3831
|
+
"PaletteSearchMatch": {
|
|
3832
|
+
"title": "PaletteSearchMatch",
|
|
3833
|
+
"description": "One host-owned command-palette filename or literal code match.",
|
|
3834
|
+
"type": "object",
|
|
3835
|
+
"additionalProperties": false,
|
|
3836
|
+
"required": ["worktreeId", "path", "kind", "score"],
|
|
3837
|
+
"properties": {
|
|
3838
|
+
"worktreeId": {
|
|
3839
|
+
"type": "string"
|
|
3840
|
+
},
|
|
3841
|
+
"path": {
|
|
3842
|
+
"type": "string",
|
|
3843
|
+
"description": "Worktree-relative POSIX path."
|
|
3844
|
+
},
|
|
3845
|
+
"kind": {
|
|
3846
|
+
"type": "string",
|
|
3847
|
+
"enum": ["file", "code"]
|
|
3848
|
+
},
|
|
3849
|
+
"score": {
|
|
3850
|
+
"type": "number",
|
|
3851
|
+
"minimum": 0,
|
|
3852
|
+
"maximum": 1
|
|
3853
|
+
},
|
|
3854
|
+
"line": {
|
|
3855
|
+
"type": ["integer", "null"],
|
|
3856
|
+
"minimum": 1
|
|
3857
|
+
},
|
|
3858
|
+
"column": {
|
|
3859
|
+
"type": ["integer", "null"],
|
|
3860
|
+
"minimum": 1
|
|
3861
|
+
},
|
|
3862
|
+
"snippet": {
|
|
3863
|
+
"type": ["string", "null"]
|
|
3864
|
+
}
|
|
3865
|
+
}
|
|
3866
|
+
},
|
|
3867
|
+
"PaletteSearchResponse": {
|
|
3868
|
+
"title": "PaletteSearchResponse",
|
|
3869
|
+
"description": "Bounded host search results for visible worktrees in one project.",
|
|
3870
|
+
"type": "object",
|
|
3871
|
+
"additionalProperties": false,
|
|
3872
|
+
"required": ["matches", "truncated"],
|
|
3873
|
+
"properties": {
|
|
3874
|
+
"matches": {
|
|
3875
|
+
"type": "array",
|
|
3876
|
+
"items": {
|
|
3877
|
+
"$ref": "#/definitions/PaletteSearchMatch"
|
|
3878
|
+
}
|
|
3879
|
+
},
|
|
3880
|
+
"truncated": {
|
|
3881
|
+
"type": "boolean"
|
|
3882
|
+
}
|
|
3883
|
+
}
|
|
3884
|
+
},
|
|
3885
|
+
"ProjectIcon": {
|
|
3886
|
+
"title": "ProjectIcon",
|
|
3887
|
+
"type": "object",
|
|
3888
|
+
"additionalProperties": false,
|
|
3889
|
+
"required": ["mime", "dataBase64"],
|
|
3890
|
+
"properties": {
|
|
3891
|
+
"mime": {
|
|
3892
|
+
"type": "string"
|
|
3893
|
+
},
|
|
3894
|
+
"dataBase64": {
|
|
3895
|
+
"type": "string"
|
|
3896
|
+
}
|
|
3897
|
+
}
|
|
3898
|
+
},
|
|
3899
|
+
"WorktreeStatus": {
|
|
3900
|
+
"title": "WorktreeStatus",
|
|
3901
|
+
"description": "Status of a worktree's working copy, used to warn the user before destructive operations.",
|
|
3902
|
+
"type": "object",
|
|
3903
|
+
"additionalProperties": false,
|
|
3904
|
+
"required": ["dirty"],
|
|
3905
|
+
"properties": {
|
|
3906
|
+
"dirty": {
|
|
3907
|
+
"type": "boolean",
|
|
3908
|
+
"description": "True when the worktree has uncommitted changes, staged changes, or untracked files that `git status` would surface."
|
|
3909
|
+
}
|
|
3910
|
+
}
|
|
3911
|
+
},
|
|
3912
|
+
"KanbanPromptStatus": {
|
|
3913
|
+
"title": "KanbanPromptStatus",
|
|
3914
|
+
"description": "Column a prompt card lives in on the project Kanban board.",
|
|
3915
|
+
"type": "string",
|
|
3916
|
+
"enum": ["draft", "inProgress", "reviewNeeded", "completed"]
|
|
3917
|
+
},
|
|
3918
|
+
"KanbanCompletedAction": {
|
|
3919
|
+
"title": "KanbanCompletedAction",
|
|
3920
|
+
"description": "How a reviewed card was completed: committed and merged, committed with a PR opened, or finished manually.",
|
|
3921
|
+
"type": "string",
|
|
3922
|
+
"enum": ["commitMerge", "commitPr", "manual"]
|
|
3923
|
+
},
|
|
3924
|
+
"KanbanSchedulingMode": {
|
|
3925
|
+
"title": "KanbanSchedulingMode",
|
|
3926
|
+
"description": "When the card's agent run is started. MVP supports manual start only.",
|
|
3927
|
+
"type": "string",
|
|
3928
|
+
"enum": ["manual"]
|
|
3929
|
+
},
|
|
3930
|
+
"KanbanPromptCard": {
|
|
3931
|
+
"title": "KanbanPromptCard",
|
|
3932
|
+
"description": "A persisted prompt card on a project's Kanban board, scoped by projectId.",
|
|
3933
|
+
"type": "object",
|
|
3934
|
+
"additionalProperties": false,
|
|
3935
|
+
"required": [
|
|
3936
|
+
"id",
|
|
3937
|
+
"projectId",
|
|
3938
|
+
"branchName",
|
|
3939
|
+
"prompt",
|
|
3940
|
+
"agentId",
|
|
3941
|
+
"status",
|
|
3942
|
+
"schedulingMode",
|
|
3943
|
+
"createdAt",
|
|
3944
|
+
"updatedAt"
|
|
3945
|
+
],
|
|
3946
|
+
"properties": {
|
|
3947
|
+
"id": {
|
|
3948
|
+
"type": "string"
|
|
3949
|
+
},
|
|
3950
|
+
"projectId": {
|
|
3951
|
+
"type": "string"
|
|
3952
|
+
},
|
|
3953
|
+
"worktreeId": {
|
|
3954
|
+
"type": ["string", "null"],
|
|
3955
|
+
"description": "The worktree backing this card once it starts running; null for a draft."
|
|
3956
|
+
},
|
|
3957
|
+
"branchName": {
|
|
3958
|
+
"type": "string",
|
|
3959
|
+
"description": "Branch the card targets \u2014 an existing project worktree branch or a new one to create."
|
|
3960
|
+
},
|
|
3961
|
+
"prompt": {
|
|
3962
|
+
"type": "string"
|
|
3963
|
+
},
|
|
3964
|
+
"agentId": {
|
|
3965
|
+
"type": "string"
|
|
3966
|
+
},
|
|
3967
|
+
"modelId": {
|
|
3968
|
+
"type": ["string", "null"],
|
|
3969
|
+
"description": "Selected model id for the agent launch; null uses the agent default."
|
|
3970
|
+
},
|
|
3971
|
+
"reasoningId": {
|
|
3972
|
+
"type": ["string", "null"],
|
|
3973
|
+
"description": "Selected reasoning level id for the agent launch; null uses automatic reasoning."
|
|
3974
|
+
},
|
|
3975
|
+
"status": {
|
|
3976
|
+
"$ref": "#/definitions/KanbanPromptStatus"
|
|
3977
|
+
},
|
|
3978
|
+
"agentTabId": {
|
|
3979
|
+
"type": ["string", "null"],
|
|
3980
|
+
"description": "Terminal tab/daemon session id the agent runs in once started; null before launch."
|
|
3981
|
+
},
|
|
3982
|
+
"completedAction": {
|
|
3983
|
+
"description": "Which completion path finished the card; null until completed.",
|
|
3984
|
+
"anyOf": [
|
|
3985
|
+
{
|
|
3986
|
+
"$ref": "#/definitions/KanbanCompletedAction"
|
|
3987
|
+
},
|
|
3988
|
+
{
|
|
3989
|
+
"type": "null"
|
|
3990
|
+
}
|
|
3991
|
+
]
|
|
3992
|
+
},
|
|
3993
|
+
"pullRequestUrl": {
|
|
3994
|
+
"type": ["string", "null"],
|
|
3995
|
+
"description": "URL of the pull request opened during completion, when applicable."
|
|
3996
|
+
},
|
|
3997
|
+
"pullRequestNumber": {
|
|
3998
|
+
"type": ["integer", "null"],
|
|
3999
|
+
"description": "Number of the pull request opened during completion, when applicable."
|
|
4000
|
+
},
|
|
4001
|
+
"schedulingMode": {
|
|
4002
|
+
"$ref": "#/definitions/KanbanSchedulingMode"
|
|
4003
|
+
},
|
|
4004
|
+
"scheduledFor": {
|
|
4005
|
+
"type": ["string", "null"],
|
|
4006
|
+
"description": "Reserved for scheduled runs; always null in the manual MVP."
|
|
4007
|
+
},
|
|
4008
|
+
"createdAt": {
|
|
4009
|
+
"type": "string"
|
|
4010
|
+
},
|
|
4011
|
+
"updatedAt": {
|
|
4012
|
+
"type": "string"
|
|
4013
|
+
},
|
|
4014
|
+
"startedAt": {
|
|
4015
|
+
"type": ["string", "null"],
|
|
4016
|
+
"description": "When the card first moved to inProgress; null before launch."
|
|
4017
|
+
},
|
|
4018
|
+
"completedAt": {
|
|
4019
|
+
"type": ["string", "null"],
|
|
4020
|
+
"description": "When the card moved to completed; null until completed."
|
|
4021
|
+
}
|
|
4022
|
+
}
|
|
4023
|
+
},
|
|
4024
|
+
"BoardDraftCreatePayload": {
|
|
4025
|
+
"title": "BoardDraftCreatePayload",
|
|
4026
|
+
"description": "Payload for creating an agent-board draft through the brokered desktop controller.",
|
|
4027
|
+
"type": "object",
|
|
4028
|
+
"additionalProperties": false,
|
|
4029
|
+
"required": ["prompt", "worktreeId", "agentId"],
|
|
4030
|
+
"properties": {
|
|
4031
|
+
"prompt": {
|
|
4032
|
+
"type": "string"
|
|
4033
|
+
},
|
|
4034
|
+
"worktreeId": {
|
|
4035
|
+
"type": "string",
|
|
4036
|
+
"description": "Existing worktree whose project and branch receive the draft."
|
|
4037
|
+
},
|
|
4038
|
+
"agentId": {
|
|
4039
|
+
"type": "string"
|
|
4040
|
+
},
|
|
4041
|
+
"modelId": {
|
|
4042
|
+
"type": ["string", "null"]
|
|
4043
|
+
},
|
|
4044
|
+
"reasoningId": {
|
|
4045
|
+
"type": ["string", "null"]
|
|
4046
|
+
}
|
|
4047
|
+
}
|
|
4048
|
+
},
|
|
4049
|
+
"KeybindingChord": {
|
|
4050
|
+
"title": "KeybindingChord",
|
|
4051
|
+
"type": "object",
|
|
4052
|
+
"additionalProperties": false,
|
|
4053
|
+
"required": ["modifiers", "key"],
|
|
4054
|
+
"properties": {
|
|
4055
|
+
"modifiers": {
|
|
4056
|
+
"type": "array",
|
|
4057
|
+
"items": {
|
|
4058
|
+
"type": "string",
|
|
4059
|
+
"enum": ["cmd", "ctrl", "alt", "shift"]
|
|
4060
|
+
}
|
|
4061
|
+
},
|
|
4062
|
+
"key": {
|
|
4063
|
+
"type": "string"
|
|
4064
|
+
}
|
|
4065
|
+
}
|
|
4066
|
+
},
|
|
4067
|
+
"PlatformChord": {
|
|
4068
|
+
"title": "PlatformChord",
|
|
4069
|
+
"type": "object",
|
|
4070
|
+
"additionalProperties": false,
|
|
4071
|
+
"required": ["mac", "linux"],
|
|
4072
|
+
"properties": {
|
|
4073
|
+
"mac": {
|
|
4074
|
+
"$ref": "#/definitions/KeybindingChord"
|
|
4075
|
+
},
|
|
4076
|
+
"linux": {
|
|
4077
|
+
"$ref": "#/definitions/KeybindingChord"
|
|
4078
|
+
}
|
|
4079
|
+
}
|
|
4080
|
+
},
|
|
4081
|
+
"Keybindings": {
|
|
4082
|
+
"title": "Keybindings",
|
|
4083
|
+
"type": "object",
|
|
4084
|
+
"additionalProperties": false,
|
|
4085
|
+
"required": [
|
|
4086
|
+
"nextTab",
|
|
4087
|
+
"previousTab",
|
|
4088
|
+
"closeTopTab",
|
|
4089
|
+
"newTerminalTab",
|
|
4090
|
+
"newBrowserTab",
|
|
4091
|
+
"newWhiteboard",
|
|
4092
|
+
"clearTerminal",
|
|
4093
|
+
"browserReload",
|
|
4094
|
+
"browserDevtools",
|
|
4095
|
+
"browserCopyUrl",
|
|
4096
|
+
"splitHorizontal",
|
|
4097
|
+
"splitVertical",
|
|
4098
|
+
"deleteFile",
|
|
4099
|
+
"scrollTerminalBottom",
|
|
4100
|
+
"openCommandPalette",
|
|
4101
|
+
"openCommandMode",
|
|
4102
|
+
"openSettings",
|
|
4103
|
+
"switchToWorkspace1",
|
|
4104
|
+
"switchToWorkspace2",
|
|
4105
|
+
"switchToWorkspace3",
|
|
4106
|
+
"switchToWorkspace4",
|
|
4107
|
+
"switchToWorkspace5",
|
|
4108
|
+
"switchToWorkspace6",
|
|
4109
|
+
"switchToWorkspace7",
|
|
4110
|
+
"switchToWorkspace8",
|
|
4111
|
+
"switchToWorkspace9",
|
|
4112
|
+
"switchToWorktree1",
|
|
4113
|
+
"switchToWorktree2",
|
|
4114
|
+
"switchToWorktree3",
|
|
4115
|
+
"switchToWorktree4",
|
|
4116
|
+
"switchToWorktree5",
|
|
4117
|
+
"switchToWorktree6",
|
|
4118
|
+
"switchToWorktree7",
|
|
4119
|
+
"switchToWorktree8",
|
|
4120
|
+
"switchToWorktree9",
|
|
4121
|
+
"switchToTab1",
|
|
4122
|
+
"switchToTab2",
|
|
4123
|
+
"switchToTab3",
|
|
4124
|
+
"switchToTab4",
|
|
4125
|
+
"switchToTab5",
|
|
4126
|
+
"switchToTab6",
|
|
4127
|
+
"switchToTab7",
|
|
4128
|
+
"switchToTab8",
|
|
4129
|
+
"switchToTab9"
|
|
4130
|
+
],
|
|
4131
|
+
"properties": {
|
|
4132
|
+
"nextTab": {
|
|
4133
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4134
|
+
},
|
|
4135
|
+
"previousTab": {
|
|
4136
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4137
|
+
},
|
|
4138
|
+
"closeTopTab": {
|
|
4139
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4140
|
+
},
|
|
4141
|
+
"newTerminalTab": {
|
|
4142
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4143
|
+
},
|
|
4144
|
+
"newBrowserTab": {
|
|
4145
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4146
|
+
},
|
|
4147
|
+
"newWhiteboard": {
|
|
4148
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4149
|
+
},
|
|
4150
|
+
"clearTerminal": {
|
|
4151
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4152
|
+
},
|
|
4153
|
+
"browserReload": {
|
|
4154
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4155
|
+
},
|
|
4156
|
+
"browserDevtools": {
|
|
4157
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4158
|
+
},
|
|
4159
|
+
"browserCopyUrl": {
|
|
4160
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4161
|
+
},
|
|
4162
|
+
"splitHorizontal": {
|
|
4163
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4164
|
+
},
|
|
4165
|
+
"splitVertical": {
|
|
4166
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4167
|
+
},
|
|
4168
|
+
"deleteFile": {
|
|
4169
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4170
|
+
},
|
|
4171
|
+
"scrollTerminalBottom": {
|
|
4172
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4173
|
+
},
|
|
4174
|
+
"openCommandPalette": {
|
|
4175
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4176
|
+
},
|
|
4177
|
+
"openCommandMode": {
|
|
4178
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4179
|
+
},
|
|
4180
|
+
"openSettings": {
|
|
4181
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4182
|
+
},
|
|
4183
|
+
"switchToWorkspace1": {
|
|
4184
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4185
|
+
},
|
|
4186
|
+
"switchToWorkspace2": {
|
|
4187
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4188
|
+
},
|
|
4189
|
+
"switchToWorkspace3": {
|
|
4190
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4191
|
+
},
|
|
4192
|
+
"switchToWorkspace4": {
|
|
4193
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4194
|
+
},
|
|
4195
|
+
"switchToWorkspace5": {
|
|
4196
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4197
|
+
},
|
|
4198
|
+
"switchToWorkspace6": {
|
|
4199
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4200
|
+
},
|
|
4201
|
+
"switchToWorkspace7": {
|
|
4202
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4203
|
+
},
|
|
4204
|
+
"switchToWorkspace8": {
|
|
4205
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4206
|
+
},
|
|
4207
|
+
"switchToWorkspace9": {
|
|
4208
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4209
|
+
},
|
|
4210
|
+
"switchToWorktree1": {
|
|
4211
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4212
|
+
},
|
|
4213
|
+
"switchToWorktree2": {
|
|
4214
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4215
|
+
},
|
|
4216
|
+
"switchToWorktree3": {
|
|
4217
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4218
|
+
},
|
|
4219
|
+
"switchToWorktree4": {
|
|
4220
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4221
|
+
},
|
|
4222
|
+
"switchToWorktree5": {
|
|
4223
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4224
|
+
},
|
|
4225
|
+
"switchToWorktree6": {
|
|
4226
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4227
|
+
},
|
|
4228
|
+
"switchToWorktree7": {
|
|
4229
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4230
|
+
},
|
|
4231
|
+
"switchToWorktree8": {
|
|
4232
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4233
|
+
},
|
|
4234
|
+
"switchToWorktree9": {
|
|
4235
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4236
|
+
},
|
|
4237
|
+
"switchToTab1": {
|
|
4238
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4239
|
+
},
|
|
4240
|
+
"switchToTab2": {
|
|
4241
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4242
|
+
},
|
|
4243
|
+
"switchToTab3": {
|
|
4244
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4245
|
+
},
|
|
4246
|
+
"switchToTab4": {
|
|
4247
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4248
|
+
},
|
|
4249
|
+
"switchToTab5": {
|
|
4250
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4251
|
+
},
|
|
4252
|
+
"switchToTab6": {
|
|
4253
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4254
|
+
},
|
|
4255
|
+
"switchToTab7": {
|
|
4256
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4257
|
+
},
|
|
4258
|
+
"switchToTab8": {
|
|
4259
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4260
|
+
},
|
|
4261
|
+
"switchToTab9": {
|
|
4262
|
+
"$ref": "#/definitions/PlatformChord"
|
|
4263
|
+
}
|
|
4264
|
+
}
|
|
4265
|
+
},
|
|
4266
|
+
"KeybindingsConfig": {
|
|
4267
|
+
"title": "KeybindingsConfig",
|
|
4268
|
+
"type": "object",
|
|
4269
|
+
"additionalProperties": false,
|
|
4270
|
+
"required": ["version", "bindings"],
|
|
4271
|
+
"properties": {
|
|
4272
|
+
"version": {
|
|
4273
|
+
"type": "integer",
|
|
4274
|
+
"minimum": 1
|
|
4275
|
+
},
|
|
4276
|
+
"bindings": {
|
|
4277
|
+
"$ref": "#/definitions/Keybindings"
|
|
4278
|
+
}
|
|
4279
|
+
}
|
|
4280
|
+
},
|
|
4281
|
+
"UpdateApplyMode": {
|
|
4282
|
+
"title": "UpdateApplyMode",
|
|
4283
|
+
"type": "string",
|
|
4284
|
+
"description": "How a desktop update is applied. `reload` swaps the webview UI overlay and leaves the host running. `restart` always runs the full OS installer.",
|
|
4285
|
+
"enum": ["reload", "restart"]
|
|
4286
|
+
},
|
|
4287
|
+
"UpdatePlatform": {
|
|
4288
|
+
"title": "UpdatePlatform",
|
|
4289
|
+
"type": "string",
|
|
4290
|
+
"description": "Installer target id sent on the check request so a restart offer returns the right asset.",
|
|
4291
|
+
"enum": [
|
|
4292
|
+
"darwin-aarch64",
|
|
4293
|
+
"darwin-x86_64",
|
|
4294
|
+
"linux-x86_64-deb",
|
|
4295
|
+
"linux-x86_64-rpm",
|
|
4296
|
+
"linux-x86_64-appimage",
|
|
4297
|
+
"linux-aarch64-deb",
|
|
4298
|
+
"linux-aarch64-rpm",
|
|
4299
|
+
"linux-aarch64-appimage",
|
|
4300
|
+
"windows-x86_64"
|
|
4301
|
+
]
|
|
4302
|
+
},
|
|
4303
|
+
"Onboarding": {
|
|
4304
|
+
"title": "Onboarding",
|
|
4305
|
+
"type": "object",
|
|
4306
|
+
"additionalProperties": false,
|
|
4307
|
+
"description": "Shipped values for the first-run onboarding flow: where its preview videos stream from, and which global skill directories the skills step can install into.",
|
|
4308
|
+
"required": ["mediaBaseUrl", "skill"],
|
|
4309
|
+
"properties": {
|
|
4310
|
+
"mediaBaseUrl": {
|
|
4311
|
+
"type": "string",
|
|
4312
|
+
"description": "Base URL the onboarding preview videos are streamed from (the marketing site's `public/media`). Videos are streamed rather than bundled so installers stay small."
|
|
4313
|
+
},
|
|
4314
|
+
"skill": {
|
|
4315
|
+
"$ref": "#/definitions/OnboardingSkill"
|
|
4316
|
+
}
|
|
4317
|
+
}
|
|
4318
|
+
},
|
|
4319
|
+
"OnboardingSkill": {
|
|
4320
|
+
"title": "OnboardingSkill",
|
|
4321
|
+
"type": "object",
|
|
4322
|
+
"additionalProperties": false,
|
|
4323
|
+
"description": "The Pragma skill offered during onboarding and the global directories it can be installed into.",
|
|
4324
|
+
"required": ["id", "targets"],
|
|
4325
|
+
"properties": {
|
|
4326
|
+
"id": {
|
|
4327
|
+
"type": "string",
|
|
4328
|
+
"description": "Directory name the skill is written as, inside each target directory."
|
|
4329
|
+
},
|
|
4330
|
+
"targets": {
|
|
4331
|
+
"type": "array",
|
|
4332
|
+
"description": "Install destinations offered by the skills step.",
|
|
4333
|
+
"items": {
|
|
4334
|
+
"$ref": "#/definitions/OnboardingSkillTarget"
|
|
4335
|
+
}
|
|
4336
|
+
}
|
|
4337
|
+
}
|
|
4338
|
+
},
|
|
4339
|
+
"OnboardingSkillTarget": {
|
|
4340
|
+
"title": "OnboardingSkillTarget",
|
|
4341
|
+
"type": "object",
|
|
4342
|
+
"additionalProperties": false,
|
|
4343
|
+
"description": "One skill install destination. The frontend sends `id` over IPC; the backend resolves `directory` against the home directory.",
|
|
4344
|
+
"required": ["id", "directory", "label"],
|
|
4345
|
+
"properties": {
|
|
4346
|
+
"id": {
|
|
4347
|
+
"type": "string",
|
|
4348
|
+
"description": "Stable identifier sent over IPC."
|
|
4349
|
+
},
|
|
4350
|
+
"directory": {
|
|
4351
|
+
"type": "string",
|
|
4352
|
+
"description": "Directory holding the skill, relative to the user's home directory."
|
|
4353
|
+
},
|
|
4354
|
+
"label": {
|
|
4355
|
+
"type": "string",
|
|
4356
|
+
"description": "Button label shown in onboarding."
|
|
4357
|
+
}
|
|
4358
|
+
}
|
|
4359
|
+
},
|
|
4360
|
+
"Updates": {
|
|
4361
|
+
"title": "Updates",
|
|
4362
|
+
"type": "object",
|
|
4363
|
+
"additionalProperties": false,
|
|
4364
|
+
"description": "Shipped defaults for desktop auto-updates. User overrides live in global `.pragma/config.json` under `updates`.",
|
|
4365
|
+
"required": [
|
|
4366
|
+
"checkUrl",
|
|
4367
|
+
"devCheckUrl",
|
|
4368
|
+
"pollIntervalMs",
|
|
4369
|
+
"autoDownload",
|
|
4370
|
+
"manifestFile",
|
|
4371
|
+
"uiDirName",
|
|
4372
|
+
"buttonLabel",
|
|
4373
|
+
"changelogLabel",
|
|
4374
|
+
"restartWarningTitle",
|
|
4375
|
+
"restartWarningBody",
|
|
4376
|
+
"applyModes",
|
|
4377
|
+
"platforms"
|
|
4378
|
+
],
|
|
4379
|
+
"properties": {
|
|
4380
|
+
"checkUrl": {
|
|
4381
|
+
"type": "string",
|
|
4382
|
+
"description": "Production Next.js check endpoint. Dev builds use `devCheckUrl` unless user overrides `other.serverUrl`."
|
|
4383
|
+
},
|
|
4384
|
+
"devCheckUrl": {
|
|
4385
|
+
"type": "string",
|
|
4386
|
+
"description": "Check endpoint used by `pragma-dev-*` builds so they never poll production."
|
|
4387
|
+
},
|
|
4388
|
+
"pollIntervalMs": {
|
|
4389
|
+
"type": "integer",
|
|
4390
|
+
"minimum": 1000,
|
|
4391
|
+
"description": "How often a production (or opted-in) session re-checks for an update."
|
|
4392
|
+
},
|
|
4393
|
+
"autoDownload": {
|
|
4394
|
+
"type": "boolean",
|
|
4395
|
+
"description": "Default for whether the desktop polls on launch and on an interval."
|
|
4396
|
+
},
|
|
4397
|
+
"manifestFile": {
|
|
4398
|
+
"type": "string",
|
|
4399
|
+
"description": "GitHub Release asset name for the per-release manifest."
|
|
4400
|
+
},
|
|
4401
|
+
"uiDirName": {
|
|
4402
|
+
"type": "string",
|
|
4403
|
+
"description": "Directory name under the instance data dir that holds the optional UI overlay (`<data>/<uiDirName>/<version>/`)."
|
|
4404
|
+
},
|
|
4405
|
+
"buttonLabel": {
|
|
4406
|
+
"type": "string",
|
|
4407
|
+
"description": "Sidebar button that applies a downloaded (or on-click) update."
|
|
4408
|
+
},
|
|
4409
|
+
"changelogLabel": {
|
|
4410
|
+
"type": "string",
|
|
4411
|
+
"description": "Link label for the GitHub Release notes URL."
|
|
4412
|
+
},
|
|
4413
|
+
"restartWarningTitle": {
|
|
4414
|
+
"type": "string",
|
|
4415
|
+
"description": "Modal title shown before a restart (installer) update."
|
|
4416
|
+
},
|
|
4417
|
+
"restartWarningBody": {
|
|
4418
|
+
"type": "string",
|
|
4419
|
+
"description": "Modal body warning that the app server restarts and terminals stop."
|
|
4420
|
+
},
|
|
4421
|
+
"applyModes": {
|
|
4422
|
+
"type": "array",
|
|
4423
|
+
"minItems": 2,
|
|
4424
|
+
"items": {
|
|
4425
|
+
"$ref": "#/definitions/UpdateApplyMode"
|
|
4426
|
+
},
|
|
4427
|
+
"description": "Supported apply modes, in display order."
|
|
4428
|
+
},
|
|
4429
|
+
"platforms": {
|
|
4430
|
+
"type": "array",
|
|
4431
|
+
"minItems": 1,
|
|
4432
|
+
"items": {
|
|
4433
|
+
"$ref": "#/definitions/UpdatePlatform"
|
|
4434
|
+
},
|
|
4435
|
+
"description": "Installer platform ids the check API accepts."
|
|
4436
|
+
}
|
|
4437
|
+
}
|
|
4438
|
+
}
|
|
4439
|
+
}
|
|
4440
|
+
}
|