sourcemonkey 0.0.0-stage → 0.5.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.
Files changed (367) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -2
  3. package/dist/bytes.js +37 -0
  4. package/dist/channel-placeholder.js +5 -0
  5. package/dist/collection-scan.js +17 -0
  6. package/dist/collections.html +353 -0
  7. package/dist/compare.html +358 -0
  8. package/dist/composed-source.js +205 -0
  9. package/dist/connect-prompt.html +47 -0
  10. package/dist/debug/icons.html +211 -0
  11. package/dist/debug/storage.html +163 -0
  12. package/dist/debug-log.js +75 -0
  13. package/dist/diagnostic-location.js +64 -0
  14. package/dist/eval-hook.js +308 -0
  15. package/dist/extension/background.js +5263 -0
  16. package/dist/extension/channel.js +133 -0
  17. package/dist/extension/code-links.js +187 -0
  18. package/dist/extension/code-tabs.js +460 -0
  19. package/dist/extension/collection-dialog.js +619 -0
  20. package/dist/extension/collection-display.js +322 -0
  21. package/dist/extension/collections.js +2905 -0
  22. package/dist/extension/compare.js +867 -0
  23. package/dist/extension/concurrency.js +186 -0
  24. package/dist/extension/connect-grants.js +109 -0
  25. package/dist/extension/connect-prompt-page.js +70 -0
  26. package/dist/extension/connect-prompt.js +266 -0
  27. package/dist/extension/copy-button.js +63 -0
  28. package/dist/extension/copy-dialog.js +502 -0
  29. package/dist/extension/copy-preference.js +66 -0
  30. package/dist/extension/debug/icons.js +203 -0
  31. package/dist/extension/debug/storage.js +365 -0
  32. package/dist/extension/deep-link.js +77 -0
  33. package/dist/extension/delete-dialog.js +432 -0
  34. package/dist/extension/delete-icon.js +40 -0
  35. package/dist/extension/details-tooltips.js +66 -0
  36. package/dist/extension/directories.js +679 -0
  37. package/dist/extension/export-backup.js +407 -0
  38. package/dist/extension/export-dialog.js +142 -0
  39. package/dist/extension/file-access.js +74 -0
  40. package/dist/extension/file-changes.js +346 -0
  41. package/dist/extension/frame-info.js +85 -0
  42. package/dist/extension/github-provider.js +336 -0
  43. package/dist/extension/glyph.js +84 -0
  44. package/dist/extension/gm-bindings.js +601 -0
  45. package/dist/extension/gm-download.js +419 -0
  46. package/dist/extension/gm-menu.js +228 -0
  47. package/dist/extension/gm-notification.js +141 -0
  48. package/dist/extension/gm-originator-map.js +23 -0
  49. package/dist/extension/gm-tab-data.js +121 -0
  50. package/dist/extension/gm-tab.js +160 -0
  51. package/dist/extension/gm-url-change.js +111 -0
  52. package/dist/extension/gm-url-scheme.js +27 -0
  53. package/dist/extension/gm-values.js +176 -0
  54. package/dist/extension/gm-window-control.js +104 -0
  55. package/dist/extension/gm-xhr-headers.js +333 -0
  56. package/dist/extension/gm-xhr.js +584 -0
  57. package/dist/extension/injector.js +3145 -0
  58. package/dist/extension/install-capture.js +277 -0
  59. package/dist/extension/line-diff.js +233 -0
  60. package/dist/extension/local-copy.js +560 -0
  61. package/dist/extension/local-delete.js +276 -0
  62. package/dist/extension/location-kinds.js +108 -0
  63. package/dist/extension/log-format.js +158 -0
  64. package/dist/extension/managed-changes.js +361 -0
  65. package/dist/extension/managed-items.js +57 -0
  66. package/dist/extension/match-index.js +375 -0
  67. package/dist/extension/missing-scripts.js +66 -0
  68. package/dist/extension/more-menu.js +109 -0
  69. package/dist/extension/move-dialog.js +197 -0
  70. package/dist/extension/offscreen.js +37 -0
  71. package/dist/extension/options.js +504 -0
  72. package/dist/extension/page-heading.js +170 -0
  73. package/dist/extension/page-links.js +199 -0
  74. package/dist/extension/parse-check-client.js +70 -0
  75. package/dist/extension/parse-check.js +161 -0
  76. package/dist/extension/parse-sandbox-host.js +172 -0
  77. package/dist/extension/parse-sandbox.js +175 -0
  78. package/dist/extension/popup-commands-open.js +41 -0
  79. package/dist/extension/popup-view.js +387 -0
  80. package/dist/extension/popup.js +703 -0
  81. package/dist/extension/prism-userscript.js +53 -0
  82. package/dist/extension/refresh-error.js +136 -0
  83. package/dist/extension/refresh-targets.js +160 -0
  84. package/dist/extension/related-versions.js +1144 -0
  85. package/dist/extension/resize-observer-loop.js +19 -0
  86. package/dist/extension/row-cache.js +387 -0
  87. package/dist/extension/script-blobs.js +413 -0
  88. package/dist/extension/script-details.js +658 -0
  89. package/dist/extension/script-enablement.js +285 -0
  90. package/dist/extension/script-identity.js +310 -0
  91. package/dist/extension/script-keys.js +54 -0
  92. package/dist/extension/script-log-id.js +155 -0
  93. package/dist/extension/script-log.js +290 -0
  94. package/dist/extension/script-rejection.js +104 -0
  95. package/dist/extension/script-sites.js +158 -0
  96. package/dist/extension/script-store.js +3507 -0
  97. package/dist/extension/script-updater.js +991 -0
  98. package/dist/extension/script-url-hash.js +61 -0
  99. package/dist/extension/select-all.js +37 -0
  100. package/dist/extension/select-open-guard.js +90 -0
  101. package/dist/extension/site-icon.js +1261 -0
  102. package/dist/extension/sm-dev-link.js +302 -0
  103. package/dist/extension/solo-click.js +58 -0
  104. package/dist/extension/sticky-numbers.js +188 -0
  105. package/dist/extension/storage-breakdown.js +253 -0
  106. package/dist/extension/storage-scan.js +86 -0
  107. package/dist/extension/storage-usage.js +194 -0
  108. package/dist/extension/structural-keys.js +29 -0
  109. package/dist/extension/sw-teardown.js +36 -0
  110. package/dist/extension/tab-status.js +403 -0
  111. package/dist/extension/toolbar-summary.js +105 -0
  112. package/dist/extension/user-scripts-access.js +43 -0
  113. package/dist/extension/userscript.js +3672 -0
  114. package/dist/extension/value-store.js +204 -0
  115. package/dist/extension/version-probe-fetch.js +68 -0
  116. package/dist/extension/worker-client.js +109 -0
  117. package/dist/extension/worker-ops.js +171 -0
  118. package/dist/extension/zip-writer.js +24 -0
  119. package/dist/external-files.js +878 -0
  120. package/dist/file-loader.js +436 -0
  121. package/dist/file-locations.js +439 -0
  122. package/dist/generated-wrappers.js +5 -0
  123. package/dist/github-auth.js +148 -0
  124. package/dist/github-urls.js +46 -0
  125. package/dist/gm-api-catalog.js +217 -0
  126. package/dist/gm-connect.js +273 -0
  127. package/dist/gm-xhr-types.js +5 -0
  128. package/dist/http-read.js +142 -0
  129. package/dist/icons/icon-128.png +0 -0
  130. package/dist/icons/icon-16.png +0 -0
  131. package/dist/icons/icon-48.png +0 -0
  132. package/dist/local-file-overrides.js +558 -0
  133. package/dist/manifest.json +38 -0
  134. package/dist/markup-response.js +126 -0
  135. package/dist/match-targets.js +305 -0
  136. package/dist/menu-captions.js +22 -0
  137. package/dist/offscreen.html +39 -0
  138. package/dist/options.html +197 -0
  139. package/dist/parse-check-protocol.js +51 -0
  140. package/dist/parse-location.js +171 -0
  141. package/dist/parse-sandbox.html +56 -0
  142. package/dist/phase-timing.js +155 -0
  143. package/dist/popup.html +197 -0
  144. package/dist/public-suffixes.js +6957 -0
  145. package/dist/run-context.js +31 -0
  146. package/dist/runtime-messages.js +34 -0
  147. package/dist/sandboxed-page.js +35 -0
  148. package/dist/script-build.js +787 -0
  149. package/dist/script-display.js +383 -0
  150. package/dist/script-icon.js +43 -0
  151. package/dist/script-links.js +204 -0
  152. package/dist/script-source-url.js +214 -0
  153. package/dist/script-world.js +65 -0
  154. package/dist/sm-dev-protocol.js +84 -0
  155. package/dist/source-map.js +177 -0
  156. package/dist/stack-link.js +138 -0
  157. package/dist/styles.css +825 -0
  158. package/dist/unsafe-window-use.js +229 -0
  159. package/dist/url-match.js +734 -0
  160. package/dist/userscript-header.js +248 -0
  161. package/dist/userscript.html +1165 -0
  162. package/dist/vendor/fflate.LICENSE +21 -0
  163. package/dist/vendor/fflate.js +2692 -0
  164. package/dist/vendor/prism/prism-line-numbers.css +1 -0
  165. package/dist/vendor/prism/prism-line-numbers.js +1 -0
  166. package/dist/vendor/prism/prism.css +1 -0
  167. package/dist/vendor/prism/prism.js +1946 -0
  168. package/dist/version-compare.js +141 -0
  169. package/dist/version-probe.js +120 -0
  170. package/lib/build-info.json +1 -0
  171. package/lib/bytes.d.ts +3 -0
  172. package/lib/bytes.js +37 -0
  173. package/lib/channel-placeholder.d.ts +1 -0
  174. package/lib/channel-placeholder.js +5 -0
  175. package/lib/collection-scan.d.ts +8 -0
  176. package/lib/collection-scan.js +17 -0
  177. package/lib/composed-source.d.ts +28 -0
  178. package/lib/composed-source.js +205 -0
  179. package/lib/debug-log.d.ts +9 -0
  180. package/lib/debug-log.js +75 -0
  181. package/lib/diagnostic-location.d.ts +8 -0
  182. package/lib/diagnostic-location.js +64 -0
  183. package/lib/eval-hook.d.ts +34 -0
  184. package/lib/eval-hook.js +308 -0
  185. package/lib/external-files.d.ts +111 -0
  186. package/lib/external-files.js +878 -0
  187. package/lib/file-loader.d.ts +48 -0
  188. package/lib/file-loader.js +436 -0
  189. package/lib/file-locations.d.ts +44 -0
  190. package/lib/file-locations.js +439 -0
  191. package/lib/generated-wrappers.d.ts +11 -0
  192. package/lib/generated-wrappers.js +5 -0
  193. package/lib/github-auth.d.ts +12 -0
  194. package/lib/github-auth.js +148 -0
  195. package/lib/github-urls.d.ts +1 -0
  196. package/lib/github-urls.js +46 -0
  197. package/lib/gm-api-catalog.d.ts +24 -0
  198. package/lib/gm-api-catalog.js +217 -0
  199. package/lib/gm-connect.d.ts +34 -0
  200. package/lib/gm-connect.js +273 -0
  201. package/lib/gm-xhr-types.d.ts +68 -0
  202. package/lib/gm-xhr-types.js +5 -0
  203. package/lib/harness/browser-extensions.d.ts +73 -0
  204. package/lib/harness/browser-extensions.js +285 -0
  205. package/lib/harness/browser-lang.d.ts +20 -0
  206. package/lib/harness/browser-lang.js +86 -0
  207. package/lib/harness/browser-launch.d.ts +14 -0
  208. package/lib/harness/browser-launch.js +184 -0
  209. package/lib/harness/checks.d.ts +110 -0
  210. package/lib/harness/checks.js +321 -0
  211. package/lib/harness/cli.d.ts +2 -0
  212. package/lib/harness/cli.js +2259 -0
  213. package/lib/harness/command-args.d.ts +91 -0
  214. package/lib/harness/command-args.js +369 -0
  215. package/lib/harness/command-lines.d.ts +80 -0
  216. package/lib/harness/command-lines.js +180 -0
  217. package/lib/harness/command-list.d.ts +206 -0
  218. package/lib/harness/command-list.js +1475 -0
  219. package/lib/harness/console-commands.d.ts +463 -0
  220. package/lib/harness/console-commands.js +3216 -0
  221. package/lib/harness/download-watch.d.ts +21 -0
  222. package/lib/harness/download-watch.js +156 -0
  223. package/lib/harness/extension-backend.d.ts +41 -0
  224. package/lib/harness/extension-backend.js +100 -0
  225. package/lib/harness/extension-host.d.ts +112 -0
  226. package/lib/harness/extension-host.js +552 -0
  227. package/lib/harness/extension-launch.d.ts +67 -0
  228. package/lib/harness/extension-launch.js +285 -0
  229. package/lib/harness/extension-link.d.ts +315 -0
  230. package/lib/harness/extension-link.js +607 -0
  231. package/lib/harness/external-manager.d.ts +146 -0
  232. package/lib/harness/external-manager.js +414 -0
  233. package/lib/harness/fixture.d.ts +165 -0
  234. package/lib/harness/fixture.js +461 -0
  235. package/lib/harness/frame-sessions.d.ts +71 -0
  236. package/lib/harness/frame-sessions.js +248 -0
  237. package/lib/harness/frames.d.ts +68 -0
  238. package/lib/harness/frames.js +216 -0
  239. package/lib/harness/help-format.d.ts +17 -0
  240. package/lib/harness/help-format.js +127 -0
  241. package/lib/harness/host.d.ts +352 -0
  242. package/lib/harness/host.js +423 -0
  243. package/lib/harness/index.d.ts +8 -0
  244. package/lib/harness/index.js +10 -0
  245. package/lib/harness/input-file.d.ts +18 -0
  246. package/lib/harness/input-file.js +61 -0
  247. package/lib/harness/json-output.d.ts +565 -0
  248. package/lib/harness/json-output.js +71 -0
  249. package/lib/harness/manager-actions.d.ts +21 -0
  250. package/lib/harness/manager-actions.js +129 -0
  251. package/lib/harness/manager-commands.d.ts +142 -0
  252. package/lib/harness/manager-commands.js +1196 -0
  253. package/lib/harness/manager-fetch.d.ts +33 -0
  254. package/lib/harness/manager-fetch.js +239 -0
  255. package/lib/harness/managers.d.ts +24 -0
  256. package/lib/harness/managers.js +27 -0
  257. package/lib/harness/output-style.d.ts +125 -0
  258. package/lib/harness/output-style.js +322 -0
  259. package/lib/harness/page-commands.d.ts +134 -0
  260. package/lib/harness/page-commands.js +1141 -0
  261. package/lib/harness/page-output.d.ts +67 -0
  262. package/lib/harness/page-output.js +139 -0
  263. package/lib/harness/page-watch.d.ts +171 -0
  264. package/lib/harness/page-watch.js +607 -0
  265. package/lib/harness/parse-check-node.d.ts +3 -0
  266. package/lib/harness/parse-check-node.js +132 -0
  267. package/lib/harness/path-args.d.ts +22 -0
  268. package/lib/harness/path-args.js +148 -0
  269. package/lib/harness/playwright-chromium.d.ts +16 -0
  270. package/lib/harness/playwright-chromium.js +86 -0
  271. package/lib/harness/prepare.d.ts +168 -0
  272. package/lib/harness/prepare.js +364 -0
  273. package/lib/harness/prompt-editor.d.ts +17 -0
  274. package/lib/harness/prompt-editor.js +354 -0
  275. package/lib/harness/prompt-history.d.ts +13 -0
  276. package/lib/harness/prompt-history.js +89 -0
  277. package/lib/harness/rebuild-advice.d.ts +6 -0
  278. package/lib/harness/rebuild-advice.js +39 -0
  279. package/lib/harness/run-log.d.ts +47 -0
  280. package/lib/harness/run-log.js +140 -0
  281. package/lib/harness/run-logs.d.ts +132 -0
  282. package/lib/harness/run-logs.js +241 -0
  283. package/lib/harness/run.d.ts +194 -0
  284. package/lib/harness/run.js +1973 -0
  285. package/lib/harness/runs.d.ts +229 -0
  286. package/lib/harness/runs.js +726 -0
  287. package/lib/harness/save-html.d.ts +39 -0
  288. package/lib/harness/save-html.js +89 -0
  289. package/lib/harness/saved-pages.d.ts +120 -0
  290. package/lib/harness/saved-pages.js +275 -0
  291. package/lib/harness/script-mark.d.ts +17 -0
  292. package/lib/harness/script-mark.js +56 -0
  293. package/lib/harness/snapshot.d.ts +143 -0
  294. package/lib/harness/snapshot.js +474 -0
  295. package/lib/harness/stuck-tabs.d.ts +19 -0
  296. package/lib/harness/stuck-tabs.js +131 -0
  297. package/lib/harness/tab-refs.d.ts +20 -0
  298. package/lib/harness/tab-refs.js +80 -0
  299. package/lib/harness/tampermonkey.d.ts +71 -0
  300. package/lib/harness/tampermonkey.js +356 -0
  301. package/lib/harness/tm-ids.d.ts +18 -0
  302. package/lib/harness/tm-ids.js +88 -0
  303. package/lib/harness/violentmonkey.d.ts +34 -0
  304. package/lib/harness/violentmonkey.js +162 -0
  305. package/lib/harness/wait.d.ts +77 -0
  306. package/lib/harness/wait.js +458 -0
  307. package/lib/http-read.d.ts +30 -0
  308. package/lib/http-read.js +142 -0
  309. package/lib/local-file-overrides.d.ts +35 -0
  310. package/lib/local-file-overrides.js +558 -0
  311. package/lib/manifest.json +38 -0
  312. package/lib/markup-response.d.ts +11 -0
  313. package/lib/markup-response.js +126 -0
  314. package/lib/match-targets.d.ts +18 -0
  315. package/lib/match-targets.js +305 -0
  316. package/lib/menu-captions.d.ts +1 -0
  317. package/lib/menu-captions.js +22 -0
  318. package/lib/parse-check-protocol.d.ts +27 -0
  319. package/lib/parse-check-protocol.js +51 -0
  320. package/lib/parse-location.d.ts +12 -0
  321. package/lib/parse-location.js +171 -0
  322. package/lib/phase-timing.d.ts +12 -0
  323. package/lib/phase-timing.js +155 -0
  324. package/lib/public-suffixes.d.ts +1 -0
  325. package/lib/public-suffixes.js +6957 -0
  326. package/lib/run-context.d.ts +2 -0
  327. package/lib/run-context.js +31 -0
  328. package/lib/runtime-messages.d.ts +10 -0
  329. package/lib/runtime-messages.js +34 -0
  330. package/lib/sandboxed-page.d.ts +5 -0
  331. package/lib/sandboxed-page.js +35 -0
  332. package/lib/script-build.d.ts +111 -0
  333. package/lib/script-build.js +787 -0
  334. package/lib/script-display.d.ts +51 -0
  335. package/lib/script-display.js +383 -0
  336. package/lib/script-icon.d.ts +16 -0
  337. package/lib/script-icon.js +43 -0
  338. package/lib/script-links.d.ts +24 -0
  339. package/lib/script-links.js +204 -0
  340. package/lib/script-source-url.d.ts +8 -0
  341. package/lib/script-source-url.js +214 -0
  342. package/lib/script-world.d.ts +6 -0
  343. package/lib/script-world.js +65 -0
  344. package/lib/sm-dev-protocol.d.ts +251 -0
  345. package/lib/sm-dev-protocol.js +84 -0
  346. package/lib/source-map.d.ts +32 -0
  347. package/lib/source-map.js +177 -0
  348. package/lib/stack-link.d.ts +15 -0
  349. package/lib/stack-link.js +138 -0
  350. package/lib/unsafe-window-use.d.ts +1 -0
  351. package/lib/unsafe-window-use.js +229 -0
  352. package/lib/url-match.d.ts +40 -0
  353. package/lib/url-match.js +734 -0
  354. package/lib/userscript-header.d.ts +33 -0
  355. package/lib/userscript-header.js +248 -0
  356. package/lib/version-compare.d.ts +6 -0
  357. package/lib/version-compare.js +141 -0
  358. package/lib/version-probe.d.ts +17 -0
  359. package/lib/version-probe.js +120 -0
  360. package/package.json +55 -3
  361. package/skills/SourceMonkey-dev/SKILL.md +868 -0
  362. package/skills/SourceMonkey-dev/references/cdp.md +293 -0
  363. package/skills/SourceMonkey-dev/references/commands.md +297 -0
  364. package/skills/SourceMonkey-dev/references/other-managers.md +63 -0
  365. package/skills/SourceMonkey-dev/references/specs.md +46 -0
  366. package/skills/SourceMonkey-friction/SKILL.md +103 -0
  367. package/skills/SourceMonkey-friction/references/template.md +59 -0
@@ -0,0 +1,129 @@
1
+ // The `manager` verbs: `fetch` a manager into sm-dev's cache, `install`
2
+ // it into a browser, and `enable` or `disable` it there. sm-dev runs
3
+ // them itself, never in a run: they act on the browser's extensions,
4
+ // which a run doesn't hold.
5
+ import { existsSync } from 'node:fs';
6
+ import path from 'node:path';
7
+ import { allowUserScripts, installedManagers, loadUnpacked, otherManagersWarning, setExtensionEnabled, } from './browser-extensions.js';
8
+ import { withTilde } from './browser-launch.js';
9
+ import { EXTENSION_DIR } from './extension-launch.js';
10
+ import { fetchManager, fetchedDir, fetchedVersion } from './manager-fetch.js';
11
+ import { MANAGERS, managerFlag } from './managers.js';
12
+ import { cmd, id as idRole, message, quoted, SM_DEV_PREFIX, ui, url } from './output-style.js';
13
+ import { rebuildAdvice } from './rebuild-advice.js';
14
+ // A line of sm-dev's own, as a note, without its `[sm-dev] ` prefix.
15
+ const withoutPrefix = (line) => (line.startsWith(SM_DEV_PREFIX) ? line.slice(SM_DEV_PREFIX.length) : line);
16
+ /** A failure the person made in asking, rather than one doing it. */
17
+ export class ManagerUsageError extends Error {
18
+ }
19
+ /** Does one verb. Returns false when it failed, having said why. */
20
+ export async function managerAction(o) {
21
+ const { label } = MANAGERS[o.manager];
22
+ if (o.verb === 'fetch') {
23
+ if (o.manager === 'sourcemonkey')
24
+ throw new ManagerUsageError(`${label} comes with sm-dev, so there is nothing to fetch. Use ${quoted('--manager')} to name another.`);
25
+ const fetched = await fetchManager(o.manager, (line) => o.note(withoutPrefix(line)));
26
+ if (!fetched.downloaded) {
27
+ o.out(ui `${label} ${fetched.version} is the newest version, and is already in ${url(withTilde(fetched.dir))}`);
28
+ return true;
29
+ }
30
+ o.out(ui `Fetched ${label} ${fetched.version} into ${url(withTilde(fetched.dir))}${fetched.replaced ? `, replacing ${fetched.replaced}` : ''}`);
31
+ if (fetched.replaced)
32
+ o.out(message(`A browser with it installed from there gets the new version with ${quoted(`sm-dev ${managerFlag(o.manager)} manager install`)}.`));
33
+ return true;
34
+ }
35
+ const endpoint = o.endpoint;
36
+ const managers = await browserManagers(endpoint);
37
+ const copies = managers.filter((m) => m.manager === o.manager);
38
+ if (o.verb === 'install') {
39
+ if (!await install(o, managers, copies))
40
+ return false;
41
+ }
42
+ else {
43
+ if (copies.length === 0) {
44
+ o.note(message(`${label} is not installed in this browser. Install it with ${quoted(`sm-dev${o.browserArg ?? ''} ${managerFlag(o.manager)} manager install`)}`));
45
+ return false;
46
+ }
47
+ const enable = o.verb === 'enable';
48
+ if (!enable && o.manager === 'sourcemonkey' && (o.runsUsing ?? []).length > 0) {
49
+ const runs = o.runsUsing;
50
+ const ids = runs.map((run) => idRole(run)).join(', ');
51
+ o.note(ui `SourceMonkey can't be turned off while ${runs.length === 1 ? ui `run ${ids} uses` : ui `runs ${ids} use`} it. Stop ${runs.length === 1 ? 'that run' : 'them'} first.`);
52
+ return false;
53
+ }
54
+ for (const copy of copies) {
55
+ if (copy.enabled === enable) {
56
+ o.out(`${copy.name} ${copy.version} is already ${enable ? 'enabled' : 'disabled'}`);
57
+ continue;
58
+ }
59
+ await setExtensionEnabled(endpoint, copy.id, enable);
60
+ copy.enabled = enable;
61
+ o.out(`${enable ? 'Enabled' : 'Disabled'} ${copy.name} ${copy.version}`);
62
+ }
63
+ if (enable && copies.some((c) => !c.userScripts)) {
64
+ o.note(message(`Its Allow User Scripts is off, so it can't run scripts. ${quoted(`sm-dev${o.browserArg ?? ''} ${managerFlag(o.manager)} manager install`)} turns it on.`));
65
+ }
66
+ }
67
+ // Not after turning it off, when it's no longer in use either.
68
+ if (o.verb !== 'disable')
69
+ for (const line of otherManagersWarning(managers, o.manager, o.browserArg))
70
+ o.note(line);
71
+ return true;
72
+ }
73
+ // `manager install`: loads the manager unpacked, from sm-dev's copy of
74
+ // SourceMonkey or the fetched copy of another, with "Allow User
75
+ // Scripts" on. One there already is left as it is, but for turning
76
+ // that on, and for a fetched copy, updating it to the version fetched
77
+ // since.
78
+ async function install(o, managers, copies) {
79
+ const { label } = MANAGERS[o.manager];
80
+ const endpoint = o.endpoint;
81
+ let dir;
82
+ let version;
83
+ if (o.manager === 'sourcemonkey') {
84
+ dir = EXTENSION_DIR;
85
+ if (!existsSync(path.join(dir, 'manifest.json'))) {
86
+ o.note(ui `The built extension is missing from ${url(dir)}. ${message(rebuildAdvice())}`);
87
+ return false;
88
+ }
89
+ version = null;
90
+ }
91
+ else {
92
+ // Fetched the first time it's wanted, as `manager fetch` would.
93
+ version = fetchedVersion(o.manager) ?? (await fetchManager(o.manager, (line) => o.note(withoutPrefix(line)))).version;
94
+ dir = fetchedDir(o.manager);
95
+ }
96
+ const ours = copies.find((m) => m.path !== undefined && path.resolve(m.path) === path.resolve(dir));
97
+ const copy = ours ?? copies[0];
98
+ if (copy) {
99
+ if (ours && version !== null && ours.version !== version) {
100
+ await loadUnpacked(endpoint, dir);
101
+ o.out(ui `Updated ${copy.name} from ${copy.version} to ${version}, from ${url(withTilde(dir))}`);
102
+ }
103
+ else {
104
+ // Where Chrome says it came from, when it says.
105
+ const from = copy.path ? ui `, from ${url(withTilde(copy.path))}` : copy.fromStore ? ', from the Chrome Web Store' : '';
106
+ o.out(ui `${copy.name} ${copy.version} is already installed${from}${copy.enabled ? '' : ui `, but disabled. Turn it on with ${cmd(`sm-dev${o.browserArg ?? ''} ${managerFlag(o.manager)} manager enable`)}.`}`);
107
+ }
108
+ if (!copy.userScripts) {
109
+ await allowUserScripts(endpoint, copy.id);
110
+ o.out('Turned on its Allow User Scripts');
111
+ }
112
+ return true;
113
+ }
114
+ const id = await loadUnpacked(endpoint, dir);
115
+ await allowUserScripts(endpoint, id);
116
+ const loaded = (await browserManagers(endpoint)).find((m) => m.id === id);
117
+ managers.push(...(loaded ? [loaded] : []));
118
+ o.out(ui `Installed ${label}${loaded ? ` ${loaded.version}` : ''} from ${url(withTilde(dir))}, with Allow User Scripts on`);
119
+ return true;
120
+ }
121
+ // The managers in the browser, or a failure naming it.
122
+ async function browserManagers(endpoint) {
123
+ try {
124
+ return await installedManagers(endpoint);
125
+ }
126
+ catch (err) {
127
+ throw new Error(`Could not read the extensions of the browser at ${endpoint.replace(/^https?:\/\//, '')}: ${err.message}`);
128
+ }
129
+ }
@@ -0,0 +1,142 @@
1
+ import { type CollectionRefresh, type ManagedCollection, type ManagedFileContent, type ManagedOnDisk, type ManagedScript, type ManagedScriptDetails, type ManagedScriptIcons, type ManagedSiteIcon, type ScriptEnable, type ScriptIconsLoad, type ScriptInstall, type ScriptRefresh } from '../sm-dev-protocol.js';
2
+ import { type TabActivity } from './json-output.js';
3
+ /**
4
+ * The calls these commands make into the manager: SourceMonkey's
5
+ * (managed-changes.ts), or another's (external-manager.ts).
6
+ */
7
+ export interface ManagerControl {
8
+ /** The manager's name, for what the commands say (`SourceMonkey`). */
9
+ readonly label: string;
10
+ collections(): Promise<ManagedCollection[]>;
11
+ scripts(): Promise<ManagedScript[]>;
12
+ /** What the disk says of local scripts and collections; null for an extension older than 1.5. */
13
+ onDisk(): Promise<ManagedOnDisk | null>;
14
+ setScriptEnabled(id: string, enabled: boolean): Promise<ScriptEnable>;
15
+ setCollectionEnabled(id: string, enabled: boolean): Promise<ManagedCollection>;
16
+ refreshScript(id: string): Promise<ScriptRefresh>;
17
+ refreshCollection(id: string): Promise<CollectionRefresh>;
18
+ /**
19
+ * `replace`: another manager may replace a script of the person's own
20
+ * with the same name and namespace; else it refuses (`ReplaceRefused`).
21
+ */
22
+ installScript(location: string, collectionId: string | null, replace?: boolean): Promise<ScriptInstall>;
23
+ uninstallScript(id: string): Promise<ManagedScript>;
24
+ moveScript(id: string, collectionId: string): Promise<ScriptEnable>;
25
+ renameCollection(id: string, name: string): Promise<ManagedCollection>;
26
+ scriptDetails(id: string): Promise<ManagedScriptDetails | null>;
27
+ scriptText(id: string): Promise<string | null>;
28
+ /** A script's `@require` and `@resource` files as installed; null for no script. Absent when the manager doesn't give them. */
29
+ scriptFiles?(id: string): Promise<ManagedFileContent[] | null>;
30
+ /** A script's `@icon` and site icons; null for no script. Absent when the manager doesn't give them. */
31
+ scriptIcons?(id: string, load: ScriptIconsLoad): Promise<ManagedScriptIcons | null>;
32
+ }
33
+ /**
34
+ * A run's id in the extension (`D1-ab12`, see `linkRunId`) as sm-dev
35
+ * names the run (`D1`).
36
+ */
37
+ export declare function runOfLinkId(id: string): string;
38
+ /** In a run, what it knows of the scripts `script list` shows. */
39
+ export interface RunView {
40
+ /** The run's own scripts' numbers (`2`), by the extension's id. */
41
+ own: Map<string, string>;
42
+ /** The selected script: by the extension's id, or by its E-id. */
43
+ selected?: {
44
+ internalId: string;
45
+ } | {
46
+ label: string;
47
+ };
48
+ }
49
+ /** `1 script`, `2 scripts`. */
50
+ export declare function count(n: number, noun: string): string;
51
+ /** The verbs each command takes. `script` without one picks a script instead. */
52
+ export declare const MANAGER_VERBS: {
53
+ readonly collection: readonly ["list", "show", "enable", "disable", "refresh", "rename"];
54
+ readonly script: readonly ["list", "show", "print", "save", "enable", "disable", "refresh", "install", "uninstall", "move"];
55
+ };
56
+ /** Said for `collection <words>` with no verb it takes: `C3 frob`, or one word alone. */
57
+ export declare function noSuchVerb(words: readonly string[]): string;
58
+ /** `collection list`: each collection, numbered ones first. */
59
+ export declare function collectionList(manager: ManagerControl, out: (line: string) => void, json: boolean): Promise<void>;
60
+ /**
61
+ * The collection `name` names: `C3`, `id=<id>`, a run's (`D1`), or its
62
+ * name, whole or a part only it has, in any case. For none or several,
63
+ * throws an error with the reason.
64
+ */
65
+ export declare function pickCollection(collections: readonly ManagedCollection[], name: string): ManagedCollection;
66
+ /**
67
+ * `script list [collection]`: the installed scripts, under their
68
+ * collections, or one collection's. Throws for a collection it can't
69
+ * find.
70
+ */
71
+ export declare function scriptList(manager: ManagerControl, name: string | undefined, out: (line: string) => void, json: boolean, view?: RunView): Promise<void>;
72
+ /** What a run adds to the commands that show and change things. */
73
+ export interface ManagerRun extends RunView {
74
+ /** Re-reads one of the run's own scripts from disk, as `update` does. */
75
+ updateOwn(internalId: string): Promise<void>;
76
+ /** What a script does on each of the run's tabs, with the words `scripts` uses for it. */
77
+ tabsOf(script: ManagedScript, label: string | undefined): Promise<{
78
+ activity: TabActivity;
79
+ text: string;
80
+ }[]>;
81
+ }
82
+ /** Where the commands that show and change things run. */
83
+ export interface ManagerContext {
84
+ manager: ManagerControl;
85
+ out: (line: string) => void;
86
+ json: boolean;
87
+ /** In a run. */
88
+ run?: ManagerRun;
89
+ /**
90
+ * The collections and scripts are the person's own (not a
91
+ * a temp browser's), so a change that takes something away needs
92
+ * `--force`.
93
+ */
94
+ guarded: boolean;
95
+ /** Where a relative path given to `script install` is from. */
96
+ cwd: string;
97
+ }
98
+ /**
99
+ * The script `name` names: a run's own by its number (`2`), `E12`,
100
+ * `id=<id>`, or its name, whole or a part only it has, in any case. For
101
+ * none or several, throws an error with the reason.
102
+ */
103
+ export declare function pickManagedScript(scripts: readonly ManagedScript[], name: string, view?: RunView): ManagedScript;
104
+ /** Another manager won't replace the person's own script `shown` (`E3: Name`) without `replace`. */
105
+ export declare class ReplaceRefused extends Error {
106
+ readonly shown: string;
107
+ constructor(shown: string);
108
+ }
109
+ /** Said for a script name that names none. */
110
+ export declare function noSuchScript(name: string): string;
111
+ /**
112
+ * `collection <C> <verb>`, `script [script] <verb>` and `script
113
+ * install`. `subject`: what it acts on, named before the verb; a script
114
+ * left out is the selected one. `args`: the words after the verb;
115
+ * `flags`: the command's own. Returns false when it failed, having said
116
+ * why.
117
+ */
118
+ export declare function managerVerb(ctx: ManagerContext, command: 'collection' | 'script', verb: string, subject: string | undefined, args: string[], flags: Record<string, string | true>): Promise<boolean>;
119
+ /** A site icon as sm-dev gives it: `path` absent for the globe. */
120
+ interface SiteIconFile {
121
+ path?: string;
122
+ source?: ManagedSiteIcon['source'];
123
+ sites: string[];
124
+ bytes?: Buffer;
125
+ }
126
+ /**
127
+ * The file of `files` that `name` names: a `@resource`'s name, exactly,
128
+ * or a part of its URL only it has; `script` for the script itself;
129
+ * `icon` for the `@icon`. For none or multiple, throws a failure
130
+ * listing them. `shown`: the script, marked up.
131
+ */
132
+ export declare function pickScriptFile(files: readonly ManagedFileContent[], name: string, shown: string): ManagedFileContent | 'script';
133
+ /**
134
+ * The site icon that `name` (`site-icons/github.com`) names: the one
135
+ * whose name has the part after `site-icons/`. For none or multiple,
136
+ * throws a failure listing them.
137
+ */
138
+ export declare function pickSiteIcon(files: readonly SiteIconFile[], name: string, shown: string): SiteIconFile & {
139
+ path: string;
140
+ bytes: Buffer;
141
+ };
142
+ export {};