@meridiona/meridian-darwin-arm64 1.2.1 → 1.3.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.
Files changed (104) hide show
  1. package/.env.example +9 -9
  2. package/VERSION +1 -1
  3. package/bin/meridian +0 -0
  4. package/package.json +1 -1
  5. package/scripts/install-from-bundle.sh +3 -3
  6. package/services/agents/README.md +3 -3
  7. package/services/pyproject.toml +1 -1
  8. package/services/tests/evals/data/seeds/sessions_a_meridian.json +1 -1
  9. package/services/tests/evals/data/seeds/sessions_b_generic.json +4 -4
  10. package/ui/.next/static/chunks/06v.9~0d~qa17.css +4 -0
  11. package/ui/.next/static/chunks/0dl.w-ip2ly5_.js +1 -0
  12. package/ui/.next/static/chunks/0t0n-_np5foyi.js +1 -0
  13. package/ui/.next/static/chunks/0z1g1xyfa206c.js +1 -0
  14. package/ui/ui/.next/BUILD_ID +1 -1
  15. package/ui/ui/.next/app-path-routes-manifest.json +2 -0
  16. package/ui/ui/.next/build-manifest.json +3 -3
  17. package/ui/ui/.next/prerender-manifest.json +3 -3
  18. package/ui/ui/.next/routes-manifest.json +16 -1
  19. package/ui/ui/.next/server/app/_global-error.html +1 -1
  20. package/ui/ui/.next/server/app/_global-error.rsc +1 -1
  21. package/ui/ui/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  22. package/ui/ui/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  23. package/ui/ui/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  24. package/ui/ui/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  25. package/ui/ui/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  26. package/ui/ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  27. package/ui/ui/.next/server/app/_not-found.html +1 -1
  28. package/ui/ui/.next/server/app/_not-found.rsc +2 -2
  29. package/ui/ui/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  30. package/ui/ui/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  31. package/ui/ui/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  32. package/ui/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  33. package/ui/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  34. package/ui/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  35. package/ui/ui/.next/server/app/api/active/route.js +1 -1
  36. package/ui/ui/.next/server/app/api/active/route.js.nft.json +1 -1
  37. package/ui/ui/.next/server/app/api/coding-agents/route.js +1 -1
  38. package/ui/ui/.next/server/app/api/coding-agents/route.js.nft.json +1 -1
  39. package/ui/ui/.next/server/app/api/queue-review/route.js +1 -1
  40. package/ui/ui/.next/server/app/api/queue-review/route.js.nft.json +1 -1
  41. package/ui/ui/.next/server/app/api/tasks/route.js +1 -1
  42. package/ui/ui/.next/server/app/api/tasks/route.js.nft.json +1 -1
  43. package/ui/ui/.next/server/app/api/today/route.js +1 -1
  44. package/ui/ui/.next/server/app/api/today/route.js.nft.json +1 -1
  45. package/ui/ui/.next/server/app/api/week/route.js +1 -1
  46. package/ui/ui/.next/server/app/api/week/route.js.nft.json +1 -1
  47. package/ui/ui/.next/server/app/api/worklogs/[id]/route/app-paths-manifest.json +3 -0
  48. package/ui/ui/.next/server/app/api/worklogs/[id]/route/build-manifest.json +9 -0
  49. package/ui/ui/.next/server/app/api/worklogs/[id]/route/server-reference-manifest.json +4 -0
  50. package/ui/ui/.next/server/app/api/worklogs/[id]/route.js +6 -0
  51. package/ui/ui/.next/server/app/api/worklogs/[id]/route.js.map +5 -0
  52. package/ui/ui/.next/server/app/api/worklogs/[id]/route.js.nft.json +1 -0
  53. package/ui/ui/.next/server/app/api/worklogs/[id]/route_client-reference-manifest.js +3 -0
  54. package/ui/ui/.next/server/app/api/worklogs/route/app-paths-manifest.json +3 -0
  55. package/ui/ui/.next/server/app/api/worklogs/route/build-manifest.json +9 -0
  56. package/ui/ui/.next/server/app/api/worklogs/route/server-reference-manifest.json +4 -0
  57. package/ui/ui/.next/server/app/api/worklogs/route.js +6 -0
  58. package/ui/ui/.next/server/app/api/worklogs/route.js.map +5 -0
  59. package/ui/ui/.next/server/app/api/worklogs/route.js.nft.json +1 -0
  60. package/ui/ui/.next/server/app/api/worklogs/route_client-reference-manifest.js +3 -0
  61. package/ui/ui/.next/server/app/index.html +1 -1
  62. package/ui/ui/.next/server/app/index.rsc +3 -3
  63. package/ui/ui/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  64. package/ui/ui/.next/server/app/index.segments/_full.segment.rsc +3 -3
  65. package/ui/ui/.next/server/app/index.segments/_head.segment.rsc +1 -1
  66. package/ui/ui/.next/server/app/index.segments/_index.segment.rsc +2 -2
  67. package/ui/ui/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  68. package/ui/ui/.next/server/app/page/react-loadable-manifest.json +7 -1
  69. package/ui/ui/.next/server/app/page_client-reference-manifest.js +1 -1
  70. package/ui/ui/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  71. package/ui/ui/.next/server/app/settings.html +1 -1
  72. package/ui/ui/.next/server/app/settings.rsc +2 -2
  73. package/ui/ui/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  74. package/ui/ui/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  75. package/ui/ui/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  76. package/ui/ui/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  77. package/ui/ui/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  78. package/ui/ui/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  79. package/ui/ui/.next/server/app-paths-manifest.json +2 -0
  80. package/ui/ui/.next/server/chunks/[root-of-the-server]__0f0b_~6._.js +13 -0
  81. package/ui/ui/.next/server/chunks/{[root-of-the-server]__0k._39j._.js → [root-of-the-server]__0izj2dt._.js} +4 -3
  82. package/ui/ui/.next/server/chunks/[root-of-the-server]__0o8yxaf._.js +31 -0
  83. package/ui/ui/.next/server/chunks/[root-of-the-server]__0vkhuwx._.js +10 -0
  84. package/ui/ui/.next/server/chunks/[root-of-the-server]__0yujz.-._.js +9 -0
  85. package/ui/ui/.next/server/chunks/{[root-of-the-server]__0ht7nn0._.js → [root-of-the-server]__0~75nht._.js} +2 -2
  86. package/ui/ui/.next/server/chunks/{[root-of-the-server]__0xzo8h-._.js → [root-of-the-server]__120.3e1._.js} +2 -2
  87. package/ui/ui/.next/server/chunks/{[root-of-the-server]__11itz30._.js → [root-of-the-server]__1320.4q._.js} +2 -2
  88. package/ui/ui/.next/server/chunks/ssr/ui_07v--q0._.js +1 -1
  89. package/ui/ui/.next/server/chunks/ui__next-internal_server_app_api_worklogs_[id]_route_actions_0uj90mh.js +3 -0
  90. package/ui/ui/.next/server/chunks/ui__next-internal_server_app_api_worklogs_route_actions_06v-3.b.js +3 -0
  91. package/ui/ui/.next/server/middleware-build-manifest.js +3 -3
  92. package/ui/ui/.next/server/pages/404.html +1 -1
  93. package/ui/ui/.next/server/pages/500.html +1 -1
  94. package/ui/ui/.next/server/server-reference-manifest.js +1 -1
  95. package/ui/ui/.next/server/server-reference-manifest.json +1 -1
  96. package/ui/ui/package.json +3 -3
  97. package/ui/.next/static/chunks/06j6xnq48yser.js +0 -1
  98. package/ui/.next/static/chunks/0te39p~~ln1wb.css +0 -4
  99. package/ui/.next/static/chunks/11~m4ht43auzj.js +0 -1
  100. package/ui/ui/.next/server/chunks/[root-of-the-server]__0v7hzvj._.js +0 -29
  101. package/ui/ui/.next/server/chunks/[root-of-the-server]__139ariv._.js +0 -9
  102. /package/ui/.next/static/{D4n6BXLDnMIaIK2sOnvXW → uXdijjK52XmKTMDx4K3Fb}/_buildManifest.js +0 -0
  103. /package/ui/.next/static/{D4n6BXLDnMIaIK2sOnvXW → uXdijjK52XmKTMDx4K3Fb}/_clientMiddlewareManifest.js +0 -0
  104. /package/ui/.next/static/{D4n6BXLDnMIaIK2sOnvXW → uXdijjK52XmKTMDx4K3Fb}/_ssgManifest.js +0 -0
package/.env.example CHANGED
@@ -22,9 +22,8 @@
22
22
  # MLX_SERVER_HOST=127.0.0.1
23
23
  # MLX_SERVER_PORT=7823
24
24
 
25
- # Dashboard (Next.js UI) port. Defaults to 3939 (off the common 3000 to avoid
26
- # clashes with other dev servers). Change this and re-run `meridian setup` to
27
- # move the dashboard.
25
+ # Dashboard (Next.js UI) port. Defaults to 3939. Change this and re-run
26
+ # `meridian setup` to move the dashboard.
28
27
  # MERIDIAN_UI_PORT=3939
29
28
 
30
29
  # ---------------------------------------------------------------------------
@@ -37,15 +36,16 @@
37
36
  # JIRA_PROJECT_KEYS=KAN,ENG # optional — comma-separated; empty = all projects
38
37
 
39
38
  # ---------------------------------------------------------------------------
40
- # PM worklog (Stage 4) — automated Jira worklogs from classified sessions.
39
+ # PM worklog (Stage 4) — Jira worklogs from classified sessions.
41
40
  # Runs inside the Rust daemon: one hour-driven worklog per task per hour,
42
- # synthesised via the MLX server's /synthesise_worklog endpoint, then posted
43
- # to Jira over REST. Requires the MLX server (it hosts the synth agent).
41
+ # synthesised via the MLX server's /synthesise_worklog endpoint. Requires the
42
+ # MLX server (it hosts the synth agent).
44
43
  # ---------------------------------------------------------------------------
45
44
 
46
- # Master switch. Default false: the driver DRAFTS worklogs every hour but never
47
- # POSTs to real Jira until you flip this on. Turn on only when ready to write.
48
- # PM_WORKLOG_POST_ENABLED=false
45
+ # Nothing posts to Jira automatically. The daemon DRAFTS worklogs every hour;
46
+ # you review, edit, and approve each one in the dashboard (Worklogs view), and
47
+ # the daemon posts approved worklogs within ~60s. Approval is the only gate —
48
+ # there is no auto-post switch.
49
49
 
50
50
  # Driver cadence in hours (clamped to a 60s floor). Default 1.0.
51
51
  # PM_WORKLOG_INTERVAL_HOURS=1.0
package/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.1
1
+ 1.3.0
package/bin/meridian CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meridiona/meridian-darwin-arm64",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "Prebuilt Meridian app for macOS arm64 (daemon binary + dashboard + Python services). Installed via @meridiona/meridian.",
5
5
  "homepage": "https://github.com/Meridiona/meridian",
6
6
  "repository": {
@@ -12,7 +12,7 @@ set -euo pipefail
12
12
  APP_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
13
13
  SCREENPIPE_VERSION="0.3.350"
14
14
  MLX_PORT="${MLX_PORT:-7823}"
15
- UI_PORT="${MERIDIAN_UI_PORT:-3939}" # dashboard port; off the common 3000 to avoid clashes
15
+ UI_PORT="${MERIDIAN_UI_PORT:-3939}" # dashboard port (override via MERIDIAN_UI_PORT)
16
16
  SKIP_PERMISSIONS=0
17
17
  [[ "${1:-}" == "--skip-permissions" ]] && SKIP_PERMISSIONS=1
18
18
 
@@ -161,5 +161,5 @@ echo " meridian logs -f # watch the pipeline"
161
161
  echo " meridian config edit # add Jira creds"
162
162
  echo " open http://localhost:${UI_PORT} # the dashboard"
163
163
  echo ""
164
- echo "Jira worklog posting is OFF by default set PM_WORKLOG_POST_ENABLED=true"
165
- echo "in ${ENV_FILE} when you're ready to write worklogs."
164
+ echo "Jira worklogs are DRAFTED only approve them in the dashboard (Worklogs"
165
+ echo "view) and the daemon posts approved worklogs within ~60s."
@@ -45,8 +45,8 @@ meridian.db → app_sessions
45
45
  sends it to the agno worklog synthesiser hosted on the MLX server:
46
46
  POST http://127.0.0.1:7823/synthesise_worklog {bundle: ...}
47
47
  → JiraUpdate {summary, evidence-bearing bullets, confidence}
48
- Rust grounds the result and posts the Jira worklog itself
49
- (REST), gated behind PM_WORKLOG_POST_ENABLED.
48
+ Rust grounds the result and DRAFTS the worklog; it posts to Jira
49
+ (REST) only after a human approves it in the dashboard.
50
50
  ```
51
51
 
52
52
  ---
@@ -386,7 +386,7 @@ cargo run --bin backfill_task_classification -- --dry-run --today
386
386
 
387
387
  ## Limitations / known gaps
388
388
 
389
- - **Jira write-backs are handled by the pm-worklog (Stage 4) driver, not from classification.** Classification only maps a session to a ticket. Jira worklogs are produced by the Rust hour-driven driver (`src/pm_worklog/`), which synthesises each worklog via the MLX server's `/synthesise_worklog` and posts it itself over REST (gated behind `PM_WORKLOG_POST_ENABLED`). The `dispatch_queue` table is reserved for future GitHub/Linear write-backs and is not yet drained.
389
+ - **Jira write-backs are handled by the pm-worklog (Stage 4) driver, not from classification.** Classification only maps a session to a ticket. Jira worklogs are produced by the Rust hour-driven driver (`src/pm_worklog/`), which synthesises each worklog via the MLX server's `/synthesise_worklog` and DRAFTS it; it posts to Jira over REST only after a human approves the worklog in the dashboard (Worklogs view). The `dispatch_queue` table is reserved for future GitHub/Linear write-backs and is not yet drained.
390
390
  - **`pm_tasks` populated by Rust.** The classifier receives `pm_tasks` as part of the JSON payload from the Rust daemon. If the Rust intelligence module hasn't synced tasks yet (clean install, first run), `pm_tasks` will be empty and every session gets `routing=skip`. Run the Rust daemon for at least one full cycle first.
391
391
  - **No re-classification UI.** There is no CLI to re-run classification on a single session — construct the JSON payload manually (see debugging guide above) or trigger the Rust daemon.
392
392
  - **Coding-agent sessions are classified on their summary, not their transcript.** The Rust coding-agent ingest (`src/coding_agent_session_ingest/`) seals and summarises each segment first; rows walk `coding_agent_live → pending_summariser → pending_classifier`, and only then does the classification trigger send them to the MLX server. A coding session therefore appears as a worklog candidate only after its summary exists.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meridian-agents"
7
- version = "1.2.1"
7
+ version = "1.3.0"
8
8
  description = "Meridian agents — hermes task linking and Jira progress updates for meridian.db"
9
9
  requires-python = ">=3.11"
10
10
  authors = [{ name = "Meridiona" }]
@@ -136,7 +136,7 @@
136
136
  "count": 1
137
137
  }
138
138
  ],
139
- "session_text": "[09:01:34]\nNew Tab\nSearch Google or type a URL\nFrequently visited\nGitHub · Meridiona/meridian\nLinear — Meridian\nmeridiona.atlassian.net\nlocalhost:3000 — meridian dashboard\nOpenObserve — meridiona\nGmail\nCustomize Chrome\nQ Search tabs… Recently closed Bookmarks Reading list\n[09:01:39]\nmeridiona.atlassian.net/jira/software/projects/KAN/boards/1/backlog\nBacklog · Meridiona - Jira\nMeridiona\nJira\nYour work\nProjects\nMeridian (KAN)\nBoard\nBacklog\nReports\nSprint 12 — In progress\nKAN-136 Add observability and tracing for agents and later processes In Progress Akarsh Hegde 3 SP\nKAN-138 Merge feat/mlx-persistent-server into KAN-136 branch To Do Aditya Harish 2 SP\nKAN-139 Create golden dataset for task classification In Progress Akarsh Hegde 5 SP\nKAN-137 One-click install package for the repo To Do Unassigned 5 SP\nKAN-105 Tag multiple tasks to a single session To Do Unassigned 3 SP\nBacklog\nKAN-56 Fill out Apple business details To Do Aditya Harish 1 SP\n+ Create issue\n[09:01:46]\nKAN-139 Create golden dataset for task classification - Meridiona - Jira\nmeridiona.atlassian.net/browse/KAN-139\nProjects / Meridian / KAN-139\nKAN-139\nCreate golden dataset for task classification\nAttach Add a child issue Link issue Apps\nDescription\nWrite more than 50 user flows with the help of Claude that represents a developer's coding cycle and the correct task (on Jira) classification for their activities during these flows. The dataset feeds the deepeval-based eval harness in services/tests/evals/ and is the foundation for benchmarking model swaps and prompt iterations.\nAcceptance criteria\n• At least 50 scoreable golden sessions across realistic developer flows\n• Mix of easy / medium / hard / overhead / untracked difficulty tiers\n• Drop-in to existing build_dataset.py format (input prompt + expected_output JSON)\n• Documented difficulty taxonomy and design rationale per session\n• Both real-project (Meridian KAN-xxx) and generic-placeholder (PROJ-xxx) developer personas\nDetails\nAssignee Akarsh Hegde\nReporter Aditya Harish\nLabels evals, intelligence, dataset\nSprint Sprint 12\nStory points 5\nReported 3 days ago\nUpdated 2 hours ago — Aditya Harish: added comment\nActivity Show: All\nAditya Harish 2 hours ago\nleft a note on the recent_sessions filter — current build_dataset.py:106 filters by duration_s > 1 AND session_text != '' which loses high-signal short sessions (eg a 15s 'git checkout -b feat/...' tells us everything). worth revisiting as part of this work.\nReply React Permalink\n[09:01:58]\nKAN-139 Create golden dataset for task classification - Meridiona - Jira\nDescription (continued visible region)\nAcceptance criteria\n• At least 50 scoreable golden sessions across realistic developer flows\n• Mix of easy / medium / hard / overhead / untracked difficulty tiers\n• Drop-in to existing build_dataset.py format (input prompt + expected_output JSON)\nLinked items\nblocks KAN-109 LLM benchmarking and prompt evaluation framework In Progress\nrelates to KAN-64 Session-to-Task Mapping Engine Done\nrelates to KAN-107 Add agent reasoning to the session→task mapping Done\nAttachments\nNo attachments\n[09:02:09]\nKAN-139 Create golden dataset for task classification - Meridiona - Jira\nComments (1)\nAditya Harish 2 hours ago\nleft a note on the recent_sessions filter — current build_dataset.py:106 filters by duration_s > 1 AND session_text != '' which loses high-signal short sessions (eg a 15s 'git checkout -b feat/...' tells us everything). worth revisiting as part of this work.\nReply\nAdd a comment…\n[09:02:16]\nKAN-139 Create golden dataset for task classification - Meridiona - Jira",
139
+ "session_text": "[09:01:34]\nNew Tab\nSearch Google or type a URL\nFrequently visited\nGitHub · Meridiona/meridian\nLinear — Meridian\nmeridiona.atlassian.net\nlocalhost:3939 — meridian dashboard\nOpenObserve — meridiona\nGmail\nCustomize Chrome\nQ Search tabs… Recently closed Bookmarks Reading list\n[09:01:39]\nmeridiona.atlassian.net/jira/software/projects/KAN/boards/1/backlog\nBacklog · Meridiona - Jira\nMeridiona\nJira\nYour work\nProjects\nMeridian (KAN)\nBoard\nBacklog\nReports\nSprint 12 — In progress\nKAN-136 Add observability and tracing for agents and later processes In Progress Akarsh Hegde 3 SP\nKAN-138 Merge feat/mlx-persistent-server into KAN-136 branch To Do Aditya Harish 2 SP\nKAN-139 Create golden dataset for task classification In Progress Akarsh Hegde 5 SP\nKAN-137 One-click install package for the repo To Do Unassigned 5 SP\nKAN-105 Tag multiple tasks to a single session To Do Unassigned 3 SP\nBacklog\nKAN-56 Fill out Apple business details To Do Aditya Harish 1 SP\n+ Create issue\n[09:01:46]\nKAN-139 Create golden dataset for task classification - Meridiona - Jira\nmeridiona.atlassian.net/browse/KAN-139\nProjects / Meridian / KAN-139\nKAN-139\nCreate golden dataset for task classification\nAttach Add a child issue Link issue Apps\nDescription\nWrite more than 50 user flows with the help of Claude that represents a developer's coding cycle and the correct task (on Jira) classification for their activities during these flows. The dataset feeds the deepeval-based eval harness in services/tests/evals/ and is the foundation for benchmarking model swaps and prompt iterations.\nAcceptance criteria\n• At least 50 scoreable golden sessions across realistic developer flows\n• Mix of easy / medium / hard / overhead / untracked difficulty tiers\n• Drop-in to existing build_dataset.py format (input prompt + expected_output JSON)\n• Documented difficulty taxonomy and design rationale per session\n• Both real-project (Meridian KAN-xxx) and generic-placeholder (PROJ-xxx) developer personas\nDetails\nAssignee Akarsh Hegde\nReporter Aditya Harish\nLabels evals, intelligence, dataset\nSprint Sprint 12\nStory points 5\nReported 3 days ago\nUpdated 2 hours ago — Aditya Harish: added comment\nActivity Show: All\nAditya Harish 2 hours ago\nleft a note on the recent_sessions filter — current build_dataset.py:106 filters by duration_s > 1 AND session_text != '' which loses high-signal short sessions (eg a 15s 'git checkout -b feat/...' tells us everything). worth revisiting as part of this work.\nReply React Permalink\n[09:01:58]\nKAN-139 Create golden dataset for task classification - Meridiona - Jira\nDescription (continued visible region)\nAcceptance criteria\n• At least 50 scoreable golden sessions across realistic developer flows\n• Mix of easy / medium / hard / overhead / untracked difficulty tiers\n• Drop-in to existing build_dataset.py format (input prompt + expected_output JSON)\nLinked items\nblocks KAN-109 LLM benchmarking and prompt evaluation framework In Progress\nrelates to KAN-64 Session-to-Task Mapping Engine Done\nrelates to KAN-107 Add agent reasoning to the session→task mapping Done\nAttachments\nNo attachments\n[09:02:09]\nKAN-139 Create golden dataset for task classification - Meridiona - Jira\nComments (1)\nAditya Harish 2 hours ago\nleft a note on the recent_sessions filter — current build_dataset.py:106 filters by duration_s > 1 AND session_text != '' which loses high-signal short sessions (eg a 15s 'git checkout -b feat/...' tells us everything). worth revisiting as part of this work.\nReply\nAdd a comment…\n[09:02:16]\nKAN-139 Create golden dataset for task classification - Meridiona - Jira",
140
140
  "audio_snippets": [],
141
141
  "ground_truth": {
142
142
  "task_key": "KAN-139",
@@ -189,7 +189,7 @@
189
189
  "count": 2
190
190
  }
191
191
  ],
192
- "session_text": "[09:38:00]\nNotes — macOS\n iCloud\n All iCloud\n Zuno / Dev Notes\n PROJ-210 progress <- ACTIVE\n PROJ-201 circuit breaker plan\n Sprint 2026-05 kickoff\n Personal\n\n[09:38:05]\nNotes — PROJ-210 progress\nPROJ-210 auth migration -- 2026-05-27 09:38\n\nDone so far:\n ✓ src/middleware/auth.ts -- cookie+CSRF path (b3e2f91)\n ✓ src/services/session-store.ts -- InMemorySessionStore + PkceStateStore\n ✓ src/routes/auth.ts -- login, csrf-token, logout, okta/redirect, okta/callback\n ✓ src/config.ts -- OKTA_* fields added\n ✓ tsc clean, 18/18 auth tests passing\n\nStill TODO before pair session (13:00):\n - pruneExpired() scheduler (setInterval 5min in app.ts startup)\n - quick manual curl test against localhost:3000\n - push branch and open PR draft for Sarah review\n\nDesign sync at 11:00 (PROJ-225 dashboard perf):\n - Review Figma skeleton designs\n - Confirm React.lazy() + Suspense boundaries plan\n - ChartSkeleton fallback (not null) -- Priya's note\n - Performance targets: initial load <1s, full <4s\n\n(developer saves -- Cmd+S, closes Notes)\n",
192
+ "session_text": "[09:38:00]\nNotes — macOS\n iCloud\n All iCloud\n Zuno / Dev Notes\n PROJ-210 progress <- ACTIVE\n PROJ-201 circuit breaker plan\n Sprint 2026-05 kickoff\n Personal\n\n[09:38:05]\nNotes — PROJ-210 progress\nPROJ-210 auth migration -- 2026-05-27 09:38\n\nDone so far:\n ✓ src/middleware/auth.ts -- cookie+CSRF path (b3e2f91)\n ✓ src/services/session-store.ts -- InMemorySessionStore + PkceStateStore\n ✓ src/routes/auth.ts -- login, csrf-token, logout, okta/redirect, okta/callback\n ✓ src/config.ts -- OKTA_* fields added\n ✓ tsc clean, 18/18 auth tests passing\n\nStill TODO before pair session (13:00):\n - pruneExpired() scheduler (setInterval 5min in app.ts startup)\n - quick manual curl test against localhost:3939\n - push branch and open PR draft for Sarah review\n\nDesign sync at 11:00 (PROJ-225 dashboard perf):\n - Review Figma skeleton designs\n - Confirm React.lazy() + Suspense boundaries plan\n - ChartSkeleton fallback (not null) -- Priya's note\n - Performance targets: initial load <1s, full <4s\n\n(developer saves -- Cmd+S, closes Notes)\n",
193
193
  "audio_snippets": [],
194
194
  "ground_truth": {
195
195
  "task_key": "none",
@@ -249,7 +249,7 @@
249
249
  "count": 5
250
250
  }
251
251
  ],
252
- "session_text": "[09:42:00]\nVisual Studio Code\nWindow: zuno-app — Visual Studio Code\nActive tab: src/app.ts\nStatus bar: TypeScript | Branch: feat/proj-210-auth-migration | 0 errors\n\n[09:42:08]\nVS Code — src/app.ts (opening for pruneExpired scheduler)\n\n 1 import express from 'express'\n 2 import cookieParser from 'cookie-parser'\n 3 import { authRouter } from './routes/auth'\n 4 import { webhookRouter } from './routes/webhooks'\n 5 import { requestLogger } from './middleware/requestLogger'\n 6 import { config } from './config'\n 7 \n 8 export const app = express()\n 9 app.use(express.json())\n 10 app.use(cookieParser())\n 11 app.use(requestLogger)\n 12 \n 13 app.use('/auth', authRouter)\n 14 app.use('/webhooks', webhookRouter)\n 15 \n 16 export function startServer(): void {\n 17 app.listen(config.PORT, () => {\n 18 console.log(`Server listening on port ${config.PORT}`)\n 19 })\n 20 }\n\n[09:42:20]\nVS Code — Terminal\n\n> Add a pruneExpired() scheduler to src/app.ts: call sessionStore.pruneExpired()\n every 5 minutes using setInterval. Also log the pruned count with the Datadog\n logger so we can track session store size in production.\n\n● Claude is thinking...\n\n ✓ Read src/app.ts\n ✎ Editing src/app.ts\n + import { sessionStore } from './services/session-store'\n + import logger from './utils/logger'\n ...\n + // Prune expired sessions every 5 minutes\n + setInterval(() => {\n + const pruned = sessionStore.pruneExpired()\n + if (pruned > 0) {\n + logger.info({ event: 'session_store_pruned', count: pruned,\n + remaining: sessionStore.size() })\n + }\n + }, 5 * 60 * 1000).unref() // .unref() so it doesn't prevent process exit\n ✓ Wrote src/app.ts (+9 lines)\n\n$ npx tsc --noEmit\n (exit 0)\n\n[09:43:00]\nVS Code — Terminal (manual curl test against localhost)\n\n$ npm run dev &\n [dev] Server listening on port 3000\n\n$ curl -s -X POST http://localhost:3000/auth/login \\\n -H 'Content-Type: application/json' \\\n -d '{\"email\":\"test@zuno.io\",\"password\":\"testpassword\"}' | jq .\n {\n \"csrfToken\": \"a3f91b2c...(64 hex chars)\",\n \"expiresAt\": \"2026-06-26T04:13:05.123Z\",\n \"maxAge\": 2592000\n }\n\n(developer: AUTH_COOKIE_ENABLED must be set to true in .env for the cookie path)\n\n$ AUTH_COOKIE_ENABLED=true npm run dev &\n [dev] Server listening on port 3001\n\n$ curl -s -c /tmp/zuno-cookies.txt -X POST http://localhost:3001/auth/login \\\n -H 'Content-Type: application/json' \\\n -d '{\"email\":\"test@zuno.io\",\"password\":\"testpassword\"}' | jq .\n {\n \"csrfToken\": \"b7d42f1a8e3c90ab5f6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b\",\n \"expiresAt\": \"2026-06-26T04:13:15.456Z\",\n \"maxAge\": 2592000\n }\n\n$ cat /tmp/zuno-cookies.txt\n # Netscape HTTP Cookie File\n localhost FALSE / FALSE 1782025995 zuno_session 4f7a1b3d...\n\n(developer: cookie is being set)\n\n$ CSRF=$(curl -s -c /tmp/zuno-cookies.txt -b /tmp/zuno-cookies.txt \\\n http://localhost:3001/auth/csrf-token | jq -r .csrfToken)\n$ echo \"CSRF: $CSRF\"\n CSRF: b7d42f1a8e3c90ab5f6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b\n\n$ curl -s -b /tmp/zuno-cookies.txt \\\n -H \"X-CSRF-Token: $CSRF\" \\\n -X POST http://localhost:3001/auth/logout | jq .\n { \"message\": \"Logged out\" }\n\n(developer: login, csrf-token, logout all working manually. cookie path confirmed.)\n\n$ kill %1 %2 # kill the dev servers\n\n[09:44:10]\nVS Code — Terminal (commit and push)\n\n$ git add src/app.ts\n$ git commit -m \"feat(auth): add session pruneExpired scheduler in app.ts\n>\n> PROJ-210: prune expired sessions every 5 min via setInterval.\n> .unref() so the interval doesn't block process exit.\n> Logs pruned count + remaining count via Datadog logger.\"\n\n [feat/proj-210-auth-migration f2b9d01]\n feat(auth): add session pruneExpired scheduler\n 1 file changed, 9 insertions(+)\n\n$ git push -u origin feat/proj-210-auth-migration\n Enumerating objects: 18, done.\n Branch feat/proj-210-auth-migration set up to track remote.\n\n$ gh pr create --draft --title 'feat(auth): JWT -> session cookie migration (PROJ-210)'\\\n --body 'PROJ-210: auth migration backend. All routes done, tests passing.\n Pair session with @alex at 13:00 for frontend integration.\n TODO before merging: integration tests for cookie path.'\n Draft PR #92 created: https://github.com/zuno-app/zuno/pull/92\n\n(developer: backend implementation complete. PR #92 open as draft.\n Ready for 11:00 design sync on PROJ-225.)\n",
252
+ "session_text": "[09:42:00]\nVisual Studio Code\nWindow: zuno-app — Visual Studio Code\nActive tab: src/app.ts\nStatus bar: TypeScript | Branch: feat/proj-210-auth-migration | 0 errors\n\n[09:42:08]\nVS Code — src/app.ts (opening for pruneExpired scheduler)\n\n 1 import express from 'express'\n 2 import cookieParser from 'cookie-parser'\n 3 import { authRouter } from './routes/auth'\n 4 import { webhookRouter } from './routes/webhooks'\n 5 import { requestLogger } from './middleware/requestLogger'\n 6 import { config } from './config'\n 7 \n 8 export const app = express()\n 9 app.use(express.json())\n 10 app.use(cookieParser())\n 11 app.use(requestLogger)\n 12 \n 13 app.use('/auth', authRouter)\n 14 app.use('/webhooks', webhookRouter)\n 15 \n 16 export function startServer(): void {\n 17 app.listen(config.PORT, () => {\n 18 console.log(`Server listening on port ${config.PORT}`)\n 19 })\n 20 }\n\n[09:42:20]\nVS Code — Terminal\n\n> Add a pruneExpired() scheduler to src/app.ts: call sessionStore.pruneExpired()\n every 5 minutes using setInterval. Also log the pruned count with the Datadog\n logger so we can track session store size in production.\n\n● Claude is thinking...\n\n ✓ Read src/app.ts\n ✎ Editing src/app.ts\n + import { sessionStore } from './services/session-store'\n + import logger from './utils/logger'\n ...\n + // Prune expired sessions every 5 minutes\n + setInterval(() => {\n + const pruned = sessionStore.pruneExpired()\n + if (pruned > 0) {\n + logger.info({ event: 'session_store_pruned', count: pruned,\n + remaining: sessionStore.size() })\n + }\n + }, 5 * 60 * 1000).unref() // .unref() so it doesn't prevent process exit\n ✓ Wrote src/app.ts (+9 lines)\n\n$ npx tsc --noEmit\n (exit 0)\n\n[09:43:00]\nVS Code — Terminal (manual curl test against localhost)\n\n$ npm run dev &\n [dev] Server listening on port 3000\n\n$ curl -s -X POST http://localhost:3939/auth/login \\\n -H 'Content-Type: application/json' \\\n -d '{\"email\":\"test@zuno.io\",\"password\":\"testpassword\"}' | jq .\n {\n \"csrfToken\": \"a3f91b2c...(64 hex chars)\",\n \"expiresAt\": \"2026-06-26T04:13:05.123Z\",\n \"maxAge\": 2592000\n }\n\n(developer: AUTH_COOKIE_ENABLED must be set to true in .env for the cookie path)\n\n$ AUTH_COOKIE_ENABLED=true npm run dev &\n [dev] Server listening on port 3001\n\n$ curl -s -c /tmp/zuno-cookies.txt -X POST http://localhost:3001/auth/login \\\n -H 'Content-Type: application/json' \\\n -d '{\"email\":\"test@zuno.io\",\"password\":\"testpassword\"}' | jq .\n {\n \"csrfToken\": \"b7d42f1a8e3c90ab5f6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b\",\n \"expiresAt\": \"2026-06-26T04:13:15.456Z\",\n \"maxAge\": 2592000\n }\n\n$ cat /tmp/zuno-cookies.txt\n # Netscape HTTP Cookie File\n localhost FALSE / FALSE 1782025995 zuno_session 4f7a1b3d...\n\n(developer: cookie is being set)\n\n$ CSRF=$(curl -s -c /tmp/zuno-cookies.txt -b /tmp/zuno-cookies.txt \\\n http://localhost:3001/auth/csrf-token | jq -r .csrfToken)\n$ echo \"CSRF: $CSRF\"\n CSRF: b7d42f1a8e3c90ab5f6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b\n\n$ curl -s -b /tmp/zuno-cookies.txt \\\n -H \"X-CSRF-Token: $CSRF\" \\\n -X POST http://localhost:3001/auth/logout | jq .\n { \"message\": \"Logged out\" }\n\n(developer: login, csrf-token, logout all working manually. cookie path confirmed.)\n\n$ kill %1 %2 # kill the dev servers\n\n[09:44:10]\nVS Code — Terminal (commit and push)\n\n$ git add src/app.ts\n$ git commit -m \"feat(auth): add session pruneExpired scheduler in app.ts\n>\n> PROJ-210: prune expired sessions every 5 min via setInterval.\n> .unref() so the interval doesn't block process exit.\n> Logs pruned count + remaining count via Datadog logger.\"\n\n [feat/proj-210-auth-migration f2b9d01]\n feat(auth): add session pruneExpired scheduler\n 1 file changed, 9 insertions(+)\n\n$ git push -u origin feat/proj-210-auth-migration\n Enumerating objects: 18, done.\n Branch feat/proj-210-auth-migration set up to track remote.\n\n$ gh pr create --draft --title 'feat(auth): JWT -> session cookie migration (PROJ-210)'\\\n --body 'PROJ-210: auth migration backend. All routes done, tests passing.\n Pair session with @alex at 13:00 for frontend integration.\n TODO before merging: integration tests for cookie path.'\n Draft PR #92 created: https://github.com/zuno-app/zuno/pull/92\n\n(developer: backend implementation complete. PR #92 open as draft.\n Ready for 11:00 design sync on PROJ-225.)\n",
253
253
  "audio_snippets": [],
254
254
  "ground_truth": {
255
255
  "task_key": "PROJ-210",
@@ -470,7 +470,7 @@
470
470
  "count": 5
471
471
  }
472
472
  ],
473
- "session_text": "[14:40:00]\nPostman — API Testing\nCollection: Zuno Backend | Environment: localhost\n\nSidebar:\n Collections:\n ▼ Zuno Backend\n Auth\n POST /auth/login\n GET /auth/csrf-token\n POST /auth/logout\n GET /auth/okta/redirect\n POST /auth/okta/callback\n Webhooks\n POST /webhooks/events <- ACTIVE\n GET /webhooks/events/:id\n GET /webhooks/events (list)\n PATCH /webhooks/targets/:id/re-enable\n Reports\n GET /reports\n GET /reports/export (CSV, PROJ-230)\n Environments:\n localhost (active) base_url = http://localhost:3000\n staging base_url = https://staging.zuno.io\n\n[14:40:20]\nPostman — POST /webhooks/events (sending a test webhook event)\n\nRequest:\n Method: POST\n URL: {{base_url}}/webhooks/events\n Auth: Bearer {{jwt_token}} (from env variable)\n Headers:\n Content-Type: application/json\n Body (raw JSON):\n {\n \"targetUrl\": \"https://httpbin.org/post\",\n \"payload\": {\n \"event\": \"user.created\",\n \"data\": { \"userId\": \"test-123\", \"email\": \"testuser@example.com\" }\n }\n }\n\n(developer clicks Send)\n\nResponse 200 OK (234ms)\n {\n \"id\": \"b7a3d2f1-4e5c-6789-abcd-ef0123456789\",\n \"targetUrl\": \"https://httpbin.org/post\",\n \"status\": \"pending\",\n \"attemptCount\": 0,\n \"deliveryId\": \"c9d8e7f6-a5b4-3c2d-1e0f-9a8b7c6d5e4f\",\n \"nextRetryAt\": null,\n \"createdAt\": \"2026-05-27T09:10:05.000Z\"\n }\n\n(developer: event created successfully. now testing that the retry worker\n picks it up and delivers to httpbin.org)\n\n[14:41:05]\nPostman — GET /webhooks/events/:id (checking delivery status)\n\nRequest:\n Method: GET\n URL: {{base_url}}/webhooks/events/b7a3d2f1-4e5c-6789-abcd-ef0123456789\n Auth: Bearer {{jwt_token}}\n\n(developer clicks Send)\n\nResponse 200 OK (18ms)\n {\n \"id\": \"b7a3d2f1-...\",\n \"targetUrl\": \"https://httpbin.org/post\",\n \"status\": \"success\",\n \"attemptCount\": 1,\n \"lastAttemptAt\": \"2026-05-27T09:10:06.100Z\",\n \"nextRetryAt\": null,\n \"deliveryId\": \"c9d8e7f6-...\"\n }\n\n(developer: status is 'success' -- delivery worked on first attempt.\n httpbin.org echoes the request back with 200.)\n\n[14:41:40]\nPostman — POST /webhooks/events (testing with a dead endpoint)\n\nRequest body:\n {\n \"targetUrl\": \"https://dead-endpoint.example.com/webhook\",\n \"payload\": { \"event\": \"user.created\", \"data\": { \"userId\": \"test-456\" } }\n }\n\n(developer sends 3 events to the same dead endpoint to trigger circuit breaker)\n\n(Send #1) Response 200 OK\n { \"id\": \"e1f2a3b4-...\", \"status\": \"pending\", ... }\n(Send #2) Response 200 OK\n { \"id\": \"f2e3d4c5-...\", \"status\": \"pending\", ... }\n(Send #3) Response 200 OK\n { \"id\": \"a3b4c5d6-...\", \"status\": \"pending\", ... }\n\n(developer waits ~5 seconds for retry worker to process events)\n\n[14:42:10]\nPostman — PATCH /webhooks/targets/:id/re-enable (checking target status)\n\nGET /webhooks/targets?url=dead-endpoint.example.com\n\nResponse 200 OK:\n {\n \"targetUrl\": \"https://dead-endpoint.example.com/webhook\",\n \"status\": \"dead\",\n \"consecutiveFailures\": 3,\n \"markedDeadAt\": \"2026-05-27T09:11:58.220Z\"\n }\n\n(developer: circuit breaker triggered correctly -- target is marked dead after\n 3 consecutive failures. Datadog should have the circuit_breaker_triggered log.)\n(switches to VS Code terminal to check logs)\n\n[14:42:45]\nPostman\n(developer closes Postman, returns to VS Code)\n",
473
+ "session_text": "[14:40:00]\nPostman — API Testing\nCollection: Zuno Backend | Environment: localhost\n\nSidebar:\n Collections:\n ▼ Zuno Backend\n Auth\n POST /auth/login\n GET /auth/csrf-token\n POST /auth/logout\n GET /auth/okta/redirect\n POST /auth/okta/callback\n Webhooks\n POST /webhooks/events <- ACTIVE\n GET /webhooks/events/:id\n GET /webhooks/events (list)\n PATCH /webhooks/targets/:id/re-enable\n Reports\n GET /reports\n GET /reports/export (CSV, PROJ-230)\n Environments:\n localhost (active) base_url = http://localhost:3939\n staging base_url = https://staging.zuno.io\n\n[14:40:20]\nPostman — POST /webhooks/events (sending a test webhook event)\n\nRequest:\n Method: POST\n URL: {{base_url}}/webhooks/events\n Auth: Bearer {{jwt_token}} (from env variable)\n Headers:\n Content-Type: application/json\n Body (raw JSON):\n {\n \"targetUrl\": \"https://httpbin.org/post\",\n \"payload\": {\n \"event\": \"user.created\",\n \"data\": { \"userId\": \"test-123\", \"email\": \"testuser@example.com\" }\n }\n }\n\n(developer clicks Send)\n\nResponse 200 OK (234ms)\n {\n \"id\": \"b7a3d2f1-4e5c-6789-abcd-ef0123456789\",\n \"targetUrl\": \"https://httpbin.org/post\",\n \"status\": \"pending\",\n \"attemptCount\": 0,\n \"deliveryId\": \"c9d8e7f6-a5b4-3c2d-1e0f-9a8b7c6d5e4f\",\n \"nextRetryAt\": null,\n \"createdAt\": \"2026-05-27T09:10:05.000Z\"\n }\n\n(developer: event created successfully. now testing that the retry worker\n picks it up and delivers to httpbin.org)\n\n[14:41:05]\nPostman — GET /webhooks/events/:id (checking delivery status)\n\nRequest:\n Method: GET\n URL: {{base_url}}/webhooks/events/b7a3d2f1-4e5c-6789-abcd-ef0123456789\n Auth: Bearer {{jwt_token}}\n\n(developer clicks Send)\n\nResponse 200 OK (18ms)\n {\n \"id\": \"b7a3d2f1-...\",\n \"targetUrl\": \"https://httpbin.org/post\",\n \"status\": \"success\",\n \"attemptCount\": 1,\n \"lastAttemptAt\": \"2026-05-27T09:10:06.100Z\",\n \"nextRetryAt\": null,\n \"deliveryId\": \"c9d8e7f6-...\"\n }\n\n(developer: status is 'success' -- delivery worked on first attempt.\n httpbin.org echoes the request back with 200.)\n\n[14:41:40]\nPostman — POST /webhooks/events (testing with a dead endpoint)\n\nRequest body:\n {\n \"targetUrl\": \"https://dead-endpoint.example.com/webhook\",\n \"payload\": { \"event\": \"user.created\", \"data\": { \"userId\": \"test-456\" } }\n }\n\n(developer sends 3 events to the same dead endpoint to trigger circuit breaker)\n\n(Send #1) Response 200 OK\n { \"id\": \"e1f2a3b4-...\", \"status\": \"pending\", ... }\n(Send #2) Response 200 OK\n { \"id\": \"f2e3d4c5-...\", \"status\": \"pending\", ... }\n(Send #3) Response 200 OK\n { \"id\": \"a3b4c5d6-...\", \"status\": \"pending\", ... }\n\n(developer waits ~5 seconds for retry worker to process events)\n\n[14:42:10]\nPostman — PATCH /webhooks/targets/:id/re-enable (checking target status)\n\nGET /webhooks/targets?url=dead-endpoint.example.com\n\nResponse 200 OK:\n {\n \"targetUrl\": \"https://dead-endpoint.example.com/webhook\",\n \"status\": \"dead\",\n \"consecutiveFailures\": 3,\n \"markedDeadAt\": \"2026-05-27T09:11:58.220Z\"\n }\n\n(developer: circuit breaker triggered correctly -- target is marked dead after\n 3 consecutive failures. Datadog should have the circuit_breaker_triggered log.)\n(switches to VS Code terminal to check logs)\n\n[14:42:45]\nPostman\n(developer closes Postman, returns to VS Code)\n",
474
474
  "audio_snippets": [],
475
475
  "ground_truth": {
476
476
  "task_key": "PROJ-201",
@@ -606,7 +606,7 @@
606
606
  "count": 5
607
607
  }
608
608
  ],
609
- "session_text": "[15:08:00]\nVisual Studio Code\nBranch: feat/proj-225-dashboard-lazy-load\nActive tabs:\n src/styles/globals.css <- ACTIVE\n src/components/Dashboard/index.tsx\n\n[15:08:12]\nVS Code — src/styles/globals.css\n(adding the chart-fade-in CSS class that Claude Code mentioned in session 10)\n\n /* ... existing styles ... */\n \n /* PROJ-225: fade-in transition for lazy-loaded charts */\n .chart-fade-in {\n animation: chartFadeIn 300ms ease-in;\n }\n \n @keyframes chartFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n(developer types and saves: Cmd+S)\n\n[15:08:45]\nVS Code — Terminal\n\n$ npx tsc --noEmit\n (exit 0)\n\n$ npm run dev (starts Next.js dev server)\n ready - started server on 0.0.0.0:3000, url: http://localhost:3000\n\n(developer opens Chrome DevTools for profiling)\n\n[15:09:10]\nVS Code — Terminal (performance script)\n(developer uses Playwright to measure FCP before and after)\n\n> Write a quick Playwright script to measure First Contentful Paint (FCP)\n on http://localhost:3000/dashboard. Run it 3 times and average the FCP.\n Print: average FCP, min FCP, max FCP.\n\n● Claude is thinking...\n\n ✎ Writing /tmp/measure-fcp.ts (temporary script)\n ─────────────────────────────────────────\n import { chromium } from 'playwright'\n\n async function measureFcp(url: string): Promise<number> {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n const fcpPromise = page.evaluate(() =>\n new Promise<number>((resolve) => {\n new PerformanceObserver((list) => {\n const fcp = list.getEntriesByName('first-contentful-paint')[0]\n if (fcp) resolve(fcp.startTime)\n }).observe({ entryTypes: ['paint'] })\n })\n )\n await page.goto(url)\n const fcp = await fcpPromise\n await browser.close()\n return fcp\n }\n\n const results = []\n for (let i = 0; i < 3; i++) {\n const fcp = await measureFcp('http://localhost:3000/dashboard')\n results.push(fcp)\n console.log(`Run ${i+1}: ${fcp.toFixed(0)}ms`)\n }\n const avg = results.reduce((a,b) => a+b, 0) / results.length\n console.log(`Average FCP: ${avg.toFixed(0)}ms`)\n console.log(`Min: ${Math.min(...results).toFixed(0)}ms`)\n console.log(`Max: ${Math.max(...results).toFixed(0)}ms`)\n ─────────────────────────────────────────\n ✓ Written /tmp/measure-fcp.ts\n\n[15:09:55]\nVS Code — Terminal (running the FCP measurement)\n\n$ npx ts-node /tmp/measure-fcp.ts\n Run 1: 134ms\n Run 2: 142ms\n Run 3: 128ms\n Average FCP: 135ms\n Min: 128ms\n Max: 142ms\n\n(developer: FCP is 135ms average! Original was ~3,100ms. That's a 23x improvement.)\n\n$ npx ts-node /tmp/measure-fcp.ts # run again on the OLD branch to baseline\n (switches to main branch)\n\n$ git stash && git checkout main\n Run 1: 3,102ms\n Run 2: 3,087ms\n Run 3: 3,143ms\n Average FCP: 3,111ms\n\n$ git checkout feat/proj-225-dashboard-lazy-load && git stash pop\n\n(developer: confirmed: 3,111ms -> 135ms. 23x improvement. well within <1s target.)\n\n[15:10:45]\nVS Code — Terminal (commit and push)\n\n$ git add src/styles/globals.css\n$ git commit -m 'feat(dashboard): add chart-fade-in CSS animation (PROJ-225)\n>\n> 300ms ease-in opacity + 4px translateY fade for lazy-loaded charts.\n> FCP measurement: 3,111ms (baseline) -> 135ms (lazy-load) = 23x improvement.\n> Well within the <1s target from PROJ-225 acceptance criteria.'\n\n [feat/proj-225-dashboard-lazy-load b9c0d1e]\n feat(dashboard): add chart-fade-in CSS animation\n 1 file changed, 9 insertions(+)\n\n$ git push -u origin feat/proj-225-dashboard-lazy-load\n$ gh pr create --draft --title 'feat(dashboard): lazy-load heavy charts (PROJ-225)'\\\n --body 'PROJ-225: React.lazy() + Suspense + skeleton for 3 heavy charts.\n FCP: 3,111ms -> 135ms (23x improvement). Full load: <4s SLA met.\n chart-fade-in 300ms CSS. ErrorBoundary for error/retry state.\n 4 Dashboard tests passing.'\n Draft PR #94 created.\n\n(developer: PROJ-225 core done. Will post performance numbers to Slack.)\n",
609
+ "session_text": "[15:08:00]\nVisual Studio Code\nBranch: feat/proj-225-dashboard-lazy-load\nActive tabs:\n src/styles/globals.css <- ACTIVE\n src/components/Dashboard/index.tsx\n\n[15:08:12]\nVS Code — src/styles/globals.css\n(adding the chart-fade-in CSS class that Claude Code mentioned in session 10)\n\n /* ... existing styles ... */\n \n /* PROJ-225: fade-in transition for lazy-loaded charts */\n .chart-fade-in {\n animation: chartFadeIn 300ms ease-in;\n }\n \n @keyframes chartFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n(developer types and saves: Cmd+S)\n\n[15:08:45]\nVS Code — Terminal\n\n$ npx tsc --noEmit\n (exit 0)\n\n$ npm run dev (starts Next.js dev server)\n ready - started server on 0.0.0.0:3939, url: http://localhost:3939\n\n(developer opens Chrome DevTools for profiling)\n\n[15:09:10]\nVS Code — Terminal (performance script)\n(developer uses Playwright to measure FCP before and after)\n\n> Write a quick Playwright script to measure First Contentful Paint (FCP)\n on http://localhost:3939/dashboard. Run it 3 times and average the FCP.\n Print: average FCP, min FCP, max FCP.\n\n● Claude is thinking...\n\n ✎ Writing /tmp/measure-fcp.ts (temporary script)\n ─────────────────────────────────────────\n import { chromium } from 'playwright'\n\n async function measureFcp(url: string): Promise<number> {\n const browser = await chromium.launch()\n const page = await browser.newPage()\n const fcpPromise = page.evaluate(() =>\n new Promise<number>((resolve) => {\n new PerformanceObserver((list) => {\n const fcp = list.getEntriesByName('first-contentful-paint')[0]\n if (fcp) resolve(fcp.startTime)\n }).observe({ entryTypes: ['paint'] })\n })\n )\n await page.goto(url)\n const fcp = await fcpPromise\n await browser.close()\n return fcp\n }\n\n const results = []\n for (let i = 0; i < 3; i++) {\n const fcp = await measureFcp('http://localhost:3939/dashboard')\n results.push(fcp)\n console.log(`Run ${i+1}: ${fcp.toFixed(0)}ms`)\n }\n const avg = results.reduce((a,b) => a+b, 0) / results.length\n console.log(`Average FCP: ${avg.toFixed(0)}ms`)\n console.log(`Min: ${Math.min(...results).toFixed(0)}ms`)\n console.log(`Max: ${Math.max(...results).toFixed(0)}ms`)\n ─────────────────────────────────────────\n ✓ Written /tmp/measure-fcp.ts\n\n[15:09:55]\nVS Code — Terminal (running the FCP measurement)\n\n$ npx ts-node /tmp/measure-fcp.ts\n Run 1: 134ms\n Run 2: 142ms\n Run 3: 128ms\n Average FCP: 135ms\n Min: 128ms\n Max: 142ms\n\n(developer: FCP is 135ms average! Original was ~3,100ms. That's a 23x improvement.)\n\n$ npx ts-node /tmp/measure-fcp.ts # run again on the OLD branch to baseline\n (switches to main branch)\n\n$ git stash && git checkout main\n Run 1: 3,102ms\n Run 2: 3,087ms\n Run 3: 3,143ms\n Average FCP: 3,111ms\n\n$ git checkout feat/proj-225-dashboard-lazy-load && git stash pop\n\n(developer: confirmed: 3,111ms -> 135ms. 23x improvement. well within <1s target.)\n\n[15:10:45]\nVS Code — Terminal (commit and push)\n\n$ git add src/styles/globals.css\n$ git commit -m 'feat(dashboard): add chart-fade-in CSS animation (PROJ-225)\n>\n> 300ms ease-in opacity + 4px translateY fade for lazy-loaded charts.\n> FCP measurement: 3,111ms (baseline) -> 135ms (lazy-load) = 23x improvement.\n> Well within the <1s target from PROJ-225 acceptance criteria.'\n\n [feat/proj-225-dashboard-lazy-load b9c0d1e]\n feat(dashboard): add chart-fade-in CSS animation\n 1 file changed, 9 insertions(+)\n\n$ git push -u origin feat/proj-225-dashboard-lazy-load\n$ gh pr create --draft --title 'feat(dashboard): lazy-load heavy charts (PROJ-225)'\\\n --body 'PROJ-225: React.lazy() + Suspense + skeleton for 3 heavy charts.\n FCP: 3,111ms -> 135ms (23x improvement). Full load: <4s SLA met.\n chart-fade-in 300ms CSS. ErrorBoundary for error/retry state.\n 4 Dashboard tests passing.'\n Draft PR #94 created.\n\n(developer: PROJ-225 core done. Will post performance numbers to Slack.)\n",
610
610
  "audio_snippets": [],
611
611
  "ground_truth": {
612
612
  "task_key": "PROJ-225",
@@ -0,0 +1,4 @@
1
+ @font-face{font-family:GeistSans;src:url(../media/Geist_Variable-s.p.0si68_l5hnsib.woff2)format("woff2");font-display:swap;font-weight:100 900}@font-face{font-family:GeistSans Fallback;src:local(Arial);ascent-override:85.83%;descent-override:20.52%;line-gap-override:9.33%;size-adjust:107.19%}.geistsans_d5a4f12f-module__TO7w1a__className{font-family:GeistSans,GeistSans Fallback}.geistsans_d5a4f12f-module__TO7w1a__variable{--font-geist-sans:"GeistSans", "GeistSans Fallback"}
2
+ @font-face{font-family:GeistMono;src:url(../media/GeistMono_Variable.p.17b2olbe3zz2r.woff2)format("woff2");font-display:swap;font-weight:100 900}.geistmono_157ca88a-module__1FklWW__className{font-family:GeistMono,ui-monospace,SFMono-Regular,Roboto Mono,Menlo,Monaco,Liberation Mono,DejaVu Sans Mono,Courier New,monospace}.geistmono_157ca88a-module__1FklWW__variable{--font-geist-mono:"GeistMono", ui-monospace, SFMono-Regular, Roboto Mono, Menlo, Monaco, Liberation Mono, DejaVu Sans Mono, Courier New, monospace}
3
+ @font-face{font-family:Instrument Serif;font-style:italic;font-weight:400;font-display:swap;src:url(../media/fc0a7394b875fa43-s.0y1-r_vehenvp.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Instrument Serif;font-style:italic;font-weight:400;font-display:swap;src:url(../media/7ebf22b5a21034f8-s.p.10_7676vm7pyy.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Instrument Serif;font-style:normal;font-weight:400;font-display:swap;src:url(../media/ccf27e5a7366fb23-s.0hck6o0i8wq3a.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Instrument Serif;font-style:normal;font-weight:400;font-display:swap;src:url(../media/e41d5df559864f9e-s.p.0gq7fw9.sy_5..woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Instrument Serif Fallback;src:local(Times New Roman);ascent-override:117.94%;descent-override:36.93%;line-gap-override:0.0%;size-adjust:83.94%}.instrument_serif_421229c2-module__JnCTKG__className{font-family:Instrument Serif,Instrument Serif Fallback;font-weight:400}.instrument_serif_421229c2-module__JnCTKG__variable{--font-instrument-serif:"Instrument Serif", "Instrument Serif Fallback"}
4
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:var(--font-geist-sans);--font-serif:var(--font-instrument-serif);--font-mono:var(--font-geist-mono);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-\[2px\]{top:2px}.right-4{right:calc(var(--spacing)*4)}.bottom-4{bottom:calc(var(--spacing)*4)}.z-40{z-index:40}.z-50{z-index:50}.m-3{margin:calc(var(--spacing)*3)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-24{margin-top:calc(var(--spacing)*24)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-px{margin-bottom:1px}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-6{height:calc(var(--spacing)*6)}.h-9{height:calc(var(--spacing)*9)}.h-12{height:calc(var(--spacing)*12)}.h-\[3px\]{height:3px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[46px\]{height:46px}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[40vh\]{max-height:40vh}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-\[14px\]{width:14px}.w-\[22px\]{width:22px}.w-\[72px\]{width:72px}.w-\[240px\]{width:240px}.w-\[280px\]{width:280px}.w-\[560px\]{width:560px}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[92vw\]{max-width:92vw}.max-w-\[220px\]{max-width:220px}.max-w-\[1080px\]{max-width:1080px}.max-w-md{max-width:var(--container-md)}.max-w-prose{max-width:65ch}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[60px\]{min-width:60px}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-move{cursor:move}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[1fr_300px\]{grid-template-columns:1fr 300px}.grid-cols-\[80px_auto_1fr_auto_auto\]{grid-template-columns:80px auto 1fr auto auto}.grid-cols-\[120px_1fr_64px\]{grid-template-columns:120px 1fr 64px}.grid-cols-\[auto_1fr_200px_auto\]{grid-template-columns:auto 1fr 200px auto}.grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.grid-cols-\[auto_1fr_auto_auto\]{grid-template-columns:auto 1fr auto auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*7)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*7)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*10)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*12)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*12)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px*var(--tw-space-y-reverse));margin-block-end:calc(1px*calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-x-5{column-gap:calc(var(--spacing)*5)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.gap-y-2{row-gap:calc(var(--spacing)*2)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-\[14px\]{border-radius:14px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-\[\#D8E0F4\]{border-color:#d8e0f4}.border-\[\#E8E6E1\]{border-color:#e8e6e1}.border-\[\#F0EFEC\]{border-color:#f0efec}.border-\[\#FDE68A\]{border-color:#fde68a}.bg-\[\#141414\]{background-color:#141414}.bg-\[\#EBF0FB\]{background-color:#ebf0fb}.bg-\[\#F0EFEC\]{background-color:#f0efec}.bg-\[\#F8F7F4\]{background-color:#f8f7f4}.bg-\[\#F8F7F4\]\/90{background-color:#f8f7f4e6;background-color:lab(97.2469% -.0460744 1.56863/.9)}.bg-\[\#FEF9EC\]{background-color:#fef9ec}.bg-white{background-color:var(--color-white)}.fill-white{fill:var(--color-white)}.p-0{padding:calc(var(--spacing)*0)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-10{padding-inline:calc(var(--spacing)*10)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-7{padding-block:calc(var(--spacing)*7)}.py-12{padding-block:calc(var(--spacing)*12)}.py-14{padding-block:calc(var(--spacing)*14)}.py-16{padding-block:calc(var(--spacing)*16)}.py-px{padding-block:1px}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-8{padding-top:calc(var(--spacing)*8)}.pt-\[18vh\]{padding-top:18vh}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-\[44px\]{padding-left:44px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[28px\]{font-size:28px}.text-\[32px\]{font-size:32px}.text-\[36px\]{font-size:36px}.text-\[40px\]{font-size:40px}.text-\[56px\]{font-size:56px}.text-\[88px\]{font-size:88px}.leading-\[0\.95\]{--tw-leading:.95;line-height:.95}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\],.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.01em\]{--tw-tracking:.01em;letter-spacing:.01em}.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#3D5BB0\]{color:#3d5bb0}.text-\[\#4B4A47\]{color:#4b4a47}.text-\[\#6B6A67\]{color:#6b6a67}.text-\[\#9B9A97\]{color:#9b9a97}.text-\[\#92400E\]{color:#92400e}.text-\[\#141414\]{color:#141414}.text-\[\#C8C6C1\]{color:#c8c6c1}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.hover\:bg-\[\#E8E6E1\]:hover{background-color:#e8e6e1}.hover\:text-\[\#141414\]:hover{color:#141414}.hover\:opacity-80:hover{opacity:.8}.hover\:brightness-95:hover{--tw-brightness:brightness(95%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}@media (min-width:48rem){.md\:block{display:block}}@media (min-width:64rem){.lg\:grid-cols-\[minmax\(0\,300px\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,300px) minmax(0,1fr)}}}:root{--paper:#faf9f7;--surface:#fff;--surface-2:#f5f4f1;--ink:#0d0c0a;--ink-2:#3a3834;--ink-3:#7a7873;--ink-4:#b8b5af;--rule:#eeece8;--rule-2:#e5e3de;--accent:#c4822a;--accent-soft:#fbf0e2;--live:#c4822a;--success:#2d7a4f;--warn:#a36a1a;--tint:#c4822a12}html.dark{--paper:#0a0908;--surface:#111010;--surface-2:#161514;--ink:#f2efe8;--ink-2:#b5b0a8;--ink-3:#787470;--ink-4:#4a4744;--rule:#1e1d1b;--rule-2:#272522;--accent:#d4942e;--accent-soft:#d4942e24;--live:#d4942e;--success:#5ab87a;--warn:#d4a044;--tint:#d4942e14}html,body{background:var(--paper);color:var(--ink)}*{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,.font-sans{font-feature-settings:"ss01","cv11"}.font-mono{font-feature-settings:"tnum","ss01";font-family:GeistMono,ui-monospace,SFMono-Regular,monospace}.font-serif{font-family:var(--font-instrument-serif),"Instrument Serif",Georgia,serif;font-feature-settings:"liga","dlig"}::selection{background:var(--accent);color:#fff}.cat-coding{fill:#3b6fe0;background:#3b6fe0}.cat-code_review{fill:#7c3aed;background:#7c3aed}.cat-meeting{fill:#d97706;background:#d97706}.cat-communication{fill:#059669;background:#059669}.cat-design{fill:#db2777;background:#db2777}.cat-documentation{fill:#0891b2;background:#0891b2}.cat-planning{fill:#c4822a;background:#c4822a}.cat-deployment_devops{fill:#dc2626;background:#dc2626}.cat-research{fill:#4f46e5;background:#4f46e5}.cat-idle_personal{fill:#78716c;background:#78716c}.cat-text-coding{color:#3b6fe0}.cat-text-code_review{color:#7c3aed}.cat-text-meeting{color:#d97706}.cat-text-communication{color:#059669}.cat-text-design{color:#db2777}.cat-text-documentation{color:#0891b2}.cat-text-planning{color:#c4822a}.cat-text-deployment_devops{color:#dc2626}.cat-text-research{color:#4f46e5}.cat-text-idle_personal{color:#78716c}.rule{border-color:var(--rule)}.rule-b{border-bottom:1px solid var(--rule)}.rule-t{border-top:1px solid var(--rule)}.rule-r{border-right:1px solid var(--rule)}.rule-l{border-left:1px solid var(--rule)}@keyframes mer-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.45;transform:scale(.92)}}.live-dot{animation:2.2s ease-in-out infinite mer-pulse}@keyframes mer-blink{50%{opacity:.35}}.blink{animation:1.1s ease-in-out infinite mer-blink}@keyframes mer-rise{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.rise{animation:.4s cubic-bezier(.16,1,.3,1) both mer-rise}.tnum{font-variant-numeric:tabular-nums}.kbd{font-family:var(--font-geist-mono),ui-monospace,monospace;border:1px solid var(--rule-2);color:var(--ink-3);background:var(--surface);border-bottom-width:2px;border-radius:4px;padding:2px 5px;font-size:10px;line-height:1}.nice-scroll::-webkit-scrollbar{width:8px;height:8px}.nice-scroll::-webkit-scrollbar-track{background:0 0}.nice-scroll::-webkit-scrollbar-thumb{background:var(--rule-2);background-clip:content-box;border:2px solid #0000;border-radius:6px}.nice-scroll::-webkit-scrollbar-thumb:hover{background:var(--ink-4);background-clip:content-box;border:2px solid #0000}button:focus-visible,a:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}html.density-compact .density-pad{padding-top:.5rem;padding-bottom:.5rem}html.density-comfy .density-pad{padding-top:1.25rem;padding-bottom:1.25rem}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,29987,e=>{"use strict";var t=e.i(80663),n=e.i(56916);let s={Antigravity:{mono:"Aᴳ",color:"#7C3AED"},"Google Chrome":{mono:"Ch",color:"#3B82F6"},Terminal:{mono:">_",color:"#111827"},DBeaver:{mono:"DB",color:"#1D4ED8"},Claude:{mono:"Cl",color:"#D97757"},Slack:{mono:"Sl",color:"#E01E5A"},Zoom:{mono:"Zm",color:"#2D8CFF"},Linear:{mono:"Li",color:"#5E6AD2"},Figma:{mono:"Fg",color:"#A259FF"},Notion:{mono:"No",color:"#111111"},Spotify:{mono:"Sp",color:"#1DB954"},Mail:{mono:"Ma",color:"#0EA5E9"},Safari:{mono:"Sf",color:"#006FE5"},Xcode:{mono:"Xc",color:"#1171A3"},iTerm2:{mono:">_",color:"#2A2A2A"}},r={todo:{label:"Todo",dot:"var(--ink-4)"},in_progress:{label:"In progress",dot:"var(--accent)"},in_review:{label:"In review",dot:"#8B5CF6"},done:{label:"Done",dot:"var(--success)"}};e.s(["AppGlyph",0,function({app:e,size:n=24,withName:r=!1}){let a=function(e){if(!e)return{mono:"??",color:"#6B6A67"};if(s[e])return s[e];let t=e.trim().replace(/[^A-Za-z0-9]/g,"").slice(0,2).toUpperCase()||"??",n=0;for(let t=0;t<e.length;t++)n=31*n+e.charCodeAt(t)&65535;let r=n%360;return{mono:t,color:`hsl(${r}, 55%, 42%)`}}(e);return(0,t.jsxs)("span",{className:"inline-flex items-center gap-2",children:[(0,t.jsx)("span",{className:"inline-flex items-center justify-center rounded-md font-mono shrink-0",style:{width:n,height:n,background:a.color+"1A",color:a.color,fontSize:Math.max(9,.42*n),fontWeight:600,letterSpacing:"-0.02em"},"aria-label":e??void 0,children:a.mono}),r&&(0,t.jsx)("span",{className:"text-sm",style:{color:"var(--ink)"},children:e})]})},"CATS",0,{coding:{label:"Coding",short:"Code"},code_review:{label:"Code review",short:"Review"},meeting:{label:"Meeting",short:"Meet"},communication:{label:"Comms",short:"Comms"},design:{label:"Design",short:"Design"},documentation:{label:"Docs",short:"Docs"},planning:{label:"Planning",short:"Plan"},deployment_devops:{label:"DevOps",short:"DevOps"},research:{label:"Research",short:"Res"},idle_personal:{label:"Idle",short:"Idle"}},"Card",0,function({children:e,className:n="",as:s="div",style:r,...a}){return(0,t.jsx)(s,{...a,className:`rounded-xl border ${n}`,style:{background:"var(--surface)",borderColor:"var(--rule)",...r},children:e})},"CatDot",0,function({cat:e,size:n=6}){return(0,t.jsx)("span",{className:`inline-block rounded-full cat-${e} shrink-0`,style:{width:n,height:n},"aria-hidden":!0})},"ConfidenceRing",0,function({value:e,size:n=14}){let s=n/2-1.5,r=2*Math.PI*s,a=r*Math.max(0,Math.min(1,e));return(0,t.jsxs)("svg",{width:n,height:n,viewBox:`0 0 ${n} ${n}`,"aria-label":`${Math.round(100*e)}% confidence`,children:[(0,t.jsx)("circle",{cx:n/2,cy:n/2,r:s,fill:"none",stroke:"var(--rule-2)",strokeWidth:"1.5"}),(0,t.jsx)("circle",{cx:n/2,cy:n/2,r:s,fill:"none",stroke:e>.8?"var(--success)":e>.5?"var(--accent)":"var(--warn)",strokeWidth:"1.5",strokeLinecap:"round",strokeDasharray:`${a} ${r}`,transform:`rotate(-90 ${n/2} ${n/2})`})]})},"LiveDot",0,function({size:e=8}){return(0,t.jsxs)("span",{className:"inline-flex items-center justify-center relative",style:{width:e,height:e},children:[(0,t.jsx)("span",{className:"absolute inline-block rounded-full live-dot",style:{width:e,height:e,background:"var(--live)"}}),(0,t.jsx)("span",{className:"inline-block rounded-full",style:{width:Math.max(3,e-4),height:Math.max(3,e-4),background:"var(--live)"}})]})},"SectionHead",0,function({kicker:e,title:n,right:s}){return(0,t.jsxs)("div",{className:"flex items-end justify-between mb-3",children:[(0,t.jsxs)("div",{children:[e&&(0,t.jsx)("p",{className:"text-[10px] uppercase tracking-[0.16em] mb-1.5",style:{color:"var(--ink-3)"},children:e}),(0,t.jsx)("h2",{className:"text-[15px] font-medium",style:{color:"var(--ink)"},children:n})]}),s]})},"SegBar",0,function({segments:e,height:n=4}){let s=e.reduce((e,t)=>e+t.value,0)||1;return(0,t.jsx)("span",{className:"inline-flex w-full overflow-hidden rounded-full",style:{height:n,background:"var(--rule)"},children:e.map((e,n)=>(0,t.jsx)("span",{className:e.cat?`cat-${e.cat}`:"",style:{width:`${e.value/s*100}%`,background:e.color??void 0}},n))})},"StatusPill",0,function({status:e}){let n=r[e]??r.todo;return(0,t.jsxs)("span",{className:"inline-flex items-center gap-1.5 text-[11px]",style:{color:"var(--ink-2)"},children:[(0,t.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full",style:{background:n.dot}}),n.label]})},"TaskKey",0,function({keyId:e,big:n=!1}){return e?(0,t.jsx)("span",{className:`font-mono tracking-tight ${n?"text-[12px]":"text-[11px]"} px-1.5 py-px rounded-[4px] tnum`,style:{color:"var(--ink)",background:"var(--tint)",borderBottom:"1px solid var(--rule-2)"},children:e}):null},"fmtClock",0,function(e){if("number"==typeof e){let t=Math.floor(e),n=Math.round((e-t)*60);return`${(t+11)%12+1}:${String(n).padStart(2,"0")} ${t>=12?"PM":"AM"}`}let t=new Date(e),n=t.getHours(),s=t.getMinutes();return`${(n+11)%12+1}:${String(s).padStart(2,"0")} ${n>=12?"PM":"AM"}`},"fmtDur",0,function(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m`;let n=Math.floor(t/60),s=t%60;return s>0?`${n}h ${s}m`:`${n}h`},"fmtDurDecimal",0,function(e){if(e<60)return"0:"+String(e).padStart(2,"0");let t=Math.floor(e/60);if(t<60)return"0:"+String(t).padStart(2,"0");let n=Math.floor(t/60);return`${n}:${String(t%60).padStart(2,"0")}`},"useTick",0,function(e=1){let[t,s]=(0,n.useState)(0);return(0,n.useEffect)(()=>{let t=setInterval(()=>s(e=>e+1),1e3*e);return()=>clearInterval(t)},[e]),t}])},953,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"BailoutToCSR",{enumerable:!0,get:function(){return r}});let s=e.r(45158);function r({reason:e,children:t}){if("u"<typeof window)throw Object.defineProperty(new s.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t}},79372,(e,t,n)=>{"use strict";function s(e){return e.split("/").map(e=>encodeURIComponent(e)).join("/")}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"encodeURIPath",{enumerable:!0,get:function(){return s}})},70492,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"PreloadChunks",{enumerable:!0,get:function(){return i}});let s=e.r(80663),r=e.r(44939),a=e.r(32316),l=e.r(79372),o=e.r(54389);function i({moduleIds:e}){if("u">typeof window)return null;let t=a.workAsyncStorage.getStore();if(void 0===t)return null;let n=[];if(t.reactLoadableManifest&&e){let s=t.reactLoadableManifest;for(let t of e){if(!s[t])continue;let e=s[t].files;n.push(...e)}}if(0===n.length)return null;let c=(0,o.getAssetTokenQuery)();return(0,s.jsx)(s.Fragment,{children:n.map(e=>{let n=`${t.assetPrefix}/_next/${(0,l.encodeURIPath)(e)}${c}`;return e.endsWith(".css")?(0,s.jsx)("link",{precedence:"dynamic",href:n,rel:"stylesheet",as:"style",nonce:t.nonce},e):((0,r.preload)(n,{as:"script",fetchPriority:"low",nonce:t.nonce}),null)})})}},7395,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return c}});let s=e.r(80663),r=e.r(56916),a=e.r(953),l=e.r(70492);function o(e){return{default:e&&"default"in e?e.default:e}}let i={loader:()=>Promise.resolve(o(()=>null)),loading:null,ssr:!0},c=function(e){let t={...i,...e},n=(0,r.lazy)(()=>t.loader().then(o)),c=t.loading;function d(e){let o=c?(0,s.jsx)(c,{isLoading:!0,pastDelay:!0,error:null}):null,i=!t.ssr||!!t.loading,d=i?r.Suspense:r.Fragment,u=t.ssr?(0,s.jsxs)(s.Fragment,{children:["u"<typeof window?(0,s.jsx)(l.PreloadChunks,{moduleIds:t.modules}):null,(0,s.jsx)(n,{...e})]}):(0,s.jsx)(a.BailoutToCSR,{reason:"next/dynamic",children:(0,s.jsx)(n,{...e})});return(0,s.jsx)(d,{...i?{fallback:o}:{},children:u})}return d.displayName="LoadableComponent",d}},2831,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return r}});let s=e.r(46921)._(e.r(7395));function r(e,t){let n={};"function"==typeof e&&(n.loader=e);let r={...n,...t};return(0,s.default)({...r,modules:r.loadableGenerated?.modules})}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},82010,e=>{"use strict";var t=e.i(80663),n=e.i(56916),s=e.i(2831),r=e.i(29987);function a({info:e,onClick:n}){let s=(0,r.useTick)(1),l=e.elapsed_s+s;return(0,t.jsxs)("button",{onClick:n,className:"m-3 p-3 rounded-lg text-left transition-colors",style:{background:"var(--surface)",border:"1px solid var(--rule)"},children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(r.LiveDot,{size:8}),(0,t.jsx)("span",{className:"text-[10px] uppercase tracking-[0.16em]",style:{color:"var(--ink-3)"},children:"Now"}),(0,t.jsx)("span",{className:"ml-auto font-mono tnum text-[11px]",style:{color:"var(--ink-2)"},children:(0,r.fmtDurDecimal)(l)})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-2",children:[(0,t.jsx)(r.AppGlyph,{app:e.app_name,size:18}),(0,t.jsx)("span",{className:"text-[12px] truncate",style:{color:"var(--ink)"},children:e.app_name})]})]})}function l({view:e,onNavigate:s,onOpenCmd:r,queueCount:o}){let[i,c]=(0,n.useState)(null);return(0,n.useEffect)(()=>{function e(){fetch("/api/active").then(e=>e.json()).then(e=>c(e)).catch(()=>{})}e();let t=setInterval(e,3e4);return()=>clearInterval(t)},[]),(0,t.jsxs)("aside",{className:"w-[240px] shrink-0 sticky top-0 self-start h-screen flex flex-col rule-r",style:{borderRightColor:"var(--rule)",background:"var(--paper)"},children:[(0,t.jsxs)("div",{className:"px-6 py-7",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"inline-block w-2.5 h-2.5 rounded-full live-dot",style:{background:"var(--accent)"}}),(0,t.jsx)("span",{className:"font-serif italic text-[22px] leading-none tracking-tight",style:{color:"var(--ink)"},children:"meridian"})]}),(0,t.jsx)("p",{className:"text-[10px] uppercase tracking-[0.2em] mt-2",style:{color:"var(--ink-3)"},children:"local · v0.3"})]}),(0,t.jsxs)("nav",{className:"flex-1 px-3",children:[[{id:"today",label:"Today",kbd:"1"},{id:"tasks",label:"Tasks",kbd:"2"},{id:"queue",label:"Queue",kbd:"3",badge:o||void 0},{id:"worklogs",label:"Worklogs",kbd:"4"},{id:"sessions",label:"Sessions",kbd:"5"},{id:"week",label:"Week",kbd:"6"}].map(n=>{let r=e===n.id;return(0,t.jsxs)("button",{onClick:()=>s(n.id),className:"w-full flex items-center gap-3 px-3 py-2 rounded-md text-left transition-colors mb-px",style:{background:r?"var(--surface-2)":"transparent",color:r?"var(--ink)":"var(--ink-2)"},children:[(0,t.jsx)("span",{className:"text-[13px] flex-1",children:n.label}),null!=n.badge&&(0,t.jsx)("span",{className:"text-[10px] font-mono tnum px-1.5 py-0.5 rounded",style:{background:"var(--accent)",color:"var(--paper)"},children:n.badge}),(0,t.jsx)("span",{className:"kbd",children:n.kbd})]},n.id)}),(0,t.jsxs)("button",{onClick:r,className:"w-full flex items-center gap-3 px-3 py-2 rounded-md text-left mt-4",style:{color:"var(--ink-3)"},children:[(0,t.jsx)("span",{className:"text-[13px] flex-1",children:"Quick switch"}),(0,t.jsx)("span",{className:"kbd",children:"⌘"}),(0,t.jsx)("span",{className:"kbd",children:"K"})]})]}),(0,t.jsx)("div",{className:"px-3 pb-4",children:(0,t.jsxs)("button",{onClick:()=>s("settings"),className:"w-full flex items-center gap-3 px-3 py-2 rounded-md text-left transition-colors",style:{background:"settings"===e?"var(--surface-2)":"transparent",color:"settings"===e?"var(--ink)":"var(--ink-3)"},children:[(0,t.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[(0,t.jsx)("circle",{cx:"8",cy:"8",r:"2.5"}),(0,t.jsx)("path",{d:"M8 1v1.5M8 13.5V15M1 8h1.5M13.5 8H15M3.05 3.05l1.06 1.06M11.89 11.89l1.06 1.06M3.05 12.95l1.06-1.06M11.89 4.11l1.06-1.06"})]}),(0,t.jsx)("span",{className:"text-[13px]",children:"Settings"}),(0,t.jsx)("span",{className:"kbd ml-auto",children:"7"})]})}),i&&(0,t.jsx)(a,{info:i,onClick:()=>s("today")})]})}function o({onClose:e,onNavigate:s}){let[a,l]=(0,n.useState)(""),i=(0,n.useRef)(null);(0,n.useEffect)(()=>{i.current?.focus()},[]);let c=[{kind:"view",label:"Go to Today",v:"today"},{kind:"view",label:"Go to Tasks",v:"tasks"},{kind:"view",label:"Go to Review queue",v:"queue"},{kind:"view",label:"Go to Worklogs",v:"worklogs"},{kind:"view",label:"Go to Sessions",v:"sessions"},{kind:"view",label:"Go to Week",v:"week"}].filter(e=>!a||e.label.toLowerCase().includes(a.toLowerCase())).slice(0,8);return(0,t.jsx)("div",{onClick:e,className:"fixed inset-0 z-50 flex items-start justify-center pt-[18vh]",style:{background:"rgba(15,15,15,0.45)",backdropFilter:"blur(4px)"},children:(0,t.jsxs)("div",{onClick:e=>e.stopPropagation(),className:"w-[560px] max-w-[92vw] rounded-xl overflow-hidden rise",style:{background:"var(--surface)",border:"1px solid var(--rule-2)",boxShadow:"0 24px 80px rgba(0,0,0,0.18)"},children:[(0,t.jsx)("input",{ref:i,value:a,onChange:e=>l(e.target.value),onKeyDown:t=>{"Escape"===t.key&&e(),"Enter"===t.key&&c[0]&&s(c[0].v,c[0].key)},placeholder:"Jump to view or task…",className:"w-full px-5 py-4 text-[14px] font-sans",style:{background:"transparent",color:"var(--ink)",border:"none",outline:"none",borderBottom:"1px solid var(--rule)"}}),(0,t.jsxs)("div",{className:"max-h-[40vh] overflow-y-auto nice-scroll",children:[0===c.length&&(0,t.jsx)("p",{className:"p-6 text-center text-[12px]",style:{color:"var(--ink-3)"},children:"No matches."}),c.map((e,n)=>(0,t.jsxs)("button",{onClick:()=>s(e.v,e.key),className:"w-full text-left px-5 py-2.5 flex items-center gap-3 transition-colors hover:opacity-80",style:{background:0===n?"var(--surface-2)":"transparent"},children:["task"===e.kind&&(0,t.jsx)(r.TaskKey,{keyId:e.key}),(0,t.jsx)("span",{className:"text-[13px]",style:{color:"var(--ink)"},children:e.label}),"task"===e.kind&&e.status&&(0,t.jsx)("span",{className:"ml-auto",children:(0,t.jsx)(r.StatusPill,{status:e.status})})]},n))]}),(0,t.jsxs)("div",{className:"px-5 py-2.5 rule-t flex items-center justify-between text-[10px]",style:{borderTopColor:"var(--rule)",color:"var(--ink-4)"},children:[(0,t.jsx)("span",{children:"Local search · no network"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"kbd",children:"↵"})," open · ",(0,t.jsx)("span",{className:"kbd",children:"esc"})," close"]})]})]})})}var i=e.i(38297);function c(){let{dark:e,setDark:s,accent:r,setAccent:a,density:l,setDensity:o,tone:c,setTone:d}=(0,i.useTheme)(),[u,x]=(0,n.useState)(!1),p=(0,n.useRef)(null),m=(0,n.useRef)({x:16,y:16});return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{onClick:()=>x(e=>!e),className:"fixed right-4 bottom-4 z-40 w-9 h-9 rounded-full flex items-center justify-center text-[13px]",style:{background:"var(--surface)",border:"1px solid var(--rule-2)",color:"var(--ink-3)",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},"aria-label":"Open theme settings",children:"◐"}),u&&(0,t.jsxs)("div",{ref:p,className:"fixed z-50 w-[280px] rounded-[14px] overflow-hidden flex flex-col",style:{right:m.current.x,bottom:m.current.y,background:e?"rgba(20,20,19,0.92)":"rgba(250,249,247,0.92)",border:`.5px solid ${e?"rgba(255,255,255,0.08)":"rgba(255,255,255,0.6)"}`,backdropFilter:"blur(24px) saturate(160%)",boxShadow:"0 12px 40px rgba(0,0,0,0.18)",color:e?"#F4F1EB":"#29261b"},children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 cursor-move select-none",onMouseDown:function(e){let t=p.current;if(!t)return;let n=t.getBoundingClientRect(),s=e.clientX,r=e.clientY,a=window.innerWidth-n.right,l=window.innerHeight-n.bottom,o=e=>{m.current={x:a-(e.clientX-s),y:l-(e.clientY-r)},function(){let e=p.current;if(!e)return;let t=e.offsetWidth,n=e.offsetHeight,s=Math.max(16,window.innerWidth-t-16),r=Math.max(16,window.innerHeight-n-16);m.current={x:Math.min(s,Math.max(16,m.current.x)),y:Math.min(r,Math.max(16,m.current.y))},e.style.right=m.current.x+"px",e.style.bottom=m.current.y+"px"}()},i=()=>{window.removeEventListener("mousemove",o),window.removeEventListener("mouseup",i)};window.addEventListener("mousemove",o),window.addEventListener("mouseup",i)},style:{borderBottom:`1px solid ${e?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)"}`},children:[(0,t.jsx)("span",{className:"text-[12px] font-semibold tracking-[0.01em]",children:"Settings"}),(0,t.jsx)("button",{onClick:()=>x(!1),onMouseDown:e=>e.stopPropagation(),className:"w-[22px] h-[22px] flex items-center justify-center rounded-md text-[13px]",style:{color:e?"rgba(244,241,235,0.5)":"rgba(41,38,27,0.5)",background:"transparent"},children:"✕"})]}),(0,t.jsxs)("div",{className:"p-4 space-y-4",children:[(0,t.jsx)("p",{className:"text-[10px] font-semibold tracking-[0.06em] uppercase",style:{color:e?"rgba(244,241,235,0.4)":"rgba(41,38,27,0.4)"},children:"Appearance"}),(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-[11.5px]",children:"Dark mode"}),(0,t.jsx)("button",{onClick:()=>s(!e),role:"switch","aria-checked":e,className:"relative w-8 h-[18px] rounded-full border-0 p-0 transition-colors",style:{background:e?"#34c759":"rgba(0,0,0,0.15)"},children:(0,t.jsx)("span",{className:"absolute top-[2px] w-[14px] h-[14px] rounded-full transition-transform",style:{left:2,background:"#fff",boxShadow:"0 1px 2px rgba(0,0,0,0.25)",transform:e?"translateX(14px)":"translateX(0)"}})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("span",{className:"text-[11.5px]",children:"Accent color"}),(0,t.jsx)("div",{className:"flex gap-1.5",children:i.ACCENT_PRESETS.map(e=>{let n;return(0,t.jsx)("button",{onClick:()=>a(e),className:"flex-1 h-[46px] rounded-md transition-transform",style:{background:e,boxShadow:r===e?"0 0 0 1.5px rgba(0,0,0,0.85), 0 2px 6px rgba(0,0,0,0.15)":"0 0 0 .5px rgba(0,0,0,0.12)"},"aria-label":`Accent ${e}`,children:r===e&&(0,t.jsx)("svg",{viewBox:"0 0 14 14",className:"mx-auto",width:13,height:13,children:(0,t.jsx)("path",{d:"M3 7.2 5.8 10 11 4.2",fill:"none",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",stroke:Number.isNaN(n=parseInt(e.replace("#","").padEnd(6,"0").slice(0,6),16))||299*(n>>16&255)+587*(n>>8&255)+114*(255&n)>148e3?"rgba(0,0,0,.78)":"#fff"})})},e)})})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("span",{className:"text-[11.5px]",children:"Density"}),(0,t.jsx)("div",{className:"flex rounded-lg overflow-hidden",style:{background:"rgba(0,0,0,0.06)",padding:2,gap:0},children:["compact","regular","comfy"].map(n=>(0,t.jsx)("button",{onClick:()=>o(n),className:"flex-1 py-1 text-[11px] font-medium rounded-md transition-colors capitalize",style:{background:l===n?e?"rgba(255,255,255,0.1)":"rgba(255,255,255,0.9)":"transparent",boxShadow:l===n?"0 1px 2px rgba(0,0,0,0.12)":"none"},children:n},n))})]}),(0,t.jsx)("p",{className:"text-[10px] font-semibold tracking-[0.06em] uppercase pt-2",style:{color:e?"rgba(244,241,235,0.4)":"rgba(41,38,27,0.4)"},children:"Narrative"}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("span",{className:"text-[11.5px]",children:"Story tone"}),(0,t.jsx)("div",{className:"flex rounded-lg overflow-hidden",style:{background:"rgba(0,0,0,0.06)",padding:2},children:["terse","detailed"].map(n=>(0,t.jsx)("button",{onClick:()=>d(n),className:"flex-1 py-1 text-[11px] font-medium rounded-md transition-colors capitalize",style:{background:c===n?e?"rgba(255,255,255,0.1)":"rgba(255,255,255,0.9)":"transparent",boxShadow:c===n?"0 1px 2px rgba(0,0,0,0.12)":"none"},children:n},n))})]})]})]})]})}let d=(0,s.default)(()=>e.A(82582),{loadableGenerated:{modules:[65906]},ssr:!1}),u=(0,s.default)(()=>e.A(44993),{loadableGenerated:{modules:[63017]},ssr:!1}),x=(0,s.default)(()=>e.A(70744),{loadableGenerated:{modules:[20710]},ssr:!1}),p=(0,s.default)(()=>e.A(31857),{loadableGenerated:{modules:[75042]},ssr:!1}),m=(0,s.default)(()=>e.A(29519),{loadableGenerated:{modules:[37653]},ssr:!1}),f=(0,s.default)(()=>e.A(16457),{loadableGenerated:{modules:[27246]},ssr:!1}),h=(0,s.default)(()=>e.A(58835),{loadableGenerated:{modules:[49661]},ssr:!1});e.s(["default",0,function(){let[e,s]=(0,n.useState)("today"),[r,a]=(0,n.useState)(null),[i,b]=(0,n.useState)(!1),[g,k]=(0,n.useState)(0),v=(0,n.useCallback)((e,t)=>{s(e),a(t??null),window.scrollTo({top:0,behavior:"instant"})},[]);(0,n.useEffect)(()=>{fetch("/api/queue-review").then(e=>e.json()).then(e=>k(e.items?.length??0)).catch(()=>{})},[]),(0,n.useEffect)(()=>{function e(e){if((e.metaKey||e.ctrlKey)&&"k"===e.key.toLowerCase()){e.preventDefault(),b(e=>!e);return}if("Escape"===e.key)return void b(!1);if(i||e.metaKey||e.ctrlKey||e.altKey)return;let t=e.target;"INPUT"!==t.tagName&&"TEXTAREA"!==t.tagName&&("1"===e.key?v("today"):"2"===e.key?v("tasks"):"3"===e.key?v("queue"):"4"===e.key?v("worklogs"):"5"===e.key?v("sessions"):"6"===e.key?v("week"):"7"===e.key&&v("settings"))}return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[i,v]);let y=new Date().toLocaleDateString("en-US",{weekday:"long",month:"long",day:"numeric",year:"numeric"});return(0,t.jsxs)("div",{className:"min-h-screen flex",style:{background:"var(--paper)"},children:[(0,t.jsx)(l,{view:e,onNavigate:v,onOpenCmd:()=>b(!0),queueCount:g}),(0,t.jsx)("main",{className:"flex-1 min-w-0","data-screen-label":e,children:(0,t.jsxs)("div",{className:"max-w-[1080px] mx-auto px-10 py-14",children:["today"===e&&(0,t.jsx)(d,{onNavigate:(e,t)=>v(e,t)}),"tasks"===e&&(0,t.jsx)(u,{focusKey:r}),"queue"===e&&(0,t.jsx)(x,{}),"worklogs"===e&&(0,t.jsx)(p,{}),"sessions"===e&&(0,t.jsx)(m,{}),"week"===e&&(0,t.jsx)(f,{}),"settings"===e&&(0,t.jsx)(h,{}),(0,t.jsxs)("footer",{className:"mt-24 pt-8 rule-t flex items-center justify-between text-[11px]",style:{borderTopColor:"var(--rule)",color:"var(--ink-4)"},children:[(0,t.jsxs)("span",{children:["Meridian · local · ",y]}),(0,t.jsxs)("span",{className:"font-mono tnum",children:[(0,t.jsx)("span",{className:"kbd",children:"⌘"})," ",(0,t.jsx)("span",{className:"kbd",children:"K"})," to jump · ",(0,t.jsx)("span",{className:"kbd",children:"1"}),"–",(0,t.jsx)("span",{className:"kbd",children:"7"})," to switch view"]})]})]})}),i&&(0,t.jsx)(o,{onClose:()=>b(!1),onNavigate:(e,t)=>{v(e,t),b(!1)}}),(0,t.jsx)(c,{})]})}],82010)},82582,e=>{e.v(t=>Promise.all(["static/chunks/0t0n-_np5foyi.js"].map(t=>e.l(t))).then(()=>t(65906)))},44993,e=>{e.v(t=>Promise.all(["static/chunks/0ihy5u7wenwg0.js"].map(t=>e.l(t))).then(()=>t(63017)))},70744,e=>{e.v(t=>Promise.all(["static/chunks/0baqm_s2-t13s.js"].map(t=>e.l(t))).then(()=>t(20710)))},31857,e=>{e.v(t=>Promise.all(["static/chunks/0z1g1xyfa206c.js"].map(t=>e.l(t))).then(()=>t(75042)))},29519,e=>{e.v(t=>Promise.all(["static/chunks/0ifolh1b1knby.js"].map(t=>e.l(t))).then(()=>t(37653)))},16457,e=>{e.v(t=>Promise.all(["static/chunks/0s.zkfto8hpca.js"].map(t=>e.l(t))).then(()=>t(27246)))},58835,e=>{e.v(t=>Promise.all(["static/chunks/0034g-77v57su.js","static/chunks/0_g6ngacmh2ur.js"].map(t=>e.l(t))).then(()=>t(49661)))}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,17303,e=>{"use strict";var s=e.i(56916);let t=e=>{let s=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,s,t)=>t?t.toUpperCase():s.toLowerCase());return s.charAt(0).toUpperCase()+s.slice(1)},a=(...e)=>e.filter((e,s,t)=>!!e&&""!==e.trim()&&t.indexOf(e)===s).join(" ").trim();var n={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let r=(0,s.forwardRef)(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:l,className:i="",children:c,iconNode:o,...d},u)=>(0,s.createElement)("svg",{ref:u,...n,width:t,height:t,stroke:e,strokeWidth:l?24*Number(r)/Number(t):r,className:a("lucide",i),...!c&&!(e=>{for(let s in e)if(s.startsWith("aria-")||"role"===s||"title"===s)return!0})(d)&&{"aria-hidden":"true"},...d},[...o.map(([e,t])=>(0,s.createElement)(e,t)),...Array.isArray(c)?c:[c]]));e.s(["default",0,(e,n)=>{let l=(0,s.forwardRef)(({className:l,...i},c)=>(0,s.createElement)(r,{ref:c,iconNode:n,className:a(`lucide-${t(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,`lucide-${e}`,l),...i}));return l.displayName=t(e),l}],17303)},99963,e=>{"use strict";var s=e.i(80663);let t=(0,e.i(17303).default)("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);function a(){for(var e,s,t=0,a="",n=arguments.length;t<n;t++)(e=arguments[t])&&(s=function e(s){var t,a,n="";if("string"==typeof s||"number"==typeof s)n+=s;else if("object"==typeof s)if(Array.isArray(s)){var r=s.length;for(t=0;t<r;t++)s[t]&&(a=e(s[t]))&&(n&&(n+=" "),n+=a)}else for(a in s)s[a]&&(n&&(n+=" "),n+=a);return n}(e))&&(a&&(a+=" "),a+=s);return a}var n=e.i(89562);function r({taskKey:e,taskTitle:t,sessionType:n,routing:l,confidence:i,method:c}){let o=function(e){if(!e)return[];switch(e){case"prefilter_trivial":return[{label:"Hermes · pre-filter",deciding:!0}];case"llm_standalone":case"agent_tiebreak":return[{label:"Hermes · classification",deciding:!0}];default:return[{label:e,deciding:!0}]}}(c),d="number"==typeof i&&i>0?`${Math.round(100*i)}%`:null,u=e?d?`${e} \xb7 ${d}`:e:"overhead"===n?"overhead":"queue"===l?d?`queued \xb7 ${d}`:"queued":d?`no match \xb7 ${d}`:"no match";return(0,s.jsxs)("div",{className:"space-y-2 min-w-[200px]",children:[o.length>0?(0,s.jsx)("div",{className:"space-y-1",children:o.map((e,t)=>(0,s.jsxs)("div",{className:"flex items-center justify-between gap-4",children:[(0,s.jsx)("span",{className:a("font-mono text-[10px] uppercase tracking-widest shrink-0",e.deciding?"text-[#4B4A47]":"text-[#C8C6C1]"),children:e.label}),(0,s.jsx)("span",{className:a("text-[10px] font-mono",e.deciding?"text-[#141414] font-medium":"text-[#C8C6C1]"),children:e.deciding?u:"→ escalated"})]},t))}):(0,s.jsx)("p",{className:"text-[11px] text-[#9B9A97]",children:"no classification data"}),e&&t&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"border-t border-[#F0EFEC]"}),(0,s.jsx)("p",{className:"text-[11px] text-[#6B6A67] leading-snug max-w-[220px]",children:t})]}),l&&"auto"!==l&&(0,s.jsxs)("p",{className:"text-[10px] text-[#C8C6C1]",children:["routing: ",(0,s.jsx)("span",{className:"font-mono",children:l})]})]})}function l({children:e,...t}){return(0,s.jsxs)(n.Root,{children:[(0,s.jsx)(n.Trigger,{asChild:!0,children:e}),(0,s.jsx)(n.Portal,{children:(0,s.jsxs)(n.Content,{side:"top",align:"center",sideOffset:5,className:"z-50 rounded-lg border border-[#E8E6E1] bg-white px-3 py-2.5 shadow-md",children:[(0,s.jsx)(r,{...t}),(0,s.jsx)(n.Arrow,{className:"fill-white"})]})})]})}e.s(["default",0,function({taskKey:e,sessionType:n,routing:r,confidence:i,method:c,taskTitle:o,taskUrl:d,size:u="xs"}){if(!n)return null;let x="xs"===u?"text-[10px] px-1.5 py-0.5":"text-xs px-2 py-0.5",p={taskKey:e,taskTitle:o??null,sessionType:n,routing:r,confidence:i,method:c};if("overhead"===n)return(0,s.jsx)(l,{...p,children:(0,s.jsx)("span",{className:a("inline-flex items-center rounded-full font-medium cursor-default","bg-[#F0EFEC] text-[#9B9A97]",x),children:"overhead"})});if("task"===n&&"auto"===r&&e){let n=(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"font-mono",children:e}),d&&(0,s.jsx)(t,{className:"w-2.5 h-2.5 opacity-60"})]}),r=d?(0,s.jsx)("a",{href:d,target:"_blank",rel:"noopener noreferrer",className:a("inline-flex items-center gap-1 rounded-full font-medium hover:brightness-95 transition","bg-[#EBF0FB] text-[#3D5BB0] border border-[#D8E0F4]",x),onClick:e=>e.stopPropagation(),children:n}):(0,s.jsx)("span",{className:a("inline-flex items-center gap-1 rounded-full font-medium cursor-default","bg-[#EBF0FB] text-[#3D5BB0] border border-[#D8E0F4]",x),children:n});return(0,s.jsx)(l,{...p,children:r})}return"task"===n&&"queue"===r?(0,s.jsx)(l,{...p,children:(0,s.jsxs)("span",{className:a("inline-flex items-center gap-1 rounded-full font-medium cursor-default","bg-[#FEF9EC] text-[#92400E] border border-[#FDE68A]",x),children:[(0,s.jsx)("span",{className:"font-mono",children:e??"queued"}),(0,s.jsx)("span",{className:"opacity-60",children:"?"})]})}):"task"===n&&"skip"===r?(0,s.jsx)(l,{...p,children:(0,s.jsx)("span",{className:a("inline-flex items-center rounded-full font-medium cursor-default","bg-[#F8F7F4] text-[#C8C6C1] border border-[#F0EFEC]",x),children:(0,s.jsx)("span",{className:"font-mono",children:"∅"})})}):null}],99963)},72868,e=>{"use strict";var s=e.i(80663),t=e.i(56916),a=e.i(29987),n=e.i(99963);let r={coding:"#3B6FE0",code_review:"#7C3AED",meeting:"#D97706",communication:"#059669",design:"#DB2777",documentation:"#0891B2",planning:"#C4822A",deployment_devops:"#DC2626",research:"#4F46E5",idle_personal:"#78716C"};function l({data:e}){let n=e=>new Date(e).getHours()+new Date(e).getMinutes()/60,i=(0,t.useMemo)(()=>{let s={};e.sessions.forEach(e=>{s[e.cat]=(s[e.cat]||0)+e.dur}),e.active&&(s[e.active.cat]=(s[e.active.cat]||0)+e.active.elapsed_s);let t=Object.values(s).reduce((e,s)=>e+s,0)||1;return Object.entries(s).map(([e,s])=>({cat:e,seconds:s,percentage:s/t*100,label:a.CATS[e]?.label||e})).sort((e,s)=>s.seconds-e.seconds)},[e]),c=(0,t.useMemo)(()=>{let s=[...e.sessions.map(e=>({kind:"session",startH:n(e.started_at),dur:e.dur})),...e.active?[{kind:"session",startH:n(e.active.started_at),dur:e.active.elapsed_s}]:[],...e.gaps.map(e=>({kind:"gap",startH:n(e.started_at),dur:e.dur}))].sort((e,s)=>e.startH-s.startH),t=0,a=0;return s.forEach(e=>{"gap"===e.kind&&e.dur>300?(t=Math.max(t,a),a=0):"session"===e.kind&&(a+=e.dur)}),Math.max(t,a)},[e]),o=(0,t.useMemo)(()=>{let e=0;return i.map(s=>{let t=e,a=s.percentage/100*360,n=t+a,r=(t-90)*Math.PI/180,l=(n-90)*Math.PI/180,i=+(a>180),c=`M ${100+85*Math.cos(r)} ${100+85*Math.sin(r)} A 85 85 0 ${i} 1 ${100+85*Math.cos(l)} ${100+85*Math.sin(l)} L ${100+58*Math.cos(l)} ${100+58*Math.sin(l)} A 58 58 0 ${i} 0 ${100+58*Math.cos(r)} ${100+58*Math.sin(r)} Z`;return e=n,{...s,path:c}})},[i]),[d,u]=(0,t.useState)(null);return(0,s.jsx)(a.Card,{className:"p-6",children:(0,s.jsxs)("div",{className:"flex items-center gap-8",children:[(0,s.jsx)("div",{className:"flex-1 flex justify-center",children:(0,s.jsxs)("div",{className:"relative",style:{width:200,height:200},children:[(0,s.jsx)("svg",{width:"200",height:"200",viewBox:"0 0 200 200",children:o.map(e=>(0,s.jsx)("path",{d:e.path,className:`cat-${e.cat}`,opacity:d===e.cat?1:null===d?.95:.35,style:{cursor:"pointer",transition:"opacity 0.2s ease, transform 0.15s ease",transformOrigin:"100px 100px",transform:d===e.cat?"scale(1.05)":"scale(1)"},onMouseEnter:()=>u(e.cat),onMouseLeave:()=>u(null)},e.cat))}),(0,s.jsxs)("div",{className:"absolute inset-0 flex flex-col items-center justify-center pointer-events-none",children:[(0,s.jsx)("p",{className:"font-mono tnum text-[28px] leading-none",style:{color:"var(--ink)"},children:(0,a.fmtDur)(e.focus_s)}),(0,s.jsx)("p",{className:"text-[10px] uppercase tracking-wide mt-1",style:{color:"var(--ink-3)"},children:"active"})]})]})}),(0,s.jsxs)("div",{className:"flex-1 space-y-4",children:[(0,s.jsxs)("div",{className:"grid grid-cols-2 gap-3 pb-4 rule-b",style:{borderBottomColor:"var(--rule)"},children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"text-[10px] uppercase tracking-wide mb-1",style:{color:"var(--ink-3)"},children:"Longest block"}),(0,s.jsx)("p",{className:"font-mono tnum text-[20px] leading-none",style:{color:"var(--success)"},children:(0,a.fmtDur)(c)})]}),(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"text-[10px] uppercase tracking-wide mb-1",style:{color:"var(--ink-3)"},children:"Idle time"}),(0,s.jsx)("p",{className:"font-mono tnum text-[20px] leading-none",style:{color:"var(--ink-3)"},children:(0,a.fmtDur)(e.idle_s)})]})]}),(0,s.jsx)("div",{className:"space-y-0.5",children:i.map(e=>{let t=d===e.cat;return(0,s.jsxs)("div",{className:"flex items-center justify-between gap-3 py-1.5 px-2 rounded-md transition-all cursor-pointer",style:{background:t?"var(--tint)":"transparent",borderLeft:`3px solid ${t?r[e.cat]??"var(--accent)":"transparent"}`,opacity:t||null===d?1:.45,paddingLeft:t?"6px":"8px"},onMouseEnter:()=>u(e.cat),onMouseLeave:()=>u(null),children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:[(0,s.jsx)(a.CatDot,{cat:e.cat,size:9}),(0,s.jsx)("span",{className:"text-[12px] truncate font-medium",style:{color:t?"var(--ink)":"var(--ink-2)"},children:e.label})]}),(0,s.jsxs)("span",{className:"text-[12px] font-mono tnum font-semibold",style:{color:t?"var(--ink)":"var(--ink-3)"},children:[e.percentage.toFixed(0),"%"]})]},e.cat)})})]})]})})}let i="var(--ink)",c="var(--rule-2)",o="#3B6FE0",d=e=>new Date(e).getTime();function u({data:e}){let[n,r]=(0,t.useState)(null),l=(0,t.useMemo)(()=>{let s=e.presence_segments.map(e=>({startMs:d(e.started_at),endMs:d(e.ended_at),kind:"active",label:"Active"})),t=e.gaps.filter(e=>"user_idle"===e.kind).map(e=>({startMs:d(e.started_at),endMs:d(e.ended_at),kind:"idle",label:"Idle"})),a=e.agent_segments.map(e=>({startMs:d(e.started_at),endMs:d(e.ended_at),kind:"agent",label:"Claude / Codex"})),n=[...s,...t,...a].filter(e=>Number.isFinite(e.startMs)&&e.endMs>e.startMs);if(0===n.length)return null;let r=36e5*Math.floor(Math.min(...n.map(e=>e.startMs))/36e5),l=36e5*Math.ceil(Math.max(...n.map(e=>e.endMs))/36e5),i=Math.max(36e5,l-r),c=[];for(let e=r;e<=l;e+=36e5)c.push({left:(e-r)/i*100,label:new Date(e).getHours().toString().padStart(2,"0")});return{active:s,idle:t,agent:a,ticks:c,pos:e=>({left:(e.startMs-r)/i*100,width:Math.max(.4,(e.endMs-e.startMs)/i*100)})}},[e]);if(!l)return null;let x=(e,t,a,i,c=!1)=>{let{left:o,width:d}=l.pos(e);return(0,s.jsx)("div",{onMouseEnter:()=>r(e),onMouseLeave:()=>r(s=>s===e?null:s),className:"absolute cursor-pointer transition-opacity",style:{left:`${o}%`,width:`${d}%`,top:t,height:a,background:i,borderRadius:c?3:2,opacity:n&&n!==e?.4:1}},`${e.kind}-${e.startMs}`)};return(0,s.jsxs)("div",{className:"select-none",children:[(0,s.jsx)("div",{className:"h-6 mb-1 flex items-end",children:(()=>{if(!n)return null;let e=e=>new Date(e).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return(0,s.jsxs)("div",{className:"text-[11px] font-mono tnum px-2 py-1 rounded-md inline-flex gap-2 items-center",style:{background:"var(--ink)",color:"var(--paper)"},children:[(0,s.jsx)("span",{style:{opacity:.7},children:n.label}),(0,s.jsxs)("span",{children:[e(n.startMs),"–",e(n.endMs)]}),(0,s.jsxs)("span",{style:{opacity:.7},children:["· ",(0,a.fmtDur)(Math.round((n.endMs-n.startMs)/1e3))]})]})})()}),(0,s.jsxs)("div",{className:"relative",style:{height:54},children:[l.ticks.map((e,t)=>(0,s.jsx)("div",{className:"absolute top-0",style:{left:`${e.left}%`,height:40,width:1,background:"var(--rule)"}},`g${t}`)),l.idle.map(e=>x(e,6,18,c)),l.active.map(e=>x(e,6,18,i)),l.agent.map(e=>x(e,27,11,o,!0)),l.ticks.map((e,t)=>(0,s.jsx)("div",{className:"absolute font-mono text-[9px]",style:{left:`${e.left}%`,top:42,color:"var(--ink-4)",transform:"translateX(-50%)"},children:e.label},`l${t}`))]}),(0,s.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-[11px]",style:{color:"var(--ink-3)"},children:[(0,s.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,s.jsx)("i",{style:{width:10,height:10,background:i,borderRadius:2,display:"inline-block"}})," Active"]}),(0,s.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,s.jsx)("i",{style:{width:10,height:10,background:c,borderRadius:2,display:"inline-block"}})," Idle"]}),(0,s.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,s.jsx)("i",{style:{width:10,height:6,background:o,borderRadius:2,display:"inline-block"}})," Claude / Codex"]}),(0,s.jsx)("span",{style:{color:"var(--ink-4)"},children:"· agent under an idle stretch = autonomous"})]})]})}let x=(e,s)=>s>0?Math.round(e/s*100):0;function p({label:e,value:t,hint:a}){return(0,s.jsxs)("div",{className:"flex items-baseline justify-between gap-4 py-2",children:[(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("span",{className:"text-[13px]",style:{color:"var(--ink)"},children:e}),a&&(0,s.jsx)("span",{className:"text-[11px] ml-2",style:{color:"var(--ink-3)"},children:a})]}),(0,s.jsx)("span",{className:"font-mono tnum text-[14px] whitespace-nowrap",style:{color:"var(--ink)"},children:t})]})}function m(e){let{focus_s:n,idle_s:r,agent_s:l,supervised_s:i,autonomous_s:c,switch_count:o}=e,[d,u]=(0,t.useState)(null),m=[{key:"focus",label:"Focus",value:(0,a.fmtDur)(n),note:"active"},{key:"ai",label:"AI-assisted",value:`${x(i,n)}%`,note:"of focus"},{key:"switches",label:"Switches",value:String(o),note:"context switches"}];return(0,s.jsxs)("div",{className:"rule-t rule-b",style:{borderColor:"var(--rule)"},children:[(0,s.jsx)("div",{className:"grid grid-cols-3",children:m.map((e,t)=>{let a=d===e.key;return(0,s.jsxs)("button",{onClick:()=>u(a?null:e.key),className:`text-left py-4 px-5 transition-colors ${t>0?"rule-l":""}`,style:{borderColor:"var(--rule)",background:a?"var(--tint)":"transparent"},"aria-expanded":a,children:[(0,s.jsxs)("p",{className:"text-[10px] uppercase tracking-[0.16em] mb-2 flex items-center gap-1.5",style:{color:"var(--ink-3)"},children:[e.label,(0,s.jsx)("span",{className:"text-[9px]",style:{color:"var(--ink-4)",transform:a?"rotate(180deg)":"none",transition:"transform 0.15s"},children:"▾"})]}),(0,s.jsx)("p",{className:"font-mono tnum text-[20px] leading-none",style:{color:"var(--ink)"},children:e.value}),(0,s.jsx)("p",{className:"text-[11px] mt-1.5",style:{color:"var(--ink-3)"},children:e.note})]},e.key)})}),d&&(0,s.jsx)("div",{className:"px-5 py-3 rule-t",style:{borderTopColor:"var(--rule)",background:"var(--surface)"},children:(0,s.jsx)("div",{className:"max-w-md",children:(e=>{switch(e){case"focus":return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(p,{label:"Active",value:(0,a.fmtDur)(n),hint:"you, at the keyboard"}),(0,s.jsx)(p,{label:"Idle / away",value:(0,a.fmtDur)(r),hint:"no input detected"}),(0,s.jsx)(p,{label:"AI-assisted",value:`${(0,a.fmtDur)(i)} \xb7 ${x(i,n)}%`,hint:"of your active time"})]});case"ai":return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(p,{label:"Supervised",value:(0,a.fmtDur)(i),hint:"agent ran while you were active"}),(0,s.jsx)(p,{label:"Autonomous",value:(0,a.fmtDur)(c),hint:"agent ran while you were away"}),(0,s.jsx)(p,{label:"Agent total",value:(0,a.fmtDur)(l),hint:"engaged Claude / Codex time"})]});case"switches":return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(p,{label:"Context switches",value:String(o),hint:"foreground app changes over 15s"}),(0,s.jsx)("p",{className:"text-[12px] leading-relaxed pt-1",style:{color:"var(--ink-3)"},children:"Lower is deeper. Brief sub-15s window flicker is filtered out so this reflects real context shifts, not capture noise."})]})}})(d)})})]})}function h({active:e,taskKey:t}){let n=(0,a.useTick)(1),r=e.elapsed_s+n,l=Math.max(1,Math.floor(r/30));return(0,s.jsxs)(a.Card,{className:"overflow-hidden rise",style:{borderColor:"var(--rule-2)"},children:[(0,s.jsx)("div",{className:"h-[3px] w-full",style:{background:"var(--rule)"},children:(0,s.jsx)("div",{className:"h-full blink",style:{width:"32%",background:"var(--live)"}})}),(0,s.jsxs)("div",{className:"p-5",children:[(0,s.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,s.jsx)(a.LiveDot,{size:8}),(0,s.jsxs)("span",{className:"text-[10px] uppercase tracking-[0.2em]",style:{color:"var(--ink-3)"},children:["Live · captured ",l," frame",1===l?"":"s"," ago"]}),(0,s.jsxs)("span",{className:"ml-auto text-[11px]",style:{color:"var(--ink-3)"},children:[(0,s.jsx)("span",{className:"font-mono tnum",children:(0,a.fmtClock)(e.started_at)})," → now"]})]}),(0,s.jsxs)("div",{className:"flex items-start gap-5",children:[(0,s.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,s.jsxs)("div",{className:"flex items-baseline gap-3 flex-wrap",children:[(0,s.jsx)("p",{className:"font-serif text-[28px] leading-none italic",style:{color:"var(--ink)"},children:"You're on"}),t&&(0,s.jsx)(a.TaskKey,{keyId:t,big:!0}),(0,s.jsx)("span",{className:"font-serif text-[28px] leading-none italic truncate",style:{color:"var(--ink)"},children:"idle_personal"!==e.cat?a.CATS[e.cat]?.label?.toLowerCase()??e.cat:"an uncategorized session"})]}),(0,s.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-x-5 gap-y-2 text-[13px]",style:{color:"var(--ink-2)"},children:[(0,s.jsxs)("span",{className:"inline-flex items-center gap-2",children:[(0,s.jsx)(a.AppGlyph,{app:e.app,size:20}),(0,s.jsx)("span",{style:{color:"var(--ink)"},children:e.app})]}),(0,s.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,s.jsx)(a.CatDot,{cat:e.cat}),(0,s.jsx)("span",{children:a.CATS[e.cat]?.label??e.cat})]})]}),e.explain&&(0,s.jsxs)("p",{className:"mt-4 text-[12px] leading-relaxed",style:{color:"var(--ink-3)"},children:[(0,s.jsx)("span",{style:{color:"var(--ink-2)"},children:"Why this task"}),(0,s.jsx)("span",{className:"mx-2",style:{color:"var(--ink-4)"},children:"·"}),e.explain]})]}),(0,s.jsxs)("div",{className:"text-right shrink-0 pl-4 rule-l",style:{borderLeftColor:"var(--rule)"},children:[(0,s.jsx)("p",{className:"text-[10px] uppercase tracking-[0.2em]",style:{color:"var(--ink-3)"},children:"elapsed"}),(0,s.jsx)("p",{className:"font-mono tnum text-[40px] leading-none mt-2",style:{color:"var(--ink)"},children:(0,a.fmtDurDecimal)(r)}),(0,s.jsxs)("div",{className:"mt-3 flex items-center justify-end gap-1.5",children:[(0,s.jsx)(a.ConfidenceRing,{value:e.confidence,size:14}),(0,s.jsxs)("span",{className:"text-[11px] font-mono tnum",style:{color:"var(--ink-3)"},children:[Math.round(100*e.confidence),"%"]})]})]})]}),e.titles.length>0&&(0,s.jsx)("div",{className:"mt-5 flex flex-wrap gap-1.5",children:e.titles.slice(0,5).map(e=>(0,s.jsx)("span",{className:"text-[11px] font-mono px-2 py-1 rounded-md tnum",style:{background:"var(--surface-2)",color:"var(--ink-2)",border:"1px solid var(--rule)"},children:e},e))}),(0,s.jsxs)("div",{className:"mt-5 pt-4 rule-t flex items-center justify-between gap-3",style:{borderTopColor:"var(--rule)"},children:[(0,s.jsx)("p",{className:"text-[12px]",style:{color:"var(--ink-2)"},children:"Log this session to Jira when it closes?"}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("button",{className:"text-[12px] px-3 py-1.5 rounded-md",style:{color:"var(--ink-3)"},children:"Skip"}),(0,s.jsx)("button",{className:"text-[12px] px-3 py-1.5 rounded-md font-medium",style:{color:"var(--paper)",background:"var(--ink)"},children:t?`Log to ${t} →`:"Assign task →"})]})]})]})]})}function f({bucket:e}){let[r,l]=(0,t.useState)(!1),i=(0,t.useMemo)(()=>{let s={};return e.sessions.forEach(e=>{s[e.cat]=(s[e.cat]??0)+e.dur}),Object.entries(s).map(([e,s])=>({cat:e,value:s}))},[e.sessions]),c=e.day_total_s>0?(e.total_s/e.day_total_s*100).toFixed(0):"0";return(0,s.jsxs)("div",{style:{background:"var(--surface)"},children:[(0,s.jsxs)("button",{onClick:()=>l(e=>!e),className:"w-full text-left grid grid-cols-[auto_1fr_200px_auto] items-center gap-5 px-5 py-4 transition-colors",style:{background:r?"var(--surface-2)":"var(--surface)"},children:[(0,s.jsx)("span",{className:"font-mono tnum text-[12px] w-[72px]",style:{color:"var(--ink-2)"},children:e.isOverhead||e.isQueue?(0,s.jsx)("span",{style:{color:"var(--ink-3)"},children:e.isOverhead?"overhead":"needs review"}):(0,s.jsx)(a.TaskKey,{keyId:e.key})}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-[14px] truncate",style:{color:"var(--ink)"},children:e.title}),(0,s.jsxs)("p",{className:"text-[11px] mt-1.5",style:{color:"var(--ink-3)"},children:[e.sessions.length," session",1===e.sessions.length?"":"s",i.length>0&&` \xb7 ${i.slice(0,3).map(e=>a.CATS[e.cat]?.short??e.cat).join(" + ")}`]})]}),(0,s.jsx)("div",{className:"hidden md:block",children:(0,s.jsx)(a.SegBar,{segments:i.length?i:[{value:1,color:"var(--rule-2)"}],height:3})}),(0,s.jsxs)("div",{className:"text-right",children:[(0,s.jsx)("p",{className:"font-mono tnum text-[18px] leading-none",style:{color:"var(--ink)"},children:(0,a.fmtDur)(e.total_s)}),(0,s.jsxs)("p",{className:"text-[11px] mt-1.5",style:{color:"var(--ink-3)"},children:[c,"% of day"]})]})]}),r&&(0,s.jsx)("div",{className:"px-5 pb-4 pt-1 rule-t",style:{borderTopColor:"var(--rule)"},children:(0,s.jsx)("div",{className:"grid grid-cols-1 gap-px",style:{background:"var(--rule)"},children:e.sessions.map(e=>(0,s.jsxs)("div",{className:"grid grid-cols-[auto_1fr_auto_auto] items-center gap-4 py-2.5 px-3",style:{background:"var(--surface)"},children:[(0,s.jsx)(a.AppGlyph,{app:e.app,size:20}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-[13px] truncate",style:{color:"var(--ink)"},children:e.titles[0]||"—"}),(0,s.jsxs)("div",{className:"flex items-center gap-2 mt-0.5",children:[(0,s.jsx)("span",{className:"font-mono tnum text-[11px]",style:{color:"var(--ink-3)"},children:(0,a.fmtClock)(e.started_at)}),(0,s.jsx)(a.CatDot,{cat:e.cat}),(0,s.jsx)("span",{className:"text-[11px]",style:{color:"var(--ink-3)"},children:a.CATS[e.cat]?.short??e.cat})]})]}),(0,s.jsx)(n.default,{taskKey:e.task_key,sessionType:e.session_type,routing:e.routing,confidence:e.link_confidence,method:e.link_method,size:"xs"}),(0,s.jsx)("span",{className:"font-mono tnum text-[12px]",style:{color:"var(--ink-2)"},children:(0,a.fmtDur)(e.dur)})]},e.id))})})]})}function v({session:e}){return(0,s.jsxs)("div",{className:"grid grid-cols-[auto_1fr_auto_auto] items-center gap-5 px-5 py-4 rule-t",style:{borderTopColor:"var(--rule)"},children:[(0,s.jsx)(a.AppGlyph,{app:e.app,size:24}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("p",{className:"text-[13px] truncate",style:{color:"var(--ink)"},children:e.titles[0]||e.app}),(0,s.jsxs)("p",{className:"text-[11px] mt-1",style:{color:"var(--ink-3)"},children:[(0,s.jsx)("span",{className:"font-mono tnum",children:(0,a.fmtClock)(e.started_at)}),e.candidates&&e.candidates.length>0&&(0,s.jsx)("span",{className:"ml-2 text-[11px]",style:{color:"var(--accent)"},children:"· needs review"})]})]}),(0,s.jsx)("div",{className:"flex items-center gap-1.5",children:e.candidates?.map(e=>(0,s.jsx)(a.TaskKey,{keyId:e},e))}),(0,s.jsx)("span",{className:"font-mono tnum text-[12px]",style:{color:"var(--ink-2)"},children:(0,a.fmtDur)(e.dur)})]})}e.s(["default",0,function({onNavigate:e}){let n,r,[i,c]=(0,t.useState)(null);if((0,t.useEffect)(()=>{fetch("/api/today").then(e=>e.json()).then(c).catch(()=>{});let e=setInterval(()=>fetch("/api/today").then(e=>e.json()).then(c).catch(()=>{}),3e4);return()=>clearInterval(e)},[]),!i)return(0,s.jsxs)("div",{className:"space-y-12",children:[(0,s.jsx)("header",{className:"rise",children:(0,s.jsx)("h1",{className:"font-serif leading-[0.95] tracking-tight",style:{color:"var(--ink)"},children:"Today"})}),(0,s.jsx)("p",{className:"text-[13px]",style:{color:"var(--ink-3)"},children:"Loading…"})]});let o=i.focus_s,d=new Map;function x(e,s){d.has(e)||d.set(e,{key:e,title:"",sessions:[],total_s:0,cats:new Set,day_total_s:o,isOverhead:!1,isQueue:!1});let t=d.get(e);t.sessions.push(s),t.total_s+=s.dur,t.cats.add(s.cat)}i.sessions.forEach(e=>{let s={id:e.id,app:e.app,started_at:e.started_at,dur:e.dur,cat:e.cat,titles:e.titles,task_key:e.task_key,session_type:e.session_type,link_method:e.link_method,link_confidence:e.link_confidence,routing:e.routing};e.task_key?x(e.task_key,s):"queue"===e.routing?x("_queue",s):x("_overhead",s)}),i.active&&x("_active",{id:"active",app:i.active.app,started_at:i.active.started_at,dur:i.active.elapsed_s,cat:i.active.cat,titles:i.active.titles,task_key:null,session_type:null,link_method:null,link_confidence:null,routing:null});let p=Array.from(d.values()).map(e=>({...e,isOverhead:"_overhead"===e.key,isQueue:"_queue"===e.key,title:"_overhead"===e.key?"Overhead — comms, mail, planning":"_queue"===e.key?"Sessions waiting to be assigned":"_active"===e.key?"Current session":e.key,day_total_s:o})).sort((e,s)=>{let t=e=>"_queue"===e?9:"_overhead"===e?8:"_active"===e?-1:0;return t(e.key)-t(s.key)||s.total_s-e.total_s}),g=i.sessions.filter(e=>"queue"===e.routing).length,y=new Date().toLocaleDateString("en-US",{weekday:"long",month:"long",day:"numeric"});return(0,s.jsxs)("div",{className:"space-y-12",children:[(0,s.jsxs)("header",{className:"rise",children:[(0,s.jsxs)("div",{className:"flex items-baseline justify-between mb-1",children:[(0,s.jsx)("p",{className:"text-[11px] uppercase tracking-[0.2em]",style:{color:"var(--ink-3)"},children:y}),i.active&&(0,s.jsxs)("p",{className:"text-[11px]",style:{color:"var(--ink-3)"},children:["Last capture ",(0,s.jsx)("span",{className:"font-mono tnum",children:(0,a.fmtClock)(i.active.started_at)})]})]}),(0,s.jsx)("h1",{className:"font-serif text-[88px] leading-[0.95] tracking-tight",style:{color:"var(--ink)"},children:"Today"})]}),(n=function(e){let{focus_s:s,supervised_s:t,autonomous_s:n,switch_count:r,active:l}=e;if(s<300&&!l)return null;let i=s>0?Math.round(t/s*100):0,c=`${(0,a.fmtDur)(s)} focused`;i>=5&&(c+=`, ${i}% of it alongside Claude`);let o=[];n>=600&&o.push(`plus ${(0,a.fmtDur)(n)} of autonomous agent work while you were away`);let d=s/60;return d>60&&r>d/4&&o.push(`a fragmented day — ${r} context switches`),o.length?`${c} — ${o.join("; ")}.`:`${c}.`}(i),r=function(e){let{sessions:s,active:t}=e;if(0===s.length&&!t)return null;let n=new Map;s.forEach(e=>{let s=e.task_key;if(!s)return;n.has(s)||n.set(s,{dur:0,cats:[]});let t=n.get(s);t.dur+=e.dur,t.cats.includes(e.cat)||t.cats.push(e.cat)});let r=s.filter(e=>!e.task_key&&"queue"!==e.routing).reduce((e,s)=>e+s.dur,0),l=Array.from(n.entries()).sort((e,s)=>s[1].dur-e[1].dur).slice(0,3);if(0===l.length&&r<600&&!t)return null;let i=[];if(l.forEach(([e,s],t)=>{let n=(0,a.fmtDur)(s.dur);if(0===t){var r,l;let t;i.push(`${(r=s.cats,l=s.dur,"coding"===(t=r[0])?l>3600?"Deep on":"Coding on":"code_review"===t?"Reviewing":"design"===t?"Designing":"documentation"===t?"Docs for":"planning"===t?"Planning":"meeting"===t?"Meetings around":"communication"===t?"Comms on":"research"===t?"Researching":"deployment_devops"===t?"Deploying":"Working on")} ${e} for ${n}`)}else i.push(`${n} on ${e}`)}),r>900&&i.push(`${(0,a.fmtDur)(r)} of overhead`),t){let e=a.CATS[t.cat]?.label?.toLowerCase()??t.cat;i.push(l.length>0?`currently in ${e}`:`started ${e} at ${(0,a.fmtClock)(t.started_at)}`)}return i.length>0?i.join(", ")+".":null}(i),n||i.sessions.length>0||i.active?(0,s.jsxs)("section",{className:"rise space-y-5",children:[n&&(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"text-[11px] uppercase tracking-[0.18em] mb-3",style:{color:"var(--ink-3)"},children:"Today at a glance"}),(0,s.jsx)("p",{className:"font-serif text-[32px] leading-[1.15]",style:{color:"var(--ink)",textWrap:"pretty"},children:n})]}),(i.sessions.length>0||i.active)&&(0,s.jsx)(a.Card,{className:"p-6",children:(0,s.jsx)(u,{data:i})}),r&&(0,s.jsx)("p",{className:"text-[14px] leading-relaxed",style:{color:"var(--ink-2)",textWrap:"pretty"},children:r})]}):null),i.active&&(0,s.jsx)(h,{active:i.active,taskKey:i.sessions.filter(e=>e.task_key).at(-1)?.task_key}),(0,s.jsx)(m,{focus_s:i.focus_s,idle_s:i.idle_s,agent_s:i.agent_s,supervised_s:i.supervised_s,autonomous_s:i.autonomous_s,switch_count:i.switch_count}),p.length>0&&(0,s.jsxs)("section",{children:[(0,s.jsx)(a.SectionHead,{kicker:"By task",title:"Where your time went",right:(0,s.jsx)("button",{onClick:()=>e?.("tasks"),className:"text-[12px]",style:{color:"var(--ink-3)"},children:"Open Tasks →"})}),(0,s.jsx)("div",{className:"space-y-px rule rounded-xl overflow-hidden border",style:{borderColor:"var(--rule)"},children:p.map(e=>(0,s.jsx)(f,{bucket:e},e.key))})]}),(i.sessions.length>0||i.active)&&(0,s.jsxs)("section",{children:[(0,s.jsx)(a.SectionHead,{kicker:"Shape of the day",title:"Activity patterns & insights"}),(0,s.jsx)(l,{data:i})]}),g>0&&(0,s.jsxs)("section",{children:[(0,s.jsx)(a.SectionHead,{kicker:"Needs review",title:(0,s.jsxs)(s.Fragment,{children:["Unassigned sessions ",(0,s.jsx)("span",{className:"ml-2 font-mono tnum text-[15px]",style:{color:"var(--accent)"},children:g})]}),right:(0,s.jsx)("button",{onClick:()=>e?.("queue"),className:"text-[12px]",style:{color:"var(--ink-3)"},children:"Review queue →"})}),(0,s.jsx)(a.Card,{children:i.sessions.filter(e=>"queue"===e.routing).slice(0,3).map(e=>(0,s.jsx)(v,{session:{...e,candidates:e.task_key?[e.task_key]:[]}},e.id))})]}),0===i.session_count&&!i.active&&(0,s.jsxs)("div",{className:"rounded-xl border py-16 text-center",style:{borderColor:"var(--rule)",background:"var(--surface)"},children:[(0,s.jsx)("p",{className:"text-[13px]",style:{color:"var(--ink-3)"},children:"No activity captured today"}),(0,s.jsx)("p",{className:"text-[11px] mt-1",style:{color:"var(--ink-4)"},children:"Start meridian to begin tracking"})]})]})}],72868)},65906,e=>{e.n(e.i(72868))}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,45540,e=>{"use strict";var t=e.i(80663),s=e.i(56916),r=e.i(29987);function a(e=0){let t=new Date;t.setDate(t.getDate()+e);let s=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),l=String(t.getDate()).padStart(2,"0");return`${s}-${r}-${l}`}let l={drafted:{label:"Draft",color:"var(--ink-3)"},approved:{label:"Approved",color:"var(--accent)"},posted:{label:"Posted",color:"#2F9E44"},skipped:{label:"Dismissed",color:"var(--ink-4)"},failed:{label:"Failed",color:"#E03131"}};function o(e,t){let s=new Date(`${e}T12:00:00`);s.setDate(s.getDate()+t);let r=new Date;if(r.setHours(12,0,0,0),s>r)return e;let a=s.getFullYear(),l=String(s.getMonth()+1).padStart(2,"0"),o=String(s.getDate()).padStart(2,"0");return`${a}-${l}-${o}`}function n({w:e,busy:a,onApprove:o,onReject:i,onUnapprove:d,onSave:c}){let[p,x]=(0,s.useState)(!1),[m,u]=(0,s.useState)(e.summary),[v,h]=(0,s.useState)(!1),y=l[e.state]??{label:e.state,color:"var(--ink-3)"},k="posted"===e.state;return(0,s.useEffect)(()=>{u(e.summary)},[e.summary]),(0,t.jsx)("div",{className:"rounded-xl border overflow-hidden",style:{borderColor:"var(--rule)",background:"var(--surface)"},children:(0,t.jsxs)("div",{className:"px-5 py-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)(r.TaskKey,{keyId:e.task_key}),(0,t.jsx)("span",{className:"font-mono tnum text-[11px]",style:{color:"var(--ink-3)"},children:(0,r.fmtClock)(e.window_start)}),(0,t.jsx)("span",{className:"text-[11px]",style:{color:"var(--ink-4)"},children:"·"}),(0,t.jsx)("span",{className:"font-mono tnum text-[11px]",style:{color:"var(--ink-3)"},children:(0,r.fmtDur)(e.time_spent_seconds)}),(0,t.jsx)(r.ConfidenceRing,{value:e.confidence}),e.edited&&(0,t.jsx)("span",{className:"text-[10px] uppercase tracking-[0.12em]",style:{color:"var(--ink-4)"},children:"edited"}),(0,t.jsx)("span",{className:"ml-auto text-[10px] uppercase tracking-[0.14em] px-2 py-0.5 rounded",style:{color:y.color,border:`1px solid ${y.color}`},children:y.label})]}),e.risk_flags.length>0&&(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5 mt-2",children:e.risk_flags.map(e=>(0,t.jsxs)("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-mono",style:{background:"var(--tint)",color:"#B45309",border:"1px solid var(--rule-2)"},children:["⚑ ",e]},e))}),(0,t.jsx)("div",{className:"mt-3",children:p&&!k?(0,t.jsxs)("div",{children:[(0,t.jsx)("textarea",{value:m,onChange:e=>u(e.target.value),rows:4,className:"w-full px-3 py-2 rounded-md text-[13px] leading-relaxed",style:{background:"var(--surface-2)",border:"1px solid var(--rule-2)",color:"var(--ink)",outline:"none",resize:"vertical"}}),(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-2",children:[(0,t.jsx)("button",{onClick:()=>{c(m),x(!1)},disabled:a,className:"px-3 py-1 rounded-md text-[12px]",style:{background:"var(--ink)",color:"var(--paper)"},children:"Save"}),(0,t.jsx)("button",{onClick:()=>{u(e.summary),x(!1)},className:"px-3 py-1 rounded-md text-[12px]",style:{color:"var(--ink-3)",border:"1px solid var(--rule-2)"},children:"Cancel"}),(0,t.jsx)("span",{className:"text-[10px]",style:{color:"var(--ink-4)"},children:"saving re-drafts an approved worklog"})]})]}):(0,t.jsx)("p",{className:"text-[13px] leading-relaxed whitespace-pre-wrap",style:{color:e.summary?"var(--ink)":"var(--ink-4)"},children:e.summary||"(empty — nothing to post; edit to add a comment)"})}),e.last_post_error&&(0,t.jsxs)("p",{className:"text-[11px] mt-2 font-mono",style:{color:"#E03131"},children:["post error: ",e.last_post_error]}),k&&e.posted_worklog_id&&(0,t.jsxs)("p",{className:"text-[11px] mt-2",style:{color:"#2F9E44"},children:["✓ posted to Jira · worklog ",e.posted_worklog_id]}),(e.bullets.length>0||e.next_steps.length>0)&&(0,t.jsxs)("button",{onClick:()=>h(e=>!e),className:"text-[11px] mt-3",style:{color:"var(--ink-3)"},children:[v?"− hide":"+ show"," supporting detail"]}),v&&(0,t.jsxs)("div",{className:"mt-2 pl-3 border-l space-y-1",style:{borderColor:"var(--rule-2)"},children:[e.bullets.map((e,s)=>(0,t.jsxs)("p",{className:"text-[12px]",style:{color:"var(--ink-2)"},children:[(0,t.jsx)("span",{className:"text-[10px] uppercase tracking-[0.1em] mr-1.5",style:{color:"var(--ink-4)"},children:e.kind}),e.text]},s)),e.next_steps.length>0&&(0,t.jsxs)("p",{className:"text-[12px] pt-1",style:{color:"var(--ink-3)"},children:[(0,t.jsx)("span",{className:"text-[10px] uppercase tracking-[0.1em] mr-1.5",style:{color:"var(--ink-4)"},children:"next"}),e.next_steps.join(" · ")]})]}),!k&&(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-4",children:["approved"!==e.state?(0,t.jsx)("button",{onClick:o,disabled:a||!e.summary.trim(),className:"px-3 py-1.5 rounded-md text-[12px] transition-colors",style:{background:e.summary.trim()?"var(--accent)":"var(--rule-2)",color:"var(--paper)"},children:"Approve → post"}):(0,t.jsx)("button",{onClick:d,disabled:a,className:"px-3 py-1.5 rounded-md text-[12px]",style:{color:"var(--ink-2)",border:"1px solid var(--rule-2)"},children:"Hold (un-approve)"}),!p&&(0,t.jsx)("button",{onClick:()=>x(!0),disabled:a,className:"px-3 py-1.5 rounded-md text-[12px]",style:{color:"var(--ink-2)",border:"1px solid var(--rule-2)"},children:"Edit"}),"skipped"!==e.state&&(0,t.jsx)("button",{onClick:i,disabled:a,className:"px-3 py-1.5 rounded-md text-[12px] ml-auto",style:{color:"var(--ink-3)"},children:"Dismiss"})]})]})})}e.s(["default",0,function(){let[e,r]=(0,s.useState)(a(0)),[l,i]=(0,s.useState)([]),[d,c]=(0,s.useState)({}),[p,x]=(0,s.useState)(!0),[m,u]=(0,s.useState)(null),v=(0,s.useCallback)(e=>{fetch(`/api/worklogs?day=${e}`).then(e=>e.json()).then(e=>{i(e.items??[]),c(e.counts??{}),x(!1)}).catch(()=>x(!1))},[]);async function h(t,s){u(t);try{let e=await s();if(!e.ok){let t=await e.json().catch(()=>({}));alert(t.error??"Action failed")}}finally{u(null),v(e)}}(0,s.useEffect)(()=>{x(!0),v(e);let t=setInterval(()=>v(e),3e4);return()=>clearInterval(t)},[e,v]);let y=(e,t)=>h(e,()=>fetch(`/api/worklogs/${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:t})})),k=l.filter(e=>"drafted"===e.state&&e.summary.trim()).map(e=>e.id);async function g(){u(-1);try{await Promise.all(k.map(e=>fetch(`/api/worklogs/${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"approve"})})))}finally{u(null),v(e)}}let f=e===a(0);return(0,t.jsxs)("div",{className:"space-y-8",children:[(0,t.jsxs)("header",{className:"rise flex items-end justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-[11px] uppercase tracking-[0.2em]",style:{color:"var(--ink-3)"},children:"Worklog review"}),(0,t.jsx)("h1",{className:"font-serif text-[56px] leading-[1] tracking-tight mt-1",style:{color:"var(--ink)"},children:"Approve before it posts"}),(0,t.jsx)("p",{className:"mt-3 text-[14px] max-w-prose",style:{color:"var(--ink-2)"},children:"Nothing reaches Jira until you approve it. Edit the comment if it's off, then approve — the daemon posts approved worklogs within a minute."})]}),(0,t.jsxs)("div",{className:"text-right shrink-0",children:[(0,t.jsxs)("div",{className:"flex items-center gap-1 justify-end",children:[(0,t.jsx)("button",{onClick:()=>r(e=>o(e,-1)),className:"px-2 py-1 rounded-md text-[13px]",style:{color:"var(--ink-3)",border:"1px solid var(--rule-2)"},children:"←"}),(0,t.jsx)("span",{className:"font-mono tnum text-[12px] px-2",style:{color:"var(--ink-2)"},children:f?"Today":e}),(0,t.jsx)("button",{onClick:()=>r(e=>o(e,1)),disabled:f,className:"px-2 py-1 rounded-md text-[13px]",style:{color:f?"var(--ink-4)":"var(--ink-3)",border:"1px solid var(--rule-2)"},children:"→"})]}),(0,t.jsxs)("p",{className:"text-[11px] mt-2",style:{color:"var(--ink-3)"},children:[d.drafted??0," draft · ",d.approved??0," approved · ",d.posted??0," posted"]})]})]}),k.length>0&&(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("button",{onClick:g,disabled:-1===m,className:"px-3 py-1.5 rounded-md text-[12px] transition-colors",style:{background:"var(--accent)",color:"var(--paper)"},children:-1===m?"Approving…":`Approve all ${k.length} drafts`}),(0,t.jsx)("span",{className:"text-[11px]",style:{color:"var(--ink-4)"},children:"posts everything you haven't edited away"})]}),p?(0,t.jsx)("p",{className:"text-[13px]",style:{color:"var(--ink-3)"},children:"Loading…"}):0===l.length?(0,t.jsxs)("div",{className:"py-16 text-center rounded-xl border",style:{borderColor:"var(--rule)",background:"var(--surface)"},children:[(0,t.jsxs)("p",{className:"font-serif italic text-[24px]",style:{color:"var(--ink-2)"},children:["No worklogs ",f?"yet today":"this day","."]}),(0,t.jsx)("p",{className:"text-[12px] mt-2",style:{color:"var(--ink-3)"},children:"They appear here as the daemon drafts them, hour by hour."})]}):(0,t.jsx)("div",{className:"space-y-3",children:l.map(e=>(0,t.jsx)(n,{w:e,busy:m===e.id,onApprove:()=>y(e.id,"approve"),onReject:()=>y(e.id,"reject"),onUnapprove:()=>y(e.id,"unapprove"),onSave:t=>{let s;return s=e.id,h(s,()=>fetch(`/api/worklogs/${s}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({summary:t})}))}},e.id))})]})}])},75042,e=>{e.n(e.i(45540))}]);
@@ -1 +1 @@
1
- D4n6BXLDnMIaIK2sOnvXW
1
+ uXdijjK52XmKTMDx4K3Fb
@@ -8,6 +8,8 @@
8
8
  "/api/tasks/route": "/api/tasks",
9
9
  "/api/today/route": "/api/today",
10
10
  "/api/week/route": "/api/week",
11
+ "/api/worklogs/[id]/route": "/api/worklogs/[id]",
12
+ "/api/worklogs/route": "/api/worklogs",
11
13
  "/page": "/",
12
14
  "/settings/page": "/settings"
13
15
  }
@@ -7,9 +7,9 @@
7
7
  "static/chunks/03~yq9q893hmn.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/D4n6BXLDnMIaIK2sOnvXW/_buildManifest.js",
11
- "static/D4n6BXLDnMIaIK2sOnvXW/_ssgManifest.js",
12
- "static/D4n6BXLDnMIaIK2sOnvXW/_clientMiddlewareManifest.js"
10
+ "static/uXdijjK52XmKTMDx4K3Fb/_buildManifest.js",
11
+ "static/uXdijjK52XmKTMDx4K3Fb/_ssgManifest.js",
12
+ "static/uXdijjK52XmKTMDx4K3Fb/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/0dot4ieb6jn6a.js",
@@ -102,8 +102,8 @@
102
102
  "dynamicRoutes": {},
103
103
  "notFoundRoutes": [],
104
104
  "preview": {
105
- "previewModeId": "c44f4eb2df9896cd3aee32ba202ffed9",
106
- "previewModeSigningKey": "4e24ba9a2e8dde1273c53b3cfe7d4a8537e9e76f8c239c21d06affdde5f4f393",
107
- "previewModeEncryptionKey": "bf4d54374462bc88a6b879de2693e1774e8a58afc8e6f3763a8385a353179119"
105
+ "previewModeId": "11aa4d66b099916219d29e2d566819be",
106
+ "previewModeSigningKey": "031f0b61d1d45c9846fa084bd08652a4c157289dd3bfd83aac6b977ee5e6cfde",
107
+ "previewModeEncryptionKey": "5618a32ac7462efa1410079fcde0e81ad0dd0c0ada6448de81abc54273031693"
108
108
  }
109
109
  }
@@ -21,7 +21,16 @@
21
21
  "afterFiles": [],
22
22
  "fallback": []
23
23
  },
24
- "dynamicRoutes": [],
24
+ "dynamicRoutes": [
25
+ {
26
+ "page": "/api/worklogs/[id]",
27
+ "regex": "^/api/worklogs/([^/]+?)(?:/)?$",
28
+ "routeKeys": {
29
+ "nxtPid": "nxtPid"
30
+ },
31
+ "namedRegex": "^/api/worklogs/(?<nxtPid>[^/]+?)(?:/)?$"
32
+ }
33
+ ],
25
34
  "staticRoutes": [
26
35
  {
27
36
  "page": "/",
@@ -83,6 +92,12 @@
83
92
  "routeKeys": {},
84
93
  "namedRegex": "^/api/week(?:/)?$"
85
94
  },
95
+ {
96
+ "page": "/api/worklogs",
97
+ "regex": "^/api/worklogs(?:/)?$",
98
+ "routeKeys": {},
99
+ "namedRegex": "^/api/worklogs(?:/)?$"
100
+ },
86
101
  {
87
102
  "page": "/settings",
88
103
  "regex": "^/settings(?:/)?$",