@code-yeongyu/senpi 2026.9.9-2 → 2026.9.10-2
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/CHANGELOG.md +95 -0
- package/README.md +2 -0
- package/dist/beta/omo-local-update-worker.js.map +1 -1
- package/dist/beta/omo-local-update.d.ts.map +1 -1
- package/dist/brand-dir-migration.js.map +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/experimental/command.d.ts.map +1 -1
- package/dist/cli/grok-neo-gate.js.map +1 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/client/remote-session.d.ts.map +1 -1
- package/dist/client/remote-session.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -19
- package/dist/config.js.map +1 -1
- package/dist/core/agent-abort-provenance.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +74 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +161 -24
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-settled-delivery.d.ts.map +1 -1
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/brand.js.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/lifecycle.d.ts.map +1 -1
- package/dist/core/compaction/stream-watchdog.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/credential-accounts.js.map +1 -1
- package/dist/core/credential-pool/classify.js.map +1 -1
- package/dist/core/credential-pool/failover.d.ts.map +1 -1
- package/dist/core/credential-pool/rotation-stream.js.map +1 -1
- package/dist/core/credential-pool/state-store.d.ts +2 -2
- package/dist/core/credential-pool/state-store.d.ts.map +1 -1
- package/dist/core/credential-pool/state-store.js.map +1 -1
- package/dist/core/dynamic-prompt/verification.d.ts.map +1 -1
- package/dist/core/edited-assistant-message.d.ts +24 -0
- package/dist/core/edited-assistant-message.d.ts.map +1 -0
- package/dist/core/edited-assistant-message.js +57 -0
- package/dist/core/edited-assistant-message.js.map +1 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ask-user/extension.d.ts +3 -0
- package/dist/core/extensions/builtin/ask-user/extension.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/extension.js +47 -0
- package/dist/core/extensions/builtin/ask-user/extension.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/family.d.ts +8 -0
- package/dist/core/extensions/builtin/ask-user/family.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/family.js +6 -0
- package/dist/core/extensions/builtin/ask-user/family.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/format.d.ts +22 -0
- package/dist/core/extensions/builtin/ask-user/format.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/format.js +109 -0
- package/dist/core/extensions/builtin/ask-user/format.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/index.d.ts +4 -0
- package/dist/core/extensions/builtin/ask-user/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/index.js +4 -0
- package/dist/core/extensions/builtin/ask-user/index.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/params.d.ts +27 -0
- package/dist/core/extensions/builtin/ask-user/params.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/params.js +78 -0
- package/dist/core/extensions/builtin/ask-user/params.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/pending.d.ts +58 -0
- package/dist/core/extensions/builtin/ask-user/pending.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/pending.js +130 -0
- package/dist/core/extensions/builtin/ask-user/pending.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/registry.d.ts +21 -0
- package/dist/core/extensions/builtin/ask-user/registry.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/registry.js +20 -0
- package/dist/core/extensions/builtin/ask-user/registry.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/render.d.ts +4 -0
- package/dist/core/extensions/builtin/ask-user/render.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/render.js +25 -0
- package/dist/core/extensions/builtin/ask-user/render.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/resume.d.ts +4 -0
- package/dist/core/extensions/builtin/ask-user/resume.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/resume.js +85 -0
- package/dist/core/extensions/builtin/ask-user/resume.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/schema.d.ts +40 -0
- package/dist/core/extensions/builtin/ask-user/schema.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/schema.js +102 -0
- package/dist/core/extensions/builtin/ask-user/schema.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/tool.d.ts +8 -0
- package/dist/core/extensions/builtin/ask-user/tool.d.ts.map +1 -0
- package/dist/core/extensions/builtin/ask-user/tool.js +195 -0
- package/dist/core/extensions/builtin/ask-user/tool.js.map +1 -0
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/btw/panel.d.ts.map +1 -1
- package/dist/core/extensions/builtin/btw/side-query.js.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cache-keepalive/index.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/affinity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/affinity.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +11 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +12 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/bounded-queue.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.d.ts +14 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.js +42 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.d.ts +18 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.js +105 -36
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/failover.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/refusal.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +3 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reaper.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +19 -10
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tool-watch.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/context-reduction.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote-convert.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-retry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/resume-slice.d.ts +23 -0
- package/dist/core/extensions/builtin/compaction/resume-slice.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/resume-slice.js +99 -0
- package/dist/core/extensions/builtin/compaction/resume-slice.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/summarization-retry.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/protocol.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/reload-deferral.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/affinity.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/diagnostics.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/failover.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/guardrails.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/session-router.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream-parser.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/elapsed-ticker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +57 -4
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
- package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/prompt.js +9 -6
- package/dist/core/extensions/builtin/goal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
- package/dist/core/extensions/builtin/goal/wait-progress.js.map +1 -1
- package/dist/core/extensions/builtin/goal/wait-ticker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.js +1 -0
- package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/help/panel.d.ts.map +1 -1
- package/dist/core/extensions/builtin/history-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/history-search/overlay.d.ts.map +1 -1
- package/dist/core/extensions/builtin/hooks/command-runner.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/dispatcher.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/plugin-loader.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/tool-adapter.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/trust-storage.d.ts.map +1 -1
- package/dist/core/extensions/builtin/hooks/trust.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/params.d.ts +10 -1
- package/dist/core/extensions/builtin/imagegen/params.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/params.js +29 -3
- package/dist/core/extensions/builtin/imagegen/params.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/paths.d.ts +10 -4
- package/dist/core/extensions/builtin/imagegen/paths.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/paths.js +43 -10
- package/dist/core/extensions/builtin/imagegen/paths.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/reference-images.d.ts +9 -0
- package/dist/core/extensions/builtin/imagegen/reference-images.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/reference-images.js +40 -25
- package/dist/core/extensions/builtin/imagegen/reference-images.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +44 -62
- package/dist/core/extensions/builtin/imagegen/tool.d.ts +5 -0
- package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/tool.js +58 -12
- package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +2 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/look-at/model-selector.d.ts.map +1 -1
- package/dist/core/extensions/builtin/look-at/runner.js.map +1 -1
- package/dist/core/extensions/builtin/loop/command.js.map +1 -1
- package/dist/core/extensions/builtin/loop/cron-planner.js.map +1 -1
- package/dist/core/extensions/builtin/loop/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop/index.js.map +1 -1
- package/dist/core/extensions/builtin/loop/loopfile.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop/scheduler.js.map +1 -1
- package/dist/core/extensions/builtin/loop/status.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/detectors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/escalation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/escalation.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/index.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/notice.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -1
- package/dist/core/extensions/builtin/loop-guard/tracker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/active-set.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/callback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-errors.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-provider.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/oauth.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/token-store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/catalog.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/config-schema.d.ts +28 -28
- package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/connection.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/elicitation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/elicitation.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/errors.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/register.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/guard/output-guard.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/guard/output-guard.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/log.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/reconnect.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/core/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.d.ts.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/core/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/oauth-login-interaction.d.ts +13 -6
- package/dist/core/extensions/builtin/oauth-login-interaction.d.ts.map +1 -1
- package/dist/core/extensions/builtin/oauth-login-interaction.js +43 -19
- package/dist/core/extensions/builtin/oauth-login-interaction.js.map +1 -1
- package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts +5 -3
- package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts.map +1 -1
- package/dist/core/extensions/builtin/openai-image-gen/inject.js +7 -4
- package/dist/core/extensions/builtin/openai-image-gen/inject.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +4 -4
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +4 -4
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/rule-activation/renderer.js.map +1 -1
- package/dist/core/extensions/builtin/rules/commands.js.map +1 -1
- package/dist/core/extensions/builtin/rules/config.js.map +1 -1
- package/dist/core/extensions/builtin/rules/rules/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/rules/project-root.js.map +1 -1
- package/dist/core/extensions/builtin/rules/ui/dynamic-border.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/ui/rules-banner.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-status-ticker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/restore.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/terminal-manifest.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-operations.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-widget-component.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/todo-widget-component.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
- package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tool-search/service.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/leak-context.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/token-grammar.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/manager.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/message-update.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/stream-utils.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/watch.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/errors.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/notice/box.d.ts.map +1 -1
- package/dist/core/extensions/notice/box.js +13 -5
- package/dist/core/extensions/notice/box.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +11 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +23 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +71 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/high-reasoning-warning.d.ts.map +1 -1
- package/dist/core/high-reasoning-warning.js +5 -1
- package/dist/core/high-reasoning-warning.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/keybindings.d.ts +182 -177
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +5 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/lockfile-policy.d.ts.map +1 -1
- package/dist/core/manual-continue.d.ts +14 -0
- package/dist/core/manual-continue.d.ts.map +1 -1
- package/dist/core/manual-continue.js +13 -0
- package/dist/core/manual-continue.js.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config-schema.d.ts +150 -150
- package/dist/core/model-config-schema.d.ts.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -0
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
- package/dist/core/retry-fallback/cooldown.js.map +1 -1
- package/dist/core/retry-fallback/expansion.js.map +1 -1
- package/dist/core/retry-fallback/log.js.map +1 -1
- package/dist/core/retry-fallback/probe-scheduler.d.ts.map +1 -1
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +14 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-activity.d.ts.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-log.js.map +1 -1
- package/dist/core/session-manager.d.ts +35 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +15 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-resident-store.d.ts.map +1 -1
- package/dist/core/session-sidecar-store.d.ts.map +1 -1
- package/dist/core/session-summary-lru.d.ts.map +1 -1
- package/dist/core/session-work-barrier.d.ts.map +1 -1
- package/dist/core/settings-manager.d.ts +6 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +14 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-shapes.d.ts +7 -0
- package/dist/core/settings-shapes.d.ts.map +1 -1
- package/dist/core/settings-shapes.js +3 -1
- package/dist/core/settings-shapes.js.map +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bounded-realpath.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/powershell.d.ts.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/tail-window.d.ts.map +1 -1
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/write-result.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/extensions/llama/client.d.ts.map +1 -1
- package/dist/extensions/llama/client.js.map +1 -1
- package/dist/extensions/llama/huggingface.d.ts.map +1 -1
- package/dist/extensions/llama/huggingface.js.map +1 -1
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/from-source-config-guard.js.map +1 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/app-server/daemon/occupancy.d.ts.map +1 -1
- package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
- package/dist/modes/app-server/daemon/process.js.map +1 -1
- package/dist/modes/app-server/daemon.js.map +1 -1
- package/dist/modes/app-server/protocol/collaboration-mode.d.ts.map +1 -1
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.d.ts +7 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputAnswer.js.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.d.ts +8 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputOption.js.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.d.ts +12 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputParams.js.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.d.ts +13 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputQuestion.js.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.d.ts +10 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.d.ts.map +1 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.js +4 -0
- package/dist/modes/app-server/protocol/generated/v2/ToolRequestUserInputResponse.js.map +1 -0
- package/dist/modes/app-server/protocol/index.d.ts +2 -0
- package/dist/modes/app-server/protocol/index.d.ts.map +1 -1
- package/dist/modes/app-server/protocol/index.js.map +1 -1
- package/dist/modes/app-server/protocol/methods.d.ts +1 -0
- package/dist/modes/app-server/protocol/methods.d.ts.map +1 -1
- package/dist/modes/app-server/protocol/methods.js +1 -0
- package/dist/modes/app-server/protocol/methods.js.map +1 -1
- package/dist/modes/app-server/rpc/errors.d.ts.map +1 -1
- package/dist/modes/app-server/runtime.d.ts.map +1 -1
- package/dist/modes/app-server/runtime.js +22 -6
- package/dist/modes/app-server/runtime.js.map +1 -1
- package/dist/modes/app-server/search/fuzzy-files.js.map +1 -1
- package/dist/modes/app-server/search/fuzzy-search-service.d.ts.map +1 -1
- package/dist/modes/app-server/server/account.js.map +1 -1
- package/dist/modes/app-server/server/approval-bridge.d.ts.map +1 -1
- package/dist/modes/app-server/server/approval-types.d.ts.map +1 -1
- package/dist/modes/app-server/server/approval-ui-context.d.ts +2 -1
- package/dist/modes/app-server/server/approval-ui-context.d.ts.map +1 -1
- package/dist/modes/app-server/server/approval-ui-context.js +9 -1
- package/dist/modes/app-server/server/approval-ui-context.js.map +1 -1
- package/dist/modes/app-server/server/catalogs.js.map +1 -1
- package/dist/modes/app-server/server/config.js.map +1 -1
- package/dist/modes/app-server/server/connection.d.ts.map +1 -1
- package/dist/modes/app-server/server/models.js.map +1 -1
- package/dist/modes/app-server/server/notifications.d.ts.map +1 -1
- package/dist/modes/app-server/server/notifications.js.map +1 -1
- package/dist/modes/app-server/server/server-core.d.ts.map +1 -1
- package/dist/modes/app-server/server/server-core.js.map +1 -1
- package/dist/modes/app-server/server/skills.js.map +1 -1
- package/dist/modes/app-server/server/user-input-bridge.d.ts +16 -0
- package/dist/modes/app-server/server/user-input-bridge.d.ts.map +1 -0
- package/dist/modes/app-server/server/user-input-bridge.js +142 -0
- package/dist/modes/app-server/server/user-input-bridge.js.map +1 -0
- package/dist/modes/app-server/server/user-input-types.d.ts +43 -0
- package/dist/modes/app-server/server/user-input-types.d.ts.map +1 -0
- package/dist/modes/app-server/server/user-input-types.js +51 -0
- package/dist/modes/app-server/server/user-input-types.js.map +1 -0
- package/dist/modes/app-server/threads/archive-state.d.ts.map +1 -1
- package/dist/modes/app-server/threads/handlers.js.map +1 -1
- package/dist/modes/app-server/threads/mcp-wire-status.d.ts.map +1 -1
- package/dist/modes/app-server/threads/metadata-state.d.ts.map +1 -1
- package/dist/modes/app-server/threads/projection-file-changes.js.map +1 -1
- package/dist/modes/app-server/threads/projection-message-items.d.ts.map +1 -1
- package/dist/modes/app-server/threads/projection-turn-diff.d.ts.map +1 -1
- package/dist/modes/app-server/threads/projection-web-search.js.map +1 -1
- package/dist/modes/app-server/threads/projection.d.ts.map +1 -1
- package/dist/modes/app-server/threads/registry.d.ts.map +1 -1
- package/dist/modes/app-server/threads/registry.js.map +1 -1
- package/dist/modes/app-server/threads/search-cache.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turn-log.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
- package/dist/modes/app-server/threads/turns.js.map +1 -1
- package/dist/modes/app-server/threads/wire-thread.js.map +1 -1
- package/dist/modes/app-server/transports/unix-socket.d.ts.map +1 -1
- package/dist/modes/app-server/transports/unix-socket.js.map +1 -1
- package/dist/modes/app-server/transports/websocket.d.ts.map +1 -1
- package/dist/modes/app-server/turn-adapter.d.ts +3 -3
- package/dist/modes/app-server/turn-adapter.d.ts.map +1 -1
- package/dist/modes/app-server/turn-adapter.js +36 -5
- package/dist/modes/app-server/turn-adapter.js.map +1 -1
- package/dist/modes/interactive/compaction-queue-transfer.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-async-widget.d.ts +39 -0
- package/dist/modes/interactive/components/ask-user-async-widget.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-async-widget.js +82 -0
- package/dist/modes/interactive/components/ask-user-async-widget.js.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-keys.d.ts +21 -0
- package/dist/modes/interactive/components/ask-user-question-keys.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-keys.js +115 -0
- package/dist/modes/interactive/components/ask-user-question-keys.js.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-render.d.ts +17 -0
- package/dist/modes/interactive/components/ask-user-question-render.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-render.js +75 -0
- package/dist/modes/interactive/components/ask-user-question-render.js.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-state.d.ts +52 -0
- package/dist/modes/interactive/components/ask-user-question-state.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-question-state.js +134 -0
- package/dist/modes/interactive/components/ask-user-question-state.js.map +1 -0
- package/dist/modes/interactive/components/ask-user-question.d.ts +50 -0
- package/dist/modes/interactive/components/ask-user-question.d.ts.map +1 -0
- package/dist/modes/interactive/components/ask-user-question.js +148 -0
- package/dist/modes/interactive/components/ask-user-question.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/continuity-notice.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/progressive-transcript-container.d.ts.map +1 -1
- package/dist/modes/interactive/components/render-signature.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/shortcut-overlay.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution-images.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-renderer-boundary.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +4 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +24 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
- package/dist/modes/interactive/grok/footer.d.ts.map +1 -1
- package/dist/modes/interactive/grok/input-card.d.ts.map +1 -1
- package/dist/modes/interactive/grok/palette.d.ts.map +1 -1
- package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -1
- package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts +6 -0
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.js +32 -3
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +48 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +433 -103
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/login-outcome.d.ts +20 -0
- package/dist/modes/interactive/login-outcome.d.ts.map +1 -0
- package/dist/modes/interactive/login-outcome.js +35 -0
- package/dist/modes/interactive/login-outcome.js.map +1 -0
- package/dist/modes/interactive/startup-tools.js.map +1 -1
- package/dist/modes/interactive/streaming-reveal-content.d.ts.map +1 -1
- package/dist/modes/interactive/streaming-reveal-content.js.map +1 -1
- package/dist/modes/interactive/streaming-reveal.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/input-tips.d.ts +7 -7
- package/dist/modes/interactive/tips/catalog/input-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/input-tips.js +5 -0
- package/dist/modes/interactive/tips/catalog/input-tips.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/model-tips.d.ts +1 -1
- package/dist/modes/interactive/tips/catalog/workspace-tips.d.ts +1 -1
- package/dist/modes/interactive/tips/scheduler.js.map +1 -1
- package/dist/modes/interactive/tips/working-tip.d.ts.map +1 -1
- package/dist/modes/interactive/tool-args-reveal.d.ts.map +1 -1
- package/dist/modes/interactive/tool-result-reveal.d.ts.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +8 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/provider-native-rendering.d.ts.map +1 -1
- package/dist/modes/provider-native-rendering.js +35 -0
- package/dist/modes/provider-native-rendering.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +75 -2
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/connection-question-bridge.d.ts +18 -0
- package/dist/modes/rpc/connection-question-bridge.d.ts.map +1 -0
- package/dist/modes/rpc/connection-question-bridge.js +156 -0
- package/dist/modes/rpc/connection-question-bridge.js.map +1 -0
- package/dist/modes/rpc/custom-capability.d.ts +2 -0
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +2 -0
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/event-output-buffer.js.map +1 -1
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/host-watchdog.js.map +1 -1
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/ownership-safe-lock.d.ts.map +1 -1
- package/dist/modes/rpc/ownership-safe-lock.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +20 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +35 -3
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.js +2 -0
- package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +103 -3
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +6 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-binding.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +4 -4
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +14 -8
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-fanout.d.ts +2 -0
- package/dist/modes/rpc/session-event-fanout.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-fanout.js +25 -1
- package/dist/modes/rpc/session-event-fanout.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +7 -1
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +17 -4
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +11 -1
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-client.js.map +1 -1
- package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-requests.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-requests.js +1 -1
- package/dist/modes/rpc/session-worker-requests.js.map +1 -1
- package/dist/modes/rpc/session-worker.js +10 -2
- package/dist/modes/rpc/session-worker.js.map +1 -1
- package/dist/modes/rpc/socket-event-fanout.d.ts +14 -1
- package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -1
- package/dist/modes/rpc/socket-event-fanout.js +48 -2
- package/dist/modes/rpc/socket-event-fanout.js.map +1 -1
- package/dist/modes/rpc/socket-ownership.js.map +1 -1
- package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/worker-session-registry.js +2 -1
- package/dist/modes/rpc/worker-session-registry.js.map +1 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/self-update-bootstrap.js.map +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/management-http.js.map +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/pi-user-agent.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/app-server.md +14 -0
- package/docs/extensions.md +28 -1
- package/docs/keybindings.md +1 -0
- package/docs/providers.md +1 -0
- package/docs/rpc.md +95 -3
- package/docs/settings.md +18 -0
- package/docs/skills.md +1 -1
- package/docs/tui.md +6 -0
- package/docs/usage.md +2 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +30 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +17 -2
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/config/settings.ts +35 -15
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +13 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +76 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +6 -77
- package/node_modules/@code-yeongyu/senpi-codemode/src/timeouts/run-budget.ts +107 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-deadlines.ts +76 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +25 -14
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-contract.ts +4 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +47 -40
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-notification.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +5 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +8 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +17 -187
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +189 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +66 -56
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/reducer.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/result.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/context.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/telemetry.d.ts +36 -36
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/telemetry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +4 -4
- package/node_modules/@earendil-works/pi-ai/README.md +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +6 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.lazy.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/context-room.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/gen/agent_pb.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/stream-retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.lazy.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js +10 -6
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts +36 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js +36 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.js +96 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-result.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +13 -88
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/warm-prompt-cache.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js +86 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.d.ts +47 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.js +126 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth-refresh.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.js +44 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/refresh-credential.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +26 -35
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/model-capabilities.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +71 -68
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +4 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +3 -28
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/node/provider-scope.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/venice.json +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/ollama.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/radius.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.js +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/venice.models.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/parse.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +20 -3
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +3 -3
- package/node_modules/@earendil-works/pi-pty/dist/loader.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/loader.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/quarantine.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/registry-types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/registry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/registry.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/session-bun.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/session.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +2 -2
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/alt-screen-flash.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/h-stack.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/h-stack.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/latex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/stack.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/stack.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/v-stack.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/v-stack.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/image-markers.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/native-module-path.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/paste-markers.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-capabilities.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tmux-image-probe.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +2 -2
- package/node_modules/css-tree/cjs/data-patch.cjs +853 -5
- package/node_modules/css-tree/cjs/data.cjs +13598 -3
- package/node_modules/css-tree/cjs/version.cjs +1 -3
- package/node_modules/css-tree/lib/data-patch.js +853 -4
- package/node_modules/css-tree/lib/data.js +13598 -5
- package/node_modules/css-tree/lib/version.js +1 -5
- package/package.json +8 -8
- package/vendor/pi-client/client.d.ts.map +1 -1
- package/vendor/pi-client/client.js.map +1 -1
- package/vendor/pi-client/connection.d.ts.map +1 -1
- package/vendor/pi-client/connection.js.map +1 -1
- package/vendor/pi-client/errors.d.ts.map +1 -1
- package/vendor/pi-client/session-handle.d.ts.map +1 -1
- package/vendor/pi-client/state.d.ts.map +1 -1
- package/vendor/pi-protocol/cbor/decoder.js.map +1 -1
- package/vendor/pi-protocol/cbor/options.d.ts.map +1 -1
- package/vendor/pi-protocol/codec.d.ts.map +1 -1
- package/vendor/pi-protocol/codec.js.map +1 -1
- package/vendor/pi-protocol/framing.d.ts.map +1 -1
- package/vendor/pi-protocol/schemas.d.ts +678 -678
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { ImageContent } from "../types.ts";
|
|
2
2
|
import type { OpenAIImageParams } from "./openai-images-params.ts";
|
|
3
|
-
export declare function buildEditParams(params: OpenAIImageParams, images: ImageContent[]): Promise<OpenAIImageParams>;
|
|
3
|
+
export declare function buildEditParams(params: OpenAIImageParams, images: ImageContent[], mask?: ImageContent): Promise<OpenAIImageParams>;
|
|
4
4
|
//# sourceMappingURL=openai-images-edit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-images-edit.d.ts","sourceRoot":"","sources":["../../src/api/openai-images-edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-images-edit.d.ts","sourceRoot":"","sources":["../../src/api/openai-images-edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAQnE,wBAAsB,eAAe,CACpC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,EAAE,EACtB,IAAI,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAK5B"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { toFile } from "openai";
|
|
2
|
-
|
|
2
|
+
function upload(image, name) {
|
|
3
|
+
return toFile(Buffer.from(image.data, "base64"), `${name}.${image.mimeType.split("/")[1]}`, {
|
|
4
|
+
type: image.mimeType,
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
export async function buildEditParams(params, images, mask) {
|
|
3
8
|
if (images.length > 16)
|
|
4
9
|
throw new Error("OpenAI image edits accept at most 16 reference images");
|
|
5
|
-
const image = await Promise.all(images.map((
|
|
6
|
-
|
|
7
|
-
return
|
|
8
|
-
}
|
|
9
|
-
return { ...params, image };
|
|
10
|
+
const image = await Promise.all(images.map((reference, i) => upload(reference, `reference-${i}`)));
|
|
11
|
+
if (mask === undefined)
|
|
12
|
+
return { ...params, image };
|
|
13
|
+
return { ...params, image, mask: await upload(mask, "mask") };
|
|
10
14
|
}
|
|
11
15
|
//# sourceMappingURL=openai-images-edit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-images-edit.js","sourceRoot":"","sources":["../../src/api/openai-images-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,MAAM,CAAC,KAAK,UAAU,eAAe,
|
|
1
|
+
{"version":3,"file":"openai-images-edit.js","sourceRoot":"","sources":["../../src/api/openai-images-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,SAAS,MAAM,CAAC,KAAmB,EAAE,IAAY;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3F,IAAI,EAAE,KAAK,CAAC,QAAQ;KACpB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,MAAyB,EACzB,MAAsB,EACtB,IAAmB;IAEnB,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC;IACpD,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;AAC/D,CAAC","sourcesContent":["import { toFile } from \"openai\";\nimport type { ImageContent } from \"../types.ts\";\nimport type { OpenAIImageParams } from \"./openai-images-params.ts\";\n\nfunction upload(image: ImageContent, name: string) {\n\treturn toFile(Buffer.from(image.data, \"base64\"), `${name}.${image.mimeType.split(\"/\")[1]}`, {\n\t\ttype: image.mimeType,\n\t});\n}\n\nexport async function buildEditParams(\n\tparams: OpenAIImageParams,\n\timages: ImageContent[],\n\tmask?: ImageContent,\n): Promise<OpenAIImageParams> {\n\tif (images.length > 16) throw new Error(\"OpenAI image edits accept at most 16 reference images\");\n\tconst image = await Promise.all(images.map((reference, i) => upload(reference, `reference-${i}`)));\n\tif (mask === undefined) return { ...params, image };\n\treturn { ...params, image, mask: await upload(mask, \"mask\") };\n}\n"]}
|
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
import type { Uploadable } from "openai";
|
|
2
2
|
import type { ImageGenerateParamsNonStreaming } from "openai/resources/images.js";
|
|
3
|
-
import type { ImagesContext, ImagesModel, ImagesOptions } from "../types.ts";
|
|
3
|
+
import type { ImageContent, ImagesContext, ImagesModel, ImagesOptions } from "../types.ts";
|
|
4
4
|
export type OpenAIImageQuality = "auto" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
5
5
|
export type OpenAIImageSize = "auto" | "1024x1024" | "1536x1024" | "1024x1536" | `${number}x${number}`;
|
|
6
|
+
export type OpenAIImageBackground = "auto" | "transparent" | "opaque";
|
|
7
|
+
export type OpenAIImageOutputFormat = "png" | "jpeg" | "webp";
|
|
8
|
+
export type OpenAIImageModeration = "auto" | "low";
|
|
6
9
|
export interface OpenAIImagesOptions extends ImagesOptions {
|
|
7
10
|
size?: OpenAIImageSize;
|
|
8
11
|
quality?: OpenAIImageQuality;
|
|
9
12
|
n?: number;
|
|
13
|
+
/** Output transparency. `transparent` requires `outputFormat` png or webp. */
|
|
14
|
+
background?: OpenAIImageBackground;
|
|
15
|
+
/** Container of the returned bytes. Default png. */
|
|
16
|
+
outputFormat?: OpenAIImageOutputFormat;
|
|
17
|
+
/** 0-100 compression for jpeg/webp output only. */
|
|
18
|
+
outputCompression?: number;
|
|
19
|
+
moderation?: OpenAIImageModeration;
|
|
20
|
+
/** Inpainting mask applied to the first input image; requires at least one image input. */
|
|
21
|
+
mask?: ImageContent;
|
|
10
22
|
}
|
|
11
23
|
export type OpenAIImageParams = Omit<ImageGenerateParamsNonStreaming, "size" | "quality"> & {
|
|
12
24
|
size?: OpenAIImageSize;
|
|
13
25
|
quality?: OpenAIImageQuality;
|
|
14
26
|
image?: Uploadable[];
|
|
27
|
+
mask?: Uploadable;
|
|
15
28
|
};
|
|
16
29
|
export declare function parseOpenAIImageSize(size: string): {
|
|
17
30
|
ok: true;
|
|
@@ -20,6 +33,28 @@ export declare function parseOpenAIImageSize(size: string): {
|
|
|
20
33
|
ok: false;
|
|
21
34
|
error: string;
|
|
22
35
|
};
|
|
36
|
+
export interface OpenAIImageOutputOptionsInput {
|
|
37
|
+
background?: OpenAIImageBackground | undefined;
|
|
38
|
+
outputFormat?: OpenAIImageOutputFormat | undefined;
|
|
39
|
+
outputCompression?: number | undefined;
|
|
40
|
+
/** Whether an inpainting mask accompanies the request. */
|
|
41
|
+
hasMask: boolean;
|
|
42
|
+
/** Number of image inputs (references or edit targets) in the request. */
|
|
43
|
+
imageCount: number;
|
|
44
|
+
}
|
|
45
|
+
export type OpenAIImageOutputOptions = {
|
|
46
|
+
ok: true;
|
|
47
|
+
outputFormat: OpenAIImageOutputFormat;
|
|
48
|
+
} | {
|
|
49
|
+
ok: false;
|
|
50
|
+
error: string;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Validates the output-shaping options before any request leaves the process.
|
|
54
|
+
* Mirrors the Images API contract: transparency needs an alpha-capable container,
|
|
55
|
+
* compression is a jpeg/webp-only integer percentage, and a mask edits an image.
|
|
56
|
+
*/
|
|
57
|
+
export declare function parseOpenAIImageOutputOptions(input: OpenAIImageOutputOptionsInput): OpenAIImageOutputOptions;
|
|
23
58
|
export declare function buildParams(model: ImagesModel<"openai-images">, context: ImagesContext, options?: OpenAIImagesOptions): OpenAIImageParams;
|
|
24
59
|
export declare function isImageParams(value: unknown): value is OpenAIImageParams;
|
|
25
60
|
//# sourceMappingURL=openai-images-params.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-images-params.d.ts","sourceRoot":"","sources":["../../src/api/openai-images-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-images-params.d.ts","sourceRoot":"","sources":["../../src/api/openai-images-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK3F,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AACtF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AACvG,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAC;AACtE,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9D,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnD,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACzD,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,8EAA8E;IAC9E,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,oDAAoD;IACpD,YAAY,CAAC,EAAE,uBAAuB,CAAC;IACvC,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,2FAA2F;IAC3F,IAAI,CAAC,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,+BAA+B,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC3F,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,UAAU,CAAC;CAClB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAqB5G;AAED,MAAM,WAAW,6BAA6B;IAC7C,UAAU,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC/C,YAAY,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACnD,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,wBAAwB,GACjC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,YAAY,EAAE,uBAAuB,CAAA;CAAE,GACnD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,6BAA6B,GAAG,wBAAwB,CAiB5G;AAED,wBAAgB,WAAW,CAC1B,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,EACnC,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,iBAAiB,CAmCnB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAExE"}
|
|
@@ -23,6 +23,29 @@ export function parseOpenAIImageSize(size) {
|
|
|
23
23
|
}
|
|
24
24
|
return { ok: true, size };
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Validates the output-shaping options before any request leaves the process.
|
|
28
|
+
* Mirrors the Images API contract: transparency needs an alpha-capable container,
|
|
29
|
+
* compression is a jpeg/webp-only integer percentage, and a mask edits an image.
|
|
30
|
+
*/
|
|
31
|
+
export function parseOpenAIImageOutputOptions(input) {
|
|
32
|
+
const outputFormat = input.outputFormat ?? "png";
|
|
33
|
+
if (input.background === "transparent" && outputFormat === "jpeg") {
|
|
34
|
+
return { ok: false, error: "OpenAI image background transparent requires output_format png or webp" };
|
|
35
|
+
}
|
|
36
|
+
if (input.outputCompression !== undefined) {
|
|
37
|
+
if (outputFormat === "png") {
|
|
38
|
+
return { ok: false, error: "OpenAI image output_compression requires output_format jpeg or webp" };
|
|
39
|
+
}
|
|
40
|
+
if (!Number.isInteger(input.outputCompression) || input.outputCompression < 0 || input.outputCompression > 100) {
|
|
41
|
+
return { ok: false, error: "OpenAI image output_compression must be an integer between 0 and 100" };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (input.hasMask && input.imageCount === 0) {
|
|
45
|
+
return { ok: false, error: "OpenAI image mask requires at least one input image" };
|
|
46
|
+
}
|
|
47
|
+
return { ok: true, outputFormat };
|
|
48
|
+
}
|
|
26
49
|
export function buildParams(model, context, options) {
|
|
27
50
|
const promptParts = [];
|
|
28
51
|
for (const item of context.input) {
|
|
@@ -42,14 +65,26 @@ export function buildParams(model, context, options) {
|
|
|
42
65
|
const parsedSize = parseOpenAIImageSize(size);
|
|
43
66
|
if (!parsedSize.ok)
|
|
44
67
|
throw new Error(parsedSize.error);
|
|
68
|
+
const output = parseOpenAIImageOutputOptions({
|
|
69
|
+
background: options?.background,
|
|
70
|
+
outputFormat: options?.outputFormat,
|
|
71
|
+
outputCompression: options?.outputCompression,
|
|
72
|
+
hasMask: options?.mask !== undefined,
|
|
73
|
+
imageCount: context.input.filter((item) => item.type === "image").length,
|
|
74
|
+
});
|
|
75
|
+
if (!output.ok)
|
|
76
|
+
throw new Error(output.error);
|
|
45
77
|
return {
|
|
46
78
|
model: model.id,
|
|
47
79
|
prompt,
|
|
48
80
|
size,
|
|
49
81
|
quality: options?.quality ?? "auto",
|
|
50
82
|
n: options?.n ?? 1,
|
|
51
|
-
output_format:
|
|
83
|
+
output_format: output.outputFormat,
|
|
52
84
|
stream: false,
|
|
85
|
+
...(options?.background === undefined ? {} : { background: options.background }),
|
|
86
|
+
...(options?.outputCompression === undefined ? {} : { output_compression: options.outputCompression }),
|
|
87
|
+
...(options?.moderation === undefined ? {} : { moderation: options.moderation }),
|
|
53
88
|
};
|
|
54
89
|
}
|
|
55
90
|
export function isImageParams(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-images-params.js","sourceRoot":"","sources":["../../src/api/openai-images-params.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Uploadable } from \"openai\";\nimport type { ImageGenerateParamsNonStreaming } from \"openai/resources/images.js\";\nimport type { ImagesContext, ImagesModel, ImagesOptions } from \"../types.ts\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.ts\";\n\nconst MAX_PROMPT_CHARS = 32_000;\n\nexport type OpenAIImageQuality = \"auto\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\nexport type OpenAIImageSize = \"auto\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | `${number}x${number}`;\n\nexport interface OpenAIImagesOptions extends ImagesOptions {\n\tsize?: OpenAIImageSize;\n\tquality?: OpenAIImageQuality;\n\tn?: number;\n}\n\nexport type OpenAIImageParams = Omit<ImageGenerateParamsNonStreaming, \"size\" | \"quality\"> & {\n\tsize?: OpenAIImageSize;\n\tquality?: OpenAIImageQuality;\n\timage?: Uploadable[];\n};\n\nexport function parseOpenAIImageSize(size: string): { ok: true; size: string } | { ok: false; error: string } {\n\tif ([\"auto\", \"1024x1024\", \"1536x1024\", \"1024x1536\"].includes(size)) return { ok: true, size };\n\tconst match = /^\\d+x\\d+$/.exec(size);\n\tif (!match || match[0] !== size) {\n\t\treturn { ok: false, error: \"OpenAI image size must be auto or WIDTHxHEIGHT with integer dimensions\" };\n\t}\n\tconst [width, height] = size.split(\"x\").map(Number);\n\tif (width > 3840 || height > 3840) {\n\t\treturn { ok: false, error: \"OpenAI image size edges must be at most 3840 pixels\" };\n\t}\n\tif (width % 16 !== 0 || height % 16 !== 0) {\n\t\treturn { ok: false, error: \"OpenAI image size width and height must be divisible by 16\" };\n\t}\n\tif (width > height * 3 || height > width * 3) {\n\t\treturn { ok: false, error: \"OpenAI image size aspect ratio must be between 1:3 and 3:1 inclusive\" };\n\t}\n\tconst pixels = width * height;\n\tif (pixels < 655360 || pixels > 8294400) {\n\t\treturn { ok: false, error: \"OpenAI image size must contain between 655360 and 8294400 pixels inclusive\" };\n\t}\n\treturn { ok: true, size };\n}\n\nexport function buildParams(\n\tmodel: ImagesModel<\"openai-images\">,\n\tcontext: ImagesContext,\n\toptions?: OpenAIImagesOptions,\n): OpenAIImageParams {\n\tconst promptParts: string[] = [];\n\tfor (const item of context.input) {\n\t\tif (item.type !== \"text\") continue;\n\t\tconst text = sanitizeSurrogates(item.text);\n\t\tif (text.trim()) promptParts.push(text);\n\t}\n\tconst prompt = promptParts.join(\"\\n\\n\");\n\tif (!prompt.trim()) throw new Error(\"Image generation requires a non-empty text prompt\");\n\tif (prompt.length > MAX_PROMPT_CHARS) {\n\t\tthrow new Error(`Image generation prompt exceeds ${MAX_PROMPT_CHARS} characters`);\n\t}\n\tconst size = options?.size ?? \"auto\";\n\tconst parsedSize = parseOpenAIImageSize(size);\n\tif (!parsedSize.ok) throw new Error(parsedSize.error);\n\treturn {\n\t\tmodel: model.id,\n\t\tprompt,\n\t\tsize,\n\t\tquality: options?.quality ?? \"auto\",\n\t\tn: options?.n ?? 1,\n\t\toutput_format: \"png\",\n\t\tstream: false,\n\t};\n}\n\nexport function isImageParams(value: unknown): value is OpenAIImageParams {\n\treturn typeof value === \"object\" && value !== null && \"prompt\" in value && typeof value.prompt === \"string\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"openai-images-params.js","sourceRoot":"","sources":["../../src/api/openai-images-params.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Uploadable } from \"openai\";\nimport type { ImageGenerateParamsNonStreaming } from \"openai/resources/images.js\";\nimport type { ImageContent, ImagesContext, ImagesModel, ImagesOptions } from \"../types.ts\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.ts\";\n\nconst MAX_PROMPT_CHARS = 32_000;\n\nexport type OpenAIImageQuality = \"auto\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\nexport type OpenAIImageSize = \"auto\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | `${number}x${number}`;\nexport type OpenAIImageBackground = \"auto\" | \"transparent\" | \"opaque\";\nexport type OpenAIImageOutputFormat = \"png\" | \"jpeg\" | \"webp\";\nexport type OpenAIImageModeration = \"auto\" | \"low\";\n\nexport interface OpenAIImagesOptions extends ImagesOptions {\n\tsize?: OpenAIImageSize;\n\tquality?: OpenAIImageQuality;\n\tn?: number;\n\t/** Output transparency. `transparent` requires `outputFormat` png or webp. */\n\tbackground?: OpenAIImageBackground;\n\t/** Container of the returned bytes. Default png. */\n\toutputFormat?: OpenAIImageOutputFormat;\n\t/** 0-100 compression for jpeg/webp output only. */\n\toutputCompression?: number;\n\tmoderation?: OpenAIImageModeration;\n\t/** Inpainting mask applied to the first input image; requires at least one image input. */\n\tmask?: ImageContent;\n}\n\nexport type OpenAIImageParams = Omit<ImageGenerateParamsNonStreaming, \"size\" | \"quality\"> & {\n\tsize?: OpenAIImageSize;\n\tquality?: OpenAIImageQuality;\n\timage?: Uploadable[];\n\tmask?: Uploadable;\n};\n\nexport function parseOpenAIImageSize(size: string): { ok: true; size: string } | { ok: false; error: string } {\n\tif ([\"auto\", \"1024x1024\", \"1536x1024\", \"1024x1536\"].includes(size)) return { ok: true, size };\n\tconst match = /^\\d+x\\d+$/.exec(size);\n\tif (!match || match[0] !== size) {\n\t\treturn { ok: false, error: \"OpenAI image size must be auto or WIDTHxHEIGHT with integer dimensions\" };\n\t}\n\tconst [width, height] = size.split(\"x\").map(Number);\n\tif (width > 3840 || height > 3840) {\n\t\treturn { ok: false, error: \"OpenAI image size edges must be at most 3840 pixels\" };\n\t}\n\tif (width % 16 !== 0 || height % 16 !== 0) {\n\t\treturn { ok: false, error: \"OpenAI image size width and height must be divisible by 16\" };\n\t}\n\tif (width > height * 3 || height > width * 3) {\n\t\treturn { ok: false, error: \"OpenAI image size aspect ratio must be between 1:3 and 3:1 inclusive\" };\n\t}\n\tconst pixels = width * height;\n\tif (pixels < 655360 || pixels > 8294400) {\n\t\treturn { ok: false, error: \"OpenAI image size must contain between 655360 and 8294400 pixels inclusive\" };\n\t}\n\treturn { ok: true, size };\n}\n\nexport interface OpenAIImageOutputOptionsInput {\n\tbackground?: OpenAIImageBackground | undefined;\n\toutputFormat?: OpenAIImageOutputFormat | undefined;\n\toutputCompression?: number | undefined;\n\t/** Whether an inpainting mask accompanies the request. */\n\thasMask: boolean;\n\t/** Number of image inputs (references or edit targets) in the request. */\n\timageCount: number;\n}\n\nexport type OpenAIImageOutputOptions =\n\t| { ok: true; outputFormat: OpenAIImageOutputFormat }\n\t| { ok: false; error: string };\n\n/**\n * Validates the output-shaping options before any request leaves the process.\n * Mirrors the Images API contract: transparency needs an alpha-capable container,\n * compression is a jpeg/webp-only integer percentage, and a mask edits an image.\n */\nexport function parseOpenAIImageOutputOptions(input: OpenAIImageOutputOptionsInput): OpenAIImageOutputOptions {\n\tconst outputFormat = input.outputFormat ?? \"png\";\n\tif (input.background === \"transparent\" && outputFormat === \"jpeg\") {\n\t\treturn { ok: false, error: \"OpenAI image background transparent requires output_format png or webp\" };\n\t}\n\tif (input.outputCompression !== undefined) {\n\t\tif (outputFormat === \"png\") {\n\t\t\treturn { ok: false, error: \"OpenAI image output_compression requires output_format jpeg or webp\" };\n\t\t}\n\t\tif (!Number.isInteger(input.outputCompression) || input.outputCompression < 0 || input.outputCompression > 100) {\n\t\t\treturn { ok: false, error: \"OpenAI image output_compression must be an integer between 0 and 100\" };\n\t\t}\n\t}\n\tif (input.hasMask && input.imageCount === 0) {\n\t\treturn { ok: false, error: \"OpenAI image mask requires at least one input image\" };\n\t}\n\treturn { ok: true, outputFormat };\n}\n\nexport function buildParams(\n\tmodel: ImagesModel<\"openai-images\">,\n\tcontext: ImagesContext,\n\toptions?: OpenAIImagesOptions,\n): OpenAIImageParams {\n\tconst promptParts: string[] = [];\n\tfor (const item of context.input) {\n\t\tif (item.type !== \"text\") continue;\n\t\tconst text = sanitizeSurrogates(item.text);\n\t\tif (text.trim()) promptParts.push(text);\n\t}\n\tconst prompt = promptParts.join(\"\\n\\n\");\n\tif (!prompt.trim()) throw new Error(\"Image generation requires a non-empty text prompt\");\n\tif (prompt.length > MAX_PROMPT_CHARS) {\n\t\tthrow new Error(`Image generation prompt exceeds ${MAX_PROMPT_CHARS} characters`);\n\t}\n\tconst size = options?.size ?? \"auto\";\n\tconst parsedSize = parseOpenAIImageSize(size);\n\tif (!parsedSize.ok) throw new Error(parsedSize.error);\n\tconst output = parseOpenAIImageOutputOptions({\n\t\tbackground: options?.background,\n\t\toutputFormat: options?.outputFormat,\n\t\toutputCompression: options?.outputCompression,\n\t\thasMask: options?.mask !== undefined,\n\t\timageCount: context.input.filter((item) => item.type === \"image\").length,\n\t});\n\tif (!output.ok) throw new Error(output.error);\n\treturn {\n\t\tmodel: model.id,\n\t\tprompt,\n\t\tsize,\n\t\tquality: options?.quality ?? \"auto\",\n\t\tn: options?.n ?? 1,\n\t\toutput_format: output.outputFormat,\n\t\tstream: false,\n\t\t...(options?.background === undefined ? {} : { background: options.background }),\n\t\t...(options?.outputCompression === undefined ? {} : { output_compression: options.outputCompression }),\n\t\t...(options?.moderation === undefined ? {} : { moderation: options.moderation }),\n\t};\n}\n\nexport function isImageParams(value: unknown): value is OpenAIImageParams {\n\treturn typeof value === \"object\" && value !== null && \"prompt\" in value && typeof value.prompt === \"string\";\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Image } from "openai/resources/images.js";
|
|
2
|
+
import type { ImageContent } from "../types.ts";
|
|
3
|
+
import type { OpenAIImageOutputFormat, OpenAIImagesOptions } from "./openai-images-params.ts";
|
|
4
|
+
/** The container the request asked for; a replaced payload without one falls back to the API default. */
|
|
5
|
+
export declare function requestedOutputFormat(value: unknown): OpenAIImageOutputFormat;
|
|
6
|
+
/**
|
|
7
|
+
* Decodes one response datum. Inline base64 is labeled by its magic bytes, falling back to
|
|
8
|
+
* the requested container only when the header is unrecognizable: gateways can ignore
|
|
9
|
+
* `output_format` and return png, and a wrong label would follow the file to disk.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveImage(datum: Image, outputFormat: OpenAIImageOutputFormat, options?: OpenAIImagesOptions): Promise<ImageContent>;
|
|
12
|
+
//# sourceMappingURL=openai-images-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-images-result.d.ts","sourceRoot":"","sources":["../../src/api/openai-images-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAS9F,yGAAyG;AACzG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAE7E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CACjC,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,uBAAuB,EACrC,OAAO,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAUvB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const MAX_IMAGE_BYTES = 24 * 1024 * 1024;
|
|
2
|
+
const PNG_MAGIC = [0x89, 0x50, 0x4e, 0x47];
|
|
3
|
+
const JPEG_MAGIC = [0xff, 0xd8, 0xff];
|
|
4
|
+
const WEBP_MAGIC = [0x52, 0x49, 0x46, 0x46, 0x57, 0x45, 0x42, 0x50];
|
|
5
|
+
/** The container the request asked for; a replaced payload without one falls back to the API default. */
|
|
6
|
+
export function requestedOutputFormat(value) {
|
|
7
|
+
return value === "jpeg" || value === "webp" ? value : "png";
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Decodes one response datum. Inline base64 is labeled by its magic bytes, falling back to
|
|
11
|
+
* the requested container only when the header is unrecognizable: gateways can ignore
|
|
12
|
+
* `output_format` and return png, and a wrong label would follow the file to disk.
|
|
13
|
+
*/
|
|
14
|
+
export async function resolveImage(datum, outputFormat, options) {
|
|
15
|
+
const b64 = datum.b64_json?.trim();
|
|
16
|
+
if (b64) {
|
|
17
|
+
const detected = detectMime(Buffer.from(b64.slice(0, 24), "base64"));
|
|
18
|
+
return { type: "image", mimeType: detected ?? `image/${outputFormat}`, data: b64 };
|
|
19
|
+
}
|
|
20
|
+
const url = datum.url?.trim();
|
|
21
|
+
if (!url)
|
|
22
|
+
throw new Error("OpenAI images response datum contained no image data");
|
|
23
|
+
if (url.startsWith("data:"))
|
|
24
|
+
return parseDataUrl(url);
|
|
25
|
+
return hydrateImageUrl(url, options);
|
|
26
|
+
}
|
|
27
|
+
function parseDataUrl(url) {
|
|
28
|
+
const match = /^data:([^;,]+);base64,(.+)$/i.exec(url);
|
|
29
|
+
if (!match?.[1] || !match[2])
|
|
30
|
+
throw new Error("OpenAI images response contained an invalid data URL");
|
|
31
|
+
const mimeType = supportedMime(match[1]);
|
|
32
|
+
if (!mimeType)
|
|
33
|
+
throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);
|
|
34
|
+
return { type: "image", mimeType, data: match[2] };
|
|
35
|
+
}
|
|
36
|
+
async function hydrateImageUrl(url, options) {
|
|
37
|
+
let parsed;
|
|
38
|
+
try {
|
|
39
|
+
parsed = new URL(url);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new Error("OpenAI images response URL must be absolute");
|
|
43
|
+
}
|
|
44
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
45
|
+
throw new Error("OpenAI images response URL must use HTTP or HTTPS");
|
|
46
|
+
}
|
|
47
|
+
const response = await (options?.fetch ?? globalThis.fetch)(url, options?.signal ? { signal: options.signal } : {});
|
|
48
|
+
if (!response.ok)
|
|
49
|
+
throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);
|
|
50
|
+
const declaredLength = response.headers.get("content-length");
|
|
51
|
+
if (declaredLength && Number(declaredLength) > MAX_IMAGE_BYTES)
|
|
52
|
+
throw oversizedImageError();
|
|
53
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
54
|
+
if (bytes.byteLength === 0)
|
|
55
|
+
throw new Error("OpenAI image hydration returned an empty body");
|
|
56
|
+
if (bytes.byteLength > MAX_IMAGE_BYTES)
|
|
57
|
+
throw oversizedImageError();
|
|
58
|
+
const declaredMime = supportedMime(response.headers.get("content-type")?.split(";", 1)[0]);
|
|
59
|
+
const detectedMime = detectMime(bytes);
|
|
60
|
+
if (declaredMime && detectedMime && declaredMime !== detectedMime) {
|
|
61
|
+
throw new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);
|
|
62
|
+
}
|
|
63
|
+
const mimeType = detectedMime ?? declaredMime;
|
|
64
|
+
if (!mimeType)
|
|
65
|
+
throw new Error("OpenAI image hydration returned unsupported image content");
|
|
66
|
+
return { type: "image", mimeType, data: bytesToBase64(bytes) };
|
|
67
|
+
}
|
|
68
|
+
function supportedMime(value) {
|
|
69
|
+
const normalized = value?.trim().toLowerCase();
|
|
70
|
+
if (normalized === "image/png" || normalized === "image/jpeg" || normalized === "image/webp")
|
|
71
|
+
return normalized;
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
function detectMime(bytes) {
|
|
75
|
+
if (hasMagic(bytes, PNG_MAGIC))
|
|
76
|
+
return "image/png";
|
|
77
|
+
if (hasMagic(bytes, JPEG_MAGIC))
|
|
78
|
+
return "image/jpeg";
|
|
79
|
+
if (hasMagic(bytes, WEBP_MAGIC.slice(0, 4)) && hasMagic(bytes, WEBP_MAGIC.slice(4), 8))
|
|
80
|
+
return "image/webp";
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
function hasMagic(bytes, magic, offset = 0) {
|
|
84
|
+
return magic.every((value, index) => bytes[offset + index] === value);
|
|
85
|
+
}
|
|
86
|
+
function bytesToBase64(bytes) {
|
|
87
|
+
let binary = "";
|
|
88
|
+
for (let offset = 0; offset < bytes.length; offset += 0x8000) {
|
|
89
|
+
binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));
|
|
90
|
+
}
|
|
91
|
+
return btoa(binary);
|
|
92
|
+
}
|
|
93
|
+
function oversizedImageError() {
|
|
94
|
+
return new Error("OpenAI image hydration exceeded the 24 MiB limit");
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=openai-images-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-images-result.js","sourceRoot":"","sources":["../../src/api/openai-images-result.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Image } from \"openai/resources/images.js\";\nimport type { ImageContent } from \"../types.ts\";\nimport type { OpenAIImageOutputFormat, OpenAIImagesOptions } from \"./openai-images-params.ts\";\n\nconst MAX_IMAGE_BYTES = 24 * 1024 * 1024;\nconst PNG_MAGIC = [0x89, 0x50, 0x4e, 0x47] as const;\nconst JPEG_MAGIC = [0xff, 0xd8, 0xff] as const;\nconst WEBP_MAGIC = [0x52, 0x49, 0x46, 0x46, 0x57, 0x45, 0x42, 0x50] as const;\n\ntype SupportedImageMime = \"image/png\" | \"image/jpeg\" | \"image/webp\";\n\n/** The container the request asked for; a replaced payload without one falls back to the API default. */\nexport function requestedOutputFormat(value: unknown): OpenAIImageOutputFormat {\n\treturn value === \"jpeg\" || value === \"webp\" ? value : \"png\";\n}\n\n/**\n * Decodes one response datum. Inline base64 is labeled by its magic bytes, falling back to\n * the requested container only when the header is unrecognizable: gateways can ignore\n * `output_format` and return png, and a wrong label would follow the file to disk.\n */\nexport async function resolveImage(\n\tdatum: Image,\n\toutputFormat: OpenAIImageOutputFormat,\n\toptions?: OpenAIImagesOptions,\n): Promise<ImageContent> {\n\tconst b64 = datum.b64_json?.trim();\n\tif (b64) {\n\t\tconst detected = detectMime(Buffer.from(b64.slice(0, 24), \"base64\"));\n\t\treturn { type: \"image\", mimeType: detected ?? `image/${outputFormat}`, data: b64 };\n\t}\n\tconst url = datum.url?.trim();\n\tif (!url) throw new Error(\"OpenAI images response datum contained no image data\");\n\tif (url.startsWith(\"data:\")) return parseDataUrl(url);\n\treturn hydrateImageUrl(url, options);\n}\n\nfunction parseDataUrl(url: string): ImageContent {\n\tconst match = /^data:([^;,]+);base64,(.+)$/i.exec(url);\n\tif (!match?.[1] || !match[2]) throw new Error(\"OpenAI images response contained an invalid data URL\");\n\tconst mimeType = supportedMime(match[1]);\n\tif (!mimeType) throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);\n\treturn { type: \"image\", mimeType, data: match[2] };\n}\n\nasync function hydrateImageUrl(url: string, options?: OpenAIImagesOptions): Promise<ImageContent> {\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(url);\n\t} catch {\n\t\tthrow new Error(\"OpenAI images response URL must be absolute\");\n\t}\n\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\tthrow new Error(\"OpenAI images response URL must use HTTP or HTTPS\");\n\t}\n\tconst response = await (options?.fetch ?? globalThis.fetch)(url, options?.signal ? { signal: options.signal } : {});\n\tif (!response.ok) throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);\n\tconst declaredLength = response.headers.get(\"content-length\");\n\tif (declaredLength && Number(declaredLength) > MAX_IMAGE_BYTES) throw oversizedImageError();\n\tconst bytes = new Uint8Array(await response.arrayBuffer());\n\tif (bytes.byteLength === 0) throw new Error(\"OpenAI image hydration returned an empty body\");\n\tif (bytes.byteLength > MAX_IMAGE_BYTES) throw oversizedImageError();\n\tconst declaredMime = supportedMime(response.headers.get(\"content-type\")?.split(\";\", 1)[0]);\n\tconst detectedMime = detectMime(bytes);\n\tif (declaredMime && detectedMime && declaredMime !== detectedMime) {\n\t\tthrow new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);\n\t}\n\tconst mimeType = detectedMime ?? declaredMime;\n\tif (!mimeType) throw new Error(\"OpenAI image hydration returned unsupported image content\");\n\treturn { type: \"image\", mimeType, data: bytesToBase64(bytes) };\n}\n\nfunction supportedMime(value: string | undefined): SupportedImageMime | undefined {\n\tconst normalized = value?.trim().toLowerCase();\n\tif (normalized === \"image/png\" || normalized === \"image/jpeg\" || normalized === \"image/webp\") return normalized;\n\treturn undefined;\n}\n\nfunction detectMime(bytes: Uint8Array): SupportedImageMime | undefined {\n\tif (hasMagic(bytes, PNG_MAGIC)) return \"image/png\";\n\tif (hasMagic(bytes, JPEG_MAGIC)) return \"image/jpeg\";\n\tif (hasMagic(bytes, WEBP_MAGIC.slice(0, 4)) && hasMagic(bytes, WEBP_MAGIC.slice(4), 8)) return \"image/webp\";\n\treturn undefined;\n}\n\nfunction hasMagic(bytes: Uint8Array, magic: readonly number[], offset = 0): boolean {\n\treturn magic.every((value, index) => bytes[offset + index] === value);\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (let offset = 0; offset < bytes.length; offset += 0x8000) {\n\t\tbinary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));\n\t}\n\treturn btoa(binary);\n}\n\nfunction oversizedImageError(): Error {\n\treturn new Error(\"OpenAI image hydration exceeded the 24 MiB limit\");\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ImagesFunction } from "../types.ts";
|
|
2
2
|
import { type OpenAIImagesOptions } from "./openai-images-params.ts";
|
|
3
|
-
export { type OpenAIImageQuality, type OpenAIImageSize, type OpenAIImagesOptions, parseOpenAIImageSize, } from "./openai-images-params.ts";
|
|
3
|
+
export { type OpenAIImageBackground, type OpenAIImageModeration, type OpenAIImageOutputFormat, type OpenAIImageQuality, type OpenAIImageSize, type OpenAIImagesOptions, parseOpenAIImageOutputOptions, parseOpenAIImageSize, } from "./openai-images-params.ts";
|
|
4
4
|
export declare const generateImages: ImagesFunction<"openai-images", OpenAIImagesOptions>;
|
|
5
5
|
//# sourceMappingURL=openai-images.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-images.d.ts","sourceRoot":"","sources":["../../src/api/openai-images.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIX,cAAc,EAId,MAAM,aAAa,CAAC;AAMrB,OAAO,EAA8B,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-images.d.ts","sourceRoot":"","sources":["../../src/api/openai-images.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIX,cAAc,EAId,MAAM,aAAa,CAAC;AAMrB,OAAO,EAA8B,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGjG,OAAO,EACN,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,6BAA6B,EAC7B,oBAAoB,GACpB,MAAM,2BAA2B,CAAC;AAInC,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,eAAe,EAAE,mBAAmB,CA8E/E,CAAC"}
|
|
@@ -5,12 +5,9 @@ import { retryProviderRequest } from "../utils/provider-retry.js";
|
|
|
5
5
|
import { resolveOpenAIClientAuth } from "./openai-client-auth.js";
|
|
6
6
|
import { buildEditParams } from "./openai-images-edit.js";
|
|
7
7
|
import { buildParams, isImageParams } from "./openai-images-params.js";
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
import { requestedOutputFormat, resolveImage } from "./openai-images-result.js";
|
|
9
|
+
export { parseOpenAIImageOutputOptions, parseOpenAIImageSize, } from "./openai-images-params.js";
|
|
10
10
|
const ENDPOINT_SUFFIXES = ["/chat/completions", "/responses", "/models"];
|
|
11
|
-
const PNG_MAGIC = [0x89, 0x50, 0x4e, 0x47];
|
|
12
|
-
const JPEG_MAGIC = [0xff, 0xd8, 0xff];
|
|
13
|
-
const WEBP_MAGIC = [0x52, 0x49, 0x46, 0x46, 0x57, 0x45, 0x42, 0x50];
|
|
14
11
|
export const generateImages = async (model, context, options) => {
|
|
15
12
|
const output = {
|
|
16
13
|
api: model.api,
|
|
@@ -25,7 +22,7 @@ export const generateImages = async (model, context, options) => {
|
|
|
25
22
|
const images = context.input.filter((item) => item.type === "image");
|
|
26
23
|
const method = images.length > 0 ? "edit" : "generate";
|
|
27
24
|
if (method === "edit")
|
|
28
|
-
params = await buildEditParams(params, images);
|
|
25
|
+
params = await buildEditParams(params, images, options?.mask);
|
|
29
26
|
const nextParams = await options?.onPayload?.(params, model);
|
|
30
27
|
if (nextParams !== undefined) {
|
|
31
28
|
if (!isImageParams(nextParams))
|
|
@@ -60,10 +57,14 @@ export const generateImages = async (model, context, options) => {
|
|
|
60
57
|
await options?.onResponse?.({ status: rawResponse.status, headers: headersToRecord(rawResponse.headers) }, model);
|
|
61
58
|
if (response.usage)
|
|
62
59
|
output.usage = parseUsage(response.usage, model);
|
|
60
|
+
if (response.background === "transparent" || response.background === "opaque") {
|
|
61
|
+
output.background = response.background;
|
|
62
|
+
}
|
|
63
63
|
if (!response.data || response.data.length === 0)
|
|
64
64
|
throw new Error("OpenAI images response contained no image data");
|
|
65
|
+
const outputFormat = requestedOutputFormat(params.output_format);
|
|
65
66
|
for (const datum of response.data) {
|
|
66
|
-
const image = await resolveImage(datum, options);
|
|
67
|
+
const image = await resolveImage(datum, outputFormat, options);
|
|
67
68
|
if (datum.revised_prompt?.trim()) {
|
|
68
69
|
output.output.push({ type: "text", text: datum.revised_prompt });
|
|
69
70
|
}
|
|
@@ -101,89 +102,13 @@ function normalizeBaseUrl(baseUrl) {
|
|
|
101
102
|
url.pathname = pathname.endsWith("/v1") ? pathname : `${pathname}/v1`;
|
|
102
103
|
return url.toString();
|
|
103
104
|
}
|
|
104
|
-
|
|
105
|
-
const b64 = datum.b64_json?.trim();
|
|
106
|
-
if (b64)
|
|
107
|
-
return { type: "image", mimeType: "image/png", data: b64 };
|
|
108
|
-
const url = datum.url?.trim();
|
|
109
|
-
if (!url)
|
|
110
|
-
throw new Error("OpenAI images response datum contained no image data");
|
|
111
|
-
if (url.startsWith("data:"))
|
|
112
|
-
return parseDataUrl(url);
|
|
113
|
-
return hydrateImageUrl(url, options);
|
|
114
|
-
}
|
|
115
|
-
function parseDataUrl(url) {
|
|
116
|
-
const match = /^data:([^;,]+);base64,(.+)$/i.exec(url);
|
|
117
|
-
if (!match?.[1] || !match[2])
|
|
118
|
-
throw new Error("OpenAI images response contained an invalid data URL");
|
|
119
|
-
const mimeType = supportedMime(match[1]);
|
|
120
|
-
if (!mimeType)
|
|
121
|
-
throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);
|
|
122
|
-
return { type: "image", mimeType, data: match[2] };
|
|
123
|
-
}
|
|
124
|
-
async function hydrateImageUrl(url, options) {
|
|
125
|
-
let parsed;
|
|
126
|
-
try {
|
|
127
|
-
parsed = new URL(url);
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
throw new Error("OpenAI images response URL must be absolute");
|
|
131
|
-
}
|
|
132
|
-
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
133
|
-
throw new Error("OpenAI images response URL must use HTTP or HTTPS");
|
|
134
|
-
}
|
|
135
|
-
const response = await (options?.fetch ?? globalThis.fetch)(url, options?.signal ? { signal: options.signal } : {});
|
|
136
|
-
if (!response.ok)
|
|
137
|
-
throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);
|
|
138
|
-
const declaredLength = response.headers.get("content-length");
|
|
139
|
-
if (declaredLength && Number(declaredLength) > MAX_IMAGE_BYTES)
|
|
140
|
-
throw oversizedImageError();
|
|
141
|
-
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
142
|
-
if (bytes.byteLength === 0)
|
|
143
|
-
throw new Error("OpenAI image hydration returned an empty body");
|
|
144
|
-
if (bytes.byteLength > MAX_IMAGE_BYTES)
|
|
145
|
-
throw oversizedImageError();
|
|
146
|
-
const declaredMime = supportedMime(response.headers.get("content-type")?.split(";", 1)[0]);
|
|
147
|
-
const detectedMime = detectMime(bytes);
|
|
148
|
-
if (declaredMime && detectedMime && declaredMime !== detectedMime) {
|
|
149
|
-
throw new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);
|
|
150
|
-
}
|
|
151
|
-
const mimeType = detectedMime ?? declaredMime;
|
|
152
|
-
if (!mimeType)
|
|
153
|
-
throw new Error("OpenAI image hydration returned unsupported image content");
|
|
154
|
-
return { type: "image", mimeType, data: bytesToBase64(bytes) };
|
|
155
|
-
}
|
|
156
|
-
function supportedMime(value) {
|
|
157
|
-
const normalized = value?.trim().toLowerCase();
|
|
158
|
-
if (normalized === "image/png" || normalized === "image/jpeg" || normalized === "image/webp")
|
|
159
|
-
return normalized;
|
|
160
|
-
return undefined;
|
|
161
|
-
}
|
|
162
|
-
function detectMime(bytes) {
|
|
163
|
-
if (hasMagic(bytes, PNG_MAGIC))
|
|
164
|
-
return "image/png";
|
|
165
|
-
if (hasMagic(bytes, JPEG_MAGIC))
|
|
166
|
-
return "image/jpeg";
|
|
167
|
-
if (hasMagic(bytes, WEBP_MAGIC.slice(0, 4)) && hasMagic(bytes, WEBP_MAGIC.slice(4), 8))
|
|
168
|
-
return "image/webp";
|
|
169
|
-
return undefined;
|
|
170
|
-
}
|
|
171
|
-
function hasMagic(bytes, magic, offset = 0) {
|
|
172
|
-
return magic.every((value, index) => bytes[offset + index] === value);
|
|
173
|
-
}
|
|
174
|
-
function bytesToBase64(bytes) {
|
|
175
|
-
let binary = "";
|
|
176
|
-
for (let offset = 0; offset < bytes.length; offset += 0x8000) {
|
|
177
|
-
binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));
|
|
178
|
-
}
|
|
179
|
-
return btoa(binary);
|
|
180
|
-
}
|
|
181
|
-
function oversizedImageError() {
|
|
182
|
-
return new Error("OpenAI image hydration exceeded the 24 MiB limit");
|
|
183
|
-
}
|
|
105
|
+
/** Image input tokens carry their own rate; without a breakdown every input token is text. */
|
|
184
106
|
function parseUsage(rawUsage, model) {
|
|
185
107
|
const input = rawUsage.input_tokens ?? 0;
|
|
186
108
|
const output = rawUsage.output_tokens ?? 0;
|
|
109
|
+
const imageTokens = rawUsage.input_tokens_details?.image_tokens ?? 0;
|
|
110
|
+
const textTokens = rawUsage.input_tokens_details?.text_tokens ?? Math.max(0, input - imageTokens);
|
|
111
|
+
const imageRate = model.cost.imageInput ?? model.cost.input;
|
|
187
112
|
const usage = {
|
|
188
113
|
input,
|
|
189
114
|
output,
|
|
@@ -191,7 +116,7 @@ function parseUsage(rawUsage, model) {
|
|
|
191
116
|
cacheWrite: 0,
|
|
192
117
|
totalTokens: rawUsage.total_tokens ?? input + output,
|
|
193
118
|
cost: {
|
|
194
|
-
input: (model.cost.input
|
|
119
|
+
input: (model.cost.input * textTokens + imageRate * imageTokens) / 1_000_000,
|
|
195
120
|
output: (model.cost.output / 1_000_000) * output,
|
|
196
121
|
cacheRead: 0,
|
|
197
122
|
cacheWrite: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-images.js","sourceRoot":"","sources":["../../src/api/openai-images.ts"],"names":[],"mappings":"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","sourcesContent":["import OpenAI from \"openai\";\nimport type { Image, ImageEditParamsNonStreaming, ImageGenerateParamsNonStreaming } from \"openai/resources/images.js\";\nimport type {\n\tAssistantImages,\n\tImageContent,\n\tImagesContext,\n\tImagesFunction,\n\tImagesModel,\n\tProviderHeaders,\n\tTextContent,\n} from \"../types.ts\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.ts\";\nimport { headersToRecord } from \"../utils/headers.ts\";\nimport { retryProviderRequest } from \"../utils/provider-retry.ts\";\nimport { resolveOpenAIClientAuth } from \"./openai-client-auth.ts\";\nimport { buildEditParams } from \"./openai-images-edit.ts\";\nimport { buildParams, isImageParams, type OpenAIImagesOptions } from \"./openai-images-params.ts\";\n\nexport {\n\ttype OpenAIImageQuality,\n\ttype OpenAIImageSize,\n\ttype OpenAIImagesOptions,\n\tparseOpenAIImageSize,\n} from \"./openai-images-params.ts\";\n\nconst MAX_IMAGE_BYTES = 24 * 1024 * 1024;\nconst ENDPOINT_SUFFIXES = [\"/chat/completions\", \"/responses\", \"/models\"] as const;\nconst PNG_MAGIC = [0x89, 0x50, 0x4e, 0x47] as const;\nconst JPEG_MAGIC = [0xff, 0xd8, 0xff] as const;\nconst WEBP_MAGIC = [0x52, 0x49, 0x46, 0x46, 0x57, 0x45, 0x42, 0x50] as const;\n\ntype SupportedImageMime = \"image/png\" | \"image/jpeg\" | \"image/webp\";\n\nexport const generateImages: ImagesFunction<\"openai-images\", OpenAIImagesOptions> = async (\n\tmodel: ImagesModel<\"openai-images\">,\n\tcontext: ImagesContext,\n\toptions?: OpenAIImagesOptions,\n) => {\n\tconst output: AssistantImages = {\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\toutput: [],\n\t\tstopReason: \"stop\",\n\t\ttimestamp: Date.now(),\n\t};\n\n\ttry {\n\t\tlet params = buildParams(model, context, options);\n\t\tconst images = context.input.filter((item): item is ImageContent => item.type === \"image\");\n\t\tconst method = images.length > 0 ? \"edit\" : \"generate\";\n\t\tif (method === \"edit\") params = await buildEditParams(params, images);\n\t\tconst nextParams = await options?.onPayload?.(params, model);\n\t\tif (nextParams !== undefined) {\n\t\t\tif (!isImageParams(nextParams)) throw new Error(\"onPayload returned an invalid image generation payload\");\n\t\t\tparams = nextParams;\n\t\t}\n\n\t\tconst headers: ProviderHeaders = { ...model.headers, ...options?.headers };\n\t\tconst auth = resolveOpenAIClientAuth(model.provider, options?.apiKey, headers);\n\t\tconst client = new OpenAI({\n\t\t\tapiKey: auth.apiKey,\n\t\t\tbaseURL: normalizeBaseUrl(model.baseUrl),\n\t\t\tdangerouslyAllowBrowser: true,\n\t\t\tfetch: options?.fetch,\n\t\t\tdefaultHeaders: auth.headers,\n\t\t});\n\t\tconst requestOptions = {\n\t\t\t...(options?.signal ? { signal: options.signal } : {}),\n\t\t\t...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),\n\t\t\tmaxRetries: 0,\n\t\t};\n\t\tconst { data: response, response: rawResponse } = await retryProviderRequest(\n\t\t\t() => {\n\t\t\t\t// openai SDK pinned at 6.26.0 predates gpt-image-2.5 quality tiers\n\t\t\t\tconst sdkParams = params as ImageGenerateParamsNonStreaming & ImageEditParamsNonStreaming;\n\t\t\t\treturn (\n\t\t\t\t\tmethod === \"edit\"\n\t\t\t\t\t\t? client.images.edit(sdkParams, requestOptions)\n\t\t\t\t\t\t: client.images.generate(sdkParams, requestOptions)\n\t\t\t\t).withResponse();\n\t\t\t},\n\t\t\t{\n\t\t\t\tmaxRetries: options?.maxRetries,\n\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\t\t\tsignal: options?.signal,\n\t\t\t},\n\t\t);\n\t\tawait options?.onResponse?.({ status: rawResponse.status, headers: headersToRecord(rawResponse.headers) }, model);\n\n\t\tif (response.usage) output.usage = parseUsage(response.usage, model);\n\t\tif (!response.data || response.data.length === 0)\n\t\t\tthrow new Error(\"OpenAI images response contained no image data\");\n\n\t\tfor (const datum of response.data) {\n\t\t\tconst image = await resolveImage(datum, options);\n\t\t\tif (datum.revised_prompt?.trim()) {\n\t\t\t\toutput.output.push({ type: \"text\", text: datum.revised_prompt } satisfies TextContent);\n\t\t\t}\n\t\t\toutput.output.push(image);\n\t\t}\n\t\treturn output;\n\t} catch (error) {\n\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\toutput.errorMessage = formatProviderError(normalizeProviderError(error));\n\t\treturn output;\n\t}\n};\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(baseUrl);\n\t} catch {\n\t\tthrow new Error(`Invalid OpenAI images base URL: ${baseUrl}`);\n\t}\n\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\tthrow new Error(\"OpenAI images base URL must use HTTP or HTTPS\");\n\t}\n\tif (url.search || url.hash) throw new Error(\"OpenAI images base URL must not include a query or fragment\");\n\tconst pathname = url.pathname.replace(/\\/+$/, \"\");\n\tconst normalizedPathname = pathname.toLowerCase();\n\tif (normalizedPathname.includes(\"/images\")) {\n\t\tthrow new Error(\"OpenAI images base URL must not include an images endpoint\");\n\t}\n\tif (ENDPOINT_SUFFIXES.some((suffix) => normalizedPathname.endsWith(suffix))) {\n\t\tthrow new Error(\"OpenAI images base URL must not include a known API endpoint\");\n\t}\n\turl.pathname = pathname.endsWith(\"/v1\") ? pathname : `${pathname}/v1`;\n\treturn url.toString();\n}\n\nasync function resolveImage(datum: Image, options?: OpenAIImagesOptions): Promise<ImageContent> {\n\tconst b64 = datum.b64_json?.trim();\n\tif (b64) return { type: \"image\", mimeType: \"image/png\", data: b64 };\n\tconst url = datum.url?.trim();\n\tif (!url) throw new Error(\"OpenAI images response datum contained no image data\");\n\tif (url.startsWith(\"data:\")) return parseDataUrl(url);\n\treturn hydrateImageUrl(url, options);\n}\n\nfunction parseDataUrl(url: string): ImageContent {\n\tconst match = /^data:([^;,]+);base64,(.+)$/i.exec(url);\n\tif (!match?.[1] || !match[2]) throw new Error(\"OpenAI images response contained an invalid data URL\");\n\tconst mimeType = supportedMime(match[1]);\n\tif (!mimeType) throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);\n\treturn { type: \"image\", mimeType, data: match[2] };\n}\n\nasync function hydrateImageUrl(url: string, options?: OpenAIImagesOptions): Promise<ImageContent> {\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(url);\n\t} catch {\n\t\tthrow new Error(\"OpenAI images response URL must be absolute\");\n\t}\n\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\tthrow new Error(\"OpenAI images response URL must use HTTP or HTTPS\");\n\t}\n\tconst response = await (options?.fetch ?? globalThis.fetch)(url, options?.signal ? { signal: options.signal } : {});\n\tif (!response.ok) throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);\n\tconst declaredLength = response.headers.get(\"content-length\");\n\tif (declaredLength && Number(declaredLength) > MAX_IMAGE_BYTES) throw oversizedImageError();\n\tconst bytes = new Uint8Array(await response.arrayBuffer());\n\tif (bytes.byteLength === 0) throw new Error(\"OpenAI image hydration returned an empty body\");\n\tif (bytes.byteLength > MAX_IMAGE_BYTES) throw oversizedImageError();\n\tconst declaredMime = supportedMime(response.headers.get(\"content-type\")?.split(\";\", 1)[0]);\n\tconst detectedMime = detectMime(bytes);\n\tif (declaredMime && detectedMime && declaredMime !== detectedMime) {\n\t\tthrow new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);\n\t}\n\tconst mimeType = detectedMime ?? declaredMime;\n\tif (!mimeType) throw new Error(\"OpenAI image hydration returned unsupported image content\");\n\treturn { type: \"image\", mimeType, data: bytesToBase64(bytes) };\n}\n\nfunction supportedMime(value: string | undefined): SupportedImageMime | undefined {\n\tconst normalized = value?.trim().toLowerCase();\n\tif (normalized === \"image/png\" || normalized === \"image/jpeg\" || normalized === \"image/webp\") return normalized;\n\treturn undefined;\n}\n\nfunction detectMime(bytes: Uint8Array): SupportedImageMime | undefined {\n\tif (hasMagic(bytes, PNG_MAGIC)) return \"image/png\";\n\tif (hasMagic(bytes, JPEG_MAGIC)) return \"image/jpeg\";\n\tif (hasMagic(bytes, WEBP_MAGIC.slice(0, 4)) && hasMagic(bytes, WEBP_MAGIC.slice(4), 8)) return \"image/webp\";\n\treturn undefined;\n}\n\nfunction hasMagic(bytes: Uint8Array, magic: readonly number[], offset = 0): boolean {\n\treturn magic.every((value, index) => bytes[offset + index] === value);\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (let offset = 0; offset < bytes.length; offset += 0x8000) {\n\t\tbinary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));\n\t}\n\treturn btoa(binary);\n}\n\nfunction oversizedImageError(): Error {\n\treturn new Error(\"OpenAI image hydration exceeded the 24 MiB limit\");\n}\n\nfunction parseUsage(\n\trawUsage: { input_tokens?: number; output_tokens?: number; total_tokens?: number },\n\tmodel: ImagesModel<\"openai-images\">,\n) {\n\tconst input = rawUsage.input_tokens ?? 0;\n\tconst output = rawUsage.output_tokens ?? 0;\n\tconst usage = {\n\t\tinput,\n\t\toutput,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: rawUsage.total_tokens ?? input + output,\n\t\tcost: {\n\t\t\tinput: (model.cost.input / 1_000_000) * input,\n\t\t\toutput: (model.cost.output / 1_000_000) * output,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotal: 0,\n\t\t},\n\t};\n\tusage.cost.total = usage.cost.input + usage.cost.output;\n\treturn usage;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"openai-images.js","sourceRoot":"","sources":["../../src/api/openai-images.ts"],"names":[],"mappings":"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","sourcesContent":["import OpenAI from \"openai\";\nimport type { ImageEditParamsNonStreaming, ImageGenerateParamsNonStreaming } from \"openai/resources/images.js\";\nimport type {\n\tAssistantImages,\n\tImageContent,\n\tImagesContext,\n\tImagesFunction,\n\tImagesModel,\n\tProviderHeaders,\n\tTextContent,\n} from \"../types.ts\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.ts\";\nimport { headersToRecord } from \"../utils/headers.ts\";\nimport { retryProviderRequest } from \"../utils/provider-retry.ts\";\nimport { resolveOpenAIClientAuth } from \"./openai-client-auth.ts\";\nimport { buildEditParams } from \"./openai-images-edit.ts\";\nimport { buildParams, isImageParams, type OpenAIImagesOptions } from \"./openai-images-params.ts\";\nimport { requestedOutputFormat, resolveImage } from \"./openai-images-result.ts\";\n\nexport {\n\ttype OpenAIImageBackground,\n\ttype OpenAIImageModeration,\n\ttype OpenAIImageOutputFormat,\n\ttype OpenAIImageQuality,\n\ttype OpenAIImageSize,\n\ttype OpenAIImagesOptions,\n\tparseOpenAIImageOutputOptions,\n\tparseOpenAIImageSize,\n} from \"./openai-images-params.ts\";\n\nconst ENDPOINT_SUFFIXES = [\"/chat/completions\", \"/responses\", \"/models\"] as const;\n\nexport const generateImages: ImagesFunction<\"openai-images\", OpenAIImagesOptions> = async (\n\tmodel: ImagesModel<\"openai-images\">,\n\tcontext: ImagesContext,\n\toptions?: OpenAIImagesOptions,\n) => {\n\tconst output: AssistantImages = {\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\toutput: [],\n\t\tstopReason: \"stop\",\n\t\ttimestamp: Date.now(),\n\t};\n\n\ttry {\n\t\tlet params = buildParams(model, context, options);\n\t\tconst images = context.input.filter((item): item is ImageContent => item.type === \"image\");\n\t\tconst method = images.length > 0 ? \"edit\" : \"generate\";\n\t\tif (method === \"edit\") params = await buildEditParams(params, images, options?.mask);\n\t\tconst nextParams = await options?.onPayload?.(params, model);\n\t\tif (nextParams !== undefined) {\n\t\t\tif (!isImageParams(nextParams)) throw new Error(\"onPayload returned an invalid image generation payload\");\n\t\t\tparams = nextParams;\n\t\t}\n\n\t\tconst headers: ProviderHeaders = { ...model.headers, ...options?.headers };\n\t\tconst auth = resolveOpenAIClientAuth(model.provider, options?.apiKey, headers);\n\t\tconst client = new OpenAI({\n\t\t\tapiKey: auth.apiKey,\n\t\t\tbaseURL: normalizeBaseUrl(model.baseUrl),\n\t\t\tdangerouslyAllowBrowser: true,\n\t\t\tfetch: options?.fetch,\n\t\t\tdefaultHeaders: auth.headers,\n\t\t});\n\t\tconst requestOptions = {\n\t\t\t...(options?.signal ? { signal: options.signal } : {}),\n\t\t\t...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),\n\t\t\tmaxRetries: 0,\n\t\t};\n\t\tconst { data: response, response: rawResponse } = await retryProviderRequest(\n\t\t\t() => {\n\t\t\t\t// openai SDK pinned at 6.26.0 predates gpt-image-2.5 quality tiers\n\t\t\t\tconst sdkParams = params as ImageGenerateParamsNonStreaming & ImageEditParamsNonStreaming;\n\t\t\t\treturn (\n\t\t\t\t\tmethod === \"edit\"\n\t\t\t\t\t\t? client.images.edit(sdkParams, requestOptions)\n\t\t\t\t\t\t: client.images.generate(sdkParams, requestOptions)\n\t\t\t\t).withResponse();\n\t\t\t},\n\t\t\t{\n\t\t\t\tmaxRetries: options?.maxRetries,\n\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\t\t\tsignal: options?.signal,\n\t\t\t},\n\t\t);\n\t\tawait options?.onResponse?.({ status: rawResponse.status, headers: headersToRecord(rawResponse.headers) }, model);\n\n\t\tif (response.usage) output.usage = parseUsage(response.usage, model);\n\t\tif (response.background === \"transparent\" || response.background === \"opaque\") {\n\t\t\toutput.background = response.background;\n\t\t}\n\t\tif (!response.data || response.data.length === 0)\n\t\t\tthrow new Error(\"OpenAI images response contained no image data\");\n\n\t\tconst outputFormat = requestedOutputFormat(params.output_format);\n\t\tfor (const datum of response.data) {\n\t\t\tconst image = await resolveImage(datum, outputFormat, options);\n\t\t\tif (datum.revised_prompt?.trim()) {\n\t\t\t\toutput.output.push({ type: \"text\", text: datum.revised_prompt } satisfies TextContent);\n\t\t\t}\n\t\t\toutput.output.push(image);\n\t\t}\n\t\treturn output;\n\t} catch (error) {\n\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\toutput.errorMessage = formatProviderError(normalizeProviderError(error));\n\t\treturn output;\n\t}\n};\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(baseUrl);\n\t} catch {\n\t\tthrow new Error(`Invalid OpenAI images base URL: ${baseUrl}`);\n\t}\n\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\tthrow new Error(\"OpenAI images base URL must use HTTP or HTTPS\");\n\t}\n\tif (url.search || url.hash) throw new Error(\"OpenAI images base URL must not include a query or fragment\");\n\tconst pathname = url.pathname.replace(/\\/+$/, \"\");\n\tconst normalizedPathname = pathname.toLowerCase();\n\tif (normalizedPathname.includes(\"/images\")) {\n\t\tthrow new Error(\"OpenAI images base URL must not include an images endpoint\");\n\t}\n\tif (ENDPOINT_SUFFIXES.some((suffix) => normalizedPathname.endsWith(suffix))) {\n\t\tthrow new Error(\"OpenAI images base URL must not include a known API endpoint\");\n\t}\n\turl.pathname = pathname.endsWith(\"/v1\") ? pathname : `${pathname}/v1`;\n\treturn url.toString();\n}\n\ninterface RawImageUsage {\n\tinput_tokens?: number;\n\tinput_tokens_details?: { image_tokens?: number; text_tokens?: number };\n\toutput_tokens?: number;\n\ttotal_tokens?: number;\n}\n\n/** Image input tokens carry their own rate; without a breakdown every input token is text. */\nfunction parseUsage(rawUsage: RawImageUsage, model: ImagesModel<\"openai-images\">) {\n\tconst input = rawUsage.input_tokens ?? 0;\n\tconst output = rawUsage.output_tokens ?? 0;\n\tconst imageTokens = rawUsage.input_tokens_details?.image_tokens ?? 0;\n\tconst textTokens = rawUsage.input_tokens_details?.text_tokens ?? Math.max(0, input - imageTokens);\n\tconst imageRate = model.cost.imageInput ?? model.cost.input;\n\tconst usage = {\n\t\tinput,\n\t\toutput,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: rawUsage.total_tokens ?? input + output,\n\t\tcost: {\n\t\t\tinput: (model.cost.input * textTokens + imageRate * imageTokens) / 1_000_000,\n\t\t\toutput: (model.cost.output / 1_000_000) * output,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotal: 0,\n\t\t},\n\t};\n\tusage.cost.total = usage.cost.input + usage.cost.output;\n\treturn usage;\n}\n"]}
|