@oharness/engine 0.1.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/dist/agent/agent.d.ts +196 -0
- package/dist/agent/agent.js +758 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/compaction.d.ts +68 -0
- package/dist/agent/compaction.js +179 -0
- package/dist/agent/compaction.js.map +1 -0
- package/dist/agent/hooks.d.ts +77 -0
- package/dist/agent/hooks.js +152 -0
- package/dist/agent/hooks.js.map +1 -0
- package/dist/agent/memory.d.ts +45 -0
- package/dist/agent/memory.js +147 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/overflow.d.ts +35 -0
- package/dist/agent/overflow.js +69 -0
- package/dist/agent/overflow.js.map +1 -0
- package/dist/agent/permissions.d.ts +181 -0
- package/dist/agent/permissions.js +289 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/agent/prompt.d.ts +25 -0
- package/dist/agent/prompt.js +63 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/agent/session.d.ts +108 -0
- package/dist/agent/session.js +231 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/agent/settings.d.ts +37 -0
- package/dist/agent/settings.js +113 -0
- package/dist/agent/settings.js.map +1 -0
- package/dist/agent/skills.d.ts +58 -0
- package/dist/agent/skills.js +225 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/store.d.ts +308 -0
- package/dist/agent/store.js +596 -0
- package/dist/agent/store.js.map +1 -0
- package/dist/agent/subagent.d.ts +44 -0
- package/dist/agent/subagent.js +138 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/agent/titles.d.ts +8 -0
- package/dist/agent/titles.js +23 -0
- package/dist/agent/titles.js.map +1 -0
- package/dist/agent/workspace.d.ts +60 -0
- package/dist/agent/workspace.js +156 -0
- package/dist/agent/workspace.js.map +1 -0
- package/dist/artifacts/publish.d.ts +94 -0
- package/dist/artifacts/publish.js +104 -0
- package/dist/artifacts/publish.js.map +1 -0
- package/dist/artifacts/store.d.ts +324 -0
- package/dist/artifacts/store.js +500 -0
- package/dist/artifacts/store.js.map +1 -0
- package/dist/auth/index.d.ts +13 -0
- package/dist/auth/index.js +10 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/manager.d.ts +83 -0
- package/dist/auth/manager.js +266 -0
- package/dist/auth/manager.js.map +1 -0
- package/dist/auth/oauth.d.ts +83 -0
- package/dist/auth/oauth.js +327 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/providers/account.d.ts +59 -0
- package/dist/auth/providers/account.js +282 -0
- package/dist/auth/providers/account.js.map +1 -0
- package/dist/auth/providers/anthropic.d.ts +24 -0
- package/dist/auth/providers/anthropic.js +209 -0
- package/dist/auth/providers/anthropic.js.map +1 -0
- package/dist/auth/providers/generic.d.ts +57 -0
- package/dist/auth/providers/generic.js +155 -0
- package/dist/auth/providers/generic.js.map +1 -0
- package/dist/auth/providers/official.d.ts +3 -0
- package/dist/auth/providers/official.js +90 -0
- package/dist/auth/providers/official.js.map +1 -0
- package/dist/auth/providers/ottoport.d.ts +3 -0
- package/dist/auth/providers/ottoport.js +60 -0
- package/dist/auth/providers/ottoport.js.map +1 -0
- package/dist/auth/store.d.ts +22 -0
- package/dist/auth/store.js +138 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/auth/types.d.ts +167 -0
- package/dist/auth/types.js +16 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/config.d.ts +197 -0
- package/dist/config.js +195 -0
- package/dist/config.js.map +1 -0
- package/dist/core/errors.d.ts +46 -0
- package/dist/core/errors.js +83 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/tokens.d.ts +12 -0
- package/dist/core/tokens.js +56 -0
- package/dist/core/tokens.js.map +1 -0
- package/dist/core/types.d.ts +91 -0
- package/dist/core/types.js +49 -0
- package/dist/core/types.js.map +1 -0
- package/dist/harness.d.ts +302 -0
- package/dist/harness.js +695 -0
- package/dist/harness.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +55 -0
- package/dist/mcp/client.js +199 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/index.d.ts +13 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +77 -0
- package/dist/mcp/manager.js +325 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/oauth.d.ts +63 -0
- package/dist/mcp/oauth.js +302 -0
- package/dist/mcp/oauth.js.map +1 -0
- package/dist/mcp/protocol.d.ts +130 -0
- package/dist/mcp/protocol.js +14 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/registry.d.ts +52 -0
- package/dist/mcp/registry.js +100 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/registry.json +293 -0
- package/dist/mcp/secrets.d.ts +20 -0
- package/dist/mcp/secrets.js +75 -0
- package/dist/mcp/secrets.js.map +1 -0
- package/dist/mcp/transport.d.ts +51 -0
- package/dist/mcp/transport.js +158 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/paths.d.ts +37 -0
- package/dist/paths.js +63 -0
- package/dist/paths.js.map +1 -0
- package/dist/plugins.d.ts +55 -0
- package/dist/plugins.js +201 -0
- package/dist/plugins.js.map +1 -0
- package/dist/providers/builtin.d.ts +23 -0
- package/dist/providers/builtin.js +141 -0
- package/dist/providers/builtin.js.map +1 -0
- package/dist/providers/catalog.d.ts +129 -0
- package/dist/providers/catalog.js +254 -0
- package/dist/providers/catalog.js.map +1 -0
- package/dist/providers/catalog.json +472 -0
- package/dist/providers/discovery.d.ts +16 -0
- package/dist/providers/discovery.js +161 -0
- package/dist/providers/discovery.js.map +1 -0
- package/dist/providers/http.d.ts +24 -0
- package/dist/providers/http.js +139 -0
- package/dist/providers/http.js.map +1 -0
- package/dist/providers/index.d.ts +10 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/piai.d.ts +124 -0
- package/dist/providers/piai.js +551 -0
- package/dist/providers/piai.js.map +1 -0
- package/dist/providers/registry.d.ts +65 -0
- package/dist/providers/registry.js +195 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/resilient.d.ts +46 -0
- package/dist/providers/resilient.js +117 -0
- package/dist/providers/resilient.js.map +1 -0
- package/dist/providers/types.d.ts +182 -0
- package/dist/providers/types.js +50 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/schedule/cron.d.ts +35 -0
- package/dist/schedule/cron.js +125 -0
- package/dist/schedule/cron.js.map +1 -0
- package/dist/schedule/scheduler.d.ts +87 -0
- package/dist/schedule/scheduler.js +237 -0
- package/dist/schedule/scheduler.js.map +1 -0
- package/dist/storage/kv.d.ts +56 -0
- package/dist/storage/kv.js +173 -0
- package/dist/storage/kv.js.map +1 -0
- package/dist/storage/migrate.d.ts +11 -0
- package/dist/storage/migrate.js +93 -0
- package/dist/storage/migrate.js.map +1 -0
- package/dist/storage/project.d.ts +9 -0
- package/dist/storage/project.js +57 -0
- package/dist/storage/project.js.map +1 -0
- package/dist/storage/records.d.ts +32 -0
- package/dist/storage/records.js +48 -0
- package/dist/storage/records.js.map +1 -0
- package/dist/sync/client.d.ts +79 -0
- package/dist/sync/client.js +118 -0
- package/dist/sync/client.js.map +1 -0
- package/dist/sync/mirror.d.ts +85 -0
- package/dist/sync/mirror.js +389 -0
- package/dist/sync/mirror.js.map +1 -0
- package/dist/sync/protocol.d.ts +67 -0
- package/dist/sync/protocol.js +16 -0
- package/dist/sync/protocol.js.map +1 -0
- package/dist/sync/settings.d.ts +56 -0
- package/dist/sync/settings.js +60 -0
- package/dist/sync/settings.js.map +1 -0
- package/dist/tools/builtin/artifact.d.ts +16 -0
- package/dist/tools/builtin/artifact.js +134 -0
- package/dist/tools/builtin/artifact.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +3 -0
- package/dist/tools/builtin/bash.js +142 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/fs.d.ts +19 -0
- package/dist/tools/builtin/fs.js +280 -0
- package/dist/tools/builtin/fs.js.map +1 -0
- package/dist/tools/builtin/index.d.ts +22 -0
- package/dist/tools/builtin/index.js +42 -0
- package/dist/tools/builtin/index.js.map +1 -0
- package/dist/tools/builtin/mcp-resource.d.ts +3 -0
- package/dist/tools/builtin/mcp-resource.js +220 -0
- package/dist/tools/builtin/mcp-resource.js.map +1 -0
- package/dist/tools/builtin/memory.d.ts +10 -0
- package/dist/tools/builtin/memory.js +76 -0
- package/dist/tools/builtin/memory.js.map +1 -0
- package/dist/tools/builtin/recall.d.ts +13 -0
- package/dist/tools/builtin/recall.js +163 -0
- package/dist/tools/builtin/recall.js.map +1 -0
- package/dist/tools/builtin/search.d.ts +3 -0
- package/dist/tools/builtin/search.js +240 -0
- package/dist/tools/builtin/search.js.map +1 -0
- package/dist/tools/builtin/skill.d.ts +10 -0
- package/dist/tools/builtin/skill.js +46 -0
- package/dist/tools/builtin/skill.js.map +1 -0
- package/dist/tools/builtin/task.d.ts +9 -0
- package/dist/tools/builtin/task.js +68 -0
- package/dist/tools/builtin/task.js.map +1 -0
- package/dist/tools/builtin/todo.d.ts +20 -0
- package/dist/tools/builtin/todo.js +63 -0
- package/dist/tools/builtin/todo.js.map +1 -0
- package/dist/tools/define.d.ts +19 -0
- package/dist/tools/define.js +39 -0
- package/dist/tools/define.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +39 -0
- package/dist/tools/registry.js +101 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +112 -0
- package/dist/tools/types.js +22 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/util/id.d.ts +9 -0
- package/dist/util/id.js +19 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/json.d.ts +25 -0
- package/dist/util/json.js +100 -0
- package/dist/util/json.js.map +1 -0
- package/dist/util/jwt.d.ts +74 -0
- package/dist/util/jwt.js +177 -0
- package/dist/util/jwt.js.map +1 -0
- package/dist/util/logger.d.ts +13 -0
- package/dist/util/logger.js +59 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/queue.d.ts +26 -0
- package/dist/util/queue.js +106 -0
- package/dist/util/queue.js.map +1 -0
- package/dist/util/schema.d.ts +17 -0
- package/dist/util/schema.js +98 -0
- package/dist/util/schema.js.map +1 -0
- package/dist/util/shell.d.ts +20 -0
- package/dist/util/shell.js +24 -0
- package/dist/util/shell.js.map +1 -0
- package/official.json +4 -0
- package/package.json +38 -0
- package/skills/artifact-authoring/SKILL.md +81 -0
- package/skills/canvas/SKILL.md +85 -0
- package/skills/skill-authoring/SKILL.md +85 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { errorMessage } from "../core/errors.js";
|
|
2
|
+
import { createLogger } from "../util/logger.js";
|
|
3
|
+
import { anthropicAuth } from "./providers/anthropic.js";
|
|
4
|
+
import { officialAuth } from "./providers/official.js";
|
|
5
|
+
import { ottoportAuth } from "./providers/ottoport.js";
|
|
6
|
+
import { apiKeyProvider } from "./providers/generic.js";
|
|
7
|
+
import { AuthStore } from "./store.js";
|
|
8
|
+
import { isExpired } from "./types.js";
|
|
9
|
+
export const BUILTIN_AUTH_PROVIDERS = [
|
|
10
|
+
officialAuth,
|
|
11
|
+
anthropicAuth,
|
|
12
|
+
ottoportAuth,
|
|
13
|
+
apiKeyProvider({
|
|
14
|
+
id: "openai",
|
|
15
|
+
label: "OpenAI",
|
|
16
|
+
envVars: ["OPENAI_API_KEY"],
|
|
17
|
+
placeholder: "sk-…",
|
|
18
|
+
}),
|
|
19
|
+
apiKeyProvider({
|
|
20
|
+
id: "google",
|
|
21
|
+
label: "Google Gemini",
|
|
22
|
+
envVars: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
|
|
23
|
+
header: "x-goog-api-key",
|
|
24
|
+
format: (key) => key,
|
|
25
|
+
}),
|
|
26
|
+
];
|
|
27
|
+
/**
|
|
28
|
+
* Owns credentials: stores them, resolves them per request, and refreshes
|
|
29
|
+
* OAuth tokens before they expire.
|
|
30
|
+
*
|
|
31
|
+
* Refresh is in-flight-deduplicated. Without that, a turn issuing several
|
|
32
|
+
* parallel tool calls fires several simultaneous refreshes, and providers that
|
|
33
|
+
* rotate the refresh token on use will invalidate each other's result.
|
|
34
|
+
*/
|
|
35
|
+
export class AuthManager {
|
|
36
|
+
store;
|
|
37
|
+
providers = new Map();
|
|
38
|
+
logger;
|
|
39
|
+
refreshing = new Map();
|
|
40
|
+
constructor(opts = {}) {
|
|
41
|
+
this.store = opts.store ?? new AuthStore();
|
|
42
|
+
this.logger = (opts.logger ?? createLogger("auth")).child("manager");
|
|
43
|
+
for (const provider of opts.providers ?? BUILTIN_AUTH_PROVIDERS)
|
|
44
|
+
this.register(provider);
|
|
45
|
+
}
|
|
46
|
+
register(provider) {
|
|
47
|
+
this.providers.set(provider.id, provider);
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
get(providerId) {
|
|
51
|
+
return this.providers.get(providerId);
|
|
52
|
+
}
|
|
53
|
+
list() {
|
|
54
|
+
return [...this.providers.values()];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve credentials for a request. Safe to call on every request — that is
|
|
58
|
+
* the point, since a token valid at startup may not be valid an hour later.
|
|
59
|
+
*/
|
|
60
|
+
async resolve(ctx) {
|
|
61
|
+
const provider = this.providers.get(ctx.providerId);
|
|
62
|
+
if (!provider)
|
|
63
|
+
return undefined;
|
|
64
|
+
let credential = await this.store.get(ctx.providerId);
|
|
65
|
+
if (credential?.type === "oauth" && isExpired(credential) && provider.refresh) {
|
|
66
|
+
credential = (await this.refreshOnce(ctx.providerId, provider, credential)) ?? credential;
|
|
67
|
+
}
|
|
68
|
+
if (!provider.loader)
|
|
69
|
+
return undefined;
|
|
70
|
+
try {
|
|
71
|
+
return await provider.loader(credential, ctx);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
this.logger.warn("credential resolution failed", {
|
|
75
|
+
provider: ctx.providerId,
|
|
76
|
+
error: errorMessage(err),
|
|
77
|
+
});
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The current access token for an OAuth provider, refreshed if it has run
|
|
83
|
+
* out.
|
|
84
|
+
*
|
|
85
|
+
* Separate from `resolve` because the caller wants the token itself rather
|
|
86
|
+
* than the headers a model request would carry — sync sends it to a server
|
|
87
|
+
* that is not a model provider, and digging it back out of a header would
|
|
88
|
+
* depend on how that provider happens to spell authorization today.
|
|
89
|
+
*
|
|
90
|
+
* Read per use, never held: these last an hour, and something that cached
|
|
91
|
+
* one would work until it silently did not.
|
|
92
|
+
*/
|
|
93
|
+
async accessToken(providerId) {
|
|
94
|
+
const provider = this.providers.get(providerId);
|
|
95
|
+
if (!provider)
|
|
96
|
+
return undefined;
|
|
97
|
+
let credential = await this.store.get(providerId);
|
|
98
|
+
if (credential?.type !== "oauth")
|
|
99
|
+
return undefined;
|
|
100
|
+
if (isExpired(credential) && provider.refresh) {
|
|
101
|
+
credential = (await this.refreshOnce(providerId, provider, credential)) ?? credential;
|
|
102
|
+
}
|
|
103
|
+
return credential.type === "oauth" && !isExpired(credential) ? credential.access : undefined;
|
|
104
|
+
}
|
|
105
|
+
/** Whether a provider has usable credentials, without making a request. */
|
|
106
|
+
async isAuthenticated(providerId) {
|
|
107
|
+
const resolved = await this.resolve({ providerId });
|
|
108
|
+
return resolved !== undefined;
|
|
109
|
+
}
|
|
110
|
+
async status() {
|
|
111
|
+
const out = [];
|
|
112
|
+
for (const provider of this.providers.values()) {
|
|
113
|
+
const credential = await this.store.get(provider.id);
|
|
114
|
+
const resolved = await this.resolve({ providerId: provider.id });
|
|
115
|
+
out.push({
|
|
116
|
+
providerId: provider.id,
|
|
117
|
+
label: provider.label,
|
|
118
|
+
authenticated: resolved !== undefined,
|
|
119
|
+
source: resolved?.source,
|
|
120
|
+
expiresAt: credential?.type === "oauth" ? credential.expires : undefined,
|
|
121
|
+
methods: provider.methods.map((method, index) => ({
|
|
122
|
+
index,
|
|
123
|
+
type: method.type,
|
|
124
|
+
label: method.label,
|
|
125
|
+
})),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Which prompts apply given the answers collected so far. Conditional
|
|
132
|
+
* prompts let one method cover, say, public vs enterprise deployments
|
|
133
|
+
* without the CLI knowing anything about either.
|
|
134
|
+
*/
|
|
135
|
+
promptsFor(method, answers = {}) {
|
|
136
|
+
return (method.prompts ?? []).filter((prompt) => {
|
|
137
|
+
if (!prompt.when)
|
|
138
|
+
return true;
|
|
139
|
+
const actual = answers[prompt.when.key];
|
|
140
|
+
return prompt.when.op === "eq"
|
|
141
|
+
? actual === prompt.when.value
|
|
142
|
+
: actual !== prompt.when.value;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/** Validate collected answers. Returns the first failure, if any. */
|
|
146
|
+
validate(method, answers) {
|
|
147
|
+
for (const prompt of this.promptsFor(method, answers)) {
|
|
148
|
+
if (prompt.type !== "text" || !prompt.validate)
|
|
149
|
+
continue;
|
|
150
|
+
const value = answers[prompt.key];
|
|
151
|
+
if (value === undefined)
|
|
152
|
+
continue;
|
|
153
|
+
const error = prompt.validate(value);
|
|
154
|
+
if (error)
|
|
155
|
+
return { field: prompt.key, message: error };
|
|
156
|
+
}
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
/** Begin an OAuth login. The caller drives the returned flow. */
|
|
160
|
+
async authorize(providerId, methodIndex, answers = {}) {
|
|
161
|
+
const { provider, method } = this.methodAt(providerId, methodIndex);
|
|
162
|
+
if (method.type !== "oauth") {
|
|
163
|
+
throw new Error(`method ${methodIndex} of ${provider.id} is not an OAuth method`);
|
|
164
|
+
}
|
|
165
|
+
const invalid = this.validate(method, answers);
|
|
166
|
+
if (invalid)
|
|
167
|
+
throw new Error(`${invalid.field}: ${invalid.message}`);
|
|
168
|
+
return method.authorize(answers);
|
|
169
|
+
}
|
|
170
|
+
/** Complete an API-key login (or an OAuth method's non-interactive variant). */
|
|
171
|
+
async submit(providerId, methodIndex, answers) {
|
|
172
|
+
const { provider, method } = this.methodAt(providerId, methodIndex);
|
|
173
|
+
const invalid = this.validate(method, answers);
|
|
174
|
+
if (invalid)
|
|
175
|
+
throw new Error(`${invalid.field}: ${invalid.message}`);
|
|
176
|
+
if (method.type === "api" && method.authorize) {
|
|
177
|
+
const result = await method.authorize(answers);
|
|
178
|
+
if (result.type !== "success") {
|
|
179
|
+
throw new Error(result.error ?? "authentication failed");
|
|
180
|
+
}
|
|
181
|
+
return this.persist(provider.id, result);
|
|
182
|
+
}
|
|
183
|
+
if (method.type === "api") {
|
|
184
|
+
const key = answers["key"];
|
|
185
|
+
if (!key)
|
|
186
|
+
throw new Error("no key provided");
|
|
187
|
+
const metadata = Object.fromEntries(Object.entries(answers).filter(([field]) => field !== "key"));
|
|
188
|
+
const credential = {
|
|
189
|
+
type: "api",
|
|
190
|
+
key,
|
|
191
|
+
...(Object.keys(metadata).length ? { metadata } : {}),
|
|
192
|
+
};
|
|
193
|
+
await this.store.set(provider.id, credential);
|
|
194
|
+
return credential;
|
|
195
|
+
}
|
|
196
|
+
throw new Error(`method ${methodIndex} of ${provider.id} requires the OAuth flow`);
|
|
197
|
+
}
|
|
198
|
+
/** Store the result of a completed OAuth callback. */
|
|
199
|
+
async complete(providerId, result) {
|
|
200
|
+
if (result.type !== "success") {
|
|
201
|
+
throw new Error(result.error ?? "authentication failed");
|
|
202
|
+
}
|
|
203
|
+
return this.persist(providerId, result);
|
|
204
|
+
}
|
|
205
|
+
async logout(providerId) {
|
|
206
|
+
return this.store.remove(providerId);
|
|
207
|
+
}
|
|
208
|
+
async persist(providerId, result) {
|
|
209
|
+
const credential = "access" in result
|
|
210
|
+
? {
|
|
211
|
+
type: "oauth",
|
|
212
|
+
access: result.access,
|
|
213
|
+
refresh: result.refresh,
|
|
214
|
+
expires: result.expires,
|
|
215
|
+
...(result.accountId ? { accountId: result.accountId } : {}),
|
|
216
|
+
...(result.baseUrl ? { baseUrl: result.baseUrl } : {}),
|
|
217
|
+
...(result.metadata ? { metadata: result.metadata } : {}),
|
|
218
|
+
}
|
|
219
|
+
: {
|
|
220
|
+
type: "api",
|
|
221
|
+
key: result.key,
|
|
222
|
+
...(result.metadata ? { metadata: result.metadata } : {}),
|
|
223
|
+
};
|
|
224
|
+
await this.store.set(providerId, credential);
|
|
225
|
+
return credential;
|
|
226
|
+
}
|
|
227
|
+
methodAt(providerId, index) {
|
|
228
|
+
const provider = this.providers.get(providerId);
|
|
229
|
+
if (!provider)
|
|
230
|
+
throw new Error(`unknown auth provider: ${providerId}`);
|
|
231
|
+
const method = provider.methods[index];
|
|
232
|
+
if (!method) {
|
|
233
|
+
throw new Error(`${providerId} has no auth method ${index} (it has ${provider.methods.length})`);
|
|
234
|
+
}
|
|
235
|
+
return { provider, method };
|
|
236
|
+
}
|
|
237
|
+
/** Collapse concurrent refreshes of the same provider into one exchange. */
|
|
238
|
+
refreshOnce(providerId, provider, credential) {
|
|
239
|
+
const inFlight = this.refreshing.get(providerId);
|
|
240
|
+
if (inFlight)
|
|
241
|
+
return inFlight;
|
|
242
|
+
const task = (async () => {
|
|
243
|
+
try {
|
|
244
|
+
const refreshed = await provider.refresh(credential);
|
|
245
|
+
if (refreshed) {
|
|
246
|
+
await this.store.set(providerId, refreshed);
|
|
247
|
+
this.logger.debug("refreshed credential", { provider: providerId });
|
|
248
|
+
}
|
|
249
|
+
return refreshed;
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
this.logger.warn("token refresh failed", {
|
|
253
|
+
provider: providerId,
|
|
254
|
+
error: errorMessage(err),
|
|
255
|
+
});
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
finally {
|
|
259
|
+
this.refreshing.delete(providerId);
|
|
260
|
+
}
|
|
261
|
+
})();
|
|
262
|
+
this.refreshing.set(providerId, task);
|
|
263
|
+
return task;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/auth/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAWvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAavC,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,cAAc,CAAC;QACb,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,CAAC,gBAAgB,CAAC;QAC3B,WAAW,EAAE,MAAM;KACpB,CAAC;IACF,cAAc,CAAC;QACb,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;QAC7C,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG;KACrB,CAAC;CACH,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IACb,KAAK,CAAY;IACT,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5C,MAAM,CAAS;IACf,UAAU,GAAG,IAAI,GAAG,EAAgD,CAAC;IAEtF,YAAY,OAA2E,EAAE;QACvF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,SAAS,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,IAAI,sBAAsB;YAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3F,CAAC;IAED,QAAQ,CAAC,QAAsB;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,UAAkB;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,GAAgB;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAEhC,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEtD,IAAI,UAAU,EAAE,IAAI,KAAK,OAAO,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9E,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,UAAU,CAAC;QAC5F,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QACvC,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;gBAC/C,QAAQ,EAAE,GAAG,CAAC,UAAU;gBACxB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;aACzB,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,WAAW,CAAC,UAAkB;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAEhC,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,UAAU,EAAE,IAAI,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACnD,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9C,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,UAAU,CAAC;QACxF,CAAC;QACD,OAAO,UAAU,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QACpD,OAAO,QAAQ,KAAK,SAAS,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAiB,EAAE,CAAC;QAC7B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YACjE,GAAG,CAAC,IAAI,CAAC;gBACP,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,aAAa,EAAE,QAAQ,KAAK,SAAS;gBACrC,MAAM,EAAE,QAAQ,EAAE,MAAM;gBACxB,SAAS,EAAE,UAAU,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBACxE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBAChD,KAAK;oBACL,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,MAAkB,EAAE,UAAkC,EAAE;QACjE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI;gBAC5B,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK;gBAC9B,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qEAAqE;IACrE,QAAQ,CACN,MAAkB,EAClB,OAA+B;QAE/B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YACtD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,SAAS;YACzD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,KAAK;gBAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,SAAS,CACb,UAAkB,EAClB,WAAmB,EACnB,UAAkC,EAAE;QAEpC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,UAAU,WAAW,OAAO,QAAQ,CAAC,EAAE,yBAAyB,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,MAAM,CACV,UAAkB,EAClB,WAAmB,EACnB,OAA+B;QAE/B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAEpE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAErE,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,uBAAuB,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAC7D,CAAC;YACF,MAAM,UAAU,GAAe;gBAC7B,IAAI,EAAE,KAAK;gBACX,GAAG;gBACH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAC;YACF,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC9C,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,UAAU,WAAW,OAAO,QAAQ,CAAC,EAAE,0BAA0B,CAAC,CAAC;IACrF,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,QAAQ,CACZ,UAAkB,EAClB,MAAwD;QAExD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,uBAAuB,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,UAAkB,EAClB,MAAsF;QAEtF,MAAM,UAAU,GACd,QAAQ,IAAI,MAAM;YAChB,CAAC,CAAC;gBACE,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D;YACH,CAAC,CAAC;gBACE,IAAI,EAAE,KAAK;gBACX,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D,CAAC;QAER,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC7C,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,QAAQ,CACd,UAAkB,EAClB,KAAa;QAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,GAAG,UAAU,uBAAuB,KAAK,YAAY,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAChF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,4EAA4E;IACpE,WAAW,CACjB,UAAkB,EAClB,QAAsB,EACtB,UAA2B;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAQ,CAAC,UAAU,CAAC,CAAC;gBACtD,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;oBAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;gBACtE,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;oBACvC,QAAQ,EAAE,UAAU;oBACpB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;iBACzB,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC;YACnB,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { AuthorizeResult, OAuthCredential } from "./types.ts";
|
|
2
|
+
export interface Pkce {
|
|
3
|
+
verifier: string;
|
|
4
|
+
challenge: string;
|
|
5
|
+
}
|
|
6
|
+
/** RFC 7636 S256 challenge. */
|
|
7
|
+
export declare function createPkce(): Pkce;
|
|
8
|
+
export interface TokenResponse {
|
|
9
|
+
access_token: string;
|
|
10
|
+
refresh_token?: string;
|
|
11
|
+
expires_in?: number;
|
|
12
|
+
token_type?: string;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface TokenExchangeOptions {
|
|
16
|
+
tokenUrl: string;
|
|
17
|
+
clientId: string;
|
|
18
|
+
clientSecret?: string;
|
|
19
|
+
/** `client_secret_post` puts the secret in the body; `basic` uses the header. */
|
|
20
|
+
clientAuth?: "none" | "basic" | "post";
|
|
21
|
+
params: Record<string, string>;
|
|
22
|
+
headers?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
export declare function exchangeToken(opts: TokenExchangeOptions): Promise<TokenResponse>;
|
|
25
|
+
export declare function toCredential(token: TokenResponse, previousRefresh?: string): OAuthCredential;
|
|
26
|
+
/** The credential body without the `type` discriminant, for spreading into results. */
|
|
27
|
+
export declare function credentialFields(token: TokenResponse, previousRefresh?: string): Omit<OAuthCredential, "type">;
|
|
28
|
+
export declare function refreshCredential(credential: OAuthCredential, opts: Omit<TokenExchangeOptions, "params"> & {
|
|
29
|
+
scope?: string;
|
|
30
|
+
/** Params the server also requires when refreshing, e.g. `resource`. */
|
|
31
|
+
tokenParams?: Record<string, string>;
|
|
32
|
+
}): Promise<OAuthCredential | undefined>;
|
|
33
|
+
export interface DeviceFlowOptions {
|
|
34
|
+
deviceCodeUrl: string;
|
|
35
|
+
tokenUrl: string;
|
|
36
|
+
clientId: string;
|
|
37
|
+
scope?: string;
|
|
38
|
+
headers?: Record<string, string>;
|
|
39
|
+
/** Guard against a server that never returns a terminal state. */
|
|
40
|
+
maxAttempts?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Start a device flow. The returned `callback()` polls until the user finishes
|
|
44
|
+
* authorizing in their browser.
|
|
45
|
+
*/
|
|
46
|
+
export declare function startDeviceFlow(opts: DeviceFlowOptions): Promise<AuthorizeResult>;
|
|
47
|
+
export interface AuthCodeFlowOptions {
|
|
48
|
+
authorizeUrl: string;
|
|
49
|
+
tokenUrl: string;
|
|
50
|
+
clientId: string;
|
|
51
|
+
clientSecret?: string;
|
|
52
|
+
scope?: string;
|
|
53
|
+
/** Extra query params for the authorize URL. */
|
|
54
|
+
extraParams?: Record<string, string>;
|
|
55
|
+
/**
|
|
56
|
+
* Extra params for the token request. Separate from `extraParams` because
|
|
57
|
+
* some are required in both places and mean different things in each —
|
|
58
|
+
* RFC 8707's `resource` is the case that forced this apart.
|
|
59
|
+
*/
|
|
60
|
+
tokenParams?: Record<string, string>;
|
|
61
|
+
headers?: Record<string, string>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Authorization-code + PKCE where the user pastes the code back.
|
|
65
|
+
*
|
|
66
|
+
* Used when we cannot listen on a loopback port (remote shells, containers),
|
|
67
|
+
* which is common enough that it is worth having as the simpler default.
|
|
68
|
+
*/
|
|
69
|
+
export declare function startAuthCodeFlow(opts: AuthCodeFlowOptions & {
|
|
70
|
+
redirectUri: string;
|
|
71
|
+
}): AuthorizeResult;
|
|
72
|
+
/**
|
|
73
|
+
* Authorization-code + PKCE with a loopback listener, so the browser redirect
|
|
74
|
+
* completes the flow without the user copying anything.
|
|
75
|
+
*
|
|
76
|
+
* `prepare` exists for dynamic client registration: the redirect URI has to be
|
|
77
|
+
* named when the client is registered, and its port is not known until the
|
|
78
|
+
* listener is up. So the port is claimed first, the caller gets a chance to go
|
|
79
|
+
* register against it, and only then is the browser sent anywhere.
|
|
80
|
+
*/
|
|
81
|
+
export declare function startLoopbackFlow(opts: AuthCodeFlowOptions & {
|
|
82
|
+
prepare?(redirectUri: string): Promise<Partial<AuthCodeFlowOptions>>;
|
|
83
|
+
}): Promise<AuthorizeResult>;
|