@framers/agentos 0.1.40 → 0.1.42

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/README.md CHANGED
@@ -212,7 +212,7 @@ for await (const chunk of agent.processRequest({
212
212
  | |
213
213
  | +-------------------+ +-------------------+ +----------------+ |
214
214
  | | Extension Manager | | Channel Router | | Call Manager | |
215
- | | (12+ kinds) | | (28 platforms) | | (Voice/Tel.) | |
215
+ | | (12+ kinds) | | (40 platforms) | | (Voice/Tel.) | |
216
216
  | +-------------------+ +-------------------+ +----------------+ |
217
217
  | |
218
218
  | +-------------------+ +-------------------+ +----------------+ |
@@ -761,18 +761,18 @@ See [`docs/HUMAN_IN_THE_LOOP.md`](docs/HUMAN_IN_THE_LOOP.md) for the full HITL s
761
761
 
762
762
  **Location:** `src/channels/`
763
763
 
764
- Unified adapters for 20 external messaging platforms.
764
+ Unified adapters for 40 external messaging and social platforms.
765
765
 
766
- **20 supported platforms:**
766
+ **40 supported platforms:**
767
767
 
768
768
  | Priority | Platforms |
769
769
  |----------|-----------|
770
- | **P0** (Core) | Telegram, WhatsApp, Discord, Slack, Webchat |
771
- | **P1** | Signal, iMessage, Google Chat, Microsoft Teams |
772
- | **P2** | Matrix, Zalo, Email, SMS |
773
- | **P3** | Nostr, Twitch, Line, Feishu, Mattermost, Nextcloud Talk, Tlon |
770
+ | **P0** (Core + Social) | Telegram, WhatsApp, Discord, Slack, Webchat, Twitter/X, Instagram, Reddit, YouTube, LinkedIn, Facebook, Threads, Bluesky |
771
+ | **P1** | Signal, iMessage, Google Chat, Microsoft Teams, Pinterest, TikTok, Mastodon, Dev.to, Hashnode, Medium, WordPress |
772
+ | **P2** | Matrix, Zalo, Email, SMS, Farcaster, Lemmy, Google Business |
773
+ | **P3** | Nostr, Twitch, Line, Feishu, Mattermost, Nextcloud Talk, Tlon, IRC, Zalo Personal |
774
774
 
775
- **21 capability flags:**
775
+ **29 capability flags:**
776
776
 
777
777
  Each adapter declares its capabilities, allowing consumers to check before attempting unsupported actions:
778
778
 
@@ -781,6 +781,8 @@ text, rich_text, images, video, audio, voice_notes, documents,
781
781
  stickers, reactions, threads, typing_indicator, read_receipts,
782
782
  group_chat, channels, buttons, inline_keyboard, embeds,
783
783
  mentions, editing, deletion
784
+ stories, reels, hashtags, polls, carousel,
785
+ engagement_metrics, scheduling, dm_automation, content_discovery
784
786
  ```
785
787
 
786
788
  **IChannelAdapter** -- Unified interface for bidirectional messaging:
@@ -878,5 +878,221 @@
878
878
  "docsUrl": "https://developers.facebook.com/apps/",
879
879
  "providers": ["instagram"],
880
880
  "optional": true
881
+ },
882
+ {
883
+ "id": "linkedin.accessToken",
884
+ "label": "LinkedIn Access Token",
885
+ "description": "Access token for LinkedIn API calls (post, comment, analytics).",
886
+ "envVar": "LINKEDIN_ACCESS_TOKEN",
887
+ "docsUrl": "https://www.linkedin.com/developers/apps",
888
+ "providers": ["linkedin"],
889
+ "optional": true
890
+ },
891
+ {
892
+ "id": "linkedin.clientId",
893
+ "label": "LinkedIn OAuth Client ID",
894
+ "description": "Client ID for LinkedIn OAuth login flow.",
895
+ "envVar": "LINKEDIN_CLIENT_ID",
896
+ "docsUrl": "https://www.linkedin.com/developers/apps",
897
+ "providers": ["linkedin"],
898
+ "optional": true
899
+ },
900
+ {
901
+ "id": "linkedin.clientSecret",
902
+ "label": "LinkedIn OAuth Client Secret",
903
+ "description": "Client secret for LinkedIn OAuth login flow.",
904
+ "envVar": "LINKEDIN_CLIENT_SECRET",
905
+ "docsUrl": "https://www.linkedin.com/developers/apps",
906
+ "providers": ["linkedin"],
907
+ "optional": true
908
+ },
909
+ {
910
+ "id": "facebook.accessToken",
911
+ "label": "Facebook Access Token",
912
+ "description": "Page/user access token for Facebook Graph API calls.",
913
+ "envVar": "FACEBOOK_ACCESS_TOKEN",
914
+ "docsUrl": "https://developers.facebook.com/tools/explorer/",
915
+ "providers": ["facebook"],
916
+ "optional": true
917
+ },
918
+ {
919
+ "id": "threads.accessToken",
920
+ "label": "Threads Access Token",
921
+ "description": "Access token for Threads API (via Meta Graph).",
922
+ "envVar": "THREADS_ACCESS_TOKEN",
923
+ "docsUrl": "https://developers.facebook.com/docs/threads",
924
+ "providers": ["threads"],
925
+ "optional": true
926
+ },
927
+ {
928
+ "id": "bluesky.handle",
929
+ "label": "Bluesky Handle",
930
+ "description": "AT Protocol handle (for example, yourname.bsky.social).",
931
+ "envVar": "BLUESKY_HANDLE",
932
+ "docsUrl": "https://bsky.app/settings/account",
933
+ "providers": ["bluesky"],
934
+ "optional": true
935
+ },
936
+ {
937
+ "id": "bluesky.appPassword",
938
+ "label": "Bluesky App Password",
939
+ "description": "App-specific password for Bluesky API authentication.",
940
+ "envVar": "BLUESKY_APP_PASSWORD",
941
+ "docsUrl": "https://bsky.app/settings/app-passwords",
942
+ "providers": ["bluesky"],
943
+ "optional": true
944
+ },
945
+ {
946
+ "id": "mastodon.accessToken",
947
+ "label": "Mastodon Access Token",
948
+ "description": "Access token for Mastodon API calls.",
949
+ "envVar": "MASTODON_ACCESS_TOKEN",
950
+ "docsUrl": "https://docs.joinmastodon.org/client/token/",
951
+ "providers": ["mastodon"],
952
+ "optional": true
953
+ },
954
+ {
955
+ "id": "mastodon.instanceUrl",
956
+ "label": "Mastodon Instance URL",
957
+ "description": "Mastodon instance URL (for example, https://mastodon.social).",
958
+ "envVar": "MASTODON_INSTANCE_URL",
959
+ "docsUrl": "https://docs.joinmastodon.org/",
960
+ "providers": ["mastodon"],
961
+ "optional": true
962
+ },
963
+ {
964
+ "id": "farcaster.neynarApiKey",
965
+ "label": "Farcaster Neynar API Key",
966
+ "description": "API key for Neynar Farcaster API.",
967
+ "envVar": "FARCASTER_NEYNAR_API_KEY",
968
+ "docsUrl": "https://docs.neynar.com/docs/introduction",
969
+ "providers": ["farcaster"],
970
+ "optional": true
971
+ },
972
+ {
973
+ "id": "farcaster.signerUuid",
974
+ "label": "Farcaster Signer UUID",
975
+ "description": "Signer UUID used for authenticated cast publishing via Neynar.",
976
+ "envVar": "FARCASTER_SIGNER_UUID",
977
+ "docsUrl": "https://docs.neynar.com/docs/post-a-cast",
978
+ "providers": ["farcaster"],
979
+ "optional": true
980
+ },
981
+ {
982
+ "id": "farcaster.fid",
983
+ "label": "Farcaster FID",
984
+ "description": "Optional Farcaster user FID for account-scoped operations.",
985
+ "envVar": "FARCASTER_FID",
986
+ "docsUrl": "https://docs.neynar.com/docs/farcaster-user-profile",
987
+ "providers": ["farcaster"],
988
+ "optional": true
989
+ },
990
+ {
991
+ "id": "lemmy.instanceUrl",
992
+ "label": "Lemmy Instance URL",
993
+ "description": "Base URL for the Lemmy instance.",
994
+ "envVar": "LEMMY_INSTANCE_URL",
995
+ "docsUrl": "https://join-lemmy.org/docs",
996
+ "providers": ["lemmy"],
997
+ "optional": true
998
+ },
999
+ {
1000
+ "id": "lemmy.username",
1001
+ "label": "Lemmy Username",
1002
+ "description": "Username for Lemmy account authentication.",
1003
+ "envVar": "LEMMY_USERNAME",
1004
+ "docsUrl": "https://join-lemmy.org/",
1005
+ "providers": ["lemmy"],
1006
+ "optional": true
1007
+ },
1008
+ {
1009
+ "id": "lemmy.password",
1010
+ "label": "Lemmy Password",
1011
+ "description": "Password for Lemmy account authentication.",
1012
+ "envVar": "LEMMY_PASSWORD",
1013
+ "docsUrl": "https://join-lemmy.org/",
1014
+ "providers": ["lemmy"],
1015
+ "optional": true
1016
+ },
1017
+ {
1018
+ "id": "google.accessToken",
1019
+ "label": "Google OAuth Access Token",
1020
+ "description": "OAuth access token for Google Business Profile API calls.",
1021
+ "envVar": "GOOGLE_ACCESS_TOKEN",
1022
+ "docsUrl": "https://developers.google.com/my-business/content/prereqs",
1023
+ "providers": ["google-business"],
1024
+ "optional": true
1025
+ },
1026
+ {
1027
+ "id": "google.businessAccountId",
1028
+ "label": "Google Business Account ID",
1029
+ "description": "Optional account ID used to scope Google Business operations.",
1030
+ "envVar": "GOOGLE_BUSINESS_ACCOUNT_ID",
1031
+ "docsUrl": "https://developers.google.com/my-business/content/location-data",
1032
+ "providers": ["google-business"],
1033
+ "optional": true
1034
+ },
1035
+ {
1036
+ "id": "google.businessLocationId",
1037
+ "label": "Google Business Location ID",
1038
+ "description": "Optional location ID used to scope Google Business operations.",
1039
+ "envVar": "GOOGLE_BUSINESS_LOCATION_ID",
1040
+ "docsUrl": "https://developers.google.com/my-business/content/location-data",
1041
+ "providers": ["google-business"],
1042
+ "optional": true
1043
+ },
1044
+ {
1045
+ "id": "devto.apiKey",
1046
+ "label": "Dev.to API Key",
1047
+ "description": "API key for Dev.to publishing via blog-publisher.",
1048
+ "envVar": "DEVTO_API_KEY",
1049
+ "docsUrl": "https://developers.forem.com/api",
1050
+ "providers": ["devto"],
1051
+ "optional": true
1052
+ },
1053
+ {
1054
+ "id": "hashnode.apiKey",
1055
+ "label": "Hashnode Personal Access Token",
1056
+ "description": "Personal access token for Hashnode publishing via blog-publisher.",
1057
+ "envVar": "HASHNODE_API_KEY",
1058
+ "docsUrl": "https://hashnode.com/settings/developer",
1059
+ "providers": ["devto"],
1060
+ "optional": true
1061
+ },
1062
+ {
1063
+ "id": "medium.accessToken",
1064
+ "label": "Medium Integration Token",
1065
+ "description": "Integration token for Medium publishing via blog-publisher.",
1066
+ "envVar": "MEDIUM_ACCESS_TOKEN",
1067
+ "docsUrl": "https://github.com/Medium/medium-api-docs",
1068
+ "providers": ["devto"],
1069
+ "optional": true
1070
+ },
1071
+ {
1072
+ "id": "wordpress.apiUrl",
1073
+ "label": "WordPress API URL",
1074
+ "description": "WordPress REST API base URL (for example, https://example.com/wp-json/wp/v2).",
1075
+ "envVar": "WORDPRESS_API_URL",
1076
+ "docsUrl": "https://developer.wordpress.org/rest-api/",
1077
+ "providers": ["devto"],
1078
+ "optional": true
1079
+ },
1080
+ {
1081
+ "id": "wordpress.username",
1082
+ "label": "WordPress Username",
1083
+ "description": "Username used for WordPress application-password authentication.",
1084
+ "envVar": "WORDPRESS_USERNAME",
1085
+ "docsUrl": "https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/",
1086
+ "providers": ["devto"],
1087
+ "optional": true
1088
+ },
1089
+ {
1090
+ "id": "wordpress.appPassword",
1091
+ "label": "WordPress App Password",
1092
+ "description": "Application password for WordPress REST API authentication.",
1093
+ "envVar": "WORDPRESS_APP_PASSWORD",
1094
+ "docsUrl": "https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/",
1095
+ "providers": ["devto"],
1096
+ "optional": true
881
1097
  }
882
1098
  ]
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @fileoverview Facebook/Meta OAuth 2.0 authorization code flow.
3
+ *
4
+ * Exchanges short-lived user tokens for long-lived tokens and stores page
5
+ * metadata when available to simplify page-posting setup.
6
+ *
7
+ * @module agentos/core/llm/auth/FacebookOAuthFlow
8
+ */
9
+ import { BrowserOAuthFlow, type BrowserOAuthConfig, type BrowserOAuthFlowOptions } from './BrowserOAuthFlow.js';
10
+ import type { OAuthTokenSet } from './types.js';
11
+ export interface FacebookOAuthFlowOptions extends BrowserOAuthFlowOptions {
12
+ /** Meta/Facebook App ID. Falls back to META_APP_ID or FACEBOOK_APP_ID. */
13
+ appId?: string;
14
+ /** Meta/Facebook App Secret. Falls back to META_APP_SECRET or FACEBOOK_APP_SECRET. */
15
+ appSecret?: string;
16
+ /** Override requested scopes. */
17
+ scopes?: string[];
18
+ }
19
+ export declare class FacebookOAuthFlow extends BrowserOAuthFlow {
20
+ readonly providerId = "facebook";
21
+ private readonly appId;
22
+ private readonly appSecret;
23
+ private readonly scopes;
24
+ constructor(opts?: FacebookOAuthFlowOptions);
25
+ protected getConfig(): BrowserOAuthConfig;
26
+ protected exchangeCode(code: string, redirectUri: string, _codeVerifier: string): Promise<OAuthTokenSet>;
27
+ protected postExchange(tokens: OAuthTokenSet): Promise<OAuthTokenSet>;
28
+ protected refreshTokens(refreshToken: string): Promise<OAuthTokenSet>;
29
+ private resolvePrimaryPage;
30
+ }
31
+ //# sourceMappingURL=FacebookOAuthFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FacebookOAuthFlow.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/auth/FacebookOAuthFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAchD,MAAM,WAAW,wBAAyB,SAAQ,uBAAuB;IACvE,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,iBAAkB,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,UAAU,cAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;gBAEtB,IAAI,CAAC,EAAE,wBAAwB;IAmB3C,SAAS,CAAC,SAAS,IAAI,kBAAkB;cAWzB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC;cA2BA,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;cAkCpE,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YA2B7D,kBAAkB;CAiBjC"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @fileoverview Facebook/Meta OAuth 2.0 authorization code flow.
3
+ *
4
+ * Exchanges short-lived user tokens for long-lived tokens and stores page
5
+ * metadata when available to simplify page-posting setup.
6
+ *
7
+ * @module agentos/core/llm/auth/FacebookOAuthFlow
8
+ */
9
+ import { BrowserOAuthFlow, } from './BrowserOAuthFlow.js';
10
+ const META_AUTH_URL = 'https://www.facebook.com/v21.0/dialog/oauth';
11
+ const META_TOKEN_URL = 'https://graph.facebook.com/v21.0/oauth/access_token';
12
+ const GRAPH_API = 'https://graph.facebook.com/v21.0';
13
+ const DEFAULT_SCOPES = [
14
+ 'pages_show_list',
15
+ 'pages_read_engagement',
16
+ 'pages_manage_posts',
17
+ 'public_profile',
18
+ 'email',
19
+ ];
20
+ export class FacebookOAuthFlow extends BrowserOAuthFlow {
21
+ constructor(opts) {
22
+ super(opts);
23
+ this.providerId = 'facebook';
24
+ this.appId = opts?.appId ?? process.env.META_APP_ID ?? process.env.FACEBOOK_APP_ID ?? '';
25
+ this.appSecret =
26
+ opts?.appSecret ?? process.env.META_APP_SECRET ?? process.env.FACEBOOK_APP_SECRET ?? '';
27
+ this.scopes = opts?.scopes ?? DEFAULT_SCOPES;
28
+ if (!this.appId) {
29
+ throw new Error('Meta/Facebook App ID is required. Pass --app-id or set META_APP_ID.');
30
+ }
31
+ if (!this.appSecret) {
32
+ throw new Error('Meta/Facebook App Secret is required. Pass --app-secret or set META_APP_SECRET.');
33
+ }
34
+ }
35
+ getConfig() {
36
+ return {
37
+ displayName: 'Facebook',
38
+ authorizationEndpoint: META_AUTH_URL,
39
+ tokenEndpoint: META_TOKEN_URL,
40
+ scopes: this.scopes,
41
+ clientId: this.appId,
42
+ clientSecret: this.appSecret,
43
+ };
44
+ }
45
+ async exchangeCode(code, redirectUri, _codeVerifier) {
46
+ const params = new URLSearchParams({
47
+ client_id: this.appId,
48
+ client_secret: this.appSecret,
49
+ redirect_uri: redirectUri,
50
+ code,
51
+ });
52
+ const res = await fetch(`${META_TOKEN_URL}?${params.toString()}`);
53
+ if (!res.ok) {
54
+ const body = await res.text();
55
+ throw new Error(`Facebook token exchange failed: ${res.status} ${body}`);
56
+ }
57
+ const data = (await res.json());
58
+ return {
59
+ accessToken: data.access_token,
60
+ expiresAt: Date.now() + (data.expires_in ?? 3600) * 1000,
61
+ };
62
+ }
63
+ async postExchange(tokens) {
64
+ const params = new URLSearchParams({
65
+ grant_type: 'fb_exchange_token',
66
+ client_id: this.appId,
67
+ client_secret: this.appSecret,
68
+ fb_exchange_token: tokens.accessToken,
69
+ });
70
+ const res = await fetch(`${META_TOKEN_URL}?${params.toString()}`);
71
+ if (res.ok) {
72
+ const data = (await res.json());
73
+ tokens = {
74
+ accessToken: data.access_token,
75
+ refreshToken: data.access_token,
76
+ expiresAt: Date.now() + (data.expires_in ?? 5184000) * 1000,
77
+ };
78
+ }
79
+ const page = await this.resolvePrimaryPage(tokens.accessToken);
80
+ if (page) {
81
+ tokens.metadata = {
82
+ ...tokens.metadata,
83
+ pageId: page.id,
84
+ pageName: page.name,
85
+ };
86
+ }
87
+ return tokens;
88
+ }
89
+ async refreshTokens(refreshToken) {
90
+ const params = new URLSearchParams({
91
+ grant_type: 'fb_exchange_token',
92
+ client_id: this.appId,
93
+ client_secret: this.appSecret,
94
+ fb_exchange_token: refreshToken,
95
+ });
96
+ const res = await fetch(`${META_TOKEN_URL}?${params.toString()}`);
97
+ if (!res.ok) {
98
+ const body = await res.text();
99
+ throw new Error(`Facebook token refresh failed: ${res.status} ${body}`);
100
+ }
101
+ const data = (await res.json());
102
+ return {
103
+ accessToken: data.access_token,
104
+ refreshToken: data.access_token,
105
+ expiresAt: Date.now() + (data.expires_in ?? 5184000) * 1000,
106
+ };
107
+ }
108
+ async resolvePrimaryPage(accessToken) {
109
+ try {
110
+ const res = await fetch(`${GRAPH_API}/me/accounts?fields=id,name&access_token=${encodeURIComponent(accessToken)}`);
111
+ if (!res.ok)
112
+ return undefined;
113
+ const data = (await res.json());
114
+ if (!Array.isArray(data.data) || data.data.length === 0)
115
+ return undefined;
116
+ return data.data[0];
117
+ }
118
+ catch {
119
+ return undefined;
120
+ }
121
+ }
122
+ }
123
+ //# sourceMappingURL=FacebookOAuthFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FacebookOAuthFlow.js","sourceRoot":"","sources":["../../../../src/core/llm/auth/FacebookOAuthFlow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @fileoverview LinkedIn OAuth 2.0 authorization code flow with PKCE.
3
+ *
4
+ * Supports token refresh when a refresh token is issued for the app/scopes.
5
+ *
6
+ * @module agentos/core/llm/auth/LinkedInOAuthFlow
7
+ */
8
+ import { BrowserOAuthFlow, type BrowserOAuthConfig, type BrowserOAuthFlowOptions } from './BrowserOAuthFlow.js';
9
+ import type { OAuthTokenSet } from './types.js';
10
+ export interface LinkedInOAuthFlowOptions extends BrowserOAuthFlowOptions {
11
+ /** LinkedIn OAuth Client ID. Falls back to LINKEDIN_CLIENT_ID env var. */
12
+ clientId?: string;
13
+ /** LinkedIn OAuth Client Secret. Falls back to LINKEDIN_CLIENT_SECRET env var. */
14
+ clientSecret?: string;
15
+ /** Override requested scopes. */
16
+ scopes?: string[];
17
+ }
18
+ export declare class LinkedInOAuthFlow extends BrowserOAuthFlow {
19
+ readonly providerId = "linkedin";
20
+ private readonly clientId;
21
+ private readonly clientSecret;
22
+ private readonly scopes;
23
+ constructor(opts?: LinkedInOAuthFlowOptions);
24
+ protected getConfig(): BrowserOAuthConfig;
25
+ protected exchangeCode(code: string, redirectUri: string, codeVerifier: string): Promise<OAuthTokenSet>;
26
+ protected refreshTokens(refreshToken: string): Promise<OAuthTokenSet>;
27
+ }
28
+ //# sourceMappingURL=LinkedInOAuthFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkedInOAuthFlow.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/auth/LinkedInOAuthFlow.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOhD,MAAM,WAAW,wBAAyB,SAAQ,uBAAuB;IACvE,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,iBAAkB,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,UAAU,cAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;gBAEtB,IAAI,CAAC,EAAE,wBAAwB;IAkB3C,SAAS,CAAC,SAAS,IAAI,kBAAkB;cAWzB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC;cAgCT,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CA6B5E"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @fileoverview LinkedIn OAuth 2.0 authorization code flow with PKCE.
3
+ *
4
+ * Supports token refresh when a refresh token is issued for the app/scopes.
5
+ *
6
+ * @module agentos/core/llm/auth/LinkedInOAuthFlow
7
+ */
8
+ import { BrowserOAuthFlow, } from './BrowserOAuthFlow.js';
9
+ const LINKEDIN_AUTH_URL = 'https://www.linkedin.com/oauth/v2/authorization';
10
+ const LINKEDIN_TOKEN_URL = 'https://www.linkedin.com/oauth/v2/accessToken';
11
+ const DEFAULT_SCOPES = ['openid', 'profile', 'email', 'w_member_social'];
12
+ export class LinkedInOAuthFlow extends BrowserOAuthFlow {
13
+ constructor(opts) {
14
+ super(opts);
15
+ this.providerId = 'linkedin';
16
+ this.clientId = opts?.clientId ?? process.env.LINKEDIN_CLIENT_ID ?? '';
17
+ this.clientSecret = opts?.clientSecret ?? process.env.LINKEDIN_CLIENT_SECRET ?? '';
18
+ this.scopes = opts?.scopes ?? DEFAULT_SCOPES;
19
+ if (!this.clientId) {
20
+ throw new Error('LinkedIn OAuth Client ID is required. Pass --client-id or set LINKEDIN_CLIENT_ID.');
21
+ }
22
+ if (!this.clientSecret) {
23
+ throw new Error('LinkedIn OAuth Client Secret is required. Pass --client-secret or set LINKEDIN_CLIENT_SECRET.');
24
+ }
25
+ }
26
+ getConfig() {
27
+ return {
28
+ displayName: 'LinkedIn',
29
+ authorizationEndpoint: LINKEDIN_AUTH_URL,
30
+ tokenEndpoint: LINKEDIN_TOKEN_URL,
31
+ scopes: this.scopes,
32
+ clientId: this.clientId,
33
+ clientSecret: this.clientSecret,
34
+ };
35
+ }
36
+ async exchangeCode(code, redirectUri, codeVerifier) {
37
+ const res = await fetch(LINKEDIN_TOKEN_URL, {
38
+ method: 'POST',
39
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
40
+ body: new URLSearchParams({
41
+ grant_type: 'authorization_code',
42
+ code,
43
+ redirect_uri: redirectUri,
44
+ client_id: this.clientId,
45
+ client_secret: this.clientSecret,
46
+ code_verifier: codeVerifier,
47
+ }).toString(),
48
+ });
49
+ if (!res.ok) {
50
+ const body = await res.text();
51
+ throw new Error(`LinkedIn token exchange failed: ${res.status} ${body}`);
52
+ }
53
+ const data = (await res.json());
54
+ return {
55
+ accessToken: data.access_token,
56
+ refreshToken: data.refresh_token,
57
+ expiresAt: Date.now() + (data.expires_in ?? 3600) * 1000,
58
+ };
59
+ }
60
+ async refreshTokens(refreshToken) {
61
+ const res = await fetch(LINKEDIN_TOKEN_URL, {
62
+ method: 'POST',
63
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
64
+ body: new URLSearchParams({
65
+ grant_type: 'refresh_token',
66
+ refresh_token: refreshToken,
67
+ client_id: this.clientId,
68
+ client_secret: this.clientSecret,
69
+ }).toString(),
70
+ });
71
+ if (!res.ok) {
72
+ const body = await res.text();
73
+ throw new Error(`LinkedIn token refresh failed: ${res.status} ${body}`);
74
+ }
75
+ const data = (await res.json());
76
+ return {
77
+ accessToken: data.access_token,
78
+ refreshToken: data.refresh_token,
79
+ expiresAt: Date.now() + (data.expires_in ?? 3600) * 1000,
80
+ };
81
+ }
82
+ }
83
+ //# sourceMappingURL=LinkedInOAuthFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkedInOAuthFlow.js","sourceRoot":"","sources":["../../../../src/core/llm/auth/LinkedInOAuthFlow.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,iBAAiB,GAAG,iDAAiD,CAAC;AAC5E,MAAM,kBAAkB,GAAG,+CAA+C,CAAC;AAE3E,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAWzE,MAAM,OAAO,iBAAkB,SAAQ,gBAAgB;IAMrD,YAAY,IAA+B;QACzC,KAAK,CAAC,IAAI,CAAC,CAAC;QANL,eAAU,GAAG,UAAU,CAAC;QAO/B,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;QACvE,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC;QACnF,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,cAAc,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;IACH,CAAC;IAES,SAAS;QACjB,OAAO;YACL,WAAW,EAAE,UAAU;YACvB,qBAAqB,EAAE,iBAAiB;YACxC,aAAa,EAAE,kBAAkB;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,YAAY,CAC1B,IAAY,EACZ,WAAmB,EACnB,YAAoB;QAEpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC;gBACxB,UAAU,EAAE,oBAAoB;gBAChC,IAAI;gBACJ,YAAY,EAAE,WAAW;gBACzB,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,aAAa,EAAE,IAAI,CAAC,YAAY;gBAChC,aAAa,EAAE,YAAY;aAC5B,CAAC,CAAC,QAAQ,EAAE;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,IAAI,CAAC,aAAa;YAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,IAAI;SACzD,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,YAAoB;QAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC;gBACxB,UAAU,EAAE,eAAe;gBAC3B,aAAa,EAAE,YAAY;gBAC3B,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,aAAa,EAAE,IAAI,CAAC,YAAY;aACjC,CAAC,CAAC,QAAQ,EAAE;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,IAAI,CAAC,aAAa;YAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,IAAI;SACzD,CAAC;IACJ,CAAC;CACF"}
@@ -1,14 +1,15 @@
1
1
  /**
2
- * @fileoverview OpenAI OAuth device code flow implementation.
2
+ * @fileoverview OpenAI OAuth PKCE flow — browser-based, like the Codex CLI.
3
3
  *
4
4
  * Uses the same public client ID and endpoints as the Codex CLI to obtain
5
5
  * API access tokens from OpenAI consumer subscriptions (ChatGPT Plus/Pro).
6
6
  *
7
- * Flow:
8
- * 1. POST /deviceauth/usercode { device_auth_id, user_code, interval }
9
- * 2. User visits verification URL and enters the code
10
- * 3. Poll POST /deviceauth/token { authorization_code, code_verifier }
11
- * 4. Exchange POST /oauth/token with grant_type=authorization_code{ access_token, refresh_token }
7
+ * Flow (browser-based PKCE — bypasses Cloudflare challenges):
8
+ * 1. Generate PKCE code_verifier + code_challenge
9
+ * 2. Start a local HTTP server on localhost:1455
10
+ * 3. Open the user's browser to OpenAI's /authorize endpoint
11
+ * 4. User logs in via browserOpenAI redirects to localhost:1455/auth/callback
12
+ * 5. Exchange authorization_code + code_verifier for tokens via /oauth/token
12
13
  *
13
14
  * @module agentos/core/llm/auth/OpenAIOAuthFlow
14
15
  */
@@ -16,19 +17,19 @@ import type { IOAuthFlow, IOAuthTokenStore, OAuthTokenSet } from './types.js';
16
17
  export interface OpenAIOAuthFlowOptions {
17
18
  tokenStore?: IOAuthTokenStore;
18
19
  clientId?: string;
19
- /** Called when the user needs to visit a URL and enter a code. */
20
- onUserCode?: (userCode: string, verificationUrl: string) => void;
20
+ /** Called when the browser is about to open. */
21
+ onBrowserOpen?: (authUrl: string) => void;
21
22
  }
22
23
  export declare class OpenAIOAuthFlow implements IOAuthFlow {
23
24
  readonly providerId = "openai";
24
25
  private readonly store;
25
26
  private readonly clientId;
26
- private readonly onUserCode;
27
+ private readonly onBrowserOpen;
27
28
  private refreshPromise;
28
29
  constructor(opts?: OpenAIOAuthFlowOptions);
29
30
  /**
30
- * Run the device code OAuth flow interactively.
31
- * Displays a user code and waits for the user to authorize.
31
+ * Run the browser-based PKCE OAuth flow.
32
+ * Opens the user's browser, waits for the callback, exchanges for tokens.
32
33
  */
33
34
  authenticate(): Promise<OAuthTokenSet>;
34
35
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAIOAuthFlow.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/auth/OpenAIOAuthFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACd,MAAM,YAAY,CAAC;AAqBpB,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,UAAU,YAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsD;IACjF,OAAO,CAAC,cAAc,CAAuC;gBAEjD,IAAI,CAAC,EAAE,sBAAsB;IAMzC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC;IAsG5C;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAoC5D;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;IAIvC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;CAsBxC"}
1
+ {"version":3,"file":"OpenAIOAuthFlow.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/auth/OpenAIOAuthFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACd,MAAM,YAAY,CAAC;AA2BpB,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,UAAU,YAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;IAC1D,OAAO,CAAC,cAAc,CAAuC;gBAEjD,IAAI,CAAC,EAAE,sBAAsB;IAMzC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC;IA+D5C;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAoC5D;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;IAIvC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;CAsBxC"}
@@ -1,114 +1,99 @@
1
1
  /**
2
- * @fileoverview OpenAI OAuth device code flow implementation.
2
+ * @fileoverview OpenAI OAuth PKCE flow — browser-based, like the Codex CLI.
3
3
  *
4
4
  * Uses the same public client ID and endpoints as the Codex CLI to obtain
5
5
  * API access tokens from OpenAI consumer subscriptions (ChatGPT Plus/Pro).
6
6
  *
7
- * Flow:
8
- * 1. POST /deviceauth/usercode { device_auth_id, user_code, interval }
9
- * 2. User visits verification URL and enters the code
10
- * 3. Poll POST /deviceauth/token { authorization_code, code_verifier }
11
- * 4. Exchange POST /oauth/token with grant_type=authorization_code{ access_token, refresh_token }
7
+ * Flow (browser-based PKCE — bypasses Cloudflare challenges):
8
+ * 1. Generate PKCE code_verifier + code_challenge
9
+ * 2. Start a local HTTP server on localhost:1455
10
+ * 3. Open the user's browser to OpenAI's /authorize endpoint
11
+ * 4. User logs in via browserOpenAI redirects to localhost:1455/auth/callback
12
+ * 5. Exchange authorization_code + code_verifier for tokens via /oauth/token
12
13
  *
13
14
  * @module agentos/core/llm/auth/OpenAIOAuthFlow
14
15
  */
16
+ import { createServer } from 'node:http';
17
+ import { randomBytes, createHash } from 'node:crypto';
15
18
  import { FileTokenStore } from './FileTokenStore.js';
16
19
  /** OpenAI's public Codex CLI client ID. */
17
20
  const OPENAI_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
18
21
  /** OpenAI auth base URL. */
19
22
  const AUTH_BASE_URL = 'https://auth.openai.com';
20
- /** Redirect URI used in the code exchange step. */
21
- const REDIRECT_URI = 'http://localhost:1455/auth/callback';
22
- /** Verification URL shown to the user. */
23
- const VERIFICATION_URL = 'https://platform.openai.com/device';
23
+ /** Local callback server port (same as Codex CLI). */
24
+ const CALLBACK_PORT = 1455;
25
+ /** Redirect URI must match what OpenAI expects for this client ID. */
26
+ const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}/auth/callback`;
27
+ /** Common headers for token exchange requests. */
28
+ const AUTH_HEADERS = {
29
+ 'User-Agent': 'wunderland-cli/1.0 (OpenAI OAuth; +https://wunderland.sh)',
30
+ 'Accept': 'application/json',
31
+ };
24
32
  /** Buffer in ms before expiry to trigger refresh (5 minutes). */
25
33
  const REFRESH_BUFFER_MS = 5 * 60 * 1000;
26
- /** Maximum time to wait for user to authorize (15 minutes). */
27
- const MAX_POLL_DURATION_MS = 15 * 60 * 1000;
34
+ /** Maximum time to wait for user to authorize (10 minutes). */
35
+ const MAX_AUTH_TIMEOUT_MS = 10 * 60 * 1000;
28
36
  export class OpenAIOAuthFlow {
29
37
  constructor(opts) {
30
38
  this.providerId = 'openai';
31
39
  this.refreshPromise = null;
32
40
  this.store = opts?.tokenStore ?? new FileTokenStore();
33
41
  this.clientId = opts?.clientId ?? OPENAI_CLIENT_ID;
34
- this.onUserCode = opts?.onUserCode ?? defaultOnUserCode;
42
+ this.onBrowserOpen = opts?.onBrowserOpen ?? (() => { });
35
43
  }
36
44
  /**
37
- * Run the device code OAuth flow interactively.
38
- * Displays a user code and waits for the user to authorize.
45
+ * Run the browser-based PKCE OAuth flow.
46
+ * Opens the user's browser, waits for the callback, exchanges for tokens.
39
47
  */
40
48
  async authenticate() {
41
- // Step 1: Request device code
42
- const deviceRes = await fetch(`${AUTH_BASE_URL}/deviceauth/usercode`, {
43
- method: 'POST',
44
- headers: { 'Content-Type': 'application/json' },
45
- body: JSON.stringify({ client_id: this.clientId }),
46
- });
47
- if (!deviceRes.ok) {
48
- const body = await deviceRes.text();
49
- throw new Error(`Failed to request device code: ${deviceRes.status} ${body}`);
50
- }
51
- const deviceData = await deviceRes.json();
52
- const { device_auth_id, user_code, interval } = deviceData;
53
- const pollIntervalMs = (interval || 5) * 1000;
54
- // Display code to user
55
- this.onUserCode(user_code, VERIFICATION_URL);
56
- // Step 2: Poll for authorization
57
- const startTime = Date.now();
58
- let authCode;
59
- let codeVerifier;
60
- while (Date.now() - startTime < MAX_POLL_DURATION_MS) {
61
- await sleep(pollIntervalMs);
62
- const pollRes = await fetch(`${AUTH_BASE_URL}/deviceauth/token`, {
49
+ // Step 1: Generate PKCE pair
50
+ const codeVerifier = generateCodeVerifier();
51
+ const codeChallenge = generateCodeChallenge(codeVerifier);
52
+ const state = randomBytes(16).toString('hex');
53
+ // Step 2: Start local callback server
54
+ const { promise: callbackPromise, server } = startCallbackServer(state);
55
+ try {
56
+ // Step 3: Build authorization URL and open browser
57
+ const authUrl = buildAuthUrl(this.clientId, codeChallenge, state);
58
+ this.onBrowserOpen(authUrl);
59
+ // Open the system browser
60
+ await openBrowser(authUrl);
61
+ // Step 4: Wait for the callback with auth code
62
+ const authCode = await Promise.race([
63
+ callbackPromise,
64
+ timeout(MAX_AUTH_TIMEOUT_MS).then(() => {
65
+ throw new Error('OAuth authorization timed out. Please try again.');
66
+ }),
67
+ ]);
68
+ // Step 5: Exchange authorization code for tokens
69
+ const tokenRes = await fetch(`${AUTH_BASE_URL}/oauth/token`, {
63
70
  method: 'POST',
64
- headers: { 'Content-Type': 'application/json' },
65
- body: JSON.stringify({ device_auth_id, user_code }),
71
+ headers: { ...AUTH_HEADERS, 'Content-Type': 'application/x-www-form-urlencoded' },
72
+ body: new URLSearchParams({
73
+ grant_type: 'authorization_code',
74
+ code: authCode,
75
+ redirect_uri: REDIRECT_URI,
76
+ client_id: this.clientId,
77
+ code_verifier: codeVerifier,
78
+ }).toString(),
66
79
  });
67
- if (pollRes.ok) {
68
- const pollData = await pollRes.json();
69
- if (pollData.authorization_code) {
70
- authCode = pollData.authorization_code;
71
- codeVerifier = pollData.code_verifier;
72
- break;
73
- }
74
- }
75
- // 403/428 means "authorization_pending" — keep polling
76
- if (pollRes.status === 403 || pollRes.status === 428) {
77
- continue;
78
- }
79
- // Other errors are fatal
80
- if (!pollRes.ok) {
81
- const body = await pollRes.text();
82
- throw new Error(`Device auth poll failed: ${pollRes.status} ${body}`);
80
+ if (!tokenRes.ok) {
81
+ const body = await tokenRes.text();
82
+ throw new Error(`Token exchange failed: ${tokenRes.status} ${body}`);
83
83
  }
84
+ const tokenData = await tokenRes.json();
85
+ const tokens = {
86
+ accessToken: tokenData.access_token,
87
+ refreshToken: tokenData.refresh_token,
88
+ expiresAt: Date.now() + (tokenData.expires_in ?? 3600) * 1000,
89
+ };
90
+ await this.store.save(this.providerId, tokens);
91
+ return tokens;
84
92
  }
85
- if (!authCode) {
86
- throw new Error('OAuth authorization timed out. Please try again.');
87
- }
88
- // Step 3: Exchange authorization code for tokens
89
- const tokenRes = await fetch(`${AUTH_BASE_URL}/oauth/token`, {
90
- method: 'POST',
91
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
92
- body: new URLSearchParams({
93
- grant_type: 'authorization_code',
94
- code: authCode,
95
- redirect_uri: REDIRECT_URI,
96
- client_id: this.clientId,
97
- ...(codeVerifier ? { code_verifier: codeVerifier } : {}),
98
- }).toString(),
99
- });
100
- if (!tokenRes.ok) {
101
- const body = await tokenRes.text();
102
- throw new Error(`Token exchange failed: ${tokenRes.status} ${body}`);
93
+ finally {
94
+ // Always shut down the callback server
95
+ server.close();
103
96
  }
104
- const tokenData = await tokenRes.json();
105
- const tokens = {
106
- accessToken: tokenData.access_token,
107
- refreshToken: tokenData.refresh_token,
108
- expiresAt: Date.now() + (tokenData.expires_in ?? 3600) * 1000,
109
- };
110
- await this.store.save(this.providerId, tokens);
111
- return tokens;
112
97
  }
113
98
  /**
114
99
  * Refresh an expired access token using the refresh token.
@@ -119,7 +104,7 @@ export class OpenAIOAuthFlow {
119
104
  }
120
105
  const res = await fetch(`${AUTH_BASE_URL}/oauth/token`, {
121
106
  method: 'POST',
122
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
107
+ headers: { ...AUTH_HEADERS, 'Content-Type': 'application/x-www-form-urlencoded' },
123
108
  body: new URLSearchParams({
124
109
  grant_type: 'refresh_token',
125
110
  refresh_token: tokens.refreshToken,
@@ -167,16 +152,98 @@ export class OpenAIOAuthFlow {
167
152
  return refreshed.accessToken;
168
153
  }
169
154
  }
170
- function defaultOnUserCode(userCode, verificationUrl) {
171
- console.log('');
172
- console.log(' To authenticate, visit:');
173
- console.log(` ${verificationUrl}`);
174
- console.log('');
175
- console.log(` Enter code: ${userCode}`);
176
- console.log('');
177
- console.log(' Waiting for authorization...');
155
+ // ── PKCE helpers ────────────────────────────────────────────────────────────
156
+ function generateCodeVerifier() {
157
+ return randomBytes(32).toString('base64url');
158
+ }
159
+ function generateCodeChallenge(verifier) {
160
+ return createHash('sha256').update(verifier).digest('base64url');
161
+ }
162
+ // ── Authorization URL builder ───────────────────────────────────────────────
163
+ function buildAuthUrl(clientId, codeChallenge, state) {
164
+ const params = new URLSearchParams({
165
+ response_type: 'code',
166
+ client_id: clientId,
167
+ redirect_uri: REDIRECT_URI,
168
+ scope: 'openid profile email offline_access',
169
+ state,
170
+ code_challenge: codeChallenge,
171
+ code_challenge_method: 'S256',
172
+ });
173
+ return `${AUTH_BASE_URL}/authorize?${params.toString()}`;
174
+ }
175
+ // ── Local callback server ───────────────────────────────────────────────────
176
+ const SUCCESS_HTML = `<!DOCTYPE html><html><head><title>Wunderland — Authenticated</title>
177
+ <style>body{font-family:system-ui,-apple-system,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#0a0a0f;color:#c9d1d9}
178
+ .card{text-align:center;padding:3rem;border:1px solid #a855f7;border-radius:16px;max-width:420px}
179
+ h1{color:#a855f7;margin:0 0 1rem}p{color:#6b7280;line-height:1.6}
180
+ .check{font-size:3rem;margin-bottom:1rem}</style></head>
181
+ <body><div class="card"><div class="check">✓</div><h1>Authenticated</h1>
182
+ <p>You can close this tab and return to your terminal.</p></div></body></html>`;
183
+ const ERROR_HTML = (msg) => `<!DOCTYPE html><html><head><title>Wunderland — Error</title>
184
+ <style>body{font-family:system-ui,-apple-system,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#0a0a0f;color:#c9d1d9}
185
+ .card{text-align:center;padding:3rem;border:1px solid #ef4444;border-radius:16px;max-width:420px}
186
+ h1{color:#ef4444;margin:0 0 1rem}p{color:#6b7280;line-height:1.6}</style></head>
187
+ <body><div class="card"><h1>Authentication Failed</h1><p>${msg}</p></div></body></html>`;
188
+ function startCallbackServer(expectedState) {
189
+ let resolveCode;
190
+ let rejectCode;
191
+ const promise = new Promise((resolve, reject) => {
192
+ resolveCode = resolve;
193
+ rejectCode = reject;
194
+ });
195
+ const server = createServer((req, res) => {
196
+ const url = new URL(req.url ?? '/', `http://localhost:${CALLBACK_PORT}`);
197
+ if (url.pathname !== '/auth/callback') {
198
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
199
+ res.end('Not found');
200
+ return;
201
+ }
202
+ const code = url.searchParams.get('code');
203
+ const state = url.searchParams.get('state');
204
+ const error = url.searchParams.get('error');
205
+ const errorDescription = url.searchParams.get('error_description');
206
+ if (error) {
207
+ res.writeHead(200, { 'Content-Type': 'text/html' });
208
+ res.end(ERROR_HTML(errorDescription || error));
209
+ rejectCode(new Error(`OAuth error: ${error} — ${errorDescription || 'unknown'}`));
210
+ return;
211
+ }
212
+ if (!code) {
213
+ res.writeHead(400, { 'Content-Type': 'text/html' });
214
+ res.end(ERROR_HTML('No authorization code received.'));
215
+ rejectCode(new Error('No authorization code in callback'));
216
+ return;
217
+ }
218
+ if (state !== expectedState) {
219
+ res.writeHead(400, { 'Content-Type': 'text/html' });
220
+ res.end(ERROR_HTML('State mismatch — possible CSRF attack.'));
221
+ rejectCode(new Error('OAuth state mismatch'));
222
+ return;
223
+ }
224
+ // Success
225
+ res.writeHead(200, { 'Content-Type': 'text/html' });
226
+ res.end(SUCCESS_HTML);
227
+ resolveCode(code);
228
+ });
229
+ server.listen(CALLBACK_PORT, '127.0.0.1');
230
+ return { promise, server };
231
+ }
232
+ // ── Browser opener ──────────────────────────────────────────────────────────
233
+ async function openBrowser(url) {
234
+ const { exec } = await import('node:child_process');
235
+ const { platform } = await import('node:os');
236
+ const cmd = platform() === 'darwin'
237
+ ? `open "${url}"`
238
+ : platform() === 'win32'
239
+ ? `start "" "${url}"`
240
+ : `xdg-open "${url}"`;
241
+ return new Promise((resolve) => {
242
+ exec(cmd, () => resolve());
243
+ });
178
244
  }
179
- function sleep(ms) {
245
+ // ── Utilities ───────────────────────────────────────────────────────────────
246
+ function timeout(ms) {
180
247
  return new Promise((resolve) => setTimeout(resolve, ms));
181
248
  }
182
249
  //# sourceMappingURL=OpenAIOAuthFlow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAIOAuthFlow.js","sourceRoot":"","sources":["../../../../src/core/llm/auth/OpenAIOAuthFlow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OpenAIOAuthFlow.js","sourceRoot":"","sources":["../../../../src/core/llm/auth/OpenAIOAuthFlow.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,10 @@ export { TwitterOAuthFlow } from './TwitterOAuthFlow.js';
12
12
  export type { TwitterOAuthFlowOptions } from './TwitterOAuthFlow.js';
13
13
  export { InstagramOAuthFlow } from './InstagramOAuthFlow.js';
14
14
  export type { InstagramOAuthFlowOptions } from './InstagramOAuthFlow.js';
15
+ export { LinkedInOAuthFlow } from './LinkedInOAuthFlow.js';
16
+ export type { LinkedInOAuthFlowOptions } from './LinkedInOAuthFlow.js';
17
+ export { FacebookOAuthFlow } from './FacebookOAuthFlow.js';
18
+ export type { FacebookOAuthFlowOptions } from './FacebookOAuthFlow.js';
15
19
  export { isTokenValid, openBrowser } from './utils.js';
16
20
  export { startCallbackServer } from './callback-server.js';
17
21
  export type { CallbackResult, CallbackServerOptions } from './callback-server.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACV,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAGzE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACV,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
@@ -8,6 +8,8 @@ export { OpenAIOAuthFlow } from './OpenAIOAuthFlow.js';
8
8
  export { BrowserOAuthFlow } from './BrowserOAuthFlow.js';
9
9
  export { TwitterOAuthFlow } from './TwitterOAuthFlow.js';
10
10
  export { InstagramOAuthFlow } from './InstagramOAuthFlow.js';
11
+ export { LinkedInOAuthFlow } from './LinkedInOAuthFlow.js';
12
+ export { FacebookOAuthFlow } from './FacebookOAuthFlow.js';
11
13
  // Utilities
12
14
  export { isTokenValid, openBrowser } from './utils.js';
13
15
  export { startCallbackServer } from './callback-server.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/llm/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,gCAAgC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/llm/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,gCAAgC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@framers/agentos",
3
- "version": "0.1.40",
3
+ "version": "0.1.42",
4
4
  "description": "Modular AgentOS orchestration library",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",