@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.
Files changed (56) hide show
  1. package/dist/bot/affordance-probe.d.ts +15 -0
  2. package/dist/bot/affordance-probe.d.ts.map +1 -0
  3. package/dist/bot/affordance-probe.js +63 -0
  4. package/dist/bot/affordance-probe.js.map +1 -0
  5. package/dist/bot/agent.d.ts +31 -1
  6. package/dist/bot/agent.d.ts.map +1 -1
  7. package/dist/bot/agent.js +1826 -129
  8. package/dist/bot/agent.js.map +1 -1
  9. package/dist/bot/browser.d.ts +9 -0
  10. package/dist/bot/browser.d.ts.map +1 -1
  11. package/dist/bot/browser.js +281 -8
  12. package/dist/bot/browser.js.map +1 -1
  13. package/dist/bot/extraction.d.ts +18 -0
  14. package/dist/bot/extraction.d.ts.map +1 -0
  15. package/dist/bot/extraction.js +55 -0
  16. package/dist/bot/extraction.js.map +1 -0
  17. package/dist/bot/form-fill.d.ts +144 -0
  18. package/dist/bot/form-fill.d.ts.map +1 -0
  19. package/dist/bot/form-fill.js +320 -0
  20. package/dist/bot/form-fill.js.map +1 -0
  21. package/dist/bot/google-login.d.ts.map +1 -1
  22. package/dist/bot/google-login.js +6 -2
  23. package/dist/bot/google-login.js.map +1 -1
  24. package/dist/bot/llm-client.d.ts +12 -0
  25. package/dist/bot/llm-client.d.ts.map +1 -1
  26. package/dist/bot/llm-client.js +99 -0
  27. package/dist/bot/llm-client.js.map +1 -1
  28. package/dist/bot/nav-search.d.ts +80 -0
  29. package/dist/bot/nav-search.d.ts.map +1 -0
  30. package/dist/bot/nav-search.js +409 -0
  31. package/dist/bot/nav-search.js.map +1 -0
  32. package/dist/bot/oauth-flow.d.ts +48 -0
  33. package/dist/bot/oauth-flow.d.ts.map +1 -0
  34. package/dist/bot/oauth-flow.js +111 -0
  35. package/dist/bot/oauth-flow.js.map +1 -0
  36. package/dist/bot/onboarding-capture.d.ts +4 -0
  37. package/dist/bot/onboarding-capture.d.ts.map +1 -1
  38. package/dist/bot/onboarding-capture.js +5 -0
  39. package/dist/bot/onboarding-capture.js.map +1 -1
  40. package/dist/bot/redact.d.ts +1 -0
  41. package/dist/bot/redact.d.ts.map +1 -1
  42. package/dist/bot/redact.js +46 -0
  43. package/dist/bot/redact.js.map +1 -1
  44. package/dist/skill-registry-client.d.ts +4 -0
  45. package/dist/skill-registry-client.d.ts.map +1 -1
  46. package/dist/skill-registry-client.js +4 -0
  47. package/dist/skill-registry-client.js.map +1 -1
  48. package/dist/tools/provision-any.d.ts +21 -0
  49. package/dist/tools/provision-any.d.ts.map +1 -1
  50. package/dist/tools/provision-any.js +16 -7
  51. package/dist/tools/provision-any.js.map +1 -1
  52. package/dist/tools/signup-telemetry.d.ts +6 -0
  53. package/dist/tools/signup-telemetry.d.ts.map +1 -1
  54. package/dist/tools/signup-telemetry.js +4 -0
  55. package/dist/tools/signup-telemetry.js.map +1 -1
  56. 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;AAkG5D,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"}
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"}
@@ -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
- const HEADLESS_W = 720;
99
- const HEADLESS_H = 1280;
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";