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
package/dist/config.js
ADDED
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
import { readFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { applyEdits, modify, parse } from "jsonc-parser";
|
|
5
|
+
import { appIconThemeFromFallbackFlag, appIconThemeOverrideFromEnv, parseAppIconThemeName, resolveAppIconThemeNameFromEnv, } from "./app/icons.js";
|
|
6
|
+
import { DEFAULT_PIX_CONFIG_JSONC } from "./default-pix-config.js";
|
|
7
|
+
export function getPixConfigPath(homeDir = homedir()) {
|
|
8
|
+
return join(homeDir, ".config", "pi", "pix.jsonc");
|
|
9
|
+
}
|
|
10
|
+
const PIX_CONFIG_PATH = getPixConfigPath();
|
|
11
|
+
const DEFAULT_TOOL_RENDERER = {
|
|
12
|
+
default: {
|
|
13
|
+
previewLines: 0,
|
|
14
|
+
direction: "head",
|
|
15
|
+
color: "toolTitle",
|
|
16
|
+
},
|
|
17
|
+
tools: {
|
|
18
|
+
bash: { previewLines: 6, direction: "tail", color: "warning" },
|
|
19
|
+
Bash: { previewLines: 6, direction: "tail", color: "warning" },
|
|
20
|
+
shell: { previewLines: 6, direction: "tail", color: "warning" },
|
|
21
|
+
shell_command: { previewLines: 6, direction: "tail", color: "warning" },
|
|
22
|
+
"repo_*": { previewLines: 6, direction: "head", color: "warning" },
|
|
23
|
+
apply_patch: { previewLines: 9999, direction: "head", color: "toolMutation", defaultExpanded: true },
|
|
24
|
+
edit: { previewLines: 9999, direction: "head", color: "toolMutation", defaultExpanded: true },
|
|
25
|
+
Edit: { previewLines: 9999, direction: "head", color: "toolMutation", defaultExpanded: true },
|
|
26
|
+
write: { previewLines: 9999, direction: "head", color: "toolMutation", defaultExpanded: true },
|
|
27
|
+
Write: { previewLines: 9999, direction: "head", color: "toolMutation", defaultExpanded: true },
|
|
28
|
+
ast_apply: { previewLines: 9999, direction: "head", color: "toolMutation", defaultExpanded: true },
|
|
29
|
+
Read: { previewLines: 0, direction: "head", color: "success" },
|
|
30
|
+
read: { previewLines: 0, direction: "head", color: "success" },
|
|
31
|
+
ast_grep: { previewLines: 6, direction: "head", color: "toolSearch" },
|
|
32
|
+
compress: { previewLines: 0, direction: "head", color: "info" },
|
|
33
|
+
web_search: { previewLines: 6, direction: "tail", color: "toolSearch" },
|
|
34
|
+
web_fetch: { previewLines: 12, direction: "tail", color: "toolSearch" },
|
|
35
|
+
question: { previewLines: 6, direction: "tail", color: "accent" },
|
|
36
|
+
subagents: { previewLines: 0, direction: "tail", color: "muted" },
|
|
37
|
+
todo: { hidden: true, color: "accent" },
|
|
38
|
+
ls: { color: "success" },
|
|
39
|
+
LS: { color: "success" },
|
|
40
|
+
grep: { color: "toolSearch" },
|
|
41
|
+
Grep: { color: "toolSearch" },
|
|
42
|
+
find: { color: "toolSearch" },
|
|
43
|
+
Glob: { color: "toolSearch" },
|
|
44
|
+
"ast_*": { color: "toolSearch" },
|
|
45
|
+
skill: { previewLines: 0, color: "toolSearch" },
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
const DEFAULT_OUTPUT_FILTERS = {
|
|
49
|
+
patterns: [],
|
|
50
|
+
};
|
|
51
|
+
const DEFAULT_PROMPT_ENHANCER = {
|
|
52
|
+
modelRef: "zai/glm-5-turbo",
|
|
53
|
+
};
|
|
54
|
+
const DEFAULT_MODEL_COLORS = {
|
|
55
|
+
rules: {
|
|
56
|
+
"zai/*": "success",
|
|
57
|
+
"openai-codex/*": "modelOpenAI",
|
|
58
|
+
"antigravity/*": "warning",
|
|
59
|
+
"antigravity/antigravity-claude-*": "error",
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const DEFAULT_ICON_THEME = {
|
|
63
|
+
name: "nerdFont",
|
|
64
|
+
};
|
|
65
|
+
const DEFAULT_DICTATION = {
|
|
66
|
+
language: "en",
|
|
67
|
+
languages: {
|
|
68
|
+
en: {
|
|
69
|
+
dirName: "vosk-model-small-en-us-0.15",
|
|
70
|
+
url: "https://alphacephei.com/vosk/models/vosk-model-small-en-us-0.15.zip",
|
|
71
|
+
label: "English",
|
|
72
|
+
},
|
|
73
|
+
ru: {
|
|
74
|
+
dirName: "vosk-model-small-ru-0.22",
|
|
75
|
+
url: "https://alphacephei.com/vosk/models/vosk-model-small-ru-0.22.zip",
|
|
76
|
+
label: "Russian",
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
const DCP_ID_METADATA_SAMPLE = "<dcp-id>m001</dcp-id>";
|
|
81
|
+
const DCP_ID_METADATA_PREFIX = "<dcp-id>m";
|
|
82
|
+
const DCP_ID_METADATA_SUFFIX = "</dcp-id>";
|
|
83
|
+
const DCP_XML_PAIRED_TAG_RE = /<dcp[^>]*>[\s\S]*?<\/dcp[^>]*>/gi;
|
|
84
|
+
const DCP_XML_OPEN_TAG_TO_END_RE = /<dcp[^>]*>[\s\S]*$/gi;
|
|
85
|
+
const DCP_XML_UNPAIRED_TAG_RE = /<\/?dcp[^>]*>/gi;
|
|
86
|
+
const DCP_MARKDOWN_REFERENCE_RE = /[ \t]*\[dcp(?:-[a-z0-9-]+)?\]:[ \t]*#(?:[ \t]+\([^\n]*\))?[ \t]*/gi;
|
|
87
|
+
const DCP_MARKDOWN_REFERENCE_LINE_RE = /^[ \t]*\[dcp(?:-[a-z0-9-]+)?\]:[ \t]*#(?:[ \t]+\([^\n]*\))?[ \t]*$/i;
|
|
88
|
+
const DCP_MARKDOWN_REFERENCE_PENDING_RE = /^\[d(?:c(?:p(?:-[a-z0-9-]*)?)?)?(?:\]?(?::[ \t]*#?(?:[ \t]*\([^\)\n]*)?)?)?$/i;
|
|
89
|
+
const DCP_XML_METADATA_LINE_RE = /^[ \t]*<dcp[^>]*>(?:[\s\S]*?<\/dcp[^>]*>)?[ \t]*$/i;
|
|
90
|
+
const DCP_DISPLAY_QUICK_CHECK_RE = /<\/?d(?:c(?:p)?)?|\[d(?:c(?:p)?)?/i;
|
|
91
|
+
function parseJsonc(text) {
|
|
92
|
+
return parse(text, undefined, { allowTrailingComma: true });
|
|
93
|
+
}
|
|
94
|
+
function isPlainObject(value) {
|
|
95
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
96
|
+
}
|
|
97
|
+
function extractToolRendererConfig(raw) {
|
|
98
|
+
if (!isPlainObject(raw))
|
|
99
|
+
return undefined;
|
|
100
|
+
const tr = raw.toolRenderer;
|
|
101
|
+
if (!isPlainObject(tr))
|
|
102
|
+
return undefined;
|
|
103
|
+
const defaultRule = extractToolRendererRule(tr.default);
|
|
104
|
+
const tools = {};
|
|
105
|
+
if (isPlainObject(tr.tools)) {
|
|
106
|
+
for (const [key, value] of Object.entries(tr.tools)) {
|
|
107
|
+
const rule = extractToolRendererRule(value);
|
|
108
|
+
if (rule)
|
|
109
|
+
tools[key] = rule;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
default: defaultRule ?? DEFAULT_TOOL_RENDERER.default,
|
|
114
|
+
tools,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function extractOutputFiltersConfig(raw) {
|
|
118
|
+
if (!isPlainObject(raw))
|
|
119
|
+
return undefined;
|
|
120
|
+
const filters = raw.outputFilters;
|
|
121
|
+
if (!isPlainObject(filters))
|
|
122
|
+
return undefined;
|
|
123
|
+
const configuredPatterns = filters.patterns ?? filters.samples;
|
|
124
|
+
const patterns = Array.isArray(configuredPatterns)
|
|
125
|
+
? configuredPatterns.filter((pattern) => typeof pattern === "string" && pattern.trim().length > 0)
|
|
126
|
+
: undefined;
|
|
127
|
+
return patterns ? { patterns } : undefined;
|
|
128
|
+
}
|
|
129
|
+
function extractPromptEnhancerConfig(raw) {
|
|
130
|
+
if (!isPlainObject(raw))
|
|
131
|
+
return undefined;
|
|
132
|
+
const enhancer = raw.promptEnhancer;
|
|
133
|
+
if (!isPlainObject(enhancer))
|
|
134
|
+
return undefined;
|
|
135
|
+
const modelRef = nonEmptyString(enhancer.modelRef) ?? nonEmptyString(enhancer.model);
|
|
136
|
+
return modelRef ? { modelRef } : undefined;
|
|
137
|
+
}
|
|
138
|
+
function extractModelColorsConfig(raw) {
|
|
139
|
+
if (!isPlainObject(raw))
|
|
140
|
+
return undefined;
|
|
141
|
+
const modelColors = raw.modelColors;
|
|
142
|
+
if (!isPlainObject(modelColors))
|
|
143
|
+
return undefined;
|
|
144
|
+
const source = isPlainObject(modelColors.rules) ? modelColors.rules : modelColors;
|
|
145
|
+
const rules = {};
|
|
146
|
+
for (const [pattern, color] of Object.entries(source)) {
|
|
147
|
+
if (pattern === "rules" || typeof color !== "string")
|
|
148
|
+
continue;
|
|
149
|
+
const trimmedPattern = pattern.trim();
|
|
150
|
+
const trimmedColor = color.trim();
|
|
151
|
+
if (trimmedPattern.length > 0 && trimmedColor.length > 0)
|
|
152
|
+
rules[trimmedPattern] = trimmedColor;
|
|
153
|
+
}
|
|
154
|
+
return Object.keys(rules).length > 0 ? { rules } : undefined;
|
|
155
|
+
}
|
|
156
|
+
function extractIconThemeConfig(raw) {
|
|
157
|
+
if (!isPlainObject(raw))
|
|
158
|
+
return undefined;
|
|
159
|
+
const iconTheme = raw.iconTheme ?? raw.icons;
|
|
160
|
+
const directTheme = parseAppIconThemeName(iconTheme) ?? appIconThemeFromFallbackFlag(iconTheme);
|
|
161
|
+
if (directTheme)
|
|
162
|
+
return { name: directTheme };
|
|
163
|
+
if (!isPlainObject(iconTheme))
|
|
164
|
+
return undefined;
|
|
165
|
+
const configuredTheme = parseAppIconThemeName(iconTheme.name)
|
|
166
|
+
?? parseAppIconThemeName(iconTheme.theme)
|
|
167
|
+
?? appIconThemeFromFallbackFlag(iconTheme.useFallback)
|
|
168
|
+
?? appIconThemeFromFallbackFlag(iconTheme.fallback);
|
|
169
|
+
return configuredTheme ? { name: configuredTheme } : undefined;
|
|
170
|
+
}
|
|
171
|
+
function extractDictationConfig(raw) {
|
|
172
|
+
if (!isPlainObject(raw))
|
|
173
|
+
return undefined;
|
|
174
|
+
const dictation = raw.dictation ?? raw.voiceInput ?? raw.voice;
|
|
175
|
+
if (!isPlainObject(dictation))
|
|
176
|
+
return undefined;
|
|
177
|
+
const configuredLanguages = dictation.languages ?? dictation.models;
|
|
178
|
+
if (!isPlainObject(configuredLanguages))
|
|
179
|
+
return undefined;
|
|
180
|
+
const languages = {};
|
|
181
|
+
for (const [rawKey, value] of Object.entries(configuredLanguages)) {
|
|
182
|
+
const key = rawKey.trim().toLowerCase();
|
|
183
|
+
if (!key || !isPlainObject(value))
|
|
184
|
+
continue;
|
|
185
|
+
const dirName = nonEmptyString(value.dirName) ?? nonEmptyString(value.model) ?? nonEmptyString(value.modelDir);
|
|
186
|
+
const url = nonEmptyString(value.url);
|
|
187
|
+
const label = nonEmptyString(value.label) ?? key.toUpperCase();
|
|
188
|
+
if (!dirName || !url)
|
|
189
|
+
continue;
|
|
190
|
+
languages[key] = { dirName, url, label };
|
|
191
|
+
}
|
|
192
|
+
const language = normalizeDictationLanguage(dictation.language)
|
|
193
|
+
?? normalizeDictationLanguage(dictation.selectedLanguage)
|
|
194
|
+
?? normalizeDictationLanguage(dictation.currentLanguage);
|
|
195
|
+
const selectedLanguage = language && languages[language] ? language : undefined;
|
|
196
|
+
return Object.keys(languages).length > 0 ? {
|
|
197
|
+
...(selectedLanguage ? { language: selectedLanguage } : {}),
|
|
198
|
+
languages,
|
|
199
|
+
} : undefined;
|
|
200
|
+
}
|
|
201
|
+
function normalizeDictationLanguage(value) {
|
|
202
|
+
if (typeof value !== "string")
|
|
203
|
+
return undefined;
|
|
204
|
+
const normalized = value.trim().toLowerCase();
|
|
205
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
206
|
+
}
|
|
207
|
+
function nonEmptyString(value) {
|
|
208
|
+
if (typeof value !== "string")
|
|
209
|
+
return undefined;
|
|
210
|
+
const trimmed = value.trim();
|
|
211
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
212
|
+
}
|
|
213
|
+
function defaultPixConfig() {
|
|
214
|
+
return {
|
|
215
|
+
toolRenderer: DEFAULT_TOOL_RENDERER,
|
|
216
|
+
outputFilters: DEFAULT_OUTPUT_FILTERS,
|
|
217
|
+
promptEnhancer: DEFAULT_PROMPT_ENHANCER,
|
|
218
|
+
modelColors: DEFAULT_MODEL_COLORS,
|
|
219
|
+
iconTheme: { name: resolveAppIconThemeNameFromEnv() },
|
|
220
|
+
dictation: DEFAULT_DICTATION,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function extractToolRendererRule(value) {
|
|
224
|
+
if (!isPlainObject(value))
|
|
225
|
+
return undefined;
|
|
226
|
+
const rule = {};
|
|
227
|
+
if (typeof value.previewLines === "number")
|
|
228
|
+
rule.previewLines = value.previewLines;
|
|
229
|
+
if (value.direction === "head" || value.direction === "tail")
|
|
230
|
+
rule.direction = value.direction;
|
|
231
|
+
if (typeof value.color === "string")
|
|
232
|
+
rule.color = value.color;
|
|
233
|
+
if (typeof value.defaultExpanded === "boolean")
|
|
234
|
+
rule.defaultExpanded = value.defaultExpanded;
|
|
235
|
+
if (value.compactHidden === true)
|
|
236
|
+
rule.compactHidden = true;
|
|
237
|
+
if (typeof value.hidden === "boolean")
|
|
238
|
+
rule.hidden = value.hidden;
|
|
239
|
+
return Object.keys(rule).length > 0 ? rule : undefined;
|
|
240
|
+
}
|
|
241
|
+
function isFileExistsError(error) {
|
|
242
|
+
return typeof error === "object" && error !== null && "code" in error
|
|
243
|
+
&& error.code === "EEXIST";
|
|
244
|
+
}
|
|
245
|
+
function ensurePixConfigExists(configPath) {
|
|
246
|
+
if (existsSync(configPath))
|
|
247
|
+
return;
|
|
248
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
249
|
+
try {
|
|
250
|
+
writeFileSync(configPath, DEFAULT_PIX_CONFIG_JSONC, { encoding: "utf8", flag: "wx" });
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (isFileExistsError(error))
|
|
254
|
+
return;
|
|
255
|
+
throw error;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
export function loadPixConfig() {
|
|
259
|
+
const configPath = PIX_CONFIG_PATH;
|
|
260
|
+
try {
|
|
261
|
+
ensurePixConfigExists(configPath);
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
process.stderr.write(`[pix] Failed to create ${configPath}: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
265
|
+
return defaultPixConfig();
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
const raw = readFileSync(configPath, "utf8");
|
|
269
|
+
const parsed = parseJsonc(raw);
|
|
270
|
+
const toolRenderer = extractToolRendererConfig(parsed) ?? DEFAULT_TOOL_RENDERER;
|
|
271
|
+
const outputFilters = extractOutputFiltersConfig(parsed) ?? DEFAULT_OUTPUT_FILTERS;
|
|
272
|
+
const promptEnhancer = extractPromptEnhancerConfig(parsed) ?? DEFAULT_PROMPT_ENHANCER;
|
|
273
|
+
const modelColors = extractModelColorsConfig(parsed) ?? DEFAULT_MODEL_COLORS;
|
|
274
|
+
const configuredIconTheme = extractIconThemeConfig(parsed) ?? DEFAULT_ICON_THEME;
|
|
275
|
+
const iconTheme = { name: appIconThemeOverrideFromEnv() ?? configuredIconTheme.name };
|
|
276
|
+
const dictation = extractDictationConfig(parsed) ?? DEFAULT_DICTATION;
|
|
277
|
+
return { toolRenderer, outputFilters, promptEnhancer, modelColors, iconTheme, dictation };
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
process.stderr.write(`[pix] Failed to load ${configPath}: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
281
|
+
return defaultPixConfig();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
export function savePixDictationLanguage(language) {
|
|
285
|
+
const normalizedLanguage = normalizeDictationLanguage(language);
|
|
286
|
+
if (!normalizedLanguage)
|
|
287
|
+
return;
|
|
288
|
+
const configPath = PIX_CONFIG_PATH;
|
|
289
|
+
const source = existsSync(configPath) ? readFileSync(configPath, "utf8") : "{\n}\n";
|
|
290
|
+
const updated = upsertPixDictationLanguageInJsonc(source, normalizedLanguage);
|
|
291
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
292
|
+
writeFileSync(configPath, updated);
|
|
293
|
+
}
|
|
294
|
+
export function upsertPixDictationLanguageInJsonc(source, language) {
|
|
295
|
+
const normalizedLanguage = normalizeDictationLanguage(language);
|
|
296
|
+
if (!normalizedLanguage)
|
|
297
|
+
return source;
|
|
298
|
+
const edits = modify(source, ["dictation", "language"], normalizedLanguage, {
|
|
299
|
+
formattingOptions: { insertSpaces: true, tabSize: 2 },
|
|
300
|
+
getInsertionIndex: (properties) => properties.includes("languages") ? 0 : properties.length,
|
|
301
|
+
});
|
|
302
|
+
return applyEdits(source, edits);
|
|
303
|
+
}
|
|
304
|
+
export function resolveModelColor(modelRef, config) {
|
|
305
|
+
const normalizedModelRef = modelRef.trim().toLowerCase();
|
|
306
|
+
if (!normalizedModelRef)
|
|
307
|
+
return undefined;
|
|
308
|
+
let bestColor;
|
|
309
|
+
let bestSpecificity = -1;
|
|
310
|
+
for (const [pattern, color] of Object.entries(config.rules)) {
|
|
311
|
+
const normalizedPattern = pattern.trim().toLowerCase();
|
|
312
|
+
if (!normalizedPattern || !globMatch(normalizedPattern, normalizedModelRef))
|
|
313
|
+
continue;
|
|
314
|
+
const specificity = normalizedPattern.replace(/\*/gu, "").length;
|
|
315
|
+
if (specificity > bestSpecificity) {
|
|
316
|
+
bestColor = color;
|
|
317
|
+
bestSpecificity = specificity;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return bestColor;
|
|
321
|
+
}
|
|
322
|
+
export function compileOutputFilterPatterns(patterns) {
|
|
323
|
+
return patterns.flatMap((pattern) => compileOutputFilterPattern(pattern));
|
|
324
|
+
}
|
|
325
|
+
export function stripDcpDisplayMetadata(text) {
|
|
326
|
+
if (text.length === 0 || !DCP_DISPLAY_QUICK_CHECK_RE.test(text))
|
|
327
|
+
return text;
|
|
328
|
+
let cleaned = stripDcpDisplayMetadataLines(text);
|
|
329
|
+
// Strip fully paired XML-style DCP tags first. During streaming, strip an
|
|
330
|
+
// unterminated opening XML tag and everything after it before removing
|
|
331
|
+
// orphan tags, otherwise `<dcp-id>m123` would leave `m123` behind.
|
|
332
|
+
cleaned = cleaned
|
|
333
|
+
.replace(DCP_XML_PAIRED_TAG_RE, "")
|
|
334
|
+
.replace(DCP_XML_OPEN_TAG_TO_END_RE, "")
|
|
335
|
+
.replace(DCP_XML_UNPAIRED_TAG_RE, "");
|
|
336
|
+
// Hide a partially streamed markdown reference line before the complete-line
|
|
337
|
+
// regex can strip the prefix and strand the `(m123` payload.
|
|
338
|
+
cleaned = suppressPendingDcpIdMetadataLine(cleaned).replace(DCP_MARKDOWN_REFERENCE_RE, "");
|
|
339
|
+
cleaned = suppressPendingDcpIdMetadataLine(cleaned);
|
|
340
|
+
cleaned = stripDcpDisplayMetadataLines(cleaned);
|
|
341
|
+
return cleaned.replace(/\n{3,}/g, "\n\n").trimEnd();
|
|
342
|
+
}
|
|
343
|
+
function stripDcpDisplayMetadataLines(text) {
|
|
344
|
+
if (text.length === 0)
|
|
345
|
+
return text;
|
|
346
|
+
let removed = false;
|
|
347
|
+
const keptLines = text.split("\n").filter((line) => {
|
|
348
|
+
const normalizedLine = line.replace(/\r$/u, "");
|
|
349
|
+
const isMetadataLine = DCP_MARKDOWN_REFERENCE_LINE_RE.test(normalizedLine) || DCP_XML_METADATA_LINE_RE.test(normalizedLine);
|
|
350
|
+
if (isMetadataLine)
|
|
351
|
+
removed = true;
|
|
352
|
+
return !isMetadataLine;
|
|
353
|
+
});
|
|
354
|
+
return removed ? keptLines.join("\n") : text;
|
|
355
|
+
}
|
|
356
|
+
export function applyOutputFilters(text, filters) {
|
|
357
|
+
if (filters.length === 0 || text.length === 0)
|
|
358
|
+
return text;
|
|
359
|
+
const lines = text.split("\n");
|
|
360
|
+
const filteredLines = [];
|
|
361
|
+
let previousLineWasRemoved = false;
|
|
362
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
363
|
+
const line = lines[index] ?? "";
|
|
364
|
+
const isTrailingLineBreakFromRemovedLine = line.length === 0 && index === lines.length - 1 && previousLineWasRemoved;
|
|
365
|
+
if (isTrailingLineBreakFromRemovedLine)
|
|
366
|
+
continue;
|
|
367
|
+
const filtered = applyOutputFiltersToLine(line, filters);
|
|
368
|
+
if (filtered !== line && filtered.trim().length === 0) {
|
|
369
|
+
previousLineWasRemoved = true;
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
filteredLines.push(filtered);
|
|
373
|
+
previousLineWasRemoved = false;
|
|
374
|
+
}
|
|
375
|
+
return filteredLines.join("\n");
|
|
376
|
+
}
|
|
377
|
+
export function outputFiltersRemoveDcpIdMetadataLine(filters) {
|
|
378
|
+
return filters.length > 0 && applyOutputFilters(DCP_ID_METADATA_SAMPLE, filters).length === 0;
|
|
379
|
+
}
|
|
380
|
+
export function suppressPendingDcpIdMetadataLine(text) {
|
|
381
|
+
if (text.length === 0)
|
|
382
|
+
return text;
|
|
383
|
+
const lineStart = text.lastIndexOf("\n") + 1;
|
|
384
|
+
const line = text.slice(lineStart);
|
|
385
|
+
if (!isPendingDcpIdMetadataLine(line))
|
|
386
|
+
return text;
|
|
387
|
+
// Hide the still-streaming metadata line and its line break until it either
|
|
388
|
+
// becomes a complete filtered line or diverges from the metadata prefix.
|
|
389
|
+
return lineStart > 0 ? text.slice(0, lineStart - 1) : "";
|
|
390
|
+
}
|
|
391
|
+
function isPendingDcpIdMetadataLine(line) {
|
|
392
|
+
const candidate = line.trimStart();
|
|
393
|
+
if (candidate.length === 0)
|
|
394
|
+
return false;
|
|
395
|
+
return isPendingXmlDcpIdMetadataLine(candidate) || isPendingMarkdownDcpMetadataLine(candidate);
|
|
396
|
+
}
|
|
397
|
+
function isPendingXmlDcpIdMetadataLine(candidate) {
|
|
398
|
+
if (DCP_ID_METADATA_PREFIX.startsWith(candidate))
|
|
399
|
+
return true;
|
|
400
|
+
if (!candidate.startsWith(DCP_ID_METADATA_PREFIX))
|
|
401
|
+
return false;
|
|
402
|
+
const afterPrefix = candidate.slice(DCP_ID_METADATA_PREFIX.length);
|
|
403
|
+
const digits = afterPrefix.match(/^\d*/)?.[0] ?? "";
|
|
404
|
+
const afterDigits = afterPrefix.slice(digits.length);
|
|
405
|
+
if (afterDigits.length === 0)
|
|
406
|
+
return true;
|
|
407
|
+
return DCP_ID_METADATA_SUFFIX.startsWith(afterDigits) && afterDigits.length < DCP_ID_METADATA_SUFFIX.length;
|
|
408
|
+
}
|
|
409
|
+
function isPendingMarkdownDcpMetadataLine(candidate) {
|
|
410
|
+
if (DCP_MARKDOWN_REFERENCE_LINE_RE.test(candidate))
|
|
411
|
+
return false;
|
|
412
|
+
return DCP_MARKDOWN_REFERENCE_PENDING_RE.test(candidate);
|
|
413
|
+
}
|
|
414
|
+
function applyOutputFiltersToLine(line, filters) {
|
|
415
|
+
let filtered = line;
|
|
416
|
+
for (const filter of filters) {
|
|
417
|
+
filtered = filtered.replace(filter, "");
|
|
418
|
+
}
|
|
419
|
+
return filtered;
|
|
420
|
+
}
|
|
421
|
+
function compileOutputFilterPattern(pattern) {
|
|
422
|
+
const trimmed = pattern.trim();
|
|
423
|
+
if (!trimmed)
|
|
424
|
+
return [];
|
|
425
|
+
try {
|
|
426
|
+
const regexLiteral = parseRegexLiteral(trimmed);
|
|
427
|
+
if (regexLiteral)
|
|
428
|
+
return [regexLiteral];
|
|
429
|
+
return [new RegExp(globPatternSource(trimmed), "g")];
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
process.stderr.write(`[pix] Ignoring invalid output filter pattern ${JSON.stringify(pattern)}: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
433
|
+
return [];
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function parseRegexLiteral(pattern) {
|
|
437
|
+
if (!pattern.startsWith("/"))
|
|
438
|
+
return undefined;
|
|
439
|
+
const delimiterIndex = pattern.lastIndexOf("/");
|
|
440
|
+
if (delimiterIndex === 0)
|
|
441
|
+
return undefined;
|
|
442
|
+
const source = pattern.slice(1, delimiterIndex);
|
|
443
|
+
const flags = pattern.slice(delimiterIndex + 1);
|
|
444
|
+
return new RegExp(source, flags.includes("g") ? flags : `${flags}g`);
|
|
445
|
+
}
|
|
446
|
+
function globPatternSource(pattern) {
|
|
447
|
+
return pattern.split("*").map(escapeRegex).join("[^\\n]*");
|
|
448
|
+
}
|
|
449
|
+
function escapeRegex(value) {
|
|
450
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
451
|
+
}
|
|
452
|
+
export function resolveToolRule(toolName, config) {
|
|
453
|
+
// Exact match first
|
|
454
|
+
const exact = config.tools[toolName];
|
|
455
|
+
if (exact) {
|
|
456
|
+
const result = {
|
|
457
|
+
previewLines: exact.previewLines ?? config.default.previewLines ?? 3,
|
|
458
|
+
direction: exact.direction ?? config.default.direction ?? "head",
|
|
459
|
+
color: exact.color ?? config.default.color ?? "muted",
|
|
460
|
+
};
|
|
461
|
+
if (exact.defaultExpanded != null)
|
|
462
|
+
result.defaultExpanded = exact.defaultExpanded;
|
|
463
|
+
else if (config.default.defaultExpanded != null)
|
|
464
|
+
result.defaultExpanded = config.default.defaultExpanded;
|
|
465
|
+
if (exact.compactHidden != null)
|
|
466
|
+
result.compactHidden = exact.compactHidden;
|
|
467
|
+
if (exact.hidden != null)
|
|
468
|
+
result.hidden = exact.hidden;
|
|
469
|
+
else if (config.default.hidden != null)
|
|
470
|
+
result.hidden = config.default.hidden;
|
|
471
|
+
return result;
|
|
472
|
+
}
|
|
473
|
+
// Wildcard match (longest pattern wins)
|
|
474
|
+
let bestMatch;
|
|
475
|
+
let bestLength = -1;
|
|
476
|
+
for (const [pattern, rule] of Object.entries(config.tools)) {
|
|
477
|
+
if (!pattern.includes("*"))
|
|
478
|
+
continue;
|
|
479
|
+
if (globMatch(pattern, toolName) && pattern.length > bestLength) {
|
|
480
|
+
bestMatch = rule;
|
|
481
|
+
bestLength = pattern.length;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
if (bestMatch) {
|
|
485
|
+
const result = {
|
|
486
|
+
previewLines: bestMatch.previewLines ?? config.default.previewLines ?? 3,
|
|
487
|
+
direction: bestMatch.direction ?? config.default.direction ?? "head",
|
|
488
|
+
color: bestMatch.color ?? config.default.color ?? "muted",
|
|
489
|
+
};
|
|
490
|
+
if (bestMatch.defaultExpanded != null)
|
|
491
|
+
result.defaultExpanded = bestMatch.defaultExpanded;
|
|
492
|
+
else if (config.default.defaultExpanded != null)
|
|
493
|
+
result.defaultExpanded = config.default.defaultExpanded;
|
|
494
|
+
if (bestMatch.compactHidden != null)
|
|
495
|
+
result.compactHidden = bestMatch.compactHidden;
|
|
496
|
+
if (bestMatch.hidden != null)
|
|
497
|
+
result.hidden = bestMatch.hidden;
|
|
498
|
+
else if (config.default.hidden != null)
|
|
499
|
+
result.hidden = config.default.hidden;
|
|
500
|
+
return result;
|
|
501
|
+
}
|
|
502
|
+
const result = {
|
|
503
|
+
previewLines: config.default.previewLines ?? 3,
|
|
504
|
+
direction: config.default.direction ?? "head",
|
|
505
|
+
color: config.default.color ?? "muted",
|
|
506
|
+
};
|
|
507
|
+
if (config.default.defaultExpanded != null)
|
|
508
|
+
result.defaultExpanded = config.default.defaultExpanded;
|
|
509
|
+
if (config.default.hidden != null)
|
|
510
|
+
result.hidden = config.default.hidden;
|
|
511
|
+
return result;
|
|
512
|
+
}
|
|
513
|
+
function globMatch(pattern, name) {
|
|
514
|
+
const regexStr = "^" + pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*") + "$";
|
|
515
|
+
return new RegExp(regexStr).test(name);
|
|
516
|
+
}
|
|
517
|
+
export function resolveColor(colorRef, themeColors) {
|
|
518
|
+
// If it's a theme color name, look it up
|
|
519
|
+
const themeColor = themeColors[colorRef];
|
|
520
|
+
if (themeColor)
|
|
521
|
+
return themeColor;
|
|
522
|
+
// If it looks like a hex color, return as-is
|
|
523
|
+
if (colorRef.startsWith("#"))
|
|
524
|
+
return colorRef;
|
|
525
|
+
// Fallback to muted
|
|
526
|
+
return themeColors.muted ?? Object.values(themeColors)[0] ?? colorRef;
|
|
527
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Theme } from "./theme.js";
|
|
2
|
+
export type ProgressBarSegment = {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
foreground?: string;
|
|
6
|
+
background?: string;
|
|
7
|
+
bold?: boolean;
|
|
8
|
+
strikethrough?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type CompactProgressBarColors = {
|
|
11
|
+
fill: string;
|
|
12
|
+
track: string;
|
|
13
|
+
emptyForeground?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function formatCompactProgressBar(percent: number, width?: number): string;
|
|
16
|
+
export declare function compactProgressBarSegments(start: number, percent: number, colors: CompactProgressBarColors, width?: number): ProgressBarSegment[];
|
|
17
|
+
export declare function contextUsageProgressColor(percent: number, colors: Theme["colors"]): string;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const COMPACT_PROGRESS_BAR_WIDTH = 5;
|
|
2
|
+
const COMPACT_PROGRESS_BAR_FULL = "█";
|
|
3
|
+
const COMPACT_PROGRESS_BAR_EMPTY = " ";
|
|
4
|
+
const COMPACT_PROGRESS_BAR_PARTIALS = ["▏", "▎", "▍", "▌", "▋", "▊", "▉"];
|
|
5
|
+
export function formatCompactProgressBar(percent, width = COMPACT_PROGRESS_BAR_WIDTH) {
|
|
6
|
+
let result = "";
|
|
7
|
+
for (let index = 0; index < width; index++)
|
|
8
|
+
result += progressBarCell(percent, index, width);
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
export function compactProgressBarSegments(start, percent, colors, width = COMPACT_PROGRESS_BAR_WIDTH) {
|
|
12
|
+
if (start < 0)
|
|
13
|
+
return [];
|
|
14
|
+
const segments = [];
|
|
15
|
+
for (let index = 0; index < width; index++) {
|
|
16
|
+
const active = progressBarCellFill(percent, index, width) > 0;
|
|
17
|
+
segments.push({
|
|
18
|
+
start: start + index,
|
|
19
|
+
end: start + index + 1,
|
|
20
|
+
foreground: active ? colors.fill : colors.emptyForeground ?? colors.fill,
|
|
21
|
+
background: colors.track,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return segments;
|
|
25
|
+
}
|
|
26
|
+
export function contextUsageProgressColor(percent, colors) {
|
|
27
|
+
if (percent <= 30)
|
|
28
|
+
return colors.success;
|
|
29
|
+
if (percent <= 50)
|
|
30
|
+
return colors.warning;
|
|
31
|
+
return colors.error;
|
|
32
|
+
}
|
|
33
|
+
function progressBarCell(percent, index, width) {
|
|
34
|
+
const fill = progressBarCellFill(percent, index, width);
|
|
35
|
+
if (fill >= 1)
|
|
36
|
+
return COMPACT_PROGRESS_BAR_FULL;
|
|
37
|
+
if (fill <= 0)
|
|
38
|
+
return COMPACT_PROGRESS_BAR_EMPTY;
|
|
39
|
+
const partialIndex = Math.max(0, Math.min(COMPACT_PROGRESS_BAR_PARTIALS.length - 1, Math.ceil(fill * COMPACT_PROGRESS_BAR_PARTIALS.length) - 1));
|
|
40
|
+
return COMPACT_PROGRESS_BAR_PARTIALS[partialIndex] ?? COMPACT_PROGRESS_BAR_EMPTY;
|
|
41
|
+
}
|
|
42
|
+
function progressBarCellFill(percent, index, width) {
|
|
43
|
+
const cellSize = 100 / Math.max(1, width);
|
|
44
|
+
return Math.max(0, Math.min(1, (clampProgressPercent(percent) - index * cellSize) / cellSize));
|
|
45
|
+
}
|
|
46
|
+
function clampProgressPercent(percent) {
|
|
47
|
+
return Math.max(0, Math.min(100, percent));
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DEFAULT_PIX_CONFIG_JSONC: string;
|