opencode-deepseek-auth 1.0.1 → 1.0.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGV,aAAa,EACb,YAAY,EAGb,MAAM,SAAS,CAAC;AAqGjB;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,YAAY,aAAa,KACxB,OAAO,CAAC,YAAY,CAgIrB,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGV,aAAa,EACb,YAAY,EAGb,MAAM,SAAS,CAAC;AAqGjB;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,YAAY,aAAa,KACxB,OAAO,CAAC,YAAY,CAuJrB,CAAC"}
package/dist/plugin.js CHANGED
@@ -90,7 +90,8 @@ const DeepSeekAuthPlugin = async ({ client }) => ({
90
90
  provider: constants_1.DEEPSEEK_PROVIDER_ID,
91
91
  loader: async (getAuth, provider) => {
92
92
  const auth = await getAuth();
93
- if (!isOAuthAuth(auth)) {
93
+ // Handle both OAuth-based auth and API key formatted credentials
94
+ if (!isOAuthAuth(auth) && !auth.apiKey) {
94
95
  return null;
95
96
  }
96
97
  // If models are defined in the provider, set cost to 0 to indicate free usage
@@ -101,34 +102,59 @@ const DeepSeekAuthPlugin = async ({ client }) => ({
101
102
  }
102
103
  }
103
104
  }
105
+ // Handle the case where API key contains email:password
106
+ let resolvedAccessToken = "";
107
+ if (auth.apiKey) {
108
+ // Check if API key contains email:password or phone:password format
109
+ const credentialParts = auth.apiKey.split(':');
110
+ if (credentialParts.length === 2) {
111
+ const [identifier, password] = credentialParts;
112
+ // Try to login with these credentials
113
+ const result = await (0, auth_1.loginDeepSeek)(identifier, password);
114
+ if (result.type === "success") {
115
+ resolvedAccessToken = result.access;
116
+ // Cache this for potential future use
117
+ tokenCache.set(identifier, {
118
+ token: result.access,
119
+ expires: result.expires,
120
+ email: result.email || identifier
121
+ });
122
+ }
123
+ else {
124
+ throw new Error(`Failed to authenticate with provided credentials: ${result.error}`);
125
+ }
126
+ }
127
+ else {
128
+ // If it's not in email:password format, assume it's already a valid access token
129
+ resolvedAccessToken = auth.apiKey;
130
+ }
131
+ }
132
+ else if (isOAuthAuth(auth)) {
133
+ // Handle normal OAuth flow
134
+ let authRecord = auth;
135
+ // Check if token has expired and refresh if possible
136
+ if (accessTokenExpired(authRecord)) {
137
+ const refreshed = await refreshAccessToken(authRecord, client);
138
+ if (!refreshed) {
139
+ console.warn("Could not refresh DeepSeek access token");
140
+ return null;
141
+ }
142
+ authRecord = refreshed;
143
+ }
144
+ resolvedAccessToken = authRecord.access;
145
+ if (!resolvedAccessToken) {
146
+ return null;
147
+ }
148
+ }
104
149
  return {
105
- apiKey: "",
150
+ apiKey: resolvedAccessToken || "",
106
151
  async fetch(input, init) {
107
152
  // If this isn't a DeepSeek request, pass through normally
108
153
  if (!isDeepSeekRequest(input)) {
109
154
  return fetch(input, init);
110
155
  }
111
- // Get current auth state
112
- const latestAuth = await getAuth();
113
- if (!isOAuthAuth(latestAuth)) {
114
- return fetch(input, init);
115
- }
116
- let authRecord = latestAuth;
117
- // Check if token has expired and refresh if possible
118
- if (accessTokenExpired(authRecord)) {
119
- const refreshed = await refreshAccessToken(authRecord, client);
120
- if (!refreshed) {
121
- console.warn("Could not refresh DeepSeek access token");
122
- return fetch(input, init);
123
- }
124
- authRecord = refreshed;
125
- }
126
- const accessToken = authRecord.access;
127
- if (!accessToken) {
128
- return fetch(input, init);
129
- }
130
156
  // Prepare the request with proper headers
131
- const { request, init: transformedInit } = prepareDeepSeekRequest(input, init, accessToken);
157
+ const { request, init: transformedInit } = prepareDeepSeekRequest(input, init, resolvedAccessToken);
132
158
  // Make the API call
133
159
  const response = await fetch(request, transformedInit);
134
160
  // Transform response if needed
@@ -139,7 +165,7 @@ const DeepSeekAuthPlugin = async ({ client }) => ({
139
165
  methods: [
140
166
  {
141
167
  label: "Login with DeepSeek Account",
142
- type: "form",
168
+ type: "oauth",
143
169
  authorize: async () => {
144
170
  // Direct credential form for DeepSeek as they don't use standard OAuth
145
171
  const form = {
@@ -190,7 +216,7 @@ const DeepSeekAuthPlugin = async ({ client }) => ({
190
216
  },
191
217
  {
192
218
  provider: constants_1.DEEPSEEK_PROVIDER_ID,
193
- label: "Manually enter API Key",
219
+ label: "Enter credentials (email:password or phone:password)",
194
220
  type: "api",
195
221
  },
196
222
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-deepseek-auth",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Authenticate the Opencode CLI with your DeepSeek account credentials",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/plugin.ts CHANGED
@@ -125,129 +125,152 @@ export const DeepSeekAuthPlugin = async (
125
125
  ): Promise<PluginResult> => ({
126
126
  auth: {
127
127
  provider: DEEPSEEK_PROVIDER_ID,
128
- loader: async (getAuth: GetAuth, provider: Provider): Promise<LoaderResult | null> => {
129
- const auth = await getAuth();
130
- if (!isOAuthAuth(auth)) {
131
- return null;
132
- }
128
+ loader: async (getAuth: GetAuth, provider: Provider): Promise<LoaderResult | null> => {
129
+ const auth = await getAuth();
130
+
131
+ // Handle both OAuth-based auth and API key formatted credentials
132
+ if (!isOAuthAuth(auth) && !auth.apiKey) {
133
+ return null;
134
+ }
135
+
136
+ // If models are defined in the provider, set cost to 0 to indicate free usage
137
+ if (provider.models) {
138
+ for (const model of Object.values(provider.models)) {
139
+ if (model) {
140
+ model.cost = { input: 0, output: 0 };
141
+ }
142
+ }
143
+ }
144
+
145
+ // Handle the case where API key contains email:password
146
+ let resolvedAccessToken = "";
147
+ if (auth.apiKey) {
148
+ // Check if API key contains email:password or phone:password format
149
+ const credentialParts = auth.apiKey.split(':');
150
+ if (credentialParts.length === 2) {
151
+ const [identifier, password] = credentialParts;
152
+ // Try to login with these credentials
153
+ const result = await loginDeepSeek(identifier, password);
154
+ if (result.type === "success") {
155
+ resolvedAccessToken = result.access;
156
+ // Cache this for potential future use
157
+ tokenCache.set(identifier, {
158
+ token: result.access,
159
+ expires: result.expires,
160
+ email: result.email || identifier
161
+ });
162
+ } else {
163
+ throw new Error(`Failed to authenticate with provided credentials: ${result.error}`);
164
+ }
165
+ } else {
166
+ // If it's not in email:password format, assume it's already a valid access token
167
+ resolvedAccessToken = auth.apiKey;
168
+ }
169
+ } else if (isOAuthAuth(auth)) {
170
+ // Handle normal OAuth flow
171
+ let authRecord = auth;
172
+
173
+ // Check if token has expired and refresh if possible
174
+ if (accessTokenExpired(authRecord)) {
175
+ const refreshed = await refreshAccessToken(authRecord, client);
176
+ if (!refreshed) {
177
+ console.warn("Could not refresh DeepSeek access token");
178
+ return null;
179
+ }
180
+ authRecord = refreshed;
181
+ }
182
+
183
+ resolvedAccessToken = authRecord.access;
184
+ if (!resolvedAccessToken) {
185
+ return null;
186
+ }
187
+ }
188
+
189
+ return {
190
+ apiKey: resolvedAccessToken || "",
191
+ async fetch(input: Parameters<typeof fetch>[0], init?: RequestInit) {
192
+ // If this isn't a DeepSeek request, pass through normally
193
+ if (!isDeepSeekRequest(input)) {
194
+ return fetch(input as RequestInfo, init);
195
+ }
196
+
197
+ // Prepare the request with proper headers
198
+ const { request, init: transformedInit } = prepareDeepSeekRequest(
199
+ input,
200
+ init,
201
+ resolvedAccessToken
202
+ );
203
+
204
+ // Make the API call
205
+ const response = await fetch(request, transformedInit);
206
+
207
+ // Transform response if needed
208
+ return transformDeepSeekResponse(response);
209
+ },
210
+ };
211
+ },
212
+ methods: [
213
+ {
214
+ label: "Login with DeepSeek Account",
215
+ type: "oauth",
216
+ authorize: async () => {
217
+ // Direct credential form for DeepSeek as they don't use standard OAuth
218
+ const form: FormConfig = {
219
+ fields: [
220
+ {
221
+ name: "email",
222
+ label: "Email",
223
+ type: "email",
224
+ required: true,
225
+ },
226
+ {
227
+ name: "password",
228
+ label: "Password",
229
+ type: "password",
230
+ required: true,
231
+ }
232
+ ]
233
+ };
234
+
235
+ return {
236
+ url: "https://chat.deepseek.com",
237
+ instructions: "Enter your DeepSeek account credentials below. Your credentials will be stored securely and used for authentication.",
238
+ method: "form",
239
+ form: form,
240
+ callback: async (formData: Record<string, string>): Promise<DeepSeekTokenExchangeResult> => {
241
+ const email = formData.email;
242
+ const password = formData.password;
243
+
244
+ // Validate inputs
245
+ if (!email || !password) {
246
+ return {
247
+ type: "failed",
248
+ error: "Email and password are required for DeepSeek authentication"
249
+ };
250
+ }
133
251
 
134
- // If models are defined in the provider, set cost to 0 to indicate free usage
135
- if (provider.models) {
136
- for (const model of Object.values(provider.models)) {
137
- if (model) {
138
- model.cost = { input: 0, output: 0 };
139
- }
140
- }
141
- }
142
-
143
- return {
144
- apiKey: "",
145
- async fetch(input: Parameters<typeof fetch>[0], init?: RequestInit) {
146
- // If this isn't a DeepSeek request, pass through normally
147
- if (!isDeepSeekRequest(input)) {
148
- return fetch(input as RequestInfo, init);
149
- }
150
-
151
- // Get current auth state
152
- const latestAuth = await getAuth();
153
- if (!isOAuthAuth(latestAuth)) {
154
- return fetch(input as RequestInfo, init);
155
- }
156
-
157
- let authRecord = latestAuth;
158
-
159
- // Check if token has expired and refresh if possible
160
- if (accessTokenExpired(authRecord)) {
161
- const refreshed = await refreshAccessToken(authRecord, client);
162
- if (!refreshed) {
163
- console.warn("Could not refresh DeepSeek access token");
164
- return fetch(input as RequestInfo, init);
165
- }
166
- authRecord = refreshed;
167
- }
168
-
169
- const accessToken = authRecord.access;
170
- if (!accessToken) {
171
- return fetch(input as RequestInfo, init);
172
- }
173
-
174
- // Prepare the request with proper headers
175
- const { request, init: transformedInit } = prepareDeepSeekRequest(
176
- input,
177
- init,
178
- accessToken
179
- );
180
-
181
- // Make the API call
182
- const response = await fetch(request, transformedInit);
183
-
184
- // Transform response if needed
185
- return transformDeepSeekResponse(response);
186
- },
187
- };
188
- },
189
- methods: [
190
- {
191
- label: "Login with DeepSeek Account",
192
- type: "form",
193
- authorize: async () => {
194
- // Direct credential form for DeepSeek as they don't use standard OAuth
195
- const form: FormConfig = {
196
- fields: [
197
- {
198
- name: "email",
199
- label: "Email",
200
- type: "email",
201
- required: true,
202
- },
203
- {
204
- name: "password",
205
- label: "Password",
206
- type: "password",
207
- required: true,
208
- }
209
- ]
210
- };
211
-
212
- return {
213
- url: "https://chat.deepseek.com",
214
- instructions: "Enter your DeepSeek account credentials below. Your credentials will be stored securely and used for authentication.",
215
- method: "form",
216
- form: form,
217
- callback: async (formData: Record<string, string>): Promise<DeepSeekTokenExchangeResult> => {
218
- const email = formData.email;
219
- const password = formData.password;
220
-
221
- // Validate inputs
222
- if (!email || !password) {
223
- return {
224
- type: "failed",
225
- error: "Email and password are required for DeepSeek authentication"
226
- };
227
- }
228
-
229
- // Attempt to log in using the provided credentials
230
- const result = await loginDeepSeek(email, password);
231
-
232
- if (result.type === "success") {
233
- // Cache the token
234
- tokenCache.set(email, {
235
- token: result.access,
236
- expires: result.expires,
237
- email: result.email || email
238
- });
239
- }
240
-
241
- return result;
242
- },
243
- };
244
- },
245
- },
246
- {
247
- provider: DEEPSEEK_PROVIDER_ID,
248
- label: "Manually enter API Key",
249
- type: "api",
250
- },
251
- ],
252
+ // Attempt to log in using the provided credentials
253
+ const result = await loginDeepSeek(email, password);
254
+
255
+ if (result.type === "success") {
256
+ // Cache the token
257
+ tokenCache.set(email, {
258
+ token: result.access,
259
+ expires: result.expires,
260
+ email: result.email || email
261
+ });
262
+ }
263
+
264
+ return result;
265
+ },
266
+ };
267
+ },
268
+ },
269
+ {
270
+ provider: DEEPSEEK_PROVIDER_ID,
271
+ label: "Enter credentials (email:password or phone:password)",
272
+ type: "api",
273
+ },
274
+ ],
252
275
  },
253
276
  });