linkedin-automation-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/.env.example +12 -0
  2. package/.github/workflows/ci.yml +66 -0
  3. package/.github/workflows/publish.yml +48 -0
  4. package/.husky/pre-commit +6 -0
  5. package/.prettierignore +4 -0
  6. package/.prettierrc +10 -0
  7. package/AGENTS.md +294 -0
  8. package/CHANGELOG.md +40 -0
  9. package/GIT_RELEASE.md +167 -0
  10. package/LICENSE +21 -0
  11. package/Makefile +30 -0
  12. package/NPM_PUBLISHING.md +230 -0
  13. package/PYEOF +0 -0
  14. package/README.md +295 -0
  15. package/TESTING-GUIDE.md +151 -0
  16. package/cmd/linkedin/main.go +9 -0
  17. package/dist/agent/action-executor.d.ts +81 -0
  18. package/dist/agent/action-executor.d.ts.map +1 -0
  19. package/dist/agent/action-executor.js +170 -0
  20. package/dist/agent/action-executor.js.map +1 -0
  21. package/dist/agent/action-executor.test.d.ts +2 -0
  22. package/dist/agent/action-executor.test.d.ts.map +1 -0
  23. package/dist/agent/action-executor.test.js +366 -0
  24. package/dist/agent/action-executor.test.js.map +1 -0
  25. package/dist/agent/claude-client.d.ts +74 -0
  26. package/dist/agent/claude-client.d.ts.map +1 -0
  27. package/dist/agent/claude-client.js +314 -0
  28. package/dist/agent/claude-client.js.map +1 -0
  29. package/dist/agent/claude-client.test.d.ts +2 -0
  30. package/dist/agent/claude-client.test.d.ts.map +1 -0
  31. package/dist/agent/claude-client.test.js +590 -0
  32. package/dist/agent/claude-client.test.js.map +1 -0
  33. package/dist/agent/dom-extractor.d.ts +50 -0
  34. package/dist/agent/dom-extractor.d.ts.map +1 -0
  35. package/dist/agent/dom-extractor.js +374 -0
  36. package/dist/agent/dom-extractor.js.map +1 -0
  37. package/dist/agent/dom-extractor.test.d.ts +7 -0
  38. package/dist/agent/dom-extractor.test.d.ts.map +1 -0
  39. package/dist/agent/dom-extractor.test.js +504 -0
  40. package/dist/agent/dom-extractor.test.js.map +1 -0
  41. package/dist/agent/extension-client.d.ts +75 -0
  42. package/dist/agent/extension-client.d.ts.map +1 -0
  43. package/dist/agent/extension-client.js +245 -0
  44. package/dist/agent/extension-client.js.map +1 -0
  45. package/dist/agent/index.d.ts +8 -0
  46. package/dist/agent/index.d.ts.map +1 -0
  47. package/dist/agent/index.js +16 -0
  48. package/dist/agent/index.js.map +1 -0
  49. package/dist/agent/page-agent.d.ts +76 -0
  50. package/dist/agent/page-agent.d.ts.map +1 -0
  51. package/dist/agent/page-agent.js +236 -0
  52. package/dist/agent/page-agent.js.map +1 -0
  53. package/dist/agent/types.d.ts +236 -0
  54. package/dist/agent/types.d.ts.map +1 -0
  55. package/dist/agent/types.js +37 -0
  56. package/dist/agent/types.js.map +1 -0
  57. package/dist/cli/agent-commands.d.ts +3 -0
  58. package/dist/cli/agent-commands.d.ts.map +1 -0
  59. package/dist/cli/agent-commands.js +250 -0
  60. package/dist/cli/agent-commands.js.map +1 -0
  61. package/dist/cli/auth.d.ts +3 -0
  62. package/dist/cli/auth.d.ts.map +1 -0
  63. package/dist/cli/auth.js +288 -0
  64. package/dist/cli/auth.js.map +1 -0
  65. package/dist/cli/company.d.ts +3 -0
  66. package/dist/cli/company.d.ts.map +1 -0
  67. package/dist/cli/company.js +55 -0
  68. package/dist/cli/company.js.map +1 -0
  69. package/dist/cli/connection.d.ts +3 -0
  70. package/dist/cli/connection.d.ts.map +1 -0
  71. package/dist/cli/connection.js +79 -0
  72. package/dist/cli/connection.js.map +1 -0
  73. package/dist/cli/index.d.ts +7 -0
  74. package/dist/cli/index.d.ts.map +1 -0
  75. package/dist/cli/index.js +17 -0
  76. package/dist/cli/index.js.map +1 -0
  77. package/dist/cli/messages.d.ts +3 -0
  78. package/dist/cli/messages.d.ts.map +1 -0
  79. package/dist/cli/messages.js +268 -0
  80. package/dist/cli/messages.js.map +1 -0
  81. package/dist/cli/profile.d.ts +3 -0
  82. package/dist/cli/profile.d.ts.map +1 -0
  83. package/dist/cli/profile.js +81 -0
  84. package/dist/cli/profile.js.map +1 -0
  85. package/dist/cli/profile.test.d.ts +2 -0
  86. package/dist/cli/profile.test.d.ts.map +1 -0
  87. package/dist/cli/profile.test.js +15 -0
  88. package/dist/cli/profile.test.js.map +1 -0
  89. package/dist/cli/reply.d.ts +3 -0
  90. package/dist/cli/reply.d.ts.map +1 -0
  91. package/dist/cli/reply.js +129 -0
  92. package/dist/cli/reply.js.map +1 -0
  93. package/dist/core/audit.d.ts +17 -0
  94. package/dist/core/audit.d.ts.map +1 -0
  95. package/dist/core/audit.js +121 -0
  96. package/dist/core/audit.js.map +1 -0
  97. package/dist/core/audit.test.d.ts +2 -0
  98. package/dist/core/audit.test.d.ts.map +1 -0
  99. package/dist/core/audit.test.js +142 -0
  100. package/dist/core/audit.test.js.map +1 -0
  101. package/dist/core/browser-cookies.d.ts +19 -0
  102. package/dist/core/browser-cookies.d.ts.map +1 -0
  103. package/dist/core/browser-cookies.js +181 -0
  104. package/dist/core/browser-cookies.js.map +1 -0
  105. package/dist/core/browser.d.ts +50 -0
  106. package/dist/core/browser.d.ts.map +1 -0
  107. package/dist/core/browser.js +318 -0
  108. package/dist/core/browser.js.map +1 -0
  109. package/dist/core/config.d.ts +20 -0
  110. package/dist/core/config.d.ts.map +1 -0
  111. package/dist/core/config.js +103 -0
  112. package/dist/core/config.js.map +1 -0
  113. package/dist/core/config.test.d.ts +2 -0
  114. package/dist/core/config.test.d.ts.map +1 -0
  115. package/dist/core/config.test.js +111 -0
  116. package/dist/core/config.test.js.map +1 -0
  117. package/dist/core/storage.d.ts +19 -0
  118. package/dist/core/storage.d.ts.map +1 -0
  119. package/dist/core/storage.js +124 -0
  120. package/dist/core/storage.js.map +1 -0
  121. package/dist/core/storage.test.d.ts +2 -0
  122. package/dist/core/storage.test.d.ts.map +1 -0
  123. package/dist/core/storage.test.js +142 -0
  124. package/dist/core/storage.test.js.map +1 -0
  125. package/dist/index.d.ts +3 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +63 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/linkedin/auth.d.ts +22 -0
  130. package/dist/linkedin/auth.d.ts.map +1 -0
  131. package/dist/linkedin/auth.js +167 -0
  132. package/dist/linkedin/auth.js.map +1 -0
  133. package/dist/linkedin/company-extractor.d.ts +36 -0
  134. package/dist/linkedin/company-extractor.d.ts.map +1 -0
  135. package/dist/linkedin/company-extractor.js +211 -0
  136. package/dist/linkedin/company-extractor.js.map +1 -0
  137. package/dist/linkedin/company-extractor.test.d.ts +2 -0
  138. package/dist/linkedin/company-extractor.test.d.ts.map +1 -0
  139. package/dist/linkedin/company-extractor.test.js +52 -0
  140. package/dist/linkedin/company-extractor.test.js.map +1 -0
  141. package/dist/linkedin/connector.d.ts +45 -0
  142. package/dist/linkedin/connector.d.ts.map +1 -0
  143. package/dist/linkedin/connector.js +245 -0
  144. package/dist/linkedin/connector.js.map +1 -0
  145. package/dist/linkedin/message-sender.d.ts +32 -0
  146. package/dist/linkedin/message-sender.d.ts.map +1 -0
  147. package/dist/linkedin/message-sender.js +112 -0
  148. package/dist/linkedin/message-sender.js.map +1 -0
  149. package/dist/linkedin/messages.d.ts +78 -0
  150. package/dist/linkedin/messages.d.ts.map +1 -0
  151. package/dist/linkedin/messages.js +745 -0
  152. package/dist/linkedin/messages.js.map +1 -0
  153. package/dist/linkedin/profile.d.ts +37 -0
  154. package/dist/linkedin/profile.d.ts.map +1 -0
  155. package/dist/linkedin/profile.js +268 -0
  156. package/dist/linkedin/profile.js.map +1 -0
  157. package/dist/linkedin/profile.test.d.ts +2 -0
  158. package/dist/linkedin/profile.test.d.ts.map +1 -0
  159. package/dist/linkedin/profile.test.js +68 -0
  160. package/dist/linkedin/profile.test.js.map +1 -0
  161. package/dist/linkedin/reply.d.ts +21 -0
  162. package/dist/linkedin/reply.d.ts.map +1 -0
  163. package/dist/linkedin/reply.js +76 -0
  164. package/dist/linkedin/reply.js.map +1 -0
  165. package/dist/linkedin/selector-engine.d.ts +69 -0
  166. package/dist/linkedin/selector-engine.d.ts.map +1 -0
  167. package/dist/linkedin/selector-engine.js +339 -0
  168. package/dist/linkedin/selector-engine.js.map +1 -0
  169. package/dist/linkedin/selector-engine.test.d.ts +2 -0
  170. package/dist/linkedin/selector-engine.test.d.ts.map +1 -0
  171. package/dist/linkedin/selector-engine.test.js +135 -0
  172. package/dist/linkedin/selector-engine.test.js.map +1 -0
  173. package/dist/linkedin/selectors.d.ts +65 -0
  174. package/dist/linkedin/selectors.d.ts.map +1 -0
  175. package/dist/linkedin/selectors.js +261 -0
  176. package/dist/linkedin/selectors.js.map +1 -0
  177. package/dist/templates/engine.d.ts +37 -0
  178. package/dist/templates/engine.d.ts.map +1 -0
  179. package/dist/templates/engine.js +215 -0
  180. package/dist/templates/engine.js.map +1 -0
  181. package/dist/templates/engine.test.d.ts +2 -0
  182. package/dist/templates/engine.test.d.ts.map +1 -0
  183. package/dist/templates/engine.test.js +212 -0
  184. package/dist/templates/engine.test.js.map +1 -0
  185. package/dist/templates/index.d.ts +2 -0
  186. package/dist/templates/index.d.ts.map +1 -0
  187. package/dist/templates/index.js +7 -0
  188. package/dist/templates/index.js.map +1 -0
  189. package/dist/types/index.d.ts +113 -0
  190. package/dist/types/index.d.ts.map +1 -0
  191. package/dist/types/index.js +3 -0
  192. package/dist/types/index.js.map +1 -0
  193. package/dist/types/index.test.d.ts +2 -0
  194. package/dist/types/index.test.d.ts.map +1 -0
  195. package/dist/types/index.test.js +90 -0
  196. package/dist/types/index.test.js.map +1 -0
  197. package/dist/utils/paths.d.ts +8 -0
  198. package/dist/utils/paths.d.ts.map +1 -0
  199. package/dist/utils/paths.js +68 -0
  200. package/dist/utils/paths.js.map +1 -0
  201. package/dist/utils/rate-limiter.d.ts +22 -0
  202. package/dist/utils/rate-limiter.d.ts.map +1 -0
  203. package/dist/utils/rate-limiter.js +57 -0
  204. package/dist/utils/rate-limiter.js.map +1 -0
  205. package/dist/utils/retry.d.ts +18 -0
  206. package/dist/utils/retry.d.ts.map +1 -0
  207. package/dist/utils/retry.js +49 -0
  208. package/dist/utils/retry.js.map +1 -0
  209. package/docs/connection-command.md +52 -0
  210. package/docs/plans/2025-03-03-linkedin-cli-design.md +280 -0
  211. package/docs/plans/2025-03-03-linkedin-cli-implementation-plan.md +2087 -0
  212. package/docs/plans/2025-03-03-linkedin-cli-implementation.md +2420 -0
  213. package/docs/plans/2026-02-19-linkedin-connection-feature.md +596 -0
  214. package/docs/plans/2026-02-28-messages-send-feature.md +480 -0
  215. package/docs/plans/2026-02-28-messages-show-design.md +243 -0
  216. package/docs/plans/2026-03-03-linkedin-cli-oss-publishing-design.md +394 -0
  217. package/docs/plans/2026-03-03-linkedin-cli-oss-publishing-plan.md +1592 -0
  218. package/docs/superpowers/plans/2026-03-13-linkedin-automation-resilience-migration.md +425 -0
  219. package/docs/superpowers/plans/2026-03-13-playwright-fara-migration.md +1112 -0
  220. package/docs/superpowers/plans/2026-03-14-page-agent-plan.md +1598 -0
  221. package/docs/superpowers/plans/2026-03-15-company-profile-extraction.md +591 -0
  222. package/docs/superpowers/plans/2026-03-15-profile-extraction-plan.md +943 -0
  223. package/docs/superpowers/specs/2026-03-14-company-profile-extraction-design.md +371 -0
  224. package/docs/superpowers/specs/2026-03-14-page-agent-design.md +385 -0
  225. package/docs/superpowers/specs/2026-03-15-profile-extraction-design.md +409 -0
  226. package/eslint.config.mjs +58 -0
  227. package/go.mod +9 -0
  228. package/go.sum +10 -0
  229. package/import-cookies.js +376 -0
  230. package/internal/cmd/actions.go +123 -0
  231. package/internal/cmd/auth.go +108 -0
  232. package/internal/cmd/connect.go +42 -0
  233. package/internal/cmd/message.go +44 -0
  234. package/internal/cmd/people.go +454 -0
  235. package/internal/cmd/profiles.go +121 -0
  236. package/internal/cmd/root.go +89 -0
  237. package/internal/cmd/sequence.go +192 -0
  238. package/internal/config/config.go +187 -0
  239. package/internal/config/config_test.go +121 -0
  240. package/internal/config/profile.go +65 -0
  241. package/internal/linkedin/navigator.go +195 -0
  242. package/internal/linkedin/selectors.go +39 -0
  243. package/internal/linkedin/validator.go +69 -0
  244. package/internal/pinchtab/client.go +183 -0
  245. package/internal/pinchtab/client_test.go +67 -0
  246. package/internal/pinchtab/types.go +50 -0
  247. package/internal/ratelimit/limiter.go +115 -0
  248. package/internal/ratelimit/limits.go +32 -0
  249. package/package.json +67 -0
  250. package/release.sh +66 -0
  251. package/scripts/debug-linkedin.js +156 -0
  252. package/scripts/debug-login.js +193 -0
  253. package/scripts/extract-from-edge.js +96 -0
  254. package/scripts/import-cookies.js +101 -0
  255. package/scripts/poc-show-data.js +205 -0
  256. package/scripts/proof-of-access.js +87 -0
  257. package/scripts/prove-connection.js +110 -0
  258. package/scripts/show-linkedin-data.js +173 -0
  259. package/src/agent/action-executor.test.ts +464 -0
  260. package/src/agent/action-executor.ts +203 -0
  261. package/src/agent/claude-client.test.ts +707 -0
  262. package/src/agent/claude-client.ts +422 -0
  263. package/src/agent/dom-extractor.test.ts +574 -0
  264. package/src/agent/dom-extractor.ts +437 -0
  265. package/src/agent/extension-client.ts +306 -0
  266. package/src/agent/index.ts +28 -0
  267. package/src/agent/page-agent.ts +292 -0
  268. package/src/agent/types.ts +288 -0
  269. package/src/cli/agent-commands.ts +274 -0
  270. package/src/cli/auth.ts +343 -0
  271. package/src/cli/company.ts +66 -0
  272. package/src/cli/connection.ts +89 -0
  273. package/src/cli/index.ts +7 -0
  274. package/src/cli/messages.ts +338 -0
  275. package/src/cli/profile.test.ts +14 -0
  276. package/src/cli/profile.ts +95 -0
  277. package/src/cli/reply.ts +110 -0
  278. package/src/core/audit.test.ts +134 -0
  279. package/src/core/audit.ts +98 -0
  280. package/src/core/browser-cookies.ts +203 -0
  281. package/src/core/browser.ts +304 -0
  282. package/src/core/config.test.ts +90 -0
  283. package/src/core/config.ts +81 -0
  284. package/src/core/storage.test.ts +129 -0
  285. package/src/core/storage.ts +100 -0
  286. package/src/index.ts +70 -0
  287. package/src/linkedin/auth.ts +218 -0
  288. package/src/linkedin/company-extractor.test.ts +58 -0
  289. package/src/linkedin/company-extractor.ts +222 -0
  290. package/src/linkedin/connector.ts +336 -0
  291. package/src/linkedin/message-sender.ts +141 -0
  292. package/src/linkedin/messages.ts +894 -0
  293. package/src/linkedin/profile.test.ts +79 -0
  294. package/src/linkedin/profile.ts +314 -0
  295. package/src/linkedin/reply.ts +96 -0
  296. package/src/linkedin/selector-engine.test.ts +167 -0
  297. package/src/linkedin/selector-engine.ts +393 -0
  298. package/src/linkedin/selectors.ts +268 -0
  299. package/src/templates/defaults/followup.txt +14 -0
  300. package/src/templates/defaults/meeting.txt +16 -0
  301. package/src/templates/defaults/welcome.txt +14 -0
  302. package/src/templates/engine.test.ts +228 -0
  303. package/src/templates/engine.ts +208 -0
  304. package/src/templates/index.ts +1 -0
  305. package/src/types/index.test.ts +94 -0
  306. package/src/types/index.ts +143 -0
  307. package/src/types/sql.js.d.ts +23 -0
  308. package/src/utils/paths.ts +33 -0
  309. package/src/utils/rate-limiter.ts +75 -0
  310. package/src/utils/retry.ts +78 -0
  311. package/test-cli.sh +85 -0
  312. package/test-real-data.sh +97 -0
  313. package/tsconfig.json +23 -0
  314. package/vitest.config.ts +35 -0
@@ -0,0 +1,590 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const claude_client_1 = require("./claude-client");
5
+ (0, vitest_1.describe)('ClaudeClient', () => {
6
+ let client;
7
+ const mockFetch = vitest_1.vi.fn();
8
+ const validConfig = {
9
+ apiKey: 'test-api-key',
10
+ model: 'qwen3.5-plus',
11
+ baseUrl: 'https://coding.dashscope.aliyuncs.com/apps/anthropic/v1',
12
+ };
13
+ const mockDOM = {
14
+ url: 'https://linkedin.com/in/test-user',
15
+ title: 'Test User - LinkedIn',
16
+ elements: [
17
+ {
18
+ id: 'btn-1',
19
+ tag: 'button',
20
+ role: 'button',
21
+ ariaLabel: 'Connect',
22
+ text: 'Connect',
23
+ visible: true,
24
+ enabled: true,
25
+ bbox: { x: 100, y: 200, width: 120, height: 40 },
26
+ },
27
+ ],
28
+ metadata: {
29
+ pageType: 'profile',
30
+ profileName: 'Test User',
31
+ connectionState: 'not_connected',
32
+ },
33
+ };
34
+ const mockContext = {
35
+ previousActions: [],
36
+ goal: 'Send a connection request to Test User',
37
+ retryCount: 0,
38
+ };
39
+ const createMockResponse = (actionPlan) => {
40
+ return {
41
+ id: 'msg-123',
42
+ type: 'message',
43
+ role: 'assistant',
44
+ content: [
45
+ {
46
+ type: 'text',
47
+ text: JSON.stringify({
48
+ reasoning: actionPlan.reasoning || 'Test reasoning',
49
+ expectedOutcome: actionPlan.expectedOutcome || 'Test outcome',
50
+ actions: actionPlan.actions || [],
51
+ status: actionPlan.status || 'pending',
52
+ }),
53
+ },
54
+ ],
55
+ model: 'qwen3.5-plus',
56
+ stop_reason: 'end_turn',
57
+ stop_sequence: null,
58
+ usage: {
59
+ input_tokens: 100,
60
+ output_tokens: 50,
61
+ },
62
+ };
63
+ };
64
+ (0, vitest_1.beforeEach)(() => {
65
+ mockFetch.mockClear();
66
+ globalThis.fetch = mockFetch;
67
+ client = new claude_client_1.ClaudeClient(validConfig);
68
+ });
69
+ (0, vitest_1.afterEach)(() => {
70
+ vitest_1.vi.restoreAllMocks();
71
+ });
72
+ (0, vitest_1.describe)('constructor', () => {
73
+ (0, vitest_1.it)('should create a client with valid config', () => {
74
+ const client = new claude_client_1.ClaudeClient(validConfig);
75
+ (0, vitest_1.expect)(client).toBeInstanceOf(claude_client_1.ClaudeClient);
76
+ });
77
+ (0, vitest_1.it)('should use default baseUrl when not provided', () => {
78
+ const client = new claude_client_1.ClaudeClient({
79
+ apiKey: 'test-key',
80
+ model: 'qwen3.5-plus',
81
+ });
82
+ (0, vitest_1.expect)(client).toBeInstanceOf(claude_client_1.ClaudeClient);
83
+ });
84
+ (0, vitest_1.it)('should use default model when not provided', async () => {
85
+ const client = new claude_client_1.ClaudeClient({
86
+ apiKey: 'test-key',
87
+ baseUrl: 'https://custom.api.com',
88
+ model: 'qwen3.5-plus',
89
+ });
90
+ mockFetch.mockResolvedValueOnce({
91
+ ok: true,
92
+ status: 200,
93
+ statusText: 'OK',
94
+ json: async () => createMockResponse({
95
+ actions: [{ type: 'click', elementId: 'btn-1', description: 'Click' }],
96
+ }),
97
+ });
98
+ await client.generateActionPlan(mockDOM, mockContext);
99
+ const body = JSON.parse(mockFetch.mock.calls[0][1].body);
100
+ (0, vitest_1.expect)(body.model).toBe('qwen3.5-plus');
101
+ });
102
+ });
103
+ (0, vitest_1.describe)('generateActionPlan', () => {
104
+ (0, vitest_1.it)('should send correct API request', async () => {
105
+ const mockResponse = createMockResponse({
106
+ actions: [{ type: 'click', elementId: 'btn-1', description: 'Click connect' }],
107
+ });
108
+ mockFetch.mockResolvedValueOnce({
109
+ ok: true,
110
+ status: 200,
111
+ statusText: 'OK',
112
+ json: async () => mockResponse,
113
+ });
114
+ await client.generateActionPlan(mockDOM, mockContext);
115
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledTimes(1);
116
+ const [url, options] = mockFetch.mock.calls[0];
117
+ (0, vitest_1.expect)(url).toBe(`${validConfig.baseUrl}/messages`);
118
+ (0, vitest_1.expect)(options.method).toBe('POST');
119
+ (0, vitest_1.expect)(options.headers).toEqual({
120
+ 'Content-Type': 'application/json',
121
+ Authorization: 'Bearer test-api-key',
122
+ });
123
+ const body = JSON.parse(options.body);
124
+ (0, vitest_1.expect)(body.model).toBe('qwen3.5-plus');
125
+ (0, vitest_1.expect)(body.max_tokens).toBe(4096);
126
+ (0, vitest_1.expect)(body.messages).toHaveLength(2);
127
+ (0, vitest_1.expect)(body.messages[0].role).toBe('system');
128
+ (0, vitest_1.expect)(body.messages[1].role).toBe('user');
129
+ });
130
+ (0, vitest_1.it)('should parse successful response into ActionPlan', async () => {
131
+ const mockResponse = createMockResponse({
132
+ reasoning: 'Need to click connect button',
133
+ expectedOutcome: 'Connection request modal opens',
134
+ actions: [{ type: 'click', elementId: 'btn-1', description: 'Click connect button' }],
135
+ status: 'pending',
136
+ });
137
+ mockFetch.mockResolvedValueOnce({
138
+ ok: true,
139
+ status: 200,
140
+ statusText: 'OK',
141
+ json: async () => mockResponse,
142
+ });
143
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
144
+ (0, vitest_1.expect)(plan.reasoning).toBe('Need to click connect button');
145
+ (0, vitest_1.expect)(plan.expectedOutcome).toBe('Connection request modal opens');
146
+ (0, vitest_1.expect)(plan.actions).toHaveLength(1);
147
+ (0, vitest_1.expect)(plan.actions[0].type).toBe('click');
148
+ (0, vitest_1.expect)(plan.status).toBe('pending');
149
+ });
150
+ (0, vitest_1.it)('should include goal and DOM in user message', async () => {
151
+ const mockResponse = createMockResponse({});
152
+ mockFetch.mockResolvedValueOnce({
153
+ ok: true,
154
+ status: 200,
155
+ statusText: 'OK',
156
+ json: async () => mockResponse,
157
+ });
158
+ await client.generateActionPlan(mockDOM, mockContext);
159
+ const body = JSON.parse(mockFetch.mock.calls[0][1].body);
160
+ const userMessage = body.messages[1].content;
161
+ (0, vitest_1.expect)(userMessage).toContain(`Goal: ${mockContext.goal}`);
162
+ (0, vitest_1.expect)(userMessage).toContain('Current page DOM:');
163
+ (0, vitest_1.expect)(userMessage).toContain(JSON.stringify(mockDOM, null, 2));
164
+ });
165
+ (0, vitest_1.it)('should include previous actions in user message', async () => {
166
+ const contextWithHistory = {
167
+ ...mockContext,
168
+ previousActions: [
169
+ {
170
+ action: {
171
+ type: 'navigate',
172
+ url: 'https://linkedin.com/in/test-user',
173
+ description: 'Navigate to profile',
174
+ },
175
+ success: true,
176
+ timestamp: new Date(),
177
+ },
178
+ {
179
+ action: {
180
+ type: 'click',
181
+ elementId: 'btn-1',
182
+ description: 'Click connect',
183
+ },
184
+ success: false,
185
+ timestamp: new Date(),
186
+ error: 'Element not found',
187
+ },
188
+ ],
189
+ };
190
+ const mockResponse = createMockResponse({});
191
+ mockFetch.mockResolvedValueOnce({
192
+ ok: true,
193
+ status: 200,
194
+ statusText: 'OK',
195
+ json: async () => mockResponse,
196
+ });
197
+ await client.generateActionPlan(mockDOM, contextWithHistory);
198
+ const body = JSON.parse(mockFetch.mock.calls[0][1].body);
199
+ const userMessage = body.messages[1].content;
200
+ (0, vitest_1.expect)(userMessage).toContain('Previous actions taken:');
201
+ (0, vitest_1.expect)(userMessage).toContain('navigate');
202
+ (0, vitest_1.expect)(userMessage).toContain('click');
203
+ (0, vitest_1.expect)(userMessage).toContain('Element not found');
204
+ });
205
+ (0, vitest_1.it)('should handle multiple actions in response', async () => {
206
+ const mockResponse = createMockResponse({
207
+ actions: [
208
+ { type: 'click', elementId: 'btn-1', description: 'Click connect' },
209
+ { type: 'wait', durationMs: 1000, description: 'Wait for modal' },
210
+ { type: 'type', elementId: 'input-1', text: 'Hello', description: 'Type note' },
211
+ ],
212
+ });
213
+ mockFetch.mockResolvedValueOnce({
214
+ ok: true,
215
+ status: 200,
216
+ statusText: 'OK',
217
+ json: async () => mockResponse,
218
+ });
219
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
220
+ (0, vitest_1.expect)(plan.actions).toHaveLength(3);
221
+ (0, vitest_1.expect)(plan.actions[0].type).toBe('click');
222
+ (0, vitest_1.expect)(plan.actions[1].type).toBe('wait');
223
+ (0, vitest_1.expect)(plan.actions[2].type).toBe('type');
224
+ });
225
+ });
226
+ (0, vitest_1.describe)('error handling', () => {
227
+ (0, vitest_1.it)('should throw ClaudeAPIError on network failure', async () => {
228
+ mockFetch.mockRejectedValue(new Error('Network error'));
229
+ await (0, vitest_1.expect)(client.generateActionPlan(mockDOM, mockContext)).rejects.toThrow(claude_client_1.ClaudeAPIError);
230
+ await (0, vitest_1.expect)(client.generateActionPlan(mockDOM, mockContext)).rejects.toThrow('Failed to connect to Claude API');
231
+ });
232
+ (0, vitest_1.it)('should throw ClaudeAPIError on HTTP error status', async () => {
233
+ mockFetch.mockResolvedValue({
234
+ ok: false,
235
+ status: 401,
236
+ statusText: 'Unauthorized',
237
+ text: async () => JSON.stringify({ error: 'Invalid API key' }),
238
+ });
239
+ await (0, vitest_1.expect)(client.generateActionPlan(mockDOM, mockContext)).rejects.toThrow(claude_client_1.ClaudeAPIError);
240
+ await (0, vitest_1.expect)(client.generateActionPlan(mockDOM, mockContext)).rejects.toThrow('401');
241
+ });
242
+ (0, vitest_1.it)('should return error plan when response has no text content', async () => {
243
+ mockFetch.mockResolvedValueOnce({
244
+ ok: true,
245
+ status: 200,
246
+ statusText: 'OK',
247
+ json: async () => ({
248
+ id: 'msg-123',
249
+ type: 'message',
250
+ role: 'assistant',
251
+ content: [
252
+ { type: 'image', source: { type: 'base64', media_type: 'image/png', data: '' } },
253
+ ],
254
+ model: 'qwen3.5-plus',
255
+ stop_reason: 'end_turn',
256
+ stop_sequence: null,
257
+ usage: { input_tokens: 100, output_tokens: 50 },
258
+ }),
259
+ });
260
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
261
+ (0, vitest_1.expect)(plan.status).toBe('failed');
262
+ (0, vitest_1.expect)(plan.error).toContain('No text content');
263
+ });
264
+ (0, vitest_1.it)('should return error plan when JSON cannot be extracted', async () => {
265
+ mockFetch.mockResolvedValueOnce({
266
+ ok: true,
267
+ status: 200,
268
+ statusText: 'OK',
269
+ json: async () => ({
270
+ id: 'msg-123',
271
+ type: 'message',
272
+ role: 'assistant',
273
+ content: [{ type: 'text', text: 'Plain text without JSON' }],
274
+ model: 'qwen3.5-plus',
275
+ stop_reason: 'end_turn',
276
+ stop_sequence: null,
277
+ usage: { input_tokens: 100, output_tokens: 50 },
278
+ }),
279
+ });
280
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
281
+ (0, vitest_1.expect)(plan.status).toBe('failed');
282
+ (0, vitest_1.expect)(plan.error).toContain('Could not extract JSON');
283
+ });
284
+ (0, vitest_1.it)('should return error plan when JSON is malformed', async () => {
285
+ mockFetch.mockResolvedValueOnce({
286
+ ok: true,
287
+ status: 200,
288
+ statusText: 'OK',
289
+ json: async () => ({
290
+ id: 'msg-123',
291
+ type: 'message',
292
+ role: 'assistant',
293
+ content: [{ type: 'text', text: '{"invalid json' }],
294
+ model: 'qwen3.5-plus',
295
+ stop_reason: 'end_turn',
296
+ stop_sequence: null,
297
+ usage: { input_tokens: 100, output_tokens: 50 },
298
+ }),
299
+ });
300
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
301
+ (0, vitest_1.expect)(plan.status).toBe('failed');
302
+ (0, vitest_1.expect)(plan.error).toContain('Failed to parse');
303
+ });
304
+ (0, vitest_1.it)('should return error plan when response JSON is invalid', async () => {
305
+ mockFetch.mockResolvedValueOnce({
306
+ ok: true,
307
+ status: 200,
308
+ statusText: 'OK',
309
+ json: async () => ({
310
+ id: 'msg-123',
311
+ type: 'message',
312
+ role: 'assistant',
313
+ content: [{ type: 'text', text: '{"not_a_valid_plan": true}' }],
314
+ model: 'qwen3.5-plus',
315
+ stop_reason: 'end_turn',
316
+ stop_sequence: null,
317
+ usage: { input_tokens: 100, output_tokens: 50 },
318
+ }),
319
+ });
320
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
321
+ (0, vitest_1.expect)(plan.status).toBe('pending');
322
+ (0, vitest_1.expect)(plan.actions).toEqual([]);
323
+ (0, vitest_1.expect)(plan.reasoning).toBe('No reasoning provided');
324
+ });
325
+ });
326
+ (0, vitest_1.describe)('JSON extraction', () => {
327
+ (0, vitest_1.it)('should extract JSON from markdown code blocks', async () => {
328
+ const actionPlan = {
329
+ reasoning: 'Test',
330
+ expectedOutcome: 'Test outcome',
331
+ actions: [{ type: 'click', elementId: 'btn-1', description: 'Click' }],
332
+ };
333
+ mockFetch.mockResolvedValueOnce({
334
+ ok: true,
335
+ status: 200,
336
+ statusText: 'OK',
337
+ json: async () => ({
338
+ id: 'msg-123',
339
+ type: 'message',
340
+ role: 'assistant',
341
+ content: [{ type: 'text', text: `\`\`\`json\n${JSON.stringify(actionPlan)}\n\`\`\`` }],
342
+ model: 'qwen3.5-plus',
343
+ stop_reason: 'end_turn',
344
+ stop_sequence: null,
345
+ usage: { input_tokens: 100, output_tokens: 50 },
346
+ }),
347
+ });
348
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
349
+ (0, vitest_1.expect)(plan.reasoning).toBe('Test');
350
+ (0, vitest_1.expect)(plan.actions).toHaveLength(1);
351
+ });
352
+ (0, vitest_1.it)('should extract JSON without language specifier', async () => {
353
+ const actionPlan = {
354
+ reasoning: 'Test',
355
+ expectedOutcome: 'Test outcome',
356
+ actions: [{ type: 'click', elementId: 'btn-1', description: 'Click' }],
357
+ };
358
+ mockFetch.mockResolvedValueOnce({
359
+ ok: true,
360
+ status: 200,
361
+ statusText: 'OK',
362
+ json: async () => ({
363
+ id: 'msg-123',
364
+ type: 'message',
365
+ role: 'assistant',
366
+ content: [{ type: 'text', text: `\`\`\`\n${JSON.stringify(actionPlan)}\n\`\`\`` }],
367
+ model: 'qwen3.5-plus',
368
+ stop_reason: 'end_turn',
369
+ stop_sequence: null,
370
+ usage: { input_tokens: 100, output_tokens: 50 },
371
+ }),
372
+ });
373
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
374
+ (0, vitest_1.expect)(plan.reasoning).toBe('Test');
375
+ });
376
+ (0, vitest_1.it)('should extract JSON from raw text starting with {', async () => {
377
+ const actionPlan = {
378
+ reasoning: 'Test',
379
+ expectedOutcome: 'Test outcome',
380
+ actions: [],
381
+ };
382
+ mockFetch.mockResolvedValueOnce({
383
+ ok: true,
384
+ status: 200,
385
+ statusText: 'OK',
386
+ json: async () => ({
387
+ id: 'msg-123',
388
+ type: 'message',
389
+ role: 'assistant',
390
+ content: [{ type: 'text', text: JSON.stringify(actionPlan) }],
391
+ model: 'qwen3.5-plus',
392
+ stop_reason: 'end_turn',
393
+ stop_sequence: null,
394
+ usage: { input_tokens: 100, output_tokens: 50 },
395
+ }),
396
+ });
397
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
398
+ (0, vitest_1.expect)(plan.reasoning).toBe('Test');
399
+ });
400
+ });
401
+ (0, vitest_1.describe)('action transformation', () => {
402
+ (0, vitest_1.it)('should transform click actions correctly', async () => {
403
+ const mockResponse = createMockResponse({
404
+ actions: [{ type: 'click', elementId: 'btn-1', description: 'Click button' }],
405
+ });
406
+ mockFetch.mockResolvedValueOnce({
407
+ ok: true,
408
+ status: 200,
409
+ statusText: 'OK',
410
+ json: async () => mockResponse,
411
+ });
412
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
413
+ (0, vitest_1.expect)(plan.actions[0]).toEqual({
414
+ type: 'click',
415
+ elementId: 'btn-1',
416
+ description: 'Click button',
417
+ });
418
+ });
419
+ (0, vitest_1.it)('should transform type actions correctly', async () => {
420
+ const mockResponse = createMockResponse({
421
+ actions: [
422
+ { type: 'type', elementId: 'input-1', text: 'Hello', description: 'Type greeting' },
423
+ ],
424
+ });
425
+ mockFetch.mockResolvedValueOnce({
426
+ ok: true,
427
+ status: 200,
428
+ statusText: 'OK',
429
+ json: async () => mockResponse,
430
+ });
431
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
432
+ (0, vitest_1.expect)(plan.actions[0]).toEqual({
433
+ type: 'type',
434
+ elementId: 'input-1',
435
+ text: 'Hello',
436
+ description: 'Type greeting',
437
+ });
438
+ });
439
+ (0, vitest_1.it)('should transform wait actions correctly', async () => {
440
+ const mockResponse = createMockResponse({
441
+ actions: [{ type: 'wait', durationMs: 2000, description: 'Wait for load' }],
442
+ });
443
+ mockFetch.mockResolvedValueOnce({
444
+ ok: true,
445
+ status: 200,
446
+ statusText: 'OK',
447
+ json: async () => mockResponse,
448
+ });
449
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
450
+ (0, vitest_1.expect)(plan.actions[0]).toEqual({
451
+ type: 'wait',
452
+ durationMs: 2000,
453
+ description: 'Wait for load',
454
+ });
455
+ });
456
+ (0, vitest_1.it)('should transform navigate actions correctly', async () => {
457
+ const mockResponse = createMockResponse({
458
+ actions: [{ type: 'navigate', url: 'https://linkedin.com', description: 'Go to home' }],
459
+ });
460
+ mockFetch.mockResolvedValueOnce({
461
+ ok: true,
462
+ status: 200,
463
+ statusText: 'OK',
464
+ json: async () => mockResponse,
465
+ });
466
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
467
+ (0, vitest_1.expect)(plan.actions[0]).toEqual({
468
+ type: 'navigate',
469
+ url: 'https://linkedin.com',
470
+ description: 'Go to home',
471
+ });
472
+ });
473
+ (0, vitest_1.it)('should use default duration for wait actions without durationMs', async () => {
474
+ const mockResponse = createMockResponse({
475
+ actions: [{ type: 'wait', description: 'Wait' }],
476
+ });
477
+ mockFetch.mockResolvedValueOnce({
478
+ ok: true,
479
+ status: 200,
480
+ statusText: 'OK',
481
+ json: async () => mockResponse,
482
+ });
483
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
484
+ (0, vitest_1.expect)(plan.actions[0]).toEqual({
485
+ type: 'wait',
486
+ durationMs: 1000,
487
+ description: 'Wait',
488
+ });
489
+ });
490
+ (0, vitest_1.it)('should skip actions with missing required fields', async () => {
491
+ const mockResponse = createMockResponse({
492
+ actions: [
493
+ { type: 'click', description: 'Missing elementId' },
494
+ { type: 'type', elementId: 'input-1', description: 'Missing text' },
495
+ { type: 'navigate', description: 'Missing url' },
496
+ { type: 'click', elementId: 'btn-1', description: 'Valid click' },
497
+ ],
498
+ });
499
+ mockFetch.mockResolvedValueOnce({
500
+ ok: true,
501
+ status: 200,
502
+ statusText: 'OK',
503
+ json: async () => mockResponse,
504
+ });
505
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
506
+ (0, vitest_1.expect)(plan.actions).toHaveLength(1);
507
+ (0, vitest_1.expect)(plan.actions[0].type).toBe('click');
508
+ (0, vitest_1.expect)(plan.actions[0].elementId).toBe('btn-1');
509
+ });
510
+ (0, vitest_1.it)('should skip unknown action types', async () => {
511
+ const mockResponse = createMockResponse({
512
+ actions: [
513
+ { type: 'unknown_action', description: 'Unknown' },
514
+ { type: 'click', elementId: 'btn-1', description: 'Valid click' },
515
+ ],
516
+ });
517
+ mockFetch.mockResolvedValueOnce({
518
+ ok: true,
519
+ status: 200,
520
+ statusText: 'OK',
521
+ json: async () => mockResponse,
522
+ });
523
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
524
+ (0, vitest_1.expect)(plan.actions).toHaveLength(1);
525
+ (0, vitest_1.expect)(plan.actions[0].type).toBe('click');
526
+ });
527
+ });
528
+ (0, vitest_1.describe)('status validation', () => {
529
+ (0, vitest_1.it)('should accept valid status values', async () => {
530
+ const statuses = ['pending', 'in_progress', 'completed', 'failed', 'cancelled'];
531
+ for (const status of statuses) {
532
+ mockFetch.mockResolvedValueOnce({
533
+ ok: true,
534
+ status: 200,
535
+ statusText: 'OK',
536
+ json: async () => createMockResponse({
537
+ status: status,
538
+ }),
539
+ });
540
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
541
+ (0, vitest_1.expect)(plan.status).toBe(status);
542
+ }
543
+ });
544
+ (0, vitest_1.it)('should default to pending for invalid status values', async () => {
545
+ mockFetch.mockResolvedValueOnce({
546
+ ok: true,
547
+ status: 200,
548
+ statusText: 'OK',
549
+ json: async () => createMockResponse({
550
+ status: 'invalid_status',
551
+ }),
552
+ });
553
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
554
+ (0, vitest_1.expect)(plan.status).toBe('pending');
555
+ });
556
+ (0, vitest_1.it)('should default to pending when status is undefined', async () => {
557
+ mockFetch.mockResolvedValueOnce({
558
+ ok: true,
559
+ status: 200,
560
+ statusText: 'OK',
561
+ json: async () => createMockResponse({
562
+ status: undefined,
563
+ }),
564
+ });
565
+ const plan = await client.generateActionPlan(mockDOM, mockContext);
566
+ (0, vitest_1.expect)(plan.status).toBe('pending');
567
+ });
568
+ });
569
+ (0, vitest_1.describe)('system prompt', () => {
570
+ (0, vitest_1.it)('should include system prompt explaining agent role', async () => {
571
+ const mockResponse = createMockResponse({});
572
+ mockFetch.mockResolvedValueOnce({
573
+ ok: true,
574
+ status: 200,
575
+ statusText: 'OK',
576
+ json: async () => mockResponse,
577
+ });
578
+ await client.generateActionPlan(mockDOM, mockContext);
579
+ const body = JSON.parse(mockFetch.mock.calls[0][1].body);
580
+ const systemMessage = body.messages[0].content;
581
+ (0, vitest_1.expect)(systemMessage).toContain('web automation agent');
582
+ (0, vitest_1.expect)(systemMessage).toContain('JSON');
583
+ (0, vitest_1.expect)(systemMessage).toContain('click');
584
+ (0, vitest_1.expect)(systemMessage).toContain('type');
585
+ (0, vitest_1.expect)(systemMessage).toContain('wait');
586
+ (0, vitest_1.expect)(systemMessage).toContain('navigate');
587
+ });
588
+ });
589
+ });
590
+ //# sourceMappingURL=claude-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-client.test.js","sourceRoot":"","sources":["../../src/agent/claude-client.test.ts"],"names":[],"mappings":"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"}