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/README.md
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# Pix
|
|
2
|
+
|
|
3
|
+
Pix is a custom terminal UI for the Pi coding agent. It is built on the `@earendil-works/pi-coding-agent` SDK and provides its own renderer, input loop, session tabs, tool output controls, extension UI surface, and local voice input.
|
|
4
|
+
|
|
5
|
+
The npm package is currently named `pi-ui-extend` and installs the `pix` CLI.
|
|
6
|
+
|
|
7
|
+
## Highlights
|
|
8
|
+
|
|
9
|
+
- SDK-first Pi runtime integration; Pix does not use Pi's built-in `InteractiveMode`.
|
|
10
|
+
- Custom terminal renderer with streaming assistant output, thinking streams, tool rows, scrollback, and clickable tool expand/collapse state.
|
|
11
|
+
- Workspace-scoped session tabs and persistent Pi sessions.
|
|
12
|
+
- Local shell helpers through `!command` and raw TTY commands through `!!command`.
|
|
13
|
+
- Optional local Vosk voice dictation with Russian and English models.
|
|
14
|
+
- Pix extension UI helpers for toasts, menus, and rows above the input editor.
|
|
15
|
+
- Bundled `pi-tools-suite` payload. On startup, Pix links it into Pi's standard user extension directory.
|
|
16
|
+
|
|
17
|
+
## Requirements
|
|
18
|
+
|
|
19
|
+
- Node.js `24.x` (`24.16.0` is pinned for development).
|
|
20
|
+
- A terminal with good Unicode support. JetBrainsMono Nerd Font is recommended for the default icon theme.
|
|
21
|
+
- Optional for voice input: SoX (`rec`/`sox`), `ffmpeg`, or Linux `arecord`.
|
|
22
|
+
|
|
23
|
+
Development uses `mise` when available. `.node-version` and `.nvmrc` are also provided for other Node version managers.
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
After publication, install Pix globally from npm:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g pi-ui-extend --ignore-scripts
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The published package contains built JavaScript, the `pix` launcher, renderer extensions, documentation, and the bundled `pi-tools-suite` extension payload. Users do not need to clone the repository or build TypeScript locally.
|
|
34
|
+
|
|
35
|
+
On startup, Pix ensures the bundled suite is available at:
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
~/.pi/agent/extensions/pi-tools-suite
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
If that path already contains a real directory, Pix leaves it untouched. If it is a Pix-managed symlink, Pix refreshes it as needed.
|
|
42
|
+
|
|
43
|
+
## Quick start
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pix --cwd /path/to/workspace
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
If `--cwd` is omitted, Pix uses the current directory as the agent workspace.
|
|
50
|
+
|
|
51
|
+
Useful flags:
|
|
52
|
+
|
|
53
|
+
- `--cwd <path>`: workspace used for Pi tools, settings, resources, and sessions.
|
|
54
|
+
- `--no-session`: run with an in-memory SDK session.
|
|
55
|
+
- `--model <provider/model[:thinking]>`: request a specific model, for example `anthropic/claude-sonnet-4-20250514:medium`.
|
|
56
|
+
- `--reload-on-build`: restart the running Pix process after a successful watcher build.
|
|
57
|
+
|
|
58
|
+
## Updating Pix
|
|
59
|
+
|
|
60
|
+
Inside Pix, run:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
/update
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
This checks the currently installed package version without mutating the running process.
|
|
67
|
+
|
|
68
|
+
From a shell:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pix update --check # check only
|
|
72
|
+
pix update # update a package-manager install
|
|
73
|
+
pix update --force # reinstall even when the check cannot prove an update is needed
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`pix update` updates the Pix npm package, pinned Pi SDK dependencies, renderer-owned extensions, and the bundled `pi-tools-suite` payload. The next Pix startup refreshes the extension link in `~/.pi/agent/extensions/pi-tools-suite`.
|
|
77
|
+
|
|
78
|
+
Update checks respect:
|
|
79
|
+
|
|
80
|
+
- `PI_OFFLINE=1`
|
|
81
|
+
- `PI_SKIP_VERSION_CHECK=1`
|
|
82
|
+
- `PIX_SKIP_VERSION_CHECK=1`
|
|
83
|
+
|
|
84
|
+
Pi packages managed separately by Pi still use Pi's package manager:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pi update --extensions
|
|
88
|
+
# or
|
|
89
|
+
pi update
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Local development
|
|
93
|
+
|
|
94
|
+
Install dependencies:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm install --ignore-scripts
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Link the local `pix` command:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run link:pix
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Run Pix against a workspace:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
pix --cwd /path/to/workspace
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
During UI development, run the watcher in another terminal:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
npm run watch:pix
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Each running instance can reload after successful builds:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
PIX_RELOAD_ON_BUILD=1 pix --cwd /path/to/workspace
|
|
122
|
+
# or
|
|
123
|
+
pix --reload-on-build --cwd /path/to/workspace
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
For a one-shot dev launch that rebuilds and refreshes the global link first:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
npm run dev -- --cwd /path/to/workspace
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Before committing code changes, run:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
npm run check
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Configuration
|
|
139
|
+
|
|
140
|
+
Useful environment variables:
|
|
141
|
+
|
|
142
|
+
- `PIX_DISABLE_TERMINAL_OUTPUT_BUFFER=1` or `PIX_TERMINAL_OUTPUT_BUFFER=0`: disable Pix terminal output region buffering.
|
|
143
|
+
- `PIX_USE_FALLBACK_ICONS=1` or `PIX_ICON_THEME=fallback`: use plain fallback icons when Nerd Font glyphs are unavailable.
|
|
144
|
+
- `PIX_ICON_THEME=nerdFont`: force the Nerd Font icon theme.
|
|
145
|
+
- `PIX_ANTIGRAVITY_GOOGLE_CLIENT_ID` / `ANTIGRAVITY_GOOGLE_CLIENT_ID`: Google OAuth client ID used for Antigravity quota/login integrations.
|
|
146
|
+
- `PIX_ANTIGRAVITY_GOOGLE_CLIENT_SECRET` / `ANTIGRAVITY_GOOGLE_CLIENT_SECRET`: Google OAuth client secret used for Antigravity quota/login integrations.
|
|
147
|
+
|
|
148
|
+
Pix user configuration is read from:
|
|
149
|
+
|
|
150
|
+
```text
|
|
151
|
+
~/.config/pi/pix.jsonc
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Example fallback icon configuration:
|
|
155
|
+
|
|
156
|
+
```jsonc
|
|
157
|
+
{
|
|
158
|
+
"iconTheme": "fallback"
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Controls
|
|
163
|
+
|
|
164
|
+
- `Enter`: submit the prompt.
|
|
165
|
+
- `!command`: run a local shell command in an in-chat ephemeral block. Output is visible only in the local UI and is not saved to the SDK session.
|
|
166
|
+
- While a `!command` shell is running: `Enter` sends editor text to shell stdin; `Ctrl+C` interrupts the shell process.
|
|
167
|
+
- `!!command`: run a shell command in the raw interactive terminal for full-screen or TTY programs.
|
|
168
|
+
- `Ctrl+C`: exit Pix, or abort the running agent first.
|
|
169
|
+
- `Ctrl+D`: exit when the input line is empty.
|
|
170
|
+
- `Ctrl+L`: redraw.
|
|
171
|
+
- `Ctrl+G`: start or stop local Vosk voice input.
|
|
172
|
+
- `PageUp` / `PageDown`: scroll the conversation.
|
|
173
|
+
- Mouse wheel: scroll the conversation.
|
|
174
|
+
- Click a tool row: expand or collapse that tool result.
|
|
175
|
+
- Click the right-aligned microphone/language status widget: toggle voice input and switch Russian/English dictation.
|
|
176
|
+
|
|
177
|
+
## Voice input
|
|
178
|
+
|
|
179
|
+
Pix can dictate into the prompt through local Vosk. The first start for each language downloads the small model into the gitignored `models/vosk/` directory inside this project:
|
|
180
|
+
|
|
181
|
+
- Russian: `vosk-model-small-ru-0.22`
|
|
182
|
+
- English: `vosk-model-small-en-us-0.15`
|
|
183
|
+
|
|
184
|
+
Runtime requirements:
|
|
185
|
+
|
|
186
|
+
- Optional npm package `vosk`. Pix installs or rebuilds it automatically with scripts enabled on first voice start if the native binding is missing.
|
|
187
|
+
- A local recorder: SoX (`rec`/`sox`) preferred, or `ffmpeg`; Linux also supports `arecord`.
|
|
188
|
+
- JetBrainsMono Nerd Font for default app icons. On macOS, Pix checks this at startup and can install the Homebrew cask `font-jetbrains-mono-nerd-font` when it is missing.
|
|
189
|
+
|
|
190
|
+
If your terminal renders missing glyphs, start Pix with `PIX_USE_FALLBACK_ICONS=1` or set `iconTheme` to `fallback` in `~/.config/pi/pix.jsonc`.
|
|
191
|
+
|
|
192
|
+
## Pix extension SDK
|
|
193
|
+
|
|
194
|
+
Pix exposes a small SDK surface for extensions that need renderer-specific UI features. Import types and helpers from `pi-ui-extend/sdk`:
|
|
195
|
+
|
|
196
|
+
```ts
|
|
197
|
+
import type {
|
|
198
|
+
ExtensionWidgetFactory,
|
|
199
|
+
PixExtensionUIContext,
|
|
200
|
+
PixMenuItem,
|
|
201
|
+
ToastKind,
|
|
202
|
+
ToastNotifier,
|
|
203
|
+
} from "pi-ui-extend/sdk";
|
|
204
|
+
import { TOAST_KINDS, isToastKind } from "pi-ui-extend/sdk";
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The same public entrypoint is also exported from `pi-ui-extend`, but `pi-ui-extend/sdk` is the preferred explicit import path for extension-facing APIs.
|
|
208
|
+
|
|
209
|
+
### Toasts
|
|
210
|
+
|
|
211
|
+
Pix toasts are stackable by design: showing a new toast does not replace existing visible toasts. Each toast auto-hides independently after the renderer timeout.
|
|
212
|
+
|
|
213
|
+
Supported toast kinds:
|
|
214
|
+
|
|
215
|
+
- `success`
|
|
216
|
+
- `error`
|
|
217
|
+
- `warning`
|
|
218
|
+
- `info`
|
|
219
|
+
|
|
220
|
+
Use `ctx.ui.toast` from a Pix extension UI context:
|
|
221
|
+
|
|
222
|
+
```ts
|
|
223
|
+
export async function activate(ctx: { ui: PixExtensionUIContext }) {
|
|
224
|
+
ctx.ui.toast.success("Saved");
|
|
225
|
+
ctx.ui.toast.error("Build failed");
|
|
226
|
+
ctx.ui.toast.warning("Using fallback model");
|
|
227
|
+
ctx.ui.toast.info("Index refreshed");
|
|
228
|
+
|
|
229
|
+
ctx.ui.toast.show("Custom message", "success");
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
`ctx.ui.notify(message, kind)` also maps to Pix toasts and accepts the same `ToastKind` values:
|
|
234
|
+
|
|
235
|
+
```ts
|
|
236
|
+
ctx.ui.notify("Retry succeeded", "success");
|
|
237
|
+
ctx.ui.notify("Check config", "warning");
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Rendering above the input
|
|
241
|
+
|
|
242
|
+
Use `ctx.ui.aboveInput` to render extension-controlled rows above the prompt editor, in the same area where Pix shows built-in todo and subagents panels.
|
|
243
|
+
|
|
244
|
+
```ts
|
|
245
|
+
ctx.ui.aboveInput.set("my-extension/status", [
|
|
246
|
+
"My extension is watching files",
|
|
247
|
+
"Press /my-command for details",
|
|
248
|
+
]);
|
|
249
|
+
|
|
250
|
+
ctx.ui.aboveInput.clear("my-extension/status");
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
For dynamic content, pass a widget factory. It receives a `WidgetTuiHandle` with `requestRender()`, `showToast()`, `toast`, `showMenu()`, and `menu` helpers, plus the current theme.
|
|
254
|
+
|
|
255
|
+
```ts
|
|
256
|
+
const widget: ExtensionWidgetFactory = (tui) => ({
|
|
257
|
+
render: () => ["Dynamic extension row"],
|
|
258
|
+
invalidate: () => tui.requestRender(),
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
ctx.ui.renderAboveInput("my-extension/dynamic", widget);
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
The lower-level `ctx.ui.setWidget(key, content, { placement })` API is still available. `aboveInput` is the preferred Pix SDK wrapper for rows above the input. Use `placement: "belowEditor"` only when you explicitly need rows below the prompt editor.
|
|
265
|
+
|
|
266
|
+
### Menus
|
|
267
|
+
|
|
268
|
+
Use `ctx.ui.menu.show()` or `ctx.ui.showMenu()` to open a Pix popup menu. The promise resolves to the selected item value, or `undefined` when the menu is cancelled.
|
|
269
|
+
|
|
270
|
+
```ts
|
|
271
|
+
const choice = await ctx.ui.menu.show<string>([
|
|
272
|
+
{ value: "copy", label: "Copy", description: "Copy result" },
|
|
273
|
+
{ value: "open", label: "Open", description: "Open in editor" },
|
|
274
|
+
{ value: "delete", label: "Delete", description: "Remove item", variant: "error" },
|
|
275
|
+
], {
|
|
276
|
+
title: "Choose an action",
|
|
277
|
+
placeholder: "Filter actions",
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
if (choice === "copy") ctx.ui.toast.success("Copied");
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Menu items are searchable by label and `keywords` by default. Pass `searchable: false` to disable filtering. `ctx.ui.select(title, options)` is implemented on top of the same Pix menu renderer for simple string choices.
|
|
284
|
+
|
|
285
|
+
## Release process
|
|
286
|
+
|
|
287
|
+
Maintainers publish a new npm version with:
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
npm run publish-npm # patch release
|
|
291
|
+
npm run publish-npm -- minor # minor release
|
|
292
|
+
npm run publish-npm -- major # major release
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
The publish command requires a clean `master`, runs release checks, bumps the root package version, smoke-tests the packed tarball, and pushes the release tag. GitHub Actions publishes tagged releases to npm using the `NPM_TOKEN` repository secret.
|
|
296
|
+
|
|
297
|
+
For the full release checklist, see [docs/release.md](docs/release.md).
|
|
298
|
+
|
|
299
|
+
## Current limitations
|
|
300
|
+
|
|
301
|
+
Pix is actively evolving. Known gaps include:
|
|
302
|
+
|
|
303
|
+
- Text selection/copy support in the custom renderer.
|
|
304
|
+
- Full prompt editor parity with mature terminal editors.
|
|
305
|
+
- Dedicated session picker/fork UI.
|
|
306
|
+
- Dedicated model picker UI.
|
|
307
|
+
- Extension dialog rendering beyond SDK defaults.
|
package/bin/pix.mjs
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
const requiredNodeMajor = 24;
|
|
8
|
+
const launcherPath = fileURLToPath(import.meta.url);
|
|
9
|
+
const mainPath = fileURLToPath(new URL("../dist/main.js", import.meta.url));
|
|
10
|
+
const updatePath = fileURLToPath(new URL("../dist/app/update.js", import.meta.url));
|
|
11
|
+
const distPath = dirname(mainPath);
|
|
12
|
+
const rawArgs = process.argv.slice(2);
|
|
13
|
+
const childArgs = [];
|
|
14
|
+
let reloadOnBuild = truthyEnv(process.env.PIX_RELOAD_ON_BUILD);
|
|
15
|
+
|
|
16
|
+
if (currentNodeMajor() !== requiredNodeMajor && process.env.PIX_NODE24_REEXEC !== "1") {
|
|
17
|
+
await reexecWithNode24(rawArgs);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
for (const arg of rawArgs) {
|
|
21
|
+
if (arg === "--reload-on-build") {
|
|
22
|
+
reloadOnBuild = true;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (arg === "--no-reload-on-build") {
|
|
26
|
+
reloadOnBuild = false;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
childArgs.push(arg);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (childArgs[0] === "update") {
|
|
33
|
+
if (!existsSync(updatePath)) {
|
|
34
|
+
console.error("pix update is not built yet. Run `npm run build:pix` or update from a published package.");
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const { runPixUpdateCli } = await import(new URL("../dist/app/update.js", import.meta.url));
|
|
38
|
+
process.exit(await runPixUpdateCli(childArgs.slice(1)));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (!existsSync(mainPath)) {
|
|
42
|
+
console.error("pix is not built yet. Run `npm run build:pix` or `npm run watch:pix`.");
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let child = undefined;
|
|
47
|
+
let reloadTimer = undefined;
|
|
48
|
+
let distPollTimer = undefined;
|
|
49
|
+
let distSnapshot = snapshotDist();
|
|
50
|
+
let restarting = false;
|
|
51
|
+
let shuttingDown = false;
|
|
52
|
+
|
|
53
|
+
startChild();
|
|
54
|
+
if (reloadOnBuild) startDistPolling();
|
|
55
|
+
|
|
56
|
+
for (const signal of ["SIGINT", "SIGTERM"]) {
|
|
57
|
+
process.on(signal, () => {
|
|
58
|
+
shuttingDown = true;
|
|
59
|
+
stopDistPolling();
|
|
60
|
+
child?.kill(signal);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function truthyEnv(value) {
|
|
65
|
+
if (!value) return false;
|
|
66
|
+
return !["0", "false", "no", "off"].includes(value.toLowerCase());
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function currentNodeMajor() {
|
|
70
|
+
return Number.parseInt(process.versions.node.split(".")[0] ?? "", 10);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function reexecWithNode24(args) {
|
|
74
|
+
console.error(`[pix] switching from Node ${process.versions.node} to Node 24.16.0`);
|
|
75
|
+
const candidates = node24Candidates(args);
|
|
76
|
+
|
|
77
|
+
for (const candidate of candidates) {
|
|
78
|
+
const result = await runNode24Candidate(candidate.command, candidate.args);
|
|
79
|
+
if (!result.launched) continue;
|
|
80
|
+
if (result.signal) process.exitCode = result.signal === "SIGINT" ? 130 : result.signal === "SIGTERM" ? 143 : 1;
|
|
81
|
+
else process.exitCode = result.code ?? 1;
|
|
82
|
+
process.exit();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
console.error("[pix] Node 24 is required. Install/use it with `mise install node@24.16.0` or set PIX_NODE24=/path/to/node24.");
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function node24Candidates(args) {
|
|
90
|
+
const envNode = process.env.PIX_NODE24;
|
|
91
|
+
return [
|
|
92
|
+
...(envNode ? [{ command: envNode, args: [launcherPath, ...args] }] : []),
|
|
93
|
+
{ command: "mise", args: ["exec", "node@24.16.0", "--", "node", launcherPath, ...args] },
|
|
94
|
+
{ command: "node24", args: [launcherPath, ...args] },
|
|
95
|
+
{ command: "node-24", args: [launcherPath, ...args] },
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function runNode24Candidate(command, args) {
|
|
100
|
+
return await new Promise((resolve) => {
|
|
101
|
+
const child = spawn(command, args, {
|
|
102
|
+
stdio: "inherit",
|
|
103
|
+
env: { ...process.env, PIX_NODE24_REEXEC: "1" },
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
child.once("error", (error) => {
|
|
107
|
+
if (error && error.code === "ENOENT") resolve({ launched: false });
|
|
108
|
+
else {
|
|
109
|
+
console.error(error?.message ?? String(error));
|
|
110
|
+
resolve({ launched: true, code: 1 });
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
child.once("exit", (code, signal) => resolve({ launched: true, code, signal }));
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function startChild() {
|
|
118
|
+
child = spawn(process.execPath, [mainPath, ...childArgs], {
|
|
119
|
+
stdio: "inherit",
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
child.on("error", (error) => {
|
|
123
|
+
console.error(error.message);
|
|
124
|
+
process.exitCode = 1;
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
child.on("exit", (code, signal) => {
|
|
128
|
+
child = undefined;
|
|
129
|
+
if (restarting) return;
|
|
130
|
+
|
|
131
|
+
shuttingDown = true;
|
|
132
|
+
stopDistPolling();
|
|
133
|
+
if (signal) {
|
|
134
|
+
process.exitCode = signal === "SIGINT" ? 130 : signal === "SIGTERM" ? 143 : 1;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
process.exitCode = code ?? 1;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function startDistPolling() {
|
|
142
|
+
const pollInterval = Number(process.env.PIX_RELOAD_POLL_MS ?? 1000);
|
|
143
|
+
distPollTimer = setInterval(() => {
|
|
144
|
+
const nextSnapshot = snapshotDist();
|
|
145
|
+
if (nextSnapshot === distSnapshot) return;
|
|
146
|
+
|
|
147
|
+
distSnapshot = nextSnapshot;
|
|
148
|
+
queueReload();
|
|
149
|
+
}, Number.isFinite(pollInterval) && pollInterval > 0 ? pollInterval : 1000);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function stopDistPolling() {
|
|
153
|
+
if (reloadTimer) clearTimeout(reloadTimer);
|
|
154
|
+
if (distPollTimer) clearInterval(distPollTimer);
|
|
155
|
+
reloadTimer = undefined;
|
|
156
|
+
distPollTimer = undefined;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function queueReload() {
|
|
160
|
+
if (shuttingDown) return;
|
|
161
|
+
if (reloadTimer) clearTimeout(reloadTimer);
|
|
162
|
+
reloadTimer = setTimeout(() => {
|
|
163
|
+
reloadTimer = undefined;
|
|
164
|
+
restartChild();
|
|
165
|
+
}, 250);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function restartChild() {
|
|
169
|
+
if (shuttingDown) return;
|
|
170
|
+
if (!child) {
|
|
171
|
+
startChild();
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
restarting = true;
|
|
176
|
+
const currentChild = child;
|
|
177
|
+
currentChild.once("exit", () => {
|
|
178
|
+
restarting = false;
|
|
179
|
+
if (!shuttingDown) startChild();
|
|
180
|
+
});
|
|
181
|
+
console.error("[pix] dist changed; restarting renderer");
|
|
182
|
+
currentChild.kill("SIGTERM");
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function snapshotDist() {
|
|
186
|
+
let newestMtime = 0;
|
|
187
|
+
let runtimeFileCount = 0;
|
|
188
|
+
const pendingDirs = [distPath];
|
|
189
|
+
|
|
190
|
+
while (pendingDirs.length > 0) {
|
|
191
|
+
const currentDir = pendingDirs.pop();
|
|
192
|
+
if (!currentDir) continue;
|
|
193
|
+
|
|
194
|
+
let entries;
|
|
195
|
+
try {
|
|
196
|
+
entries = readdirSync(currentDir, { withFileTypes: true });
|
|
197
|
+
} catch {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
for (const entry of entries) {
|
|
202
|
+
const entryPath = join(currentDir, entry.name);
|
|
203
|
+
if (entry.isDirectory()) {
|
|
204
|
+
pendingDirs.push(entryPath);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (!entry.isFile() || !entry.name.endsWith(".js")) continue;
|
|
208
|
+
|
|
209
|
+
runtimeFileCount += 1;
|
|
210
|
+
try {
|
|
211
|
+
newestMtime = Math.max(newestMtime, statSync(entryPath).mtimeMs);
|
|
212
|
+
} catch {
|
|
213
|
+
// If tsc is replacing a file while we scan, the next poll will see the final state.
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return `${runtimeFileCount}:${newestMtime}`;
|
|
219
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { AppOptions } from "./types.js";
|
|
2
|
+
export declare class PiUiExtendApp {
|
|
3
|
+
private readonly entries;
|
|
4
|
+
private readonly options;
|
|
5
|
+
private readonly theme;
|
|
6
|
+
private readonly blinkController;
|
|
7
|
+
private readonly screenStyler;
|
|
8
|
+
private readonly statusController;
|
|
9
|
+
private readonly statusLineRenderer;
|
|
10
|
+
private readonly modelUsageController;
|
|
11
|
+
private readonly tabsController;
|
|
12
|
+
private readonly tabLineRenderer;
|
|
13
|
+
private readonly editorLayoutRenderer;
|
|
14
|
+
private readonly renderController;
|
|
15
|
+
private readonly sessionLifecycle;
|
|
16
|
+
private readonly conversationViewport;
|
|
17
|
+
private readonly scrollController;
|
|
18
|
+
private readonly extensionUiController;
|
|
19
|
+
private readonly extensionActions;
|
|
20
|
+
private readonly pixConfig;
|
|
21
|
+
private readonly outputFilters;
|
|
22
|
+
private readonly suppressPendingDcpIdMetadata;
|
|
23
|
+
private readonly commandController;
|
|
24
|
+
private readonly inputActions;
|
|
25
|
+
private readonly inputController;
|
|
26
|
+
private readonly menuItems;
|
|
27
|
+
private readonly subagentsWidgetController;
|
|
28
|
+
private readonly todoWidgetController;
|
|
29
|
+
private readonly terminalController;
|
|
30
|
+
private readonly toastController;
|
|
31
|
+
private readonly nerdFontController;
|
|
32
|
+
private readonly popupActions;
|
|
33
|
+
private readonly promptEnhancer;
|
|
34
|
+
private readonly mouseController;
|
|
35
|
+
private readonly popupMenus;
|
|
36
|
+
private readonly voiceController;
|
|
37
|
+
private readonly sessionEvents;
|
|
38
|
+
private readonly shellController;
|
|
39
|
+
private readonly queuedMessages;
|
|
40
|
+
private readonly workspaceActions;
|
|
41
|
+
private readonly slashCommands;
|
|
42
|
+
private readonly toastNotifier;
|
|
43
|
+
private readonly extensionShutdownHandler;
|
|
44
|
+
private runtime;
|
|
45
|
+
private readonly inputEditor;
|
|
46
|
+
private readonly requestHistory;
|
|
47
|
+
/** Shortcut: get/set the editor text as a plain string. */
|
|
48
|
+
private get input();
|
|
49
|
+
private set input(value);
|
|
50
|
+
private running;
|
|
51
|
+
private todoPanelExpanded;
|
|
52
|
+
private subagentsPanelExpanded;
|
|
53
|
+
private allThinkingExpanded;
|
|
54
|
+
private superCompactTools;
|
|
55
|
+
private voicePartialText;
|
|
56
|
+
private resumeSessions;
|
|
57
|
+
private resumeLoading;
|
|
58
|
+
constructor(options: AppOptions);
|
|
59
|
+
start(): Promise<void>;
|
|
60
|
+
private bindCurrentSession;
|
|
61
|
+
private activateRuntime;
|
|
62
|
+
private createExtensionEventBus;
|
|
63
|
+
private handleTerminalBellAttention;
|
|
64
|
+
private afterSessionReplacement;
|
|
65
|
+
private requireRuntime;
|
|
66
|
+
private restoreSessionStatus;
|
|
67
|
+
private setInput;
|
|
68
|
+
private resetInputAfterProgrammaticEdit;
|
|
69
|
+
private restoreTabInputState;
|
|
70
|
+
private clearPersistedInputDraft;
|
|
71
|
+
private insertVoiceTranscript;
|
|
72
|
+
private setVoicePartialTranscript;
|
|
73
|
+
private addVoiceSystemMessage;
|
|
74
|
+
private resetSessionView;
|
|
75
|
+
private loadSessionHistory;
|
|
76
|
+
private openSearchResultInNewTab;
|
|
77
|
+
private loadSessionHistoryAsync;
|
|
78
|
+
private handleSessionEvent;
|
|
79
|
+
private findEntry;
|
|
80
|
+
private findUserEntry;
|
|
81
|
+
private touchEntry;
|
|
82
|
+
private addEntry;
|
|
83
|
+
private setStatus;
|
|
84
|
+
private setSessionStatus;
|
|
85
|
+
private setSessionActivity;
|
|
86
|
+
private toolDefaultExpanded;
|
|
87
|
+
private stopBlinking;
|
|
88
|
+
private stop;
|
|
89
|
+
private refreshModelUsageStatusFromClick;
|
|
90
|
+
private showToast;
|
|
91
|
+
private clearToastTimers;
|
|
92
|
+
private render;
|
|
93
|
+
private renderStatusLine;
|
|
94
|
+
private terminalColumns;
|
|
95
|
+
private terminalRows;
|
|
96
|
+
}
|