@te-river/opencode-team-mode 1.5.11 → 1.5.13
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 +154 -57
- package/README.zh-CN.md +126 -47
- package/dist/agents.d.ts +5 -1
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +37 -11
- package/dist/agents.js.map +1 -1
- package/dist/approval-gate.d.ts +54 -16
- package/dist/approval-gate.d.ts.map +1 -1
- package/dist/approval-gate.js +163 -42
- package/dist/approval-gate.js.map +1 -1
- package/dist/host-hooks.d.ts +115 -0
- package/dist/host-hooks.d.ts.map +1 -0
- package/dist/host-hooks.js +270 -0
- package/dist/host-hooks.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -4
- package/dist/index.js.map +1 -1
- package/dist/prompts/lead.d.ts +1 -1
- package/dist/prompts/lead.d.ts.map +1 -1
- package/dist/prompts/lead.js +88 -6
- package/dist/prompts/lead.js.map +1 -1
- package/dist/prompts/shared.d.ts +1 -1
- package/dist/prompts/shared.d.ts.map +1 -1
- package/dist/prompts/shared.js +203 -119
- package/dist/prompts/shared.js.map +1 -1
- package/dist/prompts/specialists.d.ts +2 -2
- package/dist/prompts/specialists.d.ts.map +1 -1
- package/dist/prompts/specialists.js +73 -23
- package/dist/prompts/specialists.js.map +1 -1
- package/dist/tm/args-schema.d.ts +31 -1
- package/dist/tm/args-schema.d.ts.map +1 -1
- package/dist/tm/args-schema.js +155 -39
- package/dist/tm/args-schema.js.map +1 -1
- package/dist/tm/bash-timeout.d.ts +72 -0
- package/dist/tm/bash-timeout.d.ts.map +1 -0
- package/dist/tm/bash-timeout.js +100 -0
- package/dist/tm/bash-timeout.js.map +1 -0
- package/dist/tm/browser.d.ts +250 -20
- package/dist/tm/browser.d.ts.map +1 -1
- package/dist/tm/browser.js +1200 -143
- package/dist/tm/browser.js.map +1 -1
- package/dist/tm/config.d.ts +129 -0
- package/dist/tm/config.d.ts.map +1 -1
- package/dist/tm/config.js +117 -1
- package/dist/tm/config.js.map +1 -1
- package/dist/tm/dispatch.d.ts +95 -0
- package/dist/tm/dispatch.d.ts.map +1 -0
- package/dist/tm/dispatch.js +369 -0
- package/dist/tm/dispatch.js.map +1 -0
- package/dist/tm/index.d.ts +32 -7
- package/dist/tm/index.d.ts.map +1 -1
- package/dist/tm/index.js +74 -5
- package/dist/tm/index.js.map +1 -1
- package/dist/tm/memory.d.ts +88 -10
- package/dist/tm/memory.d.ts.map +1 -1
- package/dist/tm/memory.js +881 -99
- package/dist/tm/memory.js.map +1 -1
- package/dist/tm/pipelines.d.ts +26 -3
- package/dist/tm/pipelines.d.ts.map +1 -1
- package/dist/tm/pipelines.js +167 -11
- package/dist/tm/pipelines.js.map +1 -1
- package/dist/tm/ptc/budgets.d.ts +22 -1
- package/dist/tm/ptc/budgets.d.ts.map +1 -1
- package/dist/tm/ptc/budgets.js +87 -8
- package/dist/tm/ptc/budgets.js.map +1 -1
- package/dist/tm/ptc/contract.d.ts +49 -9
- package/dist/tm/ptc/contract.d.ts.map +1 -1
- package/dist/tm/ptc/contract.js +41 -3
- package/dist/tm/ptc/contract.js.map +1 -1
- package/dist/tm/ptc/driver.d.ts +5 -2
- package/dist/tm/ptc/driver.d.ts.map +1 -1
- package/dist/tm/ptc/driver.js +47 -15
- package/dist/tm/ptc/driver.js.map +1 -1
- package/dist/tm/ptc/engines.d.ts +15 -4
- package/dist/tm/ptc/engines.d.ts.map +1 -1
- package/dist/tm/ptc/engines.js +281 -28
- package/dist/tm/ptc/engines.js.map +1 -1
- package/dist/tm/ptc/index.d.ts +4 -4
- package/dist/tm/ptc/index.d.ts.map +1 -1
- package/dist/tm/ptc/index.js +2 -2
- package/dist/tm/ptc/index.js.map +1 -1
- package/dist/tm/ptc/pscan.d.ts +20 -1
- package/dist/tm/ptc/pscan.d.ts.map +1 -1
- package/dist/tm/ptc/pscan.js +328 -14
- package/dist/tm/ptc/pscan.js.map +1 -1
- package/dist/tm/ptc/summary.d.ts.map +1 -1
- package/dist/tm/ptc/summary.js +23 -1
- package/dist/tm/ptc/summary.js.map +1 -1
- package/dist/tm/ptc/tool.d.ts +34 -3
- package/dist/tm/ptc/tool.d.ts.map +1 -1
- package/dist/tm/ptc/tool.js +117 -20
- package/dist/tm/ptc/tool.js.map +1 -1
- package/dist/tm/pty.d.ts +70 -0
- package/dist/tm/pty.d.ts.map +1 -0
- package/dist/tm/pty.js +242 -0
- package/dist/tm/pty.js.map +1 -0
- package/dist/tm/search.d.ts +128 -15
- package/dist/tm/search.d.ts.map +1 -1
- package/dist/tm/search.js +556 -47
- package/dist/tm/search.js.map +1 -1
- package/dist/tm/shell-bridge.d.ts +14 -1
- package/dist/tm/shell-bridge.d.ts.map +1 -1
- package/dist/tm/shell-bridge.js +57 -10
- package/dist/tm/shell-bridge.js.map +1 -1
- package/dist/tm/webfetch.d.ts +29 -7
- package/dist/tm/webfetch.d.ts.map +1 -1
- package/dist/tm/webfetch.js +117 -15
- package/dist/tm/webfetch.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/installation.md +216 -17
- package/package.json +5 -2
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in bash TIMEOUT discipline (issue #6 of 2026-09-18).
|
|
3
|
+
*
|
|
4
|
+
* Where the 120 s comes from: the host's shell tool resolves
|
|
5
|
+
* `flags.bashDefaultTimeoutMs ?? 2 * 60 * 1e3` (verified in the shipped
|
|
6
|
+
* desktop bundle) — so when a model omits `timeout`, 120 s is the HOST
|
|
7
|
+
* default, and models that do pass one routinely pass 120000+ for a
|
|
8
|
+
* `Get-ChildItem`. Three serialised probes then cost the user six minutes
|
|
9
|
+
* of dead air, and every one of them was allowed to run for a reason no
|
|
10
|
+
* model ever had.
|
|
11
|
+
*
|
|
12
|
+
* The plugin owns no shell timer, so the ONE non-invasive lever is the
|
|
13
|
+
* official `tool.execute.before` hook, whose `output.args` is explicitly
|
|
14
|
+
* mutable. Two ceilings, both opt-out:
|
|
15
|
+
* - `TM_BASH_TIMEOUT_PROBE_MS` (default 60 000) — only for a command the
|
|
16
|
+
* P3 read-only allowlist already accepts (ls / grep / rg / cat /
|
|
17
|
+
* Get-ChildItem …). A pure probe has no legitimate reason to outlive
|
|
18
|
+
* a minute, and this is where the wasted 120 s actually sits.
|
|
19
|
+
* - `TM_BASH_TIMEOUT_MAX_MS` (default 0 = OFF) — a global cap for
|
|
20
|
+
* everything else. Off by default on purpose: a build/test run may
|
|
21
|
+
* legitimately need minutes, and silently killing one is worse than a
|
|
22
|
+
* slow one. A user who wants the ceiling sets it.
|
|
23
|
+
*
|
|
24
|
+
* This clamps a number the model already volunteered; it never ADDS a
|
|
25
|
+
* timeout where the model supplied none (that would turn the host's default
|
|
26
|
+
* into OUR default, which is not this plugin's call to make).
|
|
27
|
+
*/
|
|
28
|
+
import { classifyReadonlyCommand } from "./guard.js";
|
|
29
|
+
/** Parse the model-supplied timeout defensively: the host schema says a
|
|
30
|
+
* positive integer of MILLISECONDS, but an LLM hands us `"120000"`,
|
|
31
|
+
* `120000.0`, or omits it entirely. Anything unreadable means "no
|
|
32
|
+
* timeout was supplied" and is left alone. */
|
|
33
|
+
export function parseTimeoutArg(raw) {
|
|
34
|
+
if (typeof raw === "number" && Number.isFinite(raw) && raw > 0)
|
|
35
|
+
return Math.trunc(raw);
|
|
36
|
+
if (typeof raw === "string") {
|
|
37
|
+
const n = Number(raw.trim());
|
|
38
|
+
if (Number.isFinite(n) && n > 0)
|
|
39
|
+
return Math.trunc(n);
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Decide the clamped timeout for one bash call.
|
|
45
|
+
* `probeMs`/`maxMs` of 0 disable that ceiling.
|
|
46
|
+
*/
|
|
47
|
+
export function resolveBashTimeout(opts) {
|
|
48
|
+
const t = opts.timeoutMs;
|
|
49
|
+
if (t === null)
|
|
50
|
+
return { changed: false, via: "none" };
|
|
51
|
+
const probe = opts.probeMs > 0 && classifyReadonlyCommand(opts.command, opts.readonlyAllowed).ok;
|
|
52
|
+
if (probe && t > opts.probeMs)
|
|
53
|
+
return { changed: true, via: "probe", from: t, to: opts.probeMs };
|
|
54
|
+
if (opts.maxMs > 0 && t > opts.maxMs)
|
|
55
|
+
return { changed: true, via: "max", from: t, to: opts.maxMs };
|
|
56
|
+
if (!probe && opts.maxMs === 0)
|
|
57
|
+
return { changed: false, via: "none" };
|
|
58
|
+
return { changed: false, via: "already-short" };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The hook fragment. Returns true when it mutated `args.timeout` — the
|
|
62
|
+
* caller may log that, and the trajectory keeps a count so a user asking
|
|
63
|
+
* "why did my probe get killed at 60 s?" has an answer.
|
|
64
|
+
*
|
|
65
|
+
* Everything here is defensive by contract: `output.args` is `any` on the
|
|
66
|
+
* host side, a non-bash tool must be untouched, and a malformed payload
|
|
67
|
+
* must never turn into a thrown error inside a permission-adjacent hook.
|
|
68
|
+
*/
|
|
69
|
+
export function createBashTimeoutHook(deps) {
|
|
70
|
+
return (input, output) => {
|
|
71
|
+
try {
|
|
72
|
+
const tool = String(input?.tool ?? "").trim().toLowerCase();
|
|
73
|
+
if (tool !== "bash")
|
|
74
|
+
return false;
|
|
75
|
+
const args = output?.args;
|
|
76
|
+
if (!args || typeof args !== "object")
|
|
77
|
+
return false;
|
|
78
|
+
const command = typeof args.command === "string" ? args.command : "";
|
|
79
|
+
if (!command)
|
|
80
|
+
return false;
|
|
81
|
+
const verdict = resolveBashTimeout({
|
|
82
|
+
command,
|
|
83
|
+
timeoutMs: parseTimeoutArg(args.timeout),
|
|
84
|
+
probeMs: deps.probeMs,
|
|
85
|
+
maxMs: deps.maxMs,
|
|
86
|
+
readonlyAllowed: deps.readonlyAllowed,
|
|
87
|
+
});
|
|
88
|
+
if (!verdict.changed)
|
|
89
|
+
return false;
|
|
90
|
+
args.timeout = verdict.to;
|
|
91
|
+
deps.onClamp?.({ via: verdict.via, from: verdict.from, to: verdict.to });
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
/* a timeout clamp must never break the call it is trying to speed up */
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=bash-timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-timeout.js","sourceRoot":"","sources":["../../src/tm/bash-timeout.ts"],"names":[],"mappings":"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"}
|
package/dist/tm/browser.d.ts
CHANGED
|
@@ -1,30 +1,65 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* tm_browser — governed interactive browser (Plan C: the user's own
|
|
3
|
-
* Chromium-family browser
|
|
3
|
+
* Chromium-family browser, headful by default on desktops).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
5
|
+
* T5 engine split (design board ② "TM_BROWSER_ENGINE" + R2 verdict):
|
|
6
|
+
* - PRIMARY engine: playwright-core — dynamic import ONLY (the package is
|
|
7
|
+
* declared in dependencies but NOT installed at build time; a static
|
|
8
|
+
* import would break tsc). A failed import or node < 20 degrades the
|
|
9
|
+
* session to the cdp-legacy engine automatically, per plugin instance.
|
|
10
|
+
* - cdp-legacy engine: the original hand-rolled CDP pipe transport
|
|
11
|
+
* (JSON + NUL framing over fds 3/4, zero deps — smoke-proven) kept
|
|
12
|
+
* verbatim as the fallback. On cdp-legacy only the core subset works
|
|
13
|
+
* (open/navigate/read/screenshot/close + navigate_page/take_screenshot/
|
|
14
|
+
* list_pages/evaluate_script aliases); the snapshot-first actions
|
|
15
|
+
* (take_snapshot + uid addressing, 16-verb chrome-devtools-mcp surface)
|
|
16
|
+
* require the playwright engine.
|
|
17
|
+
*
|
|
18
|
+
* Action surface aligns with chrome-devtools-mcp's 16 verbs (R2 mapping):
|
|
19
|
+
* navigate_page · take_snapshot · click · fill · hover · drag ·
|
|
20
|
+
* press_key · select_page · upload_file · wait_for · evaluate_script ·
|
|
21
|
+
* list_console_messages · list_network_requests · list_pages ·
|
|
22
|
+
* take_screenshot · handle_dialog
|
|
23
|
+
* plus the legacy compatibility verbs open / navigate / read /
|
|
24
|
+
* screenshot / close. Snapshot-first discipline: take_snapshot returns
|
|
25
|
+
* the ariaSnapshot YAML with an INJECTED [uid=eN] per node (playwright has
|
|
26
|
+
* no uid concept — SnapshotIndex below is our own snapshot→locator
|
|
27
|
+
* registry); follow-up actions address nodes by that uid (or an explicit
|
|
28
|
+
* selector escape hatch) instead of guessed locators.
|
|
29
|
+
*
|
|
30
|
+
* Hardening (unchanged from the CDP era, ported to both engines):
|
|
31
|
+
* - isolated temp profile (never the user's real browser profile);
|
|
32
|
+
* persistent login is ONLY via an explicit TM_BROWSER_USER_DATA_DIR;
|
|
33
|
+
* - domain allowlist enforced at the NETWORK layer on the NAVIGATION
|
|
34
|
+
* (playwright context.route / CDP Fetch interception), re-checked on
|
|
35
|
+
* every redirect hop; SUBRESOURCES then follow TM_BROWSER_SUBRESOURCE
|
|
36
|
+
* (default same-site: passive types load, an executable resource loads
|
|
37
|
+
* when it belongs to a site this session opened). Gating every request
|
|
38
|
+
* by the content allowlist is what made pages render picture-less — the
|
|
39
|
+
* 21 seeded hosts contain no CDN, so img/css/js died silently;
|
|
40
|
+
* - out-of-allowlist open/navigate routes through the OFFICIAL dialog
|
|
41
|
+
* BEFORE any spawn; approved hosts also pass the network layer;
|
|
42
|
+
* - hardened context: real-Chrome UA + zh-CN Accept-Language,
|
|
43
|
+
* no-first-run / no-extensions / mute launch flags, 3 s default action
|
|
44
|
+
* timeout (the prompt's "3000 ms budget" is the tool's default, not an
|
|
45
|
+
* aspiration), no networkidle waits anywhere;
|
|
46
|
+
* - dispose AWAITS the close, and an idle session reaps itself
|
|
47
|
+
* (TM_BROWSER_IDLE_MS) — an orphaned visible window is a user-facing bug.
|
|
15
48
|
*
|
|
16
49
|
* Environment adaptivity (different OpenCode hosts):
|
|
17
50
|
* - headful by default (Plan C); display-less Linux (no DISPLAY/
|
|
18
51
|
* WAYLAND_DISPLAY) automatically falls back to headless; TM_BROWSER_
|
|
19
52
|
* HEADLESS=1|0 forces either way;
|
|
20
|
-
* - browser discovery
|
|
21
|
-
* browser (Windows registry / Linux
|
|
22
|
-
* Chromium-family — CDP
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
53
|
+
* - browser discovery (SHARED by both engines): TM_BROWSER_PATH
|
|
54
|
+
* override, then the USER'S DEFAULT browser (Windows registry / Linux
|
|
55
|
+
* xdg-settings) when it is Chromium-family — CDP is Chromium-proprietary
|
|
56
|
+
* and playwright channels only speak Chromium too, so a Firefox default
|
|
57
|
+
* falls through — then per-OS candidate paths (Edge first on Windows;
|
|
58
|
+
* Chrome/Chromium elsewhere). No browser → structured error, the agent
|
|
59
|
+
* falls back to tm_webfetch / user MCP tools.
|
|
26
60
|
*
|
|
27
|
-
* Role access mirrors tm_webfetch: network roles (team + researcher) only
|
|
61
|
+
* Role access mirrors tm_webfetch: network roles (team + researcher) only,
|
|
62
|
+
* tester browser-only (UI verification).
|
|
28
63
|
*/
|
|
29
64
|
import type { ToolResult } from "../types.js";
|
|
30
65
|
import type { TmConfig } from "./config.js";
|
|
@@ -34,7 +69,9 @@ export type CommandRunner = (cmd: string, args: string[]) => string;
|
|
|
34
69
|
export declare function isChromiumFamily(exePath: string): boolean;
|
|
35
70
|
/** Parse `reg query "...UrlAssociations\http\UserChoice" /v ProgId` output. */
|
|
36
71
|
export declare function parseProgId(stdout: string): string | null;
|
|
37
|
-
/** Parse `reg query "...\shell\open\command" /ve` output → exe path.
|
|
72
|
+
/** Parse `reg query "...\shell\open\command" /ve` output → exe path.
|
|
73
|
+
* The quoted capture stops at the closing quote, so the `" -- %1"` style
|
|
74
|
+
* URL-template tail never leaks into the returned path. */
|
|
38
75
|
export declare function parseRegCommand(stdout: string): string | null;
|
|
39
76
|
/** Parse the Exec= line of an xdg .desktop file. */
|
|
40
77
|
export declare function parseDesktopExec(text: string): string | null;
|
|
@@ -42,6 +79,18 @@ export declare function parseDesktopExec(text: string): string | null;
|
|
|
42
79
|
* null → the caller falls back to the per-OS probe list (detection is
|
|
43
80
|
* best-effort and must never throw into tool discovery). */
|
|
44
81
|
export declare function defaultBrowserExecutable(env?: Record<string, string | undefined>, run?: CommandRunner): string | null;
|
|
82
|
+
/** Playwright's `channel` launch IGNORES the executable we discovered —
|
|
83
|
+
* `channel:"msedge"` resolves whatever playwright thinks the stable Edge is,
|
|
84
|
+
* so a correct Edge-Beta discovery still opened stable (the decisive half of
|
|
85
|
+
* the 2026-09-18 report). The channel spelling is therefore only correct
|
|
86
|
+
* for the exact stable-channel install dir; everything else (Beta/Dev/
|
|
87
|
+
* Canary, portable, an explicit TM_BROWSER_PATH) rides on executablePath. */
|
|
88
|
+
export declare function playwrightLaunchTarget(executable: string, opts?: {
|
|
89
|
+
explicitOverride?: boolean;
|
|
90
|
+
}): {
|
|
91
|
+
executablePath: string;
|
|
92
|
+
channel?: string;
|
|
93
|
+
};
|
|
45
94
|
/** Resolve the browser executable: TM_BROWSER_PATH override → the user's
|
|
46
95
|
* DEFAULT browser (Chromium-family only) → per-OS candidate paths.
|
|
47
96
|
* %LOCALAPPDATA% style vars are expanded on win32. */
|
|
@@ -54,15 +103,196 @@ export declare function findBrowserExecutable(env?: Record<string, string | unde
|
|
|
54
103
|
* display possible (Linux without DISPLAY/WAYLAND_DISPLAY).
|
|
55
104
|
*/
|
|
56
105
|
export declare function resolveHeadless(env?: Record<string, string | undefined>): boolean;
|
|
106
|
+
/** Approximate registrable site (eTLD+1) of a hostname. */
|
|
107
|
+
export declare function siteOf(host: string): string;
|
|
108
|
+
/** playwright and CDP spell resource types differently (`Image` vs `image`,
|
|
109
|
+
* `Stylesheet` vs `stylesheet`) — one normalizer keeps both engines on the
|
|
110
|
+
* same verdict table. */
|
|
111
|
+
export declare function normalizeResourceType(raw: unknown): string;
|
|
112
|
+
export declare function isPassiveResource(raw: unknown): boolean;
|
|
113
|
+
/**
|
|
114
|
+
* One subresource verdict, shared VERBATIM by both engines so playwright and
|
|
115
|
+
* cdp-legacy can never drift. `allowedSites` holds the registrable sites of
|
|
116
|
+
* every host this session actually navigated to (allowlist hit or dialog
|
|
117
|
+
* approval), which is what makes a page's own JS/CSS work without opening
|
|
118
|
+
* the whole internet: the governance boundary moves from "21 content domains"
|
|
119
|
+
* to "the site you approved", and an off-site SCRIPT still needs a dialog.
|
|
120
|
+
*/
|
|
121
|
+
export declare function subresourcePass(opts: {
|
|
122
|
+
url: string;
|
|
123
|
+
resourceType: unknown;
|
|
124
|
+
policy: "same-site" | "passive" | "off";
|
|
125
|
+
allowlistHit: boolean;
|
|
126
|
+
approvedHost: boolean;
|
|
127
|
+
allowedSites: ReadonlySet<string>;
|
|
128
|
+
}): {
|
|
129
|
+
pass: boolean;
|
|
130
|
+
via: string;
|
|
131
|
+
};
|
|
132
|
+
/** A navigation (or a host the dialog approved) widens the subresource
|
|
133
|
+
* footprint to its own site. Called for EVERY top-level/document request
|
|
134
|
+
* that passed the allowlist side. */
|
|
135
|
+
export declare function rememberSite(allowedSites: Set<string>, url: string): void;
|
|
136
|
+
export type BrowserEngineKind = "playwright" | "cdp-legacy";
|
|
137
|
+
/** playwright-core 1.63 targets node >= 20; on anything older we refuse the
|
|
138
|
+
* engine up-front and stay on the zero-dependency CDP pipe (the node>=18
|
|
139
|
+
* package floor keeps the plugin itself loadable — only the playwright
|
|
140
|
+
* PRIMARY is gated here, cdp-legacy carries node 18/19 hosts). */
|
|
141
|
+
export declare const PLAYWRIGHT_MIN_NODE_MAJOR = 20;
|
|
142
|
+
/** "v22.3.1" / "20" -> major number; unparseable -> 0 (fail toward the
|
|
143
|
+
* always-available cdp-legacy engine). */
|
|
144
|
+
export declare function nodeMajorOf(version: string): number;
|
|
145
|
+
export interface EngineSelection {
|
|
146
|
+
kind: BrowserEngineKind;
|
|
147
|
+
/** The imported playwright-core namespace (present iff kind=playwright). */
|
|
148
|
+
pw?: PwModule;
|
|
149
|
+
/** Why this kind was chosen (preference / node gate / import failure). */
|
|
150
|
+
reason?: string;
|
|
151
|
+
}
|
|
152
|
+
/** The REAL loader — a VARIABLE specifier so tsc never tries to resolve
|
|
153
|
+
* "playwright-core" at build time (types ship inside the package, which may
|
|
154
|
+
* be absent from node_modules). Under ESM, import(variable) yields the
|
|
155
|
+
* module namespace typed as any. */
|
|
156
|
+
export declare function defaultImportPlaywright(): Promise<unknown>;
|
|
157
|
+
/** Pure engine-selection seam (exported for test-browser.mjs):
|
|
158
|
+
* cdp-legacy preference → legacy WITHOUT ever importing; node < 20 →
|
|
159
|
+
* legacy without importing; playwright preference → import, verify the
|
|
160
|
+
* chromium.launch shape, degrade to legacy on ANY failure. */
|
|
161
|
+
export declare function selectBrowserEngine(opts: {
|
|
162
|
+
preference: string | undefined;
|
|
163
|
+
nodeMajor: number;
|
|
164
|
+
importPlaywright: () => Promise<unknown>;
|
|
165
|
+
}): Promise<EngineSelection>;
|
|
166
|
+
export interface PwModule {
|
|
167
|
+
chromium: {
|
|
168
|
+
launch(opts: Record<string, unknown>): Promise<PwBrowser>;
|
|
169
|
+
launchPersistentContext(userDataDir: string, opts: Record<string, unknown>): Promise<PwBrowserContext>;
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
export interface PwBrowser {
|
|
173
|
+
newContext(opts?: Record<string, unknown>): Promise<PwBrowserContext>;
|
|
174
|
+
close(): Promise<void>;
|
|
175
|
+
}
|
|
176
|
+
export interface PwBrowserContext {
|
|
177
|
+
route(pattern: string, handler: (route: PwRoute, request: PwRequestInfo) => Promise<void> | void): Promise<void> | void;
|
|
178
|
+
pages(): PwPage[];
|
|
179
|
+
newPage(): Promise<PwPage>;
|
|
180
|
+
close(): Promise<void>;
|
|
181
|
+
}
|
|
182
|
+
export interface PwPage {
|
|
183
|
+
goto(url: string, opts?: Record<string, unknown>): Promise<unknown>;
|
|
184
|
+
locator(selector: string): PwLocator;
|
|
185
|
+
getByRole(role: string, opts?: Record<string, unknown>): PwLocator;
|
|
186
|
+
getByText(text: string): PwLocator;
|
|
187
|
+
keyboard: {
|
|
188
|
+
press(key: string): Promise<unknown>;
|
|
189
|
+
};
|
|
190
|
+
evaluate(pageFunction: string): Promise<unknown>;
|
|
191
|
+
screenshot(opts?: Record<string, unknown>): Promise<Uint8Array>;
|
|
192
|
+
on(event: string, handler: (...args: any[]) => void): void;
|
|
193
|
+
url(): string;
|
|
194
|
+
title?(): Promise<string>;
|
|
195
|
+
bringToFront?(): Promise<void>;
|
|
196
|
+
}
|
|
197
|
+
export interface PwLocator {
|
|
198
|
+
ariaSnapshot(): Promise<string>;
|
|
199
|
+
click(): Promise<unknown>;
|
|
200
|
+
fill(value: string): Promise<unknown>;
|
|
201
|
+
hover(): Promise<unknown>;
|
|
202
|
+
pressKey(key: string): Promise<unknown>;
|
|
203
|
+
setInputFiles(files: string | string[]): Promise<unknown>;
|
|
204
|
+
waitFor(opts?: Record<string, unknown>): Promise<unknown>;
|
|
205
|
+
nth(index: number): PwLocator;
|
|
206
|
+
dragTo(target: PwLocator): Promise<unknown>;
|
|
207
|
+
}
|
|
208
|
+
export interface PwRoute {
|
|
209
|
+
continue(): Promise<unknown>;
|
|
210
|
+
abort(): Promise<unknown>;
|
|
211
|
+
}
|
|
212
|
+
export interface PwRequestInfo {
|
|
213
|
+
url(): string;
|
|
214
|
+
method?(): string;
|
|
215
|
+
/** playwright resource type ("document"|"script"|"image"|…). Optional on
|
|
216
|
+
* the seam so a stale mock cannot break the gate — an absent type is
|
|
217
|
+
* treated as EXECUTABLE (the strict side of the subresource policy). */
|
|
218
|
+
resourceType?(): string;
|
|
219
|
+
}
|
|
220
|
+
export interface PwConsoleMessage {
|
|
221
|
+
type(): string;
|
|
222
|
+
text(): string;
|
|
223
|
+
}
|
|
224
|
+
export interface PwResponseInfo {
|
|
225
|
+
url(): string;
|
|
226
|
+
status(): number;
|
|
227
|
+
request(): PwRequestInfo;
|
|
228
|
+
}
|
|
229
|
+
export interface PwDialog {
|
|
230
|
+
type(): string;
|
|
231
|
+
message(): string;
|
|
232
|
+
accept(promptText?: string): Promise<unknown>;
|
|
233
|
+
dismiss(): Promise<unknown>;
|
|
234
|
+
}
|
|
235
|
+
export interface SnapshotEntry {
|
|
236
|
+
role: string;
|
|
237
|
+
name?: string;
|
|
238
|
+
nth: number;
|
|
239
|
+
}
|
|
240
|
+
/** ariaSnapshot yields plain YAML with NO addressable id, while the
|
|
241
|
+
* chrome-devtools-mcp muscle memory this tool aligns to is uid-addressed.
|
|
242
|
+
* The missing layer is built here: each take_snapshot re-indexes every YAML
|
|
243
|
+
* node (`- <role> "<name>" …`), injects `[uid=eN]` inline, and remembers
|
|
244
|
+
* (role, name, nth-of-kind); later actions resolve uid →
|
|
245
|
+
* `page.getByRole(role, { name, exact: true }).nth(nth)`. Uids are
|
|
246
|
+
* renumbered on every snapshot (one action, one observation); an
|
|
247
|
+
* unknown/stale uid errors back to take_snapshot instead of falling back
|
|
248
|
+
* to guessed locators. */
|
|
249
|
+
export declare class SnapshotIndex {
|
|
250
|
+
private entries;
|
|
251
|
+
private next;
|
|
252
|
+
get size(): number;
|
|
253
|
+
/** Reset + parse + annotate the ariaSnapshot YAML in one pass. */
|
|
254
|
+
annotate(yaml: string): string;
|
|
255
|
+
get(uid: string): SnapshotEntry | undefined;
|
|
256
|
+
/** uid → playwright locator; null = unknown uid / role the engine cannot
|
|
257
|
+
* address (the caller renders the take_snapshot-first guidance). */
|
|
258
|
+
locatorFor(page: PwPage, uid: string): PwLocator | null;
|
|
259
|
+
}
|
|
260
|
+
/** ariaSnapshot escapes whitespace/quotes inside names (\s \n \t \" \\). */
|
|
261
|
+
export declare function unescapeAriaName(raw: string): string;
|
|
262
|
+
/** The 16 canonical verbs, named byte-identical to chrome-devtools-mcp. */
|
|
263
|
+
export declare const BROWSER_PLAYWRIGHT_ACTIONS: readonly ["navigate_page", "take_snapshot", "click", "fill", "hover", "drag", "press_key", "select_page", "upload_file", "wait_for", "evaluate_script", "list_console_messages", "list_network_requests", "list_pages", "take_screenshot", "handle_dialog"];
|
|
264
|
+
/** Legacy compat verbs that ride on top of the 16 (both engines). */
|
|
265
|
+
export declare const BROWSER_COMPAT_ACTIONS: readonly ["open", "navigate", "read", "screenshot", "close"];
|
|
266
|
+
/** What the cdp-legacy fallback can still do (R2: degradation must keep the
|
|
267
|
+
* §6o behavior; everything snapshot-shaped is playwright-only). */
|
|
268
|
+
export declare const BROWSER_LEGACY_ACTIONS: readonly ["open", "navigate", "navigate_page", "read", "screenshot", "take_screenshot", "list_pages", "evaluate_script", "close"];
|
|
57
269
|
export declare function buildTmBrowserTool(deps: {
|
|
58
270
|
pipelines: TmPipelines;
|
|
59
271
|
cfg: TmConfig;
|
|
60
272
|
env?: Record<string, string | undefined>;
|
|
61
273
|
args?: Record<string, unknown>;
|
|
274
|
+
/** Test seam: replace the dynamic playwright-core import. */
|
|
275
|
+
importPlaywright?: () => Promise<unknown>;
|
|
276
|
+
/** Test seam: pretend node major version for the engine gate. */
|
|
277
|
+
nodeMajor?: number;
|
|
278
|
+
/** Best-effort user notification (host toast) — used by the idle reaper,
|
|
279
|
+
* which closes a window the agent forgot and must say so out loud. */
|
|
280
|
+
notify?: (message: string) => void;
|
|
281
|
+
/** Test seam for the DISCOVERY result (not the TM_BROWSER_PATH override —
|
|
282
|
+
* the override is read from env so the channel-substitution rule stays
|
|
283
|
+
* honest in tests too). */
|
|
284
|
+
findExecutable?: (env: Record<string, string | undefined>) => string | null;
|
|
62
285
|
}): {
|
|
63
286
|
description: string;
|
|
64
287
|
args: Record<string, unknown>;
|
|
65
288
|
execute: (rawArgs: Record<string, unknown>, ctx: unknown) => Promise<ToolResult>;
|
|
66
|
-
|
|
289
|
+
/** Async on purpose: the host's `dispose` hook is `() => Promise<void>`,
|
|
290
|
+
* and a fire-and-forget close could exit before the browser child was
|
|
291
|
+
* killed (leaving a visible orphan window). */
|
|
292
|
+
dispose: () => Promise<void>;
|
|
293
|
+
engineInfo: () => {
|
|
294
|
+
kind: BrowserEngineKind | null;
|
|
295
|
+
reason: string | null;
|
|
296
|
+
};
|
|
67
297
|
};
|
|
68
298
|
//# sourceMappingURL=browser.d.ts.map
|
package/dist/tm/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/tm/browser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/tm/browser.ts"],"names":[],"mappings":"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"}
|