@lobu/cli 5.0.0 → 6.0.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 (266) hide show
  1. package/README.md +11 -26
  2. package/dist/__tests__/chat.integration.test.js +19 -19
  3. package/dist/__tests__/chat.integration.test.js.map +1 -1
  4. package/dist/__tests__/dev.test.d.ts +2 -0
  5. package/dist/__tests__/dev.test.d.ts.map +1 -0
  6. package/dist/__tests__/dev.test.js +25 -0
  7. package/dist/__tests__/dev.test.js.map +1 -0
  8. package/dist/__tests__/init-memory.test.js +1 -14
  9. package/dist/__tests__/init-memory.test.js.map +1 -1
  10. package/dist/__tests__/token.test.d.ts +2 -0
  11. package/dist/__tests__/token.test.d.ts.map +1 -0
  12. package/dist/__tests__/token.test.js +52 -0
  13. package/dist/__tests__/token.test.js.map +1 -0
  14. package/dist/bundled-skills/lobu/SKILL.md +95 -7
  15. package/dist/commands/_lib/apply/__tests__/client.test.d.ts +2 -0
  16. package/dist/commands/_lib/apply/__tests__/client.test.d.ts.map +1 -0
  17. package/dist/commands/_lib/apply/__tests__/client.test.js +23 -0
  18. package/dist/commands/_lib/apply/__tests__/client.test.js.map +1 -0
  19. package/dist/commands/_lib/apply/__tests__/desired-state.test.d.ts +2 -0
  20. package/dist/commands/_lib/apply/__tests__/desired-state.test.d.ts.map +1 -0
  21. package/dist/commands/_lib/apply/__tests__/desired-state.test.js +140 -0
  22. package/dist/commands/_lib/apply/__tests__/desired-state.test.js.map +1 -0
  23. package/dist/commands/_lib/apply/__tests__/diff.test.d.ts +2 -0
  24. package/dist/commands/_lib/apply/__tests__/diff.test.d.ts.map +1 -0
  25. package/dist/commands/_lib/apply/__tests__/diff.test.js +378 -0
  26. package/dist/commands/_lib/apply/__tests__/diff.test.js.map +1 -0
  27. package/dist/commands/_lib/apply/apply-cmd.d.ts +12 -0
  28. package/dist/commands/_lib/apply/apply-cmd.d.ts.map +1 -0
  29. package/dist/commands/_lib/apply/apply-cmd.js +183 -0
  30. package/dist/commands/_lib/apply/apply-cmd.js.map +1 -0
  31. package/dist/commands/_lib/apply/client.d.ts +130 -0
  32. package/dist/commands/_lib/apply/client.d.ts.map +1 -0
  33. package/dist/commands/_lib/apply/client.js +243 -0
  34. package/dist/commands/_lib/apply/client.js.map +1 -0
  35. package/dist/commands/_lib/apply/desired-state.d.ts +71 -0
  36. package/dist/commands/_lib/apply/desired-state.d.ts.map +1 -0
  37. package/dist/commands/_lib/apply/desired-state.js +600 -0
  38. package/dist/commands/_lib/apply/desired-state.js.map +1 -0
  39. package/dist/commands/_lib/apply/diff.d.ts +76 -0
  40. package/dist/commands/_lib/apply/diff.d.ts.map +1 -0
  41. package/dist/commands/_lib/apply/diff.js +323 -0
  42. package/dist/commands/_lib/apply/diff.js.map +1 -0
  43. package/dist/commands/_lib/apply/prompt.d.ts +13 -0
  44. package/dist/commands/_lib/apply/prompt.d.ts.map +1 -0
  45. package/dist/commands/_lib/apply/prompt.js +19 -0
  46. package/dist/commands/_lib/apply/prompt.js.map +1 -0
  47. package/dist/commands/_lib/apply/render.d.ts +9 -0
  48. package/dist/commands/_lib/apply/render.d.ts.map +1 -0
  49. package/dist/commands/_lib/apply/render.js +92 -0
  50. package/dist/commands/_lib/apply/render.js.map +1 -0
  51. package/dist/commands/agent.d.ts +27 -0
  52. package/dist/commands/agent.d.ts.map +1 -0
  53. package/dist/commands/agent.js +111 -0
  54. package/dist/commands/agent.js.map +1 -0
  55. package/dist/commands/apply.d.ts +3 -0
  56. package/dist/commands/apply.d.ts.map +1 -0
  57. package/dist/commands/apply.js +5 -0
  58. package/dist/commands/apply.js.map +1 -0
  59. package/dist/commands/chat.d.ts.map +1 -1
  60. package/dist/commands/chat.js +5 -5
  61. package/dist/commands/chat.js.map +1 -1
  62. package/dist/commands/dev.d.ts +8 -3
  63. package/dist/commands/dev.d.ts.map +1 -1
  64. package/dist/commands/dev.js +128 -124
  65. package/dist/commands/dev.js.map +1 -1
  66. package/dist/commands/doctor.d.ts +6 -0
  67. package/dist/commands/doctor.d.ts.map +1 -0
  68. package/dist/commands/doctor.js +75 -0
  69. package/dist/commands/doctor.js.map +1 -0
  70. package/dist/commands/eval.d.ts +1 -0
  71. package/dist/commands/eval.d.ts.map +1 -1
  72. package/dist/commands/eval.js +7 -4
  73. package/dist/commands/eval.js.map +1 -1
  74. package/dist/commands/init.d.ts +2 -9
  75. package/dist/commands/init.d.ts.map +1 -1
  76. package/dist/commands/init.js +34 -248
  77. package/dist/commands/init.js.map +1 -1
  78. package/dist/commands/login.d.ts +11 -3
  79. package/dist/commands/login.d.ts.map +1 -1
  80. package/dist/commands/login.js +109 -251
  81. package/dist/commands/login.js.map +1 -1
  82. package/dist/commands/logout.d.ts.map +1 -1
  83. package/dist/commands/logout.js +12 -11
  84. package/dist/commands/logout.js.map +1 -1
  85. package/dist/commands/memory/_lib/agent-detect.d.ts +9 -0
  86. package/dist/commands/memory/_lib/agent-detect.d.ts.map +1 -0
  87. package/dist/commands/memory/_lib/agent-detect.js +82 -0
  88. package/dist/commands/memory/_lib/agent-detect.js.map +1 -0
  89. package/dist/commands/memory/_lib/browser-auth-cmd.d.ts +19 -0
  90. package/dist/commands/memory/_lib/browser-auth-cmd.d.ts.map +1 -0
  91. package/dist/commands/memory/_lib/browser-auth-cmd.js +635 -0
  92. package/dist/commands/memory/_lib/browser-auth-cmd.js.map +1 -0
  93. package/dist/commands/memory/_lib/browser.d.ts +2 -0
  94. package/dist/commands/memory/_lib/browser.d.ts.map +1 -0
  95. package/dist/commands/memory/_lib/browser.js +26 -0
  96. package/dist/commands/memory/_lib/browser.js.map +1 -0
  97. package/dist/commands/memory/_lib/errors.d.ts +13 -0
  98. package/dist/commands/memory/_lib/errors.d.ts.map +1 -0
  99. package/dist/commands/memory/_lib/errors.js +23 -0
  100. package/dist/commands/memory/_lib/errors.js.map +1 -0
  101. package/dist/commands/memory/_lib/init-wizard.d.ts +12 -0
  102. package/dist/commands/memory/_lib/init-wizard.d.ts.map +1 -0
  103. package/dist/commands/memory/_lib/init-wizard.js +182 -0
  104. package/dist/commands/memory/_lib/init-wizard.js.map +1 -0
  105. package/dist/commands/memory/_lib/install-targets.d.ts +15 -0
  106. package/dist/commands/memory/_lib/install-targets.d.ts.map +1 -0
  107. package/dist/commands/memory/_lib/install-targets.js +205 -0
  108. package/dist/commands/memory/_lib/install-targets.js.map +1 -0
  109. package/dist/commands/memory/_lib/mcp.d.ts +20 -0
  110. package/dist/commands/memory/_lib/mcp.d.ts.map +1 -0
  111. package/dist/commands/memory/_lib/mcp.js +182 -0
  112. package/dist/commands/memory/_lib/mcp.js.map +1 -0
  113. package/dist/commands/memory/_lib/openclaw-auth.d.ts +41 -0
  114. package/dist/commands/memory/_lib/openclaw-auth.d.ts.map +1 -0
  115. package/dist/commands/memory/_lib/openclaw-auth.js +133 -0
  116. package/dist/commands/memory/_lib/openclaw-auth.js.map +1 -0
  117. package/dist/commands/memory/_lib/openclaw-auth.test.d.ts +2 -0
  118. package/dist/commands/memory/_lib/openclaw-auth.test.d.ts.map +1 -0
  119. package/dist/commands/memory/_lib/openclaw-auth.test.js +9 -0
  120. package/dist/commands/memory/_lib/openclaw-auth.test.js.map +1 -0
  121. package/dist/commands/memory/_lib/openclaw-cmd.d.ts +15 -0
  122. package/dist/commands/memory/_lib/openclaw-cmd.d.ts.map +1 -0
  123. package/dist/commands/memory/_lib/openclaw-cmd.js +208 -0
  124. package/dist/commands/memory/_lib/openclaw-cmd.js.map +1 -0
  125. package/dist/commands/memory/_lib/output.d.ts +5 -0
  126. package/dist/commands/memory/_lib/output.d.ts.map +1 -0
  127. package/dist/commands/memory/_lib/output.js +17 -0
  128. package/dist/commands/memory/_lib/output.js.map +1 -0
  129. package/dist/commands/memory/_lib/schema.d.ts +93 -0
  130. package/dist/commands/memory/_lib/schema.d.ts.map +1 -0
  131. package/dist/commands/memory/_lib/schema.js +192 -0
  132. package/dist/commands/memory/_lib/schema.js.map +1 -0
  133. package/dist/commands/memory/_lib/seed-cmd.d.ts +9 -0
  134. package/dist/commands/memory/_lib/seed-cmd.d.ts.map +1 -0
  135. package/dist/commands/memory/_lib/seed-cmd.js +516 -0
  136. package/dist/commands/memory/_lib/seed-cmd.js.map +1 -0
  137. package/dist/commands/memory/browser-auth.d.ts +3 -0
  138. package/dist/commands/memory/browser-auth.d.ts.map +1 -0
  139. package/dist/commands/memory/browser-auth.js +5 -0
  140. package/dist/commands/memory/browser-auth.js.map +1 -0
  141. package/dist/commands/memory/configure.d.ts +3 -0
  142. package/dist/commands/memory/configure.d.ts.map +1 -0
  143. package/dist/commands/memory/configure.js +5 -0
  144. package/dist/commands/memory/configure.js.map +1 -0
  145. package/dist/commands/memory/health.d.ts +3 -0
  146. package/dist/commands/memory/health.d.ts.map +1 -0
  147. package/dist/commands/memory/health.js +5 -0
  148. package/dist/commands/memory/health.js.map +1 -0
  149. package/dist/commands/memory/init.d.ts +8 -0
  150. package/dist/commands/memory/init.d.ts.map +1 -0
  151. package/dist/commands/memory/init.js +65 -0
  152. package/dist/commands/memory/init.js.map +1 -0
  153. package/dist/commands/memory/org.d.ts +7 -0
  154. package/dist/commands/memory/org.d.ts.map +1 -0
  155. package/dist/commands/memory/org.js +22 -0
  156. package/dist/commands/memory/org.js.map +1 -0
  157. package/dist/commands/memory/run.d.ts +8 -0
  158. package/dist/commands/memory/run.d.ts.map +1 -0
  159. package/dist/commands/memory/run.js +58 -0
  160. package/dist/commands/memory/run.js.map +1 -0
  161. package/dist/commands/memory/seed.d.ts +3 -0
  162. package/dist/commands/memory/seed.d.ts.map +1 -0
  163. package/dist/commands/memory/seed.js +5 -0
  164. package/dist/commands/memory/seed.js.map +1 -0
  165. package/dist/commands/org.d.ts +10 -0
  166. package/dist/commands/org.d.ts.map +1 -0
  167. package/dist/commands/org.js +34 -0
  168. package/dist/commands/org.js.map +1 -0
  169. package/dist/commands/{connections/platforms.d.ts → platforms/platform-prompts.d.ts} +5 -5
  170. package/dist/commands/platforms/platform-prompts.d.ts.map +1 -0
  171. package/dist/commands/{connections/platforms.js → platforms/platform-prompts.js} +24 -24
  172. package/dist/commands/platforms/platform-prompts.js.map +1 -0
  173. package/dist/commands/status.d.ts +4 -1
  174. package/dist/commands/status.d.ts.map +1 -1
  175. package/dist/commands/status.js +15 -84
  176. package/dist/commands/status.js.map +1 -1
  177. package/dist/commands/token.d.ts +17 -0
  178. package/dist/commands/token.d.ts.map +1 -0
  179. package/dist/commands/token.js +55 -0
  180. package/dist/commands/token.js.map +1 -0
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +303 -88
  183. package/dist/index.js.map +1 -1
  184. package/dist/internal/__tests__/api-client.test.d.ts +2 -0
  185. package/dist/internal/__tests__/api-client.test.d.ts.map +1 -0
  186. package/dist/internal/__tests__/api-client.test.js +95 -0
  187. package/dist/internal/__tests__/api-client.test.js.map +1 -0
  188. package/dist/internal/__tests__/context.test.d.ts +2 -0
  189. package/dist/internal/__tests__/context.test.d.ts.map +1 -0
  190. package/dist/internal/__tests__/context.test.js +77 -0
  191. package/dist/internal/__tests__/context.test.js.map +1 -0
  192. package/dist/internal/api-client.d.ts +39 -0
  193. package/dist/internal/api-client.d.ts.map +1 -0
  194. package/dist/internal/api-client.js +217 -0
  195. package/dist/internal/api-client.js.map +1 -0
  196. package/dist/internal/context.d.ts +10 -1
  197. package/dist/internal/context.d.ts.map +1 -1
  198. package/dist/internal/context.js +109 -2
  199. package/dist/internal/context.js.map +1 -1
  200. package/dist/internal/credentials.d.ts +12 -2
  201. package/dist/internal/credentials.d.ts.map +1 -1
  202. package/dist/internal/credentials.js +47 -54
  203. package/dist/internal/credentials.js.map +1 -1
  204. package/dist/internal/gateway-url.d.ts +4 -4
  205. package/dist/internal/gateway-url.d.ts.map +1 -1
  206. package/dist/internal/gateway-url.js +6 -5
  207. package/dist/internal/gateway-url.js.map +1 -1
  208. package/dist/internal/index.d.ts +5 -3
  209. package/dist/internal/index.d.ts.map +1 -1
  210. package/dist/internal/index.js +3 -2
  211. package/dist/internal/index.js.map +1 -1
  212. package/dist/internal/local-env.d.ts +2 -0
  213. package/dist/internal/local-env.d.ts.map +1 -0
  214. package/dist/internal/local-env.js +32 -0
  215. package/dist/internal/local-env.js.map +1 -0
  216. package/dist/internal/oauth.d.ts +82 -0
  217. package/dist/internal/oauth.d.ts.map +1 -0
  218. package/dist/internal/oauth.js +234 -0
  219. package/dist/internal/oauth.js.map +1 -0
  220. package/dist/server.bundle.mjs +72219 -0
  221. package/dist/templates/.env.tmpl +7 -3
  222. package/dist/templates/README.md.tmpl +20 -53
  223. package/package.json +60 -6
  224. package/dist/__tests__/skills.test.d.ts +0 -2
  225. package/dist/__tests__/skills.test.d.ts.map +0 -1
  226. package/dist/__tests__/skills.test.js +0 -33
  227. package/dist/__tests__/skills.test.js.map +0 -1
  228. package/dist/commands/connections/add.d.ts +0 -2
  229. package/dist/commands/connections/add.d.ts.map +0 -1
  230. package/dist/commands/connections/add.js +0 -46
  231. package/dist/commands/connections/add.js.map +0 -1
  232. package/dist/commands/connections/list.d.ts +0 -2
  233. package/dist/commands/connections/list.d.ts.map +0 -1
  234. package/dist/commands/connections/list.js +0 -25
  235. package/dist/commands/connections/list.js.map +0 -1
  236. package/dist/commands/connections/platforms.d.ts.map +0 -1
  237. package/dist/commands/connections/platforms.js.map +0 -1
  238. package/dist/commands/providers/add.d.ts +0 -2
  239. package/dist/commands/providers/add.d.ts.map +0 -1
  240. package/dist/commands/providers/add.js +0 -50
  241. package/dist/commands/providers/add.js.map +0 -1
  242. package/dist/commands/providers/list.d.ts +0 -2
  243. package/dist/commands/providers/list.d.ts.map +0 -1
  244. package/dist/commands/providers/list.js +0 -22
  245. package/dist/commands/providers/list.js.map +0 -1
  246. package/dist/commands/secrets.d.ts +0 -8
  247. package/dist/commands/secrets.d.ts.map +0 -1
  248. package/dist/commands/secrets.js +0 -98
  249. package/dist/commands/secrets.js.map +0 -1
  250. package/dist/commands/skills/add.d.ts +0 -5
  251. package/dist/commands/skills/add.d.ts.map +0 -1
  252. package/dist/commands/skills/add.js +0 -27
  253. package/dist/commands/skills/add.js.map +0 -1
  254. package/dist/commands/skills/list.d.ts +0 -2
  255. package/dist/commands/skills/list.d.ts.map +0 -1
  256. package/dist/commands/skills/list.js +0 -19
  257. package/dist/commands/skills/list.js.map +0 -1
  258. package/dist/commands/skills/registry.d.ts +0 -19
  259. package/dist/commands/skills/registry.d.ts.map +0 -1
  260. package/dist/commands/skills/registry.js +0 -76
  261. package/dist/commands/skills/registry.js.map +0 -1
  262. package/dist/config/agent-helpers.d.ts +0 -38
  263. package/dist/config/agent-helpers.d.ts.map +0 -1
  264. package/dist/config/agent-helpers.js +0 -58
  265. package/dist/config/agent-helpers.js.map +0 -1
  266. package/dist/templates/Dockerfile.worker.tmpl +0 -29
@@ -0,0 +1,635 @@
1
+ /**
2
+ * Browser Auth Command
3
+ *
4
+ * Captures authentication cookies from the user's local Chrome browser
5
+ * for browser-based connectors. On macOS, decrypts the Chrome cookie store
6
+ * directly using the Keychain encryption key. On Linux, uses headless Chrome via CDP.
7
+ */
8
+ import { execSync, spawn } from "node:child_process";
9
+ import { copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, } from "node:fs";
10
+ import { get as httpGet } from "node:http";
11
+ import { createServer } from "node:net";
12
+ import { homedir, tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+ import { fetchCdpVersionInfo, resolveCdpUrl, } from "@lobu/connector-sdk";
15
+ import { printText } from "./output.js";
16
+ const emptyProfile = { config: {} };
17
+ function getChromePaths() {
18
+ const home = homedir();
19
+ if (process.platform === "darwin") {
20
+ return {
21
+ binary: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
22
+ profileDir: join(home, "Library/Application Support/Google/Chrome"),
23
+ };
24
+ }
25
+ if (process.platform === "linux") {
26
+ return {
27
+ binary: "/usr/bin/google-chrome",
28
+ profileDir: join(home, ".config/google-chrome"),
29
+ };
30
+ }
31
+ throw new Error(`Unsupported platform: ${process.platform}`);
32
+ }
33
+ function listProfiles(profileDir) {
34
+ const localStatePath = join(profileDir, "Local State");
35
+ if (!existsSync(localStatePath)) {
36
+ throw new Error(`Chrome Local State not found at ${localStatePath}`);
37
+ }
38
+ const localState = JSON.parse(readFileSync(localStatePath, "utf8"));
39
+ const infoCache = localState.profile?.info_cache ?? {};
40
+ const lastUsed = localState.profile?.last_used ?? "";
41
+ return Object.entries(infoCache).map(([dir, info]) => ({
42
+ dir,
43
+ name: info.name ?? dir,
44
+ email: info.user_name ?? "",
45
+ isLastUsed: dir === lastUsed,
46
+ }));
47
+ }
48
+ function sanitizeDirSegment(value) {
49
+ const sanitized = value.replace(/[^a-zA-Z0-9._-]+/g, "-");
50
+ let start = 0;
51
+ let end = sanitized.length;
52
+ while (start < end && sanitized[start] === "-")
53
+ start++;
54
+ while (end > start && sanitized[end - 1] === "-")
55
+ end--;
56
+ return sanitized.slice(start, end) || "default";
57
+ }
58
+ function getDedicatedChromeProfileDir(name) {
59
+ return join(homedir(), ".owletto", "chrome-profiles", sanitizeDirSegment(name));
60
+ }
61
+ async function waitForCdpEndpoint(baseUrl, retries = 15) {
62
+ for (let i = 0; i < retries; i++) {
63
+ const info = await fetchCdpVersionInfo(baseUrl);
64
+ if (info)
65
+ return info;
66
+ await new Promise((resolve) => setTimeout(resolve, 1000));
67
+ }
68
+ return null;
69
+ }
70
+ function launchDedicatedChrome(params) {
71
+ mkdirSync(params.userDataDir, { recursive: true });
72
+ const args = [
73
+ `--user-data-dir=${params.userDataDir}`,
74
+ `--remote-debugging-port=${params.port}`,
75
+ "--remote-allow-origins=*",
76
+ "--no-first-run",
77
+ "--no-default-browser-check",
78
+ "--disable-background-networking",
79
+ "--disable-sync",
80
+ ];
81
+ if (params.startUrl) {
82
+ args.push(params.startUrl);
83
+ }
84
+ const chrome = spawn(params.chromeBinary, args, {
85
+ detached: true,
86
+ stdio: "ignore",
87
+ });
88
+ chrome.unref();
89
+ }
90
+ async function extractCookies(chromeBinary, profileDir, chromeProfileDir, domains) {
91
+ if (process.platform === "darwin") {
92
+ return extractCookiesMacOS(profileDir, chromeProfileDir, domains);
93
+ }
94
+ return extractCookiesCDP(chromeBinary, profileDir, chromeProfileDir, domains);
95
+ }
96
+ /** Browser brands and their Keychain entries */
97
+ const BROWSER_KEYCHAIN = [
98
+ { service: "Chrome Safe Storage", account: "Chrome" },
99
+ { service: "Chromium Safe Storage", account: "Chromium" },
100
+ { service: "Brave Safe Storage", account: "Brave" },
101
+ { service: "Microsoft Edge Safe Storage", account: "Microsoft Edge" },
102
+ ];
103
+ /**
104
+ * macOS: Decrypt Chrome cookies directly from the SQLite store using the
105
+ * Keychain encryption key. This avoids launching a separate Chrome process
106
+ * which can't decrypt cookies from a copied profile.
107
+ */
108
+ async function extractCookiesMacOS(profileDir, chromeProfileDir, domains) {
109
+ const { pbkdf2Sync, createDecipheriv } = await import("node:crypto");
110
+ const { DatabaseSync } = await import("node:sqlite");
111
+ const cookiePath = join(profileDir, chromeProfileDir, "Cookies");
112
+ if (!existsSync(cookiePath)) {
113
+ throw new Error(`No Cookies file found in Chrome profile: ${chromeProfileDir}`);
114
+ }
115
+ // Copy to temp file to avoid locking issues with running Chrome
116
+ const tmpDir = mkdtempSync(join(tmpdir(), "owletto-auth-"));
117
+ const tmpCookiePath = join(tmpDir, "Cookies");
118
+ copyFileSync(cookiePath, tmpCookiePath);
119
+ const journalSrc = join(profileDir, chromeProfileDir, "Cookies-journal");
120
+ if (existsSync(journalSrc)) {
121
+ copyFileSync(journalSrc, join(tmpDir, "Cookies-journal"));
122
+ }
123
+ try {
124
+ // Try each browser brand's Keychain entry
125
+ printText("macOS will ask to access your browser's cookie encryption key.\n" +
126
+ 'A system dialog from "security" will appear — click "Always Allow" to avoid future prompts.');
127
+ let keychainKey = null;
128
+ for (const { service, account } of BROWSER_KEYCHAIN) {
129
+ try {
130
+ keychainKey = execSync(`security find-generic-password -w -s "${service}" -a "${account}"`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
131
+ if (keychainKey)
132
+ break;
133
+ }
134
+ catch {
135
+ // Try next brand
136
+ }
137
+ }
138
+ if (!keychainKey) {
139
+ throw new Error("Could not read browser encryption key from macOS Keychain.\n" +
140
+ 'If a system dialog appeared, click "Always Allow" and retry.\n' +
141
+ "If no dialog appeared, your Keychain may be locked — run: security unlock-keychain");
142
+ }
143
+ const derivedKey = pbkdf2Sync(keychainKey, "saltysalt", 1003, 16, "sha1");
144
+ // Build domain filter for SQL
145
+ const domainClauses = domains
146
+ .map((d) => {
147
+ const clean = d.replace(/^\./, "");
148
+ return `host_key = '.${clean}' OR host_key = '${clean}' OR host_key LIKE '%.${clean}'`;
149
+ })
150
+ .join(" OR ");
151
+ const db = new DatabaseSync(tmpCookiePath, { readOnly: true });
152
+ const rows = db
153
+ .prepare(`SELECT name, host_key, path, encrypted_value, CAST(expires_utc AS TEXT) as expires_utc_text, is_httponly, is_secure, samesite
154
+ FROM cookies WHERE ${domainClauses}`)
155
+ .all();
156
+ db.close();
157
+ const cookies = [];
158
+ const chromeEpochOffset = 11644473600n;
159
+ const iv = Buffer.alloc(16, " ");
160
+ for (const row of rows) {
161
+ // node:sqlite returns BLOBs as Uint8Array, convert to Buffer for crypto ops
162
+ const raw = row.encrypted_value;
163
+ const encrypted = raw instanceof Buffer ? raw : Buffer.from(raw);
164
+ let value = "";
165
+ if (encrypted && encrypted.length > 3) {
166
+ const version = encrypted.slice(0, 3).toString("utf-8");
167
+ if (version === "v10" || version === "v11") {
168
+ const ciphertext = encrypted.slice(3);
169
+ try {
170
+ const decipher = createDecipheriv("aes-128-cbc", derivedKey, iv);
171
+ const dec = Buffer.concat([
172
+ decipher.update(ciphertext),
173
+ decipher.final(),
174
+ ]);
175
+ // Chrome prepends metadata bytes before the actual cookie value.
176
+ // Find the boundary: scan from the end for the longest valid printable suffix.
177
+ value = extractPrintableSuffix(dec);
178
+ }
179
+ catch {
180
+ continue;
181
+ }
182
+ }
183
+ else {
184
+ value = encrypted.toString("utf-8");
185
+ }
186
+ }
187
+ if (!value && !row.name)
188
+ continue;
189
+ // Chrome stores expiry as microseconds since 1601-01-01
190
+ const expiresUtc = BigInt(row.expires_utc_text ?? "0");
191
+ const expiresUnix = expiresUtc > 0n
192
+ ? Number(expiresUtc / 1000000n - chromeEpochOffset)
193
+ : -1;
194
+ cookies.push({
195
+ name: row.name,
196
+ value,
197
+ domain: row.host_key,
198
+ path: row.path ?? "/",
199
+ expires: expiresUnix,
200
+ httpOnly: row.is_httponly === 1,
201
+ secure: row.is_secure === 1,
202
+ sameSite: row.samesite === 0 ? "None" : row.samesite === 1 ? "Lax" : "Strict",
203
+ });
204
+ }
205
+ return cookies;
206
+ }
207
+ finally {
208
+ try {
209
+ rmSync(tmpDir, { recursive: true, force: true });
210
+ }
211
+ catch {
212
+ /* ignore */
213
+ }
214
+ }
215
+ }
216
+ /**
217
+ * Chrome prepends opaque metadata bytes to the plaintext before encrypting.
218
+ * Rather than hardcoding the prefix length (which varies by Chrome version),
219
+ * find the actual cookie value by scanning from the end for the longest run
220
+ * of printable ASCII + common cookie characters.
221
+ */
222
+ function extractPrintableSuffix(buf) {
223
+ // Cookie values are printable ASCII (0x20-0x7E). Metadata bytes are typically
224
+ // control chars or high bytes. Scan backwards to find where the value starts.
225
+ let boundary = buf.length;
226
+ for (let i = buf.length - 1; i >= 0; i--) {
227
+ const b = buf[i];
228
+ if (b >= 0x20 && b <= 0x7e) {
229
+ boundary = i;
230
+ }
231
+ else {
232
+ break;
233
+ }
234
+ }
235
+ return buf.slice(boundary).toString("utf-8");
236
+ }
237
+ /**
238
+ * Linux fallback: Launch headless Chrome with a copied cookie store
239
+ * and extract via CDP. Works on Linux where cookies aren't encrypted
240
+ * with a per-profile key.
241
+ */
242
+ async function extractCookiesCDP(chromeBinary, profileDir, chromeProfileDir, domains) {
243
+ const { chromium } = await import("playwright");
244
+ const port = await new Promise((resolve) => {
245
+ const srv = createServer();
246
+ srv.listen(0, () => {
247
+ const p = srv.address().port;
248
+ srv.close(() => resolve(p));
249
+ });
250
+ });
251
+ const tmpDir = mkdtempSync(join(tmpdir(), "owletto-auth-"));
252
+ mkdirSync(join(tmpDir, "Default"), { recursive: true });
253
+ const cookieSrc = join(profileDir, chromeProfileDir, "Cookies");
254
+ const journalSrc = join(profileDir, chromeProfileDir, "Cookies-journal");
255
+ if (!existsSync(cookieSrc)) {
256
+ rmSync(tmpDir, { recursive: true, force: true });
257
+ throw new Error(`No Cookies file found in Chrome profile: ${chromeProfileDir}`);
258
+ }
259
+ copyFileSync(cookieSrc, join(tmpDir, "Default/Cookies"));
260
+ if (existsSync(journalSrc)) {
261
+ copyFileSync(journalSrc, join(tmpDir, "Default/Cookies-journal"));
262
+ }
263
+ const chrome = spawn(chromeBinary, [
264
+ "--headless=new",
265
+ `--remote-debugging-port=${port}`,
266
+ "--remote-allow-origins=*",
267
+ `--user-data-dir=${tmpDir}`,
268
+ "--no-first-run",
269
+ "--no-default-browser-check",
270
+ "--disable-background-networking",
271
+ "--disable-sync",
272
+ "--profile-directory=Default",
273
+ ], { detached: true, stdio: "ignore" });
274
+ chrome.unref();
275
+ try {
276
+ for (let i = 0; i < 15; i++) {
277
+ try {
278
+ await new Promise((resolve, reject) => {
279
+ httpGet(`http://localhost:${port}/json/version`, (res) => {
280
+ res.on("data", () => {
281
+ /* drain */
282
+ });
283
+ res.on("end", () => resolve());
284
+ }).on("error", reject);
285
+ });
286
+ break;
287
+ }
288
+ catch {
289
+ await new Promise((r) => setTimeout(r, 1000));
290
+ }
291
+ }
292
+ const browser = await chromium.connectOverCDP(`http://localhost:${port}`);
293
+ const context = browser.contexts()[0];
294
+ const page = context.pages()[0] || (await context.newPage());
295
+ const primaryDomain = domains[0];
296
+ const url = primaryDomain.startsWith("http")
297
+ ? primaryDomain
298
+ : `https://${primaryDomain}`;
299
+ await page.goto(url, { waitUntil: "domcontentloaded", timeout: 15000 });
300
+ await page.waitForTimeout(2000);
301
+ const cookieUrls = domains.map((d) => d.startsWith("http") ? d : `https://${d}`);
302
+ const cookies = await context.cookies(cookieUrls);
303
+ await browser.close();
304
+ return cookies;
305
+ }
306
+ finally {
307
+ try {
308
+ process.kill(chrome.pid);
309
+ }
310
+ catch {
311
+ /* ignore */
312
+ }
313
+ await new Promise((r) => setTimeout(r, 500));
314
+ try {
315
+ rmSync(tmpDir, { recursive: true, force: true });
316
+ }
317
+ catch {
318
+ /* ignore */
319
+ }
320
+ }
321
+ }
322
+ function scoreAuthCookie(cookie) {
323
+ const name = cookie.name?.toLowerCase() ?? "";
324
+ if (!name)
325
+ return Number.NEGATIVE_INFINITY;
326
+ if (/^(lang|li_theme|timezone|theme|locale|tz|visitor_id|guest_id)$/.test(name)) {
327
+ return Number.NEGATIVE_INFINITY;
328
+ }
329
+ let score = 0;
330
+ if (/(auth|token|session|sess|sid|jwt)/.test(name))
331
+ score += 100;
332
+ if (/_at$/.test(name))
333
+ score += 80;
334
+ if (cookie.httpOnly)
335
+ score += 20;
336
+ if (cookie.secure)
337
+ score += 10;
338
+ if ((cookie.value?.length ?? 0) >= 20)
339
+ score += 5;
340
+ if ((cookie.expires ?? 0) > 0)
341
+ score += 5;
342
+ return score;
343
+ }
344
+ function findLikelyAuthCookie(cookies) {
345
+ const sorted = [...cookies].sort((a, b) => scoreAuthCookie(b) - scoreAuthCookie(a));
346
+ const best = sorted[0];
347
+ return best && scoreAuthCookie(best) > 0 ? best : null;
348
+ }
349
+ async function resolveConnectorDomains(connectorKey, domainsOverride, cliProfile) {
350
+ if (domainsOverride) {
351
+ return domainsOverride.split(",").map((d) => d.trim());
352
+ }
353
+ const { resolveMcpEndpoint, restToolCall } = await import("./mcp.js");
354
+ const mcpUrl = await resolveMcpEndpoint(cliProfile.config);
355
+ if (!mcpUrl) {
356
+ printText("No MCP URL configured. Use --domains to specify cookie domains manually.");
357
+ return null;
358
+ }
359
+ const parsed = await restToolCall(mcpUrl, "manage_connections", {
360
+ action: "list_connector_definitions",
361
+ });
362
+ const connectors = Array.isArray(parsed)
363
+ ? parsed
364
+ : (parsed?.connector_definitions ?? parsed?.connectors ?? []);
365
+ const connector = connectors.find((c) => c.key === connectorKey);
366
+ if (!connector) {
367
+ printText(`Unknown connector: ${connectorKey}`);
368
+ return null;
369
+ }
370
+ const faviconDomain = connector.favicon_domain;
371
+ if (!faviconDomain) {
372
+ printText(`Connector "${connectorKey}" has no favicon_domain. Use --domains to specify cookie domains manually.`);
373
+ return null;
374
+ }
375
+ return [faviconDomain, `.${faviconDomain}`];
376
+ }
377
+ export async function captureBrowserAuth(opts) {
378
+ const args = opts;
379
+ const cliProfile = emptyProfile;
380
+ const connectorKey = args.connector;
381
+ // --check: verify stored cookies on an auth profile
382
+ if (args.check) {
383
+ if (!args.authProfileSlug) {
384
+ printText("--check requires --auth-profile-slug");
385
+ process.exitCode = 1;
386
+ return;
387
+ }
388
+ const { resolveMcpEndpoint, restToolCall } = await import("./mcp.js");
389
+ const mcpUrl = await resolveMcpEndpoint(cliProfile.config);
390
+ if (!mcpUrl) {
391
+ printText("No MCP URL configured.");
392
+ process.exitCode = 1;
393
+ return;
394
+ }
395
+ let parsed;
396
+ try {
397
+ parsed = await restToolCall(mcpUrl, "manage_auth_profiles", {
398
+ action: "test_auth_profile",
399
+ auth_profile_slug: args.authProfileSlug,
400
+ });
401
+ }
402
+ catch (err) {
403
+ printText(`Error: ${err instanceof Error ? err.message : String(err)}`);
404
+ process.exitCode = 1;
405
+ return;
406
+ }
407
+ if (parsed?.error) {
408
+ printText(`Error: ${parsed.error}`);
409
+ process.exitCode = 1;
410
+ return;
411
+ }
412
+ if (parsed?.status === "ok") {
413
+ if (typeof parsed.cdp_url === "string" &&
414
+ parsed.cdp_url.trim().length > 0) {
415
+ const configuredCdpUrl = parsed.cdp_url.trim();
416
+ let cdpUrl = configuredCdpUrl;
417
+ let info = null;
418
+ try {
419
+ if (configuredCdpUrl.toLowerCase() === "auto") {
420
+ cdpUrl = await resolveCdpUrl("auto");
421
+ }
422
+ info = await fetchCdpVersionInfo(cdpUrl);
423
+ }
424
+ catch {
425
+ /* ignore */
426
+ }
427
+ if (!info) {
428
+ printText(`CDP configured at ${configuredCdpUrl}, but the endpoint is not responding.`);
429
+ process.exitCode = 1;
430
+ return;
431
+ }
432
+ printText(`CDP endpoint live at ${cdpUrl}.`);
433
+ if (info.Browser) {
434
+ printText(`Browser: ${info.Browser}`);
435
+ }
436
+ }
437
+ else {
438
+ const expiresAt = parsed.expires_at
439
+ ? new Date(parsed.expires_at)
440
+ : null;
441
+ const daysLeft = expiresAt
442
+ ? Math.floor((expiresAt.getTime() - Date.now()) / 86400000)
443
+ : null;
444
+ printText(`${parsed.auth_cookie_name || "Auth cookie"} valid${daysLeft !== null ? ` (expires in ${daysLeft} days)` : ""}.`);
445
+ if (typeof parsed.cookie_count === "number") {
446
+ printText(`${parsed.cookie_count} cookies stored.`);
447
+ }
448
+ }
449
+ }
450
+ else {
451
+ printText(parsed?.message || "Browser auth profile is not valid.");
452
+ process.exitCode = 1;
453
+ }
454
+ return;
455
+ }
456
+ const { binary, profileDir } = getChromePaths();
457
+ if (!existsSync(binary)) {
458
+ printText(`Chrome not found at ${binary}`);
459
+ process.exitCode = 1;
460
+ return;
461
+ }
462
+ if (args.launchCdp) {
463
+ const profileName = args.dedicatedProfile || connectorKey;
464
+ const userDataDir = getDedicatedChromeProfileDir(profileName);
465
+ const port = parseInt(args.remoteDebugPort || "9222", 10);
466
+ if (!Number.isFinite(port) || port <= 0) {
467
+ printText(`Invalid --remoteDebugPort: ${args.remoteDebugPort}`);
468
+ process.exitCode = 1;
469
+ return;
470
+ }
471
+ const domains = await resolveConnectorDomains(connectorKey, args.domains, cliProfile);
472
+ const startUrl = domains?.[0]
473
+ ? domains[0].startsWith("http")
474
+ ? domains[0]
475
+ : `https://${domains[0].replace(/^\./, "")}`
476
+ : undefined;
477
+ const cdpUrl = `http://127.0.0.1:${port}`;
478
+ printText(`Launching dedicated Chrome profile at ${userDataDir}`);
479
+ printText(`CDP URL: ${cdpUrl}`);
480
+ launchDedicatedChrome({
481
+ chromeBinary: binary,
482
+ userDataDir,
483
+ port,
484
+ startUrl,
485
+ });
486
+ const info = await waitForCdpEndpoint(cdpUrl);
487
+ if (!info) {
488
+ printText(`Chrome launched, but ${cdpUrl}/json/version did not become ready.`);
489
+ process.exitCode = 1;
490
+ return;
491
+ }
492
+ printText(`CDP endpoint ready at ${cdpUrl}`);
493
+ if (info.Browser) {
494
+ printText(`Browser: ${info.Browser}`);
495
+ }
496
+ if (args.authProfileSlug) {
497
+ const { resolveMcpEndpoint, restToolCall } = await import("./mcp.js");
498
+ const mcpUrl = await resolveMcpEndpoint(cliProfile.config);
499
+ if (!mcpUrl) {
500
+ printText("No MCP URL configured. Store the CDP URL on the auth profile manually.");
501
+ }
502
+ else {
503
+ try {
504
+ const parsed = await restToolCall(mcpUrl, "manage_auth_profiles", {
505
+ action: "update_auth_profile",
506
+ auth_profile_slug: args.authProfileSlug,
507
+ auth_data: {
508
+ cdp_url: cdpUrl,
509
+ captured_at: new Date().toISOString(),
510
+ captured_via: "cli",
511
+ browser_profile: profileName,
512
+ user_data_dir: userDataDir,
513
+ },
514
+ });
515
+ if (parsed?.error) {
516
+ printText(`Error: ${parsed.error}`);
517
+ process.exitCode = 1;
518
+ return;
519
+ }
520
+ printText(`CDP URL stored on auth profile ${args.authProfileSlug}.`);
521
+ }
522
+ catch (err) {
523
+ printText(`Error: ${err instanceof Error ? err.message : String(err)}`);
524
+ process.exitCode = 1;
525
+ return;
526
+ }
527
+ }
528
+ }
529
+ printText("\nNext steps:");
530
+ printText(" 1. Sign into the site in the dedicated Chrome window if needed.");
531
+ printText(` 2. Run: lobu memory browser-auth --connector ${connectorKey}${args.authProfileSlug ? ` --auth-profile-slug ${args.authProfileSlug}` : ""} --check`);
532
+ return;
533
+ }
534
+ const profiles = listProfiles(profileDir);
535
+ if (profiles.length === 0) {
536
+ printText("No Chrome profiles found");
537
+ process.exitCode = 1;
538
+ return;
539
+ }
540
+ let selectedProfile;
541
+ if (args.chromeProfile) {
542
+ const match = profiles.find((p) => p.name.toLowerCase() === args.chromeProfile.toLowerCase() ||
543
+ p.dir.toLowerCase() === args.chromeProfile.toLowerCase());
544
+ if (!match) {
545
+ printText(`Profile "${args.chromeProfile}" not found. Available:`);
546
+ for (const p of profiles) {
547
+ printText(` [${p.dir}] ${p.name} (${p.email})${p.isLastUsed ? " <- last used" : ""}`);
548
+ }
549
+ process.exitCode = 1;
550
+ return;
551
+ }
552
+ selectedProfile = match;
553
+ }
554
+ else {
555
+ printText("Chrome Profiles:");
556
+ for (let i = 0; i < profiles.length; i++) {
557
+ const p = profiles[i];
558
+ if (!p)
559
+ continue;
560
+ printText(` [${i + 1}] ${p.name} (${p.email})${p.isLastUsed ? " <- last used" : ""}`);
561
+ }
562
+ const readline = await import("node:readline");
563
+ const rl = readline.createInterface({
564
+ input: process.stdin,
565
+ output: process.stdout,
566
+ });
567
+ const answer = await new Promise((resolve) => {
568
+ rl.question("\nPick a profile: ", resolve);
569
+ });
570
+ rl.close();
571
+ const idx = parseInt(answer, 10) - 1;
572
+ if (Number.isNaN(idx) || idx < 0 || idx >= profiles.length) {
573
+ printText("Invalid selection");
574
+ process.exitCode = 1;
575
+ return;
576
+ }
577
+ selectedProfile = profiles[idx];
578
+ }
579
+ printText(`\nUsing profile: ${selectedProfile.name} (${selectedProfile.email})`);
580
+ printText("Resolving connector domains...");
581
+ const domains = await resolveConnectorDomains(connectorKey, args.domains, cliProfile);
582
+ if (!domains) {
583
+ process.exitCode = 1;
584
+ return;
585
+ }
586
+ printText(`Cookie domains: ${domains.join(", ")}`);
587
+ printText("Extracting cookies...");
588
+ const cookies = await extractCookies(binary, profileDir, selectedProfile.dir, domains);
589
+ if (cookies.length === 0) {
590
+ printText("No cookies found. Are you logged into the site in this Chrome profile?");
591
+ process.exitCode = 1;
592
+ return;
593
+ }
594
+ const authCookie = findLikelyAuthCookie(cookies);
595
+ if (!authCookie) {
596
+ printText("Warning: No likely auth cookie found. You may not be logged in.");
597
+ }
598
+ printText(`Captured ${cookies.length} cookies`);
599
+ if (args.authProfileSlug) {
600
+ printText("Saving cookies to auth profile...");
601
+ const { resolveMcpEndpoint, restToolCall } = await import("./mcp.js");
602
+ const mcpUrl = await resolveMcpEndpoint(cliProfile.config);
603
+ if (!mcpUrl) {
604
+ printText("No MCP URL configured. Store cookies manually.");
605
+ }
606
+ else {
607
+ try {
608
+ const parsed = await restToolCall(mcpUrl, "manage_auth_profiles", {
609
+ action: "update_auth_profile",
610
+ auth_profile_slug: args.authProfileSlug,
611
+ auth_data: {
612
+ cookies,
613
+ captured_at: new Date().toISOString(),
614
+ captured_via: "cli",
615
+ browser_profile: selectedProfile.name,
616
+ },
617
+ });
618
+ if (parsed?.error) {
619
+ printText(`Error: ${parsed.error}`);
620
+ }
621
+ else {
622
+ printText(`Cookies stored on auth profile ${args.authProfileSlug}.`);
623
+ }
624
+ }
625
+ catch (err) {
626
+ printText(`Error: ${err instanceof Error ? err.message : String(err)}`);
627
+ }
628
+ }
629
+ }
630
+ else {
631
+ printText("\nCookies ready. To store on a browser auth profile:");
632
+ printText(` lobu memory browser-auth --connector ${connectorKey} --auth-profile-slug <SLUG> --chrome-profile "${selectedProfile.name}"`);
633
+ }
634
+ }
635
+ //# sourceMappingURL=browser-auth-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-auth-cmd.js","sourceRoot":"","sources":["../../../../src/commands/memory/_lib/browser-auth-cmd.ts"],"names":[],"mappings":"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"}