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.
- package/.env.example +12 -0
- package/.github/workflows/ci.yml +66 -0
- package/.github/workflows/publish.yml +48 -0
- package/.husky/pre-commit +6 -0
- package/.prettierignore +4 -0
- package/.prettierrc +10 -0
- package/AGENTS.md +294 -0
- package/CHANGELOG.md +40 -0
- package/GIT_RELEASE.md +167 -0
- package/LICENSE +21 -0
- package/Makefile +30 -0
- package/NPM_PUBLISHING.md +230 -0
- package/PYEOF +0 -0
- package/README.md +295 -0
- package/TESTING-GUIDE.md +151 -0
- package/cmd/linkedin/main.go +9 -0
- package/dist/agent/action-executor.d.ts +81 -0
- package/dist/agent/action-executor.d.ts.map +1 -0
- package/dist/agent/action-executor.js +170 -0
- package/dist/agent/action-executor.js.map +1 -0
- package/dist/agent/action-executor.test.d.ts +2 -0
- package/dist/agent/action-executor.test.d.ts.map +1 -0
- package/dist/agent/action-executor.test.js +366 -0
- package/dist/agent/action-executor.test.js.map +1 -0
- package/dist/agent/claude-client.d.ts +74 -0
- package/dist/agent/claude-client.d.ts.map +1 -0
- package/dist/agent/claude-client.js +314 -0
- package/dist/agent/claude-client.js.map +1 -0
- package/dist/agent/claude-client.test.d.ts +2 -0
- package/dist/agent/claude-client.test.d.ts.map +1 -0
- package/dist/agent/claude-client.test.js +590 -0
- package/dist/agent/claude-client.test.js.map +1 -0
- package/dist/agent/dom-extractor.d.ts +50 -0
- package/dist/agent/dom-extractor.d.ts.map +1 -0
- package/dist/agent/dom-extractor.js +374 -0
- package/dist/agent/dom-extractor.js.map +1 -0
- package/dist/agent/dom-extractor.test.d.ts +7 -0
- package/dist/agent/dom-extractor.test.d.ts.map +1 -0
- package/dist/agent/dom-extractor.test.js +504 -0
- package/dist/agent/dom-extractor.test.js.map +1 -0
- package/dist/agent/extension-client.d.ts +75 -0
- package/dist/agent/extension-client.d.ts.map +1 -0
- package/dist/agent/extension-client.js +245 -0
- package/dist/agent/extension-client.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +16 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/page-agent.d.ts +76 -0
- package/dist/agent/page-agent.d.ts.map +1 -0
- package/dist/agent/page-agent.js +236 -0
- package/dist/agent/page-agent.js.map +1 -0
- package/dist/agent/types.d.ts +236 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +37 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/agent-commands.d.ts +3 -0
- package/dist/cli/agent-commands.d.ts.map +1 -0
- package/dist/cli/agent-commands.js +250 -0
- package/dist/cli/agent-commands.js.map +1 -0
- package/dist/cli/auth.d.ts +3 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +288 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/company.d.ts +3 -0
- package/dist/cli/company.d.ts.map +1 -0
- package/dist/cli/company.js +55 -0
- package/dist/cli/company.js.map +1 -0
- package/dist/cli/connection.d.ts +3 -0
- package/dist/cli/connection.d.ts.map +1 -0
- package/dist/cli/connection.js +79 -0
- package/dist/cli/connection.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +17 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/messages.d.ts +3 -0
- package/dist/cli/messages.d.ts.map +1 -0
- package/dist/cli/messages.js +268 -0
- package/dist/cli/messages.js.map +1 -0
- package/dist/cli/profile.d.ts +3 -0
- package/dist/cli/profile.d.ts.map +1 -0
- package/dist/cli/profile.js +81 -0
- package/dist/cli/profile.js.map +1 -0
- package/dist/cli/profile.test.d.ts +2 -0
- package/dist/cli/profile.test.d.ts.map +1 -0
- package/dist/cli/profile.test.js +15 -0
- package/dist/cli/profile.test.js.map +1 -0
- package/dist/cli/reply.d.ts +3 -0
- package/dist/cli/reply.d.ts.map +1 -0
- package/dist/cli/reply.js +129 -0
- package/dist/cli/reply.js.map +1 -0
- package/dist/core/audit.d.ts +17 -0
- package/dist/core/audit.d.ts.map +1 -0
- package/dist/core/audit.js +121 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/audit.test.d.ts +2 -0
- package/dist/core/audit.test.d.ts.map +1 -0
- package/dist/core/audit.test.js +142 -0
- package/dist/core/audit.test.js.map +1 -0
- package/dist/core/browser-cookies.d.ts +19 -0
- package/dist/core/browser-cookies.d.ts.map +1 -0
- package/dist/core/browser-cookies.js +181 -0
- package/dist/core/browser-cookies.js.map +1 -0
- package/dist/core/browser.d.ts +50 -0
- package/dist/core/browser.d.ts.map +1 -0
- package/dist/core/browser.js +318 -0
- package/dist/core/browser.js.map +1 -0
- package/dist/core/config.d.ts +20 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +103 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/config.test.d.ts +2 -0
- package/dist/core/config.test.d.ts.map +1 -0
- package/dist/core/config.test.js +111 -0
- package/dist/core/config.test.js.map +1 -0
- package/dist/core/storage.d.ts +19 -0
- package/dist/core/storage.d.ts.map +1 -0
- package/dist/core/storage.js +124 -0
- package/dist/core/storage.js.map +1 -0
- package/dist/core/storage.test.d.ts +2 -0
- package/dist/core/storage.test.d.ts.map +1 -0
- package/dist/core/storage.test.js +142 -0
- package/dist/core/storage.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/linkedin/auth.d.ts +22 -0
- package/dist/linkedin/auth.d.ts.map +1 -0
- package/dist/linkedin/auth.js +167 -0
- package/dist/linkedin/auth.js.map +1 -0
- package/dist/linkedin/company-extractor.d.ts +36 -0
- package/dist/linkedin/company-extractor.d.ts.map +1 -0
- package/dist/linkedin/company-extractor.js +211 -0
- package/dist/linkedin/company-extractor.js.map +1 -0
- package/dist/linkedin/company-extractor.test.d.ts +2 -0
- package/dist/linkedin/company-extractor.test.d.ts.map +1 -0
- package/dist/linkedin/company-extractor.test.js +52 -0
- package/dist/linkedin/company-extractor.test.js.map +1 -0
- package/dist/linkedin/connector.d.ts +45 -0
- package/dist/linkedin/connector.d.ts.map +1 -0
- package/dist/linkedin/connector.js +245 -0
- package/dist/linkedin/connector.js.map +1 -0
- package/dist/linkedin/message-sender.d.ts +32 -0
- package/dist/linkedin/message-sender.d.ts.map +1 -0
- package/dist/linkedin/message-sender.js +112 -0
- package/dist/linkedin/message-sender.js.map +1 -0
- package/dist/linkedin/messages.d.ts +78 -0
- package/dist/linkedin/messages.d.ts.map +1 -0
- package/dist/linkedin/messages.js +745 -0
- package/dist/linkedin/messages.js.map +1 -0
- package/dist/linkedin/profile.d.ts +37 -0
- package/dist/linkedin/profile.d.ts.map +1 -0
- package/dist/linkedin/profile.js +268 -0
- package/dist/linkedin/profile.js.map +1 -0
- package/dist/linkedin/profile.test.d.ts +2 -0
- package/dist/linkedin/profile.test.d.ts.map +1 -0
- package/dist/linkedin/profile.test.js +68 -0
- package/dist/linkedin/profile.test.js.map +1 -0
- package/dist/linkedin/reply.d.ts +21 -0
- package/dist/linkedin/reply.d.ts.map +1 -0
- package/dist/linkedin/reply.js +76 -0
- package/dist/linkedin/reply.js.map +1 -0
- package/dist/linkedin/selector-engine.d.ts +69 -0
- package/dist/linkedin/selector-engine.d.ts.map +1 -0
- package/dist/linkedin/selector-engine.js +339 -0
- package/dist/linkedin/selector-engine.js.map +1 -0
- package/dist/linkedin/selector-engine.test.d.ts +2 -0
- package/dist/linkedin/selector-engine.test.d.ts.map +1 -0
- package/dist/linkedin/selector-engine.test.js +135 -0
- package/dist/linkedin/selector-engine.test.js.map +1 -0
- package/dist/linkedin/selectors.d.ts +65 -0
- package/dist/linkedin/selectors.d.ts.map +1 -0
- package/dist/linkedin/selectors.js +261 -0
- package/dist/linkedin/selectors.js.map +1 -0
- package/dist/templates/engine.d.ts +37 -0
- package/dist/templates/engine.d.ts.map +1 -0
- package/dist/templates/engine.js +215 -0
- package/dist/templates/engine.js.map +1 -0
- package/dist/templates/engine.test.d.ts +2 -0
- package/dist/templates/engine.test.d.ts.map +1 -0
- package/dist/templates/engine.test.js +212 -0
- package/dist/templates/engine.test.js.map +1 -0
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +7 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/types/index.d.ts +113 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.test.d.ts +2 -0
- package/dist/types/index.test.d.ts.map +1 -0
- package/dist/types/index.test.js +90 -0
- package/dist/types/index.test.js.map +1 -0
- package/dist/utils/paths.d.ts +8 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +68 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +22 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +57 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +18 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +49 -0
- package/dist/utils/retry.js.map +1 -0
- package/docs/connection-command.md +52 -0
- package/docs/plans/2025-03-03-linkedin-cli-design.md +280 -0
- package/docs/plans/2025-03-03-linkedin-cli-implementation-plan.md +2087 -0
- package/docs/plans/2025-03-03-linkedin-cli-implementation.md +2420 -0
- package/docs/plans/2026-02-19-linkedin-connection-feature.md +596 -0
- package/docs/plans/2026-02-28-messages-send-feature.md +480 -0
- package/docs/plans/2026-02-28-messages-show-design.md +243 -0
- package/docs/plans/2026-03-03-linkedin-cli-oss-publishing-design.md +394 -0
- package/docs/plans/2026-03-03-linkedin-cli-oss-publishing-plan.md +1592 -0
- package/docs/superpowers/plans/2026-03-13-linkedin-automation-resilience-migration.md +425 -0
- package/docs/superpowers/plans/2026-03-13-playwright-fara-migration.md +1112 -0
- package/docs/superpowers/plans/2026-03-14-page-agent-plan.md +1598 -0
- package/docs/superpowers/plans/2026-03-15-company-profile-extraction.md +591 -0
- package/docs/superpowers/plans/2026-03-15-profile-extraction-plan.md +943 -0
- package/docs/superpowers/specs/2026-03-14-company-profile-extraction-design.md +371 -0
- package/docs/superpowers/specs/2026-03-14-page-agent-design.md +385 -0
- package/docs/superpowers/specs/2026-03-15-profile-extraction-design.md +409 -0
- package/eslint.config.mjs +58 -0
- package/go.mod +9 -0
- package/go.sum +10 -0
- package/import-cookies.js +376 -0
- package/internal/cmd/actions.go +123 -0
- package/internal/cmd/auth.go +108 -0
- package/internal/cmd/connect.go +42 -0
- package/internal/cmd/message.go +44 -0
- package/internal/cmd/people.go +454 -0
- package/internal/cmd/profiles.go +121 -0
- package/internal/cmd/root.go +89 -0
- package/internal/cmd/sequence.go +192 -0
- package/internal/config/config.go +187 -0
- package/internal/config/config_test.go +121 -0
- package/internal/config/profile.go +65 -0
- package/internal/linkedin/navigator.go +195 -0
- package/internal/linkedin/selectors.go +39 -0
- package/internal/linkedin/validator.go +69 -0
- package/internal/pinchtab/client.go +183 -0
- package/internal/pinchtab/client_test.go +67 -0
- package/internal/pinchtab/types.go +50 -0
- package/internal/ratelimit/limiter.go +115 -0
- package/internal/ratelimit/limits.go +32 -0
- package/package.json +67 -0
- package/release.sh +66 -0
- package/scripts/debug-linkedin.js +156 -0
- package/scripts/debug-login.js +193 -0
- package/scripts/extract-from-edge.js +96 -0
- package/scripts/import-cookies.js +101 -0
- package/scripts/poc-show-data.js +205 -0
- package/scripts/proof-of-access.js +87 -0
- package/scripts/prove-connection.js +110 -0
- package/scripts/show-linkedin-data.js +173 -0
- package/src/agent/action-executor.test.ts +464 -0
- package/src/agent/action-executor.ts +203 -0
- package/src/agent/claude-client.test.ts +707 -0
- package/src/agent/claude-client.ts +422 -0
- package/src/agent/dom-extractor.test.ts +574 -0
- package/src/agent/dom-extractor.ts +437 -0
- package/src/agent/extension-client.ts +306 -0
- package/src/agent/index.ts +28 -0
- package/src/agent/page-agent.ts +292 -0
- package/src/agent/types.ts +288 -0
- package/src/cli/agent-commands.ts +274 -0
- package/src/cli/auth.ts +343 -0
- package/src/cli/company.ts +66 -0
- package/src/cli/connection.ts +89 -0
- package/src/cli/index.ts +7 -0
- package/src/cli/messages.ts +338 -0
- package/src/cli/profile.test.ts +14 -0
- package/src/cli/profile.ts +95 -0
- package/src/cli/reply.ts +110 -0
- package/src/core/audit.test.ts +134 -0
- package/src/core/audit.ts +98 -0
- package/src/core/browser-cookies.ts +203 -0
- package/src/core/browser.ts +304 -0
- package/src/core/config.test.ts +90 -0
- package/src/core/config.ts +81 -0
- package/src/core/storage.test.ts +129 -0
- package/src/core/storage.ts +100 -0
- package/src/index.ts +70 -0
- package/src/linkedin/auth.ts +218 -0
- package/src/linkedin/company-extractor.test.ts +58 -0
- package/src/linkedin/company-extractor.ts +222 -0
- package/src/linkedin/connector.ts +336 -0
- package/src/linkedin/message-sender.ts +141 -0
- package/src/linkedin/messages.ts +894 -0
- package/src/linkedin/profile.test.ts +79 -0
- package/src/linkedin/profile.ts +314 -0
- package/src/linkedin/reply.ts +96 -0
- package/src/linkedin/selector-engine.test.ts +167 -0
- package/src/linkedin/selector-engine.ts +393 -0
- package/src/linkedin/selectors.ts +268 -0
- package/src/templates/defaults/followup.txt +14 -0
- package/src/templates/defaults/meeting.txt +16 -0
- package/src/templates/defaults/welcome.txt +14 -0
- package/src/templates/engine.test.ts +228 -0
- package/src/templates/engine.ts +208 -0
- package/src/templates/index.ts +1 -0
- package/src/types/index.test.ts +94 -0
- package/src/types/index.ts +143 -0
- package/src/types/sql.js.d.ts +23 -0
- package/src/utils/paths.ts +33 -0
- package/src/utils/rate-limiter.ts +75 -0
- package/src/utils/retry.ts +78 -0
- package/test-cli.sh +85 -0
- package/test-real-data.sh +97 -0
- package/tsconfig.json +23 -0
- package/vitest.config.ts +35 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Types Module
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the Page Agent system.
|
|
5
|
+
* Used for DOM-text based automation with Claude API integration.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Bounding box for an element's position and dimensions
|
|
9
|
+
*/
|
|
10
|
+
export interface BoundingBox {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Represents a single DOM element extracted from the page
|
|
18
|
+
*/
|
|
19
|
+
export interface DOMElement {
|
|
20
|
+
/** Unique identifier for the element within the page */
|
|
21
|
+
id: string;
|
|
22
|
+
/** HTML tag name (e.g., 'button', 'input', 'a') */
|
|
23
|
+
tag: string;
|
|
24
|
+
/** ARIA role if present (e.g., 'button', 'link', 'textbox') */
|
|
25
|
+
role?: string;
|
|
26
|
+
/** ARIA label if present */
|
|
27
|
+
ariaLabel?: string;
|
|
28
|
+
/** Visible text content of the element */
|
|
29
|
+
text: string;
|
|
30
|
+
/** Input type for form elements (e.g., 'text', 'email', 'password') */
|
|
31
|
+
type?: string;
|
|
32
|
+
/** Current value for input elements */
|
|
33
|
+
value?: string;
|
|
34
|
+
/** Whether the element is currently visible */
|
|
35
|
+
visible: boolean;
|
|
36
|
+
/** Whether the element is enabled (not disabled) */
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
/** Bounding box for element location */
|
|
39
|
+
bbox: BoundingBox;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Page type classification for LinkedIn pages
|
|
43
|
+
*/
|
|
44
|
+
export type PageType = 'profile' | 'search' | 'messaging' | 'notifications' | 'feed' | 'unknown';
|
|
45
|
+
/**
|
|
46
|
+
* Connection state for profile pages
|
|
47
|
+
*/
|
|
48
|
+
export type ConnectionState = 'connected' | 'not_connected' | 'pending' | 'unknown';
|
|
49
|
+
/**
|
|
50
|
+
* Metadata extracted from the page
|
|
51
|
+
*/
|
|
52
|
+
export interface PageMetadata {
|
|
53
|
+
/** Type of page detected */
|
|
54
|
+
pageType: PageType;
|
|
55
|
+
/** Name of the profile owner (if on a profile page) */
|
|
56
|
+
profileName?: string;
|
|
57
|
+
/** Title/headline of the profile (if on a profile page) */
|
|
58
|
+
profileTitle?: string;
|
|
59
|
+
/** Connection status with the profile owner */
|
|
60
|
+
connectionState?: ConnectionState;
|
|
61
|
+
/** Status messages or notifications displayed on the page */
|
|
62
|
+
statusMessages?: string[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Complete DOM representation of a page
|
|
66
|
+
*/
|
|
67
|
+
export interface DOMRepresentation {
|
|
68
|
+
/** Current page URL */
|
|
69
|
+
url: string;
|
|
70
|
+
/** Page title */
|
|
71
|
+
title: string;
|
|
72
|
+
/** Array of interactive elements */
|
|
73
|
+
elements: DOMElement[];
|
|
74
|
+
/** Extracted metadata about the page */
|
|
75
|
+
metadata: PageMetadata;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Base action interface
|
|
79
|
+
*/
|
|
80
|
+
export interface BaseAction {
|
|
81
|
+
/** Human-readable description of what this action does */
|
|
82
|
+
description: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Click action - simulates a mouse click on an element
|
|
86
|
+
*/
|
|
87
|
+
export interface ClickAction extends BaseAction {
|
|
88
|
+
type: 'click';
|
|
89
|
+
/** ID of the element to click (from DOMElement.id) */
|
|
90
|
+
elementId: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Type action - enters text into an input field
|
|
94
|
+
*/
|
|
95
|
+
export interface TypeAction extends BaseAction {
|
|
96
|
+
type: 'type';
|
|
97
|
+
/** ID of the input element (from DOMElement.id) */
|
|
98
|
+
elementId: string;
|
|
99
|
+
/** Text to type into the element */
|
|
100
|
+
text: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Wait action - pauses execution for a specified duration
|
|
104
|
+
*/
|
|
105
|
+
export interface WaitAction extends BaseAction {
|
|
106
|
+
type: 'wait';
|
|
107
|
+
/** Duration to wait in milliseconds */
|
|
108
|
+
durationMs: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Navigate action - navigates to a different URL
|
|
112
|
+
*/
|
|
113
|
+
export interface NavigateAction extends BaseAction {
|
|
114
|
+
type: 'navigate';
|
|
115
|
+
/** URL to navigate to */
|
|
116
|
+
url: string;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Union type of all possible actions
|
|
120
|
+
*/
|
|
121
|
+
export type Action = ClickAction | TypeAction | WaitAction | NavigateAction;
|
|
122
|
+
/**
|
|
123
|
+
* Type guard for ClickAction
|
|
124
|
+
*/
|
|
125
|
+
export declare function isClickAction(action: Action): action is ClickAction;
|
|
126
|
+
/**
|
|
127
|
+
* Type guard for TypeAction
|
|
128
|
+
*/
|
|
129
|
+
export declare function isTypeAction(action: Action): action is TypeAction;
|
|
130
|
+
/**
|
|
131
|
+
* Type guard for WaitAction
|
|
132
|
+
*/
|
|
133
|
+
export declare function isWaitAction(action: Action): action is WaitAction;
|
|
134
|
+
/**
|
|
135
|
+
* Type guard for NavigateAction
|
|
136
|
+
*/
|
|
137
|
+
export declare function isNavigateAction(action: Action): action is NavigateAction;
|
|
138
|
+
/**
|
|
139
|
+
* Status of an action plan execution
|
|
140
|
+
*/
|
|
141
|
+
export type ActionPlanStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'cancelled';
|
|
142
|
+
/**
|
|
143
|
+
* Action plan generated by Claude for task execution
|
|
144
|
+
*/
|
|
145
|
+
export interface ActionPlan {
|
|
146
|
+
/** Reasoning behind the planned actions */
|
|
147
|
+
reasoning: string;
|
|
148
|
+
/** Expected outcome after executing the actions */
|
|
149
|
+
expectedOutcome: string;
|
|
150
|
+
/** Sequence of actions to execute */
|
|
151
|
+
actions: Action[];
|
|
152
|
+
/** Current status of the plan */
|
|
153
|
+
status: ActionPlanStatus;
|
|
154
|
+
/** Error message if plan generation or execution failed */
|
|
155
|
+
error?: string;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Configuration for Claude API client
|
|
159
|
+
*/
|
|
160
|
+
export interface ClaudeClientConfig {
|
|
161
|
+
/** Anthropic API key */
|
|
162
|
+
apiKey: string;
|
|
163
|
+
/** Base URL for API requests (optional, for custom endpoints) */
|
|
164
|
+
baseUrl?: string;
|
|
165
|
+
/** Claude model to use (e.g., 'claude-3-5-sonnet-20241022') */
|
|
166
|
+
model: string;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Task to be executed by the agent
|
|
170
|
+
*/
|
|
171
|
+
export interface Task {
|
|
172
|
+
/** High-level goal to accomplish */
|
|
173
|
+
goal: string;
|
|
174
|
+
/** LinkedIn profile URL (if applicable) */
|
|
175
|
+
profileUrl?: string;
|
|
176
|
+
/** Optional note for connection requests */
|
|
177
|
+
note?: string;
|
|
178
|
+
/** Optional message to send */
|
|
179
|
+
message?: string;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Result of task execution
|
|
183
|
+
*/
|
|
184
|
+
export interface TaskResult {
|
|
185
|
+
/** Whether the task was completed successfully */
|
|
186
|
+
success: boolean;
|
|
187
|
+
/** Human-readable message describing the outcome */
|
|
188
|
+
message: string;
|
|
189
|
+
/** List of actions that were executed */
|
|
190
|
+
actionsTaken: Action[];
|
|
191
|
+
/** Final URL after task completion */
|
|
192
|
+
finalUrl?: string;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Result of a connection request task
|
|
196
|
+
*/
|
|
197
|
+
export interface ConnectionResult extends TaskResult {
|
|
198
|
+
/** Whether the connection request was sent */
|
|
199
|
+
sent: boolean;
|
|
200
|
+
/** Whether the request is pending approval */
|
|
201
|
+
pending: boolean;
|
|
202
|
+
/** Whether already connected to this user */
|
|
203
|
+
alreadyConnected?: boolean;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Result of a message sending task
|
|
207
|
+
*/
|
|
208
|
+
export interface MessageResult extends TaskResult {
|
|
209
|
+
/** Whether the message was successfully sent */
|
|
210
|
+
sent: boolean;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Context for action execution
|
|
214
|
+
*/
|
|
215
|
+
export interface ActionContext {
|
|
216
|
+
/** Actions that have already been executed */
|
|
217
|
+
previousActions: ExecutedAction[];
|
|
218
|
+
/** Original task goal */
|
|
219
|
+
goal: string;
|
|
220
|
+
/** Number of retry attempts for the current action */
|
|
221
|
+
retryCount: number;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Record of an executed action
|
|
225
|
+
*/
|
|
226
|
+
export interface ExecutedAction {
|
|
227
|
+
/** The action that was executed */
|
|
228
|
+
action: Action;
|
|
229
|
+
/** Whether the action executed successfully */
|
|
230
|
+
success: boolean;
|
|
231
|
+
/** Timestamp when the action was executed */
|
|
232
|
+
timestamp: Date;
|
|
233
|
+
/** Error message if the action failed */
|
|
234
|
+
error?: string;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent Types Module
|
|
4
|
+
*
|
|
5
|
+
* Type definitions for the Page Agent system.
|
|
6
|
+
* Used for DOM-text based automation with Claude API integration.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.isClickAction = isClickAction;
|
|
10
|
+
exports.isTypeAction = isTypeAction;
|
|
11
|
+
exports.isWaitAction = isWaitAction;
|
|
12
|
+
exports.isNavigateAction = isNavigateAction;
|
|
13
|
+
/**
|
|
14
|
+
* Type guard for ClickAction
|
|
15
|
+
*/
|
|
16
|
+
function isClickAction(action) {
|
|
17
|
+
return action.type === 'click';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Type guard for TypeAction
|
|
21
|
+
*/
|
|
22
|
+
function isTypeAction(action) {
|
|
23
|
+
return action.type === 'type';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Type guard for WaitAction
|
|
27
|
+
*/
|
|
28
|
+
function isWaitAction(action) {
|
|
29
|
+
return action.type === 'wait';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Type guard for NavigateAction
|
|
33
|
+
*/
|
|
34
|
+
function isNavigateAction(action) {
|
|
35
|
+
return action.type === 'navigate';
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA4IH,sCAEC;AAKD,oCAEC;AAKD,oCAEC;AAKD,4CAEC;AA1BD;;GAEG;AACH,SAAgB,aAAa,CAAC,MAAc;IAC1C,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,MAAc;IACzC,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,MAAc;IACzC,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-commands.d.ts","sourceRoot":"","sources":["../../src/cli/agent-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkDpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+N5D"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerAgentCommands = registerAgentCommands;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const agent_1 = require("../agent");
|
|
9
|
+
const browser_1 = require("../core/browser");
|
|
10
|
+
const config_1 = require("../core/config");
|
|
11
|
+
// Constants
|
|
12
|
+
const DASHSCOPE_API_KEY_ENV = 'DASHSCOPE_API_KEY';
|
|
13
|
+
const LINKEDIN_URL_REGEX = /^https?:\/\/www\.linkedin\.com\/in\/[^\/]+\/?$/;
|
|
14
|
+
const DEFAULT_CLAUDE_CONFIG = {
|
|
15
|
+
baseUrl: 'https://coding.dashscope.aliyuncs.com/apps/anthropic/v1',
|
|
16
|
+
model: 'qwen3.5-plus',
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Check if a CDP-enabled browser is available
|
|
20
|
+
* @returns true if browser is listening on localhost:9222
|
|
21
|
+
*/
|
|
22
|
+
async function isCDPBrowserAvailable(port = 9222) {
|
|
23
|
+
try {
|
|
24
|
+
const response = await fetch(`http://localhost:${port}/json/version`, {
|
|
25
|
+
signal: AbortSignal.timeout(2000),
|
|
26
|
+
});
|
|
27
|
+
return response.ok;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Validation functions
|
|
34
|
+
function validateApiKey() {
|
|
35
|
+
const apiKey = process.env[DASHSCOPE_API_KEY_ENV];
|
|
36
|
+
if (!apiKey) {
|
|
37
|
+
console.error(chalk_1.default.red(`✗ ${DASHSCOPE_API_KEY_ENV} environment variable is required`));
|
|
38
|
+
console.log(chalk_1.default.gray('Set it with: export DASHSCOPE_API_KEY=your_key'));
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return apiKey;
|
|
42
|
+
}
|
|
43
|
+
function validateLinkedInUrl(url) {
|
|
44
|
+
if (!LINKEDIN_URL_REGEX.test(url)) {
|
|
45
|
+
console.error(chalk_1.default.red('✗ Invalid profile URL'));
|
|
46
|
+
console.log(chalk_1.default.gray('Expected format: https://www.linkedin.com/in/username/'));
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
function registerAgentCommands(program) {
|
|
52
|
+
// Create agent subcommand
|
|
53
|
+
const agentCmd = program.command('agent').description('AI-powered LinkedIn automation');
|
|
54
|
+
// Connect command (auto-detects extension, falls back to Playwright)
|
|
55
|
+
agentCmd
|
|
56
|
+
.command('connect <url>')
|
|
57
|
+
.description('Send connection request (auto-detects fastest method)')
|
|
58
|
+
.option('--note <text>', 'Personal note')
|
|
59
|
+
.option('--debug', 'Enable debug output')
|
|
60
|
+
.option('--playwright', 'Force Playwright mode (ignore extension)')
|
|
61
|
+
.action(async (url, options) => {
|
|
62
|
+
// Validate API key and URL
|
|
63
|
+
const apiKey = validateApiKey();
|
|
64
|
+
if (!apiKey)
|
|
65
|
+
return;
|
|
66
|
+
if (!validateLinkedInUrl(url))
|
|
67
|
+
return;
|
|
68
|
+
const note = options.note || 'Hi, I would like to connect with you.';
|
|
69
|
+
// Check if CDP browser is available
|
|
70
|
+
if (!options.playwright && (await isCDPBrowserAvailable())) {
|
|
71
|
+
// Extension mode (fast)
|
|
72
|
+
console.log(chalk_1.default.blue('Using Page Agent Extension (fast mode)...'));
|
|
73
|
+
console.log(chalk_1.default.gray('Profile: ' + url));
|
|
74
|
+
try {
|
|
75
|
+
const extClient = new agent_1.PageAgentExtensionClient({
|
|
76
|
+
authToken: (0, agent_1.getAuthToken)(),
|
|
77
|
+
apiKey,
|
|
78
|
+
debug: options.debug,
|
|
79
|
+
});
|
|
80
|
+
const result = await extClient.connect(url, note);
|
|
81
|
+
if (result.success) {
|
|
82
|
+
console.log(chalk_1.default.green('✓ Connection request prepared!'));
|
|
83
|
+
console.log(chalk_1.default.gray(`Note: "${note}"`));
|
|
84
|
+
console.log(chalk_1.default.yellow('→ Ready for review - Send button NOT clicked'));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.error(chalk_1.default.red('✗ Failed: ' + result.message));
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
console.error(chalk_1.default.red('✗ Extension mode failed:'), error instanceof Error ? error.message : error);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Playwright mode (fallback)
|
|
98
|
+
const modeReason = options.playwright
|
|
99
|
+
? '--playwright flag specified'
|
|
100
|
+
: 'CDP browser not available';
|
|
101
|
+
console.log(chalk_1.default.blue(`Using Playwright Agent (${modeReason})...`));
|
|
102
|
+
console.log(chalk_1.default.gray('Profile: ' + url));
|
|
103
|
+
let browser = null;
|
|
104
|
+
try {
|
|
105
|
+
const config = (0, config_1.getConfig)();
|
|
106
|
+
browser = new browser_1.BrowserController({
|
|
107
|
+
headless: config.getValue('headless'),
|
|
108
|
+
debug: options.debug,
|
|
109
|
+
});
|
|
110
|
+
const page = await browser.launch();
|
|
111
|
+
const claudeConfig = {
|
|
112
|
+
apiKey,
|
|
113
|
+
...DEFAULT_CLAUDE_CONFIG,
|
|
114
|
+
};
|
|
115
|
+
const agent = new agent_1.PageAgent({
|
|
116
|
+
claudeConfig,
|
|
117
|
+
debug: options.debug,
|
|
118
|
+
});
|
|
119
|
+
const result = await agent.connect(url, options.note, page);
|
|
120
|
+
if (result.sent) {
|
|
121
|
+
console.log(chalk_1.default.green('✓ Connection request sent!'));
|
|
122
|
+
}
|
|
123
|
+
else if (result.alreadyConnected) {
|
|
124
|
+
console.log(chalk_1.default.yellow('✓ Already connected'));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.error(chalk_1.default.red('✗ Failed: ' + result.message));
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error(chalk_1.default.red('✗ Playwright mode failed:'), error instanceof Error ? error.message : error);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
if (browser) {
|
|
137
|
+
await browser.close();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// Message command
|
|
143
|
+
agentCmd
|
|
144
|
+
.command('message <url>')
|
|
145
|
+
.description('Send message using AI agent')
|
|
146
|
+
.requiredOption('--message <text>', 'Message to send')
|
|
147
|
+
.option('--debug', 'Enable debug output')
|
|
148
|
+
.action(async (url, options) => {
|
|
149
|
+
// Validate API key and URL
|
|
150
|
+
const apiKey = validateApiKey();
|
|
151
|
+
if (!apiKey)
|
|
152
|
+
return;
|
|
153
|
+
if (!validateLinkedInUrl(url))
|
|
154
|
+
return;
|
|
155
|
+
let browser = null;
|
|
156
|
+
try {
|
|
157
|
+
console.log(chalk_1.default.blue(`Preparing to send message to ${url} using AI agent...`));
|
|
158
|
+
// Launch browser
|
|
159
|
+
const config = (0, config_1.getConfig)();
|
|
160
|
+
browser = new browser_1.BrowserController({
|
|
161
|
+
headless: config.getValue('headless'),
|
|
162
|
+
debug: options.debug,
|
|
163
|
+
});
|
|
164
|
+
const page = await browser.launch();
|
|
165
|
+
// Create PageAgent with config
|
|
166
|
+
const claudeConfig = {
|
|
167
|
+
apiKey,
|
|
168
|
+
...DEFAULT_CLAUDE_CONFIG,
|
|
169
|
+
};
|
|
170
|
+
const agent = new agent_1.PageAgent({
|
|
171
|
+
claudeConfig,
|
|
172
|
+
debug: options.debug,
|
|
173
|
+
});
|
|
174
|
+
// Call agent.sendMessage
|
|
175
|
+
const result = await agent.sendMessage(url, options.message, page);
|
|
176
|
+
// Print result
|
|
177
|
+
if (result.sent) {
|
|
178
|
+
console.log(chalk_1.default.green('✓ Message sent successfully!'));
|
|
179
|
+
console.log(chalk_1.default.gray(`Message: "${options.message}"`));
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.error(chalk_1.default.red('✗ Failed to send message'));
|
|
183
|
+
console.error(chalk_1.default.gray(result.message));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
console.error(chalk_1.default.red('✗ Message failed:'), error instanceof Error ? error.message : error);
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
// Ensure browser closes
|
|
192
|
+
if (browser) {
|
|
193
|
+
await browser.close();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
// Playwright command (explicit Playwright mode)
|
|
198
|
+
agentCmd
|
|
199
|
+
.command('playwright <url>')
|
|
200
|
+
.description('Send connection request using Playwright (slower, explicit)')
|
|
201
|
+
.option('--note <text>', 'Personal note')
|
|
202
|
+
.option('--debug', 'Enable debug output')
|
|
203
|
+
.action(async (url, options) => {
|
|
204
|
+
const apiKey = validateApiKey();
|
|
205
|
+
if (!apiKey)
|
|
206
|
+
return;
|
|
207
|
+
if (!validateLinkedInUrl(url))
|
|
208
|
+
return;
|
|
209
|
+
let browser = null;
|
|
210
|
+
try {
|
|
211
|
+
console.log(chalk_1.default.blue('Using Playwright Agent (explicit mode)...'));
|
|
212
|
+
console.log(chalk_1.default.gray('Profile: ' + url));
|
|
213
|
+
const config = (0, config_1.getConfig)();
|
|
214
|
+
browser = new browser_1.BrowserController({
|
|
215
|
+
headless: config.getValue('headless'),
|
|
216
|
+
debug: options.debug,
|
|
217
|
+
});
|
|
218
|
+
const page = await browser.launch();
|
|
219
|
+
const claudeConfig = {
|
|
220
|
+
apiKey,
|
|
221
|
+
...DEFAULT_CLAUDE_CONFIG,
|
|
222
|
+
};
|
|
223
|
+
const agent = new agent_1.PageAgent({
|
|
224
|
+
claudeConfig,
|
|
225
|
+
debug: options.debug,
|
|
226
|
+
});
|
|
227
|
+
const result = await agent.connect(url, options.note, page);
|
|
228
|
+
if (result.sent) {
|
|
229
|
+
console.log(chalk_1.default.green('✓ Connection request sent!'));
|
|
230
|
+
}
|
|
231
|
+
else if (result.alreadyConnected) {
|
|
232
|
+
console.log(chalk_1.default.yellow('✓ Already connected'));
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
console.error(chalk_1.default.red('✗ Failed: ' + result.message));
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
console.error(chalk_1.default.red('✗ Failed:'), error instanceof Error ? error.message : error);
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
if (browser) {
|
|
245
|
+
await browser.close();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=agent-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-commands.js","sourceRoot":"","sources":["../../src/cli/agent-commands.ts"],"names":[],"mappings":";;;;;AAkDA,sDA+NC;AAhRD,kDAA0B;AAC1B,oCAA6E;AAC7E,6CAAoD;AACpD,2CAA2C;AAG3C,YAAY;AACZ,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAClD,MAAM,kBAAkB,GAAG,gDAAgD,CAAC;AAC5E,MAAM,qBAAqB,GAAG;IAC5B,OAAO,EAAE,yDAAyD;IAClE,KAAK,EAAE,cAAc;CACtB,CAAC;AAEF;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAAC,IAAI,GAAG,IAAI;IAC9C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,eAAe,EAAE;YACpE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,uBAAuB;AACvB,SAAS,cAAc;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,qBAAqB,mCAAmC,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAExF,qEAAqE;IACrE,QAAQ;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC;SACxC,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC;SACxC,MAAM,CAAC,cAAc,EAAE,0CAA0C,CAAC;SAClE,MAAM,CACL,KAAK,EAAE,GAAW,EAAE,OAAiE,EAAE,EAAE;QACvF,2BAA2B;QAC3B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;YAAE,OAAO;QAEtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,uCAAuC,CAAC;QAErE,oCAAoC;QACpC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,MAAM,qBAAqB,EAAE,CAAC,EAAE,CAAC;YAC3D,wBAAwB;YACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;YAE3C,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,gCAAwB,CAAC;oBAC7C,SAAS,EAAE,IAAA,oBAAY,GAAE;oBACzB,MAAM;oBACN,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAElD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;oBAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBAC5E,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,EACrC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;gBACnC,CAAC,CAAC,6BAA6B;gBAC/B,CAAC,CAAC,2BAA2B,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2BAA2B,UAAU,MAAM,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;YAE3C,IAAI,OAAO,GAA6B,IAAI,CAAC;YAE7C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;gBAC3B,OAAO,GAAG,IAAI,2BAAiB,CAAC;oBAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;oBACrC,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,CAAC,CAAC;gBAEH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;gBAEpC,MAAM,YAAY,GAAuB;oBACvC,MAAM;oBACN,GAAG,qBAAqB;iBACzB,CAAC;gBAEF,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC;oBAC1B,YAAY;oBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAE5D,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACzD,CAAC;qBAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,EACtC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;oBAAS,CAAC;gBACT,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;IAEJ,kBAAkB;IAClB,QAAQ;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,cAAc,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;SACrD,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAA6C,EAAE,EAAE;QAC3E,2BAA2B;QAC3B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;YAAE,OAAO;QAEtC,IAAI,OAAO,GAA6B,IAAI,CAAC;QAE7C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,GAAG,oBAAoB,CAAC,CAAC,CAAC;YAEjF,iBAAiB;YACjB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;YAC3B,OAAO,GAAG,IAAI,2BAAiB,CAAC;gBAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBACrC,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;YAEpC,+BAA+B;YAC/B,MAAM,YAAY,GAAuB;gBACvC,MAAM;gBACN,GAAG,qBAAqB;aACzB,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC;gBAC1B,YAAY;gBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAEnE,eAAe;YACf,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAC9B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,wBAAwB;YACxB,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,gDAAgD;IAChD,QAAQ;SACL,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC;SACxC,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAA2C,EAAE,EAAE;QACzE,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;YAAE,OAAO;QAEtC,IAAI,OAAO,GAA6B,IAAI,CAAC;QAE7C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;YAC3B,OAAO,GAAG,IAAI,2BAAiB,CAAC;gBAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBACrC,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;YAEpC,MAAM,YAAY,GAAuB;gBACvC,MAAM;gBACN,GAAG,qBAAqB;aACzB,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC;gBAC1B,YAAY;gBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAE5D,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACzD,CAAC;iBAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0U3D"}
|