sweetlink 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +237 -0
  4. package/dist/daemon/src/codename.d.ts +8 -0
  5. package/dist/daemon/src/codename.d.ts.map +1 -0
  6. package/dist/daemon/src/codename.js +42 -0
  7. package/dist/daemon/src/codename.js.map +1 -0
  8. package/dist/daemon/src/index.d.ts +3 -0
  9. package/dist/daemon/src/index.d.ts.map +1 -0
  10. package/dist/daemon/src/index.js +675 -0
  11. package/dist/daemon/src/index.js.map +1 -0
  12. package/dist/shared/src/env.d.ts +24 -0
  13. package/dist/shared/src/env.d.ts.map +1 -0
  14. package/dist/shared/src/env.js +39 -0
  15. package/dist/shared/src/env.js.map +1 -0
  16. package/dist/shared/src/index.d.ts +211 -0
  17. package/dist/shared/src/index.d.ts.map +1 -0
  18. package/dist/shared/src/index.js +73 -0
  19. package/dist/shared/src/index.js.map +1 -0
  20. package/dist/shared/src/node.d.ts +12 -0
  21. package/dist/shared/src/node.d.ts.map +1 -0
  22. package/dist/shared/src/node.js +67 -0
  23. package/dist/shared/src/node.js.map +1 -0
  24. package/dist/src/codex.d.ts +11 -0
  25. package/dist/src/codex.d.ts.map +1 -0
  26. package/dist/src/codex.js +67 -0
  27. package/dist/src/codex.js.map +1 -0
  28. package/dist/src/commands/click.d.ts +3 -0
  29. package/dist/src/commands/click.d.ts.map +1 -0
  30. package/dist/src/commands/click.js +93 -0
  31. package/dist/src/commands/click.js.map +1 -0
  32. package/dist/src/commands/run-js.d.ts +4 -0
  33. package/dist/src/commands/run-js.d.ts.map +1 -0
  34. package/dist/src/commands/run-js.js +28 -0
  35. package/dist/src/commands/run-js.js.map +1 -0
  36. package/dist/src/commands/trust-ca.d.ts +3 -0
  37. package/dist/src/commands/trust-ca.d.ts.map +1 -0
  38. package/dist/src/commands/trust-ca.js +43 -0
  39. package/dist/src/commands/trust-ca.js.map +1 -0
  40. package/dist/src/core/config-file.d.ts +41 -0
  41. package/dist/src/core/config-file.d.ts.map +1 -0
  42. package/dist/src/core/config-file.js +284 -0
  43. package/dist/src/core/config-file.js.map +1 -0
  44. package/dist/src/core/config.d.ts +23 -0
  45. package/dist/src/core/config.d.ts.map +1 -0
  46. package/dist/src/core/config.js +132 -0
  47. package/dist/src/core/config.js.map +1 -0
  48. package/dist/src/core/env.d.ts +11 -0
  49. package/dist/src/core/env.d.ts.map +1 -0
  50. package/dist/src/core/env.js +30 -0
  51. package/dist/src/core/env.js.map +1 -0
  52. package/dist/src/devtools-registry.d.ts +3 -0
  53. package/dist/src/devtools-registry.d.ts.map +1 -0
  54. package/dist/src/devtools-registry.js +294 -0
  55. package/dist/src/devtools-registry.js.map +1 -0
  56. package/dist/src/env.d.ts +16 -0
  57. package/dist/src/env.d.ts.map +1 -0
  58. package/dist/src/env.js +17 -0
  59. package/dist/src/env.js.map +1 -0
  60. package/dist/src/http.d.ts +2 -0
  61. package/dist/src/http.d.ts.map +1 -0
  62. package/dist/src/http.js +53 -0
  63. package/dist/src/http.js.map +1 -0
  64. package/dist/src/index.d.ts +19 -0
  65. package/dist/src/index.d.ts.map +1 -0
  66. package/dist/src/index.js +1941 -0
  67. package/dist/src/index.js.map +1 -0
  68. package/dist/src/runtime/browser/client.d.ts +10 -0
  69. package/dist/src/runtime/browser/client.d.ts.map +1 -0
  70. package/dist/src/runtime/browser/client.js +497 -0
  71. package/dist/src/runtime/browser/client.js.map +1 -0
  72. package/dist/src/runtime/browser/commands/index.d.ts +10 -0
  73. package/dist/src/runtime/browser/commands/index.d.ts.map +1 -0
  74. package/dist/src/runtime/browser/commands/index.js +219 -0
  75. package/dist/src/runtime/browser/commands/index.js.map +1 -0
  76. package/dist/src/runtime/browser/dom-to-image-loader.d.ts +6 -0
  77. package/dist/src/runtime/browser/dom-to-image-loader.d.ts.map +1 -0
  78. package/dist/src/runtime/browser/dom-to-image-loader.js +50 -0
  79. package/dist/src/runtime/browser/dom-to-image-loader.js.map +1 -0
  80. package/dist/src/runtime/browser/index.d.ts +4 -0
  81. package/dist/src/runtime/browser/index.d.ts.map +1 -0
  82. package/dist/src/runtime/browser/index.js +4 -0
  83. package/dist/src/runtime/browser/index.js.map +1 -0
  84. package/dist/src/runtime/browser/module-loader.d.ts +6 -0
  85. package/dist/src/runtime/browser/module-loader.d.ts.map +1 -0
  86. package/dist/src/runtime/browser/module-loader.js +26 -0
  87. package/dist/src/runtime/browser/module-loader.js.map +1 -0
  88. package/dist/src/runtime/browser/screenshot/hooks.d.ts +71 -0
  89. package/dist/src/runtime/browser/screenshot/hooks.d.ts.map +1 -0
  90. package/dist/src/runtime/browser/screenshot/hooks.js +219 -0
  91. package/dist/src/runtime/browser/screenshot/hooks.js.map +1 -0
  92. package/dist/src/runtime/browser/screenshot/index.d.ts +9 -0
  93. package/dist/src/runtime/browser/screenshot/index.d.ts.map +1 -0
  94. package/dist/src/runtime/browser/screenshot/index.js +90 -0
  95. package/dist/src/runtime/browser/screenshot/index.js.map +1 -0
  96. package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.d.ts +13 -0
  97. package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.d.ts.map +1 -0
  98. package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js +51 -0
  99. package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js.map +1 -0
  100. package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts +12 -0
  101. package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts.map +1 -0
  102. package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js +136 -0
  103. package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js.map +1 -0
  104. package/dist/src/runtime/browser/screenshot/targets.d.ts +6 -0
  105. package/dist/src/runtime/browser/screenshot/targets.d.ts.map +1 -0
  106. package/dist/src/runtime/browser/screenshot/targets.js +53 -0
  107. package/dist/src/runtime/browser/screenshot/targets.js.map +1 -0
  108. package/dist/src/runtime/browser/screenshot/utils.d.ts +9 -0
  109. package/dist/src/runtime/browser/screenshot/utils.d.ts.map +1 -0
  110. package/dist/src/runtime/browser/screenshot/utils.js +471 -0
  111. package/dist/src/runtime/browser/screenshot/utils.js.map +1 -0
  112. package/dist/src/runtime/browser/selector-discovery.d.ts +9 -0
  113. package/dist/src/runtime/browser/selector-discovery.d.ts.map +1 -0
  114. package/dist/src/runtime/browser/selector-discovery.js +218 -0
  115. package/dist/src/runtime/browser/selector-discovery.js.map +1 -0
  116. package/dist/src/runtime/browser/storage/session-storage.d.ts +13 -0
  117. package/dist/src/runtime/browser/storage/session-storage.d.ts.map +1 -0
  118. package/dist/src/runtime/browser/storage/session-storage.js +119 -0
  119. package/dist/src/runtime/browser/storage/session-storage.js.map +1 -0
  120. package/dist/src/runtime/browser/types.d.ts +96 -0
  121. package/dist/src/runtime/browser/types.d.ts.map +1 -0
  122. package/dist/src/runtime/browser/types.js +6 -0
  123. package/dist/src/runtime/browser/types.js.map +1 -0
  124. package/dist/src/runtime/browser/utils/console.d.ts +5 -0
  125. package/dist/src/runtime/browser/utils/console.d.ts.map +1 -0
  126. package/dist/src/runtime/browser/utils/console.js +54 -0
  127. package/dist/src/runtime/browser/utils/console.js.map +1 -0
  128. package/dist/src/runtime/browser/utils/environment.d.ts +3 -0
  129. package/dist/src/runtime/browser/utils/environment.d.ts.map +1 -0
  130. package/dist/src/runtime/browser/utils/environment.js +13 -0
  131. package/dist/src/runtime/browser/utils/environment.js.map +1 -0
  132. package/dist/src/runtime/browser/utils/errors.d.ts +3 -0
  133. package/dist/src/runtime/browser/utils/errors.d.ts.map +1 -0
  134. package/dist/src/runtime/browser/utils/errors.js +42 -0
  135. package/dist/src/runtime/browser/utils/errors.js.map +1 -0
  136. package/dist/src/runtime/browser/utils/number.d.ts +2 -0
  137. package/dist/src/runtime/browser/utils/number.d.ts.map +1 -0
  138. package/dist/src/runtime/browser/utils/number.js +2 -0
  139. package/dist/src/runtime/browser/utils/number.js.map +1 -0
  140. package/dist/src/runtime/browser/utils/object.d.ts +3 -0
  141. package/dist/src/runtime/browser/utils/object.d.ts.map +1 -0
  142. package/dist/src/runtime/browser/utils/object.js +9 -0
  143. package/dist/src/runtime/browser/utils/object.js.map +1 -0
  144. package/dist/src/runtime/browser/utils/sanitize.d.ts +2 -0
  145. package/dist/src/runtime/browser/utils/sanitize.d.ts.map +1 -0
  146. package/dist/src/runtime/browser/utils/sanitize.js +28 -0
  147. package/dist/src/runtime/browser/utils/sanitize.js.map +1 -0
  148. package/dist/src/runtime/browser/utils/time.d.ts +2 -0
  149. package/dist/src/runtime/browser/utils/time.d.ts.map +1 -0
  150. package/dist/src/runtime/browser/utils/time.js +7 -0
  151. package/dist/src/runtime/browser/utils/time.js.map +1 -0
  152. package/dist/src/runtime/chrome/constants.d.ts +5 -0
  153. package/dist/src/runtime/chrome/constants.d.ts.map +1 -0
  154. package/dist/src/runtime/chrome/constants.js +5 -0
  155. package/dist/src/runtime/chrome/constants.js.map +1 -0
  156. package/dist/src/runtime/chrome/cookies.d.ts +20 -0
  157. package/dist/src/runtime/chrome/cookies.d.ts.map +1 -0
  158. package/dist/src/runtime/chrome/cookies.js +139 -0
  159. package/dist/src/runtime/chrome/cookies.js.map +1 -0
  160. package/dist/src/runtime/chrome/diagnostics.d.ts +6 -0
  161. package/dist/src/runtime/chrome/diagnostics.d.ts.map +1 -0
  162. package/dist/src/runtime/chrome/diagnostics.js +49 -0
  163. package/dist/src/runtime/chrome/diagnostics.js.map +1 -0
  164. package/dist/src/runtime/chrome/focus.d.ts +2 -0
  165. package/dist/src/runtime/chrome/focus.d.ts.map +1 -0
  166. package/dist/src/runtime/chrome/focus.js +41 -0
  167. package/dist/src/runtime/chrome/focus.js.map +1 -0
  168. package/dist/src/runtime/chrome/launch.d.ts +23 -0
  169. package/dist/src/runtime/chrome/launch.d.ts.map +1 -0
  170. package/dist/src/runtime/chrome/launch.js +102 -0
  171. package/dist/src/runtime/chrome/launch.js.map +1 -0
  172. package/dist/src/runtime/chrome/puppeteer.d.ts +7 -0
  173. package/dist/src/runtime/chrome/puppeteer.d.ts.map +1 -0
  174. package/dist/src/runtime/chrome/puppeteer.js +87 -0
  175. package/dist/src/runtime/chrome/puppeteer.js.map +1 -0
  176. package/dist/src/runtime/chrome/reuse/constants.d.ts +4 -0
  177. package/dist/src/runtime/chrome/reuse/constants.d.ts.map +1 -0
  178. package/dist/src/runtime/chrome/reuse/constants.js +4 -0
  179. package/dist/src/runtime/chrome/reuse/constants.js.map +1 -0
  180. package/dist/src/runtime/chrome/reuse.d.ts +13 -0
  181. package/dist/src/runtime/chrome/reuse.d.ts.map +1 -0
  182. package/dist/src/runtime/chrome/reuse.js +183 -0
  183. package/dist/src/runtime/chrome/reuse.js.map +1 -0
  184. package/dist/src/runtime/chrome/session.d.ts +13 -0
  185. package/dist/src/runtime/chrome/session.d.ts.map +1 -0
  186. package/dist/src/runtime/chrome/session.js +47 -0
  187. package/dist/src/runtime/chrome/session.js.map +1 -0
  188. package/dist/src/runtime/chrome.d.ts +9 -0
  189. package/dist/src/runtime/chrome.d.ts.map +1 -0
  190. package/dist/src/runtime/chrome.js +10 -0
  191. package/dist/src/runtime/chrome.js.map +1 -0
  192. package/dist/src/runtime/cookies.d.ts +37 -0
  193. package/dist/src/runtime/cookies.d.ts.map +1 -0
  194. package/dist/src/runtime/cookies.js +592 -0
  195. package/dist/src/runtime/cookies.js.map +1 -0
  196. package/dist/src/runtime/devstack.d.ts +14 -0
  197. package/dist/src/runtime/devstack.d.ts.map +1 -0
  198. package/dist/src/runtime/devstack.js +174 -0
  199. package/dist/src/runtime/devstack.js.map +1 -0
  200. package/dist/src/runtime/devtools/background.d.ts +5 -0
  201. package/dist/src/runtime/devtools/background.d.ts.map +1 -0
  202. package/dist/src/runtime/devtools/background.js +109 -0
  203. package/dist/src/runtime/devtools/background.js.map +1 -0
  204. package/dist/src/runtime/devtools/cdp.d.ts +16 -0
  205. package/dist/src/runtime/devtools/cdp.d.ts.map +1 -0
  206. package/dist/src/runtime/devtools/cdp.js +392 -0
  207. package/dist/src/runtime/devtools/cdp.js.map +1 -0
  208. package/dist/src/runtime/devtools/config.d.ts +12 -0
  209. package/dist/src/runtime/devtools/config.d.ts.map +1 -0
  210. package/dist/src/runtime/devtools/config.js +78 -0
  211. package/dist/src/runtime/devtools/config.js.map +1 -0
  212. package/dist/src/runtime/devtools/constants.d.ts +10 -0
  213. package/dist/src/runtime/devtools/constants.d.ts.map +1 -0
  214. package/dist/src/runtime/devtools/constants.js +18 -0
  215. package/dist/src/runtime/devtools/constants.js.map +1 -0
  216. package/dist/src/runtime/devtools/diagnostics.d.ts +8 -0
  217. package/dist/src/runtime/devtools/diagnostics.d.ts.map +1 -0
  218. package/dist/src/runtime/devtools/diagnostics.js +189 -0
  219. package/dist/src/runtime/devtools/diagnostics.js.map +1 -0
  220. package/dist/src/runtime/devtools/oauth.d.ts +9 -0
  221. package/dist/src/runtime/devtools/oauth.d.ts.map +1 -0
  222. package/dist/src/runtime/devtools/oauth.js +130 -0
  223. package/dist/src/runtime/devtools/oauth.js.map +1 -0
  224. package/dist/src/runtime/devtools/types.d.ts +108 -0
  225. package/dist/src/runtime/devtools/types.d.ts.map +1 -0
  226. package/dist/src/runtime/devtools/types.js +2 -0
  227. package/dist/src/runtime/devtools/types.js.map +1 -0
  228. package/dist/src/runtime/devtools.d.ts +8 -0
  229. package/dist/src/runtime/devtools.d.ts.map +1 -0
  230. package/dist/src/runtime/devtools.js +9 -0
  231. package/dist/src/runtime/devtools.js.map +1 -0
  232. package/dist/src/runtime/next-devtools.d.ts +2 -0
  233. package/dist/src/runtime/next-devtools.d.ts.map +1 -0
  234. package/dist/src/runtime/next-devtools.js +72 -0
  235. package/dist/src/runtime/next-devtools.js.map +1 -0
  236. package/dist/src/runtime/screenshot.d.ts +78 -0
  237. package/dist/src/runtime/screenshot.d.ts.map +1 -0
  238. package/dist/src/runtime/screenshot.js +232 -0
  239. package/dist/src/runtime/screenshot.js.map +1 -0
  240. package/dist/src/runtime/scripts.d.ts +16 -0
  241. package/dist/src/runtime/scripts.d.ts.map +1 -0
  242. package/dist/src/runtime/scripts.js +110 -0
  243. package/dist/src/runtime/scripts.js.map +1 -0
  244. package/dist/src/runtime/session.d.ts +64 -0
  245. package/dist/src/runtime/session.d.ts.map +1 -0
  246. package/dist/src/runtime/session.js +205 -0
  247. package/dist/src/runtime/session.js.map +1 -0
  248. package/dist/src/runtime/smoke.d.ts +36 -0
  249. package/dist/src/runtime/smoke.d.ts.map +1 -0
  250. package/dist/src/runtime/smoke.js +417 -0
  251. package/dist/src/runtime/smoke.js.map +1 -0
  252. package/dist/src/runtime/url.d.ts +10 -0
  253. package/dist/src/runtime/url.d.ts.map +1 -0
  254. package/dist/src/runtime/url.js +147 -0
  255. package/dist/src/runtime/url.js.map +1 -0
  256. package/dist/src/screenshot-hooks.d.ts +13 -0
  257. package/dist/src/screenshot-hooks.d.ts.map +1 -0
  258. package/dist/src/screenshot-hooks.js +56 -0
  259. package/dist/src/screenshot-hooks.js.map +1 -0
  260. package/dist/src/shared/env.d.ts +23 -0
  261. package/dist/src/shared/env.d.ts.map +1 -0
  262. package/dist/src/shared/env.js +38 -0
  263. package/dist/src/shared/env.js.map +1 -0
  264. package/dist/src/shared/index.d.ts +211 -0
  265. package/dist/src/shared/index.d.ts.map +1 -0
  266. package/dist/src/shared/index.js +73 -0
  267. package/dist/src/shared/index.js.map +1 -0
  268. package/dist/src/shared/node.d.ts +12 -0
  269. package/dist/src/shared/node.d.ts.map +1 -0
  270. package/dist/src/shared/node.js +67 -0
  271. package/dist/src/shared/node.js.map +1 -0
  272. package/dist/src/token.d.ts +4 -0
  273. package/dist/src/token.d.ts.map +1 -0
  274. package/dist/src/token.js +58 -0
  275. package/dist/src/token.js.map +1 -0
  276. package/dist/src/types.d.ts +17 -0
  277. package/dist/src/types.d.ts.map +1 -0
  278. package/dist/src/types.js +2 -0
  279. package/dist/src/types.js.map +1 -0
  280. package/dist/src/util/app-label.d.ts +5 -0
  281. package/dist/src/util/app-label.d.ts.map +1 -0
  282. package/dist/src/util/app-label.js +21 -0
  283. package/dist/src/util/app-label.js.map +1 -0
  284. package/dist/src/util/errors.d.ts +9 -0
  285. package/dist/src/util/errors.d.ts.map +1 -0
  286. package/dist/src/util/errors.js +56 -0
  287. package/dist/src/util/errors.js.map +1 -0
  288. package/dist/src/util/path.d.ts +3 -0
  289. package/dist/src/util/path.d.ts.map +1 -0
  290. package/dist/src/util/path.js +6 -0
  291. package/dist/src/util/path.js.map +1 -0
  292. package/dist/src/util/regex.d.ts +4 -0
  293. package/dist/src/util/regex.d.ts.map +1 -0
  294. package/dist/src/util/regex.js +5 -0
  295. package/dist/src/util/regex.js.map +1 -0
  296. package/dist/src/util/time.d.ts +3 -0
  297. package/dist/src/util/time.d.ts.map +1 -0
  298. package/dist/src/util/time.js +7 -0
  299. package/dist/src/util/time.js.map +1 -0
  300. package/package.json +86 -0
@@ -0,0 +1,132 @@
1
+ import path from 'node:path';
2
+ import { sweetLinkEnv } from '../env.js';
3
+ import { formatAppLabel, normalizeAppLabel } from '../util/app-label.js';
4
+ import { loadSweetLinkFileConfig } from './config-file.js';
5
+ import { readCommandOptions } from './env.js';
6
+ const normalizeUrlOption = (value, fallback) => {
7
+ if (typeof value === 'string' && value.trim().length > 0) {
8
+ return value;
9
+ }
10
+ return fallback;
11
+ };
12
+ const normalizeAdminKey = (value) => {
13
+ if (typeof value === 'string') {
14
+ const trimmed = value.trim();
15
+ return trimmed.length > 0 ? trimmed : null;
16
+ }
17
+ return null;
18
+ };
19
+ /** Reads the root program options, falling back to defaults when values are missing. */
20
+ export const readRootProgramOptions = (command) => {
21
+ const rawOptions = readCommandOptions(command);
22
+ const { config } = loadSweetLinkFileConfig();
23
+ let optionUrl;
24
+ if (typeof rawOptions.appUrl === 'string') {
25
+ optionUrl = rawOptions.appUrl;
26
+ }
27
+ else if (typeof rawOptions.url === 'string') {
28
+ optionUrl = rawOptions.url;
29
+ }
30
+ else {
31
+ optionUrl = undefined;
32
+ }
33
+ const optionPort = normalizePort(rawOptions.port);
34
+ const configPort = typeof config.port === 'number' ? config.port : null;
35
+ const fallbackAppUrl = resolveDefaultAppUrl({
36
+ optionUrl,
37
+ optionPort,
38
+ configAppUrl: config.appUrl,
39
+ configPort,
40
+ });
41
+ const fallbackDaemonUrl = config.daemonUrl ?? sweetLinkEnv.daemonUrl;
42
+ const fallbackAdminKey = rawOptions.adminKey ?? config.adminKey ?? sweetLinkEnv.localAdminApiKey ?? sweetLinkEnv.adminApiKey ?? null;
43
+ let optionOauthScriptPath = null;
44
+ if (typeof rawOptions.oauthScript === 'string') {
45
+ const trimmed = rawOptions.oauthScript.trim();
46
+ if (trimmed.length > 0) {
47
+ optionOauthScriptPath = resolveCliPath(trimmed);
48
+ }
49
+ }
50
+ const fallbackOauthScriptPath = optionOauthScriptPath ??
51
+ config.oauthScript ??
52
+ (sweetLinkEnv.cliOauthScriptPath ? resolveCliPath(sweetLinkEnv.cliOauthScriptPath) : null);
53
+ const optionLabel = normalizeAppLabel(rawOptions.appLabel);
54
+ const fallbackAppLabel = formatAppLabel(config.appLabel ?? sweetLinkEnv.appLabel);
55
+ const servers = (config.servers ?? []).map((server) => ({
56
+ env: server.env,
57
+ start: server.start ?? null,
58
+ check: server.check ?? null,
59
+ cwd: server.cwd ?? null,
60
+ timeoutMs: typeof server.timeoutMs === 'number' ? server.timeoutMs : null,
61
+ }));
62
+ return {
63
+ appUrl: normalizeUrlOption(optionUrl, fallbackAppUrl),
64
+ daemonUrl: normalizeUrlOption(rawOptions.daemonUrl, fallbackDaemonUrl),
65
+ adminKey: normalizeAdminKey(fallbackAdminKey),
66
+ oauthScriptPath: fallbackOauthScriptPath,
67
+ appLabel: optionLabel ?? fallbackAppLabel,
68
+ servers,
69
+ };
70
+ };
71
+ /** Extracts SweetLink CLI configuration (app/daemon URLs and admin key). */
72
+ export function resolveConfig(command) {
73
+ const parent = command.parent ?? command;
74
+ const options = readRootProgramOptions(parent);
75
+ const serversByEnv = {};
76
+ for (const server of options.servers) {
77
+ serversByEnv[server.env] = server;
78
+ }
79
+ return {
80
+ appLabel: options.appLabel,
81
+ adminApiKey: options.adminKey,
82
+ appBaseUrl: options.appUrl,
83
+ daemonBaseUrl: options.daemonUrl,
84
+ oauthScriptPath: options.oauthScriptPath,
85
+ servers: serversByEnv,
86
+ };
87
+ }
88
+ const LOCAL_DEFAULT_URL = 'http://localhost:3000';
89
+ function resolveDefaultAppUrl({ optionUrl, optionPort, configAppUrl, configPort }) {
90
+ if (optionUrl && optionUrl.trim().length > 0) {
91
+ return optionUrl;
92
+ }
93
+ if (typeof optionPort === 'number') {
94
+ return applyPortToUrl(configAppUrl ?? sweetLinkEnv.appUrl ?? LOCAL_DEFAULT_URL, optionPort);
95
+ }
96
+ if (configAppUrl) {
97
+ return configAppUrl;
98
+ }
99
+ if (configPort) {
100
+ return applyPortToUrl(sweetLinkEnv.appUrl ?? LOCAL_DEFAULT_URL, configPort);
101
+ }
102
+ return sweetLinkEnv.appUrl ?? LOCAL_DEFAULT_URL;
103
+ }
104
+ function applyPortToUrl(base, port) {
105
+ try {
106
+ const url = new URL(base);
107
+ url.port = String(port);
108
+ return url.toString();
109
+ }
110
+ catch {
111
+ return `http://localhost:${port}`;
112
+ }
113
+ }
114
+ function normalizePort(value) {
115
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
116
+ return Math.floor(value);
117
+ }
118
+ if (typeof value === 'string' && value.trim().length > 0) {
119
+ const parsed = Number.parseInt(value, 10);
120
+ if (Number.isFinite(parsed) && parsed > 0) {
121
+ return parsed;
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ const resolveCliPath = (candidate) => {
127
+ if (path.isAbsolute(candidate)) {
128
+ return candidate;
129
+ }
130
+ return path.resolve(process.cwd(), candidate);
131
+ };
132
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * Returns a shallow copy of the current process environment so child processes
4
+ * can inherit without mutating the global map.
5
+ */
6
+ export declare const cloneProcessEnv: () => NodeJS.ProcessEnv;
7
+ /** Returns a trimmed environment variable or null when unset. */
8
+ export declare const readLocalEnvString: (key: string) => string | null;
9
+ /** Extracts typed Commander options while preserving globals. */
10
+ export declare const readCommandOptions: <T extends object>(command: Command) => T;
11
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/core/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,MAAM,CAAC,UAGzC,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,IAgBzD,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,MAAM,EAAE,SAAS,OAAO,KAAG,CAAqG,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Returns a shallow copy of the current process environment so child processes
3
+ * can inherit without mutating the global map.
4
+ */
5
+ export const cloneProcessEnv = () => {
6
+ // biome-ignore lint/style/noProcessEnv: child processes must inherit the current environment
7
+ return { ...process.env };
8
+ };
9
+ /** Returns a trimmed environment variable or null when unset. */
10
+ export const readLocalEnvString = (key) => {
11
+ try {
12
+ // biome-ignore lint/style/noProcessEnv: CLI utilities fall back to raw env variables when shared config is unavailable.
13
+ if (typeof process === 'undefined' || !process?.env) {
14
+ return null;
15
+ }
16
+ // biome-ignore lint/style/noProcessEnv: CLI utilities fall back to raw env variables when shared config is unavailable.
17
+ const raw = process.env[key];
18
+ if (typeof raw !== 'string') {
19
+ return null;
20
+ }
21
+ const trimmed = raw.trim();
22
+ return trimmed.length > 0 ? trimmed : null;
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ };
28
+ /** Extracts typed Commander options while preserving globals. */
29
+ export const readCommandOptions = (command) => typeof command.optsWithGlobals === 'function' ? command.optsWithGlobals() : command.opts();
30
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/core/env.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAsB,EAAE;IACrD,6FAA6F;IAC7F,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAiB,EAAE;IAC/D,IAAI,CAAC;QACH,wHAAwH;QACxH,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,wHAAwH;QACxH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAmB,OAAgB,EAAK,EAAE,CAAC,OAAO,OAAO,CAAC,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAK,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function registerControlledChromeInstance(devtoolsUrl: string, userDataDirectory: string | undefined): Promise<void>;
2
+ export declare function cleanupControlledChromeRegistry(activeDevtoolsUrl?: string | null): Promise<void>;
3
+ //# sourceMappingURL=devtools-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-registry.d.ts","sourceRoot":"","sources":["../../src/devtools-registry.ts"],"names":[],"mappings":"AA+DA,wBAAsB,gCAAgC,CACpD,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,GAAG,SAAS,GACpC,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED,wBAAsB,+BAA+B,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DtG"}
@@ -0,0 +1,294 @@
1
+ import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { WebSocket } from 'undici';
5
+ import { sweetLinkDebug } from './env.js';
6
+ const DEVTOOLS_REGISTRY_PATH = path.join(os.homedir(), '.sweetlink', 'devtools-registry.json');
7
+ const TRAILING_SLASH_PATTERN = /\/$/;
8
+ const OPTIONAL_TRAILING_SLASH_PATTERN = /\/?$/;
9
+ const SWEETLINK_CHROME_DIR_PATTERN = /sweetlink-chrome-(\d+)-/;
10
+ const SWEETLINK_CHROME_PREFIX_PATTERN = /^sweetlink-chrome-(\d+)-/;
11
+ function normalizeDevtoolsUrl(input) {
12
+ return input.replace(TRAILING_SLASH_PATTERN, '');
13
+ }
14
+ const DEBUG_DEVTOOLS_REGISTRY = sweetLinkDebug;
15
+ const parseDebuggerMessage = (raw) => {
16
+ if (typeof raw !== 'string') {
17
+ return null;
18
+ }
19
+ try {
20
+ return JSON.parse(raw);
21
+ }
22
+ catch (error) {
23
+ if (DEBUG_DEVTOOLS_REGISTRY) {
24
+ console.warn('[SweetLink CLI] Ignoring malformed DevTools message payload.', error);
25
+ }
26
+ }
27
+ return null;
28
+ };
29
+ async function loadRegistry() {
30
+ try {
31
+ const raw = await readFile(DEVTOOLS_REGISTRY_PATH, 'utf8');
32
+ const parsed = JSON.parse(raw);
33
+ if (Array.isArray(parsed)) {
34
+ return parsed.map((entry) => ({
35
+ devtoolsUrl: normalizeDevtoolsUrl(entry.devtoolsUrl),
36
+ userDataDirectory: entry.userDataDirectory,
37
+ lastSeenAt: entry.lastSeenAt ?? Date.now(),
38
+ }));
39
+ }
40
+ }
41
+ catch (error) {
42
+ if (error.code !== 'ENOENT') {
43
+ console.warn('[SweetLink CLI] Failed to read DevTools registry:', error);
44
+ }
45
+ }
46
+ return [];
47
+ }
48
+ async function saveRegistry(registry) {
49
+ const directory = path.dirname(DEVTOOLS_REGISTRY_PATH);
50
+ await mkdir(directory, { recursive: true });
51
+ await writeFile(DEVTOOLS_REGISTRY_PATH, JSON.stringify(registry, null, 2), 'utf8');
52
+ }
53
+ export async function registerControlledChromeInstance(devtoolsUrl, userDataDirectory) {
54
+ if (!userDataDirectory?.includes('sweetlink-chrome-')) {
55
+ return;
56
+ }
57
+ let portSegment = null;
58
+ try {
59
+ const parsed = new URL(devtoolsUrl);
60
+ if (parsed.port) {
61
+ portSegment = parsed.port;
62
+ }
63
+ else if (parsed.protocol === 'http:') {
64
+ portSegment = '80';
65
+ }
66
+ else if (parsed.protocol === 'https:') {
67
+ portSegment = '443';
68
+ }
69
+ else {
70
+ portSegment = null;
71
+ }
72
+ }
73
+ catch {
74
+ portSegment = null;
75
+ }
76
+ if (portSegment && !userDataDirectory.includes(`sweetlink-chrome-${portSegment}`)) {
77
+ return;
78
+ }
79
+ const normalized = normalizeDevtoolsUrl(devtoolsUrl);
80
+ const registry = await loadRegistry();
81
+ const existing = registry.find((entry) => normalizeDevtoolsUrl(entry.devtoolsUrl) === normalized);
82
+ if (existing) {
83
+ existing.userDataDirectory = userDataDirectory;
84
+ existing.lastSeenAt = Date.now();
85
+ }
86
+ else {
87
+ registry.push({ devtoolsUrl: normalized, userDataDirectory, lastSeenAt: Date.now() });
88
+ }
89
+ await saveRegistry(registry);
90
+ }
91
+ export async function cleanupControlledChromeRegistry(activeDevtoolsUrl) {
92
+ const normalizedActive = activeDevtoolsUrl ? normalizeDevtoolsUrl(activeDevtoolsUrl) : null;
93
+ const registry = await loadRegistry();
94
+ const next = [];
95
+ for (const entry of registry) {
96
+ const normalizedEntryUrl = normalizeDevtoolsUrl(entry.devtoolsUrl);
97
+ let portSegment = null;
98
+ try {
99
+ const parsed = new URL(normalizedEntryUrl);
100
+ if (parsed.port) {
101
+ portSegment = parsed.port;
102
+ }
103
+ else if (parsed.protocol === 'http:') {
104
+ portSegment = '80';
105
+ }
106
+ else if (parsed.protocol === 'https:') {
107
+ portSegment = '443';
108
+ }
109
+ else {
110
+ portSegment = null;
111
+ }
112
+ }
113
+ catch {
114
+ portSegment = null;
115
+ }
116
+ if (normalizedEntryUrl === normalizedActive) {
117
+ if (portSegment &&
118
+ entry.userDataDirectory &&
119
+ !entry.userDataDirectory.includes(`sweetlink-chrome-${portSegment}`)) {
120
+ const stalePortMatch = entry.userDataDirectory.match(SWEETLINK_CHROME_DIR_PATTERN);
121
+ if (stalePortMatch) {
122
+ // biome-ignore lint/performance/noAwaitInLoops: chrome instances must close sequentially to avoid reusing stale ports.
123
+ await attemptCloseControlledChrome(`http://127.0.0.1:${stalePortMatch[1]}`);
124
+ }
125
+ continue;
126
+ }
127
+ entry.lastSeenAt = Date.now();
128
+ next.push(entry);
129
+ continue;
130
+ }
131
+ if (!entry.userDataDirectory.includes('sweetlink-chrome-')) {
132
+ // Avoid touching DevTools instances we did not launch (e.g. manual overrides).
133
+ next.push(entry);
134
+ continue;
135
+ }
136
+ const closed = await attemptCloseControlledChrome(normalizedEntryUrl);
137
+ if (!closed) {
138
+ // Browser is already gone or could not be closed; drop the entry to avoid repeated attempts.
139
+ continue;
140
+ }
141
+ console.log(`[SweetLink CLI] Closed stale controlled Chrome at ${normalizedEntryUrl}`);
142
+ }
143
+ await saveRegistry(next);
144
+ await closeLingeringChromeProcesses(normalizedActive);
145
+ }
146
+ async function attemptCloseControlledChrome(devtoolsUrl) {
147
+ const normalized = devtoolsUrl.replace(OPTIONAL_TRAILING_SLASH_PATTERN, '');
148
+ try {
149
+ const response = await fetch(`${normalized}/json/version`, { method: 'GET' });
150
+ if (!response.ok) {
151
+ return false;
152
+ }
153
+ const debuggerPayload = (await response.json());
154
+ const wsUrl = debuggerPayload.webSocketDebuggerUrl;
155
+ if (!wsUrl) {
156
+ return false;
157
+ }
158
+ await new Promise((resolve, reject) => {
159
+ let settleState = 'pending';
160
+ const finish = (error = null) => {
161
+ if (settleState === 'done') {
162
+ return;
163
+ }
164
+ settleState = 'done';
165
+ if (error) {
166
+ if (error instanceof Error) {
167
+ reject(error);
168
+ return;
169
+ }
170
+ if (typeof error === 'string') {
171
+ reject(new Error(error));
172
+ return;
173
+ }
174
+ reject(new Error('Unknown DevTools close error'));
175
+ }
176
+ else {
177
+ resolve();
178
+ }
179
+ };
180
+ const socket = new WebSocket(wsUrl);
181
+ const timeout = setTimeout(() => {
182
+ socket.close();
183
+ finish(new Error('DevTools close timeout'));
184
+ }, 2000);
185
+ const maybeNodeTimer = timeout;
186
+ if (typeof maybeNodeTimer?.unref === 'function') {
187
+ maybeNodeTimer.unref();
188
+ }
189
+ socket.addEventListener('open', () => {
190
+ socket.send(JSON.stringify({ id: 1, method: 'Browser.close' }));
191
+ });
192
+ socket.addEventListener('message', (event) => {
193
+ const messagePayload = parseDebuggerMessage(event.data);
194
+ if (messagePayload?.id === 1) {
195
+ clearTimeout(timeout);
196
+ socket.close();
197
+ finish();
198
+ }
199
+ });
200
+ socket.addEventListener('close', () => {
201
+ clearTimeout(timeout);
202
+ finish();
203
+ });
204
+ socket.addEventListener('error', (event) => {
205
+ clearTimeout(timeout);
206
+ const candidate = event;
207
+ const message = typeof candidate.message === 'string' ? candidate.message : null;
208
+ if (!message && candidate.error) {
209
+ finish(candidate.error);
210
+ return;
211
+ }
212
+ if (!message) {
213
+ console.warn('[SweetLink CLI] DevTools WebSocket reported an unknown error event.', { event });
214
+ }
215
+ finish(new Error(message ?? 'DevTools WebSocket reported an unknown error'));
216
+ });
217
+ });
218
+ return true;
219
+ }
220
+ catch (error) {
221
+ if (error instanceof Error) {
222
+ const message = error.message || '';
223
+ if (message.includes('ECONNREFUSED') || message.includes('fetch failed')) {
224
+ return false;
225
+ }
226
+ console.warn(`[SweetLink CLI] Unable to close stale controlled Chrome at ${devtoolsUrl}:`, message);
227
+ }
228
+ else {
229
+ console.warn(`[SweetLink CLI] Unable to close stale controlled Chrome at ${devtoolsUrl}:`, error);
230
+ }
231
+ return false;
232
+ }
233
+ }
234
+ async function closeLingeringChromeProcesses(activeDevtoolsUrl) {
235
+ let activePort = null;
236
+ if (activeDevtoolsUrl) {
237
+ try {
238
+ const parsed = new URL(activeDevtoolsUrl);
239
+ if (parsed.port) {
240
+ activePort = parsed.port;
241
+ }
242
+ else if (parsed.protocol === 'http:') {
243
+ activePort = '80';
244
+ }
245
+ else if (parsed.protocol === 'https:') {
246
+ activePort = '443';
247
+ }
248
+ else {
249
+ activePort = null;
250
+ }
251
+ }
252
+ catch {
253
+ activePort = null;
254
+ }
255
+ }
256
+ const processed = new Set();
257
+ let entries;
258
+ try {
259
+ entries = await readdir(os.tmpdir());
260
+ }
261
+ catch {
262
+ return;
263
+ }
264
+ const MAX_SWEEPS = 5;
265
+ let sweeps = 0;
266
+ for (const entry of entries) {
267
+ const match = entry.match(SWEETLINK_CHROME_PREFIX_PATTERN);
268
+ if (!match) {
269
+ continue;
270
+ }
271
+ const portValue = match[1];
272
+ if (!portValue) {
273
+ continue;
274
+ }
275
+ const port = portValue;
276
+ if (processed.has(port)) {
277
+ continue;
278
+ }
279
+ processed.add(port);
280
+ if (activePort && port === activePort) {
281
+ continue;
282
+ }
283
+ // biome-ignore lint/performance/noAwaitInLoops: sequential port sweeps avoid throttling Chrome shutdown.
284
+ const closed = await attemptCloseControlledChrome(`http://127.0.0.1:${port}`);
285
+ sweeps += 1;
286
+ if (sweeps >= MAX_SWEEPS) {
287
+ break;
288
+ }
289
+ if (closed) {
290
+ console.log(`[SweetLink CLI] Closed lingering Chrome instance at port ${port}`);
291
+ }
292
+ }
293
+ }
294
+ //# sourceMappingURL=devtools-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-registry.js","sourceRoot":"","sources":["../../src/devtools-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { SweetLinkSharedEnv } from '../shared/src/env.js';
2
+ export declare const sweetLinkEnv: SweetLinkSharedEnv;
3
+ export declare const sweetLinkDebug: boolean;
4
+ export declare const sweetLinkCliTestMode: boolean;
5
+ export interface SweetLinkCliEnv {
6
+ readonly caPath: string | null;
7
+ readonly caRoot: string;
8
+ readonly chromePath: string | null;
9
+ readonly devtoolsUrl: string | null;
10
+ readonly chromeProfilePath: string | null;
11
+ readonly cookieDebug: boolean;
12
+ readonly oauthScriptPath: string | null;
13
+ }
14
+ export declare function readCliEnv(): SweetLinkCliEnv;
15
+ export declare const cliEnv: SweetLinkCliEnv;
16
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,eAAO,MAAM,YAAY,EAAE,kBAAuC,CAAC;AACnE,eAAO,MAAM,cAAc,SAAqB,CAAC;AACjD,eAAO,MAAM,oBAAoB,SAA2B,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,wBAAgB,UAAU,IAAI,eAAe,CAU5C;AAED,eAAO,MAAM,MAAM,iBAAe,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { sweetLinkEnv as sharedSweetLinkEnv } from '../shared/src/env.js';
2
+ export const sweetLinkEnv = sharedSweetLinkEnv;
3
+ export const sweetLinkDebug = sweetLinkEnv.debug;
4
+ export const sweetLinkCliTestMode = sweetLinkEnv.cliTestMode;
5
+ export function readCliEnv() {
6
+ return {
7
+ caPath: sharedSweetLinkEnv.cliCaPath,
8
+ caRoot: sharedSweetLinkEnv.cliCaRoot,
9
+ chromePath: sharedSweetLinkEnv.cliChromePath,
10
+ devtoolsUrl: sharedSweetLinkEnv.cliDevtoolsUrl,
11
+ chromeProfilePath: sharedSweetLinkEnv.cliChromeProfilePath,
12
+ cookieDebug: sharedSweetLinkEnv.cliCookieDebug,
13
+ oauthScriptPath: sharedSweetLinkEnv.cliOauthScriptPath,
14
+ };
15
+ }
16
+ export const cliEnv = readCliEnv();
17
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,CAAC,MAAM,YAAY,GAAuB,kBAAkB,CAAC;AACnE,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC,WAAW,CAAC;AAY7D,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,MAAM,EAAE,kBAAkB,CAAC,SAAS;QACpC,MAAM,EAAE,kBAAkB,CAAC,SAAS;QACpC,UAAU,EAAE,kBAAkB,CAAC,aAAa;QAC5C,WAAW,EAAE,kBAAkB,CAAC,cAAc;QAC9C,iBAAiB,EAAE,kBAAkB,CAAC,oBAAoB;QAC1D,WAAW,EAAE,kBAAkB,CAAC,cAAc;QAC9C,eAAe,EAAE,kBAAkB,CAAC,kBAAkB;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fetchJson<T>(input: string, init?: RequestInit): Promise<T>;
2
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAsBA,wBAAsB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAqBhF"}
@@ -0,0 +1,53 @@
1
+ import { inspect } from 'node:util';
2
+ const formatCause = (cause) => {
3
+ if (cause === null || cause === undefined) {
4
+ return null;
5
+ }
6
+ if (cause instanceof Error) {
7
+ return cause.message || cause.name;
8
+ }
9
+ if (typeof cause === 'string') {
10
+ return cause;
11
+ }
12
+ if (typeof cause === 'number' || typeof cause === 'boolean') {
13
+ return String(cause);
14
+ }
15
+ try {
16
+ return inspect(cause, { depth: 2 });
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ };
22
+ export async function fetchJson(input, init) {
23
+ try {
24
+ const response = await fetch(input, init);
25
+ if (!response.ok) {
26
+ const body = await safeJson(response);
27
+ const detail = body ? JSON.stringify(body) : `${response.status} ${response.statusText}`;
28
+ throw new Error(`Request failed: ${detail}`);
29
+ }
30
+ return (await response.json());
31
+ }
32
+ catch (error) {
33
+ if (error instanceof Error) {
34
+ const formattedCause = formatCause(error.cause);
35
+ const causeSuffix = formattedCause ? ` (cause: ${formattedCause})` : '';
36
+ let message = `Request failed: ${error.message}${causeSuffix}`;
37
+ if (message.includes('Session not found or offline')) {
38
+ message += '\nHint: run `pnpm sweetlink sessions` to list active sessions and retry with a fresh id.';
39
+ }
40
+ error.message = message;
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ async function safeJson(response) {
46
+ try {
47
+ return await response.json();
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAiB,EAAE;IACpD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,KAAa,EAAE,IAAkB;IAClE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACzF,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,YAAY,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,IAAI,OAAO,GAAG,mBAAmB,KAAK,CAAC,OAAO,GAAG,WAAW,EAAE,CAAC;YAC/D,IAAI,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;gBACrD,OAAO,IAAI,0FAA0F,CAAC;YACxG,CAAC;YACD,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1B,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAkB;IACxC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import { prepareChromeLaunch } from './runtime/chrome.js';
3
+ import { buildCookieOrigins, collectChromeCookies, normalizePuppeteerCookie } from './runtime/cookies.js';
4
+ import { deriveDevtoolsLinkInfo } from './runtime/devtools.js';
5
+ import { buildClickScript } from './runtime/session.js';
6
+ import { buildWaitCandidateUrls } from './runtime/url.js';
7
+ export declare function formatPathForDisplay(value: string): string;
8
+ export declare const __sweetlinkCliTestHelpers: {
9
+ collectChromeCookies: typeof collectChromeCookies;
10
+ normalizePuppeteerCookie: typeof normalizePuppeteerCookie;
11
+ buildCookieOrigins: typeof buildCookieOrigins;
12
+ prepareChromeLaunch: typeof prepareChromeLaunch;
13
+ buildWaitCandidateUrls: typeof buildWaitCandidateUrls;
14
+ deriveDevtoolsLinkInfo: typeof deriveDevtoolsLinkInfo;
15
+ buildClickScript: typeof buildClickScript;
16
+ };
17
+ export { diagnosticsContainBlockingIssues, logBootstrapDiagnostics } from './runtime/devtools.js';
18
+ export { buildClickScript, fetchConsoleEvents, fetchSessionSummaries, formatSessionHeadline, resolvePromptOption, resolveSessionIdFromHint, } from './runtime/session.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AA2BA,OAAO,EAKL,mBAAmB,EAIpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EAEpB,wBAAwB,EAEzB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAWL,sBAAsB,EAYvB,MAAM,uBAAuB,CAAC;AAU/B,OAAO,EACL,gBAAgB,EAWjB,MAAM,sBAAsB,CAAC;AAgB9B,OAAO,EAAE,sBAAsB,EAAmE,MAAM,kBAAkB,CAAC;AA6vC3H,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AA2hBD,eAAO,MAAM,yBAAyB;;;;;;;;CAQrC,CAAC;AAGF,OAAO,EAAE,gCAAgC,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC"}