@wrongstack/tools 0.285.0 → 0.287.0

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 (76) hide show
  1. package/README.md +21 -2
  2. package/dist/_edit-match.d.ts.map +1 -1
  3. package/dist/batch-tool-use.d.ts +1 -1
  4. package/dist/batch-tool-use.d.ts.map +1 -1
  5. package/dist/batch-tool-use.js +26 -8
  6. package/dist/batch-tool-use.js.map +2 -2
  7. package/dist/browser/artifacts.d.ts +13 -0
  8. package/dist/browser/artifacts.d.ts.map +1 -0
  9. package/dist/browser/index.d.ts +7 -0
  10. package/dist/browser/index.d.ts.map +1 -0
  11. package/dist/browser/index.js +1264 -0
  12. package/dist/browser/index.js.map +7 -0
  13. package/dist/browser/manager.d.ts +57 -0
  14. package/dist/browser/manager.d.ts.map +1 -0
  15. package/dist/browser/network-guard-proxy.d.ts +23 -0
  16. package/dist/browser/network-guard-proxy.d.ts.map +1 -0
  17. package/dist/browser/security.d.ts +29 -0
  18. package/dist/browser/security.d.ts.map +1 -0
  19. package/dist/browser/tools.d.ts +62 -0
  20. package/dist/browser/tools.d.ts.map +1 -0
  21. package/dist/browser/types.d.ts +60 -0
  22. package/dist/browser/types.d.ts.map +1 -0
  23. package/dist/builtin.d.ts +4 -3
  24. package/dist/builtin.d.ts.map +1 -1
  25. package/dist/builtin.js +2609 -525
  26. package/dist/builtin.js.map +4 -4
  27. package/dist/codebase-index/go-parser.d.ts.map +1 -1
  28. package/dist/codebase-index/index.js +190 -96
  29. package/dist/codebase-index/index.js.map +4 -4
  30. package/dist/codebase-index/py-parser.d.ts.map +1 -1
  31. package/dist/codebase-index/rs-parser.d.ts.map +1 -1
  32. package/dist/codebase-index/worker.js +188 -94
  33. package/dist/codebase-index/worker.js.map +4 -4
  34. package/dist/e2e.d.ts +56 -0
  35. package/dist/e2e.d.ts.map +1 -0
  36. package/dist/edit.d.ts.map +1 -1
  37. package/dist/edit.js +36 -12
  38. package/dist/edit.js.map +3 -3
  39. package/dist/exec.js +1 -1
  40. package/dist/exec.js.map +2 -2
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +2895 -511
  44. package/dist/index.js.map +4 -4
  45. package/dist/kanban.d.ts +7 -2
  46. package/dist/kanban.d.ts.map +1 -1
  47. package/dist/kanban.js +158 -19
  48. package/dist/kanban.js.map +4 -4
  49. package/dist/next-steps.d.ts +6 -2
  50. package/dist/next-steps.d.ts.map +1 -1
  51. package/dist/next-steps.js +3 -3
  52. package/dist/next-steps.js.map +2 -2
  53. package/dist/pack.js +2625 -525
  54. package/dist/pack.js.map +4 -4
  55. package/dist/plan.d.ts.map +1 -1
  56. package/dist/plan.js +154 -4
  57. package/dist/plan.js.map +4 -4
  58. package/dist/search.d.ts.map +1 -1
  59. package/dist/search.js +8 -2
  60. package/dist/search.js.map +2 -2
  61. package/dist/session-kanban.d.ts +38 -0
  62. package/dist/session-kanban.d.ts.map +1 -0
  63. package/dist/session-kanban.js +489 -0
  64. package/dist/session-kanban.js.map +7 -0
  65. package/dist/task.d.ts.map +1 -1
  66. package/dist/task.js +163 -4
  67. package/dist/task.js.map +4 -4
  68. package/dist/todo.d.ts.map +1 -1
  69. package/dist/todo.js +155 -7
  70. package/dist/todo.js.map +4 -4
  71. package/dist/tool-icon-map.d.ts +2 -1
  72. package/dist/tool-icon-map.d.ts.map +1 -1
  73. package/dist/tool-icons.d.ts.map +1 -1
  74. package/dist/tool-icons.js +7 -1
  75. package/dist/tool-icons.js.map +2 -2
  76. package/package.json +12 -3
package/README.md CHANGED
@@ -42,6 +42,24 @@ pnpm add @wrongstack/tools @wrongstack/core
42
42
  | `fetch` | `auto` | no | SSRF-hardened (IPv4 + IPv6 private CIDR, redirect re-validation, http://-downgrade refused) |
43
43
  | `search` | `auto` | no | Web search via configured provider |
44
44
 
45
+ ### Browser
46
+
47
+ First-party `browser_*` tools lazily launch Playwright Chromium and use isolated per-agent
48
+ contexts. Observation tools are automatic; navigation, interaction, screenshot persistence,
49
+ upload, and evaluation require confirmation where appropriate. See
50
+ [browser automation](../../docs/browser-automation.md) for the lifecycle and security contract.
51
+ Credential entry uses `browser_type.secretEnv` so audit records retain a placeholder rather than
52
+ the secret value.
53
+
54
+ ### E2E discovery
55
+
56
+ | Tool | Permission | Mutating | Notes |
57
+ |------|------------|----------|-------|
58
+ | `e2e_plan` | `auto` | no | Statically discovers Playwright/Cypress configs, servers, specs, and exact argv without evaluating project code |
59
+
60
+ See [the browser-aware E2E runner guide](../../docs/e2e-runner.md). Process startup and test
61
+ execution remain separate permission-gated steps.
62
+
45
63
  ### Project lifecycle
46
64
 
47
65
  | Tool | Permission | Notes |
@@ -51,10 +69,10 @@ pnpm add @wrongstack/tools @wrongstack/core
51
69
  | `typecheck` | `auto` | Project-aware typechecker |
52
70
  | `test` | `confirm` | Project-aware test runner |
53
71
  | `install` | `confirm` | Package manager install |
54
- | `audit` | `auto` | Dependency vuln audit |
72
+ | `audit` | `confirm` | Dependency vulnerability audit |
55
73
  | `outdated` | `auto` | List outdated dependencies |
56
74
  | `scaffold` | `confirm` | Template-based scaffolding |
57
- | `document` | `confirm` | Inline JSDoc generation |
75
+ | `document` | `auto` | Deprecated read-only documentation-candidate preview; use plugin tool `auto_doc` for generation |
58
76
  | `logs` | `auto` | Tail logs with rolling 100k-line window |
59
77
 
60
78
  ### Agent control
@@ -87,6 +105,7 @@ const all = new ToolRegistry(builtinTools);
87
105
  - **`bash` / `exec` child env sanitized** to a fixed allowlist + secret-substring strip (`TOKEN` / `SECRET` / `PASSWORD` / `AUTH` / `BEARER` / `COOKIE` / `PRIVATE` / `KEY`). Opt-out via `WRONGSTACK_BASH_ENV_PASSTHROUGH=1`.
88
106
  - **`bash` POSIX process-group kill** with `SIGTERM → 800 ms → SIGKILL`. Runaway grandchildren can't survive the timeout.
89
107
  - **`fetch` SSRF defenses**: numeric CIDR checks for IPv4 (`10/8`, `127/8`, `169.254/16`, `100.64/10`, `224/4`, `240/4`, …) and 8-group-expanded IPv6 (including Node's compressed `::ffff:7f00:1` form for v4-mapped addresses). Redirect target re-validated on every hop. `http://` downgrade refused.
108
+ - **`browser_*` isolation and SSRF defenses**: one context per agent/session, private-host and URL-credential rejection, guarded subrequests, disabled downloads, project-root-confined uploads, bounded/redacted evidence, and abort/run-disposal cleanup.
90
109
  - **`patch` diff-target validation**: every `+++` target post-strip is resolved against `projectRoot` before GNU patch sees the diff. `strip` clamped to `≥1`. Temp diff written to a `0700 mkdtemp` directory. Run with `LANG=C` / `LC_ALL=C`.
91
110
  - **`replace` / `grep` symlink-safe**: lstat + realpath + projectRoot revalidation; symlinks skipped, not followed.
92
111
  - **User-regex ReDoS guard** (`_regex.ts`): 512-char cap, nested-quantifier rejection (`(a+)+`, `(?:x+)*`), 64 KB subject-line cap. Applied to `grep`, `replace`, `logs`.
@@ -1 +1 @@
1
- {"version":3,"file":"_edit-match.d.ts","sourceRoot":"","sources":["../src/_edit-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,OAAO,CAAC;AAE5F,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC;AAED,uEAAuE;AACvE,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAMhD,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAKlF,CAAC;AAYF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CA+BzF;AA6GD,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAUvD;AAyBD,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAkBrC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CA0B/C"}
1
+ {"version":3,"file":"_edit-match.d.ts","sourceRoot":"","sources":["../src/_edit-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,OAAO,CAAC;AAE5F,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC;AAED,uEAAuE;AACvE,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAMhD,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAKlF,CAAC;AAYF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CA+CzF;AA4HD,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAUvD;AAyBD,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAkBrC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CA0B/C"}
@@ -1,4 +1,4 @@
1
- import type { Tool } from '@wrongstack/core';
1
+ import { type Tool } from '@wrongstack/core';
2
2
  interface BatchToolUseInput {
3
3
  calls: {
4
4
  tool: string;
@@ -1 +1 @@
1
- {"version":3,"file":"batch-tool-use.d.ts","sourceRoot":"","sources":["../src/batch-tool-use.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,UAAU,iBAAiB;IACzB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAChC,EAAE,CAAC;IACJ,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;KACrB,EAAE,CAAC;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAoFxE,CAAC"}
1
+ {"version":3,"file":"batch-tool-use.d.ts","sourceRoot":"","sources":["../src/batch-tool-use.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,IAAI,EACV,MAAM,kBAAkB,CAAC;AAE1B,UAAU,iBAAiB;IACzB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAChC,EAAE,CAAC;IACJ,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;KACrB,EAAE,CAAC;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAsGxE,CAAC"}
@@ -1,4 +1,7 @@
1
1
  // src/batch-tool-use.ts
2
+ import {
3
+ GOVERNED_TOOL_EXECUTOR_META_KEY
4
+ } from "@wrongstack/core";
2
5
  var batchToolUseTool = {
3
6
  name: "batch_tool_use",
4
7
  category: "Meta",
@@ -35,7 +38,7 @@ var batchToolUseTool = {
35
38
  },
36
39
  required: ["calls"]
37
40
  },
38
- async execute(input, ctx, opts) {
41
+ async execute(input, ctx, _opts) {
39
42
  if (!input?.calls || input.calls.length === 0) {
40
43
  return {
41
44
  results: [],
@@ -45,18 +48,33 @@ var batchToolUseTool = {
45
48
  stop_on_error: false
46
49
  };
47
50
  }
51
+ const governedExecute = ctx.meta[GOVERNED_TOOL_EXECUTOR_META_KEY];
52
+ if (typeof governedExecute !== "function") {
53
+ return {
54
+ results: input.calls.map((call) => ({
55
+ tool: call.tool,
56
+ success: false,
57
+ error: "governed nested execution is unavailable; call the tool directly",
58
+ executionMs: 0
59
+ })),
60
+ total: input.calls.length,
61
+ succeeded: 0,
62
+ failed: input.calls.length,
63
+ stop_on_error: input.stop_on_error ?? false
64
+ };
65
+ }
48
66
  const results = [];
49
67
  let succeeded = 0;
50
68
  let failed = 0;
51
69
  if (input.parallel !== false) {
52
- const promises = input.calls.map(async (call) => executeSingle(call, ctx, opts));
70
+ const promises = input.calls.map(async (call) => executeSingle(call, ctx, governedExecute));
53
71
  const allResults = await Promise.all(promises);
54
72
  results.push(...allResults);
55
73
  succeeded = allResults.filter((r) => r.success).length;
56
74
  failed = allResults.filter((r) => !r.success).length;
57
75
  } else {
58
76
  for (const call of input.calls) {
59
- const result = await executeSingle(call, ctx, opts ?? { signal: void 0 });
77
+ const result = await executeSingle(call, ctx, governedExecute);
60
78
  results.push(result);
61
79
  if (result.success) {
62
80
  succeeded++;
@@ -75,9 +93,9 @@ var batchToolUseTool = {
75
93
  };
76
94
  }
77
95
  };
78
- async function executeSingle(call, ctx, opts) {
96
+ async function executeSingle(call, ctx, governedExecute) {
79
97
  const start = Date.now();
80
- const tool = ctx.tools.find((t) => t.name === call.tool);
98
+ const tool = ctx.tools.find((candidate) => candidate.name === call.tool);
81
99
  if (!tool) {
82
100
  return {
83
101
  tool: call.tool,
@@ -87,11 +105,11 @@ async function executeSingle(call, ctx, opts) {
87
105
  };
88
106
  }
89
107
  try {
90
- const result = await tool.execute(call.input, ctx, opts);
108
+ const result = await governedExecute(call.tool, call.input);
91
109
  return {
92
110
  tool: call.tool,
93
- success: true,
94
- result,
111
+ success: result.success,
112
+ ...result.success ? { result: result.result } : { error: result.error ?? "nested tool failed" },
95
113
  executionMs: Date.now() - start
96
114
  };
97
115
  } catch (e) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/batch-tool-use.ts"],
4
- "sourcesContent": ["import type { Tool } from '@wrongstack/core';\n\ninterface BatchToolUseInput {\n calls: {\n tool: string;\n input: Record<string, unknown>;\n }[];\n stop_on_error?: boolean | undefined;\n parallel?: boolean | undefined;\n}\n\ninterface BatchToolUseOutput {\n results: {\n tool: string;\n success: boolean;\n result?: unknown | undefined;\n error?: string | undefined;\n executionMs: number;\n }[];\n total: number;\n succeeded: number;\n failed: number;\n stop_on_error: boolean;\n}\n\nexport const batchToolUseTool: Tool<BatchToolUseInput, BatchToolUseOutput> = {\n name: 'batch_tool_use',\n category: 'Meta',\n description:\n 'Execute a batch of tool calls either sequentially or in parallel. Returns structured results for every call.',\n usageHint:\n 'ADVANCED / POWER USER TOOL:\\n\\n' +\n '- Useful when you have a clear list of independent operations to perform.\\n' +\n '- `parallel: true` (default) runs them concurrently for speed.\\n' +\n '- `stop_on_error: true` makes it fail fast on the first error.\\n' +\n 'Use with care \u2014 batching many mutating operations can be risky. Prefer explicit sequential steps for important work.',\n permission: 'confirm',\n mutating: true,\n timeoutMs: 120_000,\n capabilities: ['tool.mutate.any'],\n icon: 'meta',\n inputSchema: {\n type: 'object',\n properties: {\n calls: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n tool: { type: 'string' },\n input: { type: 'object' },\n },\n required: ['tool'],\n },\n description: 'Array of tool calls to execute',\n },\n stop_on_error: {\n type: 'boolean',\n description: 'Stop execution on first error (default: false)',\n },\n parallel: {\n type: 'boolean',\n description: 'Execute calls in parallel (default: true)',\n },\n },\n required: ['calls'],\n },\n async execute(input, ctx, opts) {\n if (!input?.calls || input.calls.length === 0) {\n return {\n results: [],\n total: 0,\n succeeded: 0,\n failed: 0,\n stop_on_error: false,\n };\n }\n\n const results: BatchToolUseOutput['results'] = [];\n let succeeded = 0;\n let failed = 0;\n\n if (input.parallel !== false) {\n const promises = input.calls.map(async (call) => executeSingle(call, ctx, opts));\n const allResults = await Promise.all(promises);\n results.push(...allResults);\n succeeded = allResults.filter((r) => r.success).length;\n failed = allResults.filter((r) => !r.success).length;\n } else {\n for (const call of input.calls) {\n const result = await executeSingle(call, ctx, opts ?? { signal: undefined as never as AbortSignal });\n results.push(result);\n if (result.success) {\n succeeded++;\n } else {\n failed++;\n if (input.stop_on_error) break;\n }\n }\n }\n\n return {\n results,\n total: input.calls.length,\n succeeded,\n failed,\n stop_on_error: input.stop_on_error ?? false,\n };\n },\n};\n\nasync function executeSingle(\n call: { tool: string; input: Record<string, unknown> },\n ctx: import('@wrongstack/core').Context,\n opts: { signal: AbortSignal },\n): Promise<BatchToolUseOutput['results'][0]> {\n const start = Date.now();\n const tool = ctx.tools.find((t: Tool) => t.name === call.tool);\n\n if (!tool) {\n return {\n tool: call.tool,\n success: false,\n error: `tool \"${call.tool}\" not found`,\n executionMs: Date.now() - start,\n };\n }\n\n try {\n const result = await tool.execute(call.input, ctx, opts);\n return {\n tool: call.tool,\n success: true,\n result,\n executionMs: Date.now() - start,\n };\n } catch (e) {\n return {\n tool: call.tool,\n success: false,\n error: e instanceof Error ? e.message : String(e),\n executionMs: Date.now() - start,\n };\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n GOVERNED_TOOL_EXECUTOR_META_KEY,\n type GovernedToolExecutor,\n type Tool,\n} from '@wrongstack/core';\n\ninterface BatchToolUseInput {\n calls: {\n tool: string;\n input: Record<string, unknown>;\n }[];\n stop_on_error?: boolean | undefined;\n parallel?: boolean | undefined;\n}\n\ninterface BatchToolUseOutput {\n results: {\n tool: string;\n success: boolean;\n result?: unknown | undefined;\n error?: string | undefined;\n executionMs: number;\n }[];\n total: number;\n succeeded: number;\n failed: number;\n stop_on_error: boolean;\n}\n\nexport const batchToolUseTool: Tool<BatchToolUseInput, BatchToolUseOutput> = {\n name: 'batch_tool_use',\n category: 'Meta',\n description:\n 'Execute a batch of tool calls either sequentially or in parallel. Returns structured results for every call.',\n usageHint:\n 'ADVANCED / POWER USER TOOL:\\n\\n' +\n '- Useful when you have a clear list of independent operations to perform.\\n' +\n '- `parallel: true` (default) runs them concurrently for speed.\\n' +\n '- `stop_on_error: true` makes it fail fast on the first error.\\n' +\n 'Use with care \u2014 batching many mutating operations can be risky. Prefer explicit sequential steps for important work.',\n permission: 'confirm',\n mutating: true,\n timeoutMs: 120_000,\n capabilities: ['tool.mutate.any'],\n icon: 'meta',\n inputSchema: {\n type: 'object',\n properties: {\n calls: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n tool: { type: 'string' },\n input: { type: 'object' },\n },\n required: ['tool'],\n },\n description: 'Array of tool calls to execute',\n },\n stop_on_error: {\n type: 'boolean',\n description: 'Stop execution on first error (default: false)',\n },\n parallel: {\n type: 'boolean',\n description: 'Execute calls in parallel (default: true)',\n },\n },\n required: ['calls'],\n },\n async execute(input, ctx, _opts) {\n if (!input?.calls || input.calls.length === 0) {\n return {\n results: [],\n total: 0,\n succeeded: 0,\n failed: 0,\n stop_on_error: false,\n };\n }\n\n const governedExecute = ctx.meta[GOVERNED_TOOL_EXECUTOR_META_KEY] as\n | GovernedToolExecutor\n | undefined;\n if (typeof governedExecute !== 'function') {\n return {\n results: input.calls.map((call) => ({\n tool: call.tool,\n success: false,\n error: 'governed nested execution is unavailable; call the tool directly',\n executionMs: 0,\n })),\n total: input.calls.length,\n succeeded: 0,\n failed: input.calls.length,\n stop_on_error: input.stop_on_error ?? false,\n };\n }\n\n const results: BatchToolUseOutput['results'] = [];\n let succeeded = 0;\n let failed = 0;\n\n if (input.parallel !== false) {\n const promises = input.calls.map(async (call) => executeSingle(call, ctx, governedExecute));\n const allResults = await Promise.all(promises);\n results.push(...allResults);\n succeeded = allResults.filter((r) => r.success).length;\n failed = allResults.filter((r) => !r.success).length;\n } else {\n for (const call of input.calls) {\n const result = await executeSingle(call, ctx, governedExecute);\n results.push(result);\n if (result.success) {\n succeeded++;\n } else {\n failed++;\n if (input.stop_on_error) break;\n }\n }\n }\n\n return {\n results,\n total: input.calls.length,\n succeeded,\n failed,\n stop_on_error: input.stop_on_error ?? false,\n };\n },\n};\n\nasync function executeSingle(\n call: { tool: string; input: Record<string, unknown> },\n ctx: import('@wrongstack/core').Context,\n governedExecute: GovernedToolExecutor,\n): Promise<BatchToolUseOutput['results'][0]> {\n const start = Date.now();\n const tool = ctx.tools.find((candidate: Tool) => candidate.name === call.tool);\n\n if (!tool) {\n return {\n tool: call.tool,\n success: false,\n error: `tool \"${call.tool}\" not found`,\n executionMs: Date.now() - start,\n };\n }\n\n try {\n const result = await governedExecute(call.tool, call.input);\n return {\n tool: call.tool,\n success: result.success,\n ...(result.success ? { result: result.result } : { error: result.error ?? 'nested tool failed' }),\n executionMs: Date.now() - start,\n };\n } catch (e) {\n return {\n tool: call.tool,\n success: false,\n error: e instanceof Error ? e.message : String(e),\n executionMs: Date.now() - start,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,13 @@
1
+ import type { BrowserArtifact, BrowserArtifactKind } from './types.js';
2
+ export declare class BrowserArtifactStore {
3
+ private readonly root;
4
+ constructor(root: string);
5
+ write(sessionId: string, kind: BrowserArtifactKind, extension: string, mimeType: string, content: Uint8Array): Promise<BrowserArtifact>;
6
+ private record;
7
+ pathFor(sessionId: string, extension: string): {
8
+ id: string;
9
+ path: string;
10
+ };
11
+ describe(id: string, kind: BrowserArtifactKind, target: string, mimeType: string): Promise<BrowserArtifact>;
12
+ }
13
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/browser/artifacts.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEvE,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,MAAM,EAAI;IAEvC,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,eAAe,CAAC,CAM1B;YAEa,MAAM;IA0CpB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAM1E;IAEK,QAAQ,CACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAE1B;CACF"}
@@ -0,0 +1,7 @@
1
+ export { BrowserArtifactStore } from './artifacts.js';
2
+ export { type BrowserLauncher, BrowserSessionManager, browserInstallationDiagnostics, } from './manager.js';
3
+ export { BrowserNetworkGuardProxy } from './network-guard-proxy.js';
4
+ export { assertBrowserUrlAllowed, type BrowserDnsLookup, type BrowserResolvedTarget, parsePrivateOriginAllowlist, redactBrowserText, resolvePinnedBrowserTarget, safeBrowserUrl, } from './security.js';
5
+ export { browserClickTool, browserCloseTool, browserDragTool, browserEvaluateTool, browserHoverTool, browserListTool, browserNavigateTool, browserOpenTool, browserPressTool, browserScreenshotTool, browserSelectTool, browserSnapshotTool, browserStatusTool, browserTools, browserTypeTool, browserUploadTool, browserWaitTool, shutdownBrowserTools, } from './tools.js';
6
+ export type { BrowserArtifact, BrowserArtifactKind, BrowserConsoleEntry, BrowserManagerOptions, BrowserNetworkEntry, BrowserOpenOptions, BrowserSessionSummary, BrowserSnapshot, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,KAAK,eAAe,EACpB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EACL,uBAAuB,EACvB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,2BAA2B,EAC3B,iBAAiB,EACjB,0BAA0B,EAC1B,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,GAChB,MAAM,YAAY,CAAC"}