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,74 @@
1
+ /**
2
+ * Claude API Client Module
3
+ *
4
+ * Client for interacting with the Claude API via Dashscope.
5
+ * Sends DOM representations and receives action plans for web automation.
6
+ */
7
+ import { type ActionPlan, type DOMRepresentation, type ActionContext, type ClaudeClientConfig } from './types';
8
+ /**
9
+ * Error thrown when the Claude API request fails
10
+ */
11
+ export declare class ClaudeAPIError extends Error {
12
+ readonly statusCode?: number | undefined;
13
+ readonly responseBody?: string | undefined;
14
+ constructor(message: string, statusCode?: number | undefined, responseBody?: string | undefined);
15
+ }
16
+ /**
17
+ * Error thrown when the response cannot be parsed
18
+ */
19
+ export declare class ClaudeParseError extends Error {
20
+ readonly rawResponse?: string | undefined;
21
+ constructor(message: string, rawResponse?: string | undefined);
22
+ }
23
+ /**
24
+ * Client for interacting with the Claude API
25
+ */
26
+ export declare class ClaudeClient {
27
+ private readonly config;
28
+ constructor(config: ClaudeClientConfig);
29
+ /**
30
+ * Generates an action plan based on the current DOM state and context
31
+ */
32
+ generateActionPlan(dom: DOMRepresentation, context: ActionContext): Promise<ActionPlan>;
33
+ /**
34
+ * Builds the system and user messages for the API request
35
+ */
36
+ private buildMessages;
37
+ /**
38
+ * Builds the system prompt explaining the agent role and JSON format
39
+ */
40
+ private buildSystemPrompt;
41
+ /**
42
+ * Builds the user prompt with goal, DOM, and previous actions
43
+ */
44
+ private buildUserPrompt;
45
+ /**
46
+ * Makes the API call to Claude
47
+ */
48
+ private makeAPICall;
49
+ /**
50
+ * Parses the API response into an ActionPlan
51
+ */
52
+ private parseResponse;
53
+ /**
54
+ * Extracts JSON from a string that may contain markdown or extra text
55
+ */
56
+ private extractJSON;
57
+ /**
58
+ * Validates and transforms the raw plan into a proper ActionPlan
59
+ */
60
+ private validateAndTransformPlan;
61
+ /**
62
+ * Transforms a raw action into a properly typed Action
63
+ */
64
+ private transformAction;
65
+ /**
66
+ * Validates and returns a valid status
67
+ */
68
+ private validateStatus;
69
+ /**
70
+ * Creates an error action plan
71
+ */
72
+ private createErrorPlan;
73
+ }
74
+ //# sourceMappingURL=claude-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-client.d.ts","sourceRoot":"","sources":["../../src/agent/claude-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,UAAU,EAGf,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAC;AASjB;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,UAAU,CAAC,EAAE,MAAM;aACnB,YAAY,CAAC,EAAE,MAAM;gBAFrC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,YAAY,CAAC,EAAE,MAAM,YAAA;CAKxC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;aAGvB,WAAW,CAAC,EAAE,MAAM;gBADpC,OAAO,EAAE,MAAM,EACC,WAAW,CAAC,EAAE,MAAM,YAAA;CAKvC;AA8DD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;gBAE1C,MAAM,EAAE,kBAAkB;IAQtC;;OAEG;IACG,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAM7F;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkCzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;YACW,WAAW;IA0CzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAqBhC;;OAEG;IACH,OAAO,CAAC,eAAe;IA0DvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,eAAe;CASxB"}
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ /**
3
+ * Claude API Client Module
4
+ *
5
+ * Client for interacting with the Claude API via Dashscope.
6
+ * Sends DOM representations and receives action plans for web automation.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ClaudeClient = exports.ClaudeParseError = exports.ClaudeAPIError = void 0;
10
+ /**
11
+ * Default configuration values
12
+ */
13
+ const DEFAULT_BASE_URL = 'https://coding.dashscope.aliyuncs.com/apps/anthropic/v1';
14
+ const DEFAULT_MODEL = 'qwen3.5-plus';
15
+ const DEFAULT_MAX_TOKENS = 4096;
16
+ /**
17
+ * Error thrown when the Claude API request fails
18
+ */
19
+ class ClaudeAPIError extends Error {
20
+ statusCode;
21
+ responseBody;
22
+ constructor(message, statusCode, responseBody) {
23
+ super(message);
24
+ this.statusCode = statusCode;
25
+ this.responseBody = responseBody;
26
+ this.name = 'ClaudeAPIError';
27
+ }
28
+ }
29
+ exports.ClaudeAPIError = ClaudeAPIError;
30
+ /**
31
+ * Error thrown when the response cannot be parsed
32
+ */
33
+ class ClaudeParseError extends Error {
34
+ rawResponse;
35
+ constructor(message, rawResponse) {
36
+ super(message);
37
+ this.rawResponse = rawResponse;
38
+ this.name = 'ClaudeParseError';
39
+ }
40
+ }
41
+ exports.ClaudeParseError = ClaudeParseError;
42
+ /**
43
+ * Client for interacting with the Claude API
44
+ */
45
+ class ClaudeClient {
46
+ config;
47
+ constructor(config) {
48
+ this.config = {
49
+ apiKey: config.apiKey,
50
+ baseUrl: config.baseUrl || DEFAULT_BASE_URL,
51
+ model: config.model || DEFAULT_MODEL,
52
+ };
53
+ }
54
+ /**
55
+ * Generates an action plan based on the current DOM state and context
56
+ */
57
+ async generateActionPlan(dom, context) {
58
+ const messages = this.buildMessages(dom, context);
59
+ const response = await this.makeAPICall(messages);
60
+ return this.parseResponse(response);
61
+ }
62
+ /**
63
+ * Builds the system and user messages for the API request
64
+ */
65
+ buildMessages(dom, context) {
66
+ return [
67
+ {
68
+ role: 'system',
69
+ content: this.buildSystemPrompt(),
70
+ },
71
+ {
72
+ role: 'user',
73
+ content: this.buildUserPrompt(dom, context),
74
+ },
75
+ ];
76
+ }
77
+ /**
78
+ * Builds the system prompt explaining the agent role and JSON format
79
+ */
80
+ buildSystemPrompt() {
81
+ return `You are a web automation agent specialized in LinkedIn interactions.
82
+
83
+ Your task is to analyze a DOM representation of a web page and determine the next action(s) to take to accomplish a goal.
84
+
85
+ RULES:
86
+ 1. Respond ONLY with valid JSON. No markdown, no explanations outside JSON.
87
+ 2. The JSON must match this structure:
88
+ {
89
+ "reasoning": "string explaining your thought process",
90
+ "expectedOutcome": "string describing what should happen after these actions",
91
+ "actions": [
92
+ {
93
+ "type": "click|type|wait|navigate",
94
+ "description": "human-readable description of the action",
95
+ ...action-specific fields
96
+ }
97
+ ]
98
+ }
99
+
100
+ AVAILABLE ACTIONS:
101
+ - click: { type: "click", elementId: "string", description: "string" }
102
+ - type: { type: "type", elementId: "string", text: "string", description: "string" }
103
+ - wait: { type: "wait", durationMs: number, description: "string" }
104
+ - navigate: { type: "navigate", url: "string", description: "string" }
105
+
106
+ GUIDELINES:
107
+ - Use element IDs from the provided DOM. Only reference elements that exist.
108
+ - Break complex tasks into sequential actions.
109
+ - Wait after actions that trigger page changes or loading.
110
+ - If the goal is already achieved, return an empty actions array with appropriate reasoning.
111
+ - If stuck or unable to proceed, explain why in the reasoning field.`;
112
+ }
113
+ /**
114
+ * Builds the user prompt with goal, DOM, and previous actions
115
+ */
116
+ buildUserPrompt(dom, context) {
117
+ const previousActionsText = context.previousActions.length > 0
118
+ ? context.previousActions
119
+ .map((action, index) => `${index + 1}. ${action.action.type}: ${action.action.description} (${action.success ? 'success' : 'failed'}${action.error ? ` - ${action.error}` : ''})`)
120
+ .join('\n')
121
+ : 'None';
122
+ return `Goal: ${context.goal}
123
+
124
+ Current page DOM:
125
+ \`\`\`json
126
+ ${JSON.stringify(dom, null, 2)}
127
+ \`\`\`
128
+
129
+ Previous actions taken:
130
+ ${previousActionsText}
131
+
132
+ Retry count: ${context.retryCount}
133
+
134
+ What action(s) should be taken next? Respond with the JSON action plan.`;
135
+ }
136
+ /**
137
+ * Makes the API call to Claude
138
+ */
139
+ async makeAPICall(messages) {
140
+ const url = `${this.config.baseUrl}/messages`;
141
+ const body = {
142
+ model: this.config.model,
143
+ max_tokens: DEFAULT_MAX_TOKENS,
144
+ messages,
145
+ };
146
+ let response;
147
+ try {
148
+ response = await fetch(url, {
149
+ method: 'POST',
150
+ headers: {
151
+ 'Content-Type': 'application/json',
152
+ Authorization: `Bearer ${this.config.apiKey}`,
153
+ },
154
+ body: JSON.stringify(body),
155
+ });
156
+ }
157
+ catch (error) {
158
+ throw new ClaudeAPIError(`Failed to connect to Claude API: ${error instanceof Error ? error.message : String(error)}`);
159
+ }
160
+ if (!response.ok) {
161
+ const responseBody = await response.text();
162
+ throw new ClaudeAPIError(`Claude API error: ${response.status} ${response.statusText}`, response.status, responseBody);
163
+ }
164
+ try {
165
+ return (await response.json());
166
+ }
167
+ catch (error) {
168
+ throw new ClaudeAPIError(`Failed to parse Claude API response: ${error instanceof Error ? error.message : String(error)}`);
169
+ }
170
+ }
171
+ /**
172
+ * Parses the API response into an ActionPlan
173
+ */
174
+ parseResponse(response) {
175
+ const content = response.content.find((c) => c.type === 'text');
176
+ if (!content) {
177
+ return this.createErrorPlan('No text content in Claude response');
178
+ }
179
+ const jsonText = this.extractJSON(content.text);
180
+ if (!jsonText) {
181
+ return this.createErrorPlan('Could not extract JSON from response');
182
+ }
183
+ try {
184
+ const raw = JSON.parse(jsonText);
185
+ return this.validateAndTransformPlan(raw);
186
+ }
187
+ catch (error) {
188
+ return this.createErrorPlan(`Failed to parse action plan JSON: ${error instanceof Error ? error.message : String(error)}`);
189
+ }
190
+ }
191
+ /**
192
+ * Extracts JSON from a string that may contain markdown or extra text
193
+ */
194
+ extractJSON(text) {
195
+ // Try to find JSON in code blocks
196
+ const codeBlockMatch = text.match(/```(?:json)?\s*([\s\S]*?)\s*```/);
197
+ if (codeBlockMatch) {
198
+ return codeBlockMatch[1].trim();
199
+ }
200
+ // Try to find JSON between curly braces
201
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
202
+ if (jsonMatch) {
203
+ return jsonMatch[0].trim();
204
+ }
205
+ // If the text looks like it starts with JSON, return it as-is
206
+ if (text.trim().startsWith('{')) {
207
+ return text.trim();
208
+ }
209
+ return null;
210
+ }
211
+ /**
212
+ * Validates and transforms the raw plan into a proper ActionPlan
213
+ */
214
+ validateAndTransformPlan(raw) {
215
+ const actions = [];
216
+ if (raw.actions && Array.isArray(raw.actions)) {
217
+ for (const rawAction of raw.actions) {
218
+ const action = this.transformAction(rawAction);
219
+ if (action) {
220
+ actions.push(action);
221
+ }
222
+ }
223
+ }
224
+ return {
225
+ reasoning: raw.reasoning || 'No reasoning provided',
226
+ expectedOutcome: raw.expectedOutcome || 'No expected outcome provided',
227
+ actions,
228
+ status: this.validateStatus(raw.status),
229
+ error: raw.error,
230
+ };
231
+ }
232
+ /**
233
+ * Transforms a raw action into a properly typed Action
234
+ */
235
+ transformAction(rawAction) {
236
+ const description = rawAction.description || 'No description provided';
237
+ switch (rawAction.type) {
238
+ case 'click': {
239
+ if (!rawAction.elementId) {
240
+ console.warn('Click action missing elementId');
241
+ return null;
242
+ }
243
+ return {
244
+ type: 'click',
245
+ elementId: rawAction.elementId,
246
+ description,
247
+ };
248
+ }
249
+ case 'type': {
250
+ if (!rawAction.elementId || rawAction.text === undefined) {
251
+ console.warn('Type action missing elementId or text');
252
+ return null;
253
+ }
254
+ return {
255
+ type: 'type',
256
+ elementId: rawAction.elementId,
257
+ text: rawAction.text,
258
+ description,
259
+ };
260
+ }
261
+ case 'wait': {
262
+ if (rawAction.durationMs === undefined) {
263
+ console.warn('Wait action missing durationMs, using default 1000ms');
264
+ }
265
+ return {
266
+ type: 'wait',
267
+ durationMs: rawAction.durationMs || 1000,
268
+ description,
269
+ };
270
+ }
271
+ case 'navigate': {
272
+ if (!rawAction.url) {
273
+ console.warn('Navigate action missing url');
274
+ return null;
275
+ }
276
+ return {
277
+ type: 'navigate',
278
+ url: rawAction.url,
279
+ description,
280
+ };
281
+ }
282
+ default:
283
+ console.warn(`Unknown action type: ${rawAction.type}`);
284
+ return null;
285
+ }
286
+ }
287
+ /**
288
+ * Validates and returns a valid status
289
+ */
290
+ validateStatus(status) {
291
+ const validStatuses = [
292
+ 'pending',
293
+ 'in_progress',
294
+ 'completed',
295
+ 'failed',
296
+ 'cancelled',
297
+ ];
298
+ return status && validStatuses.includes(status) ? status : 'pending';
299
+ }
300
+ /**
301
+ * Creates an error action plan
302
+ */
303
+ createErrorPlan(message) {
304
+ return {
305
+ reasoning: 'Failed to generate action plan',
306
+ expectedOutcome: 'No actions can be taken due to error',
307
+ actions: [],
308
+ status: 'failed',
309
+ error: message,
310
+ };
311
+ }
312
+ }
313
+ exports.ClaudeClient = ClaudeClient;
314
+ //# sourceMappingURL=claude-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-client.js","sourceRoot":"","sources":["../../src/agent/claude-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claude-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-client.test.d.ts","sourceRoot":"","sources":["../../src/agent/claude-client.test.ts"],"names":[],"mappings":""}