@te-river/opencode-team-mode 1.5.12 → 1.5.14
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 +30 -6
- package/README.zh-CN.md +28 -4
- package/dist/agents.d.ts +5 -1
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +24 -2
- package/dist/agents.js.map +1 -1
- package/dist/capabilities.d.ts +66 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +165 -0
- package/dist/capabilities.js.map +1 -0
- 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 +103 -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 +71 -8
- 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 +51 -2
- package/dist/prompts/shared.js.map +1 -1
- package/dist/prompts/specialists.d.ts +1 -1
- package/dist/prompts/specialists.d.ts.map +1 -1
- package/dist/prompts/specialists.js +38 -17
- package/dist/prompts/specialists.js.map +1 -1
- package/dist/tm/args-schema.d.ts +7 -1
- package/dist/tm/args-schema.d.ts.map +1 -1
- package/dist/tm/args-schema.js +9 -3
- 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 +91 -5
- package/dist/tm/browser.d.ts.map +1 -1
- package/dist/tm/browser.js +564 -89
- package/dist/tm/browser.js.map +1 -1
- package/dist/tm/cache.d.ts +68 -0
- package/dist/tm/cache.d.ts.map +1 -0
- package/dist/tm/cache.js +157 -0
- package/dist/tm/cache.js.map +1 -0
- package/dist/tm/config.d.ts +87 -0
- package/dist/tm/config.d.ts.map +1 -1
- package/dist/tm/config.js +66 -0
- package/dist/tm/config.js.map +1 -1
- package/dist/tm/dispatch.d.ts +123 -0
- package/dist/tm/dispatch.d.ts.map +1 -0
- package/dist/tm/dispatch.js +476 -0
- package/dist/tm/dispatch.js.map +1 -0
- package/dist/tm/dupe-guard.d.ts +58 -0
- package/dist/tm/dupe-guard.d.ts.map +1 -0
- package/dist/tm/dupe-guard.js +105 -0
- package/dist/tm/dupe-guard.js.map +1 -0
- package/dist/tm/index.d.ts +32 -4
- package/dist/tm/index.d.ts.map +1 -1
- package/dist/tm/index.js +58 -5
- package/dist/tm/index.js.map +1 -1
- package/dist/tm/perm-ask.d.ts +1 -0
- package/dist/tm/perm-ask.d.ts.map +1 -1
- package/dist/tm/perm-ask.js +15 -1
- package/dist/tm/perm-ask.js.map +1 -1
- package/dist/tm/pipelines.d.ts.map +1 -1
- package/dist/tm/pipelines.js +11 -0
- package/dist/tm/pipelines.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 +56 -7
- package/dist/tm/search.d.ts.map +1 -1
- package/dist/tm/search.js +195 -41
- package/dist/tm/search.js.map +1 -1
- package/dist/tm/stats.d.ts +117 -0
- package/dist/tm/stats.d.ts.map +1 -0
- package/dist/tm/stats.js +296 -0
- package/dist/tm/stats.js.map +1 -0
- package/dist/tm/webfetch.d.ts +23 -0
- package/dist/tm/webfetch.d.ts.map +1 -1
- package/dist/tm/webfetch.js +97 -8
- 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 +2 -2
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
export type BashTimeoutVerdict = {
|
|
29
|
+
changed: false;
|
|
30
|
+
via: "none" | "already-short";
|
|
31
|
+
} | {
|
|
32
|
+
changed: true;
|
|
33
|
+
via: "probe" | "max";
|
|
34
|
+
from: number;
|
|
35
|
+
to: number;
|
|
36
|
+
};
|
|
37
|
+
/** Parse the model-supplied timeout defensively: the host schema says a
|
|
38
|
+
* positive integer of MILLISECONDS, but an LLM hands us `"120000"`,
|
|
39
|
+
* `120000.0`, or omits it entirely. Anything unreadable means "no
|
|
40
|
+
* timeout was supplied" and is left alone. */
|
|
41
|
+
export declare function parseTimeoutArg(raw: unknown): number | null;
|
|
42
|
+
/**
|
|
43
|
+
* Decide the clamped timeout for one bash call.
|
|
44
|
+
* `probeMs`/`maxMs` of 0 disable that ceiling.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveBashTimeout(opts: {
|
|
47
|
+
command: string;
|
|
48
|
+
timeoutMs: number | null;
|
|
49
|
+
probeMs: number;
|
|
50
|
+
maxMs: number;
|
|
51
|
+
readonlyAllowed: readonly string[];
|
|
52
|
+
}): BashTimeoutVerdict;
|
|
53
|
+
/**
|
|
54
|
+
* The hook fragment. Returns true when it mutated `args.timeout` — the
|
|
55
|
+
* caller may log that, and the trajectory keeps a count so a user asking
|
|
56
|
+
* "why did my probe get killed at 60 s?" has an answer.
|
|
57
|
+
*
|
|
58
|
+
* Everything here is defensive by contract: `output.args` is `any` on the
|
|
59
|
+
* host side, a non-bash tool must be untouched, and a malformed payload
|
|
60
|
+
* must never turn into a thrown error inside a permission-adjacent hook.
|
|
61
|
+
*/
|
|
62
|
+
export declare function createBashTimeoutHook(deps: {
|
|
63
|
+
probeMs: number;
|
|
64
|
+
maxMs: number;
|
|
65
|
+
readonlyAllowed: readonly string[];
|
|
66
|
+
onClamp?: (info: {
|
|
67
|
+
via: string;
|
|
68
|
+
from: number;
|
|
69
|
+
to: number;
|
|
70
|
+
}) => void;
|
|
71
|
+
}): (input: unknown, output: unknown) => boolean;
|
|
72
|
+
//# sourceMappingURL=bash-timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-timeout.d.ts","sourceRoot":"","sources":["../../src/tm/bash-timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;CAAE,GACjD;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAErE;;;+CAG+C;AAC/C,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAO3D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC,GAAG,kBAAkB,CAQrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CACpE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAyB/C"}
|
|
@@ -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
|
@@ -30,16 +30,21 @@
|
|
|
30
30
|
* Hardening (unchanged from the CDP era, ported to both engines):
|
|
31
31
|
* - isolated temp profile (never the user's real browser profile);
|
|
32
32
|
* persistent login is ONLY via an explicit TM_BROWSER_USER_DATA_DIR;
|
|
33
|
-
* - domain allowlist enforced at the NETWORK layer
|
|
34
|
-
* context.route
|
|
35
|
-
*
|
|
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;
|
|
36
40
|
* - out-of-allowlist open/navigate routes through the OFFICIAL dialog
|
|
37
41
|
* BEFORE any spawn; approved hosts also pass the network layer;
|
|
38
42
|
* - hardened context: real-Chrome UA + zh-CN Accept-Language,
|
|
39
43
|
* no-first-run / no-extensions / mute launch flags, 3 s default action
|
|
40
44
|
* timeout (the prompt's "3000 ms budget" is the tool's default, not an
|
|
41
45
|
* aspiration), no networkidle waits anywhere;
|
|
42
|
-
* - dispose
|
|
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.
|
|
43
48
|
*
|
|
44
49
|
* Environment adaptivity (different OpenCode hosts):
|
|
45
50
|
* - headful by default (Plan C); display-less Linux (no DISPLAY/
|
|
@@ -74,6 +79,18 @@ export declare function parseDesktopExec(text: string): string | null;
|
|
|
74
79
|
* null → the caller falls back to the per-OS probe list (detection is
|
|
75
80
|
* best-effort and must never throw into tool discovery). */
|
|
76
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
|
+
};
|
|
77
94
|
/** Resolve the browser executable: TM_BROWSER_PATH override → the user's
|
|
78
95
|
* DEFAULT browser (Chromium-family only) → per-OS candidate paths.
|
|
79
96
|
* %LOCALAPPDATA% style vars are expanded on win32. */
|
|
@@ -86,6 +103,61 @@ export declare function findBrowserExecutable(env?: Record<string, string | unde
|
|
|
86
103
|
* display possible (Linux without DISPLAY/WAYLAND_DISPLAY).
|
|
87
104
|
*/
|
|
88
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
|
+
/** `evaluate_script` is the one browser verb the network gate cannot cover:
|
|
137
|
+
* the allowlist limits where we NAVIGATE, not what an already-loaded page
|
|
138
|
+
* hands back. In a `TM_BROWSER_USER_DATA_DIR` profile that page may be a
|
|
139
|
+
* signed-in session, and `document.cookie` / `localStorage` / a token in the
|
|
140
|
+
* DOM is one expression away — and its value would then ride into the model
|
|
141
|
+
* context, the run store and the trajectory. So: ask once per browser
|
|
142
|
+
* session (the OFFICIAL dialog), and name-anchor the result on the shapes
|
|
143
|
+
* that are secrets, not on "looks random" (which would blank legitimate
|
|
144
|
+
* JSON and teach the agent to distrust every read). */
|
|
145
|
+
export declare const EVAL_SECRET_SHAPES: ReadonlyArray<{
|
|
146
|
+
name: string;
|
|
147
|
+
re: RegExp;
|
|
148
|
+
}>;
|
|
149
|
+
/** Mask every known secret shape in an in-page result. Returns the masked
|
|
150
|
+
* text plus WHICH kinds were masked (counted, never the values). */
|
|
151
|
+
export declare function redactEvalResult(text: string): {
|
|
152
|
+
text: string;
|
|
153
|
+
masked: string[];
|
|
154
|
+
};
|
|
155
|
+
/** Consent is per BROWSER SESSION, not per call: one dialog when the lead
|
|
156
|
+
* decides to script the page, then the round stops paying for it. */
|
|
157
|
+
export declare function needsEvalConsent(policy: "on" | "off", alreadyApproved: boolean | undefined): boolean;
|
|
158
|
+
/** Host only — the consent line in the dialog and in the trajectory never
|
|
159
|
+
* carries a query string (a search URL can hold the very token we guard). */
|
|
160
|
+
export declare function hostOnly(url: string): string;
|
|
89
161
|
export type BrowserEngineKind = "playwright" | "cdp-legacy";
|
|
90
162
|
/** playwright-core 1.63 targets node >= 20; on anything older we refuse the
|
|
91
163
|
* engine up-front and stay on the zero-dependency CDP pipe (the node>=18
|
|
@@ -165,6 +237,10 @@ export interface PwRoute {
|
|
|
165
237
|
export interface PwRequestInfo {
|
|
166
238
|
url(): string;
|
|
167
239
|
method?(): string;
|
|
240
|
+
/** playwright resource type ("document"|"script"|"image"|…). Optional on
|
|
241
|
+
* the seam so a stale mock cannot break the gate — an absent type is
|
|
242
|
+
* treated as EXECUTABLE (the strict side of the subresource policy). */
|
|
243
|
+
resourceType?(): string;
|
|
168
244
|
}
|
|
169
245
|
export interface PwConsoleMessage {
|
|
170
246
|
type(): string;
|
|
@@ -224,11 +300,21 @@ export declare function buildTmBrowserTool(deps: {
|
|
|
224
300
|
importPlaywright?: () => Promise<unknown>;
|
|
225
301
|
/** Test seam: pretend node major version for the engine gate. */
|
|
226
302
|
nodeMajor?: number;
|
|
303
|
+
/** Best-effort user notification (host toast) — used by the idle reaper,
|
|
304
|
+
* which closes a window the agent forgot and must say so out loud. */
|
|
305
|
+
notify?: (message: string) => void;
|
|
306
|
+
/** Test seam for the DISCOVERY result (not the TM_BROWSER_PATH override —
|
|
307
|
+
* the override is read from env so the channel-substitution rule stays
|
|
308
|
+
* honest in tests too). */
|
|
309
|
+
findExecutable?: (env: Record<string, string | undefined>) => string | null;
|
|
227
310
|
}): {
|
|
228
311
|
description: string;
|
|
229
312
|
args: Record<string, unknown>;
|
|
230
313
|
execute: (rawArgs: Record<string, unknown>, ctx: unknown) => Promise<ToolResult>;
|
|
231
|
-
|
|
314
|
+
/** Async on purpose: the host's `dispose` hook is `() => Promise<void>`,
|
|
315
|
+
* and a fire-and-forget close could exit before the browser child was
|
|
316
|
+
* killed (leaving a visible orphan window). */
|
|
317
|
+
dispose: () => Promise<void>;
|
|
232
318
|
engineInfo: () => {
|
|
233
319
|
kind: BrowserEngineKind | null;
|
|
234
320
|
reason: string | null;
|
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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"}
|