@code-yeongyu/senpi 2026.7.10-2 → 2026.7.11
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 +41 -0
- package/README.md +3 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +2 -2
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +10 -1
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js +88 -3
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +83 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +6 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.d.ts +3 -3
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.js +7 -4
- package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +5 -3
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +32 -16
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +10 -4
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todowrite.js +5 -8
- package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +5 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +3 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +22 -3
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/keybindings.d.ts +8 -3
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +7 -3
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +4 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +9 -2
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution-fallback.d.ts +6 -0
- package/dist/modes/interactive/components/tool-execution-fallback.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-fallback.js +40 -0
- package/dist/modes/interactive/components/tool-execution-fallback.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-images.d.ts +23 -0
- package/dist/modes/interactive/components/tool-execution-images.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-images.js +104 -0
- package/dist/modes/interactive/components/tool-execution-images.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts +28 -0
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-renderer.js +135 -0
- package/dist/modes/interactive/components/tool-execution-renderer.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-types.d.ts +23 -0
- package/dist/modes/interactive/components/tool-execution-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-types.js +2 -0
- package/dist/modes/interactive/components/tool-execution-types.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +13 -39
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +51 -294
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-renderer-boundary.d.ts +17 -0
- package/dist/modes/interactive/components/tool-renderer-boundary.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-renderer-boundary.js +75 -0
- package/dist/modes/interactive/components/tool-renderer-boundary.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +5 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +50 -17
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +44 -40
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +1 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +13 -0
- package/dist/utils/clipboard.js.map +1 -1
- package/docs/extensions.md +139 -0
- package/docs/keybindings.md +1 -0
- package/docs/providers.md +3 -0
- package/docs/quickstart.md +1 -1
- package/docs/settings.md +1 -1
- package/docs/usage.md +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +3 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +7 -7
- package/node_modules/@code-yeongyu/senpi-codemode/src/completion/tool-bridge.ts +3 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +69 -8
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +39 -13
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +191 -148
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker-entry.js +23 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +4 -175
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/run-queue.ts +82 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +7 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-host.ts +117 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +32 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +231 -199
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/process.ts +119 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +237 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +22 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +214 -189
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-process.ts +174 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +100 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-run.ts +98 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +205 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +208 -203
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +215 -25
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +2 -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 +2 -2
- 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 +82 -32
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +4 -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/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +5 -2
- 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-responses-shared.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +29 -0
- 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.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +8 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +270 -21
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +17 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +17 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js +9 -6
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +92 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +59 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +18 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +38 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +66 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +55 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +5 -21
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +48 -65
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +34 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +37 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +15 -1
- 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.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js +18 -5
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +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 +2 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +2 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js +2 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.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 +6 -5
- package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +0 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +0 -9
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.d.ts +4 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.js +18 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/package.json +2 -2
- package/package.json +6 -6
|
@@ -26,7 +26,7 @@ import { BUILTIN_SLASH_COMMANDS } from "../../core/slash-commands.js";
|
|
|
26
26
|
import { isInstallTelemetryEnabled } from "../../core/telemetry.js";
|
|
27
27
|
import { hasTrustRequiringProjectResources, ProjectTrustStore } from "../../core/trust-manager.js";
|
|
28
28
|
import { getChangelogPath, getNewEntries, normalizeChangelogLinks, parseChangelog } from "../../utils/changelog.js";
|
|
29
|
-
import { copyToClipboard } from "../../utils/clipboard.js";
|
|
29
|
+
import { copyToClipboard, readClipboardText } from "../../utils/clipboard.js";
|
|
30
30
|
import { extensionForImageMimeType, readClipboardImage } from "../../utils/clipboard-image.js";
|
|
31
31
|
import { parseGitUrl } from "../../utils/git.js";
|
|
32
32
|
import { getCwdRelativePath } from "../../utils/paths.js";
|
|
@@ -173,7 +173,6 @@ export function formatResumeCommand(sessionManager) {
|
|
|
173
173
|
function hasDefaultModelProvider(providerId) {
|
|
174
174
|
return providerId in defaultModelPerProvider;
|
|
175
175
|
}
|
|
176
|
-
const BEDROCK_PROVIDER_ID = "amazon-bedrock";
|
|
177
176
|
// isApiKeyLoginProvider now lives in core/auth-providers.ts so the RPC login path
|
|
178
177
|
// (neo) and the classic selectors share ONE source of truth. Re-exported here to
|
|
179
178
|
// keep the existing public import (test/oauth-selector.test.ts) working, and used
|
|
@@ -567,7 +566,7 @@ export class InteractiveMode {
|
|
|
567
566
|
rawKeyHint("!!", "to run bash (no context)"),
|
|
568
567
|
hint("app.message.followUp", "to queue follow-up"),
|
|
569
568
|
hint("app.message.dequeue", "to edit all queued messages"),
|
|
570
|
-
hint("app.clipboard.pasteImage", "to paste image"),
|
|
569
|
+
hint("app.clipboard.pasteImage", "to paste image (with text fallback)"),
|
|
571
570
|
rawKeyHint("drop files", "to attach"),
|
|
572
571
|
].join("\n");
|
|
573
572
|
const compactInstructions = [
|
|
@@ -693,7 +692,7 @@ export class InteractiveMode {
|
|
|
693
692
|
while (true) {
|
|
694
693
|
const userInput = await this.getUserInput();
|
|
695
694
|
try {
|
|
696
|
-
await this.session.prompt(userInput);
|
|
695
|
+
await this.session.prompt(userInput, { streamingBehavior: "steer" });
|
|
697
696
|
}
|
|
698
697
|
catch (error) {
|
|
699
698
|
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
@@ -2271,6 +2270,7 @@ export class InteractiveMode {
|
|
|
2271
2270
|
this.defaultEditor.onAction("app.tools.expand", () => this.toggleToolOutputExpansion());
|
|
2272
2271
|
this.defaultEditor.onAction("app.thinking.toggle", () => this.toggleThinkingBlockVisibility());
|
|
2273
2272
|
this.defaultEditor.onAction("app.editor.external", () => this.openExternalEditor());
|
|
2273
|
+
this.defaultEditor.onAction("app.message.copy", () => void this.handleCopyCommand());
|
|
2274
2274
|
this.defaultEditor.onAction("app.message.followUp", () => this.handleFollowUp());
|
|
2275
2275
|
this.defaultEditor.onAction("app.message.dequeue", () => this.handleDequeue());
|
|
2276
2276
|
this.defaultEditor.onAction("app.session.new", () => this.handleClearCommand());
|
|
@@ -2284,26 +2284,30 @@ export class InteractiveMode {
|
|
|
2284
2284
|
this.updateEditorBorderColor();
|
|
2285
2285
|
}
|
|
2286
2286
|
};
|
|
2287
|
-
// Handle clipboard
|
|
2287
|
+
// Handle clipboard paste (triggered on Ctrl+V). Images are attached by path;
|
|
2288
|
+
// otherwise, paste plain text from the system clipboard.
|
|
2288
2289
|
this.defaultEditor.onPasteImage = () => {
|
|
2289
|
-
this.
|
|
2290
|
+
void this.handleClipboardPaste();
|
|
2290
2291
|
};
|
|
2291
2292
|
}
|
|
2292
|
-
async
|
|
2293
|
+
async handleClipboardPaste() {
|
|
2293
2294
|
try {
|
|
2294
2295
|
const image = await readClipboardImage();
|
|
2295
|
-
if (
|
|
2296
|
+
if (image) {
|
|
2297
|
+
const tmpDir = os.tmpdir();
|
|
2298
|
+
const ext = extensionForImageMimeType(image.mimeType) ?? "png";
|
|
2299
|
+
const fileName = `pi-clipboard-${crypto.randomUUID()}.${ext}`;
|
|
2300
|
+
const filePath = path.join(tmpDir, fileName);
|
|
2301
|
+
fs.writeFileSync(filePath, Buffer.from(image.bytes));
|
|
2302
|
+
this.editor.insertTextAtCursor?.(filePath);
|
|
2303
|
+
this.ui.requestRender();
|
|
2296
2304
|
return;
|
|
2297
2305
|
}
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
fs.writeFileSync(filePath, Buffer.from(image.bytes));
|
|
2304
|
-
// Insert file path directly
|
|
2305
|
-
this.editor.insertTextAtCursor?.(filePath);
|
|
2306
|
-
this.ui.requestRender();
|
|
2306
|
+
const text = await readClipboardText();
|
|
2307
|
+
if (text) {
|
|
2308
|
+
this.editor.insertTextAtCursor?.(text);
|
|
2309
|
+
this.ui.requestRender();
|
|
2310
|
+
}
|
|
2307
2311
|
}
|
|
2308
2312
|
catch {
|
|
2309
2313
|
// Silently ignore clipboard errors (may not have permission, etc.)
|
|
@@ -4204,6 +4208,19 @@ export class InteractiveMode {
|
|
|
4204
4208
|
this.sessionManager.appendLabelChange(entryId, label);
|
|
4205
4209
|
this.ui.requestRender();
|
|
4206
4210
|
}, initialSelectedId, initialFilterMode);
|
|
4211
|
+
selector.onCopy = async (text) => {
|
|
4212
|
+
if (!text) {
|
|
4213
|
+
this.showError("Selected entry has no text to copy");
|
|
4214
|
+
return;
|
|
4215
|
+
}
|
|
4216
|
+
try {
|
|
4217
|
+
await copyToClipboard(text);
|
|
4218
|
+
this.showStatus("Copied selected message to clipboard");
|
|
4219
|
+
}
|
|
4220
|
+
catch (error) {
|
|
4221
|
+
this.showError(error instanceof Error ? error.message : String(error));
|
|
4222
|
+
}
|
|
4223
|
+
};
|
|
4207
4224
|
return { component: selector, focus: selector };
|
|
4208
4225
|
});
|
|
4209
4226
|
}
|
|
@@ -4337,9 +4354,6 @@ export class InteractiveMode {
|
|
|
4337
4354
|
if (providerOption.authType === "oauth") {
|
|
4338
4355
|
await this.showLoginDialog(providerOption.id, providerOption.name);
|
|
4339
4356
|
}
|
|
4340
|
-
else if (providerOption.id === BEDROCK_PROVIDER_ID) {
|
|
4341
|
-
this.showBedrockSetupDialog(providerOption.id, providerOption.name);
|
|
4342
|
-
}
|
|
4343
4357
|
else {
|
|
4344
4358
|
await this.showApiKeyLoginDialog(providerOption.id, providerOption.name);
|
|
4345
4359
|
}
|
|
@@ -4509,30 +4523,18 @@ export class InteractiveMode {
|
|
|
4509
4523
|
}
|
|
4510
4524
|
}
|
|
4511
4525
|
}
|
|
4512
|
-
showBedrockSetupDialog(providerId, providerName) {
|
|
4513
|
-
const restoreEditor = () => {
|
|
4514
|
-
this.editorContainer.clear();
|
|
4515
|
-
this.editorContainer.addChild(this.editor);
|
|
4516
|
-
this.ui.setFocus(this.editor);
|
|
4517
|
-
this.ui.requestRender();
|
|
4518
|
-
};
|
|
4519
|
-
const dialog = new LoginDialogComponent(this.ui, providerId, () => restoreEditor(), providerName, "Amazon Bedrock setup");
|
|
4520
|
-
dialog.showInfo([
|
|
4521
|
-
theme.fg("text", "Amazon Bedrock uses AWS credentials instead of a single API key."),
|
|
4522
|
-
theme.fg("text", "Configure an AWS profile, IAM keys, bearer token, or role-based credentials."),
|
|
4523
|
-
theme.fg("muted", "See:"),
|
|
4524
|
-
theme.fg("accent", ` ${path.join(getDocsPath(), "providers.md")}`),
|
|
4525
|
-
]);
|
|
4526
|
-
this.editorContainer.clear();
|
|
4527
|
-
this.editorContainer.addChild(dialog);
|
|
4528
|
-
this.ui.setFocus(dialog);
|
|
4529
|
-
this.ui.requestRender();
|
|
4530
|
-
}
|
|
4531
4526
|
async showApiKeyLoginDialog(providerId, providerName) {
|
|
4532
4527
|
const previousModel = this.session.model;
|
|
4533
4528
|
const dialog = new LoginDialogComponent(this.ui, providerId, (_success, _message) => {
|
|
4534
4529
|
// Completion handled below
|
|
4535
4530
|
}, providerName);
|
|
4531
|
+
if (providerId === "amazon-bedrock") {
|
|
4532
|
+
dialog.showDetails([
|
|
4533
|
+
theme.fg("text", "You can also use an AWS profile, IAM keys, or role-based credentials."),
|
|
4534
|
+
theme.fg("muted", "See:"),
|
|
4535
|
+
theme.fg("accent", ` ${path.join(getDocsPath(), "providers.md")}`),
|
|
4536
|
+
]);
|
|
4537
|
+
}
|
|
4536
4538
|
this.editorContainer.clear();
|
|
4537
4539
|
this.editorContainer.addChild(dialog);
|
|
4538
4540
|
this.ui.setFocus(dialog);
|
|
@@ -5099,6 +5101,7 @@ export class InteractiveMode {
|
|
|
5099
5101
|
const toggleThinking = this.getAppKeyDisplay("app.thinking.toggle");
|
|
5100
5102
|
const externalEditor = this.getAppKeyDisplay("app.editor.external");
|
|
5101
5103
|
const cycleModelBackward = this.getAppKeyDisplay("app.model.cycleBackward");
|
|
5104
|
+
const copyMessage = this.getAppKeyDisplay("app.message.copy");
|
|
5102
5105
|
const followUp = this.getAppKeyDisplay("app.message.followUp");
|
|
5103
5106
|
const dequeue = this.getAppKeyDisplay("app.message.dequeue");
|
|
5104
5107
|
const pasteImage = this.getAppKeyDisplay("app.clipboard.pasteImage");
|
|
@@ -5142,9 +5145,10 @@ export class InteractiveMode {
|
|
|
5142
5145
|
| \`${expandTools}\` | Toggle tool output expansion |
|
|
5143
5146
|
| \`${toggleThinking}\` | Toggle thinking block visibility |
|
|
5144
5147
|
| \`${externalEditor}\` | Edit message in external editor |
|
|
5148
|
+
| \`${copyMessage}\` | Copy last assistant message |
|
|
5145
5149
|
| \`${followUp}\` | Queue follow-up message |
|
|
5146
5150
|
| \`${dequeue}\` | Restore queued messages |
|
|
5147
|
-
| \`${pasteImage}\` | Paste image from clipboard |
|
|
5151
|
+
| \`${pasteImage}\` | Paste image or text from clipboard |
|
|
5148
5152
|
| \`/\` | Slash commands |
|
|
5149
5153
|
| \`!\` | Run bash command |
|
|
5150
5154
|
| \`!!\` | Run bash command (excluded from context) |
|