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.
Files changed (162) hide show
  1. package/.env +7 -0
  2. package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +124 -48
  3. package/apps/dashboard/app/api/claude/[workItemId]/route.ts +171 -58
  4. package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +161 -10
  5. package/apps/dashboard/app/api/tests/run/stream/route.ts +13 -1
  6. package/apps/dashboard/app/api/usage/route.ts +17 -0
  7. package/apps/dashboard/app/api/work/[id]/route.ts +35 -0
  8. package/apps/dashboard/app/api/work/[id]/status/route.ts +43 -1
  9. package/apps/dashboard/app/connect-claude/page.tsx +24 -0
  10. package/apps/dashboard/app/decision/[id]/page.tsx +14 -14
  11. package/apps/dashboard/app/demo/gates/page.tsx +42 -42
  12. package/apps/dashboard/app/design-system/page.tsx +868 -0
  13. package/apps/dashboard/app/globals.css +6 -2
  14. package/apps/dashboard/app/install-claude/page.tsx +9 -7
  15. package/apps/dashboard/app/layout.tsx +17 -5
  16. package/apps/dashboard/app/login/page.tsx +250 -0
  17. package/apps/dashboard/app/page.tsx +11 -9
  18. package/apps/dashboard/app/settings/page.tsx +4 -2
  19. package/apps/dashboard/app/signup/page.tsx +245 -0
  20. package/apps/dashboard/app/subscribe/page.tsx +11 -0
  21. package/apps/dashboard/app/welcome/page.tsx +24 -1
  22. package/apps/dashboard/app/work/[id]/page.tsx +34 -50
  23. package/apps/dashboard/components/AppShell.tsx +95 -55
  24. package/apps/dashboard/components/CardMenu.tsx +56 -13
  25. package/apps/dashboard/components/ClaudePanel.tsx +301 -582
  26. package/apps/dashboard/components/ClaudePanelInput.tsx +23 -14
  27. package/apps/dashboard/components/ConnectClaudeScreen.tsx +210 -0
  28. package/apps/dashboard/components/CopyableId.tsx +3 -3
  29. package/apps/dashboard/components/DetailReviewActions.tsx +109 -0
  30. package/apps/dashboard/components/DragContext.tsx +75 -65
  31. package/apps/dashboard/components/DraggableCard.tsx +6 -46
  32. package/apps/dashboard/components/DropZone.tsx +2 -2
  33. package/apps/dashboard/components/EditableDetailDescription.tsx +1 -1
  34. package/apps/dashboard/components/EditableTitle.tsx +26 -6
  35. package/apps/dashboard/components/ElapsedTimer.tsx +54 -0
  36. package/apps/dashboard/components/EpicGroup.tsx +329 -0
  37. package/apps/dashboard/components/GateCard.tsx +100 -16
  38. package/apps/dashboard/components/GateChoiceCard.tsx +15 -17
  39. package/apps/dashboard/components/InstallClaudeScreen.tsx +140 -51
  40. package/apps/dashboard/components/JettyLoader.tsx +38 -0
  41. package/apps/dashboard/components/KanbanBoard.tsx +147 -766
  42. package/apps/dashboard/components/KanbanCard.tsx +506 -0
  43. package/apps/dashboard/components/LazyMarkdown.tsx +12 -0
  44. package/apps/dashboard/components/MainNav.tsx +20 -54
  45. package/apps/dashboard/components/MessageBlock.tsx +391 -0
  46. package/apps/dashboard/components/ModeStartCard.tsx +15 -15
  47. package/apps/dashboard/components/OnboardingWelcome.tsx +214 -0
  48. package/apps/dashboard/components/PlaceholderCard.tsx +11 -21
  49. package/apps/dashboard/components/ProjectSwitcher.tsx +36 -8
  50. package/apps/dashboard/components/PrototypeTimeline.tsx +25 -25
  51. package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +265 -301
  52. package/apps/dashboard/components/RealTimeTestsWrapper.tsx +97 -74
  53. package/apps/dashboard/components/ReviewFooter.tsx +141 -0
  54. package/apps/dashboard/components/SessionList.tsx +19 -18
  55. package/apps/dashboard/components/SubscribeContent.tsx +206 -0
  56. package/apps/dashboard/components/TestTree.tsx +15 -14
  57. package/apps/dashboard/components/TipCard.tsx +177 -0
  58. package/apps/dashboard/components/Toast.tsx +5 -5
  59. package/apps/dashboard/components/TypeIcon.tsx +56 -0
  60. package/apps/dashboard/components/UpgradeBanner.tsx +30 -0
  61. package/apps/dashboard/components/WaveCompletionAnimation.tsx +61 -62
  62. package/apps/dashboard/components/WelcomeScreen.tsx +25 -27
  63. package/apps/dashboard/components/WorkItemHeader.tsx +4 -4
  64. package/apps/dashboard/components/WorkItemTree.tsx +9 -28
  65. package/apps/dashboard/components/settings/AccountSection.tsx +169 -0
  66. package/apps/dashboard/components/settings/EnvVarsSection.tsx +54 -79
  67. package/apps/dashboard/components/settings/GeneralSection.tsx +26 -31
  68. package/apps/dashboard/components/settings/SettingsLayout.tsx +4 -4
  69. package/apps/dashboard/components/ui/Button.tsx +104 -0
  70. package/apps/dashboard/components/ui/Input.tsx +78 -0
  71. package/apps/dashboard/contexts/ClaudeSessionContext.tsx +408 -105
  72. package/apps/dashboard/contexts/ConnectionStatusContext.tsx +25 -4
  73. package/apps/dashboard/contexts/UsageContext.tsx +155 -0
  74. package/apps/dashboard/contexts/usageHelpers.js +9 -0
  75. package/apps/dashboard/electron/ipc-handlers.js +281 -88
  76. package/apps/dashboard/electron/main.js +691 -131
  77. package/apps/dashboard/electron/preload.js +25 -4
  78. package/apps/dashboard/electron/session-manager.js +163 -0
  79. package/apps/dashboard/electron-builder.config.js +3 -5
  80. package/apps/dashboard/hooks/useKanbanAnimation.ts +29 -0
  81. package/apps/dashboard/hooks/useKanbanUndo.ts +83 -0
  82. package/apps/dashboard/lib/backlog-parser.ts +50 -0
  83. package/apps/dashboard/lib/claude-process-manager.ts +50 -11
  84. package/apps/dashboard/lib/constants.ts +43 -0
  85. package/apps/dashboard/lib/db-bridge.ts +33 -0
  86. package/apps/dashboard/lib/db.ts +136 -20
  87. package/apps/dashboard/lib/kanban-utils.ts +70 -0
  88. package/apps/dashboard/lib/run-migrations.js +27 -2
  89. package/apps/dashboard/lib/session-state-machine.ts +3 -0
  90. package/apps/dashboard/lib/session-stream-manager.ts +144 -38
  91. package/apps/dashboard/lib/shadows.ts +7 -0
  92. package/apps/dashboard/lib/tests.ts +3 -1
  93. package/apps/dashboard/lib/utils.ts +6 -0
  94. package/apps/dashboard/next.config.js +35 -14
  95. package/apps/dashboard/package.json +6 -3
  96. package/apps/dashboard/public/bug-icon.svg +9 -0
  97. package/apps/dashboard/public/buoy-icon.svg +9 -0
  98. package/apps/dashboard/public/fonts/Satoshi-Variable.woff2 +0 -0
  99. package/apps/dashboard/public/fonts/Satoshi-VariableItalic.woff2 +0 -0
  100. package/apps/dashboard/public/in-flight-seagull.svg +9 -0
  101. package/apps/dashboard/public/jetty-icon-loading-alt.svg +11 -0
  102. package/apps/dashboard/public/jetty-icon-loading.svg +11 -0
  103. package/apps/dashboard/public/jettypod_logo.png +0 -0
  104. package/apps/dashboard/public/pier-icon.svg +14 -0
  105. package/apps/dashboard/public/star-icon.svg +9 -0
  106. package/apps/dashboard/public/wrench-icon.svg +9 -0
  107. package/apps/dashboard/scripts/upload-to-r2.js +89 -0
  108. package/apps/dashboard/scripts/ws-server.js +191 -0
  109. package/apps/dashboard/tsconfig.tsbuildinfo +1 -0
  110. package/apps/update-server/package.json +16 -0
  111. package/apps/update-server/schema.sql +31 -0
  112. package/apps/update-server/src/index.ts +1085 -0
  113. package/apps/update-server/tsconfig.json +16 -0
  114. package/apps/update-server/wrangler.toml +35 -0
  115. package/cucumber.js +9 -3
  116. package/docs/COMMAND_REFERENCE.md +34 -0
  117. package/hooks/post-checkout +32 -75
  118. package/hooks/post-merge +111 -10
  119. package/jest.setup.js +1 -0
  120. package/jettypod.js +54 -116
  121. package/lib/chore-taxonomy.js +33 -10
  122. package/lib/database.js +36 -16
  123. package/lib/db-watcher.js +1 -1
  124. package/lib/git-hooks/pre-commit +1 -1
  125. package/lib/jettypod-backup.js +27 -4
  126. package/lib/migrations/027-plan-at-creation-column.js +33 -0
  127. package/lib/migrations/028-ready-for-review-column.js +27 -0
  128. package/lib/migrations/029-remove-autoincrement.js +307 -0
  129. package/lib/migrations/029-rename-corrupted-to-cleaned.js +149 -0
  130. package/lib/migrations/index.js +47 -4
  131. package/lib/schema.js +13 -6
  132. package/lib/seed-onboarding.js +101 -69
  133. package/lib/update-command/index.js +9 -175
  134. package/lib/work-commands/index.js +129 -16
  135. package/lib/work-tracking/index.js +86 -46
  136. package/lib/worktree-diagnostics.js +16 -16
  137. package/lib/worktree-facade.js +1 -1
  138. package/lib/worktree-manager.js +8 -8
  139. package/lib/worktree-reconciler.js +5 -5
  140. package/package.json +9 -2
  141. package/scripts/ndjson-to-cucumber-json.js +152 -0
  142. package/scripts/postinstall.js +25 -0
  143. package/skills-templates/bug-mode/SKILL.md +39 -28
  144. package/skills-templates/bug-planning/SKILL.md +25 -29
  145. package/skills-templates/chore-mode/SKILL.md +131 -68
  146. package/skills-templates/chore-mode/verification.js +51 -10
  147. package/skills-templates/chore-planning/SKILL.md +47 -18
  148. package/skills-templates/epic-planning/SKILL.md +68 -48
  149. package/skills-templates/external-transition/SKILL.md +47 -47
  150. package/skills-templates/feature-planning/SKILL.md +83 -73
  151. package/skills-templates/production-mode/SKILL.md +49 -49
  152. package/skills-templates/request-routing/SKILL.md +27 -14
  153. package/skills-templates/simple-improvement/SKILL.md +68 -44
  154. package/skills-templates/speed-mode/SKILL.md +209 -128
  155. package/skills-templates/stable-mode/SKILL.md +105 -94
  156. package/templates/bdd-guidance.md +139 -0
  157. package/templates/bdd-scaffolding/wait.js +18 -0
  158. package/templates/bdd-scaffolding/world.js +19 -0
  159. package/.jettypod-backup/work.db +0 -0
  160. package/apps/dashboard/app/access-code/page.tsx +0 -110
  161. package/lib/discovery-checkpoint.js +0 -123
  162. 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-8">
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-6">
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-sm">
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-6 bg-white dark:bg-zinc-800 rounded-xl border border-zinc-200 dark:border-zinc-700 p-1 w-fit"
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-4 py-1.5 text-sm font-medium rounded-lg transition-colors ${
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-3 mb-6">
253
+ <div className="flex items-center gap-4 mb-8">
254
254
  <button
255
255
  onClick={play}
256
256
  disabled={isPlaying}
257
- className="px-4 py-2 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-sm font-medium rounded-xl transition-all duration-200 hover:-translate-y-0.5 active:translate-y-0"
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-4 py-2 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-sm font-medium rounded-xl transition-colors"
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-3 py-1.5 text-xs font-medium rounded-lg transition-colors ${
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-xs text-zinc-500 dark:text-zinc-400 mb-1.5">
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-4">
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-4"
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-sm font-semibold text-zinc-700 dark:text-zinc-300 mb-3">How it works</h3>
331
- <div className="grid grid-cols-4 gap-4 text-xs text-zinc-500 dark:text-zinc-400">
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-sm text-zinc-500 dark:text-zinc-400 mb-4">
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-3">
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-sm font-semibold text-zinc-700 dark:text-zinc-300 mb-1">UX Approach Selection</h3>
415
- <p className="text-xs text-zinc-500 dark:text-zinc-400 mb-3">
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-sm font-semibold text-zinc-700 dark:text-zinc-300 mb-1">Plan Confirmation</h3>
431
- <p className="text-xs text-zinc-500 dark:text-zinc-400 mb-3">
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-sm font-semibold text-zinc-700 dark:text-zinc-300 mb-1">After Selection (Locked)</h3>
447
- <p className="text-xs text-zinc-500 dark:text-zinc-400 mb-3">
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-blue-200 dark:border-blue-800'
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-blue-100 dark:border-blue-900 bg-blue-50/50 dark:bg-blue-900/10'
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-sm font-semibold ${
490
- highlight ? 'text-blue-900 dark:text-blue-300' : 'text-zinc-700 dark:text-zinc-300'
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-xs ${
493
- highlight ? 'text-blue-500 dark:text-blue-400' : 'text-zinc-400 dark:text-zinc-500'
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-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-xl p-3 ml-8"
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-xs font-medium text-blue-600 dark:text-blue-400">You</span>
510
+ <span className="text-base font-medium text-[#5a7d7f] dark:text-[#a3bfc0]">You</span>
511
511
  </div>
512
- <p className="text-sm text-blue-900 dark:text-blue-100">{text}</p>
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-sm">
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-sm">
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-sm text-zinc-700 dark:text-zinc-300">{msg.content}</p>
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-xs text-zinc-400 dark:text-zinc-500 py-2 pl-1">
649
- <span className="w-1.5 h-1.5 bg-blue-400 rounded-full animate-pulse" />
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
  );