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,423 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import type { AssistantMessage, Context, ImageContent, Message, SimpleStreamOptions, TextContent, Tool, ToolResultMessage } from "@earendil-works/pi-ai";
|
|
3
|
+
import { DEFAULT_PROJECT_ID, MIN_THOUGHT_SIGNATURE_LENGTH, SKIP_THOUGHT_SIGNATURE } from "./constants";
|
|
4
|
+
import { getModelHeaderStyle } from "./headers";
|
|
5
|
+
import type { AntigravityContent, AntigravityModel, AntigravityPart, HeaderStyle } from "./types";
|
|
6
|
+
|
|
7
|
+
function sanitizeText(text: string): string {
|
|
8
|
+
return text.replace(/[\uD800-\uDFFF]/g, "�");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function normalizeToolCallId(id: string): string {
|
|
12
|
+
return id.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 64) || `tool_${randomUUID()}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function requiresToolCallId(modelId: string): boolean {
|
|
16
|
+
return modelId.startsWith("claude-") || modelId.startsWith("gpt-oss-");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function supportsMultimodalFunctionResponse(modelId: string): boolean {
|
|
20
|
+
const match = modelId.toLowerCase().match(/^gemini(?:-live)?-(\d+)/);
|
|
21
|
+
return match ? Number.parseInt(match[1], 10) >= 3 : true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function isGemini3Model(modelId: string): boolean {
|
|
25
|
+
return /^gemini(?:-live)?-3(?:[.-]|$)/i.test(modelId);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function isValidThoughtSignature(signature: unknown): signature is string {
|
|
29
|
+
if (signature === SKIP_THOUGHT_SIGNATURE) return true;
|
|
30
|
+
if (typeof signature !== "string" || signature.length < MIN_THOUGHT_SIGNATURE_LENGTH) return false;
|
|
31
|
+
if (signature.length % 4 !== 0) return false;
|
|
32
|
+
return /^[A-Za-z0-9+/]+={0,2}$/.test(signature);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function partThoughtSignature(part: AntigravityPart): string | undefined {
|
|
36
|
+
const signature = part.thoughtSignature ?? part.thought_signature;
|
|
37
|
+
return typeof signature === "string" && signature.length > 0 ? signature : undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function sameProviderAndModel(message: AssistantMessage, model: AntigravityModel): boolean {
|
|
41
|
+
return message.provider === model.provider && message.model === model.id;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function replayThoughtSignature(message: AssistantMessage, model: AntigravityModel, signature: unknown): string | undefined {
|
|
45
|
+
return sameProviderAndModel(message, model) && isValidThoughtSignature(signature) ? signature : undefined;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function replayFunctionCallThoughtSignature(message: AssistantMessage, model: AntigravityModel, actualModel: string, signature: unknown): string | undefined {
|
|
49
|
+
const trustedSignature = replayThoughtSignature(message, model, signature);
|
|
50
|
+
if (trustedSignature) return trustedSignature;
|
|
51
|
+
// Gemini 3 rejects tool-call history when the first functionCall part has no
|
|
52
|
+
// thought signature. Antigravity/opencode accepts this sentinel to bypass the
|
|
53
|
+
// validator when the original signature is unavailable or untrusted.
|
|
54
|
+
return isGemini3Model(actualModel) ? SKIP_THOUGHT_SIGNATURE : undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function convertMessages(model: AntigravityModel, context: Context): AntigravityContent[] {
|
|
58
|
+
const contents: AntigravityContent[] = [];
|
|
59
|
+
const actualModel = resolveActualModel(model, undefined).actualModel;
|
|
60
|
+
const includeIds = requiresToolCallId(actualModel);
|
|
61
|
+
|
|
62
|
+
for (const message of context.messages as Message[]) {
|
|
63
|
+
if (message.role === "user") {
|
|
64
|
+
const parts = convertUserContent(message.content);
|
|
65
|
+
if (parts.length > 0) contents.push({ role: "user", parts });
|
|
66
|
+
} else if (message.role === "assistant") {
|
|
67
|
+
const parts: AntigravityPart[] = [];
|
|
68
|
+
let hasFunctionCallSignaturePart = false;
|
|
69
|
+
for (const block of message.content) {
|
|
70
|
+
if (block.type === "text" && block.text.trim()) {
|
|
71
|
+
const thoughtSignature = replayThoughtSignature(message, model, block.textSignature);
|
|
72
|
+
parts.push({
|
|
73
|
+
text: sanitizeText(block.text),
|
|
74
|
+
...(thoughtSignature ? { thoughtSignature } : {}),
|
|
75
|
+
});
|
|
76
|
+
} else if (block.type === "toolCall") {
|
|
77
|
+
const thoughtSignature = hasFunctionCallSignaturePart
|
|
78
|
+
? undefined
|
|
79
|
+
: replayFunctionCallThoughtSignature(message, model, actualModel, block.thoughtSignature);
|
|
80
|
+
hasFunctionCallSignaturePart = true;
|
|
81
|
+
parts.push({
|
|
82
|
+
functionCall: {
|
|
83
|
+
name: block.name,
|
|
84
|
+
args: block.arguments ?? {},
|
|
85
|
+
...(includeIds ? { id: normalizeToolCallId(block.id) } : {}),
|
|
86
|
+
},
|
|
87
|
+
...(thoughtSignature ? { thoughtSignature, thought_signature: thoughtSignature } : {}),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Deliberately omit previous thinking blocks; Antigravity/Claude is
|
|
91
|
+
// sensitive to stale thought signatures across turns.
|
|
92
|
+
}
|
|
93
|
+
if (parts.length > 0) contents.push({ role: "model", parts });
|
|
94
|
+
} else if (message.role === "toolResult") {
|
|
95
|
+
appendToolResult(contents, message, model, actualModel, includeIds);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Claude models require every functionCall (tool_use) to have a matching
|
|
100
|
+
// functionResponse (tool_result) in the immediately following user turn.
|
|
101
|
+
// When replaying conversation history after an account switch, error, or
|
|
102
|
+
// incomplete turn, orphaned functionCalls at the end (or in the middle if
|
|
103
|
+
// toolResult messages were lost) cause INVALID_ARGUMENT. Patch them up by
|
|
104
|
+
// injecting synthetic error responses for any unmatched functionCalls.
|
|
105
|
+
repairOrphanedFunctionCalls(contents, includeIds);
|
|
106
|
+
|
|
107
|
+
return contents;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Walk the converted contents and ensure every model turn that contains
|
|
112
|
+
* functionCall parts is followed by a user turn that contains a matching
|
|
113
|
+
* functionResponse for each call. Missing responses get synthetic error
|
|
114
|
+
* entries so Claude and other strict providers accept the history.
|
|
115
|
+
*
|
|
116
|
+
* The function scans forward through consecutive user turns after the model
|
|
117
|
+
* turn to find matching responses (tool results may be spread across
|
|
118
|
+
* multiple adjacent user entries). It then moves the matched responses into
|
|
119
|
+
* the first user turn right after the model turn, before any text/image
|
|
120
|
+
* content. Any still-unmatched calls get synthetic error responses inserted
|
|
121
|
+
* in the same immediate position.
|
|
122
|
+
*/
|
|
123
|
+
function repairOrphanedFunctionCalls(contents: AntigravityContent[], includeIds: boolean): void {
|
|
124
|
+
for (let i = 0; i < contents.length; i += 1) {
|
|
125
|
+
const entry = contents[i];
|
|
126
|
+
if (entry.role !== "model") continue;
|
|
127
|
+
const functionCalls = entry.parts.filter((part) => part.functionCall);
|
|
128
|
+
if (functionCalls.length === 0) continue;
|
|
129
|
+
|
|
130
|
+
const userEntries: AntigravityContent[] = [];
|
|
131
|
+
for (let j = i + 1; j < contents.length && contents[j].role === "user"; j += 1) {
|
|
132
|
+
userEntries.push(contents[j]);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const responseCandidates = collectFunctionResponseCandidates(userEntries);
|
|
136
|
+
const selectedResponses = new Set<AntigravityPart>();
|
|
137
|
+
const immediateResponses: AntigravityPart[] = [];
|
|
138
|
+
|
|
139
|
+
for (const call of functionCalls) {
|
|
140
|
+
const match = takeMatchingFunctionResponse(call, responseCandidates, selectedResponses);
|
|
141
|
+
if (match) {
|
|
142
|
+
immediateResponses.push(match);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
immediateResponses.push(createSyntheticFunctionResponse(call, includeIds));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Remove selected responses from wherever they originally appeared.
|
|
149
|
+
// They will be reinserted into the first user turn immediately after
|
|
150
|
+
// the model turn so provider-side Claude conversion sees tool_result
|
|
151
|
+
// blocks before any user text from a fork/reload turn.
|
|
152
|
+
for (const userEntry of userEntries) {
|
|
153
|
+
userEntry.parts = userEntry.parts.filter((part) => !selectedResponses.has(part));
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const next = contents[i + 1];
|
|
157
|
+
if (next?.role === "user") {
|
|
158
|
+
next.parts.unshift(...immediateResponses);
|
|
159
|
+
} else {
|
|
160
|
+
contents.splice(i + 1, 0, { role: "user", parts: immediateResponses });
|
|
161
|
+
}
|
|
162
|
+
removeEmptyUserEntriesAfter(contents, i + 1);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function collectFunctionResponseCandidates(userEntries: AntigravityContent[]): AntigravityPart[] {
|
|
167
|
+
return userEntries.flatMap((entry) => entry.parts.filter((part) => part.functionResponse));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function takeMatchingFunctionResponse(
|
|
171
|
+
call: AntigravityPart,
|
|
172
|
+
candidates: AntigravityPart[],
|
|
173
|
+
selected: Set<AntigravityPart>,
|
|
174
|
+
): AntigravityPart | undefined {
|
|
175
|
+
const callId = call.functionCall!.id;
|
|
176
|
+
if (callId) {
|
|
177
|
+
const byId = candidates.find((candidate) => !selected.has(candidate) && candidate.functionResponse?.id === callId);
|
|
178
|
+
if (byId) {
|
|
179
|
+
selected.add(byId);
|
|
180
|
+
return byId;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const callName = call.functionCall!.name;
|
|
185
|
+
if (callName) {
|
|
186
|
+
const byName = candidates.find((candidate) => !selected.has(candidate) && candidate.functionResponse?.name === callName);
|
|
187
|
+
if (byName) {
|
|
188
|
+
selected.add(byName);
|
|
189
|
+
return byName;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const positional = candidates.find((candidate) => !selected.has(candidate));
|
|
194
|
+
if (positional) selected.add(positional);
|
|
195
|
+
return positional;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function createSyntheticFunctionResponse(call: AntigravityPart, includeIds: boolean): AntigravityPart {
|
|
199
|
+
return {
|
|
200
|
+
functionResponse: {
|
|
201
|
+
name: call.functionCall!.name,
|
|
202
|
+
response: { error: "Tool call was not executed due to a provider error or account switch." },
|
|
203
|
+
...(includeIds && call.functionCall!.id ? { id: call.functionCall!.id } : {}),
|
|
204
|
+
} as any,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function removeEmptyUserEntriesAfter(contents: AntigravityContent[], startIndex: number): void {
|
|
209
|
+
for (let idx = contents.length - 1; idx > startIndex; idx -= 1) {
|
|
210
|
+
if (contents[idx].role === "user" && contents[idx].parts.length === 0) contents.splice(idx, 1);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function convertUserContent(content: string | (TextContent | ImageContent)[]): AntigravityPart[] {
|
|
215
|
+
if (typeof content === "string") return content.trim() ? [{ text: sanitizeText(content) }] : [];
|
|
216
|
+
return content.map((item) => {
|
|
217
|
+
if (item.type === "text") return { text: sanitizeText(item.text) };
|
|
218
|
+
return { inlineData: { mimeType: item.mimeType, data: item.data } };
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function formatToolResultOutput(text: string, images: ImageContent[]): string {
|
|
223
|
+
if (text) return sanitizeText(text);
|
|
224
|
+
if (images.length > 0) return "(see attached image)";
|
|
225
|
+
return "";
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function appendToolResult(
|
|
229
|
+
contents: AntigravityContent[],
|
|
230
|
+
message: ToolResultMessage,
|
|
231
|
+
model: AntigravityModel,
|
|
232
|
+
actualModel: string,
|
|
233
|
+
includeIds: boolean,
|
|
234
|
+
): void {
|
|
235
|
+
const text = message.content
|
|
236
|
+
.filter((item): item is TextContent => item.type === "text")
|
|
237
|
+
.map((item) => item.text)
|
|
238
|
+
.join("\n");
|
|
239
|
+
const images = model.input.includes("image")
|
|
240
|
+
? message.content.filter((item): item is ImageContent => item.type === "image")
|
|
241
|
+
: [];
|
|
242
|
+
const imageParts = images.map((image) => ({ inlineData: { mimeType: image.mimeType, data: image.data } }));
|
|
243
|
+
const output = formatToolResultOutput(text, images);
|
|
244
|
+
const functionResponse: AntigravityPart = {
|
|
245
|
+
functionResponse: {
|
|
246
|
+
name: message.toolName,
|
|
247
|
+
response: message.isError ? { error: output } : { output },
|
|
248
|
+
...(includeIds ? { id: normalizeToolCallId(message.toolCallId) } : {}),
|
|
249
|
+
...(images.length > 0 && supportsMultimodalFunctionResponse(actualModel) ? { parts: imageParts } : {}),
|
|
250
|
+
} as any,
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
const last = contents[contents.length - 1];
|
|
254
|
+
if (last?.role === "user" && last.parts.some((part) => part.functionResponse)) {
|
|
255
|
+
last.parts.push(functionResponse);
|
|
256
|
+
} else {
|
|
257
|
+
contents.push({ role: "user", parts: [functionResponse] });
|
|
258
|
+
}
|
|
259
|
+
if (images.length > 0 && !supportsMultimodalFunctionResponse(actualModel)) {
|
|
260
|
+
contents.push({ role: "user", parts: [{ text: "Tool result image:" }, ...imageParts] });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const SCHEMA_DROP_KEYS = new Set([
|
|
265
|
+
"$schema",
|
|
266
|
+
"$id",
|
|
267
|
+
"$anchor",
|
|
268
|
+
"$dynamicAnchor",
|
|
269
|
+
"$vocabulary",
|
|
270
|
+
"$comment",
|
|
271
|
+
"$defs",
|
|
272
|
+
"definitions",
|
|
273
|
+
"additionalProperties",
|
|
274
|
+
"patternProperties",
|
|
275
|
+
"propertyNames",
|
|
276
|
+
"unevaluatedProperties",
|
|
277
|
+
"dependentRequired",
|
|
278
|
+
"dependentSchemas",
|
|
279
|
+
"default",
|
|
280
|
+
"examples",
|
|
281
|
+
"title",
|
|
282
|
+
]);
|
|
283
|
+
|
|
284
|
+
function cleanSchema(schema: unknown): unknown {
|
|
285
|
+
if (!schema || typeof schema !== "object") return schema;
|
|
286
|
+
if (Array.isArray(schema)) return schema.map(cleanSchema);
|
|
287
|
+
const input = schema as Record<string, unknown>;
|
|
288
|
+
const output: Record<string, unknown> = {};
|
|
289
|
+
for (const [key, value] of Object.entries(input)) {
|
|
290
|
+
if (key === "const") {
|
|
291
|
+
output.enum = [value];
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
if (SCHEMA_DROP_KEYS.has(key)) continue;
|
|
295
|
+
output[key] = cleanSchema(value);
|
|
296
|
+
}
|
|
297
|
+
if (output.type === "object" && !output.properties) output.properties = {};
|
|
298
|
+
return output;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function convertTools(tools?: Tool[]): Array<{ functionDeclarations: unknown[] }> | undefined {
|
|
302
|
+
if (!tools?.length) return undefined;
|
|
303
|
+
return [
|
|
304
|
+
{
|
|
305
|
+
functionDeclarations: tools.map((item) => ({
|
|
306
|
+
name: item.name,
|
|
307
|
+
description: item.description,
|
|
308
|
+
parameters: cleanSchema(item.parameters),
|
|
309
|
+
})),
|
|
310
|
+
},
|
|
311
|
+
];
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function reasoningLevel(options?: SimpleStreamOptions): "minimal" | "low" | "medium" | "high" | undefined {
|
|
315
|
+
const reasoning = options?.reasoning;
|
|
316
|
+
if (!reasoning) return undefined;
|
|
317
|
+
if (reasoning === "xhigh") return "high";
|
|
318
|
+
return reasoning;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function budgetForLevel(
|
|
322
|
+
level: "minimal" | "low" | "medium" | "high",
|
|
323
|
+
budgets: NonNullable<SimpleStreamOptions["thinkingBudgets"]>,
|
|
324
|
+
): number {
|
|
325
|
+
if (level === "low" || level === "minimal") return budgets.low ?? 8192;
|
|
326
|
+
if (level === "medium") return budgets.medium ?? 16384;
|
|
327
|
+
return budgets.high ?? 32768;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function geminiProThinkingLevel(modelId: string, headerStyle: HeaderStyle, level: "minimal" | "low" | "medium" | "high"): "low" | "high" {
|
|
331
|
+
if (headerStyle === "antigravity" && /^gemini-3\.1-pro/i.test(modelId)) return "low";
|
|
332
|
+
if (level === "high") return "high";
|
|
333
|
+
return "low";
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
function resolveActualModel(
|
|
337
|
+
model: AntigravityModel,
|
|
338
|
+
options?: SimpleStreamOptions,
|
|
339
|
+
): { actualModel: string; thinkingConfig?: Record<string, unknown> } {
|
|
340
|
+
const headerStyle = getModelHeaderStyle(model);
|
|
341
|
+
const requested = model.id.replace(/^antigravity-/i, "");
|
|
342
|
+
const level = reasoningLevel(options) ?? "low";
|
|
343
|
+
let effective = requested;
|
|
344
|
+
const requestedLower = requested.toLowerCase();
|
|
345
|
+
|
|
346
|
+
if (requestedLower.includes("gemini-3")) {
|
|
347
|
+
if (headerStyle === "antigravity") {
|
|
348
|
+
effective = requested.replace(/-preview-customtools$/i, "").replace(/-preview$/i, "");
|
|
349
|
+
} else {
|
|
350
|
+
effective = requested.replace(/-(minimal|low|medium|high)$/i, "");
|
|
351
|
+
if (!/-preview($|-)/i.test(effective)) effective = `${effective}-preview`;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
const lower = effective.toLowerCase();
|
|
356
|
+
|
|
357
|
+
if (/^gemini-3(?:\.\d+)?-pro/.test(lower)) {
|
|
358
|
+
// Live Antigravity currently rejects gemini-3.1-pro-high with a generic
|
|
359
|
+
// 400 INVALID_ARGUMENT, while gemini-3.1-pro-low works. Keep the public
|
|
360
|
+
// model usable even when Pi's current/default thinking level is high.
|
|
361
|
+
const thinkingLevel = geminiProThinkingLevel(lower, headerStyle, level);
|
|
362
|
+
if (headerStyle === "antigravity") {
|
|
363
|
+
return { actualModel: `${effective}-${thinkingLevel}`, thinkingConfig: { thinkingLevel, includeThoughts: true } };
|
|
364
|
+
}
|
|
365
|
+
return { actualModel: effective, thinkingConfig: { thinkingLevel, includeThoughts: true } };
|
|
366
|
+
}
|
|
367
|
+
if (/^gemini-3(?:\.\d+)?-flash/.test(lower)) {
|
|
368
|
+
return { actualModel: effective, thinkingConfig: { thinkingLevel: level, includeThoughts: true } };
|
|
369
|
+
}
|
|
370
|
+
if (lower.includes("claude") && lower.includes("thinking")) {
|
|
371
|
+
const budgets = options?.thinkingBudgets ?? {};
|
|
372
|
+
const budget = budgetForLevel(level, budgets);
|
|
373
|
+
return { actualModel: effective, thinkingConfig: { thinking_budget: budget, include_thoughts: true } };
|
|
374
|
+
}
|
|
375
|
+
if (lower.includes("gemini-2.5")) {
|
|
376
|
+
const budgets = options?.thinkingBudgets ?? {};
|
|
377
|
+
const budget = budgetForLevel(level, budgets);
|
|
378
|
+
return { actualModel: effective, thinkingConfig: { thinkingBudget: budget, includeThoughts: true } };
|
|
379
|
+
}
|
|
380
|
+
return { actualModel: effective };
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
export function buildPayload(model: AntigravityModel, context: Context, options?: SimpleStreamOptions): Record<string, unknown> {
|
|
384
|
+
const { actualModel, thinkingConfig } = resolveActualModel(model, options);
|
|
385
|
+
const headerStyle = getModelHeaderStyle(model);
|
|
386
|
+
const thinkingBudget = Number(thinkingConfig?.thinkingBudget ?? thinkingConfig?.thinking_budget ?? 0);
|
|
387
|
+
const generationConfig: Record<string, unknown> = {
|
|
388
|
+
maxOutputTokens: Math.max(options?.maxTokens ?? model.maxTokens ?? 8192, thinkingBudget + 1024),
|
|
389
|
+
};
|
|
390
|
+
if (typeof options?.temperature === "number") generationConfig.temperature = options.temperature;
|
|
391
|
+
if (thinkingConfig) generationConfig.thinkingConfig = thinkingConfig;
|
|
392
|
+
|
|
393
|
+
const request: Record<string, unknown> = {
|
|
394
|
+
sessionId: options?.sessionId ?? randomUUID(),
|
|
395
|
+
contents: convertMessages(model, context),
|
|
396
|
+
generationConfig,
|
|
397
|
+
};
|
|
398
|
+
if (context.systemPrompt?.trim()) {
|
|
399
|
+
request.systemInstruction = { role: "user", parts: [{ text: sanitizeText(context.systemPrompt) }] };
|
|
400
|
+
}
|
|
401
|
+
const tools = convertTools(context.tools);
|
|
402
|
+
if (tools) request.tools = tools;
|
|
403
|
+
|
|
404
|
+
const payload: Record<string, unknown> = {
|
|
405
|
+
project: model.antigravityProjectId || DEFAULT_PROJECT_ID,
|
|
406
|
+
model: actualModel,
|
|
407
|
+
request,
|
|
408
|
+
};
|
|
409
|
+
if (headerStyle === "antigravity") {
|
|
410
|
+
payload.requestType = "agent";
|
|
411
|
+
payload.userAgent = "antigravity";
|
|
412
|
+
payload.requestId = `agent-${randomUUID()}`;
|
|
413
|
+
}
|
|
414
|
+
return payload;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export function extraHeadersForPayload(payload: Record<string, unknown>): Record<string, string> {
|
|
418
|
+
const model = typeof payload.model === "string" ? payload.model.toLowerCase() : "";
|
|
419
|
+
if (model.includes("claude") && model.includes("thinking")) {
|
|
420
|
+
return { "anthropic-beta": "interleaved-thinking-2025-05-14" };
|
|
421
|
+
}
|
|
422
|
+
return {};
|
|
423
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionUIContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { publishStartupSection } from "../startup-section";
|
|
3
|
+
import { LEGACY_STATUS_KEY, PROVIDER_ID, STATUS_KEY } from "./constants";
|
|
4
|
+
import { accountFromCredential, clampAccountIndex, decodeApiKey, getAccountProjectId, getEffectiveProjectId, getPiAuthPath, getStoredAccounts, readJsonFile } from "./auth-store";
|
|
5
|
+
import { formatAntigravityStatus } from "./commands";
|
|
6
|
+
import type { AntigravityStatusDetails, OpencodeAntigravityAccount, PiAuthData, PiAuthCredential } from "./types";
|
|
7
|
+
|
|
8
|
+
let extensionUi: ExtensionUIContext | undefined;
|
|
9
|
+
let extensionApi: ExtensionAPI | undefined;
|
|
10
|
+
|
|
11
|
+
export function rememberAntigravityApi(api: ExtensionAPI): void {
|
|
12
|
+
extensionApi = api;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function rememberAntigravityUi(ui: ExtensionUIContext | undefined): void {
|
|
16
|
+
if (ui) extensionUi = ui;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function getCurrentAntigravityStatus(): Promise<AntigravityStatusDetails> {
|
|
20
|
+
const auth = await readJsonFile<PiAuthData>(getPiAuthPath(), {});
|
|
21
|
+
const credential = auth[PROVIDER_ID];
|
|
22
|
+
const accounts = getStoredAccounts(credential);
|
|
23
|
+
const accountIndex = accounts.length > 0 ? clampAccountIndex(credential?.activeIndex, accounts.length) : undefined;
|
|
24
|
+
const account = typeof accountIndex === "number" ? accounts[accountIndex] : undefined;
|
|
25
|
+
const apiProjectId = credential?.access ? decodeApiKey(credential.access).projectId : undefined;
|
|
26
|
+
return {
|
|
27
|
+
kind: "status",
|
|
28
|
+
email: account?.email ?? credential?.email,
|
|
29
|
+
accountIndex,
|
|
30
|
+
accountCount: accounts.length || undefined,
|
|
31
|
+
projectId: apiProjectId || (credential?.refresh ? getEffectiveProjectId(credential.refresh) : undefined),
|
|
32
|
+
expires: credential?.expires,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function getStartupAccounts(credential?: PiAuthCredential): OpencodeAntigravityAccount[] {
|
|
37
|
+
const accounts = getStoredAccounts(credential);
|
|
38
|
+
if (accounts.length > 0) return accounts;
|
|
39
|
+
const account = accountFromCredential(credential);
|
|
40
|
+
return account ? [account] : [];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function formatStartupAccountName(account: OpencodeAntigravityAccount, index: number): string {
|
|
44
|
+
const email = account.email?.trim();
|
|
45
|
+
if (email) return email;
|
|
46
|
+
const projectId = getAccountProjectId(account);
|
|
47
|
+
return projectId ? `project ${projectId}` : `account ${index + 1}`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function startupAntigravityAccountList(): Promise<string> {
|
|
51
|
+
try {
|
|
52
|
+
const auth = await readJsonFile<PiAuthData>(getPiAuthPath(), {});
|
|
53
|
+
const accounts = getStartupAccounts(auth[PROVIDER_ID]);
|
|
54
|
+
if (accounts.length === 0) return "no accounts (run /antigravity-import or /antigravity-add-account)";
|
|
55
|
+
return accounts.map(formatStartupAccountName).join(", ");
|
|
56
|
+
} catch (error) {
|
|
57
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
58
|
+
return `error loading accounts: ${message}`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export async function publishAntigravityAuthStartupSection(): Promise<void> {
|
|
63
|
+
publishStartupSection({
|
|
64
|
+
id: "antigravity-auth",
|
|
65
|
+
title: "antigravity-auth",
|
|
66
|
+
body: await startupAntigravityAccountList(),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function emitAntigravityStatus(details: AntigravityStatusDetails): void {
|
|
71
|
+
extensionUi?.setStatus(LEGACY_STATUS_KEY, undefined);
|
|
72
|
+
extensionUi?.setStatus(STATUS_KEY, formatAntigravityStatus(details));
|
|
73
|
+
(extensionApi as any)?.sendMessage?.({
|
|
74
|
+
role: "system",
|
|
75
|
+
content: formatAntigravityStatus(details),
|
|
76
|
+
details,
|
|
77
|
+
});
|
|
78
|
+
}
|