@workerdeck/ui 1.0.0 → 1.2.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/build/{SessionPanel-DDgBkHsi.mjs → SessionPanel-DVhnUwXw.mjs} +81 -33
- package/build/SessionPanel-DVhnUwXw.mjs.map +1 -0
- package/build/{SessionPanel-E_L_ldQ5.d.mts → SessionPanel-yNO60Tzw.d.mts} +11 -67
- package/build/format-C4h4jZL_.d.mts +25 -0
- package/build/format.d.mts +2 -3
- package/build/format.mjs +2 -2
- package/build/index.d.mts +257 -586
- package/build/index.mjs +4 -3
- package/build/index.mjs.map +1 -1
- package/build/scoped.css +21 -0
- package/build/{status-C0HSLZas.mjs → status-BW2xj79g.mjs} +14 -5
- package/build/status-BW2xj79g.mjs.map +1 -0
- package/build/workspace.d.mts +6 -64
- package/build/workspace.mjs +4 -3
- package/build/workspace.mjs.map +1 -1
- package/package.json +24 -24
- package/src/components/agent/TranscriptItemView.tsx +19 -1
- package/src/components/terminal/TerminalTranscript.tsx +4 -1
- package/src/components/terminal/height.ts +6 -1
- package/src/components/terminal/items.tsx +14 -1
- package/src/lib/format.ts +10 -0
- package/build/SessionPanel-DDgBkHsi.mjs.map +0 -1
- package/build/format-B8ZM9LPy.d.mts +0 -16
- package/build/status-C0HSLZas.mjs.map +0 -1
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
//#region src/lib/format.d.ts
|
|
2
|
-
declare function formatCost(usd: number | undefined): string;
|
|
3
|
-
declare function formatDuration(ms: number): string;
|
|
4
|
-
declare function formatTokens(tokens: number): string;
|
|
5
|
-
declare function formatBytes(bytes: number): string;
|
|
6
|
-
declare function formatCountdown(untilEpochMs: number, now?: number): string;
|
|
7
|
-
declare function formatRelativeTime(epochMs: number | undefined, now?: number): string;
|
|
8
|
-
declare function formatRateLimitWindow(key: string): string;
|
|
9
|
-
declare function formatRateLimitWindowLong(key: string): string;
|
|
10
|
-
declare function rateLimitWindowSeconds(key: string): number | undefined;
|
|
11
|
-
declare function formatAgoPrecise(epochMs: number, now?: number): string;
|
|
12
|
-
declare function toolInputPreview(input: unknown, max?: number): string;
|
|
13
|
-
declare function friendlyModel(id: string | undefined): string | undefined;
|
|
14
|
-
//#endregion
|
|
15
|
-
export { formatDuration as a, formatRelativeTime as c, rateLimitWindowSeconds as d, toolInputPreview as f, formatCountdown as i, formatTokens as l, formatBytes as n, formatRateLimitWindow as o, formatCost as r, formatRateLimitWindowLong as s, formatAgoPrecise as t, friendlyModel as u };
|
|
16
|
-
//# sourceMappingURL=format-B8ZM9LPy.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status-C0HSLZas.mjs","names":[],"sources":["../src/lib/format.ts","../src/lib/status.ts"],"sourcesContent":["export function formatCost(usd: number | undefined): string {\n if (usd === undefined || Number.isNaN(usd)) {\n return '—'\n }\n if (usd === 0) {\n return '$0.00'\n }\n if (usd < 0.01) {\n return '<$0.01'\n }\n return `$${usd.toFixed(2)}`\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${Math.round(ms)}ms`\n }\n const s = ms / 1000\n if (s < 60) {\n return `${s.toFixed(1)}s`\n }\n const m = Math.floor(s / 60)\n return `${m}m ${Math.round(s % 60)}s`\n}\n\nexport function formatTokens(tokens: number): string {\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M`\n }\n if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}k`\n }\n return String(Math.round(tokens))\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`\n }\n return `${bytes} B`\n}\n\nexport function formatCountdown(untilEpochMs: number, now = Date.now()): string {\n const remaining = untilEpochMs - now\n if (remaining <= 0) {\n return 'now'\n }\n const minutes = Math.ceil(remaining / 60_000)\n if (minutes < 1) {\n return '<1m'\n }\n if (minutes < 60) {\n return `${minutes}m`\n }\n const days = Math.floor(minutes / (60 * 24))\n if (days >= 1) {\n return `${days}d ${Math.floor((minutes % (60 * 24)) / 60)}h`\n }\n return `${Math.floor(minutes / 60)}h ${minutes % 60}m`\n}\n\nexport function formatRelativeTime(epochMs: number | undefined, now = Date.now()): string {\n if (!epochMs) {\n return '—'\n }\n const diff = Math.max(0, now - epochMs)\n const s = Math.floor(diff / 1000)\n if (s < 60) {\n return 'just now'\n }\n const m = Math.floor(s / 60)\n if (m < 60) {\n return `${m}m ago`\n }\n const h = Math.floor(m / 60)\n if (h < 24) {\n return `${h}h ago`\n }\n const d = Math.floor(h / 24)\n return `${d}d ago`\n}\n\nexport function formatRateLimitWindow(key: string): string {\n if (key === 'five_hour') {\n return '5h'\n }\n if (key === 'seven_day') {\n return '7d'\n }\n const spaced = key.replaceAll('_', ' ')\n return key.startsWith('seven_day_') ? `7d ${spaced.slice('seven day '.length)}` : spaced\n}\n\nexport function formatRateLimitWindowLong(key: string): string {\n if (key === 'five_hour') {\n return '5-hour session'\n }\n if (key === 'seven_day') {\n return 'Weekly'\n }\n if (key === 'seven_day_oauth_apps') {\n return 'Weekly · apps'\n }\n const capitalize = (s: string) => s.replace(/\\b\\w/g, (c) => c.toUpperCase())\n if (!key.startsWith('seven_day_')) {\n return capitalize(key.replaceAll('_', ' '))\n }\n return `Weekly · ${capitalize(key.slice('seven_day_'.length).replaceAll('_', ' '))}`\n}\n\nexport function rateLimitWindowSeconds(key: string): number | undefined {\n if (key === 'five_hour') {\n return 5 * 3600\n }\n if (key.startsWith('seven_day')) {\n return 7 * 86_400\n }\n return undefined\n}\n\nexport function formatAgoPrecise(epochMs: number, now = Date.now()): string {\n const seconds = Math.max(0, Math.floor((now - epochMs) / 1000))\n if (seconds < 60) {\n return `${seconds} sec${seconds === 1 ? '' : 's'} ago`\n }\n if (seconds < 3600) {\n const minutes = Math.floor(seconds / 60)\n return `${minutes} min${minutes === 1 ? '' : 's'} ago`\n }\n const hours = Math.floor(seconds / 3600)\n return `${hours} hour${hours === 1 ? '' : 's'} ago`\n}\n\nexport function toolInputPreview(input: unknown, max = 80): string {\n if (input === null || input === undefined) {\n return ''\n }\n if (typeof input === 'object') {\n const o = input as Record<string, unknown>\n const primary = o.command ?? o.file_path ?? o.path ?? o.url ?? o.pattern ?? o.query ?? o.description\n if (typeof primary === 'string') {\n return primary.length > max ? primary.slice(0, max - 1) + '…' : primary\n }\n }\n const text = JSON.stringify(input) ?? ''\n return text.length > max ? text.slice(0, max - 1) + '…' : text\n}\n\nconst MODEL_FAMILIES: Record<string, { name: string; joiner?: string }> = {\n gpt: { name: 'GPT', joiner: '-' },\n deepseek: { name: 'DeepSeek' },\n glm: { name: 'GLM' },\n qwen: { name: 'Qwen' },\n kimi: { name: 'Kimi' },\n llama: { name: 'Llama' },\n mistral: { name: 'Mistral' },\n grok: { name: 'Grok' },\n}\n\nexport function friendlyModel(id: string | undefined): string | undefined {\n if (!id) {\n return undefined\n }\n const withoutVariant = id.split('[')[0] ?? id\n const parts = withoutVariant.toLowerCase().split('-').filter(Boolean)\n if (parts[0] === 'claude') {\n parts.shift()\n }\n const familyToken = parts.shift()\n if (!familyToken) {\n return id\n }\n const family = MODEL_FAMILIES[familyToken]\n const name =\n family?.name ??\n // OpenAI's reasoning series is lower-case by its own convention ('o3-mini'); \"O3\" reads as a different product.\n (/^o\\d+$/.test(familyToken) ? familyToken : `${familyToken.charAt(0).toUpperCase()}${familyToken.slice(1)}`)\n\n const version: string[] = []\n const words: string[] = []\n for (const part of parts) {\n if (/^\\d{8}$/.test(part)) {\n continue\n }\n if (/^\\d+(\\.\\d+)?$/.test(part)) {\n version.push(part)\n } else {\n words.push(`${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n }\n }\n const versioned = version.length > 0 ? `${name}${family?.joiner ?? ' '}${version.join('.')}` : name\n return [versioned, ...words].join(' ')\n}\n","import type { ModelOption, RateLimitInfo, SessionStatus } from '@workerdeck/protocol'\n\nexport type StatusSeverity = 'none' | 'warning' | 'error'\n\nexport type StatusPresentation = {\n icon: string\n label: string\n severity: StatusSeverity\n}\n\nexport type StatusReadings = {\n status: SessionStatus\n connection?: 'live' | 'reconnecting' | 'offline'\n}\n\nconst STATUS_META: Record<SessionStatus, StatusPresentation> = {\n starting: { icon: 'loading~spin', label: 'Starting', severity: 'none' },\n running: { icon: 'loading~spin', label: 'Running', severity: 'none' },\n awaiting_approval: { icon: 'warning', label: 'Needs approval', severity: 'warning' },\n idle: { icon: 'check', label: 'Idle', severity: 'none' },\n parked: { icon: 'debug-pause', label: 'Parked', severity: 'none' },\n failed: { icon: 'error', label: 'Failed', severity: 'error' },\n closed: { icon: 'circle-slash', label: 'Closed', severity: 'none' },\n}\n\nexport function statusPresentation(vitals: StatusReadings | undefined): StatusPresentation {\n if (!vitals) {\n return { icon: 'hubot', label: 'Connecting…', severity: 'none' }\n }\n if (vitals.connection === 'offline') {\n return { icon: 'debug-disconnect', label: 'Offline', severity: 'error' }\n }\n if (vitals.connection === 'reconnecting') {\n return { icon: 'sync~spin', label: 'Reconnecting…', severity: 'warning' }\n }\n return STATUS_META[vitals.status] ?? { icon: 'hubot', label: vitals.status, severity: 'none' }\n}\n\nexport function meterSeverity(pct: number | undefined): StatusSeverity {\n if (pct === undefined) {\n return 'none'\n }\n if (pct >= 95) {\n return 'error'\n }\n if (pct >= 80) {\n return 'warning'\n }\n return 'none'\n}\n\nexport type UsageLane = 'session' | 'weekly' | 'model'\n\nexport function usageWindow(\n rateLimits: Record<string, RateLimitInfo> | undefined,\n lane: UsageLane,\n): { key: string; info: RateLimitInfo } | undefined {\n if (!rateLimits) {\n return undefined\n }\n if (lane === 'session') {\n const info = rateLimits.five_hour\n return info ? { key: 'five_hour', info } : undefined\n }\n if (lane === 'weekly') {\n const info = rateLimits.seven_day\n return info ? { key: 'seven_day', info } : undefined\n }\n const scoped = Object.fromEntries(\n Object.entries(rateLimits).filter(([key]) => key.startsWith('seven_day_') && key !== 'seven_day_oauth_apps'),\n )\n return tightestWindow(scoped)\n}\n\nexport function tightestWindow(rateLimits: Record<string, RateLimitInfo> | undefined): { key: string; info: RateLimitInfo } | undefined {\n const entries = Object.entries(rateLimits ?? {})\n if (entries.length === 0) {\n return undefined\n }\n let best: { key: string; info: RateLimitInfo } | undefined\n for (const [key, info] of entries) {\n const rank = info.status === 'rejected' ? Number.POSITIVE_INFINITY : (info.utilization ?? -1)\n const bestRank =\n best === undefined\n ? Number.NEGATIVE_INFINITY\n : best.info.status === 'rejected'\n ? Number.POSITIVE_INFINITY\n : (best.info.utilization ?? -1)\n if (rank > bestRank) {\n best = { key, info }\n }\n }\n return best\n}\n\nexport function windowLabel(key: string): string {\n if (key === 'five_hour') {\n return 'Session'\n }\n if (key === 'seven_day') {\n return 'Weekly'\n }\n const scoped = key.startsWith('seven_day_') ? key.slice('seven_day_'.length) : key\n const words = scoped.replaceAll('_', ' ')\n return words.charAt(0).toUpperCase() + words.slice(1)\n}\n\nexport type ModelReadings = { model?: string; models: readonly ModelOption[] }\n\nexport function currentModel(vitals: ModelReadings | undefined): ModelOption | undefined {\n const id = vitals?.model\n if (!id) {\n return undefined\n }\n const bare = (value: string) => value.replace(/\\[.*\\]$/, '')\n const wanted = bare(id)\n return vitals.models.find((m) => bare(m.value) === wanted || (m.resolvedModel && bare(m.resolvedModel) === wanted))\n}\n\nexport function modelLabel(vitals: ModelReadings | undefined): string {\n if (!vitals?.model) {\n return 'Default'\n }\n return currentModel(vitals)?.displayName ?? vitals.model\n}\n\nexport function contextSeverity(usage: { percentage: number } | undefined): StatusSeverity {\n return meterSeverity(usage?.percentage)\n}\n\nexport function meterColorClass(pct: number | undefined): string {\n const severity = meterSeverity(pct)\n return severity === 'error' ? 'text-danger' : severity === 'warning' ? 'text-warning' : 'text-fg-3'\n}\n\n/**\n * The fill colour for a meter bar. Deliberately a different ramp from\n * {@link meterColorClass}: a bar reads as alarming later than a number does, so the tint\n * turns at 70/90 where the text severity turns at 80/95.\n */\nexport function meterTintClass(pct: number): string {\n return pct >= 90 ? 'bg-danger' : pct >= 70 ? 'bg-warning' : 'bg-accent'\n}\n"],"mappings":"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"}
|