@trusty-squire/mcp 0.4.1 → 0.5.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/README.md +25 -10
- package/assets/login/interstitial.html +47 -0
- package/assets/login/vnc.html +90 -0
- package/dist/api-client.d.ts +7 -9
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +9 -9
- package/dist/api-client.js.map +1 -1
- package/dist/bot/agent.d.ts.map +1 -1
- package/dist/bot/agent.js +76 -52
- package/dist/bot/agent.js.map +1 -1
- package/dist/bot/google-login.d.ts.map +1 -1
- package/dist/bot/google-login.js +111 -8
- package/dist/bot/google-login.js.map +1 -1
- package/dist/install/agents.d.ts +1 -1
- package/dist/install/agents.d.ts.map +1 -1
- package/dist/install/agents.js +76 -7
- package/dist/install/agents.js.map +1 -1
- package/dist/install/cli.d.ts +9 -5
- package/dist/install/cli.d.ts.map +1 -1
- package/dist/install/cli.js +192 -98
- package/dist/install/cli.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +15 -22
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js.map +1 -1
- package/dist/tools/cancel.d.ts.map +1 -1
- package/dist/tools/cancel.js +2 -2
- package/dist/tools/cancel.js.map +1 -1
- package/dist/tools/get-credential.d.ts.map +1 -1
- package/dist/tools/get-credential.js +2 -2
- package/dist/tools/get-credential.js.map +1 -1
- package/dist/tools/get-usage.d.ts.map +1 -1
- package/dist/tools/get-usage.js +2 -2
- package/dist/tools/get-usage.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +10 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-credentials.d.ts.map +1 -1
- package/dist/tools/list-credentials.js +2 -2
- package/dist/tools/list-credentials.js.map +1 -1
- package/dist/tools/list-services.d.ts.map +1 -1
- package/dist/tools/list-services.js +2 -2
- package/dist/tools/list-services.js.map +1 -1
- package/dist/tools/list-subscriptions.d.ts.map +1 -1
- package/dist/tools/list-subscriptions.js +2 -2
- package/dist/tools/list-subscriptions.js.map +1 -1
- package/dist/tools/provision-any.d.ts +4 -4
- package/dist/tools/provision-any.d.ts.map +1 -1
- package/dist/tools/provision-any.js +45 -32
- package/dist/tools/provision-any.js.map +1 -1
- package/dist/tools/provision.d.ts.map +1 -1
- package/dist/tools/provision.js +2 -2
- package/dist/tools/provision.js.map +1 -1
- package/dist/tools/wait-for-approval.d.ts.map +1 -1
- package/dist/tools/wait-for-approval.js +2 -2
- package/dist/tools/wait-for-approval.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -10,15 +10,27 @@ npx @trusty-squire/mcp install
|
|
|
10
10
|
npx @trusty-squire/mcp install --target=claude-code
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
1. Detects
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
Best run on a laptop or desktop. `install`:
|
|
14
|
+
1. Detects your coding agent (when `--target` is omitted) and writes its MCP
|
|
15
|
+
config. Existing entries are preserved.
|
|
16
|
+
2. Issues an anonymous machine token — a handful of free signups, no account.
|
|
17
|
+
3. Connects your Google (or GitHub) account: a Chrome window opens, you sign
|
|
18
|
+
in once. The bot reuses that browser session to sign you up for services,
|
|
19
|
+
so there is no separate Trusty Squire account or password.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
On a headless box (Codespaces, Replit, an SSH server) there is no display, so
|
|
22
|
+
step 3 prints a one-time remote-login URL you open from any browser — including
|
|
23
|
+
a phone. Headless is supported, but a laptop/desktop is the smoother path.
|
|
24
|
+
|
|
25
|
+
Flags:
|
|
26
|
+
- `--provider=google|github|both` — which identity to connect (default: prompt
|
|
27
|
+
on a terminal, otherwise Google).
|
|
28
|
+
- `--skip-login` — write the config + token only; run
|
|
29
|
+
`npx @trusty-squire/mcp login` later. For CI / scripted installs.
|
|
30
|
+
|
|
31
|
+
Re-run the sign-in any time with `npx @trusty-squire/mcp login`.
|
|
32
|
+
|
|
33
|
+
After install, restart your coding agent to pick up the squire tools.
|
|
22
34
|
|
|
23
35
|
## Tools
|
|
24
36
|
|
|
@@ -78,6 +90,9 @@ npx @trusty-squire/mcp install --target=claude-code --api-base=http://localhost:
|
|
|
78
90
|
## What this server does NOT do
|
|
79
91
|
|
|
80
92
|
- Fork the coding agent. We write configs only.
|
|
81
|
-
-
|
|
93
|
+
- Store your Google/GitHub password. You enter it only on the provider's own
|
|
94
|
+
sign-in page; the bot reuses the resulting browser session, never the
|
|
95
|
+
password.
|
|
82
96
|
- Bundle the API runtime. Separate apps for separate processes.
|
|
83
|
-
-
|
|
97
|
+
- Charge you, in this MVP. Provisioning is free-tier services only; the
|
|
98
|
+
spending-mandate flow lands with paid provisioning.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Trusty Squire — connecting your account</title>
|
|
7
|
+
<!--
|
|
8
|
+
Headed-login interstitial. google-login.ts loginWithDisplay reads
|
|
9
|
+
this, substitutes {{PROVIDER}} and {{URL}}, and setContent()s it as
|
|
10
|
+
the first page in the bot's Chrome window — so the user sees what
|
|
11
|
+
is happening before a tool asks them for a password.
|
|
12
|
+
-->
|
|
13
|
+
<style>
|
|
14
|
+
html, body { margin: 0; height: 100%; background: #0f1115; color: #e6e8ec;
|
|
15
|
+
font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
|
16
|
+
body { display: flex; align-items: center; justify-content: center; }
|
|
17
|
+
main { max-width: 460px; padding: 32px 36px; }
|
|
18
|
+
h1 { margin: 0 0 4px; font-size: 20px; color: #fff; }
|
|
19
|
+
.tag { margin: 0 0 22px; font-size: 13px; color: #6e747f; }
|
|
20
|
+
p { font-size: 14px; line-height: 1.55; color: #c4c8d0; }
|
|
21
|
+
b { color: #fff; }
|
|
22
|
+
.safe { font-size: 13px; color: #9aa0ab; border-left: 2px solid #272b35;
|
|
23
|
+
padding-left: 12px; }
|
|
24
|
+
.btn { display: inline-block; margin-top: 24px; padding: 11px 20px;
|
|
25
|
+
background: #3b82f6; color: #fff; text-decoration: none; border-radius: 8px;
|
|
26
|
+
font-size: 14px; font-weight: 600; }
|
|
27
|
+
.btn:hover { background: #2f6fd6; }
|
|
28
|
+
</style>
|
|
29
|
+
</head>
|
|
30
|
+
<body>
|
|
31
|
+
<main>
|
|
32
|
+
<h1>Trusty Squire</h1>
|
|
33
|
+
<p class="tag">Connecting your {{PROVIDER}} account</p>
|
|
34
|
+
<p>
|
|
35
|
+
Trusty Squire signs you up for developer services on your behalf.
|
|
36
|
+
To do that it rides your own <b>{{PROVIDER}}</b> login — so there is
|
|
37
|
+
no separate account or password to manage.
|
|
38
|
+
</p>
|
|
39
|
+
<p class="safe">
|
|
40
|
+
You will enter your {{PROVIDER}} password only on {{PROVIDER}}'s own
|
|
41
|
+
sign-in page. Trusty Squire never sees or stores it — it only reuses
|
|
42
|
+
the browser session afterward.
|
|
43
|
+
</p>
|
|
44
|
+
<a class="btn" href="{{URL}}">Continue to {{PROVIDER}} sign-in →</a>
|
|
45
|
+
</main>
|
|
46
|
+
</body>
|
|
47
|
+
</html>
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
|
6
|
+
<title>Trusty Squire — sign in</title>
|
|
7
|
+
<!--
|
|
8
|
+
Trusty Squire branded noVNC client. Served by websockify from a
|
|
9
|
+
temp dir that also holds the installed noVNC `core/` (see
|
|
10
|
+
google-login.ts loginHeadless). Deliberately uses ONLY noVNC's
|
|
11
|
+
stable RFB API — the `RFB` default export, its constructor, the
|
|
12
|
+
`scaleViewport`/`resizeSession` properties, and the
|
|
13
|
+
connect/disconnect/securityfailure events — all stable across
|
|
14
|
+
every noVNC 1.x release, so it survives whatever version the
|
|
15
|
+
host distro's `novnc` package pinned.
|
|
16
|
+
-->
|
|
17
|
+
<style>
|
|
18
|
+
html, body { margin: 0; height: 100%; background: #0f1115; color: #e6e8ec;
|
|
19
|
+
font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
|
20
|
+
#bar { display: flex; align-items: center; gap: 8px; padding: 9px 13px;
|
|
21
|
+
background: #171a21; border-bottom: 1px solid #272b35; font-size: 13px;
|
|
22
|
+
line-height: 1.3; }
|
|
23
|
+
#bar b { color: #fff; }
|
|
24
|
+
#bar span.sub { color: #9aa0ab; }
|
|
25
|
+
#dot { width: 8px; height: 8px; border-radius: 50%; background: #e0a23a;
|
|
26
|
+
flex: none; }
|
|
27
|
+
#dot.ok { background: #3fb950; }
|
|
28
|
+
#dot.err { background: #f85149; }
|
|
29
|
+
#screen { position: absolute; top: 39px; left: 0; right: 0; bottom: 0;
|
|
30
|
+
background: #0f1115; }
|
|
31
|
+
#msg { position: absolute; top: 50%; left: 0; right: 0; text-align: center;
|
|
32
|
+
transform: translateY(-50%); color: #9aa0ab; font-size: 14px; padding: 0 24px; }
|
|
33
|
+
</style>
|
|
34
|
+
</head>
|
|
35
|
+
<body>
|
|
36
|
+
<div id="bar">
|
|
37
|
+
<span id="dot"></span>
|
|
38
|
+
<b>Trusty Squire</b>
|
|
39
|
+
<span class="sub">— sign in to your account, then return to your terminal.</span>
|
|
40
|
+
</div>
|
|
41
|
+
<div id="screen"></div>
|
|
42
|
+
<div id="msg">Connecting to the secure login window…</div>
|
|
43
|
+
<script type="module">
|
|
44
|
+
import RFB from "./core/rfb.js";
|
|
45
|
+
|
|
46
|
+
// The VNC password rides in the URL fragment (#password=...), never
|
|
47
|
+
// the query string — a fragment is never sent to the server, so the
|
|
48
|
+
// secret stays out of the cloudflared edge logs and any proxy.
|
|
49
|
+
const params = new URLSearchParams(location.hash.replace(/^#/, ""));
|
|
50
|
+
const password = params.get("password") || "";
|
|
51
|
+
const dot = document.getElementById("dot");
|
|
52
|
+
const msg = document.getElementById("msg");
|
|
53
|
+
const screen = document.getElementById("screen");
|
|
54
|
+
|
|
55
|
+
const wsUrl =
|
|
56
|
+
(location.protocol === "https:" ? "wss://" : "ws://") +
|
|
57
|
+
location.host +
|
|
58
|
+
"/websockify";
|
|
59
|
+
|
|
60
|
+
let rfb;
|
|
61
|
+
try {
|
|
62
|
+
rfb = new RFB(screen, wsUrl, { credentials: { password }, shared: true });
|
|
63
|
+
rfb.scaleViewport = true;
|
|
64
|
+
rfb.resizeSession = false;
|
|
65
|
+
} catch (err) {
|
|
66
|
+
dot.className = "err";
|
|
67
|
+
msg.textContent = "Could not start the login window: " + err;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (rfb) {
|
|
71
|
+
rfb.addEventListener("connect", () => {
|
|
72
|
+
dot.className = "ok";
|
|
73
|
+
msg.style.display = "none";
|
|
74
|
+
});
|
|
75
|
+
rfb.addEventListener("disconnect", () => {
|
|
76
|
+
dot.className = "err";
|
|
77
|
+
msg.style.display = "";
|
|
78
|
+
msg.textContent =
|
|
79
|
+
"Login window closed. If you finished signing in, return to " +
|
|
80
|
+
"your terminal — you can close this tab.";
|
|
81
|
+
});
|
|
82
|
+
rfb.addEventListener("securityfailure", () => {
|
|
83
|
+
dot.className = "err";
|
|
84
|
+
msg.style.display = "";
|
|
85
|
+
msg.textContent = "Could not authenticate to the login window.";
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
</script>
|
|
89
|
+
</body>
|
|
90
|
+
</html>
|
package/dist/api-client.d.ts
CHANGED
|
@@ -102,23 +102,22 @@ export declare class ApiClient {
|
|
|
102
102
|
private post;
|
|
103
103
|
private handleResponse;
|
|
104
104
|
}
|
|
105
|
-
export interface
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
export interface InstallInitiateResponse {
|
|
106
|
+
setup_code: string;
|
|
107
|
+
confirm_url: string;
|
|
108
108
|
expires_at: string;
|
|
109
109
|
}
|
|
110
|
-
export declare function
|
|
111
|
-
export interface
|
|
110
|
+
export declare function installInitiate(apiBaseUrl: string, agentIdentity: string, machineToken?: string | null, fetchImpl?: typeof fetch): Promise<InstallInitiateResponse>;
|
|
111
|
+
export interface InstallStatusResponse {
|
|
112
112
|
status: "pending" | "claimed" | "expired";
|
|
113
113
|
agent_session_token?: string;
|
|
114
114
|
account_id?: string;
|
|
115
115
|
}
|
|
116
|
-
export declare function
|
|
116
|
+
export declare function installPoll(apiBaseUrl: string, setupCode: string, fetchImpl?: typeof fetch): Promise<InstallStatusResponse>;
|
|
117
117
|
export interface MachineInstallResponse {
|
|
118
118
|
machine_token: string;
|
|
119
119
|
quota_limit: number;
|
|
120
120
|
quota_used: number;
|
|
121
|
-
tier: "anonymous" | "paired";
|
|
122
121
|
message?: string;
|
|
123
122
|
}
|
|
124
123
|
export interface InstallAsnPayload {
|
|
@@ -130,12 +129,11 @@ export interface InstallAsnPayload {
|
|
|
130
129
|
}
|
|
131
130
|
export declare function issueMachineToken(apiBaseUrl: string, fetchImpl?: typeof fetch, asn?: InstallAsnPayload): Promise<MachineInstallResponse>;
|
|
132
131
|
export interface MachineStatusResponse {
|
|
133
|
-
tier: "anonymous" | "paired";
|
|
134
132
|
quota_limit: number;
|
|
135
133
|
quota_used: number;
|
|
136
134
|
quota_remaining: number;
|
|
137
135
|
over_quota: boolean;
|
|
138
|
-
|
|
136
|
+
account_id: string | null;
|
|
139
137
|
created_at: string;
|
|
140
138
|
last_used_at: string | null;
|
|
141
139
|
}
|
package/dist/api-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/api-client.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// keep their behaviour deterministic without spinning up HTTP.
|
|
6
6
|
export class MissingSessionError extends Error {
|
|
7
7
|
constructor() {
|
|
8
|
-
super("No active Trusty Squire session. Run `npx @trusty-squire/mcp install --target=<agent>` to
|
|
8
|
+
super("No active Trusty Squire session. Run `npx @trusty-squire/mcp install --target=<agent>` to set up this machine.");
|
|
9
9
|
this.name = "MissingSessionError";
|
|
10
10
|
}
|
|
11
11
|
}
|
|
@@ -114,11 +114,11 @@ function isErrorBody(b) {
|
|
|
114
114
|
"error" in b &&
|
|
115
115
|
typeof b.error === "string");
|
|
116
116
|
}
|
|
117
|
-
export async function
|
|
118
|
-
//
|
|
119
|
-
//
|
|
117
|
+
export async function installInitiate(apiBaseUrl, agentIdentity,
|
|
118
|
+
// The machine token issued seconds earlier via /v1/install — bound
|
|
119
|
+
// to the account at claim time so quota tracks against the account.
|
|
120
120
|
machineToken = null, fetchImpl = fetch) {
|
|
121
|
-
const res = await fetchImpl(`${apiBaseUrl}/v1/mcp/
|
|
121
|
+
const res = await fetchImpl(`${apiBaseUrl}/v1/mcp/install/initiate`, {
|
|
122
122
|
method: "POST",
|
|
123
123
|
headers: { "Content-Type": "application/json" },
|
|
124
124
|
body: JSON.stringify({
|
|
@@ -127,16 +127,16 @@ machineToken = null, fetchImpl = fetch) {
|
|
|
127
127
|
}),
|
|
128
128
|
});
|
|
129
129
|
if (!res.ok)
|
|
130
|
-
throw new ApiCallError(res.status, "
|
|
130
|
+
throw new ApiCallError(res.status, "install_initiate_failed", "install handshake failed");
|
|
131
131
|
return (await res.json());
|
|
132
132
|
}
|
|
133
|
-
export async function
|
|
134
|
-
const res = await fetchImpl(`${apiBaseUrl}/v1/mcp/
|
|
133
|
+
export async function installPoll(apiBaseUrl, setupCode, fetchImpl = fetch) {
|
|
134
|
+
const res = await fetchImpl(`${apiBaseUrl}/v1/mcp/install/${encodeURIComponent(setupCode)}/status`);
|
|
135
135
|
// 200 + status === 'pending' | 'claimed'; 410 → expired (return shape rather than throw).
|
|
136
136
|
if (res.status === 410)
|
|
137
137
|
return { status: "expired" };
|
|
138
138
|
if (!res.ok)
|
|
139
|
-
throw new ApiCallError(res.status, "
|
|
139
|
+
throw new ApiCallError(res.status, "install_poll_failed", "install poll failed");
|
|
140
140
|
return (await res.json());
|
|
141
141
|
}
|
|
142
142
|
export async function issueMachineToken(apiBaseUrl, fetchImpl = fetch, asn) {
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,oEAAoE;AACpE,iEAAiE;AACjE,+DAA+D;AAE/D,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C;QACE,KAAK,CACH,
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/bot/agent.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,iBAAiB,EAGjB,cAAc,EACd,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/bot/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/agent.js
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
// prompt rather than threading service-specific logic through the agent.
|
|
10
10
|
import { rankAndCapInventory, scoreSignupButton } from "./browser.js";
|
|
11
11
|
import { OAUTH_PROVIDERS, extractOAuthScopes, } from "./oauth-providers.js";
|
|
12
|
-
import { detectAsn } from "./asn.js";
|
|
13
12
|
import { loggedInProviders } from "./login-state.js";
|
|
14
13
|
import { saveDebugSnapshot } from "./debug.js";
|
|
15
14
|
import { captureOnboardingRound } from "./onboarding-capture.js";
|
|
@@ -34,6 +33,8 @@ const VERIFICATION_EXPECTED_PATTERNS = [
|
|
|
34
33
|
"check your inbox",
|
|
35
34
|
"verify your email",
|
|
36
35
|
"verify your inbox",
|
|
36
|
+
"verify your account",
|
|
37
|
+
"confirm your account",
|
|
37
38
|
"confirm your email",
|
|
38
39
|
"confirmation email",
|
|
39
40
|
"verification email",
|
|
@@ -857,8 +858,15 @@ export class SignupAgent {
|
|
|
857
858
|
// OAuth — it returns every provider the persistent profile has a
|
|
858
859
|
// login session for, so a "Continue with Google/GitHub" affordance is
|
|
859
860
|
// used instead of a form-fill (which OAuth-gated dev services
|
|
860
|
-
// routinely anti-abuse-flag).
|
|
861
|
-
//
|
|
861
|
+
// routinely anti-abuse-flag).
|
|
862
|
+
//
|
|
863
|
+
// No datacenter gate (reversed from the 0.4.0 design): yes, Google /
|
|
864
|
+
// GitHub may challenge OAuth from a datacenter IP (G7), but form-fill
|
|
865
|
+
// on datacenter fails just as often — silent verification withholding,
|
|
866
|
+
// the Resend-on-Hetzner case. An OAuth challenge at least surfaces a
|
|
867
|
+
// clear `needs_login` the host agent can act on, vs. a silent 45-second
|
|
868
|
+
// form-fill timeout. Better failure mode wins; the original gate was
|
|
869
|
+
// protecting the bot from the wrong loss.
|
|
862
870
|
async resolveOAuthCandidates(task, steps) {
|
|
863
871
|
if (task.oauthProvider !== undefined) {
|
|
864
872
|
return [task.oauthProvider];
|
|
@@ -866,12 +874,6 @@ export class SignupAgent {
|
|
|
866
874
|
const loggedIn = loggedInProviders();
|
|
867
875
|
if (loggedIn.length === 0)
|
|
868
876
|
return [];
|
|
869
|
-
const asn = await detectAsn();
|
|
870
|
-
if (asn?.class === "datacenter") {
|
|
871
|
-
steps.push("Auto-OAuth skipped: datacenter egress — the provider would " +
|
|
872
|
-
"challenge the handshake; using form-fill");
|
|
873
|
-
return [];
|
|
874
|
-
}
|
|
875
877
|
steps.push(`Auto-OAuth: profile has a session for ${loggedIn.join(", ")} — ` +
|
|
876
878
|
"preferring OAuth if the page offers it");
|
|
877
879
|
return loggedIn;
|
|
@@ -1169,57 +1171,79 @@ export class SignupAgent {
|
|
|
1169
1171
|
let credentials = await this.extractCredentials();
|
|
1170
1172
|
// Step 7: Email verification + post-verification navigation.
|
|
1171
1173
|
let verificationFailed;
|
|
1172
|
-
if (credentials.api_key === undefined && credentials.username === undefined
|
|
1173
|
-
// S3:
|
|
1174
|
-
//
|
|
1175
|
-
//
|
|
1176
|
-
// verification email — run a short probe instead of dead air.
|
|
1174
|
+
if (credentials.api_key === undefined && credentials.username === undefined) {
|
|
1175
|
+
// S3: read the post-submit page first. Whether it is actually
|
|
1176
|
+
// asking the user to confirm by email decides both the no-inbox
|
|
1177
|
+
// bail (M2) and, when an inbox exists, the poll duration.
|
|
1177
1178
|
const expectsEmail = expectsVerificationEmail(await this.browser.extractText());
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1179
|
+
if (task.inbox === undefined) {
|
|
1180
|
+
// M2/S3: no inbox to receive a verification email (the SES
|
|
1181
|
+
// inbound pipeline is mothballed — TODOS M1). If the page is
|
|
1182
|
+
// asking for email confirmation the bot cannot finish this
|
|
1183
|
+
// signup, so bail FAST to a manual-signup result rather than
|
|
1184
|
+
// a poll that could only ever time out. If the page is NOT
|
|
1185
|
+
// asking for email, the credentials simply are not on it —
|
|
1186
|
+
// fall through to the generic not-found result below.
|
|
1187
|
+
if (expectsEmail) {
|
|
1188
|
+
const where = task.signupUrl !== undefined ? ` at ${task.signupUrl}` : "";
|
|
1189
|
+
steps.push("Post-submit page asks for email verification, but no inbox is " +
|
|
1190
|
+
"configured — stopping for manual signup (no blind poll).");
|
|
1191
|
+
verificationFailed =
|
|
1192
|
+
`verification_not_sent: ${task.service} requires email verification, ` +
|
|
1193
|
+
`which the automated signup cannot complete — finish signing up ` +
|
|
1194
|
+
`manually${where}.`;
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
else {
|
|
1198
|
+
// S3: don't blind-wait. If the page explicitly tells the user
|
|
1199
|
+
// to check their email, poll the full timeout; if not, the
|
|
1200
|
+
// service most likely sent nothing — run a short probe.
|
|
1201
|
+
const verificationTimeoutSeconds = expectsEmail
|
|
1202
|
+
? (task.verificationTimeoutSeconds ?? 180)
|
|
1203
|
+
: VERIFICATION_PROBE_SECONDS;
|
|
1204
|
+
steps.push(expectsEmail
|
|
1205
|
+
? `Post-submit page asks to check email — polling inbox (up to ${verificationTimeoutSeconds}s)...`
|
|
1206
|
+
: `Post-submit page shows no "check your email" prompt — short ${verificationTimeoutSeconds}s probe (S3: the service likely sent no verification email)...`);
|
|
1207
|
+
try {
|
|
1208
|
+
const email = await this.waitForVerificationEmail(task.inbox, task.email, verificationTimeoutSeconds);
|
|
1209
|
+
steps.push(`Received: "${email.subject}" from ${email.from_address}`);
|
|
1210
|
+
if (email.parsed_links.length > 0) {
|
|
1211
|
+
const verifyLink = this.pickVerificationLink(Array.from(email.parsed_links));
|
|
1212
|
+
if (verifyLink !== null) {
|
|
1213
|
+
steps.push(`Following verification link: ${verifyLink}`);
|
|
1214
|
+
await this.browser.goto(verifyLink);
|
|
1215
|
+
await this.browser.wait(3);
|
|
1216
|
+
await saveDebugSnapshot(this.browser, "after-verify");
|
|
1217
|
+
// Try extracting first — many services drop the API key
|
|
1218
|
+
// straight onto the landing page after verification.
|
|
1219
|
+
credentials = await this.extractCredentials();
|
|
1220
|
+
// If no creds yet, run the Claude-planned navigation loop.
|
|
1221
|
+
if (credentials.api_key === undefined && credentials.username === undefined) {
|
|
1222
|
+
const maxRounds = task.postVerifyMaxRounds ?? 6;
|
|
1223
|
+
credentials = await this.postVerifyLoop({
|
|
1224
|
+
service: task.service,
|
|
1225
|
+
credentials: { email: task.email, password },
|
|
1226
|
+
maxRounds,
|
|
1227
|
+
steps,
|
|
1228
|
+
});
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
else {
|
|
1232
|
+
steps.push("Email had no usable verification link.");
|
|
1206
1233
|
}
|
|
1207
1234
|
}
|
|
1208
1235
|
else {
|
|
1209
|
-
steps.push("Email had no
|
|
1236
|
+
steps.push("Email had no parsed links — skipping verification click.");
|
|
1210
1237
|
}
|
|
1211
1238
|
}
|
|
1212
|
-
|
|
1213
|
-
|
|
1239
|
+
catch (err) {
|
|
1240
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
1241
|
+
steps.push(`Inbox poll failed: ${detail}`);
|
|
1242
|
+
verificationFailed = expectsEmail
|
|
1243
|
+
? `verification_not_sent: form submitted and the page asked to check email, but none arrived in ${verificationTimeoutSeconds}s — the service likely withheld it (anti-abuse) or requires manual signup`
|
|
1244
|
+
: `verification_not_sent: form submitted but the page never prompted to check email and none arrived in the ${verificationTimeoutSeconds}s probe — the service most likely dispatched no verification email`;
|
|
1214
1245
|
}
|
|
1215
1246
|
}
|
|
1216
|
-
catch (err) {
|
|
1217
|
-
const detail = err instanceof Error ? err.message : String(err);
|
|
1218
|
-
steps.push(`Inbox poll failed: ${detail}`);
|
|
1219
|
-
verificationFailed = expectsEmail
|
|
1220
|
-
? `verification_not_sent: form submitted and the page asked to check email, but none arrived in ${verificationTimeoutSeconds}s — the service likely withheld it (anti-abuse) or requires manual signup`
|
|
1221
|
-
: `verification_not_sent: form submitted but the page never prompted to check email and none arrived in the ${verificationTimeoutSeconds}s probe — the service most likely dispatched no verification email`;
|
|
1222
|
-
}
|
|
1223
1247
|
}
|
|
1224
1248
|
if (credentials.api_key !== undefined || credentials.username !== undefined) {
|
|
1225
1249
|
return {
|