@vforsh/argus 0.1.19 → 0.1.20

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 (40) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/argus.js +257 -59
  3. package/dist/cli/register/extensionCommands.d.ts.map +1 -1
  4. package/dist/cli/register/extensionCommands.js +28 -3
  5. package/dist/cli/register/extensionCommands.js.map +1 -1
  6. package/dist/commands/extension/extensionId.d.ts +27 -0
  7. package/dist/commands/extension/extensionId.d.ts.map +1 -0
  8. package/dist/commands/extension/extensionId.js +37 -0
  9. package/dist/commands/extension/extensionId.js.map +1 -0
  10. package/dist/commands/extension/extensionPath.d.ts +15 -0
  11. package/dist/commands/extension/extensionPath.d.ts.map +1 -0
  12. package/dist/commands/extension/extensionPath.js +61 -0
  13. package/dist/commands/extension/extensionPath.js.map +1 -0
  14. package/dist/commands/extension/install.d.ts +16 -0
  15. package/dist/commands/extension/install.d.ts.map +1 -0
  16. package/dist/commands/extension/install.js +154 -0
  17. package/dist/commands/extension/install.js.map +1 -0
  18. package/dist/commands/extension/setup.d.ts +2 -1
  19. package/dist/commands/extension/setup.d.ts.map +1 -1
  20. package/dist/commands/extension/setup.js +5 -2
  21. package/dist/commands/extension/setup.js.map +1 -1
  22. package/dist/extension/dist/background/auth-header-monitor.js +77 -0
  23. package/dist/extension/dist/background/bridge-client.js +120 -0
  24. package/dist/extension/dist/background/cdp-proxy.js +201 -0
  25. package/dist/extension/dist/background/debugger-manager.js +296 -0
  26. package/dist/extension/dist/background/service-worker.js +2004 -0
  27. package/dist/extension/dist/background/service-worker.js.map +7 -0
  28. package/dist/extension/dist/popup/popup.js +730 -0
  29. package/dist/extension/dist/popup/popup.js.map +7 -0
  30. package/dist/extension/dist/popup/tabMarkup.js +104 -0
  31. package/dist/extension/dist/popup/viewState.js +60 -0
  32. package/dist/extension/dist/types/messages.js +5 -0
  33. package/dist/extension/icons/icon-128.png +0 -0
  34. package/dist/extension/icons/icon-16.png +0 -0
  35. package/dist/extension/icons/icon-48.png +0 -0
  36. package/dist/extension/manifest.json +26 -0
  37. package/dist/extension/src/popup/popup.html +756 -0
  38. package/dist/skill/argus/SKILL.md +3 -1
  39. package/dist/skill/argus/reference/EXTENSION.md +13 -8
  40. package/package.json +2 -2
package/dist/argus.js CHANGED
@@ -5,29 +5,15 @@ var __getProtoOf = Object.getPrototypeOf;
5
5
  var __defProp = Object.defineProperty;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- function __accessProp(key) {
9
- return this[key];
10
- }
11
- var __toESMCache_node;
12
- var __toESMCache_esm;
13
8
  var __toESM = (mod, isNodeMode, target) => {
14
- var canCache = mod != null && typeof mod === "object";
15
- if (canCache) {
16
- var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
17
- var cached = cache.get(mod);
18
- if (cached)
19
- return cached;
20
- }
21
9
  target = mod != null ? __create(__getProtoOf(mod)) : {};
22
10
  const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
23
11
  for (let key of __getOwnPropNames(mod))
24
12
  if (!__hasOwnProp.call(to, key))
25
13
  __defProp(to, key, {
26
- get: __accessProp.bind(mod, key),
14
+ get: () => mod[key],
27
15
  enumerable: true
28
16
  });
29
- if (canCache)
30
- cache.set(mod, to);
31
17
  return to;
32
18
  };
33
19
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
@@ -2144,7 +2130,7 @@ var {
2144
2130
  // package.json
2145
2131
  var package_default = {
2146
2132
  name: "@vforsh/argus",
2147
- version: "0.1.19",
2133
+ version: "0.1.20",
2148
2134
  repository: {
2149
2135
  type: "git",
2150
2136
  url: "git+https://github.com/vforsh/argus.git",
@@ -2180,7 +2166,7 @@ var package_default = {
2180
2166
  scripts: {
2181
2167
  clean: "node ../../scripts/clean-dist.mjs",
2182
2168
  build: "npm run clean && tsc -b && bun run bundle",
2183
- bundle: "bun build dist/bin.js --outfile dist/argus.js --target node --external esbuild && node ../../scripts/copy-argus-skill.mjs",
2169
+ bundle: "bun build dist/bin.js --outfile dist/argus.js --target node --external esbuild && node ../../scripts/copy-argus-skill.mjs && node ../../scripts/copy-argus-extension.mjs",
2184
2170
  typecheck: "tsc -b --pretty false",
2185
2171
  "chrome:start": "bun src/bin.ts chrome start"
2186
2172
  }
@@ -49110,9 +49096,63 @@ var pluginCommands = [
49110
49096
  }
49111
49097
  ];
49112
49098
 
49113
- // dist/commands/extension/nativeHost.js
49099
+ // dist/commands/extension/install.js
49100
+ import { spawn as spawn3 } from "node:child_process";
49101
+
49102
+ // dist/commands/extension/extensionId.js
49103
+ var ARGUS_EXTENSION_ID = "ibhecpfiodfmkpflcnnkkgnjifheefhb";
49104
+
49105
+ // dist/commands/extension/extensionPath.js
49114
49106
  import fs17 from "node:fs";
49115
49107
  import path22 from "node:path";
49108
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
49109
+ var runExtensionPath = (options) => {
49110
+ const output = createOutput(options);
49111
+ const extensionDir = resolveExtensionDir();
49112
+ if (!extensionDir) {
49113
+ const message = `Packaged Argus extension not found. Checked:
49114
+ ${resolveExtensionCandidates().join(`
49115
+ `)}`;
49116
+ if (options.json) {
49117
+ output.writeJson({ ok: false, error: { message } });
49118
+ } else {
49119
+ console.error(message);
49120
+ }
49121
+ process.exitCode = 2;
49122
+ return;
49123
+ }
49124
+ if (options.json) {
49125
+ output.writeJson({ ok: true, path: extensionDir });
49126
+ return;
49127
+ }
49128
+ output.writeHuman(extensionDir);
49129
+ };
49130
+ var resolveExtensionDir = () => {
49131
+ for (const candidate of resolveExtensionCandidates()) {
49132
+ if (isLoadableExtensionDir(candidate)) {
49133
+ return candidate;
49134
+ }
49135
+ }
49136
+ return null;
49137
+ };
49138
+ var isLoadableExtensionDir = (dir) => {
49139
+ return fs17.existsSync(path22.join(dir, "manifest.json")) && fs17.existsSync(path22.join(dir, "dist", "background", "service-worker.js"));
49140
+ };
49141
+ var resolveExtensionCandidates = () => {
49142
+ const moduleDir = path22.dirname(fileURLToPath2(import.meta.url));
49143
+ const candidates = [
49144
+ path22.resolve(moduleDir, "extension"),
49145
+ path22.resolve(moduleDir, "..", "..", "extension"),
49146
+ path22.resolve(moduleDir, "..", "extension"),
49147
+ path22.resolve(moduleDir, "..", "..", "..", "argus-extension"),
49148
+ path22.resolve(moduleDir, "..", "..", "..", "..", "argus-extension")
49149
+ ];
49150
+ return [...new Set(candidates)];
49151
+ };
49152
+
49153
+ // dist/commands/extension/nativeHost.js
49154
+ import fs18 from "node:fs";
49155
+ import path23 from "node:path";
49116
49156
  import os8 from "node:os";
49117
49157
  import { execSync } from "node:child_process";
49118
49158
  var BRIDGE_HOST_NAME = "com.vforsh.argus.bridge";
@@ -49122,21 +49162,21 @@ var HOST_NAMES = [BRIDGE_HOST_NAME, CONTROL_HOST_NAME];
49122
49162
  var getManifestDir = (platform) => {
49123
49163
  switch (platform) {
49124
49164
  case "darwin":
49125
- return path22.join(os8.homedir(), "Library/Application Support/Google/Chrome/NativeMessagingHosts");
49165
+ return path23.join(os8.homedir(), "Library/Application Support/Google/Chrome/NativeMessagingHosts");
49126
49166
  case "linux":
49127
- return path22.join(os8.homedir(), ".config/google-chrome/NativeMessagingHosts");
49167
+ return path23.join(os8.homedir(), ".config/google-chrome/NativeMessagingHosts");
49128
49168
  case "win32":
49129
- return path22.join(process.env.LOCALAPPDATA ?? os8.homedir(), "Google/Chrome/User Data/NativeMessagingHosts");
49169
+ return path23.join(process.env.LOCALAPPDATA ?? os8.homedir(), "Google/Chrome/User Data/NativeMessagingHosts");
49130
49170
  default:
49131
49171
  throw new Error(`Unsupported platform: ${platform}`);
49132
49172
  }
49133
49173
  };
49134
49174
  var getManifestPath = (platform, hostName = BRIDGE_HOST_NAME) => {
49135
- return path22.join(getManifestDir(platform), `${hostName}.json`);
49175
+ return path23.join(getManifestDir(platform), `${hostName}.json`);
49136
49176
  };
49137
49177
  var getWrapperPath = (platform, hostName = BRIDGE_HOST_NAME) => {
49138
49178
  const filename = hostName === CONTROL_HOST_NAME ? "argus-native-control-host.sh" : "argus-native-host.sh";
49139
- return path22.join(getManifestDir(platform), filename);
49179
+ return path23.join(getManifestDir(platform), filename);
49140
49180
  };
49141
49181
  var getPlatform = () => {
49142
49182
  const platform = os8.platform();
@@ -49148,8 +49188,8 @@ var getPlatform = () => {
49148
49188
  var findArgusExecutable = () => {
49149
49189
  try {
49150
49190
  const npmGlobalPrefix = execSync("npm config get prefix", { encoding: "utf8" }).trim();
49151
- const globalBinPath = path22.join(npmGlobalPrefix, "bin", "argus");
49152
- if (fs17.existsSync(globalBinPath)) {
49191
+ const globalBinPath = path23.join(npmGlobalPrefix, "bin", "argus");
49192
+ if (fs18.existsSync(globalBinPath)) {
49153
49193
  return globalBinPath;
49154
49194
  }
49155
49195
  } catch {}
@@ -49162,7 +49202,7 @@ var findArgusExecutable = () => {
49162
49202
  throw new Error("Could not find argus executable. Please install argus globally (npm install -g @vforsh/argus) or ensure it is in your PATH.");
49163
49203
  };
49164
49204
  var findNodePath = () => {
49165
- return fs17.realpathSync(process.execPath);
49205
+ return fs18.realpathSync(process.execPath);
49166
49206
  };
49167
49207
  var createManifest = (extensionId, executablePath, hostName = BRIDGE_HOST_NAME) => {
49168
49208
  return {
@@ -49180,16 +49220,16 @@ var createWrapperScript = (platform, executablePath, hostName = BRIDGE_HOST_NAME
49180
49220
  const script = `#!/bin/bash
49181
49221
  exec "${nodePath}" "${executablePath}" ${args}
49182
49222
  `;
49183
- fs17.writeFileSync(wrapperPath, script, { mode: 493 });
49223
+ fs18.writeFileSync(wrapperPath, script, { mode: 493 });
49184
49224
  return wrapperPath;
49185
49225
  };
49186
49226
  var installNativeHosts = (platform, extensionId, executablePath) => {
49187
- fs17.mkdirSync(getManifestDir(platform), { recursive: true });
49227
+ fs18.mkdirSync(getManifestDir(platform), { recursive: true });
49188
49228
  return HOST_NAMES.map((hostName) => {
49189
49229
  const wrapperPath = createWrapperScript(platform, executablePath, hostName);
49190
49230
  const manifestPath = getManifestPath(platform, hostName);
49191
49231
  const manifest = createManifest(extensionId, wrapperPath, hostName);
49192
- fs17.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
49232
+ fs18.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
49193
49233
  registerWindowsNativeHost(platform, hostName, manifestPath);
49194
49234
  return { hostName, manifestPath, wrapperPath };
49195
49235
  });
@@ -49209,8 +49249,8 @@ var removeNativeHosts = (platform) => {
49209
49249
  var inspectNativeHost = (platform, hostName) => {
49210
49250
  const manifestPath = getManifestPath(platform, hostName);
49211
49251
  const wrapperPath = getWrapperPath(platform, hostName);
49212
- const manifestExists = fs17.existsSync(manifestPath);
49213
- const wrapperExists = fs17.existsSync(wrapperPath);
49252
+ const manifestExists = fs18.existsSync(manifestPath);
49253
+ const wrapperExists = fs18.existsSync(wrapperPath);
49214
49254
  const wrapperExecutable = wrapperExists && isWrapperExecutable(wrapperPath);
49215
49255
  const manifest = manifestExists ? readManifest(manifestPath) : null;
49216
49256
  const manifestValid = Boolean(manifest && manifest.name === hostName && manifest.type === "stdio" && Array.isArray(manifest.allowed_origins));
@@ -49231,7 +49271,7 @@ var inspectNativeHost = (platform, hostName) => {
49231
49271
  };
49232
49272
  var readManifest = (manifestPath) => {
49233
49273
  try {
49234
- const content = fs17.readFileSync(manifestPath, "utf8");
49274
+ const content = fs18.readFileSync(manifestPath, "utf8");
49235
49275
  return JSON.parse(content);
49236
49276
  } catch {
49237
49277
  return null;
@@ -49239,7 +49279,7 @@ var readManifest = (manifestPath) => {
49239
49279
  };
49240
49280
  var isWrapperExecutable = (wrapperPath) => {
49241
49281
  try {
49242
- fs17.accessSync(wrapperPath, fs17.constants.X_OK);
49282
+ fs18.accessSync(wrapperPath, fs18.constants.X_OK);
49243
49283
  return true;
49244
49284
  } catch {
49245
49285
  return false;
@@ -49260,10 +49300,10 @@ var extractExtensionId = (origin) => {
49260
49300
  return match?.[1] ?? null;
49261
49301
  };
49262
49302
  var removeFileIfExists = (filePath) => {
49263
- if (!fs17.existsSync(filePath)) {
49303
+ if (!fs18.existsSync(filePath)) {
49264
49304
  return false;
49265
49305
  }
49266
- fs17.unlinkSync(filePath);
49306
+ fs18.unlinkSync(filePath);
49267
49307
  return true;
49268
49308
  };
49269
49309
  var registerWindowsNativeHost = (platform, hostName, manifestPath) => {
@@ -49283,10 +49323,145 @@ var unregisterWindowsNativeHost = (platform, hostName) => {
49283
49323
  } catch {}
49284
49324
  };
49285
49325
 
49326
+ // dist/commands/extension/install.js
49327
+ var DEFAULT_TIMEOUT_SECONDS = 120;
49328
+ var POLL_INTERVAL_MS = 700;
49329
+ var runExtensionInstall = async (options) => {
49330
+ const output = createOutput(options);
49331
+ let platform;
49332
+ try {
49333
+ platform = getPlatform();
49334
+ } catch (error) {
49335
+ return fail(output, error.message);
49336
+ }
49337
+ const extensionDir = resolveExtensionDir();
49338
+ if (!extensionDir) {
49339
+ return fail(output, "Packaged Argus extension not found. Build the CLI (npm run build:packages) or run from a built checkout.");
49340
+ }
49341
+ let executablePath;
49342
+ try {
49343
+ executablePath = findArgusExecutable();
49344
+ } catch (error) {
49345
+ return fail(output, error.message);
49346
+ }
49347
+ let hosts;
49348
+ try {
49349
+ hosts = installNativeHosts(platform, ARGUS_EXTENSION_ID, executablePath);
49350
+ } catch (error) {
49351
+ return fail(output, `Failed to install native hosts: ${error.message}`);
49352
+ }
49353
+ await pruneRegistry();
49354
+ let connected = await isControlConnected();
49355
+ const shouldOpen = options.open !== false && !connected;
49356
+ const opened = shouldOpen ? openExtensionsPage() : false;
49357
+ if (!output.json) {
49358
+ printSummary(output, { extensionDir, hosts, connected, opened, shouldOpen });
49359
+ }
49360
+ const shouldWait = options.wait !== false && !connected;
49361
+ if (shouldWait) {
49362
+ connected = await waitForControl(parseTimeoutMs2(options.timeout), output);
49363
+ }
49364
+ if (output.json) {
49365
+ output.writeJson({ success: true, extensionId: ARGUS_EXTENSION_ID, extensionPath: extensionDir, hosts, connected });
49366
+ if (!connected && shouldWait) {
49367
+ process.exitCode = 1;
49368
+ }
49369
+ return;
49370
+ }
49371
+ printResult(output, connected, shouldWait);
49372
+ };
49373
+ var isControlConnected = async () => {
49374
+ const { registry: registry2 } = await readRegistry();
49375
+ return Boolean(registry2.watchers[CONTROL_WATCHER_ID]);
49376
+ };
49377
+ var openExtensionsPage = () => {
49378
+ const chromeBin = resolveChromeBin();
49379
+ if (!chromeBin) {
49380
+ return false;
49381
+ }
49382
+ try {
49383
+ const child = spawn3(chromeBin, ["chrome://extensions/"], { stdio: "ignore", detached: true });
49384
+ child.unref();
49385
+ return true;
49386
+ } catch {
49387
+ return false;
49388
+ }
49389
+ };
49390
+ var waitForControl = async (timeoutMs, output) => {
49391
+ if (!output.json) {
49392
+ output.writeHuman(`Waiting for the extension to connect (up to ${Math.round(timeoutMs / 1000)}s)...`);
49393
+ }
49394
+ const deadline = Date.now() + timeoutMs;
49395
+ while (Date.now() < deadline) {
49396
+ if (await isControlConnected()) {
49397
+ return true;
49398
+ }
49399
+ await delay7(POLL_INTERVAL_MS);
49400
+ }
49401
+ return isControlConnected();
49402
+ };
49403
+ var printSummary = (output, info) => {
49404
+ output.writeHuman("");
49405
+ output.writeHuman("Argus extension setup");
49406
+ output.writeHuman("");
49407
+ output.writeHuman(` Native hosts: installed (${info.hosts.map((host) => host.hostName).join(", ")})`);
49408
+ output.writeHuman(` Extension ID: ${ARGUS_EXTENSION_ID}`);
49409
+ output.writeHuman(` Load unpacked: ${info.extensionDir}`);
49410
+ output.writeHuman("");
49411
+ if (info.connected) {
49412
+ return;
49413
+ }
49414
+ if (info.opened) {
49415
+ output.writeHuman('Opened chrome://extensions. Click "Load unpacked" and select the folder above.');
49416
+ } else if (info.shouldOpen) {
49417
+ output.writeHuman('Open chrome://extensions, then click "Load unpacked" and select the folder above.');
49418
+ } else {
49419
+ output.writeHuman('Open chrome://extensions and "Load unpacked" the folder above.');
49420
+ }
49421
+ output.writeHuman('(Enable Developer mode if the "Load unpacked" button is hidden.)');
49422
+ output.writeHuman("");
49423
+ };
49424
+ var printResult = (output, connected, waited) => {
49425
+ if (connected) {
49426
+ output.writeHuman("Extension connected.");
49427
+ output.writeHuman("");
49428
+ output.writeHuman("Try it:");
49429
+ output.writeHuman(" argus ext tabs");
49430
+ output.writeHuman("");
49431
+ return;
49432
+ }
49433
+ if (waited) {
49434
+ output.writeHuman("Extension did not connect yet.");
49435
+ output.writeHuman(" - If it is already loaded, open its popup or reload it in chrome://extensions.");
49436
+ output.writeHuman(" - Then check `argus extension status` and `argus ext doctor`.");
49437
+ output.writeHuman("");
49438
+ process.exitCode = 1;
49439
+ return;
49440
+ }
49441
+ output.writeHuman("Once loaded, verify with `argus ext tabs`.");
49442
+ output.writeHuman("");
49443
+ };
49444
+ var parseTimeoutMs2 = (value) => {
49445
+ const seconds = value ? Number.parseInt(value, 10) : DEFAULT_TIMEOUT_SECONDS;
49446
+ if (!Number.isFinite(seconds) || seconds < 5) {
49447
+ return DEFAULT_TIMEOUT_SECONDS * 1000;
49448
+ }
49449
+ return seconds * 1000;
49450
+ };
49451
+ var fail = (output, message) => {
49452
+ if (output.json) {
49453
+ output.writeJson({ success: false, error: { message } });
49454
+ } else {
49455
+ console.error(message);
49456
+ }
49457
+ process.exitCode = 1;
49458
+ };
49459
+ var delay7 = (ms3) => new Promise((resolve2) => setTimeout(resolve2, ms3));
49460
+
49286
49461
  // dist/commands/extension/setup.js
49287
49462
  var runExtensionSetup = async (options) => {
49288
49463
  const output = createOutput(options);
49289
- const { extensionId } = options;
49464
+ const extensionId = options.extensionId ?? ARGUS_EXTENSION_ID;
49290
49465
  let platform;
49291
49466
  try {
49292
49467
  platform = getPlatform();
@@ -49342,9 +49517,11 @@ var runExtensionSetup = async (options) => {
49342
49517
  }
49343
49518
  output.writeHuman("");
49344
49519
  output.writeHuman("Next steps:");
49345
- output.writeHuman(" 1. Reload the extension in chrome://extensions");
49520
+ output.writeHuman(" 1. Load the unpacked extension from `argus extension path` (if not already loaded)");
49346
49521
  output.writeHuman(" 2. Run `argus ext tabs` or open the extension popup and attach a tab");
49347
49522
  output.writeHuman("");
49523
+ output.writeHuman("Tip: `argus extension install` does this end-to-end and waits for the extension to connect.");
49524
+ output.writeHuman("");
49348
49525
  }
49349
49526
  };
49350
49527
 
@@ -49733,7 +49910,7 @@ var waitForTabWatcher = async (controlWatcher, selector, tab, watcherId) => {
49733
49910
  if (watcher) {
49734
49911
  const status = await fetchStatus(watcher);
49735
49912
  if (!status || !statusMatchesTabWatcher(status, latestTab ?? tab, latestTab?.watcherId === explicitWatcherId)) {
49736
- await delay7(WATCHER_POLL_INTERVAL_MS);
49913
+ await delay8(WATCHER_POLL_INTERVAL_MS);
49737
49914
  continue;
49738
49915
  }
49739
49916
  return { ok: true, watcher, status, tab: latestTab ?? tab };
@@ -49743,7 +49920,7 @@ var waitForTabWatcher = async (controlWatcher, selector, tab, watcherId) => {
49743
49920
  if (lastResult.ok) {
49744
49921
  return lastResult;
49745
49922
  }
49746
- await delay7(WATCHER_POLL_INTERVAL_MS);
49923
+ await delay8(WATCHER_POLL_INTERVAL_MS);
49747
49924
  }
49748
49925
  return lastResult;
49749
49926
  };
@@ -49797,7 +49974,7 @@ var targetMatchesTab = (target, tab) => {
49797
49974
  }
49798
49975
  return Boolean(target.title && target.title === tab.title && target.url === tab.url);
49799
49976
  };
49800
- var delay7 = (ms3) => new Promise((resolve2) => setTimeout(resolve2, ms3));
49977
+ var delay8 = (ms3) => new Promise((resolve2) => setTimeout(resolve2, ms3));
49801
49978
  var formatError6 = (error) => error instanceof Error ? error.message : String(error);
49802
49979
 
49803
49980
  // dist/commands/extension/show.js
@@ -50176,19 +50353,19 @@ var waitForSelectedTarget = async (watcher, target, options = {}) => {
50176
50353
  const [status, targets] = await Promise.all([fetchWatcherStatus(watcher), fetchExtensionTargets(watcher)]);
50177
50354
  if (!status.ok) {
50178
50355
  lastError = status.error;
50179
- await delay8(intervalMs);
50356
+ await delay9(intervalMs);
50180
50357
  continue;
50181
50358
  }
50182
50359
  if (!targets.ok) {
50183
50360
  lastError = targets.error;
50184
- await delay8(intervalMs);
50361
+ await delay9(intervalMs);
50185
50362
  continue;
50186
50363
  }
50187
50364
  const selected = targets.targets.find((entry) => entry.id === target.id && entry.attached === true);
50188
50365
  if (selected && statusMatchesTarget(status.status, selected) && status.status.targetReady !== false) {
50189
50366
  return { ok: true, status: status.status, target: selected };
50190
50367
  }
50191
- await delay8(intervalMs);
50368
+ await delay9(intervalMs);
50192
50369
  }
50193
50370
  return { ok: false, error: lastError };
50194
50371
  };
@@ -50334,7 +50511,7 @@ var originOf = (url) => {
50334
50511
  }
50335
50512
  };
50336
50513
  var shortenId = (id) => id.length > 18 ? `${id.slice(0, 14)}...` : id;
50337
- var delay8 = (ms3) => new Promise((resolve2) => setTimeout(resolve2, ms3));
50514
+ var delay9 = (ms3) => new Promise((resolve2) => setTimeout(resolve2, ms3));
50338
50515
  var formatError8 = (error) => error instanceof Error ? error.message : String(error);
50339
50516
 
50340
50517
  // dist/commands/extension/use.js
@@ -50750,22 +50927,43 @@ var extensionCommands = [
50750
50927
  description: "Browser extension management",
50751
50928
  subcommands: [
50752
50929
  {
50753
- name: "setup <extensionId>",
50754
- description: "Install native messaging host for the browser extension",
50930
+ name: "install",
50931
+ description: "Set up the extension end-to-end: install hosts, open chrome://extensions, wait for connect",
50932
+ options: [
50933
+ { flags: "--no-open", description: "Do not open chrome://extensions automatically" },
50934
+ { flags: "--no-wait", description: "Do not wait for the extension to connect" },
50935
+ { flags: "--timeout <seconds>", description: "Seconds to wait for the extension to connect (default 120)" },
50936
+ jsonOption2
50937
+ ],
50938
+ examples: ["argus extension install", "argus extension install --no-open", "argus extension install --no-wait --json"],
50939
+ action: async (options) => {
50940
+ await runExtensionInstall(options);
50941
+ }
50942
+ },
50943
+ {
50944
+ name: "setup [extensionId]",
50945
+ description: "Install native messaging host (uses the pinned extension ID by default)",
50755
50946
  options: [jsonOption2],
50756
50947
  configure: (command) => {
50757
50948
  command.addHelpText("after", `
50758
- To get your extension ID:
50759
- 1. Open chrome://extensions
50760
- 2. Enable Developer mode
50761
- 3. Load argus-extension as unpacked
50762
- 4. Copy the ID from the extension card
50949
+ The Argus extension pins a stable ID, so no argument is needed.
50950
+ Prefer \`argus extension install\` for the guided, end-to-end flow.
50951
+ Pass an explicit id only when loading a differently-keyed build.
50763
50952
  `);
50764
50953
  },
50765
50954
  action: async (extensionId, options) => {
50766
50955
  await runExtensionSetup({ extensionId, ...options });
50767
50956
  }
50768
50957
  },
50958
+ {
50959
+ name: "path",
50960
+ description: 'Print the path to the unpacked extension for chrome://extensions "Load unpacked"',
50961
+ options: [jsonOption2],
50962
+ examples: ["argus extension path", "argus extension path --json"],
50963
+ action: (options) => {
50964
+ runExtensionPath(options);
50965
+ }
50966
+ },
50769
50967
  {
50770
50968
  name: "remove",
50771
50969
  description: "Uninstall native messaging host",
@@ -50923,9 +51121,9 @@ same sticky shown+focused lock as \`argus page show <watcherId>\`.
50923
51121
  ];
50924
51122
 
50925
51123
  // dist/commands/skill.js
50926
- import fs18 from "node:fs";
50927
- import path23 from "node:path";
50928
- import { fileURLToPath as fileURLToPath2 } from "node:url";
51124
+ import fs19 from "node:fs";
51125
+ import path24 from "node:path";
51126
+ import { fileURLToPath as fileURLToPath3 } from "node:url";
50929
51127
  var SKILL_PATH_PARTS = ["skill", "argus", "SKILL.md"];
50930
51128
  var runSkill = (options) => {
50931
51129
  const output = createOutput(options);
@@ -50950,18 +51148,18 @@ ${resolveArgusSkillCandidates().join(`
50950
51148
  };
50951
51149
  var resolveArgusSkillPath = () => {
50952
51150
  for (const candidate of resolveArgusSkillCandidates()) {
50953
- if (fs18.existsSync(candidate)) {
51151
+ if (fs19.existsSync(candidate)) {
50954
51152
  return candidate;
50955
51153
  }
50956
51154
  }
50957
51155
  return null;
50958
51156
  };
50959
51157
  var resolveArgusSkillCandidates = () => {
50960
- const moduleDir = path23.dirname(fileURLToPath2(import.meta.url));
51158
+ const moduleDir = path24.dirname(fileURLToPath3(import.meta.url));
50961
51159
  return [
50962
- path23.resolve(moduleDir, ...SKILL_PATH_PARTS),
50963
- path23.resolve(moduleDir, "..", ...SKILL_PATH_PARTS),
50964
- path23.resolve(moduleDir, "..", "..", "..", "..", ...SKILL_PATH_PARTS)
51160
+ path24.resolve(moduleDir, ...SKILL_PATH_PARTS),
51161
+ path24.resolve(moduleDir, "..", ...SKILL_PATH_PARTS),
51162
+ path24.resolve(moduleDir, "..", "..", "..", "..", ...SKILL_PATH_PARTS)
50965
51163
  ];
50966
51164
  };
50967
51165
 
@@ -1 +1 @@
1
- {"version":3,"file":"extensionCommands.d.ts","sourceRoot":"","sources":["../../../src/cli/register/extensionCommands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AA2DjE,eAAO,MAAM,iBAAiB,EAAE,SAAS,sBAAsB,EAwK9D,CAAA"}
1
+ {"version":3,"file":"extensionCommands.d.ts","sourceRoot":"","sources":["../../../src/cli/register/extensionCommands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AA6DjE,eAAO,MAAM,iBAAiB,EAAE,SAAS,sBAAsB,EA+L9D,CAAA"}
@@ -1,4 +1,6 @@
1
+ import { runExtensionInstall } from '../../commands/extension/install.js';
1
2
  import { runExtensionSetup } from '../../commands/extension/setup.js';
3
+ import { runExtensionPath } from '../../commands/extension/extensionPath.js';
2
4
  import { runExtensionRemove } from '../../commands/extension/remove.js';
3
5
  import { runExtensionStatus } from '../../commands/extension/status.js';
4
6
  import { runExtensionInfo } from '../../commands/extension/info.js';
@@ -56,16 +58,39 @@ export const extensionCommands = [
56
58
  description: 'Browser extension management',
57
59
  subcommands: [
58
60
  {
59
- name: 'setup <extensionId>',
60
- description: 'Install native messaging host for the browser extension',
61
+ name: 'install',
62
+ description: 'Set up the extension end-to-end: install hosts, open chrome://extensions, wait for connect',
63
+ options: [
64
+ { flags: '--no-open', description: 'Do not open chrome://extensions automatically' },
65
+ { flags: '--no-wait', description: 'Do not wait for the extension to connect' },
66
+ { flags: '--timeout <seconds>', description: 'Seconds to wait for the extension to connect (default 120)' },
67
+ jsonOption,
68
+ ],
69
+ examples: ['argus extension install', 'argus extension install --no-open', 'argus extension install --no-wait --json'],
70
+ action: async (options) => {
71
+ await runExtensionInstall(options);
72
+ },
73
+ },
74
+ {
75
+ name: 'setup [extensionId]',
76
+ description: 'Install native messaging host (uses the pinned extension ID by default)',
61
77
  options: [jsonOption],
62
78
  configure: (command) => {
63
- command.addHelpText('after', '\nTo get your extension ID:\n 1. Open chrome://extensions\n 2. Enable Developer mode\n 3. Load argus-extension as unpacked\n 4. Copy the ID from the extension card\n');
79
+ command.addHelpText('after', '\nThe Argus extension pins a stable ID, so no argument is needed.\nPrefer `argus extension install` for the guided, end-to-end flow.\nPass an explicit id only when loading a differently-keyed build.\n');
64
80
  },
65
81
  action: async (extensionId, options) => {
66
82
  await runExtensionSetup({ extensionId, ...options });
67
83
  },
68
84
  },
85
+ {
86
+ name: 'path',
87
+ description: 'Print the path to the unpacked extension for chrome://extensions "Load unpacked"',
88
+ options: [jsonOption],
89
+ examples: ['argus extension path', 'argus extension path --json'],
90
+ action: (options) => {
91
+ runExtensionPath(options);
92
+ },
93
+ },
69
94
  {
70
95
  name: 'remove',
71
96
  description: 'Uninstall native messaging host',
@@ -1 +1 @@
1
- {"version":3,"file":"extensionCommands.js","sourceRoot":"","sources":["../../../src/cli/register/extensionCommands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extensionCommands.js","sourceRoot":"","sources":["../../../src/cli/register/extensionCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Stable Chrome extension ID for the Argus CDP Bridge.
3
+ *
4
+ * The extension's `manifest.json` pins a public `key`, so Chrome derives this
5
+ * exact ID on every machine and install path (instead of a path-dependent id).
6
+ * Because the ID is constant, `argus extension setup`/`install` need no ID
7
+ * argument and the native messaging host manifest never has to be rewritten.
8
+ *
9
+ * Source of truth: `packages/argus-extension/key.pem` (gitignored). Regenerate
10
+ * both values with `bun run --cwd packages/argus-extension generate-key`, which
11
+ * updates the manifest `key` and prints the matching id. The drift guard in
12
+ * `packages/argus/test/extension-id.test.ts` keeps these three in sync.
13
+ */
14
+ export declare const ARGUS_EXTENSION_ID = "ibhecpfiodfmkpflcnnkkgnjifheefhb";
15
+ /** Base64 SPKI public key pinned as the extension manifest `key` field. */
16
+ export declare const ARGUS_EXTENSION_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt1lmJWE8y/3by5FlIta/a35cckp3mOVkFSmn8imDO+6S4xsD7naFwonrRMlMMd6lljOBG+sa5YgiMEeR1XwwyZlSDqXIOaNdizChK8wjtjhYldRmax9NQCbhejFWRyIDsR+B7xmbRsroCnSG667JR6D3q8L5v2Qbd/4rH+zZniqUdZKOPJEyjOBEbWoytX3nTWbJvCy+AHznAtnkIWysQyibUkMIBxDGNBSpx507Cc6kMrWZpnCSkjKtRj7qLpMEat4xQdkOhh3mZCisSimQoMD2Axhnqmyacj8IoKDQX+xkb6qLArO7nWr6QD4rOVWrTdgSBg+4TfW3C2zDCP5UhwIDAQAB";
17
+ /**
18
+ * Derive a Chrome extension ID from a base64 SPKI public key, matching Chrome's
19
+ * algorithm: SHA-256 of the DER public key, first 16 bytes, each hex nibble
20
+ * mapped 0-f -> a-p.
21
+ *
22
+ * @param publicKeyBase64 - Base64-encoded DER (SPKI) public key, i.e. the value
23
+ * of the manifest `key` field.
24
+ * @returns The 32-character extension ID.
25
+ */
26
+ export declare const deriveExtensionId: (publicKeyBase64: string) => string;
27
+ //# sourceMappingURL=extensionId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionId.d.ts","sourceRoot":"","sources":["../../../src/commands/extension/extensionId.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,qCAAqC,CAAA;AAEpE,2EAA2E;AAC3E,eAAO,MAAM,0BAA0B,6YACoW,CAAA;AAE3Y;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAAI,iBAAiB,MAAM,KAAG,MAS3D,CAAA"}