@trusty-squire/mcp 0.9.16 → 0.9.17-rc.2
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/bot/affordance-probe.d.ts +15 -0
- package/dist/bot/affordance-probe.d.ts.map +1 -0
- package/dist/bot/affordance-probe.js +63 -0
- package/dist/bot/affordance-probe.js.map +1 -0
- package/dist/bot/agent.d.ts +31 -1
- package/dist/bot/agent.d.ts.map +1 -1
- package/dist/bot/agent.js +1826 -129
- package/dist/bot/agent.js.map +1 -1
- package/dist/bot/browser.d.ts +9 -0
- package/dist/bot/browser.d.ts.map +1 -1
- package/dist/bot/browser.js +281 -8
- package/dist/bot/browser.js.map +1 -1
- package/dist/bot/extraction.d.ts +18 -0
- package/dist/bot/extraction.d.ts.map +1 -0
- package/dist/bot/extraction.js +55 -0
- package/dist/bot/extraction.js.map +1 -0
- package/dist/bot/form-fill.d.ts +144 -0
- package/dist/bot/form-fill.d.ts.map +1 -0
- package/dist/bot/form-fill.js +320 -0
- package/dist/bot/form-fill.js.map +1 -0
- package/dist/bot/google-login.d.ts.map +1 -1
- package/dist/bot/google-login.js +6 -2
- package/dist/bot/google-login.js.map +1 -1
- package/dist/bot/llm-client.d.ts +12 -0
- package/dist/bot/llm-client.d.ts.map +1 -1
- package/dist/bot/llm-client.js +99 -0
- package/dist/bot/llm-client.js.map +1 -1
- package/dist/bot/nav-search.d.ts +80 -0
- package/dist/bot/nav-search.d.ts.map +1 -0
- package/dist/bot/nav-search.js +409 -0
- package/dist/bot/nav-search.js.map +1 -0
- package/dist/bot/oauth-flow.d.ts +48 -0
- package/dist/bot/oauth-flow.d.ts.map +1 -0
- package/dist/bot/oauth-flow.js +111 -0
- package/dist/bot/oauth-flow.js.map +1 -0
- package/dist/bot/onboarding-capture.d.ts +4 -0
- package/dist/bot/onboarding-capture.d.ts.map +1 -1
- package/dist/bot/onboarding-capture.js +5 -0
- package/dist/bot/onboarding-capture.js.map +1 -1
- package/dist/bot/redact.d.ts +1 -0
- package/dist/bot/redact.d.ts.map +1 -1
- package/dist/bot/redact.js +46 -0
- package/dist/bot/redact.js.map +1 -1
- package/dist/skill-registry-client.d.ts +4 -0
- package/dist/skill-registry-client.d.ts.map +1 -1
- package/dist/skill-registry-client.js +4 -0
- package/dist/skill-registry-client.js.map +1 -1
- package/dist/tools/provision-any.d.ts +21 -0
- package/dist/tools/provision-any.d.ts.map +1 -1
- package/dist/tools/provision-any.js +16 -7
- package/dist/tools/provision-any.js.map +1 -1
- package/dist/tools/signup-telemetry.d.ts +6 -0
- package/dist/tools/signup-telemetry.d.ts.map +1 -1
- package/dist/tools/signup-telemetry.js +4 -0
- package/dist/tools/signup-telemetry.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type CandidateClass = {
|
|
2
|
+
kind: "full";
|
|
3
|
+
value: string;
|
|
4
|
+
} | {
|
|
5
|
+
kind: "truncated";
|
|
6
|
+
value: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: "none";
|
|
9
|
+
};
|
|
10
|
+
export interface ExtractionState {
|
|
11
|
+
apiKey: string | null;
|
|
12
|
+
truncatedHit: string | null;
|
|
13
|
+
}
|
|
14
|
+
export declare function initialExtractionState(): ExtractionState;
|
|
15
|
+
export declare function accumulateCandidate(state: ExtractionState, c: CandidateClass): ExtractionState;
|
|
16
|
+
export declare function hasFullHit(state: ExtractionState): boolean;
|
|
17
|
+
export declare function resolveExtraction(state: ExtractionState): Record<string, string>;
|
|
18
|
+
//# sourceMappingURL=extraction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction.d.ts","sourceRoot":"","sources":["../../src/bot/extraction.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAKrB,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,sBAAsB,IAAI,eAAe,CAExD;AAMD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,GAAG,eAAe,CAO9F;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAE1D;AAOD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIhF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// extraction.ts — pure decision primitives of the credential-EXTRACTION phase,
|
|
2
|
+
// carved out of extractCredentials (agent.ts:12623) as strangler slice 4 (the A4
|
|
3
|
+
// order: nav-search → OAuth/consent → form-fill → EXTRACTION → capture-chain).
|
|
4
|
+
// Browser-free + unit-tested.
|
|
5
|
+
//
|
|
6
|
+
// BOUNDARY (the slice-2/3 lesson — model the decision, executor owns I/O): the
|
|
7
|
+
// executor runs the FIVE candidate sources (visible candidates, body text,
|
|
8
|
+
// copy-button/clipboard, hidden inputs, copy-button colocation) AND the regex
|
|
9
|
+
// classification of each candidate (extractApiKeyFromText + isTruncatedCapture +
|
|
10
|
+
// the pass-4 UUID accept). This module decides only the cross-pass POLICY:
|
|
11
|
+
// • accumulation — the first FULL hit wins and ends the scan; a TRUNCATED hit
|
|
12
|
+
// (a masked display like "sk-or-v1-1687…" whose full secret is only on the
|
|
13
|
+
// clipboard) is remembered as a fallback, first-wins, never overriding a full.
|
|
14
|
+
// • resolution — after every pass: a full key → {api_key}; else the truncated
|
|
15
|
+
// stub → {api_key_truncated} (an honest partial beats "no key" when the bot
|
|
16
|
+
// demonstrably reached the modal); else {} (keep navigating).
|
|
17
|
+
//
|
|
18
|
+
// This is the highest-value, most self-contained pure piece (the truncated-vs-full
|
|
19
|
+
// priority is a recurring brittleness source — the S3 masked-key trap). NOT yet
|
|
20
|
+
// wired into agent.ts — changing this file cannot regress the live path.
|
|
21
|
+
export function initialExtractionState() {
|
|
22
|
+
return { apiKey: null, truncatedHit: null };
|
|
23
|
+
}
|
|
24
|
+
// Fold one classified candidate into the state. PURE. First FULL hit wins and is
|
|
25
|
+
// sticky (a later candidate cannot override it). A TRUNCATED hit is recorded only
|
|
26
|
+
// when no full hit exists yet AND no truncated hit is recorded yet (first-wins),
|
|
27
|
+
// mirroring extractCredentials' `truncatedHit = truncatedHit ?? hit`.
|
|
28
|
+
export function accumulateCandidate(state, c) {
|
|
29
|
+
if (state.apiKey !== null)
|
|
30
|
+
return state; // already resolved to a full key
|
|
31
|
+
if (c.kind === "full")
|
|
32
|
+
return { ...state, apiKey: c.value };
|
|
33
|
+
if (c.kind === "truncated") {
|
|
34
|
+
return state.truncatedHit === null ? { ...state, truncatedHit: c.value } : state;
|
|
35
|
+
}
|
|
36
|
+
return state;
|
|
37
|
+
}
|
|
38
|
+
// Has a terminal full hit been found? The executor stops scanning candidates (and
|
|
39
|
+
// skips the remaining passes) once this is true. Pure.
|
|
40
|
+
export function hasFullHit(state) {
|
|
41
|
+
return state.apiKey !== null;
|
|
42
|
+
}
|
|
43
|
+
// Final resolution after the passes run. PURE. Faithful to extractCredentials'
|
|
44
|
+
// tail: a full key → {api_key}; else a truncated stub → {api_key_truncated} (the
|
|
45
|
+
// host agent surfaces the partial — better than "no key found" when the modal was
|
|
46
|
+
// demonstrably reached); else {} (no credential — the post-verify loop keeps
|
|
47
|
+
// navigating to the real keys surface).
|
|
48
|
+
export function resolveExtraction(state) {
|
|
49
|
+
if (state.apiKey !== null)
|
|
50
|
+
return { api_key: state.apiKey };
|
|
51
|
+
if (state.truncatedHit !== null)
|
|
52
|
+
return { api_key_truncated: state.truncatedHit };
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=extraction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction.js","sourceRoot":"","sources":["../../src/bot/extraction.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,iFAAiF;AACjF,+EAA+E;AAC/E,8BAA8B;AAC9B,EAAE;AACF,+EAA+E;AAC/E,2EAA2E;AAC3E,8EAA8E;AAC9E,iFAAiF;AACjF,2EAA2E;AAC3E,gFAAgF;AAChF,+EAA+E;AAC/E,mFAAmF;AACnF,gFAAgF;AAChF,gFAAgF;AAChF,kEAAkE;AAClE,EAAE;AACF,mFAAmF;AACnF,gFAAgF;AAChF,yEAAyE;AAgBzE,MAAM,UAAU,sBAAsB;IACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,iFAAiF;AACjF,kFAAkF;AAClF,iFAAiF;AACjF,sEAAsE;AACtE,MAAM,UAAU,mBAAmB,CAAC,KAAsB,EAAE,CAAiB;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,CAAC,iCAAiC;IAC1E,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5D,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACnF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kFAAkF;AAClF,uDAAuD;AACvD,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,OAAO,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED,+EAA+E;AAC/E,iFAAiF;AACjF,kFAAkF;AAClF,6EAA6E;AAC7E,wCAAwC;AACxC,MAAM,UAAU,iBAAiB,CAAC,KAAsB;IACtD,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC5D,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;IAClF,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
export declare function computePageSig(url: string, selectors: readonly string[]): string;
|
|
2
|
+
export declare function pageMovedSince(prevSig: string | null, currSig: string): boolean;
|
|
3
|
+
export declare function isStuckRepeat(input: {
|
|
4
|
+
planClickSelectors: readonly string[];
|
|
5
|
+
planEditsAField: boolean;
|
|
6
|
+
noProgressSelectors: ReadonlySet<string>;
|
|
7
|
+
}): boolean;
|
|
8
|
+
export declare function nextNoProgressSet(input: {
|
|
9
|
+
planClickSelectors: readonly string[];
|
|
10
|
+
hadFieldEdit: boolean;
|
|
11
|
+
}): Set<string>;
|
|
12
|
+
export declare const FORM_FILL_BUDGETS: {
|
|
13
|
+
readonly MAX_ERROR_REPLANS: 2;
|
|
14
|
+
readonly MAX_PROGRESS_REPLANS: 6;
|
|
15
|
+
readonly MAX_EMPTY_PLANS: 2;
|
|
16
|
+
readonly MAX_OAUTH_SCAN_RETRIES_SHELL: 8;
|
|
17
|
+
readonly MAX_OAUTH_SCAN_RETRIES_FORM: 2;
|
|
18
|
+
readonly MAX_OAUTH_SHELL_RELOADS: 1;
|
|
19
|
+
readonly MAX_UPSTREAM_BLIP_RETRIES: 8;
|
|
20
|
+
readonly MAX_SIGN_IN_ADVANCE_CLICKS: 2;
|
|
21
|
+
};
|
|
22
|
+
export interface FormFillState {
|
|
23
|
+
errorReplans: number;
|
|
24
|
+
progressReplans: number;
|
|
25
|
+
emptyPlans: number;
|
|
26
|
+
upstreamBlipRetries: number;
|
|
27
|
+
oauthScanRetries: number;
|
|
28
|
+
oauthShellReloads: number;
|
|
29
|
+
signInAdvanceClicks: number;
|
|
30
|
+
lastRoundPageSig: string | null;
|
|
31
|
+
lastNoProgressClickSelectors: ReadonlySet<string>;
|
|
32
|
+
committedToEmailPath: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare function initialFormFillState(forceFormFill?: boolean): FormFillState;
|
|
35
|
+
export type FormFillOutcome = {
|
|
36
|
+
kind: "submitted";
|
|
37
|
+
} | {
|
|
38
|
+
kind: "captcha_blocked";
|
|
39
|
+
captchaKind: string;
|
|
40
|
+
} | {
|
|
41
|
+
kind: "submit_failed";
|
|
42
|
+
reason: string;
|
|
43
|
+
} | {
|
|
44
|
+
kind: "planning_failed";
|
|
45
|
+
reason: string;
|
|
46
|
+
} | {
|
|
47
|
+
kind: "oauth_required";
|
|
48
|
+
} | {
|
|
49
|
+
kind: "needs_oauth_provider_session";
|
|
50
|
+
missingProviders: readonly string[];
|
|
51
|
+
haveSessions: readonly string[];
|
|
52
|
+
} | {
|
|
53
|
+
kind: "anti_bot_blocked";
|
|
54
|
+
vendor: string;
|
|
55
|
+
} | {
|
|
56
|
+
kind: "oauth";
|
|
57
|
+
selector: string;
|
|
58
|
+
provider: string;
|
|
59
|
+
} | {
|
|
60
|
+
kind: "already_oauth";
|
|
61
|
+
};
|
|
62
|
+
export interface PrePlanObservation {
|
|
63
|
+
checkpoint: "pre_plan";
|
|
64
|
+
hasFillableInput: boolean;
|
|
65
|
+
verifyWall: boolean;
|
|
66
|
+
codeGate: boolean;
|
|
67
|
+
oauthCandidatesPresent: boolean;
|
|
68
|
+
oauthButtonHit: {
|
|
69
|
+
selector: string;
|
|
70
|
+
provider: string;
|
|
71
|
+
} | null;
|
|
72
|
+
oauthScanShell: boolean;
|
|
73
|
+
alreadySignedIn: boolean;
|
|
74
|
+
signInAdvancePresent: boolean;
|
|
75
|
+
antiBotVendor: string | null;
|
|
76
|
+
oauthOnly: boolean;
|
|
77
|
+
oauthOnlyMissingProviders: readonly string[];
|
|
78
|
+
oauthOnlyHaveSessions: readonly string[];
|
|
79
|
+
}
|
|
80
|
+
export interface PlanErrorObservation {
|
|
81
|
+
checkpoint: "plan_error";
|
|
82
|
+
isUpstreamBlip: boolean;
|
|
83
|
+
reason: string;
|
|
84
|
+
}
|
|
85
|
+
export interface PostPlanObservation {
|
|
86
|
+
checkpoint: "post_plan";
|
|
87
|
+
isDashboard: boolean;
|
|
88
|
+
pageSig: string;
|
|
89
|
+
planClickSelectors: readonly string[];
|
|
90
|
+
planEditsAField: boolean;
|
|
91
|
+
verifyMiss: string | null;
|
|
92
|
+
verifyMissNotCheckbox: boolean;
|
|
93
|
+
}
|
|
94
|
+
export interface PostExecuteObservation {
|
|
95
|
+
checkpoint: "post_execute";
|
|
96
|
+
clickedEmailAffordance: boolean;
|
|
97
|
+
planClickSelectors: readonly string[];
|
|
98
|
+
hadFill: boolean;
|
|
99
|
+
hadFieldEdit: boolean;
|
|
100
|
+
planActionCount: number;
|
|
101
|
+
}
|
|
102
|
+
export interface PostSubmitObservation {
|
|
103
|
+
checkpoint: "post_submit";
|
|
104
|
+
preGateBlocked: boolean;
|
|
105
|
+
preGateKind: string;
|
|
106
|
+
submitError: string | null;
|
|
107
|
+
submitDisabled: boolean;
|
|
108
|
+
submitTimeout: boolean;
|
|
109
|
+
postGateBlocked: boolean;
|
|
110
|
+
postGateKind: string;
|
|
111
|
+
hasInbox: boolean;
|
|
112
|
+
validationFailure: boolean;
|
|
113
|
+
}
|
|
114
|
+
export type FormFillObservation = PrePlanObservation | PlanErrorObservation | PostPlanObservation | PostExecuteObservation | PostSubmitObservation;
|
|
115
|
+
export type FormFillAction = {
|
|
116
|
+
kind: "terminal";
|
|
117
|
+
outcome: FormFillOutcome;
|
|
118
|
+
} | {
|
|
119
|
+
kind: "oauth_scan_wait";
|
|
120
|
+
} | {
|
|
121
|
+
kind: "oauth_shell_reload";
|
|
122
|
+
} | {
|
|
123
|
+
kind: "sign_in_advance";
|
|
124
|
+
} | {
|
|
125
|
+
kind: "route_to_verification";
|
|
126
|
+
} | {
|
|
127
|
+
kind: "run_planner";
|
|
128
|
+
} | {
|
|
129
|
+
kind: "execute_plan";
|
|
130
|
+
} | {
|
|
131
|
+
kind: "submit";
|
|
132
|
+
} | {
|
|
133
|
+
kind: "blip_retry";
|
|
134
|
+
} | {
|
|
135
|
+
kind: "replan";
|
|
136
|
+
hintKind: FormFillHintKind;
|
|
137
|
+
};
|
|
138
|
+
export type FormFillHintKind = "selector_not_in_inventory" | "selectors_did_not_verify" | "drop_the_check" | "page_advanced" | "submit_disabled" | "submit_went_stale" | "post_submit_validation";
|
|
139
|
+
export interface FormFillStep {
|
|
140
|
+
action: FormFillAction;
|
|
141
|
+
nextState: FormFillState;
|
|
142
|
+
}
|
|
143
|
+
export declare function decideFormFillStep(state: FormFillState, obs: FormFillObservation): FormFillStep;
|
|
144
|
+
//# sourceMappingURL=form-fill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-fill.d.ts","sourceRoot":"","sources":["../../src/bot/form-fill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
// form-fill.ts — pure decision primitives of the signup FORM-FILL phase, carved
|
|
2
|
+
// out of planExecuteWithRetry (strangler slice 3 — see DESIGN-form-fill-engine.md).
|
|
3
|
+
// Browser-free + unit-tested. This commit is the no-progress / stuck-loop
|
|
4
|
+
// detector (F14 + the page-fingerprint progress check) — the highest-value,
|
|
5
|
+
// most self-contained piece and a recurring brittleness source (kinde/Railway
|
|
6
|
+
// false-bails). The full decideFormFillStep reducer is the next increment.
|
|
7
|
+
//
|
|
8
|
+
// Not yet wired into agent.ts — changing this file cannot regress the live path.
|
|
9
|
+
// The page "moved" between two form-fill rounds iff the URL changed OR the set of
|
|
10
|
+
// interactive selectors changed (a field gained/lost, a validation message
|
|
11
|
+
// toggled an element, a wizard step advanced). The fingerprint is url + the
|
|
12
|
+
// sorted selector set; ANY change means the previous round made real progress.
|
|
13
|
+
export function computePageSig(url, selectors) {
|
|
14
|
+
return `${url}§${[...selectors].sort().join("|")}`;
|
|
15
|
+
}
|
|
16
|
+
export function pageMovedSince(prevSig, currSig) {
|
|
17
|
+
return prevSig !== null && currSig !== prevSig;
|
|
18
|
+
}
|
|
19
|
+
// F14 stuck-loop test: a plan that clicks ONLY selectors already proven dead last
|
|
20
|
+
// round (no page progress) — and edits no field — is a planner loop; bail rather
|
|
21
|
+
// than re-click forever. Does NOT fire when the plan adds a NEW selector
|
|
22
|
+
// (legitimate exploration) or edits a field this round (a fill/check alongside a
|
|
23
|
+
// repeated click is real progress — kinde's "tick the required box + re-click
|
|
24
|
+
// Next" advances the form even though the Next selector repeats). Pure.
|
|
25
|
+
export function isStuckRepeat(input) {
|
|
26
|
+
if (input.planEditsAField)
|
|
27
|
+
return false;
|
|
28
|
+
if (input.planClickSelectors.length === 0)
|
|
29
|
+
return false;
|
|
30
|
+
if (input.noProgressSelectors.size === 0)
|
|
31
|
+
return false;
|
|
32
|
+
return input.planClickSelectors.every((s) => input.noProgressSelectors.has(s));
|
|
33
|
+
}
|
|
34
|
+
// The dead-selector memory update after a NO-PROGRESS round (the page only
|
|
35
|
+
// revealed/advanced, no fillable form yet): a field edit this round means real
|
|
36
|
+
// progress → clear the set; otherwise record THIS round's click selectors so the
|
|
37
|
+
// next round's isStuckRepeat can catch a loop. Pure (returns a fresh set).
|
|
38
|
+
export function nextNoProgressSet(input) {
|
|
39
|
+
return input.hadFieldEdit ? new Set() : new Set(input.planClickSelectors);
|
|
40
|
+
}
|
|
41
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
42
|
+
// decideFormFillStep — the PURE decision reducer for the form-fill phase, carved
|
|
43
|
+
// out of planExecuteWithRetry (agent.ts:4648–5392). Eng-reviewed (Claude + Codex,
|
|
44
|
+
// 2026-06-15, report in DESIGN-form-fill-engine.md). The review's headline:
|
|
45
|
+
// unlike the OAuth slice, a form-fill ROUND is NOT one observation→decision; it
|
|
46
|
+
// is a SEQUENCE of FOUR I/O-gated checkpoints where later I/O depends on earlier
|
|
47
|
+
// decisions (the LLM planner doesn't run if the OAuth-first scan short-circuits).
|
|
48
|
+
// So this is a PHASE-DISCRIMINATED reducer: the executor calls it at each
|
|
49
|
+
// checkpoint with that checkpoint's I/O-gathered facts, runs the returned
|
|
50
|
+
// action's I/O, then re-enters at the next phase.
|
|
51
|
+
//
|
|
52
|
+
// decideFormFillStep(state, observation) → { action, nextState }
|
|
53
|
+
//
|
|
54
|
+
// BOUNDARY (the review's Q2): the reducer DECIDES; the executor owns ALL I/O and
|
|
55
|
+
// the *content* of any replan hint (e.g. the submit_disabled snapshot that lists
|
|
56
|
+
// concrete unchecked-checkbox candidates is a fresh buildInventory read — the
|
|
57
|
+
// reducer only emits the hint INTENT). The reducer never touches a browser.
|
|
58
|
+
//
|
|
59
|
+
// Faithfulness anchors (review's commit-2 checklist):
|
|
60
|
+
// • the 4 checkpoints as obs.checkpoint (C3 post_plan is the only pure one).
|
|
61
|
+
// • the OAuth-first nested scan's actions + budget resets (oauthScanRetries→0
|
|
62
|
+
// on shell-reload AND advance-click).
|
|
63
|
+
// • committedToEmailPath one-way control-state (suppresses C1's OAuth-first scan).
|
|
64
|
+
// • the FOUR-debt counter taxonomy (errorReplans vs progressReplans vs
|
|
65
|
+
// upstreamBlipRetries vs emptyPlans) — each ticked in its own branch.
|
|
66
|
+
// • the 2 non-local terminal flips (managed-Turnstile+inbox→submitted;
|
|
67
|
+
// validation w/ progress budget exhausted→submitted).
|
|
68
|
+
// The per-signup budget ceilings (agent.ts:4583–4616). Exported so the executor
|
|
69
|
+
// and the golden-transition tests share one source of truth.
|
|
70
|
+
export const FORM_FILL_BUDGETS = {
|
|
71
|
+
MAX_ERROR_REPLANS: 2,
|
|
72
|
+
MAX_PROGRESS_REPLANS: 6,
|
|
73
|
+
MAX_EMPTY_PLANS: 2, // bail at the 2nd *consecutive* empty plan
|
|
74
|
+
MAX_OAUTH_SCAN_RETRIES_SHELL: 8,
|
|
75
|
+
MAX_OAUTH_SCAN_RETRIES_FORM: 2,
|
|
76
|
+
MAX_OAUTH_SHELL_RELOADS: 1,
|
|
77
|
+
MAX_UPSTREAM_BLIP_RETRIES: 8,
|
|
78
|
+
MAX_SIGN_IN_ADVANCE_CLICKS: 2,
|
|
79
|
+
};
|
|
80
|
+
// The fresh FormFillState at loop entry. `forceFormFill` seeds committedToEmailPath
|
|
81
|
+
// (the re-route after a no-account Google bounce — agent.ts:4645).
|
|
82
|
+
export function initialFormFillState(forceFormFill = false) {
|
|
83
|
+
return {
|
|
84
|
+
errorReplans: 0,
|
|
85
|
+
progressReplans: 0,
|
|
86
|
+
emptyPlans: 0,
|
|
87
|
+
upstreamBlipRetries: 0,
|
|
88
|
+
oauthScanRetries: 0,
|
|
89
|
+
oauthShellReloads: 0,
|
|
90
|
+
signInAdvanceClicks: 0,
|
|
91
|
+
lastRoundPageSig: null,
|
|
92
|
+
lastNoProgressClickSelectors: new Set(),
|
|
93
|
+
committedToEmailPath: forceFormFill,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const B = FORM_FILL_BUDGETS;
|
|
97
|
+
// Decide the next form-fill step. PURE. Dispatches on the checkpoint and mirrors
|
|
98
|
+
// the live loop's branch ORDER exactly (line refs against agent.ts).
|
|
99
|
+
export function decideFormFillStep(state, obs) {
|
|
100
|
+
const keep = (action) => ({ action, nextState: state });
|
|
101
|
+
const next = (action, patch) => ({
|
|
102
|
+
action,
|
|
103
|
+
nextState: { ...state, ...patch },
|
|
104
|
+
});
|
|
105
|
+
const terminal = (outcome) => keep({ kind: "terminal", outcome });
|
|
106
|
+
switch (obs.checkpoint) {
|
|
107
|
+
// ── C1 pre_plan (agent.ts:4666–4976) ──────────────────────────────────
|
|
108
|
+
case "pre_plan": {
|
|
109
|
+
// Verify-email WALL: no fillable input + "check your email" copy →
|
|
110
|
+
// inbox-poll path (the executor clicks Resend, then returns submitted).
|
|
111
|
+
// [agent.ts:4717]
|
|
112
|
+
if (obs.verifyWall)
|
|
113
|
+
return keep({ kind: "route_to_verification" });
|
|
114
|
+
// Email verification-CODE gate (only after the email was submitted). [4757]
|
|
115
|
+
if (state.committedToEmailPath && obs.codeGate) {
|
|
116
|
+
return terminal({ kind: "submitted" });
|
|
117
|
+
}
|
|
118
|
+
// OAuth-first scan — suppressed once committed to the email path. [4778]
|
|
119
|
+
if (obs.oauthCandidatesPresent && !state.committedToEmailPath) {
|
|
120
|
+
if (obs.oauthButtonHit !== null) {
|
|
121
|
+
return terminal({
|
|
122
|
+
kind: "oauth",
|
|
123
|
+
selector: obs.oauthButtonHit.selector,
|
|
124
|
+
provider: obs.oauthButtonHit.provider,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// no provider button yet — patient async-render retries. [4827]
|
|
128
|
+
const maxScan = obs.oauthScanShell
|
|
129
|
+
? B.MAX_OAUTH_SCAN_RETRIES_SHELL
|
|
130
|
+
: B.MAX_OAUTH_SCAN_RETRIES_FORM;
|
|
131
|
+
if (state.oauthScanRetries < maxScan) {
|
|
132
|
+
return next({ kind: "oauth_scan_wait" }, { oauthScanRetries: state.oauthScanRetries + 1 });
|
|
133
|
+
}
|
|
134
|
+
// exhausted retries, still a shell → reload once to unstick. [4841]
|
|
135
|
+
if (obs.oauthScanShell && state.oauthShellReloads < B.MAX_OAUTH_SHELL_RELOADS) {
|
|
136
|
+
return next({ kind: "oauth_shell_reload" }, { oauthShellReloads: state.oauthShellReloads + 1, oauthScanRetries: 0 });
|
|
137
|
+
}
|
|
138
|
+
// already-authenticated dashboard (no form) → post-verify nav. [4863]
|
|
139
|
+
if (obs.alreadySignedIn)
|
|
140
|
+
return terminal({ kind: "already_oauth" });
|
|
141
|
+
// a generic "Sign In to Continue" gate hides the provider buttons. [4879]
|
|
142
|
+
if (state.signInAdvanceClicks < B.MAX_SIGN_IN_ADVANCE_CLICKS && obs.signInAdvancePresent) {
|
|
143
|
+
return next({ kind: "sign_in_advance" }, { signInAdvanceClicks: state.signInAdvanceClicks + 1, oauthScanRetries: 0 });
|
|
144
|
+
}
|
|
145
|
+
// no usable provider affordance — fall through to form-fill. [4903]
|
|
146
|
+
}
|
|
147
|
+
// Anti-bot interstitial that wouldn't clear (tiny inventory). [4932]
|
|
148
|
+
if (obs.antiBotVendor !== null) {
|
|
149
|
+
return terminal({ kind: "anti_bot_blocked", vendor: obs.antiBotVendor });
|
|
150
|
+
}
|
|
151
|
+
// OAuth-only chooser: nothing fillable, no email-signup option. [4945]
|
|
152
|
+
if (obs.oauthOnly) {
|
|
153
|
+
const recoverable = obs.oauthOnlyMissingProviders.length > 0 && obs.oauthOnlyHaveSessions.length > 0;
|
|
154
|
+
return terminal(recoverable
|
|
155
|
+
? {
|
|
156
|
+
kind: "needs_oauth_provider_session",
|
|
157
|
+
missingProviders: obs.oauthOnlyMissingProviders,
|
|
158
|
+
haveSessions: obs.oauthOnlyHaveSessions,
|
|
159
|
+
}
|
|
160
|
+
: { kind: "oauth_required" });
|
|
161
|
+
}
|
|
162
|
+
// Nothing short-circuited → ask the planner. [4978]
|
|
163
|
+
return keep({ kind: "run_planner" });
|
|
164
|
+
}
|
|
165
|
+
// ── C2 plan_error (agent.ts:4988–5028) ────────────────────────────────
|
|
166
|
+
case "plan_error": {
|
|
167
|
+
// Transient upstream blip (50x / network): brief backoff + retry, capped,
|
|
168
|
+
// and deliberately NOT charged to errorReplans (it's weather, not logic).
|
|
169
|
+
if (obs.isUpstreamBlip) {
|
|
170
|
+
const nextBlips = state.upstreamBlipRetries + 1;
|
|
171
|
+
if (nextBlips > B.MAX_UPSTREAM_BLIP_RETRIES) {
|
|
172
|
+
return terminal({
|
|
173
|
+
kind: "planning_failed",
|
|
174
|
+
reason: `llm_proxy_unavailable: planner request failed ${nextBlips}x on upstream proxy errors (${obs.reason}) — sustained LLM-proxy/upstream outage, not a page problem`,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return next({ kind: "blip_retry" }, { upstreamBlipRetries: nextBlips });
|
|
178
|
+
}
|
|
179
|
+
// Invalid planner OUTPUT (parse fail / hallucinated selector): error replan.
|
|
180
|
+
const nextErr = state.errorReplans + 1;
|
|
181
|
+
if (nextErr > B.MAX_ERROR_REPLANS) {
|
|
182
|
+
return terminal({
|
|
183
|
+
kind: "planning_failed",
|
|
184
|
+
reason: `planner output never validated: ${obs.reason}`,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return next({ kind: "replan", hintKind: "selector_not_in_inventory" }, { errorReplans: nextErr });
|
|
188
|
+
}
|
|
189
|
+
// ── C3 post_plan (agent.ts:5034–5118) — the only PURE checkpoint ───────
|
|
190
|
+
case "post_plan": {
|
|
191
|
+
// A logged-in product/billing page misread as a signup form. [5043]
|
|
192
|
+
if (obs.isDashboard)
|
|
193
|
+
return terminal({ kind: "already_oauth" });
|
|
194
|
+
// page-fingerprint progress: clear the no-progress memory if the page
|
|
195
|
+
// moved since last round. [5050]
|
|
196
|
+
const moved = pageMovedSince(state.lastRoundPageSig, obs.pageSig);
|
|
197
|
+
const deadSelectors = moved ? new Set() : state.lastNoProgressClickSelectors;
|
|
198
|
+
const memoryPatch = {
|
|
199
|
+
lastRoundPageSig: obs.pageSig,
|
|
200
|
+
lastNoProgressClickSelectors: deadSelectors,
|
|
201
|
+
};
|
|
202
|
+
// F14 stuck-detection (uses the just-cleared memory). [5086]
|
|
203
|
+
if (isStuckRepeat({
|
|
204
|
+
planClickSelectors: obs.planClickSelectors,
|
|
205
|
+
planEditsAField: obs.planEditsAField,
|
|
206
|
+
noProgressSelectors: deadSelectors,
|
|
207
|
+
})) {
|
|
208
|
+
return next({
|
|
209
|
+
kind: "terminal",
|
|
210
|
+
outcome: {
|
|
211
|
+
kind: "planning_failed",
|
|
212
|
+
reason: `stuck — planner re-picked the same click selector(s) after no-progress: ${obs.planClickSelectors.join(", ")}`,
|
|
213
|
+
},
|
|
214
|
+
}, memoryPatch);
|
|
215
|
+
}
|
|
216
|
+
// verifyPlan: a planned selector didn't resolve on the live page. [5102]
|
|
217
|
+
if (obs.verifyMiss !== null) {
|
|
218
|
+
const nextErr = state.errorReplans + 1;
|
|
219
|
+
if (nextErr > B.MAX_ERROR_REPLANS) {
|
|
220
|
+
return next({
|
|
221
|
+
kind: "terminal",
|
|
222
|
+
outcome: { kind: "planning_failed", reason: `planned selectors kept missing: ${obs.verifyMiss}` },
|
|
223
|
+
}, memoryPatch);
|
|
224
|
+
}
|
|
225
|
+
return next({ kind: "replan", hintKind: obs.verifyMissNotCheckbox ? "drop_the_check" : "selectors_did_not_verify" }, { ...memoryPatch, errorReplans: nextErr });
|
|
226
|
+
}
|
|
227
|
+
// picks verify → execute. [5120]
|
|
228
|
+
return next({ kind: "execute_plan" }, memoryPatch);
|
|
229
|
+
}
|
|
230
|
+
// ── C4 post_execute (agent.ts:5122–5206) ──────────────────────────────
|
|
231
|
+
case "post_execute": {
|
|
232
|
+
// commit to the email path the moment an email-affordance was clicked. [5132]
|
|
233
|
+
const commitPatch = obs.clickedEmailAffordance
|
|
234
|
+
? { committedToEmailPath: true }
|
|
235
|
+
: {};
|
|
236
|
+
// a plan with no fill either advanced the page (replan) or is a dead end. [5163]
|
|
237
|
+
if (!obs.hadFill) {
|
|
238
|
+
let emptyPlans = state.emptyPlans;
|
|
239
|
+
if (obs.planActionCount === 0) {
|
|
240
|
+
emptyPlans += 1;
|
|
241
|
+
if (emptyPlans >= B.MAX_EMPTY_PLANS) {
|
|
242
|
+
return next({
|
|
243
|
+
kind: "terminal",
|
|
244
|
+
outcome: {
|
|
245
|
+
kind: "planning_failed",
|
|
246
|
+
reason: "no fillable form on the page — the planner found no input fields or actionable elements",
|
|
247
|
+
},
|
|
248
|
+
}, { ...commitPatch, emptyPlans });
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
emptyPlans = 0;
|
|
253
|
+
}
|
|
254
|
+
const nextProgress = state.progressReplans + 1;
|
|
255
|
+
if (nextProgress > B.MAX_PROGRESS_REPLANS) {
|
|
256
|
+
return next({ kind: "terminal", outcome: { kind: "planning_failed", reason: "never reached a fillable form" } }, { ...commitPatch, emptyPlans });
|
|
257
|
+
}
|
|
258
|
+
// F14 — record dead click selectors (cleared if a field edit happened). [5190]
|
|
259
|
+
const dead = nextNoProgressSet({
|
|
260
|
+
planClickSelectors: obs.planClickSelectors,
|
|
261
|
+
hadFieldEdit: obs.hadFieldEdit,
|
|
262
|
+
});
|
|
263
|
+
return next({ kind: "replan", hintKind: "page_advanced" }, {
|
|
264
|
+
...commitPatch,
|
|
265
|
+
emptyPlans,
|
|
266
|
+
progressReplans: nextProgress,
|
|
267
|
+
lastNoProgressClickSelectors: dead,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// a fill IS present = forward progress → clear the stuck tracker, go submit. [5206]
|
|
271
|
+
return next({ kind: "submit" }, { ...commitPatch, lastNoProgressClickSelectors: new Set() });
|
|
272
|
+
}
|
|
273
|
+
// ── C4 post_submit (agent.ts:5222–5391) ───────────────────────────────
|
|
274
|
+
case "post_submit": {
|
|
275
|
+
// pre-submit captcha gate. [5223]
|
|
276
|
+
if (obs.preGateBlocked) {
|
|
277
|
+
return terminal({ kind: "captcha_blocked", captchaKind: obs.preGateKind });
|
|
278
|
+
}
|
|
279
|
+
// submit click failures. [5229]
|
|
280
|
+
if (obs.submitError !== null) {
|
|
281
|
+
if (obs.submitDisabled) {
|
|
282
|
+
const nextProgress = state.progressReplans + 1;
|
|
283
|
+
if (nextProgress > B.MAX_PROGRESS_REPLANS) {
|
|
284
|
+
return terminal({ kind: "submit_failed", reason: obs.submitError });
|
|
285
|
+
}
|
|
286
|
+
return next({ kind: "replan", hintKind: "submit_disabled" }, { progressReplans: nextProgress });
|
|
287
|
+
}
|
|
288
|
+
if (obs.submitTimeout) {
|
|
289
|
+
const nextProgress = state.progressReplans + 1;
|
|
290
|
+
if (nextProgress > B.MAX_PROGRESS_REPLANS) {
|
|
291
|
+
return terminal({ kind: "submit_failed", reason: obs.submitError });
|
|
292
|
+
}
|
|
293
|
+
return next({ kind: "replan", hintKind: "submit_went_stale" }, { progressReplans: nextProgress });
|
|
294
|
+
}
|
|
295
|
+
return terminal({ kind: "submit_failed", reason: obs.submitError });
|
|
296
|
+
}
|
|
297
|
+
// post-submit captcha gate. [5331]
|
|
298
|
+
if (obs.postGateBlocked) {
|
|
299
|
+
// managed/invisible Turnstile resolves server-side; with an inbox to
|
|
300
|
+
// arbitrate, proceed — a code arriving proves the submit went through.
|
|
301
|
+
if (obs.postGateKind === "turnstile" && obs.hasInbox) {
|
|
302
|
+
return terminal({ kind: "submitted" });
|
|
303
|
+
}
|
|
304
|
+
return terminal({ kind: "captcha_blocked", captchaKind: obs.postGateKind });
|
|
305
|
+
}
|
|
306
|
+
// post-submit validation errors → the page advanced; re-plan. [5373]
|
|
307
|
+
if (obs.validationFailure) {
|
|
308
|
+
const nextProgress = state.progressReplans + 1;
|
|
309
|
+
// out of replan headroom → proceed; extraction is the real arbiter. [5374]
|
|
310
|
+
if (nextProgress > B.MAX_PROGRESS_REPLANS) {
|
|
311
|
+
return terminal({ kind: "submitted" });
|
|
312
|
+
}
|
|
313
|
+
return next({ kind: "replan", hintKind: "post_submit_validation" }, { progressReplans: nextProgress });
|
|
314
|
+
}
|
|
315
|
+
// clean submit. [5391]
|
|
316
|
+
return terminal({ kind: "submitted" });
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=form-fill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-fill.js","sourceRoot":"","sources":["../../src/bot/form-fill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-login.d.ts","sourceRoot":"","sources":["../../src/bot/google-login.ts"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"google-login.d.ts","sourceRoot":"","sources":["../../src/bot/google-login.ts"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAsG5D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAqBD,wBAAsB,4BAA4B,CAChD,UAAU,GAAE,MAA2B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC,CAmB5B;AAUD,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,aAAa,GACb,WAAW,GACX,YAAY,CAAC;AAEjB,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAwCtF;AA+BD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CA2BlE;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAEjE;AAaD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB/D;AAUD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBpE;AAGD,wBAAgB,UAAU,IAAI,OAAO,CAapC;AAWD,wBAAgB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAe9C;AAaD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGjD;AAiJD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IAGjB,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAG7D,WAAW,EAAE,MAAM,CAAC;IAIpB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAO1D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAKvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,WAAW,GAAG,qBAAqB,GAAG,SAAS,CAAA;CAAE,CAAC,CAsBtE;AAuRD,wBAAsB,kBAAkB,CAAC,IAAI,CAAC,EAAE;IAC9C,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IAQpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,WAAW,CAAC,CAsDvB;AASD,wBAAsB,6BAA6B,CAAC,IAAI,EAAE;IACxD,UAAU,EAAE,MAAM,CAAC;IAOnB,gBAAgB,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAIxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoDxE"}
|
package/dist/bot/google-login.js
CHANGED
|
@@ -95,8 +95,12 @@ const LOGIN_TARGETS = {
|
|
|
95
95
|
// phone via noVNC (the spike's 1920x1080 was the UX mistake). 720x1280
|
|
96
96
|
// is the smallest size that doesn't look pixel-y on a 1080p+ phone
|
|
97
97
|
// screen, and stays bandwidth-friendly compared to 1080x1920.
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
// Overridable via BOT_NOVNC_W/H — a desktop-width display (e.g. 1440x900) is
|
|
99
|
+
// needed when the remote page is a responsive app whose desktop-only controls
|
|
100
|
+
// (hover-revealed row menus in the Workspace Admin console) collapse at phone
|
|
101
|
+
// width. Defaults stay phone-shaped for the common login-from-phone case.
|
|
102
|
+
const HEADLESS_W = Number(process.env.BOT_NOVNC_W) || 720;
|
|
103
|
+
const HEADLESS_H = Number(process.env.BOT_NOVNC_H) || 1280;
|
|
100
104
|
// The Debian/Ubuntu `novnc` package installs its web assets here — the
|
|
101
105
|
// `core/` RFB library our branded page reuses (see runHeadlessChrome).
|
|
102
106
|
const NOVNC_INSTALL_DIR = "/usr/share/novnc";
|