@pellux/goodvibes-tui 0.28.0 → 0.29.0
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 +101 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/input/commands/cost-runtime.ts +49 -0
- package/src/input/commands/operator-runtime.ts +5 -1
- package/src/input/commands.ts +2 -0
- package/src/input/handler-feed-routes.ts +12 -35
- package/src/input/handler-feed.ts +4 -8
- package/src/input/handler-shortcuts.ts +51 -0
- package/src/input/handler.ts +43 -6
- package/src/input/keybindings.ts +48 -8
- package/src/input/panel-integration-actions.ts +107 -1
- package/src/main.ts +5 -1
- package/src/panels/agent-inspector-panel.ts +125 -36
- package/src/panels/agent-inspector-shared.ts +144 -0
- package/src/panels/approval-panel.ts +67 -16
- package/src/panels/automation-control-panel.ts +368 -124
- package/src/panels/builtin/agent.ts +28 -37
- package/src/panels/builtin/development.ts +40 -32
- package/src/panels/builtin/knowledge.ts +15 -6
- package/src/panels/builtin/operations.ts +178 -117
- package/src/panels/builtin/session.ts +35 -9
- package/src/panels/builtin/shared.ts +98 -6
- package/src/panels/cockpit-panel.ts +232 -73
- package/src/panels/communication-panel.ts +58 -20
- package/src/panels/confirm-state.ts +8 -1
- package/src/panels/control-plane-panel.ts +351 -118
- package/src/panels/cost-tracker-panel.ts +165 -7
- package/src/panels/debug-panel.ts +312 -159
- package/src/panels/diff-panel.ts +203 -57
- package/src/panels/docs-panel.ts +152 -66
- package/src/panels/eval-panel.ts +220 -42
- package/src/panels/file-explorer-panel.ts +202 -122
- package/src/panels/file-preview-panel.ts +132 -57
- package/src/panels/git-panel.ts +309 -128
- package/src/panels/hooks-panel.ts +150 -22
- package/src/panels/incident-review-panel.ts +223 -35
- package/src/panels/index.ts +0 -4
- package/src/panels/intelligence-panel.ts +212 -86
- package/src/panels/knowledge-graph-panel.ts +461 -101
- package/src/panels/local-auth-panel.ts +240 -28
- package/src/panels/marketplace-panel.ts +193 -26
- package/src/panels/memory-panel.ts +78 -77
- package/src/panels/ops-control-panel.ts +146 -29
- package/src/panels/ops-strategy-panel.ts +72 -4
- package/src/panels/orchestration-panel.ts +231 -69
- package/src/panels/panel-list-panel.ts +154 -131
- package/src/panels/panel-manager.ts +97 -9
- package/src/panels/plan-dashboard-panel.ts +333 -17
- package/src/panels/plugins-panel.ts +184 -29
- package/src/panels/policy-panel.ts +210 -38
- package/src/panels/polish-core.ts +7 -2
- package/src/panels/polish.ts +23 -4
- package/src/panels/project-planning-answer-actions.ts +134 -0
- package/src/panels/project-planning-panel.ts +62 -113
- package/src/panels/provider-health-panel.ts +434 -518
- package/src/panels/provider-health-routes.ts +203 -0
- package/src/panels/provider-health-tracker.ts +194 -6
- package/src/panels/provider-health-views.ts +560 -0
- package/src/panels/qr-panel.ts +116 -30
- package/src/panels/remote-panel.ts +114 -36
- package/src/panels/routes-panel.ts +63 -22
- package/src/panels/sandbox-panel.ts +174 -42
- package/src/panels/scrollable-list-panel.ts +19 -135
- package/src/panels/security-panel.ts +133 -33
- package/src/panels/services-panel.ts +116 -64
- package/src/panels/session-browser-panel.ts +73 -2
- package/src/panels/session-maintenance.ts +4 -122
- package/src/panels/settings-sync-panel.ts +335 -72
- package/src/panels/skills-panel.ts +157 -89
- package/src/panels/subscription-panel.ts +86 -33
- package/src/panels/symbol-outline-panel.ts +248 -108
- package/src/panels/system-messages-panel.ts +114 -13
- package/src/panels/tasks-panel.ts +326 -139
- package/src/panels/thinking-panel.ts +43 -10
- package/src/panels/token-budget-panel.ts +194 -18
- package/src/panels/tool-inspector-panel.ts +144 -34
- package/src/panels/types.ts +40 -4
- package/src/panels/work-plan-panel.ts +280 -17
- package/src/panels/worktree-panel.ts +175 -42
- package/src/panels/wrfc-panel.ts +116 -24
- package/src/renderer/conversation-overlays.ts +25 -11
- package/src/renderer/footer-tips.ts +41 -0
- package/src/renderer/fullscreen-primitives.ts +22 -16
- package/src/renderer/help-overlay.ts +91 -14
- package/src/renderer/hint-grammar.ts +52 -0
- package/src/renderer/layout.ts +7 -7
- package/src/renderer/modal-factory.ts +23 -15
- package/src/renderer/model-picker-overlay.ts +21 -7
- package/src/renderer/overlay-box.ts +16 -10
- package/src/renderer/process-indicator.ts +3 -1
- package/src/renderer/progress.ts +5 -4
- package/src/renderer/search-overlay.ts +27 -6
- package/src/renderer/session-picker-modal.ts +6 -4
- package/src/renderer/settings-modal.ts +70 -10
- package/src/renderer/shell-surface.ts +41 -15
- package/src/renderer/status-glyphs.ts +11 -9
- package/src/renderer/theme.ts +60 -3
- package/src/renderer/ui-factory.ts +41 -30
- package/src/renderer/ui-primitives.ts +23 -2
- package/src/runtime/bootstrap-shell.ts +35 -18
- package/src/runtime/diagnostics/panels/index.ts +0 -3
- package/src/shell/ui-openers.ts +14 -22
- package/src/utils/format-duration.ts +2 -2
- package/src/utils/splash-lines.ts +44 -3
- package/src/version.ts +1 -1
- package/src/work-plans/work-plan-store.ts +13 -0
- package/src/panels/agent-logs-panel.ts +0 -635
- package/src/panels/agent-logs-shared.ts +0 -129
- package/src/panels/context-visualizer-panel.ts +0 -238
- package/src/panels/forensics-panel.ts +0 -378
- package/src/panels/provider-account-snapshot.ts +0 -259
- package/src/panels/provider-accounts-panel.ts +0 -255
- package/src/panels/provider-stats-panel.ts +0 -391
- package/src/panels/schedule-panel.ts +0 -365
- package/src/panels/watchers-panel.ts +0 -213
- package/src/runtime/diagnostics/panels/panel-resources.ts +0 -118
- package/src/runtime/diagnostics/panels/policy.ts +0 -177
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import type { Line } from '../types/grid.ts';
|
|
6
6
|
import { BasePanel } from './base-panel.ts';
|
|
7
|
+
import type { PanelIntegrationContext } from './types.ts';
|
|
7
8
|
import type { SessionInfo } from '@pellux/goodvibes-sdk/platform/sessions';
|
|
8
9
|
import { logger } from '@pellux/goodvibes-sdk/platform/utils';
|
|
9
10
|
import type { SessionBrowserQuery } from '../runtime/ui-service-queries.ts';
|
|
@@ -40,6 +41,15 @@ const C = extendPalette(DEFAULT_PANEL_PALETTE, {
|
|
|
40
41
|
countFg: '#88bbcc',
|
|
41
42
|
});
|
|
42
43
|
|
|
44
|
+
// Splits a computed '/command arg1 arg2' string into the { name, args } shape
|
|
45
|
+
// ctx.executeCommand expects — same leading-slash-stripping approach used by
|
|
46
|
+
// remote-panel.ts for its own dispatched command.
|
|
47
|
+
function parseCommand(command: string): { name: string; args: string[] } | null {
|
|
48
|
+
const parts = command.replace(/^\//, '').split(/\s+/).filter(Boolean);
|
|
49
|
+
const [name, ...args] = parts;
|
|
50
|
+
return name ? { name, args } : null;
|
|
51
|
+
}
|
|
52
|
+
|
|
43
53
|
function shortDate(ts: number): string {
|
|
44
54
|
const d = new Date(ts);
|
|
45
55
|
const Y = d.getFullYear();
|
|
@@ -87,6 +97,12 @@ export class SessionBrowserPanel extends BasePanel {
|
|
|
87
97
|
private loadError = '';
|
|
88
98
|
private hasLoaded = false;
|
|
89
99
|
private refreshTimerId: ReturnType<typeof setInterval> | null = null;
|
|
100
|
+
// x = dispatch the computed next-step command ('/remote recover <runner>'
|
|
101
|
+
// or '/session resume <name>') via the same handleInput -> handlePanelIntegrationAction
|
|
102
|
+
// bridge remote-panel.ts uses — handleInput has no ctx.executeCommand.
|
|
103
|
+
private pendingCommand: { name: string; args: string[] } | null = null;
|
|
104
|
+
// On resume, restore any panels the session had open when it was saved.
|
|
105
|
+
private pendingOpenPanels: string[] | null = null;
|
|
90
106
|
|
|
91
107
|
constructor(
|
|
92
108
|
private readonly sessionManager: SessionBrowserQuery,
|
|
@@ -101,6 +117,21 @@ export class SessionBrowserPanel extends BasePanel {
|
|
|
101
117
|
this.refreshTimerId = this.registerTimer(setInterval(() => { this._load(); }, 5000));
|
|
102
118
|
}
|
|
103
119
|
|
|
120
|
+
/**
|
|
121
|
+
* Clears any active search/filter and moves the cursor to the session
|
|
122
|
+
* matching `sessionId` (SessionInfo.name) so a sibling panel (e.g.
|
|
123
|
+
* RoutesPanel's Enter-on-binding jump) can land directly on it. No-ops
|
|
124
|
+
* (beyond clearing the filter) if the session isn't found.
|
|
125
|
+
*/
|
|
126
|
+
focusSession(sessionId: string): void {
|
|
127
|
+
this.searching = false;
|
|
128
|
+
this.searchQuery = '';
|
|
129
|
+
this._filter();
|
|
130
|
+
const index = this.filtered.findIndex((session) => session.name === sessionId);
|
|
131
|
+
if (index >= 0) this.cursorIndex = index;
|
|
132
|
+
this.markDirty();
|
|
133
|
+
}
|
|
134
|
+
|
|
104
135
|
override onDeactivate(): void {
|
|
105
136
|
if (this.refreshTimerId !== null) { this.clearTimer(this.refreshTimerId); this.refreshTimerId = null; }
|
|
106
137
|
this.searching = false;
|
|
@@ -163,10 +194,34 @@ export class SessionBrowserPanel extends BasePanel {
|
|
|
163
194
|
case 'return': this._resume(); return true;
|
|
164
195
|
case 'd': this._promptDelete(); return true;
|
|
165
196
|
case 'r': this._load(); return true;
|
|
197
|
+
case 'x': this._dispatchNextStep(); return true;
|
|
166
198
|
default: return false;
|
|
167
199
|
}
|
|
168
200
|
}
|
|
169
201
|
|
|
202
|
+
/**
|
|
203
|
+
* Drains `pendingCommand` (set by the 'x' key) and `pendingOpenPanels`
|
|
204
|
+
* (set by `_resume()`) via the ctx.executeCommand / PanelManager bridge.
|
|
205
|
+
* Called by the input router immediately after handleInput() consumes the
|
|
206
|
+
* same key (panel-integration-actions.ts's onPanelInputConsumed).
|
|
207
|
+
*/
|
|
208
|
+
handlePanelIntegrationAction(_key: string, ctx: PanelIntegrationContext): boolean {
|
|
209
|
+
let consumed = false;
|
|
210
|
+
if (this.pendingCommand) {
|
|
211
|
+
const { name, args } = this.pendingCommand;
|
|
212
|
+
this.pendingCommand = null;
|
|
213
|
+
void ctx.executeCommand?.(name, args);
|
|
214
|
+
consumed = true;
|
|
215
|
+
}
|
|
216
|
+
if (this.pendingOpenPanels) {
|
|
217
|
+
const openPanels = this.pendingOpenPanels;
|
|
218
|
+
this.pendingOpenPanels = null;
|
|
219
|
+
for (const panelId of openPanels) ctx.panelManager.open(panelId);
|
|
220
|
+
consumed = true;
|
|
221
|
+
}
|
|
222
|
+
return consumed;
|
|
223
|
+
}
|
|
224
|
+
|
|
170
225
|
render(width: number, height: number): Line[] {
|
|
171
226
|
if (height <= 0 || width <= 0) return [];
|
|
172
227
|
const intro = 'Browse, search, resume, and prune saved conversations.';
|
|
@@ -196,7 +251,7 @@ export class SessionBrowserPanel extends BasePanel {
|
|
|
196
251
|
hints.push({ keys: 'type', label: 'filter' }, { keys: 'Esc/Enter', label: 'apply' });
|
|
197
252
|
} else {
|
|
198
253
|
hints.push({ keys: '/', label: this.searchQuery ? 'edit search' : 'search' });
|
|
199
|
-
if (hasSelection) hints.push({ keys: 'Enter', label: 'resume' }, { keys: 'd', label: 'delete' });
|
|
254
|
+
if (hasSelection) hints.push({ keys: 'Enter', label: 'resume' }, { keys: 'x', label: 'run next step' }, { keys: 'd', label: 'delete' });
|
|
200
255
|
hints.push({ keys: 'r', label: 'refresh' });
|
|
201
256
|
}
|
|
202
257
|
const footerLines = [
|
|
@@ -285,7 +340,7 @@ export class SessionBrowserPanel extends BasePanel {
|
|
|
285
340
|
...formatReturnContextLines(selected.returnContext).map((line) =>
|
|
286
341
|
buildPanelLine(width, [[' ', DEFAULT_PANEL_PALETTE.dim], [truncateDisplay(line, Math.max(0, width - 2)), DEFAULT_PANEL_PALETTE.dim]])
|
|
287
342
|
),
|
|
288
|
-
buildPanelLine(width, [[' Next ', DEFAULT_PANEL_PALETTE.label], [selected
|
|
343
|
+
buildPanelLine(width, [[' Next ', DEFAULT_PANEL_PALETTE.label], [this._computeNextStepCommand(selected), DEFAULT_PANEL_PALETTE.dim], [' (x to run)', DEFAULT_PANEL_PALETTE.dim]]),
|
|
289
344
|
],
|
|
290
345
|
}
|
|
291
346
|
: { title: 'Selected', lines: [] };
|
|
@@ -389,9 +444,25 @@ export class SessionBrowserPanel extends BasePanel {
|
|
|
389
444
|
private _resume(): void {
|
|
390
445
|
const sess = this.filtered[this.cursorIndex];
|
|
391
446
|
if (!sess) return;
|
|
447
|
+
if (sess.returnContext?.openPanels?.length) {
|
|
448
|
+
this.pendingOpenPanels = [...sess.returnContext.openPanels];
|
|
449
|
+
}
|
|
392
450
|
this.resumeSession?.(sess.name);
|
|
393
451
|
}
|
|
394
452
|
|
|
453
|
+
/** The next-step command shown in the 'Selected' section and dispatched by 'x'. */
|
|
454
|
+
private _computeNextStepCommand(sess: SessionInfo): string {
|
|
455
|
+
const runner = sess.returnContext?.remoteRunners?.[0];
|
|
456
|
+
return runner ? `/remote recover ${runner}` : `/session resume ${sess.name}`;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
private _dispatchNextStep(): void {
|
|
460
|
+
const sess = this.filtered[this.cursorIndex];
|
|
461
|
+
if (!sess) return;
|
|
462
|
+
const parsed = parseCommand(this._computeNextStepCommand(sess));
|
|
463
|
+
if (parsed) this.pendingCommand = parsed;
|
|
464
|
+
}
|
|
465
|
+
|
|
395
466
|
private _promptDelete(): void {
|
|
396
467
|
const sess = this.filtered[this.cursorIndex];
|
|
397
468
|
if (!sess) return;
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Session maintenance types
|
|
2
|
+
* Session maintenance types.
|
|
3
3
|
*
|
|
4
4
|
* The canonical evaluator is the SDK version exported from @/runtime/index.ts
|
|
5
5
|
* (via operations.evaluateSessionMaintenance), which reads from configManager.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* - A thin local evaluator kept in sync with the SDK signature so panel code
|
|
10
|
-
* that passes configManager has a coherent call site.
|
|
6
|
+
* Import the evaluator from there — this module provides only the shared
|
|
7
|
+
* Panel* type surface used across TUI panels and tests; it intentionally does
|
|
8
|
+
* not re-implement the evaluator.
|
|
11
9
|
*/
|
|
12
10
|
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
13
|
-
import { computeContextUsage } from '../core/context-usage.ts';
|
|
14
11
|
|
|
15
12
|
export type PanelGuidanceMode = 'off' | 'minimal' | 'guided';
|
|
16
13
|
export type PanelSessionMaintenanceLevel = 'stable' | 'watch' | 'suggest-compact' | 'compacting' | 'needs-repair' | 'unknown';
|
|
@@ -59,118 +56,3 @@ export interface PanelSessionMaintenanceStatus {
|
|
|
59
56
|
readonly lastCompactedAt?: number;
|
|
60
57
|
readonly compactRecommended: boolean;
|
|
61
58
|
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Evaluate session maintenance from config-driven thresholds.
|
|
65
|
-
*
|
|
66
|
-
* behavior.autoCompactThreshold (percent integer, SDK schema range [10, 100], default 80):
|
|
67
|
-
* - [10, 100] → threshold at that percent; autoCompactEnabled = true.
|
|
68
|
-
* - 0 (defensive fallback for null/missing config only; not a valid schema value).
|
|
69
|
-
*
|
|
70
|
-
* NOTE: The SDK's evaluateSessionMaintenance (from @/runtime/index.ts) is the
|
|
71
|
-
* canonical implementation used in production. This local version exists so
|
|
72
|
-
* panel tests can import types without crossing the SDK boundary.
|
|
73
|
-
*/
|
|
74
|
-
export function evaluateSessionMaintenance(input: PanelSessionMaintenanceInput): PanelSessionMaintenanceStatus {
|
|
75
|
-
const guidanceMode: PanelGuidanceMode = (input.configManager.get('behavior.guidanceMode') as PanelGuidanceMode | undefined) ?? 'minimal';
|
|
76
|
-
const rawThreshold = Number(input.configManager.get('behavior.autoCompactThreshold') ?? 0);
|
|
77
|
-
const thresholdPct = Math.max(0, Number.isFinite(rawThreshold) ? rawThreshold : 0);
|
|
78
|
-
const autoCompactEnabled = thresholdPct > 0;
|
|
79
|
-
|
|
80
|
-
const { pct: usagePct, remaining: remainingTokens } = computeContextUsage(input.currentTokens, input.contextWindow);
|
|
81
|
-
const sessionMemoryCount = Math.max(0, input.sessionMemoryCount ?? 0);
|
|
82
|
-
const compactionCount = Math.max(0, input.session?.lineage?.filter((entry) => entry.branchReason === 'compaction').length ?? 0);
|
|
83
|
-
const lastCompactedAt = input.session?.lastCompactedAt;
|
|
84
|
-
const messageCount = Math.max(0, input.messageCount ?? 0);
|
|
85
|
-
const staleByMessageGrowth = (input.session?.compactionMessageCount ?? 0) > 0
|
|
86
|
-
? messageCount - (input.session?.compactionMessageCount ?? 0) >= 12
|
|
87
|
-
: messageCount >= 24;
|
|
88
|
-
|
|
89
|
-
if (input.contextWindow <= 0) {
|
|
90
|
-
return {
|
|
91
|
-
level: 'unknown',
|
|
92
|
-
summary: 'Context window unavailable.',
|
|
93
|
-
reasons: ['Current model does not expose a known context limit yet.'],
|
|
94
|
-
nextSteps: ['/provider', '/context'],
|
|
95
|
-
guidanceMode,
|
|
96
|
-
usagePct,
|
|
97
|
-
remainingTokens,
|
|
98
|
-
thresholdPct,
|
|
99
|
-
autoCompactEnabled,
|
|
100
|
-
sessionMemoryCount,
|
|
101
|
-
compactionCount,
|
|
102
|
-
lastCompactedAt,
|
|
103
|
-
compactRecommended: false,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (input.session?.compactionState === 'failed') {
|
|
108
|
-
return {
|
|
109
|
-
level: 'needs-repair',
|
|
110
|
-
summary: 'Compaction needs operator repair.',
|
|
111
|
-
reasons: ['Compaction failed and the session may need manual recovery.'],
|
|
112
|
-
nextSteps: ['/compact', '/health review'],
|
|
113
|
-
guidanceMode,
|
|
114
|
-
usagePct,
|
|
115
|
-
remainingTokens,
|
|
116
|
-
thresholdPct,
|
|
117
|
-
autoCompactEnabled,
|
|
118
|
-
sessionMemoryCount,
|
|
119
|
-
compactionCount,
|
|
120
|
-
lastCompactedAt,
|
|
121
|
-
compactRecommended: true,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const reasons: string[] = [];
|
|
126
|
-
const nextSteps: string[] = [];
|
|
127
|
-
let summary = 'Session maintenance is stable.';
|
|
128
|
-
let compactRecommended = false;
|
|
129
|
-
let level: PanelSessionMaintenanceLevel = 'stable';
|
|
130
|
-
|
|
131
|
-
const atThreshold = autoCompactEnabled ? usagePct >= thresholdPct : usagePct >= 80;
|
|
132
|
-
if (atThreshold || remainingTokens <= 15_000) {
|
|
133
|
-
level = 'suggest-compact';
|
|
134
|
-
summary = `Compact now to recover context headroom (${usagePct}% used).`;
|
|
135
|
-
reasons.push(`Context pressure is high at ${usagePct}% usage.`);
|
|
136
|
-
nextSteps.push('/compact', '/panel tokens');
|
|
137
|
-
compactRecommended = true;
|
|
138
|
-
} else if (usagePct >= Math.max(70, autoCompactEnabled ? thresholdPct - 10 : 70) || staleByMessageGrowth) {
|
|
139
|
-
level = 'watch';
|
|
140
|
-
summary = staleByMessageGrowth
|
|
141
|
-
? `Conversation has grown ${messageCount.toLocaleString()} messages since the last maintenance checkpoint.`
|
|
142
|
-
: `Watch context growth (${usagePct}% used, threshold ${thresholdPct}%).`;
|
|
143
|
-
reasons.push(staleByMessageGrowth
|
|
144
|
-
? `Conversation has grown ${messageCount.toLocaleString()} messages since the last maintenance checkpoint.`
|
|
145
|
-
: `Context usage is climbing toward the ${thresholdPct > 0 ? `${thresholdPct}% auto-compact threshold` : 'maintenance band'}.`);
|
|
146
|
-
nextSteps.push('/panel tokens');
|
|
147
|
-
} else {
|
|
148
|
-
reasons.push('Context pressure is currently within the stable operating band.');
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (sessionMemoryCount > 0) {
|
|
152
|
-
reasons.push(`${sessionMemoryCount} pinned session memor${sessionMemoryCount === 1 ? 'y is' : 'ies are'} preserved during compaction.`);
|
|
153
|
-
}
|
|
154
|
-
if (compactionCount > 0) {
|
|
155
|
-
reasons.push(`Last compaction ran ${lastCompactedAt ? new Date(lastCompactedAt).toISOString() : 'recently'}.`);
|
|
156
|
-
}
|
|
157
|
-
if (!autoCompactEnabled) {
|
|
158
|
-
reasons.push('Auto-compaction is disabled; maintenance stays fully manual.');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return {
|
|
162
|
-
level,
|
|
163
|
-
summary,
|
|
164
|
-
reasons,
|
|
165
|
-
nextSteps,
|
|
166
|
-
guidanceMode,
|
|
167
|
-
usagePct,
|
|
168
|
-
remainingTokens,
|
|
169
|
-
thresholdPct,
|
|
170
|
-
autoCompactEnabled,
|
|
171
|
-
sessionMemoryCount,
|
|
172
|
-
compactionCount,
|
|
173
|
-
lastCompactedAt,
|
|
174
|
-
compactRecommended,
|
|
175
|
-
};
|
|
176
|
-
}
|