@vforsh/argus 0.1.2 → 0.1.3

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 (249) hide show
  1. package/README.md +263 -16
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/bin.js +712 -9
  4. package/dist/bin.js.map +1 -1
  5. package/dist/cdp/resolveCdpEndpoint.d.ts +15 -0
  6. package/dist/cdp/resolveCdpEndpoint.d.ts.map +1 -0
  7. package/dist/cdp/resolveCdpEndpoint.js +56 -0
  8. package/dist/cdp/resolveCdpEndpoint.js.map +1 -0
  9. package/dist/cdp/selectTarget.d.ts +26 -0
  10. package/dist/cdp/selectTarget.d.ts.map +1 -0
  11. package/dist/cdp/selectTarget.js +87 -0
  12. package/dist/cdp/selectTarget.js.map +1 -0
  13. package/dist/cdp/types.d.ts +13 -0
  14. package/dist/cdp/types.d.ts.map +1 -0
  15. package/dist/cdp/types.js +2 -0
  16. package/dist/cdp/types.js.map +1 -0
  17. package/dist/commands/chrome.d.ts +41 -0
  18. package/dist/commands/chrome.d.ts.map +1 -0
  19. package/dist/commands/chrome.js +463 -0
  20. package/dist/commands/chrome.js.map +1 -0
  21. package/dist/commands/chromeStart.d.ts +9 -0
  22. package/dist/commands/chromeStart.d.ts.map +1 -0
  23. package/dist/commands/chromeStart.js +310 -0
  24. package/dist/commands/chromeStart.js.map +1 -0
  25. package/dist/commands/configInit.d.ts +6 -0
  26. package/dist/commands/configInit.d.ts.map +1 -0
  27. package/dist/commands/configInit.js +88 -0
  28. package/dist/commands/configInit.js.map +1 -0
  29. package/dist/commands/contexts.d.ts +7 -0
  30. package/dist/commands/contexts.d.ts.map +1 -0
  31. package/dist/commands/contexts.js +54 -0
  32. package/dist/commands/contexts.js.map +1 -0
  33. package/dist/commands/doctor.d.ts +5 -0
  34. package/dist/commands/doctor.d.ts.map +1 -0
  35. package/dist/commands/doctor.js +142 -0
  36. package/dist/commands/doctor.js.map +1 -0
  37. package/dist/commands/domAdd.d.ts +17 -0
  38. package/dist/commands/domAdd.d.ts.map +1 -0
  39. package/dist/commands/domAdd.js +203 -0
  40. package/dist/commands/domAdd.js.map +1 -0
  41. package/dist/commands/domClick.d.ts +9 -0
  42. package/dist/commands/domClick.d.ts.map +1 -0
  43. package/dist/commands/domClick.js +75 -0
  44. package/dist/commands/domClick.js.map +1 -0
  45. package/dist/commands/domDiff.d.ts +43 -0
  46. package/dist/commands/domDiff.d.ts.map +1 -0
  47. package/dist/commands/domDiff.js +279 -0
  48. package/dist/commands/domDiff.js.map +1 -0
  49. package/dist/commands/domHover.d.ts +9 -0
  50. package/dist/commands/domHover.d.ts.map +1 -0
  51. package/dist/commands/domHover.js +75 -0
  52. package/dist/commands/domHover.js.map +1 -0
  53. package/dist/commands/domInfo.d.ts +10 -0
  54. package/dist/commands/domInfo.d.ts.map +1 -0
  55. package/dist/commands/domInfo.js +93 -0
  56. package/dist/commands/domInfo.js.map +1 -0
  57. package/dist/commands/domModify.d.ts +35 -0
  58. package/dist/commands/domModify.d.ts.map +1 -0
  59. package/dist/commands/domModify.js +203 -0
  60. package/dist/commands/domModify.js.map +1 -0
  61. package/dist/commands/domRemove.d.ts +9 -0
  62. package/dist/commands/domRemove.d.ts.map +1 -0
  63. package/dist/commands/domRemove.js +75 -0
  64. package/dist/commands/domRemove.js.map +1 -0
  65. package/dist/commands/domTree.d.ts +11 -0
  66. package/dist/commands/domTree.d.ts.map +1 -0
  67. package/dist/commands/domTree.js +100 -0
  68. package/dist/commands/domTree.js.map +1 -0
  69. package/dist/commands/eval.d.ts +22 -0
  70. package/dist/commands/eval.d.ts.map +1 -0
  71. package/dist/commands/eval.js +292 -0
  72. package/dist/commands/eval.js.map +1 -0
  73. package/dist/commands/extension/attach.d.ts +8 -0
  74. package/dist/commands/extension/attach.d.ts.map +1 -0
  75. package/dist/commands/extension/attach.js +171 -0
  76. package/dist/commands/extension/attach.js.map +1 -0
  77. package/dist/commands/extension/detach.d.ts +6 -0
  78. package/dist/commands/extension/detach.d.ts.map +1 -0
  79. package/dist/commands/extension/detach.js +132 -0
  80. package/dist/commands/extension/detach.js.map +1 -0
  81. package/dist/commands/extension/info.d.ts +5 -0
  82. package/dist/commands/extension/info.d.ts.map +1 -0
  83. package/dist/commands/extension/info.js +68 -0
  84. package/dist/commands/extension/info.js.map +1 -0
  85. package/dist/commands/extension/nativeHost.d.ts +21 -0
  86. package/dist/commands/extension/nativeHost.d.ts.map +1 -0
  87. package/dist/commands/extension/nativeHost.js +106 -0
  88. package/dist/commands/extension/nativeHost.js.map +1 -0
  89. package/dist/commands/extension/remove.d.ts +5 -0
  90. package/dist/commands/extension/remove.d.ts.map +1 -0
  91. package/dist/commands/extension/remove.js +75 -0
  92. package/dist/commands/extension/remove.js.map +1 -0
  93. package/dist/commands/extension/setup.d.ts +6 -0
  94. package/dist/commands/extension/setup.d.ts.map +1 -0
  95. package/dist/commands/extension/setup.js +89 -0
  96. package/dist/commands/extension/setup.js.map +1 -0
  97. package/dist/commands/extension/status.d.ts +5 -0
  98. package/dist/commands/extension/status.d.ts.map +1 -0
  99. package/dist/commands/extension/status.js +82 -0
  100. package/dist/commands/extension/status.js.map +1 -0
  101. package/dist/commands/extension/targets.d.ts +13 -0
  102. package/dist/commands/extension/targets.d.ts.map +1 -0
  103. package/dist/commands/extension/targets.js +77 -0
  104. package/dist/commands/extension/targets.js.map +1 -0
  105. package/dist/commands/frames.d.ts +7 -0
  106. package/dist/commands/frames.d.ts.map +1 -0
  107. package/dist/commands/frames.js +90 -0
  108. package/dist/commands/frames.js.map +1 -0
  109. package/dist/commands/iframeHelper.d.ts +13 -0
  110. package/dist/commands/iframeHelper.d.ts.map +1 -0
  111. package/dist/commands/iframeHelper.js +63 -0
  112. package/dist/commands/iframeHelper.js.map +1 -0
  113. package/dist/commands/list.d.ts.map +1 -1
  114. package/dist/commands/list.js +8 -6
  115. package/dist/commands/list.js.map +1 -1
  116. package/dist/commands/logs.d.ts +6 -2
  117. package/dist/commands/logs.d.ts.map +1 -1
  118. package/dist/commands/logs.js +72 -16
  119. package/dist/commands/logs.js.map +1 -1
  120. package/dist/commands/net.d.ts +11 -0
  121. package/dist/commands/net.d.ts.map +1 -0
  122. package/dist/commands/net.js +90 -0
  123. package/dist/commands/net.js.map +1 -0
  124. package/dist/commands/netTail.d.ts +12 -0
  125. package/dist/commands/netTail.d.ts.map +1 -0
  126. package/dist/commands/netTail.js +112 -0
  127. package/dist/commands/netTail.js.map +1 -0
  128. package/dist/commands/page.d.ts +13 -0
  129. package/dist/commands/page.d.ts.map +1 -0
  130. package/dist/commands/page.js +340 -0
  131. package/dist/commands/page.js.map +1 -0
  132. package/dist/commands/reload.d.ts +8 -0
  133. package/dist/commands/reload.d.ts.map +1 -0
  134. package/dist/commands/reload.js +50 -0
  135. package/dist/commands/reload.js.map +1 -0
  136. package/dist/commands/screenshot.d.ts +9 -0
  137. package/dist/commands/screenshot.d.ts.map +1 -0
  138. package/dist/commands/screenshot.js +52 -0
  139. package/dist/commands/screenshot.js.map +1 -0
  140. package/dist/commands/storageLocal.d.ts +18 -0
  141. package/dist/commands/storageLocal.d.ts.map +1 -0
  142. package/dist/commands/storageLocal.js +119 -0
  143. package/dist/commands/storageLocal.js.map +1 -0
  144. package/dist/commands/tail.d.ts +6 -2
  145. package/dist/commands/tail.d.ts.map +1 -1
  146. package/dist/commands/tail.js +71 -15
  147. package/dist/commands/tail.js.map +1 -1
  148. package/dist/commands/trace.d.ts +27 -0
  149. package/dist/commands/trace.d.ts.map +1 -0
  150. package/dist/commands/trace.js +139 -0
  151. package/dist/commands/trace.js.map +1 -0
  152. package/dist/commands/watcherNativeHost.d.ts +13 -0
  153. package/dist/commands/watcherNativeHost.d.ts.map +1 -0
  154. package/dist/commands/watcherNativeHost.js +45 -0
  155. package/dist/commands/watcherNativeHost.js.map +1 -0
  156. package/dist/commands/watcherPrune.d.ts +9 -0
  157. package/dist/commands/watcherPrune.d.ts.map +1 -0
  158. package/dist/commands/watcherPrune.js +83 -0
  159. package/dist/commands/watcherPrune.js.map +1 -0
  160. package/dist/commands/watcherStart.d.ts +23 -0
  161. package/dist/commands/watcherStart.d.ts.map +1 -0
  162. package/dist/commands/watcherStart.js +182 -0
  163. package/dist/commands/watcherStart.js.map +1 -0
  164. package/dist/commands/watcherStatus.d.ts +7 -0
  165. package/dist/commands/watcherStatus.d.ts.map +1 -0
  166. package/dist/commands/watcherStatus.js +44 -0
  167. package/dist/commands/watcherStatus.js.map +1 -0
  168. package/dist/commands/watcherStop.d.ts +5 -0
  169. package/dist/commands/watcherStop.d.ts.map +1 -0
  170. package/dist/commands/watcherStop.js +103 -0
  171. package/dist/commands/watcherStop.js.map +1 -0
  172. package/dist/config/argusConfig.d.ts +67 -0
  173. package/dist/config/argusConfig.d.ts.map +1 -0
  174. package/dist/config/argusConfig.js +338 -0
  175. package/dist/config/argusConfig.js.map +1 -0
  176. package/dist/eval/evalClient.d.ts +35 -0
  177. package/dist/eval/evalClient.d.ts.map +1 -0
  178. package/dist/eval/evalClient.js +71 -0
  179. package/dist/eval/evalClient.js.map +1 -0
  180. package/dist/frame/frameSelector.d.ts +14 -0
  181. package/dist/frame/frameSelector.d.ts.map +1 -0
  182. package/dist/frame/frameSelector.js +31 -0
  183. package/dist/frame/frameSelector.js.map +1 -0
  184. package/dist/httpClient.d.ts +6 -1
  185. package/dist/httpClient.d.ts.map +1 -1
  186. package/dist/httpClient.js +54 -1
  187. package/dist/httpClient.js.map +1 -1
  188. package/dist/index.d.ts +1 -1
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +1 -1
  191. package/dist/index.js.map +1 -1
  192. package/dist/output/dom.d.ts +14 -0
  193. package/dist/output/dom.d.ts.map +1 -0
  194. package/dist/output/dom.js +92 -0
  195. package/dist/output/dom.js.map +1 -0
  196. package/dist/output/domDiff.d.ts +14 -0
  197. package/dist/output/domDiff.d.ts.map +1 -0
  198. package/dist/output/domDiff.js +151 -0
  199. package/dist/output/domDiff.js.map +1 -0
  200. package/dist/output/format.d.ts +3 -2
  201. package/dist/output/format.d.ts.map +1 -1
  202. package/dist/output/format.js +11 -3
  203. package/dist/output/format.js.map +1 -1
  204. package/dist/output/io.d.ts +14 -0
  205. package/dist/output/io.d.ts.map +1 -0
  206. package/dist/output/io.js +28 -0
  207. package/dist/output/io.js.map +1 -0
  208. package/dist/output/preview.d.ts +3 -0
  209. package/dist/output/preview.d.ts.map +1 -0
  210. package/dist/output/preview.js +6 -0
  211. package/dist/output/preview.js.map +1 -0
  212. package/dist/plugins/argusApi.d.ts +22 -0
  213. package/dist/plugins/argusApi.d.ts.map +1 -0
  214. package/dist/plugins/argusApi.js +92 -0
  215. package/dist/plugins/argusApi.js.map +1 -0
  216. package/dist/plugins/loader.d.ts +12 -0
  217. package/dist/plugins/loader.d.ts.map +1 -0
  218. package/dist/plugins/loader.js +92 -0
  219. package/dist/plugins/loader.js.map +1 -0
  220. package/dist/plugins/registry.d.ts +17 -0
  221. package/dist/plugins/registry.d.ts.map +1 -0
  222. package/dist/plugins/registry.js +44 -0
  223. package/dist/plugins/registry.js.map +1 -0
  224. package/dist/plugins/resolver.d.ts +6 -0
  225. package/dist/plugins/resolver.d.ts.map +1 -0
  226. package/dist/plugins/resolver.js +86 -0
  227. package/dist/plugins/resolver.js.map +1 -0
  228. package/dist/registry.d.ts +2 -0
  229. package/dist/registry.d.ts.map +1 -1
  230. package/dist/registry.js +12 -0
  231. package/dist/registry.js.map +1 -1
  232. package/dist/utils/chromeBin.d.ts +3 -0
  233. package/dist/utils/chromeBin.d.ts.map +1 -0
  234. package/dist/utils/chromeBin.js +46 -0
  235. package/dist/utils/chromeBin.js.map +1 -0
  236. package/dist/utils/ports.d.ts +3 -0
  237. package/dist/utils/ports.d.ts.map +1 -0
  238. package/dist/utils/ports.js +39 -0
  239. package/dist/utils/ports.js.map +1 -0
  240. package/dist/watchers/candidates.d.ts +4 -0
  241. package/dist/watchers/candidates.d.ts.map +1 -0
  242. package/dist/watchers/candidates.js +7 -0
  243. package/dist/watchers/candidates.js.map +1 -0
  244. package/dist/watchers/resolveWatcher.d.ts +16 -0
  245. package/dist/watchers/resolveWatcher.d.ts.map +1 -0
  246. package/dist/watchers/resolveWatcher.js +50 -0
  247. package/dist/watchers/resolveWatcher.js.map +1 -0
  248. package/package.json +7 -3
  249. package/schemas/argus.config.schema.json +115 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherNativeHost.d.ts","sourceRoot":"","sources":["../../src/commands/watcherNativeHost.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAU,SAAS,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAuCnF,CAAA"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Native Messaging host command for Chrome extension.
3
+ *
4
+ * This command is invoked by Chrome when the extension connects via
5
+ * chrome.runtime.connectNative(). It communicates over stdin/stdout
6
+ * using Chrome's Native Messaging protocol (length-prefixed JSON).
7
+ */
8
+ import { startWatcher } from '@vforsh/argus-watcher';
9
+ export const runWatcherNativeHost = async (options) => {
10
+ const watcherId = options.id?.trim() || 'extension';
11
+ let handle;
12
+ try {
13
+ handle = await startWatcher({
14
+ id: watcherId,
15
+ source: 'extension',
16
+ host: '127.0.0.1',
17
+ port: 0,
18
+ pageIndicator: { enabled: false },
19
+ });
20
+ }
21
+ catch (error) {
22
+ // Write error to stderr (Native Messaging reads stdout only)
23
+ console.error(`Failed to start watcher: ${error instanceof Error ? error.message : error}`);
24
+ process.exit(1);
25
+ }
26
+ // Log to stderr for debugging (stdout is reserved for Native Messaging)
27
+ console.error(`[NativeHost] Watcher started: id=${handle.watcher.id} port=${handle.watcher.port}`);
28
+ const cleanup = async () => {
29
+ try {
30
+ await handle.close();
31
+ }
32
+ catch {
33
+ // Ignore
34
+ }
35
+ };
36
+ process.on('SIGINT', () => {
37
+ void cleanup().then(() => process.exit(0));
38
+ });
39
+ process.on('SIGTERM', () => {
40
+ void cleanup().then(() => process.exit(0));
41
+ });
42
+ // Keep process running - Native Messaging will handle stdin/stdout
43
+ await new Promise(() => { });
44
+ };
45
+ //# sourceMappingURL=watcherNativeHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherNativeHost.js","sourceRoot":"","sources":["../../src/commands/watcherNativeHost.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAA;AAOxE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAA0B,EAAiB,EAAE;IACvF,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,WAAW,CAAA;IAEnD,IAAI,MAAqB,CAAA;IACzB,IAAI,CAAC;QACJ,MAAM,GAAG,MAAM,YAAY,CAAC;YAC3B,EAAE,EAAE,SAAS;YACb,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,CAAC;YACP,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;SACjC,CAAC,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,6DAA6D;QAC7D,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,wEAAwE;IACxE,OAAO,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAElG,MAAM,OAAO,GAAG,KAAK,IAAmB,EAAE;QACzC,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;IACF,CAAC,CAAA;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACzB,KAAK,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QAC1B,KAAK,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,mEAAmE;IACnE,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAC5B,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ /** Options for the watcher prune command. */
2
+ export type WatcherPruneOptions = {
3
+ byCwd?: string;
4
+ dryRun?: boolean;
5
+ json?: boolean;
6
+ };
7
+ /** Execute the watcher prune command. */
8
+ export declare const runWatcherPrune: (options: WatcherPruneOptions) => Promise<void>;
9
+ //# sourceMappingURL=watcherPrune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherPrune.d.ts","sourceRoot":"","sources":["../../src/commands/watcherPrune.ts"],"names":[],"mappings":"AAKA,6CAA6C;AAC7C,MAAM,MAAM,mBAAmB,GAAG;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AASD,yCAAyC;AACzC,eAAO,MAAM,eAAe,GAAU,SAAS,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAwEhF,CAAA"}
@@ -0,0 +1,83 @@
1
+ import { loadRegistry, pruneRegistry, removeWatchersAndPersist } from '../registry.js';
2
+ import { fetchJson } from '../httpClient.js';
3
+ import { createOutput } from '../output/io.js';
4
+ /** Execute the watcher prune command. */
5
+ export const runWatcherPrune = async (options) => {
6
+ const output = createOutput(options);
7
+ // Validate --by-cwd is not empty/whitespace
8
+ if (options.byCwd !== undefined && options.byCwd.trim().length === 0) {
9
+ output.writeWarn('Invalid --by-cwd value: empty or whitespace.');
10
+ process.exitCode = 2;
11
+ return;
12
+ }
13
+ let registry = await loadRegistry();
14
+ registry = await pruneRegistry(registry);
15
+ let watchers = Object.values(registry.watchers);
16
+ // Filter by cwd if specified
17
+ if (options.byCwd) {
18
+ const substring = options.byCwd.trim();
19
+ watchers = watchers.filter((watcher) => watcher.cwd && watcher.cwd.includes(substring));
20
+ }
21
+ // Guard: no watchers after filtering
22
+ if (watchers.length === 0) {
23
+ if (options.json) {
24
+ output.writeJson({ keptIds: [], removedIds: [], dryRun: options.dryRun === true });
25
+ }
26
+ else {
27
+ output.writeHuman('No watchers to check.');
28
+ }
29
+ return;
30
+ }
31
+ const keptIds = [];
32
+ const removedIds = [];
33
+ // Check each watcher for reachability
34
+ for (const watcher of watchers) {
35
+ const reachable = await checkWatcherReachable(watcher);
36
+ if (reachable) {
37
+ keptIds.push(watcher.id);
38
+ }
39
+ else {
40
+ removedIds.push(watcher.id);
41
+ output.writeWarn(`${watcher.id}: unreachable`);
42
+ }
43
+ }
44
+ // Guard: nothing to remove
45
+ if (removedIds.length === 0) {
46
+ if (options.json) {
47
+ output.writeJson({ keptIds, removedIds, dryRun: options.dryRun === true });
48
+ }
49
+ else {
50
+ output.writeHuman('All watchers are reachable. Nothing to prune.');
51
+ }
52
+ return;
53
+ }
54
+ // Persist changes unless dry-run
55
+ if (options.dryRun) {
56
+ if (options.json) {
57
+ output.writeJson({ keptIds, removedIds, dryRun: true });
58
+ }
59
+ else {
60
+ output.writeHuman(`Would remove ${removedIds.length} watcher(s): ${removedIds.join(', ')}`);
61
+ }
62
+ return;
63
+ }
64
+ await removeWatchersAndPersist(registry, removedIds);
65
+ if (options.json) {
66
+ output.writeJson({ keptIds, removedIds, dryRun: false });
67
+ }
68
+ else {
69
+ output.writeHuman(`Removed ${removedIds.length} watcher(s): ${removedIds.join(', ')}`);
70
+ }
71
+ };
72
+ /** Check if a watcher is reachable via /status endpoint. */
73
+ const checkWatcherReachable = async (watcher) => {
74
+ const url = `http://${watcher.host}:${watcher.port}/status`;
75
+ try {
76
+ await fetchJson(url, { timeoutMs: 2_000 });
77
+ return true;
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ };
83
+ //# sourceMappingURL=watcherPrune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherPrune.js","sourceRoot":"","sources":["../../src/commands/watcherPrune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type PageConsoleLogging, type WatcherSourceMode } from '@vforsh/argus-watcher';
2
+ export type WatcherStartOptions = {
3
+ id?: string;
4
+ /** Source mode for CDP connection: 'cdp' (default) or 'extension'. */
5
+ source?: WatcherSourceMode;
6
+ url?: string;
7
+ json?: boolean;
8
+ chromeHost?: string;
9
+ chromePort?: string | number;
10
+ pageIndicator?: boolean;
11
+ artifacts?: string;
12
+ pageConsoleLogging?: PageConsoleLogging;
13
+ /** Filter by target type (e.g., 'page', 'iframe'). */
14
+ type?: string;
15
+ /** Match against URL origin only (protocol + host + port). */
16
+ origin?: string;
17
+ /** Connect to a specific target by its Chrome target ID. */
18
+ target?: string;
19
+ /** Filter by parent target URL pattern. */
20
+ parent?: string;
21
+ };
22
+ export declare const runWatcherStart: (options: WatcherStartOptions) => Promise<void>;
23
+ //# sourceMappingURL=watcherStart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherStart.d.ts","sourceRoot":"","sources":["../../src/commands/watcherStart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAIzH,MAAM,MAAM,mBAAmB,GAAG;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,sEAAsE;IACtE,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAyBD,eAAO,MAAM,eAAe,GAAU,SAAS,mBAAmB,KAAG,OAAO,CAAC,IAAI,CA0LhF,CAAA"}
@@ -0,0 +1,182 @@
1
+ import { startWatcher } from '@vforsh/argus-watcher';
2
+ import path from 'node:path';
3
+ import { createOutput } from '../output/io.js';
4
+ const isValidPort = (port) => Number.isFinite(port) && port >= 1 && port <= 65535;
5
+ const parsePort = (value) => {
6
+ const port = typeof value === 'string' ? parseInt(value, 10) : value;
7
+ return isValidPort(port) ? port : null;
8
+ };
9
+ export const runWatcherStart = async (options) => {
10
+ const output = createOutput(options);
11
+ if (!options.id || options.id.trim() === '') {
12
+ output.writeWarn('--id is required.');
13
+ process.exitCode = 2;
14
+ return;
15
+ }
16
+ // Validate source option
17
+ const sourceMode = options.source ?? 'cdp';
18
+ if (sourceMode !== 'cdp' && sourceMode !== 'extension') {
19
+ output.writeWarn(`Invalid --source: ${options.source}. Must be 'cdp' or 'extension'.`);
20
+ process.exitCode = 2;
21
+ return;
22
+ }
23
+ // For extension mode, validate that CDP targeting options are not used
24
+ // (chrome-host/chrome-port are ignored but allowed for config file compatibility)
25
+ if (sourceMode === 'extension') {
26
+ const cdpTargetingOptions = [];
27
+ if (options.url?.trim())
28
+ cdpTargetingOptions.push('--url');
29
+ if (options.target?.trim())
30
+ cdpTargetingOptions.push('--target');
31
+ if (options.origin?.trim())
32
+ cdpTargetingOptions.push('--origin');
33
+ if (options.type?.trim())
34
+ cdpTargetingOptions.push('--type');
35
+ if (options.parent?.trim())
36
+ cdpTargetingOptions.push('--parent');
37
+ if (cdpTargetingOptions.length > 0) {
38
+ output.writeWarn(`CDP targeting options cannot be used with --source extension: ${cdpTargetingOptions.join(', ')}`);
39
+ process.exitCode = 2;
40
+ return;
41
+ }
42
+ }
43
+ // For CDP mode, at least one targeting option is required
44
+ if (sourceMode === 'cdp') {
45
+ const hasTargeting = options.url?.trim() || options.target?.trim() || options.origin?.trim() || options.type?.trim();
46
+ if (!hasTargeting) {
47
+ output.writeWarn('At least one targeting option is required for CDP mode: --url, --target, --origin, or --type.');
48
+ process.exitCode = 2;
49
+ return;
50
+ }
51
+ }
52
+ let chromeHost;
53
+ let chromePort;
54
+ if (sourceMode === 'cdp') {
55
+ chromeHost = options.chromeHost?.trim() || '127.0.0.1';
56
+ chromePort = 9222;
57
+ if (options.chromePort != null) {
58
+ const parsed = parsePort(options.chromePort);
59
+ if (parsed === null) {
60
+ output.writeWarn(`Invalid --chrome-port: ${options.chromePort}. Must be an integer 1-65535.`);
61
+ process.exitCode = 2;
62
+ return;
63
+ }
64
+ chromePort = parsed;
65
+ }
66
+ }
67
+ const watcherId = options.id.trim();
68
+ const matchUrl = options.url?.trim();
69
+ let artifactsBaseDir;
70
+ if (options.artifacts != null) {
71
+ const trimmed = options.artifacts.trim();
72
+ if (trimmed === '') {
73
+ output.writeWarn('--artifacts must be a non-empty path when provided.');
74
+ process.exitCode = 2;
75
+ return;
76
+ }
77
+ artifactsBaseDir = path.resolve(process.cwd(), trimmed);
78
+ }
79
+ // Build the match object from various filter options
80
+ const match = {};
81
+ if (matchUrl) {
82
+ match.url = matchUrl;
83
+ }
84
+ if (options.type?.trim()) {
85
+ match.type = options.type.trim();
86
+ }
87
+ if (options.origin?.trim()) {
88
+ match.origin = options.origin.trim();
89
+ }
90
+ if (options.target?.trim()) {
91
+ match.targetId = options.target.trim();
92
+ }
93
+ if (options.parent?.trim()) {
94
+ match.parent = options.parent.trim();
95
+ }
96
+ let handle;
97
+ try {
98
+ handle = await startWatcher({
99
+ id: watcherId,
100
+ source: sourceMode,
101
+ match: sourceMode === 'cdp' && Object.keys(match).length > 0 ? match : undefined,
102
+ chrome: sourceMode === 'cdp' ? { host: chromeHost, port: chromePort } : undefined,
103
+ host: '127.0.0.1',
104
+ port: 0,
105
+ pageIndicator: sourceMode === 'cdp' ? (options.pageIndicator === false ? { enabled: false } : { enabled: true }) : { enabled: false },
106
+ artifacts: artifactsBaseDir ? { base: artifactsBaseDir } : undefined,
107
+ pageConsoleLogging: options.pageConsoleLogging,
108
+ });
109
+ }
110
+ catch (error) {
111
+ output.writeWarn(`Failed to start watcher: ${error instanceof Error ? error.message : error}`);
112
+ process.exitCode = 1;
113
+ return;
114
+ }
115
+ const result = {
116
+ id: handle.watcher.id,
117
+ host: handle.watcher.host,
118
+ port: handle.watcher.port,
119
+ pid: handle.watcher.pid,
120
+ source: sourceMode,
121
+ matchUrl: match.url,
122
+ matchType: match.type,
123
+ matchOrigin: match.origin,
124
+ matchTarget: match.targetId,
125
+ matchParent: match.parent,
126
+ chromeHost,
127
+ chromePort,
128
+ artifactsBaseDir,
129
+ };
130
+ const cleanup = async () => {
131
+ try {
132
+ await handle.close();
133
+ }
134
+ catch { }
135
+ };
136
+ process.on('SIGINT', () => {
137
+ void cleanup().then(() => process.exit(0));
138
+ });
139
+ process.on('SIGTERM', () => {
140
+ void cleanup().then(() => process.exit(0));
141
+ });
142
+ handle.events.on('cdpAttached', ({ target }) => {
143
+ const typeInfo = target?.type ? ` (type: ${target.type})` : '';
144
+ output.writeHuman(`[${handle.watcher.id}] CDP attached: ${target?.title} (${target?.url})${typeInfo}`);
145
+ });
146
+ handle.events.on('cdpDetached', ({ reason, target }) => {
147
+ output.writeHuman(`[${handle.watcher.id}] CDP detached: ${reason} (last target: ${target?.title})`);
148
+ });
149
+ if (options.json) {
150
+ output.writeJson(result);
151
+ }
152
+ else {
153
+ output.writeHuman(`Watcher started:`);
154
+ output.writeHuman(` id=${result.id}`);
155
+ output.writeHuman(` source=${result.source}`);
156
+ output.writeHuman(` host=${result.host}`);
157
+ output.writeHuman(` port=${result.port}`);
158
+ if (result.matchUrl) {
159
+ output.writeHuman(` matchUrl=${result.matchUrl}`);
160
+ }
161
+ if (result.matchType) {
162
+ output.writeHuman(` matchType=${result.matchType}`);
163
+ }
164
+ if (result.matchOrigin) {
165
+ output.writeHuman(` matchOrigin=${result.matchOrigin}`);
166
+ }
167
+ if (result.matchTarget) {
168
+ output.writeHuman(` matchTarget=${result.matchTarget}`);
169
+ }
170
+ if (result.matchParent) {
171
+ output.writeHuman(` matchParent=${result.matchParent}`);
172
+ }
173
+ if (result.chromeHost && result.chromePort) {
174
+ output.writeHuman(` chrome=${result.chromeHost}:${result.chromePort}`);
175
+ }
176
+ if (result.artifactsBaseDir) {
177
+ output.writeHuman(` artifacts=${result.artifactsBaseDir}`);
178
+ }
179
+ }
180
+ await new Promise(() => { });
181
+ };
182
+ //# sourceMappingURL=watcherStart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherStart.js","sourceRoot":"","sources":["../../src/commands/watcherStart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Options for the watcher status command. */
2
+ export type WatcherStatusOptions = {
3
+ json?: boolean;
4
+ };
5
+ /** Execute the watcher status command. */
6
+ export declare const runWatcherStatus: (id: string | undefined, options: WatcherStatusOptions) => Promise<void>;
7
+ //# sourceMappingURL=watcherStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherStatus.d.ts","sourceRoot":"","sources":["../../src/commands/watcherStatus.ts"],"names":[],"mappings":"AAMA,8CAA8C;AAC9C,MAAM,MAAM,oBAAoB,GAAG;IAClC,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AAED,0CAA0C;AAC1C,eAAO,MAAM,gBAAgB,GAAU,IAAI,MAAM,GAAG,SAAS,EAAE,SAAS,oBAAoB,KAAG,OAAO,CAAC,IAAI,CA+B1G,CAAA"}
@@ -0,0 +1,44 @@
1
+ import { fetchJson } from '../httpClient.js';
2
+ import { createOutput } from '../output/io.js';
3
+ import { writeWatcherCandidates } from '../watchers/candidates.js';
4
+ import { resolveWatcher } from '../watchers/resolveWatcher.js';
5
+ /** Execute the watcher status command. */
6
+ export const runWatcherStatus = async (id, options) => {
7
+ const output = createOutput(options);
8
+ const resolved = await resolveWatcher({ id });
9
+ if (!resolved.ok) {
10
+ output.writeWarn(resolved.error);
11
+ if (resolved.candidates && resolved.candidates.length > 0) {
12
+ writeWatcherCandidates(resolved.candidates, output);
13
+ output.writeWarn('Hint: run `argus list` to see all watchers.');
14
+ }
15
+ process.exitCode = resolved.exitCode;
16
+ return;
17
+ }
18
+ const { watcher } = resolved;
19
+ const url = `http://${watcher.host}:${watcher.port}/status`;
20
+ let status;
21
+ try {
22
+ status = await fetchJson(url, { timeoutMs: 2_000 });
23
+ }
24
+ catch (error) {
25
+ output.writeWarn(`unreachable ${watcher.id} ${watcher.host}:${watcher.port} (${formatError(error)})`);
26
+ process.exitCode = 1;
27
+ return;
28
+ }
29
+ if (options.json) {
30
+ output.writeJson(status);
31
+ return;
32
+ }
33
+ output.writeHuman(`ok ${watcher.id} ${watcher.host}:${watcher.port} pid=${status.pid} attached=${status.attached}`);
34
+ };
35
+ const formatError = (error) => {
36
+ if (!error) {
37
+ return 'unknown error';
38
+ }
39
+ if (error instanceof Error) {
40
+ return error.message;
41
+ }
42
+ return String(error);
43
+ };
44
+ //# sourceMappingURL=watcherStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherStatus.js","sourceRoot":"","sources":["../../src/commands/watcherStatus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAO9D,0CAA0C;AAC1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,EAAsB,EAAE,OAA6B,EAAiB,EAAE;IAC9G,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAChC,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,sBAAsB,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;YACnD,MAAM,CAAC,SAAS,CAAC,6CAA6C,CAAC,CAAA;QAChE,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;QACpC,OAAM;IACP,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAA;IAE5B,MAAM,GAAG,GAAG,UAAU,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,SAAS,CAAA;IAC3D,IAAI,MAAsB,CAAA;IAC1B,IAAI,CAAC;QACJ,MAAM,GAAG,MAAM,SAAS,CAAiB,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,SAAS,CAAC,eAAe,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACP,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QACxB,OAAM;IACP,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,QAAQ,MAAM,CAAC,GAAG,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;AACpH,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,KAAc,EAAU,EAAE;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,eAAe,CAAA;IACvB,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,OAAO,CAAA;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ /** Options for the watcher stop command. */
2
+ export type WatcherStopOptions = Record<string, never>;
3
+ /** Execute the watcher stop command. */
4
+ export declare const runWatcherStop: (id: string | undefined, _options: WatcherStopOptions) => Promise<void>;
5
+ //# sourceMappingURL=watcherStop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherStop.d.ts","sourceRoot":"","sources":["../../src/commands/watcherStop.ts"],"names":[],"mappings":"AAOA,4CAA4C;AAC5C,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAEtD,wCAAwC;AACxC,eAAO,MAAM,cAAc,GAAU,IAAI,MAAM,GAAG,SAAS,EAAE,UAAU,kBAAkB,KAAG,OAAO,CAAC,IAAI,CAyDvG,CAAA"}
@@ -0,0 +1,103 @@
1
+ import { removeWatcherAndPersist } from '../registry.js';
2
+ import { fetchJson } from '../httpClient.js';
3
+ import { createOutput } from '../output/io.js';
4
+ import { writeWatcherCandidates } from '../watchers/candidates.js';
5
+ import { resolveWatcher } from '../watchers/resolveWatcher.js';
6
+ /** Execute the watcher stop command. */
7
+ export const runWatcherStop = async (id, _options) => {
8
+ const output = createOutput({ json: false });
9
+ const resolved = await resolveWatcher({ id });
10
+ if (!resolved.ok) {
11
+ output.writeWarn(resolved.error);
12
+ if (resolved.candidates && resolved.candidates.length > 0) {
13
+ writeWatcherCandidates(resolved.candidates, output);
14
+ output.writeWarn('Hint: run `argus list` to see all watchers.');
15
+ }
16
+ process.exitCode = resolved.exitCode;
17
+ return;
18
+ }
19
+ const { watcher } = resolved;
20
+ let registry = resolved.registry;
21
+ const shutdownUrl = `http://${watcher.host}:${watcher.port}/shutdown`;
22
+ try {
23
+ const response = await fetchJson(shutdownUrl, { method: 'POST', timeoutMs: 2_000 });
24
+ if (response.ok) {
25
+ output.writeHuman(`stopped ${watcher.id}`);
26
+ return;
27
+ }
28
+ }
29
+ catch (error) {
30
+ output.writeWarn(`warn: shutdown endpoint failed; falling back to SIGTERM (${formatError(error)})`);
31
+ }
32
+ if (watcher.pid == null) {
33
+ output.writeWarn(`warn: missing pid for watcher ${watcher.id}; registry entry preserved`);
34
+ process.exitCode = 1;
35
+ return;
36
+ }
37
+ const pid = watcher.pid;
38
+ try {
39
+ process.kill(pid, 'SIGTERM');
40
+ }
41
+ catch (error) {
42
+ if (isNoSuchProcessError(error)) {
43
+ registry = await removeWatcherAndPersist(registry, watcher.id);
44
+ output.writeHuman(`stopped ${watcher.id}`);
45
+ return;
46
+ }
47
+ output.writeWarn(`warn: failed to stop watcher ${watcher.id}; registry entry preserved (${formatError(error)})`);
48
+ process.exitCode = 1;
49
+ return;
50
+ }
51
+ const waitResult = await waitForProcessExit(pid, 2_000, 100);
52
+ if (waitResult.state === 'dead') {
53
+ registry = await removeWatcherAndPersist(registry, watcher.id);
54
+ output.writeHuman(`stopped ${watcher.id}`);
55
+ return;
56
+ }
57
+ const reason = waitResult.error ? ` (${waitResult.error})` : '';
58
+ output.writeWarn(`warn: failed to stop watcher ${watcher.id}; registry entry preserved${reason}`);
59
+ process.exitCode = 1;
60
+ };
61
+ const waitForProcessExit = async (pid, timeoutMs, intervalMs) => {
62
+ const deadline = Date.now() + timeoutMs;
63
+ while (Date.now() <= deadline) {
64
+ const check = checkProcessState(pid);
65
+ if (check.state === 'dead') {
66
+ return { state: 'dead' };
67
+ }
68
+ if (check.state === 'error') {
69
+ return { state: 'error', error: check.error };
70
+ }
71
+ await sleep(intervalMs);
72
+ }
73
+ return { state: 'timeout' };
74
+ };
75
+ const checkProcessState = (pid) => {
76
+ try {
77
+ process.kill(pid, 0);
78
+ return { state: 'alive' };
79
+ }
80
+ catch (error) {
81
+ if (isNoSuchProcessError(error)) {
82
+ return { state: 'dead' };
83
+ }
84
+ return { state: 'error', error: formatError(error) };
85
+ }
86
+ };
87
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
88
+ const isNoSuchProcessError = (error) => {
89
+ return isErrnoError(error) && error.code === 'ESRCH';
90
+ };
91
+ const isErrnoError = (error) => {
92
+ return !!error && typeof error === 'object' && 'code' in error;
93
+ };
94
+ const formatError = (error) => {
95
+ if (!error) {
96
+ return 'unknown error';
97
+ }
98
+ if (error instanceof Error) {
99
+ return error.message;
100
+ }
101
+ return String(error);
102
+ };
103
+ //# sourceMappingURL=watcherStop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherStop.js","sourceRoot":"","sources":["../../src/commands/watcherStop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { PluginConfig } from '@vforsh/argus-core';
2
+ export type ChromeStartConfig = {
3
+ url?: string;
4
+ watcherId?: string;
5
+ profile?: 'temp' | 'default-full' | 'default-medium' | 'default-lite';
6
+ devTools?: boolean;
7
+ };
8
+ export type PageConsoleLogging = 'none' | 'minimal' | 'full';
9
+ export type WatcherStartConfig = {
10
+ id?: string;
11
+ url?: string;
12
+ chromeHost?: string;
13
+ chromePort?: number;
14
+ artifacts?: string;
15
+ pageIndicator?: boolean;
16
+ pageConsoleLogging?: PageConsoleLogging;
17
+ };
18
+ export type ArgusConfig = {
19
+ chrome?: {
20
+ start?: ChromeStartConfig;
21
+ };
22
+ watcher?: {
23
+ start?: WatcherStartConfig;
24
+ };
25
+ /**
26
+ * Plugin modules to load.
27
+ * Each entry can be:
28
+ * - npm package name: "gameX-argus-plugin"
29
+ * - relative path: "./plugins/gameX.js"
30
+ * - absolute path: "/path/to/plugin.js"
31
+ * - object with metadata: { name: "gameX", module: "./plugins/gameX.js" }
32
+ */
33
+ plugins?: PluginConfig[];
34
+ };
35
+ export type ArgusConfigLoadResult = {
36
+ config: ArgusConfig;
37
+ configDir: string;
38
+ };
39
+ type OptionSourceProvider = {
40
+ getOptionValueSource: (key: string) => string;
41
+ };
42
+ export declare const resolveArgusConfigPath: ({ cliPath, cwd }: {
43
+ cliPath?: string;
44
+ cwd: string;
45
+ }) => string | null;
46
+ export declare const loadArgusConfig: (resolvedPath: string) => ArgusConfigLoadResult | null;
47
+ export declare const getConfigStartDefaults: (config: ArgusConfig) => {
48
+ chromeStart?: ChromeStartConfig;
49
+ watcherStart?: WatcherStartConfig;
50
+ };
51
+ export declare const mergeChromeStartOptionsWithConfig: <T extends {
52
+ url?: string;
53
+ fromWatcher?: string;
54
+ profile?: ChromeStartConfig["profile"];
55
+ devTools?: boolean;
56
+ }>(options: T, command: OptionSourceProvider, configResult: ArgusConfigLoadResult | null) => T | null;
57
+ export declare const mergeWatcherStartOptionsWithConfig: <T extends {
58
+ id?: string;
59
+ url?: string;
60
+ chromeHost?: string;
61
+ chromePort?: string | number;
62
+ pageIndicator?: boolean;
63
+ artifacts?: string;
64
+ pageConsoleLogging?: PageConsoleLogging;
65
+ }>(options: T, command: OptionSourceProvider, configResult: ArgusConfigLoadResult | null) => T | null;
66
+ export {};
67
+ //# sourceMappingURL=argusConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argusConfig.d.ts","sourceRoot":"","sources":["../../src/config/argusConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,MAAM,iBAAiB,GAAG;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAA;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;AAE5D,MAAM,MAAM,kBAAkB,GAAG;IAChC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,MAAM,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,iBAAiB,CAAA;KACzB,CAAA;IACD,OAAO,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,kBAAkB,CAAA;KAC1B,CAAA;IACD;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IACnC,MAAM,EAAE,WAAW,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC3B,oBAAoB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;CAC7C,CAAA;AA6RD,eAAO,MAAM,sBAAsB,GAAI,kBAAkB;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,KAAG,MAAM,GAAG,IAiBrG,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,cAAc,MAAM,KAAG,qBAAqB,GAAG,IAqB9E,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,QAAQ,WAAW,KAAG;IAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAAC,YAAY,CAAC,EAAE,kBAAkB,CAAA;CAG/H,CAAA;AAcF,eAAO,MAAM,iCAAiC,GAC7C,CAAC,SAAS;IACT,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAClB,EAED,SAAS,CAAC,EACV,SAAS,oBAAoB,EAC7B,cAAc,qBAAqB,GAAG,IAAI,KACxC,CAAC,GAAG,IAuBN,CAAA;AAED,eAAO,MAAM,kCAAkC,GAC9C,CAAC,SAAS;IACT,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACvC,EAED,SAAS,CAAC,EACV,SAAS,oBAAoB,EAC7B,cAAc,qBAAqB,GAAG,IAAI,KACxC,CAAC,GAAG,IAsBN,CAAA"}