@trusty-squire/mcp 0.1.18 → 0.2.1
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 +15 -1
- package/dist/bot/agent.d.ts.map +1 -1
- package/dist/bot/agent.js +531 -52
- 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 +281 -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/onboarding-capture.d.ts +17 -0
- package/dist/bot/onboarding-capture.d.ts.map +1 -0
- package/dist/bot/onboarding-capture.js +52 -0
- package/dist/bot/onboarding-capture.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/tools/provision-any.d.ts +15 -0
- package/dist/tools/provision-any.d.ts.map +1 -1
- package/dist/tools/provision-any.js +66 -2
- 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":"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"}
|
|
@@ -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,17 @@
|
|
|
1
|
+
import type { InteractiveElement } from "./browser.js";
|
|
2
|
+
import type { PostVerifyStep } from "./agent.js";
|
|
3
|
+
export interface OnboardingRoundCapture {
|
|
4
|
+
service: string;
|
|
5
|
+
round: number;
|
|
6
|
+
oauth: boolean;
|
|
7
|
+
state: {
|
|
8
|
+
url: string;
|
|
9
|
+
title: string;
|
|
10
|
+
html: string;
|
|
11
|
+
screenshot: string;
|
|
12
|
+
};
|
|
13
|
+
inventory: readonly InteractiveElement[];
|
|
14
|
+
observed: PostVerifyStep;
|
|
15
|
+
}
|
|
16
|
+
export declare function captureOnboardingRound(entry: OnboardingRoundCapture): void;
|
|
17
|
+
//# sourceMappingURL=onboarding-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-capture.d.ts","sourceRoot":"","sources":["../../src/bot/onboarding-capture.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,SAAS,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAGzC,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAID,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAuB1E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// onboarding-capture.ts — capture post-OAuth onboarding rounds into
|
|
2
|
+
// the E1 eval-corpus format.
|
|
3
|
+
//
|
|
4
|
+
// Building per-service onboarding adapters needs many iterations, but
|
|
5
|
+
// re-running the live OAuth handshake is rate-limited by Google
|
|
6
|
+
// anti-abuse (see the plan's Post-Build Findings). The escape: capture
|
|
7
|
+
// each onboarding round's real page state ONCE, then iterate the
|
|
8
|
+
// onboarding planner offline against the capture via eval-onboarding.ts.
|
|
9
|
+
//
|
|
10
|
+
// This is the capture half. Each round of postVerifyLoop is dumped as
|
|
11
|
+
// one JSON file shaped like an eval-onboarding.ts OnboardingEvalCase —
|
|
12
|
+
// minus `expect`, which is a human judgement (the correct next step).
|
|
13
|
+
// A curator fills `expect` in to make the case scorable; the eval
|
|
14
|
+
// harness loads only cases that have it.
|
|
15
|
+
//
|
|
16
|
+
// Inert unless TRUSTY_SQUIRE_ONBOARDING_CAPTURE names a directory —
|
|
17
|
+
// production never sets it (same env-gated pattern as debug.ts).
|
|
18
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
19
|
+
import { join } from "node:path";
|
|
20
|
+
// One run-scoped id so a multi-service process (the batch harness)
|
|
21
|
+
// keeps each service's rounds grouped without collisions.
|
|
22
|
+
let runId;
|
|
23
|
+
// Dump one onboarding round to the capture directory, if configured.
|
|
24
|
+
// Best-effort: a capture failure must never break a signup run.
|
|
25
|
+
export function captureOnboardingRound(entry) {
|
|
26
|
+
const dir = process.env.TRUSTY_SQUIRE_ONBOARDING_CAPTURE;
|
|
27
|
+
if (dir === undefined || dir.trim().length === 0)
|
|
28
|
+
return;
|
|
29
|
+
try {
|
|
30
|
+
mkdirSync(dir, { recursive: true });
|
|
31
|
+
if (runId === undefined)
|
|
32
|
+
runId = Date.now().toString(36);
|
|
33
|
+
const slug = entry.service.toLowerCase().replace(/[^a-z0-9]+/g, "-");
|
|
34
|
+
const file = join(dir, `${slug}-${runId}-r${entry.round}.json`);
|
|
35
|
+
// OnboardingEvalCase shape, with `expect: null` — the curator
|
|
36
|
+
// replaces null with an OnboardingExpectation to make it scorable.
|
|
37
|
+
const corpusCase = {
|
|
38
|
+
name: `${entry.service} — onboarding round ${entry.round + 1}`,
|
|
39
|
+
service: entry.service,
|
|
40
|
+
oauth: entry.oauth,
|
|
41
|
+
state: entry.state,
|
|
42
|
+
inventory: entry.inventory,
|
|
43
|
+
observed: entry.observed,
|
|
44
|
+
expect: null,
|
|
45
|
+
};
|
|
46
|
+
writeFileSync(file, JSON.stringify(corpusCase, null, 2));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// best-effort — capture is diagnostic, never load-bearing
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=onboarding-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-capture.js","sourceRoot":"","sources":["../../src/bot/onboarding-capture.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,6BAA6B;AAC7B,EAAE;AACF,sEAAsE;AACtE,gEAAgE;AAChE,uEAAuE;AACvE,iEAAiE;AACjE,yEAAyE;AACzE,EAAE;AACF,sEAAsE;AACtE,uEAAuE;AACvE,sEAAsE;AACtE,kEAAkE;AAClE,yCAAyC;AACzC,EAAE;AACF,oEAAoE;AACpE,iEAAiE;AAEjE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,mEAAmE;AACnE,0DAA0D;AAC1D,IAAI,KAAyB,CAAC;AAa9B,qEAAqE;AACrE,gEAAgE;AAChE,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;IACzD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzD,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,KAAK,OAAO,CAAC,CAAC;QAChE,8DAA8D;QAC9D,mEAAmE;QACnE,MAAM,UAAU,GAAG;YACjB,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,uBAAuB,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE;YAC9D,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,IAAI;SACb,CAAC;QACF,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;IAC5D,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|
package/dist/install/cli.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { type AgentTarget } from "./agents.js";
|
|
2
2
|
import { type AsnInfo } from "../bot/index.js";
|
|
3
|
+
import { type OAuthProviderId } from "../bot/oauth-providers.js";
|
|
3
4
|
type Argv = {
|
|
4
5
|
command: string;
|
|
5
6
|
target?: AgentTarget;
|
|
6
7
|
apiBase: string;
|
|
7
8
|
withPair: boolean;
|
|
8
9
|
proxyUrl?: string;
|
|
10
|
+
provider?: OAuthProviderId;
|
|
9
11
|
};
|
|
10
12
|
declare function parseArgs(argv: string[]): Argv;
|
|
11
13
|
declare function resolveServerLaunch(): {
|
|
@@ -16,6 +18,7 @@ export declare function runCli(argv: string[]): Promise<void>;
|
|
|
16
18
|
declare function install(args: Argv): Promise<void>;
|
|
17
19
|
declare function pair(args: Argv): Promise<void>;
|
|
18
20
|
declare function logout(): Promise<void>;
|
|
21
|
+
declare function login(args: Argv): Promise<void>;
|
|
19
22
|
interface ClaimResult {
|
|
20
23
|
token: string;
|
|
21
24
|
account_id: string;
|
|
@@ -25,5 +28,5 @@ declare function pollForClaim(apiBase: string, pairToken: string, intervalMsOrOp
|
|
|
25
28
|
timeoutMs?: number;
|
|
26
29
|
}, timeoutMsArg?: number): Promise<ClaimResult | null>;
|
|
27
30
|
declare function printAsnWarning(asn: AsnInfo): void;
|
|
28
|
-
export { install, pair, logout, parseArgs, pollForClaim, printAsnWarning, resolveServerLaunch };
|
|
31
|
+
export { install, pair, logout, login, parseArgs, pollForClaim, printAsnWarning, resolveServerLaunch };
|
|
29
32
|
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/install/cli.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/install/cli.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAKpF,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAIlB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,CAAC;AAEF,iBAAS,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4BvC;AAWD,iBAAS,mBAAmB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAMlE;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB1D;AAED,iBAAe,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FhD;AAED,iBAAe,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7C;AAyDD,iBAAe,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrC;AAQD,iBAAe,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB9C;AAkBD,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iBAAe,YAAY,CACzB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,gBAAgB,GAAE,MAAM,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,EAC3E,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAoB7B;AAKD,iBAAS,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAyB3C;AAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC"}
|
package/dist/install/cli.js
CHANGED
|
@@ -26,6 +26,8 @@ import { pairInitiate, pairPoll, issueMachineToken } from "../api-client.js";
|
|
|
26
26
|
import { openSessionStorage } from "../session.js";
|
|
27
27
|
import { AGENTS, detectInstalledAgents } from "./agents.js";
|
|
28
28
|
import { detectAsn } from "../bot/index.js";
|
|
29
|
+
import { ensureOAuthSession } from "../bot/google-login.js";
|
|
30
|
+
import { isOAuthProviderId } from "../bot/oauth-providers.js";
|
|
29
31
|
import { VERSION } from "../version.js";
|
|
30
32
|
const DEFAULT_API_BASE = process.env.TRUSTY_SQUIRE_API_BASE ?? "https://trusty-squire-api.fly.dev";
|
|
31
33
|
function parseArgs(argv) {
|
|
@@ -35,6 +37,7 @@ function parseArgs(argv) {
|
|
|
35
37
|
let apiBase = DEFAULT_API_BASE;
|
|
36
38
|
let withPair = false;
|
|
37
39
|
let proxyUrl;
|
|
40
|
+
let provider;
|
|
38
41
|
for (const arg of argv) {
|
|
39
42
|
if (arg.startsWith("--target=")) {
|
|
40
43
|
const t = arg.slice("--target=".length);
|
|
@@ -47,6 +50,11 @@ function parseArgs(argv) {
|
|
|
47
50
|
else if (arg.startsWith("--proxy-url=")) {
|
|
48
51
|
proxyUrl = arg.slice("--proxy-url=".length);
|
|
49
52
|
}
|
|
53
|
+
else if (arg.startsWith("--provider=")) {
|
|
54
|
+
const p = arg.slice("--provider=".length);
|
|
55
|
+
if (isOAuthProviderId(p))
|
|
56
|
+
provider = p;
|
|
57
|
+
}
|
|
50
58
|
else if (arg === "--pair") {
|
|
51
59
|
withPair = true;
|
|
52
60
|
}
|
|
@@ -56,6 +64,8 @@ function parseArgs(argv) {
|
|
|
56
64
|
args.target = target;
|
|
57
65
|
if (proxyUrl !== undefined && proxyUrl.length > 0)
|
|
58
66
|
args.proxyUrl = proxyUrl;
|
|
67
|
+
if (provider !== undefined)
|
|
68
|
+
args.provider = provider;
|
|
59
69
|
return args;
|
|
60
70
|
}
|
|
61
71
|
function isAgentTarget(s) {
|
|
@@ -85,6 +95,9 @@ export async function runCli(argv) {
|
|
|
85
95
|
case "logout":
|
|
86
96
|
await logout();
|
|
87
97
|
return;
|
|
98
|
+
case "login":
|
|
99
|
+
await login(args);
|
|
100
|
+
return;
|
|
88
101
|
case "help":
|
|
89
102
|
printHelp();
|
|
90
103
|
return;
|
|
@@ -239,12 +252,39 @@ async function logout() {
|
|
|
239
252
|
await storage.clear();
|
|
240
253
|
console.warn(`✓ Cleared local session (${storage.backendName()}).`);
|
|
241
254
|
}
|
|
255
|
+
// Establish (or confirm) a provider session in the bot's persistent
|
|
256
|
+
// Chrome profile — the one-time interactive login the OAuth-first
|
|
257
|
+
// signup path needs. With a display this opens a Chrome window;
|
|
258
|
+
// headless, it prints a URL to log in from any browser. T13: the
|
|
259
|
+
// provider defaults to Google; `login --provider=github` logs the
|
|
260
|
+
// same profile into GitHub. See bot/google-login.ts.
|
|
261
|
+
async function login(args) {
|
|
262
|
+
const provider = args.provider ?? "google";
|
|
263
|
+
const label = provider === "github" ? "GitHub" : "Google";
|
|
264
|
+
console.warn(`Establishing a ${label} session for the bot…`);
|
|
265
|
+
const result = await ensureOAuthSession({ provider });
|
|
266
|
+
switch (result.status) {
|
|
267
|
+
case "already_valid":
|
|
268
|
+
console.warn(`✓ Already logged in — the bot's Chrome profile has a valid ${label} session.`);
|
|
269
|
+
return;
|
|
270
|
+
case "logged_in":
|
|
271
|
+
console.warn(`✓ Logged in. The bot can now do OAuth signups with your ${label} identity.`);
|
|
272
|
+
return;
|
|
273
|
+
case "timeout":
|
|
274
|
+
console.error(`Login timed out — no login completed. Re-run \`npx @trusty-squire/mcp login\`.`);
|
|
275
|
+
process.exit(1);
|
|
276
|
+
case "error":
|
|
277
|
+
console.error(`Login failed: ${result.detail ?? "unknown error"}`);
|
|
278
|
+
process.exit(1);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
242
281
|
function printHelp() {
|
|
243
282
|
console.warn(`mcp — install Trusty Squire MCP into a coding agent`);
|
|
244
283
|
console.warn(``);
|
|
245
284
|
console.warn(`Commands:`);
|
|
246
285
|
console.warn(` install [--target=<agent>] [--api-base=<url>] [--pair] [--proxy-url=<url>]`);
|
|
247
286
|
console.warn(` pair [--target=<agent>] [--api-base=<url>]`);
|
|
287
|
+
console.warn(` login [--provider=google|github] one-time sign-in for OAuth-based signups`);
|
|
248
288
|
console.warn(` logout`);
|
|
249
289
|
console.warn(``);
|
|
250
290
|
console.warn(`Agents: ${Object.keys(AGENTS).join(", ")}`);
|
|
@@ -303,5 +343,5 @@ function printAsnWarning(asn) {
|
|
|
303
343
|
return;
|
|
304
344
|
}
|
|
305
345
|
}
|
|
306
|
-
export { install, pair, logout, parseArgs, pollForClaim, printAsnWarning, resolveServerLaunch };
|
|
346
|
+
export { install, pair, logout, login, parseArgs, pollForClaim, printAsnWarning, resolveServerLaunch };
|
|
307
347
|
//# sourceMappingURL=cli.js.map
|