Skip to content

Commit a931561

Browse files
committed
fix(web): match reference mode and settings controls
1 parent 583eed8 commit a931561

46 files changed

Lines changed: 120 additions & 1028 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/pythinker-web/src/App.vue

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ const statusPanelThinking = computed<ThinkingLevel>(() => {
137137
return effectiveThinkingLevel(model, client.thinking.value);
138138
});
139139
140-
// First-run onboarding (language + welcome greeting). Shown until the user
140+
// First-run onboarding. Shown until the user
141141
// finishes it once; re-openable from the settings popover.
142142
const showOnboarding = ref(!client.onboarded.value);
143143
function completeOnboarding(): void {
@@ -774,7 +774,6 @@ function openPr(url: string): void {
774774
:status="client.status.value"
775775
:thinking="client.thinking.value"
776776
:plan-mode="client.planMode.value"
777-
:dynamic-workflow-mode="client.dynamicWorkflowMode.value"
778777
:goal-mode="client.goalMode.value"
779778
:models="client.models.value"
780779
:starred-ids="client.starredModelIds.value"
@@ -823,7 +822,6 @@ function openPr(url: string): void {
823822
@set-permission="client.setPermission($event)"
824823
@set-thinking="client.setThinking($event)"
825824
@toggle-plan="client.togglePlanMode()"
826-
@toggle-dynamic_workflow="client.toggleDynamicWorkflowMode()"
827825
@toggle-goal="client.toggleGoalMode()"
828826
@create-goal="client.createGoal($event)"
829827
@control-goal="client.controlGoal($event)"
@@ -1007,7 +1005,6 @@ function openPr(url: string): void {
10071005
:status="client.status.value"
10081006
:thinking="statusPanelThinking"
10091007
:plan-mode="client.planMode.value"
1010-
:dynamic-workflow-mode="client.dynamicWorkflowMode.value"
10111008
:cost-usd="client.sessionCost.value"
10121009
@close="showStatusPanel = false"
10131010
/>
@@ -1028,7 +1025,7 @@ function openPr(url: string): void {
10281025
<GlobalLoading v-if="!client.initialized.value" :issue="client.connectIssue.value" />
10291026
</Transition>
10301027

1031-
<!-- First-run onboarding overlay (language + welcome greeting). Held back
1028+
<!-- First-run onboarding overlay. Held back
10321029
until the first load settled so it can't cover the connecting splash
10331030
(it teleports to <body> and would float above the retry error). -->
10341031
<Onboarding
@@ -1075,7 +1072,6 @@ function openPr(url: string): void {
10751072
:thinking="client.thinking.value"
10761073
:models="client.models.value"
10771074
:plan-mode="client.planMode.value"
1078-
:dynamic-workflow-mode="client.dynamicWorkflowMode.value"
10791075
:color-scheme="client.colorScheme.value"
10801076
:ui-font-size="client.uiFontSize.value"
10811077
:auth-ready="client.authReady.value"
@@ -1084,7 +1080,6 @@ function openPr(url: string): void {
10841080
@pick-model="openModelPicker()"
10851081
@set-thinking="client.setThinking($event)"
10861082
@toggle-plan="client.togglePlanMode()"
1087-
@toggle-dynamic_workflow="client.toggleDynamicWorkflowMode()"
10881083
@set-permission="client.setPermission($event)"
10891084
@set-color-scheme="client.setColorScheme($event)"
10901085
@set-ui-font-size="client.setUiFontSize($event)"

apps/pythinker-web/src/components/chat/ChatDock.vue

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ const props = defineProps<{
3131
status: ConversationStatus;
3232
thinking?: ThinkingLevel;
3333
planMode?: boolean;
34-
dynamicWorkflowMode?: boolean;
3534
goalMode?: boolean;
3635
activationBadges?: ActivationBadges;
3736
models?: AppModel[];
@@ -64,13 +63,11 @@ const emit = defineEmits<{
6463
setPermission: [mode: PermissionMode];
6564
setThinking: [level: ThinkingLevel];
6665
togglePlan: [];
67-
toggleDynamicWorkflow: [];
6866
toggleGoal: [];
6967
openBtw: [];
7068
createGoal: [objective: string];
7169
controlGoal: [action: 'pause' | 'resume' | 'cancel'];
7270
focusGoal: [];
73-
focusDynamicWorkflow: [];
7471
compact: [];
7572
pickModel: [];
7673
selectModel: [modelId: string];
@@ -274,7 +271,6 @@ defineExpose({ loadForEdit, loadAttachmentsForEdit, focus });
274271
:status="status"
275272
:thinking="thinking"
276273
:plan-mode="planMode"
277-
:dynamic-workflow-mode="dynamicWorkflowMode"
278274
:goal-mode="goalMode"
279275
:goal="goal"
280276
:activation-badges="activationBadges"
@@ -289,13 +285,11 @@ defineExpose({ loadForEdit, loadAttachmentsForEdit, focus });
289285
@set-permission="emit('setPermission', $event)"
290286
@set-thinking="emit('setThinking', $event)"
291287
@toggle-plan="emit('togglePlan')"
292-
@toggle-dynamic_workflow="emit('toggleDynamicWorkflow')"
293288
@toggle-goal="emit('toggleGoal')"
294289
@open-btw="emit('openBtw')"
295290
@create-goal="emit('createGoal', $event)"
296291
@control-goal="emit('controlGoal', $event)"
297292
@focus-goal="emit('focusGoal')"
298-
@focus-dynamic_workflow="emit('focusDynamicWorkflow')"
299293
@compact="emit('compact')"
300294
@pick-model="emit('pickModel')"
301295
@select-model="emit('selectModel', $event)"

apps/pythinker-web/src/components/chat/Composer.vue

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ const props = withDefaults(defineProps<{
5353
status?: ConversationStatus;
5454
thinking?: ThinkingLevel;
5555
planMode?: boolean;
56-
dynamicWorkflowMode?: boolean;
5756
goalMode?: boolean;
5857
goal?: AppGoal | null;
5958
activationBadges?: ActivationBadges;
@@ -96,13 +95,11 @@ const emit = defineEmits<{
9695
setPermission: [mode: PermissionMode];
9796
setThinking: [level: ThinkingLevel];
9897
togglePlan: [];
99-
toggleDynamicWorkflow: [];
10098
toggleGoal: [];
10199
openBtw: [];
102100
createGoal: [objective: string];
103101
controlGoal: [action: 'pause' | 'resume' | 'cancel'];
104102
focusGoal: [];
105-
focusDynamicWorkflow: [];
106103
compact: [];
107104
pickModel: [];
108105
selectModel: [modelId: string];
@@ -669,23 +666,20 @@ function thinkingSegmentLabel(segment: string): string {
669666
670667
// Plan toggle
671668
const planOn = computed(() => props.planMode === true);
672-
const dynamicWorkflowOn = computed(() => props.dynamicWorkflowMode === true);
673669
const goalStatus = computed(() => props.goal?.status ?? props.activationBadges?.goal?.status ?? null);
674670
const goalActive = computed(() => goalStatus.value !== null && goalStatus.value !== 'complete');
675671
const goalArmed = computed(() => goalActive.value || props.goalMode === true);
676672
const goalCanPause = computed(() => goalStatus.value === 'active');
677673
const goalCanResume = computed(() => goalStatus.value === 'paused' || goalStatus.value === 'blocked');
678674
679-
// Modes selector (plan / goal / dynamic_workflow) — the popover that replaces the bare
680-
// "plan" pill. Plan/DynamicWorkflow are real client toggles; goal reflects agent-driven
681-
// state and focuses its card when active.
675+
// Modes selector for plan and goal state.
682676
const modesOpen = ref(false);
683677
const modesRef = ref<HTMLElement | null>(null);
684678
const modesMenuRef = ref<HTMLElement | null>(null);
685679
// The menu is position:fixed (so no composer stacking context can paint over
686680
// it); these coords anchor it just above the pill, computed on open.
687681
const modesMenuStyle = ref<Record<string, string>>({});
688-
const anyModeActive = computed(() => planOn.value || dynamicWorkflowOn.value || goalArmed.value);
682+
const anyModeActive = computed(() => planOn.value || goalArmed.value);
689683
function closeModes(): void {
690684
modesOpen.value = false;
691685
document.removeEventListener('mousedown', onModesDocClick);
@@ -719,7 +713,7 @@ const PERM_MODES: { mode: PermissionMode; color: string; labelKey: string; descK
719713
{ mode: 'yolo', color: 'var(--color-warning)', labelKey: 'status.permissionYolo', descKey: 'status.permissionYoloDesc' },
720714
{ mode: 'auto', color: 'var(--color-danger)', labelKey: 'status.permissionAuto', descKey: 'status.permissionAutoDesc' },
721715
];
722-
const MODE_DESC_KEYS = ['status.planDesc', 'status.dynamicWorkflowDesc', 'status.goalDesc'] as const;
716+
const MODE_DESC_KEYS = ['status.planDesc', 'status.goalDesc'] as const;
723717
724718
const menuMeasureRef = ref<HTMLElement | null>(null);
725719
const permissionDescriptionWidth = ref('');
@@ -998,7 +992,7 @@ function selectModel(modelId: string): void {
998992
</button>
999993
</div>
1000994

1001-
<!-- Modes selector (plan / goal / dynamic_workflow) — replaces the plan pill. -->
995+
<!-- Modes selector for plan and goal state. -->
1002996
<div v-if="status" ref="modesRef" class="modes">
1003997
<button
1004998
type="button"
@@ -1008,7 +1002,6 @@ function selectModel(modelId: string): void {
10081002
>
10091003
<span class="mode-label">{{ t('status.modesLabel') }}</span>
10101004
<span v-if="planOn" class="mode-tag">{{ t('status.planLabel') }}</span>
1011-
<span v-if="dynamicWorkflowOn" class="mode-tag">{{ t('status.dynamicWorkflowLabel') }}</span>
10121005
<span v-if="goalArmed" class="mode-tag">{{ t('status.goalLabel') }}</span>
10131006
</button>
10141007

@@ -1022,15 +1015,6 @@ function selectModel(modelId: string): void {
10221015
</span>
10231016
<span class="mode-switch" :class="{ on: planOn }"><span class="mode-knob" /></span>
10241017
</button>
1025-
<!-- DynamicWorkflow — functional client toggle -->
1026-
<button type="button" class="mode-row" :class="{ on: dynamicWorkflowOn }" role="menuitem" @click="emit('toggleDynamicWorkflow')">
1027-
<span class="mode-row-icon"><Icon name="sparkles" size="sm" /></span>
1028-
<span class="mode-row-info">
1029-
<span class="mode-row-name">{{ t('status.dynamicWorkflowLabel') }}</span>
1030-
<span class="mode-row-desc">{{ t('status.dynamicWorkflowDesc') }}</span>
1031-
</span>
1032-
<span class="mode-switch" :class="{ on: dynamicWorkflowOn }"><span class="mode-knob" /></span>
1033-
</button>
10341018
<!-- Goal — lifecycle controls when active; switch is on when active or armed. -->
10351019
<div class="mode-row mode-row-goal" :class="{ on: goalActive || props.goalMode }">
10361020
<button
@@ -1902,7 +1886,7 @@ function selectModel(modelId: string): void {
19021886
}
19031887
19041888
/* Toggle pills (Thinking / Plan) */
1905-
/* Modes selector (plan / goal / dynamic_workflow) — replaces the old plan pill + badges.
1889+
/* Modes selector for plan and goal state.
19061890
z-index lifts the whole control (incl. its upward-opening menu) above the
19071891
composer input row, which otherwise paints over the menu. */
19081892
.modes { position: relative; display: inline-flex; z-index: var(--z-sticky); }

apps/pythinker-web/src/components/chat/ConversationPane.vue

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ const props = defineProps<{
3232
status: ConversationStatus;
3333
thinking?: ThinkingLevel;
3434
planMode?: boolean;
35-
dynamicWorkflowMode?: boolean;
3635
goalMode?: boolean;
3736
questions?: UIQuestion[];
3837
/** Question ids with an in-flight respond/dismiss (drives the card loading
@@ -112,7 +111,6 @@ const emit = defineEmits<{
112111
setPermission: [mode: PermissionMode];
113112
setThinking: [level: ThinkingLevel];
114113
togglePlan: [];
115-
toggleDynamicWorkflow: [];
116114
toggleGoal: [];
117115
createGoal: [objective: string];
118116
controlGoal: [action: 'pause' | 'resume' | 'cancel'];
@@ -1377,7 +1375,6 @@ defineExpose({ loadComposerForEdit, focusComposer });
13771375
:status="status"
13781376
:thinking="thinking"
13791377
:plan-mode="planMode"
1380-
:dynamic-workflow-mode="dynamicWorkflowMode"
13811378
:goal-mode="goalMode"
13821379
:goal="goal"
13831380
:activation-badges="activationBadges"
@@ -1395,7 +1392,6 @@ defineExpose({ loadComposerForEdit, focusComposer });
13951392
@set-permission="emit('setPermission', $event)"
13961393
@set-thinking="emit('setThinking', $event)"
13971394
@toggle-plan="emit('togglePlan')"
1398-
@toggle-dynamic_workflow="emit('toggleDynamicWorkflow')"
13991395
@toggle-goal="emit('toggleGoal')"
14001396
@open-btw="emit('command', '/btw')"
14011397
@create-goal="emit('createGoal', $event)"
@@ -1453,7 +1449,6 @@ defineExpose({ loadComposerForEdit, focusComposer });
14531449
:status="status"
14541450
:thinking="thinking"
14551451
:plan-mode="planMode"
1456-
:dynamic-workflow-mode="dynamicWorkflowMode"
14571452
:goal-mode="goalMode"
14581453
:activation-badges="activationBadges"
14591454
:models="models"
@@ -1489,7 +1484,6 @@ defineExpose({ loadComposerForEdit, focusComposer });
14891484
@set-permission="emit('setPermission', $event)"
14901485
@set-thinking="emit('setThinking', $event)"
14911486
@toggle-plan="emit('togglePlan')"
1492-
@toggle-dynamic_workflow="emit('toggleDynamicWorkflow')"
14931487
@toggle-goal="emit('toggleGoal')"
14941488
@open-btw="emit('command', '/btw')"
14951489
@create-goal="emit('createGoal', $event)"

apps/pythinker-web/src/components/chat/StatusPanel.vue

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ const props = defineProps<{
1515
status: ConversationStatus;
1616
thinking: ThinkingLevel;
1717
planMode: boolean;
18-
dynamicWorkflowMode?: boolean;
1918
/** Cumulative session cost in USD, when known (>= 0). */
2019
costUsd?: number;
2120
}>();
@@ -61,7 +60,6 @@ const permColor = computed(() => {
6160
});
6261
6362
const planText = computed(() => (props.planMode ? t('status.planOn') : t('status.planOff')));
64-
const dynamicWorkflowText = computed(() => (props.dynamicWorkflowMode ? t('status.dynamicWorkflowOn') : t('status.dynamicWorkflowOff')));
6563
6664
const showCost = computed(() => typeof props.costUsd === 'number' && props.costUsd > 0);
6765
const costText = computed(() =>
@@ -88,10 +86,6 @@ const costText = computed(() =>
8886
<dt>{{ t('status.statusPlanMode') }}</dt>
8987
<dd :class="{ 'plan-on': planMode }">{{ planText }}</dd>
9088
</div>
91-
<div class="row">
92-
<dt>{{ t('status.statusDynamicWorkflowMode') }}</dt>
93-
<dd :class="{ 'dynamic-workflow-on': dynamicWorkflowMode }">{{ dynamicWorkflowText }}</dd>
94-
</div>
9589
<div class="row">
9690
<dt>{{ t('status.statusContext') }}</dt>
9791
<dd>
@@ -137,7 +131,6 @@ const costText = computed(() =>
137131
min-width: 0;
138132
}
139133
.row dd.plan-on { color: var(--color-accent); }
140-
.row dd.dynamic-workflow-on { color: var(--color-accent); }
141134
142135
.ctx-text { flex: none; }
143136
.bar {

0 commit comments

Comments
 (0)