pi-ui-extend 0.1.50 → 0.1.53
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/dist/app/icons.d.ts +1 -0
- package/dist/app/icons.js +2 -0
- package/dist/app/input/autocomplete-controller.js +1 -1
- package/dist/app/input/input-controller.d.ts +1 -0
- package/dist/app/input/input-controller.js +7 -24
- package/dist/app/input/input-paste-handler.d.ts +1 -0
- package/dist/app/input/input-paste-handler.js +13 -16
- package/dist/app/rendering/conversation-tool-renderer.js +1 -0
- package/dist/app/rendering/popup-menu-renderer.js +2 -2
- package/dist/app/rendering/render-controller.js +10 -16
- package/dist/app/rendering/status-line-renderer.d.ts +0 -7
- package/dist/app/rendering/status-line-renderer.js +7 -79
- package/dist/app/rendering/tab-line-renderer.js +1 -1
- package/dist/app/rendering/toast-renderer.js +40 -15
- package/dist/app/rendering/tool-block-renderer.d.ts +2 -1
- package/dist/app/rendering/tool-block-renderer.js +43 -3
- package/dist/app/screen/mouse-controller.d.ts +1 -0
- package/dist/app/screen/mouse-controller.js +30 -76
- package/dist/app/session/lazy-session-manager.js +0 -7
- package/dist/app/session/queued-message-controller.d.ts +0 -1
- package/dist/app/session/queued-message-controller.js +5 -13
- package/dist/app/session/queued-message-entries.d.ts +1 -0
- package/dist/app/session/queued-message-entries.js +8 -0
- package/dist/app/session/tabs-controller.d.ts +2 -1
- package/dist/app/session/tabs-controller.js +67 -24
- package/dist/app/types.d.ts +1 -0
- package/dist/bundled-extensions/question/tool-description.js +2 -3
- package/dist/bundled-extensions/session-title/title-generation.js +1 -1
- package/dist/tool-renderers/compress.js +28 -7
- package/dist/tool-renderers/patch-normalize.js +4 -4
- package/dist/tool-renderers/read.js +1 -1
- package/dist/tool-renderers/types.d.ts +10 -0
- package/external/pi-tools-suite/package.json +3 -3
- package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +6 -10
- package/external/pi-tools-suite/src/async-subagents/core/cleanup.ts +2 -2
- package/external/pi-tools-suite/src/async-subagents/core/paths.ts +12 -0
- package/external/pi-tools-suite/src/async-subagents/core/registry.ts +3 -4
- package/external/pi-tools-suite/src/async-subagents/core/routing.ts +1 -1
- package/external/pi-tools-suite/src/async-subagents/core/sessions.ts +2 -2
- package/external/pi-tools-suite/src/async-subagents/core/state.ts +3 -3
- package/external/pi-tools-suite/src/async-subagents/core/ultrawork-auto.ts +1 -1
- package/external/pi-tools-suite/src/async-subagents/lib.ts +1 -1
- package/external/pi-tools-suite/src/coding-discipline/index.ts +13 -23
- package/external/pi-tools-suite/src/dcp/auto-compress.ts +1 -1
- package/external/pi-tools-suite/src/dcp/prompts.ts +9 -49
- package/external/pi-tools-suite/src/tool-descriptions.ts +34 -61
- package/package.json +4 -4
|
@@ -29,9 +29,8 @@ export const COMPRESS_TOOL_DESCRIPTION: ToolDescription = {
|
|
|
29
29
|
description: COMPRESS_RANGE_DESCRIPTION,
|
|
30
30
|
promptSnippet: "Use compress for context-pressure housekeeping: summarize closed, high-yield stale slices when context is meaningfully high or a DCP reminder gives concrete candidates; do not compress just because low-context work produced a small closed slice.",
|
|
31
31
|
promptGuidelines: [
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"Keep active, still-needed context raw; compress only closed ranges whose exact content is unlikely to be needed next.",
|
|
32
|
+
"Compression candidates: completed implementation, verification, config/doc edits, answered exploration, dead ends, and log inspection when large/stale or context pressure is meaningful; Low context usage by itself does not require compression.",
|
|
33
|
+
"Summarize large stale shell/read/repo/web outputs, diffs, and passing logs once exact text is no longer useful; keep active or still-needed context raw.",
|
|
35
34
|
],
|
|
36
35
|
};
|
|
37
36
|
|
|
@@ -43,10 +42,8 @@ export function astGrepToolDescriptions(maxLines: number, maxBytesLabel: string)
|
|
|
43
42
|
description: `Read-only AST structural search/scan. Use for language-aware patterns, sgconfig/rule scans, JSON matches, and rewrite previews. Use text search for plain strings and ast_apply for mutations. Output truncates at ${maxLines} lines or ${maxBytesLabel} with full output saved to a temp file.`,
|
|
44
43
|
promptSnippet: "Use ast_grep for AST/structural code search, not plain text search. It previews rewrites only; use ast_apply to mutate files.",
|
|
45
44
|
promptGuidelines: [
|
|
46
|
-
"Use ast_grep when syntax/AST structure matters; use
|
|
47
|
-
"
|
|
48
|
-
"ast_grep is read-only: use rewrite to preview replacements, never to apply them.",
|
|
49
|
-
"Use ast_apply for intended ast-grep rewrites or scan fixes; use command=scan with rule, inlineRules, or config for rule-based scans.",
|
|
45
|
+
"Use ast_grep when syntax/AST structure matters; use text search for exact strings/regex. Keep paths/globs narrow and set lang for ambiguous snippets.",
|
|
46
|
+
"ast_grep is read-only: use rewrite to preview only; use ast_apply for mutations or command=scan fixes.",
|
|
50
47
|
],
|
|
51
48
|
},
|
|
52
49
|
astApply: {
|
|
@@ -55,9 +52,8 @@ export function astGrepToolDescriptions(maxLines: number, maxBytesLabel: string)
|
|
|
55
52
|
description: `Mutating AST rewrite/fix tool powered by ast-grep. Use for structural replacements or scan fixes after you know the pattern/rule is correct. Reports changedFiles for post-edit diagnostics and truncates output at ${maxLines} lines or ${maxBytesLabel}.`,
|
|
56
53
|
promptSnippet: "Use ast_apply only when you intend to mutate files with ast-grep structural rewrites or scan fixes.",
|
|
57
54
|
promptGuidelines: [
|
|
58
|
-
"Use ast_apply for AST-aware bulk edits, not simple one-off text replacements.",
|
|
59
|
-
"
|
|
60
|
-
"Run ast_grep first when the match set is uncertain; use ast_apply directly only for obvious, scoped rewrites.",
|
|
55
|
+
"Use ast_apply for AST-aware bulk edits, not simple one-off text replacements; preview with ast_grep when matches are uncertain.",
|
|
56
|
+
"Pattern rewrites: command=run with pattern/rewrite/lang; rule fixes: command=scan with rule, inlineRules, or config.",
|
|
61
57
|
],
|
|
62
58
|
},
|
|
63
59
|
} satisfies Record<string, ToolDescription>;
|
|
@@ -87,24 +83,18 @@ export function asyncSubagentToolDescriptions(options: ToolDescriptionSetOptions
|
|
|
87
83
|
? "For one semantic code-discovery question, use repo_search; for independent tracks/hypotheses/review axes, delegate even when repo_* tools exist. Read result only after completion when findings are needed."
|
|
88
84
|
: "For one focused code-discovery question, use direct read/grep. Without repo_* tools, spawn several focused scan/quick agents first for broad multi-track discovery, incident triage, release readiness, risk strategy, or parallel reviews. Read result only after completion when findings are needed."),
|
|
89
85
|
promptGuidelines: [
|
|
90
|
-
"Use action='spawn' only for LARGE
|
|
91
|
-
"Treat explicit requests to delegate, use sub-agents, run parallel agents, split into independent tracks, investigate hypotheses, or run separate review axes as spawn triggers; spawn first unless the request is trivial or clearly single-file.",
|
|
86
|
+
"Use action='spawn' only for LARGE/PARALLEL work: independent investigations, repo-wide sweeps, deep debugging, code review/audit, or explicit delegate/parallelize/split requests; these are spawn triggers unless trivial/single-file.",
|
|
92
87
|
repoDiscovery
|
|
93
|
-
? "For one discovery question, use repo_search; spawn
|
|
94
|
-
: "For one discovery question, use direct read/grep;
|
|
88
|
+
? "For one discovery question, use repo_search; spawn for independent tracks/hypotheses/review axes, and do not let repo_* availability suppress delegation."
|
|
89
|
+
: "For one discovery question, use direct read/grep; when repo_* tools are unavailable, spawn several focused scan/quick agents first for broad multi-file/module/hypothesis work.",
|
|
95
90
|
repoDiscovery
|
|
96
|
-
? "For incident triage, release readiness, or risk/test strategy with separate hypotheses
|
|
97
|
-
: "For incident triage, release readiness, or risk/test strategy with separate hypotheses
|
|
91
|
+
? "For incident triage, release readiness, or risk/test strategy with separate hypotheses/review tracks, prefer focused agents over serial parent-context work."
|
|
92
|
+
: "For incident triage, release readiness, or risk/test strategy with separate hypotheses/review tracks and no repo_* tools, call action='spawn' as the first discovery step; direct read/grep can follow.",
|
|
98
93
|
"Do not use subagents for exact-string lookups, known-file edits, typo/text replacements, obvious one-file changes, or interactive user input; use the cheapest direct path.",
|
|
99
|
-
"Spawn multiple focused agents in one action='spawn' call for independent questions; for
|
|
100
|
-
"For spawn, leave subagentType unset so the router chooses from configured roles. Set it only for user-named roles, deterministic tests, or another concrete override.",
|
|
101
|
-
"Use subagentType='oracle' sparingly for cross-provider second opinions on high-stakes uncertainty or final plan/risk checks.",
|
|
94
|
+
"Spawn multiple focused agents in one action='spawn' call for independent questions; for bounded probes set timeoutSeconds; omit subagentType unless user-named/deterministic, and use oracle sparingly for high-stakes uncertainty/final checks.",
|
|
102
95
|
"For screenshot/image inspection by blind models, use lookup; subagents only receive imagePaths when a broader delegated track genuinely needs them.",
|
|
103
|
-
"If
|
|
104
|
-
"Use
|
|
105
|
-
"Result output is compact with artifact links; inspect raw artifacts only when full details are necessary.",
|
|
106
|
-
"Use action='stop' when the user asks to stop, cancel, or kill running sub-agents.",
|
|
107
|
-
"Use action='cleanup' with delete=true after collecting all results to free disk space.",
|
|
96
|
+
"If asked to start/run/launch/test parallel sub-agents, spawn and stop; do not status/wait just for progress. Use status for recovery, wait only when needed/requested, result only after completion; compact results include artifact links.",
|
|
97
|
+
"Use action='stop' for stop/cancel/kill requests and action='cleanup' with delete=true only after collecting results.",
|
|
108
98
|
],
|
|
109
99
|
},
|
|
110
100
|
spawnAction: {
|
|
@@ -158,9 +148,8 @@ export const REPO_DISCOVERY_TOOLS: RepoDiscoveryToolDescription[] = [
|
|
|
158
148
|
description: "Indexed repo architecture map: entrypoints, module boundaries, cycles, and unresolved dependency classes. Use before broad reads in unfamiliar codebases; skip for exact-string lookups, known-file edits, or other trivial changes.",
|
|
159
149
|
promptSnippet: "Use repo_architecture for a compact indexed architecture overview before broad multi-file reads, not for simple literal searches or small known-scope edits.",
|
|
160
150
|
promptGuidelines: [
|
|
161
|
-
"
|
|
162
|
-
"
|
|
163
|
-
"Use repo_structure for file/symbol listings and repo_search for behavior questions after this overview.",
|
|
151
|
+
"Exact strings, filenames, known symbols, typo/text replacements, or obvious one-file edits: skip repo_architecture and use direct text search/read/edit.",
|
|
152
|
+
"Broad unfamiliar codebase: make one narrow repo_architecture call first, add --path-prefix when a subsystem is known, then use repo_structure for files/symbols and repo_search for behavior.",
|
|
164
153
|
],
|
|
165
154
|
},
|
|
166
155
|
{
|
|
@@ -170,8 +159,7 @@ export const REPO_DISCOVERY_TOOLS: RepoDiscoveryToolDescription[] = [
|
|
|
170
159
|
description: "Indexed file tree and exported-symbol view for a directory/module. Use to choose files/ranges without dumping source.",
|
|
171
160
|
promptSnippet: "Use repo_structure for file trees, module contents, and exported symbols; narrow with idx flags.",
|
|
172
161
|
promptGuidelines: [
|
|
173
|
-
"Pass --path-prefix, --kind, --max-files, or --max-depth
|
|
174
|
-
"Use repo_ast for one large file's syntax map and repo_search for semantic behavior discovery.",
|
|
162
|
+
"Pass --path-prefix, --kind, --max-files, or --max-depth when useful; use repo_ast for one large file's syntax map and repo_search for semantic behavior discovery.",
|
|
175
163
|
],
|
|
176
164
|
},
|
|
177
165
|
{
|
|
@@ -181,8 +169,7 @@ export const REPO_DISCOVERY_TOOLS: RepoDiscoveryToolDescription[] = [
|
|
|
181
169
|
description: "Indexed AST map for one file. Use before repeated reads of a large file or when parent syntax structure matters.",
|
|
182
170
|
promptSnippet: "Use repo_ast with target=<file> to map one large file before choosing exact ranges to read.",
|
|
183
171
|
promptGuidelines: [
|
|
184
|
-
"Use
|
|
185
|
-
"Pass --max-depth or --max-nodes in args to keep the AST map compact.",
|
|
172
|
+
"Use for one known file, not repo-wide search; pass --max-depth or --max-nodes to keep output compact.",
|
|
186
173
|
],
|
|
187
174
|
targetDescription: "File path to map, e.g. src/api/client.ts.",
|
|
188
175
|
},
|
|
@@ -193,11 +180,9 @@ export const REPO_DISCOVERY_TOOLS: RepoDiscoveryToolDescription[] = [
|
|
|
193
180
|
description: "Indexed hybrid/semantic repository search for behavior questions when exact identifiers or files are unknown. Use natural-language behavior queries, not synonym dumps. Defaults to hybrid ranking; read returned ranges next.",
|
|
194
181
|
promptSnippet: "Use repo_search for conceptual codebase questions; query for behavior, not a bag of synonyms. Leave default hybrid ranking for first-pass searches and use Grep/read when exact names or positions are known.",
|
|
195
182
|
promptGuidelines: [
|
|
196
|
-
"Phrase target as
|
|
197
|
-
"
|
|
198
|
-
"
|
|
199
|
-
"Use a specific conceptual target and narrow with --path-prefix, --max-files, --dedupe-file, or --exclude-tests when useful.",
|
|
200
|
-
"For bug/cause questions, stop when a read range shows the causal assignment/write/branch/call; continue only for a named gap such as callers, persistence, tests, or requested impact, and narrow follow-ups.",
|
|
183
|
+
"Phrase target as behavior, not synonym dumps; keep exact identifiers only as anchors. Prefer default hybrid first, using --mode semantic only when lexical/symbol terms mislead.",
|
|
184
|
+
"Make one targeted search, narrow with --path-prefix/--max-files/--dedupe-file/--exclude-tests when useful, read best ranges, then refine only for a named gap; avoid duplicate broad searches.",
|
|
185
|
+
"For bug/cause questions, stop when a read range shows the causal assignment/write/branch/call; continue only for named gaps such as callers, persistence, tests, or requested impact.",
|
|
201
186
|
],
|
|
202
187
|
targetDescription: "Natural-language behavior query, e.g. auth session token validation.",
|
|
203
188
|
},
|
|
@@ -208,8 +193,7 @@ export const REPO_DISCOVERY_TOOLS: RepoDiscoveryToolDescription[] = [
|
|
|
208
193
|
description: "Indexed explanation for a known symbol. Prefer file::symbol when the name may be ambiguous.",
|
|
209
194
|
promptSnippet: "Use repo_explain for a known symbol after you already know its name or file scope.",
|
|
210
195
|
promptGuidelines: [
|
|
211
|
-
"Prefer target=file::symbol for ambiguous names.",
|
|
212
|
-
"Use repo_search instead when you do not yet know the relevant symbol.",
|
|
196
|
+
"Prefer target=file::symbol for ambiguous names; use repo_search instead when the relevant symbol is still unknown.",
|
|
213
197
|
],
|
|
214
198
|
targetDescription: "Symbol or file-scoped symbol, e.g. createClient or src/api/client.ts::createClient.",
|
|
215
199
|
},
|
|
@@ -220,8 +204,7 @@ export const REPO_DISCOVERY_TOOLS: RepoDiscoveryToolDescription[] = [
|
|
|
220
204
|
description: "Indexed dependency/caller tracing for a known path or symbol. Use for import impact and first-hop call/dependency analysis.",
|
|
221
205
|
promptSnippet: "Use repo_deps with target=<path|path::symbol> to trace imports, imported-by, callers, or callees.",
|
|
222
206
|
promptGuidelines: [
|
|
223
|
-
"
|
|
224
|
-
"Use repo_search first when you do not yet know the target path or symbol.",
|
|
207
|
+
"Use repo_search first when path/symbol is unknown. Otherwise start --depth 1; add --direction, --mode calls, or --show-edges only when needed.",
|
|
225
208
|
],
|
|
226
209
|
targetDescription: "Path or file-scoped symbol, e.g. src/api/client.ts or src/api/client.ts::createClient.",
|
|
227
210
|
},
|
|
@@ -237,18 +220,13 @@ export const TODO_TOOL_DESCRIPTION: ToolDescription = {
|
|
|
237
220
|
promptGuidelines: [
|
|
238
221
|
"Use `todo` for complex work with 3+ steps, explicit user task lists, or new non-trivial requirements. Skip single trivial tasks and purely conversational requests.",
|
|
239
222
|
"For multi-step implementation/debugging plans, include a final user-facing report todo in the initial plan with acceptance criteria for changed files/behavior, verification results, and remaining manual actions; close it immediately before the final response, never via compression.",
|
|
240
|
-
"Resync before continuing when
|
|
241
|
-
"Update todos when
|
|
242
|
-
"
|
|
243
|
-
"
|
|
244
|
-
"
|
|
245
|
-
"
|
|
246
|
-
"
|
|
247
|
-
"Use batch_create/batch_update for large explicit plans, but still keep exactly one visible task in_progress unless the user asks otherwise.",
|
|
248
|
-
"When starting a new plan that supersedes existing unfinished todos, use batch_create with replace:true instead of appending; only omit replace when intentionally extending the current plan.",
|
|
249
|
-
"list hides deleted tombstones unless includeDeleted:true; use status/blockedOnly filters only when needed. Use export/import for handoff or migration; import with replace:true only when explicitly overwriting todo state.",
|
|
250
|
-
"When every visible todo is completed, todo state clears automatically; do not call clear afterward just to remove completed tasks.",
|
|
251
|
-
"Persistence uses `/todos persist on|off|status` or `/todos-persist on|off|status`; when resuming, ask which ids are in scope and run `/todos scope <id...>` or `/todos-scope <id...>` so out-of-scope active tasks are deferred.",
|
|
223
|
+
"Resync before continuing when user/new findings change scope, requirements, safety, feasibility, approach, dependencies, or order; update tasks/blockers and defer obsolete work.",
|
|
224
|
+
"Update todos when starting, finishing, blocking, splitting, abandoning, or materially changing a step; before planned work mark exactly one in_progress with activeForm and complete it only after verification.",
|
|
225
|
+
"If partial, tests fail, or blocked, keep the task in_progress and add/update a blocker. Never use `clear`, `delete`, or batch deletion to hide unfinished/stale/forgotten todos; delete only on explicit request or creation mistake.",
|
|
226
|
+
"Before a final response after using todos, ensure each visible todo is completed, deferred, or intentionally still in_progress with explanation; do not leave a just-finished item in_progress.",
|
|
227
|
+
"Keep subjects short; use parentId/blockers for hierarchy/dependencies. For large explicit plans use batch_create/batch_update but keep exactly one visible in_progress unless asked otherwise; use batch_create replace:true only for superseding plans.",
|
|
228
|
+
"list hides tombstones unless includeDeleted:true; use status/blockedOnly only when needed; export/import for handoff, import replace:true only when explicitly overwriting; when all visible todos complete, state clears automatically.",
|
|
229
|
+
"Persistence: `/todos persist on|off|status` or `/todos-persist on|off|status`; on resume, ask in-scope ids and run `/todos scope <id...>` or `/todos-scope <id...>` so out-of-scope active tasks are deferred.",
|
|
252
230
|
],
|
|
253
231
|
};
|
|
254
232
|
|
|
@@ -258,8 +236,7 @@ export const SESSION_NAME_TOOL_DESCRIPTION: ToolDescription = {
|
|
|
258
236
|
description: "Show or set the current session name so the agent can retitle the active session without relying on slash-command parsing.",
|
|
259
237
|
promptSnippet: "Use session_name to rename the current session directly when the task calls for updating the session title.",
|
|
260
238
|
promptGuidelines: [
|
|
261
|
-
"Pass a short, user-meaningful name
|
|
262
|
-
"Call without a name only when you need to read the current session name.",
|
|
239
|
+
"Pass a short, user-meaningful name to rename; call without a name only to read the current session name.",
|
|
263
240
|
],
|
|
264
241
|
};
|
|
265
242
|
|
|
@@ -271,10 +248,8 @@ export const WEB_SEARCH_TOOL_DESCRIPTIONS = {
|
|
|
271
248
|
"Search the web for real-time information using your local Ollama instance's web_search API. Requires Ollama running locally with web search enabled; supports per-call timeout_ms and PI_WEB_SEARCH_TIMEOUT_MS.",
|
|
272
249
|
promptSnippet: "Search the web for current or real-time information through the local Ollama web_search API.",
|
|
273
250
|
promptGuidelines: [
|
|
274
|
-
"Use web_search
|
|
275
|
-
"
|
|
276
|
-
"Do not include secrets, tokens, or private repository data in web_search queries.",
|
|
277
|
-
"Do not use web_search for repository-local code discovery; use repo_* or file/search tools instead.",
|
|
251
|
+
"Use web_search only for current public web information; keep queries focused and set max_results only when useful.",
|
|
252
|
+
"Never include secrets, tokens, or private repository data; do not use web_search for repo-local discovery—use repo_* or file/search tools.",
|
|
278
253
|
],
|
|
279
254
|
},
|
|
280
255
|
webFetch: {
|
|
@@ -284,9 +259,7 @@ export const WEB_SEARCH_TOOL_DESCRIPTIONS = {
|
|
|
284
259
|
"Fetch and extract text content from a web page URL using your local Ollama instance's web_fetch API. Requires Ollama running locally with web fetch enabled; supports per-call timeout_ms and PI_WEB_SEARCH_TIMEOUT_MS.",
|
|
285
260
|
promptSnippet: "Fetch and extract text from a specific URL through the local Ollama web_fetch API.",
|
|
286
261
|
promptGuidelines: [
|
|
287
|
-
"Use web_fetch
|
|
288
|
-
"Do not pass URLs containing secrets or private credentials to web_fetch.",
|
|
289
|
-
"Do not use web_fetch as a generic repository file reader; use read for local files.",
|
|
262
|
+
"Use web_fetch for user-provided URLs or web_search results needing deeper reading; never pass secret/private-credential URLs, and use read for local files.",
|
|
290
263
|
],
|
|
291
264
|
},
|
|
292
265
|
} satisfies Record<string, ToolDescription>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-ui-extend",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.53",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -64,9 +64,9 @@
|
|
|
64
64
|
"prepublishOnly": "npm run check && npm run build:pix && npm run generate-schemas"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@earendil-works/pi-ai": "0.
|
|
68
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
69
|
-
"@earendil-works/pi-tui": "0.
|
|
67
|
+
"@earendil-works/pi-ai": "0.80.2",
|
|
68
|
+
"@earendil-works/pi-coding-agent": "0.80.2",
|
|
69
|
+
"@earendil-works/pi-tui": "0.80.2",
|
|
70
70
|
"@mariozechner/clipboard": "^0.3.9",
|
|
71
71
|
"jsonc-parser": "3.3.1",
|
|
72
72
|
"typebox": "1.1.38",
|