@trusty-squire/mcp 0.1.17 → 0.2.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/bin.js +2 -2
- package/dist/bin.js.map +1 -1
- package/dist/bot/agent.d.ts +7 -1
- package/dist/bot/agent.d.ts.map +1 -1
- package/dist/bot/agent.js +396 -39
- package/dist/bot/agent.js.map +1 -1
- package/dist/bot/browser.d.ts +15 -3
- package/dist/bot/browser.d.ts.map +1 -1
- package/dist/bot/browser.js +273 -56
- package/dist/bot/browser.js.map +1 -1
- package/dist/bot/google-login.d.ts +18 -0
- package/dist/bot/google-login.d.ts.map +1 -0
- package/dist/bot/google-login.js +379 -0
- package/dist/bot/google-login.js.map +1 -0
- package/dist/bot/index.d.ts +5 -0
- package/dist/bot/index.d.ts.map +1 -1
- package/dist/bot/index.js +14 -0
- package/dist/bot/index.js.map +1 -1
- package/dist/bot/llm-client.d.ts.map +1 -1
- package/dist/bot/llm-client.js +19 -12
- package/dist/bot/llm-client.js.map +1 -1
- package/dist/bot/oauth-lock.d.ts +2 -0
- package/dist/bot/oauth-lock.d.ts.map +1 -0
- package/dist/bot/oauth-lock.js +28 -0
- package/dist/bot/oauth-lock.js.map +1 -0
- package/dist/bot/oauth-providers.d.ts +16 -0
- package/dist/bot/oauth-providers.d.ts.map +1 -0
- package/dist/bot/oauth-providers.js +100 -0
- package/dist/bot/oauth-providers.js.map +1 -0
- package/dist/bot/oauth-thin-slice.d.ts +2 -0
- package/dist/bot/oauth-thin-slice.d.ts.map +1 -0
- package/dist/bot/oauth-thin-slice.js +203 -0
- package/dist/bot/oauth-thin-slice.js.map +1 -0
- package/dist/bot/profile.d.ts +2 -0
- package/dist/bot/profile.d.ts.map +1 -0
- package/dist/bot/profile.js +11 -0
- package/dist/bot/profile.js.map +1 -0
- package/dist/install/cli.d.ts +4 -1
- package/dist/install/cli.d.ts.map +1 -1
- package/dist/install/cli.js +41 -1
- package/dist/install/cli.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/provision-any.d.ts +50 -46
- package/dist/tools/provision-any.d.ts.map +1 -1
- package/dist/tools/provision-any.js +266 -107
- package/dist/tools/provision-any.js.map +1 -1
- package/package.json +3 -1
package/dist/bot/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,KAAK,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,KAAK,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,KAAK,YAAY,EAAE,qBAAqB,EAAE,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EACL,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAG3B,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAK/B,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAO/B,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAOtC,aAAa,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;CAC7C;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,gBAAgB;IAWlB,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC;YAWtD,UAAU;CA6CzB"}
|
package/dist/bot/index.js
CHANGED
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
import { randomBytes } from "crypto";
|
|
4
4
|
import { BrowserController } from "./browser.js";
|
|
5
5
|
import { SignupAgent, LLMCallBudgetExceeded } from "./agent.js";
|
|
6
|
+
import { withOAuthLock } from "./oauth-lock.js";
|
|
6
7
|
export { LLMCallBudgetExceeded };
|
|
8
|
+
export { withOAuthLock } from "./oauth-lock.js";
|
|
9
|
+
export { isOAuthProviderId } from "./oauth-providers.js";
|
|
7
10
|
export { InboxClient } from "./inbox-client.js";
|
|
8
11
|
export { detectAsn } from "./asn.js";
|
|
9
12
|
export { pickLLMClient, pickLLMPair, AnthropicDirectClient, OpenRouterClient, ProxyLLMClient, } from "./llm-client.js";
|
|
@@ -23,6 +26,16 @@ export class UniversalSignupBot {
|
|
|
23
26
|
return password;
|
|
24
27
|
}
|
|
25
28
|
async signup(request) {
|
|
29
|
+
// T8/D2 — OAuth runs all launch Chrome from the one shared
|
|
30
|
+
// persistent profile, which Chrome single-instances. Serialize
|
|
31
|
+
// them so a second concurrent run queues rather than corrupting
|
|
32
|
+
// the profile lock. Form-fill runs are unaffected.
|
|
33
|
+
if (request.oauthProvider !== undefined) {
|
|
34
|
+
return withOAuthLock(() => this.runSession(request));
|
|
35
|
+
}
|
|
36
|
+
return this.runSession(request);
|
|
37
|
+
}
|
|
38
|
+
async runSession(request) {
|
|
26
39
|
// Defaults: humanize=true (production behavior — we want to pass
|
|
27
40
|
// Cloudflare/reCAPTCHA scoring). Tests can pass `humanize: false`
|
|
28
41
|
// to skip the behavior-simulation overhead.
|
|
@@ -48,6 +61,7 @@ export class UniversalSignupBot {
|
|
|
48
61
|
email,
|
|
49
62
|
generatePassword: () => this.generatePassword(),
|
|
50
63
|
inbox: request.inbox,
|
|
64
|
+
oauthProvider: request.oauthProvider,
|
|
51
65
|
});
|
|
52
66
|
console.error(`[UniversalBot] Result: ${result.success ? "SUCCESS" : "FAILED"}`);
|
|
53
67
|
if (result.success && result.credentials) {
|
package/dist/bot/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,6DAA6D;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,WAAW,EAAqB,qBAAqB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../src/bot/llm-client.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,YAAY,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IAGb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACtD;AAID,qBAAa,qBAAsB,YAAW,SAAS;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAM9C,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CA0B3D;AAOD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IAOf,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,gBAAiB,YAAW,SAAS;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,IAAI,EAAE,oBAAoB;IAShC,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../src/bot/llm-client.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/llm-client.js
CHANGED
|
@@ -29,7 +29,7 @@ export class AnthropicDirectClient {
|
|
|
29
29
|
model;
|
|
30
30
|
constructor(opts) {
|
|
31
31
|
this.client = new Anthropic({ apiKey: opts.apiKey });
|
|
32
|
-
this.model = opts.model ?? "claude-
|
|
32
|
+
this.model = opts.model ?? "claude-sonnet-4-6";
|
|
33
33
|
this.name = `anthropic:${this.model}`;
|
|
34
34
|
}
|
|
35
35
|
async createMessage(req) {
|
|
@@ -88,7 +88,11 @@ export class OpenRouterClient {
|
|
|
88
88
|
],
|
|
89
89
|
};
|
|
90
90
|
if (this.fallbackModels.length > 0) {
|
|
91
|
-
|
|
91
|
+
// OpenRouter caps the `models` routing array at 3 items — a
|
|
92
|
+
// longer list is a hard 400 ("'models' array must have 3 items
|
|
93
|
+
// or fewer"). Cap defensively so an over-long fallback list
|
|
94
|
+
// degrades to "first 3" instead of failing the whole call.
|
|
95
|
+
body["models"] = [this.model, ...this.fallbackModels].slice(0, 3);
|
|
92
96
|
}
|
|
93
97
|
const resp = await fetch("https://openrouter.ai/api/v1/chat/completions", {
|
|
94
98
|
method: "POST",
|
|
@@ -169,14 +173,16 @@ export class ProxyLLMClient {
|
|
|
169
173
|
}
|
|
170
174
|
}
|
|
171
175
|
// "Cheapest serviceable" for our use case: needs vision + good JSON
|
|
172
|
-
// adherence + reasonable speed.
|
|
173
|
-
//
|
|
174
|
-
//
|
|
176
|
+
// adherence + reasonable speed. Ordered by cost-per-1M-input tokens
|
|
177
|
+
// ascending (rates approximate, late-2025; OpenRouter updates daily,
|
|
178
|
+
// the relative order is what matters). Kept to exactly 3 entries:
|
|
179
|
+
// OpenRouter's `models` routing array caps at 3 (see OpenRouterClient),
|
|
180
|
+
// so a 4th would be silently dropped anyway. The previous list
|
|
181
|
+
// (gemini-flash-1.5*) was retired from OpenRouter — keep these current.
|
|
175
182
|
const CHEAP_VISION_MODELS_OR = [
|
|
176
|
-
"google/gemini-flash-
|
|
177
|
-
"
|
|
178
|
-
"
|
|
179
|
-
"openai/gpt-4o-mini", // ~$0.15/1M input — vision, JSON great
|
|
183
|
+
"google/gemini-2.0-flash-001", // ~$0.10/1M input — vision, fast, solid JSON
|
|
184
|
+
"openai/gpt-4o-mini", // ~$0.15/1M input — vision, excellent JSON
|
|
185
|
+
"google/gemini-2.5-flash", // ~$0.30/1M input — vision, strongest of the three
|
|
180
186
|
];
|
|
181
187
|
export function pickLLMClient(opts = {}) {
|
|
182
188
|
return pickLLMPair(opts).primary;
|
|
@@ -222,11 +228,12 @@ export function pickLLMPair(opts = {}) {
|
|
|
222
228
|
...(primaryModel !== undefined ? { model: primaryModel } : {}),
|
|
223
229
|
fallbackModels: fallbacks,
|
|
224
230
|
});
|
|
225
|
-
// Premium fallback: Claude
|
|
226
|
-
//
|
|
231
|
+
// Premium fallback: Claude Sonnet via OR — only triggers on parse
|
|
232
|
+
// failures, so amortized cost is small. (anthropic/claude-3.5-sonnet
|
|
233
|
+
// was retired from OpenRouter; claude-sonnet-4.5 is the current id.)
|
|
227
234
|
const premium = new OpenRouterClient({
|
|
228
235
|
apiKey: orKey,
|
|
229
|
-
model: "anthropic/claude-
|
|
236
|
+
model: "anthropic/claude-sonnet-4.5",
|
|
230
237
|
});
|
|
231
238
|
return { primary, premium };
|
|
232
239
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/bot/llm-client.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,wBAAwB;AACxB,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,qEAAqE;AACrE,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,sEAAsE;AACtE,iDAAiD;AACjD,wCAAwC;AACxC,EAAE;AACF,uEAAuE;AACvE,wDAAwD;AACxD,qEAAqE;AACrE,qCAAqC;AACrC,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAE1E,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAuC1C,yBAAyB;AAEzB,MAAM,OAAO,qBAAqB;IACvB,IAAI,CAAS;IACL,MAAM,CAAY;IAClB,KAAK,CAAS;IAE/B,YAAY,IAAwC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/bot/llm-client.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,wBAAwB;AACxB,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,qEAAqE;AACrE,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,sEAAsE;AACtE,iDAAiD;AACjD,wCAAwC;AACxC,EAAE;AACF,uEAAuE;AACvE,wDAAwD;AACxD,qEAAqE;AACrE,qCAAqC;AACrC,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAE1E,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAuC1C,yBAAyB;AAEzB,MAAM,OAAO,qBAAqB;IACvB,IAAI,CAAS;IACL,MAAM,CAAY;IAClB,KAAK,CAAS;IAE/B,YAAY,IAAwC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,mBAAmB,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,aAAa,IAAI,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAe;QACjC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,IAAI,KAAK,OAAO;YAChB,CAAC,CAAC;gBACE,IAAI,EAAE,OAAgB;gBACtB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;aACnF;YACH,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAC5C,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC7C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAC9D,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YACrC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;YACvC,OAAO,EAAE,IAAI,CAAC,IAAI;SACnB,CAAC;IACJ,CAAC;CACF;AAwBD,MAAM,OAAO,gBAAgB;IAClB,IAAI,CAAS;IACL,MAAM,CAAS;IACf,KAAK,CAAS;IACd,cAAc,CAAW;IACzB,OAAO,CAAS;IAChB,MAAM,CAAS;IAEhC,YAAY,IAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,iBAAiB,CAAC;QAC7E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,yBAAyB,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAe;QACjC,MAAM,WAAW,GAGb,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,CAAC,CAAC,IAAI,KAAK,OAAO;YAChB,CAAC,CAAC;gBACE,IAAI,EAAE,WAAoB;gBAC1B,SAAS,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,WAAW,EAAE,EAAE;aACnE;YACH,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAC5C,CAAC;QAEF,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;gBACvC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;aACvC;SACF,CAAC;QACF,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,4DAA4D;YAC5D,+DAA+D;YAC/D,4DAA4D;YAC5D,2DAA2D;YAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,+CAA+C,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACtC,cAAc,EAAE,IAAI,CAAC,MAAM;gBAC3B,SAAS,EAAE,IAAI,CAAC,OAAO;aACxB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAI9B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC;QACjD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO;YACL,IAAI,EAAE,OAAO;YACb,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;SAC3E,CAAC;IACJ,CAAC;CACF;AAqBD,MAAM,OAAO,cAAc;IAChB,IAAI,CAAS;IACL,UAAU,CAAS;IACnB,YAAY,CAAS;IACrB,IAAI,CAAsB;IAE3C,YAAY,IAAwB;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,uBAAuB,IAAI,CAAC,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAe;QACjC,mEAAmE;QACnE,4DAA4D;QAC5D,wBAAwB;QACxB,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvB,CAAC,CAAC,IAAI,KAAK,OAAO;gBAChB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;gBAClF,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAC5C;YACD,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,cAAc,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,iBAAiB,EAAE,IAAI,CAAC,YAAY;aACrC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA8B,CAAC;YAChF,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,CAAC,IAAI,+BAA+B,IAAI,CAAC,YAAY,IAAI,GAAG,+DAA+D,CACnI,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,0CAA0C,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAK9B,CAAC;QACF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI;YAClC,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CAAC;IACJ,CAAC;CACF;AAoBD,oEAAoE;AACpE,oEAAoE;AACpE,qEAAqE;AACrE,kEAAkE;AAClE,wEAAwE;AACxE,+DAA+D;AAC/D,wEAAwE;AACxE,MAAM,sBAAsB,GAAa;IACvC,6BAA6B,EAAE,6CAA6C;IAC5E,oBAAoB,EAAW,2CAA2C;IAC1E,yBAAyB,EAAM,mDAAmD;CACnF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,OAA0B,EAAE;IACxD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;AACnC,CAAC;AAED,sEAAsE;AACtE,yEAAyE;AACzE,iDAAiD;AACjD,EAAE;AACF,uEAAuE;AACvE,oEAAoE;AACpE,iEAAiE;AACjE,iDAAiD;AACjD,EAAE;AACF,sCAAsC;AACtC,uEAAuE;AACvE,2DAA2D;AAC3D,EAAE;AACF,qCAAqC;AACrC,6CAA6C;AAC7C,wBAAwB;AACxB,EAAE;AACF,oBAAoB;AACpB,EAAE;AACF,uEAAuE;AACvE,4DAA4D;AAC5D,MAAM,UAAU,WAAW,CAAC,OAA0B,EAAE;IACtD,qDAAqD;IACrD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAC7D,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,mCAAmC,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChF,MAAM,OAAO,GACX,IAAI,CAAC,WAAW,KAAK,IAAI;YACvB,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACnE,CAAC,CAAC,IAAI,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC7C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,CAAC,YAAY,EAAE,GAAG,SAAS,CAAC,GAAG,sBAAsB,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;gBACnC,MAAM,EAAE,KAAK;gBACb,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,cAAc,EAAE,SAAS;aAC1B,CAAC,CAAC;YACH,kEAAkE;YAClE,qEAAqE;YACrE,qEAAqE;YACrE,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;gBACnC,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,6BAA6B;aACrC,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO;YACL,OAAO,EAAE,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAChD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACnD,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO;YACL,OAAO,EAAE,IAAI,qBAAqB,CAAC;gBACjC,MAAM,EAAE,YAAY;gBACpB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7F,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-lock.d.ts","sourceRoot":"","sources":["../../src/bot/oauth-lock.ts"],"names":[],"mappings":"AAsBA,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CASjE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// oauth-lock.ts — process-wide serialization for OAuth signup runs (T8).
|
|
2
|
+
//
|
|
3
|
+
// Every signup run launches Chrome from the one shared persistent
|
|
4
|
+
// profile (profile.ts / browser.ts). Chrome single-instances a
|
|
5
|
+
// userDataDir: two concurrent launchPersistentContext calls on the
|
|
6
|
+
// same directory lock-contend or corrupt the profile. Decision D2
|
|
7
|
+
// (eng review) chose serialization over copy-on-write clones — clones
|
|
8
|
+
// are fragile on ext4 and Google's device-bound (DBSC) cookies do not
|
|
9
|
+
// survive a copy — so OAuth runs queue through this mutex instead.
|
|
10
|
+
//
|
|
11
|
+
// `provision_any_service` is async (it returns a run_id and works in
|
|
12
|
+
// the background), so two OAuth runs genuinely can overlap in one MCP
|
|
13
|
+
// server process. The second one waits here for the first to release.
|
|
14
|
+
// The tail of the queue: each acquirer chains onto it, so callers run
|
|
15
|
+
// strictly one after another in arrival order.
|
|
16
|
+
let tail = Promise.resolve();
|
|
17
|
+
// Run `fn` with the OAuth profile lock held — it starts only once
|
|
18
|
+
// every previously-queued run has settled. The lock is released (the
|
|
19
|
+
// chain advances) however `fn` settles, success or failure, so one
|
|
20
|
+
// crashed run never wedges the queue.
|
|
21
|
+
export function withOAuthLock(fn) {
|
|
22
|
+
// `.then(fn, fn)` runs `fn` regardless of how the previous link
|
|
23
|
+
// settled — a rejected predecessor still releases the lock.
|
|
24
|
+
const run = tail.then(fn, fn);
|
|
25
|
+
tail = run.then(() => undefined, () => undefined);
|
|
26
|
+
return run;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=oauth-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-lock.js","sourceRoot":"","sources":["../../src/bot/oauth-lock.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,kEAAkE;AAClE,+DAA+D;AAC/D,mEAAmE;AACnE,kEAAkE;AAClE,sEAAsE;AACtE,sEAAsE;AACtE,mEAAmE;AACnE,EAAE;AACF,qEAAqE;AACrE,sEAAsE;AACtE,sEAAsE;AAEtE,sEAAsE;AACtE,+CAA+C;AAC/C,IAAI,IAAI,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;AAE/C,kEAAkE;AAClE,qEAAqE;AACrE,mEAAmE;AACnE,sCAAsC;AACtC,MAAM,UAAU,aAAa,CAAI,EAAoB;IACnD,gEAAgE;IAChE,4DAA4D;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAG,CAAC,IAAI,CACb,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { extractOAuthScopes } from "./google-login.js";
|
|
2
|
+
export { extractOAuthScopes };
|
|
3
|
+
export type OAuthProviderId = "google" | "github";
|
|
4
|
+
export type OAuthAuthState = "consent" | "needs_login" | "challenge" | "not_provider";
|
|
5
|
+
export declare function classifyGitHubAuthState(url: string, bodyText: string): OAuthAuthState;
|
|
6
|
+
export declare function githubScopesAreBasic(scopes: readonly string[]): boolean;
|
|
7
|
+
export interface OAuthProvider {
|
|
8
|
+
id: OAuthProviderId;
|
|
9
|
+
label: string;
|
|
10
|
+
buttonKeyword: string;
|
|
11
|
+
classifyAuthState(url: string, bodyText: string): OAuthAuthState;
|
|
12
|
+
scopesAreBasic(scopes: readonly string[]): boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare const OAUTH_PROVIDERS: Record<OAuthProviderId, OAuthProvider>;
|
|
15
|
+
export declare function isOAuthProviderId(value: string): value is OAuthProviderId;
|
|
16
|
+
//# sourceMappingURL=oauth-providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-providers.d.ts","sourceRoot":"","sources":["../../src/bot/oauth-providers.ts"],"names":[],"mappings":"AAgBA,OAAO,EAGL,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAKlD,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,aAAa,GACb,WAAW,GACX,cAAc,CAAC;AAQnB,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CA0CrF;AAaD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAEvE;AAGD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,eAAe,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC;IACjE,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC;CACpD;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,CAkBlE,CAAC;AAGF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,eAAe,CAEzE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// oauth-providers.ts — T13. The provider abstraction behind the
|
|
2
|
+
// OAuth-first signup flow.
|
|
3
|
+
//
|
|
4
|
+
// Phase 1 was Google-only (D7). Phase 2 adds GitHub: for a developer
|
|
5
|
+
// audience "Sign in with GitHub" is as common as Google. The signup
|
|
6
|
+
// flow (agent.ts runOAuthFlow) is identical in shape per provider —
|
|
7
|
+
// click the affordance, walk the consent screens, scope-gate them —
|
|
8
|
+
// so the per-provider differences are captured in one descriptor:
|
|
9
|
+
// how to classify the provider's auth pages and which scopes are
|
|
10
|
+
// basic enough to auto-approve.
|
|
11
|
+
//
|
|
12
|
+
// D7 — the consent gate is provider-aware: Google-OIDC scope vocabulary
|
|
13
|
+
// (openid/email/profile) would abort every GitHub signup, and GitHub's
|
|
14
|
+
// repo/admin/org scopes must abort. Each provider carries its own
|
|
15
|
+
// allowlist.
|
|
16
|
+
import { classifyGoogleAuthState, scopesAreBasic as googleScopesAreBasic, extractOAuthScopes, } from "./google-login.js";
|
|
17
|
+
// extractOAuthScopes reads the `scope` query parameter — provider-
|
|
18
|
+
// agnostic (Google and GitHub both carry it on the consent URL), so
|
|
19
|
+
// the agent imports it from here alongside the provider registry.
|
|
20
|
+
export { extractOAuthScopes };
|
|
21
|
+
// --- GitHub auth-page classifier (the GitHub analogue of T5) ---------
|
|
22
|
+
// After the bot clicks "Sign in with GitHub" the browser lands on a
|
|
23
|
+
// github.com page. This classifies which one, so the consent flow
|
|
24
|
+
// proceeds ONLY on the authorize screen and otherwise hands back.
|
|
25
|
+
// CRITICAL (mirrors the Google guarantee): a `needs_login`/`challenge`
|
|
26
|
+
// result means the bot stops and NEVER types into GitHub's form.
|
|
27
|
+
export function classifyGitHubAuthState(url, bodyText) {
|
|
28
|
+
let parsed;
|
|
29
|
+
try {
|
|
30
|
+
parsed = new URL(url);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return "not_provider";
|
|
34
|
+
}
|
|
35
|
+
if (!/(^|\.)github\.com$/i.test(parsed.hostname)) {
|
|
36
|
+
return "not_provider";
|
|
37
|
+
}
|
|
38
|
+
const path = parsed.pathname.toLowerCase();
|
|
39
|
+
const text = bodyText.toLowerCase();
|
|
40
|
+
// Challenge — 2FA or device verification. Checked first: a 2FA page
|
|
41
|
+
// also sits under /sessions, and GitHub gates a new-app authorize
|
|
42
|
+
// behind it.
|
|
43
|
+
if (path.includes("/sessions/two-factor") ||
|
|
44
|
+
path.includes("/sessions/verified-device") ||
|
|
45
|
+
path.includes("/two-factor") ||
|
|
46
|
+
text.includes("two-factor authentication") ||
|
|
47
|
+
text.includes("verify your device") ||
|
|
48
|
+
text.includes("device verification")) {
|
|
49
|
+
return "challenge";
|
|
50
|
+
}
|
|
51
|
+
// Consent — the OAuth authorize screen. The path is the reliable
|
|
52
|
+
// signal; the text fallback catches a re-styled page.
|
|
53
|
+
if (path.includes("/login/oauth/authorize") ||
|
|
54
|
+
text.includes("wants to access your") ||
|
|
55
|
+
text.includes("by clicking authorize")) {
|
|
56
|
+
return "consent";
|
|
57
|
+
}
|
|
58
|
+
// Everything else on github.com → GitHub wants credentials. Erring
|
|
59
|
+
// toward needs_login is the safe default (mirrors the Google
|
|
60
|
+
// classifier) — it stops the bot rather than risk it proceeding
|
|
61
|
+
// into a page it must not automate.
|
|
62
|
+
return "needs_login";
|
|
63
|
+
}
|
|
64
|
+
// --- GitHub consent scope gate ---------------------------------------
|
|
65
|
+
// GitHub's scope vocabulary is its own. Basic identity is `read:user`
|
|
66
|
+
// and `user:email` (D7). Anything broader — repo, admin:*, write:*,
|
|
67
|
+
// delete_repo, org, gist, workflow, notifications — must abort for
|
|
68
|
+
// human review: a prompt-injected agent must not be able to grant the
|
|
69
|
+
// bot's GitHub a repo-write or org-admin scope.
|
|
70
|
+
const GITHUB_BASIC_SCOPES = new Set(["read:user", "user:email"]);
|
|
71
|
+
// True when EVERY requested scope is basic-identity. Empty list →
|
|
72
|
+
// false: no scopes parsed means we cannot confirm, so we do not
|
|
73
|
+
// auto-approve (consistent with the Google gate). Exported for tests.
|
|
74
|
+
export function githubScopesAreBasic(scopes) {
|
|
75
|
+
return scopes.length > 0 && scopes.every((s) => GITHUB_BASIC_SCOPES.has(s));
|
|
76
|
+
}
|
|
77
|
+
export const OAUTH_PROVIDERS = {
|
|
78
|
+
google: {
|
|
79
|
+
id: "google",
|
|
80
|
+
label: "Google",
|
|
81
|
+
buttonKeyword: "google",
|
|
82
|
+
classifyAuthState: (url, body) => {
|
|
83
|
+
const state = classifyGoogleAuthState(url, body);
|
|
84
|
+
return state === "not_google" ? "not_provider" : state;
|
|
85
|
+
},
|
|
86
|
+
scopesAreBasic: googleScopesAreBasic,
|
|
87
|
+
},
|
|
88
|
+
github: {
|
|
89
|
+
id: "github",
|
|
90
|
+
label: "GitHub",
|
|
91
|
+
buttonKeyword: "github",
|
|
92
|
+
classifyAuthState: classifyGitHubAuthState,
|
|
93
|
+
scopesAreBasic: githubScopesAreBasic,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
// Narrow an arbitrary string to a known provider id.
|
|
97
|
+
export function isOAuthProviderId(value) {
|
|
98
|
+
return value === "google" || value === "github";
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=oauth-providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-providers.js","sourceRoot":"","sources":["../../src/bot/oauth-providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-thin-slice.d.ts","sourceRoot":"","sources":["../../src/bot/oauth-thin-slice.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// oauth-thin-slice.ts — Phase 1, T12 (the payoff).
|
|
2
|
+
//
|
|
3
|
+
// A real, end-to-end OAuth signup on Render — the proof of the
|
|
4
|
+
// OAuth-first pivot. It reuses the Google session the feasibility
|
|
5
|
+
// spike (T1) left in the persistent Chrome profile; re-opening that
|
|
6
|
+
// profile from a fresh process is itself the D8 close/reopen test the
|
|
7
|
+
// deliberately-narrow spike did not cover.
|
|
8
|
+
//
|
|
9
|
+
// What it exercises end to end:
|
|
10
|
+
// persistent-profile reuse → "Sign in with Google" click → the
|
|
11
|
+
// consent scope gate → Render's (multi-stage) post-OAuth onboarding
|
|
12
|
+
// → API-key extraction.
|
|
13
|
+
//
|
|
14
|
+
// Run: cd apps/mcp && npx tsx src/bot/oauth-thin-slice.ts
|
|
15
|
+
//
|
|
16
|
+
// LLM: post-OAuth onboarding navigation needs a vision LLM. Provide one
|
|
17
|
+
// via OPENROUTER_API_KEY, ANTHROPIC_API_KEY, or a working
|
|
18
|
+
// TRUSTY_SQUIRE_MACHINE_TOKEN. Without one the run still proves
|
|
19
|
+
// profile-reuse + the full OAuth handshake, then stops cleanly when the
|
|
20
|
+
// onboarding planner has no backend — the result reports how far it got.
|
|
21
|
+
//
|
|
22
|
+
// Manual dev harness — excluded from the published build via
|
|
23
|
+
// tsconfig.build.json, same as oauth-login-spike.ts.
|
|
24
|
+
import { createRequire } from "node:module";
|
|
25
|
+
import { UniversalSignupBot, pickLLMPair, OpenRouterClient, } from "./index.js";
|
|
26
|
+
import { BrowserController } from "./browser.js";
|
|
27
|
+
import { SignupAgent } from "./agent.js";
|
|
28
|
+
import { CHROME_PROFILE_DIR } from "./profile.js";
|
|
29
|
+
// Service + signup URL — overridable so the harness can be pointed at
|
|
30
|
+
// any previously-failed candidate, not just Render.
|
|
31
|
+
const SERVICE = process.env.T12_SERVICE ?? "Render";
|
|
32
|
+
const SIGNUP_URL = process.env.T12_SIGNUP_URL ?? "https://dashboard.render.com/register";
|
|
33
|
+
// Auth cookies Google only sets after a completed login.
|
|
34
|
+
const GOOGLE_AUTH_COOKIES = ["__Secure-1PSID", "SAPISID", "SID"];
|
|
35
|
+
const require = createRequire(import.meta.url);
|
|
36
|
+
// Mirror BrowserController's stealth chromium resolution.
|
|
37
|
+
function resolveChromium() {
|
|
38
|
+
try {
|
|
39
|
+
const extra = require("playwright-extra");
|
|
40
|
+
const stealth = require("puppeteer-extra-plugin-stealth");
|
|
41
|
+
extra.chromium.use(stealth());
|
|
42
|
+
return extra.chromium;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return require("playwright").chromium;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// D8 — close/reopen. Open the persistent profile in this fresh process,
|
|
49
|
+
// confirm the spike's Google session survived a process boundary, then
|
|
50
|
+
// close it. The bot run below re-opens the same profile a third time.
|
|
51
|
+
async function verifyProfileSession() {
|
|
52
|
+
const chromium = resolveChromium();
|
|
53
|
+
let context;
|
|
54
|
+
try {
|
|
55
|
+
context = await chromium.launchPersistentContext(CHROME_PROFILE_DIR, {
|
|
56
|
+
channel: "chrome",
|
|
57
|
+
headless: true,
|
|
58
|
+
args: ["--no-sandbox", "--disable-dev-shm-usage"],
|
|
59
|
+
});
|
|
60
|
+
const cookies = await context.cookies("https://www.google.com");
|
|
61
|
+
return cookies.some((c) => GOOGLE_AUTH_COOKIES.includes(c.name));
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
if (context !== undefined)
|
|
65
|
+
await context.close();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// A no-op LLM: every reply fails to parse, so postVerifyLoop's planner
|
|
69
|
+
// catch stops onboarding cleanly instead of crashing. Lets the thin
|
|
70
|
+
// slice still prove profile-reuse + the OAuth handshake when no real
|
|
71
|
+
// LLM backend is configured.
|
|
72
|
+
class NoLLM {
|
|
73
|
+
name = "no-llm-stub";
|
|
74
|
+
async createMessage(_req) {
|
|
75
|
+
return { text: "{}", backend: this.name };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function resolveLLM() {
|
|
79
|
+
const orKey = process.env.OPENROUTER_API_KEY ?? "";
|
|
80
|
+
if (orKey.length > 0) {
|
|
81
|
+
// Build a single-model client directly. pickLLMPair's cheap tier
|
|
82
|
+
// ships a fallbackModels list that makes OpenRouter's `models`
|
|
83
|
+
// routing array exceed its 3-item cap (a 400). One vision model,
|
|
84
|
+
// no fallback array, sidesteps it. Claude 3.5 Sonnet is the most
|
|
85
|
+
// reliable at the structured-JSON planner output.
|
|
86
|
+
return {
|
|
87
|
+
llm: new OpenRouterClient({ apiKey: orKey, model: "anthropic/claude-sonnet-4.5" }),
|
|
88
|
+
real: true,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const hasBackend = (process.env.ANTHROPIC_API_KEY ?? "").length > 0 ||
|
|
92
|
+
(process.env.TRUSTY_SQUIRE_MACHINE_TOKEN ?? "").length > 0;
|
|
93
|
+
if (hasBackend)
|
|
94
|
+
return { llm: pickLLMPair({ preferCheap: true }), real: true };
|
|
95
|
+
return { llm: new NoLLM(), real: false };
|
|
96
|
+
}
|
|
97
|
+
// Onboarding-only mode (T12_ONBOARDING_ONLY=1). When the persistent
|
|
98
|
+
// profile is ALREADY authenticated with the service — a service that
|
|
99
|
+
// silent-SSOs you back in whenever the Google session is live, so its
|
|
100
|
+
// signup URL never re-shows the OAuth button — the front-half handshake
|
|
101
|
+
// can't be re-triggered. This mode skips it and exercises just the
|
|
102
|
+
// piece that still needs proving: driving the authenticated dashboard
|
|
103
|
+
// through post-OAuth onboarding to the API key. It reflects into the
|
|
104
|
+
// agent's postVerifyLoop, the same machinery the OAuth path uses.
|
|
105
|
+
async function runOnboardingOnly(llm) {
|
|
106
|
+
const dashboardUrl = process.env.T12_DASHBOARD_URL ?? "https://dashboard.render.com/";
|
|
107
|
+
console.error(`[T12] onboarding-only mode — dashboard: ${dashboardUrl}`);
|
|
108
|
+
const browser = new BrowserController({ humanize: true });
|
|
109
|
+
const steps = [];
|
|
110
|
+
try {
|
|
111
|
+
await browser.start();
|
|
112
|
+
await browser.goto(dashboardUrl);
|
|
113
|
+
await browser.wait(3);
|
|
114
|
+
const agent = new SignupAgent(browser, llm);
|
|
115
|
+
// postVerifyLoop is private — reflected, the same break-the-
|
|
116
|
+
// encapsulation pattern the unit tests use.
|
|
117
|
+
const loop = agent.postVerifyLoop.bind(agent);
|
|
118
|
+
const credentials = await loop({ service: SERVICE, maxRounds: 10, steps });
|
|
119
|
+
const line = "=".repeat(64);
|
|
120
|
+
console.error(`\n${line}\n[T12] ONBOARDING RESULT\n${line}`);
|
|
121
|
+
const apiKey = credentials["api_key"];
|
|
122
|
+
if (apiKey !== undefined) {
|
|
123
|
+
console.error(`[T12] ✓ API key extracted: ${apiKey}`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.error(`[T12] no API key reached through onboarding`);
|
|
127
|
+
}
|
|
128
|
+
console.error(`[T12] steps:`);
|
|
129
|
+
steps.forEach((s, i) => console.error(` ${i + 1}. ${s}`));
|
|
130
|
+
console.error(line);
|
|
131
|
+
return apiKey !== undefined;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
await browser.close();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function main() {
|
|
138
|
+
const line = "=".repeat(64);
|
|
139
|
+
console.error(`${line}\n[T12] OAuth-first thin slice — Render\n${line}`);
|
|
140
|
+
console.error(`[T12] profile dir : ${CHROME_PROFILE_DIR}`);
|
|
141
|
+
console.error(`[T12] service : ${SERVICE}`);
|
|
142
|
+
console.error(`[T12] signup url : ${SIGNUP_URL}`);
|
|
143
|
+
if (process.env.T12_ONBOARDING_ONLY === "1") {
|
|
144
|
+
const { llm, real } = resolveLLM();
|
|
145
|
+
if (!real) {
|
|
146
|
+
console.error(`[T12] onboarding-only needs a real LLM backend — aborting.`);
|
|
147
|
+
process.exitCode = 1;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const ok = await runOnboardingOnly(llm);
|
|
151
|
+
process.exitCode = ok ? 0 : 1;
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Step 1 — D8 close/reopen: is the spike's Google session still here?
|
|
155
|
+
console.error(`[T12] verifying the persistent profile holds a Google session…`);
|
|
156
|
+
let sessionOk;
|
|
157
|
+
try {
|
|
158
|
+
sessionOk = await verifyProfileSession();
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
console.error(`[T12] FAILED to open the profile: ${String(err)}`);
|
|
162
|
+
process.exitCode = 1;
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (!sessionOk) {
|
|
166
|
+
console.error(`[T12] No Google session in the profile. Run \`npx @trusty-squire/mcp login\` ` +
|
|
167
|
+
`first, then re-run this thin slice.`);
|
|
168
|
+
process.exitCode = 1;
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
console.error(`[T12] ✓ Google session survived the process boundary (D8 close/reopen).`);
|
|
172
|
+
// Step 2 — the real OAuth signup.
|
|
173
|
+
const { llm, real } = resolveLLM();
|
|
174
|
+
console.error(`[T12] onboarding LLM: ${real ? "configured" : "NONE — onboarding will stop early"}`);
|
|
175
|
+
console.error(`[T12] starting the OAuth signup (this re-opens the profile)…\n`);
|
|
176
|
+
const bot = new UniversalSignupBot();
|
|
177
|
+
const result = await bot.signup({
|
|
178
|
+
service: SERVICE,
|
|
179
|
+
signupUrl: SIGNUP_URL,
|
|
180
|
+
oauthProvider: "google",
|
|
181
|
+
llm,
|
|
182
|
+
});
|
|
183
|
+
console.error(`\n${line}\n[T12] RESULT\n${line}`);
|
|
184
|
+
console.error(`[T12] success : ${result.success}`);
|
|
185
|
+
if (result.error !== undefined)
|
|
186
|
+
console.error(`[T12] error : ${result.error}`);
|
|
187
|
+
if (result.credentials !== undefined) {
|
|
188
|
+
console.error(`[T12] credentials:`);
|
|
189
|
+
for (const [k, v] of Object.entries(result.credentials)) {
|
|
190
|
+
if (v !== undefined)
|
|
191
|
+
console.error(` ${k}: ${v}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
console.error(`[T12] steps:`);
|
|
195
|
+
result.steps.forEach((s, i) => console.error(` ${i + 1}. ${s}`));
|
|
196
|
+
console.error(line);
|
|
197
|
+
process.exitCode = result.success ? 0 : 1;
|
|
198
|
+
}
|
|
199
|
+
main().catch((err) => {
|
|
200
|
+
console.error(`[T12] crashed: ${err instanceof Error ? err.stack : String(err)}`);
|
|
201
|
+
process.exitCode = 1;
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=oauth-thin-slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-thin-slice.js","sourceRoot":"","sources":["../../src/bot/oauth-thin-slice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/bot/profile.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,kBAAkB,QAC+D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// profile.ts — the bot's persistent Chrome profile location.
|
|
2
|
+
//
|
|
3
|
+
// One canonical path, shared by two callers: google-login.ts writes the
|
|
4
|
+
// user's Google session into this profile, and BrowserController
|
|
5
|
+
// launches signup runs from it — so an OAuth signup reuses that
|
|
6
|
+
// session instead of starting logged-out. Override with
|
|
7
|
+
// TRUSTY_SQUIRE_PROFILE_DIR.
|
|
8
|
+
import { homedir } from "node:os";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
export const CHROME_PROFILE_DIR = process.env.TRUSTY_SQUIRE_PROFILE_DIR ?? join(homedir(), ".trusty-squire", "chrome-profile");
|
|
11
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/bot/profile.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,wEAAwE;AACxE,iEAAiE;AACjE,gEAAgE;AAChE,wDAAwD;AACxD,6BAA6B;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,kBAAkB,GAC7B,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC"}
|