@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.
Files changed (112) hide show
  1. package/README.md +154 -57
  2. package/README.zh-CN.md +126 -47
  3. package/dist/agents.d.ts +5 -1
  4. package/dist/agents.d.ts.map +1 -1
  5. package/dist/agents.js +37 -11
  6. package/dist/agents.js.map +1 -1
  7. package/dist/approval-gate.d.ts +54 -16
  8. package/dist/approval-gate.d.ts.map +1 -1
  9. package/dist/approval-gate.js +163 -42
  10. package/dist/approval-gate.js.map +1 -1
  11. package/dist/host-hooks.d.ts +115 -0
  12. package/dist/host-hooks.d.ts.map +1 -0
  13. package/dist/host-hooks.js +270 -0
  14. package/dist/host-hooks.js.map +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +68 -4
  17. package/dist/index.js.map +1 -1
  18. package/dist/prompts/lead.d.ts +1 -1
  19. package/dist/prompts/lead.d.ts.map +1 -1
  20. package/dist/prompts/lead.js +88 -6
  21. package/dist/prompts/lead.js.map +1 -1
  22. package/dist/prompts/shared.d.ts +1 -1
  23. package/dist/prompts/shared.d.ts.map +1 -1
  24. package/dist/prompts/shared.js +203 -119
  25. package/dist/prompts/shared.js.map +1 -1
  26. package/dist/prompts/specialists.d.ts +2 -2
  27. package/dist/prompts/specialists.d.ts.map +1 -1
  28. package/dist/prompts/specialists.js +73 -23
  29. package/dist/prompts/specialists.js.map +1 -1
  30. package/dist/tm/args-schema.d.ts +31 -1
  31. package/dist/tm/args-schema.d.ts.map +1 -1
  32. package/dist/tm/args-schema.js +155 -39
  33. package/dist/tm/args-schema.js.map +1 -1
  34. package/dist/tm/bash-timeout.d.ts +72 -0
  35. package/dist/tm/bash-timeout.d.ts.map +1 -0
  36. package/dist/tm/bash-timeout.js +100 -0
  37. package/dist/tm/bash-timeout.js.map +1 -0
  38. package/dist/tm/browser.d.ts +250 -20
  39. package/dist/tm/browser.d.ts.map +1 -1
  40. package/dist/tm/browser.js +1200 -143
  41. package/dist/tm/browser.js.map +1 -1
  42. package/dist/tm/config.d.ts +129 -0
  43. package/dist/tm/config.d.ts.map +1 -1
  44. package/dist/tm/config.js +117 -1
  45. package/dist/tm/config.js.map +1 -1
  46. package/dist/tm/dispatch.d.ts +95 -0
  47. package/dist/tm/dispatch.d.ts.map +1 -0
  48. package/dist/tm/dispatch.js +369 -0
  49. package/dist/tm/dispatch.js.map +1 -0
  50. package/dist/tm/index.d.ts +32 -7
  51. package/dist/tm/index.d.ts.map +1 -1
  52. package/dist/tm/index.js +74 -5
  53. package/dist/tm/index.js.map +1 -1
  54. package/dist/tm/memory.d.ts +88 -10
  55. package/dist/tm/memory.d.ts.map +1 -1
  56. package/dist/tm/memory.js +881 -99
  57. package/dist/tm/memory.js.map +1 -1
  58. package/dist/tm/pipelines.d.ts +26 -3
  59. package/dist/tm/pipelines.d.ts.map +1 -1
  60. package/dist/tm/pipelines.js +167 -11
  61. package/dist/tm/pipelines.js.map +1 -1
  62. package/dist/tm/ptc/budgets.d.ts +22 -1
  63. package/dist/tm/ptc/budgets.d.ts.map +1 -1
  64. package/dist/tm/ptc/budgets.js +87 -8
  65. package/dist/tm/ptc/budgets.js.map +1 -1
  66. package/dist/tm/ptc/contract.d.ts +49 -9
  67. package/dist/tm/ptc/contract.d.ts.map +1 -1
  68. package/dist/tm/ptc/contract.js +41 -3
  69. package/dist/tm/ptc/contract.js.map +1 -1
  70. package/dist/tm/ptc/driver.d.ts +5 -2
  71. package/dist/tm/ptc/driver.d.ts.map +1 -1
  72. package/dist/tm/ptc/driver.js +47 -15
  73. package/dist/tm/ptc/driver.js.map +1 -1
  74. package/dist/tm/ptc/engines.d.ts +15 -4
  75. package/dist/tm/ptc/engines.d.ts.map +1 -1
  76. package/dist/tm/ptc/engines.js +281 -28
  77. package/dist/tm/ptc/engines.js.map +1 -1
  78. package/dist/tm/ptc/index.d.ts +4 -4
  79. package/dist/tm/ptc/index.d.ts.map +1 -1
  80. package/dist/tm/ptc/index.js +2 -2
  81. package/dist/tm/ptc/index.js.map +1 -1
  82. package/dist/tm/ptc/pscan.d.ts +20 -1
  83. package/dist/tm/ptc/pscan.d.ts.map +1 -1
  84. package/dist/tm/ptc/pscan.js +328 -14
  85. package/dist/tm/ptc/pscan.js.map +1 -1
  86. package/dist/tm/ptc/summary.d.ts.map +1 -1
  87. package/dist/tm/ptc/summary.js +23 -1
  88. package/dist/tm/ptc/summary.js.map +1 -1
  89. package/dist/tm/ptc/tool.d.ts +34 -3
  90. package/dist/tm/ptc/tool.d.ts.map +1 -1
  91. package/dist/tm/ptc/tool.js +117 -20
  92. package/dist/tm/ptc/tool.js.map +1 -1
  93. package/dist/tm/pty.d.ts +70 -0
  94. package/dist/tm/pty.d.ts.map +1 -0
  95. package/dist/tm/pty.js +242 -0
  96. package/dist/tm/pty.js.map +1 -0
  97. package/dist/tm/search.d.ts +128 -15
  98. package/dist/tm/search.d.ts.map +1 -1
  99. package/dist/tm/search.js +556 -47
  100. package/dist/tm/search.js.map +1 -1
  101. package/dist/tm/shell-bridge.d.ts +14 -1
  102. package/dist/tm/shell-bridge.d.ts.map +1 -1
  103. package/dist/tm/shell-bridge.js +57 -10
  104. package/dist/tm/shell-bridge.js.map +1 -1
  105. package/dist/tm/webfetch.d.ts +29 -7
  106. package/dist/tm/webfetch.d.ts.map +1 -1
  107. package/dist/tm/webfetch.js +117 -15
  108. package/dist/tm/webfetch.js.map +1 -1
  109. package/dist/types.d.ts +16 -0
  110. package/dist/types.d.ts.map +1 -1
  111. package/docs/installation.md +216 -17
  112. package/package.json +5 -2
@@ -132,13 +132,29 @@ the repo), you may use that tooling as designed.
132
132
 
133
133
  ## UI verification (tm_browser — you carry it)
134
134
  For user-visible frontend changes, verify through the governed tm_browser
135
- instead of improvising: open → navigate → read (page text) → screenshot →
136
- close. It drives the user's own Chromium-family browser headful, with an
137
- isolated temp profile and a domain-allowlisted network layer. Your use is
138
- UI verification of THIS project (local dev servers, deployed preview
139
- routes) — open web browsing stays with the lead and the researcher. If
140
- tm_browser is unavailable on this host, or the route needs credentials you
141
- were not given, end your report with:
135
+ — snapshot-first, never screenshot-guessing:
136
+ 1. \`open { url }\` once, \`navigate_page\` for follow-ups; take_snapshot
137
+ FIRST and act ONLY on the [uid=…] tokens it returned — guessed
138
+ selectors or guessed text are BANNED (the \`selector\` escape hatch is
139
+ only for a node the snapshot cannot express).
140
+ 2. One action, one observation: after click/fill/press_key, take_snapshot
141
+ (or read) again BEFORE concluding; never stack blind actions.
142
+ 3. Popups, dialogs and new tabs fold into the SAME observation round —
143
+ handle_dialog / select_page plus one take_snapshot, not one round each.
144
+ 4. Waits: \`wait_for { text }\` inside a 3000 ms budget (the engine
145
+ default); never networkidle, never sleep-then-pray.
146
+ 5. take_screenshot ONLY for what a snapshot cannot show (layout, color,
147
+ canvas); the aria snapshot / page text is your primary observation.
148
+ 6. Finish with \`close\`. The tool drives the user's own Chromium-family
149
+ browser headful (playwright engine primary, degraded CDP pipe when
150
+ playwright-core is absent; display-less hosts run headless
151
+ automatically), on an isolated temp profile with a domain-allowlisted
152
+ network layer. Your use is UI verification of THIS project (local dev
153
+ servers, deployed preview routes) — open web browsing stays with the
154
+ lead and the researcher.
155
+ If tm_browser is unavailable on this host, the action you need is not
156
+ offered by the degraded engine, or the route needs credentials you were
157
+ not given, end your report with:
142
158
  \`UI NOT VERIFIED: <what still needs manual checking>\`
143
159
  so the lead can relay it honestly to the user. Pretending otherwise is
144
160
  worse than admitting the gap.
@@ -194,18 +210,41 @@ by the team — flag prominently if that is the case.
194
210
  ## Web lookups (two channels)
195
211
  You are one of the two network roles (the other is the team lead).
196
212
  1. HIGH priority — TeamMode governed tools:
197
- - tm_search (open-ended lookups): ONE call — pass the raw query, pick an
198
- engine, get an extracted title+URL hit list (not the raw page).
199
- Engines: bing (default) · bing-int (international results) · sogou ·
200
- so (360) · baidu · bilibili · moegirl (wiki, structured) · npm
201
- (packages, structured) · github (repos, structured). On an empty
202
- result switch engines — the error names the alternatives.
213
+ - tm_search (open-ended lookups): pass the RAW query with
214
+ engine:"auto" (the default) — it classifies the query, fans the
215
+ matching engines out IN PARALLEL, dedupes and fuses them into one
216
+ ranked hit list, so a hit two engines agree on outranks one
217
+ engine's confident junk. Engines behind auto: bing (the only live
218
+ CN HTML SERP) · stackoverflow · hn · github · npm · moegirl ·
219
+ bilibili; name one explicitly only for a second opinion.
220
+ ONE SEARCH IS A SAMPLE, NOT A SEARCH: if the list does not answer
221
+ the question, re-query 2-3 times with a narrowed or translated
222
+ phrasing (a Chinese concept often has better material under its
223
+ English term, and vice versa) BEFORE concluding "not found", and
224
+ record what each query was for in EVIDENCE. An empty result names
225
+ the alternative engines — switch, never retry the same one.
203
226
  - tm_webfetch (known URL): one governed GET of an allowlisted page;
204
- search-engine result pages it fetches are auto-extracted to hit lists.
205
- - tm_browser (interactive): open → navigate → read (page text) →
206
- screenshot → close. A visible browser window opens on desktops;
207
- display-less hosts run headless automatically. Isolated temp
208
- profile; per-request domain allowlist enforced at the network layer.
227
+ search-engine result pages it fetches are auto-extracted to hit
228
+ lists. A hit tagged (域名不在白名单,需批准)needs the approval
229
+ dialog before it can be read — prefer a hit you can fetch, or
230
+ tm_browser it.
231
+ - tm_browser (interactive): snapshot-first automation — open →
232
+ take_snapshot → act ONLY on the [uid=eN] tokens → observe again.
233
+ 16 playwright verbs (navigate_page, take_snapshot, click, fill,
234
+ hover, drag, press_key, select_page, upload_file, wait_for,
235
+ evaluate_script, list_console_messages, list_network_requests,
236
+ list_pages, take_screenshot, handle_dialog) plus compat verbs open
237
+ / navigate / read (page text) / screenshot / close. On a desktop
238
+ this opens a VISIBLE window of the user's OWN browser channel (an
239
+ Edge Beta default opens Edge Beta); headless only when the operator
240
+ sets TM_BROWSER_HEADLESS — there is no headless parameter for you
241
+ to pass. When a snapshot ends with "N 个子资源请求被拦截" the
242
+ governance gate trimmed the page: that is NOT "the site has no
243
+ images" — report the blocked hosts in FINDINGS instead. When your
244
+ UI work is done, action:"close" and quote the tool's own line
245
+ (已确认关闭 vs 警告:关闭未完全成功) — never tell the user a window
246
+ is gone because you asked for it to close. Isolated temp profile;
247
+ navigation is domain-allowlisted at the network layer.
209
248
  2. FALLBACK — user-configured MCP/plugin tools (browser automation, web
210
249
  search, page fetchers) for what tm_search / tm_browser / tm_webfetch
211
250
  cannot do.
@@ -213,17 +252,19 @@ You are one of the two network roles (the other is the team lead).
213
252
  TM_WEBFETCH_ALLOWED_DOMAINS):
214
253
  - wiki term: https://mobile.moegirl.org.cn/TERM
215
254
  - bilibili: https://search.bilibili.com/all?keyword=QUERY
216
- - bing: https://cn.bing.com/search?q=QUERY (append &ensearch=1
217
- for international results)
218
- - baidu: https://www.baidu.com/s?wd=QUERY
219
- - sogou: https://www.sogou.com/web?query=QUERY
220
- - 360: https://www.so.com/s?q=QUERY
255
+ - bing: https://cn.bing.com/search?q=QUERY
256
+ - SO question: https://api.stackexchange.com/2.3/search/advanced?order=desc&sort=relevance&q=QUERY&site=stackoverflow
257
+ - HN story: https://hn.algolia.com/api/v1/search?query=QUERY&tags=story
221
258
  - npm pkg: https://registry.npmjs.org/<pkg>/latest
222
259
  - npm search: https://registry.npmjs.org/-/v1/search?text=QUERY
223
260
  - gh repos: https://api.github.com/search/repositories?q=QUERY
224
261
  - gh raw: https://raw.githubusercontent.com/<owner>/<repo>/<branch>/<path>
225
262
  - gh mirror: https://ghproxy.net/https://raw.githubusercontent.com/...
226
263
  (use when raw.githubusercontent.com is unreachable)
264
+ sogou / so(360) / baidu / international bing are DEAD ENDS from a CN
265
+ host (a live benchmark showed anti-bot shells and 100% empty pages) —
266
+ never build a search URL there, even though their domains stay on the
267
+ fetch allowlist.
227
268
  URL-encode the query (CJK terms too). Expand colloquial, abbreviated,
228
269
  or aliased terms to canonical forms and fetch BOTH spellings before
229
270
  concluding "not found".
@@ -231,6 +272,15 @@ Oversized pages come back as a handle — page with tm_fetch (try
231
272
  mode:"structure" first). Never fabricate page content — an unfetchable
232
273
  claim stays unfetched and is reported as a gap.
233
274
 
275
+ ## Recon batching (PTC-first)
276
+ Local-repo recon is PTC-first: multi-file reading, bulk grep+read
277
+ aggregation, cross-referencing searches → ONE tm_ptc_run program
278
+ (tm.read / tm.grep / tm.bash ride inside; ALWAYS \`return\` the
279
+ aggregated findings). Firing single lookups one at a time for one
280
+ question wastes the team's time and tokens. The same rule covers
281
+ independent web calls: two unrelated tm_search queries belong in one
282
+ round (or one PTC program), never in two.
283
+
234
284
  ## Behavioral constraints
235
285
  - When analyzing dependencies, output call-graph diagrams in mermaid format.
236
286
  - When the code under study involves authentication/authorization, tag each
@@ -1 +1 @@
1
- {"version":3,"file":"specialists.js","sourceRoot":"","sources":["../../src/prompts/specialists.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B/B,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBjC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C9B,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2D5B,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6EhC,CAAA"}
1
+ {"version":3,"file":"specialists.js","sourceRoot":"","sources":["../../src/prompts/specialists.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B/B,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBjC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C9B,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2E5B,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+GhC,CAAA"}
@@ -27,8 +27,20 @@ export declare function buildWebfetchArgsSchema(): Promise<Record<string, unknow
27
27
  * tm_search args — same ZodRawShape treatment (BUG#3 class); descriptor
28
28
  * fallback when zod is absent. tm/index awaits this and passes the result
29
29
  * into buildTmSearchTool as `deps.args`.
30
+ *
31
+ * Wave B M1 — the engine list is DERIVED from search.ts's live
32
+ * `SEARCH_ENGINE_NAMES` + `AUTO_ENGINE_KEY`, never hand-written: a static
33
+ * copy here once drifted to a dead roster (bing-int/sogou/so/baidu kept,
34
+ * stackoverflow/hn/auto missing, default lied "bing"). Because
35
+ * buildTmSearchTool uses `deps.args ?? fallback`, this schema IS the
36
+ * model-visible surface in production (the search.ts fallback never fires),
37
+ * so it must not go stale. `defaultEngine` falls back to
38
+ * resolveTmConfig().searchDefaultEngine so the descriptor states the real
39
+ * default (auto) — callers may pass cfg.searchDefaultEngine explicitly.
40
+ * The §6m-s anti-drift test asserts the descriptor names every
41
+ * SEARCH_ENGINE_NAMES entry and none of the removed engines.
30
42
  */
31
- export declare function buildSearchArgsSchema(): Promise<Record<string, unknown>>;
43
+ export declare function buildSearchArgsSchema(defaultEngine?: string): Promise<Record<string, unknown>>;
32
44
  /**
33
45
  * tm_memory args — same ZodRawShape treatment (BUG#3 class); descriptor
34
46
  * fallback when zod is absent.
@@ -37,6 +49,24 @@ export declare function buildMemoryArgsSchema(): Promise<Record<string, unknown>
37
49
  /**
38
50
  * tm_browser args — same ZodRawShape treatment (BUG#3 class); descriptor
39
51
  * fallback when zod is absent.
52
+ *
53
+ * STRIP BEHAVIOR / WHY EVERY FIELD IS DECLARED: this is a RAW shape, never
54
+ * wrapped in z.object() (BUG#3), so no zod-level .strip()/.passthrough()
55
+ * applies and execute() reads rawArgs verbatim. But the host serializes
56
+ * exactly these keys into the LLM parameter spec — an undeclared field is
57
+ * invisible to the model and never reaches browser.ts, i.e. the shape is a
58
+ * CLOSED param surface in effect. T5's 16 playwright verbs
59
+ * (BROWSER_PLAYWRIGHT_ACTIONS, browser.ts:505) + the 5 compat verbs consume
60
+ * 19 fields across execute/act (args.uid/selector/targetUid/targetSelector/
61
+ * text/key/function/expression/filePath/files/index/timeoutMs/dialogAction/
62
+ * promptText/clear/fullPage/image, browser.ts act() + execute()) — every one
63
+ * is declared below, or the corresponding verb silently loses its input.
64
+ *
65
+ * `headless` is DELIBERATELY not declared (2026-09-18): it used to be a model
66
+ * arg, `Boolean("false")` read as true, and one such call pinned the whole
67
+ * host process to a headless browser that every anti-bot gate then rejected.
68
+ * Mode is an operator setting (TM_BROWSER_HEADLESS) — a closed surface here
69
+ * is the fix, not a validation layer.
40
70
  */
41
71
  export declare function buildBrowserArgsSchema(): Promise<Record<string, unknown>>;
42
72
  //# sourceMappingURL=args-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"args-schema.d.ts","sourceRoot":"","sources":["../../src/tm/args-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkCH,iBAAe,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CA2ElF;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAE3B;;;;;GAKG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+B3E;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiBhF;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoB9E;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA2B9E;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkB/E"}
1
+ {"version":3,"file":"args-schema.d.ts","sourceRoot":"","sources":["../../src/tm/args-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoCH,iBAAe,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAuFlF;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAE3B;;;;;GAKG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA2D3E;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6BhF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA2BlC;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+C9E;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiE/E"}
@@ -8,6 +8,7 @@
8
8
  * ...}}` garbage args in real sessions (the model wrapped its args 3/3
9
9
  * times), even though flat args reached execute fine.
10
10
  */
11
+ import { resolveTmConfig } from "./config.js";
11
12
  /**
12
13
  * Load zod when the host environment provides it (opencode ships it as a
13
14
  * peer); fall back to plain arg descriptors so the plugin never hard-depends
@@ -41,7 +42,7 @@ async function buildArgsSchemas() {
41
42
  tm_read: describe(null, null, "path: string (required)"),
42
43
  tm_grep: describe(null, null, "pattern: string (required), path: string (optional)"),
43
44
  tm_bash: describe(null, null, "command: string (required, read-only allowlisted)"),
44
- tm_fetch: describe(null, null, "ref: string (required), access_token: string, offset: int, limit: int, mode: lines|structure"),
45
+ tm_fetch: describe(null, null, "ref: string (required), access_token: string, offset: int, limit: int, mode: lines|structure, fields: dot-path (json handle projection)"),
45
46
  };
46
47
  }
47
48
  const zz = z;
@@ -54,10 +55,13 @@ async function buildArgsSchemas() {
54
55
  },
55
56
  tm_grep: {
56
57
  pattern: zz.string().describe("Regex to search (ripgrep syntax)."),
58
+ // describe-LAST on every optional chain — zod v4 drops a description
59
+ // applied before .optional() when the shape is serialized (see
60
+ // buildMemoryArgsSchema); a required field's describe stays first.
57
61
  path: zz
58
62
  .string()
59
- .describe("Optional directory scope, relative to the project root.")
60
- .optional(),
63
+ .optional()
64
+ .describe("Optional directory scope, relative to the project root."),
61
65
  },
62
66
  tm_bash: {
63
67
  command: zz
@@ -70,24 +74,28 @@ async function buildArgsSchemas() {
70
74
  .describe("Offload handle ref: tm://runs/{run_id}/steps/{step_id}/result"),
71
75
  access_token: zz
72
76
  .string()
73
- .describe("HMAC token from the offload handle (may also ride the ref fragment).")
74
- .optional(),
77
+ .optional()
78
+ .describe("HMAC token from the offload handle (may also ride the ref fragment)."),
75
79
  offset: zz
76
80
  .number()
77
81
  .int()
78
82
  .min(0)
79
- .describe("0-based line offset of the first line to return.")
80
- .optional(),
83
+ .optional()
84
+ .describe("0-based line offset of the first line to return."),
81
85
  limit: zz
82
86
  .number()
83
87
  .int()
84
88
  .min(1)
85
- .describe("Max lines per fetch, capped at TM_FETCH_MAX_LINES (default 2000).")
86
- .optional(),
89
+ .optional()
90
+ .describe("Max lines per fetch, capped at TM_FETCH_MAX_LINES (default 2000)."),
87
91
  mode: zz
88
92
  .enum(["lines", "structure"])
89
- .describe("structure = ~100-token TOC / key tree / error-line map; try it first.")
90
- .optional(),
93
+ .optional()
94
+ .describe("structure = ~100-token TOC / key tree / error-line map; try it first."),
95
+ fields: zz
96
+ .string()
97
+ .optional()
98
+ .describe("Dot-path projection over a JSON handle (T4): e.g. items[].name or user.email; returns ONLY the matched values. Ignored on a non-JSON handle."),
91
99
  },
92
100
  };
93
101
  }
@@ -104,7 +112,7 @@ export async function buildPtcArgsSchema() {
104
112
  return {
105
113
  program: { descriptor: "program: string (required, async fn body, ≤TM_PTC_MAX_PROGRAM_CHARS)" },
106
114
  label: { descriptor: "label: string (optional, ≤80 chars)" },
107
- budgets: { descriptor: "budgets: { max_calls?, max_errors?, timeout_ms? } (optional, tighten-only)" },
115
+ budgets: { descriptor: "budgets: { max_calls?, max_errors?, timeout_ms? } (optional, tighten-only; any other key is rejected)" },
108
116
  };
109
117
  }
110
118
  const zz = z;
@@ -112,11 +120,25 @@ export async function buildPtcArgsSchema() {
112
120
  program: zz
113
121
  .string()
114
122
  .describe("Async function body. Available: tm.read(args), tm.grep(args), tm.bash(args), tm.fetch(args) — each returns {ok:true, data} or {ok:false, error:{tool,phase,line?,message}}. `return` a value for the aggregation summary."),
115
- label: zz.string().describe("Optional run label (≤80 chars).").optional(),
123
+ // Wave B Minor③: zod v4 DROPS a description set before .optional() when
124
+ // the shape is serialized, so every optional chain here is describe-LAST
125
+ // (matches buildMemoryArgsSchema / buildBrowserArgsSchema).
126
+ label: zz.string().optional().describe("Optional run label (≤80 chars)."),
127
+ // Fix batch T1: an EXPLICIT zod object — z.any() let host-side arg
128
+ // handling mangle the budgets value so parsePtcArgs never saw it and
129
+ // the caller's budgets silently fell back to the defaults.
130
+ // Wave B Minor②: .strict() rejects unknown budget keys (a typo like
131
+ // max_call silently read as an omitted default before — now it fails
132
+ // loudly). parsePtcArgs enforces the same at the runtime layer.
116
133
  budgets: zz
117
- .any()
118
- .describe("Optional budgets object { max_calls?, max_errors?, timeout_ms? } — tighten-only, clamped to the TM_PTC_* ceilings.")
119
- .optional(),
134
+ .object({
135
+ max_calls: zz.number().int().min(1).optional().describe("Max bridged tm_* calls (tighten-only)."),
136
+ max_errors: zz.number().int().min(1).optional().describe("Max failed bridged calls (tighten-only)."),
137
+ timeout_ms: zz.number().int().min(1).optional().describe("Wall-clock budget in ms (floor 5000, tighten-only)."),
138
+ })
139
+ .strict()
140
+ .optional()
141
+ .describe("Optional budgets object { max_calls?, max_errors?, timeout_ms? } — tighten-only, clamped to the TM_PTC_* ceilings. Unknown keys are rejected."),
120
142
  };
121
143
  }
122
144
  /**
@@ -129,35 +151,58 @@ export async function buildWebfetchArgsSchema() {
129
151
  if (!z) {
130
152
  return {
131
153
  url: { descriptor: "url: string (required, absolute https URL on an allowlisted host, query URL-encoded)" },
154
+ fields: { descriptor: "fields: string (optional, dot-path projection over a JSON response, e.g. items[].name; ignored on non-JSON)" },
132
155
  };
133
156
  }
157
+ // describe-LAST on the optional `fields` chain (zod v4 drops a
158
+ // description set before .optional(); see buildMemoryArgsSchema).
134
159
  const zz = z;
135
160
  return {
136
161
  url: zz
137
162
  .string()
138
- .describe("Absolute https URL on an allowlisted host (seeded: mobile.moegirl.org.cn, search.bilibili.com, cn.bing.com, www.baidu.com, www.sogou.com, www.so.com, registry.npmjs.org, api.github.com). URL-encode the query (CJK terms too)."),
163
+ .describe("Absolute https URL on an allowlisted host (seeded: mobile.moegirl.org.cn, search.bilibili.com, cn.bing.com, www.baidu.com, www.sogou.com, www.so.com, registry.npmjs.org, api.github.com, api.stackexchange.com, hn.algolia.com). URL-encode the query (CJK terms too)."),
164
+ fields: zz
165
+ .string()
166
+ .optional()
167
+ .describe("Dot-path projection over a JSON response body (Wave B M2): e.g. items[].name or user.email — returns ONLY the matched values, mirroring tm_fetch's `fields`. Ignored when the response is not JSON."),
139
168
  };
140
169
  }
141
170
  /**
142
171
  * tm_search args — same ZodRawShape treatment (BUG#3 class); descriptor
143
172
  * fallback when zod is absent. tm/index awaits this and passes the result
144
173
  * into buildTmSearchTool as `deps.args`.
174
+ *
175
+ * Wave B M1 — the engine list is DERIVED from search.ts's live
176
+ * `SEARCH_ENGINE_NAMES` + `AUTO_ENGINE_KEY`, never hand-written: a static
177
+ * copy here once drifted to a dead roster (bing-int/sogou/so/baidu kept,
178
+ * stackoverflow/hn/auto missing, default lied "bing"). Because
179
+ * buildTmSearchTool uses `deps.args ?? fallback`, this schema IS the
180
+ * model-visible surface in production (the search.ts fallback never fires),
181
+ * so it must not go stale. `defaultEngine` falls back to
182
+ * resolveTmConfig().searchDefaultEngine so the descriptor states the real
183
+ * default (auto) — callers may pass cfg.searchDefaultEngine explicitly.
184
+ * The §6m-s anti-drift test asserts the descriptor names every
185
+ * SEARCH_ENGINE_NAMES entry and none of the removed engines.
145
186
  */
146
- export async function buildSearchArgsSchema() {
187
+ export async function buildSearchArgsSchema(defaultEngine) {
188
+ const { AUTO_ENGINE_KEY, SEARCH_ENGINE_NAMES } = await import("./search.js");
189
+ const defEngine = (defaultEngine && defaultEngine.trim()) || resolveTmConfig().searchDefaultEngine || AUTO_ENGINE_KEY;
190
+ const engineList = `${AUTO_ENGINE_KEY}|${SEARCH_ENGINE_NAMES.join("|")}`;
191
+ const engineDesc = `engine: ${engineList} (optional, default ${defEngine}). ` +
192
+ `"${AUTO_ENGINE_KEY}" classifies the query and fans the matching engines out in parallel ` +
193
+ `(weighted-RRF fused top-10); an explicit name runs that single engine ` +
194
+ `(bing = the live CN HTML SERP; stackoverflow/hn/npm/github/moegirl/bilibili = structured JSON).`;
147
195
  const z = await loadZod();
148
196
  if (!z) {
149
197
  return {
150
198
  query: { descriptor: "query: string (required, raw text — CJK fine, encoded here)" },
151
- engine: { descriptor: "engine: bing|bing-int|sogou|so|baidu|bilibili|npm|github (optional, default bing)" },
199
+ engine: { descriptor: engineDesc },
152
200
  };
153
201
  }
154
202
  const zz = z;
155
203
  return {
156
204
  query: zz.string().describe("Raw search query — pass text as-is; the tool URL-encodes it (CJK included)."),
157
- engine: zz
158
- .string()
159
- .describe("bing (default) | bing-int (international results) | sogou | so (360) | baidu | bilibili | moegirl (wiki search API, structured) | npm (registry search, structured) | github (repo search API, structured).")
160
- .optional(),
205
+ engine: zz.string().optional().describe(engineDesc),
161
206
  };
162
207
  }
163
208
  /**
@@ -168,46 +213,117 @@ export async function buildMemoryArgsSchema() {
168
213
  const z = await loadZod();
169
214
  if (!z) {
170
215
  return {
171
- action: { descriptor: "action: add|search|list|forget (required)" },
216
+ action: { descriptor: "action: add|search|list|forget|compact (required)" },
172
217
  title: { descriptor: "title: string (add/forget)" },
173
218
  content: { descriptor: "content: string (add, ≤4000 chars)" },
174
219
  category: { descriptor: "category: string (add, optional)" },
175
220
  keywords: { descriptor: "keywords: string[] or comma string (add, optional)" },
176
221
  usage_scenario: { descriptor: "usage_scenario: string[] or comma string (add, optional)" },
177
222
  query: { descriptor: "query: string (search)" },
178
- scope: { descriptor: "scope: project|global (optional, default project)" },
223
+ scope: { descriptor: 'scope: project|global|session (optional, default project; compact also accepts "all")' },
224
+ apply: { descriptor: "apply: boolean (compact only; absent = dry-run, true performs the merges)" },
179
225
  };
180
226
  }
227
+ // `.optional().describe(...)` — the description MUST be applied to the
228
+ // FINAL wrapper: zod (v4 confirmed) drops a description set before
229
+ // .optional() when the host serializes the shape, so describe-first would
230
+ // leave the model blind to the very text this descriptor exists to carry.
181
231
  const zz = z;
182
232
  return {
183
- action: zz.string().describe("add | search | list | forget."),
184
- title: zz.string().describe("Memory title (add/forget).").optional(),
185
- content: zz.string().describe("One condensed fact, ≤4000 chars (add).").optional(),
186
- category: zz.string().describe("Category slug, e.g. project_tech_stack (add, optional).").optional(),
187
- keywords: zz.string().describe("Comma-separated keywords (add, optional).").optional(),
188
- usage_scenario: zz.string().describe("Comma-separated when-to-use scenarios (add, optional).").optional(),
189
- query: zz.string().describe("Search query (search).").optional(),
190
- scope: zz.string().describe("project (default) | global.").optional(),
233
+ action: zz.string().describe("add | search | list | forget | compact."),
234
+ title: zz.string().optional().describe("Memory title (add/forget)."),
235
+ content: zz.string().optional().describe("One condensed fact, ≤4000 chars (add)."),
236
+ category: zz.string().optional().describe("Category slug, e.g. project_tech_stack (add, optional)."),
237
+ keywords: zz.string().optional().describe("Comma-separated keywords (add, optional)."),
238
+ usage_scenario: zz.string().optional().describe("Comma-separated when-to-use scenarios (add, optional)."),
239
+ query: zz.string().optional().describe("Search query (search)."),
240
+ scope: zz
241
+ .string()
242
+ .optional()
243
+ .describe('project (default) | global | session (transient, this conversation only); compact also accepts "all".'),
244
+ // memory.ts execute() reads args.apply (truthy gate on compact); the raw
245
+ // shape IS the model-visible param surface (the host serializes it into
246
+ // the LLM parameter spec), so an undeclared key is unreachable — declare
247
+ // it here or the model can never request a real compaction.
248
+ apply: zz
249
+ .boolean()
250
+ .optional()
251
+ .describe("compact only: absent = dry-run (report planned merges), true = perform them (originals backed up under memories/.compact-backup/)."),
191
252
  };
192
253
  }
193
254
  /**
194
255
  * tm_browser args — same ZodRawShape treatment (BUG#3 class); descriptor
195
256
  * fallback when zod is absent.
257
+ *
258
+ * STRIP BEHAVIOR / WHY EVERY FIELD IS DECLARED: this is a RAW shape, never
259
+ * wrapped in z.object() (BUG#3), so no zod-level .strip()/.passthrough()
260
+ * applies and execute() reads rawArgs verbatim. But the host serializes
261
+ * exactly these keys into the LLM parameter spec — an undeclared field is
262
+ * invisible to the model and never reaches browser.ts, i.e. the shape is a
263
+ * CLOSED param surface in effect. T5's 16 playwright verbs
264
+ * (BROWSER_PLAYWRIGHT_ACTIONS, browser.ts:505) + the 5 compat verbs consume
265
+ * 19 fields across execute/act (args.uid/selector/targetUid/targetSelector/
266
+ * text/key/function/expression/filePath/files/index/timeoutMs/dialogAction/
267
+ * promptText/clear/fullPage/image, browser.ts act() + execute()) — every one
268
+ * is declared below, or the corresponding verb silently loses its input.
269
+ *
270
+ * `headless` is DELIBERATELY not declared (2026-09-18): it used to be a model
271
+ * arg, `Boolean("false")` read as true, and one such call pinned the whole
272
+ * host process to a headless browser that every anti-bot gate then rejected.
273
+ * Mode is an operator setting (TM_BROWSER_HEADLESS) — a closed surface here
274
+ * is the fix, not a validation layer.
196
275
  */
197
276
  export async function buildBrowserArgsSchema() {
198
277
  const z = await loadZod();
278
+ const ACTION_LIST = "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 (16 playwright verbs) | open | navigate | read | screenshot | close (compat verbs).";
199
279
  if (!z) {
200
280
  return {
201
- action: { descriptor: 'action: open|navigate|read|screenshot|close (required)' },
202
- url: { descriptor: 'url: string (open/navigate, allowlisted https)' },
203
- headless: { descriptor: 'headless: boolean (open, optional — default auto)' },
281
+ action: { descriptor: `action: ${ACTION_LIST} (required)` },
282
+ url: { descriptor: "url: string (open/navigate/navigate_page, allowlisted https)" },
283
+ image: { descriptor: "image: true with take_screenshot — inline the PNG pixels in this result" },
284
+ uid: { descriptor: "uid: snapshot [uid=eN] token (click/fill/hover/drag/upload_file/wait_for)" },
285
+ selector: { descriptor: "selector: CSS/text locator escape hatch (only when a snapshot cannot express the node)" },
286
+ targetUid: { descriptor: "targetUid: drag destination uid" },
287
+ targetSelector: { descriptor: "targetSelector: drag destination selector" },
288
+ text: { descriptor: "text: fill value / wait_for visible text" },
289
+ key: { descriptor: "key: press_key chord, e.g. Enter|Control+A" },
290
+ function: { descriptor: "function: JS function source for evaluate_script" },
291
+ expression: { descriptor: "expression: alias of function (evaluate_script)" },
292
+ filePath: { descriptor: "filePath: local file path for upload_file" },
293
+ files: { descriptor: "files: alias of filePath — single path or array of paths" },
294
+ index: { descriptor: "index: select_page target tab index from list_pages" },
295
+ timeoutMs: { descriptor: "timeoutMs: wait_for budget in ms (default 3000, clamped 100..30000)" },
296
+ dialogAction: { descriptor: "dialogAction: accept|dismiss for handle_dialog (default accept)" },
297
+ promptText: { descriptor: "promptText: prompt-dialog reply text for handle_dialog accept" },
298
+ clear: { descriptor: "clear: drain the console buffer after list_console_messages" },
299
+ fullPage: { descriptor: "fullPage: take_screenshot captures the full page (default viewport only)" },
204
300
  };
205
301
  }
302
+ // describe-LAST on every optional chain — zod v4 drops a description set
303
+ // before .optional() when the shape is serialized (see buildMemoryArgsSchema).
206
304
  const zz = z;
305
+ const str = (d) => zz.string().optional().describe(d);
306
+ const bool = (d) => zz.boolean().optional().describe(d);
207
307
  return {
208
- action: zz.string().describe('open | navigate | read | screenshot | close.'),
209
- url: zz.string().describe('Absolute https URL on an allowlisted host (open/navigate). URL-encode the query (CJK terms too).').optional(),
210
- headless: zz.boolean().describe('Force headless/headful on open (optional — default auto by display availability).').optional(),
308
+ action: zz.string().describe(ACTION_LIST),
309
+ url: str("Absolute https URL on an allowlisted host (open/navigate/navigate_page). URL-encode the query (CJK terms too)."),
310
+ image: bool("take_screenshot only: inline the PNG pixels into this tool result (default false = path only; pixels cost context, so ask only when the screenshot IS the evidence)."),
311
+ uid: str("Snapshot [uid=eN] token from the LATEST take_snapshot (click/fill/hover/drag source/upload_file/wait_for)."),
312
+ selector: str("CSS/text locator escape hatch — only for a node the snapshot cannot express; never guess locators."),
313
+ targetUid: str("drag destination uid from the latest take_snapshot."),
314
+ targetSelector: str("drag destination selector escape hatch."),
315
+ text: str("fill value, or the visible text to wait for with wait_for (uid or text — one of them)."),
316
+ key: str('press_key chord, e.g. "Enter" or "Control+A".'),
317
+ function: str("JS function/expression source for evaluate_script (returns the JSON-serialized value)."),
318
+ expression: str("Alias of function for evaluate_script."),
319
+ filePath: str("Local file path for upload_file (must exist on disk)."),
320
+ files: zz.any().optional().describe("Alias of filePath for upload_file — a single path or an array of paths."),
321
+ index: zz.number().int().min(0).optional().describe("select_page target tab index (0-based, from list_pages)."),
322
+ timeoutMs: zz.number().int().min(100).optional().describe("wait_for visibility budget in ms (engine default 3000, clamped to 30000)."),
323
+ dialogAction: str("handle_dialog verdict: accept (default) | dismiss."),
324
+ promptText: str("Reply text when handle_dialog accepts a prompt()-type dialog."),
325
+ clear: bool("Drain the buffered console messages after list_console_messages."),
326
+ fullPage: bool("take_screenshot captures the full page (default: viewport only)."),
211
327
  };
212
328
  }
213
329
  //# sourceMappingURL=args-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"args-schema.js","sourceRoot":"","sources":["../../src/tm/args-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"args-schema.js","sourceRoot":"","sources":["../../src/tm/args-schema.ts"],"names":[],"mappings":"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"}
@@ -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"}