@agimon-ai/po-web-dashboard 0.0.0-alpha.95 → 0.0.0-alpha.97
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/dist/web/features/selection/SelectionBar.cjs +15 -3
- package/dist/web/features/selection/SelectionBar.cjs.map +1 -1
- package/dist/web/features/selection/SelectionBar.d.mts.map +1 -1
- package/dist/web/features/selection/SelectionBar.mjs +16 -4
- package/dist/web/features/selection/SelectionBar.mjs.map +1 -1
- package/dist/web/lib/sessionModel.cjs +10 -1
- package/dist/web/lib/sessionModel.cjs.map +1 -1
- package/dist/web/lib/sessionModel.d.mts +4 -0
- package/dist/web/lib/sessionModel.d.mts.map +1 -1
- package/dist/web/lib/sessionModel.mjs +10 -1
- package/dist/web/lib/sessionModel.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -36,10 +36,18 @@ function AxisMenu({ menu, dialog, values = [], multiple = false }) {
|
|
|
36
36
|
const items = dialog.options.map((option, index) => {
|
|
37
37
|
const clean = menu === "mode" || multiple ? option.replace(/^\[[ x]\]\s*/, "") : option;
|
|
38
38
|
const separator = menu === "mode" ? clean.indexOf(":") : -1;
|
|
39
|
+
const description = dialog.descriptions?.[index] || void 0;
|
|
40
|
+
const title = separator < 0 ? clean : clean.slice(0, separator);
|
|
41
|
+
const face = menu === "profile" && option !== "None";
|
|
39
42
|
return {
|
|
40
43
|
value: multiple ? clean : option,
|
|
41
|
-
title
|
|
42
|
-
subtitle: separator < 0 ?
|
|
44
|
+
title,
|
|
45
|
+
subtitle: separator < 0 ? description : clean.slice(separator + 1).trim(),
|
|
46
|
+
...face ? { lead: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_agimon_ai_po_web_components.AgentAvatar, {
|
|
47
|
+
name: title,
|
|
48
|
+
image: dialog.icons?.[index] || void 0,
|
|
49
|
+
size: "sm"
|
|
50
|
+
}) } : {},
|
|
43
51
|
props: { "data-testid": `dialog-option-${index}` }
|
|
44
52
|
};
|
|
45
53
|
});
|
|
@@ -258,7 +266,11 @@ function SelectionBar() {
|
|
|
258
266
|
const [minorOpen, setMinorOpen] = (0, react.useState)(false);
|
|
259
267
|
const [modelOpen, setModelOpen] = (0, react.useState)(false);
|
|
260
268
|
const selection = require_statusLine.parseSelection(raw);
|
|
261
|
-
const
|
|
269
|
+
const profileIdentity = require_sessionStore.useActiveSession((state) => state.profileIdentity);
|
|
270
|
+
const axes = require_composition.selectionAxes(statuses).map((axis) => axis.name === "profile" && profileIdentity?.name && axis.values[0] === profileIdentity.profile ? {
|
|
271
|
+
...axis,
|
|
272
|
+
values: [profileIdentity.name]
|
|
273
|
+
} : axis);
|
|
262
274
|
const modes = require_composition.minorModes(statuses, widgets, catalog);
|
|
263
275
|
const activeMinors = modes.filter((mode) => mode.availability === "on");
|
|
264
276
|
const reportedAgentCost = Number(statuses[AGENT_COST_STATUS_KEY] ?? "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionBar.cjs","names":["PickerContent","answerDialogValue","cancelDialog","Popover","PopoverAnchor","Button","Spinner","ChevronDownIcon","Kbd","sessionsStore","cn","selectFastMode","useStore","useActiveSession","menuStore","useState","parseSelection","selectionAxes","minorModes","buttonVariants","PopoverTrigger","PluginSurface","HOST_SLOTS"],"sources":["../../../../src/web/features/selection/SelectionBar.tsx"],"sourcesContent":["import {\n Button,\n buttonVariants,\n ChevronDownIcon,\n cn,\n Kbd,\n PickerContent,\n type PickerItem,\n Popover,\n PopoverAnchor,\n PopoverTrigger,\n Spinner,\n} from '@agimon-ai/po-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useState } from 'react';\n\nimport { PluginSurface } from '../../components/PluginSurface';\nimport { minorModes, type MinorMode, selectionAxes } from '../../lib/composition';\nimport { HOST_SLOTS } from '../../lib/pluginRegistry';\nimport { focusPrompt } from '../../lib/promptFocus';\nimport type { AgentInfo, DialogRequest, ModelChoice } from '../../lib/sessionModel';\nimport { parseSelection } from '../../lib/statusLine';\nimport { menuStore, setPendingMenu } from '../../stores/menuStore';\nimport { sessionsStore } from '../../stores/sessionsStore';\nimport {\n answerDialogValue,\n cancelDialog,\n loadModelChoices,\n runCommand,\n selectModel,\n selectThinkingLevel,\n selectFastMode,\n useActiveSession,\n} from '../../stores/sessionStore';\nimport { setDockOpen, setDockTab } from '../../stores/uiStore';\n\n// Category marks carry colour as a label underline; button geometry stays the same.\nconst AXIS_MARK = 'underline decoration-2 underline-offset-4';\nconst AXIS_TONE: Readonly<Record<string, string>> = {\n mode: 'decoration-po-blue',\n profile: 'decoration-po-magenta',\n domains: 'decoration-po-violet',\n minor: 'decoration-po-teal',\n model: 'decoration-po-cyan',\n};\n\nconst MENU_TITLE: Readonly<Record<string, string>> = {\n mode: 'Major mode',\n profile: 'Profile',\n domains: 'Domains',\n minor: 'Minor modes',\n};\n\nconst DOMAIN_SELECTION_KIND = 'po-domains-selection';\nconst DOMAIN_SELECTION_VERSION = 1;\n\n/** Team runs bill to their own sessions, so their spend arrives as a named status. */\nconst AGENT_COST_STATUS_KEY = 'po-team-cost';\n\n/** Adapt the agent's string-valued dialog without changing its single-choice replies. */\nfunction AxisMenu({\n menu,\n dialog,\n values = [],\n multiple = false,\n}: {\n menu: string;\n dialog: DialogRequest;\n values?: readonly string[];\n multiple?: boolean;\n}) {\n const title = MENU_TITLE[menu] ?? menu;\n const items: PickerItem[] = dialog.options.map((option, index) => {\n const clean = menu === 'mode' || multiple ? option.replace(/^\\[[ x]\\]\\s*/, '') : option;\n const separator = menu === 'mode' ? clean.indexOf(':') : -1;\n return {\n value: multiple ? clean : option,\n title: separator < 0 ? clean : clean.slice(0, separator),\n subtitle: separator < 0 ? undefined : clean.slice(separator + 1).trim(),\n props: { 'data-testid': `dialog-option-${index}` },\n };\n });\n const marked = items.filter((_, index) => dialog.options[index].startsWith('[x]')).map((item) => item.value);\n const selected = dialog.options.some((option) => /^\\[[ x]\\]/.test(option))\n ? marked\n : items.filter((item) => values.includes(item.title)).map((item) => item.value);\n return (\n <PickerContent\n align=\"start\"\n data-testid=\"dialog\"\n data-dialog-method={dialog.method}\n data-dialog-menu={menu}\n title={<span data-testid=\"dialog-title\">{title}</span>}\n meta={multiple ? `${selected.length} active` : values.join(', ') || dialog.title}\n items={items}\n value={selected}\n multiple={multiple}\n filterable\n filterPlaceholder={`Filter ${menu === 'mode' ? 'major modes' : title.toLowerCase()}`}\n onSelect={(option) => answerDialogValue(dialog.id, option)}\n onApply={(domains) =>\n answerDialogValue(\n dialog.id,\n JSON.stringify({ kind: DOMAIN_SELECTION_KIND, version: DOMAIN_SELECTION_VERSION, domains }),\n )\n }\n onCancel={() => cancelDialog(dialog.id)}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n focusPrompt();\n }}\n />\n );\n}\n\n/** Asking an axis still goes through its slash command and claimed dialog. */\nfunction AxisButton({\n name,\n command,\n values,\n multi = false,\n sessionId,\n pending,\n claimedDialog,\n children,\n className,\n}: {\n name: string;\n command: string;\n values: readonly string[];\n multi?: boolean;\n sessionId: string | null;\n pending: boolean;\n claimedDialog: DialogRequest | null;\n children: React.ReactNode;\n className: string;\n}) {\n const open = claimedDialog !== null;\n // Other plugin axes keep their existing reply contract, even when set-valued.\n const domains = name === 'domains' && command.replace(/^\\//, '') === 'domains' && multi;\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n if (!next && claimedDialog) cancelDialog(claimedDialog.id);\n }}\n >\n <PopoverAnchor asChild>\n <Button\n data-testid={`axis-${name}`}\n data-pending={pending}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n title={\n pending\n ? `Asking the session for ${name}…`\n : `Change ${name}${values.length ? `: ${values.join(', ')}` : ''}`\n }\n onClick={() => {\n setPendingMenu(name);\n runCommand(command);\n }}\n className={className}\n >\n {children}\n {pending ? (\n <Spinner className=\"size-3 shrink-0\" />\n ) : (\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n )}\n </Button>\n </PopoverAnchor>\n {claimedDialog ? (\n <AxisMenu\n key={`${sessionId}:${claimedDialog.id}`}\n menu={name}\n dialog={claimedDialog}\n values={values}\n multiple={domains}\n />\n ) : null}\n </Popover>\n );\n}\n\n/** Minor modes are commands and workspace navigation, not drafted selections. */\nfunction MinorModesPopup({ modes, onClose }: { modes: MinorMode[]; onClose: () => void }) {\n const items: PickerItem[] = modes.map((mode) => ({\n value: mode.id,\n title: mode.name,\n disabledReason:\n mode.availability === 'unavailable' ? mode.unavailableReason || 'Unavailable in this session' : undefined,\n lead: <Kbd className=\"w-8 justify-center\">{mode.keys}</Kbd>,\n trail:\n mode.availability === 'unavailable' ? (\n <span data-testid={`minor-reason-${mode.name}`} className=\"sr-only\">\n {mode.unavailableReason}\n </span>\n ) : mode.detail ? (\n <span data-testid={`minor-detail-${mode.name}`} className=\"truncate\">\n {mode.detail}\n </span>\n ) : undefined,\n props: { 'data-testid': `minor-${mode.name}`, 'data-availability': mode.availability },\n }));\n const active = modes.filter((mode) => mode.availability === 'on').map((mode) => mode.id);\n return (\n <PickerContent\n align=\"start\"\n data-testid=\"minor-popup\"\n title=\"Minor modes\"\n meta={`${active.length} on`}\n items={items}\n value={active}\n actions\n filterable\n filterPlaceholder=\"Filter minor modes\"\n onSelect={(id) => {\n const mode = modes.find((item) => item.id === id);\n if (mode === undefined) return;\n if (mode.activityGroup !== undefined) {\n setDockOpen(true);\n setDockTab(sessionsStore.state.activeId, 'activity');\n } else {\n setPendingMenu('minor');\n runCommand(`/minor ${mode.id}${mode.toggle === undefined ? '' : ` ${mode.toggle}`}`);\n }\n onClose();\n }}\n />\n );\n}\n\n/** Model choices and their extra controls retain the existing RPC actions. */\nexport function ModelPopup({\n agent,\n models,\n levels,\n fastMode = false,\n onClose,\n}: {\n agent: AgentInfo | null;\n models: ModelChoice[];\n levels: string[];\n fastMode?: boolean;\n onClose: () => void;\n}) {\n useEffect(() => {\n loadModelChoices();\n }, []);\n const items: PickerItem[] = models.map((model) => ({\n value: `${model.provider}/${model.id}`,\n title: model.id,\n subtitle: model.name !== model.id ? model.name : undefined,\n lead: <span className=\"w-24 truncate text-sm text-po-dim\">{model.provider}</span>,\n trail: model.reasoning ? 'thinks' : undefined,\n props: {\n 'data-testid': `model-${model.provider}-${model.id}`,\n 'data-current': agent?.model === model.id && agent.provider === model.provider,\n },\n }));\n return (\n <PickerContent\n align=\"end\"\n data-testid=\"model-popup\"\n title=\"Model\"\n meta={agent ? `${agent.provider}/${agent.model}` : ''}\n items={items}\n value={agent ? [`${agent.provider}/${agent.model}`] : []}\n filterable\n filterPlaceholder=\"Filter models\"\n filterProps={{ 'data-testid': 'model-filter' }}\n loading={\n <>\n <Spinner label=\"asking the session for its models\" />\n asking the session for its models…\n </>\n }\n onSelect={(value) => {\n const model = models.find((item) => `${item.provider}/${item.id}` === value);\n if (model === undefined) return;\n selectModel(model.provider, model.id);\n onClose();\n }}\n footer={\n <>\n <div className=\"flex flex-wrap items-center gap-1 px-3 py-2\">\n <span className=\"mr-1 text-sm font-semibold text-po-dim\">Thinking</span>\n {levels.length === 0 ? <span className=\"text-sm text-po-dim\">…</span> : null}\n {levels.map((level) => {\n const current = agent?.thinkingLevel === level;\n return (\n <Button\n key={level}\n variant=\"ghost\"\n size=\"xs\"\n data-testid={`thinking-${level}`}\n data-current={current}\n onClick={() => {\n selectThinkingLevel(level);\n onClose();\n }}\n className={cn(current && 'bg-po-tint-green font-semibold text-po-green')}\n >\n {level}\n </Button>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2 border-t border-po-border-soft px-3 py-2\">\n <Button\n variant=\"ghost\"\n size=\"xs\"\n role=\"switch\"\n aria-label=\"Codex Fast\"\n aria-checked={agent?.provider === 'openai-codex' && fastMode}\n aria-describedby=\"codex-fast-description\"\n data-testid=\"fast-toggle\"\n disabled={agent?.provider !== 'openai-codex'}\n onClick={() => selectFastMode(!fastMode)}\n className={cn(agent?.provider === 'openai-codex' && fastMode && 'bg-po-tint-green text-po-green')}\n >\n Fast {agent?.provider === 'openai-codex' && fastMode ? 'on' : 'off'}\n </Button>\n <span id=\"codex-fast-description\" className=\"text-sm text-po-dim\">\n {agent?.provider === 'openai-codex'\n ? 'Priority processing may cost more.'\n : 'Fast is available only for Codex.'}\n </span>\n </div>\n </>\n }\n />\n );\n}\n\n/** Session selection axes use the same popup presentation and trigger geometry. */\nexport function SelectionBar() {\n const activeId = useStore(sessionsStore, (state) => state.activeId);\n const raw = useActiveSession((state) => state.statuses['po-major-mode'] ?? '');\n const statuses = useActiveSession((state) => state.statuses);\n const widgets = useActiveSession((state) => state.widgets);\n const catalog = useActiveSession((state) => state.minorModes);\n const agent = useActiveSession((state) => state.agent);\n const stats = useActiveSession((state) => state.stats);\n const liveCost = useActiveSession((state) => state.liveCost);\n const models = useActiveSession((state) => state.models);\n const fastMode = useActiveSession((state) => state.fastMode);\n const thinkingLevels = useActiveSession((state) => state.thinkingLevels);\n const dialog = useActiveSession((state) => state.dialog);\n const pendingMenu = useStore(menuStore, (state) => state.pending);\n const claimed = useStore(menuStore, (state) => state.claimed);\n const [minorOpen, setMinorOpen] = useState(false);\n const [modelOpen, setModelOpen] = useState(false);\n\n const selection = parseSelection(raw);\n const axes = selectionAxes(statuses);\n const modes = minorModes(statuses, widgets, catalog);\n const activeMinors = modes.filter((mode) => mode.availability === 'on');\n\n const reportedAgentCost = Number(statuses[AGENT_COST_STATUS_KEY] ?? '');\n const agentCost = Number.isFinite(reportedAgentCost) ? reportedAgentCost : 0;\n const sessionCost = stats === null ? null : stats.cost + liveCost;\n /** The dialog this axis asked for, when the claim named it and it is still open. */\n const dialogFor = (name: string): DialogRequest | null =>\n dialog !== null && claimed !== null && claimed.dialogId === dialog.id && claimed.menu === name ? dialog : null;\n const minorDialog = dialogFor('minor');\n\n const axisClass = cn(\n buttonVariants({ variant: 'outline', size: 'lg' }),\n 'min-w-0 max-w-48 gap-1.5 px-3 font-sans font-medium text-po-text max-sm:min-w-24 max-sm:max-w-28 max-sm:flex-1 max-sm:basis-0 max-sm:shrink',\n );\n\n return (\n <footer\n data-testid=\"selection-bar\"\n data-pending={selection.pending}\n className=\"relative flex shrink-0 items-center gap-1.5 overflow-x-auto px-3 pb-3 [scrollbar-width:none] sm:gap-2 sm:px-5 [&::-webkit-scrollbar]:hidden\"\n >\n <AxisButton\n name=\"mode\"\n command=\"mode\"\n values={selection.majorMode ? [selection.majorMode] : []}\n sessionId={activeId}\n pending={pendingMenu === 'mode'}\n claimedDialog={dialogFor('mode')}\n className={cn(axisClass, 'max-sm:max-w-24')}\n >\n <span\n data-testid=\"selection-mode\"\n className={cn('min-w-0 truncate', AXIS_MARK, selection.pending ? 'decoration-po-yellow' : AXIS_TONE.mode)}\n >\n {selection.majorMode || 'Major mode'}\n </span>\n </AxisButton>\n\n {axes.map((axis) => (\n <AxisButton\n key={axis.name}\n name={axis.name}\n command={axis.command}\n values={axis.values.length === 0 && !axis.multi ? [axis.emptyLabel] : axis.values}\n multi={axis.multi}\n sessionId={activeId}\n pending={pendingMenu === axis.name}\n claimedDialog={dialogFor(axis.name)}\n className={axisClass}\n >\n <span\n data-testid={`selection-${axis.name}`}\n className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE[axis.name] ?? 'decoration-po-faint')}\n >\n {axis.values[0] ?? axis.emptyLabel}\n </span>\n {axis.values.length > 1 ? (\n <span data-testid={`selection-${axis.name}-more`} className=\"shrink-0 text-xs\">\n +{axis.values.length - 1}\n </span>\n ) : null}\n </AxisButton>\n ))}\n\n <Popover\n open={minorOpen || minorDialog !== null}\n onOpenChange={(next) => {\n if (next) {\n setMinorOpen(true);\n return;\n }\n if (minorDialog) cancelDialog(minorDialog.id);\n setMinorOpen(false);\n }}\n >\n <PopoverTrigger asChild>\n <Button\n data-testid=\"axis-minor\"\n title={`Minor modes${activeMinors.length ? `: ${activeMinors.map((mode) => mode.name).join(', ')}` : ''}`}\n className={cn(axisClass, 'max-sm:max-w-24')}\n >\n <span data-testid=\"minor-summary\" className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE.minor)}>\n {activeMinors[0]?.name ?? 'Minor modes'}\n </span>\n {activeMinors.length > 1 ? <span className=\"shrink-0 text-xs\">+{activeMinors.length - 1}</span> : null}\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n </Button>\n </PopoverTrigger>\n {minorDialog ? (\n <AxisMenu key={`${activeId}:${minorDialog.id}`} menu=\"minor\" dialog={minorDialog} />\n ) : minorOpen ? (\n <MinorModesPopup key={activeId} modes={modes} onClose={() => setMinorOpen(false)} />\n ) : null}\n </Popover>\n\n <PluginSurface slot={HOST_SLOTS.selectionBar} sessionId={activeId} />\n <div className=\"min-w-0 flex-1 max-sm:hidden\" />\n\n <Popover open={modelOpen} onOpenChange={setModelOpen}>\n <PopoverTrigger asChild>\n <Button\n data-testid=\"axis-model\"\n title={\n agent\n ? `${agent.provider}/${agent.model}${agent.thinkingLevel ? ` · ${agent.thinkingLevel}` : ''}`\n : 'Model and thinking level'\n }\n className={axisClass}\n >\n <span data-testid=\"agent-model\" className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE.model)}>\n {agent?.model ?? 'Model'}\n </span>\n <span data-testid=\"agent-thinking\" className=\"shrink-0 text-sm text-po-dim max-sm:hidden\">\n {agent?.thinkingLevel ?? ''}\n </span>\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n </Button>\n </PopoverTrigger>\n {modelOpen ? (\n <ModelPopup\n key={activeId}\n agent={agent}\n models={models}\n levels={thinkingLevels}\n fastMode={fastMode}\n onClose={() => setModelOpen(false)}\n />\n ) : null}\n </Popover>\n\n <span\n data-testid=\"top-context\"\n title={\n stats?.contextTokens != null && stats.contextWindow != null\n ? `${stats.contextTokens.toLocaleString()} of ${stats.contextWindow.toLocaleString()} tokens`\n : 'Context usage, once the session reports it'\n }\n className=\"shrink-0 text-sm text-po-dim max-sm:hidden\"\n >\n {stats?.contextPercent == null ? '' : `ctx ${Math.round(stats.contextPercent)}%`}\n </span>\n <span\n data-testid=\"top-cost\"\n title={\n stats === null || sessionCost === null\n ? ''\n : agentCost > 0\n ? `$${sessionCost.toFixed(2)} session + $${agentCost.toFixed(2)} agents, ${stats.totalTokens.toLocaleString()} tokens this session`\n : `${stats.totalTokens.toLocaleString()} tokens this session`\n }\n className=\"shrink-0 text-sm text-po-dim max-sm:hidden\"\n >\n {sessionCost === null ? '' : `$${(sessionCost + agentCost).toFixed(2)}`}\n </span>\n </footer>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectionBar.cjs","names":["AgentAvatar","PickerContent","answerDialogValue","cancelDialog","Popover","PopoverAnchor","Button","Spinner","ChevronDownIcon","Kbd","sessionsStore","cn","selectFastMode","useStore","useActiveSession","menuStore","useState","parseSelection","selectionAxes","minorModes","buttonVariants","PopoverTrigger","PluginSurface","HOST_SLOTS"],"sources":["../../../../src/web/features/selection/SelectionBar.tsx"],"sourcesContent":["import {\n AgentAvatar,\n Button,\n buttonVariants,\n ChevronDownIcon,\n cn,\n Kbd,\n PickerContent,\n type PickerItem,\n Popover,\n PopoverAnchor,\n PopoverTrigger,\n Spinner,\n} from '@agimon-ai/po-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useState } from 'react';\n\nimport { PluginSurface } from '../../components/PluginSurface';\nimport { minorModes, type MinorMode, selectionAxes } from '../../lib/composition';\nimport { HOST_SLOTS } from '../../lib/pluginRegistry';\nimport { focusPrompt } from '../../lib/promptFocus';\nimport type { AgentInfo, DialogRequest, ModelChoice } from '../../lib/sessionModel';\nimport { parseSelection } from '../../lib/statusLine';\nimport { menuStore, setPendingMenu } from '../../stores/menuStore';\nimport { sessionsStore } from '../../stores/sessionsStore';\nimport {\n answerDialogValue,\n cancelDialog,\n loadModelChoices,\n runCommand,\n selectModel,\n selectThinkingLevel,\n selectFastMode,\n useActiveSession,\n} from '../../stores/sessionStore';\nimport { setDockOpen, setDockTab } from '../../stores/uiStore';\n\n// Category marks carry colour as a label underline; button geometry stays the same.\nconst AXIS_MARK = 'underline decoration-2 underline-offset-4';\nconst AXIS_TONE: Readonly<Record<string, string>> = {\n mode: 'decoration-po-blue',\n profile: 'decoration-po-magenta',\n domains: 'decoration-po-violet',\n minor: 'decoration-po-teal',\n model: 'decoration-po-cyan',\n};\n\nconst MENU_TITLE: Readonly<Record<string, string>> = {\n mode: 'Major mode',\n profile: 'Profile',\n domains: 'Domains',\n minor: 'Minor modes',\n};\n\nconst DOMAIN_SELECTION_KIND = 'po-domains-selection';\nconst DOMAIN_SELECTION_VERSION = 1;\n\n/** Team runs bill to their own sessions, so their spend arrives as a named status. */\nconst AGENT_COST_STATUS_KEY = 'po-team-cost';\n\n/** Adapt the agent's string-valued dialog without changing its single-choice replies. */\nfunction AxisMenu({\n menu,\n dialog,\n values = [],\n multiple = false,\n}: {\n menu: string;\n dialog: DialogRequest;\n values?: readonly string[];\n multiple?: boolean;\n}) {\n const title = MENU_TITLE[menu] ?? menu;\n const items: PickerItem[] = dialog.options.map((option, index) => {\n const clean = menu === 'mode' || multiple ? option.replace(/^\\[[ x]\\]\\s*/, '') : option;\n const separator = menu === 'mode' ? clean.indexOf(':') : -1;\n const description = dialog.descriptions?.[index] || undefined;\n const title = separator < 0 ? clean : clean.slice(0, separator);\n // Every profile but None gets a face: its avatar when the request sent one, otherwise initials.\n const face = menu === 'profile' && option !== 'None';\n return {\n value: multiple ? clean : option,\n title,\n subtitle: separator < 0 ? description : clean.slice(separator + 1).trim(),\n ...(face ? { lead: <AgentAvatar name={title} image={dialog.icons?.[index] || undefined} size=\"sm\" /> } : {}),\n props: { 'data-testid': `dialog-option-${index}` },\n };\n });\n const marked = items.filter((_, index) => dialog.options[index].startsWith('[x]')).map((item) => item.value);\n const selected = dialog.options.some((option) => /^\\[[ x]\\]/.test(option))\n ? marked\n : items.filter((item) => values.includes(item.title)).map((item) => item.value);\n return (\n <PickerContent\n align=\"start\"\n data-testid=\"dialog\"\n data-dialog-method={dialog.method}\n data-dialog-menu={menu}\n title={<span data-testid=\"dialog-title\">{title}</span>}\n meta={multiple ? `${selected.length} active` : values.join(', ') || dialog.title}\n items={items}\n value={selected}\n multiple={multiple}\n filterable\n filterPlaceholder={`Filter ${menu === 'mode' ? 'major modes' : title.toLowerCase()}`}\n onSelect={(option) => answerDialogValue(dialog.id, option)}\n onApply={(domains) =>\n answerDialogValue(\n dialog.id,\n JSON.stringify({ kind: DOMAIN_SELECTION_KIND, version: DOMAIN_SELECTION_VERSION, domains }),\n )\n }\n onCancel={() => cancelDialog(dialog.id)}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n focusPrompt();\n }}\n />\n );\n}\n\n/** Asking an axis still goes through its slash command and claimed dialog. */\nfunction AxisButton({\n name,\n command,\n values,\n multi = false,\n sessionId,\n pending,\n claimedDialog,\n children,\n className,\n}: {\n name: string;\n command: string;\n values: readonly string[];\n multi?: boolean;\n sessionId: string | null;\n pending: boolean;\n claimedDialog: DialogRequest | null;\n children: React.ReactNode;\n className: string;\n}) {\n const open = claimedDialog !== null;\n // Other plugin axes keep their existing reply contract, even when set-valued.\n const domains = name === 'domains' && command.replace(/^\\//, '') === 'domains' && multi;\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n if (!next && claimedDialog) cancelDialog(claimedDialog.id);\n }}\n >\n <PopoverAnchor asChild>\n <Button\n data-testid={`axis-${name}`}\n data-pending={pending}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n title={\n pending\n ? `Asking the session for ${name}…`\n : `Change ${name}${values.length ? `: ${values.join(', ')}` : ''}`\n }\n onClick={() => {\n setPendingMenu(name);\n runCommand(command);\n }}\n className={className}\n >\n {children}\n {pending ? (\n <Spinner className=\"size-3 shrink-0\" />\n ) : (\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n )}\n </Button>\n </PopoverAnchor>\n {claimedDialog ? (\n <AxisMenu\n key={`${sessionId}:${claimedDialog.id}`}\n menu={name}\n dialog={claimedDialog}\n values={values}\n multiple={domains}\n />\n ) : null}\n </Popover>\n );\n}\n\n/** Minor modes are commands and workspace navigation, not drafted selections. */\nfunction MinorModesPopup({ modes, onClose }: { modes: MinorMode[]; onClose: () => void }) {\n const items: PickerItem[] = modes.map((mode) => ({\n value: mode.id,\n title: mode.name,\n disabledReason:\n mode.availability === 'unavailable' ? mode.unavailableReason || 'Unavailable in this session' : undefined,\n lead: <Kbd className=\"w-8 justify-center\">{mode.keys}</Kbd>,\n trail:\n mode.availability === 'unavailable' ? (\n <span data-testid={`minor-reason-${mode.name}`} className=\"sr-only\">\n {mode.unavailableReason}\n </span>\n ) : mode.detail ? (\n <span data-testid={`minor-detail-${mode.name}`} className=\"truncate\">\n {mode.detail}\n </span>\n ) : undefined,\n props: { 'data-testid': `minor-${mode.name}`, 'data-availability': mode.availability },\n }));\n const active = modes.filter((mode) => mode.availability === 'on').map((mode) => mode.id);\n return (\n <PickerContent\n align=\"start\"\n data-testid=\"minor-popup\"\n title=\"Minor modes\"\n meta={`${active.length} on`}\n items={items}\n value={active}\n actions\n filterable\n filterPlaceholder=\"Filter minor modes\"\n onSelect={(id) => {\n const mode = modes.find((item) => item.id === id);\n if (mode === undefined) return;\n if (mode.activityGroup !== undefined) {\n setDockOpen(true);\n setDockTab(sessionsStore.state.activeId, 'activity');\n } else {\n setPendingMenu('minor');\n runCommand(`/minor ${mode.id}${mode.toggle === undefined ? '' : ` ${mode.toggle}`}`);\n }\n onClose();\n }}\n />\n );\n}\n\n/** Model choices and their extra controls retain the existing RPC actions. */\nexport function ModelPopup({\n agent,\n models,\n levels,\n fastMode = false,\n onClose,\n}: {\n agent: AgentInfo | null;\n models: ModelChoice[];\n levels: string[];\n fastMode?: boolean;\n onClose: () => void;\n}) {\n useEffect(() => {\n loadModelChoices();\n }, []);\n const items: PickerItem[] = models.map((model) => ({\n value: `${model.provider}/${model.id}`,\n title: model.id,\n subtitle: model.name !== model.id ? model.name : undefined,\n lead: <span className=\"w-24 truncate text-sm text-po-dim\">{model.provider}</span>,\n trail: model.reasoning ? 'thinks' : undefined,\n props: {\n 'data-testid': `model-${model.provider}-${model.id}`,\n 'data-current': agent?.model === model.id && agent.provider === model.provider,\n },\n }));\n return (\n <PickerContent\n align=\"end\"\n data-testid=\"model-popup\"\n title=\"Model\"\n meta={agent ? `${agent.provider}/${agent.model}` : ''}\n items={items}\n value={agent ? [`${agent.provider}/${agent.model}`] : []}\n filterable\n filterPlaceholder=\"Filter models\"\n filterProps={{ 'data-testid': 'model-filter' }}\n loading={\n <>\n <Spinner label=\"asking the session for its models\" />\n asking the session for its models…\n </>\n }\n onSelect={(value) => {\n const model = models.find((item) => `${item.provider}/${item.id}` === value);\n if (model === undefined) return;\n selectModel(model.provider, model.id);\n onClose();\n }}\n footer={\n <>\n <div className=\"flex flex-wrap items-center gap-1 px-3 py-2\">\n <span className=\"mr-1 text-sm font-semibold text-po-dim\">Thinking</span>\n {levels.length === 0 ? <span className=\"text-sm text-po-dim\">…</span> : null}\n {levels.map((level) => {\n const current = agent?.thinkingLevel === level;\n return (\n <Button\n key={level}\n variant=\"ghost\"\n size=\"xs\"\n data-testid={`thinking-${level}`}\n data-current={current}\n onClick={() => {\n selectThinkingLevel(level);\n onClose();\n }}\n className={cn(current && 'bg-po-tint-green font-semibold text-po-green')}\n >\n {level}\n </Button>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2 border-t border-po-border-soft px-3 py-2\">\n <Button\n variant=\"ghost\"\n size=\"xs\"\n role=\"switch\"\n aria-label=\"Codex Fast\"\n aria-checked={agent?.provider === 'openai-codex' && fastMode}\n aria-describedby=\"codex-fast-description\"\n data-testid=\"fast-toggle\"\n disabled={agent?.provider !== 'openai-codex'}\n onClick={() => selectFastMode(!fastMode)}\n className={cn(agent?.provider === 'openai-codex' && fastMode && 'bg-po-tint-green text-po-green')}\n >\n Fast {agent?.provider === 'openai-codex' && fastMode ? 'on' : 'off'}\n </Button>\n <span id=\"codex-fast-description\" className=\"text-sm text-po-dim\">\n {agent?.provider === 'openai-codex'\n ? 'Priority processing may cost more.'\n : 'Fast is available only for Codex.'}\n </span>\n </div>\n </>\n }\n />\n );\n}\n\n/** Session selection axes use the same popup presentation and trigger geometry. */\nexport function SelectionBar() {\n const activeId = useStore(sessionsStore, (state) => state.activeId);\n const raw = useActiveSession((state) => state.statuses['po-major-mode'] ?? '');\n const statuses = useActiveSession((state) => state.statuses);\n const widgets = useActiveSession((state) => state.widgets);\n const catalog = useActiveSession((state) => state.minorModes);\n const agent = useActiveSession((state) => state.agent);\n const stats = useActiveSession((state) => state.stats);\n const liveCost = useActiveSession((state) => state.liveCost);\n const models = useActiveSession((state) => state.models);\n const fastMode = useActiveSession((state) => state.fastMode);\n const thinkingLevels = useActiveSession((state) => state.thinkingLevels);\n const dialog = useActiveSession((state) => state.dialog);\n const pendingMenu = useStore(menuStore, (state) => state.pending);\n const claimed = useStore(menuStore, (state) => state.claimed);\n const [minorOpen, setMinorOpen] = useState(false);\n const [modelOpen, setModelOpen] = useState(false);\n\n const selection = parseSelection(raw);\n const profileIdentity = useActiveSession((state) => state.profileIdentity);\n // The profile status carries the profile name; the journaled identity carries what a person reads.\n const axes = selectionAxes(statuses).map((axis) =>\n axis.name === 'profile' && profileIdentity?.name && axis.values[0] === profileIdentity.profile\n ? { ...axis, values: [profileIdentity.name] }\n : axis,\n );\n const modes = minorModes(statuses, widgets, catalog);\n const activeMinors = modes.filter((mode) => mode.availability === 'on');\n\n const reportedAgentCost = Number(statuses[AGENT_COST_STATUS_KEY] ?? '');\n const agentCost = Number.isFinite(reportedAgentCost) ? reportedAgentCost : 0;\n const sessionCost = stats === null ? null : stats.cost + liveCost;\n /** The dialog this axis asked for, when the claim named it and it is still open. */\n const dialogFor = (name: string): DialogRequest | null =>\n dialog !== null && claimed !== null && claimed.dialogId === dialog.id && claimed.menu === name ? dialog : null;\n const minorDialog = dialogFor('minor');\n\n const axisClass = cn(\n buttonVariants({ variant: 'outline', size: 'lg' }),\n 'min-w-0 max-w-48 gap-1.5 px-3 font-sans font-medium text-po-text max-sm:min-w-24 max-sm:max-w-28 max-sm:flex-1 max-sm:basis-0 max-sm:shrink',\n );\n\n return (\n <footer\n data-testid=\"selection-bar\"\n data-pending={selection.pending}\n className=\"relative flex shrink-0 items-center gap-1.5 overflow-x-auto px-3 pb-3 [scrollbar-width:none] sm:gap-2 sm:px-5 [&::-webkit-scrollbar]:hidden\"\n >\n <AxisButton\n name=\"mode\"\n command=\"mode\"\n values={selection.majorMode ? [selection.majorMode] : []}\n sessionId={activeId}\n pending={pendingMenu === 'mode'}\n claimedDialog={dialogFor('mode')}\n className={cn(axisClass, 'max-sm:max-w-24')}\n >\n <span\n data-testid=\"selection-mode\"\n className={cn('min-w-0 truncate', AXIS_MARK, selection.pending ? 'decoration-po-yellow' : AXIS_TONE.mode)}\n >\n {selection.majorMode || 'Major mode'}\n </span>\n </AxisButton>\n\n {axes.map((axis) => (\n <AxisButton\n key={axis.name}\n name={axis.name}\n command={axis.command}\n values={axis.values.length === 0 && !axis.multi ? [axis.emptyLabel] : axis.values}\n multi={axis.multi}\n sessionId={activeId}\n pending={pendingMenu === axis.name}\n claimedDialog={dialogFor(axis.name)}\n className={axisClass}\n >\n <span\n data-testid={`selection-${axis.name}`}\n className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE[axis.name] ?? 'decoration-po-faint')}\n >\n {axis.values[0] ?? axis.emptyLabel}\n </span>\n {axis.values.length > 1 ? (\n <span data-testid={`selection-${axis.name}-more`} className=\"shrink-0 text-xs\">\n +{axis.values.length - 1}\n </span>\n ) : null}\n </AxisButton>\n ))}\n\n <Popover\n open={minorOpen || minorDialog !== null}\n onOpenChange={(next) => {\n if (next) {\n setMinorOpen(true);\n return;\n }\n if (minorDialog) cancelDialog(minorDialog.id);\n setMinorOpen(false);\n }}\n >\n <PopoverTrigger asChild>\n <Button\n data-testid=\"axis-minor\"\n title={`Minor modes${activeMinors.length ? `: ${activeMinors.map((mode) => mode.name).join(', ')}` : ''}`}\n className={cn(axisClass, 'max-sm:max-w-24')}\n >\n <span data-testid=\"minor-summary\" className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE.minor)}>\n {activeMinors[0]?.name ?? 'Minor modes'}\n </span>\n {activeMinors.length > 1 ? <span className=\"shrink-0 text-xs\">+{activeMinors.length - 1}</span> : null}\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n </Button>\n </PopoverTrigger>\n {minorDialog ? (\n <AxisMenu key={`${activeId}:${minorDialog.id}`} menu=\"minor\" dialog={minorDialog} />\n ) : minorOpen ? (\n <MinorModesPopup key={activeId} modes={modes} onClose={() => setMinorOpen(false)} />\n ) : null}\n </Popover>\n\n <PluginSurface slot={HOST_SLOTS.selectionBar} sessionId={activeId} />\n <div className=\"min-w-0 flex-1 max-sm:hidden\" />\n\n <Popover open={modelOpen} onOpenChange={setModelOpen}>\n <PopoverTrigger asChild>\n <Button\n data-testid=\"axis-model\"\n title={\n agent\n ? `${agent.provider}/${agent.model}${agent.thinkingLevel ? ` · ${agent.thinkingLevel}` : ''}`\n : 'Model and thinking level'\n }\n className={axisClass}\n >\n <span data-testid=\"agent-model\" className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE.model)}>\n {agent?.model ?? 'Model'}\n </span>\n <span data-testid=\"agent-thinking\" className=\"shrink-0 text-sm text-po-dim max-sm:hidden\">\n {agent?.thinkingLevel ?? ''}\n </span>\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n </Button>\n </PopoverTrigger>\n {modelOpen ? (\n <ModelPopup\n key={activeId}\n agent={agent}\n models={models}\n levels={thinkingLevels}\n fastMode={fastMode}\n onClose={() => setModelOpen(false)}\n />\n ) : null}\n </Popover>\n\n <span\n data-testid=\"top-context\"\n title={\n stats?.contextTokens != null && stats.contextWindow != null\n ? `${stats.contextTokens.toLocaleString()} of ${stats.contextWindow.toLocaleString()} tokens`\n : 'Context usage, once the session reports it'\n }\n className=\"shrink-0 text-sm text-po-dim max-sm:hidden\"\n >\n {stats?.contextPercent == null ? '' : `ctx ${Math.round(stats.contextPercent)}%`}\n </span>\n <span\n data-testid=\"top-cost\"\n title={\n stats === null || sessionCost === null\n ? ''\n : agentCost > 0\n ? `$${sessionCost.toFixed(2)} session + $${agentCost.toFixed(2)} agents, ${stats.totalTokens.toLocaleString()} tokens this session`\n : `${stats.totalTokens.toLocaleString()} tokens this session`\n }\n className=\"shrink-0 text-sm text-po-dim max-sm:hidden\"\n >\n {sessionCost === null ? '' : `$${(sessionCost + agentCost).toFixed(2)}`}\n </span>\n </footer>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionBar.d.mts","names":[],"sources":["../../../../src/web/features/selection/SelectionBar.tsx"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"SelectionBar.d.mts","names":[],"sources":["../../../../src/web/features/selection/SelectionBar.tsx"],"mappings":";;;wBAgPgB,aACd,OACA,QACA,QACA,UACA;EAEA,OAAO;EACP,QAAQ;EACR;EACA;EACA;oBACD,IAAA;;wBA2Fe,gCAAY,IAAA"}
|
|
@@ -9,7 +9,7 @@ import { setDockOpen, setDockTab } from "../../stores/uiStore.mjs";
|
|
|
9
9
|
import { PluginSurface } from "../../components/PluginSurface.mjs";
|
|
10
10
|
import { useEffect, useState } from "react";
|
|
11
11
|
import { useStore } from "@tanstack/react-store";
|
|
12
|
-
import { Button, ChevronDownIcon, Kbd, PickerContent, Popover, PopoverAnchor, PopoverTrigger, Spinner, buttonVariants, cn } from "@agimon-ai/po-web-components";
|
|
12
|
+
import { AgentAvatar, Button, ChevronDownIcon, Kbd, PickerContent, Popover, PopoverAnchor, PopoverTrigger, Spinner, buttonVariants, cn } from "@agimon-ai/po-web-components";
|
|
13
13
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
14
14
|
//#region src/web/features/selection/SelectionBar.tsx
|
|
15
15
|
const AXIS_MARK = "underline decoration-2 underline-offset-4";
|
|
@@ -36,10 +36,18 @@ function AxisMenu({ menu, dialog, values = [], multiple = false }) {
|
|
|
36
36
|
const items = dialog.options.map((option, index) => {
|
|
37
37
|
const clean = menu === "mode" || multiple ? option.replace(/^\[[ x]\]\s*/, "") : option;
|
|
38
38
|
const separator = menu === "mode" ? clean.indexOf(":") : -1;
|
|
39
|
+
const description = dialog.descriptions?.[index] || void 0;
|
|
40
|
+
const title = separator < 0 ? clean : clean.slice(0, separator);
|
|
41
|
+
const face = menu === "profile" && option !== "None";
|
|
39
42
|
return {
|
|
40
43
|
value: multiple ? clean : option,
|
|
41
|
-
title
|
|
42
|
-
subtitle: separator < 0 ?
|
|
44
|
+
title,
|
|
45
|
+
subtitle: separator < 0 ? description : clean.slice(separator + 1).trim(),
|
|
46
|
+
...face ? { lead: /* @__PURE__ */ jsx(AgentAvatar, {
|
|
47
|
+
name: title,
|
|
48
|
+
image: dialog.icons?.[index] || void 0,
|
|
49
|
+
size: "sm"
|
|
50
|
+
}) } : {},
|
|
43
51
|
props: { "data-testid": `dialog-option-${index}` }
|
|
44
52
|
};
|
|
45
53
|
});
|
|
@@ -258,7 +266,11 @@ function SelectionBar() {
|
|
|
258
266
|
const [minorOpen, setMinorOpen] = useState(false);
|
|
259
267
|
const [modelOpen, setModelOpen] = useState(false);
|
|
260
268
|
const selection = parseSelection(raw);
|
|
261
|
-
const
|
|
269
|
+
const profileIdentity = useActiveSession((state) => state.profileIdentity);
|
|
270
|
+
const axes = selectionAxes(statuses).map((axis) => axis.name === "profile" && profileIdentity?.name && axis.values[0] === profileIdentity.profile ? {
|
|
271
|
+
...axis,
|
|
272
|
+
values: [profileIdentity.name]
|
|
273
|
+
} : axis);
|
|
262
274
|
const modes = minorModes(statuses, widgets, catalog);
|
|
263
275
|
const activeMinors = modes.filter((mode) => mode.availability === "on");
|
|
264
276
|
const reportedAgentCost = Number(statuses[AGENT_COST_STATUS_KEY] ?? "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionBar.mjs","names":[],"sources":["../../../../src/web/features/selection/SelectionBar.tsx"],"sourcesContent":["import {\n Button,\n buttonVariants,\n ChevronDownIcon,\n cn,\n Kbd,\n PickerContent,\n type PickerItem,\n Popover,\n PopoverAnchor,\n PopoverTrigger,\n Spinner,\n} from '@agimon-ai/po-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useState } from 'react';\n\nimport { PluginSurface } from '../../components/PluginSurface';\nimport { minorModes, type MinorMode, selectionAxes } from '../../lib/composition';\nimport { HOST_SLOTS } from '../../lib/pluginRegistry';\nimport { focusPrompt } from '../../lib/promptFocus';\nimport type { AgentInfo, DialogRequest, ModelChoice } from '../../lib/sessionModel';\nimport { parseSelection } from '../../lib/statusLine';\nimport { menuStore, setPendingMenu } from '../../stores/menuStore';\nimport { sessionsStore } from '../../stores/sessionsStore';\nimport {\n answerDialogValue,\n cancelDialog,\n loadModelChoices,\n runCommand,\n selectModel,\n selectThinkingLevel,\n selectFastMode,\n useActiveSession,\n} from '../../stores/sessionStore';\nimport { setDockOpen, setDockTab } from '../../stores/uiStore';\n\n// Category marks carry colour as a label underline; button geometry stays the same.\nconst AXIS_MARK = 'underline decoration-2 underline-offset-4';\nconst AXIS_TONE: Readonly<Record<string, string>> = {\n mode: 'decoration-po-blue',\n profile: 'decoration-po-magenta',\n domains: 'decoration-po-violet',\n minor: 'decoration-po-teal',\n model: 'decoration-po-cyan',\n};\n\nconst MENU_TITLE: Readonly<Record<string, string>> = {\n mode: 'Major mode',\n profile: 'Profile',\n domains: 'Domains',\n minor: 'Minor modes',\n};\n\nconst DOMAIN_SELECTION_KIND = 'po-domains-selection';\nconst DOMAIN_SELECTION_VERSION = 1;\n\n/** Team runs bill to their own sessions, so their spend arrives as a named status. */\nconst AGENT_COST_STATUS_KEY = 'po-team-cost';\n\n/** Adapt the agent's string-valued dialog without changing its single-choice replies. */\nfunction AxisMenu({\n menu,\n dialog,\n values = [],\n multiple = false,\n}: {\n menu: string;\n dialog: DialogRequest;\n values?: readonly string[];\n multiple?: boolean;\n}) {\n const title = MENU_TITLE[menu] ?? menu;\n const items: PickerItem[] = dialog.options.map((option, index) => {\n const clean = menu === 'mode' || multiple ? option.replace(/^\\[[ x]\\]\\s*/, '') : option;\n const separator = menu === 'mode' ? clean.indexOf(':') : -1;\n return {\n value: multiple ? clean : option,\n title: separator < 0 ? clean : clean.slice(0, separator),\n subtitle: separator < 0 ? undefined : clean.slice(separator + 1).trim(),\n props: { 'data-testid': `dialog-option-${index}` },\n };\n });\n const marked = items.filter((_, index) => dialog.options[index].startsWith('[x]')).map((item) => item.value);\n const selected = dialog.options.some((option) => /^\\[[ x]\\]/.test(option))\n ? marked\n : items.filter((item) => values.includes(item.title)).map((item) => item.value);\n return (\n <PickerContent\n align=\"start\"\n data-testid=\"dialog\"\n data-dialog-method={dialog.method}\n data-dialog-menu={menu}\n title={<span data-testid=\"dialog-title\">{title}</span>}\n meta={multiple ? `${selected.length} active` : values.join(', ') || dialog.title}\n items={items}\n value={selected}\n multiple={multiple}\n filterable\n filterPlaceholder={`Filter ${menu === 'mode' ? 'major modes' : title.toLowerCase()}`}\n onSelect={(option) => answerDialogValue(dialog.id, option)}\n onApply={(domains) =>\n answerDialogValue(\n dialog.id,\n JSON.stringify({ kind: DOMAIN_SELECTION_KIND, version: DOMAIN_SELECTION_VERSION, domains }),\n )\n }\n onCancel={() => cancelDialog(dialog.id)}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n focusPrompt();\n }}\n />\n );\n}\n\n/** Asking an axis still goes through its slash command and claimed dialog. */\nfunction AxisButton({\n name,\n command,\n values,\n multi = false,\n sessionId,\n pending,\n claimedDialog,\n children,\n className,\n}: {\n name: string;\n command: string;\n values: readonly string[];\n multi?: boolean;\n sessionId: string | null;\n pending: boolean;\n claimedDialog: DialogRequest | null;\n children: React.ReactNode;\n className: string;\n}) {\n const open = claimedDialog !== null;\n // Other plugin axes keep their existing reply contract, even when set-valued.\n const domains = name === 'domains' && command.replace(/^\\//, '') === 'domains' && multi;\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n if (!next && claimedDialog) cancelDialog(claimedDialog.id);\n }}\n >\n <PopoverAnchor asChild>\n <Button\n data-testid={`axis-${name}`}\n data-pending={pending}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n title={\n pending\n ? `Asking the session for ${name}…`\n : `Change ${name}${values.length ? `: ${values.join(', ')}` : ''}`\n }\n onClick={() => {\n setPendingMenu(name);\n runCommand(command);\n }}\n className={className}\n >\n {children}\n {pending ? (\n <Spinner className=\"size-3 shrink-0\" />\n ) : (\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n )}\n </Button>\n </PopoverAnchor>\n {claimedDialog ? (\n <AxisMenu\n key={`${sessionId}:${claimedDialog.id}`}\n menu={name}\n dialog={claimedDialog}\n values={values}\n multiple={domains}\n />\n ) : null}\n </Popover>\n );\n}\n\n/** Minor modes are commands and workspace navigation, not drafted selections. */\nfunction MinorModesPopup({ modes, onClose }: { modes: MinorMode[]; onClose: () => void }) {\n const items: PickerItem[] = modes.map((mode) => ({\n value: mode.id,\n title: mode.name,\n disabledReason:\n mode.availability === 'unavailable' ? mode.unavailableReason || 'Unavailable in this session' : undefined,\n lead: <Kbd className=\"w-8 justify-center\">{mode.keys}</Kbd>,\n trail:\n mode.availability === 'unavailable' ? (\n <span data-testid={`minor-reason-${mode.name}`} className=\"sr-only\">\n {mode.unavailableReason}\n </span>\n ) : mode.detail ? (\n <span data-testid={`minor-detail-${mode.name}`} className=\"truncate\">\n {mode.detail}\n </span>\n ) : undefined,\n props: { 'data-testid': `minor-${mode.name}`, 'data-availability': mode.availability },\n }));\n const active = modes.filter((mode) => mode.availability === 'on').map((mode) => mode.id);\n return (\n <PickerContent\n align=\"start\"\n data-testid=\"minor-popup\"\n title=\"Minor modes\"\n meta={`${active.length} on`}\n items={items}\n value={active}\n actions\n filterable\n filterPlaceholder=\"Filter minor modes\"\n onSelect={(id) => {\n const mode = modes.find((item) => item.id === id);\n if (mode === undefined) return;\n if (mode.activityGroup !== undefined) {\n setDockOpen(true);\n setDockTab(sessionsStore.state.activeId, 'activity');\n } else {\n setPendingMenu('minor');\n runCommand(`/minor ${mode.id}${mode.toggle === undefined ? '' : ` ${mode.toggle}`}`);\n }\n onClose();\n }}\n />\n );\n}\n\n/** Model choices and their extra controls retain the existing RPC actions. */\nexport function ModelPopup({\n agent,\n models,\n levels,\n fastMode = false,\n onClose,\n}: {\n agent: AgentInfo | null;\n models: ModelChoice[];\n levels: string[];\n fastMode?: boolean;\n onClose: () => void;\n}) {\n useEffect(() => {\n loadModelChoices();\n }, []);\n const items: PickerItem[] = models.map((model) => ({\n value: `${model.provider}/${model.id}`,\n title: model.id,\n subtitle: model.name !== model.id ? model.name : undefined,\n lead: <span className=\"w-24 truncate text-sm text-po-dim\">{model.provider}</span>,\n trail: model.reasoning ? 'thinks' : undefined,\n props: {\n 'data-testid': `model-${model.provider}-${model.id}`,\n 'data-current': agent?.model === model.id && agent.provider === model.provider,\n },\n }));\n return (\n <PickerContent\n align=\"end\"\n data-testid=\"model-popup\"\n title=\"Model\"\n meta={agent ? `${agent.provider}/${agent.model}` : ''}\n items={items}\n value={agent ? [`${agent.provider}/${agent.model}`] : []}\n filterable\n filterPlaceholder=\"Filter models\"\n filterProps={{ 'data-testid': 'model-filter' }}\n loading={\n <>\n <Spinner label=\"asking the session for its models\" />\n asking the session for its models…\n </>\n }\n onSelect={(value) => {\n const model = models.find((item) => `${item.provider}/${item.id}` === value);\n if (model === undefined) return;\n selectModel(model.provider, model.id);\n onClose();\n }}\n footer={\n <>\n <div className=\"flex flex-wrap items-center gap-1 px-3 py-2\">\n <span className=\"mr-1 text-sm font-semibold text-po-dim\">Thinking</span>\n {levels.length === 0 ? <span className=\"text-sm text-po-dim\">…</span> : null}\n {levels.map((level) => {\n const current = agent?.thinkingLevel === level;\n return (\n <Button\n key={level}\n variant=\"ghost\"\n size=\"xs\"\n data-testid={`thinking-${level}`}\n data-current={current}\n onClick={() => {\n selectThinkingLevel(level);\n onClose();\n }}\n className={cn(current && 'bg-po-tint-green font-semibold text-po-green')}\n >\n {level}\n </Button>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2 border-t border-po-border-soft px-3 py-2\">\n <Button\n variant=\"ghost\"\n size=\"xs\"\n role=\"switch\"\n aria-label=\"Codex Fast\"\n aria-checked={agent?.provider === 'openai-codex' && fastMode}\n aria-describedby=\"codex-fast-description\"\n data-testid=\"fast-toggle\"\n disabled={agent?.provider !== 'openai-codex'}\n onClick={() => selectFastMode(!fastMode)}\n className={cn(agent?.provider === 'openai-codex' && fastMode && 'bg-po-tint-green text-po-green')}\n >\n Fast {agent?.provider === 'openai-codex' && fastMode ? 'on' : 'off'}\n </Button>\n <span id=\"codex-fast-description\" className=\"text-sm text-po-dim\">\n {agent?.provider === 'openai-codex'\n ? 'Priority processing may cost more.'\n : 'Fast is available only for Codex.'}\n </span>\n </div>\n </>\n }\n />\n );\n}\n\n/** Session selection axes use the same popup presentation and trigger geometry. */\nexport function SelectionBar() {\n const activeId = useStore(sessionsStore, (state) => state.activeId);\n const raw = useActiveSession((state) => state.statuses['po-major-mode'] ?? '');\n const statuses = useActiveSession((state) => state.statuses);\n const widgets = useActiveSession((state) => state.widgets);\n const catalog = useActiveSession((state) => state.minorModes);\n const agent = useActiveSession((state) => state.agent);\n const stats = useActiveSession((state) => state.stats);\n const liveCost = useActiveSession((state) => state.liveCost);\n const models = useActiveSession((state) => state.models);\n const fastMode = useActiveSession((state) => state.fastMode);\n const thinkingLevels = useActiveSession((state) => state.thinkingLevels);\n const dialog = useActiveSession((state) => state.dialog);\n const pendingMenu = useStore(menuStore, (state) => state.pending);\n const claimed = useStore(menuStore, (state) => state.claimed);\n const [minorOpen, setMinorOpen] = useState(false);\n const [modelOpen, setModelOpen] = useState(false);\n\n const selection = parseSelection(raw);\n const axes = selectionAxes(statuses);\n const modes = minorModes(statuses, widgets, catalog);\n const activeMinors = modes.filter((mode) => mode.availability === 'on');\n\n const reportedAgentCost = Number(statuses[AGENT_COST_STATUS_KEY] ?? '');\n const agentCost = Number.isFinite(reportedAgentCost) ? reportedAgentCost : 0;\n const sessionCost = stats === null ? null : stats.cost + liveCost;\n /** The dialog this axis asked for, when the claim named it and it is still open. */\n const dialogFor = (name: string): DialogRequest | null =>\n dialog !== null && claimed !== null && claimed.dialogId === dialog.id && claimed.menu === name ? dialog : null;\n const minorDialog = dialogFor('minor');\n\n const axisClass = cn(\n buttonVariants({ variant: 'outline', size: 'lg' }),\n 'min-w-0 max-w-48 gap-1.5 px-3 font-sans font-medium text-po-text max-sm:min-w-24 max-sm:max-w-28 max-sm:flex-1 max-sm:basis-0 max-sm:shrink',\n );\n\n return (\n <footer\n data-testid=\"selection-bar\"\n data-pending={selection.pending}\n className=\"relative flex shrink-0 items-center gap-1.5 overflow-x-auto px-3 pb-3 [scrollbar-width:none] sm:gap-2 sm:px-5 [&::-webkit-scrollbar]:hidden\"\n >\n <AxisButton\n name=\"mode\"\n command=\"mode\"\n values={selection.majorMode ? [selection.majorMode] : []}\n sessionId={activeId}\n pending={pendingMenu === 'mode'}\n claimedDialog={dialogFor('mode')}\n className={cn(axisClass, 'max-sm:max-w-24')}\n >\n <span\n data-testid=\"selection-mode\"\n className={cn('min-w-0 truncate', AXIS_MARK, selection.pending ? 'decoration-po-yellow' : AXIS_TONE.mode)}\n >\n {selection.majorMode || 'Major mode'}\n </span>\n </AxisButton>\n\n {axes.map((axis) => (\n <AxisButton\n key={axis.name}\n name={axis.name}\n command={axis.command}\n values={axis.values.length === 0 && !axis.multi ? [axis.emptyLabel] : axis.values}\n multi={axis.multi}\n sessionId={activeId}\n pending={pendingMenu === axis.name}\n claimedDialog={dialogFor(axis.name)}\n className={axisClass}\n >\n <span\n data-testid={`selection-${axis.name}`}\n className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE[axis.name] ?? 'decoration-po-faint')}\n >\n {axis.values[0] ?? axis.emptyLabel}\n </span>\n {axis.values.length > 1 ? (\n <span data-testid={`selection-${axis.name}-more`} className=\"shrink-0 text-xs\">\n +{axis.values.length - 1}\n </span>\n ) : null}\n </AxisButton>\n ))}\n\n <Popover\n open={minorOpen || minorDialog !== null}\n onOpenChange={(next) => {\n if (next) {\n setMinorOpen(true);\n return;\n }\n if (minorDialog) cancelDialog(minorDialog.id);\n setMinorOpen(false);\n }}\n >\n <PopoverTrigger asChild>\n <Button\n data-testid=\"axis-minor\"\n title={`Minor modes${activeMinors.length ? `: ${activeMinors.map((mode) => mode.name).join(', ')}` : ''}`}\n className={cn(axisClass, 'max-sm:max-w-24')}\n >\n <span data-testid=\"minor-summary\" className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE.minor)}>\n {activeMinors[0]?.name ?? 'Minor modes'}\n </span>\n {activeMinors.length > 1 ? <span className=\"shrink-0 text-xs\">+{activeMinors.length - 1}</span> : null}\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n </Button>\n </PopoverTrigger>\n {minorDialog ? (\n <AxisMenu key={`${activeId}:${minorDialog.id}`} menu=\"minor\" dialog={minorDialog} />\n ) : minorOpen ? (\n <MinorModesPopup key={activeId} modes={modes} onClose={() => setMinorOpen(false)} />\n ) : null}\n </Popover>\n\n <PluginSurface slot={HOST_SLOTS.selectionBar} sessionId={activeId} />\n <div className=\"min-w-0 flex-1 max-sm:hidden\" />\n\n <Popover open={modelOpen} onOpenChange={setModelOpen}>\n <PopoverTrigger asChild>\n <Button\n data-testid=\"axis-model\"\n title={\n agent\n ? `${agent.provider}/${agent.model}${agent.thinkingLevel ? ` · ${agent.thinkingLevel}` : ''}`\n : 'Model and thinking level'\n }\n className={axisClass}\n >\n <span data-testid=\"agent-model\" className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE.model)}>\n {agent?.model ?? 'Model'}\n </span>\n <span data-testid=\"agent-thinking\" className=\"shrink-0 text-sm text-po-dim max-sm:hidden\">\n {agent?.thinkingLevel ?? ''}\n </span>\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n </Button>\n </PopoverTrigger>\n {modelOpen ? (\n <ModelPopup\n key={activeId}\n agent={agent}\n models={models}\n levels={thinkingLevels}\n fastMode={fastMode}\n onClose={() => setModelOpen(false)}\n />\n ) : null}\n </Popover>\n\n <span\n data-testid=\"top-context\"\n title={\n stats?.contextTokens != null && stats.contextWindow != null\n ? `${stats.contextTokens.toLocaleString()} of ${stats.contextWindow.toLocaleString()} tokens`\n : 'Context usage, once the session reports it'\n }\n className=\"shrink-0 text-sm text-po-dim max-sm:hidden\"\n >\n {stats?.contextPercent == null ? '' : `ctx ${Math.round(stats.contextPercent)}%`}\n </span>\n <span\n data-testid=\"top-cost\"\n title={\n stats === null || sessionCost === null\n ? ''\n : agentCost > 0\n ? `$${sessionCost.toFixed(2)} session + $${agentCost.toFixed(2)} agents, ${stats.totalTokens.toLocaleString()} tokens this session`\n : `${stats.totalTokens.toLocaleString()} tokens this session`\n }\n className=\"shrink-0 text-sm text-po-dim max-sm:hidden\"\n >\n {sessionCost === null ? '' : `$${(sessionCost + agentCost).toFixed(2)}`}\n </span>\n </footer>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectionBar.mjs","names":[],"sources":["../../../../src/web/features/selection/SelectionBar.tsx"],"sourcesContent":["import {\n AgentAvatar,\n Button,\n buttonVariants,\n ChevronDownIcon,\n cn,\n Kbd,\n PickerContent,\n type PickerItem,\n Popover,\n PopoverAnchor,\n PopoverTrigger,\n Spinner,\n} from '@agimon-ai/po-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useState } from 'react';\n\nimport { PluginSurface } from '../../components/PluginSurface';\nimport { minorModes, type MinorMode, selectionAxes } from '../../lib/composition';\nimport { HOST_SLOTS } from '../../lib/pluginRegistry';\nimport { focusPrompt } from '../../lib/promptFocus';\nimport type { AgentInfo, DialogRequest, ModelChoice } from '../../lib/sessionModel';\nimport { parseSelection } from '../../lib/statusLine';\nimport { menuStore, setPendingMenu } from '../../stores/menuStore';\nimport { sessionsStore } from '../../stores/sessionsStore';\nimport {\n answerDialogValue,\n cancelDialog,\n loadModelChoices,\n runCommand,\n selectModel,\n selectThinkingLevel,\n selectFastMode,\n useActiveSession,\n} from '../../stores/sessionStore';\nimport { setDockOpen, setDockTab } from '../../stores/uiStore';\n\n// Category marks carry colour as a label underline; button geometry stays the same.\nconst AXIS_MARK = 'underline decoration-2 underline-offset-4';\nconst AXIS_TONE: Readonly<Record<string, string>> = {\n mode: 'decoration-po-blue',\n profile: 'decoration-po-magenta',\n domains: 'decoration-po-violet',\n minor: 'decoration-po-teal',\n model: 'decoration-po-cyan',\n};\n\nconst MENU_TITLE: Readonly<Record<string, string>> = {\n mode: 'Major mode',\n profile: 'Profile',\n domains: 'Domains',\n minor: 'Minor modes',\n};\n\nconst DOMAIN_SELECTION_KIND = 'po-domains-selection';\nconst DOMAIN_SELECTION_VERSION = 1;\n\n/** Team runs bill to their own sessions, so their spend arrives as a named status. */\nconst AGENT_COST_STATUS_KEY = 'po-team-cost';\n\n/** Adapt the agent's string-valued dialog without changing its single-choice replies. */\nfunction AxisMenu({\n menu,\n dialog,\n values = [],\n multiple = false,\n}: {\n menu: string;\n dialog: DialogRequest;\n values?: readonly string[];\n multiple?: boolean;\n}) {\n const title = MENU_TITLE[menu] ?? menu;\n const items: PickerItem[] = dialog.options.map((option, index) => {\n const clean = menu === 'mode' || multiple ? option.replace(/^\\[[ x]\\]\\s*/, '') : option;\n const separator = menu === 'mode' ? clean.indexOf(':') : -1;\n const description = dialog.descriptions?.[index] || undefined;\n const title = separator < 0 ? clean : clean.slice(0, separator);\n // Every profile but None gets a face: its avatar when the request sent one, otherwise initials.\n const face = menu === 'profile' && option !== 'None';\n return {\n value: multiple ? clean : option,\n title,\n subtitle: separator < 0 ? description : clean.slice(separator + 1).trim(),\n ...(face ? { lead: <AgentAvatar name={title} image={dialog.icons?.[index] || undefined} size=\"sm\" /> } : {}),\n props: { 'data-testid': `dialog-option-${index}` },\n };\n });\n const marked = items.filter((_, index) => dialog.options[index].startsWith('[x]')).map((item) => item.value);\n const selected = dialog.options.some((option) => /^\\[[ x]\\]/.test(option))\n ? marked\n : items.filter((item) => values.includes(item.title)).map((item) => item.value);\n return (\n <PickerContent\n align=\"start\"\n data-testid=\"dialog\"\n data-dialog-method={dialog.method}\n data-dialog-menu={menu}\n title={<span data-testid=\"dialog-title\">{title}</span>}\n meta={multiple ? `${selected.length} active` : values.join(', ') || dialog.title}\n items={items}\n value={selected}\n multiple={multiple}\n filterable\n filterPlaceholder={`Filter ${menu === 'mode' ? 'major modes' : title.toLowerCase()}`}\n onSelect={(option) => answerDialogValue(dialog.id, option)}\n onApply={(domains) =>\n answerDialogValue(\n dialog.id,\n JSON.stringify({ kind: DOMAIN_SELECTION_KIND, version: DOMAIN_SELECTION_VERSION, domains }),\n )\n }\n onCancel={() => cancelDialog(dialog.id)}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n focusPrompt();\n }}\n />\n );\n}\n\n/** Asking an axis still goes through its slash command and claimed dialog. */\nfunction AxisButton({\n name,\n command,\n values,\n multi = false,\n sessionId,\n pending,\n claimedDialog,\n children,\n className,\n}: {\n name: string;\n command: string;\n values: readonly string[];\n multi?: boolean;\n sessionId: string | null;\n pending: boolean;\n claimedDialog: DialogRequest | null;\n children: React.ReactNode;\n className: string;\n}) {\n const open = claimedDialog !== null;\n // Other plugin axes keep their existing reply contract, even when set-valued.\n const domains = name === 'domains' && command.replace(/^\\//, '') === 'domains' && multi;\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n if (!next && claimedDialog) cancelDialog(claimedDialog.id);\n }}\n >\n <PopoverAnchor asChild>\n <Button\n data-testid={`axis-${name}`}\n data-pending={pending}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n title={\n pending\n ? `Asking the session for ${name}…`\n : `Change ${name}${values.length ? `: ${values.join(', ')}` : ''}`\n }\n onClick={() => {\n setPendingMenu(name);\n runCommand(command);\n }}\n className={className}\n >\n {children}\n {pending ? (\n <Spinner className=\"size-3 shrink-0\" />\n ) : (\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n )}\n </Button>\n </PopoverAnchor>\n {claimedDialog ? (\n <AxisMenu\n key={`${sessionId}:${claimedDialog.id}`}\n menu={name}\n dialog={claimedDialog}\n values={values}\n multiple={domains}\n />\n ) : null}\n </Popover>\n );\n}\n\n/** Minor modes are commands and workspace navigation, not drafted selections. */\nfunction MinorModesPopup({ modes, onClose }: { modes: MinorMode[]; onClose: () => void }) {\n const items: PickerItem[] = modes.map((mode) => ({\n value: mode.id,\n title: mode.name,\n disabledReason:\n mode.availability === 'unavailable' ? mode.unavailableReason || 'Unavailable in this session' : undefined,\n lead: <Kbd className=\"w-8 justify-center\">{mode.keys}</Kbd>,\n trail:\n mode.availability === 'unavailable' ? (\n <span data-testid={`minor-reason-${mode.name}`} className=\"sr-only\">\n {mode.unavailableReason}\n </span>\n ) : mode.detail ? (\n <span data-testid={`minor-detail-${mode.name}`} className=\"truncate\">\n {mode.detail}\n </span>\n ) : undefined,\n props: { 'data-testid': `minor-${mode.name}`, 'data-availability': mode.availability },\n }));\n const active = modes.filter((mode) => mode.availability === 'on').map((mode) => mode.id);\n return (\n <PickerContent\n align=\"start\"\n data-testid=\"minor-popup\"\n title=\"Minor modes\"\n meta={`${active.length} on`}\n items={items}\n value={active}\n actions\n filterable\n filterPlaceholder=\"Filter minor modes\"\n onSelect={(id) => {\n const mode = modes.find((item) => item.id === id);\n if (mode === undefined) return;\n if (mode.activityGroup !== undefined) {\n setDockOpen(true);\n setDockTab(sessionsStore.state.activeId, 'activity');\n } else {\n setPendingMenu('minor');\n runCommand(`/minor ${mode.id}${mode.toggle === undefined ? '' : ` ${mode.toggle}`}`);\n }\n onClose();\n }}\n />\n );\n}\n\n/** Model choices and their extra controls retain the existing RPC actions. */\nexport function ModelPopup({\n agent,\n models,\n levels,\n fastMode = false,\n onClose,\n}: {\n agent: AgentInfo | null;\n models: ModelChoice[];\n levels: string[];\n fastMode?: boolean;\n onClose: () => void;\n}) {\n useEffect(() => {\n loadModelChoices();\n }, []);\n const items: PickerItem[] = models.map((model) => ({\n value: `${model.provider}/${model.id}`,\n title: model.id,\n subtitle: model.name !== model.id ? model.name : undefined,\n lead: <span className=\"w-24 truncate text-sm text-po-dim\">{model.provider}</span>,\n trail: model.reasoning ? 'thinks' : undefined,\n props: {\n 'data-testid': `model-${model.provider}-${model.id}`,\n 'data-current': agent?.model === model.id && agent.provider === model.provider,\n },\n }));\n return (\n <PickerContent\n align=\"end\"\n data-testid=\"model-popup\"\n title=\"Model\"\n meta={agent ? `${agent.provider}/${agent.model}` : ''}\n items={items}\n value={agent ? [`${agent.provider}/${agent.model}`] : []}\n filterable\n filterPlaceholder=\"Filter models\"\n filterProps={{ 'data-testid': 'model-filter' }}\n loading={\n <>\n <Spinner label=\"asking the session for its models\" />\n asking the session for its models…\n </>\n }\n onSelect={(value) => {\n const model = models.find((item) => `${item.provider}/${item.id}` === value);\n if (model === undefined) return;\n selectModel(model.provider, model.id);\n onClose();\n }}\n footer={\n <>\n <div className=\"flex flex-wrap items-center gap-1 px-3 py-2\">\n <span className=\"mr-1 text-sm font-semibold text-po-dim\">Thinking</span>\n {levels.length === 0 ? <span className=\"text-sm text-po-dim\">…</span> : null}\n {levels.map((level) => {\n const current = agent?.thinkingLevel === level;\n return (\n <Button\n key={level}\n variant=\"ghost\"\n size=\"xs\"\n data-testid={`thinking-${level}`}\n data-current={current}\n onClick={() => {\n selectThinkingLevel(level);\n onClose();\n }}\n className={cn(current && 'bg-po-tint-green font-semibold text-po-green')}\n >\n {level}\n </Button>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2 border-t border-po-border-soft px-3 py-2\">\n <Button\n variant=\"ghost\"\n size=\"xs\"\n role=\"switch\"\n aria-label=\"Codex Fast\"\n aria-checked={agent?.provider === 'openai-codex' && fastMode}\n aria-describedby=\"codex-fast-description\"\n data-testid=\"fast-toggle\"\n disabled={agent?.provider !== 'openai-codex'}\n onClick={() => selectFastMode(!fastMode)}\n className={cn(agent?.provider === 'openai-codex' && fastMode && 'bg-po-tint-green text-po-green')}\n >\n Fast {agent?.provider === 'openai-codex' && fastMode ? 'on' : 'off'}\n </Button>\n <span id=\"codex-fast-description\" className=\"text-sm text-po-dim\">\n {agent?.provider === 'openai-codex'\n ? 'Priority processing may cost more.'\n : 'Fast is available only for Codex.'}\n </span>\n </div>\n </>\n }\n />\n );\n}\n\n/** Session selection axes use the same popup presentation and trigger geometry. */\nexport function SelectionBar() {\n const activeId = useStore(sessionsStore, (state) => state.activeId);\n const raw = useActiveSession((state) => state.statuses['po-major-mode'] ?? '');\n const statuses = useActiveSession((state) => state.statuses);\n const widgets = useActiveSession((state) => state.widgets);\n const catalog = useActiveSession((state) => state.minorModes);\n const agent = useActiveSession((state) => state.agent);\n const stats = useActiveSession((state) => state.stats);\n const liveCost = useActiveSession((state) => state.liveCost);\n const models = useActiveSession((state) => state.models);\n const fastMode = useActiveSession((state) => state.fastMode);\n const thinkingLevels = useActiveSession((state) => state.thinkingLevels);\n const dialog = useActiveSession((state) => state.dialog);\n const pendingMenu = useStore(menuStore, (state) => state.pending);\n const claimed = useStore(menuStore, (state) => state.claimed);\n const [minorOpen, setMinorOpen] = useState(false);\n const [modelOpen, setModelOpen] = useState(false);\n\n const selection = parseSelection(raw);\n const profileIdentity = useActiveSession((state) => state.profileIdentity);\n // The profile status carries the profile name; the journaled identity carries what a person reads.\n const axes = selectionAxes(statuses).map((axis) =>\n axis.name === 'profile' && profileIdentity?.name && axis.values[0] === profileIdentity.profile\n ? { ...axis, values: [profileIdentity.name] }\n : axis,\n );\n const modes = minorModes(statuses, widgets, catalog);\n const activeMinors = modes.filter((mode) => mode.availability === 'on');\n\n const reportedAgentCost = Number(statuses[AGENT_COST_STATUS_KEY] ?? '');\n const agentCost = Number.isFinite(reportedAgentCost) ? reportedAgentCost : 0;\n const sessionCost = stats === null ? null : stats.cost + liveCost;\n /** The dialog this axis asked for, when the claim named it and it is still open. */\n const dialogFor = (name: string): DialogRequest | null =>\n dialog !== null && claimed !== null && claimed.dialogId === dialog.id && claimed.menu === name ? dialog : null;\n const minorDialog = dialogFor('minor');\n\n const axisClass = cn(\n buttonVariants({ variant: 'outline', size: 'lg' }),\n 'min-w-0 max-w-48 gap-1.5 px-3 font-sans font-medium text-po-text max-sm:min-w-24 max-sm:max-w-28 max-sm:flex-1 max-sm:basis-0 max-sm:shrink',\n );\n\n return (\n <footer\n data-testid=\"selection-bar\"\n data-pending={selection.pending}\n className=\"relative flex shrink-0 items-center gap-1.5 overflow-x-auto px-3 pb-3 [scrollbar-width:none] sm:gap-2 sm:px-5 [&::-webkit-scrollbar]:hidden\"\n >\n <AxisButton\n name=\"mode\"\n command=\"mode\"\n values={selection.majorMode ? [selection.majorMode] : []}\n sessionId={activeId}\n pending={pendingMenu === 'mode'}\n claimedDialog={dialogFor('mode')}\n className={cn(axisClass, 'max-sm:max-w-24')}\n >\n <span\n data-testid=\"selection-mode\"\n className={cn('min-w-0 truncate', AXIS_MARK, selection.pending ? 'decoration-po-yellow' : AXIS_TONE.mode)}\n >\n {selection.majorMode || 'Major mode'}\n </span>\n </AxisButton>\n\n {axes.map((axis) => (\n <AxisButton\n key={axis.name}\n name={axis.name}\n command={axis.command}\n values={axis.values.length === 0 && !axis.multi ? [axis.emptyLabel] : axis.values}\n multi={axis.multi}\n sessionId={activeId}\n pending={pendingMenu === axis.name}\n claimedDialog={dialogFor(axis.name)}\n className={axisClass}\n >\n <span\n data-testid={`selection-${axis.name}`}\n className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE[axis.name] ?? 'decoration-po-faint')}\n >\n {axis.values[0] ?? axis.emptyLabel}\n </span>\n {axis.values.length > 1 ? (\n <span data-testid={`selection-${axis.name}-more`} className=\"shrink-0 text-xs\">\n +{axis.values.length - 1}\n </span>\n ) : null}\n </AxisButton>\n ))}\n\n <Popover\n open={minorOpen || minorDialog !== null}\n onOpenChange={(next) => {\n if (next) {\n setMinorOpen(true);\n return;\n }\n if (minorDialog) cancelDialog(minorDialog.id);\n setMinorOpen(false);\n }}\n >\n <PopoverTrigger asChild>\n <Button\n data-testid=\"axis-minor\"\n title={`Minor modes${activeMinors.length ? `: ${activeMinors.map((mode) => mode.name).join(', ')}` : ''}`}\n className={cn(axisClass, 'max-sm:max-w-24')}\n >\n <span data-testid=\"minor-summary\" className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE.minor)}>\n {activeMinors[0]?.name ?? 'Minor modes'}\n </span>\n {activeMinors.length > 1 ? <span className=\"shrink-0 text-xs\">+{activeMinors.length - 1}</span> : null}\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n </Button>\n </PopoverTrigger>\n {minorDialog ? (\n <AxisMenu key={`${activeId}:${minorDialog.id}`} menu=\"minor\" dialog={minorDialog} />\n ) : minorOpen ? (\n <MinorModesPopup key={activeId} modes={modes} onClose={() => setMinorOpen(false)} />\n ) : null}\n </Popover>\n\n <PluginSurface slot={HOST_SLOTS.selectionBar} sessionId={activeId} />\n <div className=\"min-w-0 flex-1 max-sm:hidden\" />\n\n <Popover open={modelOpen} onOpenChange={setModelOpen}>\n <PopoverTrigger asChild>\n <Button\n data-testid=\"axis-model\"\n title={\n agent\n ? `${agent.provider}/${agent.model}${agent.thinkingLevel ? ` · ${agent.thinkingLevel}` : ''}`\n : 'Model and thinking level'\n }\n className={axisClass}\n >\n <span data-testid=\"agent-model\" className={cn('min-w-0 truncate', AXIS_MARK, AXIS_TONE.model)}>\n {agent?.model ?? 'Model'}\n </span>\n <span data-testid=\"agent-thinking\" className=\"shrink-0 text-sm text-po-dim max-sm:hidden\">\n {agent?.thinkingLevel ?? ''}\n </span>\n <ChevronDownIcon className=\"size-3.5 shrink-0 opacity-60\" />\n </Button>\n </PopoverTrigger>\n {modelOpen ? (\n <ModelPopup\n key={activeId}\n agent={agent}\n models={models}\n levels={thinkingLevels}\n fastMode={fastMode}\n onClose={() => setModelOpen(false)}\n />\n ) : null}\n </Popover>\n\n <span\n data-testid=\"top-context\"\n title={\n stats?.contextTokens != null && stats.contextWindow != null\n ? `${stats.contextTokens.toLocaleString()} of ${stats.contextWindow.toLocaleString()} tokens`\n : 'Context usage, once the session reports it'\n }\n className=\"shrink-0 text-sm text-po-dim max-sm:hidden\"\n >\n {stats?.contextPercent == null ? '' : `ctx ${Math.round(stats.contextPercent)}%`}\n </span>\n <span\n data-testid=\"top-cost\"\n title={\n stats === null || sessionCost === null\n ? ''\n : agentCost > 0\n ? `$${sessionCost.toFixed(2)} session + $${agentCost.toFixed(2)} agents, ${stats.totalTokens.toLocaleString()} tokens this session`\n : `${stats.totalTokens.toLocaleString()} tokens this session`\n }\n className=\"shrink-0 text-sm text-po-dim max-sm:hidden\"\n >\n {sessionCost === null ? '' : `$${(sessionCost + agentCost).toFixed(2)}`}\n </span>\n </footer>\n );\n}\n"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ const require_commands = require("./commands.cjs");
|
|
|
2
2
|
const require_hub = require("../../types/hub.cjs");
|
|
3
3
|
const require_notification = require("../../types/notification.cjs");
|
|
4
4
|
let _agimon_ai_po_core_web = require("@agimon-ai/po-core/web");
|
|
5
|
+
let _agimon_ai_po_web_components_text = require("@agimon-ai/po-web-components/text");
|
|
5
6
|
//#region src/web/lib/sessionModel.ts
|
|
6
7
|
const initialSessionState = {
|
|
7
8
|
hasNewerHistory: false,
|
|
@@ -447,7 +448,13 @@ function applyDialog(state, frame) {
|
|
|
447
448
|
};
|
|
448
449
|
}
|
|
449
450
|
if (method !== "select" && method !== "confirm" && method !== "input" && method !== "editor") return state;
|
|
450
|
-
const
|
|
451
|
+
const rawOptions = Array.isArray(frame.options) ? frame.options.map((option) => asString(option)) : [];
|
|
452
|
+
const rawDescriptions = Array.isArray(frame.descriptions) ? frame.descriptions : [];
|
|
453
|
+
const kept = rawOptions.flatMap((option, index) => option ? [index] : []);
|
|
454
|
+
const options = kept.map((index) => rawOptions[index] ?? "");
|
|
455
|
+
const descriptions = kept.map((index) => asString(rawDescriptions[index]));
|
|
456
|
+
const rawIcons = Array.isArray(frame.icons) ? frame.icons : [];
|
|
457
|
+
const icons = kept.map((index) => (0, _agimon_ai_po_web_components_text.inlineProfileIcon)(rawIcons[index]) ?? "");
|
|
451
458
|
const approval = method === "select" ? (0, _agimon_ai_po_core_web.parsePoApprovalPrompt)(frame.approval) : void 0;
|
|
452
459
|
return {
|
|
453
460
|
...state,
|
|
@@ -457,6 +464,8 @@ function applyDialog(state, frame) {
|
|
|
457
464
|
title: asString(frame.title, "The agent needs an answer"),
|
|
458
465
|
message: asString(frame.message),
|
|
459
466
|
options,
|
|
467
|
+
...descriptions.some(Boolean) ? { descriptions } : {},
|
|
468
|
+
...icons.some(Boolean) ? { icons } : {},
|
|
460
469
|
placeholder: asString(frame.placeholder),
|
|
461
470
|
prefill: asString(frame.prefill),
|
|
462
471
|
...approval === void 0 ? {} : { approval }
|