pi-ui-extend 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +307 -0
- package/bin/pix.mjs +219 -0
- package/dist/app/app.d.ts +96 -0
- package/dist/app/app.js +871 -0
- package/dist/app/blink-controller.d.ts +23 -0
- package/dist/app/blink-controller.js +82 -0
- package/dist/app/cli.d.ts +8 -0
- package/dist/app/cli.js +83 -0
- package/dist/app/clipboard.d.ts +1 -0
- package/dist/app/clipboard.js +24 -0
- package/dist/app/command-controller.d.ts +18 -0
- package/dist/app/command-controller.js +58 -0
- package/dist/app/command-host.d.ts +44 -0
- package/dist/app/command-host.js +1 -0
- package/dist/app/command-model-actions.d.ts +12 -0
- package/dist/app/command-model-actions.js +176 -0
- package/dist/app/command-navigation-actions.d.ts +19 -0
- package/dist/app/command-navigation-actions.js +267 -0
- package/dist/app/command-registry.d.ts +32 -0
- package/dist/app/command-registry.js +225 -0
- package/dist/app/command-runtime.d.ts +5 -0
- package/dist/app/command-runtime.js +32 -0
- package/dist/app/command-session-actions.d.ts +20 -0
- package/dist/app/command-session-actions.js +295 -0
- package/dist/app/constants.d.ts +52 -0
- package/dist/app/constants.js +103 -0
- package/dist/app/conversation-entry-renderer.d.ts +21 -0
- package/dist/app/conversation-entry-renderer.js +81 -0
- package/dist/app/conversation-shell-renderer.d.ts +5 -0
- package/dist/app/conversation-shell-renderer.js +43 -0
- package/dist/app/conversation-tool-renderer.d.ts +16 -0
- package/dist/app/conversation-tool-renderer.js +216 -0
- package/dist/app/conversation-viewport.d.ts +55 -0
- package/dist/app/conversation-viewport.js +252 -0
- package/dist/app/dcp-stats.d.ts +2 -0
- package/dist/app/dcp-stats.js +116 -0
- package/dist/app/editor-layout-renderer.d.ts +31 -0
- package/dist/app/editor-layout-renderer.js +211 -0
- package/dist/app/editor-panels.d.ts +4 -0
- package/dist/app/editor-panels.js +130 -0
- package/dist/app/extension-actions-controller.d.ts +22 -0
- package/dist/app/extension-actions-controller.js +60 -0
- package/dist/app/extension-event-bus.d.ts +3 -0
- package/dist/app/extension-event-bus.js +23 -0
- package/dist/app/extension-ui-controller.d.ts +57 -0
- package/dist/app/extension-ui-controller.js +532 -0
- package/dist/app/file-link-opener.d.ts +2 -0
- package/dist/app/file-link-opener.js +66 -0
- package/dist/app/file-links.d.ts +10 -0
- package/dist/app/file-links.js +117 -0
- package/dist/app/guards.d.ts +3 -0
- package/dist/app/guards.js +9 -0
- package/dist/app/icons.d.ts +37 -0
- package/dist/app/icons.js +97 -0
- package/dist/app/id.d.ts +1 -0
- package/dist/app/id.js +4 -0
- package/dist/app/image-click-targets.d.ts +5 -0
- package/dist/app/image-click-targets.js +32 -0
- package/dist/app/image-opener.d.ts +2 -0
- package/dist/app/image-opener.js +64 -0
- package/dist/app/input-action-controller.d.ts +47 -0
- package/dist/app/input-action-controller.js +209 -0
- package/dist/app/input-controller.d.ts +60 -0
- package/dist/app/input-controller.js +425 -0
- package/dist/app/input-paste-handler.d.ts +27 -0
- package/dist/app/input-paste-handler.js +146 -0
- package/dist/app/menu-items-controller.d.ts +32 -0
- package/dist/app/menu-items-controller.js +182 -0
- package/dist/app/message-content.d.ts +8 -0
- package/dist/app/message-content.js +115 -0
- package/dist/app/model-ref.d.ts +13 -0
- package/dist/app/model-ref.js +50 -0
- package/dist/app/model-usage-controller.d.ts +35 -0
- package/dist/app/model-usage-controller.js +99 -0
- package/dist/app/model-usage-status.d.ts +125 -0
- package/dist/app/model-usage-status.js +749 -0
- package/dist/app/mouse-controller.d.ts +182 -0
- package/dist/app/mouse-controller.js +968 -0
- package/dist/app/native-modifiers.d.ts +3 -0
- package/dist/app/native-modifiers.js +60 -0
- package/dist/app/nerd-font-controller.d.ts +11 -0
- package/dist/app/nerd-font-controller.js +90 -0
- package/dist/app/popup-action-controller.d.ts +44 -0
- package/dist/app/popup-action-controller.js +278 -0
- package/dist/app/popup-menu-controller.d.ts +183 -0
- package/dist/app/popup-menu-controller.js +1070 -0
- package/dist/app/prompt-enhancer-controller.d.ts +40 -0
- package/dist/app/prompt-enhancer-controller.js +215 -0
- package/dist/app/queued-message-controller.d.ts +62 -0
- package/dist/app/queued-message-controller.js +377 -0
- package/dist/app/render-controller.d.ts +41 -0
- package/dist/app/render-controller.js +378 -0
- package/dist/app/render-text.d.ts +19 -0
- package/dist/app/render-text.js +67 -0
- package/dist/app/request-history.d.ts +23 -0
- package/dist/app/request-history.js +131 -0
- package/dist/app/runtime.d.ts +39 -0
- package/dist/app/runtime.js +195 -0
- package/dist/app/screen-selection.d.ts +6 -0
- package/dist/app/screen-selection.js +9 -0
- package/dist/app/screen-styler.d.ts +34 -0
- package/dist/app/screen-styler.js +168 -0
- package/dist/app/scroll-controller.d.ts +51 -0
- package/dist/app/scroll-controller.js +207 -0
- package/dist/app/session-event-controller.d.ts +69 -0
- package/dist/app/session-event-controller.js +338 -0
- package/dist/app/session-history.d.ts +23 -0
- package/dist/app/session-history.js +164 -0
- package/dist/app/session-lifecycle-controller.d.ts +55 -0
- package/dist/app/session-lifecycle-controller.js +116 -0
- package/dist/app/session-search.d.ts +24 -0
- package/dist/app/session-search.js +215 -0
- package/dist/app/shell-command.d.ts +27 -0
- package/dist/app/shell-command.js +176 -0
- package/dist/app/shell-controller.d.ts +28 -0
- package/dist/app/shell-controller.js +124 -0
- package/dist/app/slash-commands.d.ts +6 -0
- package/dist/app/slash-commands.js +75 -0
- package/dist/app/startup-checks.d.ts +8 -0
- package/dist/app/startup-checks.js +59 -0
- package/dist/app/startup-info.d.ts +3 -0
- package/dist/app/startup-info.js +176 -0
- package/dist/app/status-controller.d.ts +35 -0
- package/dist/app/status-controller.js +105 -0
- package/dist/app/status-line-renderer.d.ts +68 -0
- package/dist/app/status-line-renderer.js +453 -0
- package/dist/app/subagents-files.d.ts +10 -0
- package/dist/app/subagents-files.js +193 -0
- package/dist/app/subagents-model.d.ts +23 -0
- package/dist/app/subagents-model.js +224 -0
- package/dist/app/subagents-widget-controller.d.ts +43 -0
- package/dist/app/subagents-widget-controller.js +311 -0
- package/dist/app/tab-line-renderer.d.ts +26 -0
- package/dist/app/tab-line-renderer.js +222 -0
- package/dist/app/tabs-controller.d.ts +100 -0
- package/dist/app/tabs-controller.js +885 -0
- package/dist/app/terminal-controller.d.ts +40 -0
- package/dist/app/terminal-controller.js +135 -0
- package/dist/app/terminal-edit-shortcuts.d.ts +23 -0
- package/dist/app/terminal-edit-shortcuts.js +138 -0
- package/dist/app/terminal-output-buffer.d.ts +20 -0
- package/dist/app/terminal-output-buffer.js +52 -0
- package/dist/app/toast-controller.d.ts +13 -0
- package/dist/app/toast-controller.js +40 -0
- package/dist/app/toast-renderer.d.ts +9 -0
- package/dist/app/toast-renderer.js +79 -0
- package/dist/app/todo-model.d.ts +22 -0
- package/dist/app/todo-model.js +179 -0
- package/dist/app/todo-widget-controller.d.ts +21 -0
- package/dist/app/todo-widget-controller.js +59 -0
- package/dist/app/tool-block-renderer.d.ts +26 -0
- package/dist/app/tool-block-renderer.js +439 -0
- package/dist/app/types.d.ts +550 -0
- package/dist/app/types.js +1 -0
- package/dist/app/update.d.ts +36 -0
- package/dist/app/update.js +315 -0
- package/dist/app/voice-controller.d.ts +52 -0
- package/dist/app/voice-controller.js +600 -0
- package/dist/app/workspace-actions-controller.d.ts +40 -0
- package/dist/app/workspace-actions-controller.js +215 -0
- package/dist/app/workspace-undo.d.ts +44 -0
- package/dist/app/workspace-undo.js +215 -0
- package/dist/config.d.ts +62 -0
- package/dist/config.js +527 -0
- package/dist/context-progress-bar.d.ts +17 -0
- package/dist/context-progress-bar.js +48 -0
- package/dist/default-pix-config.d.ts +1 -0
- package/dist/default-pix-config.js +375 -0
- package/dist/fuzzy.d.ts +23 -0
- package/dist/fuzzy.js +165 -0
- package/dist/input-editor-files.d.ts +15 -0
- package/dist/input-editor-files.js +62 -0
- package/dist/input-editor.d.ts +186 -0
- package/dist/input-editor.js +835 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +12 -0
- package/dist/markdown-format.d.ts +22 -0
- package/dist/markdown-format.js +542 -0
- package/dist/sdk.d.ts +3 -0
- package/dist/sdk.js +1 -0
- package/dist/syntax-highlight.d.ts +22 -0
- package/dist/syntax-highlight.js +528 -0
- package/dist/terminal-width.d.ts +6 -0
- package/dist/terminal-width.js +245 -0
- package/dist/theme.d.ts +56 -0
- package/dist/theme.js +118 -0
- package/dist/tool-renderers/apply-patch.d.ts +2 -0
- package/dist/tool-renderers/apply-patch.js +36 -0
- package/dist/tool-renderers/ast.d.ts +2 -0
- package/dist/tool-renderers/ast.js +5 -0
- package/dist/tool-renderers/compress.d.ts +2 -0
- package/dist/tool-renderers/compress.js +126 -0
- package/dist/tool-renderers/index.d.ts +3 -0
- package/dist/tool-renderers/index.js +44 -0
- package/dist/tool-renderers/question.d.ts +2 -0
- package/dist/tool-renderers/question.js +88 -0
- package/dist/tool-renderers/read.d.ts +2 -0
- package/dist/tool-renderers/read.js +36 -0
- package/dist/tool-renderers/repo.d.ts +2 -0
- package/dist/tool-renderers/repo.js +13 -0
- package/dist/tool-renderers/shell.d.ts +3 -0
- package/dist/tool-renderers/shell.js +27 -0
- package/dist/tool-renderers/skill.d.ts +2 -0
- package/dist/tool-renderers/skill.js +132 -0
- package/dist/tool-renderers/subagents.d.ts +2 -0
- package/dist/tool-renderers/subagents.js +51 -0
- package/dist/tool-renderers/todo.d.ts +2 -0
- package/dist/tool-renderers/todo.js +9 -0
- package/dist/tool-renderers/types.d.ts +42 -0
- package/dist/tool-renderers/types.js +1 -0
- package/dist/tool-renderers/utils.d.ts +31 -0
- package/dist/tool-renderers/utils.js +230 -0
- package/dist/tool-renderers/web.d.ts +3 -0
- package/dist/tool-renderers/web.js +9 -0
- package/dist/tool-renderers/write.d.ts +2 -0
- package/dist/tool-renderers/write.js +42 -0
- package/dist/ui.d.ts +56 -0
- package/dist/ui.js +94 -0
- package/docs/release.md +81 -0
- package/extensions/question/contract.ts +100 -0
- package/extensions/question/index.ts +34 -0
- package/extensions/question/render.ts +28 -0
- package/extensions/question/result.ts +86 -0
- package/extensions/question/tool-description.ts +11 -0
- package/extensions/question/tui.ts +629 -0
- package/extensions/question/types.ts +123 -0
- package/extensions/session-title/config.ts +169 -0
- package/extensions/session-title/index.ts +459 -0
- package/extensions/terminal-bell/index.ts +315 -0
- package/external/pi-tools-suite/README.md +242 -0
- package/external/pi-tools-suite/index.ts +1 -0
- package/external/pi-tools-suite/licenses/ollama-pi-web-search.MIT +21 -0
- package/external/pi-tools-suite/licenses/opencode-mystatus-MIT.txt +21 -0
- package/external/pi-tools-suite/package.json +53 -0
- package/external/pi-tools-suite/src/antigravity-auth/auth-store.ts +194 -0
- package/external/pi-tools-suite/src/antigravity-auth/commands.ts +80 -0
- package/external/pi-tools-suite/src/antigravity-auth/constants.ts +26 -0
- package/external/pi-tools-suite/src/antigravity-auth/headers.ts +20 -0
- package/external/pi-tools-suite/src/antigravity-auth/index.ts +104 -0
- package/external/pi-tools-suite/src/antigravity-auth/models.ts +86 -0
- package/external/pi-tools-suite/src/antigravity-auth/oauth.ts +305 -0
- package/external/pi-tools-suite/src/antigravity-auth/payload.ts +423 -0
- package/external/pi-tools-suite/src/antigravity-auth/status.ts +78 -0
- package/external/pi-tools-suite/src/antigravity-auth/stream.ts +302 -0
- package/external/pi-tools-suite/src/antigravity-auth/types.ts +113 -0
- package/external/pi-tools-suite/src/ast-grep/index.ts +6 -0
- package/external/pi-tools-suite/src/ast-grep/render.ts +70 -0
- package/external/pi-tools-suite/src/ast-grep/schema.ts +109 -0
- package/external/pi-tools-suite/src/ast-grep/tool.ts +345 -0
- package/external/pi-tools-suite/src/ast-grep/types.ts +55 -0
- package/external/pi-tools-suite/src/ast-grep/utils.ts +65 -0
- package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +222 -0
- package/external/pi-tools-suite/src/async-subagents/commands.ts +518 -0
- package/external/pi-tools-suite/src/async-subagents/constants.ts +11 -0
- package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +74 -0
- package/external/pi-tools-suite/src/async-subagents/core/attachment-bridge.ts +133 -0
- package/external/pi-tools-suite/src/async-subagents/core/cleanup.ts +66 -0
- package/external/pi-tools-suite/src/async-subagents/core/concurrency.ts +90 -0
- package/external/pi-tools-suite/src/async-subagents/core/config.ts +819 -0
- package/external/pi-tools-suite/src/async-subagents/core/log-limits.ts +166 -0
- package/external/pi-tools-suite/src/async-subagents/core/model-fallback.ts +133 -0
- package/external/pi-tools-suite/src/async-subagents/core/paths.ts +47 -0
- package/external/pi-tools-suite/src/async-subagents/core/pi-invocation.ts +35 -0
- package/external/pi-tools-suite/src/async-subagents/core/presets.ts +67 -0
- package/external/pi-tools-suite/src/async-subagents/core/process.ts +15 -0
- package/external/pi-tools-suite/src/async-subagents/core/prompt.ts +66 -0
- package/external/pi-tools-suite/src/async-subagents/core/registry.ts +224 -0
- package/external/pi-tools-suite/src/async-subagents/core/retry.ts +191 -0
- package/external/pi-tools-suite/src/async-subagents/core/routing.ts +259 -0
- package/external/pi-tools-suite/src/async-subagents/core/sessions.ts +138 -0
- package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +688 -0
- package/external/pi-tools-suite/src/async-subagents/core/state.ts +281 -0
- package/external/pi-tools-suite/src/async-subagents/core/stop.ts +131 -0
- package/external/pi-tools-suite/src/async-subagents/core/structured-result.ts +237 -0
- package/external/pi-tools-suite/src/async-subagents/core/tool-guard.ts +34 -0
- package/external/pi-tools-suite/src/async-subagents/core/types.ts +150 -0
- package/external/pi-tools-suite/src/async-subagents/core/ultrawork-auto.ts +184 -0
- package/external/pi-tools-suite/src/async-subagents/core/utils.ts +11 -0
- package/external/pi-tools-suite/src/async-subagents/format.ts +41 -0
- package/external/pi-tools-suite/src/async-subagents/index.ts +422 -0
- package/external/pi-tools-suite/src/async-subagents/lib.ts +88 -0
- package/external/pi-tools-suite/src/async-subagents/live.ts +10 -0
- package/external/pi-tools-suite/src/async-subagents/polling.ts +83 -0
- package/external/pi-tools-suite/src/async-subagents/render.ts +230 -0
- package/external/pi-tools-suite/src/async-subagents/subagent-overlay.ts +77 -0
- package/external/pi-tools-suite/src/async-subagents/tasks.ts +120 -0
- package/external/pi-tools-suite/src/async-subagents/tools/cleanup.ts +99 -0
- package/external/pi-tools-suite/src/async-subagents/tools/result.ts +179 -0
- package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +372 -0
- package/external/pi-tools-suite/src/async-subagents/tools/status.ts +60 -0
- package/external/pi-tools-suite/src/async-subagents/tools/stop.ts +79 -0
- package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +152 -0
- package/external/pi-tools-suite/src/async-subagents/tools/wait.ts +67 -0
- package/external/pi-tools-suite/src/async-subagents/types.ts +45 -0
- package/external/pi-tools-suite/src/async-subagents/ui.ts +5 -0
- package/external/pi-tools-suite/src/compress/commands.ts +440 -0
- package/external/pi-tools-suite/src/compress/compress-tool.ts +368 -0
- package/external/pi-tools-suite/src/compress/compression-blocks.ts +524 -0
- package/external/pi-tools-suite/src/compress/config.ts +310 -0
- package/external/pi-tools-suite/src/compress/dcp-tui-filter.ts +498 -0
- package/external/pi-tools-suite/src/compress/index.ts +397 -0
- package/external/pi-tools-suite/src/compress/prompts.ts +269 -0
- package/external/pi-tools-suite/src/compress/pruner-candidates.ts +176 -0
- package/external/pi-tools-suite/src/compress/pruner-compression-blocks.ts +260 -0
- package/external/pi-tools-suite/src/compress/pruner-message-ids.ts +147 -0
- package/external/pi-tools-suite/src/compress/pruner-metadata.ts +268 -0
- package/external/pi-tools-suite/src/compress/pruner-nudge.ts +315 -0
- package/external/pi-tools-suite/src/compress/pruner-tools.ts +263 -0
- package/external/pi-tools-suite/src/compress/pruner-types.ts +25 -0
- package/external/pi-tools-suite/src/compress/pruner.ts +92 -0
- package/external/pi-tools-suite/src/compress/state.ts +486 -0
- package/external/pi-tools-suite/src/compress/ui.ts +308 -0
- package/external/pi-tools-suite/src/config.ts +176 -0
- package/external/pi-tools-suite/src/context-usage.ts +31 -0
- package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +355 -0
- package/external/pi-tools-suite/src/index.ts +46 -0
- package/external/pi-tools-suite/src/lib/lsp.ts +62 -0
- package/external/pi-tools-suite/src/lib/project.ts +42 -0
- package/external/pi-tools-suite/src/lib/tool-args.ts +137 -0
- package/external/pi-tools-suite/src/lsp/_shared/config.ts +156 -0
- package/external/pi-tools-suite/src/lsp/_shared/glob.ts +60 -0
- package/external/pi-tools-suite/src/lsp/_shared/output.ts +102 -0
- package/external/pi-tools-suite/src/lsp/_shared/paths.ts +138 -0
- package/external/pi-tools-suite/src/lsp/_shared/runner.ts +64 -0
- package/external/pi-tools-suite/src/lsp/_shared/template.ts +23 -0
- package/external/pi-tools-suite/src/lsp/_shared/trust.ts +116 -0
- package/external/pi-tools-suite/src/lsp/_shared/types.ts +98 -0
- package/external/pi-tools-suite/src/lsp/async.ts +29 -0
- package/external/pi-tools-suite/src/lsp/child-process.ts +81 -0
- package/external/pi-tools-suite/src/lsp/client.ts +340 -0
- package/external/pi-tools-suite/src/lsp/constants.ts +9 -0
- package/external/pi-tools-suite/src/lsp/diagnostics-store.ts +64 -0
- package/external/pi-tools-suite/src/lsp/documents.ts +24 -0
- package/external/pi-tools-suite/src/lsp/index.ts +31 -0
- package/external/pi-tools-suite/src/lsp/lsp-utils.ts +37 -0
- package/external/pi-tools-suite/src/lsp/manager.ts +190 -0
- package/external/pi-tools-suite/src/lsp/mutation-events.ts +78 -0
- package/external/pi-tools-suite/src/lsp/renderer.ts +1 -0
- package/external/pi-tools-suite/src/lsp/tool-result.ts +6 -0
- package/external/pi-tools-suite/src/lsp/tsserver.ts +107 -0
- package/external/pi-tools-suite/src/lsp/types.ts +15 -0
- package/external/pi-tools-suite/src/model-tools/apply-patch.ts +590 -0
- package/external/pi-tools-suite/src/model-tools/index.ts +430 -0
- package/external/pi-tools-suite/src/model-tools/path-utils.ts +6 -0
- package/external/pi-tools-suite/src/model-tools/tool-args.ts +11 -0
- package/external/pi-tools-suite/src/prompt-commands/index.ts +349 -0
- package/external/pi-tools-suite/src/repo-discovery/index.ts +384 -0
- package/external/pi-tools-suite/src/repo-discovery/project.ts +7 -0
- package/external/pi-tools-suite/src/startup-section.ts +13 -0
- package/external/pi-tools-suite/src/terminal-bell/index.ts +309 -0
- package/external/pi-tools-suite/src/todo/index.ts +201 -0
- package/external/pi-tools-suite/src/todo/state/auto-clear.ts +13 -0
- package/external/pi-tools-suite/src/todo/state/invariants.ts +21 -0
- package/external/pi-tools-suite/src/todo/state/persistence.ts +94 -0
- package/external/pi-tools-suite/src/todo/state/replay.ts +38 -0
- package/external/pi-tools-suite/src/todo/state/selectors.ts +49 -0
- package/external/pi-tools-suite/src/todo/state/state-reducer.ts +362 -0
- package/external/pi-tools-suite/src/todo/state/state.ts +18 -0
- package/external/pi-tools-suite/src/todo/state/store.ts +52 -0
- package/external/pi-tools-suite/src/todo/state/task-graph.ts +57 -0
- package/external/pi-tools-suite/src/todo/todo.ts +487 -0
- package/external/pi-tools-suite/src/todo/tool/response-envelope.ts +143 -0
- package/external/pi-tools-suite/src/todo/tool/types.ts +188 -0
- package/external/pi-tools-suite/src/todo/view/format.ts +18 -0
- package/external/pi-tools-suite/src/todo/view/labels.ts +13 -0
- package/external/pi-tools-suite/src/tool-descriptions.ts +369 -0
- package/external/pi-tools-suite/src/usage/index.ts +152 -0
- package/external/pi-tools-suite/src/usage/lib/copilot.ts +535 -0
- package/external/pi-tools-suite/src/usage/lib/google.ts +478 -0
- package/external/pi-tools-suite/src/usage/lib/openai.ts +268 -0
- package/external/pi-tools-suite/src/usage/lib/types.ts +114 -0
- package/external/pi-tools-suite/src/usage/lib/utils.ts +134 -0
- package/external/pi-tools-suite/src/usage/lib/zhipu.ts +228 -0
- package/external/pi-tools-suite/src/web-search/index.ts +397 -0
- package/package.json +89 -0
- package/skills/context7/SKILL.md +69 -0
- package/skills/context7/scripts/context7.sh +73 -0
- package/skills/handoff/SKILL.md +15 -0
- package/skills/pdf/LICENSE.txt +30 -0
- package/skills/pdf/SKILL.md +314 -0
- package/skills/pdf/forms.md +294 -0
- package/skills/pdf/reference.md +612 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/skills/pdf/scripts/create_validation_image.py +37 -0
- package/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/skills/playwright-cli/SKILL.md +388 -0
- package/skills/playwright-cli/references/element-attributes.md +23 -0
- package/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/skills/playwright-cli/references/request-mocking.md +87 -0
- package/skills/playwright-cli/references/running-code.md +241 -0
- package/skills/playwright-cli/references/session-management.md +225 -0
- package/skills/playwright-cli/references/spec-driven-testing.md +305 -0
- package/skills/playwright-cli/references/storage-state.md +275 -0
- package/skills/playwright-cli/references/test-generation.md +134 -0
- package/skills/playwright-cli/references/tracing.md +139 -0
- package/skills/playwright-cli/references/video-recording.md +143 -0
- package/skills/simplify/SKILL.md +51 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +485 -0
- package/skills/skill-creator/agents/analyzer.md +274 -0
- package/skills/skill-creator/agents/comparator.md +202 -0
- package/skills/skill-creator/agents/grader.md +223 -0
- package/skills/skill-creator/assets/eval_review.html +146 -0
- package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator/references/schemas.md +430 -0
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/skill-creator/scripts/generate_report.py +326 -0
- package/skills/skill-creator/scripts/improve_description.py +247 -0
- package/skills/skill-creator/scripts/package_skill.py +136 -0
- package/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/skill-creator/scripts/run_eval.py +310 -0
- package/skills/skill-creator/scripts/run_loop.py +328 -0
- package/skills/skill-creator/scripts/utils.py +47 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { delimiter, isAbsolute, join } from "node:path";
|
|
5
|
+
|
|
6
|
+
const BELL = "\x07";
|
|
7
|
+
const DEFAULT_IDLE_DELAY_MS = 250;
|
|
8
|
+
const IDLE_RETRY_DELAY_MS = 100;
|
|
9
|
+
const MAX_IDLE_RETRIES = 40;
|
|
10
|
+
const SUBAGENTS_LIVE_COUNT_EVENT = "pi-tools-suite:async-subagents:live-count";
|
|
11
|
+
const TERMINAL_BELL_ATTENTION_EVENT = "pix:terminal-bell:attention";
|
|
12
|
+
const DEFAULT_NOTIFICATION_TITLE = "Pi";
|
|
13
|
+
const DEFAULT_NOTIFICATION_MESSAGE = "Session stopped";
|
|
14
|
+
const DEFAULT_ASK_USER_NOTIFICATION_MESSAGE = "Waiting for your answer";
|
|
15
|
+
const DEFAULT_MAC_SOUND = "Glass";
|
|
16
|
+
|
|
17
|
+
const TERM_PROGRAM_BUNDLE_IDS: Record<string, string> = {
|
|
18
|
+
Apple_Terminal: "com.apple.Terminal",
|
|
19
|
+
iTerm: "com.googlecode.iterm2",
|
|
20
|
+
"iTerm.app": "com.googlecode.iterm2",
|
|
21
|
+
WezTerm: "com.github.wez.wezterm",
|
|
22
|
+
WarpTerminal: "dev.warp.Warp-Stable",
|
|
23
|
+
ghostty: "com.mitchellh.ghostty",
|
|
24
|
+
Ghostty: "com.mitchellh.ghostty",
|
|
25
|
+
kitty: "net.kovidgoyal.kitty",
|
|
26
|
+
Alacritty: "org.alacritty",
|
|
27
|
+
vscode: "com.microsoft.VSCode",
|
|
28
|
+
"vscode-insiders": "com.microsoft.VSCodeInsiders",
|
|
29
|
+
zed: "dev.zed.Zed",
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type Timer = ReturnType<typeof setTimeout>;
|
|
33
|
+
|
|
34
|
+
type SubagentsLiveCountEvent = {
|
|
35
|
+
count?: unknown;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function parseDelayMs(value: string | undefined): number {
|
|
39
|
+
if (value === undefined || value.trim() === "") return DEFAULT_IDLE_DELAY_MS;
|
|
40
|
+
const parsed = Number(value);
|
|
41
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : DEFAULT_IDLE_DELAY_MS;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function isTruthyEnv(value: string | undefined): boolean {
|
|
45
|
+
if (value === undefined) return false;
|
|
46
|
+
return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase());
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function extensionDisabled(): boolean {
|
|
50
|
+
return isTruthyEnv(process.env.HEADLESS) || isTruthyEnv(process.env.PI_TERMINAL_BELL_DISABLED);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function canRingTerminal(): boolean {
|
|
54
|
+
if (process.env.PI_TERMINAL_BELL === "0") return false;
|
|
55
|
+
if (process.env.PI_TERMINAL_BELL_FORCE === "1") return true;
|
|
56
|
+
return Boolean(process.stdout.isTTY || process.stderr.isTTY);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function writeBell(): void {
|
|
60
|
+
const stream = process.stdout.isTTY || !process.stderr.isTTY ? process.stdout : process.stderr;
|
|
61
|
+
stream.write(BELL);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function soundEnabled(ctx: ExtensionContext): boolean {
|
|
65
|
+
if (process.env.PI_TERMINAL_BELL_SOUND === "0") return false;
|
|
66
|
+
if (process.env.PI_TERMINAL_BELL_SOUND === "1") return true;
|
|
67
|
+
return ctx.hasUI === true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function notificationsEnabled(ctx: ExtensionContext): boolean {
|
|
71
|
+
if (process.env.PI_TERMINAL_BELL_NOTIFY === "0") return false;
|
|
72
|
+
if (process.env.PI_TERMINAL_BELL_NOTIFY === "1") return true;
|
|
73
|
+
return ctx.hasUI === true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function appleScriptString(value: string): string {
|
|
77
|
+
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function shellSingleQuote(value: string): string {
|
|
81
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function spawnDetached(command: string, args: string[]): void {
|
|
85
|
+
try {
|
|
86
|
+
const child = spawn(command, args, { detached: true, stdio: "ignore" });
|
|
87
|
+
child.on("error", () => {});
|
|
88
|
+
child.unref();
|
|
89
|
+
} catch {
|
|
90
|
+
// Best-effort user attention signal. Missing notification backends should not
|
|
91
|
+
// affect the agent loop or suppress the terminal bell.
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function findExecutable(command: string): string | undefined {
|
|
96
|
+
if (command.includes("/")) return existsSync(command) ? command : undefined;
|
|
97
|
+
for (const dir of (process.env.PATH ?? "").split(delimiter)) {
|
|
98
|
+
if (!dir) continue;
|
|
99
|
+
const candidate = join(dir, command);
|
|
100
|
+
if (existsSync(candidate)) return candidate;
|
|
101
|
+
}
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function resolveMacSoundPath(sound: string): string {
|
|
106
|
+
if (isAbsolute(sound)) return sound;
|
|
107
|
+
const fileName = sound.endsWith(".aiff") ? sound : `${sound}.aiff`;
|
|
108
|
+
return `/System/Library/Sounds/${fileName}`;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function detectMacActivationBundleId(): string | undefined {
|
|
112
|
+
const explicit = process.env.PI_TERMINAL_BELL_NOTIFY_ACTIVATE;
|
|
113
|
+
if (explicit === "0" || explicit === "false") return undefined;
|
|
114
|
+
if (explicit && explicit.trim() !== "") return explicit.trim();
|
|
115
|
+
|
|
116
|
+
// GUI apps that launch shells on macOS commonly export their own bundle id.
|
|
117
|
+
// This catches Terminal.app, iTerm2, Zed's terminal, VS Code terminals, etc.
|
|
118
|
+
const inheritedBundleId = process.env.__CFBundleIdentifier;
|
|
119
|
+
if (inheritedBundleId && inheritedBundleId.trim() !== "") return inheritedBundleId.trim();
|
|
120
|
+
|
|
121
|
+
const termProgram = process.env.TERM_PROGRAM;
|
|
122
|
+
if (!termProgram) return undefined;
|
|
123
|
+
return TERM_PROGRAM_BUNDLE_IDS[termProgram];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function playAttentionSound(ctx: ExtensionContext): void {
|
|
127
|
+
if (!soundEnabled(ctx)) return;
|
|
128
|
+
if (process.platform !== "darwin") return;
|
|
129
|
+
const sound = process.env.PI_TERMINAL_BELL_SOUND && process.env.PI_TERMINAL_BELL_SOUND !== "1"
|
|
130
|
+
? process.env.PI_TERMINAL_BELL_SOUND
|
|
131
|
+
: DEFAULT_MAC_SOUND;
|
|
132
|
+
const soundPath = resolveMacSoundPath(sound);
|
|
133
|
+
if (!existsSync(soundPath)) return;
|
|
134
|
+
spawnDetached("/usr/bin/afplay", [soundPath]);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function notifySessionStopped(
|
|
138
|
+
ctx: ExtensionContext,
|
|
139
|
+
macActivationBundleId: string | undefined,
|
|
140
|
+
message = process.env.PI_TERMINAL_BELL_NOTIFY_MESSAGE ?? DEFAULT_NOTIFICATION_MESSAGE,
|
|
141
|
+
): void {
|
|
142
|
+
if (!notificationsEnabled(ctx)) return;
|
|
143
|
+
const title = process.env.PI_TERMINAL_BELL_NOTIFY_TITLE ?? DEFAULT_NOTIFICATION_TITLE;
|
|
144
|
+
|
|
145
|
+
if (process.platform === "darwin") {
|
|
146
|
+
const terminalNotifier = findExecutable(process.env.PI_TERMINAL_BELL_NOTIFIER ?? "terminal-notifier");
|
|
147
|
+
if (terminalNotifier) {
|
|
148
|
+
const args = ["-title", title, "-message", message];
|
|
149
|
+
const activate = macActivationBundleId;
|
|
150
|
+
if (activate) {
|
|
151
|
+
args.push("-activate", activate);
|
|
152
|
+
args.push("-execute", `/usr/bin/open -b ${shellSingleQuote(activate)}`);
|
|
153
|
+
|
|
154
|
+
// Do not pass -sender by default. On recent macOS versions it can make the
|
|
155
|
+
// notification look like it came from the target app, but then clicking the
|
|
156
|
+
// “Show” button may be handled as that app's own notification instead of
|
|
157
|
+
// terminal-notifier's -activate/-execute action.
|
|
158
|
+
if (process.env.PI_TERMINAL_BELL_NOTIFY_SENDER === "1") {
|
|
159
|
+
args.push("-sender", activate);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
spawnDetached(terminalNotifier, args);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Bare osascript notifications are sent by Script Editor/osascript on macOS;
|
|
167
|
+
// clicking them can open Script Editor's file picker. Keep that backend opt-in
|
|
168
|
+
// and prefer terminal-notifier for clickable system notifications.
|
|
169
|
+
if (process.env.PI_TERMINAL_BELL_NOTIFY_OSASCRIPT !== "1") return;
|
|
170
|
+
spawnDetached("/usr/bin/osascript", [
|
|
171
|
+
"-e",
|
|
172
|
+
`display notification ${appleScriptString(message)} with title ${appleScriptString(title)}`,
|
|
173
|
+
]);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (process.platform === "linux") {
|
|
178
|
+
spawnDetached("notify-send", [title, message]);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const ASK_USER_TOOL_NAMES = new Set(["ask_user", "ask_user_question", "question"]);
|
|
183
|
+
|
|
184
|
+
function isAskUserToolName(toolName: string): boolean {
|
|
185
|
+
return ASK_USER_TOOL_NAMES.has(toolName);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function isSubagentsWaitTool(toolName: string, args: unknown): boolean {
|
|
189
|
+
if (toolName === "async_subagents_wait") return true;
|
|
190
|
+
if (toolName !== "subagents") return false;
|
|
191
|
+
if (!args || typeof args !== "object") return false;
|
|
192
|
+
const action = (args as { action?: unknown }).action;
|
|
193
|
+
return typeof action === "string" && action.trim().toLowerCase() === "wait";
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function normalizeLiveCount(event: SubagentsLiveCountEvent): number | undefined {
|
|
197
|
+
if (typeof event.count !== "number" || !Number.isFinite(event.count)) return undefined;
|
|
198
|
+
return Math.max(0, Math.floor(event.count));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export default function terminalBell(pi: ExtensionAPI) {
|
|
202
|
+
if (extensionDisabled()) return;
|
|
203
|
+
|
|
204
|
+
let timer: Timer | undefined;
|
|
205
|
+
let lastCtx: ExtensionContext | undefined;
|
|
206
|
+
let deferredUntilSubagentsFinish = false;
|
|
207
|
+
let liveSubagentCount = 0;
|
|
208
|
+
const activeSubagentWaitToolCallIds = new Set<string>();
|
|
209
|
+
const notifiedAskUserToolCallIds = new Set<string>();
|
|
210
|
+
const idleDelayMs = parseDelayMs(process.env.PI_TERMINAL_BELL_DELAY_MS);
|
|
211
|
+
const macActivationBundleId = process.platform === "darwin" ? detectMacActivationBundleId() : undefined;
|
|
212
|
+
|
|
213
|
+
function clearTimer(): void {
|
|
214
|
+
if (!timer) return;
|
|
215
|
+
clearTimeout(timer);
|
|
216
|
+
timer = undefined;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function hasSubagentWork(): boolean {
|
|
220
|
+
return liveSubagentCount > 0 || activeSubagentWaitToolCallIds.size > 0;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function notifyAttention(ctx: ExtensionContext, message?: string): void {
|
|
224
|
+
if (canRingTerminal()) writeBell();
|
|
225
|
+
playAttentionSound(ctx);
|
|
226
|
+
notifySessionStopped(ctx, macActivationBundleId, message);
|
|
227
|
+
pi.events.emit(TERMINAL_BELL_ATTENTION_EVENT, {
|
|
228
|
+
cwd: ctx.cwd,
|
|
229
|
+
sessionFile: ctx.sessionManager.getSessionFile(),
|
|
230
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function attemptBell(ctx: ExtensionContext, attempt: number): void {
|
|
235
|
+
timer = undefined;
|
|
236
|
+
|
|
237
|
+
if (!ctx.isIdle()) {
|
|
238
|
+
if (attempt < MAX_IDLE_RETRIES) scheduleBell(ctx, IDLE_RETRY_DELAY_MS, attempt + 1);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (ctx.hasPendingMessages()) return;
|
|
243
|
+
|
|
244
|
+
if (hasSubagentWork()) {
|
|
245
|
+
deferredUntilSubagentsFinish = true;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
deferredUntilSubagentsFinish = false;
|
|
250
|
+
notifyAttention(ctx);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function scheduleBell(ctx: ExtensionContext, delayMs = idleDelayMs, attempt = 0): void {
|
|
254
|
+
lastCtx = ctx;
|
|
255
|
+
clearTimer();
|
|
256
|
+
timer = setTimeout(() => attemptBell(ctx, attempt), delayMs);
|
|
257
|
+
timer.unref?.();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function notifyAskUserWaiting(toolCallId: string, ctx: ExtensionContext): void {
|
|
261
|
+
if (notifiedAskUserToolCallIds.has(toolCallId)) return;
|
|
262
|
+
notifiedAskUserToolCallIds.add(toolCallId);
|
|
263
|
+
notifyAttention(ctx, process.env.PI_TERMINAL_BELL_ASK_USER_NOTIFY_MESSAGE ?? DEFAULT_ASK_USER_NOTIFICATION_MESSAGE);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
pi.events.on(SUBAGENTS_LIVE_COUNT_EVENT, (data: unknown) => {
|
|
267
|
+
const event = data && typeof data === "object" ? data as SubagentsLiveCountEvent : {};
|
|
268
|
+
const count = normalizeLiveCount(event);
|
|
269
|
+
if (count === undefined) return;
|
|
270
|
+
liveSubagentCount = count;
|
|
271
|
+
if (count === 0 && deferredUntilSubagentsFinish && lastCtx) {
|
|
272
|
+
scheduleBell(lastCtx);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
pi.on("agent_start", async () => {
|
|
277
|
+
clearTimer();
|
|
278
|
+
deferredUntilSubagentsFinish = false;
|
|
279
|
+
activeSubagentWaitToolCallIds.clear();
|
|
280
|
+
notifiedAskUserToolCallIds.clear();
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
pi.on("tool_execution_start", async (event, ctx) => {
|
|
284
|
+
if (isSubagentsWaitTool(event.toolName, event.args)) {
|
|
285
|
+
activeSubagentWaitToolCallIds.add(event.toolCallId);
|
|
286
|
+
}
|
|
287
|
+
if (isAskUserToolName(event.toolName)) {
|
|
288
|
+
notifyAskUserWaiting(event.toolCallId, ctx);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
pi.on("tool_call", async (event, ctx) => {
|
|
293
|
+
if (isAskUserToolName(event.toolName)) {
|
|
294
|
+
notifyAskUserWaiting(event.toolCallId, ctx);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
pi.on("tool_execution_end", async (event) => {
|
|
299
|
+
activeSubagentWaitToolCallIds.delete(event.toolCallId);
|
|
300
|
+
notifiedAskUserToolCallIds.delete(event.toolCallId);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
pi.on("agent_end", async (_event, ctx) => {
|
|
304
|
+
scheduleBell(ctx);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
pi.on("session_shutdown", async () => {
|
|
308
|
+
clearTimer();
|
|
309
|
+
lastCtx = undefined;
|
|
310
|
+
deferredUntilSubagentsFinish = false;
|
|
311
|
+
liveSubagentCount = 0;
|
|
312
|
+
activeSubagentWaitToolCallIds.clear();
|
|
313
|
+
notifiedAskUserToolCallIds.clear();
|
|
314
|
+
});
|
|
315
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# pi-tools-suite
|
|
2
|
+
|
|
3
|
+
Local all-in-one Pi extension package.
|
|
4
|
+
|
|
5
|
+
This package keeps the former standalone extensions as ordinary source folders under `src/` and registers them through one entrypoint.
|
|
6
|
+
|
|
7
|
+
- `src/ast-grep` — `ast_grep` / `ast_apply`
|
|
8
|
+
- `src/async-subagents` — `subagents` tool and sub-agent slash commands, including oh-my-openagent-style `/ultrawork` (`/ulw`) and `/hyperplan` orchestration prompts, plus config-defined sub-agent model/thinking/args presets selected via `/subagent-preset` from `asyncSubagents` in `~/.config/pi/pi-tools-suite.jsonc`; includes the `frontend` profile for Gemini-friendly UI/UX and visual frontend work plus the `vision` profile for screenshot/image description via `openai-codex/gpt-5.4-mini`; enforces a 30-minute per-agent execution timeout, project-wide `maxConcurrent` queueing, optional retry/backoff, and `result.json` structured metadata/chaining fields next to raw `result.md`; stores project-local run files and a registry under `.pi/subagents/` so result/status collection can recover after compaction or reload while the main session remains alive
|
|
9
|
+
- `src/terminal-bell` — terminal bell, macOS attention sound, and best-effort OS notification when the main agent session returns to idle; defers the alert while sub-agents are still running or the main agent is waiting for sub-agent results
|
|
10
|
+
- `src/lsp` — shared LSP diagnostics hook/library that enriches mutating tool results with diagnostics and shuts down language servers on session shutdown
|
|
11
|
+
- `src/repo-discovery` — `/idx-init`, `/idx-update`, and indexed-only `repo_architecture` / `repo_structure` / `repo_ast` / `repo_search` / `repo_explain` / `repo_deps`; tools register only when the launch project has `.indexer-cli`
|
|
12
|
+
- `src/antigravity-auth` — `antigravity` custom provider with Google Antigravity OAuth login, startup account list, `/antigravity-import` credential migration from opencode, `/antigravity-add-account` OAuth append into rotation, `/antigravity-account` status display, account rotation/failover, Antigravity plus Gemini CLI model registration, and streaming through the Cloud Code Assist unified gateway
|
|
13
|
+
- `src/todo` — `todo` tool, `/todos`, `/todos-persist`, and `/todos-scope`; supports priorities, tags, parent/subtask hierarchy, blockers, ready-task filtering, deferred out-of-scope items, batch operations, JSON/Markdown import/export, automatic clearing when all visible todos are completed, and optional project persistence via `/todos persist on` or `/todos-persist on`; localization/i18n has been removed
|
|
14
|
+
- `src/model-tools` — model-specific tool aliases such as Claude/GLM-style `Read` / `Edit` / `Write` / `Bash` / `Grep` / `Glob` / `LS`, GPT/Codex-style `shell`, and model-gated `apply_patch`
|
|
15
|
+
- `src/usage` — `/usage` command and startup hint for read-only AI quota checks across OpenAI, Zhipu AI, Z.ai, and Google Antigravity, including Antigravity quota by model
|
|
16
|
+
- `src/web-search` — `web_search` and `web_fetch` tools migrated from `@ollama/pi-web-search`; calls the local Ollama experimental web search/fetch APIs, honors `OLLAMA_HOST`, supports request timeouts via `timeout_ms` / `PI_WEB_SEARCH_TIMEOUT_MS`, and reports targeted `ollama signin`, unsupported-endpoint, invalid-response, timeout, DNS, and Ollama-not-running errors
|
|
17
|
+
- `src/compress` — Dynamic Context Pruning: explicit `compress` tool with range and message modes, `/dcp` commands (context, stats, sweep, manual, decompress, recompress, compress), same-call overlap validation, recoverable compressed-block rollups, grouped message-mode skip diagnostics, stable raw-message anchors when available, protected user/tool preservation, deduplication, error purging, context nudges, and footer status visualization
|
|
18
|
+
- `src/prompt-commands` — user slash-command builder: `/prompt-commands` opens a CRUD menu for saved prompt-backed slash commands, stores them under `promptCommands` in `~/.config/pi/pi-tools-suite.jsonc`, reloads after edits, and runs each saved prompt as a normal user message
|
|
19
|
+
|
|
20
|
+
`index.ts` is intentionally only a thin auto-discovery shim that re-exports `src/index.ts`. There is no `pi.extensions` manifest here, so local Pi auto-discovery loads the suite once via `~/.pi/agent/extensions/pi-tools-suite/index.ts` and does not double-register tools.
|
|
21
|
+
|
|
22
|
+
Registration order is preserved in `src/index.ts`: ast-grep, async-subagents, terminal-bell, lsp, repo-discovery command/tool gate, antigravity-auth provider, todo, model-tools, usage, web-search, compress, then prompt-commands. Tool metadata and active model-specific tool sets have two modes: standard and repo-aware. When `.indexer-cli` enables `repo_*`, those tools stay active ahead of overlapping lower-level aliases so the indexed discovery surface has priority.
|
|
23
|
+
|
|
24
|
+
## Disabling modules
|
|
25
|
+
|
|
26
|
+
Disable suite modules without editing `src/index.ts` via config or environment variables. On startup, `~/.config/pi/pi-tools-suite.jsonc` is created if it is missing with a commented `disabledModules` template. Config is loaded from that file, then `$PI_CONFIG_DIR/pi-tools-suite.jsonc`, then the nearest project `.pi/pi-tools-suite.jsonc`; later layers win.
|
|
27
|
+
|
|
28
|
+
```jsonc
|
|
29
|
+
{
|
|
30
|
+
"disabledModules": ["terminal-bell", "web-search"]
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Environment overrides are applied last:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
PI_TOOLS_SUITE_DISABLED_MODULES=terminal-bell,web-search pi ...
|
|
38
|
+
PI_TOOLS_SUITE_DISABLED=1 pi ... # disables all pi-tools-suite modules
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`disabledExtensions`, `enabledModules`, `enabledExtensions`, and an `extensions` map are accepted as aliases for the same module names. Use `*` or `all` in `PI_TOOLS_SUITE_DISABLED_MODULES` to skip every registered module.
|
|
42
|
+
|
|
43
|
+
Saved prompt slash commands are stored under `promptCommands`. Use `/prompt-commands` to create, edit, rename, delete, list, show the config path, or run them from an interactive menu. After a CRUD edit the module reloads Pi resources so the slash-command list reflects the config. Each saved command sends its saved prompt as a user message.
|
|
44
|
+
|
|
45
|
+
```jsonc
|
|
46
|
+
{
|
|
47
|
+
"promptCommands": {
|
|
48
|
+
"commands": {
|
|
49
|
+
"review": {
|
|
50
|
+
"description": "Run a focused code review prompt",
|
|
51
|
+
"prompt": "Review the current change. Focus on correctness and risks."
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
DCP/compress settings are stored under `dcp` in the same shared config files. Legacy standalone `dcp.jsonc` files are still read for compatibility, but the `dcp` section in `pi-tools-suite.jsonc` wins at the same global/env/project layer.
|
|
59
|
+
|
|
60
|
+
```jsonc
|
|
61
|
+
{
|
|
62
|
+
"dcp": {
|
|
63
|
+
"enabled": true,
|
|
64
|
+
"compress": {
|
|
65
|
+
"minContextPercent": "25%",
|
|
66
|
+
"maxContextLimit": 160000,
|
|
67
|
+
"nudgeFrequency": 1,
|
|
68
|
+
"iterationNudgeThreshold": 8,
|
|
69
|
+
"protectedTools": ["compress", "write", "edit", "subagents"]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`minContextPercent` / `maxContextPercent` accept legacy fractions (`0.25`), percent strings (`"25%"`), or absolute token counts when Pi knows the current model context window. `minContextLimit` / `maxContextLimit` and `modelMinContextLimits` / `modelMaxContextLimits` are explicit absolute-or-percent aliases. If `compress.protectUserMessages` is enabled, range compression appends selected user messages verbatim instead of rejecting the range; individual message compression still skips protected raw user messages. Protected tool outputs are copied into summaries for tools protected by name or `protectedFilePatterns`; protected `subagents` result reads also try to include the saved `result.md` artifact when available.
|
|
76
|
+
|
|
77
|
+
## Async sub-agents
|
|
78
|
+
|
|
79
|
+
Sub-agent model routing normally follows task overrides, subagent type config, then `ASYNC_SUBAGENTS_MODEL` / `PI_SUBAGENTS_MODEL` fallbacks. Set `ASYNC_SUBAGENTS_FORCE_CURRENT_MODEL=1` (or `PI_SUBAGENTS_FORCE_CURRENT_MODEL=1`) to ignore task/config/env model choices and launch every sub-agent with the current parent session model. When this flag is enabled, any `--model` entries in sub-agent extra args are stripped so they cannot override the current model.
|
|
80
|
+
|
|
81
|
+
For an oh-my-openagent-style workflow, run `/ultrawork` or `/ulw` to ask the parent agent to split broad work into configured async-subagents roles (`quick`, `scan`, `research`, `docs`, `frontend`, `implement`, `tests`, `review`, `deep`, `vision`). Set `ULTRAWORK=1` before launching Pi to apply that compact routing prompt to normal non-slash user inputs automatically. Set `ULTRAWORK_AUTO=1` to ask the lightweight router model to classify only the first normal user input on non-GPT parent models: clear broad/parallel work is transformed into ultrawork, vague potentially-complex work gets a soft delegation hint, and narrow work is left unchanged. GPT-like parent models skip only this automatic transform; they can still use `/ultrawork` and `subagents` normally. `frontend` is for UI/UX, styling, layout, responsive behavior, and visual component polish; `review` covers security/performance/audit tracks; `implement` covers refactors; `deep` covers debugging/root-cause; `vision` is only for screenshots/images when the parent model is a non-vision GLM-series model. Run `/hyperplan` to pressure-test a plan before implementation.
|
|
82
|
+
|
|
83
|
+
Async-subagents also injects a lightweight oh-my-openagent-style system-prompt strategy by model: non-GPT parents get `parallel-first`, an orchestration-first hint that favors ultrawork/subagents for broad work, while GPT-like parents get `deep-work`, a direct deep-worker hint that uses subagents only when clearly useful. Explicit custom system prompts (`--system-prompt`, `SYSTEM.md`, custom templates) are respected and skip this injection by default. Disable it with `PI_AGENT_STRATEGY=off`; force a strategy with `PI_AGENT_STRATEGY=parallel-first` or `PI_AGENT_STRATEGY=deep-work`; set `PI_AGENT_STRATEGY_WITH_CUSTOM_PROMPT=1` to append it even when a custom prompt is present.
|
|
84
|
+
|
|
85
|
+
When the parent model cannot inspect images, async-subagents adds vision-delegation guidance and can save current-turn image attachments under `.pi/subagents/attachments/` so a `vision` sub-agent can receive them as `imagePaths`. Dynamic provider capabilities can be missing or stale after switching models, so blind parent models can be configured with case-insensitive `*` masks under `asyncSubagents.vision.blindModelPatterns` in `~/.config/pi/pi-tools-suite.jsonc`. Built-in defaults treat GLM refs such as `zai/glm*`, `glm*`, and `*/glm*` as text-only; set the array to `[]` to disable the masks.
|
|
86
|
+
|
|
87
|
+
When a task omits `subagentType`, async-subagents asks a lightweight router model to choose one configured type for each task from the task text/scope and the `types.<name>.description` metadata. Explicit task `subagentType` still wins. Keep type descriptions short, literal, and distinct because they are inserted into the router prompt for a small model. Router settings live under `asyncSubagents.routing` (`enabled`, `model`, `maxTaskChars`, `maxTokens`, `maxRetries`, `temperature`, `timeoutMs`, `debug`); the default router model is `zai/glm-4.5-air`. If the router is disabled, unavailable, aborted, or returns invalid JSON, omitted types fall back to `defaultType`.
|
|
88
|
+
|
|
89
|
+
Define optional `presets` under `asyncSubagents` in `~/.config/pi/pi-tools-suite.jsonc`, `$PI_CONFIG_DIR/pi-tools-suite.jsonc`, or project `.pi/pi-tools-suite.jsonc`, then use `/subagent-preset` or `/subagent-preset-config` to pick one persistent active preset for future spawns across all sessions. Set `AGENTS_PRESET=<name>` before launching Pi to override the saved preset for only the current process/session without changing the saved selection. If Pi is already running, use `/subagent-preset session <name>` for the same process-only override, and `/subagent-preset session-clear` to remove that runtime override. The TUI only selects presets already present in config; it does not edit JSON. If no `asyncSubagents` section exists, run `/subagent-preset init` to insert the bundled sample from `src/async-subagents/async-subagents.sample.jsonc` into the shared config (or to copy a standalone override file when `ASYNC_SUBAGENTS_CONFIG` / `PI_SUBAGENTS_CONFIG` is set). Existing config sections/files are never overwritten. Presets select an agent/model configuration: they can provide global fallback `model`/`thinking`/`extraArgs` and per-role overrides under `asyncSubagents.presets.<name>.types.<subagentType>`. They can also provide ordered `fallbackModels` globally or per-role; when a sub-agent fails with quota/rate-limit errors such as 429, async-subagents immediately tries the next fallback model and remembers the exhausted provider for the current Pi process/session, so later spawns skip that provider until Pi exits. This is intended for provider-level fallback chains such as `antigravity/* → openai-codex/* → zai/*` or `openai-codex/* → zai/*`; omit fallbacks for effectively unlimited providers. Antigravity account rotation has priority over preset fallback: async-subagents only falls back after Antigravity reports that all configured accounts are exhausted for that model. Explicit task model overrides and force-current-model disable preset fallback for that task. The active preset name is stored separately in `~/.pi/agent/subagent-preset-selection.json`.
|
|
90
|
+
|
|
91
|
+
Example shared async-subagents config section:
|
|
92
|
+
|
|
93
|
+
```jsonc
|
|
94
|
+
{
|
|
95
|
+
"asyncSubagents": {
|
|
96
|
+
"defaultType": "quick",
|
|
97
|
+
"routing": {
|
|
98
|
+
"enabled": true,
|
|
99
|
+
"model": "zai/glm-4.5-air",
|
|
100
|
+
"timeoutMs": 12000
|
|
101
|
+
},
|
|
102
|
+
"presets": {
|
|
103
|
+
"cheap": {
|
|
104
|
+
"description": "Use GLM for text/code roles; keep vision on its dedicated model.",
|
|
105
|
+
"types": {
|
|
106
|
+
"quick": { "model": "zai/glm-5.1", "thinking": "off" },
|
|
107
|
+
"frontend": { "model": "antigravity/gemini-3-flash-preview", "fallbackModels": ["zai/glm-5.1"], "thinking": "medium" },
|
|
108
|
+
"review": { "model": "zai/glm-5.1", "thinking": "high" }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"types": {
|
|
113
|
+
"frontend": {
|
|
114
|
+
"description": "Use for frontend UI/UX visual work: styling, layout, typography, animation, responsive states, component polish, accessibility. Avoid backend/business logic unless needed for UI behavior.",
|
|
115
|
+
"thinking": "medium"
|
|
116
|
+
},
|
|
117
|
+
"review": {
|
|
118
|
+
"description": "Use for review/audit of existing code or changes: correctness, security, performance, maintainability, API risks, quality. Do not implement new code.",
|
|
119
|
+
"thinking": "high"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Sub-agents run with `--no-session` by default to avoid writing duplicate Pi session JSONL files for fire-and-forget background work. Set `ASYNC_SUBAGENTS_ENABLE_SESSIONS=1` to restore persisted per-agent sessions under each agent's `sessions/` directory; this also registers the session-navigation slash commands (`/sub-open`, `/sub-back`, `/sub-where`) needed for switching and deeper post-mortem navigation.
|
|
127
|
+
|
|
128
|
+
Sub-agent runs are stored in the current project's `.pi/subagents/` directory while the main session is alive. Each spawn updates `.pi/subagents/registry.json` with the latest run and `agentId -> runDir` mappings. Because of that, `subagents({ action: "status" })`, `wait`, and `stop` can omit `runDir` to target the latest run, and `subagents({ action: "result", agentId: "..." })` can resolve the run from the registry even if the exact `runDir` was lost during compaction. Result reads default to a summary-first response with artifact paths; pass `compact: false` only when the full raw `result.md` and `stderr.log` must be pulled into the parent context. Include `runDir` when you need an older or non-latest run, and use `cleanup` with `delete=true` to remove collected old runs before the session ends. On normal main-session shutdown, Pi stops sub-agents and removes the project-local run files/registry to avoid leaving `.pi/subagents/` clutter behind; reload and fork shutdowns preserve them so in-process recovery still works.
|
|
129
|
+
|
|
130
|
+
Runtime logs are minimized by default: successful agents do not keep `events.jsonl`, and `stderr.log` is discarded unless the agent fails. Set `ASYNC_SUBAGENTS_DEBUG_LOGS=1` / `PI_SUBAGENTS_DEBUG_LOGS=1` to keep diagnostic logs for successful agents too; debug event logs store a compact RPC event summary instead of the full streaming transcript. Defaults are 0 bytes for `events.jsonl` without debug, 32 MiB for debug `events.jsonl`, 8 MiB for retained `stderr.log`, and 8 MiB for a single RPC JSON line; override with `ASYNC_SUBAGENTS_MAX_EVENTS_BYTES` / `PI_SUBAGENTS_MAX_EVENTS_BYTES`, `ASYNC_SUBAGENTS_MAX_STDERR_BYTES` / `PI_SUBAGENTS_MAX_STDERR_BYTES`, and `ASYNC_SUBAGENTS_MAX_RPC_LINE_CHARS` / `PI_SUBAGENTS_MAX_RPC_LINE_CHARS`.
|
|
131
|
+
|
|
132
|
+
`asyncSubagents` config also supports `maxConcurrent` (default 5, project-wide; `0` means unlimited), global/per-type `retry` with exponential backoff, global/per-type `maxResultBytes` for bounding `result.json.resultText` while keeping raw `result.md` intact, and global/per-type/preset `timeoutMs` for wall-clock agent watchdogs. Spawn calls and individual task objects can pass `timeoutSeconds` to shorten the watchdog for synthetic tests or bounded probes. Stop requests mark running, queued planned, and retry-pending agents as `stopped` so queued work is not launched later. Completed agents write `result.json` with status/duration/model/retry metadata plus best-effort `summary`, `findings`, `files`, `risks`, `nextActions`, and `confidence` fields for parent-agent chaining.
|
|
133
|
+
|
|
134
|
+
## Web search
|
|
135
|
+
|
|
136
|
+
`src/web-search` registers two Ollama-backed tools:
|
|
137
|
+
|
|
138
|
+
- `web_search` posts `{ query, max_results }` to `/api/experimental/web_search` and returns formatted title/URL/snippet results plus structured `details.results`.
|
|
139
|
+
- `web_fetch` posts `{ url }` to `/api/experimental/web_fetch` and returns extracted page text plus title/link metadata.
|
|
140
|
+
|
|
141
|
+
Both tools default to `http://localhost:11434`; set `OLLAMA_HOST` to point at another Ollama instance. Requests time out after 30 seconds by default. Override globally with `PI_WEB_SEARCH_TIMEOUT_MS` or per call with `timeout_ms` (maximum 120000 ms). Tool results include `host`, `timeoutMs`, and truncation metadata in `details`.
|
|
142
|
+
|
|
143
|
+
Troubleshooting:
|
|
144
|
+
|
|
145
|
+
| Symptom | Fix |
|
|
146
|
+
| --- | --- |
|
|
147
|
+
| `Could not connect to Ollama` | Start Ollama and check `OLLAMA_HOST`. |
|
|
148
|
+
| `Unauthorized by Ollama ... Run ollama signin` | Run `ollama signin`, then retry. |
|
|
149
|
+
| `endpoint is not available` | Update Ollama and make sure the experimental web search/fetch feature is enabled for that install. |
|
|
150
|
+
| `timed out after ...` | Increase per-call `timeout_ms` or `PI_WEB_SEARCH_TIMEOUT_MS` if the local web endpoint is slow. |
|
|
151
|
+
| `invalid JSON` / `unexpected response` | Check the Ollama version and the raw endpoint behavior; the tool reports the bad response shape instead of failing with a generic parser error. |
|
|
152
|
+
|
|
153
|
+
Do not send secrets, tokens, private repository text, or credential-bearing URLs through these tools; Ollama may query external web services to satisfy the request.
|
|
154
|
+
|
|
155
|
+
## Terminal bell / idle alert
|
|
156
|
+
|
|
157
|
+
`src/terminal-bell` alerts the user when the main Pi agent returns to idle. It does not alert while sub-agents are still running or while the main agent is waiting for sub-agent results.
|
|
158
|
+
|
|
159
|
+
Disable it entirely for headless runs:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
HEADLESS=1 pi ...
|
|
163
|
+
# or
|
|
164
|
+
PI_TERMINAL_BELL_DISABLED=1 pi ...
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Common environment options:
|
|
168
|
+
|
|
169
|
+
| Variable | Effect |
|
|
170
|
+
| --- | --- |
|
|
171
|
+
| `PI_TERMINAL_BELL=0` | Disable terminal `\x07` bell only |
|
|
172
|
+
| `PI_TERMINAL_BELL_FORCE=1` | Emit terminal bell even without TTY |
|
|
173
|
+
| `PI_TERMINAL_BELL_DELAY_MS=250` | Delay before alerting after idle |
|
|
174
|
+
| `PI_TERMINAL_BELL_SOUND=0` | Disable macOS `afplay` attention sound |
|
|
175
|
+
| `PI_TERMINAL_BELL_SOUND=Glass` | macOS sound name or absolute `.aiff` path |
|
|
176
|
+
| `PI_TERMINAL_BELL_NOTIFY=0` | Disable OS notification only |
|
|
177
|
+
| `PI_TERMINAL_BELL_NOTIFY=1` | Force OS notification even outside UI mode |
|
|
178
|
+
| `PI_TERMINAL_BELL_NOTIFY_TITLE=Pi` | Notification title |
|
|
179
|
+
| `PI_TERMINAL_BELL_NOTIFY_MESSAGE="Session stopped"` | Notification body |
|
|
180
|
+
|
|
181
|
+
macOS clickable notifications require `terminal-notifier`:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
brew install terminal-notifier
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
At extension startup, the module resolves the app to activate on click from `PI_TERMINAL_BELL_NOTIFY_ACTIVATE`, `__CFBundleIdentifier`, or `TERM_PROGRAM` (Zed, iTerm2, Terminal, WezTerm, Warp, Ghostty, Kitty, Alacritty, VS Code). The resolved bundle id is passed to `terminal-notifier -activate` and to an explicit `open -b <bundleId>` click action.
|
|
188
|
+
|
|
189
|
+
macOS-specific notification options:
|
|
190
|
+
|
|
191
|
+
| Variable | Effect |
|
|
192
|
+
| --- | --- |
|
|
193
|
+
| `PI_TERMINAL_BELL_NOTIFY_ACTIVATE=dev.zed.Zed` | Override click activation bundle id |
|
|
194
|
+
| `PI_TERMINAL_BELL_NOTIFY_ACTIVATE=0` | Disable click activation |
|
|
195
|
+
| `PI_TERMINAL_BELL_NOTIFIER=/path/to/terminal-notifier` | Use a custom notifier binary |
|
|
196
|
+
| `PI_TERMINAL_BELL_NOTIFY_SENDER=1` | Also pass `-sender <bundleId>` (can break click handling on some macOS versions) |
|
|
197
|
+
| `PI_TERMINAL_BELL_NOTIFY_OSASCRIPT=1` | Use the `osascript` fallback when `terminal-notifier` is missing; clicking these notifications can open Script Editor |
|
|
198
|
+
|
|
199
|
+
## Layout
|
|
200
|
+
|
|
201
|
+
```text
|
|
202
|
+
pi-tools-suite/
|
|
203
|
+
index.ts
|
|
204
|
+
package.json
|
|
205
|
+
src/
|
|
206
|
+
index.ts
|
|
207
|
+
ast-grep/
|
|
208
|
+
async-subagents/
|
|
209
|
+
terminal-bell/
|
|
210
|
+
lsp/
|
|
211
|
+
repo-discovery/
|
|
212
|
+
antigravity-auth/
|
|
213
|
+
todo/
|
|
214
|
+
model-tools/
|
|
215
|
+
usage/
|
|
216
|
+
web-search/
|
|
217
|
+
compress/
|
|
218
|
+
prompt-commands/
|
|
219
|
+
docs/
|
|
220
|
+
licenses/
|
|
221
|
+
scripts/
|
|
222
|
+
test/
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Checks
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
npm run smoke
|
|
229
|
+
npm test
|
|
230
|
+
npm run typecheck:async-subagents
|
|
231
|
+
|
|
232
|
+
# Optional longer/e2e checks
|
|
233
|
+
npm run test:async-subagents-e2e
|
|
234
|
+
npm run test:async-subagents-selection-e2e
|
|
235
|
+
npm run test:e2e
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Supporting docs and historical standalone README content are kept in `docs/`; third-party license texts are kept in `licenses/`.
|
|
239
|
+
|
|
240
|
+
## Third-party notices
|
|
241
|
+
|
|
242
|
+
Parts of this extension suite are based on or adapted from code by other vendors and projects. The corresponding license texts and notices are included in `licenses/`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./src/index";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ollama
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 javazys
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|