deck-plugin-sdk 1.9.0 → 1.10.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/package.json +1 -1
- package/permissions.json +231 -230
- package/shim/bridge.js +1 -0
- package/shim/p2p.js +16 -16
- package/shim/terminals.js +6 -0
- package/template/plugin.json +1 -1
- package/types/components/ConfirmDialog.d.ts +2 -0
- package/types/components/ui.d.ts +4 -1
- package/types/core/bridge.d.ts +54 -1
- package/types/core/browser.d.ts +12 -0
- package/types/core/fileview.d.ts +6 -2
- package/types/core/notifications.d.ts +2 -0
- package/types/core/p2p.d.ts +117 -117
- package/types/core/settingsstore.d.ts +26 -26
- package/types/core/shellpath.d.ts +43 -3
- package/types/core/terminals.d.ts +55 -2
package/package.json
CHANGED
package/permissions.json
CHANGED
|
@@ -1,230 +1,231 @@
|
|
|
1
|
-
{
|
|
2
|
-
"generated": "by sdk/gen-permissions.mjs from src/core/permissions.ts; do not edit",
|
|
3
|
-
"permissions": {
|
|
4
|
-
"files": "Read and change files anywhere on this PC",
|
|
5
|
-
"processes": "Run programs and commands",
|
|
6
|
-
"git": "Read and change git repositories, and push",
|
|
7
|
-
"network": "Connect to servers: web requests, SSH, databases and other Decks",
|
|
8
|
-
"terminals": "Use your terminals and the AI agents running in them",
|
|
9
|
-
"browser": "Control Deck's browser and the pages open in it",
|
|
10
|
-
"secrets": "Use your saved passwords, your Google account and sudo passwords",
|
|
11
|
-
"system": "Change this PC's apps, startup programs, wallpaper and running processes",
|
|
12
|
-
"deck": "Change Deck itself: its settings, backups, plugins and languages"
|
|
13
|
-
},
|
|
14
|
-
"bridge": {
|
|
15
|
-
"adblockConfig": "browser",
|
|
16
|
-
"adblockInfo": "browser",
|
|
17
|
-
"adblockRebuild": "browser",
|
|
18
|
-
"adblockUpdate": "browser",
|
|
19
|
-
"agentClis": "terminals",
|
|
20
|
-
"agentMcpStatus": "terminals",
|
|
21
|
-
"agentStop": "terminals",
|
|
22
|
-
"askSudoPassword": "secrets",
|
|
23
|
-
"backupExport": "deck",
|
|
24
|
-
"backupInspect": "deck",
|
|
25
|
-
"backupRestore": "deck",
|
|
26
|
-
"bookmarksBarMode": "browser",
|
|
27
|
-
"browserAgentAnswer": "browser",
|
|
28
|
-
"browserAgentConfig": "browser",
|
|
29
|
-
"browserAgentFillAnswer": "browser",
|
|
30
|
-
"browserBounds": "browser",
|
|
31
|
-
"browserCapture": "browser",
|
|
32
|
-
"browserCdp": "browser",
|
|
33
|
-
"browserClear": "browser",
|
|
34
|
-
"browserClose": "browser",
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
120
|
-
"
|
|
121
|
-
"
|
|
122
|
-
"
|
|
123
|
-
"
|
|
124
|
-
"
|
|
125
|
-
"
|
|
126
|
-
"
|
|
127
|
-
"
|
|
128
|
-
"
|
|
129
|
-
"
|
|
130
|
-
"
|
|
131
|
-
"
|
|
132
|
-
"
|
|
133
|
-
"
|
|
134
|
-
"
|
|
135
|
-
"
|
|
136
|
-
"
|
|
137
|
-
"
|
|
138
|
-
"
|
|
139
|
-
"
|
|
140
|
-
"
|
|
141
|
-
"
|
|
142
|
-
"
|
|
143
|
-
"
|
|
144
|
-
"
|
|
145
|
-
"
|
|
146
|
-
"
|
|
147
|
-
"
|
|
148
|
-
"
|
|
149
|
-
"
|
|
150
|
-
"
|
|
151
|
-
"
|
|
152
|
-
"
|
|
153
|
-
"
|
|
154
|
-
"
|
|
155
|
-
"
|
|
156
|
-
"
|
|
157
|
-
"
|
|
158
|
-
"
|
|
159
|
-
"
|
|
160
|
-
"
|
|
161
|
-
"
|
|
162
|
-
"
|
|
163
|
-
"
|
|
164
|
-
"
|
|
165
|
-
"
|
|
166
|
-
"
|
|
167
|
-
"
|
|
168
|
-
"
|
|
169
|
-
"
|
|
170
|
-
"
|
|
171
|
-
"
|
|
172
|
-
"
|
|
173
|
-
"
|
|
174
|
-
"
|
|
175
|
-
"
|
|
176
|
-
"
|
|
177
|
-
"
|
|
178
|
-
"
|
|
179
|
-
"
|
|
180
|
-
"
|
|
181
|
-
"
|
|
182
|
-
"
|
|
183
|
-
"
|
|
184
|
-
"
|
|
185
|
-
"
|
|
186
|
-
"
|
|
187
|
-
"
|
|
188
|
-
"
|
|
189
|
-
"
|
|
190
|
-
"
|
|
191
|
-
"
|
|
192
|
-
"
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
"
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
"
|
|
201
|
-
"
|
|
202
|
-
"
|
|
203
|
-
"
|
|
204
|
-
"
|
|
205
|
-
"
|
|
206
|
-
"
|
|
207
|
-
"
|
|
208
|
-
"
|
|
209
|
-
"
|
|
210
|
-
"
|
|
211
|
-
"
|
|
212
|
-
"
|
|
213
|
-
"
|
|
214
|
-
"
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
"
|
|
218
|
-
"
|
|
219
|
-
"
|
|
220
|
-
"
|
|
221
|
-
"
|
|
222
|
-
"
|
|
223
|
-
"
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"
|
|
227
|
-
"
|
|
228
|
-
"
|
|
229
|
-
|
|
230
|
-
|
|
1
|
+
{
|
|
2
|
+
"generated": "by sdk/gen-permissions.mjs from src/core/permissions.ts; do not edit",
|
|
3
|
+
"permissions": {
|
|
4
|
+
"files": "Read and change files anywhere on this PC",
|
|
5
|
+
"processes": "Run programs and commands",
|
|
6
|
+
"git": "Read and change git repositories, and push",
|
|
7
|
+
"network": "Connect to servers: web requests, SSH, databases and other Decks",
|
|
8
|
+
"terminals": "Use your terminals and the AI agents running in them",
|
|
9
|
+
"browser": "Control Deck's browser and the pages open in it",
|
|
10
|
+
"secrets": "Use your saved passwords, your Google account and sudo passwords",
|
|
11
|
+
"system": "Change this PC's apps, startup programs, wallpaper and running processes",
|
|
12
|
+
"deck": "Change Deck itself: its settings, backups, plugins and languages"
|
|
13
|
+
},
|
|
14
|
+
"bridge": {
|
|
15
|
+
"adblockConfig": "browser",
|
|
16
|
+
"adblockInfo": "browser",
|
|
17
|
+
"adblockRebuild": "browser",
|
|
18
|
+
"adblockUpdate": "browser",
|
|
19
|
+
"agentClis": "terminals",
|
|
20
|
+
"agentMcpStatus": "terminals",
|
|
21
|
+
"agentStop": "terminals",
|
|
22
|
+
"askSudoPassword": "secrets",
|
|
23
|
+
"backupExport": "deck",
|
|
24
|
+
"backupInspect": "deck",
|
|
25
|
+
"backupRestore": "deck",
|
|
26
|
+
"bookmarksBarMode": "browser",
|
|
27
|
+
"browserAgentAnswer": "browser",
|
|
28
|
+
"browserAgentConfig": "browser",
|
|
29
|
+
"browserAgentFillAnswer": "browser",
|
|
30
|
+
"browserBounds": "browser",
|
|
31
|
+
"browserCapture": "browser",
|
|
32
|
+
"browserCdp": "browser",
|
|
33
|
+
"browserClear": "browser",
|
|
34
|
+
"browserClose": "browser",
|
|
35
|
+
"browserCut": "browser",
|
|
36
|
+
"browserDefaultRegister": "browser",
|
|
37
|
+
"browserDefaultStatus": "browser",
|
|
38
|
+
"browserDevtools": "browser",
|
|
39
|
+
"browserDownload": "browser",
|
|
40
|
+
"browserFind": "browser",
|
|
41
|
+
"browserHistoryCount": "browser",
|
|
42
|
+
"browserHistoryForgetRange": "browser",
|
|
43
|
+
"browserHistoryForgetUrl": "browser",
|
|
44
|
+
"browserHistoryList": "browser",
|
|
45
|
+
"browserHistoryRecent": "browser",
|
|
46
|
+
"browserHistorySuggest": "browser",
|
|
47
|
+
"browserHistoryVisit": "browser",
|
|
48
|
+
"browserMute": "browser",
|
|
49
|
+
"browserNav": "browser",
|
|
50
|
+
"browserNotificationClicked": "browser",
|
|
51
|
+
"browserOpen": "browser",
|
|
52
|
+
"browserOpenAppLink": "browser",
|
|
53
|
+
"browserPermissionAnswer": "browser",
|
|
54
|
+
"browserPermissions": "browser",
|
|
55
|
+
"browserPermissionSet": "browser",
|
|
56
|
+
"browserPrint": "browser",
|
|
57
|
+
"browserPrivacy": "browser",
|
|
58
|
+
"browserReloadHung": "browser",
|
|
59
|
+
"browserSetKeys": "browser",
|
|
60
|
+
"browserSite": "browser",
|
|
61
|
+
"browserSiteAnswer": "browser",
|
|
62
|
+
"browserSiteClear": "browser",
|
|
63
|
+
"browserSleep": "browser",
|
|
64
|
+
"browserWindowFullscreen": "browser",
|
|
65
|
+
"browserZoom": "browser",
|
|
66
|
+
"claudePlanLimits": "terminals",
|
|
67
|
+
"claudeUsage": "terminals",
|
|
68
|
+
"clearWallpaper": "system",
|
|
69
|
+
"convertFileSrc": "files",
|
|
70
|
+
"dbConnect": "network",
|
|
71
|
+
"dbDisconnect": "network",
|
|
72
|
+
"dbQuery": "network",
|
|
73
|
+
"dbSchema": "network",
|
|
74
|
+
"deleteIconPack": "deck",
|
|
75
|
+
"exec": "processes",
|
|
76
|
+
"extensionInstallFolder": "browser",
|
|
77
|
+
"extensionInstallStore": "browser",
|
|
78
|
+
"extensionPopup": "browser",
|
|
79
|
+
"extensionPopupClose": "browser",
|
|
80
|
+
"extensionReload": "browser",
|
|
81
|
+
"extensionRemove": "browser",
|
|
82
|
+
"extensionSetEnabled": "browser",
|
|
83
|
+
"extensionsList": "browser",
|
|
84
|
+
"fsCopy": "files",
|
|
85
|
+
"fsCreateDir": "files",
|
|
86
|
+
"fsCreateFile": "files",
|
|
87
|
+
"fsDelete": "files",
|
|
88
|
+
"fsDrives": "files",
|
|
89
|
+
"fsFiles": "files",
|
|
90
|
+
"fsFind": "files",
|
|
91
|
+
"fsHash": "files",
|
|
92
|
+
"fsList": "files",
|
|
93
|
+
"fsMove": "files",
|
|
94
|
+
"fsOpen": "files",
|
|
95
|
+
"fsRead": "files",
|
|
96
|
+
"fsReadBytes": "files",
|
|
97
|
+
"fsRename": "files",
|
|
98
|
+
"fsReplace": "files",
|
|
99
|
+
"fsReveal": "files",
|
|
100
|
+
"fsSaveUnique": "files",
|
|
101
|
+
"fsSearch": "files",
|
|
102
|
+
"fsSize": "files",
|
|
103
|
+
"fsThumbnail": "files",
|
|
104
|
+
"fsTrash": "files",
|
|
105
|
+
"fsWrite": "files",
|
|
106
|
+
"fsWriteBytes": "files",
|
|
107
|
+
"ghPrLineComment": "network",
|
|
108
|
+
"ghPrThreads": "network",
|
|
109
|
+
"ghRun": "processes",
|
|
110
|
+
"ghThreadReply": "network",
|
|
111
|
+
"ghThreadResolve": "network",
|
|
112
|
+
"gitAiCommitMsg": "git",
|
|
113
|
+
"gitBlameLine": "git",
|
|
114
|
+
"gitCheckout": "git",
|
|
115
|
+
"gitCheckoutDetach": "git",
|
|
116
|
+
"gitCheckoutNew": "git",
|
|
117
|
+
"gitCheckoutTrack": "git",
|
|
118
|
+
"gitCommitFiles": "git",
|
|
119
|
+
"gitDiscard": "git",
|
|
120
|
+
"gitFileBytes": "git",
|
|
121
|
+
"gitFileDiff": "git",
|
|
122
|
+
"gitInfo": "git",
|
|
123
|
+
"gitLogGraph": "git",
|
|
124
|
+
"gitPoll": "git",
|
|
125
|
+
"gitRangeFiles": "git",
|
|
126
|
+
"gitRefs": "git",
|
|
127
|
+
"gitRepos": "git",
|
|
128
|
+
"gitRun": "git",
|
|
129
|
+
"gitStatus": "git",
|
|
130
|
+
"glabApi": "network",
|
|
131
|
+
"glabRun": "processes",
|
|
132
|
+
"googleAccount": "secrets",
|
|
133
|
+
"googleSignIn": "secrets",
|
|
134
|
+
"googleSignOut": "secrets",
|
|
135
|
+
"googleToken": "secrets",
|
|
136
|
+
"httpCancel": "network",
|
|
137
|
+
"httpSend": "network",
|
|
138
|
+
"httpSendAs": "network",
|
|
139
|
+
"httpSendReply": "network",
|
|
140
|
+
"importIconPack": "deck",
|
|
141
|
+
"installAgentHooks": "terminals",
|
|
142
|
+
"installAgentMcp": "terminals",
|
|
143
|
+
"installAgentSkills": "terminals",
|
|
144
|
+
"installFromRegistry": "deck",
|
|
145
|
+
"launchFiles": "files",
|
|
146
|
+
"listApps": "system",
|
|
147
|
+
"listInstalled": "system",
|
|
148
|
+
"logLatest": "deck",
|
|
149
|
+
"mediaMeta": "files",
|
|
150
|
+
"memKill": "system",
|
|
151
|
+
"openFile": "files",
|
|
152
|
+
"openTestDeck": "deck",
|
|
153
|
+
"procKill": "processes",
|
|
154
|
+
"procStream": "processes",
|
|
155
|
+
"procWrite": "processes",
|
|
156
|
+
"readIconPackTheme": "deck",
|
|
157
|
+
"readTermLayout": "terminals",
|
|
158
|
+
"readTrackMeta": "files",
|
|
159
|
+
"remoteHome": "network",
|
|
160
|
+
"remoteStat": "network",
|
|
161
|
+
"remoteSudoPassword": "secrets",
|
|
162
|
+
"removeLanguage": "deck",
|
|
163
|
+
"restartApp": "deck",
|
|
164
|
+
"runScriptNow": "processes",
|
|
165
|
+
"sessionList": "terminals",
|
|
166
|
+
"setAutostart": "system",
|
|
167
|
+
"setDebugTargets": "processes",
|
|
168
|
+
"setWallpaper": "system",
|
|
169
|
+
"sshHosts": "network",
|
|
170
|
+
"sshTunnelClose": "network",
|
|
171
|
+
"sshTunnelOpen": "network",
|
|
172
|
+
"vaultChangePassword": "secrets",
|
|
173
|
+
"vaultConfig": "secrets",
|
|
174
|
+
"vaultCreate": "secrets",
|
|
175
|
+
"vaultDelete": "secrets",
|
|
176
|
+
"vaultExport": "secrets",
|
|
177
|
+
"vaultFill": "secrets",
|
|
178
|
+
"vaultFillNew": "secrets",
|
|
179
|
+
"vaultGenerate": "secrets",
|
|
180
|
+
"vaultImport": "secrets",
|
|
181
|
+
"vaultList": "secrets",
|
|
182
|
+
"vaultLock": "secrets",
|
|
183
|
+
"vaultMatches": "secrets",
|
|
184
|
+
"vaultNeverList": "secrets",
|
|
185
|
+
"vaultNeverRemove": "secrets",
|
|
186
|
+
"vaultOfferAnswer": "secrets",
|
|
187
|
+
"vaultSave": "secrets",
|
|
188
|
+
"vaultSecret": "secrets",
|
|
189
|
+
"vaultStatus": "secrets",
|
|
190
|
+
"vaultTotp": "secrets",
|
|
191
|
+
"vaultUnlock": "secrets",
|
|
192
|
+
"vpsRunsPull": "network",
|
|
193
|
+
"watchFiles": "files"
|
|
194
|
+
},
|
|
195
|
+
"modules": {
|
|
196
|
+
"terminals": "terminals",
|
|
197
|
+
"p2p": "network"
|
|
198
|
+
},
|
|
199
|
+
"free": [
|
|
200
|
+
"DEFAULT_SETTINGS",
|
|
201
|
+
"FOOTER_ITEMS",
|
|
202
|
+
"configDelete",
|
|
203
|
+
"configRead",
|
|
204
|
+
"configWrite",
|
|
205
|
+
"dataDir",
|
|
206
|
+
"deckReady",
|
|
207
|
+
"dirsDownload",
|
|
208
|
+
"footerOrder",
|
|
209
|
+
"fsHomeDir",
|
|
210
|
+
"getAutostart",
|
|
211
|
+
"isFullscreen",
|
|
212
|
+
"languagesDir",
|
|
213
|
+
"launchUrls",
|
|
214
|
+
"mediaSetNowPlaying",
|
|
215
|
+
"mediaSetPlayback",
|
|
216
|
+
"memUsage",
|
|
217
|
+
"notifyOs",
|
|
218
|
+
"openExternal",
|
|
219
|
+
"pickAnyFile",
|
|
220
|
+
"pickExe",
|
|
221
|
+
"pickFile",
|
|
222
|
+
"pickFolder",
|
|
223
|
+
"pickImage",
|
|
224
|
+
"pickSavePath",
|
|
225
|
+
"pickScript",
|
|
226
|
+
"pluginsDir",
|
|
227
|
+
"revealInFolder",
|
|
228
|
+
"startupMarks",
|
|
229
|
+
"toggleFullscreen"
|
|
230
|
+
]
|
|
231
|
+
}
|
package/shim/bridge.js
CHANGED
|
@@ -32,6 +32,7 @@ export const browserCapture = (...a) => b().browserCapture(...a);
|
|
|
32
32
|
export const browserCdp = (...a) => b().browserCdp(...a);
|
|
33
33
|
export const browserClear = (...a) => b().browserClear(...a);
|
|
34
34
|
export const browserClose = (...a) => b().browserClose(...a);
|
|
35
|
+
export const browserCut = (...a) => b().browserCut(...a);
|
|
35
36
|
export const browserDefaultRegister = (...a) => b().browserDefaultRegister(...a);
|
|
36
37
|
export const browserDefaultStatus = (...a) => b().browserDefaultStatus(...a);
|
|
37
38
|
export const browserDevtools = (...a) => b().browserDevtools(...a);
|
package/shim/p2p.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
// GENERATED by sdk/gen-shim.mjs — do not edit.
|
|
2
|
-
//
|
|
3
|
-
// Deck's live connections to other Decks. Resolved at USE time like the bridge: a plugin module is evaluated
|
|
4
|
-
// during loadPlugins, and a reference copied out at import time would capture a half-built
|
|
5
|
-
// object. One transport for every plugin, so a fix to it reaches all of them.
|
|
6
|
-
import { pluginId } from "./scope.js";
|
|
7
|
-
const t = () => {
|
|
8
|
-
const x = window.__deck?.forPlugin?.(pluginId)?.p2p ?? window.__deck?.p2p;
|
|
9
|
-
if (!x) throw new Error("window.__deck.p2p is missing — this plugin only runs inside Deck");
|
|
10
|
-
return x;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export const cleanCode = (...a) => t().cleanCode(...a);
|
|
14
|
-
export const newCode = (...a) => t().newCode(...a);
|
|
15
|
-
export const selfId = (...a) => t().selfId(...a);
|
|
16
|
-
export const share = (...a) => t().share(...a);
|
|
1
|
+
// GENERATED by sdk/gen-shim.mjs — do not edit.
|
|
2
|
+
//
|
|
3
|
+
// Deck's live connections to other Decks. Resolved at USE time like the bridge: a plugin module is evaluated
|
|
4
|
+
// during loadPlugins, and a reference copied out at import time would capture a half-built
|
|
5
|
+
// object. One transport for every plugin, so a fix to it reaches all of them.
|
|
6
|
+
import { pluginId } from "./scope.js";
|
|
7
|
+
const t = () => {
|
|
8
|
+
const x = window.__deck?.forPlugin?.(pluginId)?.p2p ?? window.__deck?.p2p;
|
|
9
|
+
if (!x) throw new Error("window.__deck.p2p is missing — this plugin only runs inside Deck");
|
|
10
|
+
return x;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const cleanCode = (...a) => t().cleanCode(...a);
|
|
14
|
+
export const newCode = (...a) => t().newCode(...a);
|
|
15
|
+
export const selfId = (...a) => t().selfId(...a);
|
|
16
|
+
export const share = (...a) => t().share(...a);
|
package/shim/terminals.js
CHANGED
|
@@ -16,14 +16,17 @@ export const ZONE_BOARD = (...a) => t().ZONE_BOARD(...a);
|
|
|
16
16
|
export const activeWorkspaceCwd = (...a) => t().activeWorkspaceCwd(...a);
|
|
17
17
|
export const addTabToZone = (...a) => t().addTabToZone(...a);
|
|
18
18
|
export const addToGroup = (...a) => t().addToGroup(...a);
|
|
19
|
+
export const agentSessions = (...a) => t().agentSessions(...a);
|
|
19
20
|
export const applyDtCommand = (...a) => t().applyDtCommand(...a);
|
|
20
21
|
export const applyTerminalLook = (...a) => t().applyTerminalLook(...a);
|
|
21
22
|
export const attach = (...a) => t().attach(...a);
|
|
22
23
|
export const bracketPaste = (...a) => t().bracketPaste(...a);
|
|
23
24
|
export const clearPane = (...a) => t().clearPane(...a);
|
|
24
25
|
export const closeLeaf = (...a) => t().closeLeaf(...a);
|
|
26
|
+
export const closePaneTab = (...a) => t().closePaneTab(...a);
|
|
25
27
|
export const copyFrom = (...a) => t().copyFrom(...a);
|
|
26
28
|
export const destroy = (...a) => t().destroy(...a);
|
|
29
|
+
export const dockWindow = (...a) => t().dockWindow(...a);
|
|
27
30
|
export const findLeaf = (...a) => t().findLeaf(...a);
|
|
28
31
|
export const focusPane = (...a) => t().focusPane(...a);
|
|
29
32
|
export const getInstance = (...a) => t().getInstance(...a);
|
|
@@ -62,10 +65,13 @@ export const publishLayout = (...a) => t().publishLayout(...a);
|
|
|
62
65
|
export const queueInput = (...a) => t().queueInput(...a);
|
|
63
66
|
export const rebindTerminals = (...a) => t().rebindTerminals(...a);
|
|
64
67
|
export const refit = (...a) => t().refit(...a);
|
|
68
|
+
export const reopenTab = (...a) => t().reopenTab(...a);
|
|
65
69
|
export const reorderTab = (...a) => t().reorderTab(...a);
|
|
66
70
|
export const resetPaneModes = (...a) => t().resetPaneModes(...a);
|
|
67
71
|
export const restartPane = (...a) => t().restartPane(...a);
|
|
72
|
+
export const resumeCommand = (...a) => t().resumeCommand(...a);
|
|
68
73
|
export const revealPane = (...a) => t().revealPane(...a);
|
|
74
|
+
export const runningIn = (...a) => t().runningIn(...a);
|
|
69
75
|
export const runsLines = (...a) => t().runsLines(...a);
|
|
70
76
|
export const sendInput = (...a) => t().sendInput(...a);
|
|
71
77
|
export const setGroup = (...a) => t().setGroup(...a);
|
package/template/plugin.json
CHANGED
|
@@ -14,6 +14,8 @@ export interface ConfirmState {
|
|
|
14
14
|
* which in a webview is an OS modal — it steals focus, hides the cursor, and cannot be
|
|
15
15
|
* styled or dismissed with Escape. */
|
|
16
16
|
acknowledge?: boolean;
|
|
17
|
+
/** A "Don't ask again" box beside the buttons: called, after onConfirm, when it was ticked. */
|
|
18
|
+
onDontAsk?: () => void;
|
|
17
19
|
onConfirm: () => void;
|
|
18
20
|
}
|
|
19
21
|
export declare function ConfirmDialog({ state, onClose }: {
|
package/types/components/ui.d.ts
CHANGED
|
@@ -33,8 +33,10 @@ export declare function GhostButton({ children, ...p }: React.ButtonHTMLAttribut
|
|
|
33
33
|
* segmented controls sharing one animate the pill between them — pass a distinct id wherever a
|
|
34
34
|
* screen draws more than one (a per-row control, say). The default keeps the single-control case
|
|
35
35
|
* a one-liner.
|
|
36
|
+
*
|
|
37
|
+
* `fill`: as wide as its parent, the options sharing the room, so a column of them lines up.
|
|
36
38
|
*/
|
|
37
|
-
export declare function Segmented<T extends string>({ value, onChange, options, layoutId, }: {
|
|
39
|
+
export declare function Segmented<T extends string>({ value, onChange, options, layoutId, fill, }: {
|
|
38
40
|
value: T;
|
|
39
41
|
onChange: (v: T) => void;
|
|
40
42
|
options: {
|
|
@@ -42,6 +44,7 @@ export declare function Segmented<T extends string>({ value, onChange, options,
|
|
|
42
44
|
label: string;
|
|
43
45
|
}[];
|
|
44
46
|
layoutId?: string;
|
|
47
|
+
fill?: boolean;
|
|
45
48
|
}): import("react").JSX.Element;
|
|
46
49
|
/** Underlined tabs. `layoutId` behaves as in Segmented above. */
|
|
47
50
|
export declare function Tabs<T extends string>({ value, onChange, options, layoutId, }: {
|
package/types/core/bridge.d.ts
CHANGED
|
@@ -172,7 +172,7 @@ export declare const extensionRemove: (id: string) => Promise<void>;
|
|
|
172
172
|
export declare const extensionPopup: (pane: string, id: string, page: string, right: number, top: number) => Promise<void>;
|
|
173
173
|
export declare const extensionPopupClose: (pane: string) => Promise<void>;
|
|
174
174
|
/** The sites agents may use in the browser without asking. */
|
|
175
|
-
export declare const browserAgentConfig: (sites: string[]) => Promise<void>;
|
|
175
|
+
export declare const browserAgentConfig: (sites: string[], any?: boolean) => Promise<void>;
|
|
176
176
|
/** The user's answer to an agent's question about a site. */
|
|
177
177
|
export declare const browserAgentAnswer: (id: number, site: string, allow: boolean, forGood: boolean) => Promise<void>;
|
|
178
178
|
/** A DevTools protocol call on a browser pane's page, and its answer. */
|
|
@@ -208,6 +208,8 @@ export declare const browserDownload: (id: number, action: "pause" | "resume" |
|
|
|
208
208
|
/** Find in the pane's page: start a search, step through its matches, or stop (clearing them). */
|
|
209
209
|
export declare const browserFind: (pane: string, action: "start" | "next" | "prev" | "stop", term?: string, matchCase?: boolean) => Promise<void>;
|
|
210
210
|
export declare const browserCapture: (pane: string) => Promise<ArrayBuffer>;
|
|
211
|
+
/** Cut these boxes, each [x, y, w, h, corner radius] in physical px from the page's corner, out of a pane's page window, `w`×`h` its size; none gives it back whole. */
|
|
212
|
+
export declare const browserCut: (pane: string, w: number, h: number, cuts: number[][]) => Promise<void>;
|
|
211
213
|
export interface AppProc {
|
|
212
214
|
name: string;
|
|
213
215
|
title: string;
|
|
@@ -265,10 +267,54 @@ export interface Settings {
|
|
|
265
267
|
tabSqueeze?: boolean;
|
|
266
268
|
/** A title-bar tab's full width in px (120 to 320, 160 when unset): its width, or with tabSqueeze the most it narrows from. */
|
|
267
269
|
tabWidth?: number;
|
|
270
|
+
/**
|
|
271
|
+
* Where things that arrive from outside open (Settings → Where things open). A floating window
|
|
272
|
+
* leaves the main window's tab as it was; a tab takes its place, as before floating windows.
|
|
273
|
+
* - openLinksIn: a link another program opens with Deck as the default browser ("float" unset).
|
|
274
|
+
* - openAgentPagesIn: a page an agent opens ("float-background" unset).
|
|
275
|
+
* - openFilesIn: a file opened with Deck from Explorer that opens in a plugin or the browser
|
|
276
|
+
* ("float" unset); one for the Editor goes to the Editor either way.
|
|
277
|
+
*/
|
|
278
|
+
openLinksIn?: "float" | "float-background" | "tab";
|
|
279
|
+
openAgentPagesIn?: "float-background" | "tab";
|
|
280
|
+
openFilesIn?: "float" | "tab";
|
|
281
|
+
/**
|
|
282
|
+
* A file for the Editor opened with Deck from Explorer ("tab" unset: the project's Editor, in the
|
|
283
|
+
* main window brought forward). "float": an Editor of its own in a floating window, as a file
|
|
284
|
+
* Ctrl+clicked in a terminal can open.
|
|
285
|
+
*/
|
|
286
|
+
openCodeFilesIn?: "tab" | "float";
|
|
287
|
+
/**
|
|
288
|
+
* More of the same, for what you open yourself but only look at (Settings → Where things open):
|
|
289
|
+
* - openTerminalLinksIn: an address Ctrl+clicked in a terminal, with browserTerminalLinks "deck"
|
|
290
|
+
* ("float" unset: the "links" window).
|
|
291
|
+
* - openDocsIn: a Docs page opened from Settings ("float" unset; Settings stays open).
|
|
292
|
+
* - openCommitsIn: a commit opened from the Editor's blame ("float" unset).
|
|
293
|
+
* - agentTerminals: a terminal tab or project an agent makes ("background" unset: added without
|
|
294
|
+
* switching to it, its shell started anyway so the agent can use it; "switch" goes to it).
|
|
295
|
+
*/
|
|
296
|
+
openTerminalLinksIn?: "float" | "tab";
|
|
297
|
+
/**
|
|
298
|
+
* A file path Ctrl+clicked in a terminal ("tab" unset: the Editor's tab, or the tab its type
|
|
299
|
+
* opens in). "float": an Editor of its own in a floating window, the project's left where it is;
|
|
300
|
+
* a type that opens elsewhere (a .pdf) in the "links" window.
|
|
301
|
+
*/
|
|
302
|
+
openTerminalFilesIn?: "tab" | "float";
|
|
303
|
+
/** The same, per extension (".md"), over `openTerminalFilesIn`. */
|
|
304
|
+
openTerminalFilesByExt?: Record<string, "tab" | "float">;
|
|
305
|
+
openDocsIn?: "float" | "tab";
|
|
306
|
+
openCommitsIn?: "float" | "tab";
|
|
307
|
+
agentTerminals?: "background" | "switch";
|
|
268
308
|
/** Each project's own colour on the sidebar's collapsed rail. Off, they are all one grey. */
|
|
269
309
|
projectColours?: boolean;
|
|
270
310
|
/** Agents listed under their workspace in the sidebar: under every one (default), only the open one, or none. */
|
|
271
311
|
sidebarAgents?: "all" | "open" | "off";
|
|
312
|
+
/**
|
|
313
|
+
* Closing a tab, a group's tabs or a terminal pane (or restarting or replacing one) asks first:
|
|
314
|
+
* only when something is running in it besides the shell ("running", unset), every time, or
|
|
315
|
+
* never ("Don't ask again" in the question sets this).
|
|
316
|
+
*/
|
|
317
|
+
askBeforeClose?: "running" | "always" | "never";
|
|
272
318
|
/** The workspace sidebar is a button in the title bar that opens it over the panes, rather than a column. */
|
|
273
319
|
sidebarMenu?: boolean;
|
|
274
320
|
/** Pane controls float over the pane's top-right corner on hover, instead of a header row. */
|
|
@@ -383,6 +429,11 @@ export interface Settings {
|
|
|
383
429
|
/** Sleeping tabs: a browser tab out of sight this many minutes stops running until it is shown. */
|
|
384
430
|
browserSleep: boolean;
|
|
385
431
|
browserSleepAfter: number;
|
|
432
|
+
/**
|
|
433
|
+
* A page stays live under Deck's menus and cards, which are cut out of its window (unset: on).
|
|
434
|
+
* Off, a covered page is a blurred picture of itself, for a machine where the cut does not show.
|
|
435
|
+
*/
|
|
436
|
+
browserLiveCovers?: boolean;
|
|
386
437
|
/** Whether pages are asked for light or dark to match Deck's theme ("deck") or Windows'. */
|
|
387
438
|
browserPageTheme?: "deck" | "windows";
|
|
388
439
|
/** App links opened without asking, as "<site origin> <scheme>" ("https://zoom.us zoommtg"). */
|
|
@@ -391,6 +442,8 @@ export interface Settings {
|
|
|
391
442
|
browserDefaultAsk?: boolean;
|
|
392
443
|
/** Sites (by host) an agent may use in the browser without asking; localhost and files always. */
|
|
393
444
|
browserAgentSites: string[];
|
|
445
|
+
/** Agents may use any site without being asked (signing in still asks). Off by default. */
|
|
446
|
+
browserAgentAnySite: boolean;
|
|
394
447
|
/**
|
|
395
448
|
* Where a file type opens, by extension (".pdf"): "editor", "browser" or "plugin:<id>". A type
|
|
396
449
|
* not listed is Automatic (see `openerFor` in fileview.ts).
|
package/types/core/browser.d.ts
CHANGED
|
@@ -136,10 +136,22 @@ export declare const takeWaitingUrl: () => {
|
|
|
136
136
|
} | undefined;
|
|
137
137
|
/** A new browser tab, on `url` or on the start page. */
|
|
138
138
|
export declare const newBrowserTab: (url?: string, isPrivate?: boolean) => boolean | void;
|
|
139
|
+
/**
|
|
140
|
+
* A browser tab on `url` in a floating window, so the main window's view stays (Terminals'
|
|
141
|
+
* deck-open-float, core/floatwin.ts openInFloat): `name` the window that collects them ("links"
|
|
142
|
+
* from other programs, "agent" for an agent's pages), `beside` the window a pane is in.
|
|
143
|
+
*/
|
|
144
|
+
export declare function browserInFloat(url: string, where: {
|
|
145
|
+
name?: string;
|
|
146
|
+
beside?: string;
|
|
147
|
+
focus?: boolean;
|
|
148
|
+
}, isPrivate?: boolean): void;
|
|
139
149
|
/** Read once, before the first browser pane asks. */
|
|
140
150
|
export declare const loadPanes: () => Promise<void>;
|
|
141
151
|
/** The page a pane was on when Deck last closed. */
|
|
142
152
|
export declare const savedPage: (pane: string) => string | undefined;
|
|
153
|
+
/** The page a pane should open on, as a restarted Deck reopens one: a closed tab reopened. */
|
|
154
|
+
export declare function seedPage(pane: string, url: string): void;
|
|
143
155
|
/** How Ctrl+Shift+B shows or hides the bookmarks bar: set by the browser pane, which holds the settings. */
|
|
144
156
|
export declare const setBarToggle: (f: () => void) => void;
|
|
145
157
|
/** Bookmark the pane's page, as its star does: Ctrl+D, and the browser menu. */
|
package/types/core/fileview.d.ts
CHANGED
|
@@ -52,7 +52,7 @@ export declare const fileUrl: (path: string) => string;
|
|
|
52
52
|
* Open `path` where its type opens (`openerFor`), as a tab of its own. False when that is the
|
|
53
53
|
* Editor, which the caller opens it in. Every way Deck opens a file asks this first.
|
|
54
54
|
*/
|
|
55
|
-
export declare function openByType(path: string, hint?: Opener): boolean;
|
|
55
|
+
export declare function openByType(path: string, hint?: Opener, float?: string): boolean;
|
|
56
56
|
/**
|
|
57
57
|
* Everywhere `path` can open in Deck, for an Open with menu: the Editor, the browser (its types,
|
|
58
58
|
* on this PC), and each plugin that opens its type, named for the menu.
|
|
@@ -65,4 +65,8 @@ export declare function openersFor(path: string): {
|
|
|
65
65
|
* Open `path` in `to` whatever the Files tab says, for an Open with menu. False for the Editor,
|
|
66
66
|
* which the caller opens it in (terminals' openInEditor).
|
|
67
67
|
*/
|
|
68
|
-
|
|
68
|
+
/**
|
|
69
|
+
* `float`: in the floating window of that name (Terminals' deck-open-float) rather than as a tab
|
|
70
|
+
* of the main window, for a file another program handed Deck.
|
|
71
|
+
*/
|
|
72
|
+
export declare function openIn(path: string, to: Opener, float?: string): boolean;
|
|
@@ -26,6 +26,8 @@ export interface Notif {
|
|
|
26
26
|
key?: string;
|
|
27
27
|
/** The workspace an agent notification is about: a click goes there. */
|
|
28
28
|
wsId?: string;
|
|
29
|
+
/** The agent's pane: a click goes to it (its tab, and its window if that is a float), else wsId. */
|
|
30
|
+
pane?: string;
|
|
29
31
|
/** Where a click on the card itself goes, when it is not about a workspace. */
|
|
30
32
|
nav?: string;
|
|
31
33
|
/** Who posted it, shown beside the time: a plugin's name. */
|
package/types/core/p2p.d.ts
CHANGED
|
@@ -1,117 +1,117 @@
|
|
|
1
|
-
// GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
|
|
2
|
-
/** What can travel: anything JSON can carry. */
|
|
3
|
-
export type Json = string | number | boolean | null | Json[] | {
|
|
4
|
-
[k: string]: Json;
|
|
5
|
-
};
|
|
6
|
-
/** Whether someone may change what is shared, or only watch. */
|
|
7
|
-
export type Mode = "edit" | "view";
|
|
8
|
-
/** Who may change things: a default for everyone, and a choice per person that wins over it. */
|
|
9
|
-
export interface Roles {
|
|
10
|
-
def: Mode;
|
|
11
|
-
per: Record<string, Mode>;
|
|
12
|
-
}
|
|
13
|
-
/** Why a share ended for a joiner: the host stopped, vanished, removed this Deck, turned it away,
|
|
14
|
-
* or speaks another version. */
|
|
15
|
-
export type Gone = "ended" | "lost" | "removed" | "denied" | "version";
|
|
16
|
-
export interface Person {
|
|
17
|
-
id: string;
|
|
18
|
-
name: string; /** Round trip in ms, once measured. */
|
|
19
|
-
ms?: number;
|
|
20
|
-
}
|
|
21
|
-
/** What a share's bar and dialogs show. Replaced, never mutated, so React sees a change. */
|
|
22
|
-
export interface ShareView {
|
|
23
|
-
/** Who is in and connected: on the host, everyone let in; on a joiner, the host and the others. */
|
|
24
|
-
peers: Person[];
|
|
25
|
-
/** On the host: who is asking to be let in. */
|
|
26
|
-
knocking: Person[];
|
|
27
|
-
/** On a joiner: the host is there but has not let this Deck in yet. */
|
|
28
|
-
waiting: boolean;
|
|
29
|
-
/** On a joiner: no host heard from for a while (wrong code, or a network that blocks it). */
|
|
30
|
-
stuck: boolean;
|
|
31
|
-
gone: Gone | null;
|
|
32
|
-
hostName: string;
|
|
33
|
-
/** A passing line: someone on another version, or whatever the plugin `say`s. */
|
|
34
|
-
note: string;
|
|
35
|
-
roles: Roles;
|
|
36
|
-
/** Whether this Deck may change things. */
|
|
37
|
-
canEdit: boolean;
|
|
38
|
-
}
|
|
39
|
-
export interface ShareOptions {
|
|
40
|
-
/** What the share is for, e.g. "canvas-share". Decks only meet others using the same one. */
|
|
41
|
-
app: string;
|
|
42
|
-
/** The share code, which names the room (see newCode). */
|
|
43
|
-
code: string;
|
|
44
|
-
/** Optional extra secret, needed with the code to connect at all. Sharing works without one. */
|
|
45
|
-
password?: string;
|
|
46
|
-
/** The plugin's message channel, at most 12 bytes (Trystero's cap). Defaults to "msg". */
|
|
47
|
-
channel?: string;
|
|
48
|
-
/** Whether this Deck is the one sharing. */
|
|
49
|
-
host: boolean;
|
|
50
|
-
/** Shown to the others: in the host's knock, on cursors, in the list of who is here. */
|
|
51
|
-
name: string;
|
|
52
|
-
/** The plugin's own protocol version. Decks on different versions do not share. */
|
|
53
|
-
version: number;
|
|
54
|
-
/** The host's default for who may change things. Joiners may until the host says otherwise. */
|
|
55
|
-
mode?: Mode;
|
|
56
|
-
}
|
|
57
|
-
export interface ShareHandlers<T> {
|
|
58
|
-
/** A plugin message, only ever from someone let in (and the host). Check `mayEdit(peer)` before
|
|
59
|
-
* applying a change: a view-only person's edits are to be dropped by every Deck. */
|
|
60
|
-
message: (msg: T, peer: string) => void;
|
|
61
|
-
/** On the host: someone was just let in. Send them what they need to start, e.g. the board. */
|
|
62
|
-
welcome?: (peer: string) => void;
|
|
63
|
-
/** Someone left or was removed: forget what was kept for them (a cursor). */
|
|
64
|
-
left?: (peer: string) => void;
|
|
65
|
-
}
|
|
66
|
-
export interface P2pShare<T> {
|
|
67
|
-
readonly host: boolean;
|
|
68
|
-
/** Send a plugin message to everyone let in, or to one of them. Sends nothing before this Deck is
|
|
69
|
-
* let in. Settles once handed to the connection, so awaiting it paces the sender. */
|
|
70
|
-
send(msg: T, to?: string): Promise<void>;
|
|
71
|
-
/** Whether a peer may change things: the host always, anyone else by the roles. */
|
|
72
|
-
mayEdit(peer: string): boolean;
|
|
73
|
-
/** The host: let someone in, or turn them away. */
|
|
74
|
-
allow(peer: string): void;
|
|
75
|
-
deny(peer: string): void;
|
|
76
|
-
/** The host: remove someone who was let in. They cannot come back with the same Deck. */
|
|
77
|
-
kick(peer: string): void;
|
|
78
|
-
/** The host: everyone's default, and one person's own choice (`null` follows the default). */
|
|
79
|
-
setDefault(mode: Mode): void;
|
|
80
|
-
setPerson(peer: string, mode: Mode | null): void;
|
|
81
|
-
/** Show a passing line in the view for a few seconds. */
|
|
82
|
-
say(note: string): void;
|
|
83
|
-
/** Leave. With `announce` (the host ending on purpose) everyone is told first, so they end at
|
|
84
|
-
* once rather than when the connection times out. Safe to call twice. */
|
|
85
|
-
close(announce?: boolean): Promise<void>;
|
|
86
|
-
/** For useSyncExternalStore. */
|
|
87
|
-
subscribe(fn: () => void): () => void;
|
|
88
|
-
getView(): ShareView;
|
|
89
|
-
}
|
|
90
|
-
/** The part of a Trystero room a share uses: a seam, so the check can run a share without a network. */
|
|
91
|
-
export interface RoomLike {
|
|
92
|
-
/** This Deck's id in the room; Trystero's own is `selfId()`. */
|
|
93
|
-
selfId?: string;
|
|
94
|
-
makeAction(name: string, config: {
|
|
95
|
-
onMessage: (data: any, ctx: {
|
|
96
|
-
peerId: string;
|
|
97
|
-
}) => void;
|
|
98
|
-
}): {
|
|
99
|
-
send(data: any, options?: {
|
|
100
|
-
target?: string | string[];
|
|
101
|
-
}): Promise<void>;
|
|
102
|
-
};
|
|
103
|
-
ping(peer: string): Promise<number>;
|
|
104
|
-
leave(): Promise<void>;
|
|
105
|
-
getPeers(): Record<string, unknown>;
|
|
106
|
-
onPeerJoin: ((peer: string) => void) | null;
|
|
107
|
-
onPeerLeave: ((peer: string) => void) | null;
|
|
108
|
-
}
|
|
109
|
-
/** This Deck's id in every share: the one the others know it by. The same for the whole session,
|
|
110
|
-
* so someone let in who rejoins after a dropped connection is let straight back in. */
|
|
111
|
-
export declare function selfId(): string;
|
|
112
|
-
/** Start sharing (`host`), or ask to join someone's share. */
|
|
113
|
-
export declare function share<T extends Json>(opts: ShareOptions, on: ShareHandlers<T>, room?: RoomLike): P2pShare<T>;
|
|
114
|
-
/** A share code: 16 random characters in four groups, easy to read out or paste. */
|
|
115
|
-
export declare function newCode(random?: (n: number) => Uint8Array): string;
|
|
116
|
-
/** A pasted code, tidied: spaces dropped, case folded. Empty when it is not a code. */
|
|
117
|
-
export declare function cleanCode(text: string): string;
|
|
1
|
+
// GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
|
|
2
|
+
/** What can travel: anything JSON can carry. */
|
|
3
|
+
export type Json = string | number | boolean | null | Json[] | {
|
|
4
|
+
[k: string]: Json;
|
|
5
|
+
};
|
|
6
|
+
/** Whether someone may change what is shared, or only watch. */
|
|
7
|
+
export type Mode = "edit" | "view";
|
|
8
|
+
/** Who may change things: a default for everyone, and a choice per person that wins over it. */
|
|
9
|
+
export interface Roles {
|
|
10
|
+
def: Mode;
|
|
11
|
+
per: Record<string, Mode>;
|
|
12
|
+
}
|
|
13
|
+
/** Why a share ended for a joiner: the host stopped, vanished, removed this Deck, turned it away,
|
|
14
|
+
* or speaks another version. */
|
|
15
|
+
export type Gone = "ended" | "lost" | "removed" | "denied" | "version";
|
|
16
|
+
export interface Person {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string; /** Round trip in ms, once measured. */
|
|
19
|
+
ms?: number;
|
|
20
|
+
}
|
|
21
|
+
/** What a share's bar and dialogs show. Replaced, never mutated, so React sees a change. */
|
|
22
|
+
export interface ShareView {
|
|
23
|
+
/** Who is in and connected: on the host, everyone let in; on a joiner, the host and the others. */
|
|
24
|
+
peers: Person[];
|
|
25
|
+
/** On the host: who is asking to be let in. */
|
|
26
|
+
knocking: Person[];
|
|
27
|
+
/** On a joiner: the host is there but has not let this Deck in yet. */
|
|
28
|
+
waiting: boolean;
|
|
29
|
+
/** On a joiner: no host heard from for a while (wrong code, or a network that blocks it). */
|
|
30
|
+
stuck: boolean;
|
|
31
|
+
gone: Gone | null;
|
|
32
|
+
hostName: string;
|
|
33
|
+
/** A passing line: someone on another version, or whatever the plugin `say`s. */
|
|
34
|
+
note: string;
|
|
35
|
+
roles: Roles;
|
|
36
|
+
/** Whether this Deck may change things. */
|
|
37
|
+
canEdit: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface ShareOptions {
|
|
40
|
+
/** What the share is for, e.g. "canvas-share". Decks only meet others using the same one. */
|
|
41
|
+
app: string;
|
|
42
|
+
/** The share code, which names the room (see newCode). */
|
|
43
|
+
code: string;
|
|
44
|
+
/** Optional extra secret, needed with the code to connect at all. Sharing works without one. */
|
|
45
|
+
password?: string;
|
|
46
|
+
/** The plugin's message channel, at most 12 bytes (Trystero's cap). Defaults to "msg". */
|
|
47
|
+
channel?: string;
|
|
48
|
+
/** Whether this Deck is the one sharing. */
|
|
49
|
+
host: boolean;
|
|
50
|
+
/** Shown to the others: in the host's knock, on cursors, in the list of who is here. */
|
|
51
|
+
name: string;
|
|
52
|
+
/** The plugin's own protocol version. Decks on different versions do not share. */
|
|
53
|
+
version: number;
|
|
54
|
+
/** The host's default for who may change things. Joiners may until the host says otherwise. */
|
|
55
|
+
mode?: Mode;
|
|
56
|
+
}
|
|
57
|
+
export interface ShareHandlers<T> {
|
|
58
|
+
/** A plugin message, only ever from someone let in (and the host). Check `mayEdit(peer)` before
|
|
59
|
+
* applying a change: a view-only person's edits are to be dropped by every Deck. */
|
|
60
|
+
message: (msg: T, peer: string) => void;
|
|
61
|
+
/** On the host: someone was just let in. Send them what they need to start, e.g. the board. */
|
|
62
|
+
welcome?: (peer: string) => void;
|
|
63
|
+
/** Someone left or was removed: forget what was kept for them (a cursor). */
|
|
64
|
+
left?: (peer: string) => void;
|
|
65
|
+
}
|
|
66
|
+
export interface P2pShare<T> {
|
|
67
|
+
readonly host: boolean;
|
|
68
|
+
/** Send a plugin message to everyone let in, or to one of them. Sends nothing before this Deck is
|
|
69
|
+
* let in. Settles once handed to the connection, so awaiting it paces the sender. */
|
|
70
|
+
send(msg: T, to?: string): Promise<void>;
|
|
71
|
+
/** Whether a peer may change things: the host always, anyone else by the roles. */
|
|
72
|
+
mayEdit(peer: string): boolean;
|
|
73
|
+
/** The host: let someone in, or turn them away. */
|
|
74
|
+
allow(peer: string): void;
|
|
75
|
+
deny(peer: string): void;
|
|
76
|
+
/** The host: remove someone who was let in. They cannot come back with the same Deck. */
|
|
77
|
+
kick(peer: string): void;
|
|
78
|
+
/** The host: everyone's default, and one person's own choice (`null` follows the default). */
|
|
79
|
+
setDefault(mode: Mode): void;
|
|
80
|
+
setPerson(peer: string, mode: Mode | null): void;
|
|
81
|
+
/** Show a passing line in the view for a few seconds. */
|
|
82
|
+
say(note: string): void;
|
|
83
|
+
/** Leave. With `announce` (the host ending on purpose) everyone is told first, so they end at
|
|
84
|
+
* once rather than when the connection times out. Safe to call twice. */
|
|
85
|
+
close(announce?: boolean): Promise<void>;
|
|
86
|
+
/** For useSyncExternalStore. */
|
|
87
|
+
subscribe(fn: () => void): () => void;
|
|
88
|
+
getView(): ShareView;
|
|
89
|
+
}
|
|
90
|
+
/** The part of a Trystero room a share uses: a seam, so the check can run a share without a network. */
|
|
91
|
+
export interface RoomLike {
|
|
92
|
+
/** This Deck's id in the room; Trystero's own is `selfId()`. */
|
|
93
|
+
selfId?: string;
|
|
94
|
+
makeAction(name: string, config: {
|
|
95
|
+
onMessage: (data: any, ctx: {
|
|
96
|
+
peerId: string;
|
|
97
|
+
}) => void;
|
|
98
|
+
}): {
|
|
99
|
+
send(data: any, options?: {
|
|
100
|
+
target?: string | string[];
|
|
101
|
+
}): Promise<void>;
|
|
102
|
+
};
|
|
103
|
+
ping(peer: string): Promise<number>;
|
|
104
|
+
leave(): Promise<void>;
|
|
105
|
+
getPeers(): Record<string, unknown>;
|
|
106
|
+
onPeerJoin: ((peer: string) => void) | null;
|
|
107
|
+
onPeerLeave: ((peer: string) => void) | null;
|
|
108
|
+
}
|
|
109
|
+
/** This Deck's id in every share: the one the others know it by. The same for the whole session,
|
|
110
|
+
* so someone let in who rejoins after a dropped connection is let straight back in. */
|
|
111
|
+
export declare function selfId(): string;
|
|
112
|
+
/** Start sharing (`host`), or ask to join someone's share. */
|
|
113
|
+
export declare function share<T extends Json>(opts: ShareOptions, on: ShareHandlers<T>, room?: RoomLike): P2pShare<T>;
|
|
114
|
+
/** A share code: 16 random characters in four groups, easy to read out or paste. */
|
|
115
|
+
export declare function newCode(random?: (n: number) => Uint8Array): string;
|
|
116
|
+
/** A pasted code, tidied: spaces dropped, case folded. Empty when it is not a code. */
|
|
117
|
+
export declare function cleanCode(text: string): string;
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
// GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
|
|
2
|
-
import { type Settings } from "./bridge";
|
|
3
|
-
/** Called by Settings after every write, so readers update without a reload. */
|
|
4
|
-
export declare function publishSettings(s: Settings): void;
|
|
5
|
-
/**
|
|
6
|
-
* Write settings and apply everything that has to happen alongside the write.
|
|
7
|
-
*
|
|
8
|
-
* Settings' own persist() used to be the only path, so anything outside that module (the
|
|
9
|
-
* command palette toggling relay, say) would have had to repeat five steps and would break
|
|
10
|
-
* quietly when one of them changed. Settings still owns its local form state and calls this
|
|
11
|
-
* for the shared half.
|
|
12
|
-
*/
|
|
13
|
-
export declare function saveSettings(next: Settings): void;
|
|
14
|
-
/** The zoom steps Ctrl+= and Ctrl+- move through, in percent, as a browser's do. */
|
|
15
|
-
export declare const ZOOM_STEPS: number[];
|
|
16
|
-
/**
|
|
17
|
-
* Zoom the whole window: the webview's own zoom, the same as a browser's Ctrl+=, rather than CSS
|
|
18
|
-
* `zoom`, which leaves xterm and Monaco measuring the mouse in unzoomed pixels.
|
|
19
|
-
*/
|
|
20
|
-
export declare function applyZoom(pct: number | undefined): void;
|
|
21
|
-
/** One step in or out from the current zoom, or back to 100% with dir 0. Saved like any setting. */
|
|
22
|
-
export declare function stepZoom(dir: -1 | 0 | 1): void;
|
|
23
|
-
/** Current settings for non-React callers (the palette's providers). */
|
|
24
|
-
export declare const getSettings: () => Settings;
|
|
25
|
-
export declare function userName(): Promise<string>;
|
|
26
|
-
export declare function useSettings(): Settings;
|
|
1
|
+
// GENERATED by sdk/gen-types.mjs from Deck's source — do not edit.
|
|
2
|
+
import { type Settings } from "./bridge";
|
|
3
|
+
/** Called by Settings after every write, so readers update without a reload. */
|
|
4
|
+
export declare function publishSettings(s: Settings): void;
|
|
5
|
+
/**
|
|
6
|
+
* Write settings and apply everything that has to happen alongside the write.
|
|
7
|
+
*
|
|
8
|
+
* Settings' own persist() used to be the only path, so anything outside that module (the
|
|
9
|
+
* command palette toggling relay, say) would have had to repeat five steps and would break
|
|
10
|
+
* quietly when one of them changed. Settings still owns its local form state and calls this
|
|
11
|
+
* for the shared half.
|
|
12
|
+
*/
|
|
13
|
+
export declare function saveSettings(next: Settings): void;
|
|
14
|
+
/** The zoom steps Ctrl+= and Ctrl+- move through, in percent, as a browser's do. */
|
|
15
|
+
export declare const ZOOM_STEPS: number[];
|
|
16
|
+
/**
|
|
17
|
+
* Zoom the whole window: the webview's own zoom, the same as a browser's Ctrl+=, rather than CSS
|
|
18
|
+
* `zoom`, which leaves xterm and Monaco measuring the mouse in unzoomed pixels.
|
|
19
|
+
*/
|
|
20
|
+
export declare function applyZoom(pct: number | undefined): void;
|
|
21
|
+
/** One step in or out from the current zoom, or back to 100% with dir 0. Saved like any setting. */
|
|
22
|
+
export declare function stepZoom(dir: -1 | 0 | 1): void;
|
|
23
|
+
/** Current settings for non-React callers (the palette's providers). */
|
|
24
|
+
export declare const getSettings: () => Settings;
|
|
25
|
+
export declare function userName(): Promise<string>;
|
|
26
|
+
export declare function useSettings(): Settings;
|
|
@@ -20,9 +20,11 @@ export interface TermPath {
|
|
|
20
20
|
* The shortest extent comes first, so a caller that only wants the unambiguous reading can take
|
|
21
21
|
* the first candidate per `start` and never consult the filesystem.
|
|
22
22
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
23
|
+
* One line of text: a path wrapped over several rows is found once `joinRows` has put them back
|
|
24
|
+
* together.
|
|
25
|
+
*
|
|
26
|
+
* ponytail: a relative path resolves against the cwd the pane SPAWNED with, so it is wrong after a
|
|
27
|
+
* `cd`. Absolute paths — what Claude Code and most tools print — are unaffected.
|
|
26
28
|
*
|
|
27
29
|
* ponytail: only the END of a path can be recovered this way. A RELATIVE path whose first segment
|
|
28
30
|
* contains a space ("My Docs\a.txt") is anchored at "Docs\a.txt", because the match can only
|
|
@@ -43,3 +45,41 @@ export declare function findPaths(row: string, cwd: string): TermPath[];
|
|
|
43
45
|
* land on either.
|
|
44
46
|
*/
|
|
45
47
|
export declare function chooseLinks(candidates: readonly TermPath[], exists: readonly boolean[]): TermPath[];
|
|
48
|
+
/**
|
|
49
|
+
* A Windows path not found as printed, with a backslash put back that Markdown took out. Claude
|
|
50
|
+
* Code renders its output as Markdown, where `\.` and `\_` mean a plain dot and underscore, so
|
|
51
|
+
* "review-repo\.gitattributes" is shown as "review-repo.gitattributes". One reading per dot or
|
|
52
|
+
* underscore that follows a name character, each to be tried on disk.
|
|
53
|
+
*/
|
|
54
|
+
export declare function unescapedReadings(path: string): string[];
|
|
55
|
+
/** A row of the screen: its text (trailing blanks kept), and whether xterm wrapped it onto the row before. */
|
|
56
|
+
export interface Row {
|
|
57
|
+
text: string;
|
|
58
|
+
wrapped: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The line row `at` is part of, read back as one: rows xterm wrapped itself (a shell's long line),
|
|
62
|
+
* and rows a program broke where a path ran out of room. Claude Code wraps its own output, a hard
|
|
63
|
+
* line break with the rest indented under it, so xterm knows nothing of that wrap: a row and the
|
|
64
|
+
* next are taken as a path broken in two when the words either side of the break look like one
|
|
65
|
+
* (see `broken`), and they join without the break or the indent. `cells[i]` is where character `i`
|
|
66
|
+
* of the text is on screen: its row (an index into `rows`) and column. At most `reach` rows each way.
|
|
67
|
+
*
|
|
68
|
+
* A list of paths, one a row, joins too: only the filesystem can tell it from one path broken in
|
|
69
|
+
* two, which is why the terminal also offers the row on its own.
|
|
70
|
+
*/
|
|
71
|
+
export declare function joinRows(rows: readonly Row[], at: number, reach?: number): {
|
|
72
|
+
text: string;
|
|
73
|
+
cells: [number, number][];
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Every path candidate on row `at`, also one wrapped over the rows around it. A join xterm made is
|
|
77
|
+
* certain, but one at a break (`broken`) is a guess: a path can end a row with the next row's words
|
|
78
|
+
* glued on, so the joined line (`joinRows`) is read cut at each such break as well, every span of
|
|
79
|
+
* it that holds row `at`. Starts are indices into `text`, ascending, ready for `chooseLinks`;
|
|
80
|
+
* `cells` says where each is on screen.
|
|
81
|
+
*/
|
|
82
|
+
export declare function rowPaths(rows: readonly Row[], at: number, cwd: string): {
|
|
83
|
+
cands: TermPath[];
|
|
84
|
+
cells: [number, number][];
|
|
85
|
+
};
|
|
@@ -51,6 +51,12 @@ export interface LayoutTab {
|
|
|
51
51
|
* where it was).
|
|
52
52
|
*/
|
|
53
53
|
window?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Opened straight into a floating window by Deck (openInFloat: a link, a page an agent opened, a
|
|
56
|
+
* file Ctrl+clicked in a terminal), so closing that window closes it rather than docking it into
|
|
57
|
+
* the main window. Dropped the moment the tab is moved by hand: then it is one of yours.
|
|
58
|
+
*/
|
|
59
|
+
transient?: true;
|
|
54
60
|
}
|
|
55
61
|
export interface LayoutWorkspace {
|
|
56
62
|
id: string;
|
|
@@ -71,6 +77,8 @@ export interface FloatBounds {
|
|
|
71
77
|
w: number;
|
|
72
78
|
h: number;
|
|
73
79
|
max?: boolean;
|
|
80
|
+
/** A window things are sent to by name (core/floatwin.ts openInFloat): "links", "agent". */
|
|
81
|
+
name?: string;
|
|
74
82
|
}
|
|
75
83
|
export interface Layout {
|
|
76
84
|
workspaces: LayoutWorkspace[];
|
|
@@ -203,6 +211,15 @@ export declare function moveTabToZone(tabs: readonly LayoutTab[], tabId: string,
|
|
|
203
211
|
* result is right even for a zone that is not the active one.
|
|
204
212
|
*/
|
|
205
213
|
export declare function addTabToZone(tabs: readonly LayoutTab[], besideId: string, tab: LayoutTab): LayoutTab[];
|
|
214
|
+
/**
|
|
215
|
+
* A closed tab put back in workspace `w` (core/closedtabs.ts): in front in the zone you are in,
|
|
216
|
+
* with new ids for the tab and its panes, since the old panes' shells and state are gone. Out of
|
|
217
|
+
* any group and any window it was in. Returns the workspace and each old pane's new id.
|
|
218
|
+
*/
|
|
219
|
+
export declare function reopenTab(w: LayoutWorkspace, tab: LayoutTab, fresh?: () => string): {
|
|
220
|
+
w: LayoutWorkspace;
|
|
221
|
+
ids: Record<string, string>;
|
|
222
|
+
};
|
|
206
223
|
/**
|
|
207
224
|
* Make a workspace's active tab the one its zone shows.
|
|
208
225
|
*
|
|
@@ -232,6 +249,13 @@ export declare function setTabWindow(w: LayoutWorkspace, tabId: string, win: str
|
|
|
232
249
|
* since a window holds one project's tabs.
|
|
233
250
|
*/
|
|
234
251
|
export declare function mergeWindow(l: Layout, from: string, into: string | null): Layout;
|
|
252
|
+
/**
|
|
253
|
+
* Close floating window `id` into the main window: its tabs go back to their zones, each behind the
|
|
254
|
+
* tab its zone shows, so closing a window does not take you away from the tab you are on. With
|
|
255
|
+
* `discard` (its X, Alt+F4), the tabs Deck opened into it (`transient`) close instead; the caller
|
|
256
|
+
* destroys their panes.
|
|
257
|
+
*/
|
|
258
|
+
export declare function dockWindow(l: Layout, id: string, discard?: boolean): Layout;
|
|
235
259
|
/** The first free spot on the top row, for a zone created without a position of its own. */
|
|
236
260
|
export declare function nextZoneSpot(tabs: readonly LayoutTab[], cols?: number, rows?: number): {
|
|
237
261
|
x: number;
|
|
@@ -316,7 +340,15 @@ export declare function moveLeaf(root: LayoutNode, srcId: string, targetId: stri
|
|
|
316
340
|
export declare function openTabInWorkspace(wsId: string, title: string, opts?: {
|
|
317
341
|
besideActive?: boolean;
|
|
318
342
|
}): string | null;
|
|
319
|
-
|
|
343
|
+
/**
|
|
344
|
+
* `agent`: asked for over the control API (an agent), not from Deck's own palette. Then a new
|
|
345
|
+
* terminal tab or project is added without switching to it (Settings → Where things open,
|
|
346
|
+
* agentTerminals), its shell started at once (spawnUnseen): a pane starts its shell when it is
|
|
347
|
+
* first drawn, and the agent's next command goes to that shell.
|
|
348
|
+
*/
|
|
349
|
+
export declare function applyDtCommand(op: string, args: Record<string, unknown>, agent?: boolean): string | void;
|
|
350
|
+
/** Close the pane `pane`: its whole tab when it is the tab's only pane, as an agent's page is. */
|
|
351
|
+
export declare function closePaneTab(pane: string): void;
|
|
320
352
|
interface Instance {
|
|
321
353
|
term: Terminal;
|
|
322
354
|
fit: FitAddon;
|
|
@@ -361,7 +393,7 @@ export declare function moveWorkspace(id: string, toIndex: number): void;
|
|
|
361
393
|
* Registered per attach because resolving a relative path needs the pane's cwd, which is what
|
|
362
394
|
* attach is given. The instance outlives its DOM, so the previous provider is disposed first
|
|
363
395
|
* rather than stacking a second one on every re-attach. The matching itself lives in shellpath
|
|
364
|
-
* (no xterm import), where it is exercised by shellpath.check.
|
|
396
|
+
* (no xterm import), where it is exercised by shellpath.check.mjs.
|
|
365
397
|
*
|
|
366
398
|
* Only a path that actually exists is offered as a link. Matching the shape of a path is not the
|
|
367
399
|
* same as having one: output wraps mid-path at the edge of a narrow pane, a relative path resolves
|
|
@@ -449,6 +481,27 @@ export declare function queueInput(paneId: string, text: string): void;
|
|
|
449
481
|
* the user picked (the agent launcher) has to handle both.
|
|
450
482
|
*/
|
|
451
483
|
export declare function sendInput(paneId: string, text: string): void;
|
|
484
|
+
/** The command that resumes an agent's session, or undefined for a kind Deck cannot resume. */
|
|
485
|
+
export declare const resumeCommand: (kind: string, session: string) => string;
|
|
486
|
+
/**
|
|
487
|
+
* The agent session each of these panes holds, read fresh from the sweep's file (the map cached at
|
|
488
|
+
* startup misses an agent started since): for a closed tab to resume it when reopened. Read before
|
|
489
|
+
* the next sweep, which drops a pane gone from the layout.
|
|
490
|
+
*/
|
|
491
|
+
export declare function agentSessions(ids: string[]): Promise<Record<string, {
|
|
492
|
+
kind: string;
|
|
493
|
+
session: string;
|
|
494
|
+
}>>;
|
|
495
|
+
/**
|
|
496
|
+
* What is running in these panes besides their shells, for a close to ask about: the programs the
|
|
497
|
+
* sweep saw in each (state/term-procs), or "an agent" for one it has not listed yet. Only panes
|
|
498
|
+
* with a shell count; a view pane loses nothing by closing.
|
|
499
|
+
*
|
|
500
|
+
* ponytail: term-procs is up to 10s old (the sweep's interval), so a program started just before
|
|
501
|
+
* the close is missed. A term_busy command taking its own snapshot (pane_pids + sweep_procs) would
|
|
502
|
+
* not be.
|
|
503
|
+
*/
|
|
504
|
+
export declare function runningIn(ids: string[]): Promise<string[]>;
|
|
452
505
|
/**
|
|
453
506
|
* Size a pane's PTY, and every view of it, to the SMALLER of those views.
|
|
454
507
|
*
|