deck-plugin-sdk 1.9.0 → 1.10.1

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 CHANGED
@@ -1,60 +1,60 @@
1
- {
2
- "name": "deck-plugin-sdk",
3
- "version": "1.9.0",
4
- "description": "Build a plugin for Deck, outside the Deck repository.",
5
- "type": "module",
6
- "license": "MIT",
7
- "bin": {
8
- "deck-plugin": "bin/deck-plugin.mjs"
9
- },
10
- "exports": {
11
- "./build": "./build-plugin.mjs",
12
- "./*": {
13
- "types": "./shim/*.d.ts",
14
- "default": "./shim/*.js"
15
- },
16
- "./package.json": "./package.json"
17
- },
18
- "files": [
19
- "bin",
20
- "shim",
21
- "types",
22
- "template",
23
- "build-plugin.mjs",
24
- "packages.mjs",
25
- "README.md",
26
- "permissions.json",
27
- "publish.mjs",
28
- "validate.mjs"
29
- ],
30
- "dependencies": {
31
- "esbuild": "^0.28.0"
32
- },
33
- "peerDependencies": {
34
- "@types/react": "^19.0.0",
35
- "framer-motion": "^13.0.0",
36
- "lucide-react": "^1.0.0",
37
- "monaco-editor": "^0.56.0",
38
- "react": "^19.0.0",
39
- "typescript": "^5.0.0"
40
- },
41
- "peerDependenciesMeta": {
42
- "framer-motion": {
43
- "optional": true
44
- },
45
- "monaco-editor": {
46
- "optional": true
47
- },
48
- "typescript": {
49
- "optional": true
50
- }
51
- },
52
- "engines": {
53
- "node": ">=20"
54
- },
55
- "keywords": [
56
- "deck",
57
- "plugin",
58
- "sdk"
59
- ]
60
- }
1
+ {
2
+ "name": "deck-plugin-sdk",
3
+ "version": "1.10.1",
4
+ "description": "Build a plugin for Deck, outside the Deck repository.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "deck-plugin": "bin/deck-plugin.mjs"
9
+ },
10
+ "exports": {
11
+ "./build": "./build-plugin.mjs",
12
+ "./*": {
13
+ "types": "./shim/*.d.ts",
14
+ "default": "./shim/*.js"
15
+ },
16
+ "./package.json": "./package.json"
17
+ },
18
+ "files": [
19
+ "bin",
20
+ "shim",
21
+ "types",
22
+ "template",
23
+ "build-plugin.mjs",
24
+ "packages.mjs",
25
+ "README.md",
26
+ "permissions.json",
27
+ "publish.mjs",
28
+ "validate.mjs"
29
+ ],
30
+ "dependencies": {
31
+ "esbuild": "^0.28.0"
32
+ },
33
+ "peerDependencies": {
34
+ "@types/react": "^19.0.0",
35
+ "framer-motion": "^13.0.0",
36
+ "lucide-react": "^1.0.0",
37
+ "monaco-editor": "^0.56.0",
38
+ "react": "^19.0.0",
39
+ "typescript": "^5.0.0"
40
+ },
41
+ "peerDependenciesMeta": {
42
+ "framer-motion": {
43
+ "optional": true
44
+ },
45
+ "monaco-editor": {
46
+ "optional": true
47
+ },
48
+ "typescript": {
49
+ "optional": true
50
+ }
51
+ },
52
+ "engines": {
53
+ "node": ">=20"
54
+ },
55
+ "keywords": [
56
+ "deck",
57
+ "plugin",
58
+ "sdk"
59
+ ]
60
+ }
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
- "browserDefaultRegister": "browser",
36
- "browserDefaultStatus": "browser",
37
- "browserDevtools": "browser",
38
- "browserDownload": "browser",
39
- "browserFind": "browser",
40
- "browserHistoryCount": "browser",
41
- "browserHistoryForgetRange": "browser",
42
- "browserHistoryForgetUrl": "browser",
43
- "browserHistoryList": "browser",
44
- "browserHistoryRecent": "browser",
45
- "browserHistorySuggest": "browser",
46
- "browserHistoryVisit": "browser",
47
- "browserMute": "browser",
48
- "browserNav": "browser",
49
- "browserNotificationClicked": "browser",
50
- "browserOpen": "browser",
51
- "browserOpenAppLink": "browser",
52
- "browserPermissionAnswer": "browser",
53
- "browserPermissions": "browser",
54
- "browserPermissionSet": "browser",
55
- "browserPrint": "browser",
56
- "browserPrivacy": "browser",
57
- "browserReloadHung": "browser",
58
- "browserSetKeys": "browser",
59
- "browserSite": "browser",
60
- "browserSiteAnswer": "browser",
61
- "browserSiteClear": "browser",
62
- "browserSleep": "browser",
63
- "browserWindowFullscreen": "browser",
64
- "browserZoom": "browser",
65
- "claudePlanLimits": "terminals",
66
- "claudeUsage": "terminals",
67
- "clearWallpaper": "system",
68
- "convertFileSrc": "files",
69
- "dbConnect": "network",
70
- "dbDisconnect": "network",
71
- "dbQuery": "network",
72
- "dbSchema": "network",
73
- "deleteIconPack": "deck",
74
- "exec": "processes",
75
- "extensionInstallFolder": "browser",
76
- "extensionInstallStore": "browser",
77
- "extensionPopup": "browser",
78
- "extensionPopupClose": "browser",
79
- "extensionReload": "browser",
80
- "extensionRemove": "browser",
81
- "extensionSetEnabled": "browser",
82
- "extensionsList": "browser",
83
- "fsCopy": "files",
84
- "fsCreateDir": "files",
85
- "fsCreateFile": "files",
86
- "fsDelete": "files",
87
- "fsDrives": "files",
88
- "fsFiles": "files",
89
- "fsFind": "files",
90
- "fsHash": "files",
91
- "fsList": "files",
92
- "fsMove": "files",
93
- "fsOpen": "files",
94
- "fsRead": "files",
95
- "fsReadBytes": "files",
96
- "fsRename": "files",
97
- "fsReplace": "files",
98
- "fsReveal": "files",
99
- "fsSaveUnique": "files",
100
- "fsSearch": "files",
101
- "fsSize": "files",
102
- "fsThumbnail": "files",
103
- "fsTrash": "files",
104
- "fsWrite": "files",
105
- "fsWriteBytes": "files",
106
- "ghPrLineComment": "network",
107
- "ghPrThreads": "network",
108
- "ghRun": "processes",
109
- "ghThreadReply": "network",
110
- "ghThreadResolve": "network",
111
- "gitAiCommitMsg": "git",
112
- "gitBlameLine": "git",
113
- "gitCheckout": "git",
114
- "gitCheckoutDetach": "git",
115
- "gitCheckoutNew": "git",
116
- "gitCheckoutTrack": "git",
117
- "gitCommitFiles": "git",
118
- "gitDiscard": "git",
119
- "gitFileBytes": "git",
120
- "gitFileDiff": "git",
121
- "gitInfo": "git",
122
- "gitLogGraph": "git",
123
- "gitPoll": "git",
124
- "gitRangeFiles": "git",
125
- "gitRefs": "git",
126
- "gitRepos": "git",
127
- "gitRun": "git",
128
- "gitStatus": "git",
129
- "glabApi": "network",
130
- "glabRun": "processes",
131
- "googleAccount": "secrets",
132
- "googleSignIn": "secrets",
133
- "googleSignOut": "secrets",
134
- "googleToken": "secrets",
135
- "httpCancel": "network",
136
- "httpSend": "network",
137
- "httpSendAs": "network",
138
- "httpSendReply": "network",
139
- "importIconPack": "deck",
140
- "installAgentHooks": "terminals",
141
- "installAgentMcp": "terminals",
142
- "installAgentSkills": "terminals",
143
- "installFromRegistry": "deck",
144
- "launchFiles": "files",
145
- "listApps": "system",
146
- "listInstalled": "system",
147
- "logLatest": "deck",
148
- "mediaMeta": "files",
149
- "memKill": "system",
150
- "openFile": "files",
151
- "openTestDeck": "deck",
152
- "procKill": "processes",
153
- "procStream": "processes",
154
- "procWrite": "processes",
155
- "readIconPackTheme": "deck",
156
- "readTermLayout": "terminals",
157
- "readTrackMeta": "files",
158
- "remoteHome": "network",
159
- "remoteStat": "network",
160
- "remoteSudoPassword": "secrets",
161
- "removeLanguage": "deck",
162
- "restartApp": "deck",
163
- "runScriptNow": "processes",
164
- "sessionList": "terminals",
165
- "setAutostart": "system",
166
- "setDebugTargets": "processes",
167
- "setWallpaper": "system",
168
- "sshHosts": "network",
169
- "sshTunnelClose": "network",
170
- "sshTunnelOpen": "network",
171
- "vaultChangePassword": "secrets",
172
- "vaultConfig": "secrets",
173
- "vaultCreate": "secrets",
174
- "vaultDelete": "secrets",
175
- "vaultExport": "secrets",
176
- "vaultFill": "secrets",
177
- "vaultFillNew": "secrets",
178
- "vaultGenerate": "secrets",
179
- "vaultImport": "secrets",
180
- "vaultList": "secrets",
181
- "vaultLock": "secrets",
182
- "vaultMatches": "secrets",
183
- "vaultNeverList": "secrets",
184
- "vaultNeverRemove": "secrets",
185
- "vaultOfferAnswer": "secrets",
186
- "vaultSave": "secrets",
187
- "vaultSecret": "secrets",
188
- "vaultStatus": "secrets",
189
- "vaultTotp": "secrets",
190
- "vaultUnlock": "secrets",
191
- "vpsRunsPull": "network",
192
- "watchFiles": "files"
193
- },
194
- "modules": {
195
- "terminals": "terminals",
196
- "p2p": "network"
197
- },
198
- "free": [
199
- "DEFAULT_SETTINGS",
200
- "FOOTER_ITEMS",
201
- "configDelete",
202
- "configRead",
203
- "configWrite",
204
- "dataDir",
205
- "deckReady",
206
- "dirsDownload",
207
- "footerOrder",
208
- "fsHomeDir",
209
- "getAutostart",
210
- "isFullscreen",
211
- "languagesDir",
212
- "launchUrls",
213
- "mediaSetNowPlaying",
214
- "mediaSetPlayback",
215
- "memUsage",
216
- "notifyOs",
217
- "openExternal",
218
- "pickAnyFile",
219
- "pickExe",
220
- "pickFile",
221
- "pickFolder",
222
- "pickImage",
223
- "pickSavePath",
224
- "pickScript",
225
- "pluginsDir",
226
- "revealInFolder",
227
- "startupMarks",
228
- "toggleFullscreen"
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);
@@ -1,10 +1,10 @@
1
- {
2
- "id": "__ID__",
3
- "name": "__NAME__",
4
- "description": "One line on what this is for, shown under its name in Settings.",
5
- "icon": "Sparkles",
6
- "color": "#a78bfa",
7
- "version": "0.1.0",
8
- "minDeck": "1.9.0",
9
- "permissions": []
10
- }
1
+ {
2
+ "id": "__ID__",
3
+ "name": "__NAME__",
4
+ "description": "One line on what this is for, shown under its name in Settings.",
5
+ "icon": "Sparkles",
6
+ "color": "#a78bfa",
7
+ "version": "0.1.0",
8
+ "minDeck": "1.10.1",
9
+ "permissions": []
10
+ }
@@ -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 }: {
@@ -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, }: {
@@ -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).
@@ -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. */
@@ -221,4 +233,5 @@ export declare const pageBox: (pane: string) => DOMRect | null;
221
233
  export declare const paneWindow: (pane: string) => Window;
222
234
  /** Close the pane's webview to give back its memory, keeping the tab and its address. */
223
235
  export declare function discardBrowserPane(pane: string): Promise<void>;
236
+ export declare function picturePages(on: boolean): void;
224
237
  export declare function trackBrowser(pane: string, el: HTMLElement, url: string): () => void;
@@ -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
- export declare function openIn(path: string, to: Opener): boolean;
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. */
@@ -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
- * ponytail: one row at a time, so a path wrapped across two visual rows is missed, and a relative
24
- * path resolves against the cwd the pane SPAWNED with, so it is wrong after a `cd`. Absolute
25
- * paths — what Claude Code and most tools print — are unaffected by both.
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
- export declare function applyDtCommand(op: string, args: Record<string, unknown>): string | void;
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.ts.
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
  *