@code-yeongyu/senpi 2026.6.6-3 → 2026.6.10
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 +25 -0
- package/README.md +113 -111
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/project-trust.d.ts +10 -0
- package/dist/cli/project-trust.d.ts.map +1 -0
- package/dist/cli/project-trust.js +48 -0
- package/dist/cli/project-trust.js.map +1 -0
- package/dist/cli/startup-ui.d.ts +7 -0
- package/dist/cli/startup-ui.d.ts.map +1 -0
- package/dist/cli/startup-ui.js +59 -0
- package/dist/cli/startup-ui.js.map +1 -0
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +3 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +4 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +2 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -2
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +6 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +1 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/experimental.d.ts +2 -0
- package/dist/core/experimental.d.ts.map +1 -0
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.js +0 -2
- package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/prompt.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/prompt.js +0 -2
- package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +4 -4
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +7 -2
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +34 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +21 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/model-registry.d.ts +3 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +22 -3
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/project-trust.d.ts +15 -0
- package/dist/core/project-trust.d.ts.map +1 -0
- package/dist/core/project-trust.js +58 -0
- package/dist/core/project-trust.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +2 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +24 -26
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/resource-loader.d.ts +14 -3
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +128 -58
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +34 -17
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-resident-store.d.ts +16 -0
- package/dist/core/session-resident-store.d.ts.map +1 -0
- package/dist/core/session-resident-store.js +48 -0
- package/dist/core/session-resident-store.js.map +1 -0
- package/dist/core/settings-manager.d.ts +4 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +9 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/trust-manager.d.ts +22 -0
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +75 -22
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +92 -129
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +39 -34
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +7 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +20 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +26 -4
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts +6 -3
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +22 -18
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +15 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +158 -19
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/working-status.d.ts +2 -0
- package/dist/modes/interactive/working-status.d.ts.map +1 -1
- package/dist/modes/interactive/working-status.js +34 -0
- package/dist/modes/interactive/working-status.js.map +1 -1
- package/dist/package-manager-cli.d.ts +6 -2
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +58 -11
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/senpi +10 -1
- package/dist/utils/changelog.d.ts +1 -0
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js +78 -0
- package/dist/utils/changelog.js.map +1 -1
- package/docs/docs.json +4 -0
- package/docs/extensions.md +30 -1
- package/docs/index.md +1 -0
- package/docs/models.md +6 -39
- package/docs/packages.md +0 -2
- package/docs/prompt-templates.md +8 -1
- package/docs/sdk.md +5 -0
- package/docs/security.md +55 -0
- package/docs/settings.md +7 -4
- package/docs/terminal-setup.md +36 -2
- package/docs/tmux.md +4 -2
- package/docs/usage.md +12 -7
- package/examples/extensions/README.md +1 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/project-trust.ts +64 -0
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +125 -77
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +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/types.d.ts +6 -3
- 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/README.md +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +6 -6
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +373 -116
- 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 +353 -202
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.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 +15 -7
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +17 -7
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +4 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -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/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +2 -0
- 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/editor.d.ts +6 -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 +89 -39
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts +5 -0
- 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 +18 -4
- package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js +131 -61
- package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +4 -7
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +38 -76
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.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 +14 -4
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.js +43 -15
- package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -8
- package/dist/core/extensions/builtin/todotools/continuation/config.d.ts +0 -10
- package/dist/core/extensions/builtin/todotools/continuation/config.d.ts.map +0 -1
- package/dist/core/extensions/builtin/todotools/continuation/config.js +0 -33
- package/dist/core/extensions/builtin/todotools/continuation/config.js.map +0 -1
- package/dist/core/extensions/builtin/todotools/continuation/index.d.ts +0 -2
- package/dist/core/extensions/builtin/todotools/continuation/index.d.ts.map +0 -1
- package/dist/core/extensions/builtin/todotools/continuation/index.js +0 -2
- package/dist/core/extensions/builtin/todotools/continuation/index.js.map +0 -1
- package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts +0 -5
- package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +0 -1
- package/dist/core/extensions/builtin/todotools/continuation/prompt.js +0 -34
- package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +0 -1
- package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts +0 -11
- package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts.map +0 -1
- package/dist/core/extensions/builtin/todotools/continuation/runtime.js +0 -201
- package/dist/core/extensions/builtin/todotools/continuation/runtime.js.map +0 -1
- package/dist/core/extensions/builtin/todotools/settings.d.ts +0 -6
- package/dist/core/extensions/builtin/todotools/settings.d.ts.map +0 -1
- package/dist/core/extensions/builtin/todotools/settings.js +0 -58
- package/dist/core/extensions/builtin/todotools/settings.js.map +0 -1
- package/dist/core/extensions/builtin/todotools/system-messages.d.ts +0 -34
- package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +0 -1
- package/dist/core/extensions/builtin/todotools/system-messages.js +0 -82
- package/dist/core/extensions/builtin/todotools/system-messages.js.map +0 -1
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
import { Container, getKeybindings, Spacer, Text } from "@earendil-works/pi-tui";
|
|
2
|
+
import { getProjectTrustOptions, getProjectTrustPath, } from "../../../core/trust-manager.js";
|
|
2
3
|
import { theme } from "../theme/theme.js";
|
|
3
4
|
import { DynamicBorder } from "./dynamic-border.js";
|
|
4
5
|
import { keyHint, rawKeyHint } from "./keybinding-hints.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
];
|
|
9
|
-
function formatDecision(decision) {
|
|
10
|
-
if (decision === true) {
|
|
11
|
-
return "trusted";
|
|
6
|
+
function formatDecision(cwd, decision) {
|
|
7
|
+
if (decision === null) {
|
|
8
|
+
return "none";
|
|
12
9
|
}
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
const label = decision.decision ? "trusted" : "untrusted";
|
|
11
|
+
if (decision.path !== getProjectTrustPath(cwd)) {
|
|
12
|
+
return `${label} (inherited from ${decision.path})`;
|
|
15
13
|
}
|
|
16
|
-
return
|
|
14
|
+
return `${label} (${decision.path})`;
|
|
17
15
|
}
|
|
18
16
|
export class TrustSelectorComponent extends Container {
|
|
19
17
|
constructor(options) {
|
|
20
18
|
super();
|
|
21
19
|
this.savedDecision = options.savedDecision;
|
|
22
|
-
this.
|
|
20
|
+
this.trustOptions = getProjectTrustOptions(options.cwd);
|
|
21
|
+
this.selectedIndex = Math.max(0, this.trustOptions.findIndex((option) => this.isSavedOption(option)));
|
|
23
22
|
this.onSelectCallback = options.onSelect;
|
|
24
23
|
this.onCancelCallback = options.onCancel;
|
|
25
24
|
this.addChild(new DynamicBorder());
|
|
@@ -27,7 +26,7 @@ export class TrustSelectorComponent extends Container {
|
|
|
27
26
|
this.addChild(new Text(theme.fg("accent", theme.bold("Project trust")), 1, 0));
|
|
28
27
|
this.addChild(new Text(theme.fg("muted", options.cwd), 1, 0));
|
|
29
28
|
this.addChild(new Spacer(1));
|
|
30
|
-
this.addChild(new Text(theme.fg("muted", `Saved decision: ${formatDecision(options.savedDecision)}`), 1, 0));
|
|
29
|
+
this.addChild(new Text(theme.fg("muted", `Saved decision: ${formatDecision(options.cwd, options.savedDecision)}`), 1, 0));
|
|
31
30
|
this.addChild(new Text(theme.fg("muted", `Current session: ${options.projectTrusted ? "trusted" : "untrusted"}`), 1, 0));
|
|
32
31
|
this.addChild(new Spacer(1));
|
|
33
32
|
this.listContainer = new Container();
|
|
@@ -42,15 +41,20 @@ export class TrustSelectorComponent extends Container {
|
|
|
42
41
|
this.addChild(new DynamicBorder());
|
|
43
42
|
this.updateList();
|
|
44
43
|
}
|
|
44
|
+
isSavedOption(option) {
|
|
45
|
+
return (option.savedPath !== undefined &&
|
|
46
|
+
this.savedDecision?.decision === option.trusted &&
|
|
47
|
+
this.savedDecision.path === option.savedPath);
|
|
48
|
+
}
|
|
45
49
|
updateList() {
|
|
46
50
|
this.listContainer.clear();
|
|
47
|
-
for (let i = 0; i <
|
|
48
|
-
const option =
|
|
51
|
+
for (let i = 0; i < this.trustOptions.length; i++) {
|
|
52
|
+
const option = this.trustOptions[i];
|
|
49
53
|
if (!option) {
|
|
50
54
|
continue;
|
|
51
55
|
}
|
|
52
56
|
const isSelected = i === this.selectedIndex;
|
|
53
|
-
const isCurrent =
|
|
57
|
+
const isCurrent = this.isSavedOption(option);
|
|
54
58
|
const checkmark = isCurrent ? theme.fg("success", " ✓") : "";
|
|
55
59
|
const prefix = isSelected ? theme.fg("accent", "→ ") : " ";
|
|
56
60
|
const label = isSelected ? theme.fg("accent", option.label) : theme.fg("text", option.label);
|
|
@@ -64,13 +68,13 @@ export class TrustSelectorComponent extends Container {
|
|
|
64
68
|
this.updateList();
|
|
65
69
|
}
|
|
66
70
|
else if (kb.matches(keyData, "tui.select.down") || keyData === "j") {
|
|
67
|
-
this.selectedIndex = Math.min(
|
|
71
|
+
this.selectedIndex = Math.min(this.trustOptions.length - 1, this.selectedIndex + 1);
|
|
68
72
|
this.updateList();
|
|
69
73
|
}
|
|
70
74
|
else if (kb.matches(keyData, "tui.select.confirm") || keyData === "\n") {
|
|
71
|
-
const selected =
|
|
75
|
+
const selected = this.trustOptions[this.selectedIndex];
|
|
72
76
|
if (selected) {
|
|
73
|
-
this.onSelectCallback(selected.trusted);
|
|
77
|
+
this.onSelectCallback({ trusted: selected.trusted, updates: selected.updates });
|
|
74
78
|
}
|
|
75
79
|
}
|
|
76
80
|
else if (kb.matches(keyData, "tui.select.cancel")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trust-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/trust-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"trust-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/trust-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, getKeybindings, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport {\n\tgetProjectTrustOptions,\n\tgetProjectTrustPath,\n\ttype ProjectTrustOption,\n\ttype ProjectTrustStoreEntry,\n} from \"../../../core/trust-manager.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\n\nexport type TrustSelection = Pick<ProjectTrustOption, \"trusted\" | \"updates\">;\n\nexport interface TrustSelectorOptions {\n\tcwd: string;\n\tsavedDecision: ProjectTrustStoreEntry | null;\n\tprojectTrusted: boolean;\n\tonSelect: (selection: TrustSelection) => void;\n\tonCancel: () => void;\n}\n\nfunction formatDecision(cwd: string, decision: ProjectTrustStoreEntry | null): string {\n\tif (decision === null) {\n\t\treturn \"none\";\n\t}\n\tconst label = decision.decision ? \"trusted\" : \"untrusted\";\n\tif (decision.path !== getProjectTrustPath(cwd)) {\n\t\treturn `${label} (inherited from ${decision.path})`;\n\t}\n\treturn `${label} (${decision.path})`;\n}\n\nexport class TrustSelectorComponent extends Container {\n\tprivate selectedIndex: number;\n\tprivate readonly listContainer: Container;\n\tprivate readonly trustOptions: ProjectTrustOption[];\n\tprivate readonly savedDecision: ProjectTrustStoreEntry | null;\n\tprivate readonly onSelectCallback: (selection: TrustSelection) => void;\n\tprivate readonly onCancelCallback: () => void;\n\n\tconstructor(options: TrustSelectorOptions) {\n\t\tsuper();\n\n\t\tthis.savedDecision = options.savedDecision;\n\t\tthis.trustOptions = getProjectTrustOptions(options.cwd);\n\t\tthis.selectedIndex = Math.max(\n\t\t\t0,\n\t\t\tthis.trustOptions.findIndex((option) => this.isSavedOption(option)),\n\t\t);\n\t\tthis.onSelectCallback = options.onSelect;\n\t\tthis.onCancelCallback = options.onCancel;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Project trust\")), 1, 0));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", options.cwd), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(theme.fg(\"muted\", `Saved decision: ${formatDecision(options.cwd, options.savedDecision)}`), 1, 0),\n\t\t);\n\t\tthis.addChild(\n\t\t\tnew Text(theme.fg(\"muted\", `Current session: ${options.projectTrusted ? \"trusted\" : \"untrusted\"}`), 1, 0),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"save\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.updateList();\n\t}\n\n\tprivate isSavedOption(option: ProjectTrustOption): boolean {\n\t\treturn (\n\t\t\toption.savedPath !== undefined &&\n\t\t\tthis.savedDecision?.decision === option.trusted &&\n\t\t\tthis.savedDecision.path === option.savedPath\n\t\t);\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < this.trustOptions.length; i++) {\n\t\t\tconst option = this.trustOptions[i];\n\t\t\tif (!option) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst isCurrent = this.isSavedOption(option);\n\t\t\tconst checkmark = isCurrent ? theme.fg(\"success\", \" ✓\") : \"\";\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst label = isSelected ? theme.fg(\"accent\", option.label) : theme.fg(\"text\", option.label);\n\t\t\tthis.listContainer.addChild(new Text(`${prefix}${label}${checkmark}`, 1, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(this.trustOptions.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tconst selected = this.trustOptions[this.selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tthis.onSelectCallback({ trusted: selected.trusted, updates: selected.updates });\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n"]}
|
|
@@ -15,6 +15,8 @@ export interface InteractiveModeOptions {
|
|
|
15
15
|
migratedProviders?: string[];
|
|
16
16
|
/** Warning message if session model couldn't be restored */
|
|
17
17
|
modelFallbackMessage?: string;
|
|
18
|
+
/** Cwd to trust after reload if it gained a .pi directory during this implicitly trusted session. */
|
|
19
|
+
autoTrustOnReloadCwd?: string;
|
|
18
20
|
/** Initial message to send on startup (can include @file content) */
|
|
19
21
|
initialMessage?: string;
|
|
20
22
|
/** Images to attach to the initial message */
|
|
@@ -55,8 +57,13 @@ export declare class InteractiveMode {
|
|
|
55
57
|
private readonly defaultWorkingMessage;
|
|
56
58
|
private readonly defaultHiddenThinkingLabel;
|
|
57
59
|
private hiddenThinkingLabel;
|
|
60
|
+
private activeToolExecutions;
|
|
61
|
+
private activeToolExecutionTerminalTitle;
|
|
62
|
+
private workingMessageBeforeActiveTool;
|
|
58
63
|
private activeToolHooks;
|
|
59
64
|
private hookStatusIntervalId;
|
|
65
|
+
private activeToolTerminalTitle;
|
|
66
|
+
private extensionTerminalTitle;
|
|
60
67
|
private lastSigintTime;
|
|
61
68
|
private lastEscapeTime;
|
|
62
69
|
private changelogMarkdown;
|
|
@@ -96,6 +103,7 @@ export declare class InteractiveMode {
|
|
|
96
103
|
private headerContainer;
|
|
97
104
|
private builtInHeader;
|
|
98
105
|
private customHeader;
|
|
106
|
+
private autoTrustOnReloadCwd;
|
|
99
107
|
private get session();
|
|
100
108
|
private get sessionManager();
|
|
101
109
|
private get settingsManager();
|
|
@@ -110,6 +118,8 @@ export declare class InteractiveMode {
|
|
|
110
118
|
/**
|
|
111
119
|
* Update terminal title with session name and cwd.
|
|
112
120
|
*/
|
|
121
|
+
private getNormalTerminalTitle;
|
|
122
|
+
private applyTerminalTitle;
|
|
113
123
|
private updateTerminalTitle;
|
|
114
124
|
/**
|
|
115
125
|
* Run the interactive mode. This is the main entry point.
|
|
@@ -179,6 +189,9 @@ export declare class InteractiveMode {
|
|
|
179
189
|
private stopToolHookStatusTimer;
|
|
180
190
|
private refreshToolHookStatuses;
|
|
181
191
|
private handleToolHookStatusEvent;
|
|
192
|
+
private handleToolExecutionStart;
|
|
193
|
+
private handleToolExecutionEnd;
|
|
194
|
+
private clearActiveToolExecutionStatus;
|
|
182
195
|
private clearToolHookStatuses;
|
|
183
196
|
private getWorkingIndicatorOptions;
|
|
184
197
|
private createWorkingLoader;
|
|
@@ -211,6 +224,7 @@ export declare class InteractiveMode {
|
|
|
211
224
|
/**
|
|
212
225
|
* Create the ExtensionUIContext for extensions.
|
|
213
226
|
*/
|
|
227
|
+
private createProjectTrustContext;
|
|
214
228
|
private createExtensionUIContext;
|
|
215
229
|
/**
|
|
216
230
|
* Show a selector for extensions.
|
|
@@ -370,6 +384,7 @@ export declare class InteractiveMode {
|
|
|
370
384
|
/** Update the footer's available provider count from current model candidates */
|
|
371
385
|
private updateAvailableProviderCount;
|
|
372
386
|
private maybeWarnAboutAnthropicSubscriptionAuth;
|
|
387
|
+
private maybeSaveImplicitProjectTrustAfterReload;
|
|
373
388
|
private showTrustSelector;
|
|
374
389
|
private showModelSelector;
|
|
375
390
|
private showFavoriteModelsSelector;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAGN,KAAK,YAAY,EAMjB,MAAM,uBAAuB,CAAC;AA4C/B,OAAO,EAAE,KAAK,mBAAmB,EAAkC,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"interactive-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,8 +23,8 @@ import { formatMissingSessionCwdPrompt, MissingSessionCwdError } from "../../cor
|
|
|
23
23
|
import { SessionManager } from "../../core/session-manager.js";
|
|
24
24
|
import { BUILTIN_SLASH_COMMANDS } from "../../core/slash-commands.js";
|
|
25
25
|
import { isInstallTelemetryEnabled } from "../../core/telemetry.js";
|
|
26
|
-
import { hasProjectTrustInputs, ProjectTrustStore } from "../../core/trust-manager.js";
|
|
27
|
-
import { getChangelogPath, getNewEntries, parseChangelog } from "../../utils/changelog.js";
|
|
26
|
+
import { hasProjectConfigDir, hasProjectTrustInputs, ProjectTrustStore } from "../../core/trust-manager.js";
|
|
27
|
+
import { getChangelogPath, getNewEntries, normalizeChangelogLinks, parseChangelog } from "../../utils/changelog.js";
|
|
28
28
|
import { copyToClipboard } from "../../utils/clipboard.js";
|
|
29
29
|
import { extensionForImageMimeType, readClipboardImage } from "../../utils/clipboard-image.js";
|
|
30
30
|
import { parseGitUrl } from "../../utils/git.js";
|
|
@@ -65,7 +65,7 @@ import { UserMessageSelectorComponent } from "./components/user-message-selector
|
|
|
65
65
|
import { formatSessionInfo } from "./session-info-format.js";
|
|
66
66
|
import { resolveStartupToolPaths } from "./startup-tools.js";
|
|
67
67
|
import { getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, initTheme, onThemeChange, setRegisteredThemes, setTheme, setThemeInstance, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
|
|
68
|
-
import { blendWorkingStatusShimmerRgbColor, formatToolHookStatusMessageFrame, formatWorkingStatusMessageFrame, } from "./working-status.js";
|
|
68
|
+
import { blendWorkingStatusShimmerRgbColor, formatActiveToolWorkingLabel, formatToolHookStatusMessageFrame, formatWorkingStatusMessageFrame, sanitizeWorkingStatusPlainText, } from "./working-status.js";
|
|
69
69
|
function isExpandable(obj) {
|
|
70
70
|
return typeof obj === "object" && obj !== null && "setExpanded" in obj && typeof obj.setExpanded === "function";
|
|
71
71
|
}
|
|
@@ -79,6 +79,11 @@ class ExpandableText extends Text {
|
|
|
79
79
|
this.setText(expanded ? this.getExpandedText() : this.getCollapsedText());
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
+
function formatToolHookTerminalTitle(event) {
|
|
83
|
+
const hookName = sanitizeWorkingStatusPlainText(event.hookName) || "hook";
|
|
84
|
+
const statusMessage = sanitizeWorkingStatusPlainText(event.statusMessage);
|
|
85
|
+
return `${APP_TITLE} - ${hookName}: ${statusMessage}`;
|
|
86
|
+
}
|
|
82
87
|
const DEAD_TERMINAL_ERROR_CODES = new Set(["EIO", "EPIPE", "ENOTCONN"]);
|
|
83
88
|
const DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS = 600;
|
|
84
89
|
const DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS = 32;
|
|
@@ -198,8 +203,13 @@ export class InteractiveMode {
|
|
|
198
203
|
this.defaultWorkingMessage = "Working";
|
|
199
204
|
this.defaultHiddenThinkingLabel = "Thinking...";
|
|
200
205
|
this.hiddenThinkingLabel = this.defaultHiddenThinkingLabel;
|
|
206
|
+
this.activeToolExecutions = new Map();
|
|
207
|
+
this.activeToolExecutionTerminalTitle = undefined;
|
|
208
|
+
this.workingMessageBeforeActiveTool = undefined;
|
|
201
209
|
this.activeToolHooks = new Map();
|
|
202
210
|
this.hookStatusIntervalId = undefined;
|
|
211
|
+
this.activeToolTerminalTitle = undefined;
|
|
212
|
+
this.extensionTerminalTitle = undefined;
|
|
203
213
|
this.lastSigintTime = 0;
|
|
204
214
|
this.lastEscapeTime = 0;
|
|
205
215
|
this.changelogMarkdown = undefined;
|
|
@@ -258,6 +268,7 @@ export class InteractiveMode {
|
|
|
258
268
|
this.isShuttingDown = false;
|
|
259
269
|
this.runtimeHost = runtimeHost;
|
|
260
270
|
this.options = options;
|
|
271
|
+
this.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;
|
|
261
272
|
this.runtimeHost.setBeforeSessionInvalidate(() => {
|
|
262
273
|
this.resetExtensionUI();
|
|
263
274
|
});
|
|
@@ -398,8 +409,13 @@ export class InteractiveMode {
|
|
|
398
409
|
}
|
|
399
410
|
setupAutocompleteProvider() {
|
|
400
411
|
let provider = this.createBaseAutocompleteProvider();
|
|
412
|
+
const triggerCharacters = [];
|
|
401
413
|
for (const wrapProvider of this.autocompleteProviderWrappers) {
|
|
402
414
|
provider = wrapProvider(provider);
|
|
415
|
+
triggerCharacters.push(...(provider.triggerCharacters ?? []));
|
|
416
|
+
}
|
|
417
|
+
if (triggerCharacters.length > 0) {
|
|
418
|
+
provider.triggerCharacters = [...new Set(triggerCharacters)];
|
|
403
419
|
}
|
|
404
420
|
this.autocompleteProvider = provider;
|
|
405
421
|
this.defaultEditor.setAutocompleteProvider(provider);
|
|
@@ -538,15 +554,22 @@ export class InteractiveMode {
|
|
|
538
554
|
/**
|
|
539
555
|
* Update terminal title with session name and cwd.
|
|
540
556
|
*/
|
|
541
|
-
|
|
557
|
+
getNormalTerminalTitle() {
|
|
542
558
|
const cwdBasename = path.basename(this.sessionManager.getCwd());
|
|
543
559
|
const sessionName = this.sessionManager.getSessionName();
|
|
544
560
|
if (sessionName) {
|
|
545
|
-
|
|
546
|
-
}
|
|
547
|
-
else {
|
|
548
|
-
this.ui.terminal.setTitle(`${APP_TITLE} - ${cwdBasename}`);
|
|
561
|
+
return `${APP_TITLE} - ${sessionName} - ${cwdBasename}`;
|
|
549
562
|
}
|
|
563
|
+
return `${APP_TITLE} - ${cwdBasename}`;
|
|
564
|
+
}
|
|
565
|
+
applyTerminalTitle() {
|
|
566
|
+
this.ui.terminal.setTitle(this.activeToolTerminalTitle ??
|
|
567
|
+
this.activeToolExecutionTerminalTitle ??
|
|
568
|
+
this.extensionTerminalTitle ??
|
|
569
|
+
this.getNormalTerminalTitle());
|
|
570
|
+
}
|
|
571
|
+
updateTerminalTitle() {
|
|
572
|
+
this.applyTerminalTitle();
|
|
550
573
|
}
|
|
551
574
|
/**
|
|
552
575
|
* Run the interactive mode. This is the main entry point.
|
|
@@ -684,7 +707,7 @@ export class InteractiveMode {
|
|
|
684
707
|
if (newEntries.length > 0) {
|
|
685
708
|
this.settingsManager.setLastChangelogVersion(VERSION);
|
|
686
709
|
this.reportInstallTelemetry(VERSION);
|
|
687
|
-
return newEntries.map((e) => e.content).join("\n\n");
|
|
710
|
+
return newEntries.map((e) => normalizeChangelogLinks(e.content, e)).join("\n\n");
|
|
688
711
|
}
|
|
689
712
|
return undefined;
|
|
690
713
|
}
|
|
@@ -1304,6 +1327,7 @@ export class InteractiveMode {
|
|
|
1304
1327
|
model: this.session.model,
|
|
1305
1328
|
serviceTier: this.session.serviceTier,
|
|
1306
1329
|
isIdle: () => !this.session.isStreaming,
|
|
1330
|
+
isProjectTrusted: () => this.settingsManager.isProjectTrusted(),
|
|
1307
1331
|
signal: this.session.agent.signal,
|
|
1308
1332
|
abort: () => this.session.abort(),
|
|
1309
1333
|
hasPendingMessages: () => this.session.pendingMessageCount > 0,
|
|
@@ -1413,22 +1437,79 @@ export class InteractiveMode {
|
|
|
1413
1437
|
handleToolHookStatusEvent(event) {
|
|
1414
1438
|
if (event.phase === "start") {
|
|
1415
1439
|
this.activeToolHooks.set(event.hookRunId, event);
|
|
1440
|
+
this.activeToolTerminalTitle = formatToolHookTerminalTitle(event);
|
|
1441
|
+
if (this.ui.terminal) {
|
|
1442
|
+
this.applyTerminalTitle();
|
|
1443
|
+
}
|
|
1416
1444
|
this.startToolHookStatusTimer();
|
|
1417
1445
|
this.refreshToolHookStatuses();
|
|
1418
1446
|
return;
|
|
1419
1447
|
}
|
|
1420
1448
|
this.activeToolHooks.delete(event.hookRunId);
|
|
1449
|
+
const nextHook = this.activeToolHooks.values().next().value;
|
|
1450
|
+
this.activeToolTerminalTitle = nextHook ? formatToolHookTerminalTitle(nextHook) : undefined;
|
|
1451
|
+
if (this.ui.terminal) {
|
|
1452
|
+
this.applyTerminalTitle();
|
|
1453
|
+
}
|
|
1421
1454
|
this.refreshToolHookStatuses();
|
|
1422
1455
|
}
|
|
1456
|
+
handleToolExecutionStart(event) {
|
|
1457
|
+
const label = formatActiveToolWorkingLabel(event.toolName, event.args);
|
|
1458
|
+
if (this.activeToolExecutions.size === 0) {
|
|
1459
|
+
this.workingMessageBeforeActiveTool = this.workingMessage;
|
|
1460
|
+
}
|
|
1461
|
+
this.activeToolExecutions.set(event.toolCallId, label);
|
|
1462
|
+
this.workingMessage = label;
|
|
1463
|
+
this.activeToolExecutionTerminalTitle = `${APP_TITLE} - ${label}`;
|
|
1464
|
+
this.refreshWorkingLoaderMessage();
|
|
1465
|
+
this.applyTerminalTitle();
|
|
1466
|
+
}
|
|
1467
|
+
handleToolExecutionEnd(event) {
|
|
1468
|
+
if (!this.activeToolExecutions.delete(event.toolCallId)) {
|
|
1469
|
+
return;
|
|
1470
|
+
}
|
|
1471
|
+
const nextExecution = this.activeToolExecutions.values().next();
|
|
1472
|
+
if (!nextExecution.done) {
|
|
1473
|
+
this.workingMessage = nextExecution.value;
|
|
1474
|
+
this.activeToolExecutionTerminalTitle = `${APP_TITLE} - ${nextExecution.value}`;
|
|
1475
|
+
}
|
|
1476
|
+
else {
|
|
1477
|
+
this.workingMessage = this.workingMessageBeforeActiveTool;
|
|
1478
|
+
this.workingMessageBeforeActiveTool = undefined;
|
|
1479
|
+
this.activeToolExecutionTerminalTitle = undefined;
|
|
1480
|
+
}
|
|
1481
|
+
this.refreshWorkingLoaderMessage();
|
|
1482
|
+
this.applyTerminalTitle();
|
|
1483
|
+
}
|
|
1484
|
+
clearActiveToolExecutionStatus() {
|
|
1485
|
+
if (this.activeToolExecutions.size === 0 &&
|
|
1486
|
+
this.activeToolExecutionTerminalTitle === undefined &&
|
|
1487
|
+
this.workingMessageBeforeActiveTool === undefined) {
|
|
1488
|
+
return;
|
|
1489
|
+
}
|
|
1490
|
+
this.activeToolExecutions.clear();
|
|
1491
|
+
this.activeToolExecutionTerminalTitle = undefined;
|
|
1492
|
+
this.workingMessage = this.workingMessageBeforeActiveTool;
|
|
1493
|
+
this.workingMessageBeforeActiveTool = undefined;
|
|
1494
|
+
this.refreshWorkingLoaderMessage();
|
|
1495
|
+
this.applyTerminalTitle();
|
|
1496
|
+
}
|
|
1423
1497
|
clearToolHookStatuses() {
|
|
1424
1498
|
this.activeToolHooks.clear();
|
|
1499
|
+
this.activeToolTerminalTitle = undefined;
|
|
1500
|
+
if (this.ui.terminal) {
|
|
1501
|
+
this.applyTerminalTitle();
|
|
1502
|
+
}
|
|
1425
1503
|
this.hookStatusContainer.clear();
|
|
1426
1504
|
this.stopToolHookStatusTimer();
|
|
1427
1505
|
}
|
|
1428
1506
|
getWorkingIndicatorOptions() {
|
|
1429
1507
|
return (this.workingIndicatorOptions ?? {
|
|
1430
|
-
frames: [theme.fg("accent", "•"), theme.fg("muted", "◦")],
|
|
1508
|
+
frames: theme.getColorMode() === "truecolor" ? ["•"] : [theme.fg("accent", "•"), theme.fg("muted", "◦")],
|
|
1431
1509
|
intervalMs: DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS,
|
|
1510
|
+
indicatorFormatter: theme.getColorMode() === "truecolor"
|
|
1511
|
+
? (frame, elapsedMs) => formatWorkingStatusShimmerText(frame, elapsedMs)
|
|
1512
|
+
: undefined,
|
|
1432
1513
|
messageFormatter: (message, animationElapsedMs) => formatWorkingStatusMessageFrame(message, this.getWorkingElapsedSeconds(), keyText("app.interrupt"), animationElapsedMs, {
|
|
1433
1514
|
base: (text) => theme.fg("dim", text),
|
|
1434
1515
|
glow: (text) => theme.fg("text", text),
|
|
@@ -1552,6 +1633,10 @@ export class InteractiveMode {
|
|
|
1552
1633
|
this.setCustomEditorComponent(undefined);
|
|
1553
1634
|
this.setupAutocompleteProvider();
|
|
1554
1635
|
this.defaultEditor.onExtensionShortcut = undefined;
|
|
1636
|
+
this.activeToolExecutions.clear();
|
|
1637
|
+
this.activeToolExecutionTerminalTitle = undefined;
|
|
1638
|
+
this.workingMessageBeforeActiveTool = undefined;
|
|
1639
|
+
this.extensionTerminalTitle = undefined;
|
|
1555
1640
|
this.updateTerminalTitle();
|
|
1556
1641
|
this.workingMessage = undefined;
|
|
1557
1642
|
this.workingVisible = true;
|
|
@@ -1672,6 +1757,20 @@ export class InteractiveMode {
|
|
|
1672
1757
|
/**
|
|
1673
1758
|
* Create the ExtensionUIContext for extensions.
|
|
1674
1759
|
*/
|
|
1760
|
+
createProjectTrustContext(cwd) {
|
|
1761
|
+
const ui = this.createExtensionUIContext();
|
|
1762
|
+
return {
|
|
1763
|
+
cwd,
|
|
1764
|
+
mode: "tui",
|
|
1765
|
+
hasUI: true,
|
|
1766
|
+
ui: {
|
|
1767
|
+
select: ui.select,
|
|
1768
|
+
confirm: ui.confirm,
|
|
1769
|
+
input: ui.input,
|
|
1770
|
+
notify: ui.notify,
|
|
1771
|
+
},
|
|
1772
|
+
};
|
|
1773
|
+
}
|
|
1675
1774
|
createExtensionUIContext() {
|
|
1676
1775
|
return {
|
|
1677
1776
|
select: (title, options, opts) => this.showExtensionSelector(title, options, opts),
|
|
@@ -1690,7 +1789,10 @@ export class InteractiveMode {
|
|
|
1690
1789
|
setWidget: (key, content, options) => this.setExtensionWidget(key, content, options),
|
|
1691
1790
|
setFooter: (factory) => this.setExtensionFooter(factory),
|
|
1692
1791
|
setHeader: (factory) => this.setExtensionHeader(factory),
|
|
1693
|
-
setTitle: (title) =>
|
|
1792
|
+
setTitle: (title) => {
|
|
1793
|
+
this.extensionTerminalTitle = title;
|
|
1794
|
+
this.applyTerminalTitle();
|
|
1795
|
+
},
|
|
1694
1796
|
custom: (factory, options) => this.showExtensionCustom(factory, options),
|
|
1695
1797
|
pasteToEditor: (text) => this.editor.handleInput(`\x1b[200~${text}\x1b[201~`),
|
|
1696
1798
|
setEditorText: (text) => this.editor.setText(text),
|
|
@@ -2314,6 +2416,7 @@ export class InteractiveMode {
|
|
|
2314
2416
|
switch (event.type) {
|
|
2315
2417
|
case "agent_start":
|
|
2316
2418
|
this.pendingTools.clear();
|
|
2419
|
+
this.clearActiveToolExecutionStatus();
|
|
2317
2420
|
this.clearToolHookStatuses();
|
|
2318
2421
|
if (this.settingsManager.getShowTerminalProgress()) {
|
|
2319
2422
|
this.ui.terminal.setProgress(true);
|
|
@@ -2441,6 +2544,7 @@ export class InteractiveMode {
|
|
|
2441
2544
|
this.ui.requestRender();
|
|
2442
2545
|
break;
|
|
2443
2546
|
case "tool_execution_start": {
|
|
2547
|
+
this.handleToolExecutionStart(event);
|
|
2444
2548
|
let component = this.pendingTools.get(event.toolCallId);
|
|
2445
2549
|
if (!component) {
|
|
2446
2550
|
component = new ToolExecutionComponent(event.toolName, event.toolCallId, event.args, {
|
|
@@ -2467,6 +2571,7 @@ export class InteractiveMode {
|
|
|
2467
2571
|
break;
|
|
2468
2572
|
}
|
|
2469
2573
|
case "tool_execution_end": {
|
|
2574
|
+
this.handleToolExecutionEnd(event);
|
|
2470
2575
|
const component = this.pendingTools.get(event.toolCallId);
|
|
2471
2576
|
if (component) {
|
|
2472
2577
|
component.updateResult({ ...event.result, isError: event.isError });
|
|
@@ -2480,6 +2585,7 @@ export class InteractiveMode {
|
|
|
2480
2585
|
this.ui.terminal.setProgress(false);
|
|
2481
2586
|
}
|
|
2482
2587
|
this.stopWorkingLoader();
|
|
2588
|
+
this.clearActiveToolExecutionStatus();
|
|
2483
2589
|
this.clearToolHookStatuses();
|
|
2484
2590
|
if (this.streamingComponent) {
|
|
2485
2591
|
this.chatContainer.removeChild(this.streamingComponent);
|
|
@@ -2813,7 +2919,7 @@ export class InteractiveMode {
|
|
|
2813
2919
|
if (this.chatContainer.children.length > 0) {
|
|
2814
2920
|
this.chatContainer.addChild(new Spacer(1));
|
|
2815
2921
|
}
|
|
2816
|
-
this.chatContainer.addChild(new Text(theme.fg("warning", "This project is not trusted. Project
|
|
2922
|
+
this.chatContainer.addChild(new Text(theme.fg("warning", "This project is not trusted. Project .pi resources and packages are ignored. Use /trust to save a trust decision, then restart pi."), 1, 0));
|
|
2817
2923
|
}
|
|
2818
2924
|
async getUserInput() {
|
|
2819
2925
|
const queuedInput = this.pendingUserInputs.shift();
|
|
@@ -3443,6 +3549,7 @@ export class InteractiveMode {
|
|
|
3443
3549
|
doubleEscapeAction: this.settingsManager.getDoubleEscapeAction(),
|
|
3444
3550
|
treeFilterMode: this.settingsManager.getTreeFilterMode(),
|
|
3445
3551
|
showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
|
|
3552
|
+
defaultProjectTrust: this.settingsManager.getDefaultProjectTrust(),
|
|
3446
3553
|
editorPaddingX: this.settingsManager.getEditorPaddingX(),
|
|
3447
3554
|
autocompleteMaxVisible: this.settingsManager.getAutocompleteMaxVisible(),
|
|
3448
3555
|
quietStartup: this.settingsManager.getQuietStartup(),
|
|
@@ -3535,6 +3642,9 @@ export class InteractiveMode {
|
|
|
3535
3642
|
onQuietStartupChange: (enabled) => {
|
|
3536
3643
|
this.settingsManager.setQuietStartup(enabled);
|
|
3537
3644
|
},
|
|
3645
|
+
onDefaultProjectTrustChange: (defaultProjectTrust) => {
|
|
3646
|
+
this.settingsManager.setDefaultProjectTrust(defaultProjectTrust);
|
|
3647
|
+
},
|
|
3538
3648
|
onDoubleEscapeActionChange: (action) => {
|
|
3539
3649
|
this.settingsManager.setDoubleEscapeAction(action);
|
|
3540
3650
|
},
|
|
@@ -3701,19 +3811,42 @@ export class InteractiveMode {
|
|
|
3701
3811
|
// Ignore auth lookup failures for warning-only checks.
|
|
3702
3812
|
}
|
|
3703
3813
|
}
|
|
3814
|
+
maybeSaveImplicitProjectTrustAfterReload() {
|
|
3815
|
+
const cwd = this.sessionManager.getCwd();
|
|
3816
|
+
if (this.autoTrustOnReloadCwd !== cwd) {
|
|
3817
|
+
return false;
|
|
3818
|
+
}
|
|
3819
|
+
if (!this.settingsManager.isProjectTrusted() || !hasProjectConfigDir(cwd)) {
|
|
3820
|
+
return false;
|
|
3821
|
+
}
|
|
3822
|
+
const trustStore = new ProjectTrustStore(this.runtimeHost.services.agentDir);
|
|
3823
|
+
try {
|
|
3824
|
+
if (trustStore.get(cwd) !== null) {
|
|
3825
|
+
this.autoTrustOnReloadCwd = undefined;
|
|
3826
|
+
return false;
|
|
3827
|
+
}
|
|
3828
|
+
trustStore.set(cwd, true);
|
|
3829
|
+
this.autoTrustOnReloadCwd = undefined;
|
|
3830
|
+
return true;
|
|
3831
|
+
}
|
|
3832
|
+
catch (error) {
|
|
3833
|
+
this.showWarning(`Could not save project trust after reload: ${error instanceof Error ? error.message : String(error)}`);
|
|
3834
|
+
return false;
|
|
3835
|
+
}
|
|
3836
|
+
}
|
|
3704
3837
|
showTrustSelector() {
|
|
3705
3838
|
const cwd = this.sessionManager.getCwd();
|
|
3706
3839
|
const trustStore = new ProjectTrustStore(this.runtimeHost.services.agentDir);
|
|
3707
|
-
const savedDecision = trustStore.
|
|
3840
|
+
const savedDecision = trustStore.getEntry(cwd);
|
|
3708
3841
|
this.showSelector((done) => {
|
|
3709
3842
|
const selector = new TrustSelectorComponent({
|
|
3710
3843
|
cwd,
|
|
3711
3844
|
savedDecision,
|
|
3712
3845
|
projectTrusted: this.settingsManager.isProjectTrusted(),
|
|
3713
|
-
onSelect: (
|
|
3714
|
-
trustStore.
|
|
3846
|
+
onSelect: (selection) => {
|
|
3847
|
+
trustStore.setMany(selection.updates);
|
|
3715
3848
|
done();
|
|
3716
|
-
this.showStatus(`Saved trust decision: ${trusted ? "trusted" : "untrusted"}. Restart pi for this to take effect.`);
|
|
3849
|
+
this.showStatus(`Saved trust decision: ${selection.trusted ? "trusted" : "untrusted"}. Restart pi for this to take effect.`);
|
|
3717
3850
|
},
|
|
3718
3851
|
onCancel: () => {
|
|
3719
3852
|
done();
|
|
@@ -3959,6 +4092,7 @@ export class InteractiveMode {
|
|
|
3959
4092
|
try {
|
|
3960
4093
|
const result = await this.runtimeHost.switchSession(sessionPath, {
|
|
3961
4094
|
withSession: options?.withSession,
|
|
4095
|
+
projectTrustContextFactory: (cwd) => this.createProjectTrustContext(cwd),
|
|
3962
4096
|
});
|
|
3963
4097
|
if (result.cancelled) {
|
|
3964
4098
|
return result;
|
|
@@ -3977,6 +4111,7 @@ export class InteractiveMode {
|
|
|
3977
4111
|
const result = await this.runtimeHost.switchSession(sessionPath, {
|
|
3978
4112
|
cwdOverride: selectedCwd,
|
|
3979
4113
|
withSession: options?.withSession,
|
|
4114
|
+
projectTrustContextFactory: (cwd) => this.createProjectTrustContext(cwd),
|
|
3980
4115
|
});
|
|
3981
4116
|
if (result.cancelled) {
|
|
3982
4117
|
return result;
|
|
@@ -4377,11 +4512,14 @@ export class InteractiveMode {
|
|
|
4377
4512
|
force: false,
|
|
4378
4513
|
showDiagnosticsWhenQuiet: true,
|
|
4379
4514
|
});
|
|
4515
|
+
const savedImplicitProjectTrust = this.maybeSaveImplicitProjectTrustAfterReload();
|
|
4380
4516
|
const modelsJsonError = this.session.modelRegistry.getError();
|
|
4381
4517
|
if (modelsJsonError) {
|
|
4382
4518
|
this.showError(`models.json error: ${modelsJsonError}`);
|
|
4383
4519
|
}
|
|
4384
|
-
this.showStatus(
|
|
4520
|
+
this.showStatus(savedImplicitProjectTrust
|
|
4521
|
+
? "Reloaded keybindings, extensions, skills, prompts, themes; saved project trust"
|
|
4522
|
+
: "Reloaded keybindings, extensions, skills, prompts, themes");
|
|
4385
4523
|
}
|
|
4386
4524
|
catch (error) {
|
|
4387
4525
|
dismissReloadBox(previousEditor);
|
|
@@ -4607,7 +4745,7 @@ export class InteractiveMode {
|
|
|
4607
4745
|
const changelogMarkdown = allEntries.length > 0
|
|
4608
4746
|
? allEntries
|
|
4609
4747
|
.reverse()
|
|
4610
|
-
.map((e) => e.content)
|
|
4748
|
+
.map((e) => normalizeChangelogLinks(e.content, e))
|
|
4611
4749
|
.join("\n\n")
|
|
4612
4750
|
: "No changelog entries found.";
|
|
4613
4751
|
this.chatContainer.addChild(new Spacer(1));
|
|
@@ -4675,7 +4813,7 @@ export class InteractiveMode {
|
|
|
4675
4813
|
**Navigation**
|
|
4676
4814
|
| Key | Action |
|
|
4677
4815
|
|-----|--------|
|
|
4678
|
-
| \`${cursorUp}\` / \`${cursorDown}\` / \`${cursorLeft}\` / \`${cursorRight}\` | Move cursor / browse history
|
|
4816
|
+
| \`${cursorUp}\` / \`${cursorDown}\` / \`${cursorLeft}\` / \`${cursorRight}\` | Move cursor / browse history |
|
|
4679
4817
|
| \`${cursorWordLeft}\` / \`${cursorWordRight}\` | Move by word |
|
|
4680
4818
|
| \`${cursorLineStart}\` | Start of line |
|
|
4681
4819
|
| \`${cursorLineEnd}\` | End of line |
|
|
@@ -4890,6 +5028,7 @@ export class InteractiveMode {
|
|
|
4890
5028
|
this.ui.terminal.setProgress(false);
|
|
4891
5029
|
}
|
|
4892
5030
|
this.stopWorkingLoader();
|
|
5031
|
+
this.clearActiveToolExecutionStatus();
|
|
4893
5032
|
this.clearToolHookStatuses();
|
|
4894
5033
|
this.clearExtensionTerminalInputListeners();
|
|
4895
5034
|
this.footer.dispose();
|