jettypod 4.4.116 → 4.4.120
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/.env +7 -0
- package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +124 -48
- package/apps/dashboard/app/api/claude/[workItemId]/route.ts +171 -58
- package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +161 -10
- package/apps/dashboard/app/api/tests/run/stream/route.ts +13 -1
- package/apps/dashboard/app/api/usage/route.ts +17 -0
- package/apps/dashboard/app/api/work/[id]/route.ts +35 -0
- package/apps/dashboard/app/api/work/[id]/status/route.ts +43 -1
- package/apps/dashboard/app/connect-claude/page.tsx +24 -0
- package/apps/dashboard/app/decision/[id]/page.tsx +14 -14
- package/apps/dashboard/app/demo/gates/page.tsx +42 -42
- package/apps/dashboard/app/design-system/page.tsx +868 -0
- package/apps/dashboard/app/globals.css +6 -2
- package/apps/dashboard/app/install-claude/page.tsx +9 -7
- package/apps/dashboard/app/layout.tsx +17 -5
- package/apps/dashboard/app/login/page.tsx +250 -0
- package/apps/dashboard/app/page.tsx +11 -9
- package/apps/dashboard/app/settings/page.tsx +4 -2
- package/apps/dashboard/app/signup/page.tsx +245 -0
- package/apps/dashboard/app/subscribe/page.tsx +11 -0
- package/apps/dashboard/app/welcome/page.tsx +24 -1
- package/apps/dashboard/app/work/[id]/page.tsx +34 -50
- package/apps/dashboard/components/AppShell.tsx +95 -55
- package/apps/dashboard/components/CardMenu.tsx +56 -13
- package/apps/dashboard/components/ClaudePanel.tsx +301 -582
- package/apps/dashboard/components/ClaudePanelInput.tsx +23 -14
- package/apps/dashboard/components/ConnectClaudeScreen.tsx +210 -0
- package/apps/dashboard/components/CopyableId.tsx +3 -3
- package/apps/dashboard/components/DetailReviewActions.tsx +109 -0
- package/apps/dashboard/components/DragContext.tsx +75 -65
- package/apps/dashboard/components/DraggableCard.tsx +6 -46
- package/apps/dashboard/components/DropZone.tsx +2 -2
- package/apps/dashboard/components/EditableDetailDescription.tsx +1 -1
- package/apps/dashboard/components/EditableTitle.tsx +26 -6
- package/apps/dashboard/components/ElapsedTimer.tsx +54 -0
- package/apps/dashboard/components/EpicGroup.tsx +329 -0
- package/apps/dashboard/components/GateCard.tsx +100 -16
- package/apps/dashboard/components/GateChoiceCard.tsx +15 -17
- package/apps/dashboard/components/InstallClaudeScreen.tsx +140 -51
- package/apps/dashboard/components/JettyLoader.tsx +38 -0
- package/apps/dashboard/components/KanbanBoard.tsx +147 -766
- package/apps/dashboard/components/KanbanCard.tsx +506 -0
- package/apps/dashboard/components/LazyMarkdown.tsx +12 -0
- package/apps/dashboard/components/MainNav.tsx +20 -54
- package/apps/dashboard/components/MessageBlock.tsx +391 -0
- package/apps/dashboard/components/ModeStartCard.tsx +15 -15
- package/apps/dashboard/components/OnboardingWelcome.tsx +214 -0
- package/apps/dashboard/components/PlaceholderCard.tsx +11 -21
- package/apps/dashboard/components/ProjectSwitcher.tsx +36 -8
- package/apps/dashboard/components/PrototypeTimeline.tsx +25 -25
- package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +265 -301
- package/apps/dashboard/components/RealTimeTestsWrapper.tsx +97 -74
- package/apps/dashboard/components/ReviewFooter.tsx +141 -0
- package/apps/dashboard/components/SessionList.tsx +19 -18
- package/apps/dashboard/components/SubscribeContent.tsx +206 -0
- package/apps/dashboard/components/TestTree.tsx +15 -14
- package/apps/dashboard/components/TipCard.tsx +177 -0
- package/apps/dashboard/components/Toast.tsx +5 -5
- package/apps/dashboard/components/TypeIcon.tsx +56 -0
- package/apps/dashboard/components/UpgradeBanner.tsx +30 -0
- package/apps/dashboard/components/WaveCompletionAnimation.tsx +61 -62
- package/apps/dashboard/components/WelcomeScreen.tsx +25 -27
- package/apps/dashboard/components/WorkItemHeader.tsx +4 -4
- package/apps/dashboard/components/WorkItemTree.tsx +9 -28
- package/apps/dashboard/components/settings/AccountSection.tsx +169 -0
- package/apps/dashboard/components/settings/EnvVarsSection.tsx +54 -79
- package/apps/dashboard/components/settings/GeneralSection.tsx +26 -31
- package/apps/dashboard/components/settings/SettingsLayout.tsx +4 -4
- package/apps/dashboard/components/ui/Button.tsx +104 -0
- package/apps/dashboard/components/ui/Input.tsx +78 -0
- package/apps/dashboard/contexts/ClaudeSessionContext.tsx +408 -105
- package/apps/dashboard/contexts/ConnectionStatusContext.tsx +25 -4
- package/apps/dashboard/contexts/UsageContext.tsx +155 -0
- package/apps/dashboard/contexts/usageHelpers.js +9 -0
- package/apps/dashboard/electron/ipc-handlers.js +281 -88
- package/apps/dashboard/electron/main.js +691 -131
- package/apps/dashboard/electron/preload.js +25 -4
- package/apps/dashboard/electron/session-manager.js +163 -0
- package/apps/dashboard/electron-builder.config.js +3 -5
- package/apps/dashboard/hooks/useKanbanAnimation.ts +29 -0
- package/apps/dashboard/hooks/useKanbanUndo.ts +83 -0
- package/apps/dashboard/lib/backlog-parser.ts +50 -0
- package/apps/dashboard/lib/claude-process-manager.ts +50 -11
- package/apps/dashboard/lib/constants.ts +43 -0
- package/apps/dashboard/lib/db-bridge.ts +33 -0
- package/apps/dashboard/lib/db.ts +136 -20
- package/apps/dashboard/lib/kanban-utils.ts +70 -0
- package/apps/dashboard/lib/run-migrations.js +27 -2
- package/apps/dashboard/lib/session-state-machine.ts +3 -0
- package/apps/dashboard/lib/session-stream-manager.ts +144 -38
- package/apps/dashboard/lib/shadows.ts +7 -0
- package/apps/dashboard/lib/tests.ts +3 -1
- package/apps/dashboard/lib/utils.ts +6 -0
- package/apps/dashboard/next.config.js +35 -14
- package/apps/dashboard/package.json +6 -3
- package/apps/dashboard/public/bug-icon.svg +9 -0
- package/apps/dashboard/public/buoy-icon.svg +9 -0
- package/apps/dashboard/public/fonts/Satoshi-Variable.woff2 +0 -0
- package/apps/dashboard/public/fonts/Satoshi-VariableItalic.woff2 +0 -0
- package/apps/dashboard/public/in-flight-seagull.svg +9 -0
- package/apps/dashboard/public/jetty-icon-loading-alt.svg +11 -0
- package/apps/dashboard/public/jetty-icon-loading.svg +11 -0
- package/apps/dashboard/public/jettypod_logo.png +0 -0
- package/apps/dashboard/public/pier-icon.svg +14 -0
- package/apps/dashboard/public/star-icon.svg +9 -0
- package/apps/dashboard/public/wrench-icon.svg +9 -0
- package/apps/dashboard/scripts/upload-to-r2.js +89 -0
- package/apps/dashboard/scripts/ws-server.js +191 -0
- package/apps/dashboard/tsconfig.tsbuildinfo +1 -0
- package/apps/update-server/package.json +16 -0
- package/apps/update-server/schema.sql +31 -0
- package/apps/update-server/src/index.ts +1085 -0
- package/apps/update-server/tsconfig.json +16 -0
- package/apps/update-server/wrangler.toml +35 -0
- package/cucumber.js +9 -3
- package/docs/COMMAND_REFERENCE.md +34 -0
- package/hooks/post-checkout +32 -75
- package/hooks/post-merge +111 -10
- package/jest.setup.js +1 -0
- package/jettypod.js +54 -116
- package/lib/chore-taxonomy.js +33 -10
- package/lib/database.js +36 -16
- package/lib/db-watcher.js +1 -1
- package/lib/git-hooks/pre-commit +1 -1
- package/lib/jettypod-backup.js +27 -4
- package/lib/migrations/027-plan-at-creation-column.js +33 -0
- package/lib/migrations/028-ready-for-review-column.js +27 -0
- package/lib/migrations/029-remove-autoincrement.js +307 -0
- package/lib/migrations/029-rename-corrupted-to-cleaned.js +149 -0
- package/lib/migrations/index.js +47 -4
- package/lib/schema.js +13 -6
- package/lib/seed-onboarding.js +101 -69
- package/lib/update-command/index.js +9 -175
- package/lib/work-commands/index.js +129 -16
- package/lib/work-tracking/index.js +86 -46
- package/lib/worktree-diagnostics.js +16 -16
- package/lib/worktree-facade.js +1 -1
- package/lib/worktree-manager.js +8 -8
- package/lib/worktree-reconciler.js +5 -5
- package/package.json +9 -2
- package/scripts/ndjson-to-cucumber-json.js +152 -0
- package/scripts/postinstall.js +25 -0
- package/skills-templates/bug-mode/SKILL.md +39 -28
- package/skills-templates/bug-planning/SKILL.md +25 -29
- package/skills-templates/chore-mode/SKILL.md +131 -68
- package/skills-templates/chore-mode/verification.js +51 -10
- package/skills-templates/chore-planning/SKILL.md +47 -18
- package/skills-templates/epic-planning/SKILL.md +68 -48
- package/skills-templates/external-transition/SKILL.md +47 -47
- package/skills-templates/feature-planning/SKILL.md +83 -73
- package/skills-templates/production-mode/SKILL.md +49 -49
- package/skills-templates/request-routing/SKILL.md +27 -14
- package/skills-templates/simple-improvement/SKILL.md +68 -44
- package/skills-templates/speed-mode/SKILL.md +209 -128
- package/skills-templates/stable-mode/SKILL.md +105 -94
- package/templates/bdd-guidance.md +139 -0
- package/templates/bdd-scaffolding/wait.js +18 -0
- package/templates/bdd-scaffolding/world.js +19 -0
- package/.jettypod-backup/work.db +0 -0
- package/apps/dashboard/app/access-code/page.tsx +0 -110
- package/lib/discovery-checkpoint.js +0 -123
- package/skills-templates/project-discovery/SKILL.md +0 -372
|
@@ -124,18 +124,18 @@ export default function GateDemoPage() {
|
|
|
124
124
|
const [activeTab, setActiveTab] = useState<DemoTab>('workflow');
|
|
125
125
|
|
|
126
126
|
return (
|
|
127
|
-
<div className="min-h-screen bg-zinc-100 dark:bg-zinc-900 p-
|
|
127
|
+
<div className="min-h-screen bg-zinc-100 dark:bg-zinc-900 p-10">
|
|
128
128
|
<div className="max-w-5xl mx-auto">
|
|
129
129
|
{/* Header */}
|
|
130
|
-
<div className="mb-
|
|
131
|
-
<h1 className="text-2xl font-bold text-zinc-900 dark:text-zinc-100 mb-1">Gate Protocol Demo</h1>
|
|
132
|
-
<p className="text-zinc-500 dark:text-zinc-400 text-
|
|
130
|
+
<div className="mb-8">
|
|
131
|
+
<h1 className="text-2xl font-bold text-zinc-900 dark:text-zinc-100 mb-1.5">Gate Protocol Demo</h1>
|
|
132
|
+
<p className="text-zinc-500 dark:text-zinc-400 text-base">
|
|
133
133
|
Prototype narrated UI components for workflow status and user input.
|
|
134
134
|
</p>
|
|
135
135
|
</div>
|
|
136
136
|
|
|
137
137
|
{/* Tab nav */}
|
|
138
|
-
<div className="flex gap-1 mb-
|
|
138
|
+
<div className="flex gap-1.5 mb-8 bg-white dark:bg-zinc-800 rounded-xl border border-zinc-200 dark:border-zinc-700 p-1.5 w-fit"
|
|
139
139
|
style={{ boxShadow: '0 1px 2px rgba(0,0,0,0.03)' }}
|
|
140
140
|
>
|
|
141
141
|
{([
|
|
@@ -146,7 +146,7 @@ export default function GateDemoPage() {
|
|
|
146
146
|
<button
|
|
147
147
|
key={id}
|
|
148
148
|
onClick={() => setActiveTab(id)}
|
|
149
|
-
className={`px-
|
|
149
|
+
className={`px-5 py-2 text-base font-medium rounded-lg transition-colors ${
|
|
150
150
|
activeTab === id
|
|
151
151
|
? 'bg-zinc-900 dark:bg-zinc-100 text-white dark:text-zinc-900'
|
|
152
152
|
: 'text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200'
|
|
@@ -250,11 +250,11 @@ function WorkflowDemo() {
|
|
|
250
250
|
return (
|
|
251
251
|
<>
|
|
252
252
|
{/* Controls */}
|
|
253
|
-
<div className="flex items-center gap-
|
|
253
|
+
<div className="flex items-center gap-4 mb-8">
|
|
254
254
|
<button
|
|
255
255
|
onClick={play}
|
|
256
256
|
disabled={isPlaying}
|
|
257
|
-
className="px-
|
|
257
|
+
className="px-5 py-3 bg-zinc-900 dark:bg-zinc-100 hover:bg-zinc-800 dark:hover:bg-zinc-200 disabled:opacity-50 text-white dark:text-zinc-900 text-base font-medium rounded-xl transition-all duration-200 hover:-translate-y-0.5 active:translate-y-0"
|
|
258
258
|
style={{ boxShadow: '0 1px 2px rgba(0,0,0,0.1), 0 2px 4px rgba(0,0,0,0.06)' }}
|
|
259
259
|
>
|
|
260
260
|
{isDone ? 'Replay' : isPaused ? 'Waiting for input...' : isPlaying ? 'Playing...' : 'Play Workflow'}
|
|
@@ -262,20 +262,20 @@ function WorkflowDemo() {
|
|
|
262
262
|
{(isPlaying || isDone) && (
|
|
263
263
|
<button
|
|
264
264
|
onClick={reset}
|
|
265
|
-
className="px-
|
|
265
|
+
className="px-5 py-3 bg-white dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 hover:bg-zinc-50 dark:hover:bg-zinc-700 text-zinc-700 dark:text-zinc-300 text-base font-medium rounded-xl transition-colors"
|
|
266
266
|
>
|
|
267
267
|
Reset
|
|
268
268
|
</button>
|
|
269
269
|
)}
|
|
270
270
|
<div className="flex-1" />
|
|
271
|
-
<div className="flex bg-white dark:bg-zinc-800 rounded-xl border border-zinc-200 dark:border-zinc-700 p-1 overflow-hidden"
|
|
271
|
+
<div className="flex bg-white dark:bg-zinc-800 rounded-xl border border-zinc-200 dark:border-zinc-700 p-1.5 overflow-hidden"
|
|
272
272
|
style={{ boxShadow: '0 1px 2px rgba(0,0,0,0.03)' }}
|
|
273
273
|
>
|
|
274
274
|
{(['narrated', 'direct', 'split'] as ViewMode[]).map(mode => (
|
|
275
275
|
<button
|
|
276
276
|
key={mode}
|
|
277
277
|
onClick={() => setViewMode(mode)}
|
|
278
|
-
className={`px-
|
|
278
|
+
className={`px-4 py-2 text-base font-medium rounded-lg transition-colors ${
|
|
279
279
|
viewMode === mode
|
|
280
280
|
? 'bg-zinc-900 dark:bg-zinc-100 text-white dark:text-zinc-900'
|
|
281
281
|
: 'text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200'
|
|
@@ -290,7 +290,7 @@ function WorkflowDemo() {
|
|
|
290
290
|
{/* Progress */}
|
|
291
291
|
{(isPlaying || isDone) && (
|
|
292
292
|
<div className="mb-6">
|
|
293
|
-
<div className="flex items-center justify-between text-
|
|
293
|
+
<div className="flex items-center justify-between text-base text-zinc-500 dark:text-zinc-400 mb-2">
|
|
294
294
|
<span>{gateCount} of {WORKFLOW_GATES.length} gates</span>
|
|
295
295
|
<span>{visibleCount} of {totalSteps} events</span>
|
|
296
296
|
</div>
|
|
@@ -305,7 +305,7 @@ function WorkflowDemo() {
|
|
|
305
305
|
|
|
306
306
|
{/* Content */}
|
|
307
307
|
{viewMode === 'split' ? (
|
|
308
|
-
<div className="grid grid-cols-2 gap-
|
|
308
|
+
<div className="grid grid-cols-2 gap-6">
|
|
309
309
|
<Panel title="Summary View" subtitle="What the user sees" highlight>
|
|
310
310
|
<NarratedView gates={visibleGates} isPlaying={isPlaying} answeredQuestions={answeredQuestions} onAnswerQuestion={handleAnswerQuestion} />
|
|
311
311
|
</Panel>
|
|
@@ -324,26 +324,26 @@ function WorkflowDemo() {
|
|
|
324
324
|
)}
|
|
325
325
|
|
|
326
326
|
{!isPlaying && !isPaused && !isDone && (
|
|
327
|
-
<div className="mt-6 bg-white dark:bg-zinc-800 rounded-xl border border-zinc-200 dark:border-zinc-700 p-
|
|
327
|
+
<div className="mt-6 bg-white dark:bg-zinc-800 rounded-xl border border-zinc-200 dark:border-zinc-700 p-6"
|
|
328
328
|
style={{ boxShadow: '0 1px 2px rgba(0,0,0,0.03)' }}
|
|
329
329
|
>
|
|
330
|
-
<h3 className="text-
|
|
331
|
-
<div className="grid grid-cols-4 gap-
|
|
330
|
+
<h3 className="text-base font-semibold text-zinc-700 dark:text-zinc-300 mb-4">How it works</h3>
|
|
331
|
+
<div className="grid grid-cols-4 gap-6 text-base text-zinc-500 dark:text-zinc-400">
|
|
332
332
|
<div>
|
|
333
333
|
<span className="font-medium text-zinc-700 dark:text-zinc-300">1. User sends request</span>
|
|
334
|
-
<p className="mt-1">"Add form validation to the signup page"</p>
|
|
334
|
+
<p className="mt-1.5">"Add form validation to the signup page"</p>
|
|
335
335
|
</div>
|
|
336
336
|
<div>
|
|
337
337
|
<span className="font-medium text-zinc-700 dark:text-zinc-300">2. Question gates pause</span>
|
|
338
|
-
<p className="mt-1">When Claude needs input, an interactive choice card appears</p>
|
|
338
|
+
<p className="mt-1.5">When Claude needs input, an interactive choice card appears</p>
|
|
339
339
|
</div>
|
|
340
340
|
<div>
|
|
341
341
|
<span className="font-medium text-zinc-700 dark:text-zinc-300">3. Claude works (hidden)</span>
|
|
342
|
-
<p className="mt-1">Reads files, makes edits, runs commands — behind the scenes</p>
|
|
342
|
+
<p className="mt-1.5">Reads files, makes edits, runs commands — behind the scenes</p>
|
|
343
343
|
</div>
|
|
344
344
|
<div>
|
|
345
345
|
<span className="font-medium text-zinc-700 dark:text-zinc-300">4. Gates signal progress</span>
|
|
346
|
-
<p className="mt-1">Clean status cards appear at key workflow milestones</p>
|
|
346
|
+
<p className="mt-1.5">Clean status cards appear at key workflow milestones</p>
|
|
347
347
|
</div>
|
|
348
348
|
</div>
|
|
349
349
|
</div>
|
|
@@ -376,10 +376,10 @@ function CardsShowcase() {
|
|
|
376
376
|
|
|
377
377
|
return (
|
|
378
378
|
<div>
|
|
379
|
-
<p className="text-
|
|
379
|
+
<p className="text-base text-zinc-500 dark:text-zinc-400 mb-4">
|
|
380
380
|
All gate card types shown with sample data, including the interactive question gate. Each card matches the kanban card design system.
|
|
381
381
|
</p>
|
|
382
|
-
<div className="grid grid-cols-2 gap-
|
|
382
|
+
<div className="grid grid-cols-2 gap-4">
|
|
383
383
|
{allGateTypes.map((gate, i) => (
|
|
384
384
|
<GateCard
|
|
385
385
|
key={i}
|
|
@@ -411,8 +411,8 @@ function ChoicesShowcase() {
|
|
|
411
411
|
<div className="space-y-8">
|
|
412
412
|
{/* Approach selection */}
|
|
413
413
|
<div>
|
|
414
|
-
<h3 className="text-
|
|
415
|
-
<p className="text-
|
|
414
|
+
<h3 className="text-base font-semibold text-zinc-700 dark:text-zinc-300 mb-1">UX Approach Selection</h3>
|
|
415
|
+
<p className="text-base text-zinc-500 dark:text-zinc-400 mb-3">
|
|
416
416
|
Shown during feature-planning when Claude proposes multiple approaches.
|
|
417
417
|
</p>
|
|
418
418
|
<div className="max-w-lg">
|
|
@@ -427,8 +427,8 @@ function ChoicesShowcase() {
|
|
|
427
427
|
|
|
428
428
|
{/* Confirmation */}
|
|
429
429
|
<div>
|
|
430
|
-
<h3 className="text-
|
|
431
|
-
<p className="text-
|
|
430
|
+
<h3 className="text-base font-semibold text-zinc-700 dark:text-zinc-300 mb-1">Plan Confirmation</h3>
|
|
431
|
+
<p className="text-base text-zinc-500 dark:text-zinc-400 mb-3">
|
|
432
432
|
Shown when Claude needs a go/no-go decision before starting implementation.
|
|
433
433
|
</p>
|
|
434
434
|
<div className="max-w-lg">
|
|
@@ -443,8 +443,8 @@ function ChoicesShowcase() {
|
|
|
443
443
|
|
|
444
444
|
{/* Disabled state (after selection) */}
|
|
445
445
|
<div>
|
|
446
|
-
<h3 className="text-
|
|
447
|
-
<p className="text-
|
|
446
|
+
<h3 className="text-base font-semibold text-zinc-700 dark:text-zinc-300 mb-1">After Selection (Locked)</h3>
|
|
447
|
+
<p className="text-base text-zinc-500 dark:text-zinc-400 mb-3">
|
|
448
448
|
How the card looks after the user has made their choice and the workflow continues.
|
|
449
449
|
</p>
|
|
450
450
|
<div className="max-w-lg">
|
|
@@ -476,21 +476,21 @@ function Panel({ title, subtitle, highlight, children }: {
|
|
|
476
476
|
<div
|
|
477
477
|
className={`bg-white dark:bg-zinc-800 rounded-xl border overflow-hidden ${
|
|
478
478
|
highlight
|
|
479
|
-
? 'border-
|
|
479
|
+
? 'border-[#819D9F]/30 dark:border-[#819D9F]/30'
|
|
480
480
|
: 'border-zinc-200 dark:border-zinc-700'
|
|
481
481
|
}`}
|
|
482
482
|
style={{ boxShadow: PANEL_SHADOW }}
|
|
483
483
|
>
|
|
484
484
|
<div className={`px-4 py-3 border-b ${
|
|
485
485
|
highlight
|
|
486
|
-
? 'border-
|
|
486
|
+
? 'border-[#819D9F]/20 dark:border-[#819D9F]/20 bg-[#e8f0f0]/50 dark:bg-[#819D9F]/10'
|
|
487
487
|
: 'border-zinc-100 dark:border-zinc-700'
|
|
488
488
|
}`}>
|
|
489
|
-
<h2 className={`text-
|
|
490
|
-
highlight ? 'text-
|
|
489
|
+
<h2 className={`text-base font-semibold ${
|
|
490
|
+
highlight ? 'text-zinc-900 dark:text-[#a3bfc0]' : 'text-zinc-700 dark:text-zinc-300'
|
|
491
491
|
}`}>{title}</h2>
|
|
492
|
-
<p className={`text-
|
|
493
|
-
highlight ? 'text-
|
|
492
|
+
<p className={`text-base ${
|
|
493
|
+
highlight ? 'text-[#819D9F] dark:text-[#a3bfc0]' : 'text-zinc-400 dark:text-zinc-500'
|
|
494
494
|
}`}>{subtitle}</p>
|
|
495
495
|
</div>
|
|
496
496
|
<div className="p-4 min-h-[400px] max-h-[600px] overflow-y-auto">
|
|
@@ -503,13 +503,13 @@ function Panel({ title, subtitle, highlight, children }: {
|
|
|
503
503
|
function UserBubble({ text }: { text: string }) {
|
|
504
504
|
return (
|
|
505
505
|
<div
|
|
506
|
-
className="bg-
|
|
506
|
+
className="bg-[#e8f0f0] dark:bg-[#819D9F]/20 border border-[#819D9F]/30 dark:border-[#819D9F]/30 rounded-xl p-3 ml-8"
|
|
507
507
|
style={{ boxShadow: '0 1px 2px rgba(0,0,0,0.03)' }}
|
|
508
508
|
>
|
|
509
509
|
<div className="flex items-center gap-2 mb-1">
|
|
510
|
-
<span className="text-
|
|
510
|
+
<span className="text-base font-medium text-[#5a7d7f] dark:text-[#a3bfc0]">You</span>
|
|
511
511
|
</div>
|
|
512
|
-
<p className="text-
|
|
512
|
+
<p className="text-base text-zinc-900 dark:text-zinc-100">{text}</p>
|
|
513
513
|
</div>
|
|
514
514
|
);
|
|
515
515
|
}
|
|
@@ -522,7 +522,7 @@ function NarratedView({ gates, isPlaying, answeredQuestions, onAnswerQuestion }:
|
|
|
522
522
|
}) {
|
|
523
523
|
if (gates.length === 0 && !isPlaying) {
|
|
524
524
|
return (
|
|
525
|
-
<div className="flex items-center justify-center h-full text-zinc-400 dark:text-zinc-500 text-
|
|
525
|
+
<div className="flex items-center justify-center h-full text-zinc-400 dark:text-zinc-500 text-base">
|
|
526
526
|
Press "Play Workflow" to start
|
|
527
527
|
</div>
|
|
528
528
|
);
|
|
@@ -558,7 +558,7 @@ function DirectView({ messages, gates, isPlaying, answeredQuestions, onAnswerQue
|
|
|
558
558
|
}) {
|
|
559
559
|
if (messages.length === 0 && !isPlaying) {
|
|
560
560
|
return (
|
|
561
|
-
<div className="flex items-center justify-center h-full text-zinc-400 dark:text-zinc-500 text-
|
|
561
|
+
<div className="flex items-center justify-center h-full text-zinc-400 dark:text-zinc-500 text-base">
|
|
562
562
|
Press "Play Workflow" to start
|
|
563
563
|
</div>
|
|
564
564
|
);
|
|
@@ -603,7 +603,7 @@ function DirectView({ messages, gates, isPlaying, answeredQuestions, onAnswerQue
|
|
|
603
603
|
if (msg.type === 'assistant') {
|
|
604
604
|
return (
|
|
605
605
|
<div key={i} className="bg-zinc-50 dark:bg-zinc-800/50 rounded-xl p-3" style={{ boxShadow: '0 1px 2px rgba(0,0,0,0.02)' }}>
|
|
606
|
-
<p className="text-
|
|
606
|
+
<p className="text-base text-zinc-700 dark:text-zinc-300">{msg.content}</p>
|
|
607
607
|
</div>
|
|
608
608
|
);
|
|
609
609
|
}
|
|
@@ -645,8 +645,8 @@ function DirectView({ messages, gates, isPlaying, answeredQuestions, onAnswerQue
|
|
|
645
645
|
|
|
646
646
|
function WorkingIndicator() {
|
|
647
647
|
return (
|
|
648
|
-
<div className="flex items-center gap-2 text-
|
|
649
|
-
<span className="w-1.5 h-1.5 bg-
|
|
648
|
+
<div className="flex items-center gap-2 text-base text-zinc-400 dark:text-zinc-500 py-2 pl-1">
|
|
649
|
+
<span className="w-1.5 h-1.5 bg-[#819D9F] rounded-full animate-pulse" />
|
|
650
650
|
Working...
|
|
651
651
|
</div>
|
|
652
652
|
);
|