@humain/terminal 0.0.3-beta.0 → 0.0.3-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +4 -3
  4. package/dist/config.js.map +1 -1
  5. package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +13 -0
  6. package/dist/humain/mcp-adapter/vendor/README.md +4 -1
  7. package/dist/humain/mcp-adapter/vendor/agent-dir.ts +12 -4
  8. package/dist/humain/mcp-adapter/vendor/cli.js +25 -4
  9. package/dist/humain/mcp-adapter/vendor/config.ts +4 -4
  10. package/dist/humain/mcp-adapter/vendor/direct-tools.ts +18 -15
  11. package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +416 -60
  12. package/dist/humain/mcp-adapter/vendor/mcp-setup-panel.ts +2 -1
  13. package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +18 -8
  14. package/dist/humain/mcp-adapter/vendor/package.json +177 -176
  15. package/dist/humain/mcp-adapter/vendor/request-headers-command.ts +336 -0
  16. package/dist/humain/mcp-adapter/vendor/server-manager.ts +5 -0
  17. package/dist/humain/mcp-adapter/vendor/tool-metadata.ts +38 -18
  18. package/dist/humain/mcp-adapter/vendor/types.ts +93 -10
  19. package/dist/humain/web-access/vendor/auth-fetch.d.ts +13 -0
  20. package/dist/humain/web-access/vendor/auth-fetch.d.ts.map +1 -0
  21. package/dist/humain/web-access/vendor/auth-fetch.js +134 -0
  22. package/dist/humain/web-access/vendor/auth-fetch.js.map +1 -0
  23. package/dist/humain/web-access/vendor/chrome-cookies.d.ts +13 -0
  24. package/dist/humain/web-access/vendor/chrome-cookies.d.ts.map +1 -1
  25. package/dist/humain/web-access/vendor/chrome-cookies.js +106 -22
  26. package/dist/humain/web-access/vendor/chrome-cookies.js.map +1 -1
  27. package/dist/humain/web-access/vendor/curator-page.d.ts +1 -0
  28. package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
  29. package/dist/humain/web-access/vendor/curator-page.js +3 -1
  30. package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
  31. package/dist/humain/web-access/vendor/curator-server.d.ts +1 -0
  32. package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
  33. package/dist/humain/web-access/vendor/curator-server.js +2 -0
  34. package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
  35. package/dist/humain/web-access/vendor/extract.d.ts +2 -0
  36. package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
  37. package/dist/humain/web-access/vendor/extract.js +79 -17
  38. package/dist/humain/web-access/vendor/extract.js.map +1 -1
  39. package/dist/humain/web-access/vendor/fetch-params.d.ts +2 -0
  40. package/dist/humain/web-access/vendor/fetch-params.d.ts.map +1 -1
  41. package/dist/humain/web-access/vendor/fetch-params.js +17 -3
  42. package/dist/humain/web-access/vendor/fetch-params.js.map +1 -1
  43. package/dist/humain/web-access/vendor/firecrawl.d.ts +7 -0
  44. package/dist/humain/web-access/vendor/firecrawl.d.ts.map +1 -1
  45. package/dist/humain/web-access/vendor/firecrawl.js +141 -10
  46. package/dist/humain/web-access/vendor/firecrawl.js.map +1 -1
  47. package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
  48. package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
  49. package/dist/humain/web-access/vendor/gemini-search.js +22 -4
  50. package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
  51. package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
  52. package/dist/humain/web-access/vendor/index.js +122 -48
  53. package/dist/humain/web-access/vendor/index.js.map +1 -1
  54. package/dist/humain/web-access/vendor/summary-review.d.ts +3 -1
  55. package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -1
  56. package/dist/humain/web-access/vendor/summary-review.js +6 -3
  57. package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
  58. package/dist/humain/web-access/vendor/youtube-extract.d.ts.map +1 -1
  59. package/dist/humain/web-access/vendor/youtube-extract.js +2 -2
  60. package/dist/humain/web-access/vendor/youtube-extract.js.map +1 -1
  61. package/dist/utils/clipboard-image.d.ts.map +1 -1
  62. package/dist/utils/clipboard-image.js +2 -0
  63. package/dist/utils/clipboard-image.js.map +1 -1
  64. package/npm-shrinkwrap.json +7 -7
  65. package/package.json +6 -6
  66. package/src/humain/mcp-adapter/UPSTREAM.md +1 -1
  67. package/src/humain/mcp-adapter/upstream.json +3 -3
  68. package/src/humain/mcp-adapter/vendor/CHANGELOG.md +13 -0
  69. package/src/humain/web-access/UPSTREAM.md +1 -1
  70. package/src/humain/web-access/upstream.json +4 -4
@@ -1,6 +1,7 @@
1
1
  import { matchesKey, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
2
2
  import { createPanelKeys, type PanelKeybindings, type PanelKeys } from "./panel-keys.ts";
3
3
  import type { ImportKind } from "./types.ts";
4
+ import { getConfigDirName } from "./agent-dir.ts";
4
5
  import { KNOWN_SERVER_PRESETS, type ConfigWritePreview, type KnownServerPreset, type McpDiscoverySummary } from "./config.ts";
5
6
  import type { McpOnboardingState } from "./onboarding-state.ts";
6
7
 
@@ -556,7 +557,7 @@ export class McpSetupPanel {
556
557
  "3. ~/.agents/mcp/mcp.json",
557
558
  "4. <Pi agent dir>/mcp.json",
558
559
  "5. .mcp.json",
559
- "6. .pi/mcp.json",
560
+ `6. ${getConfigDirName()}/mcp.json`,
560
561
  `Host discovery: ${this.discovery.hostConfigDiscovery}. Conflicts reported: ${this.discovery.conflicts.length}.`,
561
562
  ...this.discovery.conflicts.slice(0, 8).map((conflict) =>
562
563
  `${conflict.serverName}: ${conflict.sources.map((source) => source.path).join(" -> ")} (winner: ${conflict.winner.path})`,
@@ -19,11 +19,12 @@ import type {
19
19
  ToolMetadata,
20
20
  PromptMetadata,
21
21
  } from "./types.ts";
22
- import { formatPromptCommandName, formatToolName, getToolNameCandidates, isServerDisabled, isToolAllowed, resolveToolPrefix, type ToolPrefix } from "./types.ts";
22
+ import { createToolSelectorCandidateIndex, formatPromptCommandName, formatToolName, getToolNameCandidates, isServerDisabled, isToolAllowed, resolveToolPrefix, type ToolPrefix } from "./types.ts";
23
23
  import { resourceNameToToolName } from "./resource-tools.ts";
24
24
  import {
25
25
  extractToolUiStreamMode,
26
26
  interpolateEnvRecord,
27
+ interpolateEnvVars,
27
28
  resolveBearerToken,
28
29
  resolveConfigPath,
29
30
  resolveServerUrl,
@@ -90,6 +91,14 @@ export function computeServerHash(definition: ServerEntry): string {
90
91
  cwd: resolveConfigPath(definition.cwd),
91
92
  url: resolveServerUrl(definition),
92
93
  headers: interpolateEnvRecord(definition.headers),
94
+ requestHeadersCommand: definition.requestHeadersCommand
95
+ ? {
96
+ command: interpolateEnvVars(definition.requestHeadersCommand.command),
97
+ args: definition.requestHeadersCommand.args?.map(interpolateEnvVars),
98
+ env: interpolateEnvRecord(definition.requestHeadersCommand.env),
99
+ timeoutMs: definition.requestHeadersCommand.timeoutMs,
100
+ }
101
+ : undefined,
93
102
  auth: definition.auth,
94
103
  protocolVersion: definition.protocolVersion,
95
104
  bearerToken: resolveBearerToken(definition),
@@ -184,8 +193,10 @@ export function reconstructToolMetadata(
184
193
  const metadata: ToolMetadata[] = [];
185
194
  const seenNames = new Set<string>();
186
195
  const effectivePrefix = resolveToolPrefix(definition, prefix);
187
- const getOtherCurrentCandidates = (toolName: string): Set<string> | undefined => {
188
- if (!configuredServers || !cache) return undefined;
196
+ const hasToolFilters =
197
+ (Array.isArray(definition.includeTools) && definition.includeTools.length > 0) ||
198
+ (Array.isArray(definition.excludeTools) && definition.excludeTools.length > 0);
199
+ const selectorCandidateIndex = hasToolFilters && configuredServers && cache ? (() => {
189
200
  const candidates = new Set<string>();
190
201
  for (const [otherServerName, otherDefinition] of Object.entries(configuredServers)) {
191
202
  const otherEntry = cache.servers[otherServerName];
@@ -202,16 +213,15 @@ export function reconstructToolMetadata(
202
213
  }
203
214
  }
204
215
  }
205
- for (const candidate of getToolNameCandidates(toolName, serverName, effectivePrefix, false)) candidates.delete(candidate);
206
- return candidates;
207
- };
216
+ return createToolSelectorCandidateIndex(candidates);
217
+ })() : undefined;
208
218
 
209
219
  for (const tool of entry.tools ?? []) {
210
220
  if (!tool?.name) continue;
211
221
  if (!isUiToolVisibleToModel(tool.uiVisibility)) {
212
222
  continue;
213
223
  }
214
- if (!isToolAllowed(tool.name, serverName, effectivePrefix, definition.includeTools, definition.excludeTools, getOtherCurrentCandidates(tool.name))) {
224
+ if (!isToolAllowed(tool.name, serverName, effectivePrefix, definition.includeTools, definition.excludeTools, selectorCandidateIndex)) {
215
225
  continue;
216
226
  }
217
227
 
@@ -236,7 +246,7 @@ export function reconstructToolMetadata(
236
246
  for (const resource of entry.resources ?? []) {
237
247
  if (!resource?.name || !resource?.uri) continue;
238
248
  const baseName = `read_${resourceNameToToolName(resource.name)}`;
239
- if (!isToolAllowed(baseName, serverName, effectivePrefix, definition.includeTools, definition.excludeTools, getOtherCurrentCandidates(baseName))) {
249
+ if (!isToolAllowed(baseName, serverName, effectivePrefix, definition.includeTools, definition.excludeTools, selectorCandidateIndex)) {
240
250
  continue;
241
251
  }
242
252
 
@@ -1,178 +1,179 @@
1
1
  {
2
- "name": "pi-mcp-adapter",
3
- "version": "2.25.0",
4
- "description": "MCP (Model Context Protocol) adapter extension for Pi coding agent",
5
- "type": "module",
6
- "types": "./index.ts",
7
- "exports": {
8
- ".": {
9
- "types": "./index.ts",
10
- "import": "./index.ts",
11
- "default": "./index.ts"
12
- },
13
- "./types": {
14
- "types": "./types.ts",
15
- "import": "./types.ts",
16
- "default": "./types.ts"
17
- },
18
- "./oauth": {
19
- "types": "./oauth.ts",
20
- "import": "./oauth.ts",
21
- "default": "./oauth.ts"
22
- }
23
- },
24
- "license": "MIT",
25
- "author": "Nico Bailon",
26
- "engines": {
27
- "node": ">=20"
28
- },
29
- "bin": {
30
- "pi-mcp-adapter": "cli.js"
31
- },
32
- "scripts": {
33
- "typecheck": "tsc --noEmit",
34
- "test": "vitest run",
35
- "test:watch": "vitest",
36
- "test:coverage": "vitest run --coverage",
37
- "test:oauth": "PI_MCP_ADAPTER_TEST_AUTH_STORE=memory PI_MCP_ADAPTER_DISABLE_AUTH_CACHE=1 node --import tsx --test --test-concurrency=1 oauth-public-api.test.ts mcp-auth.test.ts mcp-auth-flow.test.ts mcp-callback-server.test.ts mcp-oauth-provider.test.ts",
38
- "test:oauth-provider": "PI_MCP_ADAPTER_TEST_AUTH_STORE=memory PI_MCP_ADAPTER_DISABLE_AUTH_CACHE=1 node --import tsx --test mcp-oauth-provider.test.ts",
39
- "test:conformance": "bash conformance/run.sh"
40
- },
41
- "repository": {
42
- "type": "git",
43
- "url": "git+https://github.com/nicobailon/pi-mcp-adapter.git"
44
- },
45
- "keywords": [
46
- "pi-package",
47
- "pi",
48
- "mcp",
49
- "model-context-protocol",
50
- "ai",
51
- "coding-agent",
52
- "extension",
53
- "claude",
54
- "llm"
55
- ],
56
- "pi": {
57
- "extensions": [
58
- "./index.ts"
59
- ],
60
- "skills": [
61
- "./skills"
62
- ],
63
- "video": "https://github.com/nicobailon/pi-mcp-adapter/raw/refs/heads/main/pi-mcp.mp4"
64
- },
65
- "files": [
66
- "cli.js",
67
- "agent-dir.ts",
68
- "index.ts",
69
- "error-signal.ts",
70
- "state.ts",
71
- "utils.ts",
72
- "abort.ts",
73
- "runtime-owner.ts",
74
- "tool-metadata.ts",
75
- "ts-shape.ts",
76
- "search-ranking.ts",
77
- "tool-approval.ts",
78
- "init.ts",
79
- "ui-session.ts",
80
- "proxy-modes.ts",
81
- "direct-tools.ts",
82
- "commands.ts",
83
- "prompts.ts",
84
- "onboarding-state.ts",
85
- "mcp-setup-panel.ts",
86
- "types.ts",
87
- "ui-stream-types.ts",
88
- "ui-tool-visibility.ts",
89
- "ui-app-bridge-helpers.ts",
90
- "config.ts",
91
- "server-manager.ts",
92
- "unix-socket-transport.ts",
93
- "json-schema-validator.ts",
94
- "session-recovery.ts",
95
- "sampling-handler.ts",
96
- "elicitation-handler.ts",
97
- "tool-registrar.ts",
98
- "tool-result-renderer.ts",
99
- "mcp-output-guard.ts",
100
- "mcp-code.ts",
101
- "mcp-script-worker.mjs",
102
- "mcp-probe.ts",
103
- "agent-plugin-loader.ts",
104
- "resource-tools.ts",
105
- "lifecycle.ts",
106
- "mcp-status.ts",
107
- "metadata-cache.ts",
108
- "host-html-template.ts",
109
- "ui-resource-handler.ts",
110
- "consent-manager.ts",
111
- "ui-server.ts",
112
- "glimpse-ui.ts",
113
- "npx-resolver.ts",
114
- "oauth-handler.ts",
115
- "oauth.ts",
116
- "mcp-auth.ts",
117
- "mcp-keyring-helper.cjs",
118
- "mcp-oauth-provider.ts",
119
- "mcp-callback-server.ts",
120
- "mcp-auth-flow.ts",
121
- "mcp-panel.ts",
122
- "panel-keys.ts",
123
- "mcp-trace.ts",
124
- "logger.ts",
125
- "errors.ts",
126
- "app-bridge.bundle.js",
127
- "banner.png",
128
- "skills",
129
- "README.md",
130
- "CHANGELOG.md",
131
- "LICENSE"
132
- ],
133
- "dependencies": {
134
- "@modelcontextprotocol/client": "2.0.0",
135
- "@modelcontextprotocol/core": "2.0.0",
136
- "@modelcontextprotocol/ext-apps": "^1.2.2",
137
- "@napi-rs/keyring": "^1.3.0",
138
- "ajv": "^8.17.1",
139
- "ajv-formats": "^3.0.1",
140
- "cross-spawn": "^7.0.6",
141
- "open": "^10.2.0",
142
- "recheck": "^4.5.0",
143
- "smol-toml": "^1.6.1",
144
- "strip-json-comments": "^5.0.3",
145
- "zod": "^3.25.0 || ^4.0.0"
146
- },
147
- "peerDependencies": {
148
- "@earendil-works/pi-ai": "^0.84.1",
149
- "@earendil-works/pi-tui": "*",
150
- "typebox": "*",
151
- "zod": "^3.25.0 || ^4.0.0"
152
- },
153
- "peerDependenciesMeta": {
154
- "@earendil-works/pi-ai": {
155
- "optional": true
156
- },
157
- "@earendil-works/pi-tui": {
158
- "optional": true
159
- },
160
- "typebox": {
161
- "optional": true
162
- }
163
- },
164
- "devDependencies": {
165
- "@earendil-works/pi-ai": "^0.84.1",
166
- "@earendil-works/pi-coding-agent": "0.84.1",
167
- "@earendil-works/pi-tui": "^0.84.1",
168
- "@modelcontextprotocol/conformance": "0.1.16",
169
- "@types/bun": "^1.0.0",
170
- "@types/cross-spawn": "6.0.6",
171
- "@types/node": "20.19.43",
172
- "@types/open": "^6.2.1",
173
- "tsx": "^4.21.0",
174
- "typebox": "1.3.3",
175
- "typescript": "5.9.3",
176
- "vitest": "^3.0.0"
177
- }
2
+ "name": "pi-mcp-adapter",
3
+ "version": "2.26.0",
4
+ "description": "MCP (Model Context Protocol) adapter extension for Pi coding agent",
5
+ "type": "module",
6
+ "types": "./index.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./index.ts",
10
+ "import": "./index.ts",
11
+ "default": "./index.ts"
12
+ },
13
+ "./types": {
14
+ "types": "./types.ts",
15
+ "import": "./types.ts",
16
+ "default": "./types.ts"
17
+ },
18
+ "./oauth": {
19
+ "types": "./oauth.ts",
20
+ "import": "./oauth.ts",
21
+ "default": "./oauth.ts"
22
+ }
23
+ },
24
+ "license": "MIT",
25
+ "author": "Nico Bailon",
26
+ "engines": {
27
+ "node": ">=20"
28
+ },
29
+ "bin": {
30
+ "pi-mcp-adapter": "cli.js"
31
+ },
32
+ "scripts": {
33
+ "typecheck": "tsc --noEmit",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "test:coverage": "vitest run --coverage",
37
+ "test:oauth": "PI_MCP_ADAPTER_TEST_AUTH_STORE=memory PI_MCP_ADAPTER_DISABLE_AUTH_CACHE=1 node --import tsx --test --test-concurrency=1 oauth-public-api.test.ts mcp-auth.test.ts mcp-auth-flow.test.ts mcp-callback-server.test.ts mcp-oauth-provider.test.ts",
38
+ "test:oauth-provider": "PI_MCP_ADAPTER_TEST_AUTH_STORE=memory PI_MCP_ADAPTER_DISABLE_AUTH_CACHE=1 node --import tsx --test mcp-oauth-provider.test.ts",
39
+ "test:conformance": "bash conformance/run.sh"
40
+ },
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/nicobailon/pi-mcp-adapter.git"
44
+ },
45
+ "keywords": [
46
+ "pi-package",
47
+ "pi",
48
+ "mcp",
49
+ "model-context-protocol",
50
+ "ai",
51
+ "coding-agent",
52
+ "extension",
53
+ "claude",
54
+ "llm"
55
+ ],
56
+ "pi": {
57
+ "extensions": [
58
+ "./index.ts"
59
+ ],
60
+ "skills": [
61
+ "./skills"
62
+ ],
63
+ "video": "https://github.com/nicobailon/pi-mcp-adapter/raw/refs/heads/main/pi-mcp.mp4"
64
+ },
65
+ "files": [
66
+ "cli.js",
67
+ "agent-dir.ts",
68
+ "index.ts",
69
+ "error-signal.ts",
70
+ "state.ts",
71
+ "utils.ts",
72
+ "abort.ts",
73
+ "runtime-owner.ts",
74
+ "tool-metadata.ts",
75
+ "ts-shape.ts",
76
+ "search-ranking.ts",
77
+ "tool-approval.ts",
78
+ "init.ts",
79
+ "ui-session.ts",
80
+ "proxy-modes.ts",
81
+ "direct-tools.ts",
82
+ "commands.ts",
83
+ "prompts.ts",
84
+ "onboarding-state.ts",
85
+ "mcp-setup-panel.ts",
86
+ "types.ts",
87
+ "ui-stream-types.ts",
88
+ "ui-tool-visibility.ts",
89
+ "ui-app-bridge-helpers.ts",
90
+ "config.ts",
91
+ "server-manager.ts",
92
+ "request-headers-command.ts",
93
+ "unix-socket-transport.ts",
94
+ "json-schema-validator.ts",
95
+ "session-recovery.ts",
96
+ "sampling-handler.ts",
97
+ "elicitation-handler.ts",
98
+ "tool-registrar.ts",
99
+ "tool-result-renderer.ts",
100
+ "mcp-output-guard.ts",
101
+ "mcp-code.ts",
102
+ "mcp-script-worker.mjs",
103
+ "mcp-probe.ts",
104
+ "agent-plugin-loader.ts",
105
+ "resource-tools.ts",
106
+ "lifecycle.ts",
107
+ "mcp-status.ts",
108
+ "metadata-cache.ts",
109
+ "host-html-template.ts",
110
+ "ui-resource-handler.ts",
111
+ "consent-manager.ts",
112
+ "ui-server.ts",
113
+ "glimpse-ui.ts",
114
+ "npx-resolver.ts",
115
+ "oauth-handler.ts",
116
+ "oauth.ts",
117
+ "mcp-auth.ts",
118
+ "mcp-keyring-helper.cjs",
119
+ "mcp-oauth-provider.ts",
120
+ "mcp-callback-server.ts",
121
+ "mcp-auth-flow.ts",
122
+ "mcp-panel.ts",
123
+ "panel-keys.ts",
124
+ "mcp-trace.ts",
125
+ "logger.ts",
126
+ "errors.ts",
127
+ "app-bridge.bundle.js",
128
+ "banner.png",
129
+ "skills",
130
+ "README.md",
131
+ "CHANGELOG.md",
132
+ "LICENSE"
133
+ ],
134
+ "dependencies": {
135
+ "@modelcontextprotocol/client": "2.0.0",
136
+ "@modelcontextprotocol/core": "2.0.0",
137
+ "@modelcontextprotocol/ext-apps": "^1.2.2",
138
+ "@napi-rs/keyring": "^1.3.0",
139
+ "ajv": "^8.17.1",
140
+ "ajv-formats": "^3.0.1",
141
+ "cross-spawn": "^7.0.6",
142
+ "open": "^10.2.0",
143
+ "recheck": "^4.5.0",
144
+ "smol-toml": "^1.6.1",
145
+ "strip-json-comments": "^5.0.3",
146
+ "zod": "^3.25.0 || ^4.0.0"
147
+ },
148
+ "peerDependencies": {
149
+ "@earendil-works/pi-ai": "^0.84.1",
150
+ "@earendil-works/pi-tui": "*",
151
+ "typebox": "*",
152
+ "zod": "^3.25.0 || ^4.0.0"
153
+ },
154
+ "peerDependenciesMeta": {
155
+ "@earendil-works/pi-ai": {
156
+ "optional": true
157
+ },
158
+ "@earendil-works/pi-tui": {
159
+ "optional": true
160
+ },
161
+ "typebox": {
162
+ "optional": true
163
+ }
164
+ },
165
+ "devDependencies": {
166
+ "@earendil-works/pi-ai": "^0.84.1",
167
+ "@earendil-works/pi-coding-agent": "0.84.1",
168
+ "@earendil-works/pi-tui": "^0.84.1",
169
+ "@modelcontextprotocol/conformance": "0.1.16",
170
+ "@types/bun": "^1.0.0",
171
+ "@types/cross-spawn": "6.0.6",
172
+ "@types/node": "20.19.43",
173
+ "@types/open": "^6.2.1",
174
+ "tsx": "^4.21.0",
175
+ "typebox": "1.3.3",
176
+ "typescript": "5.9.3",
177
+ "vitest": "^3.0.0"
178
+ }
178
179
  }