pi-ui-extend 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +307 -0
- package/bin/pix.mjs +219 -0
- package/dist/app/app.d.ts +96 -0
- package/dist/app/app.js +871 -0
- package/dist/app/blink-controller.d.ts +23 -0
- package/dist/app/blink-controller.js +82 -0
- package/dist/app/cli.d.ts +8 -0
- package/dist/app/cli.js +83 -0
- package/dist/app/clipboard.d.ts +1 -0
- package/dist/app/clipboard.js +24 -0
- package/dist/app/command-controller.d.ts +18 -0
- package/dist/app/command-controller.js +58 -0
- package/dist/app/command-host.d.ts +44 -0
- package/dist/app/command-host.js +1 -0
- package/dist/app/command-model-actions.d.ts +12 -0
- package/dist/app/command-model-actions.js +176 -0
- package/dist/app/command-navigation-actions.d.ts +19 -0
- package/dist/app/command-navigation-actions.js +267 -0
- package/dist/app/command-registry.d.ts +32 -0
- package/dist/app/command-registry.js +225 -0
- package/dist/app/command-runtime.d.ts +5 -0
- package/dist/app/command-runtime.js +32 -0
- package/dist/app/command-session-actions.d.ts +20 -0
- package/dist/app/command-session-actions.js +295 -0
- package/dist/app/constants.d.ts +52 -0
- package/dist/app/constants.js +103 -0
- package/dist/app/conversation-entry-renderer.d.ts +21 -0
- package/dist/app/conversation-entry-renderer.js +81 -0
- package/dist/app/conversation-shell-renderer.d.ts +5 -0
- package/dist/app/conversation-shell-renderer.js +43 -0
- package/dist/app/conversation-tool-renderer.d.ts +16 -0
- package/dist/app/conversation-tool-renderer.js +216 -0
- package/dist/app/conversation-viewport.d.ts +55 -0
- package/dist/app/conversation-viewport.js +252 -0
- package/dist/app/dcp-stats.d.ts +2 -0
- package/dist/app/dcp-stats.js +116 -0
- package/dist/app/editor-layout-renderer.d.ts +31 -0
- package/dist/app/editor-layout-renderer.js +211 -0
- package/dist/app/editor-panels.d.ts +4 -0
- package/dist/app/editor-panels.js +130 -0
- package/dist/app/extension-actions-controller.d.ts +22 -0
- package/dist/app/extension-actions-controller.js +60 -0
- package/dist/app/extension-event-bus.d.ts +3 -0
- package/dist/app/extension-event-bus.js +23 -0
- package/dist/app/extension-ui-controller.d.ts +57 -0
- package/dist/app/extension-ui-controller.js +532 -0
- package/dist/app/file-link-opener.d.ts +2 -0
- package/dist/app/file-link-opener.js +66 -0
- package/dist/app/file-links.d.ts +10 -0
- package/dist/app/file-links.js +117 -0
- package/dist/app/guards.d.ts +3 -0
- package/dist/app/guards.js +9 -0
- package/dist/app/icons.d.ts +37 -0
- package/dist/app/icons.js +97 -0
- package/dist/app/id.d.ts +1 -0
- package/dist/app/id.js +4 -0
- package/dist/app/image-click-targets.d.ts +5 -0
- package/dist/app/image-click-targets.js +32 -0
- package/dist/app/image-opener.d.ts +2 -0
- package/dist/app/image-opener.js +64 -0
- package/dist/app/input-action-controller.d.ts +47 -0
- package/dist/app/input-action-controller.js +209 -0
- package/dist/app/input-controller.d.ts +60 -0
- package/dist/app/input-controller.js +425 -0
- package/dist/app/input-paste-handler.d.ts +27 -0
- package/dist/app/input-paste-handler.js +146 -0
- package/dist/app/menu-items-controller.d.ts +32 -0
- package/dist/app/menu-items-controller.js +182 -0
- package/dist/app/message-content.d.ts +8 -0
- package/dist/app/message-content.js +115 -0
- package/dist/app/model-ref.d.ts +13 -0
- package/dist/app/model-ref.js +50 -0
- package/dist/app/model-usage-controller.d.ts +35 -0
- package/dist/app/model-usage-controller.js +99 -0
- package/dist/app/model-usage-status.d.ts +125 -0
- package/dist/app/model-usage-status.js +749 -0
- package/dist/app/mouse-controller.d.ts +182 -0
- package/dist/app/mouse-controller.js +968 -0
- package/dist/app/native-modifiers.d.ts +3 -0
- package/dist/app/native-modifiers.js +60 -0
- package/dist/app/nerd-font-controller.d.ts +11 -0
- package/dist/app/nerd-font-controller.js +90 -0
- package/dist/app/popup-action-controller.d.ts +44 -0
- package/dist/app/popup-action-controller.js +278 -0
- package/dist/app/popup-menu-controller.d.ts +183 -0
- package/dist/app/popup-menu-controller.js +1070 -0
- package/dist/app/prompt-enhancer-controller.d.ts +40 -0
- package/dist/app/prompt-enhancer-controller.js +215 -0
- package/dist/app/queued-message-controller.d.ts +62 -0
- package/dist/app/queued-message-controller.js +377 -0
- package/dist/app/render-controller.d.ts +41 -0
- package/dist/app/render-controller.js +378 -0
- package/dist/app/render-text.d.ts +19 -0
- package/dist/app/render-text.js +67 -0
- package/dist/app/request-history.d.ts +23 -0
- package/dist/app/request-history.js +131 -0
- package/dist/app/runtime.d.ts +39 -0
- package/dist/app/runtime.js +195 -0
- package/dist/app/screen-selection.d.ts +6 -0
- package/dist/app/screen-selection.js +9 -0
- package/dist/app/screen-styler.d.ts +34 -0
- package/dist/app/screen-styler.js +168 -0
- package/dist/app/scroll-controller.d.ts +51 -0
- package/dist/app/scroll-controller.js +207 -0
- package/dist/app/session-event-controller.d.ts +69 -0
- package/dist/app/session-event-controller.js +338 -0
- package/dist/app/session-history.d.ts +23 -0
- package/dist/app/session-history.js +164 -0
- package/dist/app/session-lifecycle-controller.d.ts +55 -0
- package/dist/app/session-lifecycle-controller.js +116 -0
- package/dist/app/session-search.d.ts +24 -0
- package/dist/app/session-search.js +215 -0
- package/dist/app/shell-command.d.ts +27 -0
- package/dist/app/shell-command.js +176 -0
- package/dist/app/shell-controller.d.ts +28 -0
- package/dist/app/shell-controller.js +124 -0
- package/dist/app/slash-commands.d.ts +6 -0
- package/dist/app/slash-commands.js +75 -0
- package/dist/app/startup-checks.d.ts +8 -0
- package/dist/app/startup-checks.js +59 -0
- package/dist/app/startup-info.d.ts +3 -0
- package/dist/app/startup-info.js +176 -0
- package/dist/app/status-controller.d.ts +35 -0
- package/dist/app/status-controller.js +105 -0
- package/dist/app/status-line-renderer.d.ts +68 -0
- package/dist/app/status-line-renderer.js +453 -0
- package/dist/app/subagents-files.d.ts +10 -0
- package/dist/app/subagents-files.js +193 -0
- package/dist/app/subagents-model.d.ts +23 -0
- package/dist/app/subagents-model.js +224 -0
- package/dist/app/subagents-widget-controller.d.ts +43 -0
- package/dist/app/subagents-widget-controller.js +311 -0
- package/dist/app/tab-line-renderer.d.ts +26 -0
- package/dist/app/tab-line-renderer.js +222 -0
- package/dist/app/tabs-controller.d.ts +100 -0
- package/dist/app/tabs-controller.js +885 -0
- package/dist/app/terminal-controller.d.ts +40 -0
- package/dist/app/terminal-controller.js +135 -0
- package/dist/app/terminal-edit-shortcuts.d.ts +23 -0
- package/dist/app/terminal-edit-shortcuts.js +138 -0
- package/dist/app/terminal-output-buffer.d.ts +20 -0
- package/dist/app/terminal-output-buffer.js +52 -0
- package/dist/app/toast-controller.d.ts +13 -0
- package/dist/app/toast-controller.js +40 -0
- package/dist/app/toast-renderer.d.ts +9 -0
- package/dist/app/toast-renderer.js +79 -0
- package/dist/app/todo-model.d.ts +22 -0
- package/dist/app/todo-model.js +179 -0
- package/dist/app/todo-widget-controller.d.ts +21 -0
- package/dist/app/todo-widget-controller.js +59 -0
- package/dist/app/tool-block-renderer.d.ts +26 -0
- package/dist/app/tool-block-renderer.js +439 -0
- package/dist/app/types.d.ts +550 -0
- package/dist/app/types.js +1 -0
- package/dist/app/update.d.ts +36 -0
- package/dist/app/update.js +315 -0
- package/dist/app/voice-controller.d.ts +52 -0
- package/dist/app/voice-controller.js +600 -0
- package/dist/app/workspace-actions-controller.d.ts +40 -0
- package/dist/app/workspace-actions-controller.js +215 -0
- package/dist/app/workspace-undo.d.ts +44 -0
- package/dist/app/workspace-undo.js +215 -0
- package/dist/config.d.ts +62 -0
- package/dist/config.js +527 -0
- package/dist/context-progress-bar.d.ts +17 -0
- package/dist/context-progress-bar.js +48 -0
- package/dist/default-pix-config.d.ts +1 -0
- package/dist/default-pix-config.js +375 -0
- package/dist/fuzzy.d.ts +23 -0
- package/dist/fuzzy.js +165 -0
- package/dist/input-editor-files.d.ts +15 -0
- package/dist/input-editor-files.js +62 -0
- package/dist/input-editor.d.ts +186 -0
- package/dist/input-editor.js +835 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +12 -0
- package/dist/markdown-format.d.ts +22 -0
- package/dist/markdown-format.js +542 -0
- package/dist/sdk.d.ts +3 -0
- package/dist/sdk.js +1 -0
- package/dist/syntax-highlight.d.ts +22 -0
- package/dist/syntax-highlight.js +528 -0
- package/dist/terminal-width.d.ts +6 -0
- package/dist/terminal-width.js +245 -0
- package/dist/theme.d.ts +56 -0
- package/dist/theme.js +118 -0
- package/dist/tool-renderers/apply-patch.d.ts +2 -0
- package/dist/tool-renderers/apply-patch.js +36 -0
- package/dist/tool-renderers/ast.d.ts +2 -0
- package/dist/tool-renderers/ast.js +5 -0
- package/dist/tool-renderers/compress.d.ts +2 -0
- package/dist/tool-renderers/compress.js +126 -0
- package/dist/tool-renderers/index.d.ts +3 -0
- package/dist/tool-renderers/index.js +44 -0
- package/dist/tool-renderers/question.d.ts +2 -0
- package/dist/tool-renderers/question.js +88 -0
- package/dist/tool-renderers/read.d.ts +2 -0
- package/dist/tool-renderers/read.js +36 -0
- package/dist/tool-renderers/repo.d.ts +2 -0
- package/dist/tool-renderers/repo.js +13 -0
- package/dist/tool-renderers/shell.d.ts +3 -0
- package/dist/tool-renderers/shell.js +27 -0
- package/dist/tool-renderers/skill.d.ts +2 -0
- package/dist/tool-renderers/skill.js +132 -0
- package/dist/tool-renderers/subagents.d.ts +2 -0
- package/dist/tool-renderers/subagents.js +51 -0
- package/dist/tool-renderers/todo.d.ts +2 -0
- package/dist/tool-renderers/todo.js +9 -0
- package/dist/tool-renderers/types.d.ts +42 -0
- package/dist/tool-renderers/types.js +1 -0
- package/dist/tool-renderers/utils.d.ts +31 -0
- package/dist/tool-renderers/utils.js +230 -0
- package/dist/tool-renderers/web.d.ts +3 -0
- package/dist/tool-renderers/web.js +9 -0
- package/dist/tool-renderers/write.d.ts +2 -0
- package/dist/tool-renderers/write.js +42 -0
- package/dist/ui.d.ts +56 -0
- package/dist/ui.js +94 -0
- package/docs/release.md +81 -0
- package/extensions/question/contract.ts +100 -0
- package/extensions/question/index.ts +34 -0
- package/extensions/question/render.ts +28 -0
- package/extensions/question/result.ts +86 -0
- package/extensions/question/tool-description.ts +11 -0
- package/extensions/question/tui.ts +629 -0
- package/extensions/question/types.ts +123 -0
- package/extensions/session-title/config.ts +169 -0
- package/extensions/session-title/index.ts +459 -0
- package/extensions/terminal-bell/index.ts +315 -0
- package/external/pi-tools-suite/README.md +242 -0
- package/external/pi-tools-suite/index.ts +1 -0
- package/external/pi-tools-suite/licenses/ollama-pi-web-search.MIT +21 -0
- package/external/pi-tools-suite/licenses/opencode-mystatus-MIT.txt +21 -0
- package/external/pi-tools-suite/package.json +53 -0
- package/external/pi-tools-suite/src/antigravity-auth/auth-store.ts +194 -0
- package/external/pi-tools-suite/src/antigravity-auth/commands.ts +80 -0
- package/external/pi-tools-suite/src/antigravity-auth/constants.ts +26 -0
- package/external/pi-tools-suite/src/antigravity-auth/headers.ts +20 -0
- package/external/pi-tools-suite/src/antigravity-auth/index.ts +104 -0
- package/external/pi-tools-suite/src/antigravity-auth/models.ts +86 -0
- package/external/pi-tools-suite/src/antigravity-auth/oauth.ts +305 -0
- package/external/pi-tools-suite/src/antigravity-auth/payload.ts +423 -0
- package/external/pi-tools-suite/src/antigravity-auth/status.ts +78 -0
- package/external/pi-tools-suite/src/antigravity-auth/stream.ts +302 -0
- package/external/pi-tools-suite/src/antigravity-auth/types.ts +113 -0
- package/external/pi-tools-suite/src/ast-grep/index.ts +6 -0
- package/external/pi-tools-suite/src/ast-grep/render.ts +70 -0
- package/external/pi-tools-suite/src/ast-grep/schema.ts +109 -0
- package/external/pi-tools-suite/src/ast-grep/tool.ts +345 -0
- package/external/pi-tools-suite/src/ast-grep/types.ts +55 -0
- package/external/pi-tools-suite/src/ast-grep/utils.ts +65 -0
- package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +222 -0
- package/external/pi-tools-suite/src/async-subagents/commands.ts +518 -0
- package/external/pi-tools-suite/src/async-subagents/constants.ts +11 -0
- package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +74 -0
- package/external/pi-tools-suite/src/async-subagents/core/attachment-bridge.ts +133 -0
- package/external/pi-tools-suite/src/async-subagents/core/cleanup.ts +66 -0
- package/external/pi-tools-suite/src/async-subagents/core/concurrency.ts +90 -0
- package/external/pi-tools-suite/src/async-subagents/core/config.ts +819 -0
- package/external/pi-tools-suite/src/async-subagents/core/log-limits.ts +166 -0
- package/external/pi-tools-suite/src/async-subagents/core/model-fallback.ts +133 -0
- package/external/pi-tools-suite/src/async-subagents/core/paths.ts +47 -0
- package/external/pi-tools-suite/src/async-subagents/core/pi-invocation.ts +35 -0
- package/external/pi-tools-suite/src/async-subagents/core/presets.ts +67 -0
- package/external/pi-tools-suite/src/async-subagents/core/process.ts +15 -0
- package/external/pi-tools-suite/src/async-subagents/core/prompt.ts +66 -0
- package/external/pi-tools-suite/src/async-subagents/core/registry.ts +224 -0
- package/external/pi-tools-suite/src/async-subagents/core/retry.ts +191 -0
- package/external/pi-tools-suite/src/async-subagents/core/routing.ts +259 -0
- package/external/pi-tools-suite/src/async-subagents/core/sessions.ts +138 -0
- package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +688 -0
- package/external/pi-tools-suite/src/async-subagents/core/state.ts +281 -0
- package/external/pi-tools-suite/src/async-subagents/core/stop.ts +131 -0
- package/external/pi-tools-suite/src/async-subagents/core/structured-result.ts +237 -0
- package/external/pi-tools-suite/src/async-subagents/core/tool-guard.ts +34 -0
- package/external/pi-tools-suite/src/async-subagents/core/types.ts +150 -0
- package/external/pi-tools-suite/src/async-subagents/core/ultrawork-auto.ts +184 -0
- package/external/pi-tools-suite/src/async-subagents/core/utils.ts +11 -0
- package/external/pi-tools-suite/src/async-subagents/format.ts +41 -0
- package/external/pi-tools-suite/src/async-subagents/index.ts +422 -0
- package/external/pi-tools-suite/src/async-subagents/lib.ts +88 -0
- package/external/pi-tools-suite/src/async-subagents/live.ts +10 -0
- package/external/pi-tools-suite/src/async-subagents/polling.ts +83 -0
- package/external/pi-tools-suite/src/async-subagents/render.ts +230 -0
- package/external/pi-tools-suite/src/async-subagents/subagent-overlay.ts +77 -0
- package/external/pi-tools-suite/src/async-subagents/tasks.ts +120 -0
- package/external/pi-tools-suite/src/async-subagents/tools/cleanup.ts +99 -0
- package/external/pi-tools-suite/src/async-subagents/tools/result.ts +179 -0
- package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +372 -0
- package/external/pi-tools-suite/src/async-subagents/tools/status.ts +60 -0
- package/external/pi-tools-suite/src/async-subagents/tools/stop.ts +79 -0
- package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +152 -0
- package/external/pi-tools-suite/src/async-subagents/tools/wait.ts +67 -0
- package/external/pi-tools-suite/src/async-subagents/types.ts +45 -0
- package/external/pi-tools-suite/src/async-subagents/ui.ts +5 -0
- package/external/pi-tools-suite/src/compress/commands.ts +440 -0
- package/external/pi-tools-suite/src/compress/compress-tool.ts +368 -0
- package/external/pi-tools-suite/src/compress/compression-blocks.ts +524 -0
- package/external/pi-tools-suite/src/compress/config.ts +310 -0
- package/external/pi-tools-suite/src/compress/dcp-tui-filter.ts +498 -0
- package/external/pi-tools-suite/src/compress/index.ts +397 -0
- package/external/pi-tools-suite/src/compress/prompts.ts +269 -0
- package/external/pi-tools-suite/src/compress/pruner-candidates.ts +176 -0
- package/external/pi-tools-suite/src/compress/pruner-compression-blocks.ts +260 -0
- package/external/pi-tools-suite/src/compress/pruner-message-ids.ts +147 -0
- package/external/pi-tools-suite/src/compress/pruner-metadata.ts +268 -0
- package/external/pi-tools-suite/src/compress/pruner-nudge.ts +315 -0
- package/external/pi-tools-suite/src/compress/pruner-tools.ts +263 -0
- package/external/pi-tools-suite/src/compress/pruner-types.ts +25 -0
- package/external/pi-tools-suite/src/compress/pruner.ts +92 -0
- package/external/pi-tools-suite/src/compress/state.ts +486 -0
- package/external/pi-tools-suite/src/compress/ui.ts +308 -0
- package/external/pi-tools-suite/src/config.ts +176 -0
- package/external/pi-tools-suite/src/context-usage.ts +31 -0
- package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +355 -0
- package/external/pi-tools-suite/src/index.ts +46 -0
- package/external/pi-tools-suite/src/lib/lsp.ts +62 -0
- package/external/pi-tools-suite/src/lib/project.ts +42 -0
- package/external/pi-tools-suite/src/lib/tool-args.ts +137 -0
- package/external/pi-tools-suite/src/lsp/_shared/config.ts +156 -0
- package/external/pi-tools-suite/src/lsp/_shared/glob.ts +60 -0
- package/external/pi-tools-suite/src/lsp/_shared/output.ts +102 -0
- package/external/pi-tools-suite/src/lsp/_shared/paths.ts +138 -0
- package/external/pi-tools-suite/src/lsp/_shared/runner.ts +64 -0
- package/external/pi-tools-suite/src/lsp/_shared/template.ts +23 -0
- package/external/pi-tools-suite/src/lsp/_shared/trust.ts +116 -0
- package/external/pi-tools-suite/src/lsp/_shared/types.ts +98 -0
- package/external/pi-tools-suite/src/lsp/async.ts +29 -0
- package/external/pi-tools-suite/src/lsp/child-process.ts +81 -0
- package/external/pi-tools-suite/src/lsp/client.ts +340 -0
- package/external/pi-tools-suite/src/lsp/constants.ts +9 -0
- package/external/pi-tools-suite/src/lsp/diagnostics-store.ts +64 -0
- package/external/pi-tools-suite/src/lsp/documents.ts +24 -0
- package/external/pi-tools-suite/src/lsp/index.ts +31 -0
- package/external/pi-tools-suite/src/lsp/lsp-utils.ts +37 -0
- package/external/pi-tools-suite/src/lsp/manager.ts +190 -0
- package/external/pi-tools-suite/src/lsp/mutation-events.ts +78 -0
- package/external/pi-tools-suite/src/lsp/renderer.ts +1 -0
- package/external/pi-tools-suite/src/lsp/tool-result.ts +6 -0
- package/external/pi-tools-suite/src/lsp/tsserver.ts +107 -0
- package/external/pi-tools-suite/src/lsp/types.ts +15 -0
- package/external/pi-tools-suite/src/model-tools/apply-patch.ts +590 -0
- package/external/pi-tools-suite/src/model-tools/index.ts +430 -0
- package/external/pi-tools-suite/src/model-tools/path-utils.ts +6 -0
- package/external/pi-tools-suite/src/model-tools/tool-args.ts +11 -0
- package/external/pi-tools-suite/src/prompt-commands/index.ts +349 -0
- package/external/pi-tools-suite/src/repo-discovery/index.ts +384 -0
- package/external/pi-tools-suite/src/repo-discovery/project.ts +7 -0
- package/external/pi-tools-suite/src/startup-section.ts +13 -0
- package/external/pi-tools-suite/src/terminal-bell/index.ts +309 -0
- package/external/pi-tools-suite/src/todo/index.ts +201 -0
- package/external/pi-tools-suite/src/todo/state/auto-clear.ts +13 -0
- package/external/pi-tools-suite/src/todo/state/invariants.ts +21 -0
- package/external/pi-tools-suite/src/todo/state/persistence.ts +94 -0
- package/external/pi-tools-suite/src/todo/state/replay.ts +38 -0
- package/external/pi-tools-suite/src/todo/state/selectors.ts +49 -0
- package/external/pi-tools-suite/src/todo/state/state-reducer.ts +362 -0
- package/external/pi-tools-suite/src/todo/state/state.ts +18 -0
- package/external/pi-tools-suite/src/todo/state/store.ts +52 -0
- package/external/pi-tools-suite/src/todo/state/task-graph.ts +57 -0
- package/external/pi-tools-suite/src/todo/todo.ts +487 -0
- package/external/pi-tools-suite/src/todo/tool/response-envelope.ts +143 -0
- package/external/pi-tools-suite/src/todo/tool/types.ts +188 -0
- package/external/pi-tools-suite/src/todo/view/format.ts +18 -0
- package/external/pi-tools-suite/src/todo/view/labels.ts +13 -0
- package/external/pi-tools-suite/src/tool-descriptions.ts +369 -0
- package/external/pi-tools-suite/src/usage/index.ts +152 -0
- package/external/pi-tools-suite/src/usage/lib/copilot.ts +535 -0
- package/external/pi-tools-suite/src/usage/lib/google.ts +478 -0
- package/external/pi-tools-suite/src/usage/lib/openai.ts +268 -0
- package/external/pi-tools-suite/src/usage/lib/types.ts +114 -0
- package/external/pi-tools-suite/src/usage/lib/utils.ts +134 -0
- package/external/pi-tools-suite/src/usage/lib/zhipu.ts +228 -0
- package/external/pi-tools-suite/src/web-search/index.ts +397 -0
- package/package.json +89 -0
- package/skills/context7/SKILL.md +69 -0
- package/skills/context7/scripts/context7.sh +73 -0
- package/skills/handoff/SKILL.md +15 -0
- package/skills/pdf/LICENSE.txt +30 -0
- package/skills/pdf/SKILL.md +314 -0
- package/skills/pdf/forms.md +294 -0
- package/skills/pdf/reference.md +612 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/skills/pdf/scripts/create_validation_image.py +37 -0
- package/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/skills/playwright-cli/SKILL.md +388 -0
- package/skills/playwright-cli/references/element-attributes.md +23 -0
- package/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/skills/playwright-cli/references/request-mocking.md +87 -0
- package/skills/playwright-cli/references/running-code.md +241 -0
- package/skills/playwright-cli/references/session-management.md +225 -0
- package/skills/playwright-cli/references/spec-driven-testing.md +305 -0
- package/skills/playwright-cli/references/storage-state.md +275 -0
- package/skills/playwright-cli/references/test-generation.md +134 -0
- package/skills/playwright-cli/references/tracing.md +139 -0
- package/skills/playwright-cli/references/video-recording.md +143 -0
- package/skills/simplify/SKILL.md +51 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +485 -0
- package/skills/skill-creator/agents/analyzer.md +274 -0
- package/skills/skill-creator/agents/comparator.md +202 -0
- package/skills/skill-creator/agents/grader.md +223 -0
- package/skills/skill-creator/assets/eval_review.html +146 -0
- package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator/references/schemas.md +430 -0
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/skill-creator/scripts/generate_report.py +326 -0
- package/skills/skill-creator/scripts/improve_description.py +247 -0
- package/skills/skill-creator/scripts/package_skill.py +136 -0
- package/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/skill-creator/scripts/run_eval.py +310 -0
- package/skills/skill-creator/scripts/run_loop.py +328 -0
- package/skills/skill-creator/scripts/utils.py +47 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionCommandContext } from "@mariozechner/pi-coding-agent"
|
|
2
|
+
import type { AutocompleteItem } from "@mariozechner/pi-tui"
|
|
3
|
+
import type { DcpState } from "./state.js"
|
|
4
|
+
import type { DcpConfig } from "./config.js"
|
|
5
|
+
import { isToolRecordProtected, markToolPruned } from "./pruner.js"
|
|
6
|
+
import { safeGetContextUsage } from "../context-usage.js"
|
|
7
|
+
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Constants
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
/** Tools whose outputs are always protected from sweep regardless of config. */
|
|
13
|
+
const ALWAYS_PROTECTED_TOOLS = ["compress", "write", "edit"] as const
|
|
14
|
+
|
|
15
|
+
export interface DcpCommandHooks {
|
|
16
|
+
onStateChanged?: (ctx: ExtensionCommandContext) => void
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Formatting helpers
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
function fmt(n: number): string {
|
|
24
|
+
return n.toLocaleString()
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Help
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
const HELP_TEXT = `DCP — Dynamic Context Pruning
|
|
32
|
+
|
|
33
|
+
Commands:
|
|
34
|
+
/dcp context — Show context window usage breakdown
|
|
35
|
+
/dcp stats — Show pruning statistics for this session
|
|
36
|
+
/dcp sweep [N] — Prune last N tool outputs (default: all since last user msg)
|
|
37
|
+
/dcp manual — Show manual mode status
|
|
38
|
+
/dcp manual on — Enable manual mode (disable autonomous compression nudges)
|
|
39
|
+
/dcp manual off — Disable manual mode (enable autonomous compression nudges)
|
|
40
|
+
/dcp decompress — List active compression blocks
|
|
41
|
+
/dcp decompress N — Restore compression block N
|
|
42
|
+
/dcp recompress — List blocks restored by /dcp decompress
|
|
43
|
+
/dcp recompress N — Re-apply a user-restored compression block
|
|
44
|
+
/dcp compress — Trigger compression (sends compress tool invocation to LLM)`
|
|
45
|
+
|
|
46
|
+
function handleHelp(ctx: ExtensionCommandContext): void {
|
|
47
|
+
ctx.ui.notify(HELP_TEXT, "info")
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Context usage
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
|
|
54
|
+
function handleContext(ctx: ExtensionCommandContext, state: DcpState): void {
|
|
55
|
+
const usage = safeGetContextUsage(ctx)
|
|
56
|
+
|
|
57
|
+
const lines: string[] = []
|
|
58
|
+
|
|
59
|
+
if (usage && typeof usage.contextWindow === "number") {
|
|
60
|
+
if (typeof usage.tokens === "number") {
|
|
61
|
+
const pct = ((usage.tokens / usage.contextWindow) * 100).toFixed(1)
|
|
62
|
+
lines.push(
|
|
63
|
+
`Context Usage: ${pct}% (${fmt(usage.tokens)} / ${fmt(usage.contextWindow)} tokens)`,
|
|
64
|
+
)
|
|
65
|
+
} else {
|
|
66
|
+
lines.push(`Context Usage: unknown / ${fmt(usage.contextWindow)} tokens`)
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
lines.push("Context Usage: unavailable")
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
lines.push("")
|
|
73
|
+
lines.push("Session Stats:")
|
|
74
|
+
lines.push(` Tool calls tracked: ${fmt(state.toolCalls.size)}`)
|
|
75
|
+
lines.push(` Pruned tools: ${fmt(state.prunedToolIds.size)}`)
|
|
76
|
+
lines.push(` Compression blocks: ${state.compressionBlocks.filter((b) => b.active).length}`)
|
|
77
|
+
lines.push(` Tokens saved (estimated): ${fmt(state.tokensSaved)}`)
|
|
78
|
+
|
|
79
|
+
ctx.ui.notify(lines.join("\n"), "info")
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Stats
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
|
|
86
|
+
function handleStats(ctx: ExtensionCommandContext, state: DcpState): void {
|
|
87
|
+
const activeBlocks = state.compressionBlocks.filter((b) => b.active).length
|
|
88
|
+
const totalBlocks = state.compressionBlocks.length
|
|
89
|
+
const lines: string[] = []
|
|
90
|
+
lines.push("DCP Session Statistics:")
|
|
91
|
+
lines.push(` Tokens saved (estimated): ${fmt(state.tokensSaved)}`)
|
|
92
|
+
lines.push(` Total pruning operations: ${fmt(state.totalPruneCount)}`)
|
|
93
|
+
lines.push(` Compression blocks active: ${activeBlocks} / ${totalBlocks} total`)
|
|
94
|
+
lines.push(` Manual mode: ${state.manualMode ? "on" : "off"}`)
|
|
95
|
+
|
|
96
|
+
ctx.ui.notify(lines.join("\n"), "info")
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// Sweep
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
|
|
103
|
+
async function handleSweep(
|
|
104
|
+
ctx: ExtensionCommandContext,
|
|
105
|
+
state: DcpState,
|
|
106
|
+
config: DcpConfig,
|
|
107
|
+
n: number,
|
|
108
|
+
): Promise<void> {
|
|
109
|
+
await ctx.waitForIdle()
|
|
110
|
+
|
|
111
|
+
const branch = ctx.sessionManager.getBranch()
|
|
112
|
+
|
|
113
|
+
// Build the full set of protected tool names.
|
|
114
|
+
const protectedTools = new Set<string>([
|
|
115
|
+
...ALWAYS_PROTECTED_TOOLS,
|
|
116
|
+
...config.compress.protectedTools,
|
|
117
|
+
...config.strategies.deduplication.protectedTools,
|
|
118
|
+
...config.strategies.purgeErrors.protectedTools,
|
|
119
|
+
...config.strategies.autoToolPruning.protectedTools,
|
|
120
|
+
])
|
|
121
|
+
|
|
122
|
+
// Walk the branch (root → leaf) collecting toolCallIds in encounter order,
|
|
123
|
+
// and tracking where the last real user message was.
|
|
124
|
+
const allToolCallIds: string[] = []
|
|
125
|
+
const toolCallIdsSinceLastUser: string[] = []
|
|
126
|
+
const toolNamesByCallId = new Map<string, string>()
|
|
127
|
+
let lastUserMsgBranchIndex = -1
|
|
128
|
+
|
|
129
|
+
// First pass: find the last user message index.
|
|
130
|
+
for (let i = 0; i < branch.length; i++) {
|
|
131
|
+
const entry = branch[i]
|
|
132
|
+
if (entry.type !== "message") continue
|
|
133
|
+
const msg = (entry as any).message
|
|
134
|
+
if (msg.role === "user") {
|
|
135
|
+
lastUserMsgBranchIndex = i
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Second pass: collect tool result IDs in encounter order.
|
|
140
|
+
for (let i = 0; i < branch.length; i++) {
|
|
141
|
+
const entry = branch[i]
|
|
142
|
+
if (entry.type !== "message") continue
|
|
143
|
+
const msg = (entry as any).message
|
|
144
|
+
if (msg.role !== "toolResult") continue
|
|
145
|
+
|
|
146
|
+
const toolCallId = msg.toolCallId as string
|
|
147
|
+
allToolCallIds.push(toolCallId)
|
|
148
|
+
if (typeof msg.toolName === "string") toolNamesByCallId.set(toolCallId, msg.toolName)
|
|
149
|
+
|
|
150
|
+
if (lastUserMsgBranchIndex >= 0 && i > lastUserMsgBranchIndex) {
|
|
151
|
+
toolCallIdsSinceLastUser.push(toolCallId)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Determine the candidate set based on the N argument.
|
|
156
|
+
let candidates: string[]
|
|
157
|
+
if (n > 0) {
|
|
158
|
+
// Last N tool results from the full session branch.
|
|
159
|
+
candidates = allToolCallIds.slice(-n)
|
|
160
|
+
} else {
|
|
161
|
+
// All tool results since the last user message (or everything if no user
|
|
162
|
+
// message exists yet — e.g. in a purely agentic session).
|
|
163
|
+
candidates =
|
|
164
|
+
lastUserMsgBranchIndex >= 0 ? toolCallIdsSinceLastUser : allToolCallIds
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Filter: skip already-pruned IDs and protected tool names.
|
|
168
|
+
const toAdd = candidates.filter((toolCallId) => {
|
|
169
|
+
if (state.prunedToolIds.has(toolCallId)) return false
|
|
170
|
+
|
|
171
|
+
// Tool name lookup: prefer the DCP tool-call record if tracked; fall back
|
|
172
|
+
// to the AgentMessage itself (msg.toolName is present on ToolResultMessage).
|
|
173
|
+
const record = state.toolCalls.get(toolCallId)
|
|
174
|
+
const toolName = record?.toolName ?? toolNamesByCallId.get(toolCallId)
|
|
175
|
+
|
|
176
|
+
if (record && isToolRecordProtected(record, config, Array.from(protectedTools))) return false
|
|
177
|
+
if (toolName !== undefined && protectedTools.has(toolName)) return false
|
|
178
|
+
|
|
179
|
+
return true
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
let count = 0
|
|
183
|
+
for (const toolCallId of toAdd) {
|
|
184
|
+
const record = state.toolCalls.get(toolCallId)
|
|
185
|
+
if (markToolPruned(state, toolCallId, "manual-sweep", record?.tokenEstimate ?? 0)) {
|
|
186
|
+
count++
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
ctx.ui.notify(`Swept ${count} tool output${count === 1 ? "" : "s"}`, "info")
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
// Manual mode
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
|
|
197
|
+
function handleManual(
|
|
198
|
+
ctx: ExtensionCommandContext,
|
|
199
|
+
state: DcpState,
|
|
200
|
+
subArg: string | undefined,
|
|
201
|
+
): void {
|
|
202
|
+
if (subArg === "on") {
|
|
203
|
+
state.manualMode = true
|
|
204
|
+
ctx.ui.notify(
|
|
205
|
+
"Manual mode: on\nAutonomous compression nudges are disabled. Use /dcp compress to trigger manually.",
|
|
206
|
+
"info",
|
|
207
|
+
)
|
|
208
|
+
} else if (subArg === "off") {
|
|
209
|
+
state.manualMode = false
|
|
210
|
+
ctx.ui.notify("Manual mode: off\nAutonomous compression is enabled.", "info")
|
|
211
|
+
} else {
|
|
212
|
+
// Status display (no argument).
|
|
213
|
+
const status = state.manualMode ? "on" : "off"
|
|
214
|
+
ctx.ui.notify(
|
|
215
|
+
`Manual mode: ${status}\nWhen on: compress tool only fires when you explicitly request it.`,
|
|
216
|
+
"info",
|
|
217
|
+
)
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Decompress
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
|
|
225
|
+
function handleDecompress(
|
|
226
|
+
ctx: ExtensionCommandContext,
|
|
227
|
+
state: DcpState,
|
|
228
|
+
nArg: string | undefined,
|
|
229
|
+
): void {
|
|
230
|
+
if (nArg === undefined) {
|
|
231
|
+
// List all active compression blocks.
|
|
232
|
+
const activeBlocks = state.compressionBlocks.filter((b) => b.active)
|
|
233
|
+
|
|
234
|
+
if (activeBlocks.length === 0) {
|
|
235
|
+
ctx.ui.notify("No active compression blocks.", "info")
|
|
236
|
+
return
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const lines: string[] = ["Active compression blocks:"]
|
|
240
|
+
for (const block of activeBlocks) {
|
|
241
|
+
lines.push(
|
|
242
|
+
` b${block.id} — "${block.topic}" (est. ${fmt(block.summaryTokenEstimate)} tokens)`,
|
|
243
|
+
)
|
|
244
|
+
}
|
|
245
|
+
lines.push("")
|
|
246
|
+
lines.push("Run /dcp decompress N to restore a block.")
|
|
247
|
+
|
|
248
|
+
ctx.ui.notify(lines.join("\n"), "info")
|
|
249
|
+
} else {
|
|
250
|
+
// Restore block N.
|
|
251
|
+
const id = parseInt(nArg, 10)
|
|
252
|
+
|
|
253
|
+
if (isNaN(id)) {
|
|
254
|
+
ctx.ui.notify(
|
|
255
|
+
`Invalid block ID: "${nArg}". Usage: /dcp decompress N`,
|
|
256
|
+
"error",
|
|
257
|
+
)
|
|
258
|
+
return
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const block = state.compressionBlocks.find((b) => b.id === id)
|
|
262
|
+
|
|
263
|
+
if (!block) {
|
|
264
|
+
ctx.ui.notify(`No compression block found with id ${id}.`, "error")
|
|
265
|
+
return
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (!block.active) {
|
|
269
|
+
ctx.ui.notify(`Compression block b${id} is already decompressed.`, "info")
|
|
270
|
+
return
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
block.active = false
|
|
274
|
+
block.deactivatedByUser = true
|
|
275
|
+
ctx.ui.notify(`Decompressed block b${id}: "${block.topic}"`, "info")
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// ---------------------------------------------------------------------------
|
|
280
|
+
// Recompress
|
|
281
|
+
// ---------------------------------------------------------------------------
|
|
282
|
+
|
|
283
|
+
function handleRecompress(
|
|
284
|
+
ctx: ExtensionCommandContext,
|
|
285
|
+
state: DcpState,
|
|
286
|
+
nArg: string | undefined,
|
|
287
|
+
): void {
|
|
288
|
+
const recompressible = state.compressionBlocks.filter((b) => !b.active && b.deactivatedByUser)
|
|
289
|
+
|
|
290
|
+
if (nArg === undefined) {
|
|
291
|
+
if (recompressible.length === 0) {
|
|
292
|
+
ctx.ui.notify("No user-decompressed compression blocks are available to recompress.", "info")
|
|
293
|
+
return
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const lines: string[] = ["Recompressible blocks:"]
|
|
297
|
+
for (const block of recompressible) {
|
|
298
|
+
lines.push(
|
|
299
|
+
` b${block.id} — "${block.topic}" (est. ${fmt(block.summaryTokenEstimate)} tokens)`,
|
|
300
|
+
)
|
|
301
|
+
}
|
|
302
|
+
lines.push("")
|
|
303
|
+
lines.push("Run /dcp recompress N to re-apply a block.")
|
|
304
|
+
ctx.ui.notify(lines.join("\n"), "info")
|
|
305
|
+
return
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const id = parseInt(nArg, 10)
|
|
309
|
+
if (isNaN(id)) {
|
|
310
|
+
ctx.ui.notify(`Invalid block ID: "${nArg}". Usage: /dcp recompress N`, "error")
|
|
311
|
+
return
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const block = state.compressionBlocks.find((b) => b.id === id)
|
|
315
|
+
if (!block) {
|
|
316
|
+
ctx.ui.notify(`No compression block found with id ${id}.`, "error")
|
|
317
|
+
return
|
|
318
|
+
}
|
|
319
|
+
if (block.active) {
|
|
320
|
+
ctx.ui.notify(`Compression block b${id} is already active.`, "info")
|
|
321
|
+
return
|
|
322
|
+
}
|
|
323
|
+
if (!block.deactivatedByUser) {
|
|
324
|
+
ctx.ui.notify(`Compression block b${id} was superseded by another block and cannot be recompressed directly.`, "error")
|
|
325
|
+
return
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
for (const coveredId of block.coveredBlockIds ?? []) {
|
|
329
|
+
const covered = state.compressionBlocks.find((candidate) => candidate.id === coveredId)
|
|
330
|
+
if (covered) covered.active = false
|
|
331
|
+
}
|
|
332
|
+
block.active = true
|
|
333
|
+
block.deactivatedByUser = false
|
|
334
|
+
ctx.ui.notify(`Recompressed block b${id}: "${block.topic}"`, "info")
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// ---------------------------------------------------------------------------
|
|
338
|
+
// Compress (trigger)
|
|
339
|
+
// ---------------------------------------------------------------------------
|
|
340
|
+
|
|
341
|
+
async function handleCompress(pi: ExtensionAPI, ctx: ExtensionCommandContext): Promise<void> {
|
|
342
|
+
await ctx.waitForIdle()
|
|
343
|
+
|
|
344
|
+
pi.sendMessage(
|
|
345
|
+
{
|
|
346
|
+
customType: "dcp-compress-trigger",
|
|
347
|
+
content:
|
|
348
|
+
"Please compress stale conversation sections using the compress tool now.",
|
|
349
|
+
display: false,
|
|
350
|
+
},
|
|
351
|
+
{ triggerTurn: true, deliverAs: "followUp" },
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
ctx.ui.notify("Triggered compression", "info")
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// ---------------------------------------------------------------------------
|
|
358
|
+
// Public API
|
|
359
|
+
// ---------------------------------------------------------------------------
|
|
360
|
+
|
|
361
|
+
export function registerCommands(
|
|
362
|
+
pi: ExtensionAPI,
|
|
363
|
+
state: DcpState,
|
|
364
|
+
config: DcpConfig,
|
|
365
|
+
hooks: DcpCommandHooks = {},
|
|
366
|
+
): void {
|
|
367
|
+
pi.registerCommand("dcp", {
|
|
368
|
+
description: "Dynamic Context Pruning — manage context window usage",
|
|
369
|
+
getArgumentCompletions(prefix: string): AutocompleteItem[] | null {
|
|
370
|
+
const subcommands: AutocompleteItem[] = [
|
|
371
|
+
{ value: "context", label: "context", description: "Show context window usage breakdown" },
|
|
372
|
+
{ value: "stats", label: "stats", description: "Show pruning statistics" },
|
|
373
|
+
{ value: "sweep", label: "sweep", description: "Prune tool outputs" },
|
|
374
|
+
{ value: "manual", label: "manual", description: "Toggle manual mode" },
|
|
375
|
+
{ value: "decompress", label: "decompress", description: "List or restore compression blocks" },
|
|
376
|
+
{ value: "recompress", label: "recompress", description: "Re-apply a decompressed block" },
|
|
377
|
+
{ value: "compress", label: "compress", description: "Trigger LLM compression" },
|
|
378
|
+
{ value: "help", label: "help", description: "Show help" },
|
|
379
|
+
]
|
|
380
|
+
const matched = subcommands
|
|
381
|
+
.filter((s) => typeof s.value === "string")
|
|
382
|
+
.filter((s) => s.value.startsWith(prefix))
|
|
383
|
+
return matched.length > 0 ? matched : null
|
|
384
|
+
},
|
|
385
|
+
|
|
386
|
+
async handler(args: string, ctx: ExtensionCommandContext): Promise<void> {
|
|
387
|
+
const parts = args.trim().split(/\s+/).filter(Boolean)
|
|
388
|
+
const sub = parts[0] ?? ""
|
|
389
|
+
|
|
390
|
+
try {
|
|
391
|
+
switch (sub) {
|
|
392
|
+
case "":
|
|
393
|
+
case "help":
|
|
394
|
+
handleHelp(ctx)
|
|
395
|
+
break
|
|
396
|
+
|
|
397
|
+
case "context":
|
|
398
|
+
handleContext(ctx, state)
|
|
399
|
+
break
|
|
400
|
+
|
|
401
|
+
case "stats":
|
|
402
|
+
handleStats(ctx, state)
|
|
403
|
+
break
|
|
404
|
+
|
|
405
|
+
case "sweep": {
|
|
406
|
+
const rawN = parts[1] !== undefined ? parseInt(parts[1], 10) : 0
|
|
407
|
+
const n = isNaN(rawN) || rawN < 0 ? 0 : rawN
|
|
408
|
+
await handleSweep(ctx, state, config, n)
|
|
409
|
+
break
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
case "manual":
|
|
413
|
+
handleManual(ctx, state, parts[1])
|
|
414
|
+
break
|
|
415
|
+
|
|
416
|
+
case "decompress":
|
|
417
|
+
handleDecompress(ctx, state, parts[1])
|
|
418
|
+
break
|
|
419
|
+
|
|
420
|
+
case "recompress":
|
|
421
|
+
handleRecompress(ctx, state, parts[1])
|
|
422
|
+
break
|
|
423
|
+
|
|
424
|
+
case "compress":
|
|
425
|
+
await handleCompress(pi, ctx)
|
|
426
|
+
break
|
|
427
|
+
|
|
428
|
+
default:
|
|
429
|
+
ctx.ui.notify(
|
|
430
|
+
`Unknown DCP command: "${sub}". Run /dcp help for available commands.`,
|
|
431
|
+
"error",
|
|
432
|
+
)
|
|
433
|
+
break
|
|
434
|
+
}
|
|
435
|
+
} finally {
|
|
436
|
+
hooks.onStateChanged?.(ctx)
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
})
|
|
440
|
+
}
|