poe-code 3.0.88 → 3.0.90
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/cli/commands/login.js +8 -77
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/container.js +4 -1
- package/dist/cli/container.js.map +1 -1
- package/dist/cli/oauth-login.d.ts +1 -0
- package/dist/cli/oauth-login.js +49 -0
- package/dist/cli/oauth-login.js.map +1 -0
- package/dist/cli/options.d.ts +1 -0
- package/dist/cli/options.js +9 -1
- package/dist/cli/options.js.map +1 -1
- package/dist/index.js +72 -84
- package/dist/index.js.map +4 -4
- package/dist/providers/poe-agent.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import { exec } from "node:child_process";
|
|
2
|
-
import readline from "node:readline";
|
|
3
1
|
import { buildProviderContext, createExecutionResources, resolveCommandFlags, applyIsolatedConfiguration } from "./shared.js";
|
|
4
2
|
import { loadConfiguredServices } from "../../services/config.js";
|
|
5
|
-
import { ValidationError } from "../errors.js";
|
|
6
3
|
import { combineMutationObservers, createMutationReporter } from "../../services/mutation-events.js";
|
|
7
|
-
import { createOAuthClient } from "@poe-code/auth";
|
|
8
|
-
import { text, log } from "@poe-code/design-system";
|
|
9
4
|
export function registerLoginCommand(program, container) {
|
|
10
5
|
program
|
|
11
6
|
.command("login")
|
|
@@ -20,19 +15,21 @@ export async function executeLogin(program, container, options) {
|
|
|
20
15
|
const resources = createExecutionResources(container, flags, "login");
|
|
21
16
|
resources.logger.intro("login");
|
|
22
17
|
try {
|
|
23
|
-
const
|
|
24
|
-
|
|
18
|
+
const apiKey = await container.options.resolveApiKey({
|
|
19
|
+
value: options.apiKey,
|
|
20
|
+
envValue: container.env.getVariable("POE_API_KEY"),
|
|
21
|
+
dryRun: flags.dryRun,
|
|
22
|
+
assumeYes: flags.assumeYes,
|
|
23
|
+
allowStored: false
|
|
24
|
+
});
|
|
25
25
|
const configuredServices = await loadConfiguredServices({
|
|
26
26
|
fs: container.fs,
|
|
27
27
|
filePath: container.env.configPath
|
|
28
28
|
});
|
|
29
|
-
if (!flags.dryRun) {
|
|
30
|
-
await container.writeApiKey(normalized);
|
|
31
|
-
}
|
|
32
29
|
await reconfigureServices({
|
|
33
30
|
program,
|
|
34
31
|
container,
|
|
35
|
-
apiKey
|
|
32
|
+
apiKey,
|
|
36
33
|
configuredServices
|
|
37
34
|
});
|
|
38
35
|
resources.context.complete({
|
|
@@ -51,72 +48,6 @@ export async function executeLogin(program, container, options) {
|
|
|
51
48
|
throw error;
|
|
52
49
|
}
|
|
53
50
|
}
|
|
54
|
-
async function resolveApiKeyInput(container, options) {
|
|
55
|
-
if (options.apiKey) {
|
|
56
|
-
return options.apiKey;
|
|
57
|
-
}
|
|
58
|
-
const envKey = container.env.getVariable("POE_API_KEY");
|
|
59
|
-
if (envKey && envKey.trim().length > 0) {
|
|
60
|
-
return envKey;
|
|
61
|
-
}
|
|
62
|
-
if (container.env.getVariable("POE_CODE_OAUTH_LOGIN") === "1") {
|
|
63
|
-
return resolveApiKeyViaOAuth();
|
|
64
|
-
}
|
|
65
|
-
const descriptor = container.promptLibrary.loginApiKey();
|
|
66
|
-
const response = await container.prompts(descriptor);
|
|
67
|
-
const value = response[descriptor.name];
|
|
68
|
-
if (typeof value !== "string" || value.trim() === "") {
|
|
69
|
-
throw new ValidationError("POE API key is required.", {
|
|
70
|
-
operation: "login",
|
|
71
|
-
field: "apiKey"
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
return value;
|
|
75
|
-
}
|
|
76
|
-
async function resolveApiKeyViaOAuth() {
|
|
77
|
-
const rl = readline.createInterface({
|
|
78
|
-
input: process.stdin
|
|
79
|
-
});
|
|
80
|
-
try {
|
|
81
|
-
const client = createOAuthClient({
|
|
82
|
-
clientId: "client_f520ee4d8ca84a13ba876a8731d264d0",
|
|
83
|
-
authorizationEndpoint: "https://poe.com/oauth/authorize",
|
|
84
|
-
tokenEndpoint: "https://api.poe.com/token",
|
|
85
|
-
openBrowser: (url) => openInBrowser(url).catch(() => {
|
|
86
|
-
log.warn("Could not open browser automatically.");
|
|
87
|
-
}),
|
|
88
|
-
readLine: () => new Promise((resolve) => {
|
|
89
|
-
rl.once("line", (line) => resolve(line));
|
|
90
|
-
})
|
|
91
|
-
});
|
|
92
|
-
const authorization = await client.authorize();
|
|
93
|
-
log.message(`${text.muted("Authorize at")} ${text.link(authorization.authorizationUrl)}`);
|
|
94
|
-
log.message(text.muted("Waiting for authorization. You can also paste the redirect URL here:"));
|
|
95
|
-
const result = await authorization.waitForResult();
|
|
96
|
-
return result.apiKey;
|
|
97
|
-
}
|
|
98
|
-
finally {
|
|
99
|
-
rl.close();
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
function openInBrowser(url) {
|
|
103
|
-
return new Promise((resolve, reject) => {
|
|
104
|
-
const platform = process.platform;
|
|
105
|
-
const command = platform === "darwin"
|
|
106
|
-
? `open "${url}"`
|
|
107
|
-
: platform === "win32"
|
|
108
|
-
? `start "" "${url}"`
|
|
109
|
-
: `xdg-open "${url}"`;
|
|
110
|
-
exec(command, (error) => {
|
|
111
|
-
if (error) {
|
|
112
|
-
reject(error);
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
resolve();
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
51
|
async function reconfigureServices(input) {
|
|
121
52
|
const { program, container, apiKey, configuredServices } = input;
|
|
122
53
|
const serviceNames = Object.keys(configuredServices);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/container.js
CHANGED
|
@@ -12,6 +12,7 @@ import { text, symbols, confirm as dsConfirm, isCancel, cancel as dsCancel } fro
|
|
|
12
12
|
import { getDefaultProviders } from "../providers/index.js";
|
|
13
13
|
import { createPoeCodeCommandRunner } from "./poe-code-command-runner.js";
|
|
14
14
|
import { OperationCancelledError } from "./errors.js";
|
|
15
|
+
import { resolveApiKeyViaOAuth } from "./oauth-login.js";
|
|
15
16
|
export function createCliContainer(dependencies) {
|
|
16
17
|
const environment = createCliEnvironment({
|
|
17
18
|
cwd: dependencies.env.cwd,
|
|
@@ -73,6 +74,7 @@ export function createCliContainer(dependencies) {
|
|
|
73
74
|
});
|
|
74
75
|
const readApiKey = authStore.getApiKey.bind(authStore);
|
|
75
76
|
const writeApiKey = authStore.setApiKey.bind(authStore);
|
|
77
|
+
const oauthEnabled = (dependencies.env.variables ?? process.env).POE_CODE_OAUTH_LOGIN !== "0";
|
|
76
78
|
const options = createOptionResolvers({
|
|
77
79
|
prompts: dependencies.prompts,
|
|
78
80
|
promptLibrary,
|
|
@@ -87,7 +89,8 @@ export function createCliContainer(dependencies) {
|
|
|
87
89
|
throw new OperationCancelledError();
|
|
88
90
|
}
|
|
89
91
|
return result === true;
|
|
90
|
-
}
|
|
92
|
+
},
|
|
93
|
+
loginViaOAuth: oauthEnabled ? resolveApiKeyViaOAuth : undefined
|
|
91
94
|
});
|
|
92
95
|
const registry = createServiceRegistry();
|
|
93
96
|
const providers = getDefaultProviders().filter((adapter) => !adapter.disabled);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/cli/container.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,qBAAqB,EAEtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,2BAA2B,EAE5B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACL,IAAI,EACJ,OAAO,EACP,OAAO,IAAI,SAAS,EACpB,QAAQ,EACR,MAAM,IAAI,QAAQ,EACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/cli/container.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,qBAAqB,EAEtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,2BAA2B,EAE5B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACL,IAAI,EACJ,OAAO,EACP,OAAO,IAAI,SAAS,EACpB,QAAQ,EACR,MAAM,IAAI,QAAQ,EACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAoCzD,MAAM,UAAU,kBAAkB,CAChC,YAA6B;IAE7B,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACvC,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG;QACzB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO;QACjC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ;QACnC,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,SAAS;KACtC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,mBAAmB,CAAC,YAAY,CAAC,MAAM,EAAE;QAC7D,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,cAAc,EAAE,OAAO,CAAC,QAAQ;KACjC,CAAC,CAAC;IAEH,wDAAwD;IACxD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,EAAE,EAAE,UAAiB;QACrB,MAAM,EAAE,WAAW,CAAC,MAAM;QAC1B,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IAEH,yCAAyC;IACzC,yEAAyE;IACzE,wEAAwE;IACxE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QACzB,aAAa,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,cAAc,GAAG,2BAA2B,CAAC;QACjD,EAAE,EAAE,YAAY,CAAC,EAAE;KACpB,CAAC,CAAC;IAEH,MAAM,UAAU,GACd,YAAY,CAAC,UAAU;QACvB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACnD,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAC3B,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE;aAC5B,CAAC;QACJ,CAAC,CAAC,CAAC;IAEL,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,IAAI,UAAU,CAAC;IAE/D,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;IAE5C,MAAM,MAAM,GAAG;QACb,QAAQ,EAAE,CAAC,QAAgB,EAAE,QAAwB,EAAE,EAAE,CACvD,YAAY,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC9C,SAAS,EAAE,CACT,QAAgB,EAChB,IAAqC,EACrC,IAAoC,EACpC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;QACpD,KAAK,EAAE,CACL,aAAqB,EACrB,IAA8B,EAC9B,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;QACrE,MAAM,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9D,KAAK,EAAE,CAAC,QAAgB,EAAE,IAAY,EAAE,EAAE,CACxC,YAAY,CAAC,EAAE,CAAC,KAAK;YACnB,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;YACvC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE;KACxB,CAAC;IAEF,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC;QAC3C,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,SAAS;QAC/B,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ;QACnC,SAAS,EAAE;YACT,EAAE,EAAE,MAAM;YACV,gBAAgB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO;SACjD;QACD,iBAAiB,EAAE;YACjB,EAAE,EAAE,MAAM;YACV,gBAAgB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO;SACjD;KACF,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAExD,MAAM,YAAY,GAChB,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,KAAK,GAAG,CAAC;IAE3E,MAAM,OAAO,GAAG,qBAAqB,CAAC;QACpC,OAAO,EAAE,YAAY,CAAC,OAAO;QAC7B,aAAa;QACb,WAAW,EAAE;YACX,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,WAAW;SACnB;QACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5C,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrB,QAAQ,CAAC,sBAAsB,CAAC,CAAC;gBACjC,MAAM,IAAI,uBAAuB,EAAE,CAAC;YACtC,CAAC;YACD,OAAO,MAAM,KAAK,IAAI,CAAC;QACzB,CAAC;QACD,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS;KAChE,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IAEzC,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC,MAAM,CAC5C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAC/B,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,SAAS,GAAiB,IAA+B,CAAC;IAC9D,MAAM,aAAa,GAAG,0BAA0B,CAAC;QAC/C,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;QAC7B,UAAU,EAAE,aAAa;KAC1B,CAAC,CAAC;IAEH,SAAS,GAAG;QACV,GAAG,EAAE,WAAW;QAChB,EAAE,EAAE,YAAY,CAAC,EAAE;QACnB,OAAO,EAAE,YAAY,CAAC,OAAO;QAC7B,aAAa;QACb,aAAa;QACb,WAAW;QACX,OAAO;QACP,cAAc;QACd,QAAQ;QACR,UAAU;QACV,aAAa,EAAE,aAAa;QAC5B,SAAS;QACT,YAAY;QACZ,UAAU;QACV,WAAW;KACZ,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resolveApiKeyViaOAuth(): Promise<string>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import readline from "node:readline";
|
|
3
|
+
import { createOAuthClient } from "@poe-code/auth";
|
|
4
|
+
import { text, log } from "@poe-code/design-system";
|
|
5
|
+
export async function resolveApiKeyViaOAuth() {
|
|
6
|
+
const rl = readline.createInterface({
|
|
7
|
+
input: process.stdin
|
|
8
|
+
});
|
|
9
|
+
try {
|
|
10
|
+
const client = createOAuthClient({
|
|
11
|
+
clientId: "client_f520ee4d8ca84a13ba876a8731d264d0",
|
|
12
|
+
authorizationEndpoint: "https://poe.com/oauth/authorize",
|
|
13
|
+
tokenEndpoint: "https://api.poe.com/token",
|
|
14
|
+
openBrowser: (url) => openInBrowser(url).catch(() => {
|
|
15
|
+
log.warn("Could not open browser automatically.");
|
|
16
|
+
}),
|
|
17
|
+
readLine: () => new Promise((resolve) => {
|
|
18
|
+
rl.once("line", (line) => resolve(line));
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
const authorization = await client.authorize();
|
|
22
|
+
log.message(`${text.muted("Authorize at")} ${text.link(authorization.authorizationUrl)}`);
|
|
23
|
+
log.message(text.muted("Waiting for authorization. You can also paste the redirect URL here:"));
|
|
24
|
+
const result = await authorization.waitForResult();
|
|
25
|
+
return result.apiKey;
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
rl.close();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function openInBrowser(url) {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const platform = process.platform;
|
|
34
|
+
const command = platform === "darwin"
|
|
35
|
+
? `open "${url}"`
|
|
36
|
+
: platform === "win32"
|
|
37
|
+
? `start "" "${url}"`
|
|
38
|
+
: `xdg-open "${url}"`;
|
|
39
|
+
exec(command, (error) => {
|
|
40
|
+
if (error) {
|
|
41
|
+
reject(error);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
resolve();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=oauth-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-login.js","sourceRoot":"","sources":["../../src/cli/oauth-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EACL,IAAI,EACJ,GAAG,EACJ,MAAM,yBAAyB,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC/B,QAAQ,EAAE,yCAAyC;YACnD,qBAAqB,EAAE,iCAAiC;YACxD,aAAa,EAAE,2BAA2B;YAC1C,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC5B,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACpD,CAAC,CAAC;YACJ,QAAQ,EAAE,GAAG,EAAE,CACb,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;gBAC9B,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC;SACL,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAE/C,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC1F,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC,CAAC;QAEhG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE,CAAC;QAEnD,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,MAAM,OAAO,GACX,QAAQ,KAAK,QAAQ;YACnB,CAAC,CAAC,SAAS,GAAG,GAAG;YACjB,CAAC,CAAC,QAAQ,KAAK,OAAO;gBACpB,CAAC,CAAC,aAAa,GAAG,GAAG;gBACrB,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC;QAE5B,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACtB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cli/options.d.ts
CHANGED
|
@@ -45,6 +45,7 @@ export interface OptionResolverInit {
|
|
|
45
45
|
promptLibrary: PromptLibrary;
|
|
46
46
|
apiKeyStore: ApiKeyStore;
|
|
47
47
|
confirm: (message: string) => Promise<boolean>;
|
|
48
|
+
loginViaOAuth?: () => Promise<string>;
|
|
48
49
|
}
|
|
49
50
|
export declare function isValidApiKeyFormat(key: string): boolean;
|
|
50
51
|
export declare function createOptionResolvers(init: OptionResolverInit): OptionResolvers;
|
package/dist/cli/options.js
CHANGED
|
@@ -49,7 +49,7 @@ export function isValidApiKeyFormat(key) {
|
|
|
49
49
|
return false;
|
|
50
50
|
if (key.startsWith("sk-poe-")) {
|
|
51
51
|
const hash = key.slice(7);
|
|
52
|
-
return hasMinimumApiKeyLength(hash) &&
|
|
52
|
+
return hasMinimumApiKeyLength(hash) && isAlphanumericWithSeparators(hash);
|
|
53
53
|
}
|
|
54
54
|
return hasMinimumApiKeyLength(key) && isAlphanumericWithSeparators(key);
|
|
55
55
|
}
|
|
@@ -123,6 +123,14 @@ export function createOptionResolvers(init) {
|
|
|
123
123
|
return normalizeApiKey(stored);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
+
if (init.loginViaOAuth) {
|
|
127
|
+
const apiKey = await init.loginViaOAuth();
|
|
128
|
+
const normalized = normalizeApiKey(apiKey);
|
|
129
|
+
if (!input.dryRun) {
|
|
130
|
+
await init.apiKeyStore.write(normalized);
|
|
131
|
+
}
|
|
132
|
+
return normalized;
|
|
133
|
+
}
|
|
126
134
|
while (true) {
|
|
127
135
|
const descriptor = init.promptLibrary.loginApiKey();
|
|
128
136
|
const response = await init.prompts(descriptor);
|
package/dist/cli/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK;SACT,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;SACjC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -504,6 +504,7 @@ async function startAuthorization(config2, fetchFn) {
|
|
|
504
504
|
fetchFn
|
|
505
505
|
});
|
|
506
506
|
} finally {
|
|
507
|
+
server.closeAllConnections?.();
|
|
507
508
|
server.close();
|
|
508
509
|
}
|
|
509
510
|
};
|
|
@@ -5043,16 +5044,6 @@ var init_prompts2 = __esm({
|
|
|
5043
5044
|
function stripBracketedPaste(value) {
|
|
5044
5045
|
return value.replace(/\x1b\[200~/g, "").replace(/\x1b\[201~/g, "").replace(/undefinedndefined$/, "").replace(/undefined$/, "").replace(/ndefined$/, "");
|
|
5045
5046
|
}
|
|
5046
|
-
function isAlphanumeric(value) {
|
|
5047
|
-
for (let i = 0; i < value.length; i++) {
|
|
5048
|
-
const code = value.charCodeAt(i);
|
|
5049
|
-
const isDigit = code >= 48 && code <= 57;
|
|
5050
|
-
const isUpper = code >= 65 && code <= 90;
|
|
5051
|
-
const isLower = code >= 97 && code <= 122;
|
|
5052
|
-
if (!isDigit && !isUpper && !isLower) return false;
|
|
5053
|
-
}
|
|
5054
|
-
return value.length > 0;
|
|
5055
|
-
}
|
|
5056
5047
|
function isAlphanumericWithSeparators(value) {
|
|
5057
5048
|
for (let i = 0; i < value.length; i++) {
|
|
5058
5049
|
const code = value.charCodeAt(i);
|
|
@@ -5073,7 +5064,7 @@ function isValidApiKeyFormat(key) {
|
|
|
5073
5064
|
if (key.length === 0) return false;
|
|
5074
5065
|
if (key.startsWith("sk-poe-")) {
|
|
5075
5066
|
const hash2 = key.slice(7);
|
|
5076
|
-
return hasMinimumApiKeyLength(hash2) &&
|
|
5067
|
+
return hasMinimumApiKeyLength(hash2) && isAlphanumericWithSeparators(hash2);
|
|
5077
5068
|
}
|
|
5078
5069
|
return hasMinimumApiKeyLength(key) && isAlphanumericWithSeparators(key);
|
|
5079
5070
|
}
|
|
@@ -5146,6 +5137,14 @@ function createOptionResolvers(init) {
|
|
|
5146
5137
|
return normalizeApiKey(stored);
|
|
5147
5138
|
}
|
|
5148
5139
|
}
|
|
5140
|
+
if (init.loginViaOAuth) {
|
|
5141
|
+
const apiKey = await init.loginViaOAuth();
|
|
5142
|
+
const normalized = normalizeApiKey(apiKey);
|
|
5143
|
+
if (!input.dryRun) {
|
|
5144
|
+
await init.apiKeyStore.write(normalized);
|
|
5145
|
+
}
|
|
5146
|
+
return normalized;
|
|
5147
|
+
}
|
|
5149
5148
|
while (true) {
|
|
5150
5149
|
const descriptor = init.promptLibrary.loginApiKey();
|
|
5151
5150
|
const response = await init.prompts(descriptor);
|
|
@@ -10600,6 +10599,55 @@ var init_client_instance = __esm({
|
|
|
10600
10599
|
}
|
|
10601
10600
|
});
|
|
10602
10601
|
|
|
10602
|
+
// src/cli/oauth-login.ts
|
|
10603
|
+
import { exec as exec2 } from "node:child_process";
|
|
10604
|
+
import readline from "node:readline";
|
|
10605
|
+
async function resolveApiKeyViaOAuth() {
|
|
10606
|
+
const rl = readline.createInterface({
|
|
10607
|
+
input: process.stdin
|
|
10608
|
+
});
|
|
10609
|
+
try {
|
|
10610
|
+
const client = createOAuthClient({
|
|
10611
|
+
clientId: "client_f520ee4d8ca84a13ba876a8731d264d0",
|
|
10612
|
+
authorizationEndpoint: "https://poe.com/oauth/authorize",
|
|
10613
|
+
tokenEndpoint: "https://api.poe.com/token",
|
|
10614
|
+
openBrowser: (url2) => openInBrowser(url2).catch(() => {
|
|
10615
|
+
log2.warn("Could not open browser automatically.");
|
|
10616
|
+
}),
|
|
10617
|
+
readLine: () => new Promise((resolve) => {
|
|
10618
|
+
rl.once("line", (line) => resolve(line));
|
|
10619
|
+
})
|
|
10620
|
+
});
|
|
10621
|
+
const authorization = await client.authorize();
|
|
10622
|
+
log2.message(`${text.muted("Authorize at")} ${text.link(authorization.authorizationUrl)}`);
|
|
10623
|
+
log2.message(text.muted("Waiting for authorization. You can also paste the redirect URL here:"));
|
|
10624
|
+
const result = await authorization.waitForResult();
|
|
10625
|
+
return result.apiKey;
|
|
10626
|
+
} finally {
|
|
10627
|
+
rl.close();
|
|
10628
|
+
}
|
|
10629
|
+
}
|
|
10630
|
+
function openInBrowser(url2) {
|
|
10631
|
+
return new Promise((resolve, reject) => {
|
|
10632
|
+
const platform = process.platform;
|
|
10633
|
+
const command = platform === "darwin" ? `open "${url2}"` : platform === "win32" ? `start "" "${url2}"` : `xdg-open "${url2}"`;
|
|
10634
|
+
exec2(command, (error2) => {
|
|
10635
|
+
if (error2) {
|
|
10636
|
+
reject(error2);
|
|
10637
|
+
} else {
|
|
10638
|
+
resolve();
|
|
10639
|
+
}
|
|
10640
|
+
});
|
|
10641
|
+
});
|
|
10642
|
+
}
|
|
10643
|
+
var init_oauth_login = __esm({
|
|
10644
|
+
"src/cli/oauth-login.ts"() {
|
|
10645
|
+
"use strict";
|
|
10646
|
+
init_src();
|
|
10647
|
+
init_src4();
|
|
10648
|
+
}
|
|
10649
|
+
});
|
|
10650
|
+
|
|
10603
10651
|
// src/cli/container.ts
|
|
10604
10652
|
import * as nodeFsSync2 from "node:fs";
|
|
10605
10653
|
function createCliContainer(dependencies) {
|
|
@@ -10656,6 +10704,7 @@ function createCliContainer(dependencies) {
|
|
|
10656
10704
|
});
|
|
10657
10705
|
const readApiKey = authStore.getApiKey.bind(authStore);
|
|
10658
10706
|
const writeApiKey = authStore.setApiKey.bind(authStore);
|
|
10707
|
+
const oauthEnabled = (dependencies.env.variables ?? process.env).POE_CODE_OAUTH_LOGIN !== "0";
|
|
10659
10708
|
const options = createOptionResolvers({
|
|
10660
10709
|
prompts: dependencies.prompts,
|
|
10661
10710
|
promptLibrary,
|
|
@@ -10670,7 +10719,8 @@ function createCliContainer(dependencies) {
|
|
|
10670
10719
|
throw new OperationCancelledError();
|
|
10671
10720
|
}
|
|
10672
10721
|
return result === true;
|
|
10673
|
-
}
|
|
10722
|
+
},
|
|
10723
|
+
loginViaOAuth: oauthEnabled ? resolveApiKeyViaOAuth : void 0
|
|
10674
10724
|
});
|
|
10675
10725
|
const registry2 = createServiceRegistry();
|
|
10676
10726
|
const providers = getDefaultProviders().filter(
|
|
@@ -10719,6 +10769,7 @@ var init_container2 = __esm({
|
|
|
10719
10769
|
await init_providers();
|
|
10720
10770
|
init_poe_code_command_runner();
|
|
10721
10771
|
init_errors();
|
|
10772
|
+
init_oauth_login();
|
|
10722
10773
|
}
|
|
10723
10774
|
});
|
|
10724
10775
|
|
|
@@ -12073,8 +12124,6 @@ var init_wrap = __esm({
|
|
|
12073
12124
|
});
|
|
12074
12125
|
|
|
12075
12126
|
// src/cli/commands/login.ts
|
|
12076
|
-
import { exec as exec2 } from "node:child_process";
|
|
12077
|
-
import readline from "node:readline";
|
|
12078
12127
|
function registerLoginCommand(program, container) {
|
|
12079
12128
|
program.command("login").description("Store a Poe API key for reuse across commands.").option("--api-key <key>", "Poe API key").action(async (options) => {
|
|
12080
12129
|
await executeLogin(program, container, options);
|
|
@@ -12089,19 +12138,21 @@ async function executeLogin(program, container, options) {
|
|
|
12089
12138
|
);
|
|
12090
12139
|
resources.logger.intro("login");
|
|
12091
12140
|
try {
|
|
12092
|
-
const
|
|
12093
|
-
|
|
12141
|
+
const apiKey = await container.options.resolveApiKey({
|
|
12142
|
+
value: options.apiKey,
|
|
12143
|
+
envValue: container.env.getVariable("POE_API_KEY"),
|
|
12144
|
+
dryRun: flags.dryRun,
|
|
12145
|
+
assumeYes: flags.assumeYes,
|
|
12146
|
+
allowStored: false
|
|
12147
|
+
});
|
|
12094
12148
|
const configuredServices = await loadConfiguredServices({
|
|
12095
12149
|
fs: container.fs,
|
|
12096
12150
|
filePath: container.env.configPath
|
|
12097
12151
|
});
|
|
12098
|
-
if (!flags.dryRun) {
|
|
12099
|
-
await container.writeApiKey(normalized);
|
|
12100
|
-
}
|
|
12101
12152
|
await reconfigureServices({
|
|
12102
12153
|
program,
|
|
12103
12154
|
container,
|
|
12104
|
-
apiKey
|
|
12155
|
+
apiKey,
|
|
12105
12156
|
configuredServices
|
|
12106
12157
|
});
|
|
12107
12158
|
resources.context.complete({
|
|
@@ -12119,66 +12170,6 @@ async function executeLogin(program, container, options) {
|
|
|
12119
12170
|
throw error2;
|
|
12120
12171
|
}
|
|
12121
12172
|
}
|
|
12122
|
-
async function resolveApiKeyInput(container, options) {
|
|
12123
|
-
if (options.apiKey) {
|
|
12124
|
-
return options.apiKey;
|
|
12125
|
-
}
|
|
12126
|
-
const envKey = container.env.getVariable("POE_API_KEY");
|
|
12127
|
-
if (envKey && envKey.trim().length > 0) {
|
|
12128
|
-
return envKey;
|
|
12129
|
-
}
|
|
12130
|
-
if (container.env.getVariable("POE_CODE_OAUTH_LOGIN") === "1") {
|
|
12131
|
-
return resolveApiKeyViaOAuth();
|
|
12132
|
-
}
|
|
12133
|
-
const descriptor = container.promptLibrary.loginApiKey();
|
|
12134
|
-
const response = await container.prompts(descriptor);
|
|
12135
|
-
const value = response[descriptor.name];
|
|
12136
|
-
if (typeof value !== "string" || value.trim() === "") {
|
|
12137
|
-
throw new ValidationError("POE API key is required.", {
|
|
12138
|
-
operation: "login",
|
|
12139
|
-
field: "apiKey"
|
|
12140
|
-
});
|
|
12141
|
-
}
|
|
12142
|
-
return value;
|
|
12143
|
-
}
|
|
12144
|
-
async function resolveApiKeyViaOAuth() {
|
|
12145
|
-
const rl = readline.createInterface({
|
|
12146
|
-
input: process.stdin
|
|
12147
|
-
});
|
|
12148
|
-
try {
|
|
12149
|
-
const client = createOAuthClient({
|
|
12150
|
-
clientId: "client_f520ee4d8ca84a13ba876a8731d264d0",
|
|
12151
|
-
authorizationEndpoint: "https://poe.com/oauth/authorize",
|
|
12152
|
-
tokenEndpoint: "https://api.poe.com/token",
|
|
12153
|
-
openBrowser: (url2) => openInBrowser(url2).catch(() => {
|
|
12154
|
-
log2.warn("Could not open browser automatically.");
|
|
12155
|
-
}),
|
|
12156
|
-
readLine: () => new Promise((resolve) => {
|
|
12157
|
-
rl.once("line", (line) => resolve(line));
|
|
12158
|
-
})
|
|
12159
|
-
});
|
|
12160
|
-
const authorization = await client.authorize();
|
|
12161
|
-
log2.message(`${text.muted("Authorize at")} ${text.link(authorization.authorizationUrl)}`);
|
|
12162
|
-
log2.message(text.muted("Waiting for authorization. You can also paste the redirect URL here:"));
|
|
12163
|
-
const result = await authorization.waitForResult();
|
|
12164
|
-
return result.apiKey;
|
|
12165
|
-
} finally {
|
|
12166
|
-
rl.close();
|
|
12167
|
-
}
|
|
12168
|
-
}
|
|
12169
|
-
function openInBrowser(url2) {
|
|
12170
|
-
return new Promise((resolve, reject) => {
|
|
12171
|
-
const platform = process.platform;
|
|
12172
|
-
const command = platform === "darwin" ? `open "${url2}"` : platform === "win32" ? `start "" "${url2}"` : `xdg-open "${url2}"`;
|
|
12173
|
-
exec2(command, (error2) => {
|
|
12174
|
-
if (error2) {
|
|
12175
|
-
reject(error2);
|
|
12176
|
-
} else {
|
|
12177
|
-
resolve();
|
|
12178
|
-
}
|
|
12179
|
-
});
|
|
12180
|
-
});
|
|
12181
|
-
}
|
|
12182
12173
|
async function reconfigureServices(input) {
|
|
12183
12174
|
const { program, container, apiKey, configuredServices } = input;
|
|
12184
12175
|
const serviceNames = Object.keys(configuredServices);
|
|
@@ -12232,10 +12223,7 @@ var init_login = __esm({
|
|
|
12232
12223
|
"use strict";
|
|
12233
12224
|
init_shared();
|
|
12234
12225
|
init_config();
|
|
12235
|
-
init_errors();
|
|
12236
12226
|
init_mutation_events();
|
|
12237
|
-
init_src();
|
|
12238
|
-
init_src4();
|
|
12239
12227
|
}
|
|
12240
12228
|
});
|
|
12241
12229
|
|
|
@@ -38596,7 +38584,7 @@ var init_package = __esm({
|
|
|
38596
38584
|
"package.json"() {
|
|
38597
38585
|
package_default = {
|
|
38598
38586
|
name: "poe-code",
|
|
38599
|
-
version: "3.0.
|
|
38587
|
+
version: "3.0.90",
|
|
38600
38588
|
description: "CLI tool to configure Poe API for developer workflows.",
|
|
38601
38589
|
type: "module",
|
|
38602
38590
|
main: "./dist/index.js",
|