opencode-qwen-cli-auth 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/LICENSE +21 -0
- package/README.md +162 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth/auth.d.ts +65 -0
- package/dist/lib/auth/auth.d.ts.map +1 -0
- package/dist/lib/auth/auth.js +419 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/browser.d.ts +16 -0
- package/dist/lib/auth/browser.d.ts.map +1 -0
- package/dist/lib/auth/browser.js +37 -0
- package/dist/lib/auth/browser.js.map +1 -0
- package/dist/lib/config.d.ts +28 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +63 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +105 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +105 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/logger.d.ts +33 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +100 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/prompts/fallback/opencode-qwen-prompt.txt +109 -0
- package/dist/lib/prompts/opencode-qwen.d.ts +14 -0
- package/dist/lib/prompts/opencode-qwen.d.ts.map +1 -0
- package/dist/lib/prompts/opencode-qwen.js +121 -0
- package/dist/lib/prompts/opencode-qwen.js.map +1 -0
- package/dist/lib/prompts/qwen-code.d.ts +25 -0
- package/dist/lib/prompts/qwen-code.d.ts.map +1 -0
- package/dist/lib/prompts/qwen-code.js +307 -0
- package/dist/lib/prompts/qwen-code.js.map +1 -0
- package/dist/lib/prompts/qwen-opencode-bridge.d.ts +15 -0
- package/dist/lib/prompts/qwen-opencode-bridge.d.ts.map +1 -0
- package/dist/lib/prompts/qwen-opencode-bridge.js +81 -0
- package/dist/lib/prompts/qwen-opencode-bridge.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +19 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/request/fetch-helpers.js +50 -0
- package/dist/lib/request/fetch-helpers.js.map +1 -0
- package/dist/lib/request/header-utils.d.ts +38 -0
- package/dist/lib/request/header-utils.d.ts.map +1 -0
- package/dist/lib/request/header-utils.js +75 -0
- package/dist/lib/request/header-utils.js.map +1 -0
- package/dist/lib/request/openai-chunk-builder.d.ts +68 -0
- package/dist/lib/request/openai-chunk-builder.d.ts.map +1 -0
- package/dist/lib/request/openai-chunk-builder.js +110 -0
- package/dist/lib/request/openai-chunk-builder.js.map +1 -0
- package/dist/lib/request/payload-analyzer.d.ts +34 -0
- package/dist/lib/request/payload-analyzer.d.ts.map +1 -0
- package/dist/lib/request/payload-analyzer.js +114 -0
- package/dist/lib/request/payload-analyzer.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +39 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -0
- package/dist/lib/request/request-transformer.js +108 -0
- package/dist/lib/request/request-transformer.js.map +1 -0
- package/dist/lib/request/response-handler.d.ts +15 -0
- package/dist/lib/request/response-handler.d.ts.map +1 -0
- package/dist/lib/request/response-handler.js +90 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/request/sse-parser.d.ts +36 -0
- package/dist/lib/request/sse-parser.d.ts.map +1 -0
- package/dist/lib/request/sse-parser.js +85 -0
- package/dist/lib/request/sse-parser.js.map +1 -0
- package/dist/lib/request/stream-normalizer.d.ts +18 -0
- package/dist/lib/request/stream-normalizer.d.ts.map +1 -0
- package/dist/lib/request/stream-normalizer.js +140 -0
- package/dist/lib/request/stream-normalizer.js.map +1 -0
- package/dist/lib/types.d.ts +180 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/package.json +67 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Geoff Hammond
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# opencode-qwen-cli-auth
|
|
2
|
+
OAuth plugin for OpenCode that lets you use Qwen models with your Qwen account, without managing a DashScope API key directly.
|
|
3
|
+
|
|
4
|
+
## Scope
|
|
5
|
+
|
|
6
|
+
- Uses OAuth Device Authorization Grant (RFC 8628) for sign-in.
|
|
7
|
+
- Best suited for personal/dev workflows.
|
|
8
|
+
- For production or commercial workloads, use DashScope API key auth instead:
|
|
9
|
+
https://dashscope.console.aliyun.com/
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- OAuth login through `opencode auth login`.
|
|
14
|
+
- Automatic token refresh before expiration.
|
|
15
|
+
- Dynamic API base URL from token `resource_url` with safe fallback.
|
|
16
|
+
- Model normalization to `coder-model` for Qwen Portal API.
|
|
17
|
+
- Optional prompt bridge behavior via `QWEN_MODE`.
|
|
18
|
+
- Optional debug and request logging via environment variables.
|
|
19
|
+
|
|
20
|
+
## Requirements
|
|
21
|
+
|
|
22
|
+
- Qwen account
|
|
23
|
+
- OpenCode
|
|
24
|
+
- Node.js `>=20` (only required when building/testing from source)
|
|
25
|
+
|
|
26
|
+
## Quick start
|
|
27
|
+
|
|
28
|
+
Add the plugin to your OpenCode config:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"$schema": "https://opencode.ai/config.json",
|
|
33
|
+
"plugin": ["opencode-qwen-cli-auth"],
|
|
34
|
+
"model": "alibaba/coder-model"
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Then sign in:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
opencode auth login
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Choose `Alibaba` -> `Qwen Account (OAuth)`.
|
|
45
|
+
|
|
46
|
+
## Usage
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
opencode run "create a hello world file" --model=alibaba/coder-model
|
|
50
|
+
opencode chat --model=alibaba/coder-model
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Always keep the provider prefix `alibaba/` in model configuration.
|
|
54
|
+
|
|
55
|
+
## Configuration
|
|
56
|
+
|
|
57
|
+
### `QWEN_MODE`
|
|
58
|
+
|
|
59
|
+
Resolution order:
|
|
60
|
+
|
|
61
|
+
1. Environment variable `QWEN_MODE`
|
|
62
|
+
2. File `~/.opencode/qwen/auth-config.json`
|
|
63
|
+
3. Default value: `true`
|
|
64
|
+
|
|
65
|
+
Example `~/.opencode/qwen/auth-config.json`:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"qwenMode": true
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Supported env values:
|
|
74
|
+
|
|
75
|
+
- Enable: `QWEN_MODE=1` or `QWEN_MODE=true`
|
|
76
|
+
- Disable: `QWEN_MODE=0` or `QWEN_MODE=false`
|
|
77
|
+
|
|
78
|
+
## Logging and debug
|
|
79
|
+
|
|
80
|
+
- Enable debug logs:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
DEBUG_QWEN_PLUGIN=1 opencode run "your prompt"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
- Enable request logging to files:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
ENABLE_PLUGIN_REQUEST_LOGGING=1 opencode run "your prompt"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Log path: `~/.opencode/logs/qwen-plugin/`
|
|
93
|
+
|
|
94
|
+
## Local plugin data
|
|
95
|
+
|
|
96
|
+
- OAuth token: `~/.opencode/qwen/oauth_token.json`
|
|
97
|
+
- Plugin config: `~/.opencode/qwen/auth-config.json`
|
|
98
|
+
- Prompt cache: `~/.opencode/cache/`
|
|
99
|
+
|
|
100
|
+
## Troubleshooting
|
|
101
|
+
|
|
102
|
+
### `Authentication required. Please run: opencode auth login`
|
|
103
|
+
|
|
104
|
+
Token is missing or refresh failed. Re-authenticate:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
opencode auth login
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Device authorization timed out
|
|
111
|
+
|
|
112
|
+
The device code expired or was not confirmed in time. Run `opencode auth login` again and confirm in the browser sooner.
|
|
113
|
+
|
|
114
|
+
### `429` rate limit
|
|
115
|
+
|
|
116
|
+
The server is throttling requests. Reduce request frequency and retry later.
|
|
117
|
+
|
|
118
|
+
### Wrong model behavior
|
|
119
|
+
|
|
120
|
+
Ensure your model is set correctly in OpenCode:
|
|
121
|
+
|
|
122
|
+
```yaml
|
|
123
|
+
model: alibaba/coder-model
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Clear auth state
|
|
127
|
+
|
|
128
|
+
- macOS/Linux:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
rm -rf ~/.opencode/qwen/
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
- PowerShell:
|
|
135
|
+
|
|
136
|
+
```powershell
|
|
137
|
+
Remove-Item -Recurse -Force "$HOME/.opencode/qwen"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Then log in again with `opencode auth login`.
|
|
141
|
+
|
|
142
|
+
## Development
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
npm run build
|
|
146
|
+
npm run typecheck
|
|
147
|
+
npm run test
|
|
148
|
+
npm run lint
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Policy and links
|
|
152
|
+
|
|
153
|
+
- Terms of Service: https://qwen.ai/termsservice
|
|
154
|
+
- Privacy Policy: https://qwen.ai/privacypolicy
|
|
155
|
+
- Usage Policy: https://qwen.ai/usagepolicy
|
|
156
|
+
- NPM: https://www.npmjs.com/package/opencode-qwen-cli-auth
|
|
157
|
+
- Repository: https://github.com/TVD-00/opencode-qwen-cli-auth
|
|
158
|
+
- Issues: https://github.com/TVD-00/opencode-qwen-cli-auth/issues
|
|
159
|
+
|
|
160
|
+
## License
|
|
161
|
+
|
|
162
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alibaba Qwen OAuth Authentication Plugin for opencode
|
|
3
|
+
*
|
|
4
|
+
* @license MIT with Usage Disclaimer (see LICENSE file)
|
|
5
|
+
* @repository https://github.com/TVD-00/opencode-qwen-cli-auth
|
|
6
|
+
*/
|
|
7
|
+
import type { Plugin } from "@opencode-ai/plugin";
|
|
8
|
+
/**
|
|
9
|
+
* Alibaba Qwen OAuth authentication plugin for opencode
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```json
|
|
13
|
+
* {
|
|
14
|
+
* "plugin": ["opencode-alibaba-qwen-cli-auth"],
|
|
15
|
+
* "model": "alibaba/coder-model"
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare const QwenAuthPlugin: Plugin;
|
|
20
|
+
export default QwenAuthPlugin;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAoB/D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,EAAE,MA8P5B,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alibaba Qwen OAuth Authentication Plugin for opencode
|
|
3
|
+
*
|
|
4
|
+
* Plugin don gian: chi xu ly OAuth login + tra apiKey/baseURL cho SDK.
|
|
5
|
+
* SDK tu xu ly streaming, headers, request format.
|
|
6
|
+
*
|
|
7
|
+
* @license MIT with Usage Disclaimer (see LICENSE file)
|
|
8
|
+
* @repository https://github.com/TVD-00/opencode-qwen-cli-auth
|
|
9
|
+
*/
|
|
10
|
+
import { createPKCE, requestDeviceCode, pollForToken, getApiBaseUrl, saveToken, refreshAccessToken, loadStoredToken } from "./lib/auth/auth.js";
|
|
11
|
+
import { PROVIDER_ID, AUTH_LABELS, DEVICE_FLOW } from "./lib/constants.js";
|
|
12
|
+
import { logError, logInfo, LOGGING_ENABLED } from "./lib/logger.js";
|
|
13
|
+
/**
|
|
14
|
+
* Lay access token hop le tu SDK auth state, refresh neu het han
|
|
15
|
+
* Dung getAuth() cua SDK thay vi doc file truc tiep
|
|
16
|
+
*
|
|
17
|
+
* @param getAuth - Ham lay auth state tu SDK
|
|
18
|
+
* @returns access token hoac null
|
|
19
|
+
*/
|
|
20
|
+
async function getValidAccessToken(getAuth) {
|
|
21
|
+
const auth = await getAuth();
|
|
22
|
+
if (!auth || auth.type !== "oauth") {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
let accessToken = auth.access;
|
|
26
|
+
// Refresh neu het han (buffer 60 giay)
|
|
27
|
+
if (accessToken && auth.expires && Date.now() > auth.expires - 60000 && auth.refresh) {
|
|
28
|
+
try {
|
|
29
|
+
const refreshResult = await refreshAccessToken(auth.refresh);
|
|
30
|
+
if (refreshResult.type === "success") {
|
|
31
|
+
accessToken = refreshResult.access;
|
|
32
|
+
saveToken(refreshResult);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (LOGGING_ENABLED) {
|
|
36
|
+
logError("Token refresh failed");
|
|
37
|
+
}
|
|
38
|
+
accessToken = undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
if (LOGGING_ENABLED) {
|
|
43
|
+
logError("Token refresh error:", e);
|
|
44
|
+
}
|
|
45
|
+
accessToken = undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return accessToken ?? null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Lay base URL tu token luu tren disk (resource_url)
|
|
52
|
+
* Fallback ve portal.qwen.ai/v1 neu khong co
|
|
53
|
+
*/
|
|
54
|
+
function getBaseUrl() {
|
|
55
|
+
try {
|
|
56
|
+
const stored = loadStoredToken();
|
|
57
|
+
if (stored?.resource_url) {
|
|
58
|
+
return getApiBaseUrl(stored.resource_url);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (_) {
|
|
62
|
+
// Loi doc file, dung default
|
|
63
|
+
}
|
|
64
|
+
return getApiBaseUrl();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Alibaba Qwen OAuth authentication plugin for opencode
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```json
|
|
71
|
+
* {
|
|
72
|
+
* "plugin": ["opencode-alibaba-qwen-cli-auth"],
|
|
73
|
+
* "model": "alibaba/coder-model"
|
|
74
|
+
* }
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export const QwenAuthPlugin = async (_input) => {
|
|
78
|
+
return {
|
|
79
|
+
auth: {
|
|
80
|
+
provider: PROVIDER_ID,
|
|
81
|
+
/**
|
|
82
|
+
* Loader: lay token + base URL, tra ve cho SDK
|
|
83
|
+
* Khong can custom fetch - SDK tu xu ly streaming va headers
|
|
84
|
+
*/
|
|
85
|
+
async loader(getAuth, provider) {
|
|
86
|
+
const auth = await getAuth();
|
|
87
|
+
// Chi xu ly OAuth, bo qua API key auth
|
|
88
|
+
if (auth.type !== "oauth") {
|
|
89
|
+
return {};
|
|
90
|
+
}
|
|
91
|
+
const accessToken = await getValidAccessToken(getAuth);
|
|
92
|
+
if (!accessToken) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const baseUrl = getBaseUrl();
|
|
96
|
+
// Tra ve apiKey + baseURL, SDK tu xu ly phan con lai
|
|
97
|
+
return {
|
|
98
|
+
apiKey: accessToken,
|
|
99
|
+
baseURL: baseUrl,
|
|
100
|
+
};
|
|
101
|
+
},
|
|
102
|
+
methods: [
|
|
103
|
+
{
|
|
104
|
+
label: AUTH_LABELS.OAUTH,
|
|
105
|
+
type: "oauth",
|
|
106
|
+
/**
|
|
107
|
+
* Device Authorization Grant OAuth flow (RFC 8628)
|
|
108
|
+
*/
|
|
109
|
+
authorize: async () => {
|
|
110
|
+
// Generate PKCE
|
|
111
|
+
const pkce = await createPKCE();
|
|
112
|
+
// Request device code
|
|
113
|
+
const deviceAuth = await requestDeviceCode(pkce);
|
|
114
|
+
if (!deviceAuth) {
|
|
115
|
+
throw new Error("Failed to request device code");
|
|
116
|
+
}
|
|
117
|
+
// Hien thi user code
|
|
118
|
+
console.log(`\nPlease visit: ${deviceAuth.verification_uri}`);
|
|
119
|
+
console.log(`And enter code: ${deviceAuth.user_code}\n`);
|
|
120
|
+
// URL xac thuc - SDK se tu mo browser khi method=auto
|
|
121
|
+
const verificationUrl = deviceAuth.verification_uri_complete || deviceAuth.verification_uri;
|
|
122
|
+
return {
|
|
123
|
+
url: verificationUrl,
|
|
124
|
+
method: "auto",
|
|
125
|
+
instructions: AUTH_LABELS.INSTRUCTIONS,
|
|
126
|
+
callback: async () => {
|
|
127
|
+
// Poll for token
|
|
128
|
+
let pollInterval = (deviceAuth.interval || 5) * 1000;
|
|
129
|
+
const POLLING_MARGIN_MS = 3000;
|
|
130
|
+
const maxInterval = DEVICE_FLOW.MAX_POLL_INTERVAL;
|
|
131
|
+
const startTime = Date.now();
|
|
132
|
+
const expiresIn = deviceAuth.expires_in * 1000;
|
|
133
|
+
while (Date.now() - startTime < expiresIn) {
|
|
134
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval + POLLING_MARGIN_MS));
|
|
135
|
+
const result = await pollForToken(deviceAuth.device_code, pkce.verifier);
|
|
136
|
+
if (result.type === "success") {
|
|
137
|
+
saveToken(result);
|
|
138
|
+
// Tra ve cho SDK luu auth state
|
|
139
|
+
return {
|
|
140
|
+
type: "success",
|
|
141
|
+
access: result.access,
|
|
142
|
+
refresh: result.refresh,
|
|
143
|
+
expires: result.expires,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (result.type === "slow_down") {
|
|
147
|
+
pollInterval = Math.min(pollInterval + 5000, maxInterval);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (result.type === "pending") {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
// denied, expired, failed -> dung lai
|
|
154
|
+
return { type: "failed" };
|
|
155
|
+
}
|
|
156
|
+
console.error("[qwen-oauth-plugin] Device authorization timed out");
|
|
157
|
+
return { type: "failed" };
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
export default QwenAuthPlugin;
|
|
167
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { PKCEPair, DeviceAuthorizationResponse, TokenResult, StoredTokenData } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Request device authorization code
|
|
4
|
+
* @param pkce - PKCE challenge/verifier pair
|
|
5
|
+
* @returns Device authorization response with user code and verification URL
|
|
6
|
+
*/
|
|
7
|
+
export declare function requestDeviceCode(pkce: PKCEPair): Promise<DeviceAuthorizationResponse | null>;
|
|
8
|
+
/**
|
|
9
|
+
* Poll for token using device code
|
|
10
|
+
* @param deviceCode - Device code from authorization response
|
|
11
|
+
* @param verifier - PKCE verifier
|
|
12
|
+
* @param interval - Polling interval in seconds (from device response)
|
|
13
|
+
* @returns Token result or null if still pending
|
|
14
|
+
*/
|
|
15
|
+
export declare function pollForToken(deviceCode: string, verifier: string, interval?: number): Promise<TokenResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Refresh access token using refresh token
|
|
18
|
+
* @param refreshToken - Refresh token
|
|
19
|
+
* @returns Token result
|
|
20
|
+
*/
|
|
21
|
+
export declare function refreshAccessToken(refreshToken: string): Promise<TokenResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Generate PKCE challenge and verifier
|
|
24
|
+
* @returns PKCE pair
|
|
25
|
+
*/
|
|
26
|
+
export declare function createPKCE(): Promise<PKCEPair>;
|
|
27
|
+
/**
|
|
28
|
+
* Load stored token from disk
|
|
29
|
+
* @returns Stored token data or null if not found
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadStoredToken(): StoredTokenData | null;
|
|
32
|
+
/**
|
|
33
|
+
* Xoa token luu tren disk khi token khong con hop le
|
|
34
|
+
*/
|
|
35
|
+
export declare function clearStoredToken(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Save token to disk
|
|
38
|
+
* @param tokenResult - Token result from OAuth flow
|
|
39
|
+
*/
|
|
40
|
+
export declare function saveToken(tokenResult: TokenResult): void;
|
|
41
|
+
/**
|
|
42
|
+
* Check if token is expired (with 5 minute buffer)
|
|
43
|
+
* @param expiresAt - Expiration timestamp in milliseconds
|
|
44
|
+
* @returns True if token is expired or will expire soon
|
|
45
|
+
*/
|
|
46
|
+
export declare function isTokenExpired(expiresAt: number): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Get valid access token, refreshing if necessary
|
|
49
|
+
* @returns Access token and resource URL, or null if authentication required
|
|
50
|
+
*/
|
|
51
|
+
export declare function getValidToken(): Promise<{
|
|
52
|
+
accessToken: string;
|
|
53
|
+
resourceUrl?: string;
|
|
54
|
+
} | null>;
|
|
55
|
+
/**
|
|
56
|
+
* Get Portal API base URL from token or use default
|
|
57
|
+
* @param resourceUrl - Resource URL from token (optional)
|
|
58
|
+
* @returns Portal API base URL
|
|
59
|
+
*
|
|
60
|
+
* IMPORTANT: Portal API uses /v1 path (not /api/v1)
|
|
61
|
+
* - OAuth endpoints: /api/v1/oauth2/ (for authentication)
|
|
62
|
+
* - Chat API: /v1/ (for completions)
|
|
63
|
+
*/
|
|
64
|
+
export declare function getApiBaseUrl(resourceUrl?: string): string;
|
|
65
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../lib/auth/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,2BAA2B,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAgEvG;;;;GAIG;AACH,wBAAsB,iBAAiB,CACtC,IAAI,EAAE,QAAQ,GACZ,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CA6C7C;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CA4EtB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2DnF;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC,CAGpD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,eAAe,GAAG,IAAI,CAsBxD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CA8BxD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CAAC,CAiCR;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAoC1D"}
|