@elizaos/agent 2.0.0-alpha.413 → 2.0.0-alpha.415
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/apps/app-lifeops/src/lifeops/service-mixin-whatsapp.js +1 -90
- package/package.json +4 -4
- package/packages/agent/src/actions/index.d.ts +0 -1
- package/packages/agent/src/actions/index.d.ts.map +1 -1
- package/packages/agent/src/actions/index.js +0 -1
- package/packages/agent/src/api/accounts-routes.d.ts +31 -0
- package/packages/agent/src/api/accounts-routes.d.ts.map +1 -0
- package/packages/agent/src/api/accounts-routes.js +745 -0
- package/packages/agent/src/api/index.d.ts +1 -0
- package/packages/agent/src/api/index.d.ts.map +1 -1
- package/packages/agent/src/api/index.js +1 -0
- package/packages/agent/src/api/model-provider-helpers.js +10 -10
- package/packages/agent/src/api/provider-switch-config.js +2 -2
- package/packages/agent/src/api/server.d.ts.map +1 -1
- package/packages/agent/src/api/server.js +14 -0
- package/packages/agent/src/api/subscription-routes.d.ts.map +1 -1
- package/packages/agent/src/api/subscription-routes.js +48 -1
- package/packages/agent/src/auth/credentials.d.ts.map +1 -1
- package/packages/agent/src/auth/credentials.js +14 -3
- package/packages/agent/src/auth/index.d.ts +2 -0
- package/packages/agent/src/auth/index.d.ts.map +1 -1
- package/packages/agent/src/auth/index.js +2 -0
- package/packages/agent/src/auth/oauth-flow.d.ts +106 -0
- package/packages/agent/src/auth/oauth-flow.d.ts.map +1 -0
- package/packages/agent/src/auth/oauth-flow.js +349 -0
- package/packages/agent/src/auth/vendor/pi-oauth/anthropic-login.d.ts +32 -0
- package/packages/agent/src/auth/vendor/pi-oauth/anthropic-login.d.ts.map +1 -1
- package/packages/agent/src/auth/vendor/pi-oauth/anthropic-login.js +63 -28
- package/packages/agent/src/config/schema.js +1 -1
- package/packages/agent/src/config/types.messages.d.ts +1 -1
- package/packages/agent/src/config/types.tools.d.ts +1 -1
- package/packages/agent/src/providers/page-scoped-context.js +1 -1
- package/packages/agent/src/runtime/eliza-plugin.d.ts.map +1 -1
- package/packages/agent/src/runtime/eliza-plugin.js +0 -3
- package/packages/agent/src/runtime/eliza.js +3 -3
- package/packages/agent/src/runtime/plugin-collector.js +3 -4
- package/packages/app-core/src/components/conversations/conversation-utils.js +4 -4
- package/packages/app-core/src/components/pages/page-scoped-conversations.js +1 -1
- package/packages/app-core/src/components/settings/ProviderSwitcher.js +1 -1
- package/packages/app-core/src/services/auth-store.js +1 -1
- package/packages/app-core/src/state/useOnboardingState.js +1 -1
- package/packages/shared/src/contracts/lifeops.d.ts +5 -4
- package/packages/shared/src/contracts/lifeops.d.ts.map +1 -1
- package/packages/typescript/src/utils/context-catalog.d.ts.map +1 -1
- package/packages/typescript/src/utils/context-catalog.js +2 -3
- package/packages/agent/src/actions/app-control.d.ts +0 -23
- package/packages/agent/src/actions/app-control.d.ts.map +0 -1
- package/packages/agent/src/actions/app-control.js +0 -775
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,KAAK,eAAe,EACpB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,uBAAuB,EAC5B,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,KAAK,eAAe,EACpB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,uBAAuB,EAC5B,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
@@ -34,28 +34,28 @@ export function getModelOptions() {
|
|
|
34
34
|
},
|
|
35
35
|
// OpenAI
|
|
36
36
|
{
|
|
37
|
-
id: "openai/gpt-5.
|
|
38
|
-
name: "GPT-5.
|
|
37
|
+
id: "openai/gpt-5.5-pro",
|
|
38
|
+
name: "GPT-5.5 Pro",
|
|
39
39
|
provider: "OpenAI",
|
|
40
|
-
description: "Highest-precision GPT-5.
|
|
40
|
+
description: "Highest-precision GPT-5.5 variant.",
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
|
-
id: "openai/gpt-5.
|
|
44
|
-
name: "GPT-5.
|
|
43
|
+
id: "openai/gpt-5.5",
|
|
44
|
+
name: "GPT-5.5",
|
|
45
45
|
provider: "OpenAI",
|
|
46
46
|
description: "Flagship OpenAI model for coding and reasoning.",
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
|
-
id: "openai/gpt-5.
|
|
50
|
-
name: "GPT-5.
|
|
49
|
+
id: "openai/gpt-5.5-mini",
|
|
50
|
+
name: "GPT-5.5 Mini",
|
|
51
51
|
provider: "OpenAI",
|
|
52
52
|
description: "High-volume OpenAI mini model.",
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
|
-
id: "openai/gpt-5.
|
|
56
|
-
name: "GPT-5.
|
|
55
|
+
id: "openai/gpt-5.5-nano",
|
|
56
|
+
name: "GPT-5.5 Nano",
|
|
57
57
|
provider: "OpenAI",
|
|
58
|
-
description: "Cheapest GPT-5.
|
|
58
|
+
description: "Cheapest GPT-5.5 tier for fast routing and gating.",
|
|
59
59
|
},
|
|
60
60
|
// Google
|
|
61
61
|
{
|
|
@@ -281,9 +281,9 @@ const PROVIDER_DEFAULT_MODELS = {
|
|
|
281
281
|
},
|
|
282
282
|
openai: {
|
|
283
283
|
smallKey: "OPENAI_SMALL_MODEL",
|
|
284
|
-
smallVal: "gpt-5.
|
|
284
|
+
smallVal: "gpt-5.5-mini",
|
|
285
285
|
largeKey: "OPENAI_LARGE_MODEL",
|
|
286
|
-
largeVal: "gpt-5.
|
|
286
|
+
largeVal: "gpt-5.5",
|
|
287
287
|
},
|
|
288
288
|
google: {
|
|
289
289
|
smallKey: "GOOGLE_SMALL_MODEL",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../../src/api/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8CH,OAAO,EACL,KAAK,YAAY,EAMlB,MAAM,eAAe,CAAC;AAUvB,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../../src/api/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -129,6 +129,7 @@ import { cloneWithoutBlockedObjectKeys, decodePathComponent, getErrorMessage, ha
|
|
|
129
129
|
import { applySignalQrOverride } from "./signal-routes.js";
|
|
130
130
|
import { discoverSkills } from "./skill-discovery-helpers.js";
|
|
131
131
|
import { handleSkillsRoutes } from "./skills-routes.js";
|
|
132
|
+
import { handleAccountsRoutes } from "./accounts-routes.js";
|
|
132
133
|
import { handleSubscriptionRoutes } from "./subscription-routes.js";
|
|
133
134
|
import { handleTelegramAccountRoute } from "./telegram-account-routes.js";
|
|
134
135
|
import { handleTriggerRoutes } from "./trigger-routes.js";
|
|
@@ -818,6 +819,19 @@ async function handleRequest(req, res, state, ctx) {
|
|
|
818
819
|
})) {
|
|
819
820
|
return;
|
|
820
821
|
}
|
|
822
|
+
if (await handleAccountsRoutes({
|
|
823
|
+
req,
|
|
824
|
+
res,
|
|
825
|
+
method,
|
|
826
|
+
pathname,
|
|
827
|
+
readJsonBody,
|
|
828
|
+
json,
|
|
829
|
+
error,
|
|
830
|
+
state: { config: state.config },
|
|
831
|
+
saveConfig: saveElizaConfig,
|
|
832
|
+
})) {
|
|
833
|
+
return;
|
|
834
|
+
}
|
|
821
835
|
// ═══════════════════════════════════════════════════════════════════════
|
|
822
836
|
// Health / status / runtime routes (extracted to health-routes.ts)
|
|
823
837
|
// ═══════════════════════════════════════════════════════════════════════
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscription-routes.d.ts","sourceRoot":"","sources":["../../../../../src/api/subscription-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"subscription-routes.d.ts","sourceRoot":"","sources":["../../../../../src/api/subscription-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAM5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,KAAK,UAAU,GAAG,cAAc,eAAe,CAAC,CAAC;AAEjD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,UAAU,EACR,uBAAuB,GACvB,qBAAqB,GACrB,iBAAiB,GACjB,iBAAiB,GACjB,8BAA8B,GAC9B,mBAAmB,CACtB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,KAAK,EAAE,sBAAsB,CAAC;IAC9B,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC1C,oBAAoB,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC1D;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,wBAAwB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAwQlB"}
|
|
@@ -6,7 +6,27 @@ export async function handleSubscriptionRoutes(ctx) {
|
|
|
6
6
|
if (method === "GET" && pathname === "/api/subscription/status") {
|
|
7
7
|
try {
|
|
8
8
|
const { getSubscriptionStatus } = await loadSubscriptionAuth();
|
|
9
|
-
|
|
9
|
+
const baseRows = getSubscriptionStatus();
|
|
10
|
+
// Join each per-account row with its rich LinkedAccountConfig
|
|
11
|
+
// entry from `milady.json` (priority, enabled, health, usage).
|
|
12
|
+
// CLI / setup-token / Claude Code rows have synthetic accountIds
|
|
13
|
+
// and no config-level row — they pass through unchanged so the
|
|
14
|
+
// UI's existing `find(s => s.provider === ...)` keeps working.
|
|
15
|
+
const linkedAccounts = readRichLinkedAccounts(state.config);
|
|
16
|
+
const rows = baseRows.map((row) => {
|
|
17
|
+
const linked = linkedAccounts[row.accountId];
|
|
18
|
+
if (!linked || linked.providerId !== row.provider)
|
|
19
|
+
return row;
|
|
20
|
+
const enriched = {
|
|
21
|
+
...row,
|
|
22
|
+
priority: linked.priority,
|
|
23
|
+
enabled: linked.enabled,
|
|
24
|
+
health: linked.health,
|
|
25
|
+
...(linked.usage ? { usage: linked.usage } : {}),
|
|
26
|
+
};
|
|
27
|
+
return enriched;
|
|
28
|
+
});
|
|
29
|
+
json(res, { providers: rows });
|
|
10
30
|
}
|
|
11
31
|
catch (err) {
|
|
12
32
|
logger.error(`[api] Failed to get subscription status: ${String(err)}`);
|
|
@@ -211,3 +231,30 @@ export async function handleSubscriptionRoutes(ctx) {
|
|
|
211
231
|
}
|
|
212
232
|
return false;
|
|
213
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Read rich `LinkedAccountConfig` rows out of the dual-shape
|
|
236
|
+
* `linkedAccounts` config bag. Skips legacy
|
|
237
|
+
* `LinkedAccountFlagConfig` entries (provider-name keys like
|
|
238
|
+
* `elizacloud`) — those are filtered out by the shape check.
|
|
239
|
+
*/
|
|
240
|
+
function readRichLinkedAccounts(config) {
|
|
241
|
+
const bag = config.linkedAccounts;
|
|
242
|
+
if (!bag)
|
|
243
|
+
return {};
|
|
244
|
+
const out = {};
|
|
245
|
+
for (const [key, value] of Object.entries(bag)) {
|
|
246
|
+
if (!value || typeof value !== "object")
|
|
247
|
+
continue;
|
|
248
|
+
const candidate = value;
|
|
249
|
+
if (typeof candidate.id === "string" &&
|
|
250
|
+
typeof candidate.providerId === "string" &&
|
|
251
|
+
typeof candidate.label === "string" &&
|
|
252
|
+
typeof candidate.enabled === "boolean" &&
|
|
253
|
+
typeof candidate.priority === "number" &&
|
|
254
|
+
typeof candidate.createdAt === "number" &&
|
|
255
|
+
typeof candidate.health === "string") {
|
|
256
|
+
out[key] = candidate;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return out;
|
|
260
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../../../src/auth/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EACL,KAAK,uBAAuB,EAM7B,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAEtB,KAAK,oBAAoB,EAC1B,MAAM,YAAY,CAAC;AAsBpB;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,gBAAgB,EAC7B,SAAS,GAAE,MAA2B,GACrC,IAAI,CAuBN;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,GAAE,MAA2B,GACrC,iBAAiB,GAAG,IAAI,CAI1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,GAAE,MAA2B,GACrC,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,GAAE,MAA2B,GACrC,OAAO,CAIT;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,oBAAoB,GAC7B,uBAAuB,EAAE,CAE3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyCxB;AAuCD,MAAM,MAAM,4BAA4B,GACpC,KAAK,GACL,iBAAiB,GACjB,aAAa,GACb,WAAW,GACX,IAAI,CAAC;AAET;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;CACtC;AAED,wBAAgB,qBAAqB,IAAI,yBAAyB,EAAE,CAwEnE;AA+ID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,CAAC,EAAE;IAC1D,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE;YAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;KAC5E,CAAC;CACH,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../../../src/auth/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EACL,KAAK,uBAAuB,EAM7B,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAEtB,KAAK,oBAAoB,EAC1B,MAAM,YAAY,CAAC;AAsBpB;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,gBAAgB,EAC7B,SAAS,GAAE,MAA2B,GACrC,IAAI,CAuBN;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,GAAE,MAA2B,GACrC,iBAAiB,GAAG,IAAI,CAI1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,GAAE,MAA2B,GACrC,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,GAAE,MAA2B,GACrC,OAAO,CAIT;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,oBAAoB,GAC7B,uBAAuB,EAAE,CAE3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyCxB;AAuCD,MAAM,MAAM,4BAA4B,GACpC,KAAK,GACL,iBAAiB,GACjB,aAAa,GACb,WAAW,GACX,IAAI,CAAC;AAET;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;CACtC;AAED,wBAAgB,qBAAqB,IAAI,yBAAyB,EAAE,CAwEnE;AA+ID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,CAAC,EAAE;IAC1D,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE;YAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;KAC5E,CAAC;CACH,GAAG,OAAO,CAAC,IAAI,CAAC,CAmGhB"}
|
|
@@ -396,11 +396,22 @@ export async function applySubscriptionCredentials(config) {
|
|
|
396
396
|
}
|
|
397
397
|
// ── OpenAI Codex subscription → set OPENAI_API_KEY ────────────────────
|
|
398
398
|
//
|
|
399
|
-
//
|
|
400
|
-
//
|
|
399
|
+
// Account selection goes through the WS2 AccountPool when its shim is
|
|
400
|
+
// installed (via `app-core`'s `getDefaultAccountPool()` accessor). The
|
|
401
|
+
// shim is symbol-keyed on `globalThis` so this package doesn't need to
|
|
402
|
+
// depend on `@elizaos/app-core`. When the shim is absent (e.g. agent
|
|
403
|
+
// running without app-core), we fall back to the lowest-createdAt
|
|
404
|
+
// account, which is stable for single-account installs.
|
|
401
405
|
const codexAccounts = listProviderAccounts("openai-codex");
|
|
402
406
|
if (codexAccounts.length > 0) {
|
|
403
|
-
const
|
|
407
|
+
const selectorSymbol = Symbol.for("milady.account-pool.subscription-selector.v1");
|
|
408
|
+
const selector = globalThis[selectorSymbol];
|
|
409
|
+
let chosenId = null;
|
|
410
|
+
if (selector) {
|
|
411
|
+
chosenId = await selector.pickAccountId("openai-codex");
|
|
412
|
+
}
|
|
413
|
+
const primary = codexAccounts.find((a) => a.id === chosenId) ??
|
|
414
|
+
codexAccounts.slice().sort((a, b) => a.createdAt - b.createdAt)[0];
|
|
404
415
|
const codexToken = await getAccessToken("openai-codex", primary.id);
|
|
405
416
|
if (codexToken) {
|
|
406
417
|
process.env.OPENAI_API_KEY = codexToken;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
export * from "./account-storage.js";
|
|
1
2
|
export * from "./anthropic.js";
|
|
2
3
|
export * from "./claude-code-stealth.js";
|
|
3
4
|
export * from "./credentials.js";
|
|
5
|
+
export * from "./oauth-flow.js";
|
|
4
6
|
export * from "./openai-codex.js";
|
|
5
7
|
export * from "./types.js";
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth flow orchestration registry.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the provider-specific programmatic OAuth helpers
|
|
5
|
+
* (`startAnthropicOAuthFlowRaw` from
|
|
6
|
+
* `vendor/pi-oauth/anthropic-login.ts` and the loopback-listener flow
|
|
7
|
+
* in `openai-codex.ts`) with:
|
|
8
|
+
*
|
|
9
|
+
* - a 5-minute timeout per flow,
|
|
10
|
+
* - automatic `saveAccount(...)` after token exchange,
|
|
11
|
+
* - an in-memory registry keyed by `sessionId` so the HTTP API can
|
|
12
|
+
* stream progress over SSE and the CLI can `await` completion,
|
|
13
|
+
* - garbage collection 10 minutes after a flow reaches a terminal
|
|
14
|
+
* state.
|
|
15
|
+
*
|
|
16
|
+
* Both the CLI and the new accounts-routes HTTP endpoints drive flows
|
|
17
|
+
* through this module — there is no direct caller of the vendor-level
|
|
18
|
+
* OAuth helpers anymore.
|
|
19
|
+
*/
|
|
20
|
+
import { type AccountCredentialRecord } from "./account-storage.js";
|
|
21
|
+
import type { SubscriptionProvider } from "./types.js";
|
|
22
|
+
/** Server-tracked status of an in-flight OAuth flow. */
|
|
23
|
+
export type FlowStatus = "pending" | "success" | "error" | "cancelled" | "timeout";
|
|
24
|
+
export interface FlowState {
|
|
25
|
+
sessionId: string;
|
|
26
|
+
providerId: SubscriptionProvider;
|
|
27
|
+
status: FlowStatus;
|
|
28
|
+
/** Set on `pending` (so the UI can re-open the browser) and on `success`. */
|
|
29
|
+
authUrl?: string;
|
|
30
|
+
/** Anthropic only — the user must paste `code#state`; Codex uses the loopback callback. */
|
|
31
|
+
needsCodeSubmission: boolean;
|
|
32
|
+
account?: AccountCredentialRecord;
|
|
33
|
+
error?: string;
|
|
34
|
+
startedAt: number;
|
|
35
|
+
endedAt?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface OAuthFlowHandle {
|
|
38
|
+
sessionId: string;
|
|
39
|
+
authUrl: string;
|
|
40
|
+
/** Codex flows resolve via the loopback listener; Anthropic requires `submitCode`. */
|
|
41
|
+
needsCodeSubmission: boolean;
|
|
42
|
+
/** Resolves with the saved AccountCredentialRecord; rejects on cancel/timeout/error. */
|
|
43
|
+
completion: Promise<{
|
|
44
|
+
account: AccountCredentialRecord;
|
|
45
|
+
}>;
|
|
46
|
+
/** Anthropic only — submit `code#state` from the redirect page. No-op for Codex. */
|
|
47
|
+
submitCode: (code: string) => void;
|
|
48
|
+
cancel: (reason?: string) => void;
|
|
49
|
+
}
|
|
50
|
+
interface StartOptions {
|
|
51
|
+
label: string;
|
|
52
|
+
accountId?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Called after the account is saved on disk. Used by the HTTP
|
|
55
|
+
* route layer to also write a `LinkedAccountConfig` row into
|
|
56
|
+
* `milady.json`. Failures here propagate as flow `error`.
|
|
57
|
+
*/
|
|
58
|
+
onAccountSaved?: (account: AccountCredentialRecord) => void | Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Start a programmatic Anthropic OAuth flow. Anthropic's redirect URI
|
|
62
|
+
* is hardcoded to `console.anthropic.com/oauth/code/callback` — the
|
|
63
|
+
* UI must surface the auth URL, prompt the user to copy the
|
|
64
|
+
* `code#state` blob, and call `submitCode()` with it. Once the code is
|
|
65
|
+
* submitted, the token exchange runs and the account is persisted.
|
|
66
|
+
*/
|
|
67
|
+
export declare function startAnthropicOAuthFlow(opts: StartOptions): Promise<OAuthFlowHandle>;
|
|
68
|
+
/**
|
|
69
|
+
* Start a programmatic Codex OAuth flow. Codex has a loopback listener
|
|
70
|
+
* on :1455, so the user just signs in in the browser and the listener
|
|
71
|
+
* picks up the redirect — `submitCode()` is a no-op. The accountId
|
|
72
|
+
* baked into the JWT is preserved on `LinkedAccountConfig.organizationId`
|
|
73
|
+
* (used by the Codex usage probe via the `ChatGPT-Account-Id` header).
|
|
74
|
+
*/
|
|
75
|
+
export declare function startCodexOAuthFlow(opts: StartOptions): Promise<OAuthFlowHandle>;
|
|
76
|
+
export declare function getFlowState(sessionId: string): FlowState | null;
|
|
77
|
+
export declare function getFlowHandle(sessionId: string): OAuthFlowHandle | null;
|
|
78
|
+
/**
|
|
79
|
+
* Subscribe to status updates for a flow. Replays the current state
|
|
80
|
+
* synchronously so SSE consumers always receive an immediate frame.
|
|
81
|
+
* Returns an unsubscribe function.
|
|
82
|
+
*/
|
|
83
|
+
export declare function subscribeFlow(sessionId: string, listener: (state: FlowState) => void): () => void;
|
|
84
|
+
export declare function cancelFlow(sessionId: string, reason?: string): boolean;
|
|
85
|
+
export declare function submitFlowCode(sessionId: string, code: string): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Remove every flow from the registry. Tests use this to reset
|
|
88
|
+
* between cases without resetting the whole module.
|
|
89
|
+
*/
|
|
90
|
+
export declare function _resetFlowRegistry(): void;
|
|
91
|
+
/**
|
|
92
|
+
* Test-only helper to seed a synthetic flow without going through the
|
|
93
|
+
* vendor layer. Used by `accounts-routes.test.ts` to assert the SSE
|
|
94
|
+
* surface streams `success` / `error` payloads correctly.
|
|
95
|
+
*/
|
|
96
|
+
export declare function _registerSyntheticFlow(args: {
|
|
97
|
+
sessionId?: string;
|
|
98
|
+
providerId: SubscriptionProvider;
|
|
99
|
+
authUrl: string;
|
|
100
|
+
needsCodeSubmission?: boolean;
|
|
101
|
+
}): {
|
|
102
|
+
sessionId: string;
|
|
103
|
+
complete: (state: FlowState) => void;
|
|
104
|
+
};
|
|
105
|
+
export {};
|
|
106
|
+
//# sourceMappingURL=oauth-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-flow.d.ts","sourceRoot":"","sources":["../../../../../src/auth/oauth-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMvD,wDAAwD;AACxD,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,SAAS,GACT,OAAO,GACP,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,oBAAoB,CAAC;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,mBAAmB,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wFAAwF;IACxF,UAAU,EAAE,OAAO,CAAC;QAAE,OAAO,EAAE,uBAAuB,CAAA;KAAE,CAAC,CAAC;IAC1D,oFAAoF;IACpF,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAuED,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAID;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,eAAe,CAAC,CAqB1B;AAID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,eAAe,CAAC,CAmB1B;AA2ID,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGhE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAGvE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GACnC,MAAM,IAAI,CASZ;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAMtE;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAOvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,oBAAoB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;CAAE,CA+B9D"}
|