@trusty-squire/mcp 0.1.18 → 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.
Files changed (46) hide show
  1. package/dist/bin.js +2 -2
  2. package/dist/bin.js.map +1 -1
  3. package/dist/bot/agent.d.ts +7 -1
  4. package/dist/bot/agent.d.ts.map +1 -1
  5. package/dist/bot/agent.js +396 -39
  6. package/dist/bot/agent.js.map +1 -1
  7. package/dist/bot/browser.d.ts +15 -3
  8. package/dist/bot/browser.d.ts.map +1 -1
  9. package/dist/bot/browser.js +273 -56
  10. package/dist/bot/browser.js.map +1 -1
  11. package/dist/bot/google-login.d.ts +18 -0
  12. package/dist/bot/google-login.d.ts.map +1 -0
  13. package/dist/bot/google-login.js +379 -0
  14. package/dist/bot/google-login.js.map +1 -0
  15. package/dist/bot/index.d.ts +5 -0
  16. package/dist/bot/index.d.ts.map +1 -1
  17. package/dist/bot/index.js +14 -0
  18. package/dist/bot/index.js.map +1 -1
  19. package/dist/bot/llm-client.d.ts.map +1 -1
  20. package/dist/bot/llm-client.js +19 -12
  21. package/dist/bot/llm-client.js.map +1 -1
  22. package/dist/bot/oauth-lock.d.ts +2 -0
  23. package/dist/bot/oauth-lock.d.ts.map +1 -0
  24. package/dist/bot/oauth-lock.js +28 -0
  25. package/dist/bot/oauth-lock.js.map +1 -0
  26. package/dist/bot/oauth-providers.d.ts +16 -0
  27. package/dist/bot/oauth-providers.d.ts.map +1 -0
  28. package/dist/bot/oauth-providers.js +100 -0
  29. package/dist/bot/oauth-providers.js.map +1 -0
  30. package/dist/bot/oauth-thin-slice.d.ts +2 -0
  31. package/dist/bot/oauth-thin-slice.d.ts.map +1 -0
  32. package/dist/bot/oauth-thin-slice.js +203 -0
  33. package/dist/bot/oauth-thin-slice.js.map +1 -0
  34. package/dist/bot/profile.d.ts +2 -0
  35. package/dist/bot/profile.d.ts.map +1 -0
  36. package/dist/bot/profile.js +11 -0
  37. package/dist/bot/profile.js.map +1 -0
  38. package/dist/install/cli.d.ts +4 -1
  39. package/dist/install/cli.d.ts.map +1 -1
  40. package/dist/install/cli.js +41 -1
  41. package/dist/install/cli.js.map +1 -1
  42. package/dist/tools/provision-any.d.ts +15 -0
  43. package/dist/tools/provision-any.d.ts.map +1 -1
  44. package/dist/tools/provision-any.js +66 -2
  45. package/dist/tools/provision-any.js.map +1 -1
  46. package/package.json +3 -1
@@ -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;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,KAAK,YAAY,EAAE,qBAAqB,EAAE,CAAC;AACpD,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;CACvC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,gBAAgB;IAWlB,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC;CA4CrE"}
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"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"}
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":"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"}
1
+ {"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../src/bot/llm-client.ts"],"names":[],"mappings":"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"}
@@ -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-3-5-sonnet-20241022";
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
- body["models"] = [this.model, ...this.fallbackModels];
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. The list is ordered by cost-per-1M-input
173
- // tokens ascending (rates as of mid-2025; OpenRouter updates daily so
174
- // this is approximate but the relative order is stable).
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-1.5-8b", // ~$0.04/1M input — vision OK, fast
177
- "google/gemini-flash-1.5", // ~$0.075/1M input — vision, solid
178
- "anthropic/claude-3-haiku", // ~$0.25/1M input — vision, JSON great
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 3.5 Sonnet via OR. ~$0.15/signup, but
226
- // only triggers on parse failures, so amortized cost is small.
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-3.5-sonnet",
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":"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"}
1
+ {"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/bot/llm-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function withOAuthLock<T>(fn: () => Promise<T>): Promise<T>;
2
+ //# sourceMappingURL=oauth-lock.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=oauth-thin-slice.d.ts.map
@@ -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,2 @@
1
+ export declare const CHROME_PROFILE_DIR: string;
2
+ //# sourceMappingURL=profile.d.ts.map
@@ -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"}