@zenalexa/unicli 0.217.3 → 0.218.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/AGENTS.md +51 -194
  2. package/README.md +2 -2
  3. package/README.zh-CN.md +2 -2
  4. package/dist/bin/unicli-mcp.d.ts +10 -0
  5. package/dist/bin/unicli-mcp.d.ts.map +1 -0
  6. package/dist/bin/unicli-mcp.js +10 -0
  7. package/dist/bin/unicli-mcp.js.map +1 -0
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +12 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/auth.d.ts +1 -0
  12. package/dist/commands/auth.d.ts.map +1 -1
  13. package/dist/commands/auth.js +250 -0
  14. package/dist/commands/auth.js.map +1 -1
  15. package/dist/commands/dev.js +1 -0
  16. package/dist/commands/dev.js.map +1 -1
  17. package/dist/commands/health.d.ts.map +1 -1
  18. package/dist/commands/health.js +1 -0
  19. package/dist/commands/health.js.map +1 -1
  20. package/dist/commands/lint.d.ts.map +1 -1
  21. package/dist/commands/lint.js +15 -6
  22. package/dist/commands/lint.js.map +1 -1
  23. package/dist/commands/repair.d.ts +1 -0
  24. package/dist/commands/repair.d.ts.map +1 -1
  25. package/dist/commands/repair.js +103 -61
  26. package/dist/commands/repair.js.map +1 -1
  27. package/dist/engine/chromium-cookies-platform.d.ts +69 -0
  28. package/dist/engine/chromium-cookies-platform.d.ts.map +1 -0
  29. package/dist/engine/chromium-cookies-platform.js +315 -0
  30. package/dist/engine/chromium-cookies-platform.js.map +1 -0
  31. package/dist/engine/chromium-cookies-types.d.ts +26 -0
  32. package/dist/engine/chromium-cookies-types.d.ts.map +1 -0
  33. package/dist/engine/chromium-cookies-types.js +16 -0
  34. package/dist/engine/chromium-cookies-types.js.map +1 -0
  35. package/dist/engine/chromium-cookies.d.ts +56 -0
  36. package/dist/engine/chromium-cookies.d.ts.map +1 -0
  37. package/dist/engine/chromium-cookies.js +361 -0
  38. package/dist/engine/chromium-cookies.js.map +1 -0
  39. package/dist/engine/cookies.d.ts +13 -5
  40. package/dist/engine/cookies.d.ts.map +1 -1
  41. package/dist/engine/cookies.js +55 -9
  42. package/dist/engine/cookies.js.map +1 -1
  43. package/dist/engine/executor.d.ts +8 -0
  44. package/dist/engine/executor.d.ts.map +1 -1
  45. package/dist/engine/executor.js +1 -1
  46. package/dist/engine/executor.js.map +1 -1
  47. package/dist/engine/kernel/execute.d.ts.map +1 -1
  48. package/dist/engine/kernel/execute.js +1 -0
  49. package/dist/engine/kernel/execute.js.map +1 -1
  50. package/dist/engine/repair/quarantine-discovery.d.ts +25 -0
  51. package/dist/engine/repair/quarantine-discovery.d.ts.map +1 -0
  52. package/dist/engine/repair/quarantine-discovery.js +78 -0
  53. package/dist/engine/repair/quarantine-discovery.js.map +1 -0
  54. package/dist/engine/steps/navigate.d.ts +1 -1
  55. package/dist/engine/steps/navigate.d.ts.map +1 -1
  56. package/dist/engine/steps/navigate.js +5 -1
  57. package/dist/engine/steps/navigate.js.map +1 -1
  58. package/dist/engine/template.d.ts +14 -4
  59. package/dist/engine/template.d.ts.map +1 -1
  60. package/dist/engine/template.js +93 -65
  61. package/dist/engine/template.js.map +1 -1
  62. package/dist/engine/verify-row-shape.d.ts +17 -0
  63. package/dist/engine/verify-row-shape.d.ts.map +1 -0
  64. package/dist/engine/verify-row-shape.js +36 -0
  65. package/dist/engine/verify-row-shape.js.map +1 -0
  66. package/dist/fast-path/handlers/adapter.d.ts +15 -0
  67. package/dist/fast-path/handlers/adapter.d.ts.map +1 -0
  68. package/dist/fast-path/handlers/adapter.js +169 -0
  69. package/dist/fast-path/handlers/adapter.js.map +1 -0
  70. package/dist/fast-path/handlers/discovery.d.ts +14 -0
  71. package/dist/fast-path/handlers/discovery.d.ts.map +1 -0
  72. package/dist/fast-path/handlers/discovery.js +280 -0
  73. package/dist/fast-path/handlers/discovery.js.map +1 -0
  74. package/dist/fast-path/manifest.d.ts +47 -0
  75. package/dist/fast-path/manifest.d.ts.map +1 -0
  76. package/dist/fast-path/manifest.js +32 -0
  77. package/dist/fast-path/manifest.js.map +1 -0
  78. package/dist/fast-path/parsed-argv.d.ts +16 -0
  79. package/dist/fast-path/parsed-argv.d.ts.map +1 -0
  80. package/dist/fast-path/parsed-argv.js +6 -0
  81. package/dist/fast-path/parsed-argv.js.map +1 -0
  82. package/dist/fast-path/policy.d.ts +25 -0
  83. package/dist/fast-path/policy.d.ts.map +1 -0
  84. package/dist/fast-path/policy.js +96 -0
  85. package/dist/fast-path/policy.js.map +1 -0
  86. package/dist/fast-path/render.d.ts +26 -0
  87. package/dist/fast-path/render.d.ts.map +1 -0
  88. package/dist/fast-path/render.js +200 -0
  89. package/dist/fast-path/render.js.map +1 -0
  90. package/dist/fast-path.d.ts +8 -10
  91. package/dist/fast-path.d.ts.map +1 -1
  92. package/dist/fast-path.js +66 -810
  93. package/dist/fast-path.js.map +1 -1
  94. package/dist/manifest.json +7 -6
  95. package/dist/transport/adapters/cdp-browser.d.ts +6 -6
  96. package/dist/transport/adapters/cdp-browser.js +7 -7
  97. package/dist/transport/adapters/cdp-browser.js.map +1 -1
  98. package/dist/transport/adapters/subprocess.d.ts +4 -4
  99. package/dist/transport/adapters/subprocess.js +4 -4
  100. package/package.json +22 -8
  101. package/server.json +44 -0
  102. package/skills/README.md +39 -0
  103. package/skills/talk-normal/SKILL.md +25 -0
  104. package/skills/talk-normal/prompt.md +35 -0
  105. package/skills/unicli/SKILL.md +389 -0
  106. package/skills/unicli/references/auth.md +188 -0
  107. package/skills/unicli/references/output.md +238 -0
  108. package/skills/unicli/references/sites.md +259 -0
  109. package/skills/unicli-browser/SKILL.md +99 -0
  110. package/skills/unicli-claude-code/SKILL.md +172 -0
  111. package/skills/unicli-explorer/SKILL.md +90 -0
  112. package/skills/unicli-hermes/SKILL.md +83 -0
  113. package/skills/unicli-oneshot/SKILL.md +59 -0
  114. package/skills/unicli-operate/SKILL.md +113 -0
  115. package/skills/unicli-repair/SKILL.md +209 -0
  116. package/skills/unicli-repair/references/error-codes.md +149 -0
  117. package/skills/unicli-repair/references/yaml-patches.md +321 -0
  118. package/skills/unicli-smart-search/SKILL.md +80 -0
  119. package/skills/unicli-usage/SKILL.md +65 -0
  120. package/src/adapters/adguardhome/rules.yaml +1 -1
  121. package/src/adapters/adguardhome/stats.yaml +1 -1
  122. package/src/adapters/adguardhome/status.yaml +1 -1
  123. package/src/adapters/apple-music/rate-album.yaml +1 -2
  124. package/src/adapters/arxiv/trending.yaml +1 -1
  125. package/src/adapters/az/account.yaml +1 -1
  126. package/src/adapters/coupang/hot.yaml +2 -1
  127. package/src/adapters/ctrip/hot.yaml +2 -1
  128. package/src/adapters/ctrip/search.yaml +2 -1
  129. package/src/adapters/douban/top250.yaml +1 -1
  130. package/src/adapters/figma/export-selected.yaml +1 -2
  131. package/src/adapters/gcloud/projects.yaml +1 -1
  132. package/src/adapters/github-trending/developers.yaml +1 -1
  133. package/src/adapters/github-trending/weekly.yaml +1 -1
  134. package/src/adapters/homebrew/search.yaml +1 -1
  135. package/src/adapters/imdb/top.yaml +1 -1
  136. package/src/adapters/itch-io/popular.yaml +1 -1
  137. package/src/adapters/itch-io/top.yaml +1 -1
  138. package/src/adapters/mastodon/timeline.yaml +1 -1
  139. package/src/adapters/openrouter/search.yaml +1 -1
  140. package/src/adapters/pypi/search.yaml +2 -1
  141. package/src/adapters/sspai/hot.yaml +4 -1
  142. package/src/adapters/sspai/latest.yaml +3 -3
  143. package/src/adapters/tieba/hot.yaml +1 -1
  144. package/src/adapters/wikipedia/today.yaml +1 -1
  145. package/src/adapters/zoom/toggle-mute.yaml +1 -2
  146. package/dist/engine/yaml-runner.d.ts +0 -11
  147. package/dist/engine/yaml-runner.d.ts.map +0 -1
  148. package/dist/engine/yaml-runner.js +0 -18
  149. package/dist/engine/yaml-runner.js.map +0 -1
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared types for the chromium-cookies module. Split out to break a
3
+ * circular import between `chromium-cookies.ts` (orchestration) and
4
+ * `chromium-cookies-platform.ts` (per-platform crypto + keystore).
5
+ */
6
+ export type BrowserId = "chrome" | "brave" | "edge" | "arc" | "dia" | "atlas";
7
+ export interface CookieRow {
8
+ host: string;
9
+ name: string;
10
+ value: string;
11
+ path: string;
12
+ expires: number;
13
+ secure: boolean;
14
+ httpOnly: boolean;
15
+ }
16
+ export interface ReadOptions {
17
+ browser: BrowserId;
18
+ domain: string;
19
+ profile?: string;
20
+ }
21
+ export declare class ChromiumCookieError extends Error {
22
+ readonly code: "browser_not_installed" | "no_profile" | "keychain_denied" | "encryption_unsupported" | "sqlite_failed" | "decrypt_failed" | "platform_unsupported";
23
+ readonly suggestion?: string | undefined;
24
+ constructor(code: "browser_not_installed" | "no_profile" | "keychain_denied" | "encryption_unsupported" | "sqlite_failed" | "decrypt_failed" | "platform_unsupported", message: string, suggestion?: string | undefined);
25
+ }
26
+ //# sourceMappingURL=chromium-cookies-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chromium-cookies-types.d.ts","sourceRoot":"","sources":["../../src/engine/chromium-cookies-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,IAAI,EAChB,uBAAuB,GACvB,YAAY,GACZ,iBAAiB,GACjB,wBAAwB,GACxB,eAAe,GACf,gBAAgB,GAChB,sBAAsB;aAEV,UAAU,CAAC,EAAE,MAAM;gBATnB,IAAI,EAChB,uBAAuB,GACvB,YAAY,GACZ,iBAAiB,GACjB,wBAAwB,GACxB,eAAe,GACf,gBAAgB,GAChB,sBAAsB,EAC1B,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA;CAKtC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Shared types for the chromium-cookies module. Split out to break a
3
+ * circular import between `chromium-cookies.ts` (orchestration) and
4
+ * `chromium-cookies-platform.ts` (per-platform crypto + keystore).
5
+ */
6
+ export class ChromiumCookieError extends Error {
7
+ code;
8
+ suggestion;
9
+ constructor(code, message, suggestion) {
10
+ super(message);
11
+ this.code = code;
12
+ this.suggestion = suggestion;
13
+ this.name = "ChromiumCookieError";
14
+ }
15
+ }
16
+ //# sourceMappingURL=chromium-cookies-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chromium-cookies-types.js","sourceRoot":"","sources":["../../src/engine/chromium-cookies-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAE1B;IASA;IAVlB,YACkB,IAOU,EAC1B,OAAe,EACC,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAXC,SAAI,GAAJ,IAAI,CAOM;QAEV,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Direct Chromium cookie reader (macOS / Linux / Windows).
3
+ *
4
+ * Reads encrypted cookies from a browser's local SQLite DB and decrypts them
5
+ * with the browser's platform-native key store. No CDP, no extension, no
6
+ * browser launch — works whether the browser is open or closed.
7
+ *
8
+ * macOS keychain `security` CLI → AES-128-CBC + 32-byte SHA256 prefix
9
+ * Linux libsecret `secret-tool` (peanuts fallback) → AES-128-CBC, no prefix, PBKDF2 iter=1
10
+ * Windows Local State + DPAPI → AES-256-GCM + 32-byte SHA256 prefix
11
+ * v20 cookies (Chrome 127+ App-Bound) surface as
12
+ * encryption_unsupported with a CDP-fallback suggestion
13
+ *
14
+ * SQLite is read by copy-then-open via the system `sqlite3` binary so that
15
+ * an open browser cannot block the read; WAL/SHM siblings are copied too.
16
+ *
17
+ * Tests at tests/unit/chromium-cookies.test.ts cover the pure path
18
+ * (deriveKey vector, decrypt round-trips per platform, profile picker,
19
+ * resolveCookieDb error codes).
20
+ */
21
+ import { type BrowserId, type CookieRow, type ReadOptions } from "./chromium-cookies-types.js";
22
+ import { type Platform } from "./chromium-cookies-platform.js";
23
+ export { ChromiumCookieError, type BrowserId, type CookieRow, type ReadOptions, } from "./chromium-cookies-types.js";
24
+ export { decryptValue, deriveKey, type Platform, } from "./chromium-cookies-platform.js";
25
+ /**
26
+ * Enumerate available profiles for a browser. Returns the directory names
27
+ * (e.g. "Default", "Profile 1") that contain a Cookies file, sorted by
28
+ * Cookies-file mtime descending (most-recently-active first).
29
+ */
30
+ export declare function listProfiles(browser: BrowserId): string[];
31
+ export declare function resolveCookieDb(browser: BrowserId, profile?: string): {
32
+ dbPath: string;
33
+ profile: string;
34
+ userDataRoot: string;
35
+ platform: Platform;
36
+ };
37
+ /**
38
+ * Read all cookies for a domain from a browser's local DB.
39
+ * Returns full structured rows for callers that want secure/httpOnly metadata.
40
+ */
41
+ export declare function readCookies(opts: ReadOptions): CookieRow[];
42
+ /**
43
+ * Convenience: read cookies for a domain and flatten to a name→value record,
44
+ * matching the shape that engine/cookies.ts already passes to fetch headers.
45
+ * Last-write-wins on duplicate names (later host_key entries override earlier).
46
+ */
47
+ export declare function readCookiesAsRecord(opts: ReadOptions): Record<string, string>;
48
+ /** All known browser ids in priority order for auto-discovery. */
49
+ export declare const BROWSER_IDS: readonly BrowserId[];
50
+ /**
51
+ * Find any installed browser whose profile DB exists. Used by the auto path
52
+ * when the caller doesn't specify --browser. Returns [] if no Chromium
53
+ * browser is installed locally, or if the platform isn't supported.
54
+ */
55
+ export declare function detectInstalledBrowsers(): BrowserId[];
56
+ //# sourceMappingURL=chromium-cookies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chromium-cookies.d.ts","sourceRoot":"","sources":["../../src/engine/chromium-cookies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAcH,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,YAAY,EACZ,SAAS,EACT,KAAK,QAAQ,GACd,MAAM,gCAAgC,CAAC;AA6FxC;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,EAAE,CA+BzD;AAkBD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,SAAS,EAClB,OAAO,CAAC,EAAE,MAAM,GACf;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAmCA;AAuID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,CAmC1D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM7E;AAED,kEAAkE;AAClE,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAOlC,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,SAAS,EAAE,CAWrD"}
@@ -0,0 +1,361 @@
1
+ /**
2
+ * Direct Chromium cookie reader (macOS / Linux / Windows).
3
+ *
4
+ * Reads encrypted cookies from a browser's local SQLite DB and decrypts them
5
+ * with the browser's platform-native key store. No CDP, no extension, no
6
+ * browser launch — works whether the browser is open or closed.
7
+ *
8
+ * macOS keychain `security` CLI → AES-128-CBC + 32-byte SHA256 prefix
9
+ * Linux libsecret `secret-tool` (peanuts fallback) → AES-128-CBC, no prefix, PBKDF2 iter=1
10
+ * Windows Local State + DPAPI → AES-256-GCM + 32-byte SHA256 prefix
11
+ * v20 cookies (Chrome 127+ App-Bound) surface as
12
+ * encryption_unsupported with a CDP-fallback suggestion
13
+ *
14
+ * SQLite is read by copy-then-open via the system `sqlite3` binary so that
15
+ * an open browser cannot block the read; WAL/SHM siblings are copied too.
16
+ *
17
+ * Tests at tests/unit/chromium-cookies.test.ts cover the pure path
18
+ * (deriveKey vector, decrypt round-trips per platform, profile picker,
19
+ * resolveCookieDb error codes).
20
+ */
21
+ import { copyFileSync, existsSync, mkdtempSync, readdirSync, rmSync, statSync, } from "node:fs";
22
+ import { homedir, tmpdir } from "node:os";
23
+ import { join } from "node:path";
24
+ import { execFileSync } from "node:child_process";
25
+ import { ChromiumCookieError, } from "./chromium-cookies-types.js";
26
+ import { KEYSTORE_SPECS, currentPlatform, decryptValue, deriveKey, getEncryptionSecret, } from "./chromium-cookies-platform.js";
27
+ export { ChromiumCookieError, } from "./chromium-cookies-types.js";
28
+ export { decryptValue, deriveKey, } from "./chromium-cookies-platform.js";
29
+ const BROWSERS = {
30
+ chrome: {
31
+ paths: {
32
+ darwin: "Google/Chrome",
33
+ linux: "google-chrome",
34
+ win32: "Google/Chrome/User Data",
35
+ },
36
+ // macOS: no extra User Data segment; Linux: same; Windows: already in path.
37
+ hasUserData: false,
38
+ },
39
+ brave: {
40
+ paths: {
41
+ darwin: "BraveSoftware/Brave-Browser",
42
+ linux: "BraveSoftware/Brave-Browser",
43
+ win32: "BraveSoftware/Brave-Browser/User Data",
44
+ },
45
+ hasUserData: false,
46
+ },
47
+ edge: {
48
+ paths: {
49
+ darwin: "Microsoft Edge",
50
+ linux: "microsoft-edge",
51
+ win32: "Microsoft/Edge/User Data",
52
+ },
53
+ hasUserData: false,
54
+ },
55
+ arc: {
56
+ // Arc has no Linux/Windows build as of 2026-05.
57
+ paths: { darwin: "Arc" },
58
+ hasUserData: true,
59
+ },
60
+ dia: {
61
+ // Dia has macOS only at present.
62
+ paths: { darwin: "Dia" },
63
+ hasUserData: true,
64
+ },
65
+ atlas: {
66
+ // Atlas (OpenAI ChatGPT browser) macOS only at present.
67
+ paths: { darwin: "com.openai.atlas" },
68
+ hasUserData: true,
69
+ },
70
+ };
71
+ /**
72
+ * Resolve the user-data root for a browser on the current platform.
73
+ *
74
+ * macOS $HOME/Library/Application Support/<browser>
75
+ * Linux $HOME/.config/<browser>
76
+ * Windows %LOCALAPPDATA%/<browser> (also honors $LOCALAPPDATA)
77
+ *
78
+ * Override the entire root via `UNICLI_BROWSER_HOME` for tests.
79
+ */
80
+ function userDataRoot(browser, platform) {
81
+ const spec = BROWSERS[browser];
82
+ const rel = spec.paths[platform];
83
+ if (!rel) {
84
+ throw new ChromiumCookieError("browser_not_installed", `${browser} has no known path on ${platform}`, `Supported: ${Object.keys(spec.paths).join(", ")}.`);
85
+ }
86
+ const override = process.env.UNICLI_BROWSER_HOME;
87
+ let home;
88
+ if (override) {
89
+ home = override;
90
+ }
91
+ else if (platform === "darwin") {
92
+ home = join(homedir(), "Library", "Application Support");
93
+ }
94
+ else if (platform === "linux") {
95
+ home = join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"));
96
+ }
97
+ else {
98
+ // win32
99
+ home = process.env.LOCALAPPDATA ?? join(homedir(), "AppData", "Local");
100
+ }
101
+ const base = join(home, rel);
102
+ return spec.hasUserData ? join(base, "User Data") : base;
103
+ }
104
+ /**
105
+ * Enumerate available profiles for a browser. Returns the directory names
106
+ * (e.g. "Default", "Profile 1") that contain a Cookies file, sorted by
107
+ * Cookies-file mtime descending (most-recently-active first).
108
+ */
109
+ export function listProfiles(browser) {
110
+ let platform;
111
+ try {
112
+ platform = currentPlatform();
113
+ }
114
+ catch {
115
+ return [];
116
+ }
117
+ const spec = BROWSERS[browser];
118
+ if (!spec.paths[platform])
119
+ return [];
120
+ const root = userDataRoot(browser, platform);
121
+ if (!existsSync(root))
122
+ return [];
123
+ let entries;
124
+ try {
125
+ entries = readdirSync(root);
126
+ }
127
+ catch {
128
+ return [];
129
+ }
130
+ const profiles = [];
131
+ for (const name of entries) {
132
+ const cookies = locateCookieFile(root, name);
133
+ if (!cookies)
134
+ continue;
135
+ let mtime = 0;
136
+ try {
137
+ mtime = statSync(cookies).mtimeMs;
138
+ }
139
+ catch {
140
+ // ignore — keep mtime = 0
141
+ }
142
+ profiles.push({ name, mtime });
143
+ }
144
+ profiles.sort((a, b) => b.mtime - a.mtime);
145
+ return profiles.map((p) => p.name);
146
+ }
147
+ /**
148
+ * Cookies live at `<profile>/Cookies` on older builds and
149
+ * `<profile>/Network/Cookies` on newer ones (Chromium M96+ moved it). We
150
+ * check `Network/` first because it is the current default and contains the
151
+ * fresher data when both are present.
152
+ */
153
+ function locateCookieFile(root, profile) {
154
+ for (const candidate of [
155
+ join(root, profile, "Network", "Cookies"),
156
+ join(root, profile, "Cookies"),
157
+ ]) {
158
+ if (existsSync(candidate))
159
+ return candidate;
160
+ }
161
+ return null;
162
+ }
163
+ export function resolveCookieDb(browser, profile) {
164
+ const platform = currentPlatform();
165
+ const spec = BROWSERS[browser];
166
+ if (!spec.paths[platform]) {
167
+ throw new ChromiumCookieError("browser_not_installed", `${browser} is not supported on ${platform}`, `Supported on: ${Object.keys(spec.paths).join(", ")}.`);
168
+ }
169
+ const root = userDataRoot(browser, platform);
170
+ if (!existsSync(root)) {
171
+ throw new ChromiumCookieError("browser_not_installed", `${browser} not found at ${root}`, `Install ${browser} or pass --browser <other>.`);
172
+ }
173
+ const chosen = profile ?? listProfiles(browser)[0];
174
+ if (!chosen) {
175
+ throw new ChromiumCookieError("no_profile", `${browser} has no profile with a Cookies database under ${root}`, `Sign into ${browser} and visit the target site once.`);
176
+ }
177
+ const dbPath = locateCookieFile(root, chosen);
178
+ if (!dbPath) {
179
+ throw new ChromiumCookieError("no_profile", `profile "${chosen}" has no Cookies file under ${root}`, "Pass a different --profile (try listProfiles).");
180
+ }
181
+ return { dbPath, profile: chosen, userDataRoot: root, platform };
182
+ }
183
+ /* -------------------------------------------------------------------------- */
184
+ /* SQLite read (copy-then-read via system sqlite3) */
185
+ /* -------------------------------------------------------------------------- */
186
+ /** Resolve the sqlite3 binary, allowing PATH lookup on Linux/Windows. */
187
+ function sqliteBinary() {
188
+ return process.env.UNICLI_SQLITE_BIN ?? "sqlite3";
189
+ }
190
+ /** Copy Cookies + WAL/SHM siblings to a tmpdir; return the tmp DB path. */
191
+ function snapshotDb(srcDb) {
192
+ const tmp = mkdtempSync(join(tmpdir(), "unicli-cookies-"));
193
+ const dst = join(tmp, "Cookies");
194
+ copyFileSync(srcDb, dst);
195
+ for (const suffix of ["-wal", "-shm", "-journal"]) {
196
+ const sibling = `${srcDb}${suffix}`;
197
+ if (existsSync(sibling)) {
198
+ try {
199
+ copyFileSync(sibling, `${dst}${suffix}`);
200
+ }
201
+ catch {
202
+ // Sibling read is opportunistic.
203
+ }
204
+ }
205
+ }
206
+ return {
207
+ dbPath: dst,
208
+ cleanup: () => {
209
+ try {
210
+ rmSync(tmp, { recursive: true, force: true });
211
+ }
212
+ catch {
213
+ // best effort
214
+ }
215
+ },
216
+ };
217
+ }
218
+ /**
219
+ * Read cookie rows for a domain. Filters via host_key suffix so
220
+ * `.example.com`, `example.com`, and `sub.example.com` all match.
221
+ *
222
+ * Implementation: shell-out to `sqlite3` reading from stdin. Zero npm deps,
223
+ * zero native compile — `sqlite3` ships with macOS and is widely available
224
+ * on Linux distros and WSL; on Windows we look up via PATH (set
225
+ * `UNICLI_SQLITE_BIN` to override).
226
+ */
227
+ function readRowsForDomain(dbPath, domain) {
228
+ if (!/^[a-zA-Z0-9.-]+$/.test(domain)) {
229
+ throw new ChromiumCookieError("sqlite_failed", `invalid domain: "${domain}"`, "Domain must contain only letters, digits, dots, and hyphens.");
230
+ }
231
+ // Per RFC 6265, a cookie set on `.bilibili.com` is sent to `api.bilibili.com`.
232
+ // So when an adapter declares `api.bilibili.com`, we must also accept rows
233
+ // whose host_key is the parent `bilibili.com` (with or without leading dot).
234
+ // Walk every ≥2-segment suffix; exclude bare TLD to avoid pulling unrelated
235
+ // domains. PSL edge cases (`co.uk`) are tolerable: matching `.co.uk` would
236
+ // be overbroad but in practice the cookies DB never stores such entries.
237
+ const parts = domain.split(".");
238
+ const candidates = [];
239
+ for (let i = 0; i <= parts.length - 2; i++) {
240
+ candidates.push(parts.slice(i).join("."));
241
+ }
242
+ const clauses = candidates
243
+ .flatMap((d) => {
244
+ const safe = d.replace(/'/g, "''");
245
+ return [`host_key = '${safe}'`, `host_key = '.${safe}'`];
246
+ })
247
+ .join(" OR ");
248
+ const sql = [
249
+ ".mode list",
250
+ ".separator |",
251
+ ".headers off",
252
+ `SELECT host_key, name, hex(encrypted_value), value, path, expires_utc, is_secure, is_httponly
253
+ FROM cookies
254
+ WHERE ${clauses};`,
255
+ ].join("\n");
256
+ let stdout;
257
+ try {
258
+ stdout = execFileSync(sqliteBinary(), ["-readonly", "-bail", `file:${dbPath}?mode=ro&immutable=1`], {
259
+ input: sql + "\n.quit\n",
260
+ encoding: "utf8",
261
+ stdio: ["pipe", "pipe", "pipe"],
262
+ });
263
+ }
264
+ catch (err) {
265
+ throw new ChromiumCookieError("sqlite_failed", `sqlite3 read failed: ${err.message}`, "Ensure the sqlite3 binary is on PATH (set UNICLI_SQLITE_BIN to override).");
266
+ }
267
+ const rows = [];
268
+ for (const line of stdout.split("\n")) {
269
+ if (!line)
270
+ continue;
271
+ const parts = line.split("|");
272
+ if (parts.length < 8)
273
+ continue;
274
+ const [host, name, hex, plain, path, expires, isSecure, isHttpOnly] = parts;
275
+ rows.push({
276
+ host,
277
+ name,
278
+ encrypted: Buffer.from(hex, "hex"),
279
+ plain,
280
+ path,
281
+ expires: Number(expires) || 0,
282
+ isSecure: Number(isSecure) || 0,
283
+ isHttpOnly: Number(isHttpOnly) || 0,
284
+ });
285
+ }
286
+ return rows;
287
+ }
288
+ /* -------------------------------------------------------------------------- */
289
+ /* Public API */
290
+ /* -------------------------------------------------------------------------- */
291
+ /**
292
+ * Read all cookies for a domain from a browser's local DB.
293
+ * Returns full structured rows for callers that want secure/httpOnly metadata.
294
+ */
295
+ export function readCookies(opts) {
296
+ const { dbPath, platform, userDataRoot: root, } = resolveCookieDb(opts.browser, opts.profile);
297
+ const secret = getEncryptionSecret(opts.browser, platform, KEYSTORE_SPECS[opts.browser], root);
298
+ const key = deriveKey(secret, platform);
299
+ const snap = snapshotDb(dbPath);
300
+ try {
301
+ const rows = readRowsForDomain(snap.dbPath, opts.domain);
302
+ return rows.map((r) => {
303
+ const value = r.encrypted.length > 0
304
+ ? decryptValue(r.encrypted, key, platform)
305
+ : r.plain;
306
+ return {
307
+ host: r.host,
308
+ name: r.name,
309
+ value,
310
+ path: r.path,
311
+ expires: r.expires,
312
+ secure: r.isSecure === 1,
313
+ httpOnly: r.isHttpOnly === 1,
314
+ };
315
+ });
316
+ }
317
+ finally {
318
+ snap.cleanup();
319
+ }
320
+ }
321
+ /**
322
+ * Convenience: read cookies for a domain and flatten to a name→value record,
323
+ * matching the shape that engine/cookies.ts already passes to fetch headers.
324
+ * Last-write-wins on duplicate names (later host_key entries override earlier).
325
+ */
326
+ export function readCookiesAsRecord(opts) {
327
+ const out = {};
328
+ for (const c of readCookies(opts)) {
329
+ out[c.name] = c.value;
330
+ }
331
+ return out;
332
+ }
333
+ /** All known browser ids in priority order for auto-discovery. */
334
+ export const BROWSER_IDS = [
335
+ "chrome",
336
+ "arc",
337
+ "dia",
338
+ "brave",
339
+ "edge",
340
+ "atlas",
341
+ ];
342
+ /**
343
+ * Find any installed browser whose profile DB exists. Used by the auto path
344
+ * when the caller doesn't specify --browser. Returns [] if no Chromium
345
+ * browser is installed locally, or if the platform isn't supported.
346
+ */
347
+ export function detectInstalledBrowsers() {
348
+ let platform;
349
+ try {
350
+ platform = currentPlatform();
351
+ }
352
+ catch {
353
+ return [];
354
+ }
355
+ return BROWSER_IDS.filter((b) => {
356
+ if (!BROWSERS[b].paths[platform])
357
+ return false;
358
+ return listProfiles(b).length > 0;
359
+ });
360
+ }
361
+ //# sourceMappingURL=chromium-cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chromium-cookies.js","sourceRoot":"","sources":["../../src/engine/chromium-cookies.ts"],"names":[],"mappings":"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"}
@@ -26,12 +26,20 @@ export declare function validateCookies(site: string, requiredKeys: string[]): {
26
26
  */
27
27
  export declare function getCookieDir(): string;
28
28
  /**
29
- * Load cookies with CDP fallback.
30
- * 1. Try disk (fast, synchronous) — ~/.unicli/cookies/<site>.json
31
- * 2. Try CDP extraction (connects to Chrome debug port)
32
- * 3. Return null if neither available
29
+ * Load cookies with multi-source fallback.
33
30
  *
34
- * When CDP extraction succeeds, cookies are saved to disk for future use.
31
+ * Precedence (each falls through silently to the next on miss):
32
+ * 1. ~/.unicli/cookies/<site>.json — explicit user import
33
+ * 2. browser local DB (Chrome/Arc/Dia/…) — direct SQLite read, no browser launch
34
+ * 3. CDP — connects to Chrome debug port (legacy)
35
+ *
36
+ * The browser disk source is the new default for `strategy: cookie` adapters:
37
+ * it works whether the browser is open or closed, never opens a new tab, and
38
+ * needs neither extension nor daemon. Successful reads are persisted to
39
+ * ~/.unicli/cookies for offline reuse.
40
+ *
41
+ * Set `UNICLI_COOKIE_NO_BROWSER=1` to skip the browser-disk step (e.g., in CI
42
+ * where the macOS Keychain prompt would block).
35
43
  */
36
44
  export declare function loadCookiesWithCDP(site: string, domain?: string): Promise<Record<string, string> | null>;
37
45
  //# sourceMappingURL=cookies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/engine/cookies.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAmBvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAI1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EAAE,GACrB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAMvC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CA2BxC"}
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/engine/cookies.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAmBvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAI1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EAAE,GACrB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAMvC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAwCxC"}
@@ -61,28 +61,48 @@ export function getCookieDir() {
61
61
  return cookieDir();
62
62
  }
63
63
  /**
64
- * Load cookies with CDP fallback.
65
- * 1. Try disk (fast, synchronous) — ~/.unicli/cookies/<site>.json
66
- * 2. Try CDP extraction (connects to Chrome debug port)
67
- * 3. Return null if neither available
64
+ * Load cookies with multi-source fallback.
68
65
  *
69
- * When CDP extraction succeeds, cookies are saved to disk for future use.
66
+ * Precedence (each falls through silently to the next on miss):
67
+ * 1. ~/.unicli/cookies/<site>.json — explicit user import
68
+ * 2. browser local DB (Chrome/Arc/Dia/…) — direct SQLite read, no browser launch
69
+ * 3. CDP — connects to Chrome debug port (legacy)
70
+ *
71
+ * The browser disk source is the new default for `strategy: cookie` adapters:
72
+ * it works whether the browser is open or closed, never opens a new tab, and
73
+ * needs neither extension nor daemon. Successful reads are persisted to
74
+ * ~/.unicli/cookies for offline reuse.
75
+ *
76
+ * Set `UNICLI_COOKIE_NO_BROWSER=1` to skip the browser-disk step (e.g., in CI
77
+ * where the macOS Keychain prompt would block).
70
78
  */
71
79
  export async function loadCookiesWithCDP(site, domain) {
72
- // 1. Try disk first (existing behavior)
80
+ // 1. ~/.unicli/cookies first
73
81
  const diskCookies = loadCookies(site);
74
82
  if (diskCookies)
75
83
  return diskCookies;
76
- // 2. Try CDP extraction
84
+ // Resolve the cookie domain once for both browser and CDP paths.
77
85
  let cookieDomain = domain ?? site.replace(/_/g, ".");
78
- // If no TLD in domain, append .com as default (covers bilibili, zhihu, weibo, etc.)
79
86
  if (!cookieDomain.includes(".")) {
80
87
  cookieDomain = `${cookieDomain}.com`;
81
88
  }
89
+ // 2. Direct browser disk read (no launch, no CDP, no extension).
90
+ if (process.env.UNICLI_COOKIE_NO_BROWSER !== "1") {
91
+ const browserCookies = await loadFromInstalledBrowser(cookieDomain);
92
+ if (browserCookies && Object.keys(browserCookies).length > 0) {
93
+ try {
94
+ saveCookiesToDisk(site, browserCookies);
95
+ }
96
+ catch {
97
+ // Non-fatal — caller still gets the cookies.
98
+ }
99
+ return browserCookies;
100
+ }
101
+ }
102
+ // 3. CDP fallback for users running Chrome with --remote-debugging-port.
82
103
  try {
83
104
  const cdpCookies = await extractCookiesViaCDP(cookieDomain);
84
105
  if (Object.keys(cdpCookies).length > 0) {
85
- // Save to disk for future use (site name is already validated by saveCookiesToDisk)
86
106
  try {
87
107
  saveCookiesToDisk(site, cdpCookies);
88
108
  }
@@ -97,4 +117,30 @@ export async function loadCookiesWithCDP(site, domain) {
97
117
  }
98
118
  return null;
99
119
  }
120
+ /**
121
+ * Try each installed Chromium browser in priority order until one yields
122
+ * cookies for the domain. Failures (browser not installed, Keychain denied,
123
+ * unsupported encryption) fall through silently — the next source handles it.
124
+ */
125
+ async function loadFromInstalledBrowser(domain) {
126
+ let mod;
127
+ try {
128
+ mod = await import("./chromium-cookies.js");
129
+ }
130
+ catch {
131
+ return null;
132
+ }
133
+ const installed = mod.detectInstalledBrowsers();
134
+ for (const browser of installed) {
135
+ try {
136
+ const record = mod.readCookiesAsRecord({ browser, domain });
137
+ if (Object.keys(record).length > 0)
138
+ return record;
139
+ }
140
+ catch {
141
+ // Move on to the next browser.
142
+ }
143
+ }
144
+ return null;
145
+ }
100
146
  //# sourceMappingURL=cookies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/engine/cookies.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/engine/cookies.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,14 @@ export interface PipelineOptions {
21
21
  site?: string;
22
22
  command?: string;
23
23
  strategy?: string;
24
+ /**
25
+ * Cookie domain declared by the adapter (or the command override). Drives
26
+ * the browser-cookie source — without this the loader has to guess
27
+ * `${site}.com`, which is wrong for sites like notion (`.notion.so`),
28
+ * weixin (`mp.weixin.qq.com`), perplexity (`.perplexity.ai`), twitch
29
+ * (`.twitch.tv`), linux-do (`linux.do`), etc.
30
+ */
31
+ domain?: string;
24
32
  /**
25
33
  * Kernel surface that dispatched the pipeline. When provided, becomes
26
34
  * `${{ surface }}` in YAML templates. Undefined for legacy callers