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,245 @@
|
|
|
1
|
+
const TAB_WIDTH = 4;
|
|
2
|
+
const ANSI_RESET = "\x1b[0m";
|
|
3
|
+
export function expandTabs(text, tabWidth = TAB_WIDTH) {
|
|
4
|
+
let result = "";
|
|
5
|
+
let column = 0;
|
|
6
|
+
for (let index = 0; index < text.length;) {
|
|
7
|
+
const ansiLength = ansiSequenceLength(text, index);
|
|
8
|
+
if (ansiLength > 0) {
|
|
9
|
+
result += text.slice(index, index + ansiLength);
|
|
10
|
+
index += ansiLength;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const codePoint = text.codePointAt(index) ?? 0;
|
|
14
|
+
const char = String.fromCodePoint(codePoint);
|
|
15
|
+
index += codePointLength(codePoint);
|
|
16
|
+
if (char === "\n") {
|
|
17
|
+
result += char;
|
|
18
|
+
column = 0;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (char === "\t") {
|
|
22
|
+
const spaces = tabWidth - (column % tabWidth || tabWidth);
|
|
23
|
+
const count = spaces === 0 ? tabWidth : spaces;
|
|
24
|
+
result += " ".repeat(count);
|
|
25
|
+
column += count;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
result += char;
|
|
29
|
+
column += charDisplayWidth(char.codePointAt(0) ?? 0);
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
export function stringDisplayWidth(text) {
|
|
34
|
+
let width = 0;
|
|
35
|
+
for (let index = 0; index < text.length;) {
|
|
36
|
+
const ansiLength = ansiSequenceLength(text, index);
|
|
37
|
+
if (ansiLength > 0) {
|
|
38
|
+
index += ansiLength;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const codePoint = text.codePointAt(index) ?? 0;
|
|
42
|
+
width += charDisplayWidth(codePoint);
|
|
43
|
+
index += codePointLength(codePoint);
|
|
44
|
+
}
|
|
45
|
+
return width;
|
|
46
|
+
}
|
|
47
|
+
export function sliceByDisplayWidth(text, width) {
|
|
48
|
+
const safeWidth = Math.max(0, width);
|
|
49
|
+
let result = "";
|
|
50
|
+
let used = 0;
|
|
51
|
+
let sawAnsi = false;
|
|
52
|
+
let clipped = false;
|
|
53
|
+
for (let index = 0; index < text.length;) {
|
|
54
|
+
const ansiLength = ansiSequenceLength(text, index);
|
|
55
|
+
if (ansiLength > 0) {
|
|
56
|
+
result += text.slice(index, index + ansiLength);
|
|
57
|
+
sawAnsi = true;
|
|
58
|
+
index += ansiLength;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const codePoint = text.codePointAt(index) ?? 0;
|
|
62
|
+
const char = String.fromCodePoint(codePoint);
|
|
63
|
+
const charWidth = charDisplayWidth(codePoint);
|
|
64
|
+
if (used + charWidth > safeWidth) {
|
|
65
|
+
clipped = true;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
result += char;
|
|
69
|
+
used += charWidth;
|
|
70
|
+
index += codePointLength(codePoint);
|
|
71
|
+
}
|
|
72
|
+
if (sawAnsi && clipped && !result.endsWith(ANSI_RESET))
|
|
73
|
+
return `${result}${ANSI_RESET}`;
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
export function padOrTrimDisplay(text, width) {
|
|
77
|
+
const safeWidth = Math.max(0, width);
|
|
78
|
+
const trimmed = sliceByDisplayWidth(text, safeWidth);
|
|
79
|
+
return `${trimmed}${" ".repeat(Math.max(0, safeWidth - stringDisplayWidth(trimmed)))}`;
|
|
80
|
+
}
|
|
81
|
+
export function wrapDisplayLine(text, width) {
|
|
82
|
+
const safeWidth = Math.max(1, width);
|
|
83
|
+
const chunks = [];
|
|
84
|
+
let chunk = "";
|
|
85
|
+
let chunkWidth = 0;
|
|
86
|
+
for (let index = 0; index < text.length;) {
|
|
87
|
+
const ansiLength = ansiSequenceLength(text, index);
|
|
88
|
+
if (ansiLength > 0) {
|
|
89
|
+
chunk += text.slice(index, index + ansiLength);
|
|
90
|
+
index += ansiLength;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const codePoint = text.codePointAt(index) ?? 0;
|
|
94
|
+
const char = String.fromCodePoint(codePoint);
|
|
95
|
+
const charWidth = charDisplayWidth(codePoint);
|
|
96
|
+
if (chunk && chunkWidth + charWidth > safeWidth) {
|
|
97
|
+
chunks.push(chunk);
|
|
98
|
+
chunk = "";
|
|
99
|
+
chunkWidth = 0;
|
|
100
|
+
}
|
|
101
|
+
chunk += char;
|
|
102
|
+
chunkWidth += charWidth;
|
|
103
|
+
index += codePointLength(codePoint);
|
|
104
|
+
}
|
|
105
|
+
chunks.push(chunk);
|
|
106
|
+
return chunks;
|
|
107
|
+
}
|
|
108
|
+
export function wrapDisplayLineByWords(text, width) {
|
|
109
|
+
const safeWidth = Math.max(1, width);
|
|
110
|
+
if (stringDisplayWidth(text) <= safeWidth)
|
|
111
|
+
return [text];
|
|
112
|
+
const chunks = [];
|
|
113
|
+
let chunk = "";
|
|
114
|
+
for (const token of displayTokens(text)) {
|
|
115
|
+
if (token.whitespace) {
|
|
116
|
+
if (!chunk) {
|
|
117
|
+
chunk = appendTokenToEmptyChunk(token.text, safeWidth, chunks);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const candidate = `${chunk}${token.text}`;
|
|
121
|
+
if (stringDisplayWidth(candidate) <= safeWidth) {
|
|
122
|
+
chunk = candidate;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
chunks.push(trimTrailingWhitespace(chunk));
|
|
126
|
+
chunk = "";
|
|
127
|
+
}
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (!chunk) {
|
|
131
|
+
chunk = appendTokenToEmptyChunk(token.text, safeWidth, chunks);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const candidate = `${chunk}${token.text}`;
|
|
135
|
+
if (stringDisplayWidth(candidate) <= safeWidth) {
|
|
136
|
+
chunk = candidate;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
chunks.push(trimTrailingWhitespace(chunk));
|
|
140
|
+
chunk = appendTokenToEmptyChunk(token.text, safeWidth, chunks);
|
|
141
|
+
}
|
|
142
|
+
chunks.push(chunk);
|
|
143
|
+
return chunks;
|
|
144
|
+
}
|
|
145
|
+
function displayTokens(text) {
|
|
146
|
+
const tokens = [];
|
|
147
|
+
let current = "";
|
|
148
|
+
let currentWhitespace;
|
|
149
|
+
for (let index = 0; index < text.length;) {
|
|
150
|
+
const ansiLength = ansiSequenceLength(text, index);
|
|
151
|
+
if (ansiLength > 0) {
|
|
152
|
+
current += text.slice(index, index + ansiLength);
|
|
153
|
+
index += ansiLength;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const codePoint = text.codePointAt(index) ?? 0;
|
|
157
|
+
const char = String.fromCodePoint(codePoint);
|
|
158
|
+
const whitespace = /\s/u.test(char);
|
|
159
|
+
if (current && currentWhitespace !== whitespace) {
|
|
160
|
+
tokens.push({ text: current, whitespace: currentWhitespace ?? false });
|
|
161
|
+
current = "";
|
|
162
|
+
}
|
|
163
|
+
current += char;
|
|
164
|
+
currentWhitespace = whitespace;
|
|
165
|
+
index += codePointLength(codePoint);
|
|
166
|
+
}
|
|
167
|
+
if (current)
|
|
168
|
+
tokens.push({ text: current, whitespace: currentWhitespace ?? false });
|
|
169
|
+
return tokens;
|
|
170
|
+
}
|
|
171
|
+
function appendTokenToEmptyChunk(token, width, chunks) {
|
|
172
|
+
if (stringDisplayWidth(token) <= width)
|
|
173
|
+
return token;
|
|
174
|
+
const wrapped = wrapDisplayLine(token, width);
|
|
175
|
+
chunks.push(...wrapped.slice(0, -1));
|
|
176
|
+
return wrapped.at(-1) ?? "";
|
|
177
|
+
}
|
|
178
|
+
function trimTrailingWhitespace(text) {
|
|
179
|
+
return text.replace(/\s+$/u, "");
|
|
180
|
+
}
|
|
181
|
+
function ansiSequenceLength(text, index) {
|
|
182
|
+
if (text.charCodeAt(index) !== 0x1b)
|
|
183
|
+
return 0;
|
|
184
|
+
const next = text[index + 1];
|
|
185
|
+
if (!next)
|
|
186
|
+
return 1;
|
|
187
|
+
if (next === "[") {
|
|
188
|
+
for (let cursor = index + 2; cursor < text.length; cursor += 1) {
|
|
189
|
+
const code = text.charCodeAt(cursor);
|
|
190
|
+
if (code >= 0x40 && code <= 0x7e)
|
|
191
|
+
return cursor - index + 1;
|
|
192
|
+
}
|
|
193
|
+
return text.length - index;
|
|
194
|
+
}
|
|
195
|
+
if (next === "]") {
|
|
196
|
+
for (let cursor = index + 2; cursor < text.length; cursor += 1) {
|
|
197
|
+
const code = text.charCodeAt(cursor);
|
|
198
|
+
if (code === 0x07)
|
|
199
|
+
return cursor - index + 1;
|
|
200
|
+
if (code === 0x1b && text[cursor + 1] === "\\")
|
|
201
|
+
return cursor - index + 2;
|
|
202
|
+
}
|
|
203
|
+
return text.length - index;
|
|
204
|
+
}
|
|
205
|
+
return 2;
|
|
206
|
+
}
|
|
207
|
+
function codePointLength(codePoint) {
|
|
208
|
+
return codePoint > 0xffff ? 2 : 1;
|
|
209
|
+
}
|
|
210
|
+
function charDisplayWidth(codePoint) {
|
|
211
|
+
if (codePoint === 0)
|
|
212
|
+
return 0;
|
|
213
|
+
if (codePoint < 32 || (codePoint >= 0x7f && codePoint < 0xa0))
|
|
214
|
+
return 0;
|
|
215
|
+
if (isCombining(codePoint))
|
|
216
|
+
return 0;
|
|
217
|
+
if (isFullWidth(codePoint))
|
|
218
|
+
return 2;
|
|
219
|
+
return 1;
|
|
220
|
+
}
|
|
221
|
+
function isCombining(codePoint) {
|
|
222
|
+
return ((codePoint >= 0x0300 && codePoint <= 0x036f) ||
|
|
223
|
+
(codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||
|
|
224
|
+
(codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||
|
|
225
|
+
(codePoint >= 0x20d0 && codePoint <= 0x20ff) ||
|
|
226
|
+
(codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||
|
|
227
|
+
(codePoint >= 0xfe20 && codePoint <= 0xfe2f) ||
|
|
228
|
+
(codePoint >= 0xe0100 && codePoint <= 0xe01ef) ||
|
|
229
|
+
codePoint === 0x200d);
|
|
230
|
+
}
|
|
231
|
+
function isFullWidth(codePoint) {
|
|
232
|
+
return (codePoint >= 0x1100 &&
|
|
233
|
+
(codePoint <= 0x115f ||
|
|
234
|
+
codePoint === 0x2329 ||
|
|
235
|
+
codePoint === 0x232a ||
|
|
236
|
+
(codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||
|
|
237
|
+
(codePoint >= 0xac00 && codePoint <= 0xd7a3) ||
|
|
238
|
+
(codePoint >= 0xf900 && codePoint <= 0xfaff) ||
|
|
239
|
+
(codePoint >= 0xfe10 && codePoint <= 0xfe19) ||
|
|
240
|
+
(codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||
|
|
241
|
+
(codePoint >= 0xff00 && codePoint <= 0xff60) ||
|
|
242
|
+
(codePoint >= 0xffe0 && codePoint <= 0xffe6) ||
|
|
243
|
+
(codePoint >= 0x1f300 && codePoint <= 0x1faff) ||
|
|
244
|
+
(codePoint >= 0x20000 && codePoint <= 0x3fffd)));
|
|
245
|
+
}
|
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type ThemeName = "dark" | "light";
|
|
2
|
+
export type Theme = {
|
|
3
|
+
name: ThemeName;
|
|
4
|
+
colors: {
|
|
5
|
+
background: string;
|
|
6
|
+
foreground: string;
|
|
7
|
+
assistantForeground: string;
|
|
8
|
+
muted: string;
|
|
9
|
+
headerForeground: string;
|
|
10
|
+
headerBackground: string;
|
|
11
|
+
statusForeground: string;
|
|
12
|
+
statusBackground: string;
|
|
13
|
+
inputForeground: string;
|
|
14
|
+
inputBackground: string;
|
|
15
|
+
inputBorder: string;
|
|
16
|
+
userMessageBackground: string;
|
|
17
|
+
inputCursorBackground: string;
|
|
18
|
+
popupForeground: string;
|
|
19
|
+
popupBackground: string;
|
|
20
|
+
popupHeaderBackground: string;
|
|
21
|
+
popupBorder: string;
|
|
22
|
+
popupMuted: string;
|
|
23
|
+
popupSelectedForeground: string;
|
|
24
|
+
popupSelectedBackground: string;
|
|
25
|
+
selectionForeground: string;
|
|
26
|
+
selectionBackground: string;
|
|
27
|
+
toastForeground: string;
|
|
28
|
+
toastBackground: string;
|
|
29
|
+
accent: string;
|
|
30
|
+
success: string;
|
|
31
|
+
warning: string;
|
|
32
|
+
info: string;
|
|
33
|
+
toolMutation: string;
|
|
34
|
+
toolSearch: string;
|
|
35
|
+
toolTitle: string;
|
|
36
|
+
thinkingXHigh: string;
|
|
37
|
+
modelOpenAI: string;
|
|
38
|
+
statusDotBase: string;
|
|
39
|
+
statusDotRunningDim: string;
|
|
40
|
+
statusDotThinkingDim: string;
|
|
41
|
+
error: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export declare const THEMES: Record<ThemeName, Theme>;
|
|
45
|
+
export declare const ANSI_RESET = "\u001B[0m";
|
|
46
|
+
export type TextStyleOptions = {
|
|
47
|
+
foreground?: string;
|
|
48
|
+
background?: string;
|
|
49
|
+
bold?: boolean;
|
|
50
|
+
underline?: boolean;
|
|
51
|
+
strikethrough?: boolean;
|
|
52
|
+
};
|
|
53
|
+
export declare function parseThemeName(value: string): ThemeName | undefined;
|
|
54
|
+
export declare function colorize(text: string, options: TextStyleOptions): string;
|
|
55
|
+
export declare function colorLine(text: string, width: number, options: TextStyleOptions): string;
|
|
56
|
+
export declare function padOrTrimPlain(text: string, width: number): string;
|
package/dist/theme.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { padOrTrimDisplay } from "./terminal-width.js";
|
|
2
|
+
export const THEMES = {
|
|
3
|
+
dark: {
|
|
4
|
+
name: "dark",
|
|
5
|
+
colors: {
|
|
6
|
+
background: "#090d13",
|
|
7
|
+
foreground: "#d6deeb",
|
|
8
|
+
assistantForeground: "#c9d1d9",
|
|
9
|
+
muted: "#7d8590",
|
|
10
|
+
headerForeground: "#c9d1d9",
|
|
11
|
+
headerBackground: "#161b22",
|
|
12
|
+
statusForeground: "#8b949e",
|
|
13
|
+
statusBackground: "#090d13",
|
|
14
|
+
inputForeground: "#f0f6fc",
|
|
15
|
+
inputBackground: "#090d13",
|
|
16
|
+
inputBorder: "#30363d",
|
|
17
|
+
userMessageBackground: "#1e1e1e",
|
|
18
|
+
inputCursorBackground: "#7fb3c8",
|
|
19
|
+
popupForeground: "#e6edf3",
|
|
20
|
+
popupBackground: "#1e1e1e",
|
|
21
|
+
popupHeaderBackground: "#2a2f36",
|
|
22
|
+
popupBorder: "#1e1e1e",
|
|
23
|
+
popupMuted: "#8a8a8a",
|
|
24
|
+
popupSelectedForeground: "#090d13",
|
|
25
|
+
popupSelectedBackground: "#7fb3c8",
|
|
26
|
+
selectionForeground: "#ffffff",
|
|
27
|
+
selectionBackground: "#3b82f6",
|
|
28
|
+
toastForeground: "#0d1117",
|
|
29
|
+
toastBackground: "#a7f3d0",
|
|
30
|
+
accent: "#7aa2d6",
|
|
31
|
+
success: "#7ca982",
|
|
32
|
+
warning: "#d49a4a",
|
|
33
|
+
info: "#7fb3c8",
|
|
34
|
+
toolMutation: "#d47aa2",
|
|
35
|
+
toolSearch: "#a889d6",
|
|
36
|
+
toolTitle: "#9aa7b4",
|
|
37
|
+
thinkingXHigh: "#ff8a86",
|
|
38
|
+
modelOpenAI: "#c8b45a",
|
|
39
|
+
statusDotBase: "#30363d",
|
|
40
|
+
statusDotRunningDim: "#30363d",
|
|
41
|
+
statusDotThinkingDim: "#30363d",
|
|
42
|
+
error: "#c96a67",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
light: {
|
|
46
|
+
name: "light",
|
|
47
|
+
colors: {
|
|
48
|
+
background: "#f8fafc",
|
|
49
|
+
foreground: "#1f2937",
|
|
50
|
+
assistantForeground: "#1f2937",
|
|
51
|
+
muted: "#64748b",
|
|
52
|
+
headerForeground: "#0f172a",
|
|
53
|
+
headerBackground: "#e2e8f0",
|
|
54
|
+
statusForeground: "#475569",
|
|
55
|
+
statusBackground: "#f8fafc",
|
|
56
|
+
inputForeground: "#0f172a",
|
|
57
|
+
inputBackground: "#f8fafc",
|
|
58
|
+
inputBorder: "#334155",
|
|
59
|
+
userMessageBackground: "#ffffff",
|
|
60
|
+
inputCursorBackground: "#0284c7",
|
|
61
|
+
popupForeground: "#0f172a",
|
|
62
|
+
popupBackground: "#ffffff",
|
|
63
|
+
popupHeaderBackground: "#f1f5f9",
|
|
64
|
+
popupBorder: "#ffffff",
|
|
65
|
+
popupMuted: "#64748b",
|
|
66
|
+
popupSelectedForeground: "#f8fafc",
|
|
67
|
+
popupSelectedBackground: "#0284c7",
|
|
68
|
+
selectionForeground: "#ffffff",
|
|
69
|
+
selectionBackground: "#2563eb",
|
|
70
|
+
toastForeground: "#064e3b",
|
|
71
|
+
toastBackground: "#bbf7d0",
|
|
72
|
+
accent: "#315f9f",
|
|
73
|
+
success: "#47794c",
|
|
74
|
+
warning: "#9a631d",
|
|
75
|
+
info: "#246b8e",
|
|
76
|
+
toolMutation: "#a33a68",
|
|
77
|
+
toolSearch: "#6d52a5",
|
|
78
|
+
toolTitle: "#526070",
|
|
79
|
+
thinkingXHigh: "#cf333d",
|
|
80
|
+
modelOpenAI: "#75671f",
|
|
81
|
+
statusDotBase: "#334155",
|
|
82
|
+
statusDotRunningDim: "#334155",
|
|
83
|
+
statusDotThinkingDim: "#334155",
|
|
84
|
+
error: "#a44949",
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
export const ANSI_RESET = "\x1b[0m";
|
|
89
|
+
export function parseThemeName(value) {
|
|
90
|
+
return value === "dark" || value === "light" ? value : undefined;
|
|
91
|
+
}
|
|
92
|
+
export function colorize(text, options) {
|
|
93
|
+
const codes = [];
|
|
94
|
+
if (options.bold)
|
|
95
|
+
codes.push("1");
|
|
96
|
+
if (options.underline)
|
|
97
|
+
codes.push("4");
|
|
98
|
+
if (options.strikethrough)
|
|
99
|
+
codes.push("9");
|
|
100
|
+
if (options.foreground)
|
|
101
|
+
codes.push(rgbCode("38", options.foreground));
|
|
102
|
+
if (options.background)
|
|
103
|
+
codes.push(rgbCode("48", options.background));
|
|
104
|
+
return codes.length === 0 ? text : `\x1b[${codes.join(";")}m${text}${ANSI_RESET}`;
|
|
105
|
+
}
|
|
106
|
+
export function colorLine(text, width, options) {
|
|
107
|
+
return colorize(padOrTrimPlain(text, width), options);
|
|
108
|
+
}
|
|
109
|
+
export function padOrTrimPlain(text, width) {
|
|
110
|
+
return padOrTrimDisplay(text, width);
|
|
111
|
+
}
|
|
112
|
+
function rgbCode(prefix, hex) {
|
|
113
|
+
const normalized = hex.replace(/^#/, "");
|
|
114
|
+
const red = Number.parseInt(normalized.slice(0, 2), 16);
|
|
115
|
+
const green = Number.parseInt(normalized.slice(2, 4), 16);
|
|
116
|
+
const blue = Number.parseInt(normalized.slice(4, 6), 16);
|
|
117
|
+
return `${prefix};2;${red};${green};${blue}`;
|
|
118
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isAbsolute, relative, sep } from "node:path";
|
|
2
|
+
import { expandedTextFromParts, resultText, stringArg, summarizePatch } from "./utils.js";
|
|
3
|
+
export const renderApplyPatchTool = (input) => {
|
|
4
|
+
const detailsDiff = diffFromDetails(input.details);
|
|
5
|
+
const argPatch = stringArg(input, ["input", "patch"]);
|
|
6
|
+
const patch = argPatch ?? detailsDiff?.text;
|
|
7
|
+
const path = pathForDisplay(stringArg(input, ["path", "file_path", "filePath"]), input.cwd);
|
|
8
|
+
const summary = summarizePatch(patch) ?? "patch";
|
|
9
|
+
const expanded = expandedTextFromParts({ text: patch }, { text: resultText(input, { empty: !patch }) });
|
|
10
|
+
return {
|
|
11
|
+
headerArgs: summary === "patch" && path ? path : summary,
|
|
12
|
+
bodyStyle: "diff",
|
|
13
|
+
collapsedBody: patch || input.output || summary,
|
|
14
|
+
...expanded,
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
function diffFromDetails(details) {
|
|
18
|
+
if (!isDiffDetails(details))
|
|
19
|
+
return undefined;
|
|
20
|
+
if (typeof details.diff === "string" && details.diff.trim())
|
|
21
|
+
return { text: details.diff.trim() };
|
|
22
|
+
if (typeof details.patch === "string" && details.patch.trim())
|
|
23
|
+
return { text: details.patch.trim() };
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
function isDiffDetails(value) {
|
|
27
|
+
return typeof value === "object" && value !== null;
|
|
28
|
+
}
|
|
29
|
+
function pathForDisplay(filePath, cwd) {
|
|
30
|
+
if (!filePath || !cwd || !isAbsolute(filePath))
|
|
31
|
+
return filePath;
|
|
32
|
+
const relativePath = relative(cwd, filePath);
|
|
33
|
+
if (!relativePath)
|
|
34
|
+
return ".";
|
|
35
|
+
return relativePath === ".." || relativePath.startsWith(`..${sep}`) || isAbsolute(relativePath) ? filePath : relativePath.replace(/\\/gu, "/");
|
|
36
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { compactCommand, renderWithArgsAndResult, stringArg } from "./utils.js";
|
|
2
|
+
export const renderAstTool = (input) => {
|
|
3
|
+
const pattern = compactCommand(stringArg(input, ["pattern", "target", "command"]));
|
|
4
|
+
return renderWithArgsAndResult(input, { headerArgs: pattern, collapsedBody: input.output });
|
|
5
|
+
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { compactProgressBarSegments, formatCompactProgressBar } from "../context-progress-bar.js";
|
|
2
|
+
import { parseArgsText, stringArg } from "./utils.js";
|
|
3
|
+
export const renderCompressTool = (input) => {
|
|
4
|
+
const topic = stringArg(input, ["topic"]);
|
|
5
|
+
const summary = formatCompressSummary(input);
|
|
6
|
+
const header = joinHeaderParts(topic ? { text: topic } : undefined, summary) ?? { text: "" };
|
|
7
|
+
return {
|
|
8
|
+
...(header.text ? { headerArgs: header.text } : {}),
|
|
9
|
+
...((header.segments?.length ?? 0) > 0 ? { headerArgsSegments: header.segments } : {}),
|
|
10
|
+
collapsedBody: "",
|
|
11
|
+
expandedText: fullCompressResponse(input.output, input.status),
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
function formatCompressSummary(input) {
|
|
15
|
+
const { output, isError, status } = input;
|
|
16
|
+
if (!output)
|
|
17
|
+
return { text: status === "running" ? "running…" : "(empty)" };
|
|
18
|
+
if (isError)
|
|
19
|
+
return { text: `error: ${oneLine(output)}` };
|
|
20
|
+
const parsed = parseArgsText(output);
|
|
21
|
+
if (!isRecord(parsed))
|
|
22
|
+
return { text: oneLine(output) };
|
|
23
|
+
return formatCompressSuccess(parsed, input);
|
|
24
|
+
}
|
|
25
|
+
function fullCompressResponse(output, status) {
|
|
26
|
+
if (output.trim())
|
|
27
|
+
return output.trimEnd();
|
|
28
|
+
return status === "running" ? "running…" : "(empty)";
|
|
29
|
+
}
|
|
30
|
+
function formatCompressSuccess(result, input) {
|
|
31
|
+
const tokensSaved = numberValue(result.tokensSaved);
|
|
32
|
+
const contextPercent = numberValue(result.contextPercent);
|
|
33
|
+
const contextTokens = numberValue(result.contextTokens);
|
|
34
|
+
const contextWindow = numberValue(result.contextWindow);
|
|
35
|
+
const activeBlocks = numberValue(result.activeBlocks);
|
|
36
|
+
const totalBlocks = numberValue(result.totalBlocks);
|
|
37
|
+
const prunedTools = numberValue(result.prunedTools);
|
|
38
|
+
const itemCount = numberValue(result.itemCount) ?? sumDefined(numberValue(result.ranges), numberValue(result.messages));
|
|
39
|
+
const summaryTokens = numberValue(result.totalSummaryTokens);
|
|
40
|
+
const compressedContextTokens = contextTokens ?? inferContextTokens(contextPercent, contextWindow);
|
|
41
|
+
const originalContextTokens = compressedContextTokens != null && tokensSaved != null ? compressedContextTokens + tokensSaved : undefined;
|
|
42
|
+
const compressedContextPercent = percentOfOriginalContext(compressedContextTokens, originalContextTokens);
|
|
43
|
+
const barPercent = compressedContextPercent ?? contextPercent;
|
|
44
|
+
const parts = [
|
|
45
|
+
{ text: tokensSaved != null ? `saved ${formatCompactNumber(tokensSaved)}` : "compressed" },
|
|
46
|
+
barPercent != null ? progressPart(barPercent, input, originalContextTokens) : undefined,
|
|
47
|
+
compressedContextPercent != null && contextPercent != null ? { text: `context ${formatPercent(contextPercent)}` } : undefined,
|
|
48
|
+
itemCount != null ? { text: `${itemCount} ${plural(itemCount, "item")}` } : undefined,
|
|
49
|
+
summaryTokens != null ? { text: `${formatCompactNumber(summaryTokens)} summary tokens` } : undefined,
|
|
50
|
+
activeBlocks != null && totalBlocks != null ? { text: `blocks ${activeBlocks}/${totalBlocks}` } : undefined,
|
|
51
|
+
prunedTools != null ? { text: `pruned ${prunedTools} tools` } : undefined,
|
|
52
|
+
barPercent == null && contextTokens != null ? { text: `context ${formatCompactNumber(contextTokens)}` } : undefined,
|
|
53
|
+
].filter((part) => Boolean(part));
|
|
54
|
+
return joinHeaderParts(...parts) ?? { text: "compressed" };
|
|
55
|
+
}
|
|
56
|
+
function progressPart(percent, input, previousContextTokens) {
|
|
57
|
+
const text = `${formatCompactProgressBar(percent)} ${formatPercent(percent)}${previousContextTokens != null ? ` of ${formatCompactNumber(previousContextTokens)}` : ""}`;
|
|
58
|
+
if (!input.colors)
|
|
59
|
+
return { text };
|
|
60
|
+
return {
|
|
61
|
+
text,
|
|
62
|
+
segments: compactProgressBarSegments(0, percent, {
|
|
63
|
+
fill: input.toolColor ?? input.colors.muted,
|
|
64
|
+
track: input.colors.statusDotBase,
|
|
65
|
+
}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function inferContextTokens(contextPercent, contextWindow) {
|
|
69
|
+
if (contextPercent == null || contextWindow == null || contextWindow <= 0)
|
|
70
|
+
return undefined;
|
|
71
|
+
return (contextPercent / 100) * contextWindow;
|
|
72
|
+
}
|
|
73
|
+
function percentOfOriginalContext(compressedContextTokens, originalContextTokens) {
|
|
74
|
+
if (compressedContextTokens == null || originalContextTokens == null || originalContextTokens <= 0)
|
|
75
|
+
return undefined;
|
|
76
|
+
return (compressedContextTokens / originalContextTokens) * 100;
|
|
77
|
+
}
|
|
78
|
+
function joinHeaderParts(...parts) {
|
|
79
|
+
const defined = parts.filter((part) => part !== undefined && Boolean(part.text));
|
|
80
|
+
if (defined.length === 0)
|
|
81
|
+
return undefined;
|
|
82
|
+
const separator = " · ";
|
|
83
|
+
const segments = [];
|
|
84
|
+
let offset = 0;
|
|
85
|
+
for (const [index, part] of defined.entries()) {
|
|
86
|
+
if (index > 0)
|
|
87
|
+
offset += separator.length;
|
|
88
|
+
if (part.segments) {
|
|
89
|
+
for (const segment of part.segments) {
|
|
90
|
+
segments.push({ ...segment, start: offset + segment.start, end: offset + segment.end });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
offset += part.text.length;
|
|
94
|
+
}
|
|
95
|
+
return { text: defined.map((part) => part.text).join(separator), segments };
|
|
96
|
+
}
|
|
97
|
+
function numberValue(value) {
|
|
98
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
99
|
+
}
|
|
100
|
+
function sumDefined(...values) {
|
|
101
|
+
const defined = values.filter((value) => value != null);
|
|
102
|
+
return defined.length > 0 ? defined.reduce((sum, value) => sum + value, 0) : undefined;
|
|
103
|
+
}
|
|
104
|
+
function formatCompactNumber(value) {
|
|
105
|
+
const abs = Math.abs(value);
|
|
106
|
+
if (abs >= 1_000_000)
|
|
107
|
+
return `${trimDecimal(value / 1_000_000)}M`;
|
|
108
|
+
if (abs >= 1_000)
|
|
109
|
+
return `${trimDecimal(value / 1_000)}K`;
|
|
110
|
+
return String(value);
|
|
111
|
+
}
|
|
112
|
+
function formatPercent(value) {
|
|
113
|
+
return `${trimDecimal(value)}%`;
|
|
114
|
+
}
|
|
115
|
+
function trimDecimal(value) {
|
|
116
|
+
return value.toFixed(1).replace(/\.0$/, "");
|
|
117
|
+
}
|
|
118
|
+
function plural(count, word) {
|
|
119
|
+
return count === 1 ? word : `${word}s`;
|
|
120
|
+
}
|
|
121
|
+
function oneLine(text) {
|
|
122
|
+
return text.replace(/\s+/g, " ").trim();
|
|
123
|
+
}
|
|
124
|
+
function isRecord(value) {
|
|
125
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
126
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { renderApplyPatchTool } from "./apply-patch.js";
|
|
2
|
+
import { renderAstTool } from "./ast.js";
|
|
3
|
+
import { renderCompressTool } from "./compress.js";
|
|
4
|
+
import { renderQuestionTool } from "./question.js";
|
|
5
|
+
import { renderReadTool } from "./read.js";
|
|
6
|
+
import { renderRepoTool } from "./repo.js";
|
|
7
|
+
import { renderShellTool } from "./shell.js";
|
|
8
|
+
import { applySkillReadDisplay } from "./skill.js";
|
|
9
|
+
import { renderSubagentsTool } from "./subagents.js";
|
|
10
|
+
import { renderTodoTool } from "./todo.js";
|
|
11
|
+
import { defaultToolRender, normalizeToolName } from "./utils.js";
|
|
12
|
+
import { renderWebFetchTool, renderWebSearchTool } from "./web.js";
|
|
13
|
+
import { renderWriteTool } from "./write.js";
|
|
14
|
+
const TOOL_RENDERERS = {
|
|
15
|
+
bash: renderShellTool,
|
|
16
|
+
Bash: renderShellTool,
|
|
17
|
+
shell: renderShellTool,
|
|
18
|
+
shell_command: renderShellTool,
|
|
19
|
+
read: renderReadTool,
|
|
20
|
+
Read: renderReadTool,
|
|
21
|
+
apply_patch: renderApplyPatchTool,
|
|
22
|
+
edit: renderApplyPatchTool,
|
|
23
|
+
Edit: renderApplyPatchTool,
|
|
24
|
+
write: renderWriteTool,
|
|
25
|
+
Write: renderWriteTool,
|
|
26
|
+
ast_grep: renderAstTool,
|
|
27
|
+
ast_apply: renderAstTool,
|
|
28
|
+
web_search: renderWebSearchTool,
|
|
29
|
+
web_fetch: renderWebFetchTool,
|
|
30
|
+
todo: renderTodoTool,
|
|
31
|
+
question: renderQuestionTool,
|
|
32
|
+
subagents: renderSubagentsTool,
|
|
33
|
+
compress: renderCompressTool,
|
|
34
|
+
};
|
|
35
|
+
const PREFIX_RENDERERS = [
|
|
36
|
+
["repo_", renderRepoTool],
|
|
37
|
+
["ast_", renderAstTool],
|
|
38
|
+
];
|
|
39
|
+
export function renderToolDisplay(input) {
|
|
40
|
+
const normalizedName = normalizeToolName(input.toolName);
|
|
41
|
+
const exact = TOOL_RENDERERS[input.toolName] ?? TOOL_RENDERERS[normalizedName];
|
|
42
|
+
const rendered = exact?.(input) ?? PREFIX_RENDERERS.find(([prefix]) => normalizedName.startsWith(prefix))?.[1](input);
|
|
43
|
+
return applySkillReadDisplay(input, rendered ?? defaultToolRender(input));
|
|
44
|
+
}
|