forge-openclaw-plugin 0.2.3 → 0.2.7

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 (117) hide show
  1. package/README.md +114 -6
  2. package/dist/assets/board-CzgvdLO8.js +6 -0
  3. package/dist/assets/board-CzgvdLO8.js.map +1 -0
  4. package/dist/assets/favicon-BCHm9dUV.ico +0 -0
  5. package/dist/assets/index-8d_oM8fL.js +27 -0
  6. package/dist/assets/index-8d_oM8fL.js.map +1 -0
  7. package/dist/assets/index-D4A_bq8m.css +1 -0
  8. package/dist/assets/motion-STUd1O46.js +10 -0
  9. package/dist/assets/motion-STUd1O46.js.map +1 -0
  10. package/dist/assets/plus-jakarta-sans-latin-ext-wght-normal-DmpS2jIq.woff2 +0 -0
  11. package/dist/assets/plus-jakarta-sans-latin-wght-normal-eXO_dkmS.woff2 +0 -0
  12. package/dist/assets/plus-jakarta-sans-vietnamese-wght-normal-qRpaaN48.woff2 +0 -0
  13. package/dist/assets/sora-latin-ext-wght-normal-CawQDOvP.woff2 +0 -0
  14. package/dist/assets/sora-latin-wght-normal-DdqRvwsR.woff2 +0 -0
  15. package/dist/assets/space-grotesk-latin-500-normal-CNSSEhBt.woff +0 -0
  16. package/dist/assets/space-grotesk-latin-500-normal-lFbtlQH6.woff2 +0 -0
  17. package/dist/assets/space-grotesk-latin-700-normal-CwsQ-cCU.woff +0 -0
  18. package/dist/assets/space-grotesk-latin-700-normal-RjhwGPKo.woff2 +0 -0
  19. package/dist/assets/space-grotesk-latin-ext-500-normal-3dgZTiw9.woff +0 -0
  20. package/dist/assets/space-grotesk-latin-ext-500-normal-DUe3BAxM.woff2 +0 -0
  21. package/dist/assets/space-grotesk-latin-ext-700-normal-BQnZhY3m.woff2 +0 -0
  22. package/dist/assets/space-grotesk-latin-ext-700-normal-HVCqSBdx.woff +0 -0
  23. package/dist/assets/space-grotesk-vietnamese-500-normal-BTqKIpxg.woff +0 -0
  24. package/dist/assets/space-grotesk-vietnamese-500-normal-BmEvtly_.woff2 +0 -0
  25. package/dist/assets/space-grotesk-vietnamese-700-normal-DMty7AZE.woff2 +0 -0
  26. package/dist/assets/space-grotesk-vietnamese-700-normal-Duxec5Rn.woff +0 -0
  27. package/dist/assets/table-CtNlETLc.js +23 -0
  28. package/dist/assets/table-CtNlETLc.js.map +1 -0
  29. package/dist/assets/ui-ThzkR_oW.js +46 -0
  30. package/dist/assets/ui-ThzkR_oW.js.map +1 -0
  31. package/dist/assets/vendor-CRS-psbw.css +1 -0
  32. package/dist/assets/vendor-DyHAI6nk.js +423 -0
  33. package/dist/assets/vendor-DyHAI6nk.js.map +1 -0
  34. package/dist/assets/viz-BJuBCz_G.js +34 -0
  35. package/dist/assets/viz-BJuBCz_G.js.map +1 -0
  36. package/dist/favicon.ico +0 -0
  37. package/dist/favicon.png +0 -0
  38. package/dist/index.html +29 -0
  39. package/dist/openclaw/api-client.d.ts +8 -0
  40. package/dist/openclaw/api-client.js +31 -4
  41. package/dist/openclaw/local-runtime.d.ts +3 -0
  42. package/dist/openclaw/local-runtime.js +135 -0
  43. package/dist/openclaw/parity.d.ts +4 -4
  44. package/dist/openclaw/parity.js +23 -33
  45. package/dist/openclaw/plugin-entry-shared.d.ts +5 -3
  46. package/dist/openclaw/plugin-entry-shared.js +52 -10
  47. package/dist/openclaw/routes.d.ts +12 -3
  48. package/dist/openclaw/routes.js +156 -924
  49. package/dist/openclaw/tools.js +242 -1100
  50. package/dist/server/app.js +2450 -0
  51. package/dist/server/db.js +313 -0
  52. package/dist/server/e2e-server.js +20 -0
  53. package/dist/server/errors.js +15 -0
  54. package/dist/server/index.js +16 -0
  55. package/dist/server/managers/base.js +17 -0
  56. package/dist/server/managers/contracts.js +47 -0
  57. package/dist/server/managers/platform/api-gateway-manager.js +11 -0
  58. package/dist/server/managers/platform/audit-manager.js +15 -0
  59. package/dist/server/managers/platform/authentication-manager.js +56 -0
  60. package/dist/server/managers/platform/authorization-manager.js +56 -0
  61. package/dist/server/managers/platform/background-job-manager.js +10 -0
  62. package/dist/server/managers/platform/configuration-manager.js +33 -0
  63. package/dist/server/managers/platform/database-manager.js +14 -0
  64. package/dist/server/managers/platform/event-bus-manager.js +7 -0
  65. package/dist/server/managers/platform/external-service-manager.js +11 -0
  66. package/dist/server/managers/platform/health-manager.js +7 -0
  67. package/dist/server/managers/platform/migration-manager.js +8 -0
  68. package/dist/server/managers/platform/search-index-manager.js +4 -0
  69. package/dist/server/managers/platform/secrets-manager.js +19 -0
  70. package/dist/server/managers/platform/session-manager.js +121 -0
  71. package/dist/server/managers/platform/storage-manager.js +16 -0
  72. package/dist/server/managers/platform/token-manager.js +37 -0
  73. package/dist/server/managers/platform/transaction-manager.js +8 -0
  74. package/dist/server/managers/platform/trusted-network.js +39 -0
  75. package/dist/server/managers/runtime.js +56 -0
  76. package/dist/server/managers/type-guards.js +4 -0
  77. package/dist/server/openapi.js +3512 -0
  78. package/dist/server/psyche-types.js +395 -0
  79. package/dist/server/repositories/activity-events.js +157 -0
  80. package/dist/server/repositories/collaboration.js +497 -0
  81. package/dist/server/repositories/comments.js +176 -0
  82. package/dist/server/repositories/deleted-entities.js +192 -0
  83. package/dist/server/repositories/domains.js +30 -0
  84. package/dist/server/repositories/event-log.js +64 -0
  85. package/dist/server/repositories/goals.js +159 -0
  86. package/dist/server/repositories/projects.js +214 -0
  87. package/dist/server/repositories/psyche.js +1356 -0
  88. package/dist/server/repositories/rewards.js +675 -0
  89. package/dist/server/repositories/settings.js +399 -0
  90. package/dist/server/repositories/tags.js +160 -0
  91. package/dist/server/repositories/task-runs.js +488 -0
  92. package/dist/server/repositories/tasks.js +413 -0
  93. package/dist/server/services/context.js +214 -0
  94. package/dist/server/services/dashboard.js +170 -0
  95. package/dist/server/services/entity-crud.js +576 -0
  96. package/dist/server/services/gamification.js +215 -0
  97. package/dist/server/services/insights.js +91 -0
  98. package/dist/server/services/projects.js +75 -0
  99. package/dist/server/services/psyche.js +63 -0
  100. package/dist/server/services/relations.js +28 -0
  101. package/dist/server/services/reviews.js +88 -0
  102. package/dist/server/services/run-recovery.js +13 -0
  103. package/dist/server/services/tagging.js +49 -0
  104. package/dist/server/services/task-run-watchdog.js +92 -0
  105. package/dist/server/services/work-time.js +176 -0
  106. package/dist/server/types.js +999 -0
  107. package/dist/server/web.js +91 -0
  108. package/openclaw.plugin.json +22 -10
  109. package/package.json +17 -4
  110. package/server/migrations/001_core.sql +333 -0
  111. package/server/migrations/002_psyche.sql +241 -0
  112. package/server/migrations/003_timer_execution.sql +18 -0
  113. package/server/migrations/004_psyche_linked_entities.sql +5 -0
  114. package/server/migrations/005_adaptive_schemas.sql +157 -0
  115. package/server/migrations/006_psyche_auth_setting.sql +4 -0
  116. package/server/migrations/007_deleted_entities.sql +16 -0
  117. package/skills/forge-openclaw/SKILL.md +189 -275
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-8d_oM8fL.js","sources":["../../src/lib/utils.ts","../../src/components/ui/spinner.tsx","../../src/lib/i18n.tsx","../../src/components/experience/ambient-activity-pill.tsx","../../src/components/ui/badge.tsx","../../src/lib/entity-visuals.ts","../../src/components/ui/entity-badge.tsx","../../src/components/ui/entity-name.tsx","../../src/components/ui/input.tsx","../../src/components/experience/command-palette.tsx","../../src/components/experience/route-transition-frame.tsx","../../src/components/ui/button.tsx","../../src/components/experience/sheet-scaffold.tsx","../../src/components/ui/info-tooltip.tsx","../../src/components/flows/question-flow-dialog.tsx","../../src/components/ui/textarea.tsx","../../src/lib/schemas.ts","../../src/components/goal-dialog.tsx","../../src/components/project-dialog.tsx","../../src/components/task-dialog.tsx","../../src/components/create-menu.tsx","../../src/components/start-work-composer.tsx","../../src/components/shell/task-timer-rail.tsx","../../src/components/ui/card.tsx","../../src/lib/api-error.ts","../../src/components/ui/page-state.tsx","../../src/lib/runtime-paths.ts","../../src/hooks/use-live-events.ts","../../src/lib/snapshot-normalizer.ts","../../src/lib/api.ts","../../src/components/shell/app-shell.tsx","../../src/components/shell/page-hero.tsx","../../src/lib/entity-links.ts","../../src/components/activity-table.tsx","../../src/pages/activity-page.tsx","../../src/components/ui/progress-meter.tsx","../../src/lib/activity-copy.ts","../../src/pages/goal-detail-page.tsx","../../src/components/goal-studio.tsx","../../src/pages/goals-page.tsx","../../src/components/insights/insight-flow-dialog.tsx","../../src/pages/insights-page.tsx","../../src/components/execution-board.tsx","../../src/store/use-command-center.ts","../../src/pages/kanban-page.tsx","../../src/components/experience/flagship-signal-deck.tsx","../../src/components/xp/xp-command-deck.tsx","../../src/components/ui/interactive-card.tsx","../../src/components/ui/metric-tile.tsx","../../src/pages/overview-page.tsx","../../src/components/experience/surface-skeleton.tsx","../../src/pages/project-detail-page.tsx","../../src/pages/projects-page.tsx","../../src/components/psyche/goal-gravity-scene.ts","../../src/components/psyche/psyche-graph.tsx","../../src/components/psyche/reflect-flow-dialog.tsx","../../src/components/psyche/psyche-section-nav.tsx","../../src/pages/psyche-page.tsx","../../src/components/psyche/atlas-panel.tsx","../../src/components/psyche/entity-link-multiselect.tsx","../../src/components/psyche/return-path-strip.tsx","../../src/lib/schema-visuals.ts","../../src/components/psyche/schema-badge.tsx","../../src/components/psyche/use-psyche-focus-target.ts","../../src/lib/query-cache.ts","../../src/lib/psyche-schemas.ts","../../src/pages/psyche-behaviors-page.tsx","../../src/pages/psyche-goal-map-page.tsx","../../src/lib/query-collection.ts","../../src/pages/psyche-mode-guide-page.tsx","../../src/components/psyche/mode-chip.tsx","../../src/pages/psyche-modes-page.tsx","../../src/components/psyche/orbit-map.tsx","../../src/pages/psyche-patterns-page.tsx","../../src/components/psyche/chain-canvas.tsx","../../src/components/psyche/report-chain-fields.tsx","../../src/lib/psyche-formats.ts","../../src/pages/psyche-report-detail-page.tsx","../../src/pages/psyche-reports-page.tsx","../../src/pages/psyche-schemas-beliefs-page.tsx","../../src/pages/psyche-values-page.tsx","../../src/components/settings/settings-section-nav.tsx","../../src/pages/settings-page.tsx","../../src/components/settings/agent-token-flow-dialog.tsx","../../src/components/settings/log-work-flow-dialog.tsx","../../src/components/settings/token-reveal-dialog.tsx","../../src/pages/settings-agents-page.tsx","../../src/pages/settings-bin-page.tsx","../../src/pages/settings-rewards-page.tsx","../../src/pages/task-detail-page.tsx","../../src/components/daily-runway.tsx","../../src/pages/today-page.tsx","../../src/pages/weekly-review-page.tsx","../../src/app.tsx","../../src/main.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function formatDateTime(value: string) {\n return new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\"\n }).format(new Date(value));\n}\n\nexport function formatDate(value: string | null) {\n if (!value) {\n return \"No date\";\n }\n\n return new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\"\n }).format(new Date(`${value}T00:00:00.000Z`));\n}\n","import { cn } from \"@/lib/utils\";\n\nexport function Spinner({\n className,\n tone = \"primary\"\n}: {\n className?: string;\n tone?: \"primary\" | \"subtle\" | \"psyche\";\n}) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-block size-4 rounded-full border border-white/14 border-t-transparent bg-[conic-gradient(from_180deg_at_50%_50%,rgba(255,255,255,0.02),rgba(255,255,255,0.34),rgba(255,255,255,0.02))] align-middle motion-safe:animate-spin\",\n tone === \"primary\" && \"shadow-[0_0_0_1px_rgba(192,193,255,0.22)]\",\n tone === \"subtle\" && \"opacity-80 shadow-[0_0_0_1px_rgba(255,255,255,0.08)]\",\n tone === \"psyche\" && \"shadow-[0_0_0_1px_rgba(110,231,183,0.2)]\",\n className\n )}\n />\n );\n}\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport type AppLocale = \"en\" | \"fr\";\n\ntype DictionaryTree = {\n [key: string]: string | DictionaryTree;\n};\n\ntype LeafPaths<T, Prefix extends string = \"\"> = {\n [K in keyof T & string]: T[K] extends string\n ? `${Prefix}${K}`\n : T[K] extends DictionaryTree\n ? LeafPaths<T[K], `${Prefix}${K}.`>\n : never;\n}[keyof T & string];\n\nfunction createEnglishDictionary() {\n return {\n common: {\n actions: {\n cancel: \"Cancel\",\n close: \"Close\",\n create: \"Create\",\n edit: \"Edit\",\n inspect: \"Inspect\",\n open: \"Open\",\n refresh: \"Refresh\",\n retry: \"Retry\",\n save: \"Save\",\n reset: \"Reset filters\",\n view: \"View\"\n },\n labels: {\n loading: \"Loading\",\n backgroundActivity: \"Background activity\",\n syncInProgress: \"Sync in progress\",\n connectionState: \"Connection state\",\n errorCode: \"Error code: {code}\",\n noDate: \"No date\",\n noProject: \"No project linked\",\n noGoal: \"No life goal linked\",\n noExecutionNote: \"No execution note attached yet.\",\n noRunNote: \"No run note recorded.\",\n released: \"Released\",\n stable: \"Stable\",\n timedOut: \"Timed out\",\n waiting: \"Waiting\",\n today: \"Today\"\n },\n enums: {\n taskStatus: {\n backlog: \"Backlog\",\n focus: \"Focus\",\n in_progress: \"In progress\",\n blocked: \"Blocked\",\n done: \"Done\"\n },\n priority: {\n critical: \"Critical\",\n high: \"High\",\n medium: \"Medium\",\n low: \"Low\"\n },\n effort: {\n marathon: \"Marathon\",\n deep: \"Deep\",\n light: \"Light\"\n },\n energy: {\n high: \"High\",\n steady: \"Steady\",\n low: \"Low\"\n },\n projectStatus: {\n active: \"Active\",\n paused: \"Paused\",\n completed: \"Completed\"\n },\n goalHorizon: {\n quarter: \"Quarter\",\n year: \"Year\",\n lifetime: \"Lifetime\"\n }\n },\n shell: {\n appName: \"The Kinetic Forge\",\n appMark: \"FORGE\",\n more: \"More\",\n command: \"Command\",\n moreRoutesEyebrow: \"More routes\",\n moreRoutesTitle: \"Move through Forge\",\n moreRoutesDescription: \"Use this sheet for secondary destinations so the bottom bar stays clean and easy to use.\",\n loadingEyebrow: \"Forge shell\",\n loadingTitle: \"Loading Forge\",\n loadingDescription: \"Checking your operator session and loading your latest snapshot.\",\n sessionEyebrow: \"Forge operator session\",\n stateEyebrow: \"Forge state\",\n settled: \"Up to date\",\n savingOne: \"Saving {count} change\",\n savingOther: \"Saving {count} changes\",\n refreshingOne: \"Refreshing {count} view\",\n refreshingOther: \"Refreshing {count} views\",\n collapseSidebar: \"Collapse sidebar\",\n expandSidebar: \"Expand sidebar\",\n rail: {\n taskBackToKanban: \"Back to Kanban\",\n taskOpenToday: \"Open Today\",\n projectAll: \"All projects\",\n projectGoals: \"Goal architecture\",\n goalAll: \"All goals\",\n goalProjects: \"Active projects\",\n psycheHub: \"Psyche hub\",\n psycheReports: \"Reports\",\n overview: \"Overview\",\n today: \"Today\"\n },\n momentum: {\n title: \"Momentum\",\n streak: \"Streak\",\n xp: \"XP\",\n momentum: \"Momentum\",\n streakBadgeOne: \"{count} day streak\",\n streakBadgeOther: \"{count} day streak\",\n weeklyXp: \"{count} weekly XP\",\n liveMomentum: \"{count}% momentum\",\n psycheMode: \"Psyche active\"\n }\n },\n routeLabels: {\n overview: \"Overview\",\n goals: \"Goals\",\n projects: \"Projects\",\n kanban: \"Kanban\",\n today: \"Today\",\n psyche: \"Psyche\",\n activity: \"Activity\",\n insights: \"Insights\",\n review: \"Review\",\n settings: \"Settings\"\n },\n routeDetails: {\n overview: \"See priorities, momentum, and recent evidence in one place.\",\n goals: \"Keep long-term direction connected to day-to-day work.\",\n projects: \"Track the initiatives currently moving your goals forward.\",\n kanban: \"Move active work across the board without losing context.\",\n today: \"Focus today on the clearest next move.\",\n psyche: \"Reflect on values, patterns, and reports with structure.\",\n activity: \"Review the visible audit trail of what changed and when.\",\n insights: \"Store and review coaching, analysis, and recommendations.\",\n review: \"Review the week and set the next push.\",\n settings: \"Manage collaboration, safety, and operator preferences.\"\n },\n navigation: {\n openRoute: \"Open {label}\",\n create: \"Create\",\n createTitle: \"Create in Forge\",\n createDescription: \"Choose what you want to add next.\",\n closeCreateMenu: \"Close create menu\",\n newGoal: \"New life goal\",\n newGoalDescription: \"Define a long-term direction.\",\n newProject: \"New project\",\n newProjectDescription: \"Add a concrete initiative under a life goal.\",\n newTask: \"New task\",\n newTaskDescription: \"Capture the next actionable step in a project.\"\n },\n commandPalette: {\n searchPlaceholder: \"Jump to a route, goal, project, or focus task\",\n noResults: \"No command matches this search yet.\",\n categoryRoute: \"Route\",\n categoryGoal: \"Goal\",\n categoryProject: \"Project\",\n categoryTask: \"Task\",\n routeOverview: \"Open the overview.\",\n routeToday: \"Open today.\",\n routeKanban: \"Open the board.\",\n routePsyche: \"Open Psyche.\",\n routeGoals: \"Open your life goals.\",\n routeProjects: \"Open your projects.\",\n routeReview: \"Open weekly review.\",\n routeSettings: \"Open settings.\",\n openLifeGoal: \"Open life goal\",\n openFocusTask: \"Open focus task\"\n },\n pageState: {\n loadingTitle: \"Getting things ready\",\n loadingDescription: \"Loading the latest Forge data for this view.\"\n },\n settings: {\n localeLabel: \"Language\",\n localeDescription: \"Choose the language used throughout Forge.\",\n localeEnglish: \"English\",\n localeFrench: \"French\",\n localeSaved: \"Language saved\"\n },\n overview: {\n heroEyebrow: \"Strategic overview\",\n heroEmptyTitle: \"Ready to get started\",\n heroDescription: \"See your goals, active projects, current tasks, and recent evidence in one place.\",\n emptyTitle: \"No overview yet\",\n emptyDescription: \"Create a life goal, project, or task to give Forge something real to organize.\",\n emptyAction: \"Open life goals\",\n commandEyebrow: \"Command surface\",\n commandTitle: \"Now, next, risks, and recent proof\",\n commandDescription: \"See what needs attention now, what comes next, where drift is appearing, and what progress is already visible.\",\n sectionGoals: \"Active life goals\",\n sectionProjects: \"Active projects\",\n sectionFocus: \"Today's focus\",\n sectionEvidence: \"Recent evidence\",\n sectionMomentum: \"Momentum core\",\n sectionAttention: \"Needs attention\",\n noGoals: \"No life goals are active yet. Start by defining the direction you want Forge to support.\",\n noProjects: \"No active projects yet. Add a project to turn a goal into practical work.\",\n noFocus: \"No focus tasks yet. Promote a task when you know what deserves attention next.\",\n noEvidence: \"No evidence has been recorded yet. Completed work and logged activity will appear here.\",\n noProjectYet: \"No project yet\",\n noAttention: \"No major drift signal right now. Forge will raise neglected goals here when they start slipping.\",\n metricsLevel: \"Level\",\n metricsWeeklyXp: \"Weekly XP\",\n metricsFocusTasks: \"Focus tasks\",\n metricsOverdue: \"Overdue\"\n },\n todayPage: {\n heroEyebrow: \"Today\",\n heroEmptyTitle: \"No daily direction yet\",\n heroDescription: \"Start a task, earn XP, and keep today's work clear.\",\n emptyTitle: \"No daily runway yet\",\n emptyDescription: \"Add goals, tasks, or reward targets so Forge can shape a useful day plan.\",\n emptyAction: \"Open life goals\",\n commandEyebrow: \"Today command\",\n commandTitle: \"Directive, daily quests, recovery, and finish line\",\n commandDescription: \"See the next useful move clearly and keep the day grounded in real work.\",\n questsTitle: \"Daily quests\",\n questsEmpty: \"No daily quests yet. They will appear once Forge has enough live work and reward context.\",\n rewardsTitle: \"Milestone rewards\",\n rewardsEmpty: \"No milestone rewards are active yet. Long-term rewards will appear here as progress structure grows.\",\n signalDirective: \"Directive\",\n signalQuest: \"Quest chain\",\n signalComeback: \"Recovery\",\n signalFinish: \"Finish line\",\n noDirective: \"Choose one clear task to anchor the day.\",\n noQuest: \"No active daily quest chain\",\n noQuestDetail: \"Daily quests should reinforce real work, not distract from it.\",\n noComeback: \"Recovery window is clear\",\n noFinish: \"Keep the day clean\",\n noDirectiveDetail: \"Promote a real task and Today will become sharper immediately.\",\n noFinishDetail: \"A good finish today should make tomorrow lighter, not noisier.\"\n },\n kanban: {\n heroEyebrow: \"Task board\",\n heroTitle: \"Task board\",\n heroDescription: \"Use the board to move active work, review blocked items, and open task details when you need more context.\",\n emptyTitle: \"No board yet\",\n emptyDescription: \"Create your first task inside a project to start using the board.\",\n emptyAction: \"Open life goals\",\n healthEyebrow: \"Board status\",\n healthTitle: \"Visible work, focus, blockers, and completed work\",\n healthDescription: \"See what is active, what needs attention, and what has already been completed.\",\n visibleWork: \"Visible work\",\n focusWork: \"Current focus\",\n blockedWork: \"Blocked work\",\n completedWork: \"Completed work\",\n visibleDetail: \"{hidden} tasks are outside the current filters.\",\n focusDetailReady: \"These are the tasks most ready to be picked up next.\",\n focusDetailEmpty: \"Move one backlog task into focus to make the board more useful.\",\n blockedDetail: \"These tasks need a decision, an unblock, or a reset before they can move again.\",\n blockedDetailEmpty: \"No blocked tasks right now.\",\n doneDetail: \"Completed work stays here until you review it or reopen it.\",\n doneDetailEmpty: \"Nothing has been completed on this board yet.\",\n boardFilters: \"Board filters\",\n filterGoal: \"Goal\",\n filterOwner: \"Owner\",\n allGoals: \"All goals\",\n allOwners: \"All owners\",\n noTasksMatch: \"No tasks match these filters\",\n noTasksMatchDescription: \"These filters hide every task. Reset them to see the full board again.\",\n taskContext: \"Task details\",\n evidence: \"Recent activity\",\n runHistory: \"Run history\",\n noTaskEvidence: \"No activity has been recorded for this task yet.\",\n noRunHistory: \"No runs have been recorded for this task yet.\",\n taskPlacement: \"Task placement\",\n projectLabel: \"Project: {value}\",\n goalLabel: \"Life goal: {value}\",\n ownerLabel: \"Owner: {value}\",\n dueLabel: \"Due: {value}\",\n openTask: \"Open task\",\n openProject: \"Open project\",\n openGoal: \"Open life goal\",\n noProjectLinked: \"No project linked\",\n noGoalLinked: \"No life goal linked\"\n },\n dailyRunway: {\n runwayEyebrow: \"Today\",\n runwayTitle: \"Tasks for today\",\n prioritiesOne: \"{count} task\",\n prioritiesOther: \"{count} tasks\",\n unassigned: \"Unassigned\",\n runwayItem: \"Task {index}\",\n noNote: \"No note yet.\",\n inspect: \"Open task\",\n actionBacklog: \"Start\",\n actionFocus: \"Start\",\n actionProgress: \"Done\",\n actionBlocked: \"Start\",\n timelineEyebrow: \"By status\",\n timelineTitle: \"Tasks by status\",\n emptyBucket: \"Nothing here right now.\"\n },\n executionBoard: {\n laneBacklogTitle: \"Backlog\",\n laneBacklogDetail: \"Not started yet\",\n laneFocusTitle: \"Focus\",\n laneFocusDetail: \"Ready to work on\",\n laneProgressTitle: \"In progress\",\n laneProgressDetail: \"Currently moving\",\n laneBlockedTitle: \"Blocked\",\n laneBlockedDetail: \"Needs attention\",\n laneDoneTitle: \"Done\",\n laneDoneDetail: \"Completed\",\n noExecutionNote: \"No note yet.\",\n reopen: \"Reopen\",\n emptyLane: \"No tasks in this lane.\"\n },\n weeklyReview: {\n heroEyebrow: \"Weekly review\",\n heroDescription: \"Review the week, note what moved, and decide what needs attention next.\",\n summaryEyebrow: \"Weekly summary\",\n summaryTitle: \"This week, wins, recovery, and next steps\",\n summaryDescription: \"Use this review to understand what happened this week and choose the most useful next move.\",\n sectionMomentum: \"Momentum summary\",\n sectionGoals: \"Goal check-in\",\n sectionWins: \"Wins\",\n completionBonus: \"Completion bonus\",\n finalize: \"Finish review\",\n noWin: \"No win recorded yet\",\n noWinDetail: \"If this week was quiet, use the review to capture one useful takeaway anyway.\",\n noRecovery: \"No recovery suggestion yet\",\n noRecoveryDetail: \"If the week felt steady, keep a light recovery option available for next week.\"\n },\n dialogs: {\n closeDialog: \"Close dialog\",\n task: {\n eyebrow: \"Task\",\n createTitle: \"Create task\",\n editTitle: \"Edit task\",\n description: \"Use tasks for the next concrete step inside a project. Pick the project first so Forge can keep the larger context aligned.\",\n project: \"Project\",\n selectProject: \"Select a project\",\n goal: \"Life goal\",\n title: \"Title\",\n descriptionLabel: \"Description\",\n owner: \"Owner\",\n xp: \"XP\",\n priority: \"Priority\",\n status: \"Status\",\n effort: \"Effort\",\n energy: \"Energy\",\n dueDate: \"Due date\",\n tags: \"Tags\",\n save: \"Save task\",\n create: \"Create task\"\n },\n project: {\n eyebrow: \"Project\",\n createTitle: \"Create project\",\n editTitle: \"Edit project\",\n description: \"Use projects to turn a life goal into a concrete stream of work with tasks, evidence, and momentum.\",\n goal: \"Life goal\",\n selectGoal: \"Select a life goal\",\n title: \"Title\",\n descriptionLabel: \"Description\",\n status: \"Status\",\n targetXp: \"Target XP\",\n themeColor: \"Theme color\",\n save: \"Save project\",\n create: \"Create project\",\n submitError: \"Project update failed.\"\n },\n goal: {\n eyebrow: \"Life goal\",\n createTitle: \"Create life goal\",\n editTitle: \"Edit life goal\",\n description: \"Use life goals to define what matters over the coming months or years before you break the path into projects.\",\n title: \"Title\",\n descriptionLabel: \"Description\",\n horizon: \"Horizon\",\n status: \"Status\",\n targetXp: \"Target XP\",\n themeColor: \"Theme color\",\n tags: \"Life domains and context\",\n save: \"Save life goal\",\n create: \"Create life goal\",\n submitError: \"Goal update failed.\"\n }\n },\n taskDetail: {\n eyebrow: \"Task\",\n errorEyebrow: \"Task\",\n emptyPayload: \"Forge returned an empty task payload.\",\n heroFallback: \"Use this task page to update the work, move it forward, and keep its context clear.\",\n commandEyebrow: \"Task overview\",\n commandTitle: \"What this task is, what to do next, and where it fits\",\n commandDescription: \"Use this page to update the task itself and understand its surrounding context clearly.\",\n signalState: \"State\",\n signalNext: \"Next move\",\n signalEvidence: \"Recent activity\",\n signalAnchor: \"Connected project\",\n noStateChange: \"No state change needed\",\n terminalStateDetail: \"This task is already in a completed state unless you decide to reopen it.\",\n noEvidence: \"No recent activity yet\",\n noEvidenceDetail: \"Completed work, corrections, and logged sessions will appear here as the task moves.\",\n noAnchor: \"No connected project yet\",\n linkAnchorDetail: \"Connect this task to a project or life goal so Forge can show why it matters.\",\n edit: \"Edit task\",\n openProject: \"Open project\",\n openGoal: \"Open life goal\",\n markNotCompleted: \"Mark not completed\",\n sectionStatus: \"Task status\",\n fieldProject: \"Project\",\n fieldGoal: \"Life goal\",\n fieldDueDate: \"Due date\",\n pendingMove: \"Moving\",\n actionBacklog: \"Move to backlog\",\n actionFocus: \"Move to focus\",\n actionProgress: \"Start now\",\n actionBlocked: \"Mark blocked\",\n actionDone: \"Mark completed\",\n sectionEvidence: \"Recent activity\",\n noVisibleEvidence: \"No activity has been recorded for this task yet.\",\n removeLog: \"Remove log\",\n openRelatedItem: \"Open related item\",\n sectionRuns: \"Work sessions\",\n noRuns: \"No work sessions have been recorded for this task yet.\",\n sectionMetadata: \"More task details\",\n metaOwner: \"Owner: {value}\",\n metaEffort: \"Effort: {value}\",\n metaEnergy: \"Energy: {value}\",\n metaCreated: \"Created: {value}\",\n metaUpdated: \"Last updated: {value}\",\n metaCompleted: \"Completed at: {value}\",\n metaNotCompleted: \"Not completed\"\n },\n projectDetail: {\n errorEyebrow: \"Project\",\n heroEyebrow: \"Project\",\n commandEyebrow: \"Project status\",\n commandTitle: \"Momentum, next task, risk, and evidence\",\n commandDescription: \"Use this page to see what is moving, what needs attention next, and what evidence already supports the project.\",\n signalMomentum: \"Momentum\",\n signalNext: \"Next task\",\n signalRisk: \"Risk\",\n signalEvidence: \"Evidence\",\n trackedTasksOne: \"{count} tracked task\",\n trackedTasksOther: \"{count} tracked tasks\",\n noNextTask: \"No next task selected yet\",\n noNextTaskDetail: \"Pick or create a task so the project has a clear next move.\",\n needsFocus: \"Needs focus\",\n noRisk: \"No immediate risk signal\",\n noRiskDetail: \"Blocked or neglected work will appear here when the project starts drifting.\",\n noEvidence: \"No recent evidence yet\",\n noEvidenceDetail: \"Completed work and logged activity will appear here as the project moves.\",\n compatibility: \"Compatibility mode\",\n compatibilityDescription: \"This project comes from an older snapshot format. You can review it here, but editing the project itself needs the updated backend.\",\n addTask: \"Add task\",\n editProject: \"Edit project\",\n openGoal: \"Open life goal\",\n sectionHealth: \"Project health\",\n fieldStatus: \"Status\",\n fieldProgress: \"Progress\",\n fieldMomentum: \"Momentum\",\n sectionEvidence: \"Recent evidence\"\n },\n goalDetail: {\n eyebrow: \"Life goal\",\n missingTitle: \"This life goal is not available\",\n missingDescription: \"Forge cannot find this life goal in the current snapshot. Return to the goals view and choose an active one.\",\n backToGoals: \"Back to goals\",\n heroBadgeOne: \"{count} project\",\n heroBadgeOther: \"{count} projects\",\n commandEyebrow: \"Goal status\",\n commandTitle: \"Progress, next push, risk, and evidence\",\n commandDescription: \"Use this page to see what is advancing the goal, what should move next, and where support is needed.\",\n signalProgress: \"Progress\",\n signalNext: \"Next push\",\n signalRisk: \"Risk\",\n signalEvidence: \"Evidence\",\n progressTitle: \"{progress}% with {count} completed tasks\",\n progressDetail: \"{xp} XP is already banked on this goal.\",\n noProject: \"No active project yet\",\n noProjectDetail: \"Add a project so this goal has a concrete execution path.\",\n needsProject: \"Needs project\",\n nextMove: \"Next move: {value}\",\n noRisk: \"No drift signal right now\",\n noRiskDetail: \"If this goal starts slipping, Forge will surface that pressure here.\",\n noEvidence: \"No recent evidence yet\",\n noEvidenceDetail: \"Completed tasks, project motion, and agent actions will appear here as proof of progress.\",\n edit: \"Edit life goal\",\n addProject: \"Add project\",\n sectionProjects: \"Projects advancing this goal\",\n noProjects: \"This goal does not have an active project yet. Add one to turn the goal into practical motion.\",\n addNextTask: \"Add the next task\",\n sectionHealth: \"Goal health\",\n fieldProgress: \"Progress\",\n fieldCompletedTasks: \"Completed tasks\",\n fieldXpBanked: \"XP banked\",\n sectionEvidence: \"Recent evidence\",\n noEvidenceLogged: \"No evidence has been logged for this goal yet. Task completions, project updates, and agent actions will appear here.\"\n }\n }\n };\n}\n\nexport const en = createEnglishDictionary();\n\nexport const fr: typeof en = {\n common: {\n actions: {\n cancel: \"Annuler\",\n close: \"Fermer\",\n create: \"Créer\",\n edit: \"Modifier\",\n inspect: \"Inspecter\",\n open: \"Ouvrir\",\n refresh: \"Actualiser\",\n retry: \"Réessayer\",\n save: \"Enregistrer\",\n reset: \"Réinitialiser les filtres\",\n view: \"Voir\"\n },\n labels: {\n loading: \"Chargement\",\n backgroundActivity: \"Activité en arrière-plan\",\n syncInProgress: \"Synchronisation en cours\",\n connectionState: \"État de la connexion\",\n errorCode: \"Code d'erreur : {code}\",\n noDate: \"Aucune date\",\n noProject: \"Aucun projet lié\",\n noGoal: \"Aucun objectif de vie lié\",\n noExecutionNote: \"Aucune note d'exécution pour le moment.\",\n noRunNote: \"Aucune note d'exécution enregistrée.\",\n released: \"Libérée\",\n stable: \"Stable\",\n timedOut: \"Expirée\",\n waiting: \"En attente\",\n today: \"Aujourd'hui\"\n },\n enums: {\n taskStatus: {\n backlog: \"Backlog\",\n focus: \"Priorité\",\n in_progress: \"En cours\",\n blocked: \"Bloqué\",\n done: \"Terminé\"\n },\n priority: {\n critical: \"Critique\",\n high: \"Élevée\",\n medium: \"Moyenne\",\n low: \"Basse\"\n },\n effort: {\n marathon: \"Marathon\",\n deep: \"Approfondi\",\n light: \"Léger\"\n },\n energy: {\n high: \"Haute\",\n steady: \"Stable\",\n low: \"Basse\"\n },\n projectStatus: {\n active: \"Actif\",\n paused: \"En pause\",\n completed: \"Terminé\"\n },\n goalHorizon: {\n quarter: \"Trimestre\",\n year: \"Année\",\n lifetime: \"Vie entière\"\n }\n },\n shell: {\n appName: \"The Kinetic Forge\",\n appMark: \"FORGE\",\n more: \"Plus\",\n command: \"Commande\",\n moreRoutesEyebrow: \"Autres vues\",\n moreRoutesTitle: \"Parcourir Forge\",\n moreRoutesDescription: \"Utilisez ce panneau pour accéder aux vues secondaires sans surcharger la barre inférieure.\",\n loadingEyebrow: \"Forge\",\n loadingTitle: \"Chargement de Forge\",\n loadingDescription: \"Vérification de votre session opérateur et chargement du dernier instantané.\",\n sessionEyebrow: \"Session opérateur Forge\",\n stateEyebrow: \"État de Forge\",\n settled: \"À jour\",\n savingOne: \"Enregistrement de {count} modification\",\n savingOther: \"Enregistrement de {count} modifications\",\n refreshingOne: \"Actualisation de {count} vue\",\n refreshingOther: \"Actualisation de {count} vues\",\n collapseSidebar: \"Réduire la barre latérale\",\n expandSidebar: \"Déployer la barre latérale\",\n rail: {\n taskBackToKanban: \"Retour au Kanban\",\n taskOpenToday: \"Ouvrir Aujourd'hui\",\n projectAll: \"Tous les projets\",\n projectGoals: \"Architecture des objectifs\",\n goalAll: \"Tous les objectifs\",\n goalProjects: \"Projets actifs\",\n psycheHub: \"Hub Psyche\",\n psycheReports: \"Rapports\",\n overview: \"Vue d'ensemble\",\n today: \"Aujourd'hui\"\n },\n momentum: {\n title: \"Momentum\",\n streak: \"Série\",\n xp: \"XP\",\n momentum: \"Momentum\",\n streakBadgeOne: \"{count} jour de série\",\n streakBadgeOther: \"{count} jours de série\",\n weeklyXp: \"{count} XP cette semaine\",\n liveMomentum: \"{count}% de momentum\",\n psycheMode: \"Psyche active\"\n }\n },\n routeLabels: {\n overview: \"Vue d'ensemble\",\n goals: \"Objectifs\",\n projects: \"Projets\",\n kanban: \"Kanban\",\n today: \"Aujourd'hui\",\n psyche: \"Psyche\",\n activity: \"Activité\",\n insights: \"Insights\",\n review: \"Revue\",\n settings: \"Réglages\"\n },\n routeDetails: {\n overview: \"Voyez les priorités, le momentum et les preuves récentes au même endroit.\",\n goals: \"Reliez la direction long terme au travail du quotidien.\",\n projects: \"Suivez les initiatives qui font avancer vos objectifs.\",\n kanban: \"Faites progresser le travail actif sans perdre le contexte.\",\n today: \"Concentrez aujourd'hui sur le prochain mouvement le plus net.\",\n psyche: \"Réfléchissez avec structure sur vos valeurs, vos schémas et vos rapports.\",\n activity: \"Relisez la trace visible de ce qui a changé et quand.\",\n insights: \"Stockez et relisez coaching, analyses et recommandations.\",\n review: \"Relisez la semaine et préparez la prochaine poussée.\",\n settings: \"Gérez la collaboration, la sécurité et vos préférences.\"\n },\n navigation: {\n openRoute: \"Ouvrir {label}\",\n create: \"Créer\",\n createTitle: \"Créer dans Forge\",\n createDescription: \"Choisissez ce que vous voulez ajouter ensuite.\",\n closeCreateMenu: \"Fermer le menu de création\",\n newGoal: \"Nouvel objectif de vie\",\n newGoalDescription: \"Définir une direction à long terme.\",\n newProject: \"Nouveau projet\",\n newProjectDescription: \"Ajouter une initiative concrète sous un objectif de vie.\",\n newTask: \"Nouvelle tâche\",\n newTaskDescription: \"Capturer la prochaine étape actionnable dans un projet.\"\n },\n commandPalette: {\n searchPlaceholder: \"Aller à une vue, un objectif, un projet ou une tâche prioritaire\",\n noResults: \"Aucune commande ne correspond à cette recherche.\",\n categoryRoute: \"Vue\",\n categoryGoal: \"Objectif\",\n categoryProject: \"Projet\",\n categoryTask: \"Tâche\",\n routeOverview: \"Ouvrir la vue d'ensemble.\",\n routeToday: \"Ouvrir aujourd'hui.\",\n routeKanban: \"Ouvrir le tableau.\",\n routePsyche: \"Ouvrir Psyche.\",\n routeGoals: \"Ouvrir vos objectifs de vie.\",\n routeProjects: \"Ouvrir vos projets.\",\n routeReview: \"Ouvrir la revue hebdomadaire.\",\n routeSettings: \"Ouvrir les réglages.\",\n openLifeGoal: \"Ouvrir l'objectif de vie\",\n openFocusTask: \"Ouvrir la tâche prioritaire\"\n },\n pageState: {\n loadingTitle: \"Préparation en cours\",\n loadingDescription: \"Chargement des dernières données Forge pour cette vue.\"\n },\n settings: {\n localeLabel: \"Langue\",\n localeDescription: \"Choisissez la langue utilisée dans Forge.\",\n localeEnglish: \"Anglais\",\n localeFrench: \"Français\",\n localeSaved: \"Langue enregistrée\"\n },\n overview: {\n heroEyebrow: \"Vue stratégique\",\n heroEmptyTitle: \"Prêt à démarrer\",\n heroDescription: \"Voyez vos objectifs, projets actifs, tâches en cours et preuves récentes au même endroit.\",\n emptyTitle: \"Pas encore de vue d'ensemble\",\n emptyDescription: \"Créez un objectif de vie, un projet ou une tâche pour donner à Forge une base réelle.\",\n emptyAction: \"Ouvrir les objectifs de vie\",\n commandEyebrow: \"Vue de commande\",\n commandTitle: \"Maintenant, ensuite, risques et preuves récentes\",\n commandDescription: \"Cette vue doit montrer ce qui mérite votre attention maintenant, ce qui vient ensuite, où la dérive apparaît et les progrès déjà visibles.\",\n sectionGoals: \"Objectifs de vie actifs\",\n sectionProjects: \"Projets actifs\",\n sectionFocus: \"Priorité du jour\",\n sectionEvidence: \"Preuves récentes\",\n sectionMomentum: \"Noyau de momentum\",\n sectionAttention: \"À surveiller\",\n noGoals: \"Aucun objectif de vie actif pour le moment. Commencez par définir la direction que Forge doit soutenir.\",\n noProjects: \"Aucun projet actif. Ajoutez un projet pour transformer un objectif en travail concret.\",\n noFocus: \"Aucune tâche prioritaire pour le moment. Faites passer une tâche en priorité quand vous savez quoi faire ensuite.\",\n noEvidence: \"Aucune preuve enregistrée pour le moment. Le travail accompli et l'activité journalisée apparaîtront ici.\",\n noProjectYet: \"Pas encore de projet\",\n noAttention: \"Aucun signal majeur de dérive pour le moment. Forge affichera ici les objectifs négligés.\",\n metricsLevel: \"Niveau\",\n metricsWeeklyXp: \"XP hebdo\",\n metricsFocusTasks: \"Tâches prioritaires\",\n metricsOverdue: \"En retard\"\n },\n todayPage: {\n heroEyebrow: \"Aujourd'hui\",\n heroEmptyTitle: \"Pas encore de direction du jour\",\n heroDescription: \"Commencez une tâche, gagnez de l'XP et gardez la journée claire.\",\n emptyTitle: \"Pas encore de piste du jour\",\n emptyDescription: \"Ajoutez des objectifs, des tâches ou des cibles de récompense pour que Forge puisse construire une journée utile.\",\n emptyAction: \"Ouvrir les objectifs de vie\",\n commandEyebrow: \"Commande du jour\",\n commandTitle: \"Directive, quêtes du jour, reprise et ligne d'arrivée\",\n commandDescription: \"Aujourd'hui doit rendre le prochain mouvement utile évident et garder la journée ancrée dans un vrai travail.\",\n questsTitle: \"Quêtes du jour\",\n questsEmpty: \"Pas encore de quêtes du jour. Elles apparaîtront quand Forge aura assez de travail réel et de contexte de récompense.\",\n rewardsTitle: \"Récompenses jalons\",\n rewardsEmpty: \"Aucune récompense jalon active pour le moment. Elles apparaîtront à mesure que la structure de progression se précise.\",\n signalDirective: \"Directive\",\n signalQuest: \"Chaîne de quêtes\",\n signalComeback: \"Reprise\",\n signalFinish: \"Ligne d'arrivée\",\n noDirective: \"Choisissez une tâche claire pour ancrer la journée.\",\n noQuest: \"Aucune chaîne de quêtes active\",\n noQuestDetail: \"Les quêtes du jour doivent renforcer le vrai travail, pas le détourner.\",\n noComeback: \"La fenêtre de reprise est claire\",\n noFinish: \"Gardez la journée nette\",\n noDirectiveDetail: \"Faites passer une vraie tâche en priorité et la vue Aujourd'hui deviendra plus nette.\",\n noFinishDetail: \"Une bonne fin de journée doit alléger demain, pas l'encombrer.\"\n },\n kanban: {\n heroEyebrow: \"Tableau des tâches\",\n heroTitle: \"Tableau des tâches\",\n heroDescription: \"Utilisez le tableau pour faire avancer le travail actif, revoir les blocages et ouvrir les détails quand nécessaire.\",\n emptyTitle: \"Pas encore de tableau\",\n emptyDescription: \"Créez votre première tâche dans un projet pour commencer à utiliser le tableau.\",\n emptyAction: \"Ouvrir les objectifs de vie\",\n healthEyebrow: \"État du tableau\",\n healthTitle: \"Travail visible, priorité, blocages et travail terminé\",\n healthDescription: \"Le tableau doit montrer ce qui est actif, ce qui demande de l'attention et ce qui est déjà terminé.\",\n visibleWork: \"Travail visible\",\n focusWork: \"Priorité actuelle\",\n blockedWork: \"Travail bloqué\",\n completedWork: \"Travail terminé\",\n visibleDetail: \"{hidden} tâches sont hors des filtres actuels.\",\n focusDetailReady: \"Ce sont les tâches les plus prêtes à être reprises maintenant.\",\n focusDetailEmpty: \"Faites passer une tâche du backlog en priorité pour rendre le tableau plus utile.\",\n blockedDetail: \"Ces tâches ont besoin d'une décision, d'un déblocage ou d'une remise à plat avant d'avancer.\",\n blockedDetailEmpty: \"Aucune tâche bloquée pour le moment.\",\n doneDetail: \"Le travail terminé reste ici jusqu'à sa revue ou sa réouverture.\",\n doneDetailEmpty: \"Rien n'a encore été terminé sur ce tableau.\",\n boardFilters: \"Filtres du tableau\",\n filterGoal: \"Objectif\",\n filterOwner: \"Responsable\",\n allGoals: \"Tous les objectifs\",\n allOwners: \"Tous les responsables\",\n noTasksMatch: \"Aucune tâche ne correspond à ces filtres\",\n noTasksMatchDescription: \"Ces filtres masquent toutes les tâches. Réinitialisez-les pour revoir l'ensemble du tableau.\",\n taskContext: \"Détails de la tâche\",\n evidence: \"Activité récente\",\n runHistory: \"Historique d'exécution\",\n noTaskEvidence: \"Aucune activité n'a encore été enregistrée pour cette tâche.\",\n noRunHistory: \"Aucune exécution n'a encore été enregistrée pour cette tâche.\",\n taskPlacement: \"Placement de la tâche\",\n projectLabel: \"Projet : {value}\",\n goalLabel: \"Objectif de vie : {value}\",\n ownerLabel: \"Responsable : {value}\",\n dueLabel: \"Échéance : {value}\",\n openTask: \"Ouvrir la tâche\",\n openProject: \"Ouvrir le projet\",\n openGoal: \"Ouvrir l'objectif de vie\",\n noProjectLinked: \"Aucun projet lié\",\n noGoalLinked: \"Aucun objectif de vie lié\"\n },\n dailyRunway: {\n runwayEyebrow: \"Aujourd'hui\",\n runwayTitle: \"Tâches du jour\",\n prioritiesOne: \"{count} tâche\",\n prioritiesOther: \"{count} tâches\",\n unassigned: \"Non attribué\",\n runwayItem: \"Tâche {index}\",\n noNote: \"Aucune note pour le moment.\",\n inspect: \"Ouvrir la tâche\",\n actionBacklog: \"Commencer\",\n actionFocus: \"Commencer\",\n actionProgress: \"Terminer\",\n actionBlocked: \"Commencer\",\n timelineEyebrow: \"Par statut\",\n timelineTitle: \"Tâches par statut\",\n emptyBucket: \"Rien ici pour le moment.\"\n },\n executionBoard: {\n laneBacklogTitle: \"Backlog\",\n laneBacklogDetail: \"Pas encore commencé\",\n laneFocusTitle: \"Priorité\",\n laneFocusDetail: \"Prêt à être traité\",\n laneProgressTitle: \"En cours\",\n laneProgressDetail: \"En mouvement\",\n laneBlockedTitle: \"Bloqué\",\n laneBlockedDetail: \"Demande de l'attention\",\n laneDoneTitle: \"Terminé\",\n laneDoneDetail: \"Achevé\",\n noExecutionNote: \"Aucune note pour le moment.\",\n reopen: \"Rouvrir\",\n emptyLane: \"Aucune tâche dans cette colonne.\"\n },\n weeklyReview: {\n heroEyebrow: \"Revue hebdomadaire\",\n heroDescription: \"Relisez la semaine, notez ce qui a avancé et décidez de ce qui demande de l'attention ensuite.\",\n summaryEyebrow: \"Résumé hebdomadaire\",\n summaryTitle: \"Cette semaine, les progrès, la récupération et la suite\",\n summaryDescription: \"Utilisez cette revue pour comprendre la semaine et choisir le prochain mouvement utile.\",\n sectionMomentum: \"Résumé du momentum\",\n sectionGoals: \"Point sur les objectifs\",\n sectionWins: \"Progrès\",\n completionBonus: \"Bonus de complétion\",\n finalize: \"Terminer la revue\",\n noWin: \"Aucun progrès enregistré\",\n noWinDetail: \"Même si la semaine a été calme, notez au moins un apprentissage utile.\",\n noRecovery: \"Aucune suggestion de récupération\",\n noRecoveryDetail: \"Si la semaine a été stable, gardez malgré tout une option légère de récupération.\"\n },\n dialogs: {\n closeDialog: \"Fermer la fenêtre\",\n task: {\n eyebrow: \"Tâche\",\n createTitle: \"Créer une tâche\",\n editTitle: \"Modifier la tâche\",\n description: \"Utilisez les tâches pour représenter la prochaine étape concrète dans un projet. Choisissez d'abord le projet pour garder le bon contexte.\",\n project: \"Projet\",\n selectProject: \"Sélectionner un projet\",\n goal: \"Objectif de vie\",\n title: \"Titre\",\n descriptionLabel: \"Description\",\n owner: \"Responsable\",\n xp: \"XP\",\n priority: \"Priorité\",\n status: \"Statut\",\n effort: \"Effort\",\n energy: \"Énergie\",\n dueDate: \"Date d'échéance\",\n tags: \"Tags\",\n save: \"Enregistrer la tâche\",\n create: \"Créer la tâche\"\n },\n project: {\n eyebrow: \"Projet\",\n createTitle: \"Créer un projet\",\n editTitle: \"Modifier le projet\",\n description: \"Utilisez les projets pour transformer un objectif de vie en flux de travail concret avec tâches, preuves et momentum.\",\n goal: \"Objectif de vie\",\n selectGoal: \"Sélectionner un objectif de vie\",\n title: \"Titre\",\n descriptionLabel: \"Description\",\n status: \"Statut\",\n targetXp: \"XP cible\",\n themeColor: \"Couleur du thème\",\n save: \"Enregistrer le projet\",\n create: \"Créer le projet\",\n submitError: \"La mise à jour du projet a échoué.\"\n },\n goal: {\n eyebrow: \"Objectif de vie\",\n createTitle: \"Créer un objectif de vie\",\n editTitle: \"Modifier l'objectif de vie\",\n description: \"Utilisez les objectifs de vie pour définir ce qui compte sur les mois ou les années à venir avant de le décliner en projets.\",\n title: \"Titre\",\n descriptionLabel: \"Description\",\n horizon: \"Horizon\",\n status: \"Statut\",\n targetXp: \"XP cible\",\n themeColor: \"Couleur du thème\",\n tags: \"Domaines de vie et contexte\",\n save: \"Enregistrer l'objectif de vie\",\n create: \"Créer l'objectif de vie\",\n submitError: \"La mise à jour de l'objectif a échoué.\"\n }\n },\n taskDetail: {\n eyebrow: \"Tâche\",\n errorEyebrow: \"Tâche\",\n emptyPayload: \"Forge a renvoyé une charge utile de tâche vide.\",\n heroFallback: \"Utilisez cette page pour mettre à jour la tâche, la faire avancer et garder son contexte clair.\",\n commandEyebrow: \"Commande de tâche\",\n commandTitle: \"Statut, prochaine action, preuves et contexte\",\n commandDescription: \"Cette page doit aider à modifier directement la tâche et à comprendre clairement son contexte.\",\n signalState: \"Statut\",\n signalNext: \"Prochaine action\",\n signalEvidence: \"Activité récente\",\n signalAnchor: \"Projet lié\",\n noStateChange: \"Aucun changement d'état nécessaire\",\n terminalStateDetail: \"Cette tâche est déjà dans un état terminé, sauf si vous décidez de la rouvrir.\",\n noEvidence: \"Aucune activité récente pour le moment\",\n noEvidenceDetail: \"Le travail terminé, les corrections et les sessions apparaîtront ici à mesure que la tâche avance.\",\n noAnchor: \"Aucun projet lié\",\n linkAnchorDetail: \"Reliez cette tâche à un projet ou à un objectif de vie pour que Forge puisse montrer pourquoi elle compte.\",\n edit: \"Modifier la tâche\",\n openProject: \"Ouvrir le projet\",\n openGoal: \"Ouvrir l'objectif de vie\",\n markNotCompleted: \"Marquer comme non terminée\",\n sectionStatus: \"Statut de la tâche\",\n fieldProject: \"Projet\",\n fieldGoal: \"Objectif de vie\",\n fieldDueDate: \"Date d'échéance\",\n pendingMove: \"Déplacement\",\n actionBacklog: \"Passer au backlog\",\n actionFocus: \"Passer en priorité\",\n actionProgress: \"Commencer maintenant\",\n actionBlocked: \"Marquer bloquée\",\n actionDone: \"Marquer terminée\",\n sectionEvidence: \"Activité récente\",\n noVisibleEvidence: \"Aucune activité n'a encore été enregistrée pour cette tâche.\",\n removeLog: \"Supprimer l'entrée\",\n openRelatedItem: \"Ouvrir l'élément lié\",\n sectionRuns: \"Sessions de travail\",\n noRuns: \"Aucune session de travail n'a encore été enregistrée pour cette tâche.\",\n sectionMetadata: \"Autres détails de la tâche\",\n metaOwner: \"Responsable : {value}\",\n metaEffort: \"Effort : {value}\",\n metaEnergy: \"Énergie : {value}\",\n metaCreated: \"Créée : {value}\",\n metaUpdated: \"Dernière mise à jour : {value}\",\n metaCompleted: \"Terminée le : {value}\",\n metaNotCompleted: \"Non terminée\"\n },\n projectDetail: {\n errorEyebrow: \"Projet\",\n heroEyebrow: \"Projet\",\n commandEyebrow: \"État du projet\",\n commandTitle: \"Momentum, prochaine tâche, risque et preuves\",\n commandDescription: \"Utilisez cette page pour voir ce qui avance, ce qui demande votre attention ensuite, et quelles preuves soutiennent déjà le projet.\",\n signalMomentum: \"Momentum\",\n signalNext: \"Prochaine tâche\",\n signalRisk: \"Risque\",\n signalEvidence: \"Preuves\",\n trackedTasksOne: \"{count} tâche suivie\",\n trackedTasksOther: \"{count} tâches suivies\",\n noNextTask: \"Aucune prochaine tâche choisie\",\n noNextTaskDetail: \"Choisissez ou créez une tâche pour donner au projet un prochain mouvement clair.\",\n needsFocus: \"Besoin de priorité\",\n noRisk: \"Aucun risque immédiat\",\n noRiskDetail: \"Le travail bloqué ou négligé apparaîtra ici si le projet commence à dériver.\",\n noEvidence: \"Aucune preuve récente\",\n noEvidenceDetail: \"Le travail terminé et l'activité enregistrée apparaîtront ici à mesure que le projet avance.\",\n compatibility: \"Mode de compatibilité\",\n compatibilityDescription: \"Ce projet provient d'un ancien format d'instantané. Vous pouvez le consulter ici, mais sa modification demande le backend mis à jour.\",\n addTask: \"Ajouter une tâche\",\n editProject: \"Modifier le projet\",\n openGoal: \"Ouvrir l'objectif de vie\",\n sectionHealth: \"Santé du projet\",\n fieldStatus: \"Statut\",\n fieldProgress: \"Progression\",\n fieldMomentum: \"Momentum\",\n sectionEvidence: \"Preuves récentes\"\n },\n goalDetail: {\n eyebrow: \"Objectif de vie\",\n missingTitle: \"Cet objectif de vie n'est pas disponible\",\n missingDescription: \"Forge ne trouve pas cet objectif de vie dans l'instantané actuel. Revenez à la vue des objectifs et choisissez-en un actif.\",\n backToGoals: \"Retour aux objectifs\",\n heroBadgeOne: \"{count} projet\",\n heroBadgeOther: \"{count} projets\",\n commandEyebrow: \"État de l'objectif\",\n commandTitle: \"Progression, prochain élan, risque et preuves\",\n commandDescription: \"Utilisez cette page pour voir ce qui fait avancer l'objectif, ce qui doit bouger ensuite, et où du soutien est nécessaire.\",\n signalProgress: \"Progression\",\n signalNext: \"Prochain élan\",\n signalRisk: \"Risque\",\n signalEvidence: \"Preuves\",\n progressTitle: \"{progress}% avec {count} tâches terminées\",\n progressDetail: \"{xp} XP sont déjà cumulés sur cet objectif.\",\n noProject: \"Aucun projet actif pour le moment\",\n noProjectDetail: \"Ajoutez un projet pour donner à cet objectif un chemin d'exécution concret.\",\n needsProject: \"Projet nécessaire\",\n nextMove: \"Prochaine action : {value}\",\n noRisk: \"Aucun signal de dérive pour le moment\",\n noRiskDetail: \"Si cet objectif commence à glisser, Forge affichera cette pression ici.\",\n noEvidence: \"Aucune preuve récente\",\n noEvidenceDetail: \"Les tâches terminées, le mouvement des projets et les actions d'agents apparaîtront ici comme preuve de progression.\",\n edit: \"Modifier l'objectif de vie\",\n addProject: \"Ajouter un projet\",\n sectionProjects: \"Projets qui font avancer cet objectif\",\n noProjects: \"Cet objectif n'a pas encore de projet actif. Ajoutez-en un pour le transformer en mouvement concret.\",\n addNextTask: \"Ajouter la prochaine tâche\",\n sectionHealth: \"Santé de l'objectif\",\n fieldProgress: \"Progression\",\n fieldCompletedTasks: \"Tâches terminées\",\n fieldXpBanked: \"XP cumulés\",\n sectionEvidence: \"Preuves récentes\",\n noEvidenceLogged: \"Aucune preuve n'a encore été enregistrée pour cet objectif. Les tâches terminées, les mises à jour de projet et les actions d'agents apparaîtront ici.\"\n }\n }\n};\n\nexport const dictionaries = { en, fr } as const;\n\ntype TranslationDictionary = typeof en;\nexport type TranslationKey = LeafPaths<TranslationDictionary>;\ntype TranslationParams = Record<string, string | number | null | undefined>;\n\nfunction resolvePath(dictionary: DictionaryTree, key: string): string | undefined {\n const segments = key.split(\".\");\n let current: string | DictionaryTree | undefined = dictionary;\n for (const segment of segments) {\n if (!current || typeof current === \"string\") {\n return undefined;\n }\n current = current[segment];\n }\n return typeof current === \"string\" ? current : undefined;\n}\n\nfunction interpolate(template: string, params?: TranslationParams) {\n if (!params) {\n return template;\n }\n\n return template.replace(/\\{(\\w+)\\}/g, (_, name: string) => {\n const value = params[name];\n return value === null || value === undefined ? \"\" : String(value);\n });\n}\n\nexport function translate(locale: AppLocale, key: TranslationKey, params?: TranslationParams) {\n const active = resolvePath(dictionaries[locale], key);\n const fallback = resolvePath(dictionaries.en, key);\n const template = active ?? fallback ?? key;\n return interpolate(template, params);\n}\n\ntype I18nValue = {\n locale: AppLocale;\n t: (key: TranslationKey, params?: TranslationParams) => string;\n formatDate: (value: string | null) => string;\n formatDateTime: (value: string) => string;\n formatNumber: (value: number) => string;\n};\n\nconst defaultValue: I18nValue = {\n locale: \"en\",\n t: (key, params) => translate(\"en\", key, params),\n formatDate: (value) => {\n if (!value) {\n return translate(\"en\", \"common.labels.noDate\");\n }\n return new Intl.DateTimeFormat(\"en\", {\n month: \"short\",\n day: \"numeric\"\n }).format(new Date(`${value}T00:00:00.000Z`));\n },\n formatDateTime: (value) =>\n new Intl.DateTimeFormat(\"en\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\"\n }).format(new Date(value)),\n formatNumber: (value) => new Intl.NumberFormat(\"en\").format(value)\n};\n\nconst I18nContext = createContext<I18nValue | null>(null);\n\nexport function I18nProvider({ children, locale }: { children: ReactNode; locale: AppLocale }) {\n const value = useMemo<I18nValue>(\n () => ({\n locale,\n t: (key, params) => translate(locale, key, params),\n formatDate: (value) => {\n if (!value) {\n return translate(locale, \"common.labels.noDate\");\n }\n\n return new Intl.DateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\"\n }).format(new Date(`${value}T00:00:00.000Z`));\n },\n formatDateTime: (value) =>\n new Intl.DateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\"\n }).format(new Date(value)),\n formatNumber: (value) => new Intl.NumberFormat(locale).format(value)\n }),\n [locale]\n );\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n\nexport function useI18n() {\n return useContext(I18nContext) ?? defaultValue;\n}\n","import { motion } from \"framer-motion\";\nimport { Spinner } from \"@/components/ui/spinner\";\nimport { useI18n } from \"@/lib/i18n\";\nimport { cn } from \"@/lib/utils\";\n\nexport function AmbientActivityPill({\n active,\n label,\n className\n}: {\n active: boolean;\n label: string;\n className?: string;\n}) {\n const { t } = useI18n();\n return (\n <motion.div\n initial={false}\n animate={{\n opacity: active ? 1 : 0.55,\n y: 0,\n scale: active ? 1 : 0.98\n }}\n transition={{ duration: 0.24, ease: \"easeOut\" }}\n className={cn(\n \"surface-pulse ambient-glow inline-flex min-h-11 shrink-0 items-center gap-2.5 rounded-full border border-white/8 px-4 py-2 text-left shadow-[0_18px_40px_rgba(3,8,18,0.22)] backdrop-blur-xl\",\n className\n )}\n aria-live=\"polite\"\n >\n <Spinner tone=\"subtle\" className={active ? \"opacity-100\" : \"opacity-45\"} />\n <div className=\"inline-flex min-w-0 items-center gap-2 whitespace-nowrap\">\n <span className=\"type-label text-white/56\">{t(\"common.labels.backgroundActivity\")}</span>\n <span className=\"text-white/30\">•</span>\n <span className=\"truncate text-sm text-white/80\">{label}</span>\n </div>\n </motion.div>\n );\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Badge({\n className,\n tone = \"default\",\n size = \"md\",\n wrap = false,\n ...props\n}: HTMLAttributes<HTMLSpanElement> & { tone?: \"default\" | \"meta\" | \"signal\"; size?: \"sm\" | \"md\"; wrap?: boolean }) {\n return (\n <span\n className={cn(\n \"inline-flex max-w-full items-center rounded-full border border-white/8 bg-white/6 font-medium text-white/78\",\n wrap ? \"whitespace-normal break-words [overflow-wrap:anywhere]\" : \"overflow-hidden text-ellipsis whitespace-nowrap\",\n size === \"sm\" ? \"min-h-7 px-2.5 py-1 text-[12px]\" : \"min-h-8 px-3 py-1.5 text-[12px]\",\n tone === \"meta\" && \"bg-white/[0.04] text-white/58\",\n tone === \"signal\" && \"bg-[rgba(192,193,255,0.12)] text-white/86\",\n className\n )}\n {...props}\n />\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport { FileText, FolderOpen, Heart, ListTodo, Quote, Repeat, Route, Shapes, Target } from \"lucide-react\";\n\nexport type EntityKind = \"goal\" | \"project\" | \"task\" | \"value\" | \"pattern\" | \"behavior\" | \"belief\" | \"mode\" | \"report\";\n\nexport type EntityVisualDefinition = {\n kind: EntityKind;\n label: string;\n icon: LucideIcon;\n iconClassName: string;\n nameClassName: string;\n badgeClassName: string;\n subtleBadgeClassName: string;\n buttonClassName: string;\n};\n\nexport const ENTITY_KINDS: EntityKind[] = [\"goal\", \"project\", \"task\", \"value\", \"pattern\", \"behavior\", \"belief\", \"mode\", \"report\"];\n\nconst ENTITY_VISUALS: Record<EntityKind, EntityVisualDefinition> = {\n goal: {\n kind: \"goal\",\n label: \"Goal\",\n icon: Target,\n iconClassName: \"text-amber-100\",\n nameClassName: \"text-amber-100\",\n badgeClassName:\n \"border-amber-300/24 bg-[linear-gradient(135deg,rgba(251,191,36,0.24),rgba(251,191,36,0.08))] text-amber-50\",\n subtleBadgeClassName: \"border-amber-300/18 bg-[rgba(251,191,36,0.08)] text-amber-100\",\n buttonClassName:\n \"border-amber-300/20 bg-[rgba(251,191,36,0.12)] text-amber-50 hover:bg-[rgba(251,191,36,0.18)]\"\n },\n project: {\n kind: \"project\",\n label: \"Project\",\n icon: FolderOpen,\n iconClassName: \"text-sky-100\",\n nameClassName: \"text-sky-100\",\n badgeClassName:\n \"border-sky-300/24 bg-[linear-gradient(135deg,rgba(56,189,248,0.22),rgba(56,189,248,0.08))] text-sky-50\",\n subtleBadgeClassName: \"border-sky-300/18 bg-[rgba(56,189,248,0.08)] text-sky-100\",\n buttonClassName:\n \"border-sky-300/20 bg-[rgba(56,189,248,0.12)] text-sky-50 hover:bg-[rgba(56,189,248,0.18)]\"\n },\n task: {\n kind: \"task\",\n label: \"Task\",\n icon: ListTodo,\n iconClassName: \"text-indigo-100\",\n nameClassName: \"text-indigo-100\",\n badgeClassName:\n \"border-indigo-300/24 bg-[linear-gradient(135deg,rgba(129,140,248,0.22),rgba(129,140,248,0.08))] text-indigo-50\",\n subtleBadgeClassName: \"border-indigo-300/18 bg-[rgba(129,140,248,0.08)] text-indigo-100\",\n buttonClassName:\n \"border-indigo-300/20 bg-[rgba(129,140,248,0.12)] text-indigo-50 hover:bg-[rgba(129,140,248,0.18)]\"\n },\n value: {\n kind: \"value\",\n label: \"Value\",\n icon: Heart,\n iconClassName: \"text-emerald-100\",\n nameClassName: \"text-emerald-100\",\n badgeClassName:\n \"border-emerald-300/24 bg-[linear-gradient(135deg,rgba(52,211,153,0.24),rgba(52,211,153,0.08))] text-emerald-50\",\n subtleBadgeClassName: \"border-emerald-300/18 bg-[rgba(52,211,153,0.08)] text-emerald-100\",\n buttonClassName:\n \"border-emerald-300/20 bg-[rgba(52,211,153,0.12)] text-emerald-50 hover:bg-[rgba(52,211,153,0.18)]\"\n },\n pattern: {\n kind: \"pattern\",\n label: \"Pattern\",\n icon: Repeat,\n iconClassName: \"text-rose-100\",\n nameClassName: \"text-rose-100\",\n badgeClassName:\n \"border-rose-300/24 bg-[linear-gradient(135deg,rgba(251,113,133,0.24),rgba(251,113,133,0.08))] text-rose-50\",\n subtleBadgeClassName: \"border-rose-300/18 bg-[rgba(251,113,133,0.08)] text-rose-100\",\n buttonClassName:\n \"border-rose-300/20 bg-[rgba(251,113,133,0.12)] text-rose-50 hover:bg-[rgba(251,113,133,0.18)]\"\n },\n behavior: {\n kind: \"behavior\",\n label: \"Behavior\",\n icon: Route,\n iconClassName: \"text-orange-100\",\n nameClassName: \"text-orange-100\",\n badgeClassName:\n \"border-orange-300/24 bg-[linear-gradient(135deg,rgba(251,146,60,0.24),rgba(251,146,60,0.08))] text-orange-50\",\n subtleBadgeClassName: \"border-orange-300/18 bg-[rgba(251,146,60,0.08)] text-orange-100\",\n buttonClassName:\n \"border-orange-300/20 bg-[rgba(251,146,60,0.12)] text-orange-50 hover:bg-[rgba(251,146,60,0.18)]\"\n },\n belief: {\n kind: \"belief\",\n label: \"Belief\",\n icon: Quote,\n iconClassName: \"text-violet-100\",\n nameClassName: \"text-violet-100\",\n badgeClassName:\n \"border-violet-300/24 bg-[linear-gradient(135deg,rgba(167,139,250,0.24),rgba(167,139,250,0.08))] text-violet-50\",\n subtleBadgeClassName: \"border-violet-300/18 bg-[rgba(167,139,250,0.08)] text-violet-100\",\n buttonClassName:\n \"border-violet-300/20 bg-[rgba(167,139,250,0.12)] text-violet-50 hover:bg-[rgba(167,139,250,0.18)]\"\n },\n mode: {\n kind: \"mode\",\n label: \"Mode\",\n icon: Shapes,\n iconClassName: \"text-fuchsia-100\",\n nameClassName: \"text-fuchsia-100\",\n badgeClassName:\n \"border-fuchsia-300/24 bg-[linear-gradient(135deg,rgba(217,70,239,0.24),rgba(217,70,239,0.08))] text-fuchsia-50\",\n subtleBadgeClassName: \"border-fuchsia-300/18 bg-[rgba(217,70,239,0.08)] text-fuchsia-100\",\n buttonClassName:\n \"border-fuchsia-300/20 bg-[rgba(217,70,239,0.12)] text-fuchsia-50 hover:bg-[rgba(217,70,239,0.18)]\"\n },\n report: {\n kind: \"report\",\n label: \"Report\",\n icon: FileText,\n iconClassName: \"text-blue-100\",\n nameClassName: \"text-blue-100\",\n badgeClassName:\n \"border-blue-300/24 bg-[linear-gradient(135deg,rgba(96,165,250,0.24),rgba(96,165,250,0.08))] text-blue-50\",\n subtleBadgeClassName: \"border-blue-300/18 bg-[rgba(96,165,250,0.08)] text-blue-100\",\n buttonClassName:\n \"border-blue-300/20 bg-[rgba(96,165,250,0.12)] text-blue-50 hover:bg-[rgba(96,165,250,0.18)]\"\n }\n};\n\nexport function getEntityVisual(kind: EntityKind): EntityVisualDefinition {\n return ENTITY_VISUALS[kind];\n}\n\nexport function isEntityKind(value: string): value is EntityKind {\n return ENTITY_KINDS.includes(value as EntityKind);\n}\n\nexport function getEntityButtonClassName(kind: EntityKind, selected: boolean): string {\n const visual = getEntityVisual(kind);\n return selected\n ? `border ${visual.buttonClassName}`\n : \"border border-white/8 bg-white/[0.05] text-white/62 hover:bg-white/[0.08] hover:text-white\";\n}\n","import type { HTMLAttributes } from \"react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { getEntityVisual, type EntityKind } from \"@/lib/entity-visuals\";\nimport { cn } from \"@/lib/utils\";\n\nexport type EntityBadgeProps = HTMLAttributes<HTMLSpanElement> & {\n kind: EntityKind;\n label?: string;\n compact?: boolean;\n showIcon?: boolean;\n iconOnly?: boolean;\n gradient?: boolean;\n wrap?: boolean;\n};\n\nexport function EntityBadge({\n kind,\n label,\n compact = false,\n showIcon = true,\n iconOnly = false,\n gradient = true,\n wrap = false,\n className,\n ...props\n}: EntityBadgeProps) {\n const visual = getEntityVisual(kind);\n const Icon = visual.icon;\n\n return (\n <Badge\n size={compact ? \"sm\" : \"md\"}\n wrap={wrap}\n className={cn(\n \"max-w-full min-w-0 gap-1.5 border font-medium\",\n gradient ? visual.badgeClassName : visual.subtleBadgeClassName,\n compact && !iconOnly && \"px-2.5\",\n iconOnly && \"px-2.5\",\n className\n )}\n {...props}\n >\n {showIcon ? <Icon className={cn(\"size-3.5 shrink-0\", visual.iconClassName)} /> : null}\n {iconOnly ? null : <span className={cn(\"min-w-0 max-w-full\", wrap ? \"whitespace-normal break-words [overflow-wrap:anywhere]\" : \"truncate\")}>{label ?? visual.label}</span>}\n </Badge>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { getEntityVisual, type EntityKind } from \"@/lib/entity-visuals\";\nimport { cn } from \"@/lib/utils\";\n\nexport type EntityNameProps = HTMLAttributes<HTMLSpanElement> & {\n kind: EntityKind;\n label: ReactNode;\n variant?: \"inline\" | \"heading\" | \"pill\";\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n showKind?: boolean;\n showIcon?: boolean;\n showBadge?: boolean;\n badgeLabel?: string;\n badgeCompact?: boolean;\n badgeGradient?: boolean;\n lines?: 1 | 2 | 3;\n labelClassName?: string;\n};\n\nconst headingSizeClassName = {\n sm: \"text-base\",\n md: \"text-lg\",\n lg: \"text-2xl\",\n xl: \"text-3xl\"\n} as const;\n\nconst lineClampClassName = {\n 1: \"truncate whitespace-nowrap\",\n 2: \"overflow-hidden whitespace-normal [display:-webkit-box] [-webkit-box-orient:vertical] [-webkit-line-clamp:2]\",\n 3: \"overflow-hidden whitespace-normal [display:-webkit-box] [-webkit-box-orient:vertical] [-webkit-line-clamp:3]\"\n} as const;\n\nexport function EntityName({\n kind,\n label,\n variant = \"inline\",\n size = \"md\",\n showKind = false,\n showIcon = true,\n showBadge = false,\n badgeLabel,\n badgeCompact = true,\n badgeGradient = false,\n lines = 1,\n labelClassName,\n className,\n ...props\n}: EntityNameProps) {\n const visual = getEntityVisual(kind);\n const Icon = visual.icon;\n\n if (variant === \"pill\") {\n return (\n <span\n className={cn(\n \"inline-flex max-w-full items-center gap-2 rounded-full border px-4 py-2 font-medium shadow-[0_10px_28px_rgba(3,8,18,0.18)]\",\n visual.badgeClassName,\n className\n )}\n {...props}\n >\n {showIcon ? <Icon className={cn(\"size-4 shrink-0\", visual.iconClassName)} /> : null}\n <span className={cn(\"min-w-0 max-w-full\", lineClampClassName[lines], labelClassName)}>{label}</span>\n </span>\n );\n }\n\n if (variant === \"heading\") {\n return (\n <span className={cn(\"inline-flex max-w-full min-w-0 items-center gap-3\", className)} {...props}>\n {showBadge ? <EntityBadge kind={kind} label={badgeLabel ?? visual.label} compact={badgeCompact} gradient={badgeGradient} className=\"shrink-0\" /> : null}\n {showKind && !showBadge ? <EntityBadge kind={kind} label={badgeLabel ?? visual.label} compact gradient={false} className=\"shrink-0\" /> : null}\n <span className={cn(\"min-w-0 max-w-full font-display leading-tight\", headingSizeClassName[size], lineClampClassName[lines], visual.nameClassName, labelClassName)}>{label}</span>\n </span>\n );\n }\n\n return (\n <span className={cn(\"inline-flex max-w-full min-w-0 items-center gap-2\", className)} {...props}>\n {showIcon ? <Icon className={cn(\"size-4 shrink-0\", visual.iconClassName)} /> : null}\n {showBadge ? <EntityBadge kind={kind} label={badgeLabel ?? visual.label} compact={badgeCompact} gradient={badgeGradient} className=\"shrink-0\" /> : null}\n {showKind ? <span className={cn(\"text-sm font-medium\", visual.nameClassName)}>{visual.label}</span> : null}\n <span className={cn(\"min-w-0 max-w-full\", lineClampClassName[lines], visual.nameClassName, labelClassName)}>{label}</span>\n </span>\n );\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Input({\n className,\n size: _size,\n ...props\n}: InputHTMLAttributes<HTMLInputElement> & {\n size?: \"md\" | \"lg\";\n}) {\n return (\n <input\n {...props}\n className={cn(\n \"interactive-tap w-full rounded-[22px] border border-white/8 bg-white/6 px-4 py-3 text-[15px] text-white outline-none ring-0 placeholder:text-white/35 focus:border-[rgba(192,193,255,0.35)]\",\n className\n )}\n />\n );\n}\n","import * as Dialog from \"@radix-ui/react-dialog\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ArrowRight, BrainCircuit, BriefcaseBusiness, Clock3, LayoutDashboard, Search, Settings, Target, Zap } from \"lucide-react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { Input } from \"@/components/ui/input\";\nimport { useI18n } from \"@/lib/i18n\";\nimport type { EntityKind } from \"@/lib/entity-visuals\";\nimport type { ForgeSnapshot } from \"@/lib/types\";\n\ntype CommandPaletteProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n snapshot: ForgeSnapshot;\n};\n\ntype CommandItem = {\n id: string;\n title: string;\n detail: string;\n href: string;\n category: string;\n kind?: EntityKind;\n};\n\nexport function CommandPalette({ open, onOpenChange, snapshot }: CommandPaletteProps) {\n const navigate = useNavigate();\n const { t } = useI18n();\n const [query, setQuery] = useState(\"\");\n\n useEffect(() => {\n if (!open) {\n setQuery(\"\");\n }\n }, [open]);\n\n const items = useMemo<CommandItem[]>(() => {\n const coreRoutes: CommandItem[] = [\n { id: \"route-overview\", title: t(\"common.routeLabels.overview\"), detail: t(\"common.commandPalette.routeOverview\"), href: \"/overview\", category: t(\"common.commandPalette.categoryRoute\") },\n { id: \"route-today\", title: t(\"common.routeLabels.today\"), detail: t(\"common.commandPalette.routeToday\"), href: \"/today\", category: t(\"common.commandPalette.categoryRoute\") },\n { id: \"route-kanban\", title: t(\"common.routeLabels.kanban\"), detail: t(\"common.commandPalette.routeKanban\"), href: \"/kanban\", category: t(\"common.commandPalette.categoryRoute\") },\n { id: \"route-psyche\", title: t(\"common.routeLabels.psyche\"), detail: t(\"common.commandPalette.routePsyche\"), href: \"/psyche\", category: t(\"common.commandPalette.categoryRoute\") },\n { id: \"route-goals\", title: t(\"common.routeLabels.goals\"), detail: t(\"common.commandPalette.routeGoals\"), href: \"/goals\", category: t(\"common.commandPalette.categoryRoute\") },\n { id: \"route-projects\", title: t(\"common.routeLabels.projects\"), detail: t(\"common.commandPalette.routeProjects\"), href: \"/projects\", category: t(\"common.commandPalette.categoryRoute\") },\n { id: \"route-review\", title: t(\"common.routeLabels.review\"), detail: t(\"common.commandPalette.routeReview\"), href: \"/review/weekly\", category: t(\"common.commandPalette.categoryRoute\") },\n { id: \"route-settings\", title: t(\"common.routeLabels.settings\"), detail: t(\"common.commandPalette.routeSettings\"), href: \"/settings\", category: t(\"common.commandPalette.categoryRoute\") }\n ];\n\n return [\n ...coreRoutes,\n ...snapshot.dashboard.goals.slice(0, 6).map((goal) => ({\n id: `goal-${goal.id}`,\n title: goal.title,\n detail: t(\"common.commandPalette.openLifeGoal\"),\n href: `/goals/${goal.id}`,\n category: t(\"common.commandPalette.categoryGoal\"),\n kind: \"goal\" as const\n })),\n ...snapshot.dashboard.projects.slice(0, 6).map((project) => ({\n id: `project-${project.id}`,\n title: project.title,\n detail: project.goalTitle,\n href: `/projects/${project.id}`,\n category: t(\"common.commandPalette.categoryProject\"),\n kind: \"project\" as const\n })),\n ...snapshot.overview.topTasks.slice(0, 8).map((task) => ({\n id: `task-${task.id}`,\n title: task.title,\n detail: t(\"common.commandPalette.openFocusTask\"),\n href: `/tasks/${task.id}`,\n category: t(\"common.commandPalette.categoryTask\"),\n kind: \"task\" as const\n }))\n ];\n }, [snapshot, t]);\n\n const filtered = useMemo(() => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) {\n return items.slice(0, 12);\n }\n return items.filter((item) => `${item.title} ${item.detail} ${item.category}`.toLowerCase().includes(normalized)).slice(0, 12);\n }, [items, query]);\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-40 bg-[rgba(5,10,18,0.68)] backdrop-blur-xl\" />\n <Dialog.Content className=\"fixed inset-x-4 top-[12vh] z-50 mx-auto max-w-2xl overflow-hidden rounded-[30px] border border-white/8 bg-[linear-gradient(180deg,rgba(20,28,42,0.98),rgba(12,17,30,0.98))] shadow-[0_32px_90px_rgba(3,8,18,0.45)]\">\n <div className=\"border-b border-white/8 p-4\">\n <div className=\"flex items-center gap-3 rounded-[22px] bg-white/[0.04] px-4 py-3\">\n <Search className=\"size-4 text-white/42\" />\n <Input\n autoFocus\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={t(\"common.commandPalette.searchPlaceholder\")}\n className=\"border-0 bg-transparent px-0 py-0 focus:border-0\"\n />\n </div>\n <div className=\"mt-3 flex flex-wrap gap-2 text-white/50\">\n {[\n { label: t(\"common.routeLabels.overview\"), icon: LayoutDashboard },\n { label: t(\"common.routeLabels.today\"), icon: Clock3 },\n { label: t(\"common.routeLabels.kanban\"), icon: Zap },\n { label: t(\"common.routeLabels.psyche\"), icon: BrainCircuit },\n { label: t(\"common.routeLabels.goals\"), icon: Target },\n { label: t(\"common.routeLabels.projects\"), icon: BriefcaseBusiness },\n { label: t(\"common.routeLabels.settings\"), icon: Settings }\n ].map((entry) => (\n <span key={entry.label} className=\"inline-flex min-h-10 items-center gap-2 rounded-full bg-white/[0.04] px-3 py-2 text-xs text-white/58\">\n <entry.icon className=\"size-3.5\" />\n {entry.label}\n </span>\n ))}\n </div>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto p-3\">\n <div className=\"grid gap-2\">\n {filtered.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className=\"interactive-tap rounded-[22px] bg-white/[0.04] px-4 py-3 text-left transition hover:bg-white/[0.07]\"\n onClick={() => {\n onOpenChange(false);\n navigate(item.href);\n }}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <div className=\"text-sm text-white/46\">{item.category}</div>\n <div className=\"mt-1 type-title-md text-white\">\n {item.kind ? <EntityName kind={item.kind} label={item.title} /> : item.title}\n </div>\n <div className=\"mt-1 text-sm text-white/58\">{item.detail}</div>\n </div>\n <ArrowRight className=\"size-4 text-white/35\" />\n </div>\n </button>\n ))}\n {filtered.length === 0 ? <div className=\"rounded-[22px] bg-white/[0.04] px-4 py-5 text-sm text-white/56\">{t(\"common.commandPalette.noResults\")}</div> : null}\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\n\nexport function RouteTransitionFrame({\n routeKey,\n tone = \"core\",\n children\n}: {\n routeKey: string;\n tone?: \"core\" | \"psyche\";\n children: ReactNode;\n}) {\n const distance = tone === \"psyche\" ? 10 : 18;\n const duration = tone === \"psyche\" ? 0.26 : 0.2;\n\n return (\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={routeKey}\n className=\"w-full max-w-full min-w-0\"\n initial={{ opacity: 0, y: distance }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration, ease: \"easeOut\" }}\n >\n {children}\n </motion.div>\n </AnimatePresence>\n );\n}\n","import type { ButtonHTMLAttributes } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Spinner } from \"@/components/ui/spinner\";\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex min-w-0 max-w-full items-center justify-center gap-2 overflow-hidden whitespace-nowrap rounded-[var(--radius-control)] font-medium leading-none transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[rgba(192,193,255,0.45)] disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n primary: \"bg-[linear-gradient(135deg,rgba(192,193,255,0.36),rgba(192,193,255,0.22))] text-white shadow-[0_12px_30px_rgba(192,193,255,0.08)]\",\n secondary: \"bg-white/8 text-white hover:bg-white/12\",\n ghost: \"bg-transparent text-[var(--primary)] hover:bg-white/6\"\n },\n size: {\n sm: \"min-h-[2.125rem] px-2.5 py-[0.4375rem] text-[13px]\",\n md: \"interactive-tap min-h-10 px-3 py-2 text-[13px]\",\n lg: \"min-h-11 px-4 py-2.5 text-sm\"\n }\n },\n defaultVariants: {\n variant: \"primary\",\n size: \"md\"\n }\n }\n);\n\ntype ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof buttonVariants> & {\n pending?: boolean;\n pendingLabel?: string;\n };\n\nexport function Button({ className, variant, size, pending = false, pendingLabel, children, disabled, ...props }: ButtonProps) {\n return (\n <button className={cn(buttonVariants({ variant, size }), className)} disabled={disabled || pending} aria-busy={pending} {...props}>\n {pending ? <Spinner className=\"size-3.5\" tone=\"subtle\" /> : null}\n <span className=\"inline-flex min-w-0 max-w-full items-center gap-2 overflow-hidden truncate whitespace-nowrap\">\n {pending && pendingLabel ? pendingLabel : children}\n </span>\n </button>\n );\n}\n","import * as Dialog from \"@radix-ui/react-dialog\";\nimport type { ReactNode } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { useI18n } from \"@/lib/i18n\";\n\nexport function SheetScaffold({\n open,\n onOpenChange,\n eyebrow,\n title,\n description,\n children\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n eyebrow: string;\n title: string;\n description?: string;\n children: ReactNode;\n}) {\n const { t } = useI18n();\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-40 bg-[rgba(4,8,18,0.72)] backdrop-blur-xl\" />\n <Dialog.Content className=\"fixed inset-x-4 bottom-4 top-4 z-50 mx-auto flex max-w-xl flex-col overflow-hidden rounded-[32px] border border-white/8 bg-[linear-gradient(180deg,rgba(20,28,42,0.98),rgba(12,17,30,0.98))] shadow-[0_32px_90px_rgba(3,8,18,0.45)]\">\n <div className=\"border-b border-white/8 px-5 py-5\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <div className=\"type-label text-white/46\">{eyebrow}</div>\n <Dialog.Title className=\"mt-2 type-display-section text-white\">{title}</Dialog.Title>\n {description ? <Dialog.Description className=\"mt-3 type-body text-white/64\">{description}</Dialog.Description> : null}\n </div>\n <Button variant=\"secondary\" onClick={() => onOpenChange(false)}>\n {t(\"common.actions.close\")}\n </Button>\n </div>\n </div>\n <div className=\"min-h-0 flex-1 overflow-x-hidden overflow-y-auto p-4\">{children}</div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { useEffect, useId, useRef, useState, type ReactNode } from \"react\";\nimport { CircleHelp } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nexport type FieldHelpDefinition = {\n label?: string;\n description: string;\n};\n\nexport function FieldHint({ children, className }: { children: ReactNode; className?: string }) {\n return <div className={cn(\"text-sm leading-6 text-white/50\", className)}>{children}</div>;\n}\n\nexport function InfoTooltip({\n content,\n label = \"Explain this field\",\n className\n}: {\n content: string;\n label?: string;\n className?: string;\n}) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLSpanElement | null>(null);\n const tooltipId = useId();\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [open]);\n\n return (\n <span\n ref={containerRef}\n className={cn(\"relative inline-flex items-center\", className)}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button\n type=\"button\"\n aria-label={label}\n aria-describedby={open ? tooltipId : undefined}\n aria-expanded={open}\n className=\"inline-flex size-5 items-center justify-center rounded-full text-white/42 transition hover:bg-white/[0.06] hover:text-white/78 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[rgba(192,193,255,0.35)]\"\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n onClick={() => setOpen((current) => !current)}\n >\n <CircleHelp className=\"size-3.5\" />\n </button>\n <span\n id={tooltipId}\n role=\"tooltip\"\n className={cn(\n \"pointer-events-none absolute right-0 top-[calc(100%+0.55rem)] z-40 w-[min(16rem,calc(100vw-2.5rem))] max-w-[calc(100vw-2.5rem)] rounded-[18px] border border-white/8 bg-[rgba(12,17,30,0.96)] px-3 py-2.5 text-sm leading-6 text-white/74 shadow-[0_18px_48px_rgba(3,8,18,0.42)] transition\",\n open ? \"translate-y-0 opacity-100\" : \"translate-y-1 opacity-0\"\n )}\n >\n {content}\n </span>\n </span>\n );\n}\n","import * as Dialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { ArrowLeft, ArrowRight, Check, X } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { FieldHint, InfoTooltip } from \"@/components/ui/info-tooltip\";\nimport { useI18n } from \"@/lib/i18n\";\nimport { cn } from \"@/lib/utils\";\n\nconst MOBILE_BREAKPOINT_QUERY = \"(max-width: 1023px)\";\n\nexport type QuestionFlowStep<TValue> = {\n id: string;\n eyebrow?: string;\n title: string;\n description?: string;\n render: (value: TValue, setValue: (patch: Partial<TValue>) => void) => ReactNode;\n};\n\nfunction useIsMobileFlow() {\n const [isMobile, setIsMobile] = useState(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(MOBILE_BREAKPOINT_QUERY).matches;\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(MOBILE_BREAKPOINT_QUERY);\n const updateMatch = (event: MediaQueryListEvent) => {\n setIsMobile(event.matches);\n };\n\n setIsMobile(mediaQuery.matches);\n\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", updateMatch);\n return () => mediaQuery.removeEventListener(\"change\", updateMatch);\n }\n\n mediaQuery.addListener(updateMatch);\n return () => mediaQuery.removeListener(updateMatch);\n }, []);\n\n return isMobile;\n}\n\nexport function FlowField({\n label,\n description,\n labelHelp,\n hint,\n error,\n children\n}: {\n label: string;\n description?: string;\n labelHelp?: string;\n hint?: string;\n error?: string | null;\n children: ReactNode;\n}) {\n return (\n <label className=\"grid gap-2\">\n <span className=\"flex items-center gap-2 text-sm font-medium text-white\">\n <span>{label}</span>\n {labelHelp ? <InfoTooltip content={labelHelp} label={`Explain ${label}`} /> : null}\n </span>\n {description ? <span className=\"text-sm leading-6 text-white/54\">{description}</span> : null}\n {children}\n {hint ? <FieldHint>{hint}</FieldHint> : null}\n {error ? <span className=\"text-sm text-rose-300\">{error}</span> : null}\n </label>\n );\n}\n\nexport function FlowChoiceGrid({\n options,\n value,\n onChange,\n columns = 2\n}: {\n options: Array<{ value: string; label: string; description?: string }>;\n value: string;\n onChange: (value: string) => void;\n columns?: 2 | 3;\n}) {\n return (\n <div className={cn(\"grid gap-3\", columns === 3 ? \"md:grid-cols-3\" : \"md:grid-cols-2\")}>\n {options.map((option) => {\n const selected = option.value === value;\n return (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"rounded-[22px] border px-4 py-4 text-left transition\",\n selected\n ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white shadow-[0_18px_36px_rgba(5,12,24,0.24)]\"\n : \"border-white/8 bg-white/[0.04] text-white/72 hover:bg-white/[0.07]\"\n )}\n onClick={() => onChange(option.value)}\n >\n <div className=\"font-medium\">{option.label}</div>\n {option.description ? <div className=\"mt-2 text-sm leading-6 text-white/54\">{option.description}</div> : null}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function QuestionFlowDialog<TValue>({\n open,\n onOpenChange,\n eyebrow,\n title,\n description,\n value,\n onChange,\n steps,\n onSubmit,\n submitLabel,\n pending = false,\n pendingLabel,\n error\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n eyebrow: string;\n title: string;\n description: string;\n value: TValue;\n onChange: (value: TValue) => void;\n steps: Array<QuestionFlowStep<TValue>>;\n onSubmit: () => Promise<void>;\n submitLabel: string;\n pending?: boolean;\n pendingLabel?: string;\n error?: string | null;\n}) {\n const { t } = useI18n();\n const isMobile = useIsMobileFlow();\n const [stepIndex, setStepIndex] = useState(0);\n const step = steps[stepIndex];\n\n useEffect(() => {\n if (!open) {\n setStepIndex(0);\n }\n }, [open]);\n\n const setValue = (patch: Partial<TValue>) => {\n onChange({ ...value, ...patch });\n };\n\n const totalSteps = steps.length;\n const progress = totalSteps === 0 ? 0 : ((stepIndex + 1) / totalSteps) * 100;\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-40 bg-[rgba(4,8,18,0.72)] backdrop-blur-xl\" />\n <Dialog.Content\n data-testid=\"question-flow-dialog\"\n className={cn(\n \"fixed z-50 flex flex-col overflow-y-auto border border-white/8 bg-[linear-gradient(180deg,rgba(21,28,44,0.985),rgba(12,17,30,0.985))] shadow-[0_30px_90px_rgba(3,8,18,0.45)]\",\n isMobile\n ? \"inset-x-3 bottom-3 top-4 rounded-[30px]\"\n : \"left-1/2 top-1/2 h-[min(52rem,calc(100vh-1rem))] w-[min(56rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 rounded-[34px]\"\n )}\n >\n <Dialog.Title className=\"sr-only\">{title}</Dialog.Title>\n <Dialog.Description className=\"sr-only\">{description}</Dialog.Description>\n\n <div className=\"sticky top-0 z-10 border-b border-white/8 bg-[rgba(12,17,30,0.9)] px-4 py-2.5 backdrop-blur-xl md:px-6\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-3 text-[11px] uppercase tracking-[0.18em] text-white/42\">\n <span className=\"truncate\">{eyebrow}</span>\n <span className=\"whitespace-nowrap\">\n Step {stepIndex + 1} of {totalSteps}\n </span>\n </div>\n <div className=\"mt-2 h-1.5 rounded-full bg-white/[0.06]\">\n <motion.div\n className=\"h-full rounded-full bg-[linear-gradient(90deg,rgba(192,193,255,0.9),rgba(125,211,252,0.82))]\"\n animate={{ width: `${progress}%` }}\n transition={{ duration: 0.35, ease: \"easeOut\" }}\n />\n </div>\n </div>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n aria-label={t(\"common.dialogs.closeDialog\")}\n className=\"rounded-full bg-white/6 p-2 text-white/65 transition hover:bg-white/10 hover:text-white\"\n >\n <X className=\"size-4\" />\n </button>\n </Dialog.Close>\n </div>\n </div>\n\n <div data-testid=\"question-flow-canvas\" className=\"flex-1 px-4 py-4 md:px-6 md:py-5\">\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={step.id}\n initial={{ opacity: 0, y: 18 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -18 }}\n transition={{ duration: 0.28, ease: \"easeOut\" }}\n className=\"flex min-h-full flex-col gap-5\"\n >\n <div className=\"flex min-h-full flex-col justify-start\">\n {step.eyebrow ? <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-[var(--secondary)]\">{step.eyebrow}</div> : null}\n <h3 className=\"mt-1.5 font-display text-[clamp(1.45rem,2.15vw,2rem)] leading-tight text-white\">{step.title}</h3>\n {step.description ? <p className=\"mt-1.5 max-w-3xl text-sm leading-6 text-white/58\">{step.description}</p> : null}\n <div className=\"mt-5 grid flex-1 content-start gap-5\">{step.render(value, setValue)}</div>\n </div>\n {error ? <div className=\"rounded-[20px] border border-rose-400/20 bg-rose-400/10 px-4 py-3 text-sm text-rose-200\">{error}</div> : null}\n </motion.div>\n </AnimatePresence>\n </div>\n\n <div className=\"sticky bottom-0 border-t border-white/8 bg-[rgba(12,17,30,0.92)] px-4 py-2.5 backdrop-blur-xl md:px-6\">\n <div className=\"flex items-center justify-end gap-2 sm:justify-between\">\n <div className=\"hidden min-w-0 shrink text-[12px] text-white/45 sm:block\">\n <span className=\"truncate whitespace-nowrap\">\n Step {stepIndex + 1}/{totalSteps}\n </span>\n </div>\n <div className=\"flex shrink-0 flex-nowrap items-center gap-1.5 overflow-x-auto sm:gap-2\">\n {stepIndex > 0 ? (\n <Button type=\"button\" variant=\"secondary\" className=\"min-w-max px-3 text-[12px]\" onClick={() => setStepIndex((current) => Math.max(0, current - 1))}>\n <ArrowLeft className=\"size-4\" />\n Back\n </Button>\n ) : (\n <Dialog.Close asChild>\n <Button type=\"button\" variant=\"secondary\" className=\"min-w-max px-3 text-[12px]\">\n {t(\"common.actions.cancel\")}\n </Button>\n </Dialog.Close>\n )}\n {stepIndex < totalSteps - 1 ? (\n <Button type=\"button\" className=\"min-w-max px-3 text-[12px]\" onClick={() => setStepIndex((current) => Math.min(totalSteps - 1, current + 1))}>\n Continue\n <ArrowRight className=\"size-4\" />\n </Button>\n ) : (\n <Button type=\"button\" className=\"min-w-max px-3 text-[12px]\" pending={pending} pendingLabel={pendingLabel} onClick={() => void onSubmit()}>\n <Check className=\"size-4\" />\n {submitLabel}\n </Button>\n )}\n </div>\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import type { TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Textarea({ className, ...props }: TextareaHTMLAttributes<HTMLTextAreaElement>) {\n return (\n <textarea\n {...props}\n className={cn(\n \"min-h-28 w-full rounded-[22px] border border-white/8 bg-white/6 px-4 py-3 text-[15px] text-white outline-none placeholder:text-white/35 focus:border-[rgba(192,193,255,0.35)]\",\n className\n )}\n />\n );\n}\n","import { z } from \"zod\";\n\nexport const appLocaleSchema = z.enum([\"en\", \"fr\"]);\n\nexport const goalMutationSchema = z.object({\n title: z.string().trim().min(1, \"Title is required\"),\n description: z.string().trim(),\n horizon: z.enum([\"quarter\", \"year\", \"lifetime\"]),\n status: z.enum([\"active\", \"paused\", \"completed\"]),\n targetPoints: z.coerce.number().int().min(25).max(10000),\n themeColor: z.string().trim().regex(/^#[0-9a-fA-F]{6}$/, \"Theme color must be a valid hex value\"),\n tagIds: z.array(z.string())\n});\n\nexport const projectMutationSchema = z.object({\n goalId: z.string().trim().min(1, \"Life goal is required\"),\n title: z.string().trim().min(1, \"Title is required\"),\n description: z.string().trim(),\n status: z.enum([\"active\", \"paused\", \"completed\"]),\n targetPoints: z.coerce.number().int().min(25).max(10000),\n themeColor: z.string().trim().regex(/^#[0-9a-fA-F]{6}$/, \"Theme color must be a valid hex value\")\n});\n\nexport const settingsMutationSchema = z.object({\n profile: z.object({\n operatorName: z.string().trim().min(1, \"Name is required\"),\n operatorEmail: z.string().trim().min(1, \"Email is required\"),\n operatorTitle: z.string().trim().min(1, \"Title is required\")\n }),\n notifications: z.object({\n goalDriftAlerts: z.boolean(),\n dailyQuestReminders: z.boolean(),\n achievementCelebrations: z.boolean()\n }),\n execution: z.object({\n maxActiveTasks: z.coerce.number().int().min(1).max(8),\n timeAccountingMode: z.enum([\"split\", \"parallel\", \"primary_only\"])\n }),\n themePreference: z.enum([\"obsidian\", \"solar\", \"system\"]),\n localePreference: appLocaleSchema\n});\n\nexport const createAgentTokenSchema = z.object({\n label: z.string().trim().min(1, \"Label is required\"),\n agentLabel: z.string().trim().min(1, \"Agent name is required\"),\n agentType: z.string().trim().min(1, \"Agent type is required\"),\n description: z.string().trim(),\n trustLevel: z.enum([\"standard\", \"trusted\", \"autonomous\"]),\n autonomyMode: z.enum([\"approval_required\", \"scoped_write\", \"autonomous\"]),\n approvalMode: z.enum([\"approval_by_default\", \"high_impact_only\", \"none\"]),\n scopes: z.array(z.string().trim().min(1)).min(1)\n});\n\nexport const createInsightSchema = z.object({\n originType: z.enum([\"system\", \"user\", \"agent\"]),\n originAgentId: z.string().trim(),\n originLabel: z.string().trim(),\n entityType: z.string().trim(),\n entityId: z.string().trim(),\n timeframeLabel: z.string().trim(),\n title: z.string().trim().min(1, \"Title is required\"),\n summary: z.string().trim().min(1, \"Summary is required\"),\n recommendation: z.string().trim().min(1, \"Recommendation is required\"),\n rationale: z.string().trim(),\n confidence: z.coerce.number().min(0).max(1),\n ctaLabel: z.string().trim().min(1, \"CTA label is required\")\n});\n\nexport const quickTaskSchema = z.object({\n title: z.string().trim().min(1, \"Title is required\"),\n description: z.string().trim(),\n owner: z.string().trim().min(1, \"Owner is required\"),\n goalId: z.string().trim(),\n projectId: z.string().trim().min(1, \"Project is required\"),\n priority: z.enum([\"low\", \"medium\", \"high\", \"critical\"]),\n status: z.enum([\"backlog\", \"focus\", \"in_progress\", \"blocked\", \"done\"]),\n effort: z.enum([\"light\", \"deep\", \"marathon\"]),\n energy: z.enum([\"low\", \"steady\", \"high\"]),\n dueDate: z.string().trim(),\n points: z.coerce.number().int().min(5).max(500),\n tagIds: z.array(z.string())\n});\n\nexport const tagMutationSchema = z.object({\n name: z.string().trim().min(1, \"Name is required\"),\n kind: z.enum([\"value\", \"category\", \"execution\"]),\n color: z.string().trim().regex(/^#[0-9a-fA-F]{6}$/, \"Color must be a valid hex value\"),\n description: z.string().trim()\n});\n\nexport type GoalMutationInput = z.infer<typeof goalMutationSchema>;\nexport type ProjectMutationInput = z.infer<typeof projectMutationSchema>;\nexport type SettingsMutationInput = z.infer<typeof settingsMutationSchema>;\nexport type CreateAgentTokenInput = z.infer<typeof createAgentTokenSchema>;\nexport type CreateInsightInput = z.infer<typeof createInsightSchema>;\nexport type QuickTaskInput = z.infer<typeof quickTaskSchema>;\nexport type TagMutationInput = z.infer<typeof tagMutationSchema>;\n","import { useEffect, useState } from \"react\";\nimport { FlowChoiceGrid, FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { useI18n } from \"@/lib/i18n\";\nimport { goalMutationSchema, type GoalMutationInput } from \"@/lib/schemas\";\nimport type { DashboardGoal, Tag } from \"@/lib/types\";\n\nexport const defaultGoalValues: GoalMutationInput = {\n title: \"\",\n description: \"\",\n horizon: \"year\",\n status: \"active\",\n targetPoints: 400,\n themeColor: \"#c8a46b\",\n tagIds: []\n};\n\nexport function goalToFormValues(goal: DashboardGoal): GoalMutationInput {\n return {\n title: goal.title,\n description: goal.description,\n horizon: goal.horizon,\n status: goal.status,\n targetPoints: goal.targetPoints,\n themeColor: goal.themeColor,\n tagIds: goal.tagIds\n };\n}\n\nexport function GoalDialog({\n open,\n pending = false,\n editingGoal,\n tags,\n onOpenChange,\n onSubmit\n}: {\n open: boolean;\n pending?: boolean;\n editingGoal: DashboardGoal | null;\n tags: Tag[];\n onOpenChange: (open: boolean) => void;\n onSubmit: (input: GoalMutationInput, goalId?: string) => Promise<void>;\n}) {\n const { t } = useI18n();\n const [draft, setDraft] = useState<GoalMutationInput>(defaultGoalValues);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [fieldErrors, setFieldErrors] = useState<Record<string, string | undefined>>({});\n\n const updateFieldErrors = (errors: Record<string, string[] | undefined>) => {\n setFieldErrors(Object.fromEntries(Object.entries(errors).map(([key, value]) => [key, value?.[0]])));\n };\n\n useEffect(() => {\n if (!open) {\n return;\n }\n setSubmitError(null);\n setFieldErrors({});\n setDraft(editingGoal ? goalToFormValues(editingGoal) : defaultGoalValues);\n }, [editingGoal, open]);\n\n const steps: Array<QuestionFlowStep<GoalMutationInput>> = [\n {\n id: \"intent\",\n eyebrow: \"Direction\",\n title: \"Name the arc and why it matters\",\n description: \"Start with the long-horizon direction itself. We can refine cadence, tags, and visual tone after the intent is clear.\",\n render: (value, setValue) => (\n <>\n <FlowField label={t(\"common.dialogs.goal.title\")} error={fieldErrors.title ?? null}>\n <Input value={value.title} onChange={(event) => setValue({ title: event.target.value })} placeholder=\"Build a durable body and calm energy\" />\n </FlowField>\n <FlowField label={t(\"common.dialogs.goal.descriptionLabel\")}>\n <Textarea\n value={value.description}\n onChange={(event) => setValue({ description: event.target.value })}\n placeholder=\"Describe the direction in plain language so projects can attach to it later.\"\n />\n </FlowField>\n </>\n )\n },\n {\n id: \"cadence\",\n eyebrow: \"Cadence\",\n title: \"Choose the horizon and current posture\",\n description: \"Keep this simple: how long does this arc run, and is it currently active, paused, or already complete?\",\n render: (value, setValue) => (\n <>\n <FlowField label={t(\"common.dialogs.goal.horizon\")}>\n <FlowChoiceGrid\n value={value.horizon}\n onChange={(next) => setValue({ horizon: next as GoalMutationInput[\"horizon\"] })}\n options={[\n { value: \"quarter\", label: t(\"common.enums.goalHorizon.quarter\"), description: \"Tight strategic push for the coming months.\" },\n { value: \"year\", label: t(\"common.enums.goalHorizon.year\"), description: \"A full-cycle objective for this year.\" },\n { value: \"lifetime\", label: t(\"common.enums.goalHorizon.lifetime\"), description: \"A long-running life arc that projects can keep serving.\" }\n ]}\n columns={3}\n />\n </FlowField>\n <FlowField label={t(\"common.dialogs.goal.status\")}>\n <FlowChoiceGrid\n value={value.status}\n onChange={(next) => setValue({ status: next as GoalMutationInput[\"status\"] })}\n options={[\n { value: \"active\", label: t(\"common.enums.projectStatus.active\"), description: \"This is live right now.\" },\n { value: \"paused\", label: t(\"common.enums.projectStatus.paused\"), description: \"Keep it visible, but do not push it right now.\" },\n { value: \"completed\", label: t(\"common.enums.projectStatus.completed\"), description: \"You have already fulfilled this arc.\" }\n ]}\n />\n </FlowField>\n </>\n )\n },\n {\n id: \"signal\",\n eyebrow: \"Signal\",\n title: \"Set the target and visual signature\",\n description: \"Give Forge enough signal to show progress and make this arc recognizable throughout the app.\",\n render: (value, setValue) => (\n <>\n <FlowField label={t(\"common.dialogs.goal.targetXp\")} error={fieldErrors.targetPoints ?? null}>\n <Input type=\"number\" value={value.targetPoints} onChange={(event) => setValue({ targetPoints: Number(event.target.value) || 0 })} />\n </FlowField>\n <FlowField label={t(\"common.dialogs.goal.themeColor\")} error={fieldErrors.themeColor ?? null}>\n <div className=\"flex items-center gap-3 rounded-[22px] border border-white/8 bg-white/6 px-4 py-3\">\n <input className=\"h-10 w-12 rounded-lg border border-white/10 bg-transparent\" type=\"color\" value={value.themeColor} onChange={(event) => setValue({ themeColor: event.target.value })} />\n <Input className=\"border-none bg-transparent px-0 py-0\" value={value.themeColor} onChange={(event) => setValue({ themeColor: event.target.value })} />\n </div>\n </FlowField>\n <FlowField label={t(\"common.dialogs.goal.tags\")}>\n <div className=\"flex flex-wrap gap-2\">\n {tags.map((tag) => {\n const selected = value.tagIds.includes(tag.id);\n return (\n <button\n key={tag.id}\n type=\"button\"\n className={`rounded-full px-3 py-2 text-sm transition ${selected ? \"bg-white/16 text-white\" : \"bg-white/6 text-white/58 hover:bg-white/10 hover:text-white\"}`}\n onClick={() =>\n setValue({\n tagIds: selected ? value.tagIds.filter((entry) => entry !== tag.id) : [...value.tagIds, tag.id]\n })\n }\n >\n {tag.name}\n </button>\n );\n })}\n </div>\n </FlowField>\n </>\n )\n }\n ];\n\n return (\n <QuestionFlowDialog\n open={open}\n onOpenChange={onOpenChange}\n eyebrow={t(\"common.dialogs.goal.eyebrow\")}\n title={editingGoal ? t(\"common.dialogs.goal.editTitle\") : t(\"common.dialogs.goal.createTitle\")}\n description={t(\"common.dialogs.goal.description\")}\n value={draft}\n onChange={setDraft}\n steps={steps}\n pending={pending}\n pendingLabel={editingGoal ? t(\"common.dialogs.goal.save\") : t(\"common.dialogs.goal.create\")}\n submitLabel={editingGoal ? t(\"common.dialogs.goal.save\") : t(\"common.dialogs.goal.create\")}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const parsed = goalMutationSchema.safeParse(draft);\n if (!parsed.success) {\n updateFieldErrors(parsed.error.flatten().fieldErrors);\n setSubmitError(\"Some answers still need attention before this goal arc can be saved.\");\n return;\n }\n\n setFieldErrors({});\n\n try {\n await onSubmit(parsed.data, editingGoal?.id);\n setDraft(defaultGoalValues);\n onOpenChange(false);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : t(\"common.dialogs.goal.submitError\"));\n }\n }}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { FlowChoiceGrid, FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { useI18n } from \"@/lib/i18n\";\nimport { projectMutationSchema, type ProjectMutationInput } from \"@/lib/schemas\";\nimport type { Goal, ProjectSummary } from \"@/lib/types\";\n\nexport const defaultProjectValues: ProjectMutationInput = {\n goalId: \"\",\n title: \"\",\n description: \"\",\n status: \"active\",\n targetPoints: 240,\n themeColor: \"#c0c1ff\"\n};\n\nfunction projectToFormValues(project: ProjectSummary): ProjectMutationInput {\n return {\n goalId: project.goalId,\n title: project.title,\n description: project.description,\n status: project.status,\n targetPoints: project.targetPoints,\n themeColor: project.themeColor\n };\n}\n\nexport function ProjectDialog({\n open,\n goals,\n editingProject,\n initialGoalId,\n onOpenChange,\n onSubmit\n}: {\n open: boolean;\n goals: Goal[];\n editingProject: ProjectSummary | null;\n initialGoalId?: string | null;\n onOpenChange: (open: boolean) => void;\n onSubmit: (input: ProjectMutationInput, projectId?: string) => Promise<void>;\n}) {\n const { t } = useI18n();\n const [draft, setDraft] = useState<ProjectMutationInput>(defaultProjectValues);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [fieldErrors, setFieldErrors] = useState<Record<string, string | undefined>>({});\n\n const updateFieldErrors = (errors: Record<string, string[] | undefined>) => {\n setFieldErrors(Object.fromEntries(Object.entries(errors).map(([key, value]) => [key, value?.[0]])));\n };\n\n useEffect(() => {\n if (!open) {\n return;\n }\n setSubmitError(null);\n setFieldErrors({});\n setDraft(\n editingProject\n ? projectToFormValues(editingProject)\n : {\n ...defaultProjectValues,\n goalId: initialGoalId ?? \"\"\n }\n );\n }, [editingProject, initialGoalId, open]);\n\n const steps: Array<QuestionFlowStep<ProjectMutationInput>> = [\n {\n id: \"anchor\",\n eyebrow: \"Anchor\",\n title: \"Attach the project to the right goal\",\n description: \"Projects should serve one clear life-goal arc, so start by picking the direction this initiative belongs to.\",\n render: (value, setValue) => (\n <FlowField label={t(\"common.dialogs.project.goal\")} error={fieldErrors.goalId ?? null}>\n <div className=\"grid gap-3\">\n {goals.map((goal) => {\n const selected = goal.id === value.goalId;\n return (\n <button\n key={goal.id}\n type=\"button\"\n className={`rounded-[22px] border px-4 py-4 text-left transition ${\n selected ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white\" : \"border-white/8 bg-white/[0.04] text-white/72 hover:bg-white/[0.07]\"\n }`}\n onClick={() => setValue({ goalId: goal.id })}\n >\n <EntityName kind=\"goal\" label={goal.title} className=\"max-w-full\" />\n <div className=\"mt-2 text-sm leading-6 text-white/54\">{goal.description || \"No strategic note attached yet.\"}</div>\n </button>\n );\n })}\n </div>\n </FlowField>\n )\n },\n {\n id: \"shape\",\n eyebrow: \"Shape\",\n title: \"Name the initiative and the work it will make possible\",\n description: \"Keep the project concrete. The title should sound like something you can actually move forward this season.\",\n render: (value, setValue) => (\n <>\n <FlowField label={t(\"common.dialogs.project.title\")} error={fieldErrors.title ?? null}>\n <Input value={value.title} onChange={(event) => setValue({ title: event.target.value })} placeholder=\"Launch the new creative practice system\" />\n </FlowField>\n <FlowField label={t(\"common.dialogs.project.descriptionLabel\")}>\n <Textarea value={value.description} onChange={(event) => setValue({ description: event.target.value })} placeholder=\"Describe the outcome and the kind of work this project will contain.\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"signal\",\n eyebrow: \"Signal\",\n title: \"Set the project's posture and progress target\",\n description: \"This keeps the board, reward system, and detail views aligned without forcing you through a giant settings form.\",\n render: (value, setValue) => (\n <>\n <FlowField label={t(\"common.dialogs.project.status\")}>\n <FlowChoiceGrid\n value={value.status}\n onChange={(next) => setValue({ status: next as ProjectMutationInput[\"status\"] })}\n options={[\n { value: \"active\", label: t(\"common.enums.projectStatus.active\"), description: \"Push this initiative now.\" },\n { value: \"paused\", label: t(\"common.enums.projectStatus.paused\"), description: \"Keep it available without active pressure.\" },\n { value: \"completed\", label: t(\"common.enums.projectStatus.completed\"), description: \"This initiative has landed.\" }\n ]}\n />\n </FlowField>\n <FlowField label={t(\"common.dialogs.project.targetXp\")} error={fieldErrors.targetPoints ?? null}>\n <Input type=\"number\" value={value.targetPoints} onChange={(event) => setValue({ targetPoints: Number(event.target.value) || 0 })} />\n </FlowField>\n <FlowField label={t(\"common.dialogs.project.themeColor\")} error={fieldErrors.themeColor ?? null}>\n <div className=\"flex items-center gap-3 rounded-[22px] border border-white/8 bg-white/6 px-4 py-3\">\n <input className=\"h-10 w-12 rounded-lg border border-white/10 bg-transparent\" type=\"color\" value={value.themeColor} onChange={(event) => setValue({ themeColor: event.target.value })} />\n <Input className=\"border-none bg-transparent px-0 py-0\" value={value.themeColor} onChange={(event) => setValue({ themeColor: event.target.value })} />\n </div>\n </FlowField>\n </>\n )\n }\n ];\n\n return (\n <QuestionFlowDialog\n open={open}\n onOpenChange={onOpenChange}\n eyebrow={t(\"common.dialogs.project.eyebrow\")}\n title={editingProject ? t(\"common.dialogs.project.editTitle\") : t(\"common.dialogs.project.createTitle\")}\n description={t(\"common.dialogs.project.description\")}\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel={editingProject ? t(\"common.dialogs.project.save\") : t(\"common.dialogs.project.create\")}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const parsed = projectMutationSchema.safeParse(draft);\n if (!parsed.success) {\n updateFieldErrors(parsed.error.flatten().fieldErrors);\n setSubmitError(\"A couple of answers still need attention before this project can be saved.\");\n return;\n }\n\n setFieldErrors({});\n\n try {\n await onSubmit(parsed.data, editingProject?.id);\n onOpenChange(false);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : t(\"common.dialogs.project.submitError\"));\n }\n }}\n />\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { FlowChoiceGrid, FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { useI18n } from \"@/lib/i18n\";\nimport { quickTaskSchema, type QuickTaskInput } from \"@/lib/schemas\";\nimport type { Goal, ProjectSummary, Tag, Task } from \"@/lib/types\";\n\nexport const defaultTaskValues: QuickTaskInput = {\n title: \"\",\n description: \"\",\n owner: \"Albert\",\n goalId: \"\",\n projectId: \"\",\n priority: \"medium\",\n status: \"focus\",\n effort: \"deep\",\n energy: \"steady\",\n dueDate: \"\",\n points: 60,\n tagIds: []\n};\n\nfunction taskToFormValues(task: Task): QuickTaskInput {\n return {\n title: task.title,\n description: task.description,\n owner: task.owner,\n goalId: task.goalId ?? \"\",\n projectId: task.projectId ?? \"\",\n priority: task.priority,\n status: task.status,\n effort: task.effort,\n energy: task.energy,\n dueDate: task.dueDate ?? \"\",\n points: task.points,\n tagIds: task.tagIds\n };\n}\n\nexport function TaskDialog({\n open,\n goals,\n projects,\n tags,\n editingTask,\n initialProjectId,\n onOpenChange,\n onSubmit\n}: {\n open: boolean;\n goals: Goal[];\n projects: ProjectSummary[];\n tags: Tag[];\n editingTask: Task | null;\n initialProjectId?: string | null;\n onOpenChange: (open: boolean) => void;\n onSubmit: (input: QuickTaskInput, taskId?: string) => Promise<void>;\n}) {\n const { t } = useI18n();\n const safeGoals = goals ?? [];\n const safeProjects = projects ?? [];\n const safeTags = tags ?? [];\n const [draft, setDraft] = useState<QuickTaskInput>(defaultTaskValues);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [fieldErrors, setFieldErrors] = useState<Record<string, string | undefined>>({});\n\n const updateFieldErrors = (errors: Record<string, string[] | undefined>) => {\n setFieldErrors(Object.fromEntries(Object.entries(errors).map(([key, value]) => [key, value?.[0]])));\n };\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n setSubmitError(null);\n setFieldErrors({});\n\n setDraft(\n editingTask\n ? taskToFormValues(editingTask)\n : {\n ...defaultTaskValues,\n projectId: initialProjectId ?? \"\",\n goalId: safeProjects.find((project) => project.id === initialProjectId)?.goalId ?? \"\"\n }\n );\n }, [editingTask, initialProjectId, open, safeProjects]);\n\n const selectedProject = useMemo(\n () => safeProjects.find((project) => project.id === draft.projectId) ?? null,\n [draft.projectId, safeProjects]\n );\n\n useEffect(() => {\n if (!selectedProject) {\n return;\n }\n if (draft.goalId !== selectedProject.goalId) {\n setDraft((current) => ({ ...current, goalId: selectedProject.goalId }));\n }\n }, [draft.goalId, selectedProject]);\n\n const steps: Array<QuestionFlowStep<QuickTaskInput>> = [\n {\n id: \"anchor\",\n eyebrow: \"Placement\",\n title: \"Choose where this task belongs\",\n description: \"Link the task to the right project so the board, life goal, and rewards stay connected.\",\n render: (value, setValue) => (\n <>\n <FlowField\n label={t(\"common.dialogs.task.project\")}\n labelHelp=\"Projects are the main home for tasks. Pick the stream of work this task belongs to.\"\n error={fieldErrors.projectId ?? null}\n >\n <div className=\"grid gap-3\">\n {safeProjects.map((project) => {\n const selected = project.id === value.projectId;\n return (\n <button\n key={project.id}\n type=\"button\"\n className={`rounded-[22px] border px-4 py-4 text-left transition ${\n selected ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white\" : \"border-white/8 bg-white/[0.04] text-white/72 hover:bg-white/[0.07]\"\n }`}\n onClick={() => setValue({ projectId: project.id, goalId: project.goalId })}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <EntityName kind=\"project\" label={project.title} className=\"min-w-0\" showIcon={false} />\n <EntityBadge kind=\"goal\" label={project.goalTitle} compact gradient={false} />\n </div>\n <div className=\"mt-2 text-sm leading-6 text-white/54\">{project.description}</div>\n </button>\n );\n })}\n </div>\n </FlowField>\n <FlowField\n label={t(\"common.dialogs.task.goal\")}\n labelHelp=\"The life goal is shown automatically from the project so you can still see the bigger reason this task matters.\"\n >\n <Input readOnly value={selectedProject ? safeGoals.find((goal) => goal.id === selectedProject.goalId)?.title ?? \"\" : \"\"} placeholder=\"The linked life goal will appear here.\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"shape\",\n eyebrow: \"Shape\",\n title: \"Define the next concrete move\",\n description: \"Keep the task small enough to be actionable and strong enough to clearly move the project forward.\",\n render: (value, setValue) => (\n <>\n <FlowField label={t(\"common.dialogs.task.title\")} error={fieldErrors.title ?? null}>\n <Input value={value.title} onChange={(event) => setValue({ title: event.target.value })} placeholder=\"Draft the first mode atlas sketch\" />\n </FlowField>\n <FlowField label={t(\"common.dialogs.task.descriptionLabel\")}>\n <Textarea value={value.description} onChange={(event) => setValue({ description: event.target.value })} placeholder=\"Describe the outcome or boundary conditions for this move.\" />\n </FlowField>\n <FlowField label={t(\"common.dialogs.task.owner\")} labelHelp=\"The owner is the person or role expected to carry this task.\" error={fieldErrors.owner ?? null}>\n <Input value={value.owner} onChange={(event) => setValue({ owner: event.target.value })} placeholder=\"Albert\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"execution\",\n eyebrow: \"Execution\",\n title: \"Set priority, status, effort, and energy\",\n description: \"This is the minimum the execution engine needs in order to place the task well and show the right next move.\",\n render: (value, setValue) => (\n <>\n <FlowField label={t(\"common.dialogs.task.priority\")} labelHelp=\"Priority controls how strongly Forge should surface this task in the board and daily views.\">\n <FlowChoiceGrid\n value={value.priority}\n onChange={(next) => setValue({ priority: next as QuickTaskInput[\"priority\"] })}\n options={[\n { value: \"low\", label: t(\"common.enums.priority.low\") },\n { value: \"medium\", label: t(\"common.enums.priority.medium\") },\n { value: \"high\", label: t(\"common.enums.priority.high\") },\n { value: \"critical\", label: t(\"common.enums.priority.critical\") }\n ]}\n />\n </FlowField>\n <FlowField label={t(\"common.dialogs.task.status\")} labelHelp=\"Status tells Forge whether the task is waiting, ready for focus, active, blocked, or done.\">\n <FlowChoiceGrid\n value={value.status}\n onChange={(next) => setValue({ status: next as QuickTaskInput[\"status\"] })}\n options={[\n { value: \"backlog\", label: t(\"common.enums.taskStatus.backlog\") },\n { value: \"focus\", label: t(\"common.enums.taskStatus.focus\") },\n { value: \"in_progress\", label: t(\"common.enums.taskStatus.in_progress\") },\n { value: \"blocked\", label: t(\"common.enums.taskStatus.blocked\") }\n ]}\n />\n </FlowField>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField label={t(\"common.dialogs.task.effort\")} labelHelp=\"Effort describes how much concentration and time this task usually needs.\">\n <FlowChoiceGrid\n value={value.effort}\n onChange={(next) => setValue({ effort: next as QuickTaskInput[\"effort\"] })}\n options={[\n { value: \"light\", label: t(\"common.enums.effort.light\") },\n { value: \"deep\", label: t(\"common.enums.effort.deep\") },\n { value: \"marathon\", label: t(\"common.enums.effort.marathon\") }\n ]}\n />\n </FlowField>\n <FlowField label={t(\"common.dialogs.task.energy\")} labelHelp=\"Energy helps you match this task to a low-energy, steady, or high-energy moment.\">\n <FlowChoiceGrid\n value={value.energy}\n onChange={(next) => setValue({ energy: next as QuickTaskInput[\"energy\"] })}\n options={[\n { value: \"low\", label: t(\"common.enums.energy.low\") },\n { value: \"steady\", label: t(\"common.enums.energy.steady\") },\n { value: \"high\", label: t(\"common.enums.energy.high\") }\n ]}\n />\n </FlowField>\n </div>\n </>\n )\n },\n {\n id: \"signal\",\n eyebrow: \"Reward and timing\",\n title: \"Set the reward and timing details\",\n description: \"This keeps the daily surfaces honest without forcing you through a bloated last-mile form.\",\n render: (value, setValue) => (\n <>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField label={t(\"common.dialogs.task.xp\")} labelHelp=\"XP is the reward weight for finishing this task. Higher XP should mean more meaningful work.\" error={fieldErrors.points ?? null}>\n <Input type=\"number\" value={value.points} onChange={(event) => setValue({ points: Number(event.target.value) || 0 })} placeholder=\"60\" />\n </FlowField>\n <FlowField label={t(\"common.dialogs.task.dueDate\")} labelHelp=\"Only add a due date when timing really matters for this task.\">\n <Input type=\"date\" value={value.dueDate} onChange={(event) => setValue({ dueDate: event.target.value })} />\n </FlowField>\n </div>\n <FlowField label={t(\"common.dialogs.task.tags\")}>\n <div className=\"flex flex-wrap gap-2\">\n {safeTags.map((tag) => {\n const selected = value.tagIds.includes(tag.id);\n return (\n <button\n key={tag.id}\n type=\"button\"\n className={`rounded-full px-3 py-2 text-sm transition ${selected ? \"bg-white/16 text-white\" : \"bg-white/6 text-white/58 hover:bg-white/10 hover:text-white\"}`}\n onClick={() =>\n setValue({\n tagIds: selected ? value.tagIds.filter((entry) => entry !== tag.id) : [...value.tagIds, tag.id]\n })\n }\n >\n {tag.name}\n </button>\n );\n })}\n </div>\n </FlowField>\n </>\n )\n }\n ];\n\n return (\n <QuestionFlowDialog\n open={open}\n onOpenChange={onOpenChange}\n eyebrow={t(\"common.dialogs.task.eyebrow\")}\n title={editingTask ? t(\"common.dialogs.task.editTitle\") : t(\"common.dialogs.task.createTitle\")}\n description={t(\"common.dialogs.task.description\")}\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel={editingTask ? t(\"common.dialogs.task.save\") : t(\"common.dialogs.task.create\")}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const parsed = quickTaskSchema.safeParse(draft);\n if (!parsed.success) {\n updateFieldErrors(parsed.error.flatten().fieldErrors);\n setSubmitError(\"A few task details still need attention before this move can be saved.\");\n return;\n }\n\n setFieldErrors({});\n\n try {\n await onSubmit(parsed.data, editingTask?.id);\n onOpenChange(false);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Unable to save this task right now.\");\n }\n }}\n />\n );\n}\n","import * as Dialog from \"@radix-ui/react-dialog\";\nimport { createPortal } from \"react-dom\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Sparkles, X } from \"lucide-react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { GoalDialog } from \"@/components/goal-dialog\";\nimport { ProjectDialog } from \"@/components/project-dialog\";\nimport { TaskDialog } from \"@/components/task-dialog\";\nimport { Button } from \"@/components/ui/button\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { useI18n } from \"@/lib/i18n\";\nimport type { EntityKind } from \"@/lib/entity-visuals\";\nimport type { GoalMutationInput, ProjectMutationInput, QuickTaskInput } from \"@/lib/schemas\";\nimport type { DashboardGoal, Goal, ProjectSummary, Tag } from \"@/lib/types\";\n\nconst MOBILE_BREAKPOINT_QUERY = \"(max-width: 1023px)\";\n\ntype CreateAction = {\n id: \"goal\" | \"project\" | \"task\" | \"value\" | \"pattern\" | \"behavior\" | \"report\";\n kind: EntityKind;\n group: \"Execution\" | \"Psyche\";\n title: string;\n description: string;\n onSelect: () => void;\n};\n\nfunction useIsMobileCreateSheet() {\n const [isMobile, setIsMobile] = useState(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(MOBILE_BREAKPOINT_QUERY).matches;\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(MOBILE_BREAKPOINT_QUERY);\n const updateMatch = (event: MediaQueryListEvent) => {\n setIsMobile(event.matches);\n };\n\n setIsMobile(mediaQuery.matches);\n\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", updateMatch);\n return () => mediaQuery.removeEventListener(\"change\", updateMatch);\n }\n\n mediaQuery.addListener(updateMatch);\n return () => mediaQuery.removeListener(updateMatch);\n }, []);\n\n return isMobile;\n}\n\nfunction CreateActionButton({\n kind,\n title,\n description,\n onClick\n}: {\n kind: EntityKind;\n title: string;\n description: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"w-full min-w-0 rounded-[22px] border border-white/8 bg-white/[0.04] px-4 py-4 text-left transition hover:bg-white/[0.08]\"\n onClick={onClick}\n >\n <EntityBadge kind={kind} label={title} compact gradient={false} className=\"max-w-full\" />\n <div className=\"mt-1 text-sm text-white/55\">{description}</div>\n </button>\n );\n}\n\nexport function CreateMenu({\n goals,\n projects,\n tags,\n onCreateGoal,\n onCreateProject,\n onCreateTask,\n className\n}: {\n goals: DashboardGoal[];\n projects: ProjectSummary[];\n tags: Tag[];\n onCreateGoal: (input: GoalMutationInput) => Promise<void>;\n onCreateProject: (input: ProjectMutationInput) => Promise<void>;\n onCreateTask: (input: QuickTaskInput) => Promise<void>;\n className?: string;\n}) {\n const { t } = useI18n();\n const navigate = useNavigate();\n const safeGoals = goals ?? [];\n const safeProjects = projects ?? [];\n const safeTags = tags ?? [];\n const [menuOpen, setMenuOpen] = useState(false);\n const [goalOpen, setGoalOpen] = useState(false);\n const [projectOpen, setProjectOpen] = useState(false);\n const [taskOpen, setTaskOpen] = useState(false);\n const [desktopMenuPosition, setDesktopMenuPosition] = useState<{ top: number; right: number } | null>(null);\n const isMobile = useIsMobileCreateSheet();\n const menuRef = useRef<HTMLDivElement | null>(null);\n const desktopMenuRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!menuOpen || isMobile) {\n return;\n }\n\n const syncDesktopMenuPosition = () => {\n const rect = menuRef.current?.getBoundingClientRect();\n if (!rect) {\n return;\n }\n\n setDesktopMenuPosition({\n top: Math.max(24, rect.top - 18),\n right: Math.max(24, window.innerWidth - rect.right)\n });\n };\n\n syncDesktopMenuPosition();\n\n const handlePointerDown = (event: PointerEvent) => {\n if (menuRef.current?.contains(event.target as Node)) {\n return;\n }\n if (desktopMenuRef.current?.contains(event.target as Node)) {\n return;\n }\n setMenuOpen(false);\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setMenuOpen(false);\n }\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleEscape);\n window.addEventListener(\"resize\", syncDesktopMenuPosition);\n window.addEventListener(\"scroll\", syncDesktopMenuPosition, true);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleEscape);\n window.removeEventListener(\"resize\", syncDesktopMenuPosition);\n window.removeEventListener(\"scroll\", syncDesktopMenuPosition, true);\n };\n }, [isMobile, menuOpen]);\n\n const createActions: CreateAction[] = [\n {\n id: \"goal\",\n kind: \"goal\",\n group: \"Execution\",\n title: t(\"common.navigation.newGoal\"),\n description: t(\"common.navigation.newGoalDescription\"),\n onSelect: () => {\n setMenuOpen(false);\n setGoalOpen(true);\n }\n },\n {\n id: \"project\",\n kind: \"project\",\n group: \"Execution\",\n title: t(\"common.navigation.newProject\"),\n description: t(\"common.navigation.newProjectDescription\"),\n onSelect: () => {\n setMenuOpen(false);\n setProjectOpen(true);\n }\n },\n {\n id: \"task\",\n kind: \"task\",\n group: \"Execution\",\n title: t(\"common.navigation.newTask\"),\n description: t(\"common.navigation.newTaskDescription\"),\n onSelect: () => {\n setMenuOpen(false);\n setTaskOpen(true);\n }\n },\n {\n id: \"value\",\n kind: \"value\",\n group: \"Psyche\",\n title: \"Value\",\n description: \"Place one value into the goal, project, and task constellation.\",\n onSelect: () => {\n setMenuOpen(false);\n navigate(\"/psyche/values?create=1\");\n }\n },\n {\n id: \"pattern\",\n kind: \"pattern\",\n group: \"Psyche\",\n title: \"Pattern\",\n description: \"Map a loop, its payoff, its cost, and the response you want.\",\n onSelect: () => {\n setMenuOpen(false);\n navigate(\"/psyche/patterns?create=1\");\n }\n },\n {\n id: \"behavior\",\n kind: \"behavior\",\n group: \"Psyche\",\n title: \"Behavior\",\n description: \"Describe the move first, then classify it and link it.\",\n onSelect: () => {\n setMenuOpen(false);\n navigate(\"/psyche/behaviors?create=1\");\n }\n },\n {\n id: \"report\",\n kind: \"report\",\n group: \"Psyche\",\n title: \"Report\",\n description: \"Start a Spark-to-Pivot reflective chain.\",\n onSelect: () => {\n setMenuOpen(false);\n navigate(\"/psyche/reports?create=1\");\n }\n }\n ];\n\n return (\n <>\n <div\n ref={menuRef}\n className={className}\n style={\n isMobile\n ? {\n right: \"max(1rem, calc(var(--forge-safe-area-right) + 1rem))\",\n bottom: \"var(--forge-mobile-create-bottom)\"\n }\n : undefined\n }\n >\n <Button\n type=\"button\"\n data-testid=\"create-floating-trigger\"\n aria-expanded={menuOpen}\n aria-haspopup=\"dialog\"\n onClick={() => setMenuOpen((current) => (isMobile ? true : !current))}\n className={`min-w-max max-w-[calc(100vw-2rem)] shrink-0 rounded-full px-3.5 py-2 text-[12px] shadow-[0_20px_60px_rgba(4,8,18,0.34)] ${menuOpen ? \"bg-[linear-gradient(135deg,rgba(192,193,255,0.52),rgba(125,211,252,0.24))] text-white\" : \"\"}`}\n >\n <Sparkles className={`size-4 transition ${menuOpen ? \"text-white\" : \"text-white/72\"}`} />\n {t(\"common.navigation.create\")}\n </Button>\n </div>\n\n {menuOpen && !isMobile && typeof document !== \"undefined\" && desktopMenuPosition\n ? createPortal(\n <div\n ref={desktopMenuRef}\n data-testid=\"create-desktop-menu\"\n className=\"fixed z-50 w-[min(26rem,calc(100vw-2rem))] max-h-[min(34rem,calc(100vh-4rem))] overflow-y-auto rounded-[30px] border border-white/8 bg-[linear-gradient(180deg,rgba(18,24,40,0.985),rgba(10,15,27,0.985))] p-4 shadow-[0_28px_90px_rgba(3,8,18,0.46)]\"\n style={{\n top: `${desktopMenuPosition.top}px`,\n right: `${desktopMenuPosition.right}px`,\n transform: \"translateY(-100%)\"\n }}\n >\n <div className=\"text-[11px] uppercase tracking-[0.18em] text-white/42\">Create</div>\n <div className=\"mt-2 text-lg font-medium text-white\">Start the next move</div>\n <div className=\"mt-1 text-sm leading-6 text-white/56\">Pick one thing to create. The flow keeps the first step light and visible.</div>\n {([\"Execution\", \"Psyche\"] as const).map((group) => (\n <div key={group} className=\"mt-4\">\n <div className=\"text-[11px] uppercase tracking-[0.18em] text-white/38\">{group}</div>\n <div className=\"mt-2 grid gap-2\">\n {createActions\n .filter((action) => action.group === group)\n .map((action) => (\n <CreateActionButton\n key={action.id}\n kind={action.kind}\n title={action.title}\n description={action.description}\n onClick={action.onSelect}\n />\n ))}\n </div>\n </div>\n ))}\n </div>,\n document.body\n )\n : null}\n\n <Dialog.Root open={menuOpen && isMobile} onOpenChange={setMenuOpen}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-40 bg-[rgba(4,8,18,0.72)] backdrop-blur-xl lg:hidden\" />\n <Dialog.Content\n data-testid=\"create-mobile-sheet\"\n className=\"fixed inset-x-4 bottom-28 z-50 flex max-h-[min(30rem,calc(100vh-8rem))] flex-col overflow-hidden rounded-[28px] border border-white/8 bg-[linear-gradient(180deg,rgba(24,31,50,0.98),rgba(15,21,36,0.98))] p-0 shadow-[0_30px_90px_rgba(3,8,18,0.45)] lg:hidden\"\n style={{\n left: \"max(1rem, calc(var(--forge-safe-area-left) + 1rem))\",\n right: \"max(1rem, calc(var(--forge-safe-area-right) + 1rem))\",\n bottom: \"calc(var(--forge-mobile-nav-clearance) - 0.5rem)\"\n }}\n >\n <div className=\"flex items-start justify-between gap-4 border-b border-white/8 px-5 py-5\">\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.navigation.create\")}</div>\n <Dialog.Title className=\"mt-2 font-display text-2xl text-white\">{t(\"common.navigation.createTitle\")}</Dialog.Title>\n <Dialog.Description className=\"mt-2 text-sm leading-6 text-white/60\">\n {t(\"common.navigation.createDescription\")}\n </Dialog.Description>\n </div>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n aria-label={t(\"common.navigation.closeCreateMenu\")}\n className=\"rounded-full bg-white/6 p-2 text-white/65 transition hover:bg-white/10 hover:text-white\"\n >\n <X className=\"size-4\" />\n </button>\n </Dialog.Close>\n </div>\n <div className=\"overflow-y-auto p-4 overscroll-contain\">\n {([\"Execution\", \"Psyche\"] as const).map((group) => (\n <div key={group} className=\"mt-1 grid gap-2 first:mt-0\">\n <div className=\"px-1 text-[11px] uppercase tracking-[0.18em] text-white/38\">{group}</div>\n {createActions\n .filter((action) => action.group === group)\n .map((action) => (\n <CreateActionButton\n key={action.id}\n kind={action.kind}\n title={action.title}\n description={action.description}\n onClick={action.onSelect}\n />\n ))}\n </div>\n ))}\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n\n <GoalDialog\n open={goalOpen}\n editingGoal={null}\n tags={safeTags}\n onOpenChange={setGoalOpen}\n onSubmit={async (input) => {\n await onCreateGoal(input);\n }}\n />\n\n <ProjectDialog\n open={projectOpen}\n goals={safeGoals as Goal[]}\n editingProject={null}\n onOpenChange={setProjectOpen}\n onSubmit={async (input) => {\n await onCreateProject(input);\n }}\n />\n\n <TaskDialog\n open={taskOpen}\n goals={safeGoals as Goal[]}\n projects={safeProjects}\n tags={safeTags}\n editingTask={null}\n onOpenChange={setTaskOpen}\n onSubmit={async (input) => {\n await onCreateTask(input);\n }}\n />\n </>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Play, Search, Timer, TimerReset, X } from \"lucide-react\";\nimport { SheetScaffold } from \"@/components/experience/sheet-scaffold\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport type { ProjectSummary, Task, TimeAccountingMode } from \"@/lib/types\";\nimport { cn } from \"@/lib/utils\";\n\ntype TimerStartInput = {\n timerMode: \"planned\" | \"unlimited\";\n plannedDurationSeconds: number | null;\n};\n\ntype StartWorkComposerProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n tasks: Task[];\n projects: ProjectSummary[];\n activeRunCount: number;\n maxActiveTasks: number;\n timeAccountingMode: TimeAccountingMode;\n pending: boolean;\n errorMessage: string | null;\n initialTaskId?: string | null;\n defaultProjectId?: string | null;\n presentation?: \"responsive\" | \"desktop_inline\" | \"mobile_sheet\";\n onStartExisting: (taskId: string, input: TimerStartInput) => Promise<void>;\n onCreateAndStart: (input: {\n title: string;\n description: string;\n projectId: string;\n timerMode: \"planned\" | \"unlimited\";\n plannedDurationSeconds: number | null;\n }) => Promise<void>;\n};\n\nfunction toPlannedMinutes(plannedDurationSeconds: number | null) {\n return plannedDurationSeconds === null ? \"20\" : String(Math.max(1, Math.round(plannedDurationSeconds / 60)));\n}\n\ntype ComposerBodyProps = Omit<StartWorkComposerProps, \"open\" | \"onOpenChange\"> & {\n onCancel: () => void;\n};\n\nfunction StartWorkComposerBody({\n tasks,\n projects,\n activeRunCount,\n maxActiveTasks,\n timeAccountingMode,\n pending,\n errorMessage,\n initialTaskId,\n defaultProjectId,\n onCancel,\n onStartExisting,\n onCreateAndStart\n}: ComposerBodyProps) {\n const [mode, setMode] = useState<\"existing\" | \"new\">(\"existing\");\n const [taskQuery, setTaskQuery] = useState(\"\");\n const [selectedTaskId, setSelectedTaskId] = useState<string | null>(initialTaskId ?? null);\n const [title, setTitle] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [projectId, setProjectId] = useState(defaultProjectId ?? \"\");\n const [timerMode, setTimerMode] = useState<\"planned\" | \"unlimited\">(\"planned\");\n const [plannedMinutes, setPlannedMinutes] = useState(\"20\");\n\n useEffect(() => {\n setMode(initialTaskId ? \"existing\" : \"new\");\n setTaskQuery(\"\");\n setSelectedTaskId(initialTaskId ?? null);\n setTitle(\"\");\n setDescription(\"\");\n setProjectId(defaultProjectId ?? \"\");\n setTimerMode(\"planned\");\n setPlannedMinutes(\"20\");\n }, [defaultProjectId, initialTaskId]);\n\n const sortedTasks = useMemo(\n () =>\n tasks\n .filter((task) => task.status !== \"done\")\n .sort((left, right) => {\n if (left.time.hasCurrentRun !== right.time.hasCurrentRun) {\n return Number(right.time.hasCurrentRun) - Number(left.time.hasCurrentRun);\n }\n if (left.status !== right.status) {\n return left.status.localeCompare(right.status);\n }\n return left.title.localeCompare(right.title);\n }),\n [tasks]\n );\n\n const filteredTasks = useMemo(() => {\n const query = taskQuery.trim().toLowerCase();\n if (!query) {\n return sortedTasks;\n }\n return sortedTasks.filter((task) => {\n const project = projects.find((entry) => entry.id === task.projectId);\n return [task.title, task.description, project?.title ?? \"\"].some((value) => value.toLowerCase().includes(query));\n });\n }, [projects, sortedTasks, taskQuery]);\n\n const selectedProject = useMemo(() => projects.find((project) => project.id === projectId) ?? null, [projectId, projects]);\n const plannedDurationSeconds = timerMode === \"planned\" ? Math.max(60, (Number.parseInt(plannedMinutes, 10) || 20) * 60) : null;\n const canSubmit = mode === \"existing\" ? Boolean(selectedTaskId) : Boolean(title.trim() && projectId);\n const policyLabel =\n timeAccountingMode === \"split\"\n ? \"Split time\"\n : timeAccountingMode === \"parallel\"\n ? \"Parallel time\"\n : \"Primary only\";\n\n return (\n <div className=\"grid gap-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Start work</div>\n <h3 className=\"mt-2 font-display text-[clamp(1.2rem,1.8vw,1.65rem)] text-white\">Pick a task and start the timer</h3>\n <p className=\"mt-2 max-w-2xl text-sm leading-6 text-white/60\">\n Use an existing task or create a new one quickly. Forge will move the task into in progress as soon as work starts.\n </p>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Badge className=\"bg-white/[0.08] text-white/72\">\n {activeRunCount}/{maxActiveTasks} live\n </Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{policyLabel}</Badge>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {([\n { value: \"existing\", label: \"Existing task\", detail: \"Search and start something that already exists.\" },\n { value: \"new\", label: \"New quick task\", detail: \"Create a task with a title, short description, and project.\" }\n ] as const).map((option) => {\n const selected = mode === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"rounded-[18px] border px-4 py-4 text-left transition\",\n selected ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white\" : \"border-white/8 bg-white/[0.04] text-white/65 hover:bg-white/[0.07]\"\n )}\n onClick={() => setMode(option.value)}\n >\n <div className=\"font-medium\">{option.label}</div>\n <div className=\"mt-2 text-sm leading-6 text-inherit/80\">{option.detail}</div>\n </button>\n );\n })}\n </div>\n\n {mode === \"existing\" ? (\n <div className=\"grid gap-3\">\n <label className=\"grid gap-2\">\n <span className=\"type-label text-white/45\">Search tasks</span>\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-white/32\" />\n <Input value={taskQuery} onChange={(event) => setTaskQuery(event.target.value)} placeholder=\"Search task title or project\" className=\"pl-10\" />\n </div>\n </label>\n\n <div className=\"grid max-h-[19rem] gap-2 overflow-y-auto rounded-[20px] bg-white/[0.03] p-2\">\n {filteredTasks.length === 0 ? (\n <div className=\"rounded-[16px] border border-dashed border-white/8 px-4 py-8 text-center text-sm text-white/42\">\n No tasks match. Switch to New quick task to create one now.\n </div>\n ) : (\n filteredTasks.slice(0, 16).map((task) => {\n const selected = selectedTaskId === task.id;\n const project = projects.find((entry) => entry.id === task.projectId);\n return (\n <button\n key={task.id}\n type=\"button\"\n className={cn(\n \"rounded-[16px] border px-4 py-3 text-left transition\",\n selected ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white\" : \"border-white/8 bg-white/[0.04] text-white/72 hover:bg-white/[0.07]\"\n )}\n onClick={() => setSelectedTaskId(task.id)}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <EntityName kind=\"task\" label={task.title} className=\"max-w-full\" />\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {project ? <EntityBadge kind=\"project\" label={project.title} compact gradient={false} /> : null}\n <Badge className=\"bg-white/[0.08] text-white/70\">{task.status.replaceAll(\"_\", \" \")}</Badge>\n {task.time.activeRunCount > 0 ? <Badge className=\"bg-emerald-500/12 text-emerald-200\">{task.time.activeRunCount} live</Badge> : null}\n </div>\n </div>\n <span className=\"text-[12px] text-white/45\">{task.points} xp</span>\n </div>\n </button>\n );\n })\n )}\n </div>\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <label className=\"grid gap-2\">\n <span className=\"type-label text-white/45\">Task title</span>\n <Input value={title} onChange={(event) => setTitle(event.target.value)} placeholder=\"Write the next concrete task\" />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"type-label text-white/45\">Short description</span>\n <Textarea value={description} onChange={(event) => setDescription(event.target.value)} placeholder=\"Keep it short and concrete.\" />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"type-label text-white/45\">Project</span>\n <select\n value={projectId}\n onChange={(event) => setProjectId(event.target.value)}\n className=\"min-h-10 rounded-[var(--radius-control)] border border-white/10 bg-white/[0.04] px-3 py-2 text-sm text-white outline-none transition focus:border-[rgba(192,193,255,0.3)]\"\n >\n <option value=\"\">Select project</option>\n {projects.map((project) => (\n <option key={project.id} value={project.id}>\n {project.title}\n </option>\n ))}\n </select>\n </label>\n {selectedProject ? (\n <div className=\"rounded-[16px] bg-white/[0.04] px-4 py-3 text-sm text-white/62\">\n This task will be created inside <span className=\"font-medium text-white\">{selectedProject.title}</span> and started immediately.\n </div>\n ) : null}\n </div>\n )}\n\n <div className=\"grid gap-2\">\n <span className=\"type-label text-white/45\">Timer</span>\n <div className=\"grid gap-2 sm:grid-cols-[minmax(0,1fr)_minmax(0,1fr)_8rem]\">\n {([\n { value: \"planned\", label: \"20 min planned\", detail: \"Pomodoro-style by default.\" },\n { value: \"unlimited\", label: \"Unlimited\", detail: \"Keep tracking until you stop.\" }\n ] as const).map((option) => {\n const selected = timerMode === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"rounded-[18px] border px-4 py-3 text-left transition\",\n selected ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white\" : \"border-white/8 bg-white/[0.04] text-white/65 hover:bg-white/[0.07]\"\n )}\n onClick={() => setTimerMode(option.value)}\n >\n <div className=\"font-medium\">{option.label}</div>\n <div className=\"mt-1.5 text-sm leading-6 text-inherit/80\">{option.detail}</div>\n </button>\n );\n })}\n <label className={cn(\"grid gap-2\", timerMode !== \"planned\" && \"opacity-50\")}>\n <span className=\"type-label text-white/45\">Minutes</span>\n <Input\n type=\"number\"\n min={1}\n max={240}\n disabled={timerMode !== \"planned\"}\n value={plannedMinutes}\n onChange={(event) => setPlannedMinutes(event.target.value)}\n />\n </label>\n </div>\n </div>\n\n {errorMessage ? <div className=\"rounded-[18px] bg-rose-500/10 px-4 py-3 text-sm leading-6 text-rose-200\">{errorMessage}</div> : null}\n\n <div className=\"flex flex-wrap items-center justify-between gap-3 border-t border-white/6 pt-4\">\n <div className=\"flex flex-wrap gap-2 text-[12px] text-white/45\">\n <div className=\"rounded-full bg-white/[0.05] px-3 py-2\">Starts in progress</div>\n <div className=\"rounded-full bg-white/[0.05] px-3 py-2\">{timerMode === \"planned\" ? `${toPlannedMinutes(plannedDurationSeconds)} min target` : \"Unlimited timer\"}</div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"secondary\" size=\"lg\" onClick={onCancel}>\n Cancel\n </Button>\n <Button\n size=\"lg\"\n pending={pending}\n pendingLabel=\"Starting\"\n disabled={!canSubmit}\n onClick={async () => {\n if (!canSubmit) {\n return;\n }\n if (mode === \"existing\" && selectedTaskId) {\n await onStartExisting(selectedTaskId, { timerMode, plannedDurationSeconds });\n return;\n }\n await onCreateAndStart({\n title: title.trim(),\n description: description.trim(),\n projectId,\n timerMode,\n plannedDurationSeconds\n });\n }}\n >\n {mode === \"existing\" ? <Timer className=\"size-4\" /> : <TimerReset className=\"size-4\" />}\n Start work\n <Play className=\"size-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\nexport function StartWorkComposer({ open, onOpenChange, presentation = \"responsive\", ...props }: StartWorkComposerProps) {\n const composer = <StartWorkComposerBody {...props} onCancel={() => onOpenChange(false)} />;\n\n return (\n <>\n {open && presentation !== \"mobile_sheet\" ? (\n <div className=\"hidden lg:block\">\n <div className=\"rounded-[24px] border border-white/8 bg-[linear-gradient(180deg,rgba(17,24,39,0.98),rgba(11,16,28,0.97))] p-4 shadow-[0_24px_60px_rgba(3,8,18,0.28)]\">\n <div className=\"mb-3 flex justify-end\">\n <Button variant=\"ghost\" size=\"sm\" className=\"px-3\" onClick={() => onOpenChange(false)}>\n <X className=\"size-4\" />\n Close\n </Button>\n </div>\n {composer}\n </div>\n </div>\n ) : null}\n\n {presentation !== \"desktop_inline\" ? (\n <div className={presentation === \"responsive\" ? \"lg:hidden\" : \"\"}>\n <SheetScaffold\n open={open}\n onOpenChange={onOpenChange}\n eyebrow=\"Start work\"\n title=\"Start work\"\n description=\"Pick an existing task or create a new one quickly, then start the timer immediately.\"\n >\n {composer}\n </SheetScaffold>\n </div>\n ) : null}\n </>\n );\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { CheckCheck, Clock3, PauseCircle, Play, Square, Timer } from \"lucide-react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport type { Task, TaskRun, TimeAccountingMode } from \"@/lib/types\";\n\n/* ── Shared expand state via context ── */\n\ntype RailExpandState = { expanded: boolean; setExpanded: (v: boolean | ((p: boolean) => boolean)) => void };\nconst RailExpandCtx = createContext<RailExpandState>({ expanded: false, setExpanded: () => {} });\n\nexport function TaskTimerRailProvider({ children }: { children: React.ReactNode }) {\n const [expanded, setExpanded] = useState(false);\n const openedAtMsRef = useRef(0);\n\n /* Auto-collapse on scroll down */\n useEffect(() => {\n if (!expanded) return;\n openedAtMsRef.current = performance.now();\n let lastY = window.scrollY;\n const handleScroll = () => {\n if (performance.now() - openedAtMsRef.current < 280) {\n lastY = window.scrollY;\n return;\n }\n if (window.scrollY - lastY > 16) setExpanded(false);\n lastY = window.scrollY;\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [expanded]);\n\n return <RailExpandCtx.Provider value={{ expanded, setExpanded }}>{children}</RailExpandCtx.Provider>;\n}\n\n/* ── Types ── */\n\ntype TaskTimerRailProps = {\n runs: TaskRun[];\n tasks: Task[];\n generatedAt: string;\n timeAccountingMode: TimeAccountingMode;\n pending: boolean;\n onOpenStartWork: () => void;\n onFocus: (runId: string) => Promise<void>;\n onPause: (runId: string) => Promise<void>;\n onComplete: (runId: string) => Promise<void>;\n};\n\ntype LiveRunView = {\n run: TaskRun;\n title: string;\n wallSeconds: number;\n creditedSeconds: number;\n remainingSeconds: number | null;\n overtimeSeconds: number;\n};\n\n/* ── Helpers ── */\n\nfunction formatDuration(totalSeconds: number): string {\n const safeSeconds = Math.max(0, Math.floor(totalSeconds));\n const hours = Math.floor(safeSeconds / 3600);\n const minutes = Math.floor((safeSeconds % 3600) / 60);\n const seconds = safeSeconds % 60;\n if (hours > 0) return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n}\n\nfunction buildLiveRunViews(\n runs: TaskRun[],\n tasks: Task[],\n generatedAt: string,\n timeAccountingMode: TimeAccountingMode,\n nowMs: number\n): LiveRunView[] {\n const activeCount = Math.max(1, runs.length);\n const generatedAtMs = Date.parse(generatedAt);\n const deltaSeconds = Number.isFinite(generatedAtMs) ? Math.max(0, Math.floor((nowMs - generatedAtMs) / 1000)) : 0;\n\n return runs\n .map((run) => {\n const task = tasks.find((entry) => entry.id === run.taskId);\n const wallSeconds = run.status === \"active\" ? run.elapsedWallSeconds + deltaSeconds : run.elapsedWallSeconds;\n const creditedExtra =\n run.status !== \"active\"\n ? 0\n : timeAccountingMode === \"parallel\"\n ? deltaSeconds\n : timeAccountingMode === \"split\"\n ? deltaSeconds / activeCount\n : run.isCurrent\n ? deltaSeconds\n : 0;\n const creditedSeconds = run.creditedSeconds + creditedExtra;\n const remainingSeconds =\n run.timerMode === \"planned\" && run.plannedDurationSeconds !== null\n ? Math.max(0, run.plannedDurationSeconds - wallSeconds)\n : null;\n const overtimeSeconds =\n run.timerMode === \"planned\" && run.plannedDurationSeconds !== null\n ? Math.max(0, wallSeconds - run.plannedDurationSeconds)\n : 0;\n return { run, title: task?.title ?? run.taskTitle, wallSeconds, creditedSeconds, remainingSeconds, overtimeSeconds };\n })\n .sort((left, right) => Number(right.run.isCurrent) - Number(left.run.isCurrent));\n}\n\nfunction useLiveRuns(runs: TaskRun[], tasks: Task[], generatedAt: string, timeAccountingMode: TimeAccountingMode) {\n const [nowMs, setNowMs] = useState(() => Date.now());\n useEffect(() => {\n if (runs.length === 0) return;\n const timer = window.setInterval(() => setNowMs(Date.now()), 1000);\n return () => window.clearInterval(timer);\n }, [runs.length]);\n return useMemo(() => buildLiveRunViews(runs, tasks, generatedAt, timeAccountingMode, nowMs), [generatedAt, nowMs, runs, tasks, timeAccountingMode]);\n}\n\n/* ────────────────────────────────────────────────────────\n * TaskTimerRailBar — the compact pill that sits inline\n * with the page title (same height as sm buttons: 34px)\n * ──────────────────────────────────────────────────────── */\n\nexport function TaskTimerRailBar({\n runs, tasks, generatedAt, timeAccountingMode, pending, onOpenStartWork, onPause, onFocus\n}: Pick<TaskTimerRailProps, \"runs\" | \"tasks\" | \"generatedAt\" | \"timeAccountingMode\" | \"pending\" | \"onOpenStartWork\" | \"onPause\" | \"onFocus\">) {\n const { expanded, setExpanded } = useContext(RailExpandCtx);\n const liveRuns = useLiveRuns(runs, tasks, generatedAt, timeAccountingMode);\n const current = liveRuns.find((e) => e.run.isCurrent) ?? liveRuns[0] ?? null;\n const secondary = current ? liveRuns.filter((e) => e.run.id !== current.run.id) : [];\n\n /* No active work */\n if (!current) {\n return (\n <div className=\"flex min-h-[2.125rem] min-w-0 items-center gap-1.5 rounded-full border border-white/8 bg-white/[0.04] py-1 pl-2.5 pr-1\">\n <Timer className=\"size-3.5 shrink-0 text-white/48\" />\n <span className=\"truncate text-[12px] text-white/48\">No active work</span>\n <button\n type=\"button\"\n className=\"ml-auto inline-flex h-[1.5rem] shrink-0 items-center rounded-full bg-white/10 px-2 text-[11px] font-medium text-white transition hover:bg-white/15\"\n onClick={onOpenStartWork}\n >\n Start work\n </button>\n </div>\n );\n }\n\n /* Active work — compact pill.\n * Left side = clickable expand/collapse area (button).\n * Right side = discrete action buttons, each isolated. */\n return (\n <div\n className={cn(\n \"flex min-h-[2.125rem] min-w-0 items-center rounded-full border border-white/8 bg-white/[0.04] transition-colors\",\n expanded && \"border-[var(--primary)]/25 bg-[var(--primary)]/[0.06]\"\n )}\n >\n {/* ── Left: expand/collapse toggle ── */}\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-label={expanded ? \"Collapse work details\" : \"Expand work details\"}\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-l-full py-1 pl-2.5 pr-2 transition-colors hover:bg-white/[0.04]\"\n onClick={() => setExpanded((p: boolean) => !p)}\n >\n <Timer className=\"size-3.5 shrink-0 text-[var(--primary)]\" />\n <span className=\"truncate text-[12px] font-medium text-white\">{current.title}</span>\n <span className=\"shrink-0 text-[11px] tabular-nums text-white/44\">{formatDuration(current.creditedSeconds)}</span>\n </button>\n\n {/* ── Right: action buttons ── */}\n <div className=\"flex shrink-0 items-center gap-0.5 pr-1\">\n {secondary.length > 0 ? (\n <button\n type=\"button\"\n title=\"Switch to next task\"\n disabled={pending}\n className=\"inline-flex size-6 items-center justify-center rounded-full bg-[var(--primary)]/15 text-[10px] font-bold tabular-nums text-[var(--primary)] transition hover:bg-[var(--primary)]/25 disabled:pointer-events-none disabled:opacity-70\"\n onClick={() => void onFocus(secondary[0].run.id)}\n >\n {liveRuns.length}\n </button>\n ) : null}\n <button\n type=\"button\"\n title=\"Stop\"\n disabled={pending}\n className=\"inline-flex size-6 items-center justify-center rounded-full text-white/50 transition hover:bg-white/[0.1] hover:text-white disabled:pointer-events-none disabled:opacity-70\"\n onClick={() => void onPause(current.run.id)}\n >\n <Square className=\"size-2.5 fill-current\" />\n </button>\n <button\n type=\"button\"\n title=\"Start new work\"\n disabled={pending}\n className=\"inline-flex size-6 items-center justify-center rounded-full text-white/50 transition hover:bg-white/[0.1] hover:text-white disabled:pointer-events-none disabled:opacity-70\"\n onClick={() => onOpenStartWork()}\n >\n <Play className=\"size-2.5 fill-current\" />\n </button>\n </div>\n </div>\n );\n}\n\n/* ────────────────────────────────────────────────────────\n * TaskTimerRailPanel — the expanded detail panel\n * Render this as a sibling below the header title row\n * so it spans the full header width.\n * ──────────────────────────────────────────────────────── */\n\nexport function TaskTimerRailPanel({\n runs, tasks, generatedAt, timeAccountingMode, pending, onOpenStartWork, onFocus, onPause, onComplete\n}: TaskTimerRailProps) {\n const { expanded } = useContext(RailExpandCtx);\n const liveRuns = useLiveRuns(runs, tasks, generatedAt, timeAccountingMode);\n const current = liveRuns.find((e) => e.run.isCurrent) ?? liveRuns[0] ?? null;\n const secondary = current ? liveRuns.filter((e) => e.run.id !== current.run.id) : [];\n\n const splitHint =\n timeAccountingMode === \"split\" && liveRuns.length > 1\n ? `Split across ${liveRuns.length} active tasks`\n : timeAccountingMode === \"parallel\" && liveRuns.length > 1\n ? `Parallel time across ${liveRuns.length} active tasks`\n : timeAccountingMode === \"primary_only\" && liveRuns.length > 1\n ? \"Only the current task is earning credited time\"\n : null;\n\n if (!current) return null;\n\n return (\n <AnimatePresence initial={false}>\n {expanded ? (\n <motion.div\n key=\"timer-rail-detail\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.25, ease: \"easeOut\" }}\n className=\"overflow-hidden\"\n >\n <div className=\"mt-2 rounded-2xl border border-white/8 bg-[linear-gradient(180deg,rgba(192,193,255,0.10),rgba(192,193,255,0.03))] p-4\">\n <div className=\"flex flex-col gap-4 xl:flex-row xl:items-start xl:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge tone=\"signal\" className=\"text-white/82\">Current task</Badge>\n <Badge tone=\"meta\">{current.run.timerMode === \"planned\" ? \"Planned timer\" : \"Unlimited timer\"}</Badge>\n {splitHint ? <Badge tone=\"meta\">{splitHint}</Badge> : null}\n </div>\n <div className=\"mt-3 text-xl font-medium text-white md:text-2xl\">{current.title}</div>\n <div className=\"mt-2 flex flex-wrap gap-4 text-sm text-white/62\">\n <span>{formatDuration(current.creditedSeconds)} credited</span>\n <span>{formatDuration(current.wallSeconds)} wall time</span>\n {current.run.timerMode === \"planned\" ? (\n current.overtimeSeconds > 0 ? (\n <span className=\"text-amber-200\">+{formatDuration(current.overtimeSeconds)} overtime</span>\n ) : (\n <span>{formatDuration(current.remainingSeconds ?? 0)} remaining</span>\n )\n ) : (\n <span>Unlimited session</span>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"secondary\" pending={pending} pendingLabel=\"Opening\" onClick={onOpenStartWork}>\n <Timer className=\"size-4\" />\n Start work\n </Button>\n <Button variant=\"secondary\" pending={pending} pendingLabel=\"Pausing\" onClick={() => void onPause(current.run.id)}>\n <PauseCircle className=\"size-4\" />\n Pause\n </Button>\n <Button pending={pending} pendingLabel=\"Completing\" onClick={() => void onComplete(current.run.id)}>\n <CheckCheck className=\"size-4\" />\n Complete\n </Button>\n </div>\n </div>\n\n {secondary.length > 0 ? (\n <div className=\"mt-4 grid gap-2 lg:grid-cols-2\">\n {secondary.map((entry) => (\n <button\n key={entry.run.id}\n type=\"button\"\n className={cn(\n \"flex items-center justify-between gap-3 rounded-2xl bg-white/[0.04] px-4 py-3 text-left transition hover:bg-white/[0.08]\",\n pending && \"pointer-events-none opacity-70\"\n )}\n onClick={() => void onFocus(entry.run.id)}\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-white/88\">{entry.title}</div>\n <div className=\"mt-1 flex flex-wrap gap-3 text-[12px] text-white/48\">\n <span>{formatDuration(entry.creditedSeconds)} credited</span>\n <span>{entry.run.timerMode === \"planned\" ? \"planned\" : \"unlimited\"}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-2 text-[12px] text-white/42\">\n <Clock3 className=\"size-3.5\" />\n Switch\n </div>\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n );\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Card({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n \"w-full max-w-full min-w-0 rounded-[var(--radius-card)] bg-[var(--card-gradient)] p-5 shadow-[var(--card-shadow)] backdrop-blur-sm\",\n className\n )}\n {...props}\n />\n );\n}\n","export type ForgeValidationIssue = {\n path: string;\n message: string;\n};\n\nexport class ForgeApiError extends Error {\n readonly status: number;\n readonly code: string;\n readonly details: ForgeValidationIssue[];\n readonly requestPath: string;\n\n constructor(input: {\n status: number;\n code: string;\n message: string;\n requestPath: string;\n details?: ForgeValidationIssue[];\n }) {\n super(input.message);\n this.name = \"ForgeApiError\";\n this.status = input.status;\n this.code = input.code;\n this.details = input.details ?? [];\n this.requestPath = input.requestPath;\n }\n}\n\nexport function describeApiError(error: unknown) {\n if (error instanceof ForgeApiError) {\n return {\n title: `Request failed (${error.status})`,\n description:\n error.details.length > 0\n ? `${error.message} ${error.details.map((detail) => `${detail.path}: ${detail.message}`).join(\" · \")}`\n : error.message,\n code: error.code\n };\n }\n\n if (error instanceof Error) {\n return {\n title: \"Something went wrong\",\n description: error.message,\n code: \"unknown_error\"\n };\n }\n\n return {\n title: \"Something went wrong\",\n description: \"Unexpected API failure.\",\n code: \"unknown_error\"\n };\n}\n","import type { ReactNode } from \"react\";\nimport { RefreshCcw } from \"lucide-react\";\nimport { Card } from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { Spinner } from \"@/components/ui/spinner\";\nimport { describeApiError } from \"@/lib/api-error\";\nimport { useI18n } from \"@/lib/i18n\";\n\nexport function LoadingState({\n eyebrow,\n title,\n description\n}: {\n eyebrow?: string;\n title?: string;\n description?: string;\n}) {\n const { t } = useI18n();\n return (\n <Card className=\"surface-pulse ambient-glow mx-auto grid max-w-2xl gap-4 text-center\">\n <div className=\"type-label text-white/40\">{eyebrow ?? t(\"common.labels.loading\")}</div>\n <div className=\"type-display-section text-white\">{title ?? t(\"common.pageState.loadingTitle\")}</div>\n <p className=\"type-body mx-auto max-w-xl text-white/60\">{description ?? t(\"common.pageState.loadingDescription\")}</p>\n <div className=\"mx-auto flex min-h-11 items-center gap-3 rounded-full bg-white/[0.05] px-4 py-3 text-white/60\">\n <Spinner tone=\"subtle\" className=\"size-3.5\" />\n <span className=\"type-meta\">{t(\"common.labels.syncInProgress\")}</span>\n </div>\n </Card>\n );\n}\n\nexport function ErrorState({\n error,\n onRetry,\n eyebrow\n}: {\n error: unknown;\n onRetry?: () => void;\n eyebrow?: string;\n}) {\n const { t } = useI18n();\n const { title, description, code } = describeApiError(error);\n\n return (\n <Card className=\"mx-auto grid max-w-2xl gap-4\">\n <div className=\"type-label text-rose-200/72\">{eyebrow ?? t(\"common.labels.connectionState\")}</div>\n <div className=\"type-display-section text-white\">{title}</div>\n <p className=\"type-body text-white/62\">{description}</p>\n <div className=\"type-meta text-white/40\">{t(\"common.labels.errorCode\", { code })}</div>\n {onRetry ? (\n <div className=\"flex flex-wrap gap-3\">\n <Button type=\"button\" variant=\"secondary\" onClick={onRetry}>\n <RefreshCcw className=\"mr-2 size-4\" />\n {t(\"common.actions.retry\")}\n </Button>\n </div>\n ) : null}\n </Card>\n );\n}\n\nexport function EmptyState({\n eyebrow,\n title,\n description,\n action\n}: {\n eyebrow?: string;\n title: string;\n description: string;\n action?: ReactNode;\n}) {\n const { t } = useI18n();\n return (\n <Card className=\"mx-auto grid max-w-2xl gap-4 text-center\">\n <div className=\"type-label text-white/38\">{eyebrow ?? t(\"common.labels.loading\")}</div>\n <div className=\"type-display-section text-white\">{title}</div>\n <p className=\"type-body mx-auto max-w-xl text-white/60\">{description}</p>\n {action ? <div className=\"flex justify-center\">{action}</div> : null}\n </Card>\n );\n}\n","export function normalizeAssetBasePath(basePath: string) {\n if (!basePath || basePath === \"/\") {\n return \"/\";\n }\n\n const withLeadingSlash = basePath.startsWith(\"/\") ? basePath : `/${basePath}`;\n return withLeadingSlash.endsWith(\"/\") ? withLeadingSlash : `${withLeadingSlash}/`;\n}\n\nexport function normalizeRouterBasename(basePath: string) {\n const normalized = normalizeAssetBasePath(basePath);\n if (normalized === \"/\") {\n return \"/\";\n }\n\n return normalized.endsWith(\"/\") ? normalized.slice(0, -1) : normalized;\n}\n\nfunction getBaseUrl() {\n return new URL(normalizeAssetBasePath(import.meta.env.BASE_URL || \"/\"), window.location.origin);\n}\n\nexport function resolveForgePath(pathname: string) {\n const normalized = pathname.startsWith(\"/\") ? pathname.slice(1) : pathname;\n return new URL(normalized, getBaseUrl()).pathname;\n}\n","import { useEffect } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { resolveForgePath } from \"@/lib/runtime-paths\";\n\nexport function useLiveEvents() {\n const queryClient = useQueryClient();\n\n useEffect(() => {\n const stream = new EventSource(resolveForgePath(\"/api/v1/events/stream\"));\n const invalidate = () => {\n void Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] }),\n queryClient.invalidateQueries({ queryKey: [\"task-context\"] })\n ]);\n };\n\n stream.addEventListener(\"snapshot\", invalidate);\n stream.addEventListener(\"activity\", invalidate);\n\n stream.onerror = () => {\n stream.close();\n };\n\n return () => {\n stream.removeEventListener(\"snapshot\", invalidate);\n stream.removeEventListener(\"activity\", invalidate);\n stream.close();\n };\n }, [queryClient]);\n}\n","import type { ForgeSnapshot, ProjectSummary, Task } from \"./types\";\n\ntype LegacyProjectLike = Partial<ProjectSummary> & {\n summary?: string;\n totalPoints?: number;\n derived?: boolean;\n};\n\ntype LegacySnapshot = Partial<ForgeSnapshot> & {\n dashboard?: Partial<ForgeSnapshot[\"dashboard\"]> & {\n campaigns?: LegacyProjectLike[];\n };\n overview?: Partial<ForgeSnapshot[\"overview\"]> & {\n campaigns?: LegacyProjectLike[];\n };\n projects?: ProjectSummary[];\n campaigns?: LegacyProjectLike[];\n};\n\nfunction normalizeTask(task: Partial<Task> | undefined): Task {\n return {\n id: task?.id ?? \"\",\n title: task?.title ?? \"\",\n description: task?.description ?? \"\",\n status: task?.status ?? \"backlog\",\n priority: task?.priority ?? \"medium\",\n owner: task?.owner ?? \"Albert\",\n goalId: task?.goalId ?? null,\n projectId: task?.projectId ?? null,\n dueDate: task?.dueDate ?? null,\n effort: task?.effort ?? \"deep\",\n energy: task?.energy ?? \"steady\",\n points: task?.points ?? 0,\n sortOrder: task?.sortOrder ?? 0,\n completedAt: task?.completedAt ?? null,\n createdAt: task?.createdAt ?? new Date(0).toISOString(),\n updatedAt: task?.updatedAt ?? new Date(0).toISOString(),\n tagIds: task?.tagIds ?? [],\n time: task?.time ?? {\n totalTrackedSeconds: 0,\n totalCreditedSeconds: 0,\n activeRunCount: 0,\n hasCurrentRun: false,\n currentRunId: null\n }\n };\n}\n\nfunction normalizeProject(project: LegacyProjectLike | undefined): ProjectSummary {\n return {\n id: project?.id ?? \"\",\n goalId: project?.goalId ?? \"\",\n title: project?.title ?? \"\",\n description: project?.description ?? project?.summary ?? \"\",\n status: project?.status === \"paused\" || project?.status === \"completed\" ? project.status : \"active\",\n targetPoints: project?.targetPoints ?? project?.totalPoints ?? 0,\n themeColor: project?.themeColor ?? \"#c0c1ff\",\n createdAt: project?.createdAt ?? new Date(0).toISOString(),\n updatedAt: project?.updatedAt ?? new Date(0).toISOString(),\n goalTitle: project?.goalTitle ?? \"\",\n activeTaskCount: project?.activeTaskCount ?? 0,\n completedTaskCount: project?.completedTaskCount ?? 0,\n totalTasks: project?.totalTasks ?? 0,\n earnedPoints: project?.earnedPoints ?? project?.totalPoints ?? 0,\n progress: project?.progress ?? 0,\n nextTaskId: project?.nextTaskId ?? null,\n nextTaskTitle: project?.nextTaskTitle ?? null,\n momentumLabel: project?.momentumLabel ?? \"No momentum yet\",\n time: project?.time ?? {\n totalTrackedSeconds: 0,\n totalCreditedSeconds: 0,\n activeRunCount: 0,\n hasCurrentRun: false,\n currentRunId: null\n }\n };\n}\n\nexport function normalizeForgeSnapshot(raw: ForgeSnapshot | LegacySnapshot): ForgeSnapshot {\n const legacy = raw as LegacySnapshot;\n const rootProjects = (legacy.projects ?? legacy.campaigns ?? []).map(normalizeProject);\n const dashboardProjects = (legacy.dashboard?.projects ?? legacy.dashboard?.campaigns ?? rootProjects).map(normalizeProject);\n const overviewProjects = (legacy.overview?.projects ?? legacy.overview?.campaigns ?? dashboardProjects).map(normalizeProject);\n\n return {\n ...raw,\n meta: {\n apiVersion: \"v1\",\n transport: \"rest+sse\",\n generatedAt: raw.meta?.generatedAt ?? new Date().toISOString(),\n backend: raw.meta?.backend ?? \"forge-node-runtime\",\n mode: raw.meta?.mode ?? \"transitional-node\"\n },\n metrics: {\n totalXp: raw.metrics?.totalXp ?? 0,\n level: raw.metrics?.level ?? 1,\n currentLevelXp: raw.metrics?.currentLevelXp ?? 0,\n nextLevelXp: raw.metrics?.nextLevelXp ?? 120,\n weeklyXp: raw.metrics?.weeklyXp ?? 0,\n streakDays: raw.metrics?.streakDays ?? 0,\n comboMultiplier: raw.metrics?.comboMultiplier ?? 1,\n momentumScore: raw.metrics?.momentumScore ?? 0,\n topGoalId: raw.metrics?.topGoalId ?? null,\n topGoalTitle: raw.metrics?.topGoalTitle ?? null\n },\n dashboard: {\n stats: {\n totalPoints: raw.dashboard?.stats?.totalPoints ?? 0,\n completedThisWeek: raw.dashboard?.stats?.completedThisWeek ?? 0,\n activeGoals: raw.dashboard?.stats?.activeGoals ?? 0,\n alignmentScore: raw.dashboard?.stats?.alignmentScore ?? 0,\n focusTasks: raw.dashboard?.stats?.focusTasks ?? 0,\n overdueTasks: raw.dashboard?.stats?.overdueTasks ?? 0,\n dueThisWeek: raw.dashboard?.stats?.dueThisWeek ?? 0\n },\n goals: raw.dashboard?.goals ?? [],\n projects: dashboardProjects,\n tasks: (raw.dashboard?.tasks ?? []).map(normalizeTask),\n tags: raw.dashboard?.tags ?? [],\n suggestedTags: raw.dashboard?.suggestedTags ?? [],\n owners: raw.dashboard?.owners ?? [],\n executionBuckets: (raw.dashboard?.executionBuckets ?? []).map((bucket) => ({\n ...bucket,\n tasks: (bucket.tasks ?? []).map(normalizeTask)\n })),\n gamification: raw.dashboard?.gamification ?? {\n totalXp: raw.metrics?.totalXp ?? 0,\n level: raw.metrics?.level ?? 1,\n currentLevelXp: raw.metrics?.currentLevelXp ?? 0,\n nextLevelXp: raw.metrics?.nextLevelXp ?? 120,\n weeklyXp: raw.metrics?.weeklyXp ?? 0,\n streakDays: raw.metrics?.streakDays ?? 0,\n comboMultiplier: raw.metrics?.comboMultiplier ?? 1,\n momentumScore: raw.metrics?.momentumScore ?? 0,\n topGoalId: raw.metrics?.topGoalId ?? null,\n topGoalTitle: raw.metrics?.topGoalTitle ?? null\n },\n achievements: raw.dashboard?.achievements ?? [],\n milestoneRewards: raw.dashboard?.milestoneRewards ?? [],\n recentActivity: raw.dashboard?.recentActivity ?? []\n },\n overview: {\n generatedAt: raw.overview?.generatedAt ?? new Date().toISOString(),\n strategicHeader: {\n streakDays: raw.overview?.strategicHeader?.streakDays ?? raw.metrics?.streakDays ?? 0,\n level: raw.overview?.strategicHeader?.level ?? raw.metrics?.level ?? 1,\n totalXp: raw.overview?.strategicHeader?.totalXp ?? raw.metrics?.totalXp ?? 0,\n currentLevelXp: raw.overview?.strategicHeader?.currentLevelXp ?? raw.metrics?.currentLevelXp ?? 0,\n nextLevelXp: raw.overview?.strategicHeader?.nextLevelXp ?? raw.metrics?.nextLevelXp ?? 120,\n momentumScore: raw.overview?.strategicHeader?.momentumScore ?? raw.metrics?.momentumScore ?? 0,\n focusTasks: raw.overview?.strategicHeader?.focusTasks ?? 0,\n overdueTasks: raw.overview?.strategicHeader?.overdueTasks ?? 0\n },\n projects: overviewProjects,\n activeGoals: raw.overview?.activeGoals ?? [],\n topTasks: (raw.overview?.topTasks ?? []).map(normalizeTask),\n recentEvidence: raw.overview?.recentEvidence ?? [],\n achievements: raw.overview?.achievements ?? [],\n domainBalance: raw.overview?.domainBalance ?? [],\n neglectedGoals: raw.overview?.neglectedGoals ?? []\n },\n today: {\n generatedAt: raw.today?.generatedAt ?? new Date().toISOString(),\n directive: {\n task: raw.today?.directive?.task ? normalizeTask(raw.today.directive.task) : null,\n goalTitle: raw.today?.directive?.goalTitle ?? null,\n rewardXp: raw.today?.directive?.rewardXp ?? 0,\n sessionLabel: raw.today?.directive?.sessionLabel ?? \"No active session\"\n },\n timeline: (raw.today?.timeline ?? []).map((bucket) => ({\n ...bucket,\n tasks: (bucket.tasks ?? []).map(normalizeTask)\n })),\n dailyQuests: raw.today?.dailyQuests ?? [],\n milestoneRewards: raw.today?.milestoneRewards ?? [],\n momentum: {\n streakDays: raw.today?.momentum?.streakDays ?? 0,\n momentumScore: raw.today?.momentum?.momentumScore ?? 0,\n recoveryHint: raw.today?.momentum?.recoveryHint ?? \"\"\n }\n },\n risk: {\n generatedAt: raw.risk?.generatedAt ?? new Date().toISOString(),\n overdueTasks: (raw.risk?.overdueTasks ?? []).map(normalizeTask),\n blockedTasks: (raw.risk?.blockedTasks ?? []).map(normalizeTask),\n neglectedGoals: raw.risk?.neglectedGoals ?? [],\n summary: raw.risk?.summary ?? \"\"\n },\n goals: raw.goals ?? [],\n projects: rootProjects,\n tags: raw.tags ?? [],\n tasks: (raw.tasks ?? []).map(normalizeTask),\n activity: raw.activity ?? [],\n activeTaskRuns: raw.activeTaskRuns ?? []\n };\n}\n","import type {\n AgentAction,\n AgentOnboardingPayload,\n AgentIdentity,\n AgentTokenMutationResult,\n OperatorSession,\n CreateManualRewardGrantInput,\n ApprovalRequest,\n EventLogEntry,\n Goal,\n ForgeSnapshot,\n Insight,\n OperatorOverviewPayload,\n OperatorContextPayload,\n OperatorLogWorkInput,\n OperatorLogWorkResult,\n InsightFeedback,\n InsightsPayload,\n Project,\n ProjectBoardPayload,\n ProjectSummary,\n RewardLedgerEvent,\n RewardRule,\n SettingsPayload,\n SettingsBinPayload,\n Tag,\n Task,\n TaskContext,\n TaskRun,\n TaskRunClaimInput,\n TaskRunFinishInput,\n TaskRunHeartbeatInput,\n UpdateRewardRuleInput,\n WeeklyReviewPayload,\n XpMetricsPayload,\n CrudEntityType,\n DeleteMode\n} from \"./types\";\nimport type {\n Behavior,\n BehaviorInput,\n BehaviorPattern,\n BehaviorPatternInput,\n BeliefEntry,\n BeliefEntryInput,\n Comment,\n CommentInput,\n Domain,\n EmotionDefinition,\n EmotionDefinitionInput,\n EventType,\n EventTypeInput,\n ModeGuideSession,\n ModeGuideSessionInput,\n ModeProfile,\n ModeProfileInput,\n PsycheOverviewPayload,\n PsycheValue,\n PsycheValueInput,\n SchemaCatalogEntry,\n TriggerReport,\n TriggerReportDetailPayload,\n TriggerReportInput\n} from \"./psyche-types\";\nimport type {\n CreateAgentTokenInput,\n CreateInsightInput,\n GoalMutationInput,\n ProjectMutationInput,\n QuickTaskInput,\n SettingsMutationInput,\n TagMutationInput\n} from \"./schemas\";\nimport { ForgeApiError, type ForgeValidationIssue } from \"./api-error\";\nimport { resolveForgePath } from \"./runtime-paths\";\nimport { normalizeForgeSnapshot } from \"./snapshot-normalizer\";\n\nasync function parseResponseBody(response: Response) {\n const text = await response.text();\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\nasync function request<T>(path: string, init?: RequestInit): Promise<T> {\n const response = await fetch(resolveForgePath(path), {\n credentials: \"same-origin\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-forge-source\": \"ui\",\n ...(init?.headers ?? {})\n },\n ...init\n });\n\n const body = await parseResponseBody(response);\n\n if (!response.ok) {\n const maybeBody = typeof body === \"object\" && body !== null ? (body as Record<string, unknown>) : null;\n const details = Array.isArray(maybeBody?.details)\n ? (maybeBody.details as ForgeValidationIssue[])\n : [];\n throw new ForgeApiError({\n status: response.status,\n code:\n typeof maybeBody?.code === \"string\"\n ? maybeBody.code\n : typeof maybeBody?.error === \"string\"\n ? maybeBody.error\n : \"request_failed\",\n message:\n typeof maybeBody?.error === \"string\"\n ? maybeBody.error\n : typeof maybeBody?.message === \"string\"\n ? maybeBody.message\n : typeof body === \"string\"\n ? body\n : `Request failed: ${response.status}`,\n requestPath: path,\n details\n });\n }\n\n return body as T;\n}\n\nexport function ensureOperatorSession() {\n return request<{ session: OperatorSession }>(\"/api/v1/auth/operator-session\");\n}\n\nexport function revokeOperatorSession() {\n return request<{ revoked: boolean }>(\"/api/v1/auth/operator-session\", {\n method: \"DELETE\"\n });\n}\n\nexport function getForgeSnapshot() {\n return request<ForgeSnapshot>(\"/api/v1/context\").then(normalizeForgeSnapshot);\n}\n\nexport function getInsights() {\n return request<{ insights: InsightsPayload }>(\"/api/v1/insights\");\n}\n\nexport function listDomains() {\n return request<{ domains: Domain[] }>(\"/api/v1/domains\");\n}\n\nexport function getPsycheOverview() {\n return request<{ overview: PsycheOverviewPayload }>(\"/api/v1/psyche/overview\");\n}\n\nexport function listPsycheValues() {\n return request<{ values: PsycheValue[] }>(\"/api/v1/psyche/values\");\n}\n\nexport function getPsycheValue(valueId: string) {\n return request<{ value: PsycheValue }>(`/api/v1/psyche/values/${valueId}`);\n}\n\nexport function createPsycheValue(input: PsycheValueInput) {\n return request<{ value: PsycheValue }>(\"/api/v1/psyche/values\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchPsycheValue(valueId: string, patch: Partial<PsycheValueInput>) {\n return request<{ value: PsycheValue }>(`/api/v1/psyche/values/${valueId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deletePsycheValue(valueId: string) {\n return request<{ value: PsycheValue }>(`/api/v1/psyche/values/${valueId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function listBehaviorPatterns() {\n return request<{ patterns: BehaviorPattern[] }>(\"/api/v1/psyche/patterns\");\n}\n\nexport function getBehaviorPattern(patternId: string) {\n return request<{ pattern: BehaviorPattern }>(`/api/v1/psyche/patterns/${patternId}`);\n}\n\nexport function createBehaviorPattern(input: BehaviorPatternInput) {\n return request<{ pattern: BehaviorPattern }>(\"/api/v1/psyche/patterns\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchBehaviorPattern(patternId: string, patch: Partial<BehaviorPatternInput>) {\n return request<{ pattern: BehaviorPattern }>(`/api/v1/psyche/patterns/${patternId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteBehaviorPattern(patternId: string) {\n return request<{ pattern: BehaviorPattern }>(`/api/v1/psyche/patterns/${patternId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function listBehaviors() {\n return request<{ behaviors: Behavior[] }>(\"/api/v1/psyche/behaviors\");\n}\n\nexport function getBehavior(behaviorId: string) {\n return request<{ behavior: Behavior }>(`/api/v1/psyche/behaviors/${behaviorId}`);\n}\n\nexport function createBehavior(input: BehaviorInput) {\n return request<{ behavior: Behavior }>(\"/api/v1/psyche/behaviors\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchBehavior(behaviorId: string, patch: Partial<BehaviorInput>) {\n return request<{ behavior: Behavior }>(`/api/v1/psyche/behaviors/${behaviorId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteBehavior(behaviorId: string) {\n return request<{ behavior: Behavior }>(`/api/v1/psyche/behaviors/${behaviorId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function listSchemaCatalog() {\n return request<{ schemas: SchemaCatalogEntry[] }>(\"/api/v1/psyche/schema-catalog\");\n}\n\nexport function listBeliefs() {\n return request<{ beliefs: BeliefEntry[] }>(\"/api/v1/psyche/beliefs\");\n}\n\nexport function getBelief(beliefId: string) {\n return request<{ belief: BeliefEntry }>(`/api/v1/psyche/beliefs/${beliefId}`);\n}\n\nexport function createBelief(input: BeliefEntryInput) {\n return request<{ belief: BeliefEntry }>(\"/api/v1/psyche/beliefs\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchBelief(beliefId: string, patch: Partial<BeliefEntryInput>) {\n return request<{ belief: BeliefEntry }>(`/api/v1/psyche/beliefs/${beliefId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteBelief(beliefId: string) {\n return request<{ belief: BeliefEntry }>(`/api/v1/psyche/beliefs/${beliefId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function listModes() {\n return request<{ modes: ModeProfile[] }>(\"/api/v1/psyche/modes\");\n}\n\nexport function getMode(modeId: string) {\n return request<{ mode: ModeProfile }>(`/api/v1/psyche/modes/${modeId}`);\n}\n\nexport function createMode(input: ModeProfileInput) {\n return request<{ mode: ModeProfile }>(\"/api/v1/psyche/modes\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchMode(modeId: string, patch: Partial<ModeProfileInput>) {\n return request<{ mode: ModeProfile }>(`/api/v1/psyche/modes/${modeId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteMode(modeId: string) {\n return request<{ mode: ModeProfile }>(`/api/v1/psyche/modes/${modeId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function listModeGuideSessions() {\n return request<{ sessions: ModeGuideSession[] }>(\"/api/v1/psyche/mode-guides\");\n}\n\nexport function getModeGuideSession(sessionId: string) {\n return request<{ session: ModeGuideSession }>(`/api/v1/psyche/mode-guides/${sessionId}`);\n}\n\nexport function createModeGuideSession(input: ModeGuideSessionInput) {\n return request<{ session: ModeGuideSession }>(\"/api/v1/psyche/mode-guides\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchModeGuideSession(sessionId: string, patch: Partial<ModeGuideSessionInput>) {\n return request<{ session: ModeGuideSession }>(`/api/v1/psyche/mode-guides/${sessionId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteModeGuideSession(sessionId: string) {\n return request<{ session: ModeGuideSession }>(`/api/v1/psyche/mode-guides/${sessionId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function listEventTypes() {\n return request<{ eventTypes: EventType[] }>(\"/api/v1/psyche/event-types\");\n}\n\nexport function getEventType(eventTypeId: string) {\n return request<{ eventType: EventType }>(`/api/v1/psyche/event-types/${eventTypeId}`);\n}\n\nexport function createEventType(input: EventTypeInput) {\n return request<{ eventType: EventType }>(\"/api/v1/psyche/event-types\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchEventType(eventTypeId: string, patch: Partial<EventTypeInput>) {\n return request<{ eventType: EventType }>(`/api/v1/psyche/event-types/${eventTypeId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteEventType(eventTypeId: string) {\n return request<{ eventType: EventType }>(`/api/v1/psyche/event-types/${eventTypeId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function listEmotionDefinitions() {\n return request<{ emotions: EmotionDefinition[] }>(\"/api/v1/psyche/emotions\");\n}\n\nexport function getEmotionDefinition(emotionId: string) {\n return request<{ emotion: EmotionDefinition }>(`/api/v1/psyche/emotions/${emotionId}`);\n}\n\nexport function createEmotionDefinition(input: EmotionDefinitionInput) {\n return request<{ emotion: EmotionDefinition }>(\"/api/v1/psyche/emotions\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchEmotionDefinition(emotionId: string, patch: Partial<EmotionDefinitionInput>) {\n return request<{ emotion: EmotionDefinition }>(`/api/v1/psyche/emotions/${emotionId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteEmotionDefinition(emotionId: string) {\n return request<{ emotion: EmotionDefinition }>(`/api/v1/psyche/emotions/${emotionId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function listTriggerReports() {\n return request<{ reports: TriggerReport[] }>(\"/api/v1/psyche/reports\");\n}\n\nexport function createTriggerReport(input: TriggerReportInput) {\n return request<{ report: TriggerReport }>(\"/api/v1/psyche/reports\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function getTriggerReport(reportId: string) {\n return request<TriggerReportDetailPayload>(`/api/v1/psyche/reports/${reportId}`);\n}\n\nexport function patchTriggerReport(reportId: string, patch: Partial<TriggerReportInput>) {\n return request<{ report: TriggerReport }>(`/api/v1/psyche/reports/${reportId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteTriggerReport(reportId: string) {\n return request<{ report: TriggerReport }>(`/api/v1/psyche/reports/${reportId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function listComments(input: {\n entityType?: string;\n entityId?: string;\n limit?: number;\n} = {}) {\n const search = new URLSearchParams();\n if (input.entityType) {\n search.set(\"entityType\", input.entityType);\n }\n if (input.entityId) {\n search.set(\"entityId\", input.entityId);\n }\n if (input.limit) {\n search.set(\"limit\", String(input.limit));\n }\n const suffix = search.size > 0 ? `?${search.toString()}` : \"\";\n return request<{ comments: Comment[] }>(`/api/v1/comments${suffix}`);\n}\n\nexport function createComment(input: CommentInput) {\n return request<{ comment: Comment }>(\"/api/v1/comments\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function getComment(commentId: string) {\n return request<{ comment: Comment }>(`/api/v1/comments/${commentId}`);\n}\n\nexport function patchComment(commentId: string, patch: Partial<CommentInput>) {\n return request<{ comment: Comment }>(`/api/v1/comments/${commentId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteComment(commentId: string) {\n return request<{ comment: Comment }>(`/api/v1/comments/${commentId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function createInsight(input: CreateInsightInput) {\n return request<{ insight: Insight }>(\"/api/v1/insights\", {\n method: \"POST\",\n body: JSON.stringify({\n ...input,\n originAgentId: input.originAgentId || null,\n originLabel: input.originLabel || null,\n entityType: input.entityType || null,\n entityId: input.entityId || null,\n timeframeLabel: input.timeframeLabel || null,\n visibility: \"visible\",\n status: \"open\",\n evidence: []\n })\n });\n}\n\nexport function patchInsight(insightId: string, patch: Partial<Pick<Insight, \"status\" | \"visibility\" | \"title\" | \"summary\" | \"recommendation\" | \"rationale\" | \"confidence\" | \"ctaLabel\">>) {\n return request<{ insight: Insight }>(`/api/v1/insights/${insightId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function submitInsightFeedback(insightId: string, feedbackType: InsightFeedback[\"feedbackType\"], note = \"\") {\n return request<{ feedback: InsightFeedback }>(`/api/v1/insights/${insightId}/feedback`, {\n method: \"POST\",\n body: JSON.stringify({ feedbackType, note })\n });\n}\n\nexport function getWeeklyReview() {\n return request<{ review: WeeklyReviewPayload }>(\"/api/v1/reviews/weekly\");\n}\n\nexport function listProjects() {\n return request<{ projects: ProjectSummary[] }>(\"/api/v1/projects\");\n}\n\nexport function listTags() {\n return request<{ tags: Tag[] }>(\"/api/v1/tags\");\n}\n\nexport function getTag(tagId: string) {\n return request<{ tag: Tag }>(`/api/v1/tags/${tagId}`);\n}\n\nexport function createTag(input: TagMutationInput) {\n return request<{ tag: Tag }>(\"/api/v1/tags\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchTag(tagId: string, patch: Partial<TagMutationInput>) {\n return request<{ tag: Tag }>(`/api/v1/tags/${tagId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteTag(tagId: string) {\n return request<{ tag: Tag }>(`/api/v1/tags/${tagId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function getGoal(goalId: string) {\n return request<{ goal: Goal }>(`/api/v1/goals/${goalId}`);\n}\n\nexport function getProject(projectId: string) {\n return request<{ project: ProjectSummary }>(`/api/v1/projects/${projectId}`);\n}\n\nexport function getProjectBoard(projectId: string) {\n return request<ProjectBoardPayload>(`/api/v1/projects/${projectId}/board`);\n}\n\nexport function getOperatorContext() {\n return request<{ context: OperatorContextPayload }>(\"/api/v1/operator/context\");\n}\n\nexport function getOperatorOverview() {\n return request<{ overview: OperatorOverviewPayload }>(\"/api/v1/operator/overview\");\n}\n\nexport function getSettings() {\n return request<{ settings: SettingsPayload }>(\"/api/v1/settings\");\n}\n\nexport function getSettingsBin() {\n return request<{ bin: SettingsBinPayload }>(\"/api/v1/settings/bin\");\n}\n\nexport function listAgents() {\n return request<{ agents: AgentIdentity[] }>(\"/api/v1/agents\");\n}\n\nexport function getAgentOnboarding() {\n return request<{ onboarding: AgentOnboardingPayload }>(\"/api/v1/agents/onboarding\");\n}\n\nexport function listAgentActions(agentId: string) {\n return request<{ actions: AgentAction[] }>(`/api/v1/agents/${agentId}/actions`);\n}\n\nexport function listApprovalRequests() {\n return request<{ approvalRequests: ApprovalRequest[] }>(\"/api/v1/approval-requests\");\n}\n\nexport function approveApprovalRequest(approvalRequestId: string, note = \"\") {\n return request<{ approvalRequest: ApprovalRequest }>(`/api/v1/approval-requests/${approvalRequestId}/approve`, {\n method: \"POST\",\n body: JSON.stringify({ note })\n });\n}\n\nexport function rejectApprovalRequest(approvalRequestId: string, note = \"\") {\n return request<{ approvalRequest: ApprovalRequest }>(`/api/v1/approval-requests/${approvalRequestId}/reject`, {\n method: \"POST\",\n body: JSON.stringify({ note })\n });\n}\n\nexport function listRewardRules() {\n return request<{ rules: RewardRule[] }>(\"/api/v1/rewards/rules\");\n}\n\nexport function getRewardRule(ruleId: string) {\n return request<{ rule: RewardRule }>(`/api/v1/rewards/rules/${ruleId}`);\n}\n\nexport function patchRewardRule(ruleId: string, patch: UpdateRewardRuleInput) {\n return request<{ rule: RewardRule }>(`/api/v1/rewards/rules/${ruleId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function createManualRewardGrant(input: CreateManualRewardGrantInput) {\n return request<{ reward: RewardLedgerEvent; metrics: XpMetricsPayload }>(\"/api/v1/rewards/bonus\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function listRewardLedger(limit = 50) {\n return request<{ ledger: RewardLedgerEvent[] }>(`/api/v1/rewards/ledger?limit=${limit}`);\n}\n\nexport function getXpMetrics() {\n return request<{ metrics: XpMetricsPayload }>(\"/api/v1/metrics/xp\");\n}\n\nexport function listEventLog(limit = 50) {\n return request<{ events: EventLogEntry[] }>(`/api/v1/events?limit=${limit}`);\n}\n\nexport function patchSettings(input: Partial<SettingsMutationInput>) {\n return request<{ settings: SettingsPayload }>(\"/api/v1/settings\", {\n method: \"PATCH\",\n body: JSON.stringify(input)\n });\n}\n\nexport function createEntities(input: {\n operations: Array<{\n entityType: CrudEntityType;\n data: Record<string, unknown>;\n clientRef?: string;\n }>;\n atomic?: boolean;\n}) {\n return request<{ results: Array<Record<string, unknown>> }>(\"/api/v1/entities/create\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function updateEntities(input: {\n operations: Array<{\n entityType: CrudEntityType;\n id: string;\n patch: Record<string, unknown>;\n clientRef?: string;\n }>;\n atomic?: boolean;\n}) {\n return request<{ results: Array<Record<string, unknown>> }>(\"/api/v1/entities/update\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function deleteEntities(input: {\n operations: Array<{\n entityType: CrudEntityType;\n id: string;\n mode?: DeleteMode;\n reason?: string;\n clientRef?: string;\n }>;\n atomic?: boolean;\n}) {\n return request<{ results: Array<Record<string, unknown>> }>(\"/api/v1/entities/delete\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function restoreEntities(input: {\n operations: Array<{\n entityType: CrudEntityType;\n id: string;\n clientRef?: string;\n }>;\n atomic?: boolean;\n}) {\n return request<{ results: Array<Record<string, unknown>> }>(\"/api/v1/entities/restore\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function searchEntities(input: {\n searches: Array<{\n entityTypes?: CrudEntityType[];\n query?: string;\n ids?: string[];\n status?: string[];\n linkedTo?: { entityType: CrudEntityType; id: string };\n includeDeleted?: boolean;\n limit?: number;\n clientRef?: string;\n }>;\n}) {\n return request<{ results: Array<Record<string, unknown>> }>(\"/api/v1/entities/search\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function createAgentToken(input: CreateAgentTokenInput) {\n return request<{ token: AgentTokenMutationResult }>(\"/api/v1/settings/tokens\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function createAgentAction(input: {\n actionType: string;\n riskLevel: \"low\" | \"medium\" | \"high\";\n title: string;\n summary: string;\n payload: Record<string, unknown>;\n agentId?: string | null;\n tokenId?: string | null;\n}) {\n return request<{ action: AgentAction; approvalRequest: ApprovalRequest | null }>(\"/api/v1/agent-actions\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function rotateAgentToken(tokenId: string) {\n return request<{ token: AgentTokenMutationResult }>(`/api/v1/settings/tokens/${tokenId}/rotate`, {\n method: \"POST\"\n });\n}\n\nexport function revokeAgentToken(tokenId: string) {\n return request<{ token: { id: string } }>(`/api/v1/settings/tokens/${tokenId}/revoke`, {\n method: \"POST\"\n });\n}\n\nexport function listActivity(input: {\n limit?: number;\n entityType?: string;\n entityId?: string;\n includeCorrected?: boolean;\n} = {}) {\n const search = new URLSearchParams();\n search.set(\"limit\", String(input.limit ?? 100));\n if (input.entityType) {\n search.set(\"entityType\", input.entityType);\n }\n if (input.entityId) {\n search.set(\"entityId\", input.entityId);\n }\n if (input.includeCorrected) {\n search.set(\"includeCorrected\", \"true\");\n }\n return request<{ activity: ForgeSnapshot[\"activity\"] }>(`/api/v1/activity?${search.toString()}`);\n}\n\nexport function createGoal(input: GoalMutationInput) {\n return request<{ goal: Goal }>(\"/api/v1/goals\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function createProject(input: ProjectMutationInput) {\n return request<{ project: Project }>(\"/api/v1/projects\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function patchProject(projectId: string, patch: Partial<ProjectMutationInput>) {\n return request<{ project: Project }>(`/api/v1/projects/${projectId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteProject(projectId: string) {\n return request<{ project: Project }>(`/api/v1/projects/${projectId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function patchGoal(goalId: string, patch: Partial<GoalMutationInput>) {\n return request<{ goal: Goal }>(`/api/v1/goals/${goalId}`, {\n method: \"PATCH\",\n body: JSON.stringify(patch)\n });\n}\n\nexport function deleteGoal(goalId: string) {\n return request<{ goal: Goal }>(`/api/v1/goals/${goalId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function createTask(input: QuickTaskInput) {\n const normalized = {\n ...input,\n goalId: input.goalId || null,\n projectId: input.projectId || null,\n dueDate: input.dueDate || null\n };\n return request<{ task: Task }>(\"/api/v1/tasks\", {\n method: \"POST\",\n body: JSON.stringify(normalized)\n });\n}\n\nexport function patchTask(taskId: string, patch: Partial<QuickTaskInput> & { status?: string }) {\n return request<{ task: unknown }>(`/api/v1/tasks/${taskId}`, {\n method: \"PATCH\",\n body: JSON.stringify({\n ...patch,\n goalId: patch.goalId === \"\" ? null : patch.goalId,\n projectId: patch.projectId === \"\" ? null : patch.projectId,\n dueDate: patch.dueDate === \"\" ? null : patch.dueDate\n })\n });\n}\n\nexport function deleteTask(taskId: string) {\n return request<{ task: unknown }>(`/api/v1/tasks/${taskId}`, {\n method: \"DELETE\"\n });\n}\n\nexport function uncompleteTask(taskId: string) {\n return request<{ task: unknown }>(`/api/v1/tasks/${taskId}/uncomplete`, {\n method: \"POST\",\n body: JSON.stringify({})\n });\n}\n\nexport function getTaskContext(taskId: string) {\n return request<TaskContext>(`/api/v1/tasks/${taskId}/context`);\n}\n\nexport function logOperatorWork(input: OperatorLogWorkInput) {\n return request<OperatorLogWorkResult>(\"/api/v1/operator/log-work\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function removeActivityLog(eventId: string, reason = \"Removed from the visible archive.\") {\n return request<{ event: unknown }>(`/api/v1/activity/${eventId}/remove`, {\n method: \"POST\",\n body: JSON.stringify({ reason })\n });\n}\n\nexport function recordSessionEvent(input: {\n sessionId: string;\n eventType: string;\n metrics: Record<string, string | number | boolean | null>;\n}) {\n return request<{ sessionEvent: unknown; rewardEvent: RewardLedgerEvent | null }>(\"/api/v1/session-events\", {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function claimTaskRun(taskId: string, input: TaskRunClaimInput) {\n return request<{ taskRun: TaskRun }>(`/api/v1/tasks/${taskId}/runs`, {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function heartbeatTaskRun(taskRunId: string, input: TaskRunHeartbeatInput) {\n return request<{ taskRun: TaskRun }>(`/api/v1/task-runs/${taskRunId}/heartbeat`, {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function focusTaskRun(taskRunId: string, input: { actor?: string } = {}) {\n return request<{ taskRun: TaskRun }>(`/api/v1/task-runs/${taskRunId}/focus`, {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function completeTaskRun(taskRunId: string, input: TaskRunFinishInput) {\n return request<{ taskRun: TaskRun }>(`/api/v1/task-runs/${taskRunId}/complete`, {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n\nexport function releaseTaskRun(taskRunId: string, input: TaskRunFinishInput) {\n return request<{ taskRun: TaskRun }>(`/api/v1/task-runs/${taskRunId}/release`, {\n method: \"POST\",\n body: JSON.stringify(input)\n });\n}\n","import { createContext, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { useIsFetching, useIsMutating, useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport {\n Activity,\n ArrowUpRight,\n BarChart3,\n BrainCircuit,\n BriefcaseBusiness,\n ChevronsLeft,\n ChevronsRight,\n Clock3,\n Flame,\n LayoutDashboard,\n Radar,\n RefreshCcw,\n Search,\n Settings,\n Target,\n Zap\n} from \"lucide-react\";\nimport { Link, NavLink, Outlet, useLocation, useOutletContext } from \"react-router-dom\";\nimport { AmbientActivityPill } from \"@/components/experience/ambient-activity-pill\";\nimport { CommandPalette } from \"@/components/experience/command-palette\";\nimport { RouteTransitionFrame } from \"@/components/experience/route-transition-frame\";\nimport { SheetScaffold } from \"@/components/experience/sheet-scaffold\";\nimport { CreateMenu } from \"@/components/create-menu\";\nimport { StartWorkComposer } from \"@/components/start-work-composer\";\nimport { TaskTimerRailProvider, TaskTimerRailBar, TaskTimerRailPanel } from \"@/components/shell/task-timer-rail\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { useLiveEvents } from \"@/hooks/use-live-events\";\nimport {\n claimTaskRun,\n completeTaskRun,\n createGoal,\n createProject,\n createTask,\n ensureOperatorSession,\n getForgeSnapshot,\n getSettings,\n heartbeatTaskRun,\n patchGoal,\n patchProject,\n patchTask,\n focusTaskRun,\n recordSessionEvent,\n releaseTaskRun\n} from \"@/lib/api\";\nimport { I18nProvider, useI18n, type TranslationKey } from \"@/lib/i18n\";\nimport { cn } from \"@/lib/utils\";\nimport type { GoalMutationInput, ProjectMutationInput, QuickTaskInput } from \"@/lib/schemas\";\nimport type { ForgeSnapshot, SettingsPayload } from \"@/lib/types\";\n\ntype ShellContextValue = {\n snapshot: ForgeSnapshot;\n refresh: () => Promise<void>;\n createTask: (input: QuickTaskInput) => Promise<void>;\n startTaskNow: (taskId: string, options?: { timerMode?: \"planned\" | \"unlimited\"; plannedDurationSeconds?: number | null }) => Promise<void>;\n createGoal: (input: GoalMutationInput) => Promise<void>;\n createProject: (input: ProjectMutationInput) => Promise<void>;\n patchGoal: (goalId: string, patch: GoalMutationInput) => Promise<void>;\n patchProject: (projectId: string, patch: ProjectMutationInput) => Promise<void>;\n patchTaskStatus: (taskId: string, status: \"backlog\" | \"focus\" | \"in_progress\" | \"blocked\" | \"done\") => Promise<void>;\n openStartWork: (defaults?: { taskId?: string | null; projectId?: string | null }) => void;\n};\n\nconst ShellContext = createContext<ShellContextValue | null>(null);\n\nconst PRIMARY_ROUTES = [\n { to: \"/overview\", labelKey: \"common.routeLabels.overview\", detailKey: \"common.routeDetails.overview\", icon: LayoutDashboard },\n { to: \"/goals\", labelKey: \"common.routeLabels.goals\", detailKey: \"common.routeDetails.goals\", icon: Target },\n { to: \"/projects\", labelKey: \"common.routeLabels.projects\", detailKey: \"common.routeDetails.projects\", icon: BriefcaseBusiness },\n { to: \"/kanban\", labelKey: \"common.routeLabels.kanban\", detailKey: \"common.routeDetails.kanban\", icon: Zap },\n { to: \"/today\", labelKey: \"common.routeLabels.today\", detailKey: \"common.routeDetails.today\", icon: Clock3 },\n { to: \"/psyche\", labelKey: \"common.routeLabels.psyche\", detailKey: \"common.routeDetails.psyche\", icon: BrainCircuit },\n { to: \"/activity\", labelKey: \"common.routeLabels.activity\", detailKey: \"common.routeDetails.activity\", icon: ArrowUpRight },\n { to: \"/insights\", labelKey: \"common.routeLabels.insights\", detailKey: \"common.routeDetails.insights\", icon: Radar },\n { to: \"/review/weekly\", labelKey: \"common.routeLabels.review\", detailKey: \"common.routeDetails.review\", icon: BarChart3 },\n { to: \"/settings\", labelKey: \"common.routeLabels.settings\", detailKey: \"common.routeDetails.settings\", icon: Settings }\n] as const;\n\nconst MOBILE_CORE_ROUTES = [PRIMARY_ROUTES[0], PRIMARY_ROUTES[4], PRIMARY_ROUTES[3], PRIMARY_ROUTES[5]] as const;\nconst MOBILE_MORE_ROUTES = [PRIMARY_ROUTES[1], PRIMARY_ROUTES[2], PRIMARY_ROUTES[6], PRIMARY_ROUTES[7], PRIMARY_ROUTES[8], PRIMARY_ROUTES[9]] as const;\n\nfunction formatCompactNumber(value: number) {\n return new Intl.NumberFormat(\"en\", {\n notation: \"compact\",\n maximumFractionDigits: value >= 1000 ? 1 : 0\n }).format(value);\n}\n\nfunction NavItem({\n to,\n labelKey,\n icon: Icon,\n compact = false\n}: {\n to: string;\n labelKey: TranslationKey;\n icon: typeof LayoutDashboard;\n compact?: boolean;\n}) {\n const { t } = useI18n();\n const label = t(labelKey);\n\n return (\n <NavLink\n to={to}\n title={compact ? label : undefined}\n aria-label={label}\n className={({ isActive }) =>\n `interactive-tap flex items-center rounded-[18px] text-sm transition ${\n isActive ? \"bg-white/[0.08] text-white shadow-[inset_0_0_0_1px_rgba(192,193,255,0.2)]\" : \"text-white/60 hover:bg-white/[0.04] hover:text-white\"\n } ${compact ? \"justify-center px-3 py-3.5\" : \"gap-3 px-4 py-3\"}`\n }\n >\n <Icon className=\"size-4 shrink-0\" />\n {!compact ? <span>{label}</span> : null}\n </NavLink>\n );\n}\n\nfunction MobileBottomNav() {\n const [moreOpen, setMoreOpen] = useState(false);\n const { t } = useI18n();\n\n return (\n <>\n <nav\n data-testid=\"mobile-bottom-nav\"\n className=\"fixed inset-x-0 bottom-0 z-40 border-t border-white/6 bg-[rgba(9,14,28,0.94)] backdrop-blur-xl lg:hidden\"\n style={{\n paddingLeft: \"max(0.75rem, calc(var(--forge-safe-area-left) + 0.75rem))\",\n paddingRight: \"max(0.75rem, calc(var(--forge-safe-area-right) + 0.75rem))\",\n paddingTop: \"0.75rem\",\n paddingBottom: \"calc(var(--forge-safe-area-bottom) + 0.75rem)\"\n }}\n >\n <div className=\"grid grid-cols-5 gap-2\">\n {MOBILE_CORE_ROUTES.map((route) => (\n <NavLink\n key={route.to}\n to={route.to}\n className={({ isActive }) =>\n `flex min-h-11 flex-col items-center justify-center gap-1 rounded-2xl px-2 py-2 text-[12px] ${\n isActive ? \"bg-white/[0.08] text-[var(--primary)]\" : \"text-white/55\"\n }`\n }\n >\n <route.icon className=\"size-4\" />\n <span>{t(route.labelKey)}</span>\n </NavLink>\n ))}\n <button type=\"button\" className=\"flex min-h-11 flex-col items-center justify-center gap-1 rounded-2xl px-2 py-2 text-[12px] text-white/55\" onClick={() => setMoreOpen(true)}>\n <Settings className=\"size-4\" />\n <span>{t(\"common.shell.more\")}</span>\n </button>\n </div>\n </nav>\n\n <SheetScaffold\n open={moreOpen}\n onOpenChange={setMoreOpen}\n eyebrow={t(\"common.shell.moreRoutesEyebrow\")}\n title={t(\"common.shell.moreRoutesTitle\")}\n description={t(\"common.shell.moreRoutesDescription\")}\n >\n <div className=\"grid gap-3\">\n {MOBILE_MORE_ROUTES.map((route) => (\n <NavLink\n key={route.to}\n to={route.to}\n onClick={() => setMoreOpen(false)}\n className={({ isActive }) =>\n `interactive-tap flex items-center justify-between rounded-[24px] px-4 py-4 ${\n isActive ? \"bg-white/[0.08] text-white\" : \"bg-white/[0.04] text-white/70\"\n }`\n }\n >\n <span className=\"flex items-center gap-3\">\n <route.icon className=\"size-4 text-[var(--primary)]\" />\n <span>\n <span className=\"block text-base font-medium\">{t(route.labelKey)}</span>\n <span className=\"mt-1 block text-sm text-white/54\">{t(route.detailKey)}</span>\n </span>\n </span>\n <ArrowUpRight className=\"size-4 text-white/35\" />\n </NavLink>\n ))}\n </div>\n </SheetScaffold>\n </>\n );\n}\n\nfunction ShellCommandButton({ onClick }: { onClick: () => void }) {\n const { t } = useI18n();\n\n return (\n <Button variant=\"secondary\" size=\"sm\" className=\"min-w-[8.25rem] px-3.5\" onClick={onClick}>\n <Search className=\"size-4\" />\n {t(\"common.shell.command\")}\n <Badge size=\"sm\" tone=\"meta\" className=\"ml-1 hidden bg-white/[0.06] text-white/52 xl:inline-flex\">\n ⌘K\n </Badge>\n </Button>\n );\n}\n\nfunction ShellFrame({\n children,\n settings,\n timerPending,\n startWorkOpen,\n startWorkPending,\n startWorkError,\n startWorkDefaults,\n onOpenStartWork,\n onCloseStartWork,\n onStartExistingTask,\n onCreateAndStartTask,\n onFocusRun,\n onPauseRun,\n onCompleteRun\n}: {\n children: ReactNode;\n settings: SettingsPayload;\n timerPending: boolean;\n startWorkOpen: boolean;\n startWorkPending: boolean;\n startWorkError: string | null;\n startWorkDefaults: { taskId?: string | null; projectId?: string | null };\n onOpenStartWork: (defaults?: { taskId?: string | null; projectId?: string | null }) => void;\n onCloseStartWork: () => void;\n onStartExistingTask: (taskId: string, input: { timerMode: \"planned\" | \"unlimited\"; plannedDurationSeconds: number | null }) => Promise<void>;\n onCreateAndStartTask: (input: {\n title: string;\n description: string;\n projectId: string;\n timerMode: \"planned\" | \"unlimited\";\n plannedDurationSeconds: number | null;\n }) => Promise<void>;\n onFocusRun: (runId: string) => Promise<void>;\n onPauseRun: (runId: string) => Promise<void>;\n onCompleteRun: (runId: string) => Promise<void>;\n}) {\n const location = useLocation();\n const shell = useForgeShell();\n const { t } = useI18n();\n const active = PRIMARY_ROUTES.find((route) => location.pathname.startsWith(route.to)) ?? PRIMARY_ROUTES[0];\n const [paletteOpen, setPaletteOpen] = useState(false);\n const [collapsed, setCollapsed] = useState(false);\n const [navCollapsed, setNavCollapsed] = useState(false);\n const isPsyche = location.pathname.startsWith(\"/psyche\");\n const fetching = useIsFetching();\n const mutating = useIsMutating();\n const reduceMotion = useReducedMotion();\n const activityCount = fetching + mutating;\n const sidebarMetrics = [\n {\n id: \"streak\",\n label: t(\"common.shell.momentum.streak\"),\n compactValue: String(shell.snapshot.metrics.streakDays),\n expandedValue: t(shell.snapshot.metrics.streakDays === 1 ? \"common.shell.momentum.streakBadgeOne\" : \"common.shell.momentum.streakBadgeOther\", {\n count: shell.snapshot.metrics.streakDays\n }),\n icon: Flame\n },\n {\n id: \"xp\",\n label: t(\"common.shell.momentum.xp\"),\n compactValue: String(shell.snapshot.metrics.totalXp),\n expandedValue: `${shell.snapshot.metrics.totalXp} XP`,\n icon: Zap\n },\n {\n id: \"momentum\",\n label: t(\"common.shell.momentum.momentum\"),\n compactValue: `${shell.snapshot.metrics.momentumScore}%`,\n expandedValue: t(\"common.shell.momentum.liveMomentum\", { count: shell.snapshot.metrics.momentumScore }),\n icon: Activity\n }\n ] as const;\n const activityLabel =\n mutating > 0\n ? t(mutating === 1 ? \"common.shell.savingOne\" : \"common.shell.savingOther\", { count: mutating })\n : fetching > 0\n ? t(fetching === 1 ? \"common.shell.refreshingOne\" : \"common.shell.refreshingOther\", { count: fetching })\n : t(\"common.shell.settled\");\n\n const railLinks = useMemo(() => {\n if (location.pathname.startsWith(\"/tasks/\")) {\n return [\n { to: \"/kanban\", label: t(\"common.shell.rail.taskBackToKanban\") },\n { to: \"/today\", label: t(\"common.shell.rail.taskOpenToday\") }\n ];\n }\n if (location.pathname.startsWith(\"/projects/\")) {\n return [\n { to: \"/projects\", label: t(\"common.shell.rail.projectAll\") },\n { to: \"/goals\", label: t(\"common.shell.rail.projectGoals\") }\n ];\n }\n if (location.pathname.startsWith(\"/goals/\")) {\n return [\n { to: \"/goals\", label: t(\"common.shell.rail.goalAll\") },\n { to: \"/projects\", label: t(\"common.shell.rail.goalProjects\") }\n ];\n }\n if (location.pathname.startsWith(\"/psyche\")) {\n return [\n { to: \"/psyche\", label: t(\"common.shell.rail.psycheHub\") },\n { to: \"/psyche/reports\", label: t(\"common.shell.rail.psycheReports\") }\n ];\n }\n return [\n { to: \"/overview\", label: t(\"common.shell.rail.overview\") },\n { to: \"/today\", label: t(\"common.shell.rail.today\") }\n ];\n }, [location.pathname, t]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"k\") {\n event.preventDefault();\n setPaletteOpen((current) => !current);\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, []);\n\n useEffect(() => {\n try {\n const stored = window.localStorage.getItem(\"forge.desktop-nav-collapsed\");\n if (stored === \"true\") {\n setNavCollapsed(true);\n }\n } catch {\n return;\n }\n }, []);\n\n useEffect(() => {\n try {\n window.localStorage.setItem(\"forge.desktop-nav-collapsed\", String(navCollapsed));\n } catch {\n return;\n }\n }, [navCollapsed]);\n\n useEffect(() => {\n const threshold = window.innerWidth >= 1024 ? 52 : 32;\n\n const syncCollapsed = () => {\n setCollapsed(window.scrollY > threshold);\n };\n\n syncCollapsed();\n window.addEventListener(\"scroll\", syncCollapsed, { passive: true });\n window.addEventListener(\"resize\", syncCollapsed);\n return () => {\n window.removeEventListener(\"scroll\", syncCollapsed);\n window.removeEventListener(\"resize\", syncCollapsed);\n };\n }, []);\n\n return (\n <div className={`min-h-screen ${shell.snapshot.meta.mode === \"transitional-node\" ? \"theme-forge-obsidian\" : \"\"}`}>\n <CommandPalette open={paletteOpen} onOpenChange={setPaletteOpen} snapshot={shell.snapshot} />\n\n <div\n className=\"hidden lg:grid lg:min-h-screen\"\n style={{ gridTemplateColumns: navCollapsed ? \"5.75rem minmax(0,1fr)\" : \"17.75rem minmax(0,1fr)\" }}\n >\n <aside\n className={cn(\n \"flex min-h-screen flex-col border-r border-white/5 bg-[rgba(8,13,28,0.78)] py-6 backdrop-blur-xl transition-[padding,width]\",\n navCollapsed ? \"px-3\" : \"px-5\"\n )}\n >\n <div className={cn(\"flex items-start\", navCollapsed ? \"flex-col items-center gap-3\" : \"justify-between gap-3\")}>\n <Link to=\"/overview\" className={cn(\"block min-w-0\", navCollapsed && \"text-center\")}>\n <div className={cn(\"font-display text-[var(--primary)]\", navCollapsed ? \"text-2xl\" : \"text-3xl\")}>{t(\"common.shell.appMark\")}</div>\n {!navCollapsed ? <div className=\"type-meta mt-2 text-white/40\">Level {shell.snapshot.metrics.level}</div> : null}\n </Link>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n className=\"mt-0.5 px-2.5\"\n onClick={() => setNavCollapsed((current) => !current)}\n aria-label={t(navCollapsed ? \"common.shell.expandSidebar\" : \"common.shell.collapseSidebar\")}\n title={t(navCollapsed ? \"common.shell.expandSidebar\" : \"common.shell.collapseSidebar\")}\n >\n {navCollapsed ? <ChevronsRight className=\"size-4\" /> : <ChevronsLeft className=\"size-4\" />}\n </Button>\n </div>\n\n <div className={cn(\"grid gap-2\", navCollapsed ? \"mt-6\" : \"mt-8\")}>\n {PRIMARY_ROUTES.map((route) => (\n <NavItem key={route.to} to={route.to} labelKey={route.labelKey} icon={route.icon} compact={navCollapsed} />\n ))}\n </div>\n\n <div className={cn(navCollapsed ? \"mt-4\" : \"mt-6\")}>\n <div className={cn(\"rounded-[24px] bg-white/[0.04]\", navCollapsed ? \"px-2 py-2.5\" : \"p-4\")}>\n {!navCollapsed ? <div className=\"type-label text-white/40\">{t(\"common.shell.momentum.title\")}</div> : null}\n <div className={cn(\"grid\", navCollapsed ? \"gap-1.5\" : \"mt-3 gap-3\")}>\n {sidebarMetrics.map((metric) => {\n const Icon = metric.icon;\n return navCollapsed ? (\n <div\n key={metric.id}\n title={`${metric.label}: ${metric.compactValue}`}\n className=\"flex min-w-0 flex-col items-center gap-1 rounded-[16px] bg-white/[0.04] px-1 py-2.5 text-center\"\n >\n <Icon className=\"size-3.5 shrink-0 text-white/42\" />\n <div className=\"max-w-full text-[12px] font-semibold leading-none text-white\">{metric.compactValue}</div>\n </div>\n ) : (\n <div key={metric.id} className=\"rounded-[18px] bg-white/[0.04] px-3 py-3\">\n <div className=\"text-[11px] uppercase tracking-[0.14em] text-white/42\">{metric.label}</div>\n <div className=\"mt-1 text-lg font-semibold leading-tight text-white\">{metric.expandedValue}</div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n </aside>\n\n <div className=\"min-h-screen\">\n <TaskTimerRailProvider>\n <motion.header\n className=\"sticky top-0 z-30 border-b border-white/5 bg-[rgba(10,16,30,0.82)] px-6 backdrop-blur-xl\"\n animate={reduceMotion ? undefined : { paddingTop: collapsed ? 6 : 10, paddingBottom: collapsed ? 6 : 9 }}\n transition={{ duration: 0.35, ease: \"easeOut\" }}\n >\n {/* ── Title row: page title + work bar + action buttons — all same height ── */}\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex min-w-0 flex-1 items-center gap-5\">\n <motion.div\n className=\"shrink-0 font-display text-white\"\n animate={reduceMotion ? undefined : { fontSize: collapsed ? \"1rem\" : \"1.12rem\", lineHeight: 1 }}\n transition={{ duration: 0.35, ease: \"easeOut\" }}\n >\n {t(active.labelKey)}\n </motion.div>\n <div className=\"min-w-0 flex-1\">\n <TaskTimerRailBar\n runs={shell.snapshot.activeTaskRuns}\n tasks={shell.snapshot.tasks}\n generatedAt={shell.snapshot.meta.generatedAt}\n timeAccountingMode={settings.execution.timeAccountingMode}\n pending={timerPending}\n onOpenStartWork={() => onOpenStartWork()}\n onPause={onPauseRun}\n onFocus={onFocusRun}\n />\n </div>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n <AmbientActivityPill active={activityCount > 0} label={activityLabel} />\n <ShellCommandButton onClick={() => setPaletteOpen(true)} />\n <Button variant=\"secondary\" size=\"sm\" className=\"min-w-[7.25rem] px-3.5\" onClick={() => void shell.refresh()}>\n <RefreshCcw className=\"size-4\" />\n {t(\"common.actions.refresh\")}\n </Button>\n </div>\n </div>\n\n {/* ── Expanded work detail — full width below the title row ── */}\n <TaskTimerRailPanel\n runs={shell.snapshot.activeTaskRuns}\n tasks={shell.snapshot.tasks}\n generatedAt={shell.snapshot.meta.generatedAt}\n timeAccountingMode={settings.execution.timeAccountingMode}\n pending={timerPending}\n onOpenStartWork={() => onOpenStartWork()}\n onFocus={onFocusRun}\n onPause={onPauseRun}\n onComplete={onCompleteRun}\n />\n\n <AnimatePresence initial={false}>\n {!collapsed ? (\n <motion.div\n key=\"desktop-shell-secondary-row\"\n className=\"mt-3 flex items-center justify-between gap-4 border-t border-white/6 pt-3\"\n initial={reduceMotion ? undefined : { opacity: 0, height: 0, marginTop: 0, paddingTop: 0 }}\n animate={reduceMotion ? undefined : { opacity: 1, height: \"auto\", marginTop: 12, paddingTop: 12 }}\n exit={reduceMotion ? undefined : { opacity: 0, height: 0, marginTop: 0, paddingTop: 0 }}\n transition={{ duration: 0.28, ease: \"easeOut\" }}\n >\n <div className=\"flex flex-wrap gap-2\">\n {railLinks.map((link) => (\n <Link\n key={link.to}\n to={link.to}\n className=\"interactive-tap inline-flex min-h-10 min-w-max items-center justify-center rounded-full bg-white/[0.04] px-4 py-2 text-[13px] leading-none whitespace-nowrap text-white/62 transition hover:bg-white/[0.07] hover:text-white\"\n >\n {link.label}\n </Link>\n ))}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Badge tone=\"meta\">\n {t(shell.snapshot.metrics.streakDays === 1 ? \"common.shell.momentum.streakBadgeOne\" : \"common.shell.momentum.streakBadgeOther\", {\n count: shell.snapshot.metrics.streakDays\n })}\n </Badge>\n <Badge tone=\"meta\">{t(\"common.shell.momentum.weeklyXp\", { count: shell.snapshot.metrics.weeklyXp })}</Badge>\n <Badge tone={isPsyche ? \"signal\" : \"meta\"}>\n {isPsyche ? t(\"common.shell.momentum.psycheMode\") : t(\"common.shell.momentum.liveMomentum\", { count: shell.snapshot.metrics.momentumScore })}\n </Badge>\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </motion.header>\n </TaskTimerRailProvider>\n\n <div className=\"px-6 pt-3\">\n <StartWorkComposer\n open={startWorkOpen}\n onOpenChange={(open) => {\n if (!open) {\n onCloseStartWork();\n }\n }}\n presentation=\"desktop_inline\"\n tasks={shell.snapshot.tasks}\n projects={shell.snapshot.dashboard.projects}\n activeRunCount={shell.snapshot.activeTaskRuns.length}\n maxActiveTasks={settings.execution.maxActiveTasks}\n timeAccountingMode={settings.execution.timeAccountingMode}\n pending={startWorkPending}\n errorMessage={startWorkError}\n initialTaskId={startWorkDefaults.taskId ?? null}\n defaultProjectId={startWorkDefaults.projectId ?? null}\n onStartExisting={onStartExistingTask}\n onCreateAndStart={onCreateAndStartTask}\n />\n </div>\n\n <main className=\"px-6 py-3\">\n <RouteTransitionFrame routeKey={location.pathname} tone={isPsyche ? \"psyche\" : \"core\"}>\n {children}\n </RouteTransitionFrame>\n </main>\n </div>\n </div>\n\n <div className=\"min-h-[100dvh] overflow-x-clip lg:hidden\">\n <TaskTimerRailProvider>\n <motion.header\n className=\"sticky top-0 z-30 border-b border-white/6 bg-[rgba(8,13,28,0.92)] px-4 backdrop-blur-xl\"\n animate={reduceMotion ? undefined : { paddingTop: collapsed ? 6 : 9, paddingBottom: collapsed ? 6 : 8 }}\n transition={{ duration: 0.35, ease: \"easeOut\" }}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <div className={cn(\"shrink-0 font-display text-white transition\", collapsed ? \"text-[0.95rem]\" : \"text-base\")}>{t(active.labelKey)}</div>\n <div className=\"min-w-0 flex-1\">\n <TaskTimerRailBar\n runs={shell.snapshot.activeTaskRuns}\n tasks={shell.snapshot.tasks}\n generatedAt={shell.snapshot.meta.generatedAt}\n timeAccountingMode={settings.execution.timeAccountingMode}\n pending={timerPending}\n onOpenStartWork={() => onOpenStartWork()}\n onPause={onPauseRun}\n onFocus={onFocusRun}\n />\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n <Button variant=\"secondary\" size=\"sm\" className=\"min-h-[2.125rem] px-2.5\" onClick={() => setPaletteOpen(true)}>\n <Search className=\"size-4\" />\n </Button>\n <div className=\"inline-flex min-h-[2.125rem] items-center gap-1.5 rounded-full border border-white/8 bg-white/[0.05] px-2.5 text-[12px] font-medium text-[var(--primary)]\">\n <Zap className=\"size-3.5 shrink-0\" />\n <span>{formatCompactNumber(shell.snapshot.metrics.totalXp)} XP</span>\n </div>\n </div>\n </div>\n\n {/* ── Expanded work detail — full width below the title row ── */}\n <TaskTimerRailPanel\n runs={shell.snapshot.activeTaskRuns}\n tasks={shell.snapshot.tasks}\n generatedAt={shell.snapshot.meta.generatedAt}\n timeAccountingMode={settings.execution.timeAccountingMode}\n pending={timerPending}\n onOpenStartWork={() => onOpenStartWork()}\n onFocus={onFocusRun}\n onPause={onPauseRun}\n onComplete={onCompleteRun}\n />\n\n {!collapsed ? (\n <>\n <AnimatePresence initial={false}>\n <motion.div\n key=\"mobile-shell-copy\"\n initial={reduceMotion ? undefined : { opacity: 0, height: 0 }}\n animate={reduceMotion ? undefined : { opacity: 1, height: \"auto\" }}\n exit={reduceMotion ? undefined : { opacity: 0, height: 0 }}\n transition={{ duration: 0.28, ease: \"easeOut\" }}\n className=\"overflow-hidden\"\n >\n <div className=\"mt-2 text-[13px] leading-5 text-white/52\">{t(active.detailKey)}</div>\n </motion.div>\n </AnimatePresence>\n <div className=\"mt-2\">\n <AmbientActivityPill active={activityCount > 0} label={activityLabel} />\n </div>\n </>\n ) : null}\n </motion.header>\n </TaskTimerRailProvider>\n\n <StartWorkComposer\n open={startWorkOpen}\n onOpenChange={(open) => {\n if (!open) {\n onCloseStartWork();\n }\n }}\n presentation=\"mobile_sheet\"\n tasks={shell.snapshot.tasks}\n projects={shell.snapshot.dashboard.projects}\n activeRunCount={shell.snapshot.activeTaskRuns.length}\n maxActiveTasks={settings.execution.maxActiveTasks}\n timeAccountingMode={settings.execution.timeAccountingMode}\n pending={startWorkPending}\n errorMessage={startWorkError}\n initialTaskId={startWorkDefaults.taskId ?? null}\n defaultProjectId={startWorkDefaults.projectId ?? null}\n onStartExisting={onStartExistingTask}\n onCreateAndStart={onCreateAndStartTask}\n />\n\n <main\n className=\"overflow-x-clip px-4 py-2.5 lg:pb-24\"\n style={{\n paddingBottom: \"calc(var(--forge-mobile-nav-clearance) + 2.5rem)\",\n paddingLeft: \"max(1rem, calc(var(--forge-safe-area-left) + 1rem))\",\n paddingRight: \"max(1rem, calc(var(--forge-safe-area-right) + 1rem))\"\n }}\n >\n <RouteTransitionFrame routeKey={location.pathname} tone={isPsyche ? \"psyche\" : \"core\"}>\n {children}\n </RouteTransitionFrame>\n </main>\n <MobileBottomNav />\n </div>\n\n <CreateMenu\n className=\"fixed z-40 lg:bottom-6 lg:right-6\"\n goals={shell.snapshot.dashboard.goals}\n projects={shell.snapshot.dashboard.projects}\n tags={shell.snapshot.tags}\n onCreateGoal={shell.createGoal}\n onCreateProject={shell.createProject}\n onCreateTask={shell.createTask}\n />\n </div>\n );\n}\n\nexport function AppShell() {\n useLiveEvents();\n const sessionIdRef = useRef(`forge_session_${Math.random().toString(36).slice(2, 10)}`);\n const xpTimerRef = useRef<number | null>(null);\n const previousXpRef = useRef<number | null>(null);\n const queryClient = useQueryClient();\n const [startWorkOpen, setStartWorkOpen] = useState(false);\n const [startWorkDefaults, setStartWorkDefaults] = useState<{ taskId?: string | null; projectId?: string | null }>({});\n const [startWorkError, setStartWorkError] = useState<string | null>(null);\n const [xpNotice, setXpNotice] = useState<{ deltaXp: number; totalXp: number } | null>(null);\n const operatorSessionQuery = useQuery({\n queryKey: [\"forge-shell-operator-session\"],\n queryFn: ensureOperatorSession\n });\n const snapshotQuery = useQuery({\n queryKey: [\"forge-snapshot\"],\n queryFn: getForgeSnapshot,\n enabled: operatorSessionQuery.isSuccess\n });\n const settingsQuery = useQuery({\n queryKey: [\"forge-settings\"],\n queryFn: getSettings,\n enabled: operatorSessionQuery.isSuccess\n });\n\n useEffect(() => {\n const totalXp = snapshotQuery.data?.metrics.totalXp;\n if (typeof totalXp !== \"number\") {\n return;\n }\n\n if (previousXpRef.current === null) {\n previousXpRef.current = totalXp;\n return;\n }\n\n const deltaXp = totalXp - previousXpRef.current;\n previousXpRef.current = totalXp;\n if (deltaXp === 0) {\n return;\n }\n\n setXpNotice({ deltaXp, totalXp });\n if (xpTimerRef.current !== null) {\n window.clearTimeout(xpTimerRef.current);\n }\n xpTimerRef.current = window.setTimeout(() => {\n setXpNotice(null);\n xpTimerRef.current = null;\n }, 2600);\n }, [snapshotQuery.data?.metrics.totalXp]);\n\n useEffect(() => {\n return () => {\n if (xpTimerRef.current !== null) {\n window.clearTimeout(xpTimerRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n if (!operatorSessionQuery.isSuccess) {\n return;\n }\n\n let interacted = false;\n let dwellSent = false;\n let scrollSent = false;\n\n const markInteraction = () => {\n interacted = true;\n };\n\n const sendEvent = (eventType: string, metrics: Record<string, string | number | boolean | null>) =>\n recordSessionEvent({\n sessionId: sessionIdRef.current,\n eventType,\n metrics\n }).catch(() => undefined);\n\n void sendEvent(\"session_started\", {\n visible: document.visibilityState === \"visible\",\n interacted: false\n });\n\n const dwellTimer = window.setTimeout(() => {\n if (document.visibilityState === \"visible\" && interacted && !dwellSent) {\n dwellSent = true;\n void sendEvent(\"dwell_120_seconds\", {\n visible: true,\n interacted: true\n });\n }\n }, 120_000);\n\n const onScroll = () => {\n const denominator = Math.max(1, document.documentElement.scrollHeight - window.innerHeight);\n const progress = Math.round((window.scrollY / denominator) * 100);\n if (progress >= 75 && interacted && !scrollSent) {\n scrollSent = true;\n void sendEvent(\"scroll_depth_75\", {\n visible: document.visibilityState === \"visible\",\n interacted: true,\n scrollDepth: progress\n });\n }\n };\n\n window.addEventListener(\"pointerdown\", markInteraction);\n window.addEventListener(\"keydown\", markInteraction);\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n\n return () => {\n window.clearTimeout(dwellTimer);\n window.removeEventListener(\"pointerdown\", markInteraction);\n window.removeEventListener(\"keydown\", markInteraction);\n window.removeEventListener(\"scroll\", onScroll);\n };\n }, [operatorSessionQuery.isSuccess]);\n\n const createTaskMutation = useMutation({\n mutationFn: (input: QuickTaskInput) => createTask(input),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n\n const createGoalMutation = useMutation({\n mutationFn: (input: GoalMutationInput) => createGoal(input),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n\n const createProjectMutation = useMutation({\n mutationFn: (input: ProjectMutationInput) => createProject(input),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n\n const patchGoalMutation = useMutation({\n mutationFn: ({ goalId, patch }: { goalId: string; patch: GoalMutationInput }) => patchGoal(goalId, patch),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n\n const patchProjectMutation = useMutation({\n mutationFn: ({ projectId, patch }: { projectId: string; patch: ProjectMutationInput }) => patchProject(projectId, patch),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n\n const patchTaskMutation = useMutation({\n mutationFn: ({ taskId, status }: { taskId: string; status: \"backlog\" | \"focus\" | \"in_progress\" | \"blocked\" | \"done\" }) =>\n patchTask(taskId, { status }),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n const claimTaskRunMutation = useMutation({\n mutationFn: ({ taskId, input }: { taskId: string; input: Parameters<typeof claimTaskRun>[1] }) => claimTaskRun(taskId, input),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n const focusTaskRunMutation = useMutation({\n mutationFn: (runId: string) => focusTaskRun(runId),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n const releaseTaskRunMutation = useMutation({\n mutationFn: ({ runId, actor, note }: { runId: string; actor?: string; note?: string }) =>\n releaseTaskRun(runId, { actor, note: note ?? \"\" }),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n const completeTaskRunMutation = useMutation({\n mutationFn: ({ runId, actor, note }: { runId: string; actor?: string; note?: string }) =>\n completeTaskRun(runId, { actor, note: note ?? \"\" }),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n\n const createAndStartTaskMutation = useMutation({\n mutationFn: async (input: {\n title: string;\n description: string;\n projectId: string;\n timerMode: \"planned\" | \"unlimited\";\n plannedDurationSeconds: number | null;\n }) => {\n const project = snapshotQuery.data?.dashboard.projects.find((entry) => entry.id === input.projectId);\n if (!project) {\n throw new Error(\"Select a project before starting work.\");\n }\n const operatorName = settingsQuery.data?.settings.profile.operatorName ?? \"Albert\";\n const created = await createTask({\n title: input.title,\n description: input.description,\n owner: operatorName,\n goalId: project.goalId,\n projectId: project.id,\n priority: \"medium\",\n status: \"in_progress\",\n effort: \"deep\",\n energy: \"steady\",\n dueDate: \"\",\n points: 60,\n tagIds: []\n });\n await claimTaskRun(created.task.id, {\n actor: operatorName,\n timerMode: input.timerMode,\n plannedDurationSeconds: input.plannedDurationSeconds,\n isCurrent: true,\n leaseTtlSeconds: 1800,\n note: \"\"\n });\n return created.task;\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }\n });\n\n useEffect(() => {\n const snapshot = snapshotQuery.data;\n if (!snapshot || snapshot.activeTaskRuns.length === 0) {\n return;\n }\n\n const timer = window.setInterval(() => {\n if (document.visibilityState !== \"visible\") {\n return;\n }\n for (const run of snapshot.activeTaskRuns) {\n void heartbeatTaskRun(run.id, {\n actor: run.actor,\n leaseTtlSeconds: run.leaseTtlSeconds,\n note: run.note\n }).catch(() => undefined);\n }\n void queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n }, 30_000);\n\n return () => window.clearInterval(timer);\n }, [queryClient, snapshotQuery.data]);\n\n if (operatorSessionQuery.isLoading || snapshotQuery.isLoading || settingsQuery.isLoading) {\n return (\n <div className=\"grid min-h-screen place-items-center p-6\">\n <LoadingState eyebrow=\"Forge shell\" title=\"Loading Forge\" description=\"Checking your operator session and loading your latest snapshot.\" />\n </div>\n );\n }\n\n if (operatorSessionQuery.isError) {\n return (\n <div className=\"grid min-h-screen place-items-center p-6\">\n <ErrorState\n eyebrow=\"Forge operator session\"\n error={operatorSessionQuery.error}\n onRetry={() => void queryClient.invalidateQueries({ queryKey: [\"forge-shell-operator-session\"] })}\n />\n </div>\n );\n }\n\n if (settingsQuery.isError) {\n return (\n <div className=\"grid min-h-screen place-items-center p-6\">\n <ErrorState eyebrow=\"Forge settings\" error={settingsQuery.error} onRetry={() => void queryClient.invalidateQueries({ queryKey: [\"forge-settings\"] })} />\n </div>\n );\n }\n\n if (snapshotQuery.isError || !snapshotQuery.data || !settingsQuery.data) {\n return (\n <div className=\"grid min-h-screen place-items-center p-6\">\n <ErrorState eyebrow=\"Forge state\" error={snapshotQuery.error} onRetry={() => void queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] })} />\n </div>\n );\n }\n\n const contextValue: ShellContextValue = {\n snapshot: snapshotQuery.data,\n refresh: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] });\n },\n createTask: async (input) => {\n await createTaskMutation.mutateAsync(input);\n },\n startTaskNow: async (taskId, options = {}) => {\n const operatorName = settingsQuery.data.settings.profile.operatorName;\n await claimTaskRunMutation.mutateAsync({\n taskId,\n input: {\n actor: operatorName,\n timerMode: options.timerMode ?? \"planned\",\n plannedDurationSeconds: options.plannedDurationSeconds === undefined ? 20 * 60 : options.plannedDurationSeconds,\n isCurrent: true,\n leaseTtlSeconds: 1800,\n note: \"\"\n }\n });\n },\n createGoal: async (input) => {\n await createGoalMutation.mutateAsync(input);\n },\n createProject: async (input) => {\n await createProjectMutation.mutateAsync(input);\n },\n patchGoal: async (goalId, patch) => {\n await patchGoalMutation.mutateAsync({ goalId, patch });\n },\n patchProject: async (projectId, patch) => {\n await patchProjectMutation.mutateAsync({ projectId, patch });\n },\n patchTaskStatus: async (taskId, status) => {\n await patchTaskMutation.mutateAsync({ taskId, status });\n },\n openStartWork: (defaults = {}) => {\n setStartWorkDefaults(defaults);\n setStartWorkError(null);\n setStartWorkOpen(true);\n }\n };\n\n return (\n <I18nProvider locale={settingsQuery.data.settings.localePreference}>\n <ShellContext.Provider value={contextValue}>\n <>\n <ShellFrame\n settings={settingsQuery.data.settings}\n timerPending={focusTaskRunMutation.isPending || releaseTaskRunMutation.isPending || completeTaskRunMutation.isPending}\n startWorkOpen={startWorkOpen}\n startWorkPending={claimTaskRunMutation.isPending || createAndStartTaskMutation.isPending}\n startWorkError={startWorkError}\n startWorkDefaults={startWorkDefaults}\n onOpenStartWork={(defaults) => {\n setStartWorkDefaults(defaults ?? {});\n setStartWorkError(null);\n setStartWorkOpen(true);\n }}\n onCloseStartWork={() => {\n setStartWorkOpen(false);\n setStartWorkError(null);\n }}\n onStartExistingTask={async (taskId, input) => {\n try {\n const operatorName = settingsQuery.data.settings.profile.operatorName;\n await claimTaskRunMutation.mutateAsync({\n taskId,\n input: {\n actor: operatorName,\n timerMode: input.timerMode,\n plannedDurationSeconds: input.plannedDurationSeconds,\n isCurrent: true,\n leaseTtlSeconds: 1800,\n note: \"\"\n }\n });\n setStartWorkOpen(false);\n setStartWorkError(null);\n } catch (error) {\n setStartWorkError(error instanceof Error ? error.message : \"Could not start work.\");\n }\n }}\n onCreateAndStartTask={async (input) => {\n try {\n await createAndStartTaskMutation.mutateAsync(input);\n setStartWorkOpen(false);\n setStartWorkError(null);\n } catch (error) {\n setStartWorkError(error instanceof Error ? error.message : \"Could not create and start the task.\");\n }\n }}\n onFocusRun={async (runId) => {\n await focusTaskRunMutation.mutateAsync(runId);\n }}\n onPauseRun={async (runId) => {\n const run = snapshotQuery.data.activeTaskRuns.find((entry) => entry.id === runId);\n await releaseTaskRunMutation.mutateAsync({ runId, actor: run?.actor, note: run?.note });\n }}\n onCompleteRun={async (runId) => {\n const run = snapshotQuery.data.activeTaskRuns.find((entry) => entry.id === runId);\n await completeTaskRunMutation.mutateAsync({ runId, actor: run?.actor, note: run?.note });\n }}\n >\n <Outlet context={contextValue} />\n </ShellFrame>\n {xpNotice ? (\n <div className=\"pointer-events-none fixed inset-x-0 bottom-24 z-50 flex justify-center px-4 lg:bottom-6\">\n <div\n className={cn(\n \"inline-flex items-center gap-2 rounded-full border px-4 py-2 text-sm font-medium shadow-[0_18px_48px_rgba(3,8,18,0.38)] backdrop-blur-xl\",\n xpNotice.deltaXp > 0\n ? \"border-emerald-400/30 bg-emerald-500/14 text-emerald-100\"\n : \"border-rose-400/30 bg-rose-500/14 text-rose-100\"\n )}\n >\n <Zap className=\"size-4 shrink-0\" />\n <span>\n {xpNotice.deltaXp > 0 ? `XP +${xpNotice.deltaXp}` : `XP ${xpNotice.deltaXp}`} · {formatCompactNumber(xpNotice.totalXp)} total\n </span>\n </div>\n </div>\n ) : null}\n </>\n </ShellContext.Provider>\n </I18nProvider>\n );\n}\n\nexport function useForgeShell() {\n return useContext(ShellContext) ?? useOutletContext<ShellContextValue>();\n}\n","import type { ReactNode } from \"react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { getEntityVisual, type EntityKind } from \"@/lib/entity-visuals\";\nimport { cn } from \"@/lib/utils\";\n\nexport type HeroCopyMode = \"title_only\" | \"title_plus_orientation\";\n\nfunction normalizeCopyValue(value: string) {\n return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, \" \");\n}\n\nfunction resolveHeroMeta({\n eyebrow,\n titleText,\n entityKind,\n copyMode\n}: {\n eyebrow?: ReactNode;\n titleText?: string;\n entityKind?: EntityKind;\n copyMode: HeroCopyMode;\n}) {\n if (!eyebrow || copyMode === \"title_only\" || typeof eyebrow !== \"string\") {\n return null;\n }\n\n const eyebrowValue = normalizeCopyValue(eyebrow);\n const titleValue = titleText ? normalizeCopyValue(titleText) : null;\n const entityLabelValue = entityKind ? normalizeCopyValue(getEntityVisual(entityKind).label) : null;\n\n if (!eyebrowValue) {\n return null;\n }\n\n if (titleValue && (eyebrowValue === titleValue || titleValue.includes(eyebrowValue) || eyebrowValue.includes(titleValue))) {\n return null;\n }\n\n if (entityLabelValue && eyebrowValue === entityLabelValue) {\n return null;\n }\n\n return eyebrow;\n}\n\nexport function PageHero({\n eyebrow,\n entityKind,\n title,\n titleText,\n description,\n badge,\n actions,\n copyMode = \"title_only\"\n}: {\n eyebrow?: ReactNode;\n entityKind?: EntityKind;\n title: ReactNode;\n titleText?: string;\n description: string;\n badge?: ReactNode;\n actions?: ReactNode;\n copyMode?: HeroCopyMode;\n}) {\n const entityVisual = entityKind ? getEntityVisual(entityKind) : null;\n const Icon = entityVisual?.icon;\n const resolvedEyebrow = resolveHeroMeta({ eyebrow, titleText, entityKind, copyMode });\n const hasHeaderMeta = Boolean(entityVisual || resolvedEyebrow || badge);\n\n return (\n <section className=\"grid w-full max-w-full min-w-0 gap-1.5 rounded-[24px] bg-[var(--hero-gradient)] px-4 py-2.5 shadow-[var(--card-shadow)] lg:grid-cols-[minmax(0,1fr)_auto] lg:px-5 lg:py-3\">\n <div className=\"min-w-0\">\n {hasHeaderMeta ? (\n <div className=\"flex flex-wrap items-center gap-3\">\n {entityVisual && Icon ? (\n <div\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-full border bg-white/[0.04] shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]\",\n entityVisual.subtleBadgeClassName\n )}\n aria-label={entityVisual.label}\n title={entityVisual.label}\n >\n <Icon className={cn(\"size-4\", entityVisual.iconClassName)} />\n </div>\n ) : null}\n {resolvedEyebrow ? <div className=\"type-label text-[var(--secondary)]\">{resolvedEyebrow}</div> : null}\n {badge ? <Badge tone=\"signal\" className=\"bg-white/[0.08] text-white/78\">{badge}</Badge> : null}\n </div>\n ) : null}\n <div className={cn(\"max-w-4xl text-[clamp(1.2rem,1.85vw,1.7rem)] leading-[1] text-white\", hasHeaderMeta ? \"mt-1.5\" : \"\")}>{title}</div>\n <p className=\"mt-1 hidden max-w-3xl text-[13px] leading-5 text-white/54 sm:block\">{description}</p>\n </div>\n {actions ? <div className=\"flex min-w-0 flex-wrap items-start gap-2 lg:justify-end\">{actions}</div> : null}\n </section>\n );\n}\n","import type { ActivityEvent } from \"@/lib/types\";\n\nexport function getActivityEventHref(event: ActivityEvent): string | null {\n if (event.entityType === \"goal\") {\n return `/goals/${event.entityId}`;\n }\n\n if (event.entityType === \"project\") {\n return `/projects/${event.entityId}`;\n }\n\n if (event.entityType === \"task\") {\n return `/tasks/${event.entityId}`;\n }\n\n if (event.entityType === \"task_run\" && typeof event.metadata.taskId === \"string\") {\n return `/tasks/${event.metadata.taskId}`;\n }\n\n return null;\n}\n","import { Link } from \"react-router-dom\";\nimport { createColumnHelper, flexRender, getCoreRowModel, useReactTable } from \"@tanstack/react-table\";\nimport { Card } from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { getActivityEventHref } from \"@/lib/entity-links\";\nimport { formatDateTime } from \"@/lib/utils\";\nimport type { ActivityEvent } from \"@/lib/types\";\n\nconst columnHelper = createColumnHelper<ActivityEvent>();\n\nconst columns = [\n columnHelper.accessor(\"title\", {\n header: \"Event\",\n cell: (info) => {\n const href = getActivityEventHref(info.row.original);\n return href ? (\n <Link to={href} className=\"font-medium text-white transition hover:text-[var(--primary)]\">\n {info.getValue()}\n </Link>\n ) : (\n <div className=\"font-medium text-white\">{info.getValue()}</div>\n );\n }\n }),\n columnHelper.accessor(\"source\", {\n header: \"Source\",\n cell: (info) => <div className=\"font-label text-[11px] uppercase tracking-[0.16em] text-white/50\">{info.getValue()}</div>\n }),\n columnHelper.accessor(\"createdAt\", {\n header: \"When\",\n cell: (info) => <div className=\"text-sm text-white/55\">{formatDateTime(info.getValue())}</div>\n }),\n columnHelper.display({\n id: \"actions\",\n header: \"Open\",\n cell: (info) => {\n const href = getActivityEventHref(info.row.original);\n return href ? (\n <Link to={href} className=\"inline-flex text-[11px] uppercase tracking-[0.16em] text-[var(--primary)] transition hover:text-white\">\n Open\n </Link>\n ) : (\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/32\">Archive only</div>\n );\n }\n })\n];\n\nexport function ActivityTable({\n rows,\n onRemove\n}: {\n rows: ActivityEvent[];\n onRemove?: (eventId: string) => Promise<void>;\n}) {\n const actionColumns = onRemove\n ? [\n ...columns,\n columnHelper.display({\n id: \"remove\",\n header: \"Correct\",\n cell: (info) => (\n <Button\n variant=\"ghost\"\n className=\"h-auto px-0 py-0 text-[11px] uppercase tracking-[0.16em] text-white/55\"\n onClick={() => {\n void onRemove(info.row.original.id);\n }}\n >\n Remove log\n </Button>\n )\n })\n ]\n : columns;\n\n const table = useReactTable({\n columns: actionColumns,\n data: rows,\n getCoreRowModel: getCoreRowModel()\n });\n\n return (\n <Card className=\"overflow-hidden p-0\">\n <table className=\"w-full border-collapse\">\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id} className=\"bg-white/[0.03]\">\n {headerGroup.headers.map((header) => (\n <th key={header.id} className=\"px-5 py-4 text-left font-label text-[11px] uppercase tracking-[0.18em] text-white/40\">\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows.map((row) => (\n <tr key={row.id} className=\"bg-white/[0.015] transition hover:bg-white/[0.035]\">\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className=\"px-5 py-4 align-top\">\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </Card>\n );\n}\n","import { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link, useSearchParams } from \"react-router-dom\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { ActivityTable } from \"@/components/activity-table\";\nimport { Card } from \"@/components/ui/card\";\nimport { EmptyState, ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { listActivity, removeActivityLog } from \"@/lib/api\";\nimport { getActivityEventHref } from \"@/lib/entity-links\";\nimport { formatDateTime } from \"@/lib/utils\";\n\nexport function ActivityPage() {\n const [searchParams] = useSearchParams();\n const queryClient = useQueryClient();\n const entityId = searchParams.get(\"entityId\") ?? undefined;\n const entityType = searchParams.get(\"entityType\") ?? undefined;\n const highlightedEventId = searchParams.get(\"eventId\");\n const activityQuery = useQuery({\n queryKey: [\"activity-archive\", entityType, entityId],\n queryFn: () => listActivity({ limit: 100, entityType, entityId })\n });\n const removeEventMutation = useMutation({\n mutationFn: (eventId: string) => removeActivityLog(eventId),\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"activity-archive\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] }),\n queryClient.invalidateQueries({ queryKey: [\"task-context\"] }),\n queryClient.invalidateQueries({ queryKey: [\"project-board\"] })\n ]);\n }\n });\n\n const rows = activityQuery.data?.activity ?? [];\n\n if (activityQuery.isLoading) {\n return (\n <LoadingState\n eyebrow=\"Evidence archive\"\n title=\"Loading activity\"\n description=\"Pulling the visible audit trail, grouped evidence, and correction history.\"\n />\n );\n }\n\n if (activityQuery.isError) {\n return <ErrorState eyebrow=\"Evidence archive\" error={activityQuery.error} onRetry={() => void activityQuery.refetch()} />;\n }\n\n if (rows.length === 0) {\n return (\n <EmptyState\n eyebrow=\"Evidence archive\"\n title={entityId ? \"No evidence matched this filter\" : \"No activity recorded yet\"}\n description={\n entityId\n ? \"Forge could not find visible events for this specific entity yet. Try a broader archive view or create some work first.\"\n : \"As you complete work, log runs, or make corrections, the audit trail will appear here.\"\n }\n />\n );\n }\n\n const grouped = rows.reduce<Record<string, typeof rows>>((accumulator, event) => {\n const key = event.createdAt.slice(0, 10);\n accumulator[key] = [...(accumulator[key] ?? []), event];\n return accumulator;\n }, {});\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n title=\"Activity\"\n description={\n entityId\n ? \"This filtered archive shows the evidence connected to the item you opened, so you can confirm what changed and when.\"\n : \"Activity is your visible audit trail. Use it to inspect progress, confirm corrections, and trace work back to the goal, project, or task it came from.\"\n }\n badge={`${rows.length} recent events`}\n />\n\n <section className=\"grid gap-5 xl:grid-cols-[minmax(0,1.1fr)_minmax(0,0.9fr)]\">\n <ActivityTable\n rows={rows}\n onRemove={async (eventId) => {\n await removeEventMutation.mutateAsync(eventId);\n }}\n />\n <div className=\"grid gap-4\">\n {Object.entries(grouped)\n .slice(0, 6)\n .map(([day, events]) => (\n <Card key={day}>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{day}</div>\n <div className=\"mt-4 grid gap-3\">\n {events.slice(0, 3).map((event) => (\n <div\n key={event.id}\n className={`rounded-[18px] p-4 ${highlightedEventId === event.id ? \"bg-[rgba(192,193,255,0.12)] shadow-[inset_0_0_0_1px_rgba(192,193,255,0.2)]\" : \"bg-white/[0.04]\"}`}\n >\n <div className=\"font-medium text-white\">{event.title}</div>\n <div className=\"mt-2 text-sm text-white/58\">{event.description}</div>\n <div className=\"mt-3 text-[11px] uppercase tracking-[0.16em] text-white/35\">{formatDateTime(event.createdAt)}</div>\n {getActivityEventHref(event) ? (\n <Link to={getActivityEventHref(event)!} className=\"mt-3 inline-flex text-[11px] uppercase tracking-[0.16em] text-[var(--primary)]\">\n Open related item\n </Link>\n ) : null}\n </div>\n ))}\n </div>\n </Card>\n ))}\n </div>\n </section>\n </div>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\nexport function ProgressMeter({\n value,\n className,\n tone = \"primary\"\n}: {\n value: number;\n className?: string;\n tone?: \"primary\" | \"secondary\" | \"tertiary\";\n}) {\n const width = `${Math.max(4, Math.min(100, value))}%`;\n const fillClass =\n tone === \"secondary\"\n ? \"from-[var(--secondary)] to-[rgba(78,222,163,0.45)]\"\n : tone === \"tertiary\"\n ? \"from-[var(--tertiary)] to-[rgba(255,185,95,0.45)]\"\n : \"from-[var(--primary)] to-[rgba(192,193,255,0.45)]\";\n\n return (\n <div className={cn(\"h-1.5 rounded-full bg-white/[0.08]\", className)}>\n <div className={cn(\"h-full rounded-full bg-gradient-to-r\", fillClass)} style={{ width }} />\n </div>\n );\n}\n","type ActivityCopySource = {\n title: string;\n description: string;\n source?: string | null;\n};\n\nfunction looksSynthetic(event: ActivityCopySource) {\n const combined = `${event.title} ${event.description} ${event.source ?? \"\"}`.toLowerCase();\n return combined.includes(\"playwright\") || combined.includes(\"operator console\") || combined.includes(\"retroactive work logging\");\n}\n\nexport function getReadableActivityTitle(event: ActivityCopySource) {\n if (looksSynthetic(event)) {\n return \"Work log added\";\n }\n return event.title;\n}\n\nexport function getReadableActivityDescription(event: ActivityCopySource) {\n if (looksSynthetic(event)) {\n return \"This entry was added later so the work history stays complete and accurate.\";\n }\n return event.description;\n}\n","import { useMemo, useState } from \"react\";\nimport { Link, useParams } from \"react-router-dom\";\nimport { GoalDialog } from \"@/components/goal-dialog\";\nimport { ProjectDialog } from \"@/components/project-dialog\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { EmptyState } from \"@/components/ui/page-state\";\nimport { ProgressMeter } from \"@/components/ui/progress-meter\";\nimport { getReadableActivityDescription, getReadableActivityTitle } from \"@/lib/activity-copy\";\nimport { getActivityEventHref } from \"@/lib/entity-links\";\nimport { useI18n } from \"@/lib/i18n\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\n\nexport function GoalDetailPage() {\n const { t } = useI18n();\n const shell = useForgeShell();\n const params = useParams();\n const [goalDialogOpen, setGoalDialogOpen] = useState(false);\n const [projectDialogOpen, setProjectDialogOpen] = useState(false);\n\n const goal = shell.snapshot.dashboard.goals.find((entry) => entry.id === params.goalId) ?? null;\n\n const projects = useMemo(\n () => shell.snapshot.dashboard.projects.filter((project) => project.goalId === params.goalId),\n [params.goalId, shell.snapshot.dashboard.projects]\n );\n\n const projectIds = new Set(projects.map((project) => project.id));\n const taskIds = new Set(shell.snapshot.tasks.filter((task) => projectIds.has(task.projectId ?? \"\")).map((task) => task.id));\n const evidence = shell.snapshot.activity.filter(\n (event) =>\n event.entityId === params.goalId ||\n projectIds.has(event.entityId) ||\n taskIds.has(event.entityId) ||\n (event.entityType === \"task_run\" && typeof event.metadata.taskId === \"string\" && taskIds.has(event.metadata.taskId))\n );\n\n if (!goal) {\n return (\n <EmptyState\n eyebrow={t(\"common.goalDetail.eyebrow\")}\n title={t(\"common.goalDetail.missingTitle\")}\n description={t(\"common.goalDetail.missingDescription\")}\n action={\n <Link to=\"/goals\" className=\"inline-flex min-h-10 min-w-0 max-w-full items-center justify-center whitespace-nowrap rounded-full bg-[var(--primary)] px-4 py-2 text-sm font-medium text-slate-950 transition hover:opacity-90\">\n {t(\"common.goalDetail.backToGoals\")}\n </Link>\n }\n />\n );\n }\n\n const nextProject = projects.find((project) => project.nextTaskTitle) ?? projects[0] ?? null;\n const weakSpot = shell.snapshot.overview.neglectedGoals.find((entry) => entry.goalId === goal.id) ?? null;\n const latestEvidence = evidence[0] ?? null;\n\n return (\n <div className=\"grid min-w-0 gap-5\">\n <PageHero\n entityKind=\"goal\"\n title={<EntityName kind=\"goal\" label={goal.title} variant=\"heading\" size=\"lg\" />}\n titleText={goal.title}\n description={goal.description}\n badge={t(projects.length === 1 ? \"common.goalDetail.heroBadgeOne\" : \"common.goalDetail.heroBadgeOther\", { count: projects.length })}\n />\n\n <div className=\"flex flex-wrap gap-3\">\n <Button onClick={() => setGoalDialogOpen(true)}>{t(\"common.goalDetail.edit\")}</Button>\n <Button variant=\"secondary\" onClick={() => setProjectDialogOpen(true)}>\n {t(\"common.goalDetail.addProject\")}\n </Button>\n </div>\n\n <section className=\"grid min-w-0 gap-5 xl:grid-cols-[minmax(0,1.15fr)_minmax(0,0.85fr)]\">\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.goalDetail.sectionProjects\")}</div>\n {projects.length === 0 ? (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">{t(\"common.goalDetail.noProjects\")}</div>\n ) : (\n <div className=\"mt-4 grid gap-4 lg:grid-cols-2\">\n {projects.map((project) => (\n <Link key={project.id} to={`/projects/${project.id}`} className=\"rounded-[22px] bg-white/[0.04] p-5 transition hover:bg-white/[0.08]\">\n <div className=\"flex items-center justify-between gap-3\">\n <EntityBadge kind=\"project\" compact gradient={false} />\n <Badge>{project.status}</Badge>\n </div>\n <div className=\"mt-4\">\n <EntityName kind=\"project\" label={project.title} variant=\"heading\" size=\"lg\" />\n </div>\n <p className=\"mt-3 text-sm leading-6 text-white/58\">{project.description}</p>\n <div className=\"mt-4\">\n <ProgressMeter value={project.progress} />\n </div>\n <div className=\"mt-4 text-[11px] uppercase tracking-[0.16em] text-white/40\">\n {project.nextTaskTitle ? t(\"common.goalDetail.nextMove\", { value: project.nextTaskTitle }) : t(\"common.goalDetail.addNextTask\")}\n </div>\n </Link>\n ))}\n </div>\n )}\n </Card>\n\n <div className=\"grid min-w-0 gap-5\">\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.goalDetail.sectionHealth\")}</div>\n <div className=\"mt-4 flex flex-wrap items-center gap-2\">\n <EntityBadge kind=\"goal\" compact gradient={false} />\n <Badge className=\"bg-white/[0.08] text-white/72\">{t(\"common.goalDetail.progressTitle\", { progress: goal.progress, count: goal.completedTasks })}</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{t(\"common.goalDetail.progressDetail\", { xp: goal.earnedPoints })}</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{t(projects.length === 1 ? \"common.goalDetail.heroBadgeOne\" : \"common.goalDetail.heroBadgeOther\", { count: projects.length })}</Badge>\n </div>\n <div className=\"mt-4 grid gap-3 sm:grid-cols-3\">\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/42\">{t(\"common.goalDetail.fieldProgress\")}</div>\n <div className=\"mt-2 font-display text-xl text-white\">{goal.progress}%</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/42\">{t(\"common.goalDetail.fieldCompletedTasks\")}</div>\n <div className=\"mt-2 font-display text-xl text-white\">{goal.completedTasks}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/42\">{t(\"common.goalDetail.fieldXpBanked\")}</div>\n <div className=\"mt-2 font-display text-xl text-white\">{goal.earnedPoints}</div>\n </div>\n </div>\n <div className=\"mt-4 grid gap-3\">\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{t(\"common.goalDetail.signalNext\")}</div>\n {nextProject ? <EntityBadge kind=\"project\" compact gradient={false} /> : null}\n </div>\n <div className=\"mt-2 font-medium text-white\">{nextProject?.title ?? t(\"common.goalDetail.noProject\")}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">\n {nextProject?.nextTaskTitle ? t(\"common.goalDetail.nextMove\", { value: nextProject.nextTaskTitle }) : nextProject?.description || t(\"common.goalDetail.noProjectDetail\")}\n </div>\n </div>\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{t(\"common.goalDetail.signalRisk\")}</div>\n <div className=\"mt-2 font-medium text-white\">{weakSpot?.title ?? t(\"common.goalDetail.noRisk\")}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{weakSpot?.summary || t(\"common.goalDetail.noRiskDetail\")}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{t(\"common.goalDetail.signalEvidence\")}</div>\n <div className=\"mt-2 font-medium text-white\">{latestEvidence?.title ?? t(\"common.goalDetail.noEvidence\")}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{latestEvidence?.description || t(\"common.goalDetail.noEvidenceDetail\")}</div>\n </div>\n </div>\n </div>\n </Card>\n </div>\n </section>\n\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.goalDetail.sectionEvidence\")}</div>\n {evidence.length === 0 ? (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">{t(\"common.goalDetail.noEvidenceLogged\")}</div>\n ) : (\n <div className=\"mt-4 grid gap-3 lg:grid-cols-2\">\n {evidence.slice(0, 6).map((event) => (\n <Link\n key={event.id}\n to={getActivityEventHref(event) ?? `/activity?eventId=${event.id}`}\n className=\"rounded-[18px] bg-white/[0.04] p-4 transition hover:bg-white/[0.08]\"\n >\n <div className=\"font-medium text-white\">{getReadableActivityTitle(event)}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{getReadableActivityDescription(event)}</div>\n </Link>\n ))}\n </div>\n )}\n </Card>\n\n <GoalDialog\n open={goalDialogOpen}\n editingGoal={goal}\n tags={shell.snapshot.tags}\n onOpenChange={setGoalDialogOpen}\n onSubmit={async (input, goalId) => {\n if (goalId) {\n await shell.patchGoal(goalId, input);\n }\n }}\n />\n\n <ProjectDialog\n open={projectDialogOpen}\n goals={shell.snapshot.goals}\n editingProject={null}\n initialGoalId={goal.id}\n onOpenChange={setProjectDialogOpen}\n onSubmit={async (input) => {\n await shell.createProject(input);\n }}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { ArrowRight, PencilLine } from \"lucide-react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { GoalDialog } from \"@/components/goal-dialog\";\nimport type { GoalMutationInput } from \"@/lib/schemas\";\nimport type { DashboardGoal, Tag } from \"@/lib/types\";\n\nexport function GoalStudio({\n goals,\n tags,\n pending = false,\n onCreate,\n onUpdate\n}: {\n goals: DashboardGoal[];\n tags: Tag[];\n pending?: boolean;\n onCreate: (input: GoalMutationInput) => Promise<void>;\n onUpdate: (goalId: string, input: GoalMutationInput) => Promise<void>;\n}) {\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editingGoalId, setEditingGoalId] = useState<string | null>(null);\n const editingGoal = goals.find((goal) => goal.id === editingGoalId) ?? null;\n\n return (\n <>\n <Card>\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Goal arcs</div>\n <h3 className=\"mt-2 font-display text-3xl text-white\">Strategic arcs before tickets</h3>\n <p className=\"mt-3 max-w-3xl text-sm leading-7 text-white/60\">\n This is the long-horizon map. Each arc shows why it matters, how much ground has been covered, and which project should move next.\n </p>\n </div>\n <Button\n onClick={() => {\n setEditingGoalId(null);\n setDialogOpen(true);\n }}\n >\n Create goal\n </Button>\n </div>\n\n <div className=\"mt-5 grid gap-3 xl:grid-cols-2\">\n {goals.length === 0 ? (\n <div className=\"rounded-[24px] bg-white/[0.04] p-5 text-sm leading-7 text-white/60 xl:col-span-2\">\n Start with a life goal. Once the destination is clear, you can attach projects and then fill those projects with tasks.\n </div>\n ) : null}\n {goals.map((goal) => {\n const progressWidth = `${Math.max(6, Math.min(100, goal.progress))}%`;\n return (\n <Link\n to={`/goals/${goal.id}`}\n key={goal.id}\n className=\"rounded-[24px] border border-white/6 bg-[linear-gradient(180deg,rgba(255,255,255,0.06),rgba(255,255,255,0.03))] p-4 transition hover:bg-[linear-gradient(180deg,rgba(255,255,255,0.09),rgba(255,255,255,0.04))]\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <EntityBadge kind=\"goal\" compact gradient={false} />\n <div className=\"mt-2\">\n <EntityName kind=\"goal\" label={goal.title} variant=\"heading\" size=\"lg\" showKind={false} />\n </div>\n <p className=\"mt-2 text-sm leading-6 text-white/58\">{goal.description || \"No strategic note attached yet.\"}</p>\n </div>\n <button\n className=\"rounded-full bg-white/6 p-2 text-white/60 transition hover:bg-white/10 hover:text-white\"\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setEditingGoalId(goal.id);\n setDialogOpen(true);\n }}\n >\n <PencilLine className=\"size-4\" />\n </button>\n </div>\n\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Badge className=\"bg-white/[0.08] text-white/70\">{goal.horizon}</Badge>\n <Badge className={goal.status === \"active\" ? \"text-emerald-300\" : goal.status === \"paused\" ? \"text-amber-300\" : \"text-[var(--tertiary)]\"}>\n {goal.status}\n </Badge>\n <Badge className=\"bg-white/[0.08] text-white/70\">{goal.earnedPoints} / {goal.targetPoints} xp</Badge>\n <Badge className=\"bg-white/[0.08] text-white/70\">{goal.totalTasks} tasks</Badge>\n </div>\n\n <div className=\"mt-4 h-1.5 rounded-full bg-white/[0.08]\">\n <div className=\"h-full rounded-full bg-[linear-gradient(90deg,var(--primary)_0%,var(--secondary)_100%)]\" style={{ width: progressWidth }} />\n </div>\n\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {goal.tags.map((tag) => (\n <Badge key={tag.id} className=\"bg-white/[0.06] text-white/58\">\n {tag.name}\n </Badge>\n ))}\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-3 text-[11px] uppercase tracking-[0.16em] text-white/42\">\n <span>{goal.momentumLabel}</span>\n <span className=\"inline-flex items-center gap-2\" style={{ color: goal.themeColor }}>\n Open arc\n <ArrowRight className=\"size-3.5\" />\n </span>\n </div>\n </Link>\n );\n })}\n </div>\n </Card>\n\n <GoalDialog\n open={dialogOpen}\n pending={pending}\n editingGoal={editingGoal}\n tags={tags}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) {\n setEditingGoalId(null);\n }\n }}\n onSubmit={async (input, goalId) => {\n if (goalId) {\n await onUpdate(goalId, input);\n return;\n }\n await onCreate(input);\n }}\n />\n </>\n );\n}\n","import { Link } from \"react-router-dom\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { GoalStudio } from \"@/components/goal-studio\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { EmptyState } from \"@/components/ui/page-state\";\nimport { ProgressMeter } from \"@/components/ui/progress-meter\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\n\nexport function GoalsPage() {\n const shell = useForgeShell();\n const hasGoals = shell.snapshot.dashboard.goals.length > 0;\n const projectsByGoal = new Map(shell.snapshot.dashboard.goals.map((goal) => [goal.id, shell.snapshot.dashboard.projects.filter((project) => project.goalId === goal.id)]));\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n entityKind=\"goal\"\n title={<EntityName kind=\"goal\" label=\"Life Goals\" variant=\"heading\" size=\"lg\" />}\n titleText=\"Life Goals\"\n description=\"Life goals are the destinations you care about over the long run. Each one can hold several projects, and those projects turn direction into real work.\"\n badge={`${shell.snapshot.dashboard.goals.length} active goals`}\n actions={\n hasGoals ? (\n <div className=\"inline-flex min-h-10 items-center rounded-full border border-white/8 bg-white/[0.04] px-4 py-2 text-sm whitespace-nowrap text-white/68\">\n {shell.snapshot.dashboard.projects.length} live project{shell.snapshot.dashboard.projects.length === 1 ? \"\" : \"s\"} attached\n </div>\n ) : null\n }\n />\n\n <GoalStudio\n goals={shell.snapshot.dashboard.goals}\n tags={shell.snapshot.tags}\n onCreate={shell.createGoal}\n onUpdate={shell.patchGoal}\n />\n\n {!hasGoals ? (\n <EmptyState\n eyebrow=\"Life goals\"\n title=\"No life goals yet\"\n description=\"Define the first long-horizon direction above so Forge can attach projects, tasks, momentum, and evidence to something meaningful.\"\n />\n ) : null}\n\n {hasGoals ? (\n <div className=\"grid gap-4\">\n {shell.snapshot.dashboard.goals.map((goal) => {\n const linkedProjects = projectsByGoal.get(goal.id) ?? [];\n return (\n <Link\n key={goal.id}\n to={`/goals/${goal.id}`}\n className=\"rounded-[28px] border border-white/6 bg-[linear-gradient(180deg,rgba(255,255,255,0.05),rgba(255,255,255,0.03))] p-4 transition hover:bg-[linear-gradient(180deg,rgba(255,255,255,0.08),rgba(255,255,255,0.04))] sm:p-5\"\n >\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1.15fr)_minmax(0,0.85fr)] xl:gap-5\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {goal.tags.slice(0, 3).map((tag) => (\n <Badge key={tag.id} className=\"bg-white/[0.08]\" style={{ color: tag.color }}>\n {tag.name}\n </Badge>\n ))}\n <Badge className=\"bg-white/[0.08] text-white/72\">{goal.horizon}</Badge>\n </div>\n <div className=\"mt-4\">\n <EntityName kind=\"goal\" label={goal.title} variant=\"heading\" size=\"xl\" />\n </div>\n <p className=\"mt-3 max-w-2xl text-sm leading-7 text-white/58\">{goal.description}</p>\n <div className=\"mt-4 grid gap-3 sm:grid-cols-3\">\n <div className=\"rounded-[18px] bg-white/[0.03] px-3.5 py-3\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.16em] text-white/40\">Progress</div>\n <div className=\"mt-2 text-xl text-white\">{goal.progress}%</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.03] px-3.5 py-3\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.16em] text-white/40\">Tasks done</div>\n <div className=\"mt-2 text-xl text-white\">{goal.completedTasks}/{Math.max(goal.totalTasks, 1)}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.03] px-3.5 py-3\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.16em] text-white/40\">XP banked</div>\n <div className=\"mt-2 text-xl text-white\">{goal.earnedPoints}</div>\n </div>\n </div>\n <div className=\"mt-4\">\n <ProgressMeter value={goal.progress} />\n </div>\n </div>\n\n <div className=\"rounded-[24px] bg-white/[0.04] p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-medium text-white\">Projects carrying this direction</div>\n <div className=\"text-sm text-white/48\">{linkedProjects.length}</div>\n </div>\n {linkedProjects.length === 0 ? (\n <div className=\"mt-4 text-sm leading-6 text-white/56\">No live project is attached yet. Create one so this direction starts producing visible work.</div>\n ) : (\n <div className=\"mt-4 grid gap-3\">\n {linkedProjects.slice(0, 3).map((project) => (\n <div key={project.id} className=\"rounded-[18px] bg-white/[0.05] px-4 py-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <EntityBadge kind=\"project\" compact gradient={false} />\n <EntityName kind=\"project\" label={project.title} className=\"min-w-0\" showIcon={false} />\n </div>\n <Badge>{project.status}</Badge>\n </div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{project.description}</div>\n <div className=\"mt-3 text-sm text-white/42\">\n Next move: {project.nextTaskTitle ?? \"Define the first attached task\"}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </Link>\n );\n })}\n </div>\n ) : (\n <Card>\n <div className=\"rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">Goal cards will appear here once the first long-horizon direction is created.</div>\n </Card>\n )}\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { FlowChoiceGrid, FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { FieldHint } from \"@/components/ui/info-tooltip\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { createInsightSchema, type CreateInsightInput } from \"@/lib/schemas\";\nimport type { EntityKind } from \"@/lib/entity-visuals\";\n\ntype InsightTargetKind = \"general\" | \"goal\" | \"project\" | \"task\" | \"trigger_report\";\n\ntype InsightFlowValue = CreateInsightInput & {\n targetKind: InsightTargetKind;\n};\n\nexport type InsightEntityCandidate = {\n entityType: Exclude<InsightTargetKind, \"general\">;\n entityId: string;\n kind: EntityKind;\n label: string;\n description?: string;\n};\n\nfunction buildInitialValue(\n initialValue: Partial<CreateInsightInput> | undefined,\n lockedEntity: InsightEntityCandidate | undefined\n): InsightFlowValue {\n return {\n originType: initialValue?.originType ?? \"user\",\n originAgentId: initialValue?.originAgentId ?? \"\",\n originLabel: initialValue?.originLabel ?? \"\",\n entityType: lockedEntity?.entityType ?? initialValue?.entityType ?? \"\",\n entityId: lockedEntity?.entityId ?? initialValue?.entityId ?? \"\",\n timeframeLabel: initialValue?.timeframeLabel ?? \"This week\",\n title: initialValue?.title ?? \"\",\n summary: initialValue?.summary ?? \"\",\n recommendation: initialValue?.recommendation ?? \"\",\n rationale: initialValue?.rationale ?? \"\",\n confidence: initialValue?.confidence ?? 0.72,\n ctaLabel: initialValue?.ctaLabel ?? \"Review insight\",\n targetKind: lockedEntity?.entityType ?? (initialValue?.entityType as InsightTargetKind | undefined) ?? \"general\"\n };\n}\n\nexport function InsightFlowDialog({\n open,\n onOpenChange,\n title = \"Store insight\",\n description = \"Capture a clear observation, its recommendation, and where it belongs without dropping into a raw admin form.\",\n eyebrow = \"Insight\",\n pending = false,\n submitLabel = \"Store insight\",\n initialValue,\n lockedEntity,\n entityCandidates = [],\n onSubmit\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n description?: string;\n eyebrow?: string;\n pending?: boolean;\n submitLabel?: string;\n initialValue?: Partial<CreateInsightInput>;\n lockedEntity?: InsightEntityCandidate;\n entityCandidates?: InsightEntityCandidate[];\n onSubmit: (value: CreateInsightInput) => Promise<void>;\n}) {\n const [value, setValue] = useState<InsightFlowValue>(() => buildInitialValue(initialValue, lockedEntity));\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) {\n setValue(buildInitialValue(initialValue, lockedEntity));\n setSubmitError(null);\n }\n }, [initialValue, lockedEntity, open]);\n\n const availableKinds = useMemo(() => {\n const set = new Set<InsightTargetKind>([\"general\"]);\n entityCandidates.forEach((candidate) => set.add(candidate.entityType));\n if (lockedEntity) {\n set.add(lockedEntity.entityType);\n }\n return Array.from(set);\n }, [entityCandidates, lockedEntity]);\n\n const visibleCandidates = entityCandidates.filter((candidate) => candidate.entityType === value.targetKind);\n\n const steps: Array<QuestionFlowStep<InsightFlowValue>> = [\n {\n id: \"focus\",\n eyebrow: \"Focus\",\n title: \"Name the insight and place it in the right context\",\n description: \"Start with the main observation, then decide whether this belongs to a specific entity or should stay general.\",\n render: (draft, patch) => (\n <>\n <FlowField\n label=\"Insight title\"\n description=\"Write the main idea as a clear headline.\"\n labelHelp=\"The title should sound like the recommendation or realization you want to remember, not like an internal database field.\"\n >\n <Input value={draft.title} onChange={(event) => patch({ title: event.target.value })} placeholder=\"Weekly review needs a tighter end ritual\" />\n </FlowField>\n <FlowField label=\"Timeframe\" description=\"Keep the horizon short and readable.\">\n <Input value={draft.timeframeLabel} onChange={(event) => patch({ timeframeLabel: event.target.value })} placeholder=\"This week\" />\n </FlowField>\n <FlowField\n label=\"Where should this insight live?\"\n description=\"Use a specific entity when the insight is about one goal, project, task, or report. Keep it general when it applies to the wider system.\"\n >\n {lockedEntity ? (\n <div className=\"rounded-[24px] border border-white/8 bg-white/[0.04] p-4\">\n <EntityBadge kind={lockedEntity.kind} label={lockedEntity.label} />\n {lockedEntity.description ? <FieldHint className=\"mt-2\">{lockedEntity.description}</FieldHint> : null}\n </div>\n ) : (\n <>\n <FlowChoiceGrid\n value={draft.targetKind}\n onChange={(nextKind) =>\n patch({\n targetKind: nextKind as InsightTargetKind,\n entityType: nextKind === \"general\" ? \"\" : nextKind,\n entityId: nextKind === \"general\" ? \"\" : \"\"\n })\n }\n options={availableKinds.map((kind) => ({\n value: kind,\n label:\n kind === \"general\"\n ? \"General insight\"\n : kind === \"trigger_report\"\n ? \"Report\"\n : kind.charAt(0).toUpperCase() + kind.slice(1),\n description:\n kind === \"general\"\n ? \"Store it in the broader insight feed.\"\n : `Attach it to a specific ${kind === \"trigger_report\" ? \"report\" : kind}.`\n }))}\n columns={availableKinds.length >= 3 ? 3 : 2}\n />\n {draft.targetKind !== \"general\" ? (\n visibleCandidates.length > 0 ? (\n <div className=\"mt-4 grid gap-3 md:grid-cols-2\">\n {visibleCandidates.map((candidate) => {\n const selected = draft.entityType === candidate.entityType && draft.entityId === candidate.entityId;\n return (\n <button\n key={`${candidate.entityType}:${candidate.entityId}`}\n type=\"button\"\n className={`rounded-[22px] border px-4 py-4 text-left transition ${selected ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white\" : \"border-white/8 bg-white/[0.04] text-white/72 hover:bg-white/[0.07]\"}`}\n onClick={() => patch({ entityType: candidate.entityType, entityId: candidate.entityId })}\n >\n <EntityBadge kind={candidate.kind} label={candidate.label} compact />\n {candidate.description ? <div className=\"mt-2 text-sm leading-6 text-white/54\">{candidate.description}</div> : null}\n </button>\n );\n })}\n </div>\n ) : (\n <FieldHint className=\"mt-4\">No {draft.targetKind === \"trigger_report\" ? \"reports\" : `${draft.targetKind}s`} are ready to attach here yet.</FieldHint>\n )\n ) : null}\n </>\n )}\n </FlowField>\n </>\n )\n },\n {\n id: \"observation\",\n eyebrow: \"Observation\",\n title: \"Capture what you are seeing clearly\",\n description: \"Keep the summary plain and useful. Add the why only if it helps the next action make sense.\",\n render: (draft, patch) => (\n <>\n <FlowField\n label=\"Summary\"\n description=\"Describe the pattern, problem, or opportunity in plain language.\"\n labelHelp=\"Write what is actually happening, not a slogan and not a long essay.\"\n >\n <Textarea value={draft.summary} onChange={(event) => patch({ summary: event.target.value })} placeholder=\"The weekly review loses energy because the close-out is vague, so finished work never turns into clear next moves.\" />\n </FlowField>\n <FlowField label=\"Why this matters\" description=\"Optional context that helps explain the recommendation.\">\n <Textarea value={draft.rationale} onChange={(event) => patch({ rationale: event.target.value })} placeholder=\"When the close-out is loose, important wins disappear from memory and the next week starts without momentum.\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"move\",\n eyebrow: \"Next move\",\n title: \"Turn the insight into a recommendation\",\n description: \"Finish with the recommendation you want the user or agent to actually act on.\",\n render: (draft, patch) => (\n <>\n <FlowField\n label=\"Recommendation\"\n description=\"Write the concrete move this insight points toward.\"\n labelHelp=\"A recommendation should be actionable. If the user read only this line, they should know what to do next.\"\n >\n <Textarea value={draft.recommendation} onChange={(event) => patch({ recommendation: event.target.value })} placeholder=\"Add a fixed five-minute close-out block that turns finished tasks into one sentence of evidence and one next move.\" />\n </FlowField>\n <FlowField label=\"Confidence\" description=\"Choose how strongly this recommendation holds up right now.\">\n <FlowChoiceGrid\n value={String(draft.confidence)}\n onChange={(next) => patch({ confidence: Number(next) })}\n options={[\n { value: \"0.55\", label: \"Low\", description: \"Useful hunch, still early.\" },\n { value: \"0.72\", label: \"Medium\", description: \"Solid pattern, worth acting on.\" },\n { value: \"0.88\", label: \"High\", description: \"Clear enough to trust strongly.\" }\n ]}\n columns={3}\n />\n </FlowField>\n </>\n )\n }\n ];\n\n return (\n <QuestionFlowDialog\n open={open}\n onOpenChange={onOpenChange}\n eyebrow={eyebrow}\n title={title}\n description={description}\n value={value}\n onChange={setValue}\n steps={steps}\n submitLabel={submitLabel}\n pending={pending}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const payload = createInsightSchema.safeParse({\n originType: value.originType,\n originAgentId: value.originAgentId,\n originLabel: value.originLabel,\n entityType: value.targetKind === \"general\" ? \"\" : value.entityType,\n entityId: value.targetKind === \"general\" ? \"\" : value.entityId,\n timeframeLabel: value.timeframeLabel,\n title: value.title,\n summary: value.summary,\n recommendation: value.recommendation,\n rationale: value.rationale,\n confidence: value.confidence,\n ctaLabel: value.ctaLabel\n });\n\n if (!payload.success) {\n setSubmitError(\"This insight still needs a title, a summary, and a recommendation before it can be stored.\");\n return;\n }\n\n try {\n await onSubmit(payload.data);\n onOpenChange(false);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Unable to store this insight right now.\");\n }\n }}\n />\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Area, AreaChart, ResponsiveContainer, XAxis, YAxis } from \"recharts\";\nimport { InsightFlowDialog, type InsightEntityCandidate } from \"@/components/insights/insight-flow-dialog\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { createInsight, getInsights, submitInsightFeedback } from \"@/lib/api\";\n\nexport function InsightsPage() {\n const queryClient = useQueryClient();\n const { snapshot } = useForgeShell();\n const [flowOpen, setFlowOpen] = useState(false);\n const insightsQuery = useQuery({\n queryKey: [\"forge-insights\"],\n queryFn: getInsights\n });\n\n const createMutation = useMutation({\n mutationFn: createInsight,\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-insights\"] });\n }\n });\n\n const feedbackMutation = useMutation({\n mutationFn: ({ insightId, feedbackType }: { insightId: string; feedbackType: \"accepted\" | \"dismissed\" | \"applied\" | \"snoozed\" }) =>\n submitInsightFeedback(insightId, feedbackType),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-insights\"] });\n }\n });\n\n const insights = insightsQuery.data?.insights;\n const entityCandidates = useMemo<InsightEntityCandidate[]>(\n () => [\n ...snapshot.goals.slice(0, 8).map((goal) => ({\n entityType: \"goal\" as const,\n entityId: goal.id,\n kind: \"goal\" as const,\n label: goal.title,\n description: goal.description\n })),\n ...snapshot.projects.slice(0, 8).map((project) => ({\n entityType: \"project\" as const,\n entityId: project.id,\n kind: \"project\" as const,\n label: project.title,\n description: project.goalTitle\n })),\n ...snapshot.tasks.slice(0, 10).map((task) => ({\n entityType: \"task\" as const,\n entityId: task.id,\n kind: \"task\" as const,\n label: task.title,\n description: task.status.replaceAll(\"_\", \" \")\n }))\n ],\n [snapshot.goals, snapshot.projects, snapshot.tasks]\n );\n\n if (insightsQuery.isLoading) {\n return <LoadingState eyebrow=\"Insights\" title=\"Loading the insight feed\" description=\"Pulling coaching, momentum analysis, and stored recommendations.\" />;\n }\n\n if (insightsQuery.isError || !insights) {\n return <ErrorState eyebrow=\"Insights\" error={insightsQuery.error} onRetry={() => void queryClient.invalidateQueries({ queryKey: [\"forge-insights\"] })} />;\n }\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n title=\"Insights\"\n description=\"Track the live coaching signal, store insights through a guided flow, and decide which recommendations should actually change the system.\"\n badge={`${insights.openCount} open`}\n actions={\n <Button onClick={() => setFlowOpen(true)}>\n Store insight\n </Button>\n }\n />\n\n <section className=\"grid gap-5 xl:grid-cols-[minmax(0,1.1fr)_minmax(0,0.9fr)]\">\n <div className=\"grid gap-5\">\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Momentum analysis</div>\n <div className=\"mt-4 grid grid-cols-5 gap-2 sm:grid-cols-10\">\n {insights.momentumHeatmap.map((cell) => (\n <div key={cell.id} className=\"rounded-[16px] bg-white/[0.04] p-3\">\n <div\n className=\"h-12 rounded-[12px]\"\n style={{\n background:\n cell.intensity >= 4\n ? \"rgba(192,193,255,0.95)\"\n : cell.intensity === 3\n ? \"rgba(192,193,255,0.7)\"\n : cell.intensity === 2\n ? \"rgba(192,193,255,0.45)\"\n : cell.intensity === 1\n ? \"rgba(192,193,255,0.2)\"\n : \"rgba(255,255,255,0.05)\"\n }}\n />\n <div className=\"mt-2 text-[10px] uppercase tracking-[0.16em] text-white/40\">{cell.label}</div>\n </div>\n ))}\n </div>\n </Card>\n\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Execution trends</div>\n <div className=\"mt-4 h-72\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={insights.executionTrends}>\n <defs>\n <linearGradient id=\"insight-xp\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#c0c1ff\" stopOpacity=\"0.8\" />\n <stop offset=\"100%\" stopColor=\"#c0c1ff\" stopOpacity=\"0.08\" />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"label\" tick={{ fill: \"rgba(255,255,255,0.42)\", fontSize: 11 }} />\n <YAxis hide />\n <Area dataKey=\"xp\" stroke=\"#c0c1ff\" fill=\"url(#insight-xp)\" strokeWidth={2} />\n <Area dataKey=\"focusScore\" stroke=\"#4edea3\" fill=\"rgba(78,222,163,0.06)\" strokeWidth={2} />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </Card>\n\n <Card>\n <Badge className=\"bg-white/[0.08] text-white/60\">Deterministic coaching</Badge>\n <h2 className=\"mt-4 font-display text-4xl text-white\">{insights.coaching.title}</h2>\n <p className=\"mt-4 text-sm leading-7 text-white/60\">{insights.coaching.summary}</p>\n <div className=\"mt-4 rounded-[22px] bg-[radial-gradient(circle_at_top_left,rgba(192,193,255,0.14),transparent_45%),rgba(255,255,255,0.03)] p-5\">\n <div className=\"font-medium text-white\">Recommendation</div>\n <div className=\"mt-2 text-sm leading-7 text-white/60\">{insights.coaching.recommendation}</div>\n </div>\n </Card>\n </div>\n\n <div className=\"grid gap-5\">\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Store insight</div>\n <div className=\"mt-4 rounded-[22px] bg-white/[0.04] p-5\">\n <div className=\"font-medium text-white\">Use the guided flow instead of a raw admin form</div>\n <div className=\"mt-2 text-sm leading-7 text-white/60\">\n Capture the insight headline, what you are seeing, the recommendation, and where it belongs in one focused sequence.\n </div>\n <div className=\"mt-4\">\n <Button onClick={() => setFlowOpen(true)}>\n Store insight\n </Button>\n </div>\n </div>\n </Card>\n\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Stored insights</div>\n <div className=\"mt-4 grid gap-3\">\n {insights.feed.length === 0 ? (\n <div className=\"rounded-[18px] bg-white/[0.04] p-4 text-sm text-white/55\">No stored insights yet.</div>\n ) : (\n insights.feed.map((insight) => (\n <div key={insight.id} className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"font-medium text-white\">{insight.title}</div>\n <div className=\"mt-1 text-sm text-white/56\">{insight.summary}</div>\n </div>\n <Badge className=\"text-white/70\">{insight.status}</Badge>\n </div>\n <div className=\"mt-3 text-sm text-white/58\">{insight.recommendation}</div>\n <div className=\"mt-3 text-xs uppercase tracking-[0.16em] text-white/38\">\n {insight.originLabel ?? insight.originType} · confidence {Math.round(insight.confidence * 100)}%\n </div>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Button variant=\"secondary\" onClick={() => void feedbackMutation.mutateAsync({ insightId: insight.id, feedbackType: \"accepted\" })}>\n Accept\n </Button>\n <Button variant=\"secondary\" onClick={() => void feedbackMutation.mutateAsync({ insightId: insight.id, feedbackType: \"applied\" })}>\n Apply\n </Button>\n <Button variant=\"ghost\" onClick={() => void feedbackMutation.mutateAsync({ insightId: insight.id, feedbackType: \"dismissed\" })}>\n Dismiss\n </Button>\n </div>\n </div>\n ))\n )}\n </div>\n </Card>\n </div>\n </section>\n\n <InsightFlowDialog\n open={flowOpen}\n onOpenChange={setFlowOpen}\n entityCandidates={entityCandidates}\n pending={createMutation.isPending}\n onSubmit={async (value) => {\n await createMutation.mutateAsync(value);\n }}\n />\n </div>\n );\n}\n","import { useEffect, useId, useMemo, useState, type ReactNode } from \"react\";\nimport { ArrowUpRight, ChevronDown, ChevronUp, Pencil, Play } from \"lucide-react\";\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n closestCorners,\n pointerWithin,\n useDroppable,\n useSensor,\n useSensors,\n type CollisionDetection,\n type DraggableAttributes,\n type DragEndEvent,\n type DragStartEvent\n} from \"@dnd-kit/core\";\nimport { SortableContext, useSortable, verticalListSortingStrategy } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { cn } from \"@/lib/utils\";\nimport { useI18n } from \"@/lib/i18n\";\nimport type { Goal, Tag, Task, TaskStatus } from \"@/lib/types\";\n\nexport const LANE_ORDER: TaskStatus[] = [\"backlog\", \"focus\", \"in_progress\", \"blocked\", \"done\"];\n\nfunction isLaneContainerId(value: string) {\n return value.startsWith(\"lane:\") || value.includes(\":lane:\");\n}\n\nfunction isLaneContainer(container: { id: string | number; data?: { current?: Record<string, unknown> } }) {\n return container.data?.current?.type === \"lane\" || isLaneContainerId(String(container.id));\n}\n\nfunction getRectIntersectionArea(\n first: { left: number; right: number; top: number; bottom: number },\n second: { left: number; right: number; top: number; bottom: number }\n) {\n const width = Math.max(0, Math.min(first.right, second.right) - Math.max(first.left, second.left));\n const height = Math.max(0, Math.min(first.bottom, second.bottom) - Math.max(first.top, second.top));\n return width * height;\n}\n\nexport const laneFirstCollision: CollisionDetection = (args) => {\n const pointerHits = pointerWithin(args);\n const laneHit = pointerHits.find((entry) => isLaneContainerId(String(entry.id)));\n if (laneHit) {\n return [laneHit];\n }\n\n const laneContainers = args.droppableContainers.filter((container) => isLaneContainer(container));\n const laneIntersections = laneContainers\n .map((container) => {\n const rect = args.droppableRects.get(container.id);\n if (!rect) {\n return null;\n }\n\n const value = getRectIntersectionArea(args.collisionRect, rect);\n if (value <= 0) {\n return null;\n }\n\n return {\n id: container.id,\n data: {\n droppableContainer: container,\n value\n }\n };\n })\n .filter(Boolean)\n .sort((left, right) => ((right?.data?.value as number | undefined) ?? 0) - ((left?.data?.value as number | undefined) ?? 0));\n if (laneIntersections.length > 0) {\n return laneIntersections as ReturnType<CollisionDetection>;\n }\n if (pointerHits.length > 0) {\n return pointerHits;\n }\n return closestCorners(args);\n};\n\nfunction TaskCardShell({\n task,\n goal,\n tags,\n isSelected,\n isDragging = false,\n isOverlay = false,\n style,\n setNodeRef,\n dragAttributes,\n dragListeners,\n isMobile = false,\n onSelect,\n onStartTask,\n onQuickReopen,\n onStepTask,\n onOpenTask,\n onEditTask\n}: {\n task: Task;\n goal: Goal | undefined;\n tags: Tag[];\n isSelected: boolean;\n isDragging?: boolean;\n isOverlay?: boolean;\n style?: React.CSSProperties;\n setNodeRef?: (element: HTMLElement | null) => void;\n dragAttributes?: DraggableAttributes;\n dragListeners?: any;\n isMobile?: boolean;\n onSelect: (taskId: string) => void;\n onStartTask?: (taskId: string) => Promise<void>;\n onQuickReopen?: (taskId: string) => Promise<void>;\n onStepTask?: (taskId: string, direction: \"previous\" | \"next\") => Promise<void>;\n onOpenTask?: (taskId: string) => void;\n onEditTask?: (taskId: string) => void;\n}) {\n const { t, formatDate } = useI18n();\n const previousStatus = LANE_ORDER[LANE_ORDER.indexOf(task.status) - 1] ?? null;\n const nextStatus = LANE_ORDER[LANE_ORDER.indexOf(task.status) + 1] ?? null;\n\n return (\n <article\n ref={setNodeRef}\n style={style}\n className={cn(\n \"w-full max-w-full min-w-0 overflow-hidden rounded-[18px] p-3 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.04)] transition cursor-grab active:cursor-grabbing\",\n isMobile && \"touch-none select-none\",\n isOverlay && \"rotate-[0.5deg] bg-[linear-gradient(180deg,rgba(192,193,255,0.24),rgba(192,193,255,0.1))] shadow-[0_28px_80px_rgba(8,12,24,0.42),inset_0_0_0_1px_rgba(192,193,255,0.26)]\",\n isDragging && !isOverlay && \"opacity-35 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.02)]\",\n isSelected\n ? \"bg-[linear-gradient(180deg,rgba(192,193,255,0.18),rgba(192,193,255,0.06))] shadow-[0_16px_40px_rgba(8,12,24,0.32),inset_0_0_0_1px_rgba(192,193,255,0.26)]\"\n : \"bg-white/5\"\n )}\n data-dragging={isDragging ? \"true\" : \"false\"}\n data-testid={`task-card-${task.id}`}\n onClick={() => onSelect(task.id)}\n {...dragAttributes}\n {...dragListeners}\n >\n <div className=\"mb-2 flex items-start justify-between gap-2\">\n <Badge className=\"shrink-0 text-[11px] text-[var(--tertiary)]\">{task.priority}</Badge>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {onEditTask ? (\n <button\n type=\"button\"\n aria-label={`Edit ${task.title}`}\n className=\"inline-flex size-8 items-center justify-center rounded-full bg-white/8 text-white/62 transition hover:bg-white/12 hover:text-white\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onEditTask(task.id);\n }}\n >\n <Pencil className=\"size-3.5\" />\n </button>\n ) : null}\n {onOpenTask ? (\n <button\n type=\"button\"\n aria-label={`Open ${task.title} details`}\n className=\"inline-flex size-8 items-center justify-center rounded-full bg-white/8 text-white/62 transition hover:bg-white/12 hover:text-white\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onOpenTask(task.id);\n }}\n >\n <ArrowUpRight className=\"size-3.5\" />\n </button>\n ) : null}\n {isMobile ? (\n <div className=\"flex items-center gap-1\" onClick={(event) => event.stopPropagation()}>\n <button\n type=\"button\"\n aria-label={`Move ${task.title} to the previous lane`}\n className=\"inline-flex size-7 items-center justify-center rounded-full bg-white/8 text-white/62 transition hover:bg-white/12 hover:text-white disabled:opacity-35\"\n disabled={!previousStatus}\n onClick={() => {\n if (previousStatus) {\n void onStepTask?.(task.id, \"previous\");\n }\n }}\n >\n <ChevronUp className=\"size-3.5\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move ${task.title} to the next lane`}\n className=\"inline-flex size-7 items-center justify-center rounded-full bg-white/8 text-white/62 transition hover:bg-white/12 hover:text-white disabled:opacity-35\"\n disabled={!nextStatus}\n onClick={() => {\n if (nextStatus) {\n void onStepTask?.(task.id, \"next\");\n }\n }}\n >\n <ChevronDown className=\"size-3.5\" />\n </button>\n </div>\n ) : null}\n {task.status !== \"done\" ? (\n <button\n type=\"button\"\n aria-label={`Start work on ${task.title}`}\n className=\"inline-flex size-8 items-center justify-center rounded-full bg-[var(--primary)]/16 text-[var(--primary)] transition hover:bg-[var(--primary)]/24\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void onStartTask?.(task.id);\n }}\n >\n <Play className=\"size-4 fill-current\" />\n </button>\n ) : null}\n <span className=\"text-[11px] text-white/44\">{task.points} xp</span>\n </div>\n </div>\n <EntityName kind=\"task\" label={task.title} className=\"max-w-full\" lines={3} labelClassName=\"[overflow-wrap:anywhere]\" />\n <p className=\"mt-1.5 line-clamp-3 [overflow-wrap:anywhere] text-[12px] leading-5 text-white/62\">{task.description || t(\"common.executionBoard.noExecutionNote\")}</p>\n <div className=\"mt-2.5 flex min-w-0 flex-wrap gap-1.5\">\n {goal ? <EntityBadge kind=\"goal\" label={goal.title} compact wrap className=\"min-w-0 max-w-full\" /> : null}\n {task.time.totalCreditedSeconds > 0 ? <Badge className=\"bg-white/8 text-white/72\">{Math.floor(task.time.totalCreditedSeconds / 60)} min</Badge> : null}\n {task.time.activeRunCount > 0 ? <Badge className=\"bg-emerald-500/12 text-emerald-200\">{task.time.activeRunCount} live</Badge> : null}\n {tags.slice(0, 2).map((tag) => (\n <Badge key={tag.id} className=\"bg-white/8\" style={{ color: tag.color }}>\n {tag.name}\n </Badge>\n ))}\n </div>\n <div className=\"mt-2.5 flex min-w-0 items-center justify-between gap-2 text-[11px] text-white/45\">\n <span className=\"min-w-0 truncate\">\n {task.effort} / {task.energy}\n </span>\n <div className=\"flex min-w-0 shrink-0 items-center gap-2 text-right\">\n {task.status === \"done\" && onQuickReopen ? (\n <button\n type=\"button\"\n className=\"rounded-full bg-white/8 px-3 py-1 text-[10px] tracking-[0.16em] text-white transition hover:bg-white/12\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void onQuickReopen(task.id);\n }}\n >\n {t(\"common.executionBoard.reopen\")}\n </button>\n ) : null}\n <span>{formatDate(task.dueDate)}</span>\n </div>\n </div>\n </article>\n );\n}\n\nfunction SortableTaskCard(props: {\n sortableId: string;\n task: Task;\n goal: Goal | undefined;\n tags: Tag[];\n isSelected: boolean;\n isMobile?: boolean;\n onSelect: (taskId: string) => void;\n onStartTask?: (taskId: string) => Promise<void>;\n onQuickReopen?: (taskId: string) => Promise<void>;\n onStepTask?: (taskId: string, direction: \"previous\" | \"next\") => Promise<void>;\n onOpenTask?: (taskId: string) => void;\n onEditTask?: (taskId: string) => void;\n}) {\n const { task, sortableId } = props;\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: sortableId,\n data: {\n type: \"task\",\n taskId: task.id,\n status: task.status\n }\n });\n\n return (\n <TaskCardShell\n {...props}\n setNodeRef={setNodeRef}\n dragAttributes={attributes}\n dragListeners={listeners}\n isDragging={isDragging}\n isMobile={props.isMobile}\n onStartTask={props.onStartTask}\n onStepTask={props.onStepTask}\n style={{\n transform: CSS.Transform.toString(transform),\n transition\n }}\n />\n );\n}\n\nfunction LaneDropzone({\n droppableId,\n status,\n title,\n detail,\n count,\n dragging,\n children\n}: {\n droppableId: string;\n status: TaskStatus;\n title: string;\n detail: string;\n count: number;\n dragging: boolean;\n children: ReactNode;\n}) {\n const { setNodeRef, isOver } = useDroppable({\n id: droppableId,\n data: {\n type: \"lane\",\n status\n }\n });\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\"w-full max-w-full min-w-0 overflow-hidden rounded-[24px] transition\", isOver && \"scale-[1.005]\")}\n data-lane-id={status}\n data-testid={`kanban-lane-${status}`}\n data-lane-hover={isOver ? \"true\" : \"false\"}\n >\n <Card\n className={cn(\n \"h-full w-full max-w-full min-w-0 overflow-hidden p-3 transition-[background-color,box-shadow,border-color,transform]\",\n dragging && \"border border-white/8\",\n isOver\n ? \"border border-[rgba(125,211,252,0.38)] bg-[linear-gradient(180deg,rgba(125,211,252,0.12),rgba(125,211,252,0.05))] shadow-[0_18px_54px_rgba(14,165,233,0.12)]\"\n : \"border border-transparent\"\n )}\n >\n <div className=\"mb-3 flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"type-label text-white/45\">{detail}</div>\n <h3 className=\"mt-1 break-words text-[1.45rem] leading-[1] text-white\">{title}</h3>\n </div>\n <div className=\"shrink-0 font-display text-[1.45rem] text-[var(--primary)]\">{count}</div>\n </div>\n <div className={cn(\"grid w-full max-w-full min-w-0 min-h-48 content-start gap-2 rounded-[18px] p-2 transition\", isOver ? \"bg-[rgba(125,211,252,0.08)]\" : \"bg-white/[0.02]\")}>\n {children}\n </div>\n </Card>\n </div>\n );\n}\n\nexport function ExecutionBoard({\n tasks,\n goals,\n tags,\n selectedTaskId,\n onMove,\n onSelectTask,\n onStartTask,\n onQuickReopenTask,\n onOpenTask,\n onEditTask\n}: {\n tasks: Task[];\n goals: Goal[];\n tags: Tag[];\n selectedTaskId: string | null;\n onMove: (taskId: string, nextStatus: TaskStatus) => Promise<void>;\n onSelectTask: (taskId: string) => void;\n onStartTask?: (taskId: string) => Promise<void>;\n onQuickReopenTask?: (taskId: string) => Promise<void>;\n onOpenTask?: (taskId: string) => void;\n onEditTask?: (taskId: string) => void;\n}) {\n const { t } = useI18n();\n const boardInstanceId = useId();\n const [isMobileBoard, setIsMobileBoard] = useState(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(\"(max-width: 1023px)\").matches;\n });\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } })\n );\n const [activeTaskId, setActiveTaskId] = useState<string | null>(null);\n const [optimisticStatuses, setOptimisticStatuses] = useState<Record<string, TaskStatus>>({});\n const laneLabels: Record<TaskStatus, { title: string; detail: string }> = {\n backlog: { title: t(\"common.executionBoard.laneBacklogTitle\"), detail: t(\"common.executionBoard.laneBacklogDetail\") },\n focus: { title: t(\"common.executionBoard.laneFocusTitle\"), detail: t(\"common.executionBoard.laneFocusDetail\") },\n in_progress: { title: t(\"common.executionBoard.laneProgressTitle\"), detail: t(\"common.executionBoard.laneProgressDetail\") },\n blocked: { title: t(\"common.executionBoard.laneBlockedTitle\"), detail: t(\"common.executionBoard.laneBlockedDetail\") },\n done: { title: t(\"common.executionBoard.laneDoneTitle\"), detail: t(\"common.executionBoard.laneDoneDetail\") }\n };\n const boardTasks = useMemo(\n () =>\n tasks.map((task) => {\n const optimisticStatus = optimisticStatuses[task.id];\n return optimisticStatus ? { ...task, status: optimisticStatus } : task;\n }),\n [optimisticStatuses, tasks]\n );\n const activeTask = activeTaskId ? boardTasks.find((task) => task.id === activeTaskId) ?? null : null;\n const activeGoal = activeTask ? goals.find((goal) => goal.id === activeTask.goalId) : undefined;\n const activeTags = activeTask ? activeTask.tagIds.map((tagId) => tags.find((tag) => tag.id === tagId)).filter(Boolean) as Tag[] : [];\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(\"(max-width: 1023px)\");\n const sync = (event?: MediaQueryListEvent) => {\n setIsMobileBoard(event ? event.matches : mediaQuery.matches);\n };\n\n sync();\n\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", sync);\n return () => mediaQuery.removeEventListener(\"change\", sync);\n }\n\n mediaQuery.addListener(sync);\n return () => mediaQuery.removeListener(sync);\n }, []);\n\n useEffect(() => {\n if (!activeTaskId) {\n document.body.style.cursor = \"\";\n return;\n }\n\n document.body.style.cursor = \"grabbing\";\n return () => {\n document.body.style.cursor = \"\";\n };\n }, [activeTaskId]);\n\n useEffect(() => {\n setOptimisticStatuses((current) => {\n const taskIds = new Set(tasks.map((task) => task.id));\n let changed = false;\n const next: Record<string, TaskStatus> = {};\n\n for (const [taskId, status] of Object.entries(current)) {\n const task = tasks.find((entry) => entry.id === taskId);\n if (!taskIds.has(taskId) || !task || task.status === status) {\n changed = true;\n continue;\n }\n next[taskId] = status;\n }\n\n return changed ? next : current;\n });\n }, [tasks]);\n\n function handleDragStart(event: DragStartEvent) {\n const taskId = event.active.data.current?.taskId;\n if (typeof taskId === \"string\") {\n setActiveTaskId(taskId);\n }\n }\n\n async function handleDragEnd(event: DragEndEvent) {\n const { active, over } = event;\n setActiveTaskId(null);\n if (!over || active.id === over.id) {\n return;\n }\n\n const activeTaskId = typeof active.data.current?.taskId === \"string\" ? active.data.current.taskId : String(active.id);\n const task = boardTasks.find((entry) => entry.id === activeTaskId);\n if (!task) {\n return;\n }\n\n const overStatus = typeof over.data.current?.status === \"string\" ? (over.data.current.status as TaskStatus) : null;\n const overTaskId = typeof over.data.current?.taskId === \"string\" ? over.data.current.taskId : String(over.id);\n const laneId = overStatus ?? (boardTasks.find((entry) => entry.id === overTaskId)?.status ?? task.status);\n if (laneId !== task.status && LANE_ORDER.includes(laneId)) {\n setOptimisticStatuses((current) => ({\n ...current,\n [task.id]: laneId\n }));\n try {\n await onMove(task.id, laneId);\n } catch (error) {\n setOptimisticStatuses((current) => {\n const next = { ...current };\n delete next[task.id];\n return next;\n });\n throw error;\n }\n }\n }\n\n async function handleStepTask(taskId: string, direction: \"previous\" | \"next\") {\n const task = boardTasks.find((entry) => entry.id === taskId);\n if (!task) {\n return;\n }\n\n const currentIndex = LANE_ORDER.indexOf(task.status);\n const nextIndex = direction === \"previous\" ? currentIndex - 1 : currentIndex + 1;\n const nextStatus = LANE_ORDER[nextIndex] ?? null;\n if (!nextStatus || nextStatus === task.status) {\n return;\n }\n\n setOptimisticStatuses((current) => ({\n ...current,\n [task.id]: nextStatus\n }));\n\n try {\n await onMove(task.id, nextStatus);\n } catch (error) {\n setOptimisticStatuses((current) => {\n const next = { ...current };\n delete next[task.id];\n return next;\n });\n throw error;\n }\n }\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={laneFirstCollision}\n onDragStart={handleDragStart}\n onDragCancel={() => setActiveTaskId(null)}\n onDragEnd={(event) => void handleDragEnd(event)}\n >\n <div className=\"w-full max-w-full min-w-0 pb-2\">\n {isMobileBoard ? (\n <div className=\"grid w-full max-w-full min-w-0 gap-2\">\n {LANE_ORDER.map((status) => {\n const laneTasks = boardTasks.filter((task) => task.status === status);\n return (\n <SortableContext key={status} items={laneTasks.map((task) => `${boardInstanceId}:task:${task.id}`)} strategy={verticalListSortingStrategy}>\n <LaneDropzone\n droppableId={`${boardInstanceId}:lane:${status}`}\n status={status}\n title={laneLabels[status].title}\n detail={laneLabels[status].detail}\n count={laneTasks.length}\n dragging={activeTaskId !== null}\n >\n {laneTasks.map((task) => (\n <SortableTaskCard\n key={task.id}\n sortableId={`${boardInstanceId}:task:${task.id}`}\n task={task}\n goal={goals.find((goal) => goal.id === task.goalId)}\n tags={task.tagIds.map((tagId) => tags.find((tag) => tag.id === tagId)).filter(Boolean) as Tag[]}\n isSelected={selectedTaskId === task.id}\n isMobile\n onSelect={onSelectTask}\n onStartTask={onStartTask}\n onQuickReopen={onQuickReopenTask}\n onStepTask={handleStepTask}\n onOpenTask={onOpenTask}\n onEditTask={onEditTask}\n />\n ))}\n {laneTasks.length === 0 ? (\n <div className=\"w-full max-w-full rounded-[18px] border border-dashed border-white/8 px-4 py-8 text-center text-sm text-white/35\">\n {t(\"common.executionBoard.emptyLane\")}\n </div>\n ) : null}\n </LaneDropzone>\n </SortableContext>\n );\n })}\n </div>\n ) : (\n <div className=\"grid w-full min-w-0 gap-0.5 xl:grid-cols-[repeat(5,minmax(0,1fr))]\">\n {LANE_ORDER.map((status) => {\n const laneTasks = boardTasks.filter((task) => task.status === status);\n return (\n <SortableContext key={status} items={laneTasks.map((task) => `${boardInstanceId}:task:${task.id}`)} strategy={verticalListSortingStrategy}>\n <LaneDropzone\n droppableId={`${boardInstanceId}:lane:${status}`}\n status={status}\n title={laneLabels[status].title}\n detail={laneLabels[status].detail}\n count={laneTasks.length}\n dragging={activeTaskId !== null}\n >\n {laneTasks.map((task) => (\n <SortableTaskCard\n key={task.id}\n sortableId={`${boardInstanceId}:task:${task.id}`}\n task={task}\n goal={goals.find((goal) => goal.id === task.goalId)}\n tags={task.tagIds.map((tagId) => tags.find((tag) => tag.id === tagId)).filter(Boolean) as Tag[]}\n isSelected={selectedTaskId === task.id}\n onSelect={onSelectTask}\n onStartTask={onStartTask}\n onQuickReopen={onQuickReopenTask}\n onStepTask={handleStepTask}\n onOpenTask={onOpenTask}\n onEditTask={onEditTask}\n />\n ))}\n {laneTasks.length === 0 ? (\n <div className=\"w-full max-w-full rounded-[18px] border border-dashed border-white/8 px-4 py-8 text-center text-sm text-white/35\">\n {t(\"common.executionBoard.emptyLane\")}\n </div>\n ) : null}\n </LaneDropzone>\n </SortableContext>\n );\n })}\n </div>\n )}\n </div>\n <DragOverlay adjustScale={false} dropAnimation={null}>\n {activeTask ? (\n <div className=\"w-[20rem] max-w-[calc(100vw-2rem)]\">\n <TaskCardShell\n task={activeTask}\n goal={activeGoal}\n tags={activeTags}\n isSelected={selectedTaskId === activeTask.id}\n isDragging\n isOverlay\n isMobile={isMobileBoard}\n onSelect={() => {}}\n onStartTask={onStartTask}\n />\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n );\n}\n","import { create } from \"zustand\";\n\ninterface CommandCenterState {\n selectedOwner: string | null;\n selectedGoalId: string | null;\n selectedTagIds: string[];\n setOwner: (owner: string | null) => void;\n setGoal: (goalId: string | null) => void;\n toggleTag: (tagId: string) => void;\n reset: () => void;\n}\n\nexport const useCommandCenterStore = create<CommandCenterState>((set) => ({\n selectedOwner: null,\n selectedGoalId: null,\n selectedTagIds: [],\n setOwner: (selectedOwner) => set({ selectedOwner }),\n setGoal: (selectedGoalId) => set({ selectedGoalId }),\n toggleTag: (tagId) =>\n set((state) => ({\n selectedTagIds: state.selectedTagIds.includes(tagId)\n ? state.selectedTagIds.filter((entry) => entry !== tagId)\n : [...state.selectedTagIds, tagId]\n })),\n reset: () =>\n set({\n selectedOwner: null,\n selectedGoalId: null,\n selectedTagIds: []\n })\n}));\n","import { useState } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { ExecutionBoard } from \"@/components/execution-board\";\nimport { TaskDialog } from \"@/components/task-dialog\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { EmptyState } from \"@/components/ui/page-state\";\nimport { patchTask, uncompleteTask } from \"@/lib/api\";\nimport { useI18n } from \"@/lib/i18n\";\nimport { useCommandCenterStore } from \"@/store/use-command-center\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\n\nexport function KanbanPage() {\n const { t } = useI18n();\n const shell = useForgeShell();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const [selectedTaskId, setSelectedTaskId] = useState<string | null>(shell.snapshot.tasks[0]?.id ?? null);\n const [editingTaskId, setEditingTaskId] = useState<string | null>(null);\n const { selectedGoalId, selectedOwner, selectedTagIds, setGoal, setOwner, toggleTag, reset } = useCommandCenterStore();\n\n const filteredTasks = shell.snapshot.tasks.filter((task) => {\n if (selectedGoalId && task.goalId !== selectedGoalId) {\n return false;\n }\n if (selectedOwner && task.owner !== selectedOwner) {\n return false;\n }\n if (selectedTagIds.length > 0 && !selectedTagIds.every((tagId) => task.tagIds.includes(tagId))) {\n return false;\n }\n return true;\n });\n\n const selectedTask = filteredTasks.find((task) => task.id === selectedTaskId) ?? shell.snapshot.tasks.find((task) => task.id === selectedTaskId) ?? null;\n const editingTask = editingTaskId ? shell.snapshot.tasks.find((task) => task.id === editingTaskId) ?? null : null;\n const blockedCount = filteredTasks.filter((task) => task.status === \"blocked\").length;\n const doneCount = filteredTasks.filter((task) => task.status === \"done\").length;\n const focusCount = filteredTasks.filter((task) => task.status === \"focus\" || task.status === \"in_progress\").length;\n const liveRunCount = shell.snapshot.activeTaskRuns.length;\n\n const invalidateBoard = async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] }),\n queryClient.invalidateQueries({ queryKey: [\"project-board\"] }),\n queryClient.invalidateQueries({ queryKey: [\"task-context\"] })\n ]);\n };\n\n const updateTaskMutation = useMutation({\n mutationFn: ({ taskId, patch }: { taskId: string; patch: Parameters<typeof patchTask>[1] }) => patchTask(taskId, patch),\n onSuccess: invalidateBoard\n });\n\n if (shell.snapshot.tasks.length === 0) {\n return (\n <div className=\"grid min-w-0 grid-cols-1 gap-5\">\n <PageHero\n title=\"Kanban\"\n description=\"Move tasks across the board, start work quickly, and keep your next step visible.\"\n badge=\"0 visible tasks\"\n actions={\n <Button size=\"lg\" onClick={() => shell.openStartWork()}>\n Start work\n </Button>\n }\n />\n <EmptyState\n eyebrow={t(\"common.kanban.heroEyebrow\")}\n title={t(\"common.kanban.emptyTitle\")}\n description={t(\"common.kanban.emptyDescription\")}\n action={\n <Link to=\"/goals\" className=\"inline-flex whitespace-nowrap rounded-full bg-[var(--primary)] px-4 py-2 text-sm font-medium text-slate-950 transition hover:opacity-90\">\n {t(\"common.kanban.emptyAction\")}\n </Link>\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"grid min-w-0 grid-cols-1 gap-5\">\n <PageHero\n title=\"Kanban\"\n description=\"Move tasks between states, start work directly from the board, or open a task when you need to edit it.\"\n badge={`${filteredTasks.length} visible tasks`}\n actions={\n <Button size=\"lg\" onClick={() => shell.openStartWork(selectedTask ? { taskId: selectedTask.id } : undefined)}>\n Start work\n </Button>\n }\n />\n\n <Card className=\"min-w-0 overflow-hidden\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Board</div>\n <div className=\"mt-2 text-base text-white\">See what is not started, ready, active, blocked, or done, then move tasks where they belong.</div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Badge className=\"bg-white/[0.08] text-white/72\">{focusCount} ready or active</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{blockedCount} blocked</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{doneCount} done</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{liveRunCount} live timer{liveRunCount === 1 ? \"\" : \"s\"}</Badge>\n </div>\n </div>\n </Card>\n\n <Card className=\"min-w-0 overflow-hidden\">\n <div className=\"type-label text-white/40\">Filters</div>\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n <Badge tone=\"meta\" className=\"bg-white/[0.08] text-white/60\">\n Goal\n </Badge>\n <button className={`interactive-tap max-w-full rounded-full px-4 py-2 text-sm ${selectedGoalId === null ? \"bg-white/[0.12] text-white\" : \"bg-white/[0.04] text-white/58\"}`} onClick={() => setGoal(null)}>\n All goals\n </button>\n {shell.snapshot.goals.map((goal) => (\n <button\n key={goal.id}\n className={`interactive-tap min-w-0 max-w-full rounded-full px-4 py-2 text-sm ${selectedGoalId === goal.id ? \"bg-white/[0.12] text-white\" : \"bg-white/[0.04] text-white/58\"}`}\n onClick={() => setGoal(selectedGoalId === goal.id ? null : goal.id)}\n >\n <EntityName kind=\"goal\" label={goal.title} className=\"max-w-full min-w-0\" lines={2} labelClassName=\"whitespace-normal text-left\" />\n </button>\n ))}\n </div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <Badge tone=\"meta\" className=\"bg-white/[0.08] text-white/60\">\n Owner\n </Badge>\n <button className={`interactive-tap max-w-full rounded-full px-4 py-2 text-sm ${selectedOwner === null ? \"bg-white/[0.12] text-white\" : \"bg-white/[0.04] text-white/58\"}`} onClick={() => setOwner(null)}>\n Everyone\n </button>\n {shell.snapshot.dashboard.owners.map((owner) => (\n <button key={owner} className={`interactive-tap max-w-full rounded-full px-4 py-2 text-sm ${selectedOwner === owner ? \"bg-white/[0.12] text-white\" : \"bg-white/[0.04] text-white/58\"}`} onClick={() => setOwner(selectedOwner === owner ? null : owner)}>\n {owner}\n </button>\n ))}\n </div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {shell.snapshot.tags.map((tag) => (\n <button key={tag.id} className={`interactive-tap max-w-full rounded-full px-4 py-2 text-sm ${selectedTagIds.includes(tag.id) ? \"bg-white/[0.12] text-white\" : \"bg-white/[0.04] text-white/58\"}`} onClick={() => toggleTag(tag.id)}>\n {tag.name}\n </button>\n ))}\n <button className=\"interactive-tap max-w-full rounded-full bg-white/[0.04] px-4 py-2 text-sm text-[var(--primary)]\" onClick={reset}>\n Reset\n </button>\n </div>\n </Card>\n\n {filteredTasks.length === 0 ? (\n <EmptyState\n eyebrow={t(\"common.kanban.heroEyebrow\")}\n title={t(\"common.kanban.noTasksMatch\")}\n description=\"No tasks match the current filters. Reset the filters to bring the full board back.\"\n action={\n <Button variant=\"secondary\" onClick={reset}>\n Reset\n </Button>\n }\n />\n ) : (\n <ExecutionBoard\n tasks={filteredTasks}\n goals={shell.snapshot.goals}\n tags={shell.snapshot.tags}\n selectedTaskId={selectedTaskId}\n onMove={async (taskId, nextStatus) => {\n await shell.patchTaskStatus(taskId, nextStatus);\n }}\n onQuickReopenTask={async (taskId) => {\n await uncompleteTask(taskId);\n await invalidateBoard();\n }}\n onStartTask={async (taskId) => {\n await shell.startTaskNow(taskId);\n setSelectedTaskId(taskId);\n await queryClient.invalidateQueries({ queryKey: [\"task-context\", taskId] });\n }}\n onSelectTask={(taskId) => {\n setSelectedTaskId(taskId);\n }}\n onOpenTask={(taskId) => {\n navigate(`/tasks/${taskId}`);\n }}\n onEditTask={(taskId) => {\n setEditingTaskId(taskId);\n }}\n />\n )}\n\n <TaskDialog\n open={editingTask !== null}\n goals={shell.snapshot.goals}\n projects={shell.snapshot.dashboard.projects}\n tags={shell.snapshot.tags}\n editingTask={editingTask}\n onOpenChange={(open) => {\n if (!open) {\n setEditingTaskId(null);\n }\n }}\n onSubmit={async (input, taskId) => {\n if (!taskId) {\n return;\n }\n await updateTaskMutation.mutateAsync({ taskId, patch: input });\n setEditingTaskId(null);\n }}\n />\n </div>\n );\n}\n","import { motion } from \"framer-motion\";\nimport { ArrowRight } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/lib/utils\";\n\nexport type FlagshipSignalItem = {\n id: string;\n label: string;\n title: ReactNode;\n detail: string;\n badge?: string;\n href?: string;\n actionLabel?: string;\n};\n\nexport function FlagshipSignalDeck({\n eyebrow,\n title,\n description,\n items,\n tone = \"core\",\n className\n}: {\n eyebrow: string;\n title: string;\n description: string;\n items: ReadonlyArray<FlagshipSignalItem>;\n tone?: \"core\" | \"psyche\";\n className?: string;\n}) {\n return (\n <section\n className={cn(\n \"min-w-0 overflow-hidden rounded-[28px] border border-white/6 shadow-[0_20px_54px_rgba(4,8,18,0.24)]\",\n tone === \"core\"\n ? \"bg-[linear-gradient(180deg,rgba(22,28,46,0.98),rgba(12,17,30,0.95))]\"\n : \"bg-[linear-gradient(180deg,rgba(16,29,33,0.98),rgba(12,22,27,0.95))]\",\n className\n )}\n >\n <div\n className={cn(\n \"grid min-w-0 gap-3 px-4 py-4 lg:grid-cols-[minmax(0,1fr)_minmax(0,26rem)] lg:px-5\",\n tone === \"core\"\n ? \"bg-[radial-gradient(circle_at_top_right,rgba(192,193,255,0.12),transparent_36%),linear-gradient(180deg,rgba(255,255,255,0.03),rgba(255,255,255,0))]\"\n : \"bg-[radial-gradient(circle_at_top_right,rgba(110,231,183,0.1),transparent_36%),linear-gradient(180deg,rgba(255,255,255,0.03),rgba(255,255,255,0))]\"\n )}\n >\n <div className=\"min-w-0\">\n <div className={cn(\"font-label text-[11px] uppercase tracking-[0.2em]\", tone === \"core\" ? \"text-[var(--secondary)]\" : \"text-[rgba(110,231,183,0.82)]\")}>\n {eyebrow}\n </div>\n <h2 className=\"mt-2 max-w-3xl font-display text-[clamp(1.35rem,2vw,1.9rem)] leading-none text-white\">{title}</h2>\n <p className=\"mt-2 max-w-3xl text-sm leading-6 text-white/60\">{description}</p>\n </div>\n\n <div className=\"grid min-w-0 gap-2 sm:grid-cols-3\">\n {items.slice(0, 3).map((item) => (\n item.href ? (\n <Link\n key={item.id}\n to={item.href}\n className={cn(\n \"min-w-0 rounded-[20px] border border-white/6 px-3 py-3 backdrop-blur-sm transition hover:bg-white/[0.08]\",\n tone === \"core\"\n ? \"bg-[linear-gradient(180deg,rgba(255,255,255,0.05),rgba(255,255,255,0.025))]\"\n : \"bg-[linear-gradient(180deg,rgba(110,231,183,0.08),rgba(255,255,255,0.02))]\"\n )}\n >\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/42\">{item.label}</div>\n <div className=\"mt-1.5 min-w-0 font-medium text-white\">{item.title}</div>\n </Link>\n ) : (\n <div\n key={item.id}\n className={cn(\n \"min-w-0 rounded-[20px] border border-white/6 px-3 py-3 backdrop-blur-sm\",\n tone === \"core\"\n ? \"bg-[linear-gradient(180deg,rgba(255,255,255,0.05),rgba(255,255,255,0.025))]\"\n : \"bg-[linear-gradient(180deg,rgba(110,231,183,0.08),rgba(255,255,255,0.02))]\"\n )}\n >\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/42\">{item.label}</div>\n <div className=\"mt-1.5 min-w-0 font-medium text-white\">{item.title}</div>\n </div>\n )\n ))}\n </div>\n </div>\n\n <div className=\"grid min-w-0 gap-3 px-4 py-4 lg:grid-cols-2 lg:px-5\">\n {items.map((item, index) => {\n const cardClassName =\n cn(\n \"group flex min-h-[13.5rem] min-w-0 flex-col overflow-hidden rounded-[24px] border border-white/7 p-0 transition hover:-translate-y-0.5 hover:shadow-[0_22px_46px_rgba(3,8,18,0.28)] sm:min-h-[15.5rem]\",\n tone === \"core\"\n ? \"bg-[linear-gradient(180deg,rgba(19,26,42,0.98),rgba(11,16,28,0.96))] hover:border-white/12 hover:bg-[linear-gradient(180deg,rgba(24,31,50,0.98),rgba(13,19,33,0.97))]\"\n : \"bg-[linear-gradient(180deg,rgba(17,29,32,0.98),rgba(9,18,22,0.97))] hover:border-white/12 hover:bg-[linear-gradient(180deg,rgba(21,36,40,0.98),rgba(11,22,27,0.97))]\"\n );\n const body = (\n <>\n <div\n className={cn(\n \"flex min-w-0 flex-1 flex-col p-4\",\n tone === \"core\"\n ? \"bg-[radial-gradient(circle_at_top_left,rgba(192,193,255,0.1),transparent_28%),linear-gradient(180deg,rgba(255,255,255,0.025),rgba(255,255,255,0))]\"\n : \"bg-[radial-gradient(circle_at_top_left,rgba(110,231,183,0.08),transparent_28%),linear-gradient(180deg,rgba(255,255,255,0.025),rgba(255,255,255,0))]\"\n )}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{item.label}</div>\n <div className=\"mt-2.5 min-w-0 font-display text-[1.25rem] leading-tight text-white sm:text-[1.4rem]\">{item.title}</div>\n </div>\n {item.badge ? <Badge wrap className=\"max-w-[10rem] shrink-0 self-start bg-white/[0.08] text-white/72\">{item.badge}</Badge> : null}\n </div>\n <div className=\"mt-2.5 text-sm leading-6 text-white/60\">{item.detail}</div>\n <div className=\"flex-1\" />\n </div>\n {item.href ? (\n <div className=\"border-t border-white/6 bg-[linear-gradient(180deg,rgba(255,255,255,0.02),rgba(255,255,255,0.01))] px-4 py-3\">\n <div className=\"inline-flex min-h-10 min-w-0 max-w-full items-center gap-2 rounded-full border border-white/8 bg-white/[0.05] px-4 text-sm text-white/68 transition group-hover:border-white/14 group-hover:bg-white/[0.08] group-hover:text-white\">\n {item.actionLabel ?? \"Open\"}\n <ArrowRight className=\"size-3.5\" />\n </div>\n </div>\n ) : null}\n </>\n );\n\n return (\n <motion.div\n key={item.id}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.22, delay: 0.04 * index, ease: \"easeOut\" }}\n >\n {item.href ? (\n <Link to={item.href} className={cardClassName}>\n {body}\n </Link>\n ) : (\n <div className={cardClassName}>{body}</div>\n )}\n </motion.div>\n );\n })}\n </div>\n </section>\n );\n}\n","import { motion } from \"framer-motion\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { ProgressMeter } from \"@/components/ui/progress-meter\";\nimport { cn, formatDateTime } from \"@/lib/utils\";\nimport type { AchievementSignal, MilestoneReward, RewardLedgerEvent, XpMetricsPayload, XpMomentumPulse } from \"@/lib/types\";\n\ntype XpCommandDeckProps = {\n profile: XpMetricsPayload[\"profile\"];\n achievements: AchievementSignal[];\n milestoneRewards: MilestoneReward[];\n momentumPulse: XpMomentumPulse;\n recentLedger?: RewardLedgerEvent[];\n className?: string;\n tone?: \"core\" | \"psyche\";\n};\n\nfunction achievementTone(tier: AchievementSignal[\"tier\"]) {\n switch (tier) {\n case \"platinum\":\n return \"text-cyan-200\";\n case \"gold\":\n return \"text-amber-200\";\n case \"silver\":\n return \"text-slate-200\";\n default:\n return \"text-orange-200\";\n }\n}\n\nfunction statusTone(status: XpMomentumPulse[\"status\"]) {\n switch (status) {\n case \"surging\":\n return \"from-[rgba(192,193,255,0.3)] via-[rgba(78,222,163,0.22)] to-[rgba(255,185,95,0.22)]\";\n case \"steady\":\n return \"from-[rgba(192,193,255,0.24)] via-[rgba(192,193,255,0.14)] to-[rgba(78,222,163,0.18)]\";\n default:\n return \"from-[rgba(255,185,95,0.2)] via-[rgba(255,185,95,0.12)] to-[rgba(192,193,255,0.16)]\";\n }\n}\n\nexport function XpCommandDeck({\n profile,\n achievements,\n milestoneRewards,\n momentumPulse,\n recentLedger = [],\n className,\n tone = \"core\"\n}: XpCommandDeckProps) {\n const unlocked = achievements.filter((achievement) => achievement.unlocked);\n const visibleAchievements = (unlocked.length > 0 ? unlocked : achievements).slice(0, 3);\n const visibleMilestones = milestoneRewards.slice(0, 3);\n const visibleLedger = recentLedger.slice(0, 3);\n const nextLevelProgress = Math.min(100, Math.round((profile.currentLevelXp / profile.nextLevelXp) * 100));\n\n return (\n <section\n className={cn(\n \"min-w-0 overflow-hidden rounded-[30px] border border-white/6 bg-[linear-gradient(180deg,rgba(18,24,40,0.96),rgba(11,16,28,0.94))] shadow-[0_24px_70px_rgba(4,8,18,0.3)]\",\n tone === \"psyche\" && \"bg-[linear-gradient(180deg,rgba(18,27,35,0.96),rgba(12,20,26,0.94))]\",\n className\n )}\n >\n <div className={cn(\"bg-gradient-to-r px-5 py-5\", statusTone(momentumPulse.status))}>\n <div className=\"flex min-w-0 flex-wrap items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.2em] text-white/55\">Weekly progress</div>\n <h2 className=\"mt-3 font-display text-3xl leading-none text-white lg:text-4xl\">{momentumPulse.headline}</h2>\n <p className=\"mt-3 max-w-3xl text-sm leading-7 text-white/68\">{momentumPulse.detail}</p>\n </div>\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <Badge wrap className=\"bg-black/20 text-white/84\">Level {profile.level}</Badge>\n <Badge wrap className=\"bg-black/20 text-white/84\">{profile.streakDays} day streak</Badge>\n <Badge wrap className=\"bg-black/20 text-white/84\">{profile.weeklyXp} weekly XP</Badge>\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-5 px-5 py-5 xl:grid-cols-[minmax(0,1.2fr)_minmax(0,0.8fr)]\">\n <div className=\"grid gap-5\">\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.24, ease: \"easeOut\" }}\n className=\"overflow-hidden rounded-[24px] bg-white/[0.04] p-4\"\n >\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-white\">Next reward</div>\n <div className=\"mt-2 text-sm text-white/60\">{momentumPulse.nextMilestoneLabel}</div>\n </div>\n <Badge wrap className=\"max-w-[12rem] shrink-0 self-start text-[var(--tertiary)]\">{momentumPulse.celebrationLabel}</Badge>\n </div>\n <div className=\"mt-5\">\n <ProgressMeter value={nextLevelProgress} />\n </div>\n <div className=\"mt-3 flex items-center justify-between gap-3 text-xs uppercase tracking-[0.16em] text-white/38\">\n <span>{profile.currentLevelXp}/{profile.nextLevelXp} XP</span>\n <span>{profile.comboMultiplier.toFixed(2)}x combo</span>\n </div>\n </motion.div>\n\n <div className=\"grid gap-3 md:grid-cols-3\">\n {visibleAchievements.map((achievement, index) => (\n <motion.div\n key={achievement.id}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.24, delay: 0.04 * index, ease: \"easeOut\" }}\n className=\"overflow-hidden rounded-[22px] bg-white/[0.04] p-4\"\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1 font-medium text-white\">{achievement.title}</div>\n <Badge wrap className={cn(\"max-w-[8rem] shrink-0 self-start\", achievementTone(achievement.tier))}>{achievement.tier}</Badge>\n </div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{achievement.summary}</div>\n <div className=\"mt-4 text-xs uppercase tracking-[0.16em] text-white/40\">{achievement.progressLabel}</div>\n </motion.div>\n ))}\n </div>\n </div>\n\n <div className=\"grid gap-4\">\n <div className=\"overflow-hidden rounded-[24px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Rewards in progress</div>\n <div className=\"mt-4 grid gap-3\">\n {visibleMilestones.map((milestone) => {\n const progress = Math.min(100, Math.round((milestone.current / milestone.target) * 100));\n return (\n <div key={milestone.id} className=\"overflow-hidden rounded-[18px] bg-[rgba(8,13,28,0.68)] p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1 font-medium text-white\">{milestone.title}</div>\n <Badge wrap className={cn(\"max-w-[10.5rem] shrink-0 self-start\", milestone.completed ? \"text-emerald-300\" : \"text-white/68\")}>{milestone.rewardLabel}</Badge>\n </div>\n <div className=\"mt-2 text-sm text-white/58\">{milestone.summary}</div>\n <div className=\"mt-4\">\n <ProgressMeter value={progress} />\n </div>\n <div className=\"mt-3 text-xs uppercase tracking-[0.16em] text-white/38\">{milestone.progressLabel}</div>\n </div>\n );\n })}\n </div>\n </div>\n\n {visibleLedger.length > 0 ? (\n <div className=\"overflow-hidden rounded-[24px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Recent XP changes</div>\n <div className=\"mt-4 grid gap-3\">\n {visibleLedger.map((event) => (\n <div key={event.id} className=\"overflow-hidden rounded-[18px] bg-[rgba(8,13,28,0.68)] p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1 font-medium text-white\">{event.reasonTitle}</div>\n <Badge wrap className={cn(\"max-w-[8rem] shrink-0 self-start\", event.deltaXp >= 0 ? \"text-emerald-300\" : \"text-amber-300\")}>\n {event.deltaXp > 0 ? \"+\" : \"\"}\n {event.deltaXp} XP\n </Badge>\n </div>\n <div className=\"mt-2 text-sm text-white/58\">{event.reasonSummary}</div>\n <div className=\"mt-3 text-xs uppercase tracking-[0.16em] text-white/38\">{formatDateTime(event.createdAt)}</div>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Card } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport function InteractiveCard({\n to,\n children,\n className\n}: {\n to: string;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <Link\n to={to}\n className=\"group block transition-transform duration-[var(--motion-medium)] ease-[var(--ease-standard)] hover:-translate-y-0.5 focus-visible:outline-none\"\n >\n <Card\n className={cn(\n \"transition-[transform,box-shadow,background] duration-[var(--motion-medium)] ease-[var(--ease-standard)] group-hover:bg-white/[0.06] group-hover:shadow-[var(--card-shadow-hover)] group-focus-visible:shadow-[var(--card-shadow-hover)]\",\n className\n )}\n >\n {children}\n </Card>\n </Link>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Card } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport function MetricTile({\n label,\n value,\n tone = \"default\",\n detail,\n className\n}: {\n label: string;\n value: ReactNode;\n tone?: \"default\" | \"core\" | \"psyche\";\n detail?: ReactNode;\n className?: string;\n}) {\n return (\n <Card\n className={cn(\n \"rounded-[22px] p-4\",\n tone === \"core\" && \"bg-[linear-gradient(180deg,rgba(29,24,48,0.95),rgba(17,17,31,0.92))]\",\n tone === \"psyche\" && \"bg-[linear-gradient(180deg,rgba(18,31,34,0.96),rgba(13,24,27,0.94))]\",\n className\n )}\n >\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{label}</div>\n <div className=\"mt-3 font-display text-3xl text-white\">{value}</div>\n {detail ? <div className=\"mt-2 text-sm text-white/56\">{detail}</div> : null}\n </Card>\n );\n}\n","import { Link } from \"react-router-dom\";\nimport { FlagshipSignalDeck } from \"@/components/experience/flagship-signal-deck\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { XpCommandDeck } from \"@/components/xp/xp-command-deck\";\nimport { ProgressMeter } from \"@/components/ui/progress-meter\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { InfoTooltip } from \"@/components/ui/info-tooltip\";\nimport { InteractiveCard } from \"@/components/ui/interactive-card\";\nimport { MetricTile } from \"@/components/ui/metric-tile\";\nimport { EmptyState } from \"@/components/ui/page-state\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\nimport { getReadableActivityDescription, getReadableActivityTitle } from \"@/lib/activity-copy\";\nimport { useI18n } from \"@/lib/i18n\";\n\nexport function OverviewPage() {\n const { t, formatDateTime } = useI18n();\n const { snapshot } = useForgeShell();\n const heroStatus = snapshot.metrics.momentumScore >= 80 ? \"Strong\" : snapshot.metrics.momentumScore >= 60 ? \"Steady\" : \"Needs attention\";\n const projectLookup = new Map(snapshot.projects.map((project) => [project.id, project]));\n const nextMilestone = snapshot.dashboard.milestoneRewards.find((reward) => !reward.completed) ?? snapshot.dashboard.milestoneRewards[0] ?? null;\n const unlockedAchievements = snapshot.dashboard.achievements.filter((achievement) => achievement.unlocked).length;\n const topTask = snapshot.overview.topTasks[0] ?? null;\n const topGoal = snapshot.overview.activeGoals[0] ?? null;\n const driftGoal = snapshot.overview.neglectedGoals[0] ?? null;\n const latestEvidence = snapshot.overview.recentEvidence[0] ?? null;\n const overviewMomentumPulse = {\n status:\n snapshot.metrics.momentumScore >= 80 ? \"surging\" : snapshot.metrics.momentumScore >= 60 ? \"steady\" : \"recovering\",\n headline:\n snapshot.metrics.momentumScore >= 80\n ? `${snapshot.metrics.streakDays}-day streak active. Your recent work is building on itself.`\n : snapshot.metrics.momentumScore >= 60\n ? \"Momentum is stable. One useful push will keep things moving.\"\n : \"Momentum is soft right now. One real win will help restart it.\",\n detail:\n nextMilestone !== null\n ? `${nextMilestone.title} is the clean next unlock. ${nextMilestone.progressLabel}.`\n : `Level ${snapshot.metrics.level} is active with ${snapshot.metrics.weeklyXp} weekly XP recorded.`,\n celebrationLabel:\n unlockedAchievements > 0\n ? `${unlockedAchievements} achievement${unlockedAchievements === 1 ? \"\" : \"s\"} unlocked`\n : snapshot.metrics.weeklyXp >= 120\n ? \"A strong week is taking shape\"\n : \"The next reward comes from a real completion or repair\",\n nextMilestoneId: nextMilestone?.id ?? null,\n nextMilestoneLabel: nextMilestone?.rewardLabel ?? \"Keep building visible momentum\"\n } as const;\n const hasOverviewData =\n snapshot.overview.activeGoals.length > 0 ||\n snapshot.overview.projects.length > 0 ||\n snapshot.overview.topTasks.length > 0 ||\n snapshot.overview.recentEvidence.length > 0 ||\n snapshot.overview.neglectedGoals.length > 0;\n const overviewSignals = [\n {\n id: \"top-task\",\n label: topTask ? \"Top task\" : \"Top goal\",\n title:\n topTask ? (\n <EntityName kind=\"task\" label={topTask.title} lines={3} labelClassName=\"[overflow-wrap:anywhere]\" />\n ) : topGoal ? (\n <EntityName kind=\"goal\" label={topGoal.title} lines={3} labelClassName=\"[overflow-wrap:anywhere]\" />\n ) : (\n \"Choose the next task\"\n ),\n detail:\n topTask?.description ||\n topGoal?.description ||\n t(\"common.todayPage.noDirectiveDetail\"),\n badge: topTask ? `${topTask.points} xp` : `${snapshot.overview.strategicHeader.focusTasks} focus tasks`,\n href: topTask ? `/tasks/${topTask.id}` : topGoal ? `/goals/${topGoal.id}` : \"/goals\",\n actionLabel: topTask ? \"Open task\" : \"Open goal\"\n },\n {\n id: \"reward\",\n label: \"Next reward\",\n title: nextMilestone?.title ?? \"Keep the streak going\",\n detail:\n nextMilestone?.progressLabel ??\n `Level ${snapshot.metrics.level} is live. ${snapshot.metrics.currentLevelXp} XP is already banked toward the next unlock.`,\n badge: nextMilestone?.rewardLabel ?? `${snapshot.metrics.comboMultiplier.toFixed(2)}x combo`,\n href: \"/today\",\n actionLabel: \"Open today\"\n },\n {\n id: \"goal-needing-attention\",\n label: \"Goal needing attention\",\n title: driftGoal ? <EntityName kind=\"goal\" label={driftGoal.title} lines={3} labelClassName=\"[overflow-wrap:anywhere]\" /> : \"No goal needs urgent attention\",\n detail:\n driftGoal?.summary ??\n `Only ${snapshot.overview.strategicHeader.overdueTasks} overdue task${snapshot.overview.strategicHeader.overdueTasks === 1 ? \"\" : \"s\"} are currently slowing the engine.`,\n badge: driftGoal?.risk ?? \"stable\",\n href: driftGoal ? `/goals/${driftGoal.goalId}` : \"/today\",\n actionLabel: driftGoal ? \"Open goal\" : \"Open today\"\n },\n {\n id: \"recent-activity\",\n label: \"Recent activity\",\n title: latestEvidence ? getReadableActivityTitle(latestEvidence) : `${unlockedAchievements} achievement${unlockedAchievements === 1 ? \"\" : \"s\"} unlocked`,\n detail:\n (latestEvidence ? getReadableActivityDescription(latestEvidence) : null) ??\n t(\"common.overview.noEvidence\"),\n badge: latestEvidence?.source ?? `${snapshot.metrics.weeklyXp} weekly XP`,\n href: latestEvidence ? activityLink(latestEvidence) : \"/activity\",\n actionLabel: latestEvidence ? \"Open item\" : \"Open activity\"\n }\n ] as const;\n\n function activityLink(event: (typeof snapshot.overview.recentEvidence)[number]) {\n if (event.entityType === \"goal\") {\n return `/goals/${event.entityId}`;\n }\n if (event.entityType === \"project\") {\n return `/projects/${event.entityId}`;\n }\n if (event.entityType === \"task\") {\n return `/tasks/${event.entityId}`;\n }\n if (event.entityType === \"task_run\" && typeof event.metadata.taskId === \"string\") {\n return `/tasks/${event.metadata.taskId}`;\n }\n return `/activity?eventId=${event.id}`;\n }\n\n if (!hasOverviewData) {\n return (\n <div className=\"grid min-w-0 grid-cols-1 gap-5\">\n <PageHero\n title=\"Overview\"\n titleText=\"Overview\"\n description=\"See your main goals, active projects, top tasks, recent activity, and current progress in one place.\"\n badge=\"0 live signals\"\n />\n <EmptyState\n eyebrow={t(\"common.overview.heroEyebrow\")}\n title={t(\"common.overview.emptyTitle\")}\n description={t(\"common.overview.emptyDescription\")}\n action={\n <Link to=\"/goals\" className=\"inline-flex min-h-10 min-w-0 max-w-full items-center justify-center rounded-full bg-[var(--primary)] px-4 py-2 text-sm font-medium whitespace-nowrap text-slate-950 transition hover:opacity-90\">\n {t(\"common.overview.emptyAction\")}\n </Link>\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"grid min-w-0 grid-cols-1 gap-5\">\n <PageHero\n title=\"Overview\"\n titleText=\"Overview\"\n description={`${heroStatus}. See your main goals, active projects, top tasks, and recent activity in one place.`}\n badge={`${snapshot.metrics.streakDays} day streak`}\n />\n\n <XpCommandDeck\n profile={snapshot.metrics}\n achievements={snapshot.dashboard.achievements}\n milestoneRewards={snapshot.dashboard.milestoneRewards}\n momentumPulse={overviewMomentumPulse}\n />\n\n <FlagshipSignalDeck\n eyebrow=\"Actions\"\n title=\"What you can open or act on right now\"\n description=\"Each card below leads to a real task, goal, reward, or recent activity item.\"\n items={overviewSignals}\n />\n\n <section className=\"grid min-w-0 grid-cols-1 gap-5\">\n <Card className=\"bg-[linear-gradient(180deg,rgba(19,24,40,0.96),rgba(11,15,27,0.96))]\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">\n <span>Overview summary</span>\n <InfoTooltip content=\"This summarizes your current level, weekly XP, and the goal that most needs attention.\" />\n </div>\n <h2 className=\"mt-2 font-display text-[clamp(1.35rem,2vw,1.9rem)] text-white\">Level, weekly XP, and what needs attention</h2>\n </div>\n <div className=\"max-w-full min-w-0 rounded-full border border-white/8 bg-white/[0.04] px-4 py-2 text-sm text-white/62\">\n {overviewMomentumPulse.status}\n </div>\n </div>\n <div className=\"mt-4 grid gap-3 lg:grid-cols-3\">\n <MetricTile label={t(\"common.overview.metricsLevel\")} value={snapshot.metrics.level} tone=\"core\" />\n <MetricTile label={t(\"common.overview.metricsWeeklyXp\")} value={snapshot.metrics.weeklyXp} tone=\"core\" detail=\"XP earned so far this week.\" />\n <InteractiveCard to={driftGoal ? `/goals/${driftGoal.goalId}` : \"/today\"} className=\"rounded-[24px] border border-white/8 bg-white/[0.04] p-4\">\n <div className=\"text-sm text-white/45\">Goal needing attention</div>\n <div className=\"mt-2 font-medium text-white\">{driftGoal?.title ?? \"No goal needs urgent attention\"}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">\n {driftGoal?.summary ??\n `Only ${snapshot.overview.strategicHeader.overdueTasks} overdue task${snapshot.overview.strategicHeader.overdueTasks === 1 ? \"\" : \"s\"} are currently slowing the engine.`}\n </div>\n </InteractiveCard>\n </div>\n </Card>\n\n <div className=\"grid min-w-0 grid-cols-1 gap-5\">\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Goals</div>\n {snapshot.overview.activeGoals.length === 0 ? (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">{t(\"common.overview.noGoals\")}</div>\n ) : (\n <div className=\"mt-4 grid gap-3 lg:grid-cols-3\">\n {snapshot.overview.activeGoals.slice(0, 3).map((goal) => (\n <InteractiveCard key={goal.id} to={`/goals/${goal.id}`} className=\"rounded-[22px] p-4\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <EntityBadge kind=\"goal\" label={goal.tags[0]?.name ?? goal.horizon} compact gradient={false} />\n <div className=\"shrink-0 text-[11px] uppercase tracking-[0.16em] text-white/42\">{goal.progress}%</div>\n </div>\n <div className=\"mt-4\">\n <EntityName kind=\"goal\" label={goal.title} variant=\"heading\" size=\"lg\" lines={3} className=\"max-w-full\" labelClassName=\"[overflow-wrap:anywhere]\" />\n </div>\n <p className=\"mt-3 text-sm leading-6 text-white/60\">{goal.description}</p>\n <div className=\"mt-4\">\n <ProgressMeter value={goal.progress} />\n </div>\n </InteractiveCard>\n ))}\n </div>\n )}\n </Card>\n\n <div className=\"grid min-w-0 gap-5 lg:grid-cols-[minmax(0,1.1fr)_minmax(0,0.9fr)]\">\n <Card>\n <div className=\"flex items-center gap-2 font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">\n <span>Projects</span>\n <InfoTooltip content=\"These are the projects currently carrying active work.\" />\n </div>\n {snapshot.overview.projects.length === 0 ? (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">{t(\"common.overview.noProjects\")}</div>\n ) : (\n <div className=\"mt-4 grid gap-3\">\n {snapshot.overview.projects.slice(0, 4).map((project) => (\n <InteractiveCard key={project.id} to={`/projects/${project.id}`} className=\"rounded-[20px] px-4 py-4\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <EntityBadge kind=\"project\" compact gradient={false} />\n <EntityName kind=\"project\" label={project.title} className=\"min-w-0\" showIcon={false} lines={2} labelClassName=\"[overflow-wrap:anywhere]\" />\n </div>\n <Badge wrap className=\"max-w-[8rem] shrink-0\">{project.earnedPoints} xp</Badge>\n </div>\n <div className=\"mt-2 text-sm text-white/58\">{project.description}</div>\n <div className=\"mt-3\">\n <EntityBadge kind=\"goal\" label={project.goalTitle} compact />\n </div>\n </InteractiveCard>\n ))}\n </div>\n )}\n </Card>\n\n <Card>\n <div className=\"flex items-center gap-2 font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">\n <span>Tasks ready to start</span>\n <InfoTooltip content=\"These are the strongest task candidates to pick up next.\" />\n </div>\n {snapshot.overview.topTasks.length === 0 ? (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">{t(\"common.overview.noFocus\")}</div>\n ) : (\n <div className=\"mt-4 grid gap-3\">\n {snapshot.overview.topTasks.slice(0, 4).map((task) => (\n <InteractiveCard key={task.id} to={`/tasks/${task.id}`} className=\"rounded-[20px] px-4 py-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <EntityBadge kind=\"task\" compact gradient={false} />\n <EntityName kind=\"task\" label={task.title} className=\"min-w-0\" showIcon={false} lines={2} labelClassName=\"[overflow-wrap:anywhere]\" />\n </div>\n <Badge wrap>{task.points} xp</Badge>\n </div>\n <div className=\"mt-2 text-sm text-white/58\">{task.description}</div>\n <div className=\"mt-3\">\n {projectLookup.get(task.projectId ?? \"\")?.title ? (\n <EntityBadge kind=\"project\" label={projectLookup.get(task.projectId ?? \"\")?.title ?? \"\"} compact />\n ) : (\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/40\">{t(\"common.overview.noProjectYet\")}</div>\n )}\n </div>\n </InteractiveCard>\n ))}\n </div>\n )}\n </Card>\n </div>\n\n <Card>\n <div className=\"flex items-center gap-2 font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">\n <span>Recent activity</span>\n <InfoTooltip content=\"This shows the latest visible work, completions, and corrections linked to your goals, projects, and tasks.\" />\n </div>\n {snapshot.overview.recentEvidence.length === 0 ? (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">{t(\"common.overview.noEvidence\")}</div>\n ) : (\n <div className=\"mt-4 grid gap-3 lg:grid-cols-2\">\n {snapshot.overview.recentEvidence.slice(0, 6).map((event) => (\n <InteractiveCard key={event.id} to={activityLink(event)} className=\"rounded-[20px] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"font-medium text-white\">{event.title}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{event.description}</div>\n </div>\n <Badge wrap>{event.source}</Badge>\n </div>\n <div className=\"mt-3 text-[11px] uppercase tracking-[0.16em] text-white/35\">{formatDateTime(event.createdAt)}</div>\n </InteractiveCard>\n ))}\n </div>\n )}\n </Card>\n </div>\n </section>\n </div>\n );\n}\n","import { Card } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nfunction Block({ className }: { className?: string }) {\n return <div className={cn(\"surface-pulse rounded-2xl bg-white/[0.05]\", className)} />;\n}\n\nexport function SurfaceSkeleton({\n header = true,\n sideRail = true,\n className,\n eyebrow,\n title,\n description,\n columns = 2,\n blocks = 4\n}: {\n header?: boolean;\n sideRail?: boolean;\n className?: string;\n eyebrow?: string;\n title?: string;\n description?: string;\n columns?: number;\n blocks?: number;\n}) {\n const mainBlocks = Array.from({ length: Math.max(2, blocks) });\n\n return (\n <div className={cn(\"grid gap-5\", className)} aria-hidden=\"true\">\n {header ? (\n <Card className=\"grid gap-4\">\n <Block className={cn(\"h-3\", eyebrow ? \"w-40\" : \"w-32\")} />\n <Block className={cn(\"h-12\", title ? \"max-w-2xl\" : \"max-w-3xl\")} />\n <Block className={cn(\"h-5\", description ? \"max-w-3xl\" : \"max-w-2xl\")} />\n </Card>\n ) : null}\n\n <section className={cn(\"grid gap-5\", sideRail ? \"xl:grid-cols-[minmax(0,1.15fr)_minmax(0,0.85fr)]\" : \"\")}>\n <div className=\"grid gap-5\">\n <Card className=\"grid gap-4\">\n <Block className=\"h-3 w-28\" />\n <Block className=\"h-28 w-full\" />\n </Card>\n <Card className=\"grid gap-4\">\n <Block className=\"h-3 w-40\" />\n <div className={cn(\"grid gap-3\", columns > 1 ? \"md:grid-cols-2\" : \"\")}>\n {mainBlocks.map((_, index) => (\n <Block key={index} className=\"h-28 w-full\" />\n ))}\n </div>\n </Card>\n </div>\n {sideRail ? (\n <div className=\"grid gap-5\">\n <Card className=\"grid gap-4\">\n <Block className=\"h-3 w-24\" />\n <Block className=\"h-20 w-full\" />\n </Card>\n <Card className=\"grid gap-4\">\n <Block className=\"h-3 w-36\" />\n <Block className=\"h-16 w-full\" />\n <Block className=\"h-16 w-full\" />\n </Card>\n </div>\n ) : null}\n </section>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link, useNavigate, useParams } from \"react-router-dom\";\nimport { SurfaceSkeleton } from \"@/components/experience/surface-skeleton\";\nimport { ProjectDialog } from \"@/components/project-dialog\";\nimport { TaskDialog } from \"@/components/task-dialog\";\nimport { ExecutionBoard } from \"@/components/execution-board\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { ErrorState } from \"@/components/ui/page-state\";\nimport { getProjectBoard, patchTask, uncompleteTask } from \"@/lib/api\";\nimport { getReadableActivityDescription, getReadableActivityTitle } from \"@/lib/activity-copy\";\nimport { getActivityEventHref } from \"@/lib/entity-links\";\nimport { useI18n } from \"@/lib/i18n\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\n\nfunction isLegacyProjectId(projectId: string | undefined): boolean {\n return Boolean(projectId && projectId.startsWith(\"campaign:\"));\n}\n\nexport function ProjectDetailPage() {\n const { t } = useI18n();\n const shell = useForgeShell();\n const params = useParams();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const [projectDialogOpen, setProjectDialogOpen] = useState(false);\n const [taskDialogOpen, setTaskDialogOpen] = useState(false);\n const legacyProject = shell.snapshot.dashboard.projects.find((project) => project.id === params.projectId) ?? null;\n const goal = legacyProject ? shell.snapshot.goals.find((entry) => entry.id === legacyProject.goalId) ?? null : null;\n const fallbackTasks = legacyProject\n ? shell.snapshot.tasks.filter((task) => task.projectId === legacyProject.id || (!task.projectId && task.goalId === legacyProject.goalId))\n : [];\n const fallbackTaskIds = new Set(fallbackTasks.map((task) => task.id));\n const fallbackActivity = legacyProject\n ? shell.snapshot.activity.filter(\n (event) =>\n event.entityId === legacyProject.goalId ||\n event.entityId === legacyProject.id ||\n fallbackTaskIds.has(event.entityId) ||\n (event.entityType === \"task_run\" && typeof event.metadata.taskId === \"string\" && fallbackTaskIds.has(event.metadata.taskId))\n )\n : [];\n const isLegacyProject = isLegacyProjectId(params.projectId);\n\n const projectBoardQuery = useQuery({\n queryKey: [\"project-board\", params.projectId],\n queryFn: () => getProjectBoard(params.projectId!),\n enabled: Boolean(params.projectId) && !isLegacyProject\n });\n\n const reopenMutation = useMutation({\n mutationFn: (taskId: string) => uncompleteTask(taskId),\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] }),\n queryClient.invalidateQueries({ queryKey: [\"project-board\", params.projectId] })\n ]);\n }\n });\n\n const payload =\n projectBoardQuery.data ??\n (legacyProject && goal\n ? {\n project: legacyProject,\n goal,\n tasks: fallbackTasks,\n activity: fallbackActivity\n }\n : undefined);\n const editingProject = shell.snapshot.dashboard.projects.find((project) => project.id === params.projectId) ?? null;\n\n if (projectBoardQuery.isError && !isLegacyProject) {\n return <ErrorState eyebrow={t(\"common.projectDetail.errorEyebrow\")} error={projectBoardQuery.error} onRetry={() => void projectBoardQuery.refetch()} />;\n }\n\n if (!payload) {\n return <SurfaceSkeleton />;\n }\n\n const nextTask = payload.tasks.find((task) => task.status === \"focus\" || task.status === \"in_progress\") ?? payload.tasks[0] ?? null;\n const driftTask = payload.tasks.find((task) => task.status === \"blocked\") ?? payload.tasks.find((task) => task.status === \"backlog\") ?? null;\n const latestEvidence = payload.activity[0] ?? null;\n\n return (\n <div className=\"grid min-w-0 gap-5\">\n <PageHero\n entityKind=\"project\"\n title={<EntityName kind=\"project\" label={payload.project.title} variant=\"heading\" size=\"lg\" />}\n titleText={payload.project.title}\n description={payload.project.description}\n badge={<EntityBadge kind=\"goal\" label={payload.goal.title} compact gradient={false} />}\n />\n\n {isLegacyProject ? (\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.projectDetail.compatibility\")}</div>\n <p className=\"mt-3 text-sm leading-7 text-white/60\">\n {t(\"common.projectDetail.compatibilityDescription\")}\n </p>\n </Card>\n ) : null}\n\n <div className=\"flex flex-wrap gap-3\">\n <Button onClick={() => setTaskDialogOpen(true)}>{t(\"common.projectDetail.addTask\")}</Button>\n {!isLegacyProject ? (\n <Button variant=\"secondary\" onClick={() => setProjectDialogOpen(true)}>\n {t(\"common.projectDetail.editProject\")}\n </Button>\n ) : null}\n <Link to={`/goals/${payload.goal.id}`}>\n <Button variant=\"ghost\">{t(\"common.projectDetail.openGoal\")}</Button>\n </Link>\n </div>\n\n <section className=\"grid min-w-0 gap-5 xl:grid-cols-[minmax(0,1fr)_22rem]\">\n <Card>\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.projectDetail.commandEyebrow\")}</div>\n <h2 className=\"mt-2 font-display text-[clamp(1.35rem,2vw,1.9rem)] text-white\">{t(\"common.projectDetail.commandTitle\")}</h2>\n <p className=\"mt-2 max-w-2xl text-sm leading-6 text-white/60\">{t(\"common.projectDetail.commandDescription\")}</p>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <EntityBadge kind=\"project\" compact gradient={false} />\n <EntityBadge kind=\"goal\" label={payload.goal.title} compact gradient={false} />\n </div>\n </div>\n <div className=\"mt-4 grid gap-3 lg:grid-cols-2\">\n <Link to={nextTask ? `/tasks/${nextTask.id}` : `/projects/${payload.project.id}`} className=\"rounded-[20px] bg-white/[0.04] p-4 transition hover:bg-white/[0.08]\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{t(\"common.projectDetail.signalNext\")}</div>\n {nextTask ? <EntityBadge kind=\"task\" compact gradient={false} /> : null}\n </div>\n <div className=\"mt-2 font-medium text-white\">{nextTask?.title ?? t(\"common.projectDetail.noNextTask\")}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{nextTask?.description || t(\"common.projectDetail.noNextTaskDetail\")}</div>\n </Link>\n <Link to={driftTask ? `/tasks/${driftTask.id}` : `/projects/${payload.project.id}`} className=\"rounded-[20px] bg-white/[0.04] p-4 transition hover:bg-white/[0.08]\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{t(\"common.projectDetail.signalRisk\")}</div>\n {driftTask ? <EntityBadge kind=\"task\" compact gradient={false} /> : null}\n </div>\n <div className=\"mt-2 font-medium text-white\">{driftTask?.title ?? t(\"common.projectDetail.noRisk\")}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{driftTask?.description || t(\"common.projectDetail.noRiskDetail\")}</div>\n </Link>\n </div>\n </Card>\n\n <Card className=\"h-fit min-w-0\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.projectDetail.sectionHealth\")}</div>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Badge className=\"bg-white/[0.08] text-white/72\">{t(`common.enums.projectStatus.${payload.project.status}`)}</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{payload.project.momentumLabel}</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{Math.floor(payload.project.time.totalCreditedSeconds / 60)} min tracked</Badge>\n </div>\n <div className=\"mt-4 grid gap-3 sm:grid-cols-2\">\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/42\">{t(\"common.projectDetail.fieldProgress\")}</div>\n <div className=\"mt-2 font-display text-xl text-white\">{payload.project.progress}%</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/42\">{t(\"common.projectDetail.fieldMomentum\")}</div>\n <div className=\"mt-2 font-display text-xl text-white\">{payload.project.momentumLabel}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/42\">{t(\"common.projectDetail.fieldStatus\")}</div>\n <div className=\"mt-2 font-display text-xl text-white\">{t(`common.enums.projectStatus.${payload.project.status}`)}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/42\">Live tasks</div>\n <div className=\"mt-2 font-display text-xl text-white\">{payload.tasks.filter((task) => task.status === \"focus\" || task.status === \"in_progress\").length}</div>\n </div>\n </div>\n </Card>\n </section>\n\n <ExecutionBoard\n tasks={payload.tasks}\n goals={shell.snapshot.goals}\n tags={shell.snapshot.tags}\n selectedTaskId={null}\n onMove={async (taskId, nextStatus) => {\n await shell.patchTaskStatus(taskId, nextStatus);\n await queryClient.invalidateQueries({ queryKey: [\"project-board\", params.projectId] });\n }}\n onSelectTask={(taskId) => navigate(`/tasks/${taskId}`)}\n onQuickReopenTask={async (taskId) => {\n await reopenMutation.mutateAsync(taskId);\n }}\n />\n\n <Card className=\"min-w-0\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.projectDetail.sectionEvidence\")}</div>\n <div className=\"mt-4 grid gap-3 lg:grid-cols-2\">\n {payload.activity.slice(0, 6).map((event) => (\n <Link\n key={event.id}\n to={getActivityEventHref(event) ?? `/activity?eventId=${event.id}`}\n className=\"rounded-[18px] bg-white/[0.04] p-4 transition hover:bg-white/[0.08]\"\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-medium text-white\">{getReadableActivityTitle(event)}</div>\n <Badge>{event.source}</Badge>\n </div>\n <div className=\"mt-2 text-sm text-white/58\">{getReadableActivityDescription(event)}</div>\n </Link>\n ))}\n </div>\n </Card>\n\n <ProjectDialog\n open={projectDialogOpen}\n goals={shell.snapshot.goals}\n editingProject={editingProject}\n onOpenChange={setProjectDialogOpen}\n onSubmit={async (input, projectId) => {\n if (projectId) {\n await shell.patchProject(projectId, input);\n await queryClient.invalidateQueries({ queryKey: [\"project-board\", params.projectId] });\n }\n }}\n />\n\n <TaskDialog\n open={taskDialogOpen}\n goals={shell.snapshot.goals}\n projects={shell.snapshot.dashboard.projects}\n tags={shell.snapshot.tags}\n editingTask={null}\n initialProjectId={isLegacyProject ? null : payload.project.id}\n onOpenChange={setTaskDialogOpen}\n onSubmit={async (input, taskId) => {\n if (taskId) {\n await patchTask(taskId, input);\n } else {\n await shell.createTask(input);\n }\n await queryClient.invalidateQueries({ queryKey: [\"project-board\", params.projectId] });\n }}\n />\n </div>\n );\n}\n","import { Link } from \"react-router-dom\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { EmptyState } from \"@/components/ui/page-state\";\nimport { ProgressMeter } from \"@/components/ui/progress-meter\";\nimport { InteractiveCard } from \"@/components/ui/interactive-card\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\n\nexport function ProjectsPage() {\n const { snapshot } = useForgeShell();\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n entityKind=\"project\"\n title={<EntityName kind=\"project\" label=\"Projects\" variant=\"heading\" size=\"lg\" />}\n titleText=\"Projects\"\n description=\"Projects are the concrete paths that move a life goal forward. Each project owns its own tasks, its own board, and its own evidence of progress.\"\n badge={`${snapshot.dashboard.projects.length} projects`}\n />\n\n {snapshot.dashboard.projects.length === 0 ? (\n <EmptyState\n eyebrow=\"Projects\"\n title=\"No projects in flight\"\n description=\"Create the first practical path under a life goal so execution, kanban, and evidence all have a concrete home.\"\n action={\n <Link to=\"/goals\" className=\"inline-flex min-h-10 min-w-max shrink-0 items-center justify-center rounded-full bg-white/[0.08] px-4 py-3 text-sm whitespace-nowrap text-white transition hover:bg-white/[0.12]\">\n Open goals\n </Link>\n }\n />\n ) : (\n <div className=\"grid gap-4 lg:grid-cols-2 2xl:grid-cols-3\">\n {snapshot.dashboard.projects.map((project) => (\n <InteractiveCard key={project.id} to={`/projects/${project.id}`} className=\"transition\">\n <div className=\"flex items-center justify-between gap-3\">\n <EntityBadge kind=\"goal\" label={project.goalTitle} compact />\n <Badge className={project.status === \"completed\" ? \"text-emerald-300\" : project.status === \"paused\" ? \"text-amber-300\" : \"text-[var(--primary)]\"}>\n {project.status}\n </Badge>\n </div>\n <div className=\"mt-4\">\n <EntityName kind=\"project\" label={project.title} variant=\"heading\" size=\"xl\" />\n </div>\n <p className=\"mt-3 text-sm leading-6 text-white/58\">{project.description}</p>\n <div className=\"mt-4\">\n <ProgressMeter value={project.progress} tone={project.status === \"completed\" ? \"secondary\" : \"primary\"} />\n </div>\n <div className=\"mt-4 grid grid-cols-3 gap-3\">\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.16em] text-white/40\">Active</div>\n <div className=\"mt-2 text-white\">{project.activeTaskCount}</div>\n </div>\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.16em] text-white/40\">Completed</div>\n <div className=\"mt-2 text-white\">{project.completedTaskCount}</div>\n </div>\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.16em] text-white/40\">XP</div>\n <div className=\"mt-2 text-white\">{project.earnedPoints}</div>\n </div>\n </div>\n <div className=\"mt-5 text-[11px] uppercase tracking-[0.16em] text-white/40\">\n {project.nextTaskTitle ? `Next move: ${project.nextTaskTitle}` : \"Ready for the next task\"}\n </div>\n </InteractiveCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import type { Goal, ProjectSummary } from \"@/lib/types\";\nimport type { Behavior, BeliefEntry, PsycheValue, TriggerReport } from \"@/lib/psyche-types\";\nimport type { PsycheGraphEdge, PsycheGraphField, PsycheGraphNode, PsycheGraphTone } from \"@/components/psyche/psyche-graph\";\nimport type { EntityKind } from \"@/lib/entity-visuals\";\n\nexport interface GoalGravityCluster {\n goal: Goal;\n linkedValues: PsycheValue[];\n linkedProjects: ProjectSummary[];\n linkedReports: TriggerReport[];\n linkedBehaviors: Behavior[];\n linkedBeliefs: BeliefEntry[];\n}\n\nexport interface GoalGravityInspector {\n id: string;\n eyebrow: string;\n title: string;\n summary: string;\n href: string;\n ctaLabel: string;\n tone: PsycheGraphTone;\n entityKind?: EntityKind;\n chips: string[];\n stats: string[];\n}\n\nexport interface GoalGravityScene {\n nodes: PsycheGraphNode[];\n edges: PsycheGraphEdge[];\n fields: PsycheGraphField[];\n inspectors: Record<string, GoalGravityInspector>;\n defaultSelectedId: string;\n}\n\ntype MutablePackedNode = PsycheGraphNode & {\n homeX: number;\n homeY: number;\n locked: boolean;\n};\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction estimateLineCount(label: string, maxCharsPerLine: number, maxLines: number) {\n return Math.min(maxLines, Math.max(1, Math.ceil(label.trim().length / maxCharsPerLine)));\n}\n\nfunction estimateGoalRadius(label: string, { compact }: { compact: boolean }) {\n const lineCount = estimateLineCount(label, compact ? 13 : 14, 4);\n const baseRadius = compact ? 114 : 156;\n const radius = baseRadius + (lineCount - 1) * (compact ? 12 : 18) + Math.min(24, Math.max(0, label.trim().length - 18)) * (compact ? 0.7 : 1);\n return clamp(radius, compact ? 118 : 164, compact ? 154 : 210);\n}\n\nfunction estimateValueRadius(label: string, { compact }: { compact: boolean }) {\n const lineCount = estimateLineCount(label, compact ? 11 : 13, 3);\n const baseRadius = compact ? 40 : 48;\n const radius =\n baseRadius +\n (lineCount - 1) * (compact ? 6 : 8) +\n Math.min(compact ? 18 : 26, Math.max(0, label.trim().length - (compact ? 12 : 16))) * (compact ? 0.45 : 0.55);\n return clamp(radius, compact ? 42 : 50, compact ? 56 : 68);\n}\n\nfunction estimateRectNodeSize(\n label: string,\n { compact, emphasis = false }: { compact: boolean; emphasis?: boolean }\n) {\n const maxCharsPerLine = compact ? 16 : emphasis ? 22 : 20;\n const lineCount = estimateLineCount(label, maxCharsPerLine, emphasis ? 3 : 2);\n const width = clamp(\n (compact ? (emphasis ? 184 : 152) : emphasis ? 224 : 176) + Math.min(label.length, 48) * (compact ? 1.8 : 2.15),\n compact ? (emphasis ? 188 : 156) : emphasis ? 228 : 184,\n compact ? (emphasis ? 248 : 208) : emphasis ? 300 : 244\n );\n const height = lineCount === 1 ? (compact ? 64 : 70) : lineCount === 2 ? (compact ? 82 : 92) : compact ? 98 : 110;\n\n return { width, height };\n}\n\nfunction nodeHalfSize(node: PsycheGraphNode) {\n if (node.kind === \"goal\" || node.kind === \"value\" || node.kind === \"ghost\") {\n const radius = node.radius ?? (node.kind === \"goal\" ? 76 : 34);\n return { halfWidth: radius, halfHeight: radius };\n }\n\n return {\n halfWidth: (node.width ?? 146) / 2,\n halfHeight: (node.height ?? 58) / 2\n };\n}\n\nfunction packSceneNodes(nodes: PsycheGraphNode[], { compact }: { compact: boolean }): PsycheGraphNode[] {\n const packed: MutablePackedNode[] = nodes.map((node) => ({\n ...node,\n homeX: node.x,\n homeY: node.y,\n locked: node.kind === \"goal\" || node.kind === \"ghost\"\n }));\n const gap = compact ? 28 : 40;\n const spring = compact ? 0.08 : 0.06;\n\n for (let iteration = 0; iteration < 180; iteration += 1) {\n for (const node of packed) {\n if (node.locked) {\n continue;\n }\n node.x += (node.homeX - node.x) * spring;\n node.y += (node.homeY - node.y) * spring;\n }\n\n for (let leftIndex = 0; leftIndex < packed.length; leftIndex += 1) {\n for (let rightIndex = leftIndex + 1; rightIndex < packed.length; rightIndex += 1) {\n const left = packed[leftIndex]!;\n const right = packed[rightIndex]!;\n const leftSize = nodeHalfSize(left);\n const rightSize = nodeHalfSize(right);\n const deltaX = right.x - left.x;\n const deltaY = right.y - left.y;\n const overlapX = leftSize.halfWidth + rightSize.halfWidth + gap - Math.abs(deltaX);\n const overlapY = leftSize.halfHeight + rightSize.halfHeight + gap - Math.abs(deltaY);\n\n if (overlapX <= 0 || overlapY <= 0) {\n continue;\n }\n\n const axis = overlapX < overlapY ? \"x\" : \"y\";\n const direction = axis === \"x\" ? Math.sign(deltaX || rightIndex - leftIndex || 1) : Math.sign(deltaY || rightIndex - leftIndex || 1);\n const push = (axis === \"x\" ? overlapX : overlapY) / (left.locked || right.locked ? 1 : 2);\n\n if (!left.locked) {\n if (axis === \"x\") {\n left.x -= direction * push;\n } else {\n left.y -= direction * push;\n }\n }\n\n if (!right.locked) {\n if (axis === \"x\") {\n right.x += direction * push;\n } else {\n right.y += direction * push;\n }\n }\n }\n }\n }\n\n return packed.map(({ homeX: _homeX, homeY: _homeY, locked: _locked, ...node }) => node);\n}\n\nfunction buildGhostScene(): GoalGravityScene {\n return {\n nodes: [\n { id: \"ghost_goal_north\", kind: \"ghost\", x: -250, y: -20, radius: 68, label: \"First goal\", meta: \"Goal\", href: \"/goals\" },\n { id: \"ghost_goal_center\", kind: \"ghost\", x: 0, y: 34, radius: 74, label: \"Life goals\", meta: \"Goal\", href: \"/goals\" },\n { id: \"ghost_goal_south\", kind: \"ghost\", x: 250, y: -10, radius: 68, label: \"Direction\", meta: \"Goal\", href: \"/goals\" }\n ],\n edges: [],\n fields: [],\n inspectors: {\n ghost_goal_center: {\n id: \"ghost_goal_center\",\n eyebrow: \"Goals\",\n title: \"Add the first life goal\",\n summary: \"The graph is already laid out. Once a goal exists, values, reports, beliefs, and behaviors will start orbiting it instead of staying fragmented.\",\n href: \"/goals\",\n ctaLabel: \"Open life goals\",\n tone: \"sky\",\n entityKind: \"goal\",\n chips: [\"Goals\", \"Values\", \"Reports\"],\n stats: [\"0 goals mapped yet\"]\n }\n },\n defaultSelectedId: \"ghost_goal_center\"\n };\n}\n\nexport function buildGoalGravityScene(clusters: GoalGravityCluster[], { compact = false }: { compact?: boolean } = {}): GoalGravityScene {\n if (clusters.length === 0) {\n return buildGhostScene();\n }\n\n const nodes: PsycheGraphNode[] = [];\n const edges: PsycheGraphEdge[] = [];\n const fields: PsycheGraphField[] = [];\n const inspectors: Record<string, GoalGravityInspector> = {};\n\n const spacing = compact ? 560 : 840;\n const startX = -((clusters.length - 1) * spacing) / 2;\n\n clusters.forEach((cluster, clusterIndex) => {\n const goalX = startX + clusterIndex * spacing;\n const goalY = clusterIndex % 2 === 0 ? 92 : 146;\n const frictionCount = cluster.linkedBehaviors.length + cluster.linkedBeliefs.length + cluster.linkedReports.length;\n const goalNodeId = `goal:${cluster.goal.id}`;\n\n nodes.push({\n id: goalNodeId,\n kind: \"goal\",\n x: goalX,\n y: goalY,\n radius: estimateGoalRadius(cluster.goal.title, { compact }),\n tone: \"amber\",\n label: cluster.goal.title,\n href: `/goals/${cluster.goal.id}`\n });\n\n inspectors[goalNodeId] = {\n id: goalNodeId,\n eyebrow: \"Goal\",\n title: cluster.goal.title,\n summary: cluster.goal.description,\n href: `/goals/${cluster.goal.id}`,\n ctaLabel: \"Open goal\",\n tone: \"amber\",\n entityKind: \"goal\",\n chips: cluster.linkedValues.slice(0, 4).map((value) => value.title),\n stats: [\n `${cluster.linkedValues.length} linked value${cluster.linkedValues.length === 1 ? \"\" : \"s\"}`,\n `${cluster.linkedProjects.length} live project${cluster.linkedProjects.length === 1 ? \"\" : \"s\"}`,\n `${frictionCount} friction signal${frictionCount === 1 ? \"\" : \"s\"}`\n ]\n };\n\n if (frictionCount > 0) {\n fields.push({\n id: `field:${cluster.goal.id}`,\n x: goalX + 18,\n y: goalY + 20,\n radiusX: compact ? 144 : 176,\n radiusY: compact ? 104 : 132,\n tone: \"rose\",\n opacity: Math.min(0.42, 0.14 + frictionCount * 0.04)\n });\n }\n\n const valueOrbitRadius = compact ? 208 : 282;\n cluster.linkedValues.slice(0, compact ? 4 : 5).forEach((value, valueIndex) => {\n const angle = (-95 + valueIndex * (compact ? 78 : 64)) * (Math.PI / 180);\n const nodeRadius = estimateValueRadius(value.title, { compact });\n const valueX = goalX + Math.cos(angle) * valueOrbitRadius;\n const valueY = goalY + Math.sin(angle) * valueOrbitRadius;\n const nodeId = `value:${value.id}`;\n\n nodes.push({\n id: nodeId,\n kind: \"value\",\n x: valueX,\n y: valueY,\n radius: nodeRadius,\n tone: \"mint\",\n label: value.title,\n meta: `${value.linkedGoalIds.length} goal${value.linkedGoalIds.length === 1 ? \"\" : \"s\"}`,\n href: `/psyche/values?focus=${value.id}#values-atlas`\n });\n\n edges.push({\n id: `${goalNodeId}->${nodeId}`,\n from: goalNodeId,\n to: nodeId,\n tone: \"mint\",\n strength: \"medium\"\n });\n\n inspectors[nodeId] = {\n id: nodeId,\n eyebrow: \"Value\",\n title: value.title,\n summary: value.valuedDirection || value.whyItMatters || value.description,\n href: `/psyche/values?focus=${value.id}#values-atlas`,\n ctaLabel: \"Open values\",\n tone: \"mint\",\n entityKind: \"value\",\n chips: value.committedActions.slice(0, 3),\n stats: [\n `${value.linkedProjectIds.length} linked project${value.linkedProjectIds.length === 1 ? \"\" : \"s\"}`,\n `${value.linkedTaskIds.length} linked task${value.linkedTaskIds.length === 1 ? \"\" : \"s\"}`\n ]\n };\n });\n\n const visibleProjects = cluster.linkedProjects.slice(0, compact ? 2 : 3).map((project) => ({\n project,\n size: estimateRectNodeSize(project.title, { compact, emphasis: true })\n }));\n const projectGap = compact ? 24 : 30;\n const projectSpan =\n visibleProjects.reduce((sum, entry) => sum + entry.size.width, 0) + Math.max(0, visibleProjects.length - 1) * projectGap;\n let projectOffset = -projectSpan / 2;\n\n visibleProjects.forEach(({ project, size }, projectIndex) => {\n const nodeId = `project:${project.id}`;\n const projectX = goalX + projectOffset + size.width / 2;\n const projectY = goalY - (compact ? 330 : 434) - projectIndex * (compact ? 16 : 20);\n projectOffset += size.width + projectGap;\n nodes.push({\n id: nodeId,\n kind: \"project\",\n x: projectX,\n y: projectY,\n width: size.width,\n height: size.height,\n tone: \"sky\",\n label: project.title,\n meta: \"Project\",\n href: `/projects/${project.id}`\n });\n edges.push({\n id: `${goalNodeId}->${nodeId}`,\n from: goalNodeId,\n to: nodeId,\n tone: \"sky\",\n strength: \"medium\"\n });\n inspectors[nodeId] = {\n id: nodeId,\n eyebrow: \"Project\",\n title: project.title,\n summary: project.description,\n href: `/projects/${project.id}`,\n ctaLabel: \"Open project\",\n tone: \"sky\",\n entityKind: \"project\",\n chips: [project.status, project.goalTitle],\n stats: [`${project.progress}% progress`, `${project.activeTaskCount} active task${project.activeTaskCount === 1 ? \"\" : \"s\"}`]\n };\n });\n\n let behaviorY = goalY + (compact ? 132 : 156);\n cluster.linkedBehaviors.slice(0, compact ? 2 : 3).forEach((behavior) => {\n const nodeId = `behavior:${behavior.id}`;\n const behaviorSize = estimateRectNodeSize(behavior.title, { compact });\n const behaviorX = goalX - (compact ? 272 : 352);\n nodes.push({\n id: nodeId,\n kind: \"behavior\",\n x: behaviorX,\n y: behaviorY,\n width: behaviorSize.width,\n height: behaviorSize.height,\n tone: \"orange\",\n label: behavior.title,\n meta: behavior.kind,\n href: `/psyche/behaviors?focus=${behavior.id}#behavior-columns`\n });\n edges.push({\n id: `${goalNodeId}->${nodeId}`,\n from: goalNodeId,\n to: nodeId,\n tone: \"orange\",\n dashed: behavior.kind !== \"committed\",\n strength: behavior.kind === \"committed\" ? \"medium\" : \"low\"\n });\n inspectors[nodeId] = {\n id: nodeId,\n eyebrow: \"Behavior\",\n title: behavior.title,\n summary: behavior.replacementMove || behavior.description || behavior.urgeStory,\n href: `/psyche/behaviors?focus=${behavior.id}#behavior-columns`,\n ctaLabel: \"Open behaviors\",\n tone: \"orange\",\n entityKind: \"behavior\",\n chips: [behavior.kind, ...behavior.commonCues.slice(0, 2)],\n stats: [\n behavior.shortTermPayoff ? \"Short-term payoff mapped\" : \"Payoff still to map\",\n behavior.longTermCost ? \"Long-term cost mapped\" : \"Cost still to map\"\n ]\n };\n behaviorY += behaviorSize.height + (compact ? 18 : 22);\n });\n\n let beliefY = goalY + (compact ? 8 : 10);\n cluster.linkedBeliefs.slice(0, compact ? 2 : 3).forEach((belief) => {\n const nodeId = `belief:${belief.id}`;\n const beliefSize = estimateRectNodeSize(belief.statement, { compact, emphasis: true });\n const beliefX = goalX + (compact ? 278 : 362);\n nodes.push({\n id: nodeId,\n kind: \"belief\",\n x: beliefX,\n y: beliefY,\n width: beliefSize.width,\n height: beliefSize.height,\n tone: \"violet\",\n label: belief.statement,\n meta: \"belief\",\n href: `/psyche/schemas-beliefs?focus=${belief.id}`\n });\n edges.push({\n id: `${goalNodeId}->${nodeId}`,\n from: goalNodeId,\n to: nodeId,\n tone: \"violet\",\n dashed: true,\n strength: \"low\"\n });\n inspectors[nodeId] = {\n id: nodeId,\n eyebrow: \"Belief\",\n title: belief.statement,\n summary: belief.flexibleAlternative || belief.originNote || \"Belief script attached to this part of the map.\",\n href: `/psyche/schemas-beliefs?focus=${belief.id}`,\n ctaLabel: \"Open beliefs\",\n tone: \"violet\",\n entityKind: \"belief\",\n chips: [belief.beliefType, `${belief.confidence}% grip`],\n stats: [`${belief.linkedBehaviorIds.length} linked behavior${belief.linkedBehaviorIds.length === 1 ? \"\" : \"s\"}`, `${belief.linkedReportIds.length} linked report${belief.linkedReportIds.length === 1 ? \"\" : \"s\"}`]\n };\n beliefY += beliefSize.height + (compact ? 18 : 22);\n });\n\n const visibleReports = cluster.linkedReports.slice(0, compact ? 2 : 3).map((report) => ({\n report,\n size: estimateRectNodeSize(report.title, { compact })\n }));\n const reportGap = compact ? 20 : 26;\n const reportSpan =\n visibleReports.reduce((sum, entry) => sum + entry.size.width, 0) + Math.max(0, visibleReports.length - 1) * reportGap;\n let reportOffset = -reportSpan / 2;\n\n visibleReports.forEach(({ report, size }) => {\n const nodeId = `report:${report.id}`;\n const reportX = goalX + reportOffset + size.width / 2;\n const reportY = goalY + (compact ? 332 : 430);\n reportOffset += size.width + reportGap;\n nodes.push({\n id: nodeId,\n kind: \"report\",\n x: reportX,\n y: reportY,\n width: size.width,\n height: size.height,\n tone: \"blue\",\n label: report.title,\n meta: report.status,\n href: `/psyche/reports/${report.id}`\n });\n edges.push({\n id: `${goalNodeId}->${nodeId}`,\n from: goalNodeId,\n to: nodeId,\n tone: \"sky\",\n strength: \"medium\"\n });\n inspectors[nodeId] = {\n id: nodeId,\n eyebrow: \"Report\",\n title: report.title,\n summary: report.eventSituation || report.customEventType || \"Reflective chain linked into this goal.\",\n href: `/psyche/reports/${report.id}`,\n ctaLabel: \"Open report\",\n tone: \"blue\",\n entityKind: \"report\",\n chips: [report.status, ...report.nextMoves.slice(0, 2)],\n stats: [\n `${report.emotions.length} emotion${report.emotions.length === 1 ? \"\" : \"s\"}`,\n `${report.behaviors.length} move${report.behaviors.length === 1 ? \"\" : \"s\"}`\n ]\n };\n });\n });\n\n const defaultSelectedId = nodes[0]?.id ?? \"ghost_goal_center\";\n return {\n nodes: packSceneNodes(nodes, { compact }),\n edges,\n fields,\n inspectors,\n defaultSelectedId\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { Maximize, Minus, Move, Plus, RotateCcw } from \"lucide-react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Button } from \"@/components/ui/button\";\nimport { getEntityVisual, type EntityKind } from \"@/lib/entity-visuals\";\nimport { cn } from \"@/lib/utils\";\n\nexport type PsycheGraphTone = \"mint\" | \"sky\" | \"violet\" | \"rose\" | \"amber\" | \"orange\" | \"blue\" | \"slate\";\n\nexport type PsycheGraphNodeKind = \"goal\" | \"value\" | \"behavior\" | \"belief\" | \"report\" | \"project\" | \"ghost\";\n\nexport interface PsycheGraphNode {\n id: string;\n kind: PsycheGraphNodeKind;\n x: number;\n y: number;\n radius?: number;\n width?: number;\n height?: number;\n tone?: PsycheGraphTone;\n label: string;\n meta?: string;\n href?: string;\n}\n\nexport interface PsycheGraphEdge {\n id: string;\n from: string;\n to: string;\n tone?: PsycheGraphTone;\n dashed?: boolean;\n strength?: \"low\" | \"medium\" | \"high\";\n}\n\nexport interface PsycheGraphField {\n id: string;\n x: number;\n y: number;\n radiusX: number;\n radiusY: number;\n tone?: PsycheGraphTone;\n opacity?: number;\n}\n\nexport interface PsycheGraphViewportState {\n scale: number;\n x: number;\n y: number;\n}\n\nconst toneStrokeMap: Record<PsycheGraphTone, string> = {\n mint: \"rgba(110,231,183,0.64)\",\n sky: \"rgba(125,211,252,0.66)\",\n violet: \"rgba(196,181,253,0.72)\",\n rose: \"rgba(251,113,133,0.68)\",\n amber: \"rgba(251,191,36,0.68)\",\n orange: \"rgba(251,146,60,0.72)\",\n blue: \"rgba(96,165,250,0.72)\",\n slate: \"rgba(148,163,184,0.52)\"\n};\n\nconst toneFillMap: Record<PsycheGraphTone, string> = {\n mint: \"rgba(16,185,129,0.18)\",\n sky: \"rgba(56,189,248,0.18)\",\n violet: \"rgba(167,139,250,0.18)\",\n rose: \"rgba(251,113,133,0.18)\",\n amber: \"rgba(251,191,36,0.18)\",\n orange: \"rgba(251,146,60,0.18)\",\n blue: \"rgba(96,165,250,0.18)\",\n slate: \"rgba(148,163,184,0.12)\"\n};\n\nconst toneTextMap: Record<PsycheGraphTone, string> = {\n mint: \"rgba(209,250,229,0.98)\",\n sky: \"rgba(224,242,254,0.98)\",\n violet: \"rgba(237,233,254,0.98)\",\n rose: \"rgba(255,228,230,0.98)\",\n amber: \"rgba(254,243,199,0.98)\",\n orange: \"rgba(255,237,213,0.98)\",\n blue: \"rgba(219,234,254,0.98)\",\n slate: \"rgba(241,245,249,0.9)\"\n};\n\nfunction getEntityKindForNode(nodeKind: PsycheGraphNodeKind): EntityKind | null {\n switch (nodeKind) {\n case \"goal\":\n case \"value\":\n case \"behavior\":\n case \"belief\":\n case \"report\":\n case \"project\":\n return nodeKind;\n default:\n return null;\n }\n}\n\nfunction getToneForNode(node: PsycheGraphNode): PsycheGraphTone {\n if (node.tone) {\n return node.tone;\n }\n\n switch (node.kind) {\n case \"goal\":\n return \"amber\";\n case \"value\":\n return \"mint\";\n case \"belief\":\n return \"violet\";\n case \"behavior\":\n return \"orange\";\n case \"project\":\n return \"sky\";\n case \"report\":\n return \"blue\";\n default:\n return \"slate\";\n }\n}\n\nfunction getNodeMetaLabel(node: PsycheGraphNode) {\n if (node.kind === \"ghost\") {\n return node.meta ?? null;\n }\n\n const entityKind = getEntityKindForNode(node.kind);\n if (!entityKind) {\n return node.meta ?? null;\n }\n\n return getEntityVisual(entityKind).label;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction splitLabel(label: string, maxLength: number, maxLines = 3) {\n const words = label.trim().split(/\\s+/);\n const lines: string[] = [];\n let current = \"\";\n\n for (let index = 0; index < words.length; index += 1) {\n const word = words[index]!;\n const next = current ? `${current} ${word}` : word;\n if (next.length > maxLength && current) {\n lines.push(current);\n if (lines.length >= maxLines - 1) {\n current = [word, ...words.slice(index + 1)].join(\" \");\n break;\n }\n current = word;\n } else {\n current = next;\n }\n }\n\n if (current) {\n lines.push(current);\n }\n\n const trimmed = lines.slice(0, maxLines);\n const lastIndex = trimmed.length - 1;\n if (lastIndex >= 0 && trimmed[lastIndex]!.length > maxLength) {\n trimmed[lastIndex] = `${trimmed[lastIndex]!.slice(0, Math.max(1, maxLength - 1)).trimEnd()}…`;\n }\n\n return trimmed;\n}\n\nfunction computeBounds(nodes: PsycheGraphNode[], fields: PsycheGraphField[]) {\n if (nodes.length === 0 && fields.length === 0) {\n return { minX: -360, maxX: 360, minY: -240, maxY: 240 };\n }\n\n let minX = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n for (const node of nodes) {\n const halfWidth = node.kind === \"goal\" || node.kind === \"value\" || node.kind === \"ghost\" ? (node.radius ?? 32) : (node.width ?? 124) / 2;\n const halfHeight = node.kind === \"goal\" || node.kind === \"value\" || node.kind === \"ghost\" ? (node.radius ?? 32) : (node.height ?? 56) / 2;\n const metaTopAllowance = node.meta && (node.kind === \"goal\" || node.kind === \"ghost\") ? 48 : 0;\n minX = Math.min(minX, node.x - halfWidth);\n maxX = Math.max(maxX, node.x + halfWidth);\n minY = Math.min(minY, node.y - halfHeight - metaTopAllowance);\n maxY = Math.max(maxY, node.y + halfHeight);\n }\n\n for (const field of fields) {\n minX = Math.min(minX, field.x - field.radiusX);\n maxX = Math.max(maxX, field.x + field.radiusX);\n minY = Math.min(minY, field.y - field.radiusY);\n maxY = Math.max(maxY, field.y + field.radiusY);\n }\n\n return { minX, maxX, minY, maxY };\n}\n\nfunction resolveNodeCenter(node: PsycheGraphNode) {\n return { x: node.x, y: node.y };\n}\n\nfunction buildNodeLabelLines(node: PsycheGraphNode) {\n if (node.kind === \"goal\") {\n const radius = node.radius ?? 112;\n return splitLabel(node.label, Math.max(14, Math.floor(radius / 7.2)), 4);\n }\n if (node.kind === \"value\" || node.kind === \"ghost\") {\n const radius = node.radius ?? 40;\n return splitLabel(node.label, Math.max(12, Math.floor(radius / 3)), 3);\n }\n if (node.kind === \"project\") {\n return splitLabel(node.label, Math.max(18, Math.floor((node.width ?? 220) / 10)), 3);\n }\n return splitLabel(node.label, Math.max(16, Math.floor((node.width ?? 180) / 10.5)), 2);\n}\n\nfunction getToneForEntityKind(kind: EntityKind): PsycheGraphTone {\n switch (kind) {\n case \"goal\":\n return \"amber\";\n case \"project\":\n return \"sky\";\n case \"value\":\n return \"mint\";\n case \"behavior\":\n return \"orange\";\n case \"belief\":\n return \"violet\";\n case \"report\":\n return \"blue\";\n default:\n return \"slate\";\n }\n}\n\nexport function PsycheGraphCanvas({\n nodes,\n edges,\n fields = [],\n title,\n hint,\n action,\n legend,\n selectedNodeId,\n onSelectNode,\n minHeightClassName = \"min-h-[34rem] lg:min-h-[44rem]\",\n compact = false,\n testId\n}: {\n nodes: PsycheGraphNode[];\n edges: PsycheGraphEdge[];\n fields?: PsycheGraphField[];\n title: string;\n hint?: string;\n action?: ReactNode;\n legend?: Array<{ label: string; tone?: PsycheGraphTone; kind?: EntityKind }>;\n selectedNodeId?: string | null;\n onSelectNode?: (nodeId: string) => void;\n minHeightClassName?: string;\n compact?: boolean;\n testId?: string;\n}) {\n const frameRef = useRef<HTMLDivElement | null>(null);\n const navigate = useNavigate();\n const [frameSize, setFrameSize] = useState({ width: 0, height: 0 });\n const [viewport, setViewport] = useState<PsycheGraphViewportState>({ scale: 1, x: 0, y: 0 });\n const [hoveredNodeId, setHoveredNodeId] = useState<string | null>(null);\n const dragRef = useRef<{ pointerId: number; originX: number; originY: number; startX: number; startY: number } | null>(null);\n const viewportRef = useRef<PsycheGraphViewportState>({ scale: 1, x: 0, y: 0 });\n const activePointersRef = useRef(new Map<number, { x: number; y: number }>());\n const pinchRef = useRef<{\n startDistance: number;\n startScale: number;\n startViewportX: number;\n startViewportY: number;\n startMidpointX: number;\n startMidpointY: number;\n } | null>(null);\n const suppressClickUntilRef = useRef(0);\n const userAdjustedRef = useRef(false);\n\n const nodeMap = useMemo(() => new Map(nodes.map((node) => [node.id, node])), [nodes]);\n const bounds = useMemo(() => computeBounds(nodes, fields), [fields, nodes]);\n const isMobileFrame = frameSize.width > 0 && frameSize.width < 640;\n\n useEffect(() => {\n if (!frameRef.current || typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n setFrameSize({\n width: entry.contentRect.width,\n height: entry.contentRect.height\n });\n });\n\n observer.observe(frameRef.current);\n return () => observer.disconnect();\n }, []);\n\n const fitToContent = useCallback(() => {\n if (!frameSize.width || !frameSize.height) {\n return;\n }\n\n const padding = isMobileFrame ? 132 : compact ? 140 : 190;\n const width = Math.max(bounds.maxX - bounds.minX, 1);\n const height = Math.max(bounds.maxY - bounds.minY, 1);\n const scale = clamp(\n Math.min(frameSize.width / (width + padding), frameSize.height / (height + padding)),\n isMobileFrame ? 0.24 : compact ? 0.4 : 0.46,\n isMobileFrame ? 0.76 : compact ? 1.04 : 1.18\n );\n const centerX = (bounds.minX + bounds.maxX) / 2;\n const centerY = (bounds.minY + bounds.maxY) / 2;\n\n setViewport({\n scale,\n x: frameSize.width / 2 - centerX * scale,\n y: frameSize.height / 2 - centerY * scale\n });\n }, [bounds.maxX, bounds.maxY, bounds.minX, bounds.minY, compact, frameSize.height, frameSize.width, isMobileFrame]);\n\n useEffect(() => {\n viewportRef.current = viewport;\n }, [viewport]);\n\n useEffect(() => {\n if (!userAdjustedRef.current) {\n fitToContent();\n }\n }, [fitToContent]);\n\n const adjustScale = useCallback(\n (nextScale: number, focusX?: number, focusY?: number) => {\n const targetScale = clamp(nextScale, 0.28, 1.9);\n setViewport((current) => {\n if (focusX == null || focusY == null) {\n return { ...current, scale: targetScale };\n }\n\n const worldX = (focusX - current.x) / current.scale;\n const worldY = (focusY - current.y) / current.scale;\n return {\n scale: targetScale,\n x: focusX - worldX * targetScale,\n y: focusY - worldY * targetScale\n };\n });\n },\n []\n );\n\n const beginPinchGesture = useCallback(() => {\n const pointers = [...activePointersRef.current.values()];\n if (pointers.length < 2) {\n pinchRef.current = null;\n return;\n }\n\n const [first, second] = pointers;\n const distance = Math.hypot(second.x - first.x, second.y - first.y);\n if (!Number.isFinite(distance) || distance <= 0) {\n pinchRef.current = null;\n return;\n }\n\n const currentViewport = viewportRef.current;\n pinchRef.current = {\n startDistance: distance,\n startScale: currentViewport.scale,\n startViewportX: currentViewport.x,\n startViewportY: currentViewport.y,\n startMidpointX: (first.x + second.x) / 2,\n startMidpointY: (first.y + second.y) / 2\n };\n }, []);\n\n const handleWheel = (event: React.WheelEvent<HTMLDivElement>) => {\n event.preventDefault();\n const rect = frameRef.current?.getBoundingClientRect();\n if (!rect) {\n return;\n }\n\n userAdjustedRef.current = true;\n const delta = event.deltaY < 0 ? 1.1 : 0.9;\n adjustScale(viewport.scale * delta, event.clientX - rect.left, event.clientY - rect.top);\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n const rect = frameRef.current?.getBoundingClientRect();\n const localX = event.clientX - (rect?.left ?? 0);\n const localY = event.clientY - (rect?.top ?? 0);\n activePointersRef.current.set(event.pointerId, { x: localX, y: localY });\n if (activePointersRef.current.size === 1) {\n const currentViewport = viewportRef.current;\n dragRef.current = {\n pointerId: event.pointerId,\n originX: currentViewport.x,\n originY: currentViewport.y,\n startX: localX,\n startY: localY\n };\n } else {\n dragRef.current = null;\n beginPinchGesture();\n }\n event.currentTarget.setPointerCapture(event.pointerId);\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {\n const rect = frameRef.current?.getBoundingClientRect();\n const localX = event.clientX - (rect?.left ?? 0);\n const localY = event.clientY - (rect?.top ?? 0);\n if (activePointersRef.current.has(event.pointerId)) {\n activePointersRef.current.set(event.pointerId, { x: localX, y: localY });\n }\n\n if (pinchRef.current && activePointersRef.current.size >= 2) {\n const [first, second] = [...activePointersRef.current.values()];\n const distance = Math.hypot(second.x - first.x, second.y - first.y);\n if (Number.isFinite(distance) && distance > 0) {\n userAdjustedRef.current = true;\n suppressClickUntilRef.current = Date.now() + 240;\n const midpointX = (first.x + second.x) / 2;\n const midpointY = (first.y + second.y) / 2;\n const gesture = pinchRef.current;\n const targetScale = clamp((gesture.startScale * distance) / gesture.startDistance, 0.24, 1.42);\n const worldX = (gesture.startMidpointX - gesture.startViewportX) / gesture.startScale;\n const worldY = (gesture.startMidpointY - gesture.startViewportY) / gesture.startScale;\n\n setViewport({\n scale: targetScale,\n x: midpointX - worldX * targetScale,\n y: midpointY - worldY * targetScale\n });\n }\n return;\n }\n\n if (!dragRef.current || dragRef.current.pointerId !== event.pointerId || activePointersRef.current.size !== 1) {\n return;\n }\n\n userAdjustedRef.current = true;\n const deltaX = localX - dragRef.current.startX;\n const deltaY = localY - dragRef.current.startY;\n if (Math.abs(deltaX) > 3 || Math.abs(deltaY) > 3) {\n suppressClickUntilRef.current = Date.now() + 240;\n }\n setViewport((current) => ({\n ...current,\n x: (dragRef.current?.originX ?? current.x) + deltaX,\n y: (dragRef.current?.originY ?? current.y) + deltaY\n }));\n };\n\n const handlePointerEnd = (event: React.PointerEvent<HTMLDivElement>) => {\n activePointersRef.current.delete(event.pointerId);\n\n if (activePointersRef.current.size < 2) {\n pinchRef.current = null;\n }\n\n if (activePointersRef.current.size === 1) {\n const [pointerId, point] = [...activePointersRef.current.entries()][0] ?? [];\n if (pointerId != null && point) {\n const currentViewport = viewportRef.current;\n dragRef.current = {\n pointerId,\n originX: currentViewport.x,\n originY: currentViewport.y,\n startX: point.x,\n startY: point.y\n };\n }\n } else {\n dragRef.current = null;\n }\n\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n };\n\n const activeNodeId = hoveredNodeId ?? selectedNodeId ?? null;\n const openNode = useCallback(\n (node: PsycheGraphNode) => {\n if (Date.now() < suppressClickUntilRef.current) {\n return;\n }\n onSelectNode?.(node.id);\n if (node.href) {\n navigate(node.href);\n }\n },\n [navigate, onSelectNode]\n );\n\n return (\n <section\n data-testid={testId}\n className={cn(\n \"overflow-hidden rounded-[32px] border border-white/8 bg-[radial-gradient(circle_at_top,rgba(125,211,252,0.12),transparent_32%),linear-gradient(180deg,rgba(11,18,31,0.985),rgba(7,12,23,0.98))] shadow-[0_26px_90px_rgba(2,6,16,0.38)]\",\n compact ? \"px-3 py-3 sm:px-4 sm:py-4 lg:px-5 lg:py-5\" : \"px-3 py-3 sm:px-4 sm:py-4 lg:px-5 lg:py-5\"\n )}\n >\n <div className=\"mb-3 flex min-w-0 flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-[rgba(125,211,252,0.82)]\">Gravity well</div>\n <h2 className={cn(\"mt-2 font-display leading-none text-white\", compact ? \"text-[clamp(1.25rem,2vw,1.7rem)]\" : \"text-[clamp(1.45rem,2.8vw,2.3rem)]\")}>{title}</h2>\n {hint ? <p className=\"mt-1.5 max-w-3xl text-sm leading-6 text-white/54\">{isMobileFrame ? \"Select a node, pan the field, and open the full map when you need the wider structure.\" : hint}</p> : null}\n </div>\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-2\">{action}</div>\n </div>\n\n <div\n ref={frameRef}\n className={cn(\n \"group relative overflow-hidden rounded-[30px] border border-white/6 bg-[radial-gradient(circle_at_center,rgba(255,255,255,0.04),transparent_46%)] touch-none\",\n minHeightClassName\n )}\n style={{ touchAction: \"none\" }}\n onWheel={handleWheel}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerEnd}\n onPointerCancel={handlePointerEnd}\n >\n <div className=\"pointer-events-none absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(110,231,183,0.06),transparent_28%),radial-gradient(circle_at_20%_20%,rgba(196,181,253,0.08),transparent_24%),linear-gradient(180deg,rgba(255,255,255,0.015),rgba(4,8,18,0.24))]\" />\n\n <div className=\"absolute left-3 top-3 z-10 inline-flex max-w-[calc(100%-7rem)] items-center gap-2 rounded-full border border-white/8 bg-[rgba(8,14,25,0.78)] px-2.5 py-1.5 text-[11px] uppercase tracking-[0.18em] text-white/42 backdrop-blur-xl sm:left-4 sm:top-4 sm:max-w-none sm:px-3\" onPointerDown={(event) => event.stopPropagation()}>\n <Move className=\"size-3.5\" />\n {isMobileFrame ? \"Drag or pinch\" : \"Drag to pan, scroll to zoom\"}\n </div>\n\n <div className=\"absolute right-3 top-3 z-10 flex max-w-[calc(100%-1.5rem)] flex-wrap items-center justify-end gap-1.5 sm:right-4 sm:top-4 sm:max-w-none sm:gap-2\" onPointerDown={(event) => event.stopPropagation()}>\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" className=\"px-2.5 sm:px-3\" aria-label=\"Zoom in\" onClick={() => {\n userAdjustedRef.current = true;\n adjustScale(viewport.scale * 1.12, frameSize.width - 96, 72);\n }}>\n <Plus className=\"size-4\" />\n </Button>\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" className=\"px-2.5 sm:px-3\" aria-label=\"Zoom out\" onClick={() => {\n userAdjustedRef.current = true;\n adjustScale(viewport.scale * 0.88, frameSize.width - 96, 72);\n }}>\n <Minus className=\"size-4\" />\n </Button>\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" className=\"px-2.5 sm:min-w-[4.75rem] sm:px-3\" aria-label=\"Fit graph\" onClick={() => {\n userAdjustedRef.current = true;\n fitToContent();\n }}>\n <Maximize className=\"size-4\" />\n {!isMobileFrame ? \"Fit\" : null}\n </Button>\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" className=\"px-2.5 sm:min-w-[5.5rem] sm:px-3\" aria-label=\"Reset graph\" onClick={() => {\n userAdjustedRef.current = false;\n fitToContent();\n }}>\n <RotateCcw className=\"size-4\" />\n {!isMobileFrame ? \"Reset\" : null}\n </Button>\n </div>\n\n {legend && legend.length > 0 && !isMobileFrame ? (\n <div className=\"absolute bottom-4 left-4 z-10 flex flex-wrap items-center gap-2 rounded-[24px] border border-white/8 bg-[rgba(8,14,25,0.76)] px-3 py-2 text-xs text-white/58 backdrop-blur-xl\">\n {legend.map((item) => {\n const legendTone = item.kind ? getToneForEntityKind(item.kind) : (item.tone ?? \"slate\");\n const Icon = item.kind ? getEntityVisual(item.kind).icon : null;\n return (\n <span key={item.label} className=\"inline-flex items-center gap-2 whitespace-nowrap rounded-full bg-white/[0.04] px-2.5 py-1.5\">\n {Icon ? <Icon className=\"size-3.5\" color={toneTextMap[legendTone]} strokeWidth={2.1} /> : <span className=\"size-2 rounded-full\" style={{ backgroundColor: toneStrokeMap[legendTone] }} />}\n {item.label}\n </span>\n );\n })}\n </div>\n ) : null}\n\n <svg className=\"relative z-[1] h-full w-full\" viewBox={`0 0 ${frameSize.width || 1200} ${frameSize.height || 760}`} role=\"img\" aria-label={title}>\n <defs>\n <filter id=\"forge-graph-blur\">\n <feGaussianBlur stdDeviation=\"34\" />\n </filter>\n </defs>\n\n <g transform={`translate(${viewport.x} ${viewport.y}) scale(${viewport.scale})`}>\n {fields.map((field) => (\n <ellipse\n key={field.id}\n cx={field.x}\n cy={field.y}\n rx={field.radiusX}\n ry={field.radiusY}\n fill={toneFillMap[field.tone ?? \"rose\"]}\n opacity={field.opacity ?? 0.42}\n filter=\"url(#forge-graph-blur)\"\n />\n ))}\n\n {nodes\n .filter((node) => node.kind === \"goal\" || node.kind === \"ghost\")\n .map((node) => {\n const radius = node.radius ?? 76;\n return (\n <g key={`${node.id}-orbital-lanes`} opacity={node.kind === \"ghost\" ? 0.28 : 0.55}>\n {[radius + 74, radius + 124].map((ringRadius, index) => (\n <circle\n key={`${node.id}-ring-${ringRadius}`}\n cx={node.x}\n cy={node.y}\n r={ringRadius}\n fill=\"none\"\n stroke={index === 0 ? \"rgba(255,255,255,0.08)\" : \"rgba(255,255,255,0.045)\"}\n strokeDasharray={index === 0 ? \"0\" : \"10 10\"}\n />\n ))}\n </g>\n );\n })}\n\n {edges.map((edge) => {\n const from = nodeMap.get(edge.from);\n const to = nodeMap.get(edge.to);\n if (!from || !to) {\n return null;\n }\n const start = resolveNodeCenter(from);\n const end = resolveNodeCenter(to);\n const midX = (start.x + end.x) / 2;\n const midY = (start.y + end.y) / 2;\n const drift = Math.max(24, Math.abs(start.x - end.x) * 0.08);\n const controlX = midX;\n const controlY = midY - drift;\n\n return (\n <path\n key={edge.id}\n d={`M ${start.x} ${start.y} Q ${controlX} ${controlY} ${end.x} ${end.y}`}\n fill=\"none\"\n stroke={toneStrokeMap[edge.tone ?? \"slate\"]}\n strokeWidth={edge.strength === \"high\" ? 3 : edge.strength === \"medium\" ? 2.2 : 1.6}\n strokeDasharray={edge.dashed ? \"8 8\" : undefined}\n opacity={activeNodeId && edge.from !== activeNodeId && edge.to !== activeNodeId ? 0.18 : 0.62}\n />\n );\n })}\n\n {nodes.map((node) => {\n const isSelected = selectedNodeId === node.id;\n const isHovered = hoveredNodeId === node.id;\n const isActive = activeNodeId === node.id;\n const tone = getToneForNode(node);\n const metaLabel = getNodeMetaLabel(node);\n const labelLines = buildNodeLabelLines(node);\n const entityKind = getEntityKindForNode(node.kind);\n const Icon = entityKind ? getEntityVisual(entityKind).icon : null;\n\n if (node.kind === \"goal\" || node.kind === \"value\" || node.kind === \"ghost\") {\n const radius = node.radius ?? (node.kind === \"goal\" ? 76 : 34);\n const metaY = metaLabel ? node.y - radius - (node.kind === \"goal\" ? 18 : 10) : null;\n const lineSpacing = node.kind === \"goal\" ? 20 : 14.5;\n const iconSize = node.kind === \"goal\" ? 28 : 16;\n const iconCenterY = node.kind === \"goal\" ? node.y - radius * 0.34 : node.kind === \"value\" ? node.y - radius * 0.3 : node.y - radius * 0.2;\n const labelBaseY = node.kind === \"goal\" ? node.y + radius * 0.2 : node.y + 10;\n return (\n <g\n key={node.id}\n tabIndex={0}\n role=\"button\"\n onPointerEnter={() => {\n setHoveredNodeId(node.id);\n onSelectNode?.(node.id);\n }}\n onPointerLeave={() => setHoveredNodeId((current) => (current === node.id ? null : current))}\n onFocus={() => onSelectNode?.(node.id)}\n onClick={() => openNode(node)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openNode(node);\n }\n }}\n className=\"cursor-pointer outline-none\"\n >\n <circle\n cx={node.x}\n cy={node.y}\n r={radius + (isActive ? 14 : 0)}\n fill={isActive ? `${toneStrokeMap[tone]}22` : \"transparent\"}\n stroke={isActive ? toneStrokeMap[tone] : \"transparent\"}\n opacity={isHovered ? 0.98 : 0.9}\n />\n <circle\n cx={node.x}\n cy={node.y}\n r={radius + (isHovered ? 2 : 0)}\n fill={node.kind === \"ghost\" ? \"rgba(255,255,255,0.03)\" : toneFillMap[tone]}\n stroke={node.kind === \"ghost\" ? \"rgba(255,255,255,0.18)\" : toneStrokeMap[tone]}\n strokeDasharray={node.kind === \"ghost\" ? \"8 8\" : undefined}\n strokeWidth={isActive ? 2.8 : 1.6}\n />\n {metaLabel ? (\n <text x={node.x} y={metaY ?? node.y - 12} textAnchor=\"middle\" fontSize={node.kind === \"goal\" ? \"11.5\" : \"10.5\"} fill={node.kind === \"ghost\" ? \"rgba(255,255,255,0.62)\" : toneTextMap[tone]} style={{ letterSpacing: \"0.18em\", textTransform: \"uppercase\" }}>\n {metaLabel}\n </text>\n ) : null}\n {Icon ? (\n <Icon\n x={node.x - iconSize / 2}\n y={iconCenterY - iconSize / 2}\n width={iconSize}\n height={iconSize}\n color={toneTextMap[tone]}\n strokeWidth={2.1}\n />\n ) : null}\n {labelLines.map((line, index) => (\n <text\n key={`${node.id}-${line}-${index}`}\n x={node.x}\n y={labelBaseY + index * lineSpacing - ((labelLines.length - 1) * lineSpacing) / 2}\n textAnchor=\"middle\"\n fontSize={node.kind === \"goal\" ? 21 : 12.8}\n fontWeight={node.kind === \"goal\" ? 600 : 500}\n fill={node.kind === \"ghost\" ? \"rgba(255,255,255,0.92)\" : toneTextMap[tone]}\n >\n {line}\n </text>\n ))}\n </g>\n );\n }\n\n const width = node.width ?? 146;\n const height = node.height ?? 58;\n const x = node.x - width / 2;\n const y = node.y - height / 2;\n const iconSize = node.kind === \"project\" ? 14 : 13;\n const iconX = x + 14;\n const iconY = y + 13;\n const metaY = y + 22;\n const labelCenterY = metaLabel ? y + height * 0.65 : y + height * 0.56;\n const lineSpacing = node.kind === \"project\" ? 16 : 15;\n const labelFontSize = node.kind === \"project\" ? 14.2 : 13.2;\n\n return (\n <g\n key={node.id}\n tabIndex={0}\n role=\"button\"\n onPointerEnter={() => {\n setHoveredNodeId(node.id);\n onSelectNode?.(node.id);\n }}\n onPointerLeave={() => setHoveredNodeId((current) => (current === node.id ? null : current))}\n onFocus={() => onSelectNode?.(node.id)}\n onClick={() => openNode(node)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openNode(node);\n }\n }}\n className=\"cursor-pointer outline-none\"\n >\n <rect\n x={x - (isActive ? 6 : 0)}\n y={y - (isActive ? 6 : 0)}\n rx=\"28\"\n ry=\"28\"\n width={width + (isActive ? 12 : 0)}\n height={height + (isActive ? 12 : 0)}\n fill={isActive ? `${toneStrokeMap[tone]}22` : \"transparent\"}\n />\n <rect\n x={x - (isHovered ? 2 : 0)}\n y={y - (isHovered ? 2 : 0)}\n rx=\"22\"\n ry=\"22\"\n width={width + (isHovered ? 4 : 0)}\n height={height + (isHovered ? 4 : 0)}\n fill={toneFillMap[tone]}\n stroke={toneStrokeMap[tone]}\n strokeWidth={isActive ? 2.3 : 1.3}\n />\n {Icon ? (\n <Icon\n x={iconX}\n y={iconY}\n width={iconSize}\n height={iconSize}\n color={toneTextMap[tone]}\n strokeWidth={2.1}\n />\n ) : null}\n {metaLabel ? (\n <text x={iconX + iconSize + 8} y={metaY} textAnchor=\"start\" fontSize=\"9.5\" fill={toneTextMap[tone]} style={{ letterSpacing: \"0.16em\", textTransform: \"uppercase\", opacity: 0.82 }}>\n {metaLabel}\n </text>\n ) : null}\n {labelLines.map((line, index) => (\n <text\n key={`${node.id}-${line}-${index}`}\n x={node.x}\n y={labelCenterY + index * lineSpacing - ((labelLines.length - 1) * lineSpacing) / 2}\n textAnchor=\"middle\"\n fontSize={labelFontSize}\n fontWeight={600}\n fill={toneTextMap[tone]}\n >\n {line}\n </text>\n ))}\n </g>\n );\n })}\n </g>\n </svg>\n </div>\n </section>\n );\n}\n","import { useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { FlowChoiceGrid, FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\n\ntype ReflectIntent = \"trigger_report\" | \"behavior\" | \"belief\" | \"pattern\" | \"value\" | \"execution_tension\";\n\ntype ReflectDraft = {\n intent: ReflectIntent;\n linkedGoalId: string;\n linkedProjectId: string;\n linkedTaskId: string;\n};\n\nconst DEFAULT_REFLECT_DRAFT: ReflectDraft = {\n intent: \"trigger_report\",\n linkedGoalId: \"\",\n linkedProjectId: \"\",\n linkedTaskId: \"\"\n};\n\nexport function ReflectFlowDialog({\n open,\n onOpenChange\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const navigate = useNavigate();\n const shell = useForgeShell();\n const [draft, setDraft] = useState<ReflectDraft>(DEFAULT_REFLECT_DRAFT);\n\n const steps: Array<QuestionFlowStep<ReflectDraft>> = [\n {\n id: \"intent\",\n eyebrow: \"Reflect\",\n title: \"What do you want to reflect on?\",\n description: \"Choose the entrypoint first. Forge will route you into the right guided flow instead of dropping you into a generic form.\",\n render: (value, setValue) => (\n <FlowChoiceGrid\n columns={3}\n value={value.intent}\n onChange={(intent) => setValue({ intent: intent as ReflectIntent })}\n options={[\n { value: \"trigger_report\", label: \"A situation\", description: \"Start a Spark-to-Pivot report about something that happened.\" },\n { value: \"behavior\", label: \"A behavior\", description: \"Trace an away move, committed action, or recovery path.\" },\n { value: \"belief\", label: \"A belief script\", description: \"Capture or refine the belief beneath the reaction.\" },\n { value: \"pattern\", label: \"A recurring pattern\", description: \"Map the loop, payoff, cost, and better response.\" },\n { value: \"value\", label: \"A blocked value\", description: \"Clarify which value is being challenged or needs support.\" },\n { value: \"execution_tension\", label: \"A goal tension\", description: \"Reflect on a goal, project, or task that carries friction.\" }\n ]}\n />\n )\n },\n {\n id: \"placement\",\n eyebrow: \"Placement\",\n title: \"Attach the reflection to the wider system\",\n description: \"This keeps the reflection connected to values, behaviors, and live work instead of becoming an isolated note.\",\n render: (value, setValue) => (\n <div className=\"grid gap-4\">\n <FlowField label=\"Goal / project / task tension\">\n <div className=\"grid gap-3\">\n <div className=\"flex flex-wrap gap-2\">\n <EntityBadge kind=\"goal\" label=\"Goal\" compact gradient={false} />\n <EntityBadge kind=\"project\" label=\"Project\" compact gradient={false} />\n <EntityBadge kind=\"task\" label=\"Task\" compact gradient={false} />\n </div>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={value.linkedGoalId}\n onChange={(event) => setValue({ linkedGoalId: event.target.value })}\n >\n <option value=\"\">No goal selected</option>\n {shell.snapshot.goals.map((goal) => (\n <option key={goal.id} value={goal.id}>\n Goal · {goal.title}\n </option>\n ))}\n </select>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={value.linkedProjectId}\n onChange={(event) => setValue({ linkedProjectId: event.target.value })}\n >\n <option value=\"\">No project selected</option>\n {shell.snapshot.dashboard.projects.map((project) => (\n <option key={project.id} value={project.id}>\n Project · {project.title}\n </option>\n ))}\n </select>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={value.linkedTaskId}\n onChange={(event) => setValue({ linkedTaskId: event.target.value })}\n >\n <option value=\"\">No task selected</option>\n {shell.snapshot.tasks.slice(0, 40).map((task) => (\n <option key={task.id} value={task.id}>\n Task · {task.title}\n </option>\n ))}\n </select>\n </div>\n </FlowField>\n </div>\n )\n }\n ];\n\n const launch = async () => {\n const search = new URLSearchParams({ create: \"1\", intent: draft.intent });\n if (draft.linkedGoalId) {\n search.set(\"goalId\", draft.linkedGoalId);\n }\n if (draft.linkedProjectId) {\n search.set(\"projectId\", draft.linkedProjectId);\n }\n if (draft.linkedTaskId) {\n search.set(\"taskId\", draft.linkedTaskId);\n }\n\n switch (draft.intent) {\n case \"behavior\":\n navigate(`/psyche/behaviors?${search.toString()}`);\n break;\n case \"belief\":\n navigate(`/psyche/schemas-beliefs?${search.toString()}`);\n break;\n case \"pattern\":\n navigate(`/psyche/patterns?${search.toString()}`);\n break;\n case \"value\":\n navigate(`/psyche/values?${search.toString()}`);\n break;\n case \"execution_tension\":\n case \"trigger_report\":\n default:\n navigate(`/psyche/reports?${search.toString()}`);\n break;\n }\n\n onOpenChange(false);\n setDraft(DEFAULT_REFLECT_DRAFT);\n };\n\n return (\n <QuestionFlowDialog\n open={open}\n onOpenChange={onOpenChange}\n eyebrow=\"Reflect\"\n title=\"Start from the right reflective doorway\"\n description=\"Choose what you want to reflect on first. Forge will take you into the right guided flow instead of leaving you in a generic form.\"\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel=\"Open guided reflection\"\n onSubmit={launch}\n />\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { BrainCircuit, GitBranchPlus, HeartHandshake, Orbit, Sparkles, UnfoldVertical, Waves, Waypoints } from \"lucide-react\";\nimport { Link, NavLink, useLocation } from \"react-router-dom\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport const PSYCHE_SECTIONS = [\n { to: \"/psyche\", label: \"Overview\", icon: BrainCircuit },\n { to: \"/psyche/values\", label: \"Values\", icon: Orbit },\n { to: \"/psyche/patterns\", label: \"Patterns\", icon: Waves },\n { to: \"/psyche/behaviors\", label: \"Behaviors\", icon: GitBranchPlus },\n { to: \"/psyche/reports\", label: \"Reports\", icon: Sparkles },\n { to: \"/psyche/goal-map\", label: \"Goal Map\", icon: Waypoints },\n { to: \"/psyche/schemas-beliefs\", label: \"Schemas & Beliefs\", icon: UnfoldVertical },\n { to: \"/psyche/modes\", label: \"Modes\", icon: HeartHandshake }\n] as const;\n\nfunction sectionMatches(pathname: string, to: string) {\n return pathname === to || pathname.startsWith(`${to}/`);\n}\n\nexport function PsycheSectionNav({ className }: { className?: string }) {\n const location = useLocation();\n const [mobileOpen, setMobileOpen] = useState(false);\n const activeSection = useMemo(() => {\n return (\n [...PSYCHE_SECTIONS]\n .sort((left, right) => right.to.length - left.to.length)\n .find((section) => sectionMatches(location.pathname, section.to)) ?? PSYCHE_SECTIONS[0]\n );\n }, [location.pathname]);\n\n return (\n <>\n <Card className={cn(\"overflow-hidden bg-[linear-gradient(180deg,rgba(15,24,31,0.94),rgba(10,18,25,0.92))] p-2\", className)}>\n <div className=\"hidden items-center gap-3 lg:flex\">\n <div className=\"flex flex-wrap gap-2\">\n {PSYCHE_SECTIONS.map((section) => (\n <NavLink\n key={section.to}\n to={section.to}\n className={({ isActive }) =>\n cn(\n \"inline-flex items-center gap-2 whitespace-nowrap rounded-full px-3 py-1.5 text-[11px] font-semibold uppercase tracking-[0.14em] transition\",\n isActive || sectionMatches(location.pathname, section.to)\n ? \"bg-[rgba(110,231,183,0.18)] text-[var(--tertiary)]\"\n : \"bg-white/[0.04] text-white/58 hover:bg-white/[0.08] hover:text-white\"\n )\n }\n >\n <section.icon className=\"size-3.5\" />\n <span>{section.label}</span>\n </NavLink>\n ))}\n </div>\n </div>\n\n <div className=\"flex items-center justify-between gap-3 lg:hidden\">\n <button\n type=\"button\"\n className=\"inline-flex min-w-0 flex-1 items-center justify-between rounded-full bg-white/[0.06] px-4 py-3 text-left\"\n onClick={() => setMobileOpen(true)}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <activeSection.icon className=\"size-4 shrink-0 text-[var(--tertiary)]\" />\n <span className=\"truncate text-sm font-medium text-white\">{activeSection.label}</span>\n </span>\n <span className=\"text-[10px] uppercase tracking-[0.16em] text-white/42\">Switch</span>\n </button>\n </div>\n </Card>\n\n {mobileOpen ? (\n <div className=\"fixed inset-0 z-50 bg-[rgba(5,10,18,0.86)] px-4 py-5 backdrop-blur-xl lg:hidden\">\n <div className=\"mx-auto flex h-full max-w-xl flex-col rounded-[32px] bg-[linear-gradient(180deg,rgba(16,25,33,0.98),rgba(11,18,25,0.98))] p-5 shadow-[0_30px_80px_rgba(0,0,0,0.35)]\">\n <div className=\"flex items-center justify-between gap-4\">\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/38\">Psyche sections</div>\n <div className=\"mt-2 font-display text-3xl text-white\">Move through the inner map</div>\n </div>\n <Button variant=\"secondary\" onClick={() => setMobileOpen(false)}>\n Close\n </Button>\n </div>\n\n <div className=\"mt-6 grid gap-3 overflow-y-auto\">\n {PSYCHE_SECTIONS.map((section) => (\n <NavLink\n key={section.to}\n to={section.to}\n onClick={() => setMobileOpen(false)}\n className={cn(\n \"flex items-center justify-between rounded-[24px] px-4 py-4 transition\",\n sectionMatches(location.pathname, section.to)\n ? \"bg-[rgba(110,231,183,0.14)] text-white\"\n : \"bg-white/[0.04] text-white/70\"\n )}\n >\n <span className=\"flex items-center gap-3\">\n <section.icon className=\"size-4 text-[var(--tertiary)]\" />\n <span className=\"text-base font-medium\">{section.label}</span>\n </span>\n <span className=\"text-[10px] uppercase tracking-[0.16em] text-white/36\">Open</span>\n </NavLink>\n ))}\n </div>\n </div>\n </div>\n ) : null}\n\n </>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Link, useSearchParams } from \"react-router-dom\";\nimport { buildGoalGravityScene } from \"@/components/psyche/goal-gravity-scene\";\nimport { PsycheGraphCanvas } from \"@/components/psyche/psyche-graph\";\nimport { ReflectFlowDialog } from \"@/components/psyche/reflect-flow-dialog\";\nimport { SurfaceSkeleton } from \"@/components/experience/surface-skeleton\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { InteractiveCard } from \"@/components/ui/interactive-card\";\nimport { ErrorState } from \"@/components/ui/page-state\";\nimport { getEntityButtonClassName } from \"@/lib/entity-visuals\";\nimport { cn } from \"@/lib/utils\";\nimport { getPsycheOverview } from \"@/lib/api\";\n\nexport function PsychePage() {\n const shell = useForgeShell();\n const [searchParams, setSearchParams] = useSearchParams();\n const [reflectOpen, setReflectOpen] = useState(searchParams.get(\"reflect\") === \"1\");\n const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null);\n const overviewQuery = useQuery({\n queryKey: [\"forge-psyche-overview\"],\n queryFn: getPsycheOverview\n });\n\n const overview = overviewQuery.data?.overview;\n\n const clusters = useMemo(() => {\n if (!overview) {\n return [];\n }\n\n return shell.snapshot.goals.slice(0, 3).map((goal) => {\n const linkedValues = overview.values.filter((value) => value.linkedGoalIds.includes(goal.id));\n const linkedProjects = shell.snapshot.dashboard.projects.filter((project) => project.goalId === goal.id);\n const linkedReports = overview.reports.filter((report) => report.linkedGoalIds.includes(goal.id));\n const linkedBehaviors = overview.behaviors.filter((behavior) =>\n behavior.linkedValueIds.some((valueId) => linkedValues.some((value) => value.id === valueId))\n );\n const linkedBeliefs = overview.beliefs.filter((belief) =>\n belief.linkedValueIds.some((valueId) => linkedValues.some((value) => value.id === valueId))\n );\n\n return {\n goal,\n linkedValues,\n linkedProjects,\n linkedReports,\n linkedBehaviors,\n linkedBeliefs\n };\n });\n }, [overview, shell.snapshot.dashboard.projects, shell.snapshot.goals]);\n\n const scene = useMemo(() => buildGoalGravityScene(clusters, { compact: true }), [clusters]);\n\n useEffect(() => {\n setSelectedNodeId(scene.defaultSelectedId);\n }, [scene.defaultSelectedId]);\n\n if (overviewQuery.isLoading) {\n return <SurfaceSkeleton />;\n }\n\n if (overviewQuery.isError || !overview) {\n return <ErrorState eyebrow=\"Psyche\" error={overviewQuery.error} onRetry={() => void overviewQuery.refetch()} />;\n }\n\n const inspector = scene.inspectors[selectedNodeId ?? scene.defaultSelectedId] ?? scene.inspectors[scene.defaultSelectedId];\n const hotPattern = overview.patterns[0] ?? null;\n const nextReport = overview.reports[0] ?? null;\n\n return (\n <div className=\"grid min-w-0 gap-4 overflow-x-clip\">\n <PageHero\n title=\"Psyche\"\n titleText=\"Psyche\"\n description=\"See your goals, values, beliefs, behaviors, projects, and reports together, then open the goal map when you want the full structure.\"\n badge={`${overview.domain.title} active`}\n actions={\n <>\n <Link to=\"/psyche/goal-map\" className=\"inline-flex min-h-10 min-w-0 max-w-full items-center justify-center rounded-full bg-white/[0.08] px-4 py-2 text-sm whitespace-nowrap text-white transition hover:bg-white/[0.12]\">\n Open goal map\n </Link>\n </>\n }\n />\n\n <PsycheSectionNav />\n\n <section className=\"grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1fr)_19rem]\">\n <PsycheGraphCanvas\n testId=\"psyche-hub-graph\"\n compact\n title=\"Reflective pulse and live entity field\"\n hint=\"This is the live field. Select any goal, value, belief, behavior, project, or report, then open the full goal map when you want the wider structure.\"\n nodes={scene.nodes}\n edges={scene.edges}\n fields={scene.fields}\n selectedNodeId={selectedNodeId}\n onSelectNode={setSelectedNodeId}\n minHeightClassName=\"min-h-[20rem] sm:min-h-[24rem] lg:min-h-[34rem]\"\n legend={[\n { label: \"Goals\", kind: \"goal\" },\n { label: \"Values\", kind: \"value\" },\n { label: \"Behaviors\", kind: \"behavior\" }\n ]}\n action={\n <>\n <Link to=\"/psyche/goal-map\" className=\"inline-flex min-h-10 min-w-0 max-w-full items-center justify-center rounded-[var(--radius-control)] bg-white/8 px-4 py-2 text-sm font-medium whitespace-nowrap text-white transition hover:bg-white/12\">\n Open goal map\n </Link>\n <Button size=\"sm\" className=\"min-w-0 sm:min-w-[6.5rem]\" onClick={() => setReflectOpen(true)}>Reflect</Button>\n </>\n }\n />\n\n <Card className=\"h-fit min-w-0 xl:sticky xl:top-24\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {inspector.entityKind ? (\n <EntityBadge kind={inspector.entityKind} compact gradient={false} iconOnly />\n ) : (\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{inspector.eyebrow}</div>\n )}\n </div>\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {inspector.entityKind ? (\n <EntityName kind={inspector.entityKind} label={inspector.title} variant=\"heading\" size=\"lg\" showKind={false} />\n ) : (\n <h2 className=\"font-display text-[clamp(1.25rem,2.2vw,1.8rem)] leading-none text-white\">{inspector.title}</h2>\n )}\n </div>\n <p className=\"mt-3 text-sm leading-6 text-white/60\">{inspector.summary}</p>\n {inspector.chips.length > 0 ? (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {inspector.chips.map((chip) => (\n <Badge key={chip} className=\"bg-white/[0.08] text-white/74\">\n {chip}\n </Badge>\n ))}\n </div>\n ) : null}\n {inspector.stats.length > 0 ? (\n <div className=\"mt-4 grid gap-2\">\n {inspector.stats.map((stat) => (\n <div key={stat} className=\"rounded-[18px] bg-white/[0.04] px-3 py-3 text-sm text-white/68\">\n {stat}\n </div>\n ))}\n </div>\n ) : null}\n <div className=\"mt-5\">\n <Link\n to={inspector.href}\n className={cn(\n \"inline-flex min-h-11 w-full items-center justify-center rounded-[var(--radius-control)] px-4 py-2.5 text-sm font-medium whitespace-nowrap shadow-[0_12px_30px_rgba(192,193,255,0.08)]\",\n inspector.entityKind\n ? getEntityButtonClassName(inspector.entityKind, true)\n : \"bg-[linear-gradient(135deg,rgba(192,193,255,0.36),rgba(192,193,255,0.22))] text-white\"\n )}\n >\n {inspector.ctaLabel}\n </Link>\n </div>\n </Card>\n </section>\n\n <section className=\"grid min-w-0 gap-4 lg:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]\">\n <InteractiveCard to=\"/psyche/behaviors\" className=\"rounded-[28px] border border-white/8 bg-[linear-gradient(180deg,rgba(17,29,32,0.96),rgba(11,21,23,0.94))] p-5\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-[rgba(110,231,183,0.82)]\">Best next reflective move</div>\n <div className=\"mt-3 font-display text-[clamp(1.45rem,2.2vw,2rem)] leading-none text-white\">\n {hotPattern?.preferredResponse || \"Map the active loop, then name the committed move that brings you back.\"}\n </div>\n <p className=\"mt-3 text-sm leading-6 text-white/58\">\n {hotPattern?.targetBehavior || \"When the loop is explicit, the return path stops feeling abstract.\"}\n </p>\n </InteractiveCard>\n\n <InteractiveCard to={nextReport ? `/psyche/reports/${nextReport.id}` : \"/psyche/reports\"} className=\"rounded-[28px] border border-white/8 bg-[linear-gradient(180deg,rgba(24,19,37,0.96),rgba(13,12,22,0.94))] p-5\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-violet-100/72\">Open threads</div>\n <div className=\"mt-3 grid gap-3 md:grid-cols-2\">\n <div className=\"rounded-[22px] bg-white/[0.04] px-4 py-4\">\n <div className=\"text-sm text-white/58\">Insights</div>\n <div className=\"mt-2 font-display text-4xl text-white\">{overview.openInsights}</div>\n </div>\n <div className=\"rounded-[22px] bg-white/[0.04] px-4 py-4\">\n <div className=\"text-sm text-white/58\">Comments</div>\n <div className=\"mt-2 font-display text-4xl text-white\">{overview.unresolvedComments}</div>\n </div>\n </div>\n <div className=\"mt-4 text-sm text-white/60\">\n {nextReport?.title || \"Open the next chain and keep the report field live without adding more dashboard noise.\"}\n </div>\n </InteractiveCard>\n </section>\n\n <ReflectFlowDialog\n open={reflectOpen}\n onOpenChange={(open) => {\n setReflectOpen(open);\n const next = new URLSearchParams(searchParams);\n next.delete(\"reflect\");\n setSearchParams(next, { replace: true });\n }}\n />\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { InfoTooltip } from \"@/components/ui/info-tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nexport function AtlasPanel({\n eyebrow,\n title,\n description,\n titleHelp,\n tone = \"default\",\n children,\n className\n}: {\n eyebrow: string;\n title: string;\n description?: string;\n titleHelp?: string;\n tone?: \"default\" | \"mint\" | \"sky\" | \"violet\" | \"rose\" | \"amber\";\n children: ReactNode;\n className?: string;\n}) {\n const toneClasses = {\n default: \"bg-[linear-gradient(180deg,rgba(17,24,35,0.96),rgba(11,16,24,0.94))]\",\n mint: \"bg-[radial-gradient(circle_at_top_left,rgba(110,231,183,0.14),transparent_42%),linear-gradient(180deg,rgba(14,28,31,0.96),rgba(10,20,24,0.94))]\",\n sky: \"bg-[radial-gradient(circle_at_top_left,rgba(125,211,252,0.14),transparent_42%),linear-gradient(180deg,rgba(16,25,34,0.96),rgba(10,17,24,0.94))]\",\n violet: \"bg-[radial-gradient(circle_at_top_left,rgba(196,181,253,0.14),transparent_42%),linear-gradient(180deg,rgba(20,19,35,0.96),rgba(12,13,24,0.94))]\",\n rose: \"bg-[radial-gradient(circle_at_top_left,rgba(251,113,133,0.14),transparent_42%),linear-gradient(180deg,rgba(31,18,24,0.96),rgba(18,11,16,0.94))]\",\n amber: \"bg-[radial-gradient(circle_at_top_left,rgba(251,191,36,0.14),transparent_42%),linear-gradient(180deg,rgba(32,24,16,0.96),rgba(20,15,10,0.94))]\"\n };\n\n return (\n <section className={cn(\"min-w-0 overflow-hidden rounded-[30px] border border-white/8 px-4 py-5 shadow-[0_24px_70px_rgba(4,8,18,0.28)] sm:px-5 lg:px-6\", toneClasses[tone], className)}>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{eyebrow}</div>\n <div className=\"mt-3 flex min-w-0 items-start gap-2\">\n <h2 className=\"min-w-0 font-display text-[clamp(1.8rem,3.2vw,3rem)] leading-none text-white\">{title}</h2>\n {titleHelp ? <InfoTooltip content={titleHelp} label={`Explain ${title.toLowerCase()}`} className=\"mt-1 shrink-0\" /> : null}\n </div>\n {description ? <p className=\"mt-3 max-w-3xl text-sm leading-7 text-white/60\">{description}</p> : null}\n <div className=\"mt-5 min-w-0\">{children}</div>\n </section>\n );\n}\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport { Plus, Search, X } from \"lucide-react\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport type { EntityKind } from \"@/lib/entity-visuals\";\nimport { cn } from \"@/lib/utils\";\n\nexport type EntityLinkOption = {\n value: string;\n label: string;\n description?: string;\n searchText?: string;\n kind?: EntityKind;\n badge?: ReactNode;\n menuBadge?: ReactNode;\n};\n\nfunction normalize(text: string) {\n return text.trim().toLowerCase();\n}\n\nfunction appendUnique(values: string[], next: string) {\n return values.includes(next) ? values : [...values, next];\n}\n\nexport function EntityLinkMultiSelect({\n options,\n selectedValues,\n onChange,\n placeholder = \"Search or create…\",\n emptyMessage = \"No matching entries yet.\",\n createLabel = \"Create\",\n onCreate,\n className\n}: {\n options: EntityLinkOption[];\n selectedValues: string[];\n onChange: (values: string[]) => void;\n placeholder?: string;\n emptyMessage?: string;\n createLabel?: string;\n onCreate?: (query: string) => Promise<EntityLinkOption>;\n className?: string;\n}) {\n const [query, setQuery] = useState(\"\");\n const [open, setOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const [pendingCreate, setPendingCreate] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const [createdOptions, setCreatedOptions] = useState<EntityLinkOption[]>([]);\n\n const mergedOptions = useMemo(() => {\n const map = new Map<string, EntityLinkOption>();\n [...createdOptions, ...options].forEach((option) => {\n map.set(option.value, option);\n });\n return Array.from(map.values());\n }, [createdOptions, options]);\n\n const selectedOptions = useMemo(\n () =>\n selectedValues.map((value) => mergedOptions.find((option) => option.value === value) ?? { value, label: value }),\n [mergedOptions, selectedValues]\n );\n\n const normalizedQuery = normalize(query);\n const filteredOptions = useMemo(() => {\n const pool = mergedOptions.filter((option) => !selectedValues.includes(option.value));\n if (!normalizedQuery) {\n return pool.slice(0, 8);\n }\n return pool\n .filter((option) => {\n const haystack = `${option.label} ${option.description ?? \"\"} ${option.searchText ?? \"\"}`.toLowerCase();\n return haystack.includes(normalizedQuery);\n })\n .slice(0, 8);\n }, [mergedOptions, normalizedQuery, selectedValues]);\n\n const hasExactMatch = mergedOptions.some((option) => normalize(option.label) === normalizedQuery);\n\n const selectValue = (value: string) => {\n onChange(appendUnique(selectedValues, value));\n setQuery(\"\");\n setCreateError(null);\n setHighlightedIndex(0);\n setOpen(false);\n };\n\n const removeValue = (value: string) => {\n onChange(selectedValues.filter((entry) => entry !== value));\n };\n\n const createValue = async () => {\n const nextValue = query.trim();\n if (!onCreate || !nextValue) {\n return;\n }\n\n setPendingCreate(true);\n try {\n const option = await onCreate(nextValue);\n setCreatedOptions((current) => (current.some((entry) => entry.value === option.value) ? current : [option, ...current]));\n onChange(appendUnique(selectedValues, option.value));\n setQuery(\"\");\n setCreateError(null);\n setHighlightedIndex(0);\n setOpen(false);\n } catch (error) {\n setCreateError(error instanceof Error ? error.message : \"Unable to create that link right now.\");\n } finally {\n setPendingCreate(false);\n }\n };\n\n return (\n <div className={cn(\"relative grid gap-2\", className)}>\n <div className=\"rounded-[22px] border border-white/10 bg-white/[0.04] px-3 py-3\">\n {selectedOptions.length > 0 ? (\n <div className=\"mb-2 flex flex-wrap gap-2\">\n {selectedOptions.map((option) => (\n <span key={option.value} className=\"inline-flex min-w-0 max-w-full items-center gap-2\">\n {option.kind ? (\n <EntityBadge kind={option.kind} label={option.label} compact className=\"max-w-[16rem]\" />\n ) : option.badge ? (\n option.badge\n ) : (\n <span className=\"inline-flex items-center gap-2 rounded-full bg-white/[0.08] px-3 py-1.5 text-sm text-white/78\">\n <span className=\"max-w-[16rem] truncate\">{option.label}</span>\n </span>\n )}\n <button\n type=\"button\"\n className=\"rounded-full text-white/50 transition hover:text-white\"\n aria-label={`Remove ${option.label}`}\n onClick={() => removeValue(option.value)}\n >\n <X className=\"size-3.5\" />\n </button>\n </span>\n ))}\n </div>\n ) : null}\n\n <div className=\"flex items-center gap-2\">\n <Search className=\"size-4 text-white/34\" />\n <input\n value={query}\n onChange={(event) => {\n setQuery(event.target.value);\n setCreateError(null);\n setOpen(true);\n setHighlightedIndex(0);\n }}\n onFocus={() => setOpen(true)}\n onBlur={() => {\n window.setTimeout(() => setOpen(false), 120);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Backspace\" && !query && selectedValues.length > 0) {\n removeValue(selectedValues[selectedValues.length - 1]!);\n return;\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setOpen(true);\n setHighlightedIndex((current) => (filteredOptions.length === 0 ? 0 : Math.min(filteredOptions.length - 1, current + 1)));\n return;\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setHighlightedIndex((current) => Math.max(0, current - 1));\n return;\n }\n\n if (event.key === \"Escape\") {\n setOpen(false);\n return;\n }\n\n if (event.key !== \"Enter\") {\n return;\n }\n\n event.preventDefault();\n\n const highlighted = filteredOptions[highlightedIndex];\n if (highlighted) {\n selectValue(highlighted.value);\n return;\n }\n\n const exact = mergedOptions.find((option) => normalize(option.label) === normalizedQuery);\n if (exact && !selectedValues.includes(exact.value)) {\n selectValue(exact.value);\n return;\n }\n\n void createValue();\n }}\n placeholder={placeholder}\n className=\"min-w-0 flex-1 bg-transparent text-sm text-white placeholder:text-white/34 focus:outline-none\"\n />\n </div>\n </div>\n\n {open ? (\n <div className=\"absolute top-full z-20 mt-1.5 max-h-64 w-full overflow-y-auto rounded-[22px] border border-white/10 bg-[rgba(10,15,27,0.96)] p-2 shadow-[0_26px_60px_rgba(4,8,18,0.32)] backdrop-blur-xl\">\n {filteredOptions.map((option, index) => (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"flex w-full items-start justify-between gap-3 rounded-[18px] px-3 py-2.5 text-left transition\",\n index === highlightedIndex ? \"bg-white/[0.1] text-white\" : \"text-white/70 hover:bg-white/[0.06] hover:text-white\"\n )}\n onMouseEnter={() => setHighlightedIndex(index)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectValue(option.value)}\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">\n {option.kind ? (\n <EntityBadge kind={option.kind} label={option.label} compact gradient={false} />\n ) : option.menuBadge ? (\n option.menuBadge\n ) : option.badge ? (\n option.badge\n ) : (\n option.label\n )}\n </div>\n {option.description ? <div className=\"mt-1 text-xs leading-5 text-white/46\">{option.description}</div> : null}\n </div>\n </button>\n ))}\n\n {!hasExactMatch && normalizedQuery && onCreate ? (\n <button\n type=\"button\"\n disabled={pendingCreate}\n className=\"mt-1 flex w-full items-center gap-2 rounded-[18px] px-3 py-2.5 text-left text-sm text-[var(--secondary)] transition hover:bg-white/[0.06] disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => void createValue()}\n >\n <Plus className=\"size-4\" />\n <span className=\"truncate\">\n {pendingCreate ? \"Creating…\" : `${createLabel} \"${query.trim()}\"`}\n </span>\n </button>\n ) : null}\n\n {filteredOptions.length === 0 && (!normalizedQuery || hasExactMatch || !onCreate) ? (\n <div className=\"px-3 py-2.5 text-sm text-white/42\">{emptyMessage}</div>\n ) : null}\n </div>\n ) : null}\n\n {createError ? <div className=\"text-sm text-rose-300\">{createError}</div> : null}\n </div>\n );\n}\n","import { Link } from \"react-router-dom\";\nimport { ArrowRight } from \"lucide-react\";\nimport type { Behavior } from \"@/lib/psyche-types\";\n\nexport function ReturnPathStrip({\n entries\n}: {\n entries: Array<{\n id: string;\n title: string;\n summary: string;\n href: string;\n tone: Behavior[\"kind\"];\n }>;\n}) {\n const toneClasses: Record<Behavior[\"kind\"], string> = {\n away: \"border-rose-400/20 bg-[rgba(251,113,133,0.08)]\",\n committed: \"border-emerald-400/20 bg-[rgba(110,231,183,0.08)]\",\n recovery: \"border-amber-400/20 bg-[rgba(251,191,36,0.08)]\"\n };\n\n return (\n <div className=\"grid gap-3 lg:grid-cols-3\">\n {entries.map((entry) => (\n <Link key={entry.id} to={entry.href} className={`rounded-[22px] border px-4 py-4 transition hover:-translate-y-0.5 ${toneClasses[entry.tone]}`}>\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/40\">{entry.tone}</div>\n <div className=\"mt-2 font-medium text-white\">{entry.title}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{entry.summary}</div>\n <div className=\"mt-4 inline-flex items-center gap-2 text-sm text-white/54\">\n Open\n <ArrowRight className=\"size-3.5\" />\n </div>\n </Link>\n ))}\n </div>\n );\n}\n","import type { SchemaCatalogEntry } from \"./psyche-types\";\n\nexport type SchemaType = SchemaCatalogEntry[\"schemaType\"];\n\nconst schemaTypeLabelMap: Record<SchemaType, string> = {\n maladaptive: \"Maladaptive schema\",\n adaptive: \"Adaptive schema\"\n};\n\nconst schemaTypeHelpMap: Record<SchemaType, string> = {\n maladaptive: \"A recurring pressure pattern that can distort how you interpret situations or respond.\",\n adaptive: \"A stable healthy belief pattern you want to strengthen and rely on.\"\n};\n\nconst schemaFamilyLabelMap: Record<string, string> = {\n disconnection_rejection: \"Disconnection & rejection\",\n impaired_autonomy: \"Autonomy & competence\",\n other_directedness: \"Boundaries & mutuality\",\n overvigilance_inhibition: \"Standards & inhibition\",\n healthy_selfhood: \"Healthy selfhood\"\n};\n\nexport function getSchemaTypeLabel(schemaType: SchemaType) {\n return schemaTypeLabelMap[schemaType];\n}\n\nexport function getSchemaTypeHelpText(schemaType: SchemaType) {\n return schemaTypeHelpMap[schemaType];\n}\n\nexport function getSchemaFamilyLabel(family: string) {\n return schemaFamilyLabelMap[family] ?? family.replaceAll(\"_\", \" \");\n}\n\nexport function getSchemaVisual(schemaType: SchemaType) {\n if (schemaType === \"adaptive\") {\n return {\n sectionTone: \"border-emerald-400/14 bg-[linear-gradient(180deg,rgba(26,53,48,0.72),rgba(10,18,30,0.92))]\",\n sectionEyebrow: \"text-emerald-200/84\",\n cardTone: \"border-emerald-400/14 bg-[linear-gradient(180deg,rgba(28,63,56,0.44),rgba(14,24,36,0.92))]\",\n badgeTone: \"border-emerald-300/18 bg-[linear-gradient(135deg,rgba(16,185,129,0.18),rgba(56,189,248,0.12))] text-emerald-50\",\n subtleBadgeTone: \"border-emerald-300/12 bg-[rgba(16,185,129,0.1)] text-emerald-100/88\",\n countLabel: \"support links\",\n linkSummary: \"linked strengthening belief\",\n emptyCopy: \"No adaptive schema is linked yet. Add one when you want to capture the healthier pattern you are building from.\"\n };\n }\n\n return {\n sectionTone: \"border-fuchsia-400/14 bg-[linear-gradient(180deg,rgba(44,28,58,0.72),rgba(10,18,30,0.92))]\",\n sectionEyebrow: \"text-fuchsia-200/84\",\n cardTone: \"border-violet-400/14 bg-[linear-gradient(180deg,rgba(48,33,68,0.44),rgba(14,18,34,0.92))]\",\n badgeTone: \"border-rose-300/18 bg-[linear-gradient(135deg,rgba(244,63,94,0.16),rgba(168,85,247,0.12))] text-rose-50\",\n subtleBadgeTone: \"border-rose-300/12 bg-[rgba(244,63,94,0.1)] text-rose-100/88\",\n countLabel: \"linked records\",\n linkSummary: \"linked belief\",\n emptyCopy: \"No maladaptive schema is linked yet. Add one when you want to capture the recurring old pattern clearly.\"\n };\n}\n\nfunction normalizeSchemaLink(value: string) {\n return value.trim().toLowerCase();\n}\n\nexport function matchesSchemaLink(schema: SchemaCatalogEntry, value: string) {\n const normalized = normalizeSchemaLink(value);\n return [schema.id, schema.slug, schema.title].some((candidate) => normalizeSchemaLink(candidate) === normalized);\n}\n\nexport function findSchemaForLink(value: string, schemas: SchemaCatalogEntry[]) {\n return schemas.find((schema) => matchesSchemaLink(schema, value)) ?? null;\n}\n\nexport function isSchemaSelected(values: string[], schema: SchemaCatalogEntry) {\n return values.some((value) => matchesSchemaLink(schema, value));\n}\n\nexport function toggleSchemaSelection(values: string[], schema: SchemaCatalogEntry) {\n const next = values.filter((value) => !matchesSchemaLink(schema, value));\n return next.length === values.length ? [...next, schema.id] : next;\n}\n","import { cn } from \"@/lib/utils\";\nimport { getSchemaTypeLabel, getSchemaVisual, type SchemaType } from \"@/lib/schema-visuals\";\n\nexport function SchemaBadge({\n label,\n schemaType,\n compact = false,\n showType = false,\n className\n}: {\n label: string;\n schemaType: SchemaType;\n compact?: boolean;\n showType?: boolean;\n className?: string;\n}) {\n const visual = getSchemaVisual(schemaType);\n\n return (\n <span\n className={cn(\n \"inline-flex max-w-full min-w-0 items-center gap-2 rounded-full border px-3 py-1.5 text-sm leading-tight shadow-[inset_0_1px_0_rgba(255,255,255,0.04)]\",\n compact ? \"min-h-8\" : \"min-h-9\",\n visual.badgeTone,\n className\n )}\n >\n {showType ? <span className=\"text-[11px] uppercase tracking-[0.16em] text-white/58\">{getSchemaTypeLabel(schemaType)}</span> : null}\n <span className=\"min-w-0 break-words whitespace-normal\">{label}</span>\n </span>\n );\n}\n","import { useEffect } from \"react\";\n\nfunction escapeFocusValue(value: string) {\n return value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"');\n}\n\nexport function usePsycheFocusTarget(focusId: string | null) {\n useEffect(() => {\n if (!focusId || typeof document === \"undefined\") {\n return;\n }\n\n const frame = window.requestAnimationFrame(() => {\n const target = document.querySelector<HTMLElement>(`[data-psyche-focus-id=\"${escapeFocusValue(focusId)}\"]`);\n if (!target) {\n return;\n }\n\n target.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"nearest\"\n });\n });\n\n return () => window.cancelAnimationFrame(frame);\n }, [focusId]);\n}\n\nexport function psycheFocusClass(isFocused: boolean) {\n return isFocused\n ? \"border-[rgba(125,211,252,0.28)] bg-[linear-gradient(180deg,rgba(125,211,252,0.14),rgba(255,255,255,0.06))] shadow-[0_24px_60px_rgba(56,189,248,0.14)]\"\n : \"\";\n}\n","import type { QueryClient } from \"@tanstack/react-query\";\n\nexport function prependEntityToCollection<T extends { id: string }, K extends string>(\n queryClient: QueryClient,\n queryKey: readonly unknown[],\n field: K,\n item: T\n) {\n queryClient.setQueryData<Record<K, T[]> | undefined>(queryKey, (current) => {\n const existing = current?.[field] ?? [];\n if (existing.some((entry) => entry.id === item.id)) {\n return current;\n }\n\n return {\n ...(current ?? {}),\n [field]: [item, ...existing]\n } as Record<K, T[]>;\n });\n}\n","import { z } from \"zod\";\n\nconst trimmed = z.string().trim();\nconst nonEmpty = trimmed.min(1);\nconst uniqueStrings = z.array(nonEmpty).transform((values) => Array.from(new Set(values)));\n\nexport const psycheValueSchema = z.object({\n title: nonEmpty,\n description: trimmed,\n valuedDirection: nonEmpty,\n whyItMatters: trimmed,\n linkedGoalIds: z.array(z.string()).default([]),\n linkedProjectIds: z.array(z.string()).default([]),\n linkedTaskIds: z.array(z.string()).default([]),\n committedActions: z.array(trimmed).default([])\n});\n\nexport const behaviorPatternSchema = z.object({\n title: nonEmpty,\n description: trimmed,\n targetBehavior: nonEmpty,\n cueContexts: z.array(trimmed).default([]),\n shortTermPayoff: trimmed,\n longTermCost: trimmed,\n preferredResponse: nonEmpty,\n linkedValueIds: z.array(z.string()).default([]),\n linkedSchemaLabels: uniqueStrings.default([]),\n linkedModeIds: z.array(z.string()).default([]),\n linkedBeliefIds: z.array(z.string()).default([])\n});\n\nexport const behaviorSchema = z.object({\n kind: z.enum([\"away\", \"committed\", \"recovery\"]),\n title: nonEmpty,\n description: trimmed,\n commonCues: z.array(trimmed).default([]),\n urgeStory: trimmed,\n shortTermPayoff: trimmed,\n longTermCost: trimmed,\n replacementMove: trimmed,\n repairPlan: trimmed,\n linkedPatternIds: z.array(z.string()).default([]),\n linkedValueIds: z.array(z.string()).default([]),\n linkedSchemaIds: z.array(z.string()).default([]),\n linkedModeIds: z.array(z.string()).default([])\n});\n\nexport const beliefEntrySchema = z.object({\n schemaId: z.string().nullable(),\n statement: nonEmpty,\n beliefType: z.enum([\"absolute\", \"conditional\"]),\n originNote: trimmed,\n confidence: z.number().int().min(0).max(100),\n evidenceFor: z.array(trimmed).default([]),\n evidenceAgainst: z.array(trimmed).default([]),\n flexibleAlternative: trimmed,\n linkedValueIds: z.array(z.string()).default([]),\n linkedBehaviorIds: z.array(z.string()).default([]),\n linkedModeIds: z.array(z.string()).default([]),\n linkedReportIds: z.array(z.string()).default([])\n});\n\nexport const modeProfileSchema = z.object({\n family: z.enum([\"coping\", \"child\", \"critic_parent\", \"healthy_adult\", \"happy_child\"]),\n archetype: trimmed,\n title: nonEmpty,\n persona: trimmed,\n imagery: trimmed,\n symbolicForm: trimmed,\n facialExpression: trimmed,\n fear: trimmed,\n burden: trimmed,\n protectiveJob: trimmed,\n originContext: trimmed,\n firstAppearanceAt: z.string().trim().nullable(),\n linkedPatternIds: z.array(z.string()).default([]),\n linkedBehaviorIds: z.array(z.string()).default([]),\n linkedValueIds: z.array(z.string()).default([])\n});\n\nexport const modeGuideSessionSchema = z.object({\n summary: nonEmpty,\n answers: z.array(\n z.object({\n questionKey: nonEmpty,\n value: nonEmpty\n })\n ).min(1)\n});\n\nexport const eventTypeSchema = z.object({\n label: nonEmpty,\n description: trimmed\n});\n\nexport const emotionDefinitionSchema = z.object({\n label: nonEmpty,\n description: trimmed,\n category: trimmed\n});\n\nexport const triggerEmotionSchema = z.object({\n id: nonEmpty,\n emotionDefinitionId: z.string().nullable(),\n label: nonEmpty,\n intensity: z.number().int().min(0).max(100),\n note: trimmed\n});\n\nexport const triggerThoughtSchema = z.object({\n id: nonEmpty,\n text: nonEmpty,\n parentMode: trimmed,\n criticMode: trimmed,\n beliefId: z.string().nullable()\n});\n\nexport const triggerBehaviorSchema = z.object({\n id: nonEmpty,\n text: nonEmpty,\n mode: trimmed,\n behaviorId: z.string().nullable()\n});\n\nexport const modeTimelineEntrySchema = z.object({\n id: nonEmpty,\n stage: nonEmpty,\n modeId: z.string().nullable(),\n label: nonEmpty,\n note: trimmed\n});\n\nexport const triggerReportSchema = z.object({\n title: nonEmpty,\n status: z.enum([\"draft\", \"reviewed\", \"integrated\"]).default(\"draft\"),\n eventTypeId: z.string().nullable(),\n customEventType: trimmed,\n eventSituation: nonEmpty,\n occurredAt: z.string().trim().nullable(),\n emotions: z.array(triggerEmotionSchema).default([]),\n thoughts: z.array(triggerThoughtSchema).default([]),\n behaviors: z.array(triggerBehaviorSchema).default([]),\n consequences: z.object({\n selfShortTerm: z.array(trimmed).default([]),\n selfLongTerm: z.array(trimmed).default([]),\n othersShortTerm: z.array(trimmed).default([]),\n othersLongTerm: z.array(trimmed).default([])\n }),\n linkedPatternIds: z.array(z.string()).default([]),\n linkedValueIds: z.array(z.string()).default([]),\n linkedGoalIds: z.array(z.string()).default([]),\n linkedProjectIds: z.array(z.string()).default([]),\n linkedTaskIds: z.array(z.string()).default([]),\n linkedBehaviorIds: z.array(z.string()).default([]),\n linkedBeliefIds: z.array(z.string()).default([]),\n linkedModeIds: z.array(z.string()).default([]),\n modeOverlays: z.array(trimmed).default([]),\n schemaLinks: z.array(trimmed).default([]),\n modeTimeline: z.array(modeTimelineEntrySchema).default([]),\n nextMoves: z.array(trimmed).default([])\n});\n\nexport const commentSchema = z.object({\n entityType: nonEmpty,\n entityId: nonEmpty,\n anchorKey: trimmed.nullable().optional(),\n body: nonEmpty,\n author: trimmed.nullable().optional()\n});\n\nexport type PsycheValueInput = z.infer<typeof psycheValueSchema>;\nexport type BehaviorPatternInput = z.infer<typeof behaviorPatternSchema>;\nexport type BehaviorInput = z.infer<typeof behaviorSchema>;\nexport type BeliefEntryInput = z.infer<typeof beliefEntrySchema>;\nexport type ModeProfileInput = z.infer<typeof modeProfileSchema>;\nexport type ModeGuideSessionInput = z.infer<typeof modeGuideSessionSchema>;\nexport type EventTypeInput = z.infer<typeof eventTypeSchema>;\nexport type EmotionDefinitionInput = z.infer<typeof emotionDefinitionSchema>;\nexport type TriggerReportInput = z.infer<typeof triggerReportSchema>;\nexport type CommentInput = z.infer<typeof commentSchema>;\n","import { useEffect, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { AtlasPanel } from \"@/components/psyche/atlas-panel\";\nimport { EntityLinkMultiSelect, type EntityLinkOption } from \"@/components/psyche/entity-link-multiselect\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { ReturnPathStrip } from \"@/components/psyche/return-path-strip\";\nimport { SchemaBadge } from \"@/components/psyche/schema-badge\";\nimport { psycheFocusClass, usePsycheFocusTarget } from \"@/components/psyche/use-psyche-focus-target\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { prependEntityToCollection } from \"@/lib/query-cache\";\nimport { behaviorSchema, type BehaviorInput } from \"@/lib/psyche-schemas\";\nimport type { Behavior, BehaviorPattern, ModeProfile, PsycheValue, SchemaCatalogEntry } from \"@/lib/psyche-types\";\nimport { getSchemaFamilyLabel } from \"@/lib/schema-visuals\";\nimport { createBehavior, createBehaviorPattern, createMode, createPsycheValue, listBehaviorPatterns, listBehaviors, listModes, listPsycheValues, listSchemaCatalog, patchBehavior } from \"@/lib/api\";\n\nconst DEFAULT_BEHAVIOR_INPUT: BehaviorInput = {\n kind: \"away\",\n title: \"\",\n description: \"\",\n commonCues: [],\n urgeStory: \"\",\n shortTermPayoff: \"\",\n longTermCost: \"\",\n replacementMove: \"\",\n repairPlan: \"\",\n linkedPatternIds: [],\n linkedValueIds: [],\n linkedSchemaIds: [],\n linkedModeIds: []\n};\n\nfunction behaviorToInput(behavior: Behavior): BehaviorInput {\n return {\n kind: behavior.kind,\n title: behavior.title,\n description: behavior.description,\n commonCues: behavior.commonCues,\n urgeStory: behavior.urgeStory,\n shortTermPayoff: behavior.shortTermPayoff,\n longTermCost: behavior.longTermCost,\n replacementMove: behavior.replacementMove,\n repairPlan: behavior.repairPlan,\n linkedPatternIds: behavior.linkedPatternIds,\n linkedValueIds: behavior.linkedValueIds,\n linkedSchemaIds: behavior.linkedSchemaIds,\n linkedModeIds: behavior.linkedModeIds\n };\n}\n\nconst kindTitleMap: Record<Behavior[\"kind\"], string> = {\n away: \"Away moves\",\n committed: \"Committed actions\",\n recovery: \"Recovery moves\"\n};\n\nexport function PsycheBehaviorsPage() {\n const queryClient = useQueryClient();\n const [searchParams, setSearchParams] = useSearchParams();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editingBehavior, setEditingBehavior] = useState<Behavior | null>(null);\n const [draft, setDraft] = useState<BehaviorInput>(DEFAULT_BEHAVIOR_INPUT);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const behaviorsQuery = useQuery({ queryKey: [\"forge-psyche-behaviors\"], queryFn: listBehaviors });\n const patternsQuery = useQuery({ queryKey: [\"forge-psyche-patterns\"], queryFn: listBehaviorPatterns });\n const valuesQuery = useQuery({ queryKey: [\"forge-psyche-values\"], queryFn: listPsycheValues });\n const schemasQuery = useQuery({ queryKey: [\"forge-psyche-schema-catalog\"], queryFn: listSchemaCatalog });\n const modesQuery = useQuery({ queryKey: [\"forge-psyche-modes\"], queryFn: listModes });\n\n const behaviors = behaviorsQuery.data?.behaviors ?? [];\n const patterns = patternsQuery.data?.patterns ?? [];\n const values = valuesQuery.data?.values ?? [];\n const schemas = schemasQuery.data?.schemas ?? [];\n const modes = modesQuery.data?.modes ?? [];\n const focusedBehaviorId = searchParams.get(\"focus\");\n\n usePsycheFocusTarget(focusedBehaviorId);\n\n useEffect(() => {\n if (searchParams.get(\"create\") === \"1\") {\n setDialogOpen(true);\n setEditingBehavior(null);\n setDraft(DEFAULT_BEHAVIOR_INPUT);\n const next = new URLSearchParams(searchParams);\n next.delete(\"create\");\n setSearchParams(next, { replace: true });\n }\n }, [searchParams, setSearchParams]);\n\n const saveMutation = useMutation({\n mutationFn: async (input: BehaviorInput) => {\n const parsed = behaviorSchema.parse(input);\n if (editingBehavior) {\n return patchBehavior(editingBehavior.id, parsed);\n }\n return createBehavior(parsed);\n },\n onSuccess: async () => {\n setDialogOpen(false);\n setEditingBehavior(null);\n setDraft(DEFAULT_BEHAVIOR_INPUT);\n setSubmitError(null);\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-behaviors\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] })\n ]);\n }\n });\n\n const patternOptions: EntityLinkOption[] = patterns.map((pattern: BehaviorPattern) => ({\n value: pattern.id,\n label: pattern.title,\n description: pattern.preferredResponse || pattern.targetBehavior,\n kind: \"pattern\"\n }));\n const valueOptions: EntityLinkOption[] = values.map((entry: PsycheValue) => ({\n value: entry.id,\n label: entry.title,\n description: entry.valuedDirection,\n kind: \"value\"\n }));\n const schemaOptions: EntityLinkOption[] = schemas.map((schema: SchemaCatalogEntry) => ({\n value: schema.id,\n label: schema.title,\n description: `${schema.description} ${getSchemaFamilyLabel(schema.family)}`,\n searchText: `${schema.slug} ${schema.family} ${schema.schemaType}`,\n badge: <SchemaBadge label={schema.title} schemaType={schema.schemaType} compact />,\n menuBadge: <SchemaBadge label={schema.title} schemaType={schema.schemaType} compact />\n }));\n const modeOptions: EntityLinkOption[] = modes.map((mode: ModeProfile) => ({\n value: mode.id,\n label: mode.title,\n description: mode.archetype || mode.family,\n kind: \"mode\"\n }));\n\n const createLinkedPattern = async (title: string) => {\n const { pattern } = await createBehaviorPattern({\n title,\n description: \"\",\n targetBehavior: title,\n cueContexts: [],\n shortTermPayoff: \"\",\n longTermCost: \"\",\n preferredResponse: \"\",\n linkedValueIds: [],\n linkedSchemaLabels: [],\n linkedModeIds: [],\n linkedBeliefIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-patterns\"], \"patterns\", pattern);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return {\n value: pattern.id,\n label: pattern.title,\n description: pattern.preferredResponse || pattern.targetBehavior,\n kind: \"pattern\"\n } satisfies EntityLinkOption;\n };\n\n const createLinkedValue = async (title: string) => {\n const { value } = await createPsycheValue({\n title,\n description: \"\",\n valuedDirection: title,\n whyItMatters: \"\",\n linkedGoalIds: [],\n linkedProjectIds: [],\n linkedTaskIds: [],\n committedActions: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-values\"], \"values\", value);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return {\n value: value.id,\n label: value.title,\n description: value.valuedDirection,\n kind: \"value\"\n } satisfies EntityLinkOption;\n };\n\n const createLinkedMode = async (title: string) => {\n const { mode } = await createMode({\n family: \"coping\",\n archetype: \"\",\n title,\n persona: \"\",\n imagery: \"\",\n symbolicForm: \"\",\n facialExpression: \"\",\n fear: \"\",\n burden: \"\",\n protectiveJob: \"\",\n originContext: \"\",\n firstAppearanceAt: null,\n linkedPatternIds: [],\n linkedBehaviorIds: [],\n linkedValueIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-modes\"], \"modes\", mode);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return {\n value: mode.id,\n label: mode.title,\n description: mode.archetype || mode.family,\n kind: \"mode\"\n } satisfies EntityLinkOption;\n };\n\n const steps: Array<QuestionFlowStep<BehaviorInput>> = [\n {\n id: \"behavior\",\n eyebrow: \"Behavior\",\n title: \"Describe the move or urge in plain language\",\n description: \"Start with the behavior itself so the map reads like something you can instantly recognize in real life.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Behavior title\">\n <Input value={value.title} onChange={(event) => setValue({ title: event.target.value })} placeholder=\"Scroll to numb the impact\" />\n </FlowField>\n <FlowField label=\"What does the move look like?\">\n <Textarea value={value.description} onChange={(event) => setValue({ description: event.target.value })} placeholder=\"Describe the move the way you would recognize it in the moment, not in therapist shorthand.\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"context\",\n eyebrow: \"Context\",\n title: \"Capture the cue, the pull, and the immediate payoff\",\n description: \"Make the move readable as a real pattern instead of a label.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Common cues\">\n <Textarea\n value={value.commonCues.join(\"\\n\")}\n onChange={(event) =>\n setValue({\n commonCues: event.target.value\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n })\n }\n placeholder={\"One line per cue\\nLate-night ambiguity\\nFeedback after a hard week\"}\n />\n </FlowField>\n <FlowField label=\"What inner push or story shows up?\">\n <Textarea value={value.urgeStory} onChange={(event) => setValue({ urgeStory: event.target.value })} placeholder=\"What inner push or justification tends to appear?\" />\n </FlowField>\n <FlowField label=\"What do you get right away from this move?\">\n <Textarea value={value.shortTermPayoff} onChange={(event) => setValue({ shortTermPayoff: event.target.value })} placeholder=\"What relief, certainty, distance, or control does it give in the short term?\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"classification\",\n eyebrow: \"Classification\",\n title: \"Now classify the move and define the return path\",\n description: \"Once the move is clear, decide whether it is an away move, a committed action, or a recovery path.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Move type\">\n <div className=\"grid gap-3 md:grid-cols-3\">\n {([\"away\", \"committed\", \"recovery\"] as const).map((kind) => (\n <button\n key={kind}\n type=\"button\"\n className={`rounded-[22px] border px-4 py-4 text-left transition ${value.kind === kind ? \"border-white/20 bg-white/[0.12] text-white\" : \"border-white/8 bg-white/[0.04] text-white/62 hover:bg-white/[0.07]\"}`}\n onClick={() => setValue({ kind })}\n >\n {kindTitleMap[kind]}\n </button>\n ))}\n </div>\n </FlowField>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField label=\"What does it cost over time?\">\n <Textarea value={value.longTermCost} onChange={(event) => setValue({ longTermCost: event.target.value })} placeholder=\"What does this move cost over time?\" />\n </FlowField>\n <FlowField label=\"What move should replace or steady it?\">\n <Textarea value={value.replacementMove} onChange={(event) => setValue({ replacementMove: event.target.value })} placeholder=\"What move should replace this one when possible?\" />\n </FlowField>\n </div>\n <FlowField label=\"If the slip happens, how do you repair and return?\">\n <Textarea value={value.repairPlan} onChange={(event) => setValue({ repairPlan: event.target.value })} placeholder=\"Describe the repair path without shame or collapse.\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"links\",\n eyebrow: \"Links\",\n title: \"Attach the move to patterns, values, schemas, and modes\",\n description: \"This turns the move into part of the full graphical psyche system.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Linked patterns\">\n <EntityLinkMultiSelect\n options={patternOptions}\n selectedValues={value.linkedPatternIds}\n onChange={(linkedPatternIds) => setValue({ linkedPatternIds })}\n placeholder=\"Search or create a pattern…\"\n emptyMessage=\"No patterns match yet.\"\n createLabel=\"Create pattern\"\n onCreate={createLinkedPattern}\n />\n </FlowField>\n <FlowField label=\"Linked values\">\n <EntityLinkMultiSelect\n options={valueOptions}\n selectedValues={value.linkedValueIds}\n onChange={(linkedValueIds) => setValue({ linkedValueIds })}\n placeholder=\"Search or create a value…\"\n emptyMessage=\"No values match yet.\"\n createLabel=\"Create value\"\n onCreate={createLinkedValue}\n />\n </FlowField>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField label=\"Linked schemas\">\n <EntityLinkMultiSelect\n options={schemaOptions}\n selectedValues={value.linkedSchemaIds}\n onChange={(linkedSchemaIds) => setValue({ linkedSchemaIds })}\n placeholder=\"Search schema themes…\"\n emptyMessage=\"No schema themes match.\"\n />\n </FlowField>\n <FlowField label=\"Linked modes\">\n <EntityLinkMultiSelect\n options={modeOptions}\n selectedValues={value.linkedModeIds}\n onChange={(linkedModeIds) => setValue({ linkedModeIds })}\n placeholder=\"Search or create a mode…\"\n emptyMessage=\"No modes match yet.\"\n createLabel=\"Create mode\"\n onCreate={createLinkedMode}\n />\n </FlowField>\n </div>\n </>\n )\n }\n ];\n\n if (behaviorsQuery.isLoading || patternsQuery.isLoading || valuesQuery.isLoading || schemasQuery.isLoading || modesQuery.isLoading) {\n return <LoadingState eyebrow=\"Behaviors\" title=\"Loading behaviors\" description=\"Getting behaviors, patterns, values, schemas, and modes ready.\" />;\n }\n\n const routeError = behaviorsQuery.error ?? patternsQuery.error ?? valuesQuery.error ?? schemasQuery.error ?? modesQuery.error;\n if (routeError) {\n return <ErrorState eyebrow=\"Psyche behaviors\" error={routeError} onRetry={() => void Promise.all([behaviorsQuery.refetch(), patternsQuery.refetch(), valuesQuery.refetch(), schemasQuery.refetch(), modesQuery.refetch()])} />;\n }\n\n const grouped = {\n away: behaviors.filter((behavior) => behavior.kind === \"away\"),\n committed: behaviors.filter((behavior) => behavior.kind === \"committed\"),\n recovery: behaviors.filter((behavior) => behavior.kind === \"recovery\")\n };\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n entityKind=\"behavior\"\n title={<EntityName kind=\"behavior\" label=\"Behaviors\" variant=\"heading\" size=\"lg\" />}\n description=\"Group behaviors by what pulls you away, what moves you toward your values, and what helps you recover after a slip.\"\n badge={`${behaviors.length} mapped`}\n actions={\n <Button\n onClick={() => {\n setEditingBehavior(null);\n setDraft(DEFAULT_BEHAVIOR_INPUT);\n setDialogOpen(true);\n }}\n >\n Add behavior\n </Button>\n }\n />\n <PsycheSectionNav />\n\n <AtlasPanel\n eyebrow=\"Overview\"\n title=\"Behavior summary\"\n description=\"This summary keeps the three behavior types visible together: away, committed, and recovery.\"\n tone=\"amber\"\n >\n <ReturnPathStrip\n entries={[\n {\n id: \"away\",\n title: grouped.away[0]?.title ?? \"No away move mapped yet\",\n summary: grouped.away[0]?.replacementMove || \"Map the move that tends to pull you away first.\",\n href: \"#behavior-columns\",\n tone: \"away\"\n },\n {\n id: \"committed\",\n title: grouped.committed[0]?.title ?? \"No committed action mapped yet\",\n summary: grouped.committed[0]?.replacementMove || \"Map the move you want to practice instead.\",\n href: \"#behavior-columns\",\n tone: \"committed\"\n },\n {\n id: \"recovery\",\n title: grouped.recovery[0]?.title ?? \"No recovery move mapped yet\",\n summary: grouped.recovery[0]?.repairPlan || \"Map how you return after a slip without turning it into collapse.\",\n href: \"#behavior-columns\",\n tone: \"recovery\"\n }\n ]}\n />\n </AtlasPanel>\n\n <AtlasPanel\n eyebrow=\"Behaviors\"\n title=\"Behaviors by type\"\n description=\"Use these columns to separate what pulls you off course, what helps you move toward your values, and what helps you recover.\"\n tone=\"default\"\n >\n <div id=\"behavior-columns\" className=\"grid gap-4 xl:grid-cols-3\">\n {([\"away\", \"committed\", \"recovery\"] as const).map((kind) => (\n <div key={kind} className=\"grid gap-3 rounded-[24px] bg-white/[0.04] p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-medium text-white\">{kindTitleMap[kind]}</div>\n <Badge>{grouped[kind].length}</Badge>\n </div>\n {grouped[kind].length === 0 ? (\n <div className=\"flex\">\n <Button variant=\"secondary\" onClick={() => setDialogOpen(true)}>\n Add {kind === \"away\" ? \"away move\" : kind === \"committed\" ? \"committed action\" : \"recovery move\"}\n </Button>\n </div>\n ) : (\n grouped[kind].map((behavior) => (\n <button\n key={behavior.id}\n type=\"button\"\n data-psyche-focus-id={behavior.id}\n className={`rounded-[22px] border border-white/8 bg-white/[0.04] p-4 text-left transition hover:bg-white/[0.08] ${psycheFocusClass(focusedBehaviorId === behavior.id)}`}\n onClick={() => {\n setEditingBehavior(behavior);\n setDraft(behaviorToInput(behavior));\n setDialogOpen(true);\n }}\n >\n <div className=\"font-medium text-white\">{behavior.title}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{behavior.description}</div>\n <div className=\"mt-3 text-sm text-white/46\">{behavior.replacementMove || behavior.repairPlan || \"No recovery step recorded yet.\"}</div>\n </button>\n ))\n )}\n </div>\n ))}\n </div>\n </AtlasPanel>\n\n <QuestionFlowDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n eyebrow=\"Behavior\"\n title={editingBehavior ? \"Refine behavior path\" : \"Create behavior\"}\n description=\"Use this guided flow to describe the behavior, when it shows up, what it gives you, and what kind of move it is.\"\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel={editingBehavior ? \"Save behavior\" : \"Create behavior\"}\n pending={saveMutation.isPending}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const parsed = behaviorSchema.safeParse(draft);\n if (!parsed.success) {\n setSubmitError(\"This behavior still needs a kind and a title before it can be saved.\");\n return;\n }\n\n try {\n await saveMutation.mutateAsync(parsed.data);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Unable to save this behavior right now.\");\n }\n }}\n />\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"react-router-dom\";\nimport { buildGoalGravityScene } from \"@/components/psyche/goal-gravity-scene\";\nimport { PsycheGraphCanvas } from \"@/components/psyche/psyche-graph\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { getPsycheOverview } from \"@/lib/api\";\nimport { getEntityButtonClassName } from \"@/lib/entity-visuals\";\nimport { cn } from \"@/lib/utils\";\n\nexport function PsycheGoalMapPage() {\n const shell = useForgeShell();\n const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null);\n const overviewQuery = useQuery({\n queryKey: [\"forge-psyche-overview\"],\n queryFn: getPsycheOverview\n });\n\n const overview = overviewQuery.data?.overview;\n const clusters = useMemo(() => {\n if (!overview) {\n return [];\n }\n\n return shell.snapshot.goals.map((goal) => {\n const linkedValues = overview.values.filter((value) => value.linkedGoalIds.includes(goal.id));\n const linkedProjects = shell.snapshot.dashboard.projects.filter((project) => project.goalId === goal.id);\n const linkedReports = overview.reports.filter((report) => report.linkedGoalIds.includes(goal.id));\n const linkedBehaviors = overview.behaviors.filter((behavior) =>\n behavior.linkedValueIds.some((valueId) => linkedValues.some((value) => value.id === valueId))\n );\n const linkedBeliefs = overview.beliefs.filter((belief) =>\n belief.linkedValueIds.some((valueId) => linkedValues.some((value) => value.id === valueId))\n );\n\n return {\n goal,\n linkedValues,\n linkedProjects,\n linkedReports,\n linkedBehaviors,\n linkedBeliefs\n };\n });\n }, [overview, shell.snapshot.dashboard.projects, shell.snapshot.goals]);\n\n const scene = useMemo(() => buildGoalGravityScene(clusters), [clusters]);\n\n useEffect(() => {\n setSelectedNodeId(scene.defaultSelectedId);\n }, [scene.defaultSelectedId]);\n\n if (overviewQuery.isLoading) {\n return (\n <LoadingState\n eyebrow=\"Goal map\"\n title=\"Loading the gravity well\"\n description=\"Linking goals, values, reports, beliefs, behaviors, and projects back into execution.\"\n />\n );\n }\n\n if (overviewQuery.isError || !overview) {\n return <ErrorState eyebrow=\"Goal map\" error={overviewQuery.error ?? new Error(\"Forge returned an empty Psyche overview payload.\")} onRetry={() => void overviewQuery.refetch()} />;\n }\n\n const inspector = scene.inspectors[selectedNodeId ?? scene.defaultSelectedId] ?? scene.inspectors[scene.defaultSelectedId];\n\n return (\n <div className=\"grid min-w-0 gap-4\">\n <PageHero\n title=\"Goal Map\"\n titleText=\"Goal Map\"\n description=\"Values orbit each goal. Reports, beliefs, behaviors, and projects reveal where the orbit gets disrupted and how execution reconnects.\"\n badge={`${clusters.length} goal${clusters.length === 1 ? \"\" : \"s\"}`}\n actions={\n <>\n <Link to=\"/goals\" className=\"inline-flex min-h-10 min-w-max shrink-0 items-center justify-center rounded-full bg-white/[0.08] px-4 py-2 text-sm whitespace-nowrap text-white transition hover:bg-white/[0.12]\">\n Open goals\n </Link>\n <Link to=\"/psyche/reports?create=1\" className=\"inline-flex min-h-10 min-w-max shrink-0 items-center justify-center rounded-full bg-[rgba(125,211,252,0.16)] px-4 py-2 text-sm whitespace-nowrap text-white transition hover:bg-[rgba(125,211,252,0.22)]\">\n Reflect\n </Link>\n </>\n }\n />\n\n <PsycheSectionNav />\n\n <section className=\"grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1fr)_20rem]\">\n <PsycheGraphCanvas\n testId=\"goal-gravity-graph\"\n title=\"Life direction, value orbit, and execution field\"\n hint=\"Drag to inspect the whole field. Select any goal, value, belief, behavior, project, or report to see what it means and where to act next.\"\n nodes={scene.nodes}\n edges={scene.edges}\n fields={scene.fields}\n selectedNodeId={selectedNodeId}\n onSelectNode={setSelectedNodeId}\n minHeightClassName=\"min-h-[25rem] sm:min-h-[34rem] lg:min-h-[56rem]\"\n legend={[\n { label: \"Goals\", kind: \"goal\" },\n { label: \"Values\", kind: \"value\" },\n { label: \"Beliefs\", kind: \"belief\" },\n { label: \"Behaviors\", kind: \"behavior\" },\n { label: \"Projects\", kind: \"project\" },\n { label: \"Reports\", kind: \"report\" }\n ]}\n action={\n clusters.length === 0 ? (\n <Link to=\"/goals\" className=\"inline-flex min-h-10 min-w-max shrink-0 items-center justify-center rounded-[var(--radius-control)] bg-[linear-gradient(135deg,rgba(192,193,255,0.36),rgba(192,193,255,0.22))] px-4 py-2 text-sm font-medium whitespace-nowrap text-white\">\n Add first goal\n </Link>\n ) : (\n <Link to=\"/goals\" className=\"inline-flex min-h-10 min-w-max shrink-0 items-center justify-center rounded-[var(--radius-control)] bg-white/8 px-4 py-2 text-sm font-medium whitespace-nowrap text-white transition hover:bg-white/12\">\n Open goals\n </Link>\n )\n }\n />\n\n <Card className=\"min-w-0 h-fit xl:sticky xl:top-24\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {inspector.entityKind ? (\n <EntityBadge kind={inspector.entityKind} compact gradient={false} iconOnly />\n ) : (\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">{inspector.eyebrow}</div>\n )}\n </div>\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {inspector.entityKind ? (\n <EntityName kind={inspector.entityKind} label={inspector.title} variant=\"heading\" size=\"lg\" showKind={false} />\n ) : (\n <h2 className=\"font-display text-[clamp(1.35rem,2.2vw,2rem)] leading-none text-white\">{inspector.title}</h2>\n )}\n {!inspector.entityKind ? (\n <Badge className=\"bg-white/[0.08]\" style={{ color: \"white\" }}>\n {inspector.tone}\n </Badge>\n ) : null}\n </div>\n <p className=\"mt-3 text-sm leading-6 text-white/60\">{inspector.summary}</p>\n\n {inspector.stats.length > 0 ? (\n <div className=\"mt-4 grid gap-2\">\n {inspector.stats.map((stat) => (\n <div key={stat} className=\"rounded-[18px] bg-white/[0.04] px-3 py-3 text-sm text-white/68\">\n {stat}\n </div>\n ))}\n </div>\n ) : null}\n\n {inspector.chips.length > 0 ? (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {inspector.chips.map((chip) => (\n <Badge key={chip} className=\"bg-white/[0.08] text-white/74\">\n {chip}\n </Badge>\n ))}\n </div>\n ) : null}\n\n <div className=\"mt-5\">\n <Link\n to={inspector.href}\n className={cn(\n \"inline-flex min-h-11 w-full items-center justify-center rounded-[var(--radius-control)] px-4 py-2.5 text-sm font-medium whitespace-nowrap shadow-[0_12px_30px_rgba(192,193,255,0.08)]\",\n inspector.entityKind\n ? getEntityButtonClassName(inspector.entityKind, true)\n : \"bg-[linear-gradient(135deg,rgba(192,193,255,0.36),rgba(192,193,255,0.22))] text-white\"\n )}\n >\n {inspector.ctaLabel}\n </Link>\n </div>\n </Card>\n </section>\n </div>\n );\n}\n","import type { UseQueryResult } from \"@tanstack/react-query\";\n\nexport type QueryCollectionEntry = Pick<UseQueryResult<unknown, unknown>, \"error\" | \"isError\" | \"isLoading\" | \"isPending\" | \"refetch\">;\n\nfunction normalizeQueryError(error: unknown) {\n if (error instanceof Error) {\n return error;\n }\n if (typeof error === \"string\" && error.trim().length > 0) {\n return new Error(error);\n }\n return new Error(\"Forge could not complete the requested query collection.\");\n}\n\nexport function collectQueryCollectionState(queries: readonly QueryCollectionEntry[]) {\n const failingQuery = queries.find((query) => query.isError);\n\n return {\n isLoading: queries.some((query) => query.isPending || query.isLoading),\n error: failingQuery ? normalizeQueryError(failingQuery.error) : null\n };\n}\n\nexport async function retryQueryCollection(queries: readonly QueryCollectionEntry[]) {\n await Promise.all(queries.map((query) => query.refetch()));\n}\n","import { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useForm } from \"react-hook-form\";\nimport { Link } from \"react-router-dom\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { EmptyState, ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { createModeGuideSession, listModeGuideSessions } from \"@/lib/api\";\nimport { collectQueryCollectionState, retryQueryCollection } from \"@/lib/query-collection\";\nimport { modeGuideSessionSchema } from \"@/lib/psyche-schemas\";\nimport type { ModeGuideSessionInput } from \"@/lib/psyche-types\";\n\ntype GuideFormShape = {\n summary: string;\n copingResponse: string;\n childState: string;\n criticStyle: string;\n healthyContact: string;\n};\n\nconst OPTIONS = {\n copingResponse: [\n { value: \"fight\", label: \"Fight\" },\n { value: \"flight\", label: \"Flight\" },\n { value: \"freeze\", label: \"Freeze\" },\n { value: \"detach\", label: \"Detach\" },\n { value: \"comply\", label: \"Comply\" },\n { value: \"overcompensate\", label: \"Overcompensate\" },\n { value: \"none\", label: \"Mixed / unsure\" }\n ],\n childState: [\n { value: \"vulnerable\", label: \"Vulnerable\" },\n { value: \"angry\", label: \"Angry\" },\n { value: \"impulsive\", label: \"Impulsive\" },\n { value: \"lonely\", label: \"Lonely\" },\n { value: \"ashamed\", label: \"Ashamed\" },\n { value: \"none\", label: \"Mixed / unsure\" }\n ],\n criticStyle: [\n { value: \"demanding\", label: \"Demanding\" },\n { value: \"punitive\", label: \"Punitive\" },\n { value: \"none\", label: \"Neither / unclear\" }\n ],\n healthyContact: [\n { value: \"healthy_adult\", label: \"Healthy adult\" },\n { value: \"happy_child\", label: \"Happy child\" },\n { value: \"none\", label: \"Hard to access right now\" }\n ]\n} as const;\n\nexport function PsycheModeGuidePage() {\n const queryClient = useQueryClient();\n const sessionsQuery = useQuery({\n queryKey: [\"forge-psyche-mode-guide-sessions\"],\n queryFn: listModeGuideSessions\n });\n const form = useForm<GuideFormShape>({\n defaultValues: {\n summary: \"What mode was most present in this moment?\",\n copingResponse: \"none\",\n childState: \"none\",\n criticStyle: \"none\",\n healthyContact: \"none\"\n }\n });\n\n const guideMutation = useMutation({\n mutationFn: async (values: GuideFormShape) => {\n const payload = modeGuideSessionSchema.parse({\n summary: values.summary,\n answers: [\n { questionKey: \"coping_response\", value: values.copingResponse },\n { questionKey: \"child_state\", value: values.childState },\n { questionKey: \"critic_style\", value: values.criticStyle },\n { questionKey: \"healthy_contact\", value: values.healthyContact }\n ]\n } satisfies ModeGuideSessionInput);\n return createModeGuideSession(payload);\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-mode-guide-sessions\"] });\n }\n });\n\n const routeQueries = [sessionsQuery] as const;\n const routeState = collectQueryCollectionState(routeQueries);\n const latestSession = guideMutation.data?.session ?? sessionsQuery.data?.sessions?.[0];\n\n if (routeState.isLoading) {\n return (\n <LoadingState\n eyebrow=\"Mode guide\"\n title=\"Loading guided sessions\"\n description=\"Hydrating previous mode-guide runs and the latest stored readings.\"\n />\n );\n }\n\n if (routeState.error) {\n return <ErrorState eyebrow=\"Mode guide\" error={routeState.error} onRetry={() => void retryQueryCollection(routeQueries)} />;\n }\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n eyebrow=\"Mode guide\"\n title=\"Guided Mode Identification\"\n description=\"A short guided pass can help separate coping responses, child states, critic pressure, and whatever healthy contact is still available.\"\n badge={`${sessionsQuery.data?.sessions.length ?? 0} sessions`}\n actions={\n <Link to=\"/psyche/modes\">\n <Button variant=\"secondary\">Back to mode map</Button>\n </Link>\n }\n />\n <PsycheSectionNav />\n\n <section className=\"grid gap-5 xl:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]\">\n <Card className=\"bg-[linear-gradient(180deg,rgba(16,20,30,0.96),rgba(11,15,24,0.94))]\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Guided questionnaire</div>\n <form className=\"mt-4 grid gap-5\" onSubmit={form.handleSubmit(async (values) => guideMutation.mutateAsync(values))}>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Prompt</span>\n <input className=\"w-full rounded-2xl border border-white/8 bg-white/6 px-4 py-3 text-sm text-white outline-none placeholder:text-white/35\" {...form.register(\"summary\")} />\n </label>\n\n <Card className=\"rounded-[24px] bg-[rgba(248,113,113,0.08)] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-rose-100/80\">When the pressure rose, what coping move dominated?</div>\n <div className=\"mt-3 grid gap-2 sm:grid-cols-2\">\n {OPTIONS.copingResponse.map((option) => (\n <label key={option.value} className=\"flex items-center gap-3 rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <input type=\"radio\" value={option.value} {...form.register(\"copingResponse\")} />\n <span className=\"text-white/74\">{option.label}</span>\n </label>\n ))}\n </div>\n </Card>\n\n <Card className=\"rounded-[24px] bg-[rgba(196,181,253,0.08)] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-violet-100/80\">Which child state felt closest?</div>\n <div className=\"mt-3 grid gap-2 sm:grid-cols-2\">\n {OPTIONS.childState.map((option) => (\n <label key={option.value} className=\"flex items-center gap-3 rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <input type=\"radio\" value={option.value} {...form.register(\"childState\")} />\n <span className=\"text-white/74\">{option.label}</span>\n </label>\n ))}\n </div>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card className=\"rounded-[24px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/48\">What was the critic like?</div>\n <div className=\"mt-3 grid gap-2\">\n {OPTIONS.criticStyle.map((option) => (\n <label key={option.value} className=\"flex items-center gap-3 rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <input type=\"radio\" value={option.value} {...form.register(\"criticStyle\")} />\n <span className=\"text-white/74\">{option.label}</span>\n </label>\n ))}\n </div>\n </Card>\n\n <Card className=\"rounded-[24px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/48\">What healthy contact was still reachable?</div>\n <div className=\"mt-3 grid gap-2\">\n {OPTIONS.healthyContact.map((option) => (\n <label key={option.value} className=\"flex items-center gap-3 rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <input type=\"radio\" value={option.value} {...form.register(\"healthyContact\")} />\n <span className=\"text-white/74\">{option.label}</span>\n </label>\n ))}\n </div>\n </Card>\n </div>\n\n <Button type=\"submit\">Run guide</Button>\n </form>\n </Card>\n\n <div className=\"grid gap-5\">\n <Card className=\"bg-[linear-gradient(180deg,rgba(15,21,34,0.96),rgba(10,15,23,0.94))]\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Latest reading</div>\n {!latestSession ? (\n <div className=\"mt-4\">\n <EmptyState\n eyebrow=\"Guided reading\"\n title=\"No guided sessions yet\"\n description=\"Run the guide once to separate coping response, child state, critic pressure, and reachable healthy contact.\"\n />\n </div>\n ) : (\n <div className=\"mt-4 grid gap-3\">\n {latestSession.results.map((result) => (\n <div key={`${result.family}:${result.label}`} className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-medium text-white\">{result.label}</div>\n <Badge className=\"text-white/70\">{Math.round(result.confidence * 100)}%</Badge>\n </div>\n <div className=\"mt-2 text-sm text-white/58\">{result.family.replaceAll(\"_\", \" \")}</div>\n <div className=\"mt-3 text-sm leading-6 text-white/66\">{result.reasoning}</div>\n </div>\n ))}\n <Link to=\"/psyche/modes\">\n <Button variant=\"secondary\">Use this in the mode map</Button>\n </Link>\n </div>\n )}\n </Card>\n\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Session history</div>\n <div className=\"mt-4 grid gap-3\">\n {(sessionsQuery.data?.sessions ?? []).length === 0 ? (\n <EmptyState\n eyebrow=\"Session history\"\n title=\"No stored guide history\"\n description=\"Completed guide sessions will accumulate here so later mode-map work can build from real prior readings.\"\n />\n ) : (\n (sessionsQuery.data?.sessions ?? []).map((session) => (\n <div key={session.id} className=\"rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"font-medium text-white\">{session.summary}</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {session.results.map((result) => (\n <Badge key={`${session.id}:${result.label}`} className=\"text-white/72\">\n {result.label}\n </Badge>\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n </Card>\n </div>\n </section>\n </div>\n );\n}\n","import { cn } from \"@/lib/utils\";\nimport type { ModeProfile } from \"@/lib/psyche-types\";\n\nconst toneMap: Record<ModeProfile[\"family\"], string> = {\n coping: \"bg-[rgba(251,113,133,0.16)] text-rose-100\",\n child: \"bg-[rgba(125,211,252,0.16)] text-sky-100\",\n critic_parent: \"bg-[rgba(196,181,253,0.16)] text-violet-100\",\n healthy_adult: \"bg-[rgba(110,231,183,0.16)] text-emerald-100\",\n happy_child: \"bg-[rgba(251,191,36,0.16)] text-amber-100\"\n};\n\nexport function ModeChip({\n family,\n label,\n className\n}: {\n family: ModeProfile[\"family\"];\n label: string;\n className?: string;\n}) {\n return <span className={cn(\"inline-flex items-center rounded-full px-3 py-1.5 text-xs\", toneMap[family], className)}>{label}</span>;\n}\n","import { useEffect, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { AtlasPanel } from \"@/components/psyche/atlas-panel\";\nimport { EntityLinkMultiSelect, type EntityLinkOption } from \"@/components/psyche/entity-link-multiselect\";\nimport { ModeChip } from \"@/components/psyche/mode-chip\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { prependEntityToCollection } from \"@/lib/query-cache\";\nimport { modeProfileSchema, type ModeProfileInput } from \"@/lib/psyche-schemas\";\nimport type { Behavior, BehaviorPattern, ModeProfile, PsycheValue } from \"@/lib/psyche-types\";\nimport { createBehavior, createBehaviorPattern, createMode, createPsycheValue, listBehaviors, listBehaviorPatterns, listModes, listPsycheValues, patchMode } from \"@/lib/api\";\n\nconst DEFAULT_MODE_INPUT: ModeProfileInput = {\n family: \"coping\",\n archetype: \"\",\n title: \"\",\n persona: \"\",\n imagery: \"\",\n symbolicForm: \"\",\n facialExpression: \"\",\n fear: \"\",\n burden: \"\",\n protectiveJob: \"\",\n originContext: \"\",\n firstAppearanceAt: null,\n linkedPatternIds: [],\n linkedBehaviorIds: [],\n linkedValueIds: []\n};\n\nfunction modeToInput(mode: ModeProfile): ModeProfileInput {\n return {\n family: mode.family,\n archetype: mode.archetype,\n title: mode.title,\n persona: mode.persona,\n imagery: mode.imagery,\n symbolicForm: mode.symbolicForm,\n facialExpression: mode.facialExpression,\n fear: mode.fear,\n burden: mode.burden,\n protectiveJob: mode.protectiveJob,\n originContext: mode.originContext,\n firstAppearanceAt: mode.firstAppearanceAt,\n linkedPatternIds: mode.linkedPatternIds,\n linkedBehaviorIds: mode.linkedBehaviorIds,\n linkedValueIds: mode.linkedValueIds\n };\n}\n\nconst familyLabelMap: Record<ModeProfile[\"family\"], string> = {\n coping: \"Coping\",\n child: \"Child\",\n critic_parent: \"Critic / parent\",\n healthy_adult: \"Healthy adult\",\n happy_child: \"Happy child\"\n};\n\nexport function PsycheModesPage() {\n const queryClient = useQueryClient();\n const [searchParams, setSearchParams] = useSearchParams();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editingMode, setEditingMode] = useState<ModeProfile | null>(null);\n const [draft, setDraft] = useState<ModeProfileInput>(DEFAULT_MODE_INPUT);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const modesQuery = useQuery({ queryKey: [\"forge-psyche-modes\"], queryFn: listModes });\n const patternsQuery = useQuery({ queryKey: [\"forge-psyche-patterns\"], queryFn: listBehaviorPatterns });\n const behaviorsQuery = useQuery({ queryKey: [\"forge-psyche-behaviors\"], queryFn: listBehaviors });\n const valuesQuery = useQuery({ queryKey: [\"forge-psyche-values\"], queryFn: listPsycheValues });\n\n const modes = modesQuery.data?.modes ?? [];\n const patterns = patternsQuery.data?.patterns ?? [];\n const behaviors = behaviorsQuery.data?.behaviors ?? [];\n const values = valuesQuery.data?.values ?? [];\n\n useEffect(() => {\n if (searchParams.get(\"create\") === \"1\") {\n setDialogOpen(true);\n setEditingMode(null);\n setDraft(DEFAULT_MODE_INPUT);\n const next = new URLSearchParams(searchParams);\n next.delete(\"create\");\n setSearchParams(next, { replace: true });\n }\n }, [searchParams, setSearchParams]);\n\n const saveMutation = useMutation({\n mutationFn: async (input: ModeProfileInput) => {\n const parsed = modeProfileSchema.parse(input);\n if (editingMode) {\n return patchMode(editingMode.id, parsed);\n }\n return createMode(parsed);\n },\n onSuccess: async () => {\n setDialogOpen(false);\n setEditingMode(null);\n setDraft(DEFAULT_MODE_INPUT);\n setSubmitError(null);\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-modes\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] })\n ]);\n }\n });\n\n const patternOptions: EntityLinkOption[] = patterns.map((pattern: BehaviorPattern) => ({\n value: pattern.id,\n label: pattern.title,\n description: pattern.preferredResponse || pattern.targetBehavior,\n kind: \"pattern\"\n }));\n const behaviorOptions: EntityLinkOption[] = behaviors.map((behavior: Behavior) => ({\n value: behavior.id,\n label: behavior.title,\n description: behavior.kind,\n kind: \"behavior\"\n }));\n const valueOptions: EntityLinkOption[] = values.map((entry: PsycheValue) => ({\n value: entry.id,\n label: entry.title,\n description: entry.valuedDirection,\n kind: \"value\"\n }));\n\n const createLinkedPattern = async (title: string) => {\n const { pattern } = await createBehaviorPattern({\n title,\n description: \"\",\n targetBehavior: title,\n cueContexts: [],\n shortTermPayoff: \"\",\n longTermCost: \"\",\n preferredResponse: \"\",\n linkedValueIds: [],\n linkedSchemaLabels: [],\n linkedModeIds: [],\n linkedBeliefIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-patterns\"], \"patterns\", pattern);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return {\n value: pattern.id,\n label: pattern.title,\n description: pattern.preferredResponse || pattern.targetBehavior,\n kind: \"pattern\"\n } satisfies EntityLinkOption;\n };\n\n const createLinkedBehavior = async (title: string) => {\n const { behavior } = await createBehavior({\n kind: \"away\",\n title,\n description: \"\",\n commonCues: [],\n urgeStory: \"\",\n shortTermPayoff: \"\",\n longTermCost: \"\",\n replacementMove: \"\",\n repairPlan: \"\",\n linkedPatternIds: [],\n linkedValueIds: [],\n linkedSchemaIds: [],\n linkedModeIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-behaviors\"], \"behaviors\", behavior);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return {\n value: behavior.id,\n label: behavior.title,\n description: behavior.kind,\n kind: \"behavior\"\n } satisfies EntityLinkOption;\n };\n\n const createLinkedValue = async (title: string) => {\n const { value } = await createPsycheValue({\n title,\n description: \"\",\n valuedDirection: title,\n whyItMatters: \"\",\n linkedGoalIds: [],\n linkedProjectIds: [],\n linkedTaskIds: [],\n committedActions: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-values\"], \"values\", value);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return {\n value: value.id,\n label: value.title,\n description: value.valuedDirection,\n kind: \"value\"\n } satisfies EntityLinkOption;\n };\n\n const steps: Array<QuestionFlowStep<ModeProfileInput>> = [\n {\n id: \"identity\",\n eyebrow: \"Identity\",\n title: \"Name the cast member and place it in the right family\",\n description: \"Start with the mode itself: who it feels like, what family it belongs to, and the recognizable role it plays.\",\n render: (value, setValue) => (\n <>\n <FlowField\n label=\"Mode family\"\n description=\"Choose the broader inner family this mode belongs to.\"\n labelHelp=\"A mode family is the bigger cluster this state belongs to, like a coping part, a vulnerable child state, or a healthy adult response.\"\n >\n <div className=\"grid gap-3 md:grid-cols-3\">\n {([\"coping\", \"child\", \"critic_parent\", \"healthy_adult\", \"happy_child\"] as const).map((family) => (\n <button\n key={family}\n type=\"button\"\n className={`rounded-[22px] border px-4 py-4 text-left transition ${value.family === family ? \"border-white/20 bg-white/[0.12] text-white\" : \"border-white/8 bg-white/[0.04] text-white/62 hover:bg-white/[0.07]\"}`}\n onClick={() => setValue({ family })}\n >\n {familyLabelMap[family]}\n </button>\n ))}\n </div>\n </FlowField>\n <FlowField\n label=\"Mode name\"\n description=\"Give it a memorable name you would instantly recognize later.\"\n labelHelp=\"This is the user-facing name of the mode. It should read like a cast member title, not a clinical record.\"\n >\n <Input value={value.title} onChange={(event) => setValue({ title: event.target.value })} placeholder=\"The Friday Vigil, The Scanner, The Good Son\" />\n </FlowField>\n <FlowField\n label=\"Archetype\"\n description=\"Name the recognizable inner role or pattern this mode most resembles.\"\n labelHelp=\"An archetype is the role this mode tends to play, like a protector, a critic, a frightened child, or a calm adult anchor.\"\n >\n <Input value={value.archetype} onChange={(event) => setValue({ archetype: event.target.value })} placeholder=\"Detached protector, vulnerable child, demanding critic\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"texture\",\n eyebrow: \"Texture\",\n title: \"Give the mode a recognizable presence\",\n description: \"Imagery, facial expression, and persona should make the mode instantly memorable.\",\n render: (value, setValue) => (\n <>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField\n label=\"Persona\"\n description=\"Describe how this mode sounds, moves, and carries itself.\"\n labelHelp=\"Persona is the tone, posture, and voice of the mode. Imagine how it enters the room and how it speaks.\"\n >\n <Textarea value={value.persona} onChange={(event) => setValue({ persona: event.target.value })} placeholder=\"Quiet, hyper-alert, always scanning for threat and trying to stay one step ahead.\" />\n </FlowField>\n <FlowField\n label=\"Imagery\"\n description=\"Capture the mental image or scene that helps this mode feel vivid.\"\n labelHelp=\"Imagery is the picture that makes the mode easy to remember, like a scene, posture, weather pattern, or atmosphere.\"\n >\n <Textarea value={value.imagery} onChange={(event) => setValue({ imagery: event.target.value })} placeholder=\"A night watchman under cold fluorescent light, pacing and checking every door twice.\" />\n </FlowField>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField\n label=\"Symbolic form\"\n description=\"Pick the object, creature, or shape that best symbolizes this mode.\"\n labelHelp=\"Symbolic form is the metaphor for the mode, like armor, a fox, a storm front, or a glass wall.\"\n >\n <Input value={value.symbolicForm} onChange={(event) => setValue({ symbolicForm: event.target.value })} placeholder=\"A locked visor, a fox, a steel shield\" />\n </FlowField>\n <FlowField\n label=\"Facial expression\"\n description=\"Describe what you would see on the mode's face if it took over.\"\n labelHelp=\"This is the visible emotional expression of the mode: tight jaw, blank stare, pleading eyes, or calm grounded attention.\"\n >\n <Input value={value.facialExpression} onChange={(event) => setValue({ facialExpression: event.target.value })} placeholder=\"Tight jaw, narrowed eyes, forced calm\" />\n </FlowField>\n </div>\n </>\n )\n },\n {\n id: \"burden\",\n eyebrow: \"Burden\",\n title: \"Map fear, burden, job, and origin\",\n description: \"This is what turns a named mode into a readable inner-state profile.\",\n render: (value, setValue) => (\n <>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <FlowField\n label=\"Fear\"\n description=\"Name the threat this mode is trying hard to prevent.\"\n labelHelp=\"Fear is the danger the mode believes it must protect you from, such as rejection, shame, collapse, failure, or being trapped.\"\n >\n <Textarea value={value.fear} onChange={(event) => setValue({ fear: event.target.value })} placeholder=\"If I relax, I will miss the threat and get hurt.\" />\n </FlowField>\n <FlowField\n label=\"Burden\"\n description=\"Describe the emotional weight or exhausting role this mode keeps carrying.\"\n labelHelp=\"Burden is the heavy job or emotional load the mode feels stuck holding, even when it costs a lot.\"\n >\n <Textarea value={value.burden} onChange={(event) => setValue({ burden: event.target.value })} placeholder=\"It believes it must never let the guard down, even when that means constant tension.\" />\n </FlowField>\n <FlowField\n label=\"Protective job\"\n description=\"Describe the job this mode thinks it is performing for you.\"\n labelHelp=\"Protective job is the function the mode is trying to serve, like preventing rejection, keeping control, stopping humiliation, or preserving closeness.\"\n >\n <Textarea value={value.protectiveJob} onChange={(event) => setValue({ protectiveJob: event.target.value })} placeholder=\"Keeps me prepared so I never get blindsided or look naive.\" />\n </FlowField>\n </div>\n <FlowField\n label=\"Origin context\"\n description=\"Describe when this mode first became useful or understandable.\"\n labelHelp=\"Origin context is the stretch of life where this mode likely learned its job or became especially necessary.\"\n >\n <Textarea value={value.originContext} onChange={(event) => setValue({ originContext: event.target.value })} placeholder=\"Started getting stronger during adolescence when mistakes were met with criticism and unpredictability.\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"links\",\n eyebrow: \"Links\",\n title: \"Attach the mode to the rest of the psyche system\",\n description: \"Modes should connect to patterns, behaviors, and values, not sit in isolation.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Linked patterns\" description=\"Choose the loops this mode tends to activate or maintain.\">\n <EntityLinkMultiSelect\n options={patternOptions}\n selectedValues={value.linkedPatternIds}\n onChange={(linkedPatternIds) => setValue({ linkedPatternIds })}\n placeholder=\"Search or create a pattern…\"\n emptyMessage=\"No patterns match yet.\"\n createLabel=\"Create pattern\"\n onCreate={createLinkedPattern}\n />\n </FlowField>\n <FlowField label=\"Linked behaviors\" description=\"Choose the moves this mode tends to trigger, justify, or amplify.\">\n <EntityLinkMultiSelect\n options={behaviorOptions}\n selectedValues={value.linkedBehaviorIds}\n onChange={(linkedBehaviorIds) => setValue({ linkedBehaviorIds })}\n placeholder=\"Search or create a behavior…\"\n emptyMessage=\"No behaviors match yet.\"\n createLabel=\"Create behavior\"\n onCreate={createLinkedBehavior}\n />\n </FlowField>\n <FlowField\n label=\"Colliding values\"\n description=\"Choose the valued directions this mode most often interrupts.\"\n labelHelp=\"These are the values that get obscured, sidelined, or distorted when this mode takes over.\"\n >\n <EntityLinkMultiSelect\n options={valueOptions}\n selectedValues={value.linkedValueIds}\n onChange={(linkedValueIds) => setValue({ linkedValueIds })}\n placeholder=\"Search or create a value…\"\n emptyMessage=\"No values match yet.\"\n createLabel=\"Create value\"\n onCreate={createLinkedValue}\n />\n </FlowField>\n </>\n )\n }\n ];\n\n if (modesQuery.isLoading || patternsQuery.isLoading || behaviorsQuery.isLoading || valuesQuery.isLoading) {\n return <LoadingState eyebrow=\"Modes\" title=\"Loading modes\" description=\"Getting modes, linked patterns, behaviors, and values ready.\" />;\n }\n\n const routeError = modesQuery.error ?? patternsQuery.error ?? behaviorsQuery.error ?? valuesQuery.error;\n if (routeError) {\n return <ErrorState eyebrow=\"Modes\" error={routeError} onRetry={() => void Promise.all([modesQuery.refetch(), patternsQuery.refetch(), behaviorsQuery.refetch(), valuesQuery.refetch()])} />;\n }\n\n const groupedModes = {\n coping: modes.filter((mode) => mode.family === \"coping\"),\n child: modes.filter((mode) => mode.family === \"child\"),\n critic_parent: modes.filter((mode) => mode.family === \"critic_parent\"),\n healthy_adult: modes.filter((mode) => mode.family === \"healthy_adult\"),\n happy_child: modes.filter((mode) => mode.family === \"happy_child\")\n } as const;\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n entityKind=\"mode\"\n title={<EntityName kind=\"mode\" label=\"Modes\" variant=\"heading\" size=\"lg\" />}\n description=\"Modes should look and feel like a cast of inner states with identity, burden, and relational links, not a flat list of records.\"\n badge={`${modes.length} modes`}\n actions={\n <Button\n onClick={() => {\n setEditingMode(null);\n setDraft(DEFAULT_MODE_INPUT);\n setDialogOpen(true);\n }}\n >\n Add mode\n </Button>\n }\n />\n <PsycheSectionNav />\n\n <AtlasPanel\n eyebrow=\"Mode families\"\n title=\"Modes by family\"\n description=\"Use these groups to see which modes show up most often, what role they play, and what they are connected to.\"\n tone=\"violet\"\n >\n {modes.length === 0 ? (\n <div className=\"flex justify-start\">\n <Button onClick={() => setDialogOpen(true)}>Add mode</Button>\n </div>\n ) : (\n <div className=\"grid gap-4 xl:grid-cols-2\">\n {(Object.keys(groupedModes) as Array<keyof typeof groupedModes>).map((family) => (\n <div key={family} className=\"grid gap-3 rounded-[26px] bg-white/[0.04] p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <ModeChip family={family} label={familyLabelMap[family]} />\n <Badge>{groupedModes[family].length}</Badge>\n </div>\n {groupedModes[family].length === 0 ? (\n <div className=\"flex\">\n <Button variant=\"secondary\" onClick={() => setDialogOpen(true)}>\n Add {familyLabelMap[family].toLowerCase()}\n </Button>\n </div>\n ) : (\n groupedModes[family].map((mode) => (\n <button\n key={mode.id}\n type=\"button\"\n className=\"rounded-[22px] bg-white/[0.04] p-4 text-left transition hover:bg-white/[0.08]\"\n onClick={() => {\n setEditingMode(mode);\n setDraft(modeToInput(mode));\n setDialogOpen(true);\n }}\n >\n <EntityBadge kind=\"mode\" compact gradient={false} />\n <EntityName kind=\"mode\" label={mode.title} variant=\"heading\" size=\"lg\" />\n <div className=\"mt-2 text-sm text-white/52\">{mode.archetype}</div>\n <div className=\"mt-3 text-sm leading-6 text-white/62\">{mode.persona || mode.protectiveJob || \"Open the mode to add persona and protective details.\"}</div>\n </button>\n ))\n )}\n </div>\n ))}\n </div>\n )}\n </AtlasPanel>\n\n <QuestionFlowDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n eyebrow=\"Mode\"\n title={editingMode ? \"Refine cast member\" : \"Create mode\"}\n description=\"Use this guided flow to define the mode, how it shows up, what it is protecting, and where it comes from.\"\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel={editingMode ? \"Save mode\" : \"Create mode\"}\n pending={saveMutation.isPending}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const parsed = modeProfileSchema.safeParse(draft);\n if (!parsed.success) {\n setSubmitError(\"This mode still needs a family and a name before it can be saved.\");\n return;\n }\n\n try {\n await saveMutation.mutateAsync(parsed.data);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Unable to save this mode right now.\");\n }\n }}\n />\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { motion } from \"framer-motion\";\nimport { Link } from \"react-router-dom\";\nimport { cn } from \"@/lib/utils\";\n\ntype OrbitNode = {\n id: string;\n label: string;\n title: string;\n detail: string;\n href: string;\n angle: number;\n radius: number;\n tone?: \"mint\" | \"sky\" | \"violet\" | \"rose\";\n};\n\nconst toneClassMap: Record<NonNullable<OrbitNode[\"tone\"]>, string> = {\n mint: \"border-emerald-300/24 bg-[rgba(16,185,129,0.12)] text-emerald-100\",\n sky: \"border-sky-300/24 bg-[rgba(56,189,248,0.12)] text-sky-100\",\n violet: \"border-violet-300/24 bg-[rgba(167,139,250,0.12)] text-violet-100\",\n rose: \"border-rose-300/24 bg-[rgba(251,113,133,0.12)] text-rose-100\"\n};\n\ntype PackedOrbitNode = OrbitNode & {\n x: number;\n y: number;\n width: number;\n height: number;\n homeX: number;\n homeY: number;\n};\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction estimateNodeHeight(node: OrbitNode) {\n const detailLength = node.detail.trim().length;\n if (detailLength > 84) {\n return 130;\n }\n if (detailLength > 44) {\n return 118;\n }\n return 106;\n}\n\nfunction packOrbitNodes(nodes: OrbitNode[], frameWidth: number, frameHeight: number): PackedOrbitNode[] {\n const centerX = frameWidth / 2;\n const centerY = frameHeight / 2;\n const orbitScale = clamp(Math.min(frameWidth / 620, frameHeight / 430), 0.64, 1.06);\n const packed = nodes.map((node) => {\n const angleInRadians = (node.angle * Math.PI) / 180;\n const scaledRadius = node.radius * orbitScale;\n const width = Math.min(184, Math.max(154, frameWidth - 48));\n const height = estimateNodeHeight(node);\n const homeX = centerX + Math.cos(angleInRadians) * scaledRadius;\n const homeY = centerY + Math.sin(angleInRadians) * scaledRadius;\n return {\n ...node,\n x: homeX,\n y: homeY,\n width,\n height,\n homeX,\n homeY\n };\n });\n\n const gap = frameWidth < 720 ? 16 : 22;\n const leftBoundary = 20;\n const rightBoundary = frameWidth - 20;\n const topBoundary = 18;\n const bottomBoundary = frameHeight - 18;\n\n for (let iteration = 0; iteration < 220; iteration += 1) {\n for (const node of packed) {\n node.x += (node.homeX - node.x) * 0.065;\n node.y += (node.homeY - node.y) * 0.065;\n }\n\n for (let leftIndex = 0; leftIndex < packed.length; leftIndex += 1) {\n for (let rightIndex = leftIndex + 1; rightIndex < packed.length; rightIndex += 1) {\n const left = packed[leftIndex]!;\n const right = packed[rightIndex]!;\n const deltaX = right.x - left.x;\n const deltaY = right.y - left.y;\n const overlapX = left.width / 2 + right.width / 2 + gap - Math.abs(deltaX);\n const overlapY = left.height / 2 + right.height / 2 + gap - Math.abs(deltaY);\n\n if (overlapX <= 0 || overlapY <= 0) {\n continue;\n }\n\n const axis = overlapX < overlapY ? \"x\" : \"y\";\n const direction = axis === \"x\" ? Math.sign(deltaX || rightIndex - leftIndex || 1) : Math.sign(deltaY || rightIndex - leftIndex || 1);\n const push = (axis === \"x\" ? overlapX : overlapY) / 2;\n\n if (axis === \"x\") {\n left.x -= direction * push;\n right.x += direction * push;\n } else {\n left.y -= direction * push;\n right.y += direction * push;\n }\n }\n }\n\n for (const node of packed) {\n node.x = clamp(node.x, leftBoundary + node.width / 2, rightBoundary - node.width / 2);\n node.y = clamp(node.y, topBoundary + node.height / 2, bottomBoundary - node.height / 2);\n }\n }\n\n return packed;\n}\n\nexport function OrbitMap({\n title,\n description,\n centerLabel,\n centerValue,\n nodes,\n action\n}: {\n title: string;\n description: string;\n centerLabel: string;\n centerValue: string;\n nodes: OrbitNode[];\n action?: ReactNode;\n}) {\n const frameRef = useRef<HTMLDivElement | null>(null);\n const [frameSize, setFrameSize] = useState({ width: 0, height: 0 });\n\n useEffect(() => {\n if (!frameRef.current || typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n setFrameSize({\n width: entry.contentRect.width,\n height: entry.contentRect.height\n });\n });\n\n observer.observe(frameRef.current);\n return () => observer.disconnect();\n }, []);\n\n const denseNodes =\n nodes.length > 0\n ? nodes\n : [\n { id: \"values\", label: \"Values\", title: \"Add value\", detail: \"Name what matters\", href: \"/psyche/values?create=1\", angle: -86, radius: 112, tone: \"mint\" as const },\n { id: \"patterns\", label: \"Patterns\", title: \"Add pattern\", detail: \"Map a loop\", href: \"/psyche/patterns?create=1\", angle: -14, radius: 122, tone: \"rose\" as const },\n { id: \"beliefs\", label: \"Beliefs\", title: \"Add belief\", detail: \"Capture a script\", href: \"/psyche/schemas-beliefs?create=1\", angle: 72, radius: 118, tone: \"violet\" as const },\n { id: \"reports\", label: \"Reports\", title: \"Reflect\", detail: \"Open the chain\", href: \"/psyche/reports?create=1\", angle: 160, radius: 124, tone: \"sky\" as const }\n ];\n const packedNodes = useMemo(\n () => packOrbitNodes(denseNodes, Math.max(frameSize.width, 320), Math.max(frameSize.height, 320)),\n [denseNodes, frameSize.height, frameSize.width]\n );\n\n return (\n <section className=\"overflow-hidden rounded-[32px] border border-white/8 bg-[radial-gradient(circle_at_top,rgba(110,231,183,0.14),transparent_42%),linear-gradient(180deg,rgba(15,30,34,0.98),rgba(10,21,25,0.98))] px-4 py-4 shadow-[0_24px_70px_rgba(4,8,18,0.28)] lg:px-5\">\n <div className=\"mb-4 flex flex-wrap items-end justify-between gap-4\">\n <div className=\"min-w-0\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-[rgba(110,231,183,0.8)]\">Reflective map</div>\n <h2 className=\"mt-2 font-display text-[clamp(1.35rem,2.3vw,2rem)] leading-none text-white\">{title}</h2>\n <p className=\"mt-2 max-w-2xl text-sm leading-6 text-white/60\">{description}</p>\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"inline-flex items-center gap-3 rounded-full border border-white/10 bg-white/[0.04] px-4 py-2\">\n <span className=\"text-xs uppercase tracking-[0.18em] text-white/38\">{centerLabel}</span>\n <span className=\"text-sm font-medium text-white\">{centerValue}</span>\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n </div>\n\n <div ref={frameRef} className=\"relative min-h-[20rem] overflow-hidden rounded-[30px] border border-white/6 bg-[radial-gradient(circle_at_center,rgba(255,255,255,0.05),transparent_42%)] lg:min-h-[22rem]\">\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_center,rgba(110,231,183,0.08),transparent_32%),linear-gradient(180deg,transparent,rgba(8,13,24,0.24))]\" />\n {[112, 168, 224].map((ring) => (\n <div\n key={ring}\n className=\"absolute left-1/2 top-1/2 rounded-full border border-white/[0.05]\"\n style={{\n width: `${ring * 2}px`,\n height: `${ring * 2}px`,\n transform: \"translate(-50%, -50%)\"\n }}\n />\n ))}\n <div className=\"absolute inset-1/2 size-32 -translate-x-1/2 -translate-y-1/2 rounded-full border border-white/10 bg-[radial-gradient(circle,rgba(255,255,255,0.08),rgba(255,255,255,0.02))] shadow-[0_0_0_18px_rgba(255,255,255,0.02),0_0_0_56px_rgba(255,255,255,0.015)]\">\n <div className=\"flex h-full flex-col items-center justify-center text-center\">\n <div className=\"text-[11px] uppercase tracking-[0.18em] text-white/40\">{centerLabel}</div>\n <div className=\"mt-2 font-display text-2xl text-white\">{centerValue}</div>\n </div>\n </div>\n\n {packedNodes.map((node, index) => {\n return (\n <motion.div\n key={node.id}\n initial={{ opacity: 0, scale: 0.96 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.35, delay: index * 0.05, ease: \"easeOut\" }}\n className=\"absolute w-[min(11.5rem,calc(100vw-4rem))] max-w-[11.5rem] -translate-x-1/2 -translate-y-1/2\"\n style={{ left: `${node.x}px`, top: `${node.y}px` }}\n whileHover={{ y: -6, scale: 1.03 }}\n >\n <Link\n to={node.href}\n className={cn(\n \"block rounded-[22px] border px-3.5 py-3 shadow-[0_18px_38px_rgba(4,8,18,0.28)] backdrop-blur-sm transition hover:-translate-y-0.5 hover:bg-white/[0.1] hover:shadow-[0_24px_44px_rgba(4,8,18,0.34)]\",\n toneClassMap[node.tone ?? \"mint\"]\n )}\n >\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/45\">{node.label}</div>\n <div className=\"mt-1.5 font-medium text-white\">{node.title}</div>\n <div className=\"mt-1.5 text-sm leading-5 text-white/62\">{node.detail}</div>\n </Link>\n </motion.div>\n );\n })}\n </div>\n </section>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { AtlasPanel } from \"@/components/psyche/atlas-panel\";\nimport { EntityLinkMultiSelect, type EntityLinkOption } from \"@/components/psyche/entity-link-multiselect\";\nimport { OrbitMap } from \"@/components/psyche/orbit-map\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { SchemaBadge } from \"@/components/psyche/schema-badge\";\nimport { psycheFocusClass, usePsycheFocusTarget } from \"@/components/psyche/use-psyche-focus-target\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { prependEntityToCollection } from \"@/lib/query-cache\";\nimport { behaviorPatternSchema, type BehaviorPatternInput } from \"@/lib/psyche-schemas\";\nimport type { BehaviorPattern, BeliefEntry, ModeProfile, SchemaCatalogEntry } from \"@/lib/psyche-types\";\nimport { findSchemaForLink, getSchemaFamilyLabel } from \"@/lib/schema-visuals\";\nimport { createBehaviorPattern, createBelief, createMode, createPsycheValue, listBehaviorPatterns, listBehaviors, listBeliefs, listModes, listPsycheValues, listSchemaCatalog, patchBehaviorPattern } from \"@/lib/api\";\n\nconst DEFAULT_PATTERN_INPUT: BehaviorPatternInput = {\n title: \"\",\n description: \"\",\n targetBehavior: \"\",\n cueContexts: [],\n shortTermPayoff: \"\",\n longTermCost: \"\",\n preferredResponse: \"\",\n linkedValueIds: [],\n linkedSchemaLabels: [],\n linkedModeIds: [],\n linkedBeliefIds: []\n};\n\nfunction patternToInput(pattern: BehaviorPattern): BehaviorPatternInput {\n return {\n title: pattern.title,\n description: pattern.description,\n targetBehavior: pattern.targetBehavior,\n cueContexts: pattern.cueContexts,\n shortTermPayoff: pattern.shortTermPayoff,\n longTermCost: pattern.longTermCost,\n preferredResponse: pattern.preferredResponse,\n linkedValueIds: pattern.linkedValueIds,\n linkedSchemaLabels: pattern.linkedSchemaLabels,\n linkedModeIds: pattern.linkedModeIds,\n linkedBeliefIds: pattern.linkedBeliefIds\n };\n}\n\nexport function PsychePatternsPage() {\n const queryClient = useQueryClient();\n const [searchParams, setSearchParams] = useSearchParams();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editingPattern, setEditingPattern] = useState<BehaviorPattern | null>(null);\n const [draft, setDraft] = useState<BehaviorPatternInput>(DEFAULT_PATTERN_INPUT);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const patternsQuery = useQuery({\n queryKey: [\"forge-psyche-patterns\"],\n queryFn: listBehaviorPatterns\n });\n const valuesQuery = useQuery({\n queryKey: [\"forge-psyche-values\"],\n queryFn: listPsycheValues\n });\n const schemasQuery = useQuery({\n queryKey: [\"forge-psyche-schema-catalog\"],\n queryFn: listSchemaCatalog\n });\n const modesQuery = useQuery({\n queryKey: [\"forge-psyche-modes\"],\n queryFn: listModes\n });\n const beliefsQuery = useQuery({\n queryKey: [\"forge-psyche-beliefs\"],\n queryFn: listBeliefs\n });\n const behaviorsQuery = useQuery({\n queryKey: [\"forge-psyche-behaviors\"],\n queryFn: listBehaviors\n });\n\n const patterns = patternsQuery.data?.patterns ?? [];\n const values = valuesQuery.data?.values ?? [];\n const schemas = schemasQuery.data?.schemas ?? [];\n const modes = modesQuery.data?.modes ?? [];\n const beliefs = beliefsQuery.data?.beliefs ?? [];\n const behaviors = behaviorsQuery.data?.behaviors ?? [];\n const focusedPatternId = searchParams.get(\"focus\");\n\n usePsycheFocusTarget(focusedPatternId);\n\n useEffect(() => {\n if (searchParams.get(\"create\") === \"1\") {\n setDialogOpen(true);\n setEditingPattern(null);\n setDraft(DEFAULT_PATTERN_INPUT);\n const next = new URLSearchParams(searchParams);\n next.delete(\"create\");\n setSearchParams(next, { replace: true });\n }\n }, [searchParams, setSearchParams]);\n\n const saveMutation = useMutation({\n mutationFn: async (input: BehaviorPatternInput) => {\n const parsed = behaviorPatternSchema.parse(input);\n if (editingPattern) {\n return patchBehaviorPattern(editingPattern.id, parsed);\n }\n return createBehaviorPattern(parsed);\n },\n onSuccess: async () => {\n setDialogOpen(false);\n setEditingPattern(null);\n setDraft(DEFAULT_PATTERN_INPUT);\n setSubmitError(null);\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-patterns\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] })\n ]);\n }\n });\n\n const valueOptions: EntityLinkOption[] = values.map((entry) => ({\n value: entry.id,\n label: entry.title,\n description: entry.valuedDirection,\n kind: \"value\"\n }));\n const schemaOptions: EntityLinkOption[] = schemas.map((schema: SchemaCatalogEntry) => ({\n value: schema.title,\n label: schema.title,\n description: `${schema.description} ${getSchemaFamilyLabel(schema.family)}`,\n searchText: `${schema.slug} ${schema.family} ${schema.schemaType}`,\n badge: <SchemaBadge label={schema.title} schemaType={schema.schemaType} compact />,\n menuBadge: <SchemaBadge label={schema.title} schemaType={schema.schemaType} compact />\n }));\n const modeOptions: EntityLinkOption[] = modes.map((mode: ModeProfile) => ({\n value: mode.id,\n label: mode.title,\n description: mode.archetype || mode.family,\n kind: \"mode\"\n }));\n const beliefOptions: EntityLinkOption[] = beliefs.map((belief: BeliefEntry) => ({\n value: belief.id,\n label: belief.statement,\n description: belief.flexibleAlternative || belief.originNote,\n kind: \"belief\"\n }));\n\n const createLinkedMode = async (title: string) => {\n const { mode } = await createMode({\n family: \"coping\",\n archetype: \"\",\n title,\n persona: \"\",\n imagery: \"\",\n symbolicForm: \"\",\n facialExpression: \"\",\n fear: \"\",\n burden: \"\",\n protectiveJob: \"\",\n originContext: \"\",\n firstAppearanceAt: null,\n linkedPatternIds: [],\n linkedBehaviorIds: [],\n linkedValueIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-modes\"], \"modes\", mode);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return {\n value: mode.id,\n label: mode.title,\n description: mode.archetype || mode.family,\n kind: \"mode\"\n } satisfies EntityLinkOption;\n };\n\n const createLinkedValue = async (title: string) => {\n const { value } = await createPsycheValue({\n title,\n description: \"\",\n valuedDirection: title,\n whyItMatters: \"\",\n linkedGoalIds: [],\n linkedProjectIds: [],\n linkedTaskIds: [],\n committedActions: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-values\"], \"values\", value);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return {\n value: value.id,\n label: value.title,\n description: value.valuedDirection,\n kind: \"value\"\n } satisfies EntityLinkOption;\n };\n\n const createLinkedBelief = async (statement: string) => {\n const { belief } = await createBelief({\n schemaId: null,\n statement,\n beliefType: \"absolute\",\n originNote: \"\",\n confidence: 60,\n evidenceFor: [],\n evidenceAgainst: [],\n flexibleAlternative: \"\",\n linkedValueIds: [],\n linkedBehaviorIds: [],\n linkedModeIds: [],\n linkedReportIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-beliefs\"], \"beliefs\", belief);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return {\n value: belief.id,\n label: belief.statement,\n description: belief.flexibleAlternative || belief.originNote,\n kind: \"belief\"\n } satisfies EntityLinkOption;\n };\n\n const seedablePatterns = useMemo(\n () => patterns.filter((pattern) => !behaviors.some((behavior) => behavior.kind === \"away\" && behavior.linkedPatternIds.includes(pattern.id))),\n [patterns, behaviors]\n );\n\n const orbitNodes = patterns.slice(0, 5).map((pattern, index) => ({\n id: pattern.id,\n label: `${pattern.linkedValueIds.length} values`,\n title: pattern.title,\n detail: pattern.preferredResponse,\n href: `/psyche/patterns?focus=${pattern.id}#pattern-lanes`,\n angle: -92 + index * 70,\n radius: 150 + (index % 2) * 14,\n tone: ([\"rose\", \"sky\", \"violet\", \"mint\"] as const)[index % 4]\n }));\n\n const steps: Array<QuestionFlowStep<BehaviorPatternInput>> = [\n {\n id: \"loop\",\n eyebrow: \"Loop\",\n title: \"Name the pattern and the behavior it keeps producing\",\n description: \"This should feel like a recognizable loop, not a diagnostic label.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Pattern name\" description=\"Give the loop a name you will recognize quickly later.\">\n <Input value={value.title} onChange={(event) => setValue({ title: event.target.value })} placeholder=\"Anxious reassurance loop\" />\n </FlowField>\n <FlowField label=\"What happens in the loop\" description=\"Describe the actual sequence of behavior, not the diagnosis.\">\n <Textarea value={value.targetBehavior} onChange={(event) => setValue({ targetBehavior: event.target.value })} placeholder=\"What do you actually do when the trigger hits?\" />\n </FlowField>\n <FlowField label=\"Description\" description=\"Write the loop in plain language so it stays usable in the future.\">\n <Textarea value={value.description} onChange={(event) => setValue({ description: event.target.value })} placeholder=\"Describe the loop in plain human language so it stays recognizable later.\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"dynamics\",\n eyebrow: \"Dynamics\",\n title: \"Capture cues, payoff, cost, and the desired response\",\n description: \"The goal is to make the action map obvious at a glance.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Common cues\" description=\"Add one cue per line so the trigger pattern stays easy to scan.\">\n <Textarea\n value={value.cueContexts.join(\"\\n\")}\n onChange={(event) =>\n setValue({\n cueContexts: event.target.value\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n })\n }\n placeholder={\"One line per cue\\nSilence after vulnerability\\nLate-night social comparison\"}\n />\n </FlowField>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField label=\"Short-term payoff\" description=\"What relief, certainty, control, or distance do you get right away?\">\n <Textarea value={value.shortTermPayoff} onChange={(event) => setValue({ shortTermPayoff: event.target.value })} placeholder=\"What relief do you get right away?\" />\n </FlowField>\n <FlowField label=\"Long-term cost\" description=\"What does the loop cost you later in closeness, energy, values, or progress?\">\n <Textarea value={value.longTermCost} onChange={(event) => setValue({ longTermCost: event.target.value })} placeholder=\"What does this cost over time?\" />\n </FlowField>\n </div>\n <FlowField label=\"Preferred response\" description=\"Name the return-path response you want to practice instead.\">\n <Textarea value={value.preferredResponse} onChange={(event) => setValue({ preferredResponse: event.target.value })} placeholder=\"What do you want to practice instead?\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"links\",\n eyebrow: \"Links\",\n title: \"Attach the loop to values, schemas, modes, and beliefs\",\n description: \"This is what turns a private note into a navigable graphical system.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Linked values\" description=\"Choose the values this loop pulls against or tries to protect badly.\">\n <EntityLinkMultiSelect\n options={valueOptions}\n selectedValues={value.linkedValueIds}\n onChange={(linkedValueIds) => setValue({ linkedValueIds })}\n placeholder=\"Search or create a value…\"\n emptyMessage=\"No values match yet.\"\n createLabel=\"Create value\"\n onCreate={createLinkedValue}\n />\n </FlowField>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField label=\"Schema labels\" description=\"Attach the schema themes that define the pressure in this loop.\">\n <EntityLinkMultiSelect\n options={schemaOptions}\n selectedValues={value.linkedSchemaLabels}\n onChange={(linkedSchemaLabels) => setValue({ linkedSchemaLabels })}\n placeholder=\"Search schema themes…\"\n emptyMessage=\"No schema themes match.\"\n />\n </FlowField>\n <FlowField label=\"Linked modes\" description=\"Search for an existing mode or press Enter to create and link one immediately.\">\n <EntityLinkMultiSelect\n options={modeOptions}\n selectedValues={value.linkedModeIds}\n onChange={(linkedModeIds) => setValue({ linkedModeIds })}\n placeholder=\"Search or create a mode…\"\n emptyMessage=\"No modes match yet.\"\n createLabel=\"Create mode\"\n onCreate={createLinkedMode}\n />\n </FlowField>\n </div>\n <FlowField label=\"Linked beliefs\" description=\"Search for a belief, or type a new one and press Enter to create it inline.\">\n <EntityLinkMultiSelect\n options={beliefOptions}\n selectedValues={value.linkedBeliefIds}\n onChange={(linkedBeliefIds) => setValue({ linkedBeliefIds })}\n placeholder=\"Search or create a belief…\"\n emptyMessage=\"No beliefs match yet.\"\n createLabel=\"Create belief\"\n onCreate={createLinkedBelief}\n />\n </FlowField>\n </>\n )\n }\n ];\n\n if (patternsQuery.isLoading || valuesQuery.isLoading || schemasQuery.isLoading || modesQuery.isLoading || beliefsQuery.isLoading || behaviorsQuery.isLoading) {\n return <LoadingState eyebrow=\"Patterns\" title=\"Loading patterns\" description=\"Getting patterns, values, schemas, beliefs, modes, and linked behaviors ready.\" />;\n }\n\n const routeError = patternsQuery.error ?? valuesQuery.error ?? schemasQuery.error ?? modesQuery.error ?? beliefsQuery.error ?? behaviorsQuery.error;\n if (routeError) {\n return <ErrorState eyebrow=\"Psyche patterns\" error={routeError} onRetry={() => void Promise.all([patternsQuery.refetch(), valuesQuery.refetch(), schemasQuery.refetch(), modesQuery.refetch(), beliefsQuery.refetch(), behaviorsQuery.refetch()])} />;\n }\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n entityKind=\"pattern\"\n title={<EntityName kind=\"pattern\" label=\"Patterns\" variant=\"heading\" size=\"lg\" />}\n description=\"See each pattern as a loop: what starts it, what payoff it gives, what it costs, and what you want to do instead.\"\n badge={`${patterns.length} patterns`}\n actions={\n <Button\n onClick={() => {\n setEditingPattern(null);\n setDraft(DEFAULT_PATTERN_INPUT);\n setDialogOpen(true);\n }}\n >\n Add pattern\n </Button>\n }\n />\n <PsycheSectionNav />\n\n <OrbitMap\n title=\"See the loops that keep pulling against your values\"\n description=\"This map shows which patterns are hot, what they are connected to, and which response wants to replace them.\"\n centerLabel=\"Pattern field\"\n centerValue={`${patterns.length} tracked`}\n nodes={orbitNodes}\n action={<Button onClick={() => setDialogOpen(true)}>Add pattern</Button>}\n />\n\n {seedablePatterns.length > 0 ? (\n <AtlasPanel\n eyebrow=\"Seed behavior drafts\"\n title=\"Some patterns still do not have an explicit away-move draft\"\n description=\"These are the best candidates to push into the Behaviors page next.\"\n tone=\"rose\"\n >\n <div className=\"flex flex-wrap gap-2\">\n {seedablePatterns.slice(0, 8).map((pattern) => (\n <EntityBadge key={pattern.id} kind=\"pattern\" label={pattern.title} compact />\n ))}\n </div>\n </AtlasPanel>\n ) : null}\n\n <AtlasPanel\n eyebrow=\"Pattern action map\"\n title=\"Read each loop from cue to return path\"\n description=\"Each lane turns a raw pattern into a visible behavior map: cues, short-term relief, long-term cost, and the move you actually want.\"\n tone=\"sky\"\n className=\"scroll-mt-24\"\n >\n <div id=\"pattern-lanes\" className=\"grid gap-4\">\n {patterns.length === 0 ? (\n <div className=\"flex justify-start\">\n <Button onClick={() => setDialogOpen(true)}>Add pattern</Button>\n </div>\n ) : (\n patterns.map((pattern) => {\n const linkedValues = values.filter((value) => pattern.linkedValueIds.includes(value.id));\n const linkedModes = modes.filter((mode) => pattern.linkedModeIds.includes(mode.id));\n const linkedBeliefs = beliefs.filter((belief) => pattern.linkedBeliefIds.includes(belief.id));\n const isFocused = focusedPatternId === pattern.id;\n return (\n <div key={pattern.id} data-psyche-focus-id={pattern.id} className={`rounded-[28px] border border-white/8 bg-white/[0.04] p-5 transition ${psycheFocusClass(isFocused)}`}>\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div>\n <EntityName kind=\"pattern\" label={pattern.title} variant=\"heading\" size=\"xl\" />\n <div className=\"mt-2 text-sm leading-7 text-white/58\">{pattern.description}</div>\n </div>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setEditingPattern(pattern);\n setDraft(patternToInput(pattern));\n setDialogOpen(true);\n }}\n >\n Edit\n </Button>\n </div>\n <div className=\"mt-5 grid gap-3 xl:grid-cols-4\">\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Cue</div>\n <div className=\"mt-3 text-sm leading-6 text-white/68\">{pattern.cueContexts[0] ?? \"No cue captured yet.\"}</div>\n </div>\n <div className=\"rounded-[22px] bg-[rgba(251,113,133,0.08)] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Loop</div>\n <div className=\"mt-3 text-sm leading-6 text-white/68\">{pattern.targetBehavior}</div>\n </div>\n <div className=\"rounded-[22px] bg-[rgba(251,191,36,0.08)] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Short-term relief / long-term cost</div>\n <div className=\"mt-3 text-sm leading-6 text-white/68\">{pattern.shortTermPayoff || \"No payoff note yet.\"}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/52\">{pattern.longTermCost || \"No long-term cost note yet.\"}</div>\n </div>\n <div className=\"rounded-[22px] bg-[rgba(110,231,183,0.08)] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Return path</div>\n <div className=\"mt-3 text-sm leading-6 text-white/68\">{pattern.preferredResponse}</div>\n </div>\n </div>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {linkedValues.map((value) => (\n <EntityBadge key={value.id} kind=\"value\" label={value.title} compact />\n ))}\n {linkedModes.map((mode) => (\n <EntityBadge key={mode.id} kind=\"mode\" label={mode.title} compact />\n ))}\n {pattern.linkedModeLabels.map((label) => (\n <Badge key={`legacy-${label}`} className=\"text-violet-100\">\n {label}\n </Badge>\n ))}\n {pattern.linkedSchemaLabels.map((label) => (\n <SchemaBadge\n key={label}\n label={findSchemaForLink(label, schemas)?.title ?? label}\n schemaType={findSchemaForLink(label, schemas)?.schemaType ?? \"maladaptive\"}\n compact\n />\n ))}\n {linkedBeliefs.map((belief) => (\n <EntityBadge key={belief.id} kind=\"belief\" label={belief.statement} compact />\n ))}\n </div>\n </div>\n );\n })\n )}\n </div>\n </AtlasPanel>\n\n <QuestionFlowDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n eyebrow=\"Behavior pattern\"\n title={editingPattern ? \"Refine pattern lane\" : \"Create pattern\"}\n description=\"Pattern capture should feel like mapping a loop, not filling an admin form.\"\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel={editingPattern ? \"Save pattern\" : \"Create pattern\"}\n pending={saveMutation.isPending}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const parsed = behaviorPatternSchema.safeParse(draft);\n if (!parsed.success) {\n setSubmitError(\"This pattern still needs a title, a loop description, and a preferred response.\");\n return;\n }\n\n try {\n await saveMutation.mutateAsync(parsed.data);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Unable to save this pattern right now.\");\n }\n }}\n />\n </div>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport { PanelRightClose, PanelRightOpen } from \"lucide-react\";\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\nconst MOBILE_BREAKPOINT_QUERY = \"(max-width: 1023px)\";\n\nfunction useIsMobileCanvas() {\n const [isMobile, setIsMobile] = useState(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(MOBILE_BREAKPOINT_QUERY).matches;\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(MOBILE_BREAKPOINT_QUERY);\n const updateMatch = (event: MediaQueryListEvent) => setIsMobile(event.matches);\n setIsMobile(mediaQuery.matches);\n\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", updateMatch);\n return () => mediaQuery.removeEventListener(\"change\", updateMatch);\n }\n\n mediaQuery.addListener(updateMatch);\n return () => mediaQuery.removeListener(updateMatch);\n }, []);\n\n return isMobile;\n}\n\nexport function ChainCanvas({\n stages,\n activeStageId,\n onStageChange,\n stageContent,\n inspector\n}: {\n stages: Array<{ id: string; label: string; summary: string }>;\n activeStageId: string;\n onStageChange: (stageId: string) => void;\n stageContent: ReactNode;\n inspector?: ReactNode;\n}) {\n const isMobile = useIsMobileCanvas();\n const [inspectorOpen, setInspectorOpen] = useState(false);\n const activeStage = stages.find((stage) => stage.id === activeStageId);\n\n useEffect(() => {\n setInspectorOpen(!isMobile);\n }, [isMobile]);\n\n return (\n <section className=\"grid gap-4 xl:grid-cols-[minmax(0,1fr)_18rem]\">\n <div className=\"rounded-[30px] border border-white/8 bg-[radial-gradient(circle_at_top,rgba(196,181,253,0.12),transparent_38%),linear-gradient(180deg,rgba(21,20,38,0.98),rgba(10,12,22,0.96))] p-4\">\n <div className=\"mb-4 flex items-start justify-between gap-3\">\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/38\">Tracing the chain</div>\n <div className=\"mt-1 text-sm text-white/58\">{activeStage?.summary}</div>\n </div>\n {inspector ? (\n <Button variant=\"secondary\" size=\"sm\" onClick={() => setInspectorOpen((current) => !current)}>\n {inspectorOpen ? <PanelRightClose className=\"size-4\" /> : <PanelRightOpen className=\"size-4\" />}\n Inspector\n </Button>\n ) : null}\n </div>\n\n <div className=\"mb-4 overflow-x-auto pb-1\">\n <div className=\"flex min-w-max items-center gap-3\">\n {stages.map((stage, index) => (\n <button\n key={stage.id}\n type=\"button\"\n className={cn(\n \"rounded-[22px] px-4 py-3 text-left transition\",\n stage.id === activeStageId ? \"bg-[rgba(196,181,253,0.18)] text-white shadow-[0_18px_40px_rgba(15,12,28,0.28)]\" : \"bg-white/[0.04] text-white/58 hover:bg-white/[0.07] hover:text-white\"\n )}\n onClick={() => onStageChange(stage.id)}\n >\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/34\">\n {index + 1}. {stage.label}\n </div>\n {!isMobile ? <div className=\"mt-1.5 text-sm leading-5\">{stage.summary}</div> : null}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"rounded-[28px] border border-white/8 bg-[linear-gradient(180deg,rgba(255,255,255,0.04),rgba(255,255,255,0.02))] p-4 md:p-5\">\n <div className=\"mb-4 flex flex-wrap items-center gap-2\">\n <span className=\"rounded-full bg-white/[0.07] px-3 py-1.5 text-[11px] uppercase tracking-[0.18em] text-white/42\">\n {activeStage?.label}\n </span>\n <span className=\"text-sm text-white/54\">{activeStage?.summary}</span>\n </div>\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={activeStageId}\n initial={{ opacity: 0, y: 14 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -14 }}\n transition={{ duration: 0.26, ease: \"easeOut\" }}\n >\n {stageContent}\n </motion.div>\n </AnimatePresence>\n </div>\n </div>\n\n {inspector ? (\n <AnimatePresence initial={false}>\n {inspectorOpen ? (\n <motion.div\n initial={{ opacity: 0, x: 16 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 16 }}\n transition={{ duration: 0.22, ease: \"easeOut\" }}\n className=\"rounded-[26px] border border-white/8 bg-[linear-gradient(180deg,rgba(17,24,35,0.96),rgba(11,16,24,0.94))] p-3.5\"\n >\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">Linked inspectors</div>\n <div className=\"mt-3 grid gap-3\">{inspector}</div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n ) : null}\n </section>\n );\n}\n","import { Plus, X } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport type {\n BeliefEntry,\n Behavior,\n EmotionDefinition,\n ModeProfile,\n ModeTimelineEntry,\n TriggerBehavior,\n TriggerEmotion,\n TriggerThought\n} from \"@/lib/psyche-types\";\n\nfunction makeLocalId(prefix: string) {\n return `${prefix}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function createEmotionDraft(): TriggerEmotion {\n return {\n id: makeLocalId(\"emotion\"),\n emotionDefinitionId: null,\n label: \"\",\n intensity: 55,\n note: \"\"\n };\n}\n\nexport function createThoughtDraft(): TriggerThought {\n return {\n id: makeLocalId(\"thought\"),\n text: \"\",\n parentMode: \"\",\n criticMode: \"\",\n beliefId: null\n };\n}\n\nexport function createBehaviorDraft(): TriggerBehavior {\n return {\n id: makeLocalId(\"behavior\"),\n text: \"\",\n mode: \"\",\n behaviorId: null\n };\n}\n\nexport function createModeTimelineDraft(): ModeTimelineEntry {\n return {\n id: makeLocalId(\"timeline\"),\n stage: \"\",\n modeId: null,\n label: \"\",\n note: \"\"\n };\n}\n\nfunction SectionHeader({\n title,\n description,\n onAdd,\n addLabel\n}: {\n title: string;\n description: string;\n onAdd: () => void;\n addLabel: string;\n}) {\n return (\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"text-base font-medium text-white\">{title}</div>\n <div className=\"mt-1 text-sm leading-6 text-white/56\">{description}</div>\n </div>\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={onAdd}>\n <Plus className=\"size-4\" />\n {addLabel}\n </Button>\n </div>\n );\n}\n\nfunction RemoveButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n className=\"rounded-full bg-white/[0.06] p-2 text-white/55 transition hover:bg-white/[0.12] hover:text-white\"\n onClick={onClick}\n aria-label=\"Remove row\"\n >\n <X className=\"size-4\" />\n </button>\n );\n}\n\nexport function StringListEditor({\n title,\n description,\n addLabel,\n items,\n onChange,\n placeholder\n}: {\n title: string;\n description: string;\n addLabel: string;\n items: string[];\n onChange: (items: string[]) => void;\n placeholder: string;\n}) {\n return (\n <div className=\"grid gap-3\">\n <SectionHeader\n title={title}\n description={description}\n addLabel={addLabel}\n onAdd={() => onChange([...items, \"\"])}\n />\n <div className=\"grid gap-3\">\n {items.map((item, index) => (\n <div key={`${title}-${index}`} className=\"flex items-start gap-3 rounded-[22px] border border-white/8 bg-white/[0.04] p-4\">\n <Input\n value={item}\n onChange={(event) => onChange(items.map((entry, itemIndex) => (itemIndex === index ? event.target.value : entry)))}\n placeholder={placeholder}\n />\n <RemoveButton onClick={() => onChange(items.filter((_, itemIndex) => itemIndex !== index))} />\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport function EmotionRowsEditor({\n items,\n onChange,\n definitions\n}: {\n items: TriggerEmotion[];\n onChange: (items: TriggerEmotion[]) => void;\n definitions: EmotionDefinition[];\n}) {\n return (\n <div className=\"grid gap-3\">\n <SectionHeader\n title=\"What emotions were present?\"\n description=\"Add one emotion at a time, set the intensity, and note what stood out.\"\n addLabel=\"Add emotion\"\n onAdd={() => onChange([...items, createEmotionDraft()])}\n />\n <div className=\"grid gap-3\">\n {items.map((item) => (\n <div key={item.id} className=\"grid gap-4 rounded-[24px] border border-white/8 bg-white/[0.04] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"grid flex-1 gap-4 md:grid-cols-[minmax(0,1fr)_9rem]\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Emotion</span>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={item.emotionDefinitionId ?? \"\"}\n onChange={(event) => {\n const definition = definitions.find((entry) => entry.id === event.target.value);\n onChange(\n items.map((entry) =>\n entry.id === item.id\n ? {\n ...entry,\n emotionDefinitionId: event.target.value || null,\n label: definition?.label ?? entry.label\n }\n : entry\n )\n );\n }}\n >\n <option value=\"\">Choose or type your own</option>\n {definitions.map((definition) => (\n <option key={definition.id} value={definition.id}>\n {definition.label}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Intensity</span>\n <div className=\"rounded-[18px] border border-white/8 bg-white/[0.03] px-4 py-3\">\n <input\n type=\"range\"\n min={0}\n max={100}\n value={item.intensity}\n onChange={(event) =>\n onChange(items.map((entry) => (entry.id === item.id ? { ...entry, intensity: Number(event.target.value) } : entry)))\n }\n />\n <div className=\"mt-2 text-sm text-white/52\">{item.intensity}%</div>\n </div>\n </label>\n </div>\n <RemoveButton onClick={() => onChange(items.filter((entry) => entry.id !== item.id))} />\n </div>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">If the preset is not right, how would you name it?</span>\n <Input\n value={item.label}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, label: event.target.value } : entry)))}\n placeholder=\"Tight sadness, panic, shame, relief...\"\n />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">What was notable about this emotion?</span>\n <Textarea\n value={item.note}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, note: event.target.value } : entry)))}\n placeholder=\"Short note about what made this emotion stand out.\"\n />\n </label>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport function ThoughtRowsEditor({\n items,\n onChange,\n beliefs,\n modes\n}: {\n items: TriggerThought[];\n onChange: (items: TriggerThought[]) => void;\n beliefs: BeliefEntry[];\n modes: ModeProfile[];\n}) {\n return (\n <div className=\"grid gap-3\">\n <SectionHeader\n title=\"What did your mind start saying?\"\n description=\"Capture the thought itself first, then optionally link a belief or mode influence.\"\n addLabel=\"Add thought\"\n onAdd={() => onChange([...items, createThoughtDraft()])}\n />\n <div className=\"grid gap-3\">\n {items.map((item) => (\n <div key={item.id} className=\"grid gap-4 rounded-[24px] border border-white/8 bg-white/[0.04] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <label className=\"grid flex-1 gap-2\">\n <span className=\"text-sm text-white/62\">Thought</span>\n <Textarea\n value={item.text}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, text: event.target.value } : entry)))}\n placeholder=\"What sentence, image, or conclusion showed up?\"\n />\n </label>\n <RemoveButton onClick={() => onChange(items.filter((entry) => entry.id !== item.id))} />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Parent mode influence</span>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={item.parentMode}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, parentMode: event.target.value } : entry)))}\n >\n <option value=\"\">None</option>\n {modes.map((mode) => (\n <option key={mode.id} value={mode.title}>\n {mode.title}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Critic mode influence</span>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={item.criticMode}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, criticMode: event.target.value } : entry)))}\n >\n <option value=\"\">None</option>\n {modes.map((mode) => (\n <option key={mode.id} value={mode.title}>\n {mode.title}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Linked belief</span>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={item.beliefId ?? \"\"}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, beliefId: event.target.value || null } : entry)))}\n >\n <option value=\"\">None</option>\n {beliefs.map((belief) => (\n <option key={belief.id} value={belief.id}>\n {belief.statement}\n </option>\n ))}\n </select>\n </label>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport function BehaviorRowsEditor({\n items,\n onChange,\n behaviors,\n modes\n}: {\n items: TriggerBehavior[];\n onChange: (items: TriggerBehavior[]) => void;\n behaviors: Behavior[];\n modes: ModeProfile[];\n}) {\n return (\n <div className=\"grid gap-3\">\n <SectionHeader\n title=\"What did you do, or want to do?\"\n description=\"Capture the move itself, then optionally link an existing behavior and the mode context around it.\"\n addLabel=\"Add behavior\"\n onAdd={() => onChange([...items, createBehaviorDraft()])}\n />\n <div className=\"grid gap-3\">\n {items.map((item) => (\n <div key={item.id} className=\"grid gap-4 rounded-[24px] border border-white/8 bg-white/[0.04] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <label className=\"grid flex-1 gap-2\">\n <span className=\"text-sm text-white/62\">Behavior or urge</span>\n <Textarea\n value={item.text}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, text: event.target.value } : entry)))}\n placeholder=\"What did you do, or what move did you feel pulled toward?\"\n />\n </label>\n <RemoveButton onClick={() => onChange(items.filter((entry) => entry.id !== item.id))} />\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Linked existing behavior</span>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={item.behaviorId ?? \"\"}\n onChange={(event) => {\n const linked = behaviors.find((entry) => entry.id === event.target.value);\n onChange(\n items.map((entry) =>\n entry.id === item.id\n ? {\n ...entry,\n behaviorId: event.target.value || null,\n text: linked && !entry.text ? linked.title : entry.text\n }\n : entry\n )\n );\n }}\n >\n <option value=\"\">None</option>\n {behaviors.map((behavior) => (\n <option key={behavior.id} value={behavior.id}>\n {behavior.title}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Mode or urge context</span>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={item.mode}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, mode: event.target.value } : entry)))}\n >\n <option value=\"\">None</option>\n {modes.map((mode) => (\n <option key={mode.id} value={mode.title}>\n {mode.title}\n </option>\n ))}\n </select>\n </label>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport function ModeTimelineEditor({\n items,\n onChange,\n modes,\n stages\n}: {\n items: ModeTimelineEntry[];\n onChange: (items: ModeTimelineEntry[]) => void;\n modes: ModeProfile[];\n stages: string[];\n}) {\n return (\n <div className=\"grid gap-3\">\n <SectionHeader\n title=\"How did your state shift through the chain?\"\n description=\"Build the mode timeline one moment at a time instead of typing parser syntax.\"\n addLabel=\"Add timeline moment\"\n onAdd={() => onChange([...items, createModeTimelineDraft()])}\n />\n <div className=\"grid gap-3\">\n {items.map((item) => (\n <div key={item.id} className=\"grid gap-4 rounded-[24px] border border-white/8 bg-white/[0.04] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"grid flex-1 gap-4 md:grid-cols-3\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Stage</span>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={item.stage}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, stage: event.target.value } : entry)))}\n >\n <option value=\"\">Choose stage</option>\n {stages.map((stage) => (\n <option key={stage} value={stage}>\n {stage}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Mode</span>\n <select\n className=\"rounded-[18px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\"\n value={item.modeId ?? \"\"}\n onChange={(event) => {\n const mode = modes.find((entry) => entry.id === event.target.value);\n onChange(\n items.map((entry) =>\n entry.id === item.id\n ? {\n ...entry,\n modeId: event.target.value || null,\n label: mode && !entry.label ? mode.title : entry.label\n }\n : entry\n )\n );\n }}\n >\n <option value=\"\">Choose mode</option>\n {modes.map((mode) => (\n <option key={mode.id} value={mode.id}>\n {mode.title}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">Moment label</span>\n <Input\n value={item.label}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, label: event.target.value } : entry)))}\n placeholder=\"What was happening in this moment?\"\n />\n </label>\n </div>\n <RemoveButton onClick={() => onChange(items.filter((entry) => entry.id !== item.id))} />\n </div>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/62\">What was important about this shift?</span>\n <Textarea\n value={item.note}\n onChange={(event) => onChange(items.map((entry) => (entry.id === item.id ? { ...entry, note: event.target.value } : entry)))}\n placeholder=\"Short note about how the mode showed up or what it was protecting.\"\n />\n </label>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import type {\n ModeTimelineEntry,\n TriggerBehavior,\n TriggerConsequences,\n TriggerEmotion,\n TriggerThought\n} from \"./psyche-types\";\n\nfunction normalizeLines(value: string) {\n return value\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nfunction nextLocalId(prefix: string, index: number) {\n return `${prefix}_${index + 1}`;\n}\n\nexport function formatLines(values: string[]) {\n return values.join(\"\\n\");\n}\n\nexport function parseLines(value: string) {\n return normalizeLines(value);\n}\n\nexport function formatEmotionLines(emotions: TriggerEmotion[]) {\n return emotions\n .map((emotion) =>\n `${emotion.label} | ${emotion.intensity} | ${emotion.note} | ${emotion.emotionDefinitionId ?? \"\"}`.trim()\n )\n .join(\"\\n\");\n}\n\nexport function parseEmotionLines(value: string): TriggerEmotion[] {\n return normalizeLines(value).map((line, index) => {\n const [label = \"\", intensityText = \"50\", note = \"\", emotionDefinitionId = \"\"] = line\n .split(\"|\")\n .map((entry) => entry.trim());\n const intensity = Number.parseInt(intensityText || \"50\", 10);\n return {\n id: nextLocalId(\"emotion\", index),\n emotionDefinitionId: emotionDefinitionId || null,\n label,\n intensity: Number.isFinite(intensity) ? Math.max(0, Math.min(100, intensity)) : 50,\n note\n };\n });\n}\n\nexport function formatThoughtLines(thoughts: TriggerThought[]) {\n return thoughts\n .map((thought) => `${thought.text} | ${thought.parentMode} | ${thought.criticMode} | ${thought.beliefId ?? \"\"}`.trim())\n .join(\"\\n\");\n}\n\nexport function parseThoughtLines(value: string): TriggerThought[] {\n return normalizeLines(value).map((line, index) => {\n const [text = \"\", parentMode = \"\", criticMode = \"\", beliefId = \"\"] = line.split(\"|\").map((entry) => entry.trim());\n return {\n id: nextLocalId(\"thought\", index),\n text,\n parentMode,\n criticMode,\n beliefId: beliefId || null\n };\n });\n}\n\nexport function formatBehaviorLines(behaviors: TriggerBehavior[]) {\n return behaviors\n .map((behavior) => `${behavior.text} | ${behavior.mode} | ${behavior.behaviorId ?? \"\"}`.trim())\n .join(\"\\n\");\n}\n\nexport function parseBehaviorLines(value: string): TriggerBehavior[] {\n return normalizeLines(value).map((line, index) => {\n const [text = \"\", mode = \"\", behaviorId = \"\"] = line.split(\"|\").map((entry) => entry.trim());\n return {\n id: nextLocalId(\"behavior\", index),\n text,\n mode,\n behaviorId: behaviorId || null\n };\n });\n}\n\nexport function formatModeTimelineLines(entries: ModeTimelineEntry[]) {\n return entries.map((entry) => `${entry.stage} | ${entry.label} | ${entry.note}`.trim()).join(\"\\n\");\n}\n\nexport function parseModeTimelineLines(value: string): ModeTimelineEntry[] {\n return normalizeLines(value).map((line, index) => {\n const [stage = \"\", label = \"\", note = \"\"] = line.split(\"|\").map((entry) => entry.trim());\n return {\n id: nextLocalId(\"timeline\", index),\n stage,\n modeId: null,\n label,\n note\n };\n });\n}\n\nexport function formatConsequences(consequences: TriggerConsequences) {\n return {\n selfShortTerm: formatLines(consequences.selfShortTerm),\n selfLongTerm: formatLines(consequences.selfLongTerm),\n othersShortTerm: formatLines(consequences.othersShortTerm),\n othersLongTerm: formatLines(consequences.othersLongTerm)\n };\n}\n\nexport function parseConsequences(input: {\n selfShortTerm: string;\n selfLongTerm: string;\n othersShortTerm: string;\n othersLongTerm: string;\n}): TriggerConsequences {\n return {\n selfShortTerm: parseLines(input.selfShortTerm),\n selfLongTerm: parseLines(input.selfLongTerm),\n othersShortTerm: parseLines(input.othersShortTerm),\n othersLongTerm: parseLines(input.othersLongTerm)\n };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useParams } from \"react-router-dom\";\nimport { ChainCanvas } from \"@/components/psyche/chain-canvas\";\nimport { InsightFlowDialog } from \"@/components/insights/insight-flow-dialog\";\nimport { SchemaBadge } from \"@/components/psyche/schema-badge\";\nimport {\n BehaviorRowsEditor,\n EmotionRowsEditor,\n ModeTimelineEditor,\n StringListEditor,\n ThoughtRowsEditor\n} from \"@/components/psyche/report-chain-fields\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { SurfaceSkeleton } from \"@/components/experience/surface-skeleton\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { FieldHint, InfoTooltip } from \"@/components/ui/info-tooltip\";\nimport { ErrorState } from \"@/components/ui/page-state\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport {\n createComment,\n createInsight,\n getTriggerReport,\n listBehaviors,\n listBeliefs,\n listEmotionDefinitions,\n listEventTypes,\n listSchemaCatalog,\n listModes,\n patchTriggerReport\n} from \"@/lib/api\";\nimport { formatLines } from \"@/lib/psyche-formats\";\nimport { triggerReportSchema } from \"@/lib/psyche-schemas\";\nimport type { ModeTimelineEntry, SchemaCatalogEntry, TriggerBehavior, TriggerEmotion, TriggerReport, TriggerThought } from \"@/lib/psyche-types\";\nimport { findSchemaForLink, getSchemaTypeHelpText, getSchemaTypeLabel, getSchemaVisual, toggleSchemaSelection } from \"@/lib/schema-visuals\";\nimport { formatDateTime } from \"@/lib/utils\";\n\ntype ReportEditorShape = {\n title: string;\n status: \"draft\" | \"reviewed\" | \"integrated\";\n eventTypeId: string;\n customEventType: string;\n eventSituation: string;\n occurredAt: string;\n emotions: TriggerEmotion[];\n thoughts: TriggerThought[];\n behaviors: TriggerBehavior[];\n selfShortTerm: string[];\n selfLongTerm: string[];\n othersShortTerm: string[];\n othersLongTerm: string[];\n modeOverlaysText: string;\n schemaLinks: string[];\n modeTimeline: ModeTimelineEntry[];\n nextMoves: string[];\n linkedBehaviorIds: string[];\n linkedBeliefIds: string[];\n linkedModeIds: string[];\n};\n\nfunction toggleId(current: string[], id: string) {\n return current.includes(id) ? current.filter((entry) => entry !== id) : [...current, id];\n}\n\nfunction toEditor(report: TriggerReport): ReportEditorShape {\n return {\n title: report.title,\n status: report.status,\n eventTypeId: report.eventTypeId ?? \"\",\n customEventType: report.customEventType,\n eventSituation: report.eventSituation,\n occurredAt: report.occurredAt ? report.occurredAt.slice(0, 16) : \"\",\n emotions: report.emotions,\n thoughts: report.thoughts,\n behaviors: report.behaviors,\n selfShortTerm: report.consequences.selfShortTerm,\n selfLongTerm: report.consequences.selfLongTerm,\n othersShortTerm: report.consequences.othersShortTerm,\n othersLongTerm: report.consequences.othersLongTerm,\n modeOverlaysText: formatLines(report.modeOverlays),\n schemaLinks: report.schemaLinks,\n modeTimeline: report.modeTimeline,\n nextMoves: report.nextMoves,\n linkedBehaviorIds: report.linkedBehaviorIds,\n linkedBeliefIds: report.linkedBeliefIds,\n linkedModeIds: report.linkedModeIds\n };\n}\n\nexport function PsycheReportDetailPage() {\n const { reportId } = useParams();\n const queryClient = useQueryClient();\n const [activeStage, setActiveStage] = useState(\"spark\");\n const [draft, setDraft] = useState<ReportEditorShape | null>(null);\n const [commentBody, setCommentBody] = useState(\"\");\n const [insightFlowOpen, setInsightFlowOpen] = useState(false);\n const reportQuery = useQuery({\n queryKey: [\"forge-psyche-report\", reportId],\n queryFn: () => getTriggerReport(reportId!),\n enabled: Boolean(reportId)\n });\n const behaviorsQuery = useQuery({ queryKey: [\"forge-psyche-behaviors\"], queryFn: listBehaviors });\n const beliefsQuery = useQuery({ queryKey: [\"forge-psyche-beliefs\"], queryFn: listBeliefs });\n const modesQuery = useQuery({ queryKey: [\"forge-psyche-modes\"], queryFn: listModes });\n const schemasQuery = useQuery({ queryKey: [\"forge-psyche-schema-catalog\"], queryFn: listSchemaCatalog });\n const eventTypesQuery = useQuery({ queryKey: [\"forge-psyche-event-types\"], queryFn: listEventTypes });\n const emotionsQuery = useQuery({ queryKey: [\"forge-psyche-emotions\"], queryFn: listEmotionDefinitions });\n\n useEffect(() => {\n if (reportQuery.data?.report) {\n setDraft(toEditor(reportQuery.data.report));\n }\n }, [reportQuery.data]);\n\n const saveMutation = useMutation({\n mutationFn: async (value: ReportEditorShape) => {\n const currentReport = reportQuery.data?.report;\n const payload = triggerReportSchema.parse({\n title: value.title,\n status: value.status,\n eventTypeId: value.eventTypeId || null,\n customEventType: value.customEventType,\n eventSituation: value.eventSituation,\n occurredAt: value.occurredAt ? new Date(value.occurredAt).toISOString() : null,\n emotions: value.emotions.filter((entry) => entry.label.trim().length > 0),\n thoughts: value.thoughts.filter((entry) => entry.text.trim().length > 0),\n behaviors: value.behaviors.filter((entry) => entry.text.trim().length > 0),\n consequences: {\n selfShortTerm: value.selfShortTerm,\n selfLongTerm: value.selfLongTerm,\n othersShortTerm: value.othersShortTerm,\n othersLongTerm: value.othersLongTerm\n },\n linkedPatternIds: currentReport?.linkedPatternIds ?? [],\n linkedValueIds: currentReport?.linkedValueIds ?? [],\n linkedGoalIds: currentReport?.linkedGoalIds ?? [],\n linkedProjectIds: currentReport?.linkedProjectIds ?? [],\n linkedTaskIds: currentReport?.linkedTaskIds ?? [],\n linkedBehaviorIds: value.linkedBehaviorIds,\n linkedBeliefIds: value.linkedBeliefIds,\n linkedModeIds: value.linkedModeIds,\n modeOverlays: value.modeOverlaysText\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n schemaLinks: value.schemaLinks.filter(Boolean),\n modeTimeline: value.modeTimeline.filter((entry) => entry.stage.trim().length > 0 && entry.label.trim().length > 0),\n nextMoves: value.nextMoves.filter(Boolean)\n });\n return patchTriggerReport(reportId!, payload);\n },\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-report\", reportId] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-reports\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-reward-ledger\"] })\n ]);\n }\n });\n\n const commentMutation = useMutation({\n mutationFn: async (body: string) =>\n createComment({\n entityType: \"trigger_report\",\n entityId: reportId!,\n anchorKey: activeStage,\n body\n }),\n onSuccess: async () => {\n setCommentBody(\"\");\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-report\", reportId] });\n }\n });\n\n const insightMutation = useMutation({\n mutationFn: createInsight,\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-report\", reportId] });\n await queryClient.invalidateQueries({ queryKey: [\"forge-insights\"] });\n }\n });\n\n const detailError = reportQuery.error ?? behaviorsQuery.error ?? beliefsQuery.error ?? modesQuery.error ?? schemasQuery.error ?? eventTypesQuery.error ?? emotionsQuery.error ?? null;\n\n if (reportQuery.isLoading || !draft) {\n return <SurfaceSkeleton />;\n }\n\n if (detailError) {\n return <ErrorState eyebrow=\"Trigger report\" error={detailError} onRetry={() => void Promise.all([reportQuery.refetch(), behaviorsQuery.refetch(), beliefsQuery.refetch(), modesQuery.refetch(), schemasQuery.refetch(), eventTypesQuery.refetch(), emotionsQuery.refetch()])} />;\n }\n\n if (!reportQuery.data) {\n return <ErrorState eyebrow=\"Trigger report\" error={new Error(\"Forge returned an empty trigger report payload.\")} onRetry={() => void reportQuery.refetch()} />;\n }\n\n const payload = reportQuery.data;\n const report = payload.report;\n const behaviors = behaviorsQuery.data?.behaviors ?? [];\n const beliefs = beliefsQuery.data?.beliefs ?? [];\n const modes = modesQuery.data?.modes ?? [];\n const schemas = schemasQuery.data?.schemas ?? [];\n const eventTypes = eventTypesQuery.data?.eventTypes ?? [];\n const emotions = emotionsQuery.data?.emotions ?? [];\n const activeStageComments = payload.comments.filter((comment) => comment.anchorKey === activeStage || comment.anchorKey === null);\n const stages = [\n { id: \"spark\", label: \"Spark\", summary: \"What happened concretely?\" },\n { id: \"wave\", label: \"Wave\", summary: \"What emotional wave moved through you?\" },\n { id: \"script\", label: \"Script\", summary: \"What did the mind start saying?\" },\n { id: \"lens\", label: \"Lens\", summary: \"Which schemas and beliefs got activated?\" },\n { id: \"state\", label: \"State\", summary: \"Which modes took the wheel?\" },\n { id: \"move\", label: \"Move\", summary: \"What did you do or want to do?\" },\n { id: \"horizon\", label: \"Horizon\", summary: \"What were the consequences?\" },\n { id: \"pivot\", label: \"Pivot\", summary: \"What is the next move now?\" }\n ];\n\n const stageContent = {\n spark: (\n <div className=\"grid gap-4\">\n <div className=\"grid gap-4 md:grid-cols-[minmax(0,1fr)_13rem]\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Title</span>\n <Input value={draft.title} onChange={(event) => setDraft({ ...draft, title: event.target.value })} />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Status</span>\n <select className=\"rounded-[22px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\" value={draft.status} onChange={(event) => setDraft({ ...draft, status: event.target.value as ReportEditorShape[\"status\"] })}>\n <option value=\"draft\">draft</option>\n <option value=\"reviewed\">reviewed</option>\n <option value=\"integrated\">integrated</option>\n </select>\n </label>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Event type</span>\n <select className=\"rounded-[22px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\" value={draft.eventTypeId} onChange={(event) => setDraft({ ...draft, eventTypeId: event.target.value })}>\n <option value=\"\">Custom or uncategorized</option>\n {eventTypes.map((eventType) => (\n <option key={eventType.id} value={eventType.id}>\n {eventType.label}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Occurred at</span>\n <Input type=\"datetime-local\" value={draft.occurredAt} onChange={(event) => setDraft({ ...draft, occurredAt: event.target.value })} />\n </label>\n </div>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Custom event label</span>\n <Input value={draft.customEventType} onChange={(event) => setDraft({ ...draft, customEventType: event.target.value })} />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Situation</span>\n <Textarea value={draft.eventSituation} onChange={(event) => setDraft({ ...draft, eventSituation: event.target.value })} />\n </label>\n </div>\n ),\n wave: (\n <EmotionRowsEditor items={draft.emotions} onChange={(items) => setDraft({ ...draft, emotions: items })} definitions={emotions} />\n ),\n script: (\n <ThoughtRowsEditor items={draft.thoughts} onChange={(items) => setDraft({ ...draft, thoughts: items })} beliefs={beliefs} modes={modes} />\n ),\n lens: (\n <div className=\"grid gap-4\">\n <div className=\"grid gap-4 rounded-[24px] border border-white/8 bg-white/[0.03] p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-sm font-medium text-white\">Schema links</div>\n <InfoTooltip content=\"Use maladaptive schemas for recurring old patterns that were active here. Use adaptive schemas for healthier patterns you want this response to build on.\" label=\"Explain schema links\" />\n </div>\n <FieldHint>Choose the schemas that were active here or that you want the repair move to strengthen.</FieldHint>\n {([\n {\n title: \"Maladaptive schemas\",\n schemas: schemas.filter((schema) => schema.schemaType === \"maladaptive\"),\n schemaType: \"maladaptive\" as const,\n description: \"Recurring old patterns that felt active in this moment.\"\n },\n {\n title: \"Adaptive schemas\",\n schemas: schemas.filter((schema) => schema.schemaType === \"adaptive\"),\n schemaType: \"adaptive\" as const,\n description: \"Healthier stable themes you want this chain to strengthen.\"\n }\n ]).map((group) => {\n const visual = getSchemaVisual(group.schemaType);\n return (\n <div key={group.schemaType} className={`rounded-[22px] border p-4 ${visual.cardTone}`}>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-sm font-medium text-white\">{group.title}</div>\n <InfoTooltip content={getSchemaTypeHelpText(group.schemaType)} label={`Explain ${getSchemaTypeLabel(group.schemaType)}`} />\n </div>\n <FieldHint className=\"mt-2\">{group.description}</FieldHint>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {group.schemas.map((schema) => {\n const selected = draft.schemaLinks.some((entry) => findSchemaForLink(entry, [schema])?.id === schema.id);\n return (\n <button\n key={schema.id}\n type=\"button\"\n className={`rounded-full border px-3 py-2 text-sm transition ${selected ? `${visual.badgeTone} ring-1 ring-white/18` : \"border-white/8 bg-white/[0.04] text-white/58 hover:bg-white/[0.08] hover:text-white\"}`}\n onClick={() => setDraft({ ...draft, schemaLinks: toggleSchemaSelection(draft.schemaLinks, schema) })}\n >\n {schema.title}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n <div>\n <div className=\"text-sm text-white/58\">Linked beliefs</div>\n <div className=\"mt-3 flex max-h-56 flex-wrap gap-2 overflow-y-auto\">\n {beliefs.map((belief) => {\n const selected = draft.linkedBeliefIds.includes(belief.id);\n return (\n <button\n key={belief.id}\n type=\"button\"\n className={`rounded-full px-3 py-2 text-sm transition ${selected ? \"bg-[rgba(196,181,253,0.18)] text-violet-100\" : \"bg-white/[0.05] text-white/58 hover:bg-white/[0.08] hover:text-white\"}`}\n onClick={() => setDraft({ ...draft, linkedBeliefIds: toggleId(draft.linkedBeliefIds, belief.id) })}\n >\n {belief.statement}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n ),\n state: (\n <div className=\"grid gap-4\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Mode overlays</span>\n <Textarea value={draft.modeOverlaysText} onChange={(event) => setDraft({ ...draft, modeOverlaysText: event.target.value })} />\n </label>\n <ModeTimelineEditor\n items={draft.modeTimeline}\n onChange={(items) => setDraft({ ...draft, modeTimeline: items })}\n modes={modes}\n stages={stages.map((stage) => stage.label)}\n />\n <div>\n <div className=\"text-sm text-white/58\">Linked modes</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {modes.map((mode) => {\n const selected = draft.linkedModeIds.includes(mode.id);\n return (\n <button\n key={mode.id}\n type=\"button\"\n className={`rounded-full px-3 py-2 text-sm transition ${selected ? \"bg-[rgba(251,191,36,0.18)] text-amber-100\" : \"bg-white/[0.05] text-white/58 hover:bg-white/[0.08] hover:text-white\"}`}\n onClick={() => setDraft({ ...draft, linkedModeIds: toggleId(draft.linkedModeIds, mode.id) })}\n >\n {mode.title}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n ),\n move: (\n <div className=\"grid gap-4\">\n <BehaviorRowsEditor items={draft.behaviors} onChange={(items) => setDraft({ ...draft, behaviors: items })} behaviors={behaviors} modes={modes} />\n <div>\n <div className=\"text-sm text-white/58\">Linked behaviors</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {behaviors.map((behavior) => {\n const selected = draft.linkedBehaviorIds.includes(behavior.id);\n return (\n <button\n key={behavior.id}\n type=\"button\"\n className={`rounded-full px-3 py-2 text-sm transition ${selected ? \"bg-[rgba(251,113,133,0.16)] text-rose-100\" : \"bg-white/[0.05] text-white/58 hover:bg-white/[0.08] hover:text-white\"}`}\n onClick={() => setDraft({ ...draft, linkedBehaviorIds: toggleId(draft.linkedBehaviorIds, behavior.id) })}\n >\n {behavior.title}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n ),\n horizon: (\n <div className=\"grid gap-4 md:grid-cols-2\">\n <StringListEditor title=\"Short-term impact on you\" description=\"What happened to you right away?\" addLabel=\"Add self effect\" items={draft.selfShortTerm} onChange={(items) => setDraft({ ...draft, selfShortTerm: items })} placeholder=\"I shut down and lost the evening.\" />\n <StringListEditor title=\"Long-term impact on you\" description=\"What does this cost if it keeps repeating?\" addLabel=\"Add self cost\" items={draft.selfLongTerm} onChange={(items) => setDraft({ ...draft, selfLongTerm: items })} placeholder=\"It keeps training the same abandonment script.\" />\n <StringListEditor title=\"Short-term impact on others\" description=\"What happened to other people right away?\" addLabel=\"Add other effect\" items={draft.othersShortTerm} onChange={(items) => setDraft({ ...draft, othersShortTerm: items })} placeholder=\"They felt shut out.\" />\n <StringListEditor title=\"Long-term impact on others\" description=\"What pattern does this create over time?\" addLabel=\"Add other cost\" items={draft.othersLongTerm} onChange={(items) => setDraft({ ...draft, othersLongTerm: items })} placeholder=\"Trust gets thinner each time.\" />\n </div>\n ),\n pivot: (\n <div className=\"grid gap-4\">\n <StringListEditor\n title=\"What is the next move now?\"\n description=\"Finish with concrete repairs, boundaries, or committed actions.\"\n addLabel=\"Add next move\"\n items={draft.nextMoves}\n onChange={(items) => setDraft({ ...draft, nextMoves: items })}\n placeholder=\"Send one honest repair message tomorrow morning.\"\n />\n <div className=\"flex justify-end\">\n <Button pending={saveMutation.isPending} onClick={() => void saveMutation.mutateAsync(draft)}>\n Save chain\n </Button>\n </div>\n </div>\n )\n } as const;\n\n const inspector = (\n <>\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Linked modes</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {modes.filter((mode) => draft.linkedModeIds.includes(mode.id)).map((mode) => (\n <EntityBadge key={mode.id} kind=\"mode\" label={mode.title} compact />\n ))}\n {draft.linkedModeIds.length === 0 ? (\n <Button variant=\"secondary\" size=\"sm\" onClick={() => setActiveStage(\"state\")}>\n Link mode\n </Button>\n ) : null}\n </div>\n </div>\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Linked beliefs</div>\n <div className=\"mt-3 grid gap-2\">\n {beliefs.filter((belief) => draft.linkedBeliefIds.includes(belief.id)).map((belief) => (\n <div key={belief.id} className=\"rounded-[16px] bg-white/[0.04] px-3 py-3\">\n <EntityBadge kind=\"belief\" label={belief.statement} compact />\n </div>\n ))}\n {draft.linkedBeliefIds.length === 0 ? (\n <Button variant=\"secondary\" size=\"sm\" onClick={() => setActiveStage(\"lens\")}>\n Link belief\n </Button>\n ) : null}\n </div>\n </div>\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Anchored comments on {activeStage}</div>\n <div className=\"mt-3 grid gap-2\">\n {activeStageComments.map((comment) => (\n <div key={comment.id} className=\"rounded-[16px] bg-white/[0.04] px-3 py-3 text-sm text-white/72\">\n <div>{comment.body}</div>\n <div className=\"mt-2 text-xs text-white/38\">{comment.author ?? comment.source} • {formatDateTime(comment.createdAt)}</div>\n </div>\n ))}\n <Textarea value={commentBody} onChange={(event) => setCommentBody(event.target.value)} placeholder={`Add a note about ${activeStage}...`} />\n <Button variant=\"secondary\" pending={commentMutation.isPending} onClick={() => void commentMutation.mutateAsync(commentBody)}>\n Add comment\n </Button>\n </div>\n </div>\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Insights</div>\n <div className=\"mt-3 grid gap-2\">\n {payload.insights.map((insight) => (\n <div key={insight.id} className=\"rounded-[16px] bg-white/[0.04] px-3 py-3 text-sm text-white/72\">\n <div className=\"font-medium text-white\">{insight.title}</div>\n <div className=\"mt-2 text-white/62\">{insight.summary}</div>\n </div>\n ))}\n <Button variant=\"secondary\" pending={insightMutation.isPending} onClick={() => setInsightFlowOpen(true)}>\n Store insight\n </Button>\n </div>\n </div>\n </>\n );\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n eyebrow=\"Trigger report\"\n title={report.title}\n description=\"Move through Spark to Pivot in one chain canvas.\"\n badge={report.status}\n />\n <PsycheSectionNav />\n\n <ChainCanvas\n stages={stages}\n activeStageId={activeStage}\n onStageChange={setActiveStage}\n stageContent={stageContent[activeStage as keyof typeof stageContent]}\n inspector={inspector}\n />\n\n <InsightFlowDialog\n open={insightFlowOpen}\n onOpenChange={setInsightFlowOpen}\n eyebrow=\"Report insight\"\n title=\"Store report insight\"\n description=\"Capture the insight from this report as a guided recommendation instead of a raw side-panel form.\"\n submitLabel=\"Store insight\"\n pending={insightMutation.isPending}\n lockedEntity={{\n entityType: \"trigger_report\",\n entityId: report.id,\n kind: \"report\",\n label: report.title,\n description: `Anchored to the ${activeStage} stage of this reflective chain.`\n }}\n initialValue={{\n originType: \"user\",\n originLabel: \"Forge Psyche\",\n timeframeLabel: \"Current trigger report\",\n rationale: `Captured from the ${activeStage} stage of the Psyche chain canvas.`\n }}\n onSubmit={async (value) => {\n await insightMutation.mutateAsync(value);\n }}\n />\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link, useSearchParams } from \"react-router-dom\";\nimport { FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { AtlasPanel } from \"@/components/psyche/atlas-panel\";\nimport { EntityLinkMultiSelect, type EntityLinkOption } from \"@/components/psyche/entity-link-multiselect\";\nimport { SchemaBadge } from \"@/components/psyche/schema-badge\";\nimport {\n BehaviorRowsEditor,\n EmotionRowsEditor,\n ModeTimelineEditor,\n StringListEditor,\n ThoughtRowsEditor\n} from \"@/components/psyche/report-chain-fields\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { FieldHint, InfoTooltip } from \"@/components/ui/info-tooltip\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { EmptyState, ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { prependEntityToCollection } from \"@/lib/query-cache\";\nimport {\n createBehavior,\n createBelief,\n createMode,\n createPsycheValue,\n createTriggerReport,\n listBeliefs,\n listBehaviors,\n listEmotionDefinitions,\n listEventTypes,\n listModes,\n listPsycheValues,\n listSchemaCatalog,\n listTriggerReports\n} from \"@/lib/api\";\nimport { triggerReportSchema, type TriggerReportInput } from \"@/lib/psyche-schemas\";\nimport type { Behavior, BeliefEntry, ModeProfile, ModeTimelineEntry, PsycheValue, SchemaCatalogEntry, TriggerBehavior, TriggerEmotion, TriggerThought } from \"@/lib/psyche-types\";\nimport { findSchemaForLink, getSchemaTypeHelpText, getSchemaTypeLabel, getSchemaVisual, toggleSchemaSelection } from \"@/lib/schema-visuals\";\n\ntype ReportDraft = {\n title: string;\n status: \"draft\" | \"reviewed\" | \"integrated\";\n eventTypeId: string;\n customEventType: string;\n eventSituation: string;\n occurredAt: string;\n emotions: TriggerEmotion[];\n thoughts: TriggerThought[];\n behaviors: TriggerBehavior[];\n selfShortTerm: string[];\n selfLongTerm: string[];\n othersShortTerm: string[];\n othersLongTerm: string[];\n linkedValueIds: string[];\n linkedBehaviorIds: string[];\n linkedBeliefIds: string[];\n linkedModeIds: string[];\n linkedGoalIds: string[];\n linkedProjectIds: string[];\n linkedTaskIds: string[];\n schemaLinks: string[];\n modeTimeline: ModeTimelineEntry[];\n nextMoves: string[];\n};\n\nconst DEFAULT_REPORT_DRAFT: ReportDraft = {\n title: \"\",\n status: \"draft\",\n eventTypeId: \"\",\n customEventType: \"\",\n eventSituation: \"\",\n occurredAt: \"\",\n emotions: [],\n thoughts: [],\n behaviors: [],\n selfShortTerm: [],\n selfLongTerm: [],\n othersShortTerm: [],\n othersLongTerm: [],\n linkedValueIds: [],\n linkedBehaviorIds: [],\n linkedBeliefIds: [],\n linkedModeIds: [],\n linkedGoalIds: [],\n linkedProjectIds: [],\n linkedTaskIds: [],\n schemaLinks: [],\n modeTimeline: [],\n nextMoves: []\n};\n\nexport function PsycheReportsPage() {\n const queryClient = useQueryClient();\n const [searchParams, setSearchParams] = useSearchParams();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [draft, setDraft] = useState<ReportDraft>(DEFAULT_REPORT_DRAFT);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const reportsQuery = useQuery({ queryKey: [\"forge-psyche-reports\"], queryFn: listTriggerReports });\n const valuesQuery = useQuery({ queryKey: [\"forge-psyche-values\"], queryFn: listPsycheValues });\n const behaviorsQuery = useQuery({ queryKey: [\"forge-psyche-behaviors\"], queryFn: listBehaviors });\n const beliefsQuery = useQuery({ queryKey: [\"forge-psyche-beliefs\"], queryFn: listBeliefs });\n const modesQuery = useQuery({ queryKey: [\"forge-psyche-modes\"], queryFn: listModes });\n const schemasQuery = useQuery({ queryKey: [\"forge-psyche-schema-catalog\"], queryFn: listSchemaCatalog });\n const eventTypesQuery = useQuery({ queryKey: [\"forge-psyche-event-types\"], queryFn: listEventTypes });\n const emotionsQuery = useQuery({ queryKey: [\"forge-psyche-emotions\"], queryFn: listEmotionDefinitions });\n\n const reports = reportsQuery.data?.reports ?? [];\n const values = valuesQuery.data?.values ?? [];\n const behaviors = behaviorsQuery.data?.behaviors ?? [];\n const beliefs = beliefsQuery.data?.beliefs ?? [];\n const modes = modesQuery.data?.modes ?? [];\n const schemas = schemasQuery.data?.schemas ?? [];\n const eventTypes = eventTypesQuery.data?.eventTypes ?? [];\n const emotions = emotionsQuery.data?.emotions ?? [];\n\n useEffect(() => {\n if (searchParams.get(\"create\") === \"1\") {\n setDialogOpen(true);\n setDraft({\n ...DEFAULT_REPORT_DRAFT,\n customEventType:\n searchParams.get(\"intent\") === \"execution_tension\"\n ? \"Execution tension\"\n : searchParams.get(\"intent\") === \"belief\"\n ? \"Belief script activation\"\n : searchParams.get(\"intent\") === \"behavior\"\n ? \"Behavior spike\"\n : searchParams.get(\"intent\") === \"pattern\"\n ? \"Recurring pattern\"\n : searchParams.get(\"intent\") === \"value\"\n ? \"Blocked value\"\n : \"\",\n linkedValueIds: searchParams.get(\"valueId\") ? [searchParams.get(\"valueId\")!] : [],\n linkedBehaviorIds: searchParams.get(\"behaviorId\") ? [searchParams.get(\"behaviorId\")!] : [],\n linkedBeliefIds: searchParams.get(\"beliefId\") ? [searchParams.get(\"beliefId\")!] : [],\n linkedGoalIds: searchParams.get(\"goalId\") ? [searchParams.get(\"goalId\")!] : [],\n linkedProjectIds: searchParams.get(\"projectId\") ? [searchParams.get(\"projectId\")!] : [],\n linkedTaskIds: searchParams.get(\"taskId\") ? [searchParams.get(\"taskId\")!] : []\n });\n const next = new URLSearchParams(searchParams);\n next.delete(\"create\");\n next.delete(\"intent\");\n next.delete(\"valueId\");\n next.delete(\"behaviorId\");\n next.delete(\"beliefId\");\n next.delete(\"goalId\");\n next.delete(\"projectId\");\n next.delete(\"taskId\");\n setSearchParams(next, { replace: true });\n }\n }, [searchParams, setSearchParams]);\n\n const saveMutation = useMutation({\n mutationFn: async (value: ReportDraft) => {\n const parsed = triggerReportSchema.parse({\n title: value.title,\n status: value.status,\n eventTypeId: value.eventTypeId || null,\n customEventType: value.customEventType,\n eventSituation: value.eventSituation,\n occurredAt: value.occurredAt ? new Date(value.occurredAt).toISOString() : null,\n emotions: value.emotions.filter((entry) => entry.label.trim().length > 0),\n thoughts: value.thoughts.filter((entry) => entry.text.trim().length > 0),\n behaviors: value.behaviors.filter((entry) => entry.text.trim().length > 0),\n consequences: {\n selfShortTerm: value.selfShortTerm,\n selfLongTerm: value.selfLongTerm,\n othersShortTerm: value.othersShortTerm,\n othersLongTerm: value.othersLongTerm\n },\n linkedPatternIds: [],\n linkedValueIds: value.linkedValueIds,\n linkedGoalIds: value.linkedGoalIds,\n linkedProjectIds: value.linkedProjectIds,\n linkedTaskIds: value.linkedTaskIds,\n linkedBehaviorIds: value.linkedBehaviorIds,\n linkedBeliefIds: value.linkedBeliefIds,\n linkedModeIds: value.linkedModeIds,\n modeOverlays: [],\n schemaLinks: value.schemaLinks.filter(Boolean),\n modeTimeline: value.modeTimeline.filter((entry) => entry.stage.trim().length > 0 && entry.label.trim().length > 0),\n nextMoves: value.nextMoves.filter(Boolean)\n } satisfies TriggerReportInput);\n\n return createTriggerReport(parsed);\n },\n onSuccess: async () => {\n setDialogOpen(false);\n setDraft(DEFAULT_REPORT_DRAFT);\n setSubmitError(null);\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-reports\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-xp-metrics\"] })\n ]);\n }\n });\n\n const valueOptions: EntityLinkOption[] = values.map((entry: PsycheValue) => ({\n value: entry.id,\n label: entry.title,\n description: entry.valuedDirection,\n kind: \"value\"\n }));\n const behaviorOptions: EntityLinkOption[] = behaviors.map((behavior: Behavior) => ({\n value: behavior.id,\n label: behavior.title,\n description: behavior.kind,\n kind: \"behavior\"\n }));\n const beliefOptions: EntityLinkOption[] = beliefs.map((belief: BeliefEntry) => ({\n value: belief.id,\n label: belief.statement,\n description: belief.flexibleAlternative || belief.originNote,\n kind: \"belief\"\n }));\n const modeOptions: EntityLinkOption[] = modes.map((mode: ModeProfile) => ({\n value: mode.id,\n label: mode.title,\n description: mode.archetype || mode.family,\n kind: \"mode\"\n }));\n\n const createLinkedValue = async (title: string) => {\n const { value } = await createPsycheValue({\n title,\n description: \"\",\n valuedDirection: title,\n whyItMatters: \"\",\n linkedGoalIds: [],\n linkedProjectIds: [],\n linkedTaskIds: [],\n committedActions: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-values\"], \"values\", value);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return { value: value.id, label: value.title, description: value.valuedDirection, kind: \"value\" } satisfies EntityLinkOption;\n };\n\n const createLinkedBehavior = async (title: string) => {\n const { behavior } = await createBehavior({\n kind: \"away\",\n title,\n description: \"\",\n commonCues: [],\n urgeStory: \"\",\n shortTermPayoff: \"\",\n longTermCost: \"\",\n replacementMove: \"\",\n repairPlan: \"\",\n linkedPatternIds: [],\n linkedValueIds: [],\n linkedSchemaIds: [],\n linkedModeIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-behaviors\"], \"behaviors\", behavior);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return { value: behavior.id, label: behavior.title, description: behavior.kind, kind: \"behavior\" } satisfies EntityLinkOption;\n };\n\n const createLinkedBelief = async (statement: string) => {\n const { belief } = await createBelief({\n schemaId: null,\n statement,\n beliefType: \"absolute\",\n originNote: \"\",\n confidence: 60,\n evidenceFor: [],\n evidenceAgainst: [],\n flexibleAlternative: \"\",\n linkedValueIds: [],\n linkedBehaviorIds: [],\n linkedModeIds: [],\n linkedReportIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-beliefs\"], \"beliefs\", belief);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return { value: belief.id, label: belief.statement, description: belief.flexibleAlternative || belief.originNote, kind: \"belief\" } satisfies EntityLinkOption;\n };\n\n const createLinkedMode = async (title: string) => {\n const { mode } = await createMode({\n family: \"coping\",\n archetype: \"\",\n title,\n persona: \"\",\n imagery: \"\",\n symbolicForm: \"\",\n facialExpression: \"\",\n fear: \"\",\n burden: \"\",\n protectiveJob: \"\",\n originContext: \"\",\n firstAppearanceAt: null,\n linkedPatternIds: [],\n linkedBehaviorIds: [],\n linkedValueIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-modes\"], \"modes\", mode);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return { value: mode.id, label: mode.title, description: mode.archetype || mode.family, kind: \"mode\" } satisfies EntityLinkOption;\n };\n\n const steps: Array<QuestionFlowStep<ReportDraft>> = [\n {\n id: \"spark\",\n eyebrow: \"Spark\",\n title: \"Capture the trigger and the situation\",\n description: \"Start with what happened concretely before interpretation takes over.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Report title\">\n <Input value={value.title} onChange={(event) => setValue({ title: event.target.value })} placeholder=\"Friday silence spiral\" />\n </FlowField>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField label=\"Event type\">\n <select className=\"rounded-[22px] border border-white/8 bg-white/6 px-4 py-3 text-sm text-white\" value={value.eventTypeId} onChange={(event) => setValue({ eventTypeId: event.target.value })}>\n <option value=\"\">Custom or uncategorized</option>\n {eventTypes.map((eventType) => (\n <option key={eventType.id} value={eventType.id}>\n {eventType.label}\n </option>\n ))}\n </select>\n </FlowField>\n <FlowField label=\"Occurred at\">\n <Input type=\"datetime-local\" value={value.occurredAt} onChange={(event) => setValue({ occurredAt: event.target.value })} />\n </FlowField>\n </div>\n <FlowField label=\"Custom event label\">\n <Input value={value.customEventType} onChange={(event) => setValue({ customEventType: event.target.value })} placeholder=\"Unexpected distance after vulnerability\" />\n </FlowField>\n <FlowField label=\"Situation\">\n <Textarea value={value.eventSituation} onChange={(event) => setValue({ eventSituation: event.target.value })} placeholder=\"Describe what happened concretely, without explaining it away yet.\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"wave-script-move\",\n eyebrow: \"Wave, script, move\",\n title: \"Capture the emotional wave, thought script, and behavior\",\n description: \"These stay structured, but the flow keeps them staged instead of dumping everything into one giant form.\",\n render: (value, setValue) => (\n <>\n <EmotionRowsEditor items={value.emotions} onChange={(items) => setValue({ emotions: items })} definitions={emotions} />\n <ThoughtRowsEditor items={value.thoughts} onChange={(items) => setValue({ thoughts: items })} beliefs={beliefs} modes={modes} />\n <BehaviorRowsEditor items={value.behaviors} onChange={(items) => setValue({ behaviors: items })} behaviors={behaviors} modes={modes} />\n </>\n )\n },\n {\n id: \"lens-state\",\n eyebrow: \"Lens and state\",\n title: \"Link the report to beliefs, modes, values, and behavior history\",\n description: \"This is where the report becomes part of the larger graphical psyche system.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Linked values\">\n <EntityLinkMultiSelect\n options={valueOptions}\n selectedValues={value.linkedValueIds}\n onChange={(linkedValueIds) => setValue({ linkedValueIds })}\n placeholder=\"Search or create a value…\"\n emptyMessage=\"No values match yet.\"\n createLabel=\"Create value\"\n onCreate={createLinkedValue}\n />\n </FlowField>\n <FlowField label=\"Linked behaviors\">\n <EntityLinkMultiSelect\n options={behaviorOptions}\n selectedValues={value.linkedBehaviorIds}\n onChange={(linkedBehaviorIds) => setValue({ linkedBehaviorIds })}\n placeholder=\"Search or create a behavior…\"\n emptyMessage=\"No behaviors match yet.\"\n createLabel=\"Create behavior\"\n onCreate={createLinkedBehavior}\n />\n </FlowField>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField label=\"Linked beliefs\">\n <EntityLinkMultiSelect\n options={beliefOptions}\n selectedValues={value.linkedBeliefIds}\n onChange={(linkedBeliefIds) => setValue({ linkedBeliefIds })}\n placeholder=\"Search or create a belief…\"\n emptyMessage=\"No beliefs match yet.\"\n createLabel=\"Create belief\"\n onCreate={createLinkedBelief}\n />\n </FlowField>\n <FlowField label=\"Linked modes\">\n <EntityLinkMultiSelect\n options={modeOptions}\n selectedValues={value.linkedModeIds}\n onChange={(linkedModeIds) => setValue({ linkedModeIds })}\n placeholder=\"Search or create a mode…\"\n emptyMessage=\"No modes match yet.\"\n createLabel=\"Create mode\"\n onCreate={createLinkedMode}\n />\n </FlowField>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n {value.linkedGoalIds.length > 0 ? <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3 text-sm text-white/62\">Linked to {value.linkedGoalIds.length} goal tension</div> : null}\n {value.linkedProjectIds.length > 0 ? <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3 text-sm text-white/62\">Linked to {value.linkedProjectIds.length} project tension</div> : null}\n {value.linkedTaskIds.length > 0 ? <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3 text-sm text-white/62\">Linked to {value.linkedTaskIds.length} task tension</div> : null}\n </div>\n </>\n )\n },\n {\n id: \"horizon-pivot\",\n eyebrow: \"Horizon and pivot\",\n title: \"Record consequences, schema pressure, and the next move\",\n description: \"Use this step to record what happened next, which schemas were involved, and what you want to do after this moment.\",\n render: (value, setValue) => (\n <>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <StringListEditor title=\"Short-term impact on you\" description=\"Add the immediate effects on your body, mood, or direction.\" addLabel=\"Add self effect\" items={value.selfShortTerm} onChange={(items) => setValue({ selfShortTerm: items })} placeholder=\"I shut down and lost the rest of the evening.\" />\n <StringListEditor title=\"Long-term impact on you\" description=\"Capture what this pattern costs when it keeps repeating.\" addLabel=\"Add self cost\" items={value.selfLongTerm} onChange={(items) => setValue({ selfLongTerm: items })} placeholder=\"It keeps reinforcing the same abandonment story.\" />\n <StringListEditor title=\"Short-term impact on others\" description=\"Note what happened to the people around you right away.\" addLabel=\"Add other effect\" items={value.othersShortTerm} onChange={(items) => setValue({ othersShortTerm: items })} placeholder=\"They felt pushed away and confused.\" />\n <StringListEditor title=\"Long-term impact on others\" description=\"Capture the longer pattern this creates in relationships.\" addLabel=\"Add other cost\" items={value.othersLongTerm} onChange={(items) => setValue({ othersLongTerm: items })} placeholder=\"Trust gets thinner every time this loop takes over.\" />\n </div>\n <div className=\"grid gap-4\">\n <FlowField\n label=\"Schema links\"\n description=\"Choose the schemas that were active or that you want to strengthen in this moment.\"\n labelHelp=\"Use maladaptive schemas for recurring old patterns that felt active here. Use adaptive schemas for healthier patterns you want to rely on more.\"\n >\n <div className=\"grid gap-4\">\n {([\n {\n title: \"Maladaptive schemas\",\n schemas: schemas.filter((schema) => schema.schemaType === \"maladaptive\"),\n schemaType: \"maladaptive\" as const,\n description: \"Recurring old patterns that felt active in this moment.\"\n },\n {\n title: \"Adaptive schemas\",\n schemas: schemas.filter((schema) => schema.schemaType === \"adaptive\"),\n schemaType: \"adaptive\" as const,\n description: \"Healthier stable themes you want this repair move to strengthen.\"\n }\n ]).map((group) => {\n const visual = getSchemaVisual(group.schemaType);\n return (\n <div key={group.schemaType} className={`rounded-[24px] border p-4 ${visual.cardTone}`}>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-sm font-medium text-white\">{group.title}</div>\n <InfoTooltip content={getSchemaTypeHelpText(group.schemaType)} label={`Explain ${getSchemaTypeLabel(group.schemaType)}`} />\n </div>\n <FieldHint className=\"mt-2\">{group.description}</FieldHint>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {group.schemas.map((schema) => {\n const selected = value.schemaLinks.some((entry) => findSchemaForLink(entry, [schema])?.id === schema.id);\n return (\n <button\n key={schema.id}\n type=\"button\"\n className={`rounded-full border px-3 py-2 text-sm transition ${selected ? `${visual.badgeTone} ring-1 ring-white/18` : \"border-white/8 bg-white/[0.04] text-white/58 hover:bg-white/[0.08] hover:text-white\"}`}\n onClick={() => setValue({ schemaLinks: toggleSchemaSelection(value.schemaLinks, schema) })}\n >\n {schema.title}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </FlowField>\n <ModeTimelineEditor\n items={value.modeTimeline}\n onChange={(items) => setValue({ modeTimeline: items })}\n modes={modes}\n stages={[\"Spark\", \"Wave\", \"Script\", \"Lens\", \"State\", \"Move\", \"Horizon\", \"Pivot\"]}\n />\n <StringListEditor title=\"Next moves\" description=\"Finish with concrete next moves that protect the value or repair the situation.\" addLabel=\"Add next move\" items={value.nextMoves} onChange={(items) => setValue({ nextMoves: items })} placeholder=\"Send one honest repair message tomorrow morning.\" />\n </div>\n </>\n )\n }\n ];\n\n if (reportsQuery.isLoading || valuesQuery.isLoading || behaviorsQuery.isLoading || beliefsQuery.isLoading || modesQuery.isLoading || schemasQuery.isLoading || eventTypesQuery.isLoading || emotionsQuery.isLoading) {\n return <LoadingState eyebrow=\"Reports\" title=\"Loading reports\" description=\"Getting reports, values, behaviors, beliefs, modes, event labels, and emotions ready.\" />;\n }\n\n const routeError = reportsQuery.error ?? valuesQuery.error ?? behaviorsQuery.error ?? beliefsQuery.error ?? modesQuery.error ?? schemasQuery.error ?? eventTypesQuery.error ?? emotionsQuery.error;\n if (routeError) {\n return <ErrorState eyebrow=\"Trigger reports\" error={routeError} onRetry={() => void Promise.all([reportsQuery.refetch(), valuesQuery.refetch(), behaviorsQuery.refetch(), beliefsQuery.refetch(), modesQuery.refetch(), schemasQuery.refetch(), eventTypesQuery.refetch(), emotionsQuery.refetch()])} />;\n }\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n entityKind=\"report\"\n title={<EntityName kind=\"report\" label=\"Reports\" variant=\"heading\" size=\"lg\" />}\n description=\"Capture the trigger, emotional wave, script, state, and next pivot in one guided reflective chain instead of a single massive worksheet.\"\n badge={`${reports.length} reports`}\n actions={\n <Button\n onClick={() => {\n setDraft(DEFAULT_REPORT_DRAFT);\n setDialogOpen(true);\n }}\n >\n Reflect\n </Button>\n }\n />\n <PsycheSectionNav />\n\n <AtlasPanel\n eyebrow=\"Reports\"\n title=\"Recent reports\"\n description=\"Open any report to review what happened, which beliefs and schemas were involved, and what you want to do next.\"\n tone=\"violet\"\n >\n <div className=\"grid gap-4\">\n {reports.length === 0 ? (\n <EmptyState\n eyebrow=\"Trigger reports\"\n title=\"No reports yet\"\n description=\"Start a first Spark-to-Pivot chain so Forge can track the full reflective arc instead of isolated notes.\"\n />\n ) : (\n reports.map((report) => (\n <Link key={report.id} to={`/psyche/reports/${report.id}`} className=\"rounded-[28px] border border-white/8 bg-white/[0.04] p-5 transition hover:bg-white/[0.07]\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div>\n <EntityName kind=\"report\" label={report.title} variant=\"heading\" size=\"xl\" />\n <div className=\"mt-2 text-sm text-white/54\">{report.customEventType || report.eventSituation}</div>\n </div>\n <Badge>{report.status}</Badge>\n </div>\n <div className=\"mt-5 grid gap-3 xl:grid-cols-4\">\n <div className=\"rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Spark</div>\n <div className=\"mt-3 text-sm leading-6 text-white/66\">{report.eventSituation}</div>\n </div>\n <div className=\"rounded-[20px] bg-[rgba(110,231,183,0.08)] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Wave</div>\n <div className=\"mt-3 text-sm leading-6 text-white/66\">{report.emotions[0]?.label ?? \"No emotion captured yet\"}</div>\n </div>\n <div className=\"rounded-[20px] bg-[rgba(196,181,253,0.08)] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Lens</div>\n <div className=\"mt-3\">\n {report.schemaLinks[0] ? (\n (() => {\n const schema = findSchemaForLink(report.schemaLinks[0], schemas);\n return schema ? (\n <SchemaBadge label={schema.title} schemaType={schema.schemaType} compact />\n ) : (\n <div className=\"text-sm leading-6 text-white/66\">{report.schemaLinks[0]}</div>\n );\n })()\n ) : (\n <div className=\"text-sm leading-6 text-white/66\">No schema link yet</div>\n )}\n </div>\n </div>\n <div className=\"rounded-[20px] bg-[rgba(251,191,36,0.08)] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Pivot</div>\n <div className=\"mt-3 text-sm leading-6 text-white/66\">{report.nextMoves[0] ?? \"No next move yet\"}</div>\n </div>\n </div>\n </Link>\n ))\n )}\n </div>\n </AtlasPanel>\n\n <QuestionFlowDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n eyebrow=\"Trigger report\"\n title=\"Build a reflective chain\"\n description=\"This guided flow replaces the old open worksheet with a staged Spark-to-Pivot capture.\"\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel=\"Create report\"\n pending={saveMutation.isPending}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const parsed = triggerReportSchema.safeParse({\n title: draft.title,\n status: draft.status,\n eventTypeId: draft.eventTypeId || null,\n customEventType: draft.customEventType,\n eventSituation: draft.eventSituation,\n occurredAt: draft.occurredAt ? new Date(draft.occurredAt).toISOString() : null,\n emotions: draft.emotions.filter((entry) => entry.label.trim().length > 0),\n thoughts: draft.thoughts.filter((entry) => entry.text.trim().length > 0),\n behaviors: draft.behaviors.filter((entry) => entry.text.trim().length > 0),\n consequences: {\n selfShortTerm: draft.selfShortTerm,\n selfLongTerm: draft.selfLongTerm,\n othersShortTerm: draft.othersShortTerm,\n othersLongTerm: draft.othersLongTerm\n },\n linkedPatternIds: [],\n linkedValueIds: draft.linkedValueIds,\n linkedGoalIds: draft.linkedGoalIds,\n linkedProjectIds: draft.linkedProjectIds,\n linkedTaskIds: draft.linkedTaskIds,\n linkedBehaviorIds: draft.linkedBehaviorIds,\n linkedBeliefIds: draft.linkedBeliefIds,\n linkedModeIds: draft.linkedModeIds,\n modeOverlays: [],\n schemaLinks: draft.schemaLinks.filter(Boolean),\n modeTimeline: draft.modeTimeline.filter((entry) => entry.stage.trim().length > 0 && entry.label.trim().length > 0),\n nextMoves: draft.nextMoves.filter(Boolean)\n } satisfies TriggerReportInput);\n\n if (!parsed.success) {\n setSubmitError(\"This report still needs a title and concrete triggering situation.\");\n return;\n }\n\n try {\n await saveMutation.mutateAsync(draft);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Unable to create this report right now.\");\n }\n }}\n />\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { SchemaBadge } from \"@/components/psyche/schema-badge\";\nimport { FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { AtlasPanel } from \"@/components/psyche/atlas-panel\";\nimport { EntityLinkMultiSelect, type EntityLinkOption } from \"@/components/psyche/entity-link-multiselect\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { psycheFocusClass, usePsycheFocusTarget } from \"@/components/psyche/use-psyche-focus-target\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { FieldHint, InfoTooltip } from \"@/components/ui/info-tooltip\";\nimport { ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { prependEntityToCollection } from \"@/lib/query-cache\";\nimport { beliefEntrySchema, type BeliefEntryInput } from \"@/lib/psyche-schemas\";\nimport type { Behavior, BeliefEntry, ModeProfile, PsycheValue, SchemaCatalogEntry, TriggerReport } from \"@/lib/psyche-types\";\nimport { findSchemaForLink, getSchemaFamilyLabel, getSchemaTypeHelpText, getSchemaTypeLabel, getSchemaVisual } from \"@/lib/schema-visuals\";\nimport { createBehavior, createBelief, createMode, createPsycheValue, createTriggerReport, listBehaviors, listBeliefs, listModes, listPsycheValues, listSchemaCatalog, listTriggerReports, patchBelief } from \"@/lib/api\";\n\nconst DEFAULT_BELIEF_INPUT: BeliefEntryInput = {\n schemaId: null,\n statement: \"\",\n beliefType: \"absolute\",\n originNote: \"\",\n confidence: 60,\n evidenceFor: [],\n evidenceAgainst: [],\n flexibleAlternative: \"\",\n linkedValueIds: [],\n linkedBehaviorIds: [],\n linkedModeIds: [],\n linkedReportIds: []\n};\n\nfunction beliefToInput(belief: BeliefEntry): BeliefEntryInput {\n return {\n schemaId: belief.schemaId,\n statement: belief.statement,\n beliefType: belief.beliefType,\n originNote: belief.originNote,\n confidence: belief.confidence,\n evidenceFor: belief.evidenceFor,\n evidenceAgainst: belief.evidenceAgainst,\n flexibleAlternative: belief.flexibleAlternative,\n linkedValueIds: belief.linkedValueIds,\n linkedBehaviorIds: belief.linkedBehaviorIds,\n linkedModeIds: belief.linkedModeIds,\n linkedReportIds: belief.linkedReportIds\n };\n}\n\nfunction countSchemaLinks({\n schema,\n beliefs,\n behaviors,\n reports\n}: {\n schema: SchemaCatalogEntry;\n beliefs: BeliefEntry[];\n behaviors: Behavior[];\n reports: TriggerReport[];\n}) {\n const beliefCount = beliefs.filter((belief) => belief.schemaId === schema.id).length;\n const behaviorCount = behaviors.filter((behavior) => behavior.linkedSchemaIds.includes(schema.id)).length;\n const reportCount = reports.filter((report) => report.schemaLinks.some((entry) => {\n const linkedSchema = findSchemaForLink(entry, [schema]);\n return linkedSchema?.id === schema.id;\n })).length;\n return {\n beliefCount,\n behaviorCount,\n reportCount,\n total: beliefCount + behaviorCount + reportCount\n };\n}\n\nfunction SchemaSection({\n title,\n description,\n titleHelp,\n schemas,\n beliefs,\n behaviors,\n reports,\n onOpenBelief\n}: {\n title: string;\n description: string;\n titleHelp?: string;\n schemas: SchemaCatalogEntry[];\n beliefs: BeliefEntry[];\n behaviors: Behavior[];\n reports: TriggerReport[];\n onOpenBelief: (belief: BeliefEntry) => void;\n}) {\n if (schemas.length === 0) {\n return null;\n }\n\n const visual = getSchemaVisual(schemas[0].schemaType);\n\n return (\n <section className={`min-w-0 grid gap-4 rounded-[30px] border p-4 md:p-5 ${visual.sectionTone}`}>\n <div className=\"flex min-w-0 flex-col items-start gap-3 sm:flex-row sm:flex-wrap sm:items-start sm:justify-between\">\n <div className=\"grid min-w-0 gap-2\">\n <div className={`flex items-center gap-2 text-[11px] uppercase tracking-[0.18em] ${visual.sectionEyebrow}`}>\n <span>{title}</span>\n {titleHelp ? <InfoTooltip content={titleHelp} label={`Explain ${title.toLowerCase()}`} /> : null}\n </div>\n <div className=\"max-w-3xl text-sm leading-6 text-white/60\">{description}</div>\n </div>\n <Badge>{schemas.length} schemas</Badge>\n </div>\n\n <div className=\"grid gap-4 xl:grid-cols-2\">\n {schemas.map((schema) => {\n const stats = countSchemaLinks({ schema, beliefs, behaviors, reports });\n const schemaBeliefs = beliefs.filter((belief) => belief.schemaId === schema.id);\n const schemaVisual = getSchemaVisual(schema.schemaType);\n\n return (\n <div key={schema.id} className={`min-w-0 rounded-[26px] border p-5 ${schemaVisual.cardTone}`}>\n <div className=\"flex min-w-0 flex-col items-start gap-3 sm:flex-row sm:justify-between\">\n <div className=\"min-w-0\">\n <SchemaBadge label={schema.title} schemaType={schema.schemaType} />\n <div className=\"mt-3 text-sm text-white/46\">{getSchemaFamilyLabel(schema.family)}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/62\">{schema.description}</div>\n </div>\n <Badge>{stats.total} {schemaVisual.countLabel}</Badge>\n </div>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Badge className=\"bg-white/[0.06] text-white/68\">{stats.beliefCount} beliefs</Badge>\n <Badge className=\"bg-white/[0.06] text-white/68\">{stats.behaviorCount} behaviors</Badge>\n <Badge className=\"bg-white/[0.06] text-white/68\">{stats.reportCount} reports</Badge>\n </div>\n <div className=\"mt-4 grid gap-3\">\n {schemaBeliefs.length > 0 ? (\n <div className=\"rounded-[18px] bg-white/[0.04] p-4 text-sm text-white/58\">\n {`${schemaBeliefs.length} ${schemaVisual.linkSummary}${schemaBeliefs.length === 1 ? \"\" : \"s\"} live here.`}\n </div>\n ) : (\n <div className=\"rounded-[18px] bg-white/[0.03] p-4 text-sm leading-6 text-white/46\">{schemaVisual.emptyCopy}</div>\n )}\n {schemaBeliefs.slice(0, 2).map((belief) => (\n <button\n key={belief.id}\n type=\"button\"\n className=\"rounded-[20px] bg-white/[0.04] p-4 text-left transition hover:bg-white/[0.08]\"\n onClick={() => onOpenBelief(belief)}\n >\n <div className=\"font-medium text-white\">{belief.statement}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/60\">{belief.flexibleAlternative || \"No flexible alternative recorded yet.\"}</div>\n </button>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n </section>\n );\n}\n\nexport function PsycheSchemasBeliefsPage() {\n const queryClient = useQueryClient();\n const [searchParams, setSearchParams] = useSearchParams();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editingBelief, setEditingBelief] = useState<BeliefEntry | null>(null);\n const [draft, setDraft] = useState<BeliefEntryInput>(DEFAULT_BELIEF_INPUT);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const schemasQuery = useQuery({ queryKey: [\"forge-psyche-schema-catalog\"], queryFn: listSchemaCatalog });\n const beliefsQuery = useQuery({ queryKey: [\"forge-psyche-beliefs\"], queryFn: listBeliefs });\n const behaviorsQuery = useQuery({ queryKey: [\"forge-psyche-behaviors\"], queryFn: listBehaviors });\n const modesQuery = useQuery({ queryKey: [\"forge-psyche-modes\"], queryFn: listModes });\n const valuesQuery = useQuery({ queryKey: [\"forge-psyche-values\"], queryFn: listPsycheValues });\n const reportsQuery = useQuery({ queryKey: [\"forge-psyche-reports\"], queryFn: listTriggerReports });\n\n const schemas = schemasQuery.data?.schemas ?? [];\n const beliefs = beliefsQuery.data?.beliefs ?? [];\n const behaviors = behaviorsQuery.data?.behaviors ?? [];\n const modes = modesQuery.data?.modes ?? [];\n const values = valuesQuery.data?.values ?? [];\n const reports = reportsQuery.data?.reports ?? [];\n const focusedBeliefId = searchParams.get(\"focus\");\n\n usePsycheFocusTarget(focusedBeliefId);\n\n useEffect(() => {\n if (searchParams.get(\"create\") === \"1\") {\n setDialogOpen(true);\n setEditingBelief(null);\n setDraft(DEFAULT_BELIEF_INPUT);\n const next = new URLSearchParams(searchParams);\n next.delete(\"create\");\n setSearchParams(next, { replace: true });\n }\n }, [searchParams, setSearchParams]);\n\n const saveMutation = useMutation({\n mutationFn: async (input: BeliefEntryInput) => {\n const parsed = beliefEntrySchema.parse(input);\n if (editingBelief) {\n return patchBelief(editingBelief.id, parsed);\n }\n return createBelief(parsed);\n },\n onSuccess: async () => {\n setDialogOpen(false);\n setEditingBelief(null);\n setDraft(DEFAULT_BELIEF_INPUT);\n setSubmitError(null);\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-beliefs\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] })\n ]);\n }\n });\n\n const valueOptions: EntityLinkOption[] = values.map((entry: PsycheValue) => ({\n value: entry.id,\n label: entry.title,\n description: entry.valuedDirection,\n kind: \"value\"\n }));\n const behaviorOptions: EntityLinkOption[] = behaviors.map((behavior: Behavior) => ({\n value: behavior.id,\n label: behavior.title,\n description: behavior.kind,\n kind: \"behavior\"\n }));\n const modeOptions: EntityLinkOption[] = modes.map((mode: ModeProfile) => ({\n value: mode.id,\n label: mode.title,\n description: mode.archetype || mode.family,\n kind: \"mode\"\n }));\n const reportOptions: EntityLinkOption[] = reports.map((report: TriggerReport) => ({\n value: report.id,\n label: report.title,\n description: report.customEventType || report.eventSituation,\n kind: \"report\"\n }));\n const schemaMap = useMemo(() => new Map(schemas.map((schema) => [schema.id, schema])), [schemas]);\n const maladaptiveSchemas = useMemo(() => schemas.filter((schema) => schema.schemaType === \"maladaptive\"), [schemas]);\n const adaptiveSchemas = useMemo(() => schemas.filter((schema) => schema.schemaType === \"adaptive\"), [schemas]);\n\n const createLinkedValue = async (title: string) => {\n const { value } = await createPsycheValue({\n title,\n description: \"\",\n valuedDirection: title,\n whyItMatters: \"\",\n linkedGoalIds: [],\n linkedProjectIds: [],\n linkedTaskIds: [],\n committedActions: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-values\"], \"values\", value);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return { value: value.id, label: value.title, description: value.valuedDirection, kind: \"value\" } satisfies EntityLinkOption;\n };\n\n const createLinkedBehavior = async (title: string) => {\n const { behavior } = await createBehavior({\n kind: \"away\",\n title,\n description: \"\",\n commonCues: [],\n urgeStory: \"\",\n shortTermPayoff: \"\",\n longTermCost: \"\",\n replacementMove: \"\",\n repairPlan: \"\",\n linkedPatternIds: [],\n linkedValueIds: [],\n linkedSchemaIds: [],\n linkedModeIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-behaviors\"], \"behaviors\", behavior);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return { value: behavior.id, label: behavior.title, description: behavior.kind, kind: \"behavior\" } satisfies EntityLinkOption;\n };\n\n const createLinkedMode = async (title: string) => {\n const { mode } = await createMode({\n family: \"coping\",\n archetype: \"\",\n title,\n persona: \"\",\n imagery: \"\",\n symbolicForm: \"\",\n facialExpression: \"\",\n fear: \"\",\n burden: \"\",\n protectiveJob: \"\",\n originContext: \"\",\n firstAppearanceAt: null,\n linkedPatternIds: [],\n linkedBehaviorIds: [],\n linkedValueIds: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-modes\"], \"modes\", mode);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return { value: mode.id, label: mode.title, description: mode.archetype || mode.family, kind: \"mode\" } satisfies EntityLinkOption;\n };\n\n const createLinkedReport = async (title: string) => {\n const { report } = await createTriggerReport({\n title,\n status: \"draft\",\n eventTypeId: null,\n customEventType: \"\",\n eventSituation: title,\n occurredAt: null,\n emotions: [],\n thoughts: [],\n behaviors: [],\n consequences: {\n selfShortTerm: [],\n selfLongTerm: [],\n othersShortTerm: [],\n othersLongTerm: []\n },\n linkedPatternIds: [],\n linkedValueIds: [],\n linkedGoalIds: [],\n linkedProjectIds: [],\n linkedTaskIds: [],\n linkedBehaviorIds: [],\n linkedBeliefIds: [],\n linkedModeIds: [],\n modeOverlays: [],\n schemaLinks: [],\n modeTimeline: [],\n nextMoves: []\n });\n prependEntityToCollection(queryClient, [\"forge-psyche-reports\"], \"reports\", report);\n await queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] });\n return { value: report.id, label: report.title, description: report.customEventType || report.eventSituation, kind: \"report\" } satisfies EntityLinkOption;\n };\n\n useEffect(() => {\n if (!dialogOpen) {\n return;\n }\n setSubmitError(null);\n }, [dialogOpen]);\n\n const steps: Array<QuestionFlowStep<BeliefEntryInput>> = [\n {\n id: \"lens\",\n eyebrow: \"Lens\",\n title: \"Choose the schema and belief script\",\n description: \"Place the belief inside the right schema system, then write the actual inner line that tends to fire there.\",\n render: (value, setValue) => (\n <>\n <FlowField\n label=\"Schema\"\n description=\"Choose the schema this belief belongs to, whether it is a recurring old pattern or a healthier pattern you want to strengthen.\"\n labelHelp=\"Schemas are the broader repeating themes. Beliefs are the personal scripts that fire inside those themes.\"\n >\n <div className=\"grid gap-4\">\n {([\n {\n title: \"Maladaptive schemas\",\n schemas: maladaptiveSchemas,\n description: \"Recurring old patterns that tend to get activated and distort how the situation feels.\",\n schemaType: \"maladaptive\" as const\n },\n {\n title: \"Adaptive schemas\",\n schemas: adaptiveSchemas,\n description: \"Healthier stable themes you want to strengthen, trust, and live from more often.\",\n schemaType: \"adaptive\" as const\n }\n ]).map((group) => {\n const visual = getSchemaVisual(group.schemaType);\n return (\n <div key={group.schemaType} className={`rounded-[24px] border p-4 ${visual.cardTone}`}>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-sm font-medium text-white\">{group.title}</div>\n <InfoTooltip content={getSchemaTypeHelpText(group.schemaType)} label={`Explain ${getSchemaTypeLabel(group.schemaType)}`} />\n </div>\n <FieldHint className=\"mt-2\">{group.description}</FieldHint>\n <div className=\"mt-4 grid gap-2 sm:flex sm:flex-wrap\">\n {group.schemas.map((schema) => {\n const selected = value.schemaId === schema.id;\n return (\n <button\n key={schema.id}\n type=\"button\"\n className={`w-full rounded-[18px] border px-3 py-2 text-left text-sm leading-5 transition sm:w-auto sm:rounded-full ${selected ? `${visual.badgeTone} ring-1 ring-white/18` : \"border-white/8 bg-white/[0.04] text-white/58 hover:bg-white/[0.08] hover:text-white\"}`}\n onClick={() => setValue({ schemaId: schema.id })}\n >\n {schema.title}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </FlowField>\n <FlowField\n label=\"Belief statement\"\n description=\"Write the sentence the mind tends to say in the moment.\"\n labelHelp=\"A belief script should sound like the actual inner line that shows up under pressure, not a formal summary.\"\n >\n <Input value={value.statement} onChange={(event) => setValue({ statement: event.target.value })} placeholder=\"If they go quiet, I am already being left.\" />\n </FlowField>\n <FlowField\n label=\"Belief type\"\n description=\"Choose whether the script sounds absolute or conditional.\"\n labelHelp=\"Absolute beliefs sound fixed and global. Conditional beliefs sound more like if-then rules about safety, worth, or closeness.\"\n >\n <div className=\"grid gap-3 md:grid-cols-2\">\n {([\"absolute\", \"conditional\"] as const).map((kind) => (\n <button\n key={kind}\n type=\"button\"\n className={`rounded-[22px] border px-4 py-4 text-left transition ${value.beliefType === kind ? \"border-white/20 bg-white/[0.12] text-white\" : \"border-white/8 bg-white/[0.04] text-white/62 hover:bg-white/[0.07]\"}`}\n onClick={() => setValue({ beliefType: kind })}\n >\n {kind === \"absolute\" ? \"Absolute: this is simply true\" : \"Conditional: if this happens, then...\"}\n </button>\n ))}\n </div>\n </FlowField>\n </>\n )\n },\n {\n id: \"origin\",\n eyebrow: \"Origin\",\n title: \"Capture the origin and confidence of the script\",\n description: \"This keeps the belief from turning into a generic note divorced from actual history.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Origin context\" description=\"Capture where this script learned its force or usefulness.\">\n <Textarea value={value.originNote} onChange={(event) => setValue({ originNote: event.target.value })} placeholder=\"It got stronger in periods where silence usually meant anger, distance, or punishment.\" />\n </FlowField>\n <FlowField\n label=\"Grip right now\"\n description=\"How strongly does this belief feel true when it gets activated?\"\n labelHelp=\"Grip is the felt strength of the script in the moment, not whether it is objectively true.\"\n >\n <input type=\"range\" min={0} max={100} value={value.confidence} onChange={(event) => setValue({ confidence: Number(event.target.value) })} />\n <div className=\"text-sm text-white/48\">{value.confidence}% grip</div>\n </FlowField>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <FlowField label=\"Evidence for\" description=\"Add one supporting memory, sign, or interpretation per line.\">\n <Textarea\n value={value.evidenceFor.join(\"\\n\")}\n onChange={(event) =>\n setValue({\n evidenceFor: event.target.value\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n })\n }\n placeholder={\"One line per sign\\nThey stopped replying for days\\nI was ignored when I asked directly\"}\n />\n </FlowField>\n <FlowField label=\"Evidence against\" description=\"Add one counterexample, nuance, or disconfirming sign per line.\">\n <Textarea\n value={value.evidenceAgainst.join(\"\\n\")}\n onChange={(event) =>\n setValue({\n evidenceAgainst: event.target.value\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n })\n }\n placeholder={\"One line per counterpoint\\nThey later explained they were overwhelmed\\nOther people stay close without constant contact\"}\n />\n </FlowField>\n </div>\n </>\n )\n },\n {\n id: \"repair\",\n eyebrow: \"Repair\",\n title: \"Define the flexible alternative and attach the wider system\",\n description: \"The flexible alternative is the repair move; the links keep it attached to behaviors, values, modes, and reports.\",\n render: (value, setValue) => (\n <>\n <FlowField\n label=\"Flexible alternative\"\n description=\"Write the steadier line you want available when the old script activates.\"\n labelHelp=\"A flexible alternative is not fake positivity. It is a truer, more workable belief that leaves room for uncertainty.\"\n >\n <Textarea value={value.flexibleAlternative} onChange={(event) => setValue({ flexibleAlternative: event.target.value })} placeholder=\"Silence can mean many things. I can check the facts before deciding I am being left.\" />\n </FlowField>\n <FlowField label=\"Linked values\" description=\"Choose the valued directions this belief interferes with most.\">\n <EntityLinkMultiSelect\n options={valueOptions}\n selectedValues={value.linkedValueIds}\n onChange={(linkedValueIds) => setValue({ linkedValueIds })}\n placeholder=\"Search or create a value…\"\n emptyMessage=\"No values match yet.\"\n createLabel=\"Create value\"\n onCreate={createLinkedValue}\n />\n </FlowField>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <FlowField label=\"Linked behaviors\" description=\"Choose the moves this belief tends to trigger or justify.\">\n <EntityLinkMultiSelect\n options={behaviorOptions}\n selectedValues={value.linkedBehaviorIds}\n onChange={(linkedBehaviorIds) => setValue({ linkedBehaviorIds })}\n placeholder=\"Search or create a behavior…\"\n emptyMessage=\"No behaviors match yet.\"\n createLabel=\"Create behavior\"\n onCreate={createLinkedBehavior}\n />\n </FlowField>\n <FlowField label=\"Linked modes\" description=\"Choose the inner states that most often carry this script.\">\n <EntityLinkMultiSelect\n options={modeOptions}\n selectedValues={value.linkedModeIds}\n onChange={(linkedModeIds) => setValue({ linkedModeIds })}\n placeholder=\"Search or create a mode…\"\n emptyMessage=\"No modes match yet.\"\n createLabel=\"Create mode\"\n onCreate={createLinkedMode}\n />\n </FlowField>\n <FlowField label=\"Linked reports\" description=\"Choose the reflective chains where this script has already shown up.\">\n <EntityLinkMultiSelect\n options={reportOptions}\n selectedValues={value.linkedReportIds}\n onChange={(linkedReportIds) => setValue({ linkedReportIds })}\n placeholder=\"Search or create a report…\"\n emptyMessage=\"No reports match yet.\"\n createLabel=\"Create report\"\n onCreate={createLinkedReport}\n />\n </FlowField>\n </div>\n </>\n )\n }\n ];\n\n if (schemasQuery.isLoading || beliefsQuery.isLoading || behaviorsQuery.isLoading || modesQuery.isLoading || valuesQuery.isLoading || reportsQuery.isLoading) {\n return <LoadingState eyebrow=\"Schemas & beliefs\" title=\"Loading schemas and beliefs\" description=\"Getting schemas, beliefs, behaviors, modes, values, and linked reports ready.\" />;\n }\n\n const routeError = schemasQuery.error ?? beliefsQuery.error ?? behaviorsQuery.error ?? modesQuery.error ?? valuesQuery.error ?? reportsQuery.error;\n if (routeError) {\n return <ErrorState eyebrow=\"Schemas & beliefs\" error={routeError} onRetry={() => void Promise.all([schemasQuery.refetch(), beliefsQuery.refetch(), behaviorsQuery.refetch(), modesQuery.refetch(), valuesQuery.refetch(), reportsQuery.refetch()])} />;\n }\n\n return (\n <div className=\"grid min-w-0 gap-5\">\n <PageHero\n title=\"Schemas & Beliefs\"\n description=\"Review your schemas and beliefs together. See which beliefs are tied to each schema, then open any belief to edit it in context.\"\n badge={`${beliefs.length} beliefs`}\n actions={\n <Button\n onClick={() => {\n setEditingBelief(null);\n setDraft(DEFAULT_BELIEF_INPUT);\n setDialogOpen(true);\n }}\n >\n Add belief\n </Button>\n }\n />\n <PsycheSectionNav />\n\n <section className=\"grid min-w-0 gap-5 xl:grid-cols-[minmax(0,1.2fr)_minmax(0,0.8fr)]\">\n <AtlasPanel\n eyebrow=\"Schemas\"\n title=\"Schemas\"\n description=\"Use these groups to notice recurring old patterns and to reinforce healthier patterns you want to rely on more often.\"\n titleHelp=\"Schemas are broad recurring patterns that shape how situations feel and how you respond. Use them to organize beliefs, behaviors, and reports around patterns that repeat.\"\n tone=\"violet\"\n >\n {schemas.length === 0 ? (\n <div className=\"text-sm text-white/56\">Schema data is unavailable right now.</div>\n ) : (\n <div className=\"grid gap-5\">\n <SchemaSection\n title=\"Maladaptive schemas\"\n titleHelp={getSchemaTypeHelpText(\"maladaptive\")}\n description=\"These schemas describe recurring old patterns that can change how you read situations and react.\"\n schemas={maladaptiveSchemas}\n beliefs={beliefs}\n behaviors={behaviors}\n reports={reports}\n onOpenBelief={(belief) => {\n setEditingBelief(belief);\n setDraft(beliefToInput(belief));\n setDialogOpen(true);\n }}\n />\n <SchemaSection\n title=\"Adaptive schemas\"\n titleHelp={getSchemaTypeHelpText(\"adaptive\")}\n description=\"These schemas describe healthier patterns you want to trust, practice, and strengthen over time.\"\n schemas={adaptiveSchemas}\n beliefs={beliefs}\n behaviors={behaviors}\n reports={reports}\n onOpenBelief={(belief) => {\n setEditingBelief(belief);\n setDraft(beliefToInput(belief));\n setDialogOpen(true);\n }}\n />\n </div>\n )}\n </AtlasPanel>\n\n <AtlasPanel\n eyebrow=\"Beliefs\"\n title=\"Beliefs\"\n description=\"Use this list to review and edit the stories you tell yourself. Open any belief to update the wording, evidence, or a more flexible alternative.\"\n titleHelp=\"Beliefs are the specific scripts or rules that show up in your mind, such as what you expect from yourself, from other people, or from a situation.\"\n tone=\"sky\"\n >\n <div className=\"grid gap-3\">\n <Button\n onClick={() => {\n setEditingBelief(null);\n setDraft(DEFAULT_BELIEF_INPUT);\n setDialogOpen(true);\n }}\n >\n Add belief\n </Button>\n {beliefs.length === 0 ? (\n <div className=\"text-sm text-white/56\">Your beliefs will appear here after you add the first one.</div>\n ) : (\n beliefs.map((belief) => {\n const schema = belief.schemaId ? (schemaMap.get(belief.schemaId) ?? null) : null;\n const isFocused = focusedBeliefId === belief.id;\n return (\n <button\n key={belief.id}\n type=\"button\"\n data-psyche-focus-id={belief.id}\n className={`rounded-[24px] border border-white/8 bg-white/[0.04] p-4 text-left transition hover:bg-white/[0.08] ${psycheFocusClass(isFocused)}`}\n onClick={() => {\n setEditingBelief(belief);\n setDraft(beliefToInput(belief));\n setDialogOpen(true);\n }}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"font-medium text-white\">{belief.statement}</div>\n <Badge>{belief.confidence}% grip</Badge>\n </div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{belief.flexibleAlternative || \"No flexible alternative recorded yet.\"}</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {schema ? <SchemaBadge label={schema.title} schemaType={schema.schemaType} compact showType /> : null}\n {modes.filter((mode) => belief.linkedModeIds.includes(mode.id)).slice(0, 2).map((mode) => (\n <EntityBadge key={mode.id} kind=\"mode\" label={mode.title} compact />\n ))}\n </div>\n </button>\n );\n })\n )}\n </div>\n </AtlasPanel>\n </section>\n\n <QuestionFlowDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n eyebrow=\"Belief\"\n title={editingBelief ? \"Refine belief\" : \"Create belief\"}\n description=\"Use this guided flow to capture the belief, what seems to support it, and a more flexible alternative.\"\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel={editingBelief ? \"Save belief\" : \"Create belief\"}\n pending={saveMutation.isPending}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const parsed = beliefEntrySchema.safeParse(draft);\n if (!parsed.success) {\n setSubmitError(\"This belief still needs a statement before it can be saved.\");\n return;\n }\n\n try {\n await saveMutation.mutateAsync(parsed.data);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Unable to save this belief right now.\");\n }\n }}\n />\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { AtlasPanel } from \"@/components/psyche/atlas-panel\";\nimport { OrbitMap } from \"@/components/psyche/orbit-map\";\nimport { PsycheSectionNav } from \"@/components/psyche/psyche-section-nav\";\nimport { psycheFocusClass, usePsycheFocusTarget } from \"@/components/psyche/use-psyche-focus-target\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Button } from \"@/components/ui/button\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { ErrorState, LoadingState } from \"@/components/ui/page-state\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { createPsycheValue, listPsycheValues, patchPsycheValue } from \"@/lib/api\";\nimport { getEntityButtonClassName } from \"@/lib/entity-visuals\";\nimport { psycheValueSchema, type PsycheValueInput } from \"@/lib/psyche-schemas\";\nimport type { PsycheValue } from \"@/lib/psyche-types\";\n\nconst DEFAULT_VALUE_INPUT: PsycheValueInput = {\n title: \"\",\n description: \"\",\n valuedDirection: \"\",\n whyItMatters: \"\",\n linkedGoalIds: [],\n linkedProjectIds: [],\n linkedTaskIds: [],\n committedActions: []\n};\n\nfunction toggleId(current: string[], id: string) {\n return current.includes(id) ? current.filter((entry) => entry !== id) : [...current, id];\n}\n\nfunction valueToInput(value: PsycheValue): PsycheValueInput {\n return {\n title: value.title,\n description: value.description,\n valuedDirection: value.valuedDirection,\n whyItMatters: value.whyItMatters,\n linkedGoalIds: value.linkedGoalIds,\n linkedProjectIds: value.linkedProjectIds,\n linkedTaskIds: value.linkedTaskIds,\n committedActions: value.committedActions\n };\n}\n\nexport function PsycheValuesPage() {\n const shell = useForgeShell();\n const queryClient = useQueryClient();\n const [searchParams, setSearchParams] = useSearchParams();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editingValue, setEditingValue] = useState<PsycheValue | null>(null);\n const [draft, setDraft] = useState<PsycheValueInput>(DEFAULT_VALUE_INPUT);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const valuesQuery = useQuery({\n queryKey: [\"forge-psyche-values\"],\n queryFn: listPsycheValues\n });\n\n const values = valuesQuery.data?.values ?? [];\n const focusedValueId = searchParams.get(\"focus\");\n\n usePsycheFocusTarget(focusedValueId);\n\n useEffect(() => {\n if (searchParams.get(\"create\") === \"1\") {\n setDialogOpen(true);\n setEditingValue(null);\n setDraft(DEFAULT_VALUE_INPUT);\n const next = new URLSearchParams(searchParams);\n next.delete(\"create\");\n setSearchParams(next, { replace: true });\n }\n }, [searchParams, setSearchParams]);\n\n const saveMutation = useMutation({\n mutationFn: async (input: PsycheValueInput) => {\n const parsed = psycheValueSchema.parse(input);\n if (editingValue) {\n return patchPsycheValue(editingValue.id, parsed);\n }\n return createPsycheValue(parsed);\n },\n onSuccess: async () => {\n setDialogOpen(false);\n setEditingValue(null);\n setDraft(DEFAULT_VALUE_INPUT);\n setSubmitError(null);\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-values\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-psyche-overview\"] })\n ]);\n }\n });\n\n const orbitNodes = useMemo(\n () =>\n values.slice(0, 5).map((value, index) => ({\n id: value.id,\n label: `${value.linkedGoalIds.length} goals`,\n title: value.title,\n detail: value.valuedDirection,\n href: `/psyche/values?focus=${value.id}#values-atlas`,\n angle: -90 + index * 68,\n radius: 150 + (index % 2) * 20,\n tone: ([\"mint\", \"sky\", \"violet\", \"rose\"] as const)[index % 4]\n })),\n [values]\n );\n\n const steps: Array<QuestionFlowStep<PsycheValueInput>> = [\n {\n id: \"direction\",\n eyebrow: \"Compass\",\n title: \"Name the direction you want to protect\",\n description: \"Start with the value itself and the life-direction it points toward.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Value name\">\n <Input value={value.title} onChange={(event) => setValue({ title: event.target.value })} placeholder=\"Repair with steadiness\" />\n </FlowField>\n <FlowField label=\"Valued direction\">\n <Input value={value.valuedDirection} onChange={(event) => setValue({ valuedDirection: event.target.value })} placeholder=\"Warm, brave, and honest connection\" />\n </FlowField>\n <FlowField label=\"Why it matters\">\n <Textarea value={value.whyItMatters} onChange={(event) => setValue({ whyItMatters: event.target.value })} placeholder=\"Why is this direction important enough to protect when pressure rises?\" />\n </FlowField>\n </>\n )\n },\n {\n id: \"shape\",\n eyebrow: \"Texture\",\n title: \"Describe how the value should feel in lived form\",\n description: \"Keep this concrete enough that later reports and behaviors can map back to it.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Description\">\n <Textarea value={value.description} onChange={(event) => setValue({ description: event.target.value })} placeholder=\"Describe what this value looks like in daily behavior, not just in theory.\" />\n </FlowField>\n <FlowField label=\"Committed action ideas\">\n <Textarea\n value={value.committedActions.join(\"\\n\")}\n onChange={(event) =>\n setValue({\n committedActions: event.target.value\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n })\n }\n placeholder={\"One line per action\\nText your sister before Friday\\nTake a ten-minute reset walk\"}\n />\n </FlowField>\n </>\n )\n },\n {\n id: \"links\",\n eyebrow: \"Placement\",\n title: \"Place the value into the real system of work\",\n description: \"This is where values become graphical anchors across goals, projects, and tasks instead of standalone notes.\",\n render: (value, setValue) => (\n <>\n <FlowField label=\"Linked goals\">\n <div className=\"flex flex-wrap gap-2\">\n {shell.snapshot.goals.map((goal) => {\n const selected = value.linkedGoalIds.includes(goal.id);\n return (\n <button\n key={goal.id}\n type=\"button\"\n className={`rounded-full px-2.5 py-2 text-sm transition ${getEntityButtonClassName(\"goal\", selected)}`}\n onClick={() => setValue({ linkedGoalIds: toggleId(value.linkedGoalIds, goal.id) })}\n >\n <EntityBadge kind=\"goal\" label={goal.title} compact gradient={false} />\n </button>\n );\n })}\n </div>\n </FlowField>\n <FlowField label=\"Linked projects\">\n <div className=\"flex flex-wrap gap-2\">\n {shell.snapshot.dashboard.projects.map((project) => {\n const selected = value.linkedProjectIds.includes(project.id);\n return (\n <button\n key={project.id}\n type=\"button\"\n className={`rounded-full px-2.5 py-2 text-sm transition ${getEntityButtonClassName(\"project\", selected)}`}\n onClick={() => setValue({ linkedProjectIds: toggleId(value.linkedProjectIds, project.id) })}\n >\n <EntityBadge kind=\"project\" label={project.title} compact gradient={false} />\n </button>\n );\n })}\n </div>\n </FlowField>\n <FlowField label=\"Linked tasks\">\n <div className=\"flex max-h-48 flex-wrap gap-2 overflow-y-auto\">\n {shell.snapshot.tasks.slice(0, 24).map((task) => {\n const selected = value.linkedTaskIds.includes(task.id);\n return (\n <button\n key={task.id}\n type=\"button\"\n className={`rounded-full px-2.5 py-2 text-sm transition ${getEntityButtonClassName(\"task\", selected)}`}\n onClick={() => setValue({ linkedTaskIds: toggleId(value.linkedTaskIds, task.id) })}\n >\n <EntityBadge kind=\"task\" label={task.title} compact gradient={false} />\n </button>\n );\n })}\n </div>\n </FlowField>\n </>\n )\n }\n ];\n\n if (valuesQuery.isLoading) {\n return <LoadingState eyebrow=\"Psyche values\" title=\"Loading value constellation\" description=\"Hydrating values, linked goals, projects, and tasks.\" />;\n }\n\n if (valuesQuery.isError) {\n return <ErrorState eyebrow=\"Psyche values\" error={valuesQuery.error} onRetry={() => void valuesQuery.refetch()} />;\n }\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n entityKind=\"value\"\n title={<EntityName kind=\"value\" label=\"Values\" variant=\"heading\" size=\"lg\" />}\n description=\"Map values as living anchors. Each one should visibly relate to goals, projects, and tasks so reflection stops feeling separate from the rest of life.\"\n badge={`${values.length} values`}\n actions={\n <Button\n onClick={() => {\n setEditingValue(null);\n setDraft(DEFAULT_VALUE_INPUT);\n setDialogOpen(true);\n }}\n >\n Add value\n </Button>\n }\n />\n <PsycheSectionNav />\n\n <OrbitMap\n title=\"Place values inside the wider life system\"\n description=\"Values are not just notes. This constellation shows which directions are already attached to real goals, projects, and concrete tasks.\"\n centerLabel=\"Value field\"\n centerValue={`${values.length} mapped`}\n nodes={orbitNodes}\n action={<Button onClick={() => setDialogOpen(true)}>Add value</Button>}\n />\n\n <AtlasPanel\n eyebrow=\"Values in context\"\n title=\"See why each value matters and where it lives\"\n description=\"Each card combines the value narrative with its linked goals, projects, tasks, and committed actions so you can understand the shape immediately.\"\n tone=\"mint\"\n className=\"scroll-mt-24\"\n >\n <div id=\"values-atlas\" className=\"grid gap-4\">\n {values.length === 0 ? (\n <div className=\"flex justify-start\">\n <Button onClick={() => setDialogOpen(true)}>Add value</Button>\n </div>\n ) : (\n values.map((value) => {\n const linkedGoals = shell.snapshot.goals.filter((goal) => value.linkedGoalIds.includes(goal.id));\n const linkedProjects = shell.snapshot.dashboard.projects.filter((project) => value.linkedProjectIds.includes(project.id));\n const linkedTasks = shell.snapshot.tasks.filter((task) => value.linkedTaskIds.includes(task.id));\n const isFocused = focusedValueId === value.id;\n return (\n <div key={value.id} data-psyche-focus-id={value.id} className={`rounded-[26px] border border-white/8 bg-white/[0.04] p-5 transition ${psycheFocusClass(isFocused)}`}>\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div>\n <EntityName kind=\"value\" label={value.title} variant=\"heading\" size=\"xl\" />\n <div className=\"mt-2 text-sm text-[var(--tertiary)]\">{value.valuedDirection}</div>\n </div>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setEditingValue(value);\n setDraft(valueToInput(value));\n setDialogOpen(true);\n }}\n >\n Edit\n </Button>\n </div>\n <p className=\"mt-4 max-w-3xl text-sm leading-7 text-white/60\">{value.description}</p>\n <div className=\"mt-5 grid gap-4 lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]\">\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Why it matters</div>\n <div className=\"mt-2 text-sm leading-6 text-white/64\">{value.whyItMatters}</div>\n </div>\n <div className=\"grid gap-3 md:grid-cols-3\">\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Goals</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {linkedGoals.length === 0 ? <span className=\"text-sm text-white/44\">None linked</span> : linkedGoals.map((goal) => <EntityBadge key={goal.id} kind=\"goal\" label={goal.title} compact />)}\n </div>\n </div>\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Projects</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {linkedProjects.length === 0 ? <span className=\"text-sm text-white/44\">None linked</span> : linkedProjects.map((project) => <EntityBadge key={project.id} kind=\"project\" label={project.title} compact />)}\n </div>\n </div>\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/38\">Tasks</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {linkedTasks.length === 0 ? <span className=\"text-sm text-white/44\">None linked</span> : linkedTasks.slice(0, 4).map((task) => <EntityBadge key={task.id} kind=\"task\" label={task.title} compact />)}\n </div>\n </div>\n </div>\n </div>\n <div className=\"mt-4 grid gap-2 md:grid-cols-2\">\n {value.committedActions.map((action) => (\n <div key={action} className=\"rounded-[18px] bg-[rgba(110,231,183,0.08)] px-4 py-3 text-sm text-white/72\">\n {action}\n </div>\n ))}\n </div>\n </div>\n );\n })\n )}\n </div>\n </AtlasPanel>\n\n <QuestionFlowDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n eyebrow=\"Value\"\n title={editingValue ? \"Refine value placement\" : \"Create value\"}\n description=\"Forge should capture values through guided placement, not a raw admin form.\"\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel={editingValue ? \"Save value\" : \"Create value\"}\n pending={saveMutation.isPending}\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const parsed = psycheValueSchema.safeParse(draft);\n if (!parsed.success) {\n setSubmitError(\"This value still needs a title and valued direction before it can be saved.\");\n return;\n }\n\n try {\n await saveMutation.mutateAsync(parsed.data);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Unable to save this value right now.\");\n }\n }}\n />\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { ArchiveRestore, Bot, Settings2, Trophy } from \"lucide-react\";\nimport { NavLink, useLocation } from \"react-router-dom\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport const SETTINGS_SECTIONS = [\n { to: \"/settings\", label: \"General\", icon: Settings2 },\n { to: \"/settings/agents\", label: \"Agents\", icon: Bot },\n { to: \"/settings/rewards\", label: \"Rewards\", icon: Trophy },\n { to: \"/settings/bin\", label: \"Bin\", icon: ArchiveRestore }\n] as const;\n\nfunction sectionMatches(pathname: string, to: string) {\n if (to === \"/settings\") {\n return pathname === \"/settings\";\n }\n return pathname === to || pathname.startsWith(`${to}/`);\n}\n\nexport function SettingsSectionNav({ className }: { className?: string }) {\n const location = useLocation();\n const [mobileOpen, setMobileOpen] = useState(false);\n const activeSection = useMemo(() => {\n return (\n [...SETTINGS_SECTIONS]\n .sort((a, b) => b.to.length - a.to.length)\n .find((s) => sectionMatches(location.pathname, s.to)) ?? SETTINGS_SECTIONS[0]\n );\n }, [location.pathname]);\n\n return (\n <>\n <Card className={cn(\"overflow-hidden bg-[linear-gradient(180deg,rgba(15,24,31,0.94),rgba(10,18,25,0.92))] p-2\", className)}>\n <div className=\"hidden items-center gap-3 lg:flex\">\n <div className=\"flex flex-wrap gap-2\">\n {SETTINGS_SECTIONS.map((section) => (\n <NavLink\n key={section.to}\n to={section.to}\n end={section.to === \"/settings\"}\n className={({ isActive }) =>\n cn(\n \"inline-flex items-center gap-2 whitespace-nowrap rounded-full px-3 py-1.5 text-[11px] font-semibold uppercase tracking-[0.14em] transition\",\n isActive || sectionMatches(location.pathname, section.to)\n ? \"bg-[var(--primary)]/[0.18] text-[var(--primary)]\"\n : \"bg-white/[0.04] text-white/58 hover:bg-white/[0.08] hover:text-white\"\n )\n }\n >\n <section.icon className=\"size-3.5\" />\n <span>{section.label}</span>\n </NavLink>\n ))}\n </div>\n </div>\n\n <div className=\"flex items-center justify-between gap-3 lg:hidden\">\n <button\n type=\"button\"\n className=\"inline-flex min-w-0 flex-1 items-center justify-between rounded-full bg-white/[0.06] px-4 py-3 text-left\"\n onClick={() => setMobileOpen(true)}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <activeSection.icon className=\"size-4 shrink-0 text-[var(--primary)]\" />\n <span className=\"truncate text-sm font-medium text-white\">{activeSection.label}</span>\n </span>\n <span className=\"text-[10px] uppercase tracking-[0.16em] text-white/42\">Switch</span>\n </button>\n </div>\n </Card>\n\n {mobileOpen ? (\n <div className=\"fixed inset-0 z-50 bg-[rgba(5,10,18,0.86)] px-4 py-5 backdrop-blur-xl lg:hidden\">\n <div className=\"mx-auto flex h-full max-w-xl flex-col rounded-[32px] bg-[linear-gradient(180deg,rgba(16,25,33,0.98),rgba(11,18,25,0.98))] p-5 shadow-[0_30px_80px_rgba(0,0,0,0.35)]\">\n <div className=\"flex items-center justify-between gap-4\">\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/38\">Settings</div>\n <div className=\"mt-2 font-display text-3xl text-white\">Navigate to section</div>\n </div>\n <Button variant=\"secondary\" onClick={() => setMobileOpen(false)}>\n Close\n </Button>\n </div>\n\n <div className=\"mt-6 grid gap-3 overflow-y-auto\">\n {SETTINGS_SECTIONS.map((section) => (\n <NavLink\n key={section.to}\n to={section.to}\n end={section.to === \"/settings\"}\n onClick={() => setMobileOpen(false)}\n className={cn(\n \"flex items-center justify-between rounded-[24px] px-4 py-4 transition\",\n sectionMatches(location.pathname, section.to)\n ? \"bg-[var(--primary)]/[0.14] text-white\"\n : \"bg-white/[0.04] text-white/70\"\n )}\n >\n <span className=\"flex items-center gap-3\">\n <section.icon className=\"size-4 text-[var(--primary)]\" />\n <span className=\"text-base font-medium\">{section.label}</span>\n </span>\n <span className=\"text-[10px] uppercase tracking-[0.16em] text-white/36\">Open</span>\n </NavLink>\n ))}\n </div>\n </div>\n </div>\n ) : null}\n </>\n );\n}\n","import { useEffect } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useForm } from \"react-hook-form\";\nimport { SettingsSectionNav } from \"@/components/settings/settings-section-nav\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { SurfaceSkeleton } from \"@/components/experience/surface-skeleton\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { ErrorState } from \"@/components/ui/page-state\";\nimport { useI18n } from \"@/lib/i18n\";\nimport {\n ensureOperatorSession,\n getSettings,\n patchSettings,\n revokeOperatorSession\n} from \"@/lib/api\";\nimport { settingsMutationSchema, type SettingsMutationInput } from \"@/lib/schemas\";\n\nexport function SettingsPage() {\n const { t } = useI18n();\n const queryClient = useQueryClient();\n\n const operatorSessionQuery = useQuery({\n queryKey: [\"forge-operator-session\"],\n queryFn: ensureOperatorSession\n });\n const operatorReady = operatorSessionQuery.isSuccess;\n\n const settingsQuery = useQuery({\n queryKey: [\"forge-settings\"],\n queryFn: getSettings,\n enabled: operatorReady\n });\n\n const settingsForm = useForm<SettingsMutationInput>({\n defaultValues: {\n profile: {\n operatorName: \"\",\n operatorEmail: \"\",\n operatorTitle: \"\"\n },\n notifications: {\n goalDriftAlerts: true,\n dailyQuestReminders: true,\n achievementCelebrations: true\n },\n execution: {\n maxActiveTasks: 2,\n timeAccountingMode: \"split\"\n },\n themePreference: \"obsidian\",\n localePreference: \"en\"\n }\n });\n\n const invalidateSettings = async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-operator-session\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-settings\"] })\n ]);\n };\n\n const updateMutation = useMutation({\n mutationFn: (input: SettingsMutationInput) => patchSettings(input),\n onSuccess: invalidateSettings\n });\n\n const revokeSessionMutation = useMutation({\n mutationFn: revokeOperatorSession,\n onSuccess: async () => {\n await invalidateSettings();\n await operatorSessionQuery.refetch();\n }\n });\n\n useEffect(() => {\n if (!settingsQuery.data?.settings) return;\n settingsForm.reset(settingsMutationSchema.parse(settingsQuery.data.settings));\n }, [settingsQuery.data, settingsForm]);\n\n const settings = settingsQuery.data?.settings;\n\n if (operatorSessionQuery.isLoading || settingsQuery.isLoading) {\n return (\n <SurfaceSkeleton\n eyebrow=\"Settings\"\n title=\"Loading settings\"\n description=\"Establishing the operator session and fetching current configuration.\"\n columns={2}\n blocks={6}\n />\n );\n }\n\n if (operatorSessionQuery.isError) {\n return (\n <ErrorState\n eyebrow=\"Settings\"\n error={operatorSessionQuery.error}\n onRetry={() => void operatorSessionQuery.refetch()}\n />\n );\n }\n\n if (settingsQuery.isError || !settings) {\n return (\n <ErrorState\n eyebrow=\"Settings\"\n error={settingsQuery.error ?? new Error(\"Forge returned an empty settings payload.\")}\n onRetry={() => void settingsQuery.refetch()}\n />\n );\n }\n\n return (\n <div className=\"mx-auto grid w-full max-w-[1220px] gap-5\">\n <PageHero\n title=\"Settings\"\n description=\"Tune execution policy, timer behaviour, and personal preferences.\"\n badge={`${settings.security.integrityScore}% integrity`}\n />\n\n <SettingsSectionNav />\n\n {operatorSessionQuery.data?.session ? (\n <div className=\"flex flex-wrap items-center justify-between gap-3 rounded-[18px] border border-emerald-400/20 bg-emerald-500/[0.08] px-4 py-3 text-sm text-emerald-100/88\">\n <div>\n Operator session active as <span className=\"font-medium text-white\">{operatorSessionQuery.data.session.actorLabel}</span>.\n </div>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n pending={revokeSessionMutation.isPending}\n pendingLabel=\"Resetting session\"\n onClick={() => void revokeSessionMutation.mutateAsync()}\n >\n Reset operator session\n </Button>\n </div>\n ) : null}\n\n <div className=\"grid gap-5\">\n <Card>\n <form\n className=\"grid gap-4\"\n onSubmit={settingsForm.handleSubmit(async (values) => {\n await updateMutation.mutateAsync(values);\n })}\n >\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Operator profile</div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Name</span>\n <Input {...settingsForm.register(\"profile.operatorName\")} />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Email</span>\n <Input {...settingsForm.register(\"profile.operatorEmail\")} />\n </label>\n </div>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Title</span>\n <Input {...settingsForm.register(\"profile.operatorTitle\")} />\n </label>\n\n <div className=\"mt-2 font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Execution policy</div>\n <div className=\"grid gap-4 lg:grid-cols-[minmax(0,0.75fr)_minmax(0,1.25fr)]\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Maximum active tasks</span>\n <Input type=\"number\" min={1} max={8} {...settingsForm.register(\"execution.maxActiveTasks\", { valueAsNumber: true })} />\n </label>\n <div className=\"grid gap-3\">\n <div className=\"text-sm text-white/58\">Time accounting mode</div>\n <div className=\"grid gap-3 md:grid-cols-3\">\n {([\n {\n value: \"split\",\n label: \"Split\",\n description: \"Multitasking divides credited time across active tasks.\"\n },\n {\n value: \"parallel\",\n label: \"Parallel\",\n description: \"Every active task receives full credited wall time.\"\n },\n {\n value: \"primary_only\",\n label: \"Primary only\",\n description: \"Only the highlighted task earns credited time during overlap.\"\n }\n ] as const).map((mode) => (\n <label key={mode.value} className=\"grid gap-2 rounded-[18px] bg-white/[0.04] px-4 py-4\">\n <span className=\"flex items-center gap-3\">\n <input type=\"radio\" value={mode.value} {...settingsForm.register(\"execution.timeAccountingMode\")} />\n <span className=\"text-white/82\">{mode.label}</span>\n </span>\n <span className=\"text-sm leading-6 text-white/56\">{mode.description}</span>\n </label>\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"mt-2 font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Notification rules</div>\n <label className=\"flex items-center justify-between rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <span className=\"text-white/72\">Goal drift alerts</span>\n <input type=\"checkbox\" {...settingsForm.register(\"notifications.goalDriftAlerts\")} />\n </label>\n <label className=\"flex items-center justify-between rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <span className=\"text-white/72\">Daily quest reminders</span>\n <input type=\"checkbox\" {...settingsForm.register(\"notifications.dailyQuestReminders\")} />\n </label>\n <label className=\"flex items-center justify-between rounded-[18px] bg-white/[0.04] px-4 py-3\">\n <span className=\"text-white/72\">Achievement celebrations</span>\n <input type=\"checkbox\" {...settingsForm.register(\"notifications.achievementCelebrations\")} />\n </label>\n\n <div className=\"mt-2 font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Theme calibration</div>\n <div className=\"grid gap-3 md:grid-cols-3\">\n {([\"obsidian\", \"solar\", \"system\"] as const).map((theme) => (\n <label key={theme} className=\"flex items-center gap-3 rounded-[18px] bg-white/[0.04] px-4 py-4\">\n <input type=\"radio\" value={theme} {...settingsForm.register(\"themePreference\")} />\n <span className=\"text-white/72 capitalize\">{theme}</span>\n </label>\n ))}\n </div>\n\n <div className=\"mt-2 font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.settings.localeLabel\")}</div>\n <p className=\"text-sm text-white/58\">{t(\"common.settings.localeDescription\")}</p>\n <div className=\"grid gap-3 md:grid-cols-2\">\n {([\n { value: \"en\", label: t(\"common.settings.localeEnglish\") },\n { value: \"fr\", label: t(\"common.settings.localeFrench\") }\n ] as const).map((locale) => (\n <label key={locale.value} className=\"flex items-center gap-3 rounded-[18px] bg-white/[0.04] px-4 py-4\">\n <input type=\"radio\" value={locale.value} {...settingsForm.register(\"localePreference\")} />\n <span className=\"text-white/72\">{locale.label}</span>\n </label>\n ))}\n </div>\n\n <Button type=\"submit\" pending={updateMutation.isPending} pendingLabel=\"Saving settings\">\n Save settings\n </Button>\n </form>\n </Card>\n\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Security posture</div>\n <div className=\"mt-4 grid gap-3\">\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"text-sm text-white/58\">Storage mode</div>\n <div className=\"mt-2 font-display text-2xl text-white\">{settings.security.storageMode}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"text-sm text-white/58\">Last audit</div>\n <div className=\"mt-2 text-white\">{new Date(settings.security.lastAuditAt).toLocaleString()}</div>\n </div>\n </div>\n </Card>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { FlowChoiceGrid, FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { createAgentTokenSchema, type CreateAgentTokenInput } from \"@/lib/schemas\";\n\nconst FULL_OPERATOR_SCOPES = [\n \"read\",\n \"write\",\n \"insights\",\n \"rewards.manage\",\n \"psyche.read\",\n \"psyche.write\",\n \"psyche.comment\",\n \"psyche.insight\",\n \"psyche.mode\"\n] as const;\n\nconst TOKEN_SCOPE_OPTIONS = [\n { value: \"read\", label: \"Read\", description: \"Inspect goals, projects, tasks, reviews, and metrics.\" },\n { value: \"write\", label: \"Write\", description: \"Create and update work through the versioned API.\" },\n { value: \"insights\", label: \"Insights\", description: \"Store structured findings, rationale, and feedback.\" },\n { value: \"rewards.manage\", label: \"Rewards\", description: \"Tune reward rules and issue explainable bonus XP grants.\" },\n { value: \"psyche.read\", label: \"Psyche read\", description: \"Read sensitive values, patterns, and trigger analyses.\" },\n { value: \"psyche.write\", label: \"Psyche write\", description: \"Create and update sensitive therapeutic records.\" },\n { value: \"psyche.comment\", label: \"Psyche comment\", description: \"Comment on reflection records without broader write access.\" },\n { value: \"psyche.insight\", label: \"Psyche insight\", description: \"Store therapeutic insights on Psyche entities.\" },\n { value: \"psyche.mode\", label: \"Psyche mode\", description: \"Name, refine, and map mode profiles and guided mode results.\" }\n] as const;\n\ntype TokenPreset = \"review\" | \"operator\" | \"autonomous\" | \"custom\";\n\ntype TokenDraft = {\n preset: TokenPreset;\n label: string;\n agentLabel: string;\n agentType: string;\n description: string;\n trustLevel: \"standard\" | \"trusted\" | \"autonomous\";\n autonomyMode: \"approval_required\" | \"scoped_write\" | \"autonomous\";\n approvalMode: \"approval_by_default\" | \"high_impact_only\" | \"none\";\n scopes: string[];\n};\n\nfunction applyPreset(draft: TokenDraft, preset: TokenPreset, recommendedScopes: readonly string[]): TokenDraft {\n if (preset === \"review\") {\n return {\n ...draft,\n preset,\n trustLevel: \"trusted\",\n autonomyMode: \"approval_required\",\n approvalMode: \"approval_by_default\",\n scopes: [...recommendedScopes]\n };\n }\n if (preset === \"operator\") {\n return {\n ...draft,\n preset,\n trustLevel: \"trusted\",\n autonomyMode: \"scoped_write\",\n approvalMode: \"high_impact_only\",\n scopes: [...FULL_OPERATOR_SCOPES]\n };\n }\n if (preset === \"autonomous\") {\n return {\n ...draft,\n preset,\n trustLevel: \"autonomous\",\n autonomyMode: \"autonomous\",\n approvalMode: \"none\",\n scopes: [...FULL_OPERATOR_SCOPES]\n };\n }\n return { ...draft, preset };\n}\n\nfunction buildInitialDraft(\n initialPreset: TokenPreset,\n defaultAgentLabel: string,\n recommendedScopes: readonly string[]\n): TokenDraft {\n const base: TokenDraft = {\n preset: initialPreset,\n label: \"Forge Pilot Token\",\n agentLabel: defaultAgentLabel,\n agentType: \"assistant\",\n description: \"Collaborative planning agent.\",\n trustLevel: \"trusted\",\n autonomyMode: \"scoped_write\",\n approvalMode: \"high_impact_only\",\n scopes: [...FULL_OPERATOR_SCOPES]\n };\n return applyPreset(base, initialPreset, recommendedScopes);\n}\n\nexport function AgentTokenFlowDialog({\n open,\n onOpenChange,\n pending = false,\n initialPreset = \"operator\",\n defaultAgentLabel = \"OpenClaw\",\n recommendedScopes = [...FULL_OPERATOR_SCOPES],\n onSubmit\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n pending?: boolean;\n initialPreset?: TokenPreset;\n defaultAgentLabel?: string;\n recommendedScopes?: readonly string[];\n onSubmit: (input: CreateAgentTokenInput) => Promise<void>;\n}) {\n const [draft, setDraft] = useState<TokenDraft>(() =>\n buildInitialDraft(initialPreset, defaultAgentLabel, recommendedScopes)\n );\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) {\n setDraft(buildInitialDraft(initialPreset, defaultAgentLabel, recommendedScopes));\n setSubmitError(null);\n }\n }, [open, initialPreset, defaultAgentLabel, recommendedScopes]);\n\n const patch = (update: Partial<TokenDraft>) => setDraft((prev) => ({ ...prev, ...update }));\n\n const steps: Array<QuestionFlowStep<TokenDraft>> = [\n {\n id: \"preset\",\n eyebrow: \"Agent token\",\n title: \"Choose a starting point for this token\",\n description:\n \"Each preset locks in a sensible trust, autonomy, and approval policy. You can tune any setting in the next steps.\",\n render: (value, setValue) => (\n <FlowChoiceGrid\n columns={3}\n value={value.preset}\n onChange={(next) =>\n setValue(applyPreset(value, next as TokenPreset, recommendedScopes))\n }\n options={[\n {\n value: \"review\",\n label: \"Review-first\",\n description:\n \"Every action waits for your approval. Safe starting point for a new agent you have not yet trusted.\"\n },\n {\n value: \"operator\",\n label: \"Full operator\",\n description:\n \"Trusted collaborator with full scopes. High-impact actions still ask for approval.\"\n },\n {\n value: \"autonomous\",\n label: \"Autonomous pilot\",\n description:\n \"No approval gates. Use only for agents you have fully verified in a controlled setup.\"\n },\n {\n value: \"custom\",\n label: \"Custom\",\n description:\n \"Start from a blank slate and configure every dimension yourself.\"\n }\n ]}\n />\n )\n },\n {\n id: \"identity\",\n eyebrow: \"Agent identity\",\n title: \"Name the agent and this token\",\n description:\n \"The agent name appears in logs, approval requests, and audit trails. The token label is for your reference.\",\n render: (value, setValue) => (\n <>\n <FlowField\n label=\"Agent name\"\n labelHelp=\"This label identifies the agent in every log entry, approval notification, and XP attribution. Pick something memorable.\"\n >\n <Input\n value={value.agentLabel}\n placeholder=\"OpenClaw\"\n onChange={(e) => setValue({ agentLabel: e.target.value })}\n />\n </FlowField>\n <FlowField\n label=\"Token label\"\n description=\"A short name for this credential — mainly for your reference in the token list.\"\n >\n <Input\n value={value.label}\n placeholder=\"Forge Pilot Token\"\n onChange={(e) => setValue({ label: e.target.value })}\n />\n </FlowField>\n <div className=\"grid gap-5 md:grid-cols-2\">\n <FlowField\n label=\"Agent type\"\n labelHelp=\"Use 'assistant' for interactive agents. Use 'automation' for scripts or scheduled jobs with no conversational layer.\"\n >\n <select\n className=\"rounded-[14px] bg-white/[0.06] px-3 py-3 text-white\"\n value={value.agentType}\n onChange={(e) => setValue({ agentType: e.target.value })}\n >\n <option value=\"assistant\">assistant</option>\n <option value=\"automation\">automation</option>\n <option value=\"observer\">observer</option>\n </select>\n </FlowField>\n <FlowField label=\"Description\" description=\"Optional note about what this agent does.\">\n <Input\n value={value.description}\n placeholder=\"Collaborative planning agent.\"\n onChange={(e) => setValue({ description: e.target.value })}\n />\n </FlowField>\n </div>\n </>\n )\n },\n {\n id: \"policy\",\n eyebrow: \"Access policy\",\n title: \"Set trust level and approval behaviour\",\n description:\n \"These three settings control how much autonomy the agent has and when it needs your sign-off. The preset you chose filled sensible defaults — adjust only if needed.\",\n render: (value, setValue) => (\n <>\n <FlowField\n label=\"Trust level\"\n labelHelp=\"Standard agents are sandboxed readers. Trusted agents can write with policy guardrails. Autonomous agents bypass all trust checks — use with care.\"\n >\n <FlowChoiceGrid\n columns={3}\n value={value.trustLevel}\n onChange={(next) => setValue({ trustLevel: next as TokenDraft[\"trustLevel\"] })}\n options={[\n { value: \"standard\", label: \"Standard\", description: \"Read-only by default, limited write surface.\" },\n { value: \"trusted\", label: \"Trusted\", description: \"Full write surface with policy guardrails active.\" },\n { value: \"autonomous\", label: \"Autonomous\", description: \"All checks bypassed — maximum capability.\" }\n ]}\n />\n </FlowField>\n <FlowField\n label=\"Autonomy mode\"\n labelHelp=\"Approval-required means every mutation is held for review. Scoped write lets the agent act within its scopes. Autonomous skips all gates.\"\n >\n <FlowChoiceGrid\n columns={3}\n value={value.autonomyMode}\n onChange={(next) => setValue({ autonomyMode: next as TokenDraft[\"autonomyMode\"] })}\n options={[\n { value: \"approval_required\", label: \"Approval required\", description: \"Every write action queues for your review.\" },\n { value: \"scoped_write\", label: \"Scoped write\", description: \"Acts freely within its assigned scopes.\" },\n { value: \"autonomous\", label: \"Autonomous\", description: \"No gates — full freedom to write.\" }\n ]}\n />\n </FlowField>\n <FlowField\n label=\"Approval policy\"\n labelHelp=\"Controls which actions trigger the approval queue. High-impact-only is the balanced default: routine writes go through, large mutations get reviewed.\"\n >\n <FlowChoiceGrid\n columns={3}\n value={value.approvalMode}\n onChange={(next) => setValue({ approvalMode: next as TokenDraft[\"approvalMode\"] })}\n options={[\n { value: \"approval_by_default\", label: \"Approve by default\", description: \"Everything needs a sign-off unless explicitly exempt.\" },\n { value: \"high_impact_only\", label: \"High impact only\", description: \"Routine writes pass through; high-stakes actions are held.\" },\n { value: \"none\", label: \"None\", description: \"No approval gates — actions execute immediately.\" }\n ]}\n />\n </FlowField>\n </>\n )\n },\n {\n id: \"scopes\",\n eyebrow: \"Scopes\",\n title: \"Select what this agent can access\",\n description:\n \"Scope selection follows the principle of least privilege — only grant what the agent actually needs. The full operator bundle covers every capability.\",\n render: (value, setValue) => (\n <FlowField\n label=\"Capabilities\"\n labelHelp=\"Read lets the agent inspect the system. Write lets it create and update work. Rewards and Psyche scopes unlock more sensitive subsystems.\"\n >\n <div className=\"grid gap-3 md:grid-cols-3\">\n {TOKEN_SCOPE_OPTIONS.map((scope) => {\n const selected = value.scopes.includes(scope.value);\n return (\n <button\n key={scope.value}\n type=\"button\"\n className={`rounded-[18px] border px-4 py-4 text-left transition ${\n selected\n ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white\"\n : \"border-white/8 bg-white/[0.04] text-white/58 hover:bg-white/[0.08]\"\n }`}\n onClick={() => {\n if (selected) {\n if (value.scopes.length === 1) return;\n setValue({ scopes: value.scopes.filter((s) => s !== scope.value) });\n } else {\n setValue({ scopes: [...value.scopes, scope.value] });\n }\n }}\n >\n <div className=\"font-medium\">{scope.label}</div>\n <div className=\"mt-1 text-xs leading-5 text-white/58\">{scope.description}</div>\n </button>\n );\n })}\n </div>\n <div className=\"mt-2 text-xs text-white/40\">\n {value.scopes.length} scope{value.scopes.length !== 1 ? \"s\" : \"\"} selected\n </div>\n </FlowField>\n )\n }\n ];\n\n return (\n <QuestionFlowDialog\n open={open}\n onOpenChange={onOpenChange}\n eyebrow=\"Agent setup\"\n title=\"Issue an agent token\"\n description=\"Configure a new agent token step by step. The preset fills sensible defaults — adjust what you need.\"\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel=\"Issue token\"\n pending={pending}\n pendingLabel=\"Issuing token…\"\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n const payload = createAgentTokenSchema.safeParse({\n label: draft.label,\n agentLabel: draft.agentLabel,\n agentType: draft.agentType,\n description: draft.description,\n trustLevel: draft.trustLevel,\n autonomyMode: draft.autonomyMode,\n approvalMode: draft.approvalMode,\n scopes: draft.scopes\n });\n\n if (!payload.success) {\n const firstIssue = payload.error.issues[0];\n setSubmitError(firstIssue?.message ?? \"Check the agent name and at least one scope before issuing.\");\n return;\n }\n\n try {\n await onSubmit(payload.data);\n onOpenChange(false);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Could not issue the token right now.\");\n }\n }}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { FlowChoiceGrid, FlowField, QuestionFlowDialog, type QuestionFlowStep } from \"@/components/flows/question-flow-dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport type { OperatorLogWorkInput } from \"@/lib/types\";\nimport type { Task } from \"@/lib/types\";\n\ntype LogWorkDraft = {\n source: \"existing\" | \"new\";\n taskId: string;\n title: string;\n description: string;\n owner: string;\n projectId: string;\n status: \"backlog\" | \"focus\" | \"in_progress\" | \"blocked\" | \"done\";\n points: number;\n};\n\ntype ActiveProject = { id: string; title: string };\n\nfunction buildInitialDraft(defaultOwner: string): LogWorkDraft {\n return {\n source: \"new\",\n taskId: \"\",\n title: \"\",\n description: \"\",\n owner: defaultOwner,\n projectId: \"\",\n status: \"done\",\n points: 40\n };\n}\n\nexport function LogWorkFlowDialog({\n open,\n onOpenChange,\n pending = false,\n defaultOwner = \"\",\n availableTasks = [],\n availableProjects = [],\n onSubmit\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n pending?: boolean;\n defaultOwner?: string;\n availableTasks?: Task[];\n availableProjects?: ActiveProject[];\n onSubmit: (input: OperatorLogWorkInput) => Promise<void>;\n}) {\n const [draft, setDraft] = useState<LogWorkDraft>(() => buildInitialDraft(defaultOwner));\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) {\n setDraft(buildInitialDraft(defaultOwner));\n setSubmitError(null);\n }\n }, [open, defaultOwner]);\n\n const patch = (update: Partial<LogWorkDraft>) => setDraft((prev) => ({ ...prev, ...update }));\n\n const steps: Array<QuestionFlowStep<LogWorkDraft>> = [\n {\n id: \"source\",\n eyebrow: \"Log work\",\n title: \"Is this work already tracked?\",\n description:\n \"If a task exists, link the work to it so Forge can update the record with the right status and XP. If not, a new task will be created from what you describe.\",\n render: (value, setValue) => (\n <>\n <FlowChoiceGrid\n columns={2}\n value={value.source}\n onChange={(next) => setValue({ source: next as \"existing\" | \"new\", taskId: \"\" })}\n options={[\n {\n value: \"new\",\n label: \"New task\",\n description: \"The work is not tracked yet — Forge will create a task and log the time against it.\"\n },\n {\n value: \"existing\",\n label: \"Existing task\",\n description: \"Pick a task already in the board. The log will update its record and award XP.\"\n }\n ]}\n />\n {value.source === \"existing\" && availableTasks.length > 0 ? (\n <FlowField label=\"Pick the task\" description=\"Select the task this work belongs to.\">\n <select\n className=\"rounded-[14px] bg-white/[0.06] px-3 py-3 text-white\"\n value={value.taskId}\n onChange={(e) => setValue({ taskId: e.target.value })}\n >\n <option value=\"\">— choose a task —</option>\n {availableTasks.map((task) => (\n <option key={task.id} value={task.id}>\n {task.title} · {task.status.replaceAll(\"_\", \" \")}\n </option>\n ))}\n </select>\n </FlowField>\n ) : value.source === \"existing\" && availableTasks.length === 0 ? (\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-3 text-sm text-white/58\">\n No tasks are loaded yet. Switch to \"New task\" to create one from scratch.\n </div>\n ) : null}\n </>\n )\n },\n {\n id: \"details\",\n eyebrow: \"Work details\",\n title: \"Describe what was done\",\n description:\n \"Give the work a clear title and enough context to understand it later. These become the task record if you are creating a new one.\",\n render: (value, setValue) => (\n <>\n <FlowField\n label=\"Title\"\n labelHelp=\"Write the title like a short achievement: what was completed, not what was started.\"\n >\n <Input\n value={value.title}\n placeholder=\"Write postmortem draft\"\n onChange={(e) => setValue({ title: e.target.value })}\n />\n </FlowField>\n <FlowField label=\"Owner\" description=\"Who did this work? Defaults to the operator name.\">\n <Input\n value={value.owner}\n placeholder=\"Your name\"\n onChange={(e) => setValue({ owner: e.target.value })}\n />\n </FlowField>\n <FlowField\n label=\"Description\"\n description=\"What moved forward? What should remain visible in the project history?\"\n >\n <Textarea\n className=\"min-h-28\"\n value={value.description}\n placeholder=\"Wrote the full incident timeline and drafted the three key learnings for the team retrospective.\"\n onChange={(e) => setValue({ description: e.target.value })}\n />\n </FlowField>\n </>\n )\n },\n {\n id: \"placement\",\n eyebrow: \"Placement\",\n title: \"Set the context and XP value\",\n description:\n \"Assign the work to a project and choose its final status. The XP value controls how much this work contributes to the operator's progress curve.\",\n render: (value, setValue) => (\n <>\n <div className=\"grid gap-5 md:grid-cols-2\">\n <FlowField label=\"Project\" description=\"Link this work to an active project if it belongs to one.\">\n <select\n className=\"rounded-[14px] bg-white/[0.06] px-3 py-3 text-white\"\n value={value.projectId}\n onChange={(e) => setValue({ projectId: e.target.value })}\n >\n <option value=\"\">No project link</option>\n {availableProjects.map((project) => (\n <option key={project.id} value={project.id}>\n {project.title}\n </option>\n ))}\n </select>\n </FlowField>\n <FlowField\n label=\"Final status\"\n labelHelp=\"'Done' is the most common choice. Use 'In progress' if the work was real but the task is still open.\"\n >\n <FlowChoiceGrid\n columns={2}\n value={value.status}\n onChange={(next) => setValue({ status: next as LogWorkDraft[\"status\"] })}\n options={[\n { value: \"done\", label: \"Done\", description: \"Work is complete.\" },\n { value: \"in_progress\", label: \"In progress\", description: \"Still active but already worth logging.\" },\n { value: \"focus\", label: \"Focus\", description: \"Moved into focus.\" },\n { value: \"blocked\", label: \"Blocked\", description: \"Work hit a wall.\" }\n ]}\n />\n </FlowField>\n </div>\n <FlowField\n label=\"XP value\"\n labelHelp=\"Typical task XP ranges from 20 to 100. Use 40 for routine tasks, 80+ for complex deliverables.\"\n >\n <div className=\"flex items-center gap-4\">\n <Input\n type=\"number\"\n min={5}\n max={500}\n className=\"w-36\"\n value={value.points}\n onChange={(e) => setValue({ points: Number(e.target.value) })}\n />\n <div className=\"flex gap-2\">\n {[20, 40, 80, 120].map((pts) => (\n <button\n key={pts}\n type=\"button\"\n className={`rounded-full px-3 py-1.5 text-xs transition ${value.points === pts ? \"bg-white/18 text-white\" : \"bg-white/[0.06] text-white/55 hover:bg-white/[0.10]\"}`}\n onClick={() => setValue({ points: pts })}\n >\n {pts} xp\n </button>\n ))}\n </div>\n </div>\n </FlowField>\n </>\n )\n }\n ];\n\n return (\n <QuestionFlowDialog\n open={open}\n onOpenChange={onOpenChange}\n eyebrow=\"Log work\"\n title=\"Log retroactive work\"\n description=\"Capture work that happened outside the timer so it counts toward progress and XP.\"\n value={draft}\n onChange={setDraft}\n steps={steps}\n submitLabel=\"Log work\"\n pending={pending}\n pendingLabel=\"Logging work…\"\n error={submitError}\n onSubmit={async () => {\n setSubmitError(null);\n if (draft.source === \"new\" && draft.title.trim().length === 0) {\n setSubmitError(\"Add a title so Forge knows what work to create.\");\n return;\n }\n if (draft.source === \"existing\" && !draft.taskId) {\n setSubmitError(\"Pick an existing task or switch to New task.\");\n return;\n }\n\n try {\n await onSubmit({\n taskId: draft.source === \"existing\" && draft.taskId ? draft.taskId : undefined,\n title: draft.source === \"new\" && draft.title.trim() ? draft.title.trim() : undefined,\n description: draft.description.trim() || undefined,\n owner: draft.owner.trim() || undefined,\n projectId: draft.projectId || null,\n status: draft.status,\n points: draft.points\n });\n onOpenChange(false);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : \"Could not log the work right now.\");\n }\n }}\n />\n );\n}\n","import { useState } from \"react\";\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { motion } from \"framer-motion\";\nimport { Check, Copy, KeyRound, X } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport type { AgentOnboardingPayload } from \"@/lib/types\";\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2200);\n } catch {\n // fallback: select text\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={() => void handleCopy()}\n className=\"flex items-center gap-1.5 rounded-full bg-white/[0.07] px-3 py-1.5 text-xs font-medium text-white/65 transition hover:bg-white/[0.12] hover:text-white\"\n >\n {copied ? <Check className=\"size-3 text-emerald-400\" /> : <Copy className=\"size-3\" />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n );\n}\n\nfunction CodeBlock({ label, children, copyText }: { label: string; children: string; copyText?: string }) {\n return (\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-xs uppercase tracking-[0.14em] text-white/40\">{label}</div>\n <CopyButton text={copyText ?? children} />\n </div>\n <pre className=\"mt-3 overflow-x-auto rounded-[14px] bg-[rgba(8,13,28,0.78)] p-3 text-xs leading-6 text-white/78\">\n <code>{children}</code>\n </pre>\n </div>\n );\n}\n\nexport type TokenRevealState = {\n tokenString: string;\n agentLabel: string;\n onboarding: AgentOnboardingPayload;\n};\n\nexport function TokenRevealDialog({\n open,\n onOpenChange,\n state\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n state: TokenRevealState | null;\n}) {\n if (!state) return null;\n\n const { tokenString, agentLabel, onboarding } = state;\n\n const configSnippet = JSON.stringify(\n {\n baseUrl: onboarding.forgeBaseUrl,\n apiToken: tokenString,\n actorLabel: agentLabel,\n timeoutMs: onboarding.defaultTimeoutMs\n },\n null,\n 2\n );\n\n const curlVerification = [\n `curl -s ${onboarding.healthUrl} \\\\`,\n ` -H \"Authorization: Bearer ${tokenString}\" \\\\`,\n ` -H \"X-Forge-Source: agent\" \\\\`,\n ` -H \"X-Forge-Actor: ${agentLabel}\"`\n ].join(\"\\n\");\n\n const restartSnippet = [\"openclaw gateway restart\", `openclaw agent --message \"forge_get_operator_overview\"`].join(\"\\n\");\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-40 bg-[rgba(4,8,18,0.82)] backdrop-blur-xl\" />\n <Dialog.Content className=\"fixed left-1/2 top-1/2 z-50 flex h-[min(52rem,calc(100vh-1rem))] w-[min(52rem,calc(100vw-1.5rem))] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-[34px] border border-[rgba(192,193,255,0.14)] bg-[linear-gradient(180deg,rgba(21,28,44,0.99),rgba(12,17,30,0.99))] shadow-[0_30px_90px_rgba(3,8,18,0.55)]\">\n <Dialog.Title className=\"sr-only\">Token issued — setup instructions</Dialog.Title>\n <Dialog.Description className=\"sr-only\">Your new agent token has been issued. Copy it now and follow the setup guide.</Dialog.Description>\n\n {/* Header */}\n <div className=\"flex shrink-0 items-start justify-between gap-4 border-b border-white/8 px-6 py-5\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex size-10 shrink-0 items-center justify-center rounded-full bg-[rgba(192,193,255,0.12)]\">\n <KeyRound className=\"size-5 text-[rgba(192,193,255,0.85)]\" />\n </div>\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/42\">Token issued</div>\n <div className=\"mt-0.5 font-display text-xl text-white\">Save your token now</div>\n </div>\n </div>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n aria-label=\"Close\"\n className=\"rounded-full bg-white/6 p-2 text-white/55 transition hover:bg-white/10 hover:text-white\"\n >\n <X className=\"size-4\" />\n </button>\n </Dialog.Close>\n </div>\n\n {/* Body */}\n <div className=\"flex-1 overflow-y-auto px-6 py-5\">\n <motion.div\n initial={{ opacity: 0, y: 16 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: \"easeOut\" }}\n className=\"grid gap-5\"\n >\n {/* One-time token reveal */}\n <div className=\"rounded-[20px] border border-amber-400/18 bg-amber-400/[0.07] p-4\">\n <div className=\"flex items-center gap-2\">\n <Badge className=\"text-amber-300\">One-time reveal</Badge>\n <span className=\"text-sm text-white/60\">This value will not be shown again.</span>\n </div>\n <div className=\"mt-3 flex items-center justify-between gap-3 rounded-[14px] bg-[rgba(8,13,28,0.78)] px-4 py-3\">\n <code className=\"min-w-0 flex-1 break-all text-xs text-white/90\">{tokenString}</code>\n <CopyButton text={tokenString} />\n </div>\n <div className=\"mt-2 text-xs text-white/45\">\n Forge stores only a hash — the raw token is unrecoverable after you close this dialog. If lost, rotate the token from the Agents settings page.\n </div>\n </div>\n\n {/* Step 1 — add to plugin config */}\n <div>\n <div className=\"mb-3 flex items-center gap-2\">\n <div className=\"flex size-5 items-center justify-center rounded-full bg-white/12 text-xs font-semibold text-white\">1</div>\n <span className=\"text-sm font-medium text-white\">Add the token to your OpenClaw plugin config</span>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4 text-sm leading-6 text-white/62\">\n Open your <code className=\"rounded-md bg-white/[0.08] px-1.5 py-0.5 text-xs text-white/82\">openclaw.json</code> file and find the{\" \"}\n <code className=\"rounded-md bg-white/[0.08] px-1.5 py-0.5 text-xs text-white/82\">forge</code> plugin entry under{\" \"}\n <code className=\"rounded-md bg-white/[0.08] px-1.5 py-0.5 text-xs text-white/82\">plugins</code>. Add or replace its{\" \"}\n <code className=\"rounded-md bg-white/[0.08] px-1.5 py-0.5 text-xs text-white/82\">params</code> with the config block below.\n </div>\n <div className=\"mt-3\">\n <CodeBlock label=\"Plugin params — paste into openclaw.json → plugins → forge → params\" copyText={configSnippet}>\n {configSnippet}\n </CodeBlock>\n </div>\n </div>\n\n {/* Step 2 — restart gateway */}\n <div>\n <div className=\"mb-3 flex items-center gap-2\">\n <div className=\"flex size-5 items-center justify-center rounded-full bg-white/12 text-xs font-semibold text-white\">2</div>\n <span className=\"text-sm font-medium text-white\">Restart the gateway and confirm the agent can connect</span>\n </div>\n <CodeBlock label=\"Run in terminal\" copyText={restartSnippet}>\n {restartSnippet}\n </CodeBlock>\n </div>\n\n {/* Step 3 — verify */}\n <div>\n <div className=\"mb-3 flex items-center gap-2\">\n <div className=\"flex size-5 items-center justify-center rounded-full bg-white/12 text-xs font-semibold text-white\">3</div>\n <span className=\"text-sm font-medium text-white\">Verify the token is accepted by the API</span>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4 text-sm leading-6 text-white/62\">\n Run the curl below. A{\" \"}\n <code className=\"rounded-md bg-white/[0.08] px-1.5 py-0.5 text-xs text-emerald-300\">200 OK</code> response means the token works and the agent{\" \"}\n <strong className=\"text-white/80\">{agentLabel}</strong> is authenticated.\n </div>\n <div className=\"mt-3\">\n <CodeBlock label=\"Verify token — run in terminal\" copyText={curlVerification}>\n {curlVerification}\n </CodeBlock>\n </div>\n </div>\n\n {/* Tip */}\n <div className=\"rounded-[18px] border border-white/6 bg-white/[0.03] px-4 py-3 text-sm leading-6 text-white/50\">\n <strong className=\"text-white/68\">Tip:</strong> If you ever lose this token, go to <strong className=\"text-white/68\">Settings → Agents → Agent tokens</strong>, find the entry, and click{\" \"}\n <strong className=\"text-white/68\">Rotate &amp; reveal</strong> to get a fresh value without creating a new agent identity.\n </div>\n </motion.div>\n </div>\n\n {/* Footer */}\n <div className=\"shrink-0 border-t border-white/8 px-6 py-4\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"text-sm text-white/45\">Token saved? Close this dialog when you are ready.</div>\n <Button onClick={() => onOpenChange(false)}>\n <Check className=\"size-4\" />\n Done\n </Button>\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { ArrowRight, ChevronDown, ChevronUp, ClipboardList, Plus } from \"lucide-react\";\nimport { AgentTokenFlowDialog } from \"@/components/settings/agent-token-flow-dialog\";\nimport { LogWorkFlowDialog } from \"@/components/settings/log-work-flow-dialog\";\nimport { TokenRevealDialog, type TokenRevealState } from \"@/components/settings/token-reveal-dialog\";\nimport { SettingsSectionNav } from \"@/components/settings/settings-section-nav\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { SurfaceSkeleton } from \"@/components/experience/surface-skeleton\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { MetricTile } from \"@/components/ui/metric-tile\";\nimport { ErrorState } from \"@/components/ui/page-state\";\nimport {\n approveApprovalRequest,\n createAgentToken,\n ensureOperatorSession,\n getAgentOnboarding,\n getOperatorContext,\n getSettings,\n listApprovalRequests,\n logOperatorWork,\n rejectApprovalRequest,\n revokeAgentToken,\n rotateAgentToken\n} from \"@/lib/api\";\nimport type { AgentTokenSummary, Task } from \"@/lib/types\";\nimport type { CreateAgentTokenInput } from \"@/lib/schemas\";\n\nfunction tokenHasScopes(token: AgentTokenSummary, scopes: readonly string[]) {\n return scopes.every((scope) => token.scopes.includes(scope));\n}\n\nexport function SettingsAgentsPage() {\n const queryClient = useQueryClient();\n\n // ── Dialog state ──────────────────────────────────────────────────────────\n const [tokenDialogOpen, setTokenDialogOpen] = useState(false);\n const [tokenDialogPreset, setTokenDialogPreset] = useState<\"review\" | \"operator\" | \"autonomous\" | \"custom\">(\"operator\");\n const [revealState, setRevealState] = useState<TokenRevealState | null>(null);\n const [revealDialogOpen, setRevealDialogOpen] = useState(false);\n const [logWorkDialogOpen, setLogWorkDialogOpen] = useState(false);\n const [onboardingExpanded, setOnboardingExpanded] = useState(false);\n\n // ── Queries ───────────────────────────────────────────────────────────────\n const operatorSessionQuery = useQuery({\n queryKey: [\"forge-operator-session\"],\n queryFn: ensureOperatorSession\n });\n const operatorReady = operatorSessionQuery.isSuccess;\n\n const settingsQuery = useQuery({\n queryKey: [\"forge-settings\"],\n queryFn: getSettings,\n enabled: operatorReady\n });\n const approvalsQuery = useQuery({\n queryKey: [\"forge-approval-requests\"],\n queryFn: listApprovalRequests,\n enabled: operatorReady\n });\n const onboardingQuery = useQuery({\n queryKey: [\"forge-agent-onboarding\"],\n queryFn: getAgentOnboarding\n });\n const operatorContextQuery = useQuery({\n queryKey: [\"forge-operator-context\"],\n queryFn: getOperatorContext,\n enabled: operatorReady\n });\n\n // ── Mutations ─────────────────────────────────────────────────────────────\n const invalidateAll = async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-operator-session\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-settings\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-approval-requests\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-agent-onboarding\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-operator-context\"] })\n ]);\n };\n\n const tokenMutation = useMutation({\n mutationFn: (input: CreateAgentTokenInput) => createAgentToken(input),\n onSuccess: invalidateAll\n });\n const rotateMutation = useMutation({\n mutationFn: (tokenId: string) => rotateAgentToken(tokenId),\n onSuccess: async (data, _tokenId) => {\n await invalidateAll();\n // Show the reveal dialog for the rotated token\n if (onboarding) {\n const rotatedSummary = data.token;\n setRevealState({\n tokenString: rotatedSummary.token,\n agentLabel: rotatedSummary.tokenSummary.agentLabel ?? \"forge-agent\",\n onboarding\n });\n setRevealDialogOpen(true);\n }\n }\n });\n const revokeMutation = useMutation({\n mutationFn: (tokenId: string) => revokeAgentToken(tokenId),\n onSuccess: invalidateAll\n });\n const approveMutation = useMutation({\n mutationFn: (id: string) => approveApprovalRequest(id),\n onSuccess: invalidateAll\n });\n const rejectMutation = useMutation({\n mutationFn: (id: string) => rejectApprovalRequest(id),\n onSuccess: invalidateAll\n });\n const logWorkMutation = useMutation({\n mutationFn: logOperatorWork,\n onSuccess: invalidateAll\n });\n\n // ── Derived data ─────────────────────────────────────────────────────────\n const settings = settingsQuery.data?.settings;\n const approvals = approvalsQuery.data?.approvalRequests ?? [];\n const onboarding = onboardingQuery.data?.onboarding;\n const operatorContext = operatorContextQuery.data?.context;\n\n const activeTokens = settings?.agentTokens.filter((t) => t.status === \"active\") ?? [];\n const recommendedScopes = onboarding?.recommendedScopes ?? [];\n const hasFullOperatorToken = activeTokens.some((t) => tokenHasScopes(t, recommendedScopes));\n const hasRewardManager = activeTokens.some((t) => tokenHasScopes(t, [\"rewards.manage\"]));\n const hasPsycheWriter = activeTokens.some((t) => tokenHasScopes(t, [\"psyche.write\"]));\n const hasScopedWriter = activeTokens.some((t) => t.autonomyMode !== \"approval_required\" && tokenHasScopes(t, [\"write\"]));\n const hasAnyToken = activeTokens.length > 0;\n\n const operatorTasks = useMemo(() => {\n if (!operatorContext) return [] as Task[];\n const pool = [\n ...operatorContext.focusTasks,\n ...operatorContext.currentBoard.backlog,\n ...operatorContext.currentBoard.focus,\n ...operatorContext.currentBoard.inProgress,\n ...operatorContext.currentBoard.blocked,\n ...operatorContext.currentBoard.done\n ];\n const unique = new Map<string, Task>();\n for (const task of pool) unique.set(task.id, task);\n return [...unique.values()];\n }, [operatorContext]);\n\n const defaultOwner = settings?.profile.operatorName ?? \"\";\n\n // Capability rows — each has an action button when not configured\n const capabilities = [\n {\n label: \"Operator session\",\n ok: true,\n badge: \"active\",\n badgeTone: \"emerald\",\n detail: operatorSessionQuery.data?.session\n ? `Session open as ${operatorSessionQuery.data.session.actorLabel}. Works for localhost and Tailscale without a token.`\n : \"Passwordless session is active for local and Tailscale access.\",\n action: null\n },\n {\n label: \"Agent token\",\n ok: hasAnyToken,\n badge: hasAnyToken ? `${activeTokens.length} active` : \"none issued\",\n badgeTone: hasAnyToken ? \"emerald\" : \"amber\",\n detail: hasAnyToken\n ? `${activeTokens.length} active token${activeTokens.length === 1 ? \"\" : \"s\"} allow external agents and scripts to authenticate.`\n : \"No token yet. Issue one to let external agents connect via the API.\",\n action: hasAnyToken\n ? null\n : {\n label: \"Issue token\",\n preset: \"operator\" as const,\n onClick: () => {\n setTokenDialogPreset(\"operator\");\n setTokenDialogOpen(true);\n }\n }\n },\n {\n label: \"Full operator bundle\",\n ok: hasFullOperatorToken,\n badge: hasFullOperatorToken ? \"ready\" : \"optional\",\n badgeTone: hasFullOperatorToken ? \"emerald\" : \"neutral\",\n detail: hasFullOperatorToken\n ? \"A token covers all recommended scopes for full operator collaboration.\"\n : \"No token covers the full recommended scope bundle. Issue one to unlock complete agent collaboration.\",\n action: hasFullOperatorToken\n ? null\n : {\n label: \"Set up\",\n preset: \"operator\" as const,\n onClick: () => {\n setTokenDialogPreset(\"operator\");\n setTokenDialogOpen(true);\n }\n }\n },\n {\n label: \"Reward control\",\n ok: hasRewardManager,\n badge: hasRewardManager ? \"ready\" : \"optional\",\n badgeTone: hasRewardManager ? \"emerald\" : \"neutral\",\n detail: hasRewardManager\n ? \"An agent can tune reward rules and issue bonus XP grants.\"\n : \"No token has rewards.manage — agents cannot adjust XP rules or issue bonuses.\",\n action: hasRewardManager\n ? null\n : {\n label: \"Add scope\",\n preset: \"operator\" as const,\n onClick: () => {\n setTokenDialogPreset(\"operator\");\n setTokenDialogOpen(true);\n }\n }\n },\n {\n label: \"Psyche writes\",\n ok: hasPsycheWriter,\n badge: hasPsycheWriter ? \"ready\" : \"optional\",\n badgeTone: hasPsycheWriter ? \"emerald\" : \"neutral\",\n detail: hasPsycheWriter\n ? \"Sensitive Psyche collaboration is enabled — agents can create and update therapeutic records.\"\n : \"No token has psyche.write — agent collaboration on sensitive Psyche records is disabled.\",\n action: hasPsycheWriter\n ? null\n : {\n label: \"Add scope\",\n preset: \"operator\" as const,\n onClick: () => {\n setTokenDialogPreset(\"operator\");\n setTokenDialogOpen(true);\n }\n }\n },\n {\n label: \"Scoped writes\",\n ok: hasScopedWriter,\n badge: hasScopedWriter ? \"ready\" : \"optional\",\n badgeTone: hasScopedWriter ? \"emerald\" : \"neutral\",\n detail: hasScopedWriter\n ? \"A trusted agent can write without constant approval prompts.\"\n : \"All write tokens are approval-required. Agents must queue every mutation for your review.\",\n action: hasScopedWriter\n ? null\n : {\n label: \"Configure\",\n preset: \"operator\" as const,\n onClick: () => {\n setTokenDialogPreset(\"operator\");\n setTokenDialogOpen(true);\n }\n }\n }\n ] as const;\n\n // ── Loading / error gates ─────────────────────────────────────────────────\n if (operatorSessionQuery.isLoading || settingsQuery.isLoading) {\n return (\n <SurfaceSkeleton\n eyebrow=\"Settings · Agents\"\n title=\"Loading agent console\"\n description=\"Establishing the operator session and loading agent configuration.\"\n columns={2}\n blocks={6}\n />\n );\n }\n\n if (operatorSessionQuery.isError) {\n return <ErrorState eyebrow=\"Settings · Agents\" error={operatorSessionQuery.error} onRetry={() => void operatorSessionQuery.refetch()} />;\n }\n\n if (settingsQuery.isError || !settings) {\n return <ErrorState eyebrow=\"Settings · Agents\" error={settingsQuery.error ?? new Error(\"Could not load settings.\")} onRetry={() => void settingsQuery.refetch()} />;\n }\n\n return (\n <div className=\"mx-auto grid w-full max-w-[1220px] gap-5\">\n <PageHero\n title=\"Agents\"\n description=\"Connection status, capability access, tokens, approval queue, and work logging.\"\n />\n\n <SettingsSectionNav />\n\n {/* ── Dialogs ── */}\n <AgentTokenFlowDialog\n open={tokenDialogOpen}\n onOpenChange={setTokenDialogOpen}\n pending={tokenMutation.isPending}\n initialPreset={tokenDialogPreset}\n defaultAgentLabel={onboarding?.defaultActorLabel ?? \"OpenClaw\"}\n recommendedScopes={recommendedScopes}\n onSubmit={async (input) => {\n const result = await tokenMutation.mutateAsync(input);\n // Close the wizard and open the reveal dialog\n setTokenDialogOpen(false);\n if (onboarding) {\n setRevealState({\n tokenString: result.token.token,\n agentLabel: input.agentLabel,\n onboarding\n });\n setRevealDialogOpen(true);\n }\n }}\n />\n <TokenRevealDialog\n open={revealDialogOpen}\n onOpenChange={setRevealDialogOpen}\n state={revealState}\n />\n <LogWorkFlowDialog\n open={logWorkDialogOpen}\n onOpenChange={setLogWorkDialogOpen}\n pending={logWorkMutation.isPending}\n defaultOwner={defaultOwner}\n availableTasks={operatorTasks}\n availableProjects={operatorContext?.activeProjects ?? []}\n onSubmit={async (input) => {\n await logWorkMutation.mutateAsync(input);\n }}\n />\n\n <div className=\"grid gap-5\">\n\n {/* ── Operator console overview ── */}\n {operatorContext ? (\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-4\">\n <MetricTile label=\"Active projects\" value={operatorContext.activeProjects.length} tone=\"core\" />\n <MetricTile label=\"Focus tasks\" value={operatorContext.focusTasks.length} tone=\"core\" />\n <MetricTile label=\"Pending approvals\" value={approvals.filter((a) => a.status === \"pending\").length} tone=\"core\" />\n <MetricTile\n label=\"Operator level\"\n value={operatorContext.xp.profile.level}\n tone=\"core\"\n detail={`${operatorContext.xp.profile.totalXp} total XP`}\n />\n </div>\n ) : null}\n\n {/* ── Capability status ── */}\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Capability status</div>\n <div className=\"mt-4 grid gap-3\">\n {capabilities.map((cap) => (\n <div\n key={cap.label}\n className=\"flex items-start justify-between gap-4 rounded-[18px] bg-white/[0.04] px-4 py-3\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"font-medium text-white\">{cap.label}</span>\n <Badge\n className={\n cap.badgeTone === \"emerald\"\n ? \"text-emerald-300\"\n : cap.badgeTone === \"amber\"\n ? \"text-amber-300\"\n : \"text-white/45\"\n }\n >\n {cap.badge}\n </Badge>\n </div>\n <div className=\"mt-1 text-sm leading-6 text-white/55\">{cap.detail}</div>\n </div>\n {cap.action ? (\n <button\n type=\"button\"\n onClick={cap.action.onClick}\n className=\"mt-0.5 flex shrink-0 items-center gap-1.5 rounded-full bg-white/[0.07] px-3 py-1.5 text-xs font-medium text-white/72 transition hover:bg-white/[0.12] hover:text-white\"\n >\n {cap.action.label}\n <ArrowRight className=\"size-3\" />\n </button>\n ) : null}\n </div>\n ))}\n </div>\n </Card>\n\n {/* ── Token management ── */}\n <Card>\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Agent tokens</div>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => {\n setTokenDialogPreset(\"operator\");\n setTokenDialogOpen(true);\n }}\n >\n <Plus className=\"size-3.5\" />\n Issue token\n </Button>\n </div>\n\n <div className=\"mt-4 grid gap-3\">\n {settings.agentTokens.length === 0 ? (\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-4 text-sm text-white/55\">\n No tokens yet. Issue one to let external agents or scripts authenticate with Forge.\n </div>\n ) : (\n settings.agentTokens.map((token) => (\n <div key={token.id} className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"font-medium text-white\">{token.label}</div>\n <div className=\"mt-0.5 text-sm text-white/50\">\n {token.agentLabel ?? \"Unassigned agent\"} · <span className=\"font-mono text-xs\">{token.tokenPrefix}</span>\n </div>\n </div>\n <Badge className={token.status === \"active\" ? \"text-emerald-300\" : \"text-white/45\"}>{token.status}</Badge>\n </div>\n <div className=\"mt-3 flex flex-wrap gap-2 text-xs text-white/55\">\n <span>{token.trustLevel}</span>\n <span>·</span>\n <span>{token.autonomyMode.replaceAll(\"_\", \" \")}</span>\n <span>·</span>\n <span>{token.approvalMode.replaceAll(\"_\", \" \")}</span>\n </div>\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {[\"write\", \"rewards.manage\", \"psyche.write\"].map((scope) => (\n <Badge\n key={scope}\n className={token.scopes.includes(scope) ? \"text-emerald-300\" : \"text-white/30\"}\n >\n {scope}\n </Badge>\n ))}\n </div>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n pending={rotateMutation.isPending}\n pendingLabel=\"Rotating\"\n onClick={() => void rotateMutation.mutateAsync(token.id)}\n >\n Rotate &amp; reveal new token\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n pending={revokeMutation.isPending}\n pendingLabel=\"Revoking\"\n onClick={() => void revokeMutation.mutateAsync(token.id)}\n >\n Revoke\n </Button>\n </div>\n </div>\n ))\n )}\n </div>\n <div className=\"mt-3 px-1 text-xs text-white/35\">\n Raw token values are shown once and are never recoverable. If a token is lost, rotate or issue a new one.\n </div>\n </Card>\n\n {/* ── Agent roster ── */}\n {settings.agents.length > 0 ? (\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Connected agents</div>\n <div className=\"mt-4 grid gap-3\">\n {settings.agents.map((agent) => (\n <div key={agent.id} className=\"flex items-start justify-between gap-3 rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"min-w-0\">\n <div className=\"font-medium text-white\">{agent.label}</div>\n {agent.description ? <div className=\"mt-1 text-sm text-white/52\">{agent.description}</div> : null}\n <div className=\"mt-2 flex flex-wrap gap-x-4 gap-y-1 text-sm text-white/55\">\n <span>{agent.agentType}</span>\n <span>{agent.autonomyMode.replaceAll(\"_\", \" \")}</span>\n <span>{agent.activeTokenCount} active token{agent.activeTokenCount !== 1 ? \"s\" : \"\"}</span>\n </div>\n </div>\n <Badge className=\"text-white/60\">{agent.trustLevel}</Badge>\n </div>\n ))}\n </div>\n </Card>\n ) : null}\n\n {/* ── Board overview ── */}\n {operatorContext ? (\n <div className=\"grid gap-3 lg:grid-cols-[minmax(0,1.05fr)_minmax(0,0.95fr)]\">\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Recommended next move</div>\n {operatorContext.recommendedNextTask ? (\n <div className=\"mt-4 grid gap-2\">\n <EntityName kind=\"task\" label={operatorContext.recommendedNextTask.title} variant=\"heading\" size=\"lg\" />\n <div className=\"text-sm leading-6 text-white/58\">\n {operatorContext.recommendedNextTask.description || \"No extra notes yet.\"}\n </div>\n <div className=\"mt-1 flex flex-wrap gap-2\">\n <Badge>{operatorContext.recommendedNextTask.status.replaceAll(\"_\", \" \")}</Badge>\n <Badge>{operatorContext.recommendedNextTask.points} xp</Badge>\n <Badge>{operatorContext.recommendedNextTask.owner}</Badge>\n </div>\n </div>\n ) : (\n <div className=\"mt-4 text-sm text-white/55\">Board is clear. No recommended task right now.</div>\n )}\n </Card>\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Board pulse</div>\n <div className=\"mt-4 grid grid-cols-2 gap-3\">\n {[\n { label: \"Backlog\", value: operatorContext.currentBoard.backlog.length },\n { label: \"Focus\", value: operatorContext.currentBoard.focus.length },\n { label: \"In progress\", value: operatorContext.currentBoard.inProgress.length },\n { label: \"Blocked\", value: operatorContext.currentBoard.blocked.length }\n ].map((col) => (\n <div key={col.label} className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"text-xs uppercase tracking-[0.14em] text-white/38\">{col.label}</div>\n <div className=\"mt-2 font-display text-3xl text-white\">{col.value}</div>\n </div>\n ))}\n </div>\n </Card>\n </div>\n ) : null}\n\n {/* ── Active projects ── */}\n {operatorContext && operatorContext.activeProjects.length > 0 ? (\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Active projects</div>\n <div className=\"mt-4 grid gap-3 sm:grid-cols-2\">\n {operatorContext.activeProjects.slice(0, 6).map((project) => (\n <div key={project.id} className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <EntityName kind=\"project\" label={project.title} />\n <Badge>{project.progress}%</Badge>\n </div>\n <div className=\"mt-2\">\n <EntityBadge kind=\"goal\" label={project.goalTitle} compact gradient={false} />\n </div>\n <div className=\"mt-2 text-xs text-white/38\">\n {project.activeTaskCount} active · {project.completedTaskCount} done\n </div>\n </div>\n ))}\n </div>\n </Card>\n ) : null}\n\n {/* ── Approval queue ── */}\n <Card>\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Approval queue</div>\n {approvals.filter((a) => a.status === \"pending\").length > 0 ? (\n <Badge className=\"text-amber-300\">{approvals.filter((a) => a.status === \"pending\").length} pending</Badge>\n ) : null}\n </div>\n <div className=\"mt-4 grid gap-3\">\n {approvals.length === 0 ? (\n <div className=\"rounded-[18px] bg-white/[0.04] px-4 py-4 text-sm text-white/55\">\n No pending approvals. Agent actions are flowing through.\n </div>\n ) : (\n approvals.map((approval) => (\n <div key={approval.id} className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"font-medium text-white\">{approval.title}</div>\n <div className=\"mt-0.5 text-sm text-white/55\">{approval.summary || approval.actionType}</div>\n </div>\n <Badge className={approval.status === \"pending\" ? \"text-amber-300\" : \"text-white/45\"}>\n {approval.status}\n </Badge>\n </div>\n {approval.status === \"pending\" ? (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n pending={approveMutation.isPending}\n pendingLabel=\"Approving\"\n onClick={() => void approveMutation.mutateAsync(approval.id)}\n >\n Approve\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n pending={rejectMutation.isPending}\n pendingLabel=\"Rejecting\"\n onClick={() => void rejectMutation.mutateAsync(approval.id)}\n >\n Reject\n </Button>\n </div>\n ) : null}\n </div>\n ))\n )}\n </div>\n </Card>\n\n {/* ── Log work ── */}\n <Card>\n <div className=\"flex items-center justify-between gap-4\">\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Retroactive work log</div>\n <div className=\"mt-1 text-sm text-white/55\">\n Capture work done outside the timer so it counts toward progress and XP.\n </div>\n </div>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => setLogWorkDialogOpen(true)}\n >\n <ClipboardList className=\"size-3.5\" />\n Log work\n </Button>\n </div>\n {logWorkMutation.data ? (\n <div className=\"mt-4 rounded-[18px] bg-[rgba(192,193,255,0.10)] px-4 py-3 text-sm text-white\">\n Logged{\" \"}\n <span className=\"inline-block align-middle\">\n <EntityName kind=\"task\" label={logWorkMutation.data.task.title} showKind={false} />\n </span>\n . Operator XP updated to {logWorkMutation.data.xp.profile.totalXp}.\n </div>\n ) : null}\n </Card>\n\n {/* ── Connection & onboarding info ── */}\n <Card>\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between gap-4 text-left\"\n onClick={() => setOnboardingExpanded((v) => !v)}\n >\n <div>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Connection &amp; onboarding</div>\n {onboarding ? (\n <div className=\"mt-1 text-sm text-white/55\">\n {onboarding.forgeBaseUrl}\n </div>\n ) : null}\n </div>\n {onboardingExpanded ? (\n <ChevronUp className=\"size-4 shrink-0 text-white/38\" />\n ) : (\n <ChevronDown className=\"size-4 shrink-0 text-white/38\" />\n )}\n </button>\n\n {onboardingExpanded && onboarding ? (\n <div className=\"mt-5 grid gap-4\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"text-xs uppercase tracking-[0.14em] text-white/40\">Forge API</div>\n <div className=\"mt-2 break-all text-sm text-white\">{onboarding.forgeBaseUrl}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"text-xs uppercase tracking-[0.14em] text-white/40\">Web app</div>\n <div className=\"mt-2 break-all text-sm text-white\">{onboarding.webAppUrl}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"text-xs uppercase tracking-[0.14em] text-white/40\">OpenAPI spec</div>\n <div className=\"mt-2 break-all text-sm text-white\">{onboarding.openApiUrl}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"text-xs uppercase tracking-[0.14em] text-white/40\">Default policy</div>\n <div className=\"mt-2 text-sm text-white\">\n {onboarding.recommendedTrustLevel} · {onboarding.recommendedAutonomyMode.replaceAll(\"_\", \" \")} · {onboarding.recommendedApprovalMode.replaceAll(\"_\", \" \")}\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"font-medium text-white\">{onboarding.authModes.operatorSession.label}</div>\n <Badge className=\"mt-1 text-emerald-300\">{onboarding.defaultConnectionMode === \"operator_session\" ? \"default\" : \"available\"}</Badge>\n <div className=\"mt-3 text-sm leading-6 text-white/60\">{onboarding.authModes.operatorSession.summary}</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {onboarding.authModes.operatorSession.trustedTargets.map((t) => (\n <Badge key={t} className=\"text-white/65\">{t}</Badge>\n ))}\n </div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"font-medium text-white\">{onboarding.authModes.managedToken.label}</div>\n <Badge className=\"mt-1 text-white/55\">optional</Badge>\n <div className=\"mt-3 text-sm leading-6 text-white/60\">{onboarding.authModes.managedToken.summary}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/48\">{onboarding.tokenRecovery.rotationSummary}</div>\n </div>\n </div>\n\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"text-xs uppercase tracking-[0.14em] text-white/40\">Quick-connect verification</div>\n <pre className=\"mt-3 overflow-x-auto rounded-[16px] bg-[rgba(8,13,28,0.78)] p-4 text-xs leading-6 text-white/72\">\n <code>{[`curl -s ${onboarding.healthUrl}`, `openclaw plugins install ./projects/forge`, \"openclaw gateway restart\"].join(\"\\n\")}</code>\n </pre>\n </div>\n\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"text-xs uppercase tracking-[0.14em] text-white/40\">Required API headers</div>\n <div className=\"mt-3 grid gap-1 text-sm text-white/60\">\n <div>{onboarding.requiredHeaders.authorization}</div>\n <div>{onboarding.requiredHeaders.source}</div>\n <div>{onboarding.requiredHeaders.actor}</div>\n </div>\n </div>\n </div>\n ) : onboardingExpanded && onboardingQuery.isError ? (\n <div className=\"mt-4 rounded-[18px] bg-[rgba(120,33,33,0.22)] px-4 py-3 text-sm text-rose-100/80\">\n Could not load the onboarding contract. Check the API bridge.\n </div>\n ) : onboardingExpanded ? (\n <div className=\"mt-4 text-sm text-white/50\">Loading…</div>\n ) : null}\n </Card>\n </div>\n </div>\n );\n}\n","import { useMemo, type ComponentProps } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { ArchiveRestore, Trash2 } from \"lucide-react\";\nimport { SettingsSectionNav } from \"@/components/settings/settings-section-nav\";\nimport { SurfaceSkeleton } from \"@/components/experience/surface-skeleton\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { ErrorState } from \"@/components/ui/page-state\";\nimport { deleteEntities, ensureOperatorSession, getSettingsBin, restoreEntities } from \"@/lib/api\";\nimport type { CrudEntityType, DeletedEntityRecord } from \"@/lib/types\";\n\nconst ENTITY_LABELS: Record<CrudEntityType, string> = {\n goal: \"Goals\",\n project: \"Projects\",\n task: \"Tasks\",\n tag: \"Tags\",\n comment: \"Comments\",\n insight: \"Insights\",\n psyche_value: \"Values\",\n behavior_pattern: \"Patterns\",\n behavior: \"Behaviors\",\n belief_entry: \"Beliefs\",\n mode_profile: \"Modes\",\n mode_guide_session: \"Mode guides\",\n event_type: \"Event types\",\n emotion_definition: \"Emotions\",\n trigger_report: \"Reports\"\n};\n\nconst ENTITY_BADGE_KIND: Record<CrudEntityType, ComponentProps<typeof EntityBadge>[\"kind\"] | null> = {\n goal: \"goal\",\n project: \"project\",\n task: \"task\",\n tag: null,\n comment: null,\n insight: \"report\",\n psyche_value: \"value\",\n behavior_pattern: \"pattern\",\n behavior: \"behavior\",\n belief_entry: \"belief\",\n mode_profile: \"mode\",\n mode_guide_session: \"mode\",\n event_type: null,\n emotion_definition: null,\n trigger_report: \"report\"\n};\n\nfunction formatDeletedAt(value: string) {\n return new Date(value).toLocaleString();\n}\n\nexport function SettingsBinPage() {\n const queryClient = useQueryClient();\n\n const operatorSessionQuery = useQuery({\n queryKey: [\"forge-operator-session\"],\n queryFn: ensureOperatorSession\n });\n const operatorReady = operatorSessionQuery.isSuccess;\n\n const binQuery = useQuery({\n queryKey: [\"forge-settings-bin\"],\n queryFn: getSettingsBin,\n enabled: operatorReady\n });\n\n const invalidateBin = async () => {\n await queryClient.invalidateQueries({\n predicate: (query) => Array.isArray(query.queryKey) && typeof query.queryKey[0] === \"string\" && query.queryKey[0].startsWith(\"forge-\")\n });\n };\n\n const restoreMutation = useMutation({\n mutationFn: (record: DeletedEntityRecord) =>\n restoreEntities({\n operations: [{ entityType: record.entityType, id: record.entityId }]\n }),\n onSuccess: invalidateBin\n });\n\n const hardDeleteMutation = useMutation({\n mutationFn: (record: DeletedEntityRecord) =>\n deleteEntities({\n operations: [{ entityType: record.entityType, id: record.entityId, mode: \"hard\" }]\n }),\n onSuccess: invalidateBin\n });\n\n const records = binQuery.data?.bin.records ?? [];\n const groupedRecords = useMemo(() => {\n const grouped = new Map<CrudEntityType, DeletedEntityRecord[]>();\n for (const record of records) {\n const list = grouped.get(record.entityType) ?? [];\n list.push(record);\n grouped.set(record.entityType, list);\n }\n return [...grouped.entries()].sort((a, b) => ENTITY_LABELS[a[0]].localeCompare(ENTITY_LABELS[b[0]]));\n }, [records]);\n\n if (operatorSessionQuery.isLoading || binQuery.isLoading) {\n return (\n <SurfaceSkeleton\n eyebrow=\"Settings\"\n title=\"Loading bin\"\n description=\"Loading deleted items and restore controls.\"\n columns={2}\n blocks={6}\n />\n );\n }\n\n if (operatorSessionQuery.isError) {\n return <ErrorState eyebrow=\"Settings\" error={operatorSessionQuery.error} onRetry={() => void operatorSessionQuery.refetch()} />;\n }\n\n if (binQuery.isError) {\n return <ErrorState eyebrow=\"Settings\" error={binQuery.error} onRetry={() => void binQuery.refetch()} />;\n }\n\n return (\n <div className=\"mx-auto grid w-full max-w-[1220px] gap-5\">\n <PageHero\n title=\"Bin\"\n description=\"Restore soft-deleted items or permanently remove them when you really mean it.\"\n badge={`${binQuery.data?.bin.totalCount ?? 0} deleted items`}\n />\n\n <SettingsSectionNav />\n\n {groupedRecords.length === 0 ? (\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Deleted items</div>\n <div className=\"mt-4 text-white/72\">Nothing is in the bin right now.</div>\n </Card>\n ) : (\n <div className=\"grid gap-5\">\n {groupedRecords.map(([entityType, items]) => {\n const badgeKind = ENTITY_BADGE_KIND[entityType];\n return (\n <Card key={entityType}>\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n {badgeKind ? <EntityBadge kind={badgeKind} label={ENTITY_LABELS[entityType]} compact /> : null}\n {!badgeKind ? (\n <div className=\"rounded-full border border-white/10 bg-white/[0.05] px-3 py-1 text-[11px] uppercase tracking-[0.16em] text-white/55\">\n {ENTITY_LABELS[entityType]}\n </div>\n ) : null}\n <div className=\"text-sm text-white/55\">{items.length} deleted</div>\n </div>\n </div>\n\n <div className=\"mt-4 grid gap-3\">\n {items.map((record) => (\n <div\n key={`${record.entityType}:${record.entityId}`}\n className=\"grid gap-3 rounded-[22px] border border-white/8 bg-white/[0.04] p-4 lg:grid-cols-[minmax(0,1fr)_auto]\"\n >\n <div className=\"min-w-0\">\n <div className=\"text-lg font-medium text-white\">{record.title}</div>\n {record.subtitle ? <div className=\"mt-1 text-sm text-white/62\">{record.subtitle}</div> : null}\n <div className=\"mt-3 flex flex-wrap gap-3 text-xs text-white/45\">\n <span>Deleted {formatDeletedAt(record.deletedAt)}</span>\n {record.deletedByActor ? <span>By {record.deletedByActor}</span> : null}\n {record.deletedSource ? <span>Source {record.deletedSource}</span> : null}\n {record.deleteReason ? <span>Reason: {record.deleteReason}</span> : null}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-start justify-end gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n pending={restoreMutation.isPending}\n pendingLabel=\"Restoring\"\n onClick={() => void restoreMutation.mutateAsync(record)}\n >\n <ArchiveRestore className=\"size-4\" />\n <span>Restore</span>\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n pending={hardDeleteMutation.isPending}\n pendingLabel=\"Deleting\"\n onClick={() => void hardDeleteMutation.mutateAsync(record)}\n >\n <Trash2 className=\"size-4\" />\n <span>Delete forever</span>\n </Button>\n </div>\n </div>\n ))}\n </div>\n </Card>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useForm } from \"react-hook-form\";\nimport { SettingsSectionNav } from \"@/components/settings/settings-section-nav\";\nimport { XpCommandDeck } from \"@/components/xp/xp-command-deck\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { SurfaceSkeleton } from \"@/components/experience/surface-skeleton\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { MetricTile } from \"@/components/ui/metric-tile\";\nimport { ErrorState } from \"@/components/ui/page-state\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport {\n createManualRewardGrant,\n ensureOperatorSession,\n getXpMetrics,\n listRewardLedger,\n listRewardRules,\n patchRewardRule\n} from \"@/lib/api\";\nimport type { RewardRule } from \"@/lib/types\";\n\ntype RewardRuleFormValues = {\n title: string;\n description: string;\n active: boolean;\n configJson: string;\n};\n\ntype BonusGrantFormValues = {\n entityType: string;\n entityId: string;\n deltaXp: number;\n reasonTitle: string;\n reasonSummary: string;\n metadataJson: string;\n};\n\nfunction prettyRecord(value: Record<string, string | number | boolean | null>) {\n return JSON.stringify(value, null, 2);\n}\n\nfunction parseRecordJson(raw: string) {\n const trimmed = raw.trim();\n if (!trimmed) return {};\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Expected a JSON object.\");\n }\n return parsed as Record<string, string | number | boolean | null>;\n}\n\nexport function SettingsRewardsPage() {\n const queryClient = useQueryClient();\n const [selectedRuleId, setSelectedRuleId] = useState(\"\");\n const [ruleConfigError, setRuleConfigError] = useState<string | null>(null);\n const [bonusMetadataError, setBonusMetadataError] = useState<string | null>(null);\n\n const operatorSessionQuery = useQuery({\n queryKey: [\"forge-operator-session\"],\n queryFn: ensureOperatorSession\n });\n const operatorReady = operatorSessionQuery.isSuccess;\n\n const xpQuery = useQuery({\n queryKey: [\"forge-xp-metrics\"],\n queryFn: getXpMetrics\n });\n const rewardRulesQuery = useQuery({\n queryKey: [\"forge-reward-rules\"],\n queryFn: listRewardRules,\n enabled: operatorReady\n });\n const rewardLedgerQuery = useQuery({\n queryKey: [\"forge-reward-ledger\"],\n queryFn: () => listRewardLedger(30),\n enabled: operatorReady\n });\n\n const rewardRuleForm = useForm<RewardRuleFormValues>({\n defaultValues: {\n title: \"\",\n description: \"\",\n active: true,\n configJson: \"{}\"\n }\n });\n\n const bonusForm = useForm<BonusGrantFormValues>({\n defaultValues: {\n entityType: \"task\",\n entityId: \"\",\n deltaXp: 15,\n reasonTitle: \"Operator bonus\",\n reasonSummary: \"Manual boost for a meaningful action captured with good provenance.\",\n metadataJson: \"{}\"\n }\n });\n\n const invalidateRewards = async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-xp-metrics\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-reward-rules\"] }),\n queryClient.invalidateQueries({ queryKey: [\"forge-reward-ledger\"] })\n ]);\n };\n\n const rewardRuleMutation = useMutation({\n mutationFn: (input: { ruleId: string; title: string; description: string; active: boolean; config: RewardRule[\"config\"] }) =>\n patchRewardRule(input.ruleId, {\n title: input.title,\n description: input.description,\n active: input.active,\n config: input.config\n }),\n onSuccess: invalidateRewards\n });\n\n const bonusMutation = useMutation({\n mutationFn: createManualRewardGrant,\n onSuccess: invalidateRewards\n });\n\n const rewardRules = rewardRulesQuery.data?.rules ?? [];\n\n useEffect(() => {\n if (!rewardRules.length) return;\n if (!selectedRuleId || !rewardRules.some((rule) => rule.id === selectedRuleId)) {\n setSelectedRuleId(rewardRules[0].id);\n }\n }, [rewardRules, selectedRuleId]);\n\n const selectedRule = rewardRules.find((rule) => rule.id === selectedRuleId) ?? rewardRules[0] ?? null;\n\n useEffect(() => {\n if (!selectedRule) return;\n rewardRuleForm.reset({\n title: selectedRule.title,\n description: selectedRule.description,\n active: selectedRule.active,\n configJson: prettyRecord(selectedRule.config)\n });\n setRuleConfigError(null);\n }, [selectedRule, rewardRuleForm]);\n\n const xpMetrics = xpQuery.data?.metrics;\n const rewardLedger = rewardLedgerQuery.data?.ledger ?? [];\n const manualBonusEvents = rewardLedger.filter((event) => event.metadata.manual === true).slice(0, 8);\n\n if (operatorSessionQuery.isLoading) {\n return (\n <SurfaceSkeleton\n eyebrow=\"Settings · Rewards\"\n title=\"Loading reward controls\"\n description=\"Establishing the operator session and fetching reward configuration.\"\n columns={2}\n blocks={6}\n />\n );\n }\n\n if (operatorSessionQuery.isError) {\n return <ErrorState eyebrow=\"Settings · Rewards\" error={operatorSessionQuery.error} onRetry={() => void operatorSessionQuery.refetch()} />;\n }\n\n return (\n <div className=\"mx-auto grid w-full max-w-[1220px] gap-5\">\n <PageHero\n title=\"Rewards\"\n description=\"XP command deck, reward rule editor, manual bonus grants, and ledger history.\"\n />\n\n <SettingsSectionNav />\n\n <div className=\"grid gap-5\">\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Reward operations</div>\n <div className=\"mt-4 grid gap-4\">\n {xpMetrics ? (\n <XpCommandDeck\n profile={xpMetrics.profile}\n achievements={xpMetrics.achievements}\n milestoneRewards={xpMetrics.milestoneRewards}\n momentumPulse={xpMetrics.momentumPulse}\n recentLedger={xpMetrics.recentLedger}\n />\n ) : null}\n\n {xpMetrics ? (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <MetricTile label=\"Total XP\" value={xpMetrics.profile.totalXp} tone=\"core\" />\n <MetricTile label=\"Daily ambient\" value={`${xpMetrics.dailyAmbientXp} / ${xpMetrics.dailyAmbientCap}`} tone=\"core\" />\n </div>\n ) : null}\n\n <div className=\"grid gap-4 xl:grid-cols-2\">\n {/* Reward rule editor */}\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"font-medium text-white\">Reward rule editor</div>\n {rewardRules.length > 0 ? (\n <form\n className=\"mt-4 grid gap-4\"\n onSubmit={rewardRuleForm.handleSubmit(async (values) => {\n try {\n setRuleConfigError(null);\n const config = parseRecordJson(values.configJson);\n if (!selectedRule) return;\n await rewardRuleMutation.mutateAsync({\n ruleId: selectedRule.id,\n title: values.title,\n description: values.description,\n active: values.active,\n config\n });\n } catch (error) {\n setRuleConfigError(error instanceof Error ? error.message : \"Invalid reward rule config.\");\n }\n })}\n >\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Rule</span>\n <select\n className=\"rounded-[14px] bg-white/[0.06] px-3 py-3 text-white\"\n value={selectedRuleId}\n onChange={(event) => setSelectedRuleId(event.target.value)}\n >\n {rewardRules.map((rule) => (\n <option key={rule.id} value={rule.id}>{rule.title}</option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Title</span>\n <Input {...rewardRuleForm.register(\"title\")} />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Description</span>\n <Textarea className=\"min-h-24\" {...rewardRuleForm.register(\"description\")} />\n </label>\n <label className=\"flex items-center justify-between rounded-[18px] bg-[rgba(8,13,28,0.68)] px-4 py-3\">\n <span className=\"text-white/72\">Rule is active</span>\n <input type=\"checkbox\" {...rewardRuleForm.register(\"active\")} />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Config JSON</span>\n <Textarea className=\"min-h-28 font-mono text-xs\" {...rewardRuleForm.register(\"configJson\")} />\n </label>\n {ruleConfigError ? <div className=\"text-sm text-amber-300\">{ruleConfigError}</div> : null}\n <Button type=\"submit\" pending={rewardRuleMutation.isPending} pendingLabel=\"Saving rule\">\n Save reward rule\n </Button>\n </form>\n ) : (\n <div className=\"mt-4 text-sm text-white/58\">Loading reward rules…</div>\n )}\n </div>\n\n {/* Manual bonus XP */}\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"font-medium text-white\">Manual bonus XP</div>\n <form\n className=\"mt-4 grid gap-4\"\n onSubmit={bonusForm.handleSubmit(async (values) => {\n try {\n setBonusMetadataError(null);\n const metadata = parseRecordJson(values.metadataJson);\n await bonusMutation.mutateAsync({\n entityType: values.entityType,\n entityId: values.entityId,\n deltaXp: values.deltaXp,\n reasonTitle: values.reasonTitle,\n reasonSummary: values.reasonSummary,\n metadata\n });\n bonusForm.reset({\n ...values,\n entityId: \"\",\n reasonTitle: \"Operator bonus\",\n reasonSummary: \"Manual boost for a meaningful action captured with good provenance.\",\n metadataJson: \"{}\"\n });\n } catch (error) {\n setBonusMetadataError(error instanceof Error ? error.message : \"Invalid metadata payload.\");\n }\n })}\n >\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Entity type</span>\n <Input {...bonusForm.register(\"entityType\")} />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Entity id</span>\n <Input placeholder=\"task_123\" {...bonusForm.register(\"entityId\")} />\n </label>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Delta XP</span>\n <Input type=\"number\" {...bonusForm.register(\"deltaXp\", { valueAsNumber: true })} />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Reason title</span>\n <Input {...bonusForm.register(\"reasonTitle\")} />\n </label>\n </div>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Reason summary</span>\n <Textarea className=\"min-h-24\" {...bonusForm.register(\"reasonSummary\")} />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-sm text-white/58\">Metadata JSON</span>\n <Textarea className=\"min-h-24 font-mono text-xs\" {...bonusForm.register(\"metadataJson\")} />\n </label>\n {bonusMetadataError ? <div className=\"text-sm text-amber-300\">{bonusMetadataError}</div> : null}\n <Button type=\"submit\" pending={bonusMutation.isPending} pendingLabel=\"Issuing bonus\">\n Issue bonus XP\n </Button>\n </form>\n {bonusMutation.data ? (\n <div className=\"mt-4 rounded-[18px] bg-[rgba(192,193,255,0.12)] p-4 text-sm text-white\">\n Granted {bonusMutation.data.reward.deltaXp > 0 ? \"+\" : \"\"}\n {bonusMutation.data.reward.deltaXp} XP for <strong>{bonusMutation.data.reward.reasonTitle}</strong>.\n </div>\n ) : null}\n </div>\n </div>\n\n {/* Manual bonus history */}\n <div className=\"rounded-[22px] bg-white/[0.04] p-4\">\n <div className=\"font-medium text-white\">Manual bonus history</div>\n <div className=\"mt-4 grid gap-3\">\n {manualBonusEvents.length === 0 ? (\n <div className=\"rounded-[18px] bg-[rgba(8,13,28,0.68)] p-4 text-sm text-white/58\">No manual bonus grants yet.</div>\n ) : (\n manualBonusEvents.map((event) => (\n <div key={event.id} className=\"rounded-[18px] bg-[rgba(8,13,28,0.68)] p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-medium text-white\">{event.reasonTitle}</div>\n <Badge className={event.deltaXp >= 0 ? \"text-emerald-300\" : \"text-amber-300\"}>\n {event.deltaXp > 0 ? \"+\" : \"\"}{event.deltaXp} XP\n </Badge>\n </div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{event.reasonSummary || \"No summary supplied.\"}</div>\n <div className=\"mt-2 text-xs uppercase tracking-[0.16em] text-white/38\">\n {event.entityType} · {event.entityId} · {new Date(event.createdAt).toLocaleString()}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n </Card>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link, useParams } from \"react-router-dom\";\nimport {\n BriefcaseBusiness,\n CheckCheck,\n CircleAlert,\n Clock3,\n Pencil,\n Play,\n Target\n} from \"lucide-react\";\nimport { SurfaceSkeleton } from \"@/components/experience/surface-skeleton\";\nimport { SheetScaffold } from \"@/components/experience/sheet-scaffold\";\nimport { TaskDialog } from \"@/components/task-dialog\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Card } from \"@/components/ui/card\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { InfoTooltip } from \"@/components/ui/info-tooltip\";\nimport { ErrorState } from \"@/components/ui/page-state\";\nimport { completeTaskRun, getTaskContext, patchTask, releaseTaskRun, removeActivityLog, uncompleteTask } from \"@/lib/api\";\nimport { getReadableActivityDescription, getReadableActivityTitle } from \"@/lib/activity-copy\";\nimport { getActivityEventHref } from \"@/lib/entity-links\";\nimport { useI18n } from \"@/lib/i18n\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\nimport type { TaskStatus } from \"@/lib/types\";\n\nfunction DetailLabel({ label, help }: { label: string; help?: string }) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-white/58\">\n <span>{label}</span>\n {help ? <InfoTooltip content={help} label={`Explain ${label}`} /> : null}\n </div>\n );\n}\n\nconst STATUS_META: Array<{\n status: TaskStatus;\n label: string;\n description: string;\n icon: typeof Clock3;\n}> = [\n { status: \"backlog\", label: \"Backlog\", description: \"Not started yet.\", icon: Clock3 },\n { status: \"focus\", label: \"Focus\", description: \"Ready to start soon.\", icon: Target },\n { status: \"in_progress\", label: \"In progress\", description: \"Work is active now.\", icon: Play },\n { status: \"blocked\", label: \"Blocked\", description: \"Something is stopping progress.\", icon: CircleAlert },\n { status: \"done\", label: \"Done\", description: \"The task is completed.\", icon: CheckCheck }\n];\n\nexport function TaskDetailPage() {\n const { t, formatDate, formatDateTime } = useI18n();\n const shell = useForgeShell();\n const params = useParams();\n const queryClient = useQueryClient();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [statusSheetOpen, setStatusSheetOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(() => (typeof window !== \"undefined\" ? window.matchMedia(\"(max-width: 1023px)\").matches : false));\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return;\n }\n const mediaQuery = window.matchMedia(\"(max-width: 1023px)\");\n const sync = (event?: MediaQueryListEvent) => setIsMobile(event ? event.matches : mediaQuery.matches);\n sync();\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", sync);\n return () => mediaQuery.removeEventListener(\"change\", sync);\n }\n mediaQuery.addListener(sync);\n return () => mediaQuery.removeListener(sync);\n }, []);\n\n const taskContextQuery = useQuery({\n queryKey: [\"task-context\", params.taskId],\n queryFn: () => getTaskContext(params.taskId!),\n enabled: Boolean(params.taskId)\n });\n\n const invalidateAll = async () => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"forge-snapshot\"] }),\n queryClient.invalidateQueries({ queryKey: [\"task-context\", params.taskId] }),\n queryClient.invalidateQueries({ queryKey: [\"activity-archive\"] }),\n queryClient.invalidateQueries({ queryKey: [\"project-board\"] })\n ]);\n };\n\n const updateTaskMutation = useMutation({\n mutationFn: ({ taskId, patch }: { taskId: string; patch: Parameters<typeof patchTask>[1] }) => patchTask(taskId, patch),\n onSuccess: invalidateAll\n });\n const uncompleteMutation = useMutation({\n mutationFn: (taskId: string) => uncompleteTask(taskId),\n onSuccess: invalidateAll\n });\n const removeEventMutation = useMutation({\n mutationFn: (eventId: string) => removeActivityLog(eventId),\n onSuccess: invalidateAll\n });\n const releaseRunMutation = useMutation({\n mutationFn: ({ runId, actor, note }: { runId: string; actor?: string; note?: string }) => releaseTaskRun(runId, { actor, note: note ?? \"\" }),\n onSuccess: invalidateAll\n });\n const completeRunMutation = useMutation({\n mutationFn: ({ runId, actor, note }: { runId: string; actor?: string; note?: string }) => completeTaskRun(runId, { actor, note: note ?? \"\" }),\n onSuccess: invalidateAll\n });\n\n const payload = taskContextQuery.data;\n\n if (taskContextQuery.isLoading) {\n return <SurfaceSkeleton />;\n }\n\n if (taskContextQuery.isError) {\n return <ErrorState eyebrow={t(\"common.taskDetail.errorEyebrow\")} error={taskContextQuery.error} onRetry={() => void taskContextQuery.refetch()} />;\n }\n\n if (!payload) {\n return <ErrorState eyebrow={t(\"common.taskDetail.errorEyebrow\")} error={new Error(t(\"common.taskDetail.emptyPayload\"))} onRetry={() => void taskContextQuery.refetch()} />;\n }\n\n const currentRun = payload.activeTaskRun ?? null;\n const currentStatus = STATUS_META.find((entry) => entry.status === payload.task.status) ?? STATUS_META[0];\n const availableStatuses = STATUS_META.filter((entry) => entry.status !== payload.task.status);\n\n const describeRunStatus = (status: (typeof payload.taskRuns)[number][\"status\"]) => {\n switch (status) {\n case \"active\":\n return \"Active\";\n case \"completed\":\n return \"Completed\";\n case \"released\":\n return \"Paused\";\n case \"timed_out\":\n return \"Timed out\";\n default:\n return status;\n }\n };\n\n const handleStatusChange = async (status: TaskStatus) => {\n await updateTaskMutation.mutateAsync({ taskId: payload.task.id, patch: { status } });\n setStatusSheetOpen(false);\n };\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n entityKind=\"task\"\n title={<EntityName kind=\"task\" label={payload.task.title} variant=\"heading\" size=\"lg\" lines={3} className=\"max-w-full\" labelClassName=\"[overflow-wrap:anywhere]\" />}\n titleText={payload.task.title}\n description={payload.task.description || \"Edit the task, change its status, start work, and review its history from one page.\"}\n badge={`${payload.task.points} xp`}\n />\n\n <Card className=\"min-w-0 overflow-hidden\">\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Task</div>\n <div className=\"mt-2\">\n <EntityName kind=\"task\" label={payload.task.title} variant=\"heading\" size=\"xl\" lines={3} className=\"max-w-full\" labelClassName=\"[overflow-wrap:anywhere]\" />\n </div>\n <p className=\"mt-3 text-sm leading-6 text-white/60\">\n {payload.task.description || \"This page shows the task itself, where it belongs, what state it is in, and what has happened on it so far.\"}\n </p>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n <Button\n pending={taskContextQuery.isFetching}\n pendingLabel={currentRun ? \"Opening\" : \"Starting\"}\n onClick={async () => {\n await shell.startTaskNow(payload.task.id);\n await invalidateAll();\n }}\n >\n <Play className=\"size-4 fill-current\" />\n {currentRun ? \"Focus work\" : \"Start work\"}\n </Button>\n {currentRun ? (\n <>\n <Button\n variant=\"secondary\"\n pending={releaseRunMutation.isPending}\n pendingLabel=\"Pausing\"\n onClick={async () => {\n await releaseRunMutation.mutateAsync({ runId: currentRun.id, actor: currentRun.actor, note: currentRun.note });\n }}\n >\n Pause\n </Button>\n <Button\n variant=\"secondary\"\n pending={completeRunMutation.isPending}\n pendingLabel=\"Completing\"\n onClick={async () => {\n await completeRunMutation.mutateAsync({ runId: currentRun.id, actor: currentRun.actor, note: currentRun.note });\n }}\n >\n Complete\n </Button>\n </>\n ) : null}\n {isMobile ? (\n <>\n <Button variant=\"secondary\" size=\"sm\" aria-label=\"Change task status\" onClick={() => setStatusSheetOpen(true)}>\n <currentStatus.icon className=\"size-4\" />\n </Button>\n <Button variant=\"secondary\" size=\"sm\" aria-label=\"Edit task\" onClick={() => setDialogOpen(true)}>\n <Pencil className=\"size-4\" />\n </Button>\n </>\n ) : (\n <Button variant=\"secondary\" onClick={() => setDialogOpen(true)}>\n <Pencil className=\"size-4\" />\n Edit task\n </Button>\n )}\n {payload.task.status === \"done\" ? (\n <Button\n variant=\"secondary\"\n onClick={async () => {\n await uncompleteMutation.mutateAsync(payload.task.id);\n }}\n >\n Mark as not done\n </Button>\n ) : null}\n </div>\n </div>\n\n <div className=\"mt-5 flex flex-wrap gap-2\">\n <Badge className=\"bg-white/[0.08] text-white/72\">{currentStatus.label}</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{t(`common.enums.priority.${payload.task.priority}`)}</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{t(`common.enums.effort.${payload.task.effort}`)}</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{t(`common.enums.energy.${payload.task.energy}`)}</Badge>\n <Badge className=\"bg-white/[0.08] text-white/72\">{payload.task.points} xp</Badge>\n {payload.task.time.totalCreditedSeconds > 0 ? <Badge className=\"bg-white/[0.08] text-white/72\">{Math.floor(payload.task.time.totalCreditedSeconds / 60)} min tracked</Badge> : null}\n {currentRun ? <Badge className=\"bg-emerald-500/12 text-emerald-200\">Timer active</Badge> : null}\n </div>\n\n {!isMobile ? (\n <div className=\"mt-5\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Status</div>\n <div className=\"mt-3 grid gap-2 md:grid-cols-2 xl:grid-cols-5\">\n {STATUS_META.map((entry) => {\n const Icon = entry.icon;\n const selected = entry.status === payload.task.status;\n return (\n <button\n key={entry.status}\n type=\"button\"\n disabled={selected || updateTaskMutation.isPending}\n className={`rounded-[18px] border px-3.5 py-3 text-left transition ${\n selected\n ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white\"\n : \"border-white/8 bg-white/[0.04] text-white/72 hover:bg-white/[0.08]\"\n }`}\n onClick={() => void handleStatusChange(entry.status)}\n >\n <div className=\"flex items-center gap-2\">\n <Icon className=\"size-4 shrink-0 text-[var(--primary)]\" />\n <span className=\"font-medium\">{entry.label}</span>\n </div>\n <div className=\"mt-2 text-xs leading-5 text-white/54\">{entry.description}</div>\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n\n <div className=\"mt-5 grid gap-4 xl:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]\">\n <div className=\"rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Linked items</div>\n <div className=\"mt-4 grid gap-3\">\n <div>\n <DetailLabel label=\"Project\" help=\"The project is the main work stream this task belongs to.\" />\n <div className=\"mt-2\">\n {payload.project ? (\n <Link to={`/projects/${payload.project.id}`} className=\"inline-flex max-w-full\">\n <EntityBadge kind=\"project\" label={payload.project.title} compact gradient={false} wrap className=\"max-w-full\" />\n </Link>\n ) : (\n <Badge className=\"bg-white/[0.08] text-white/65\">No project linked</Badge>\n )}\n </div>\n </div>\n <div>\n <DetailLabel label=\"Goal\" help=\"The goal shows the longer-term result this task supports.\" />\n <div className=\"mt-2\">\n {payload.goal ? (\n <Link to={`/goals/${payload.goal.id}`} className=\"inline-flex max-w-full\">\n <EntityBadge kind=\"goal\" label={payload.goal.title} compact gradient={false} wrap className=\"max-w-full\" />\n </Link>\n ) : (\n <Badge className=\"bg-white/[0.08] text-white/65\">No goal linked</Badge>\n )}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Task details</div>\n <div className=\"mt-4 grid gap-3 sm:grid-cols-2\">\n <div className=\"rounded-[16px] bg-white/[0.03] px-3.5 py-3\">\n <DetailLabel label=\"Due date\" help=\"Use a due date only when timing actually matters for this task.\" />\n <div className=\"mt-2 text-white\">{formatDate(payload.task.dueDate)}</div>\n </div>\n <div className=\"rounded-[16px] bg-white/[0.03] px-3.5 py-3\">\n <DetailLabel label=\"Owner\" help=\"The owner is the person or role expected to carry this task.\" />\n <div className=\"mt-2 text-white\">{payload.task.owner}</div>\n </div>\n <div className=\"rounded-[16px] bg-white/[0.03] px-3.5 py-3\">\n <DetailLabel label=\"Created\" />\n <div className=\"mt-2 text-white\">{formatDateTime(payload.task.createdAt)}</div>\n </div>\n <div className=\"rounded-[16px] bg-white/[0.03] px-3.5 py-3\">\n <DetailLabel label=\"Updated\" />\n <div className=\"mt-2 text-white\">{formatDateTime(payload.task.updatedAt)}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"mt-5 rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"flex items-center gap-2 text-sm text-white/58\">\n <span>Current timer</span>\n <InfoTooltip content=\"This shows whether work is running on the task right now and how much time has been credited.\" label=\"Explain current timer\" />\n </div>\n <div className=\"mt-3 text-white\">\n {currentRun\n ? `${currentRun.timerMode === \"planned\" ? \"Planned\" : \"Unlimited\"} timer active with ${Math.floor(currentRun.creditedSeconds / 60)} credited minutes.`\n : \"No timer is running on this task right now.\"}\n </div>\n </div>\n\n <div className=\"mt-5\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Activity</div>\n <div className=\"mt-4 grid gap-3\">\n {payload.activity.length === 0 ? (\n <div className=\"rounded-[18px] bg-white/[0.04] p-4 text-sm text-white/55\">No activity has been recorded for this task yet.</div>\n ) : null}\n {payload.activity.map((event) => (\n <div key={event.id} className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"font-medium text-white\">{getReadableActivityTitle(event)}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{getReadableActivityDescription(event)}</div>\n <div className=\"mt-3 text-[11px] uppercase tracking-[0.16em] text-white/35\">{formatDateTime(event.createdAt)}</div>\n </div>\n <Button\n variant=\"ghost\"\n className=\"shrink-0\"\n onClick={async () => {\n await removeEventMutation.mutateAsync(event.id);\n }}\n >\n Remove\n </Button>\n </div>\n {getActivityEventHref(event) ? (\n <Link to={getActivityEventHref(event)!} className=\"mt-3 inline-flex text-[11px] uppercase tracking-[0.16em] text-[var(--primary)]\">\n Open related item\n </Link>\n ) : null}\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"mt-5\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Timer sessions</div>\n <div className=\"mt-4 grid gap-3\">\n {payload.taskRuns.length === 0 ? (\n <div className=\"rounded-[18px] bg-white/[0.04] p-4 text-sm text-white/55\">No timer sessions have been recorded for this task yet.</div>\n ) : null}\n {payload.taskRuns.map((run) => (\n <div key={run.id} className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-medium text-white\">{run.actor}</div>\n <Badge>{describeRunStatus(run.status)}</Badge>\n </div>\n <div className=\"mt-2 text-sm text-white/58\">{run.note || t(\"common.labels.noRunNote\")}</div>\n <div className=\"mt-3 text-[11px] uppercase tracking-[0.16em] text-white/35\">{formatDateTime(run.updatedAt)}</div>\n </div>\n ))}\n </div>\n </div>\n </Card>\n\n <TaskDialog\n open={dialogOpen}\n goals={shell.snapshot.goals}\n projects={shell.snapshot.dashboard.projects}\n tags={shell.snapshot.tags}\n editingTask={payload.task}\n onOpenChange={setDialogOpen}\n onSubmit={async (input, taskId) => {\n if (!taskId) {\n return;\n }\n await updateTaskMutation.mutateAsync({ taskId, patch: input });\n }}\n />\n\n <SheetScaffold\n open={statusSheetOpen}\n onOpenChange={setStatusSheetOpen}\n eyebrow=\"Task status\"\n title=\"Change status\"\n description=\"Pick the state that best matches where this task is right now.\"\n >\n <div className=\"grid gap-3\">\n {STATUS_META.map((entry) => {\n const Icon = entry.icon;\n const selected = entry.status === payload.task.status;\n return (\n <button\n key={entry.status}\n type=\"button\"\n disabled={selected || updateTaskMutation.isPending}\n className={`rounded-[22px] border px-4 py-4 text-left transition ${\n selected ? \"border-[rgba(192,193,255,0.28)] bg-[rgba(192,193,255,0.14)] text-white\" : \"border-white/8 bg-white/[0.04] text-white/72 hover:bg-white/[0.08]\"\n }`}\n onClick={() => void handleStatusChange(entry.status)}\n >\n <div className=\"flex items-center gap-3\">\n <Icon className=\"size-4 shrink-0 text-[var(--primary)]\" />\n <div>\n <div className=\"font-medium\">{entry.label}</div>\n <div className=\"mt-1 text-sm text-white/54\">{entry.description}</div>\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </SheetScaffold>\n </div>\n );\n}\n","import { ArrowRight, CheckCheck, Crosshair, Play, ShieldAlert } from \"lucide-react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { EntityBadge } from \"@/components/ui/entity-badge\";\nimport { EntityName } from \"@/components/ui/entity-name\";\nimport { InfoTooltip } from \"@/components/ui/info-tooltip\";\nimport { useI18n } from \"@/lib/i18n\";\nimport type { Goal, Tag, Task, TaskStatus } from \"@/lib/types\";\n\nfunction getGoalTitle(task: Task, goals: Goal[], fallback: string) {\n return goals.find((goal) => goal.id === task.goalId)?.title ?? fallback;\n}\n\nfunction getTaskTags(task: Task, tags: Tag[]) {\n return task.tagIds.map((tagId) => tags.find((tag) => tag.id === tagId)).filter(Boolean) as Tag[];\n}\n\nfunction getNextAction(task: Task, labels: Record<\"backlog\" | \"focus\" | \"in_progress\" | \"blocked\", string>): { label: string; nextStatus?: TaskStatus; action: \"start\" | \"move\"; icon: typeof Crosshair } | null {\n switch (task.status) {\n case \"backlog\":\n return { label: labels.backlog, action: \"start\", icon: Play };\n case \"focus\":\n return { label: labels.focus, action: \"start\", icon: Play };\n case \"in_progress\":\n return { label: labels.in_progress, nextStatus: \"done\", action: \"move\", icon: CheckCheck };\n case \"blocked\":\n return { label: labels.blocked, action: \"start\", icon: Play };\n default:\n return null;\n }\n}\n\nexport function DailyRunway({\n tasks,\n timeline,\n goals,\n tags,\n selectedTaskId,\n onSelectTask,\n onMove,\n onStartTask\n}: {\n tasks: Task[];\n timeline: Array<{ id: string; label: string; tasks: Task[] }>;\n goals: Goal[];\n tags: Tag[];\n selectedTaskId: string | null;\n onSelectTask: (taskId: string) => void;\n onMove: (taskId: string, nextStatus: TaskStatus) => Promise<void>;\n onStartTask: (taskId: string) => Promise<void>;\n}) {\n const { t, formatDate } = useI18n();\n const nextActionLabels = {\n backlog: t(\"common.dailyRunway.actionBacklog\"),\n focus: t(\"common.dailyRunway.actionFocus\"),\n in_progress: t(\"common.dailyRunway.actionProgress\"),\n blocked: t(\"common.dailyRunway.actionBlocked\")\n } as const;\n return (\n <div className=\"grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.3fr)_minmax(18rem,0.9fr)]\">\n <div className=\"min-w-0 rounded-[24px] bg-white/[0.04] p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.dailyRunway.runwayEyebrow\")}</div>\n <InfoTooltip content=\"These are the tasks that matter most for today. Click a card to open the task details. Use Start to begin work immediately.\" />\n </div>\n <h4 className=\"mt-2 font-display text-2xl text-white\">{t(\"common.dailyRunway.runwayTitle\")}</h4>\n </div>\n <Badge className=\"shrink-0 text-[var(--primary)]\">{t(tasks.length === 1 ? \"common.dailyRunway.prioritiesOne\" : \"common.dailyRunway.prioritiesOther\", { count: tasks.length })}</Badge>\n </div>\n\n <div className=\"mt-4 grid min-w-0 gap-3\">\n {tasks.map((task, index) => {\n const nextAction = getNextAction(task, nextActionLabels);\n const taskTags = getTaskTags(task, tags).slice(0, 2);\n const isSelected = selectedTaskId === task.id;\n\n return (\n <button\n key={task.id}\n type=\"button\"\n className={`grid w-full gap-3 rounded-[22px] px-4 py-4 text-left transition ${\n isSelected\n ? \"bg-[linear-gradient(180deg,rgba(192,193,255,0.16),rgba(192,193,255,0.05))] shadow-[inset_0_0_0_1px_rgba(192,193,255,0.2)]\"\n : \"bg-white/[0.03] hover:bg-white/[0.06]\"\n }`}\n onClick={() => onSelectTask(task.id)}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">\n {t(\"common.dailyRunway.runwayItem\", { index: index + 1 })}\n </div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <EntityBadge kind=\"goal\" label={getGoalTitle(task, goals, t(\"common.dailyRunway.unassigned\"))} compact gradient={false} />\n {task.time.activeRunCount > 0 ? <Badge className=\"bg-emerald-500/12 text-emerald-200\">Live</Badge> : null}\n </div>\n <div className=\"mt-2\">\n <EntityName kind=\"task\" label={task.title} variant=\"heading\" size=\"md\" />\n </div>\n <p className=\"mt-2 text-sm leading-6 text-white/60\">{task.description || t(\"common.dailyRunway.noNote\")}</p>\n </div>\n <Badge className=\"shrink-0 self-start\">{task.status.replaceAll(\"_\", \" \")}</Badge>\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n <Badge className=\"bg-[var(--primary)]/14 text-[var(--primary)]\">{task.points} xp</Badge>\n {task.time.totalCreditedSeconds > 0 ? <Badge className=\"bg-white/[0.08] text-white/70\">{Math.floor(task.time.totalCreditedSeconds / 60)} min tracked</Badge> : null}\n <Badge className=\"bg-white/[0.08] text-white/70\">{task.effort}</Badge>\n <Badge className=\"bg-white/[0.08] text-white/70\">{formatDate(task.dueDate)}</Badge>\n {taskTags.map((tag) => (\n <Badge key={tag.id} className=\"bg-white/[0.08]\" style={{ color: tag.color }}>\n {tag.name}\n </Badge>\n ))}\n </div>\n\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"text-[11px] uppercase tracking-[0.16em] text-white/40\">{task.owner}</div>\n {nextAction ? (\n <Button\n variant={nextAction.action === \"start\" ? \"primary\" : \"secondary\"}\n className=\"px-3 py-2 text-[11px] uppercase tracking-[0.16em]\"\n onClick={async (event) => {\n event.stopPropagation();\n if (nextAction.action === \"start\") {\n await onStartTask(task.id);\n return;\n }\n if (nextAction.nextStatus) {\n await onMove(task.id, nextAction.nextStatus);\n }\n }}\n >\n <nextAction.icon className=\"mr-2 size-3.5\" />\n {nextAction.label}\n </Button>\n ) : null}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"min-w-0 rounded-[24px] bg-white/[0.04] p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.dailyRunway.timelineEyebrow\")}</div>\n <InfoTooltip content=\"This groups today's tasks by status, so you can see what is already moving, what is ready to start, what is blocked, and what is done.\" />\n </div>\n <h4 className=\"mt-2 font-display text-2xl text-white\">{t(\"common.dailyRunway.timelineTitle\")}</h4>\n <div className=\"mt-4 grid min-w-0 gap-3\">\n {timeline.map((bucket) => (\n <div key={bucket.id} className=\"rounded-[20px] bg-white/[0.03] p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-medium text-white\">{bucket.label}</div>\n <Badge className=\"bg-white/[0.08] text-white/65\">{bucket.tasks.length}</Badge>\n </div>\n <div className=\"mt-3 grid gap-2\">\n {bucket.tasks.slice(0, 3).map((task) => (\n <button\n key={task.id}\n type=\"button\"\n className=\"flex items-center justify-between gap-3 rounded-[16px] bg-white/[0.03] px-3 py-3 text-left transition hover:bg-white/[0.06]\"\n onClick={() => onSelectTask(task.id)}\n >\n <div className=\"min-w-0\">\n <EntityName kind=\"task\" label={task.title} className=\"max-w-full\" />\n <div className=\"mt-2\">\n <EntityBadge kind=\"goal\" label={getGoalTitle(task, goals, t(\"common.dailyRunway.unassigned\"))} compact gradient={false} />\n </div>\n </div>\n <ArrowRight className=\"size-4 shrink-0 text-white/35\" />\n </button>\n ))}\n {bucket.tasks.length === 0 ? <div className=\"text-sm text-white/42\">{t(\"common.dailyRunway.emptyBucket\")}</div> : null}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","import { Link, useNavigate } from \"react-router-dom\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { DailyRunway } from \"@/components/daily-runway\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Card } from \"@/components/ui/card\";\nimport { InfoTooltip } from \"@/components/ui/info-tooltip\";\nimport { EmptyState } from \"@/components/ui/page-state\";\nimport { ProgressMeter } from \"@/components/ui/progress-meter\";\nimport { useForgeShell } from \"@/components/shell/app-shell\";\nimport { useI18n } from \"@/lib/i18n\";\n\nexport function TodayPage() {\n const { t } = useI18n();\n const shell = useForgeShell();\n const navigate = useNavigate();\n const directive = shell.snapshot.today.directive.task;\n const nextMilestone = shell.snapshot.today.milestoneRewards.find((reward) => !reward.completed) ?? shell.snapshot.today.milestoneRewards[0] ?? null;\n const comebackTask = shell.snapshot.risk.blockedTasks[0] ?? shell.snapshot.risk.overdueTasks[0] ?? null;\n const nextLevelXp = Math.max(0, shell.snapshot.metrics.nextLevelXp - shell.snapshot.metrics.currentLevelXp);\n const START_BOUNTY_XP = 8;\n const TIME_BOUNTY_XP = 4;\n const TIME_BOUNTY_MINUTES = 10;\n const FINISH_BOUNTY_XP = 20;\n const hasTodayData =\n directive !== null ||\n shell.snapshot.overview.topTasks.length > 0 ||\n shell.snapshot.today.dailyQuests.length > 0 ||\n shell.snapshot.today.milestoneRewards.length > 0;\n\n if (!hasTodayData) {\n return (\n <div className=\"grid gap-5\">\n <PageHero\n title=\"Today\"\n titleText=\"Today\"\n description=\"Start a task, earn XP, and keep today's work clear.\"\n badge={`${shell.snapshot.metrics.weeklyXp} weekly xp`}\n />\n <EmptyState\n eyebrow={t(\"common.todayPage.heroEyebrow\")}\n title={t(\"common.todayPage.emptyTitle\")}\n description={t(\"common.todayPage.emptyDescription\")}\n action={\n <Link to=\"/goals\" className=\"inline-flex min-h-10 min-w-max shrink-0 items-center justify-center rounded-full bg-[var(--primary)] px-4 py-2 text-sm font-medium whitespace-nowrap text-slate-950 transition hover:opacity-90\">\n {t(\"common.todayPage.emptyAction\")}\n </Link>\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"grid min-w-0 gap-5\">\n <PageHero\n title=\"Today\"\n titleText=\"Today\"\n description={directive?.description ?? \"Start one real task, collect XP, and keep today's work moving.\"}\n badge={`${shell.snapshot.metrics.weeklyXp} weekly xp`}\n />\n\n <section className=\"grid gap-3 lg:grid-cols-4\">\n <Card>\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Weekly XP</div>\n <InfoTooltip content=\"Weekly XP is the XP earned since the start of the current week.\" />\n </div>\n <div className=\"mt-3 font-display text-4xl text-[var(--primary)]\">{shell.snapshot.metrics.weeklyXp}</div>\n <div className=\"mt-2 text-sm text-white/58\">Total XP: {shell.snapshot.metrics.totalXp}</div>\n </Card>\n <Card>\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Level</div>\n <InfoTooltip content=\"Levels come from total XP. The progress bar below shows how much XP is left before the next level.\" />\n </div>\n <div className=\"mt-3 font-display text-4xl text-white\">{shell.snapshot.metrics.level}</div>\n <div className=\"mt-2 text-sm text-white/58\">{nextLevelXp} xp to next level</div>\n <div className=\"mt-3\">\n <ProgressMeter value={(shell.snapshot.metrics.currentLevelXp / shell.snapshot.metrics.nextLevelXp) * 100} tone=\"tertiary\" />\n </div>\n </Card>\n <Card>\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Momentum</div>\n <InfoTooltip content=\"Momentum is a simple signal that combines weekly XP, active work, and overdue drag.\" />\n </div>\n <div className=\"mt-3 font-display text-4xl text-white\">{shell.snapshot.metrics.momentumScore}%</div>\n <div className=\"mt-2 text-sm text-white/58\">{shell.snapshot.metrics.streakDays} day streak</div>\n </Card>\n <Card>\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Task rewards</div>\n <InfoTooltip content=\"Starting work, staying in work, and completing work all pay XP. Task completion also still awards the task's own XP value.\" />\n </div>\n <div className=\"mt-3 grid gap-2 text-sm text-white/70\">\n <div className=\"flex items-center justify-between gap-3 rounded-[16px] bg-white/[0.04] px-3 py-2\"><span>Start work</span><Badge className=\"bg-[var(--primary)]/14 text-[var(--primary)]\">+{START_BOUNTY_XP} xp</Badge></div>\n <div className=\"flex items-center justify-between gap-3 rounded-[16px] bg-white/[0.04] px-3 py-2\"><span>Every {TIME_BOUNTY_MINUTES} min</span><Badge className=\"bg-[var(--primary)]/14 text-[var(--primary)]\">+{TIME_BOUNTY_XP} xp</Badge></div>\n <div className=\"flex items-center justify-between gap-3 rounded-[16px] bg-white/[0.04] px-3 py-2\"><span>Complete timer</span><Badge className=\"bg-[var(--primary)]/14 text-[var(--primary)]\">+{FINISH_BOUNTY_XP} xp</Badge></div>\n </div>\n </Card>\n </section>\n\n <section className=\"grid min-w-0 gap-5 xl:grid-cols-[minmax(0,1.4fr)_24rem]\">\n <div className=\"min-w-0\">\n <DailyRunway\n tasks={shell.snapshot.overview.topTasks}\n timeline={shell.snapshot.today.timeline}\n goals={shell.snapshot.goals}\n tags={shell.snapshot.tags}\n selectedTaskId={directive?.id ?? null}\n onSelectTask={(taskId) => navigate(`/tasks/${taskId}`)}\n onStartTask={async (taskId) => {\n await shell.startTaskNow(taskId);\n }}\n onMove={async (taskId, nextStatus) => {\n await shell.patchTaskStatus(taskId, nextStatus);\n }}\n />\n </div>\n\n <div className=\"grid min-w-0 gap-5\">\n <Card className=\"min-w-0 overflow-hidden\">\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Current task</div>\n <InfoTooltip content=\"This is the task Forge currently considers the best anchor for today.\" />\n </div>\n {directive ? (\n <button type=\"button\" className=\"mt-4 grid w-full gap-3 rounded-[20px] bg-white/[0.04] p-4 text-left transition hover:bg-white/[0.06]\" onClick={() => navigate(`/tasks/${directive.id}`)}>\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"font-medium text-white\">{directive.title}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{directive.description || \"No description yet.\"}</div>\n </div>\n <Badge className=\"bg-[var(--primary)]/14 text-[var(--primary)]\">{shell.snapshot.today.directive.rewardXp} xp</Badge>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {shell.snapshot.today.directive.goalTitle ? <Badge className=\"bg-white/[0.08] text-white/72\">{shell.snapshot.today.directive.goalTitle}</Badge> : null}\n <Badge className=\"bg-white/[0.08] text-white/72\">{shell.snapshot.today.directive.sessionLabel}</Badge>\n </div>\n </button>\n ) : (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">No task is selected for today yet. Start one from the list on the left.</div>\n )}\n </Card>\n\n <Card className=\"min-w-0 overflow-hidden\">\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.todayPage.questsTitle\")}</div>\n <InfoTooltip content=\"Daily rewards are small XP targets for today. They should support real work, not replace it.\" />\n </div>\n {shell.snapshot.today.dailyQuests.length === 0 ? (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">{t(\"common.todayPage.questsEmpty\")}</div>\n ) : (\n <div className=\"mt-4 grid min-w-0 gap-3\">\n {shell.snapshot.today.dailyQuests.map((quest) => (\n <div key={quest.id} className=\"rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium leading-tight text-white\">{quest.title}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{quest.summary}</div>\n </div>\n <Badge className={`shrink-0 self-start ${quest.completed ? \"text-emerald-300\" : \"text-[var(--tertiary)]\"}`}>+{quest.rewardXp} xp</Badge>\n </div>\n <div className=\"mt-3 text-[11px] uppercase tracking-[0.16em] text-white/38\">{quest.progressLabel}</div>\n </div>\n ))}\n </div>\n )}\n </Card>\n\n <Card className=\"min-w-0 overflow-hidden\">\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.todayPage.rewardsTitle\")}</div>\n <InfoTooltip content=\"Milestones are larger progress targets that stay active across multiple days.\" />\n </div>\n {shell.snapshot.today.milestoneRewards.length === 0 ? (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">{t(\"common.todayPage.rewardsEmpty\")}</div>\n ) : (\n <div className=\"mt-4 grid min-w-0 gap-3\">\n {shell.snapshot.today.milestoneRewards.map((reward) => (\n <div key={reward.id} className=\"overflow-hidden rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium leading-tight text-white\">{reward.title}</div>\n <div className=\"mt-2 text-sm text-white/58\">{reward.summary}</div>\n </div>\n <Badge className=\"max-w-[10.5rem] shrink-0 self-start\">{reward.rewardLabel}</Badge>\n </div>\n <div className=\"mt-4\">\n <ProgressMeter value={(reward.current / reward.target) * 100} tone=\"tertiary\" />\n </div>\n <div className=\"mt-3 text-[11px] uppercase tracking-[0.16em] text-white/38\">{reward.progressLabel}</div>\n </div>\n ))}\n </div>\n )}\n </Card>\n\n <Card className=\"min-w-0 overflow-hidden\">\n <div className=\"flex items-center gap-2\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">Needs attention</div>\n <InfoTooltip content=\"This highlights the blocked or overdue task most likely to slow you down if ignored.\" />\n </div>\n {comebackTask ? (\n <button type=\"button\" className=\"mt-4 grid w-full gap-3 rounded-[20px] bg-white/[0.04] p-4 text-left transition hover:bg-white/[0.06]\" onClick={() => navigate(`/tasks/${comebackTask.id}`)}>\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"font-medium text-white\">{comebackTask.title}</div>\n <div className=\"mt-2 text-sm leading-6 text-white/58\">{comebackTask.description || shell.snapshot.today.momentum.recoveryHint}</div>\n </div>\n <Badge className=\"bg-white/[0.08] text-white/72\">{comebackTask.status.replaceAll(\"_\", \" \")}</Badge>\n </div>\n </button>\n ) : (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4 text-sm text-white/58\">{shell.snapshot.today.momentum.recoveryHint}</div>\n )}\n {nextMilestone ? (\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"text-sm font-medium text-white\">{nextMilestone.title}</div>\n <div className=\"mt-2 text-sm text-white/58\">{nextMilestone.progressLabel}</div>\n </div>\n ) : null}\n </Card>\n </div>\n </section>\n </div>\n );\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Bar, BarChart, ResponsiveContainer, XAxis, YAxis } from \"recharts\";\nimport { FlagshipSignalDeck } from \"@/components/experience/flagship-signal-deck\";\nimport { SurfaceSkeleton } from \"@/components/experience/surface-skeleton\";\nimport { PageHero } from \"@/components/shell/page-hero\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport { ErrorState } from \"@/components/ui/page-state\";\nimport { getWeeklyReview } from \"@/lib/api\";\nimport { useI18n } from \"@/lib/i18n\";\n\nexport function WeeklyReviewPage() {\n const { t } = useI18n();\n const reviewQuery = useQuery({\n queryKey: [\"forge-weekly-review\"],\n queryFn: getWeeklyReview\n });\n const review = reviewQuery.data?.review;\n\n if (reviewQuery.isLoading) {\n return <SurfaceSkeleton />;\n }\n\n if (reviewQuery.isError) {\n return <ErrorState eyebrow={t(\"common.weeklyReview.heroEyebrow\")} error={reviewQuery.error} onRetry={() => void reviewQuery.refetch()} />;\n }\n\n if (!review) {\n return <ErrorState eyebrow={t(\"common.weeklyReview.heroEyebrow\")} error={new Error(\"Forge returned an empty weekly review payload.\")} onRetry={() => void reviewQuery.refetch()} />;\n }\n\n const strongestWin = review.wins[0] ?? null;\n const recoveryCalibration = review.calibration.find((entry) => entry.mode === \"recover\") ?? review.calibration[0] ?? null;\n const accelerationCalibration = review.calibration.find((entry) => entry.mode === \"accelerate\") ?? review.calibration[0] ?? null;\n const reviewSignals = [\n {\n id: \"week\",\n label: \"This week\",\n title: `${review.momentumSummary.totalXp} XP with ${review.momentumSummary.focusHours} focus hours`,\n detail: `Peak window: ${review.momentumSummary.peakWindow}. Efficiency score is holding at ${review.momentumSummary.efficiencyScore}.`,\n badge: review.windowLabel\n },\n {\n id: \"wins\",\n label: \"Wins\",\n title: strongestWin?.title ?? t(\"common.weeklyReview.noWin\"),\n detail: strongestWin?.summary ?? t(\"common.weeklyReview.noWinDetail\"),\n badge: strongestWin ? `+${strongestWin.rewardXp} xp` : `${review.wins.length} wins`\n },\n {\n id: \"recovery\",\n label: \"Recovery\",\n title: recoveryCalibration?.title ?? t(\"common.weeklyReview.noRecovery\"),\n detail: recoveryCalibration?.note ?? t(\"common.weeklyReview.noRecoveryDetail\"),\n badge: recoveryCalibration?.mode ?? \"maintain\"\n },\n {\n id: \"next-intent\",\n label: \"Next intent\",\n title: accelerationCalibration?.title ?? review.reward.title,\n detail: accelerationCalibration?.note ?? review.reward.summary,\n badge: `+${review.reward.rewardXp} xp`\n }\n ] as const;\n\n return (\n <div className=\"grid gap-5\">\n <PageHero\n title=\"Weekly Review\"\n description={`${review.windowLabel}. ${t(\"common.weeklyReview.heroDescription\")}`}\n badge={`${review.momentumSummary.totalXp} xp`}\n />\n\n <section className=\"grid gap-5 xl:grid-cols-[minmax(0,1.2fr)_minmax(0,0.8fr)]\">\n <div className=\"grid gap-5\">\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.weeklyReview.sectionMomentum\")}</div>\n <div className=\"mt-4 h-64\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={review.chart}>\n <XAxis dataKey=\"label\" tick={{ fill: \"rgba(255,255,255,0.42)\", fontSize: 11 }} />\n <YAxis hide />\n <Bar dataKey=\"xp\" fill=\"#c0c1ff\" radius={[8, 8, 0, 0]} />\n </BarChart>\n </ResponsiveContainer>\n </div>\n <div className=\"mt-4 grid gap-3 md:grid-cols-3\">\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/40\">XP</div>\n <div className=\"mt-2 text-2xl text-white\">{review.momentumSummary.totalXp}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/40\">Focus hours</div>\n <div className=\"mt-2 text-2xl text-white\">{review.momentumSummary.focusHours}</div>\n </div>\n <div className=\"rounded-[18px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/40\">Peak window</div>\n <div className=\"mt-2 text-2xl text-white\">{review.momentumSummary.peakWindow}</div>\n </div>\n </div>\n </Card>\n\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.weeklyReview.sectionGoals\")}</div>\n <div className=\"mt-4 grid gap-3\">\n {review.calibration.map((entry) => (\n <div key={entry.id} className=\"overflow-hidden rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1 font-medium text-white\">{entry.title}</div>\n <Badge className=\"max-w-[9rem] shrink-0 self-start\">{entry.mode}</Badge>\n </div>\n <div className=\"mt-3 text-sm text-white/58\">{entry.note}</div>\n </div>\n ))}\n </div>\n </Card>\n </div>\n\n <div className=\"grid gap-5\">\n <Card>\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/45\">{t(\"common.weeklyReview.sectionWins\")}</div>\n <div className=\"mt-4 grid gap-3\">\n {review.wins.map((win) => (\n <div key={win.id} className=\"overflow-hidden rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1 font-medium text-white\">{win.title}</div>\n <Badge className=\"max-w-[8rem] shrink-0 self-start text-emerald-300\">+{win.rewardXp} xp</Badge>\n </div>\n <div className=\"mt-2 text-sm text-white/58\">{win.summary}</div>\n </div>\n ))}\n </div>\n </Card>\n\n <Card>\n <h2 className=\"font-display text-3xl text-white\">{review.reward.title}</h2>\n <p className=\"mt-3 text-sm leading-7 text-white/60\">{review.reward.summary}</p>\n <div className=\"mt-4 rounded-[20px] bg-white/[0.04] p-4\">\n <div className=\"font-label text-[11px] uppercase tracking-[0.18em] text-white/40\">{t(\"common.weeklyReview.completionBonus\")}</div>\n <div className=\"mt-2 text-3xl text-[var(--primary)]\">+{review.reward.rewardXp} XP</div>\n </div>\n <Button className=\"mt-4 w-full\">{t(\"common.weeklyReview.finalize\")}</Button>\n </Card>\n </div>\n </section>\n\n <FlagshipSignalDeck\n eyebrow={t(\"common.weeklyReview.summaryEyebrow\")}\n title={t(\"common.weeklyReview.summaryTitle\")}\n description={t(\"common.weeklyReview.summaryDescription\")}\n items={reviewSignals}\n />\n </div>\n );\n}\n","import { Navigate, Route, Routes } from \"react-router-dom\";\nimport { AppShell } from \"@/components/shell/app-shell\";\nimport { ActivityPage } from \"@/pages/activity-page\";\nimport { GoalDetailPage } from \"@/pages/goal-detail-page\";\nimport { GoalsPage } from \"@/pages/goals-page\";\nimport { InsightsPage } from \"@/pages/insights-page\";\nimport { KanbanPage } from \"@/pages/kanban-page\";\nimport { OverviewPage } from \"@/pages/overview-page\";\nimport { ProjectDetailPage } from \"@/pages/project-detail-page\";\nimport { ProjectsPage } from \"@/pages/projects-page\";\nimport { PsychePage } from \"@/pages/psyche-page\";\nimport { PsycheBehaviorsPage } from \"@/pages/psyche-behaviors-page\";\nimport { PsycheGoalMapPage } from \"@/pages/psyche-goal-map-page\";\nimport { PsycheModeGuidePage } from \"@/pages/psyche-mode-guide-page\";\nimport { PsycheModesPage } from \"@/pages/psyche-modes-page\";\nimport { PsychePatternsPage } from \"@/pages/psyche-patterns-page\";\nimport { PsycheReportDetailPage } from \"@/pages/psyche-report-detail-page\";\nimport { PsycheReportsPage } from \"@/pages/psyche-reports-page\";\nimport { PsycheSchemasBeliefsPage } from \"@/pages/psyche-schemas-beliefs-page\";\nimport { PsycheValuesPage } from \"@/pages/psyche-values-page\";\nimport { SettingsPage } from \"@/pages/settings-page\";\nimport { SettingsAgentsPage } from \"@/pages/settings-agents-page\";\nimport { SettingsBinPage } from \"@/pages/settings-bin-page\";\nimport { SettingsRewardsPage } from \"@/pages/settings-rewards-page\";\nimport { TaskDetailPage } from \"@/pages/task-detail-page\";\nimport { TodayPage } from \"@/pages/today-page\";\nimport { WeeklyReviewPage } from \"@/pages/weekly-review-page\";\n\nexport function App() {\n return (\n <Routes>\n <Route element={<AppShell />}>\n <Route index element={<Navigate to=\"/overview\" replace />} />\n <Route path=\"overview\" element={<OverviewPage />} />\n <Route path=\"goals\" element={<GoalsPage />} />\n <Route path=\"goals/:goalId\" element={<GoalDetailPage />} />\n <Route path=\"projects\" element={<ProjectsPage />} />\n <Route path=\"projects/:projectId\" element={<ProjectDetailPage />} />\n <Route path=\"campaigns\" element={<Navigate to=\"/projects\" replace />} />\n <Route path=\"psyche\" element={<PsychePage />} />\n <Route path=\"psyche/values\" element={<PsycheValuesPage />} />\n <Route path=\"psyche/patterns\" element={<PsychePatternsPage />} />\n <Route path=\"psyche/behaviors\" element={<PsycheBehaviorsPage />} />\n <Route path=\"psyche/reports\" element={<PsycheReportsPage />} />\n <Route path=\"psyche/reports/:reportId\" element={<PsycheReportDetailPage />} />\n <Route path=\"psyche/goal-map\" element={<PsycheGoalMapPage />} />\n <Route path=\"psyche/schemas-beliefs\" element={<PsycheSchemasBeliefsPage />} />\n <Route path=\"psyche/modes\" element={<PsycheModesPage />} />\n <Route path=\"psyche/modes/guide\" element={<PsycheModeGuidePage />} />\n <Route path=\"kanban\" element={<KanbanPage />} />\n <Route path=\"today\" element={<TodayPage />} />\n <Route path=\"activity\" element={<ActivityPage />} />\n <Route path=\"insights\" element={<InsightsPage />} />\n <Route path=\"review/weekly\" element={<WeeklyReviewPage />} />\n <Route path=\"settings\" element={<SettingsPage />} />\n <Route path=\"settings/agents\" element={<SettingsAgentsPage />} />\n <Route path=\"settings/rewards\" element={<SettingsRewardsPage />} />\n <Route path=\"settings/bin\" element={<SettingsBinPage />} />\n <Route path=\"tasks/:taskId\" element={<TaskDetailPage />} />\n </Route>\n <Route path=\"*\" element={<Navigate to=\"/overview\" replace />} />\n </Routes>\n );\n}\n","import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { BrowserRouter } from \"react-router-dom\";\nimport \"@fontsource-variable/plus-jakarta-sans\";\nimport \"@fontsource-variable/sora\";\nimport \"@fontsource/space-grotesk/500.css\";\nimport \"@fontsource/space-grotesk/700.css\";\nimport { App } from \"./app\";\nimport { normalizeRouterBasename } from \"./lib/runtime-paths\";\nimport \"./styles.css\";\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 20_000,\n refetchOnWindowFocus: false\n }\n }\n});\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(\n <React.StrictMode>\n <QueryClientProvider client={queryClient}>\n <BrowserRouter basename={normalizeRouterBasename(import.meta.env.BASE_URL)}>\n <App />\n </BrowserRouter>\n </QueryClientProvider>\n </React.StrictMode>\n);\n"],"names":["cn","inputs","twMerge","clsx","formatDateTime","value","Spinner","className","tone","jsx","createEnglishDictionary","en","fr","dictionaries","resolvePath","dictionary","key","segments","current","segment","interpolate","template","params","_","name","translate","locale","active","fallback","defaultValue","I18nContext","createContext","I18nProvider","children","useMemo","useI18n","useContext","AmbientActivityPill","label","t","jsxs","motion","Badge","size","wrap","props","ENTITY_VISUALS","Target","FolderOpen","ListTodo","Heart","Repeat","Route","Quote","Shapes","FileText","getEntityVisual","kind","getEntityButtonClassName","selected","visual","EntityBadge","compact","showIcon","iconOnly","gradient","Icon","headingSizeClassName","lineClampClassName","EntityName","variant","showKind","showBadge","badgeLabel","badgeCompact","badgeGradient","lines","labelClassName","Input","_size","CommandPalette","open","onOpenChange","snapshot","navigate","useNavigate","query","setQuery","useState","useEffect","items","goal","project","task","filtered","normalized","item","Dialog.Root","Dialog.Portal","Dialog.Overlay","Dialog.Content","Search","event","LayoutDashboard","Clock3","Zap","BrainCircuit","BriefcaseBusiness","Settings","entry","ArrowRight","RouteTransitionFrame","routeKey","distance","duration","AnimatePresence","buttonVariants","cva","Button","pending","pendingLabel","disabled","SheetScaffold","eyebrow","title","description","Dialog.Title","Dialog.Description","FieldHint","InfoTooltip","content","setOpen","containerRef","useRef","tooltipId","useId","handlePointerDown","_a","CircleHelp","MOBILE_BREAKPOINT_QUERY","useIsMobileFlow","isMobile","setIsMobile","mediaQuery","updateMatch","FlowField","labelHelp","hint","error","FlowChoiceGrid","options","onChange","columns","option","QuestionFlowDialog","steps","onSubmit","submitLabel","stepIndex","setStepIndex","step","setValue","patch","totalSteps","progress","Dialog.Close","X","ArrowLeft","Check","Textarea","appLocaleSchema","z.enum","goalMutationSchema","z.object","z.string","z.coerce","z.array","projectMutationSchema","settingsMutationSchema","z.boolean","createAgentTokenSchema","createInsightSchema","quickTaskSchema","defaultGoalValues","goalToFormValues","GoalDialog","editingGoal","tags","draft","setDraft","submitError","setSubmitError","fieldErrors","setFieldErrors","updateFieldErrors","errors","Fragment","next","tag","parsed","defaultProjectValues","projectToFormValues","ProjectDialog","goals","editingProject","initialGoalId","defaultTaskValues","taskToFormValues","TaskDialog","projects","editingTask","initialProjectId","safeGoals","safeProjects","safeTags","selectedProject","useIsMobileCreateSheet","CreateActionButton","onClick","CreateMenu","onCreateGoal","onCreateProject","onCreateTask","menuOpen","setMenuOpen","goalOpen","setGoalOpen","projectOpen","setProjectOpen","taskOpen","setTaskOpen","desktopMenuPosition","setDesktopMenuPosition","menuRef","desktopMenuRef","syncDesktopMenuPosition","rect","_b","handleEscape","createActions","Sparkles","createPortal","group","action","input","toPlannedMinutes","plannedDurationSeconds","StartWorkComposerBody","tasks","activeRunCount","maxActiveTasks","timeAccountingMode","errorMessage","initialTaskId","defaultProjectId","onCancel","onStartExisting","onCreateAndStart","mode","setMode","taskQuery","setTaskQuery","selectedTaskId","setSelectedTaskId","setTitle","setDescription","projectId","setProjectId","timerMode","setTimerMode","plannedMinutes","setPlannedMinutes","sortedTasks","left","right","filteredTasks","canSubmit","policyLabel","Timer","TimerReset","Play","StartWorkComposer","presentation","composer","RailExpandCtx","TaskTimerRailProvider","expanded","setExpanded","openedAtMsRef","lastY","handleScroll","formatDuration","totalSeconds","safeSeconds","hours","minutes","seconds","buildLiveRunViews","runs","generatedAt","nowMs","activeCount","generatedAtMs","deltaSeconds","run","wallSeconds","creditedExtra","creditedSeconds","remainingSeconds","overtimeSeconds","useLiveRuns","setNowMs","timer","TaskTimerRailBar","onOpenStartWork","onPause","onFocus","liveRuns","e","secondary","p","Square","TaskTimerRailPanel","onComplete","splitHint","PauseCircle","CheckCheck","Card","ForgeApiError","__publicField","describeApiError","detail","LoadingState","ErrorState","onRetry","code","RefreshCcw","EmptyState","normalizeAssetBasePath","basePath","withLeadingSlash","normalizeRouterBasename","getBaseUrl","resolveForgePath","pathname","useLiveEvents","queryClient","useQueryClient","stream","invalidate","normalizeTask","normalizeProject","normalizeForgeSnapshot","raw","legacy","rootProjects","dashboardProjects","overviewProjects","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_s","_r","_u","_t","_w","_v","_y","_x","_A","_z","_C","_B","_E","_D","_F","_G","_H","_I","_J","_K","bucket","_L","_M","_N","_O","_P","_Q","_R","_S","_T","_U","_V","_W","_X","_Y","_Z","_$","__","_aa","_ca","_ba","_da","_fa","_ea","_ga","_ia","_ha","_ja","_la","_ka","_ma","_oa","_na","_pa","_ra","_qa","_ta","_sa","_ua","_va","_wa","_xa","_ya","_za","_Aa","_Ca","_Ba","_Ea","_Da","_Ga","_Fa","_Ia","_Ha","_Ja","_Ka","_La","_Na","_Ma","_Pa","_Oa","_Ra","_Qa","_Sa","_Ta","_Ua","_Va","_Wa","parseResponseBody","response","text","request","path","init","body","maybeBody","details","ensureOperatorSession","revokeOperatorSession","getForgeSnapshot","getInsights","getPsycheOverview","listPsycheValues","createPsycheValue","patchPsycheValue","valueId","listBehaviorPatterns","createBehaviorPattern","patchBehaviorPattern","patternId","listBehaviors","createBehavior","patchBehavior","behaviorId","listSchemaCatalog","listBeliefs","createBelief","patchBelief","beliefId","listModes","createMode","patchMode","modeId","listModeGuideSessions","createModeGuideSession","listEventTypes","listEmotionDefinitions","listTriggerReports","createTriggerReport","getTriggerReport","reportId","patchTriggerReport","createComment","createInsight","submitInsightFeedback","insightId","feedbackType","note","getWeeklyReview","getProjectBoard","getOperatorContext","getSettings","getSettingsBin","getAgentOnboarding","listApprovalRequests","approveApprovalRequest","approvalRequestId","rejectApprovalRequest","listRewardRules","patchRewardRule","ruleId","createManualRewardGrant","listRewardLedger","limit","getXpMetrics","patchSettings","deleteEntities","restoreEntities","createAgentToken","rotateAgentToken","tokenId","revokeAgentToken","listActivity","search","createGoal","createProject","patchProject","patchGoal","goalId","createTask","patchTask","taskId","uncompleteTask","getTaskContext","logOperatorWork","removeActivityLog","eventId","reason","recordSessionEvent","claimTaskRun","heartbeatTaskRun","taskRunId","focusTaskRun","completeTaskRun","releaseTaskRun","ShellContext","PRIMARY_ROUTES","ArrowUpRight","Radar","BarChart3","MOBILE_CORE_ROUTES","MOBILE_MORE_ROUTES","formatCompactNumber","NavItem","to","labelKey","NavLink","isActive","MobileBottomNav","moreOpen","setMoreOpen","route","ShellCommandButton","ShellFrame","settings","timerPending","startWorkOpen","startWorkPending","startWorkError","startWorkDefaults","onCloseStartWork","onStartExistingTask","onCreateAndStartTask","onFocusRun","onPauseRun","onCompleteRun","location","useLocation","shell","useForgeShell","paletteOpen","setPaletteOpen","collapsed","setCollapsed","navCollapsed","setNavCollapsed","isPsyche","fetching","useIsFetching","mutating","useIsMutating","reduceMotion","useReducedMotion","activityCount","sidebarMetrics","Flame","Activity","activityLabel","railLinks","onKeyDown","threshold","syncCollapsed","Link","ChevronsRight","ChevronsLeft","metric","link","AppShell","sessionIdRef","xpTimerRef","previousXpRef","setStartWorkOpen","setStartWorkDefaults","setStartWorkError","xpNotice","setXpNotice","operatorSessionQuery","useQuery","snapshotQuery","settingsQuery","totalXp","deltaXp","interacted","dwellSent","scrollSent","markInteraction","sendEvent","eventType","metrics","dwellTimer","onScroll","denominator","createTaskMutation","useMutation","createGoalMutation","createProjectMutation","patchGoalMutation","patchProjectMutation","patchTaskMutation","status","claimTaskRunMutation","focusTaskRunMutation","runId","releaseTaskRunMutation","actor","completeTaskRunMutation","createAndStartTaskMutation","operatorName","created","contextValue","defaults","Outlet","useOutletContext","normalizeCopyValue","resolveHeroMeta","titleText","entityKind","copyMode","eyebrowValue","titleValue","entityLabelValue","PageHero","badge","actions","entityVisual","resolvedEyebrow","hasHeaderMeta","getActivityEventHref","columnHelper","createColumnHelper","info","href","ActivityTable","rows","onRemove","actionColumns","table","useReactTable","getCoreRowModel","headerGroup","header","flexRender","row","cell","ActivityPage","searchParams","useSearchParams","entityId","entityType","highlightedEventId","activityQuery","removeEventMutation","grouped","accumulator","day","events","ProgressMeter","width","fillClass","looksSynthetic","combined","getReadableActivityTitle","getReadableActivityDescription","GoalDetailPage","useParams","goalDialogOpen","setGoalDialogOpen","projectDialogOpen","setProjectDialogOpen","projectIds","taskIds","evidence","nextProject","weakSpot","latestEvidence","GoalStudio","onCreate","onUpdate","dialogOpen","setDialogOpen","editingGoalId","setEditingGoalId","progressWidth","PencilLine","GoalsPage","hasGoals","projectsByGoal","linkedProjects","buildInitialValue","initialValue","lockedEntity","InsightFlowDialog","entityCandidates","availableKinds","set","candidate","visibleCandidates","nextKind","payload","InsightsPage","flowOpen","setFlowOpen","insightsQuery","createMutation","feedbackMutation","insights","ResponsiveContainer","AreaChart","XAxis","YAxis","Area","insight","LANE_ORDER","isLaneContainerId","isLaneContainer","container","getRectIntersectionArea","first","second","height","laneFirstCollision","args","pointerHits","pointerWithin","laneHit","laneIntersections","closestCorners","TaskCardShell","isSelected","isDragging","isOverlay","style","setNodeRef","dragAttributes","dragListeners","onSelect","onStartTask","onQuickReopen","onStepTask","onOpenTask","onEditTask","formatDate","previousStatus","nextStatus","Pencil","ChevronUp","ChevronDown","SortableTaskCard","sortableId","attributes","listeners","transform","transition","useSortable","CSS","LaneDropzone","droppableId","count","dragging","isOver","useDroppable","ExecutionBoard","onMove","onSelectTask","onQuickReopenTask","boardInstanceId","isMobileBoard","setIsMobileBoard","sensors","useSensors","useSensor","PointerSensor","activeTaskId","setActiveTaskId","optimisticStatuses","setOptimisticStatuses","laneLabels","boardTasks","optimisticStatus","activeTask","activeGoal","activeTags","tagId","sync","changed","handleDragStart","handleDragEnd","over","overStatus","overTaskId","laneId","handleStepTask","direction","currentIndex","nextIndex","DndContext","laneTasks","SortableContext","verticalListSortingStrategy","DragOverlay","useCommandCenterStore","create","selectedOwner","selectedGoalId","state","KanbanPage","editingTaskId","setEditingTaskId","selectedTagIds","setGoal","setOwner","toggleTag","reset","selectedTask","blockedCount","doneCount","focusCount","liveRunCount","invalidateBoard","updateTaskMutation","owner","FlagshipSignalDeck","index","cardClassName","achievementTone","tier","statusTone","XpCommandDeck","profile","achievements","milestoneRewards","momentumPulse","recentLedger","unlocked","achievement","visibleAchievements","visibleMilestones","visibleLedger","nextLevelProgress","milestone","InteractiveCard","MetricTile","OverviewPage","heroStatus","projectLookup","nextMilestone","reward","unlockedAchievements","topTask","topGoal","driftGoal","overviewMomentumPulse","hasOverviewData","overviewSignals","activityLink","Block","SurfaceSkeleton","sideRail","blocks","mainBlocks","isLegacyProjectId","ProjectDetailPage","taskDialogOpen","setTaskDialogOpen","legacyProject","fallbackTasks","fallbackTaskIds","fallbackActivity","isLegacyProject","projectBoardQuery","reopenMutation","nextTask","driftTask","ProjectsPage","clamp","min","max","estimateLineCount","maxCharsPerLine","maxLines","estimateGoalRadius","lineCount","radius","estimateValueRadius","estimateRectNodeSize","emphasis","nodeHalfSize","node","packSceneNodes","nodes","packed","gap","spring","iteration","leftIndex","rightIndex","leftSize","rightSize","deltaX","deltaY","overlapX","overlapY","axis","push","_homeX","_homeY","_locked","buildGhostScene","buildGoalGravityScene","clusters","edges","fields","inspectors","spacing","startX","cluster","clusterIndex","goalX","goalY","frictionCount","goalNodeId","valueOrbitRadius","valueIndex","angle","nodeRadius","valueX","valueY","nodeId","visibleProjects","projectGap","projectOffset","sum","projectIndex","projectX","projectY","behaviorY","behavior","behaviorSize","behaviorX","beliefY","belief","beliefSize","beliefX","visibleReports","report","reportGap","reportOffset","reportX","reportY","defaultSelectedId","toneStrokeMap","toneFillMap","toneTextMap","getEntityKindForNode","nodeKind","getToneForNode","getNodeMetaLabel","splitLabel","maxLength","words","word","trimmed","lastIndex","computeBounds","minX","maxX","minY","maxY","halfWidth","halfHeight","metaTopAllowance","field","resolveNodeCenter","buildNodeLabelLines","getToneForEntityKind","PsycheGraphCanvas","legend","selectedNodeId","onSelectNode","minHeightClassName","testId","frameRef","frameSize","setFrameSize","viewport","setViewport","hoveredNodeId","setHoveredNodeId","dragRef","viewportRef","activePointersRef","pinchRef","suppressClickUntilRef","userAdjustedRef","nodeMap","bounds","isMobileFrame","observer","entries","fitToContent","useCallback","padding","scale","centerX","centerY","adjustScale","nextScale","focusX","focusY","targetScale","worldX","worldY","beginPinchGesture","pointers","currentViewport","handleWheel","delta","localX","localY","handlePointerMove","midpointX","midpointY","gesture","handlePointerEnd","pointerId","point","activeNodeId","openNode","Move","Plus","Minus","Maximize","RotateCcw","legendTone","ringRadius","edge","from","start","end","midX","midY","drift","controlX","controlY","isHovered","metaLabel","labelLines","metaY","lineSpacing","iconSize","iconCenterY","labelBaseY","line","x","y","iconX","iconY","labelCenterY","labelFontSize","DEFAULT_REFLECT_DRAFT","ReflectFlowDialog","intent","launch","PSYCHE_SECTIONS","Orbit","Waves","GitBranchPlus","Waypoints","UnfoldVertical","HeartHandshake","sectionMatches","PsycheSectionNav","mobileOpen","setMobileOpen","activeSection","section","PsychePage","setSearchParams","reflectOpen","setReflectOpen","setSelectedNodeId","overviewQuery","overview","linkedValues","linkedReports","linkedBehaviors","linkedBeliefs","scene","inspector","hotPattern","nextReport","chip","stat","AtlasPanel","titleHelp","toneClasses","normalize","appendUnique","values","EntityLinkMultiSelect","selectedValues","placeholder","emptyMessage","createLabel","highlightedIndex","setHighlightedIndex","pendingCreate","setPendingCreate","createError","setCreateError","createdOptions","setCreatedOptions","mergedOptions","map","selectedOptions","normalizedQuery","filteredOptions","pool","hasExactMatch","selectValue","removeValue","createValue","nextValue","highlighted","exact","ReturnPathStrip","schemaTypeLabelMap","schemaTypeHelpMap","schemaFamilyLabelMap","getSchemaTypeLabel","schemaType","getSchemaTypeHelpText","getSchemaFamilyLabel","family","getSchemaVisual","normalizeSchemaLink","matchesSchemaLink","schema","findSchemaForLink","schemas","toggleSchemaSelection","SchemaBadge","showType","escapeFocusValue","usePsycheFocusTarget","focusId","frame","target","psycheFocusClass","isFocused","prependEntityToCollection","queryKey","existing","nonEmpty","uniqueStrings","psycheValueSchema","behaviorPatternSchema","behaviorSchema","beliefEntrySchema","z.number","modeProfileSchema","modeGuideSessionSchema","triggerEmotionSchema","triggerThoughtSchema","triggerBehaviorSchema","modeTimelineEntrySchema","triggerReportSchema","DEFAULT_BEHAVIOR_INPUT","behaviorToInput","kindTitleMap","PsycheBehaviorsPage","editingBehavior","setEditingBehavior","behaviorsQuery","patternsQuery","valuesQuery","schemasQuery","modesQuery","behaviors","patterns","modes","focusedBehaviorId","saveMutation","patternOptions","pattern","valueOptions","schemaOptions","modeOptions","createLinkedPattern","createLinkedValue","createLinkedMode","linkedPatternIds","linkedValueIds","linkedSchemaIds","linkedModeIds","routeError","PsycheGoalMapPage","normalizeQueryError","collectQueryCollectionState","queries","failingQuery","retryQueryCollection","OPTIONS","PsycheModeGuidePage","sessionsQuery","form","useForm","guideMutation","routeQueries","routeState","latestSession","result","session","toneMap","ModeChip","DEFAULT_MODE_INPUT","modeToInput","familyLabelMap","PsycheModesPage","editingMode","setEditingMode","behaviorOptions","createLinkedBehavior","linkedBehaviorIds","groupedModes","toneClassMap","estimateNodeHeight","detailLength","packOrbitNodes","frameWidth","frameHeight","orbitScale","angleInRadians","scaledRadius","homeX","homeY","leftBoundary","rightBoundary","topBoundary","bottomBoundary","OrbitMap","centerLabel","centerValue","denseNodes","packedNodes","ring","DEFAULT_PATTERN_INPUT","patternToInput","PsychePatternsPage","editingPattern","setEditingPattern","beliefsQuery","beliefs","focusedPatternId","beliefOptions","createLinkedBelief","statement","seedablePatterns","orbitNodes","linkedSchemaLabels","linkedBeliefIds","linkedModes","useIsMobileCanvas","ChainCanvas","stages","activeStageId","onStageChange","stageContent","inspectorOpen","setInspectorOpen","activeStage","stage","PanelRightClose","PanelRightOpen","makeLocalId","prefix","createEmotionDraft","createThoughtDraft","createBehaviorDraft","createModeTimelineDraft","SectionHeader","onAdd","addLabel","RemoveButton","StringListEditor","itemIndex","EmotionRowsEditor","definitions","definition","ThoughtRowsEditor","BehaviorRowsEditor","linked","ModeTimelineEditor","formatLines","toggleId","id","toEditor","PsycheReportDetailPage","setActiveStage","commentBody","setCommentBody","insightFlowOpen","setInsightFlowOpen","reportQuery","eventTypesQuery","emotionsQuery","currentReport","commentMutation","insightMutation","detailError","eventTypes","emotions","activeStageComments","comment","DEFAULT_REPORT_DRAFT","PsycheReportsPage","reportsQuery","reports","DEFAULT_BELIEF_INPUT","beliefToInput","countSchemaLinks","beliefCount","behaviorCount","reportCount","linkedSchema","SchemaSection","onOpenBelief","stats","schemaBeliefs","schemaVisual","PsycheSchemasBeliefsPage","editingBelief","setEditingBelief","focusedBeliefId","reportOptions","schemaMap","maladaptiveSchemas","adaptiveSchemas","createLinkedReport","linkedReportIds","DEFAULT_VALUE_INPUT","valueToInput","PsycheValuesPage","editingValue","setEditingValue","focusedValueId","linkedGoals","linkedTasks","SETTINGS_SECTIONS","Settings2","Bot","Trophy","ArchiveRestore","SettingsSectionNav","a","b","s","SettingsPage","operatorReady","settingsForm","invalidateSettings","updateMutation","revokeSessionMutation","theme","FULL_OPERATOR_SCOPES","TOKEN_SCOPE_OPTIONS","applyPreset","preset","recommendedScopes","buildInitialDraft","initialPreset","defaultAgentLabel","base","AgentTokenFlowDialog","scope","firstIssue","defaultOwner","LogWorkFlowDialog","availableTasks","availableProjects","pts","CopyButton","copied","setCopied","handleCopy","Copy","CodeBlock","copyText","TokenRevealDialog","tokenString","agentLabel","onboarding","configSnippet","curlVerification","restartSnippet","KeyRound","tokenHasScopes","token","scopes","SettingsAgentsPage","tokenDialogOpen","setTokenDialogOpen","tokenDialogPreset","setTokenDialogPreset","revealState","setRevealState","revealDialogOpen","setRevealDialogOpen","logWorkDialogOpen","setLogWorkDialogOpen","onboardingExpanded","setOnboardingExpanded","approvalsQuery","onboardingQuery","operatorContextQuery","invalidateAll","tokenMutation","rotateMutation","data","_tokenId","rotatedSummary","revokeMutation","approveMutation","rejectMutation","logWorkMutation","approvals","operatorContext","activeTokens","hasFullOperatorToken","hasRewardManager","hasPsycheWriter","hasScopedWriter","hasAnyToken","operatorTasks","unique","capabilities","cap","agent","col","approval","ClipboardList","v","ENTITY_LABELS","ENTITY_BADGE_KIND","formatDeletedAt","SettingsBinPage","binQuery","invalidateBin","restoreMutation","record","hardDeleteMutation","records","groupedRecords","list","badgeKind","Trash2","prettyRecord","parseRecordJson","SettingsRewardsPage","selectedRuleId","setSelectedRuleId","ruleConfigError","setRuleConfigError","bonusMetadataError","setBonusMetadataError","xpQuery","rewardRulesQuery","rewardLedgerQuery","rewardRuleForm","bonusForm","invalidateRewards","rewardRuleMutation","bonusMutation","rewardRules","rule","selectedRule","xpMetrics","manualBonusEvents","config","metadata","DetailLabel","help","STATUS_META","CircleAlert","TaskDetailPage","statusSheetOpen","setStatusSheetOpen","taskContextQuery","uncompleteMutation","releaseRunMutation","completeRunMutation","currentRun","currentStatus","describeRunStatus","handleStatusChange","getGoalTitle","getTaskTags","getNextAction","labels","DailyRunway","timeline","nextActionLabels","nextAction","taskTags","TodayPage","directive","comebackTask","nextLevelXp","START_BOUNTY_XP","TIME_BOUNTY_XP","TIME_BOUNTY_MINUTES","FINISH_BOUNTY_XP","quest","WeeklyReviewPage","reviewQuery","review","strongestWin","recoveryCalibration","accelerationCalibration","reviewSignals","BarChart","Bar","win","App","Routes","Navigate","QueryClient","ReactDOM","React","QueryClientProvider","BrowserRouter"],"mappings":"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"}