apex-code 0.0.1-alpha.6 → 0.0.1-alpha.7
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 +16 -0
- package/dist/core/agent-session.d.ts +17 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +28 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/permissions/gate.d.ts +7 -0
- package/dist/core/permissions/gate.d.ts.map +1 -1
- package/dist/core/permissions/gate.js.map +1 -1
- package/dist/core/permissions/startup.d.ts +12 -0
- package/dist/core/permissions/startup.d.ts.map +1 -1
- package/dist/core/permissions/startup.js +12 -4
- package/dist/core/permissions/startup.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +3 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +13 -0
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +13 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +96 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +11 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +62 -3
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/npm-shrinkwrap.json +5 -5
- package/package.json +2 -2
|
@@ -62,7 +62,7 @@ import { ModelSelectorComponent } from "./components/model-selector.js";
|
|
|
62
62
|
import { formatAuthSelectorProviderType, OAuthSelectorComponent, } from "./components/oauth-selector.js";
|
|
63
63
|
import { ScopedModelsSelectorComponent } from "./components/scoped-models-selector.js";
|
|
64
64
|
import { SessionSelectorComponent } from "./components/session-selector.js";
|
|
65
|
-
import { SettingsSelectorComponent } from "./components/settings-selector.js";
|
|
65
|
+
import { PERMISSION_MODE_OVERRIDE_HINTS, SettingsSelectorComponent } from "./components/settings-selector.js";
|
|
66
66
|
import { SkillInvocationMessageComponent } from "./components/skill-invocation-message.js";
|
|
67
67
|
import { ApexSplashHeader } from "./components/splash-header.js";
|
|
68
68
|
import { BranchSummaryStatusIndicator, CompactionStatusIndicator, IdleStatus, RetryStatusIndicator, WorkingStatusIndicator, } from "./components/status-indicator.js";
|
|
@@ -212,6 +212,8 @@ export function createInteractiveTuiReference(getTui) {
|
|
|
212
212
|
}
|
|
213
213
|
export class InteractiveMode {
|
|
214
214
|
runtimeHost;
|
|
215
|
+
/** Settled once the most recent /settings permission-mode write has hit disk. */
|
|
216
|
+
pendingPermissionModeWrite;
|
|
215
217
|
renderer;
|
|
216
218
|
ui;
|
|
217
219
|
mainScreenRenderState;
|
|
@@ -1444,6 +1446,7 @@ export class InteractiveMode {
|
|
|
1444
1446
|
this.applyFullscreenScrollbarSetting();
|
|
1445
1447
|
this.footer.setSession(this.session);
|
|
1446
1448
|
this.footer.setAutoCompactEnabled(this.session.autoCompactionEnabled);
|
|
1449
|
+
this.refreshFooterPermissionMode();
|
|
1447
1450
|
this.footerDataProvider.setCwd(this.sessionManager.getCwd());
|
|
1448
1451
|
this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();
|
|
1449
1452
|
this.outputPad = this.settingsManager.getOutputPad();
|
|
@@ -2283,10 +2286,17 @@ export class InteractiveMode {
|
|
|
2283
2286
|
text = text.trim();
|
|
2284
2287
|
if (!text)
|
|
2285
2288
|
return;
|
|
2289
|
+
// A mode chosen in /settings is written asynchronously. Awaiting it here
|
|
2290
|
+
// keeps the store authoritative before any tool call can read it, so a
|
|
2291
|
+
// switch *out* of bypassPermissions can never be raced by the next turn.
|
|
2292
|
+
if (this.pendingPermissionModeWrite) {
|
|
2293
|
+
await this.pendingPermissionModeWrite;
|
|
2294
|
+
this.pendingPermissionModeWrite = undefined;
|
|
2295
|
+
}
|
|
2286
2296
|
// Handle commands
|
|
2287
2297
|
if (text === "/settings") {
|
|
2288
|
-
this.showSettingsSelector();
|
|
2289
2298
|
this.editor.setText("");
|
|
2299
|
+
await this.showSettingsSelector();
|
|
2290
2300
|
return;
|
|
2291
2301
|
}
|
|
2292
2302
|
if (text === "/scoped-models") {
|
|
@@ -3593,7 +3603,52 @@ export class InteractiveMode {
|
|
|
3593
3603
|
this.ui.setFocus(created.focus);
|
|
3594
3604
|
this.ui.requestRender();
|
|
3595
3605
|
}
|
|
3596
|
-
|
|
3606
|
+
/**
|
|
3607
|
+
* Resyncs the footer from the store. Called on every session swap, not just at
|
|
3608
|
+
* startup: `applyRuntimeSettings` also repoints the cwd, and cwd selects which
|
|
3609
|
+
* project-scope permission file applies, so the mode genuinely can differ
|
|
3610
|
+
* between two sessions in one process. A footer left showing the old value
|
|
3611
|
+
* would under-report bypassPermissions, which is the one direction that matters.
|
|
3612
|
+
*/
|
|
3613
|
+
refreshFooterPermissionMode() {
|
|
3614
|
+
void this.session.getPermissionMode().then((resolution) => {
|
|
3615
|
+
this.footer.setPermissionMode(resolution?.mode ?? "default");
|
|
3616
|
+
this.ui.requestRender();
|
|
3617
|
+
});
|
|
3618
|
+
}
|
|
3619
|
+
/**
|
|
3620
|
+
* Writes the mode to user scope, then reports what is actually in force. The
|
|
3621
|
+
* write can be outranked by `--permission-mode` or a project file, and a
|
|
3622
|
+
* settings row that silently does nothing is worse than no row at all.
|
|
3623
|
+
*/
|
|
3624
|
+
async applyPermissionMode(mode) {
|
|
3625
|
+
let resolution;
|
|
3626
|
+
try {
|
|
3627
|
+
const write = this.session.setPermissionMode(mode);
|
|
3628
|
+
this.pendingPermissionModeWrite = write.then(() => { }, () => { });
|
|
3629
|
+
resolution = await write;
|
|
3630
|
+
}
|
|
3631
|
+
catch (error) {
|
|
3632
|
+
// Never swallow this. A permission mode the user believes they set, and
|
|
3633
|
+
// did not, is the one outcome worse than the prompt they were escaping.
|
|
3634
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
3635
|
+
this.chatContainer.addChild(new Text(theme.fg("error", `Permission mode could not be saved: ${detail}`), 1, 0));
|
|
3636
|
+
this.ui.requestRender();
|
|
3637
|
+
return;
|
|
3638
|
+
}
|
|
3639
|
+
if (!resolution)
|
|
3640
|
+
return;
|
|
3641
|
+
const outranked = resolution.mode !== mode;
|
|
3642
|
+
const source = PERMISSION_MODE_OVERRIDE_HINTS[resolution.origin] ?? resolution.origin;
|
|
3643
|
+
const line = outranked
|
|
3644
|
+
? `Permission mode saved as ${mode}, but ${source} sets ${resolution.mode} for this session.`
|
|
3645
|
+
: `Permission mode set to ${mode}.`;
|
|
3646
|
+
this.chatContainer.addChild(new Text(theme.fg(outranked ? "warning" : "muted", line), 1, 0));
|
|
3647
|
+
this.footer.setPermissionMode(resolution.mode);
|
|
3648
|
+
this.ui.requestRender();
|
|
3649
|
+
}
|
|
3650
|
+
async showSettingsSelector() {
|
|
3651
|
+
const permissionMode = await this.session.getPermissionMode();
|
|
3597
3652
|
this.showSelector((done) => {
|
|
3598
3653
|
let selector;
|
|
3599
3654
|
selector = new SettingsSelectorComponent({
|
|
@@ -3621,6 +3676,7 @@ export class InteractiveMode {
|
|
|
3621
3676
|
showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
|
|
3622
3677
|
showCacheMissNotices: this.settingsManager.getShowCacheMissNotices(),
|
|
3623
3678
|
defaultProjectTrust: this.settingsManager.getDefaultProjectTrust(),
|
|
3679
|
+
permissionMode,
|
|
3624
3680
|
editorPaddingX: this.settingsManager.getEditorPaddingX(),
|
|
3625
3681
|
outputPad: this.settingsManager.getOutputPad(),
|
|
3626
3682
|
autocompleteMaxVisible: this.settingsManager.getAutocompleteMaxVisible(),
|
|
@@ -3718,6 +3774,9 @@ export class InteractiveMode {
|
|
|
3718
3774
|
onDefaultProjectTrustChange: (defaultProjectTrust) => {
|
|
3719
3775
|
this.settingsManager.setDefaultProjectTrust(defaultProjectTrust);
|
|
3720
3776
|
},
|
|
3777
|
+
onPermissionModeChange: (mode) => {
|
|
3778
|
+
void this.applyPermissionMode(mode);
|
|
3779
|
+
},
|
|
3721
3780
|
onDoubleEscapeActionChange: (action) => {
|
|
3722
3781
|
this.settingsManager.setDoubleEscapeAction(action);
|
|
3723
3782
|
},
|